YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Boost.勉強会

久々に毛色の違う勉強会に参加してきました。

途中までしか参加できませんでしたが、とても有意義な勉強会でした。C++を自前でごりごり書いていたことを思い出すと、もはやBoost使えば大抵のことはぐっと楽になるなあという印象を強烈に受けた半日でした。

10:10-11:40 Boostライブラリ一周の旅

アキラさん(id:faith_and_brave)の発表。Boost 1.4の全74ライブラリを紹介。

各ライブラリ紹介

スライドのタイトル。紹介中のコメントもたまにメモ。

  • Accumulators : 統計計算フレームワーク
  • Any : あらゆる型を保持できる動的型
  • Array : 配列(コンテナのインタフェースが使える)。組み込み配列の代わりとして使うと便利。次期標準ライブラリの予定。
  • Asio : 非同期ネットワークライブラリ。IPv6対応。
  • Assign : コンテナの簡易構築。小さいコード書くのにpush_backとかするのが面倒、って時に便利。(vectorならpush_backの代わりに+=とか使えちゃう)
  • Bimap : 双方向マップ(bimap は std::map と std::mapの両方の用途)
  • Bind : 部分評価。カリー化みたいのができる。
  • Circular Buffer : 循環バッファ。バッファがいっぱいになったら上書きしていく。小メモリ環境では便利かも。
  • Compressed Pair : テンプレート引数のどちらかが空クラスだった場合に最適化されやすいpair
  • Concept Check : テンプレートパラメータの制約。(C++0xから漏れた)
  • Conversion : 型変換ライブラリ。lexical_castで数値と文字列の相互変換。polymorpihc_downcastでアサート+static_cast。
  • CRC : CRC計算。チェックサムとか取れる。「よくわかりません」
  • Date Time : 日付と時間のライブラリ
  • Dynamic Bitset : 大きさを動的に変えられるbitset
  • Enable If : 型特性によるオーバーロード。(たとえば整数型かそうでない場合かで関数のオーバーロードを行うか否かを判断)
  • Exception : catchする度にエラー情報を付加する
  • Filesystem : OSによらずパス、ファイル、ディレクトリ操作が可能になる。(次の次の標準ライブラリに入る?)
  • Flyweight : デザインパターンのFlyweightリソースの共有
  • Foreach : foreach文。コンテナ/配列を順番に処理。(BOOST_FOREACH() というマクロを使用)
  • Format : 文字列のフォーマット。string.str()をprintf形式のフォーマット指定で変換可能。プレースホルダもある。
  • Function : 汎用関数オブジェクト。テンプレート引数は関数の型でなく関数の形(戻り値の型とパラメータの型)BindやLambdaと組み合わせると便利。
  • Function Types : 関数の型情報を取得するメタ関数。(関数ポインタかどうかを判別とか)
  • Fusion : 様々なデータ構造を持つコンパイル時&実行時タプルライブラリ。STLのalgorithmは使えないけど、タプル用のalgorithmがたくさん用意されている。
  • GIL : 画像処理ライブラリ(Adobeが作成)
  • Graph : グラフ構造を扱えるライブラリ。セッションあり。
  • Interprocess : プロセス間共有メモリ(shared_memory)
  • Interval : 区間計算ライブラリ。誤差チェックとかに使えるみたい。
  • Intrusive : 侵入コンテナ。オブジェクトのコピーではなくオブジェクト自身を格納する。
  • IO State Server : IO Streamの状態管理
  • Iostreams : 拡張IO Streamライブラリ。streamクラスを簡単に作るLibrary for Library。パイプ演算子によるフィルタ設定などが可能。
  • Iterators : イテレータを簡単に作るためのLibrary for Library
  • Lambda : ラムダ式
  • Math : 数学の特殊関数がたくさん入ってる
  • Member Function : std::mem_funとstd::mem_fun_refを一般化したもの。(ポインタでも参照でもOK)
  • MPL : テンプレートメタプログラミングのライブラリ。かなり強力なライブラリ。
  • Multi Array : 多次元配列
  • Multi Index : 複数のソート順、アクセス順を持たせることができるコンテナを作れるライブラリ。
  • Numeric Conversion : 数値型の型変換。例外は自分で定義可能。
  • Operators : 関連する演算子の自動作成。(たとえば operator < を定義すれば >, <=, >= が自動作成される)
  • Optional : 有効な値と無効な値を一般化する。(エラー値が環境ごとで-1だったり空文字だったりするのを統一できる)
  • Parameter : 名前付き引数
  • Pointer Container : ヒープオブジェクトを格納するためのコンテナ。スマートポインタのコンテナよりもコストが低い。
  • Pool : メモリプール
  • Preprocessor : プリプロセッサメタプログラミングのライブラリ。コードの自動生成などに使う(可変引数とか)
  • Property Map : インタフェースのマッピング。iterator_trailsの拡張版みたいなもの
  • Proto : Expression Templateのライブラリを作るためのライブラリ
  • Python : C++からPythonPythonからC++を使うためのライブラリ。1. C++の関数を用意する 2. C++の関数をPythonようにエクスポートする 3. PythonでDLLをインポートしてC++関数を呼び出す。
  • Random : 擬似乱数生成ライブラリ。擬似乱数生成器と分布の方法を分けて指定できるのが特徴。(メルセンヌ・ツイスタを一様整数分布で、など)
  • Range : 範囲に対する操作のためのユーティリティ。配列をvectorライクに操作可能。
  • Ref : 参照ラッパ。テンプレートが絡むと必要になる。関数テンプレートのパラメータがT xに鳴っているときにint valueを渡すとTがint&ではなくintに推論されてしまうので、boost::refで明示的に参照にする。boost::bindと組み合わせて使うことが多い。
  • Scope Exit : 関数を抜けるときに実行されるブロックを定義する。return後にコードかけちゃう。面白い。(Boost 1.3.8あたりから)
  • Serialization : クラス情報のシリアライズ/デシリアライズ
  • Signals2 : シグナル・スロット
  • Smart Pointers : スマートポインタライブラリ。std::auto_ptrより安全です。
  • Spirit : 構文解析ライブラリ。コンパイラ作る人は頑張ってください。
  • Statechart : ステートマシン。
  • Static Assert : コンパイル時アサート。Type Traitsと組み合わせてテンプレートの要件にしたり、コンパイル時計算の結果が正しいか検証するのに使う。
  • String Algo : 文字列のアルゴリズム
  • Swap : std::swapの強化版。
  • System : 各OSのエラーコードをラップして汎用化
  • Test : ユニットテストライブラリ
  • Thread : スレッド。次期標準ライブラリで入る予定だが機能は削減されそう。
  • Timer : 簡単な時間計測
  • Tokenizer : トークン分割
  • Tribool : 3値bool
  • Tuple : タプル
  • Typeof : 型推論
  • uBLAS : ベクトルや行列と言った線形代数のライブラリ。Expression Templateで組まれているため高速。
  • Units : 単位計算
  • Unordered : ハッシュ表の連想コンテナ
  • Utility : ユーティリティ(コピー禁止のクラス作ったり、関数オブジェクトの戻り値の型を取得)
  • Variant : 指定した型を格納出来るUnion
  • Wave : C99とC++プリプロセッサ
  • Xpressive : 正規表現

