雑記2014年3月27日木曜日EclipseでJavaを書くときに設定しておくべきものEclipseでワークスペース/プロジェクトを作成したときに、設定すべきものをメモしておく。フォントの設定、FindBugsの設定、Checkstyleの設定など。Checksをコピーしてチェック設定ファイルを作成する。作成したものをデフォルトに設定。muchな)チェックを外す。開発環境C++11のスマートポインタを使ってみるC++11から使えるようになったスマートポインタを使って遊んでみました。unique_ptrshared_ptrweak_ptrの順で使い方を見ていきます。unique_ptrunique_ptrは自身がスコープアウトした時点で、管理しているオブジェクトをdeleteします。その名のとおり、あるオブジェクトを管理するunique_ptrは一意でなければいけません。よってunique_ptr間でオブジェクトの共有は出来ません。blockのようになります。hogeを管理しているunique_ptrがスコープアウトした時点でhogeのデストラクタが自動で呼ばれているのが分かります。複数のunique_ptrでオブジェクトを共有することは出来ないので、以下のようなソースはコンパイルエラーになります。0;}shared_ptr次にshared_ptrを使ってみます。shared_ptrはオブジェクトを共有できます。管理しているオブジェクトの参照カウントが0になった時点でオブジェクトを自動消去します。先ほどと同じhogeを使って実験してみます。0;}実行結果は以下のようになります。destructedhogeはブロック内でnewされます。qtrがhogeを所有しているため、hogeの参照カウントは1です。qtrで、ptrもhogeを参照することになります。ここでhogeの参照カウントは2になります。ブロックを抜けると、qtrがスコープアウトするため、参照カウントが1になります。最後に、main関数を抜ける時点でptrがスコープアウトし、参照カウントが0になります。参照カウントが0になった時点で、hogeがdeleteされます。shared_ptrの参照カウントは、shared_ptr::use_count()メソッドで取得できます。weak_ptr最後にweak_ptrです。Javaの弱参照と似たような感じです。weak_ptrはオブジェクトを共有できますが、weak_ptrによる参照は参照カウントには影響しません。よって、weak_ptrが参照しているオブジェクトが既に削除されてしまっているという場合もあります。blockと表示されます。weak_ptrが参照カウンタに関与しないことが分かります。weak_ptrによる参照が存在しても参照カウンタが0になった時点でオブジェクトがdeleteされていることが分かります。cpp2014年3月24日月曜日C++でポリモーフィズムC++でポリモーフィズムを行う場合は、virtualをつけるらしい。virtualを付けた関数を”仮想関数”と呼ぶ。仮想関数にすると、親クラス型の参照を使って子クラスのメソッドにアクセスした場合、子クラスで定義されたメソッドが実行される。virtualを付けなかった場合は、親クラス型の参照からアクセスすると、親クラス側のメソッドが実行される。virtualを付けなくてもメソッドのオーバーライド自体は出来て、子クラス型の参照からメソッドを呼び出せばオーバーライドしたメソッドが実行される。以下の例を見た方が分かりやすい。cat.のようになる。animal.となってしまう。cpp2014年3月17日月曜日Boostの多倍長整数ライブラリBoostの多倍長整数ライブラリを使ってみました。Cupで多倍長出てもC++で行けそうです。自宅のマシンはLinuxなので最初からBoostが入っていましたが、versionが少し古くて目的の機能は使えませんでした。いうことでインストールから。最新版のBoostを公式ページからダウンロードします。ダウンロードしたら適当なディレクトリに展開します。展開したディレクトリに移動して以下のコマンドを実行します。--prefixで指定しているのは、インストール先のディレクトリです。Linuxのディストリビューションに最初から入っているBoostの上にインストールすると、環境が壊れてしまう可能性があるため、ユーザのlocalディレクトリなどにインストールするのがよいと思います。使ってみるまずは、簡単な掛け算から入ってみます。入力された2つの整数の積を計算してみます。0;}コンパイルするときは、以下のようにheaderの検索パスを指定します。test.cpp次に、フィボナッチ数列でも計算してみますか。フィボナッチ数列の最初の100項を表示します。0;}最後に、ビット演算。入力された数を2進数で解釈して再構築できるか確認しています。静的ライブラリと動的ライブラリを作るまえがきgccで静的ライブラリと動的ライブラリを作ってみました。静的ライブラリは前回のポストにも載せましたが、対比が分かりやすいように再掲します。静的ライブラリをつくる静的ライブラリは、libxxx.aというファイルです。拡張子のaはarchiveの略です。以下では、加減乗除を行う関数が定義されたadd.o、sub.o、mul.o、div.oをarchiveしてlibhoge.aというファイルを作成します。*.oのようにして静的ライブラリを作成します。main.cからlibhoge.aの機能を使用する場合は、以下のようにコンパイルします。-lhoge-Lはライブラリの検索パスの指定です。libhoge.aがカレントディレクトリにある場合は、-L.のようにします。動的ライブラリをつくる動的ライブラリは、libxxx.soというファイルです。objectの略です。静的ライブラリのときと同様に加減乗除を関数を定義したオブジェクトファイルをまとめてライブラリにします。libhoge.soのようにして動的ライブラリを作成することができます。コンパイルするときは以下のようにします。-lhogeコンパイルは静的ライブラリにリンクするときと同様です。gccのリンカは-lxxxと指定されたとき、まずlibxxx.soを探してあればそれをリンクします。libxxx.soが無ければlibxxx.aを探してそれをリンクします。動的ライブラリはランタイム時にリンクされます。実行ファイルがどの動的ライブラリに依存しているかはlddコマンドで確認できます。foundとなっています。これはlibhoge.soがデフォルトのライブラリ検索パス内に存在しないからです。libhoge.soを適切なパスに移動させてもいいですが、環境変数LD_LIBRARY_PATHに動的ライブラリのパスを指定することも出来ます。LD_LIBRARY_PATH=$(pwd)を実行して、libhoge.soファイルがあるカレントディレクトリをLD_LIBRARY_PATHに指定します。再度lddコマンドを実行してみます。(0xb771d000)で作成した動的ライブラリの場所が認識されたことが分かります。./mainを実行すると、libhoge.soが動的にリンクされます。cpp2014年3月15日土曜日-lmとは何かgccでコンパイルするときにつける-lmについて調べてみました。libm.aというライブラリをリンクしているということは知ってました(※1)が、.aファイルが何者なのか?どうやって作るのか?は知らなかったので、いい勉強になりました。ついでに、.aファイルを自分で作ってみました。-lmとは?まず、-lオプションについて。-lxxxというオプションをつけると、リンカがlibxxx.aというファイルを探してリンクしてくれます(※2)。どこを探すかというと、デフォルトで設定されているパスを探します。--print-search-dirsというコマンドを実行すると、gccがプログラム/ライブラリを検索するパスの一覧が表示されます。デフォルトの検索パスに含まれていない場所も検索するようにしたい場合は、-Lオプションを使ってパスを指定することが出来ます。.aファイルの拡張子aは「archive」の意味です。.aファイルはarコマンドで作成することが出来ます。arコマンドを使うと、archiveの中身を確認することも出来ます。1`k_standard.os_lib_version.os_matherr.os_signgam.o.....のようにオブジェクトファイルが含まれていることが分かります。オブジェクトファイルが大量にarchiveされていますが、実際にリンクされるのはリンク先で使用されるオブジェクトファイルのみです。ライブラリには静的ライブラリと動的ライブラリが存在します。*.aファイルは静的ライブラリ。動的ライブラリは*.soというファイル名です。リンカは、まず動的ライブラリ、次に静的ライブラリという順番でライブラリを検索します。静的ファイルは実行ファイルの内部にリンクされます。これに対して、動的ライブラリはランタイムでリンクされます。静的ライブラリを作る以下の4つのオブジェクトファイルをarchiveすることにします。add.osub.omul.odiv.oそれぞれのファイルには、int同士の加減乗除を行う関数を定義しておきます。これらをarchiveします。sub.oテスト用関数を書きます。0;}で、コンパイルします。libhoge.aファイルはmain.cファイルと同じ階層に保存します。libhoge.aファイルのパスが検索されるように、-Lオプションで-L.と指定します。test正常に動作しました。-lmでlibm.aがリンクされるというのは間違いでした。libm.soという動的ライブラリが存在するので、libm.soが動的にリンクされます。正しくは、「-lxxxというオプションをつけると、リンカはまずlibxxx.soというファイルを探してそれがあればリンクします。無ければ、libxxx.aというファイルを探してリンクします。cpp2014年3月7日金曜日UNIXコマンドメモ自分用のメモ書きです。httpd.conflocateはディスク上のファイルではなく、DBに格納されたファイルパス情報を検索している。DBはupdatedbというコマンドで最新化できる。updatedbはcronに登録されている。opencv特定のライブラリに依存するソースコードをコンパイルするときに便利。以下のようにバッククオート演算子と組み合わせて使う。http://yahoo.co.jp上の例では、それぞれビデオファイル、yahooのページをデフォルトのアプリケーションで開きます。-l必要に応じて、パイプとgrepで絞り込みを行う。マシンが32bit/64bitのどちらで動作しているか調べるCPUが64bitをサポートしているかどうかは以下のコマンドで分かる。ように表示されれば、64bitのオペレーションモードをサポートしていることが分かる。次に、OSが64bitかどうかは以下のコマンドで分かる。OK.x86_64のように表示されれば64bit。ix86のように表示されれば32bit。CPU上で64bit版OSが動作している場合に、マシンは64bit環境で動作していると言う。それぞれ演算の種類です。見たことはありましたが、理解が曖昧だったので調べてみました。0で定義される演算です。2^65536......のようになり、ものすごい早さで増加する関数です。....というように掛け算は足し算に分解できます。いうようにべき乗は掛け算に分解できます。a^(a^(a^(a^....)))というようにべき乗に分解できます。65536というふうになります。logarithmとは以下のように定義される関数です。star"と読みます。tetrationの逆関数のような関係(※)にあり、ものすごく増加の遅い関数です。※厳密にはtetrationの逆関数はsuper-logarithmです。ceil(slog(n))という関係が成り立ちます。Postsmemset()とmemcpy()恥ずかしながら、Cのmemset()とmemcpy()を今まで使ったことがなかった。みたいな話を聞いたことがあったので、「あーじゃ要らない機能なんだー。editorialに投稿された解答がmems...便利なPythonライブラリ(5)retryデコレータつけるだけで、リトライしてくれるという便利ライブラリ。失敗するかもしれない不安定な関数に@retryをつけると成功するまで実行してくれる。ret...S3のファイルを一般公開するAWSのS3のファイルを一般公開する方法について説明します。2つの場合に分けて説明します。本番中ゴリ押し解を思いつくには思いついたのだが、C++でマルチスレッドの処理を書いたことが無くて、ごにょごにょやってるうちにタイムアップとなってしまった。C++...C#入門(9)Action、Func、Predicateの違いAction、Func、Predicateについて簡単に整理しておく。メソッドへのDelegate。メソッドへのDelegate。スライド区間に対するクエリ処理の種類とそれに対するアルゴリズムをいくつか紹介します。「スライド区間」の定義ですが、窓関数のようなものを想像してください。まではコンピュータの力を使って正多面体をt色以下で塗るパターン数を数えていました。今回は手計算で計算してみようと思います。そのためにはまず回転を表す対称群をうまく列挙するために回転軸について考える必要があります。見聞きする木の用語を整理しておく。節点vから最も離れた節点をwとする。w)の長さをvの離心数と呼ぶ。記号で表すときは、ε(v)と書く。使って遊んでみました。いった便利な機能を提供してくれるテストフレームワークです。repor...キャッシュヒット率の測定perfというツールを使ってキャッシュヒット率を測定してみた。キャッシュの影響なんてたかが知れていると甘くみていたら、痛い目るので要注意。知らない用語がちらほらあったので、簡単にまとめておく。