syntasticを使ってPythonのコードスタイルチェック

vimのプラグイン syntastic を入れると,pep8を使ったコードスタイルのチェックができる.

syntastic のインストールはNeoBundleを使って,

NeoBundle "syntastic"

を.vimrc に追記してから :NeoBundleInstall すればOK.

pep8についてはこの記事がわかりやすい.
要はPythonのコードスタイルチェッカー.

インストールはpipを使って

pip install pep8

でOK.

コマンドラインから生で使う方法は

python -m pep8 -v hoge.py

という感じで,pythonのコードをチェックできる.
docstringがないとか,行が長すぎるとか,変数が多すぎるとか色々言われる.

syntasticとpep8がインストールされていれば,
vimを使って python のコードを保存した時点でチェックが走り,
vim のバッファ内でどの部分がおかしいかが可視化される.

指摘された行にカーソルを持って行くと,
一番下に,どう悪いのかが表示される.

これを使ってプログラムを綺麗に書くようにしよう.

ノマド部活動報告

今回は京都での活動.

お気に入りのカフェ・ド・クリエ プラス
京都の錦市場にある.
席を選べば電源も使えるっぽい.

ちなみにこのお店の正面向いには美味しいおにぎり屋さんがある.

2軒目はお気に入りだが中々普段混んでたりで入れない火裏蓮花
席数が少ないのであんまりノマド向けではないかも.

3軒目に,cafe' bibliotic Hello!へ.
ロフト席だったというのもあり,ビール飲んでしまいました.

scikit-imageでの画像データの扱い

Pythonでの機械学習ライブラリとしては有名な scikit-learn があるが,
画像処理ライブラリは scikit-image がある.

最近Pythonでの画像処理の勉強をしていて気になったので,
scikit-image での画像の型の扱いについてメモ.

scikit-image ライブラリでは,画像の読み込みは,サブモジュールの skimage.data を使い,

import skimage.data

img = skimage.data.imread("lenna.jpg")

のように書く.

この時,読み込まれた画像は,uint8の型のarrayになっていて,
値は 0〜255 の間の整数値となる.

例えばグレースケール化したいと思った時,skimage.color.rgb2gray という関数を使うが,
これを行なうと,

import skimage.color
gimg = skimage.color.rgb2gray(img)

結果の gimg は,float64 型になっていて,
値は 0.0〜1.0 の浮動小数点型となる.

画像処理においては, 0.0〜1.0 の間の浮動小数点数として扱うのが,
メモリは食うけど便利.

この辺りの型の変換を行なうのが,

skimage.img_as_bool(img)
skimage.img_as_ubyte(img)
skimage.img_as_int(img)
skimage.img_as_uint(img)
skimage.img_as_float(img)

の関数.

それぞれ,
skimage.img_as_bool(img):
bool型 (True / False の2値)

skimage.img_as_ubyte(img):
uint8型(読み込んだ時の状態.[0,255]の範囲)

skimage.img_as_int(img):
int16型(uint8の[0,255]が[0,32767]にマップされる.負の値も格納可.)

skimage.img_as_uint(img):
uint16型([0,65535]の範囲)

skimage.img_as_float(img):
float64型(uint8の[0,255]が[0.0,1.0]にマップされる.負の値も格納可.)

となる.
なお,この範囲は, skimage.dtype_limits(img) によってタプルで取得可能.

Pythonで科学技術計算するための勉強教材

いくつかあるけど,Tweetしたときに結構ふぁぼられたやつを紹介.

Python Scientific Lecture Notes

Pythonの基礎,そして科学技術計算でよく使われる numpy, scipy, matplotlib のチュートリアル.

さらに SymPy とか,Pythonの応用として generator や decorator まで説明されている.

誤植等を見つけたら画面下の Edit ボタンから簡単にpull requestが送れるので,
実際いくつか送ってみた.

Probabilistic Programming and Bayesian Methods for Hackers

こちらは,ベイジアンモデルの基礎から,PyMCを使ったチュートリアル.
まだ最初のほうしか読んでない.

こちらは広島大の玉木先生が翻訳されている日本語版も存在.

ノマドカフェ探し@京都(11軒目)

スターバックス三条大橋店.
川床の席が設置されていて良い.

ただ,PC開いてたら店員に怒られたw
店内の席ならOKだけど,川床席はダメらしい.

飲みかけだけど,スタバで一番お気に入りのダークモカチップフラペチーノ.

可変長テンプレートとタプル

可変長テンプレートはタプルで受け取って,1つずつ処理できる?

#include <tuple>
#include <iostream>

template <typename ... T>
class Hoge{
	std::tuple<T...> args;

	public:
		Hoge(T... args):args(args...){}

		template <int i>
			typename std::tuple_element<i,decltype(args)>::type get(){
				return std::get<i>(args);
			}
};


int main(){
	Hoge<std::string,std::string,int> a("10","1.5",2);

	std::cout << a.get<0>() << std::endl;
	std::cout << a.get<1>() << std::endl;
	std::cout << a.get<2>() << std::endl;


	return 0;
}

と言う感じで, Hoge に可変長テンプレートで何個かの型と,その可変長引数を渡したあと,
クラス内で std::tuple に変換し,タプルとして扱う.

ところで,「...」という演算子は型名の前にある場合はパック演算子といい,
後ろにある場合はアンパック演算子というらしい.

タプル(std::tuple)すごい

C++11から入った std::tuple は,固定長の型を配列にできる.
例えば,

std::tuple<int, char, std::string> data;

のように,int,char,std::string型を要素に持つタプルができる.

タプルの i 番目の要素には std::get(data) でアクセスができる.
また, i 番目の要素の型は std::tuple_element>::type で取得できる.

ただ,std::tuple_element<0, std::tuple>::type と書くくらいなら int と書けば良い.
これが必要になるのは,dataの型が,何かわからないタプルの場合.

こういうときは, decltype を使って,

template <int i>
typename std::tuple_element<i,decltype(data)>::type test(){
    return std::get<i>(data);
}

のように書く.

英会話進捗

先月から始めた英会話,気づけばレッスン20回突破してた.
特に今月は毎日欠かさずやってる.

はやく,焦らずに話せるようになりたい.

Qtでマウスホイールのイベント取得

マウスのホイール操作をQtのプログラムから得たい場合,

void wheelEvent(QWheelEvent *wEvent);

をオーバーライドすれば良い.

その関数内で,QWheelEventからマウスホイールの回転方向を取るには

void Hoge::wheelEvent(QWheelEvent *wEvent){
    QPoint d = wEvent->pixelDelta();
}

として得られるQPoint型の変数に,x,y方向それぞれの移動量が入る.

その結果,

void Hoge::wheelEvent(QWheelEvent *wEvent){
    QPoint d = wEvent->pixelDelta();

    int x_scroll = d.x();
    int y_scroll = d.y();
}

として値を取り出すことができる.