知らない間に圧倒的に便利になっててびっくりした。久々にC++書くかな。

10:40-12:00 Boost.Intrusive x Boost.Multiindex

稲葉さん。データ構造大好き。

Boost.Multiindex
  • 「Boost.勉強会の発表者リストを作る」というコードを例にしてBoost.Multiindexの使い方を例示
  • 3つデータ構造を取るのとどう違うの?→ インデックスの更新が楽ちん
  • ordered_unique, hashed_unique, sequence, random_access
  • 便利なところまとめ
    • 色んなインデックスをつけられる
    • 実はむしろ普通のset等より便利
Boost.Intrusive
  • 普通の管理用メンバはデータ構造の外、侵入的データ構造ではデータ構造の中
  • データ構造マニアとしては
    • 異様にsetの種類が多い。set, avl_set, sg_set, splay_set, treap_set
Intrusive x Multiindex
  • まだBoostのfuture workを見てもまだユーザが検索方法を実装することはサポートしてないと言ってる。でもドキュメントは無くても整理はしているとのことなのでソース読んでみた
  • 俺々データ構造、俺々キー、俺々インデックス、俺々メソッド
  • http://github.com/kinaba/mint

LT

13:00-13:15 俺Tokenizerを作る

tt_clownさんのLT

  • scanf() のような機能を持つクラスscannerを作る
  • Boost.Tokenizerのカスタマイズをポリシー・クラスを使って行うよ
  • 型変換はlexical_castに任せる
