Subscribed unsubscribe Subscribe Subscribe

Python温泉でやったことのまとめ

pyspa C++ MacOSX PHP mbstring boost asio

実はPython温泉に行っていました。

1日目

  • 夕方まで仕事のバグハンティング。
  • Boost.Asioを触ろうとコードを書き始める。
  • 途中でBoostをMac OS XのframeworkにしたくなってきたのでBoostのビルドシステムの調査を開始。
  • 夕食。奇妙な自己紹介 (「はじめにお詫びします」)で異常なほど緊張する。そのワケはここを参照されたい。
  • 引き続きBoostのビルドシステムについて調査… (8時間)

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 brigadeslighttpdchunk、nginxのngx_chain_t) はRange conceptで表現されていることを知りなぜか感動。
  • HTTPヘッダのシリアライザを遅延リストで書いているところをtmatsuoさんに目撃される。
  • 遅延リストの実装が終わり、テストコードを書く。なぜかdouble-freeで落ちるので全部delete[]を取ったらまあとりあえず動くので (未完のまま) C++温泉終了。最終日の最後でなぜかHaskellを触る周囲に触発され (反発?) Factor温泉開始。

3日目

  • 余りの眠気に記憶なし。

まとめ

*1:あ、途中でPerlsedを使ってるか。