boost::ublas::bounded_vectorを使うときは少し気をつけてねという話

この記事は,Boost Advent Calendar 2011の14日目の記事です.
(2時間近くも遅刻してすみません><)

スキルはまだまだですが,それでももうboostが無いと生きていけない体になってしまいました.
そういえば魔導書Vol2id:kikairoya先生の章(一番最後ですね)あたりは,ホントに「boostを使い倒す!」かんじがして最高に読み応えがありました.ぜひお読みください.

さて,本来はこのアドベでは無難に「あまり日本語情報の出回ってないライブラリを(ほとんど翻訳で)紹介する」つもりだったんですが,意外とネタ探しにつまづいたので,方針転換して僕が引っかかってしまった落とし穴を紹介することに.
筋違いなことを言ってたら,たぶん言ってますが,ツッコミをお願いします.
ホントに不当なdisがあったら全力で謝罪記事を書かせて頂きます….

(2011.12.15 12:30) 編集上のミスについて指摘をいただいたので訂正

Continue reading

C++用ビジュアライゼーション環境”openFrameworks”をぺろぺろしてみた

ビジュアライゼーション言語,すなわち手軽なデザイニングや可視化に特化した言語・環境といえば,Javaベースのprocessingが非常に有名です.
C++上でライブラリとして提供される同様のものにはcinderやopenFrameworkといったものがあります.
特徴はやっぱり速いこと.
例えばProcessingと比べるとC++なので然るべきコーディングをすれば然るべき速度差で動きますし,何も考えなくともOpenGLでよろしく描画してくれるので,そこらのX11やGDIで動くGUIツールキットで頑張るのとは段違いの速度で動きます.

今cinderの人気が高まっている印象ですが,Linuxで使えない(無理ではないらしいけどタダではすまない)という僕にとってはとても残念なかんじなので,より歴史のある(らしい)openFrameworksを使ってみました.

で,実は2011年12月3日に開催される名古屋合同懇親会で,僕がこのネタでLTさせていただくことになってます.
よろしかったら直接おいでいただくかustで視聴してみてください.
NGK2011B 昼の部(LT大会) ←こっちでしゃべります
NGK2011B 夜の部(懇親会+野良LT大会)

Continue reading

boost::serializationでほげほげうまうま

オブジェクトをまるごとファイルに書きだしたりネットワークに送ったりしたいとき内容を直列化し再構築することやその仕組みをシリアライズと呼び,boostではserializationライブラリによって実現できます.
どのような形のデータ列に落としこむか?という話で,boost::serializationはテキスト,XML,バイナリの3種類がサポートされています.

Continue reading

boost::timerは少し困ったちゃんです

boost::timerは時間測定なんかに結構手軽で使いやすくてイイんですが,ちょっと困った現象がいくつか発生します.
僕の手元(Ubuntu 10.04 LTS x86 + gcc4.6.0 + boost 1.40)で再現できてるのは,

  • sleepするとおかしい

    • プロセスが消費したCPU時間なので,例えばsleep(1)の実行時間を計測しても,値は0です.
  • マルチスレッド化するとおかしい

    • 各スレッドでのCPU時間の総和が出るので,何倍かになるし,ちょうど何倍という値でもない.
  • 値の最大値が結構残念

    • (処理系依存であるものの)2147秒までしか測れない場合がある.

この理由はもう言うまでもないですね,内部実装にC標準関数のclock()を用いているからです.
移植性のためなのは理解できるんですが,ちょっとこれでは困ることも.

ということで,POSIXシステムコールのgettimeofdayを使って再実装してしまえ
…というテーマで記事を書こうとしたんですが,探したらあるもんですね.

POSIXではgettimeofdayを,WindowsではQueryPerformanceCounterを使えるように書いたものがありました.

http://pasokoniziri.blog32.fc2.com/?no=15

これに基づくprogress_timerやprogress_displayを作ろうかとも思いましたがそもそもあれはboostにしては珍しい誰得ライブラリなので放置.

ついでなので,gettimeofdayの精度についてのお話.

http://www.argv.org/~chome/blog/noisefactory/2008/02/gettimeofday.html

へー,おもしれー.

(C++0x)可変長テンプレート引数は再帰でおいしくいただきましょう

C++0xで導入される可変長テンプレート引数,便利ですね.
僕は静的なのが大好きなので.

可変長テンプレート引数の何がおいしいかというと,例えば現在のboost::tupleはT0からT9までをデフォルトテンプレート引数と組み合わせて実装してるので要素数は10以下に限定されますが,C++0xに用意されるstd::tupleは可変長テンプレート引数で実装されるので,原理的には,無限の要素数が実現できます.
ここで本質的に重要なのは,「無限の要素数」に対応できることではなく,「任意の要素数nにおいて一般的に記述できる」ことである点に注意.

また,可変長テンプレート引数を用いて,可変長引数の関数を書けます.
これは,いわば「型安全printf」を書けることを意味します.

話がちょっと逸れましたが,じゃあその可変長テンプレート引数は実際どういう風に扱うの?という話を,関数テンプレートに関してします.
Wikipediaに書いてある範囲より僅かながら広い内容,だと思います.たぶん.

Continue reading

boost::variantのgetがメンバじゃない理由

先週名古屋にてBoost.勉強会#5が開催されました.

それとは直接関係ないのですが,行きの電車の中でBoost.Variantの仕様に関して疑問をもってTwitterでつぶやいたところ@cpp_akiraさんより回答をいただいて,それがすごく興味深い内容だったのでそのやりとりをこちらでメモ.

boost::variant<T1,T2,...>のオブジェクトtがあったときにt.get<T1>()と書きたいなぁ,とか…. boost::get<T1>(t)となってるのはどういう意図or理由なんでしょう.
@mrxptn
すずき

Continue reading