Programming Tips

Pythonのgenerator使用時の注意点 (generatorの再利用)

Tatsuya Yatagawa
こんにちはtatsyです。 タイトルの通り、Pythonでgeneratorを使うときの注意点で気づいたことがあったので備忘録的にまとめておきます。 もしgeneratorが何かは知っていて、結果だけご覧になりたい場合には、お手数ですが下までスクロールをお願いいたします。 Generatorとは? Pythonにおけるgeneratorとは、リストのような変数の並びを順番にたどるための対象の一種です。 例え ...

GCCにおけるalignasのエラー

Tatsuya Yatagawa
こんにちはtatsyです。 最近C++11/14の機能を多用している私ですが、C++0xからの新機能であるalignasについて、少し躓いた点があるので、使用法と注意点をまとめておきたいと思います。 C++におけるアラインメント C++でのアラインメントとは、データをメモリ上に置く際に、ある区切りのいい数字の倍数から始まる場所にデータを置いてくださいという意味の数字です。 例えばSIMDの拡張命令を使おう ...

Boost.PythonおよびBoost.NumpyをWindowsで使うまで

Tatsuya Yatagawa
こんにちはtatsyです。 C++とPythonを糊付けするものとしてBoost.PythonとBoost.Numpyというものがあるのですが、多くの記事はPythonからC++のコードを呼び出すことを主眼としていて、僕のようにC++からNumpyの線形ソルバーを呼びたいとか言う人は少ないみたいです。 Boost.PythonやBoost.Numpyを使う利点、特にWindows上で使う利点はPyth ...

C++11の非静的メンバ変数初期化

Tatsuya Yatagawa
こんにちは、tatsyです。 最近はすっかりC++11/14のすごさにやられています。 というわけで今回はC++11から追加されたクラスの非静的メンバ変数初期化について実験をしてみました。 非静的メンバ変数の初期化とは? C++以外の言語、例えばJavaなどをやったことがある人なら、次のようなコードになじみがあると思います。 // A.java public class A { public int val = 1; public A() { } void print() { System.out.println(this.val); } } 注目していただきたいのは3行目です。3行 ...

インスタンスを返す関数におけるmoveの注意点

Tatsuya Yatagawa
こんにちはtatsyです。 最近Effective Modern C++を読んでいたのですが、読んでいて気づいた、言われれば当たり前だけど、意外とやってしまうmoveの注意点についてご紹介したいと思います。 Effective Modern C++ (外部ページに飛びます) おそらく、moveの最もよく使われるであろう使用場面はfactoryメソッドなどにおいてインスタンスをreturnするときだと思います。 例えば、次のように何らかのサイズを引数に取る ...

AOJでHaskell: 1188 階層民主主義 (Hierarchical Democracy)

Tatsuya Yatagawa
こんにちはtatsyです。 今日はHaskellの勉強を兼ねてAOJの関数型向きっぽい問題をやってみます。やる問題は1188番の階層民主主義という問題です。 問題の内容 入力は[[123][4567][89]]のようなかっこで区切られた文字列です。この中身は有権者の人数を表していて、この半分以上を取ればこの地区で勝利できます。 上の入力例ではかっこで囲まれた数字が3個ありますが、候補者はこの3個のうちの半 ...

swap技法とshrink_to_fitの違い

Tatsuya Yatagawa
こんにちはtatsyです。 最近リーダブルコードを読んでおりまして、この世の中にはvectorのswap技法と呼ばれるものがあることを知りました。 swap技法とは? swap技法というのは、vectorがreserve等で確保している内部的なメモリのサイズ(capacityで確認できる)を切り詰めるための方法です。 通常、reserveというのはメモリ容量を増やすことはあっても減らすことはありません。つ ...

Haskellでsmallptを作ってみた

Tatsuya Yatagawa
こんにちはtatsyです。 お盆休みなので最近勉強しているHaskellで[smallpt][1]を実装してみました(←暇か!)。 作成した手順に従って、ちょっとずつ解説してみたいと思います。 Vecクラス(のようなもの)を作る 「クラスのようなもの」と書いたのはHaskellにはオブジェクト指向型言語で言うところのクラスはないからです。Haskell的には独自定義のオブジェクトは代数的データ型といいます ...

C++11のmoveを使ってみる

Tatsuya Yatagawa
こんにちはtatsyです。 最近C++11ってすごいなぁと思う出来事が多々ありまして、そのうちの一つをブログに書いておこうと思います。 C++11で新しく追加された昨日の一つにmove semanticsというものがあります。 詳しい説明に入る前に次の単方向連結リストのコードを見てください。 struct ListNode { int val; ListNode* next; ListNode(int val_ = 0, ListNode* next_ = NULL) : val(val_) , next(next_) { } }; class List { private: ListNode* tail; public: ListNode* root; public: List(); List(const List& list); ~List(); List& operator=(const List& list); void add(int val); private: void deleteNode(ListNode* node); void copyNode(ListNode* dst, ListNode* src); }; 通常のコ ...

OpenCV 2系から3系への変更点

Tatsuya Yatagawa
OpenCVが2系になりIplImageという負の遺産がなくなって早数年、OpenCVがついにver.3になりましたね。 まだbeta版ですが、ver.3になり、よりC++っぽい書き方に近づきつつある気がします。 2系から3系への変更点を気づいたところから備忘録的にまとめておきます。 cv::imread cv::cvtColor cv::TermCriteria cv::VideoCapture::get cv::PCA その他の変更点 cv::imread 2系 cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_COLOR); 3系 cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR); 変更点 グローバルのenumだったCV_LOAD_IMAGE_XXX ...