Python温泉でやったことのまとめ
実はPython温泉に行っていました。
1日目
2日目
- Boostのビルドシステムについて分かってきたのでtools/build/v2/tools/darwin.jamにパッチを当てる。
- Mac OS Xのframework bundleの構造についてAnatomy of Framework Bundlesを読みながら理解を深める。
- 結局多くのプロジェクトでUnixなdirectory structureをframework bundleに変換するために行っているやり方を参考に、以下のようにすることに決定。
- Boost.framework/Versions/1.36/include以下にヘッダファイルをインストール
- Boost.framework/Versions/1.36/lib以下にバイナリライブラリをインストールし
- Boost.framework/Versions/1.36/HeadersはBoost.framework/Versions/1.36/include/boostへの相対シンボリックリンクとする。
- Boost.framework/Versions/1.36/LibrariesはBoost.framework/Versions/1.36/libへの相対シンボリックリンクにする。
- Boost.framework/Versions/1.36/BoostはBoost.framework/Versions/1.36/lib以下にインストールされているdylibのumbrella frameworkにする。
- Umbrella frameworkを作るためのldのオプションについていろいろ調査。結局以下のようにする。
gcc -dynamiclib -o Boost -install_name /Library/Frameworks/Boost.framework/Versions/1.36/Boost /Library/Frameworks/Boost.framework/Versions/1.36/lib/*.dylib `echo /Library/Frameworks/Boost.framework/Versions/1.36/lib/*.dylib | tr ' ' '\n' | xargs -n1 basename | sed -e 's/.*/-sub_library &/'`
- g++ -o hoge hoge.cpp -framework Boostでコンパイルが通るようになったのでBoost.Asio再開。
- とりあえずチュートリアルにあるタイマーの使い方が分かるようになる。
- HTTP serverのパフォーマンスチェッカみたいなものを試しに作ってみることにする。
- URIパーサをBoost.Spiritで書き始める。RFCのAppendixにあるBNFをSpiritのruleに直す簡単なお仕事です。
- 一応実装がかけたので (まだ実行はしてない) テストケースをNumbersでごりごり作り始める。
- 表計算ソフトには催眠作用があることは周知の事実。ここでようやく1時間くらいまともに寝る。
- テストが完成、perlのワンライナーでBOOST_CHECK_EQUALを生成する。もちろん1発でテストは通らず、昼食をとりながらデバッグ開始。
cat ~/Desktop/testcases.csv | perl -ne 'chomp; @F = split /,/; print $F[1] eq "TRUE" ? "BOOST_CHECK_EQUAL(url(\"$F[2]\", \"$F[3]\", \"$F[4]\", ". ($F[5] || "url::INVALID_PORT"). ", \"$F[6]\", \"$F[7]\", \"$F[8]\"), url::parse(\"$F[0]\"));": "BOOST_CHECK_THROW(uri::parse(\"$F[0]\"), std::exception);", "\n"' >> uri_parser_test.cpp
- デバッグ開始して3時間、RFC3986ではなくRFC2396をベースに実装していたことに気づく。
- 再度RFC3986のAppendixを見ながら簡単なお仕事開始、RFC2396版では必要だったlongest_d[]がRFC3986版では妙なマッチを引き起こすのに気づくのに4時間半かかり、都合5時間ぐらいを無駄にする。
- 夕食。惜しくもDjangoブランケットを逃す。
- URIパーサができたのでHTTPクライアントの実装開始。Boost.Asioのbuffer sequence (≒apr-utilのbucket brigades、lighttpdのchunk、nginxのngx_chain_t) はRange conceptで表現されていることを知りなぜか感動。
- HTTPヘッダのシリアライザを遅延リストで書いているところをtmatsuoさんに目撃される。
- 遅延リストの実装が終わり、テストコードを書く。なぜかdouble-freeで落ちるので全部delete[]を取ったらまあとりあえず動くので (未完のまま) C++温泉終了。最終日の最後でなぜかHaskellを触る周囲に触発され (反発?) Factor温泉開始。
3日目
- 余りの眠気に記憶なし。
まとめ
- C++しか書いていませんでした。*1
- id:Voluntas ++