13:15-13:25 Boost.Graph入門の入門

Egtraさん (@egtra)

  • Boost.Graphはvertex(頂点)とedge(辺)からなるデータ構造を扱う。有向グラフ・無向グラフ両方できますよ。
  • 頂点の操作
  • 簡単のため、auto型を使ってます
#include<boost/graph/adjacency_list.hpp>
using namespace boost;
adjacency_list<> g;

// 頂点と辺を追加
auto u = add_vertex(g);
auto v = add_vertex(g);
auto result = add_edge(u, v, g);
auto edge = result.first;

// 辺を削除
remove_edge(edge);

// 中を辿る
auto t = vertices(g);
BOOST_FOREACH(auto e, t) {
    std::cout << e << std::endl;
}
  • adjacency_listはテンプレート引数多すぎ
    • OutEdgeList, VertexList : 頂点と辺にどんなコンテナを使うか(std::vectorなんか突っ込んじゃだめだよ。ドキュメント読め)
    • Directed : 有向グラフ、無向グラフか(実は三種類あるけどドキュメント読め)
  • 扱わなかったもの
    • プロパティマップ
    • アルゴリズム
    • Graphviz形式入出力
13:25-13:45 Introduction to Boost.Polygon

dark-yoshiさんの発表

  • Boost.Polygon
    • 平面多角形幾何データの操作にフォーカス
    • 2009年11月にBoostにAcceptされたばかり
  • なにができるのか
    • Union, Intersection, Difference, Disjoint-union
    • その他にも面積計算、拡大・縮小などもできますよ
  • 例 → はてなダイアリー

13:50-14:20 Boost.Coroutine

melponさん (@) の発表

  • Boost.Coroutineは正式ライブラリじゃないよ
  • Boost.Coroutineはインタフェース変わるかもなんでむしろ実装に注目
  • Boost.Coroutineとはなに?
    • 関数の実行を途中で凍結・再実行させる機構 (yieldとかできちゃう)
    • 別名としてmicro-thread, fiber, continuationとか呼ばれてる
  • Boost.Vaultから持ってくる
  • Boost.Coroutineの実装
  • 組み込み環境で便利な感じ

14:30- Boost.Asio

xyuyuxさん(id:xyuyux)

  • Boost.AsioはAsynchronous I/O(非同期入出力)を扱うライブラリ。ネットワークやファイル入出力をスレッドやロック機構を使わずに暑あうためのライブラリ。
  • boost::asio::io_service が大事
  • タイマー処理が boost::asio::deadline_timer でできますよ
  • ソケットの種類
    • ip::icmp::socket : ping
    • ip::tcp::socket : http, sipなど
    • ip::udp::socket : sip, socketなど
    • ssl::context
    • serial_port
  • プラットフォームごとの実装
    • Linux kernel 2.4 : select
    • Linux kernel 2.6 : epoll
    • Soaris : /dev/poll
    • Mac OS X, FreeBSD : kqueue
    • Windows : overlapped I/O と I/O completion
  • 参考

僕はこの後用事があったんで離脱しちゃいましたが、久々にC++な感じの話を聞いてなかなか刺激的な勉強会でした。C++な人は意外とVAIOユーザが多くてびっくり。

追伸

帰る直前でid:moriyoshiさんがきてビビった。それだけ。