第四十六回スパルタンプログラミング(合宿)
やりたいこと
- stream stateを理解し、いつ送受信が起こるかをはっきりさせる
やったこと
08/08 移動日 16:00-24:00
早朝チャリトレ行かず、たくさん寝てやった。 先週実家に顔出したので、お盆は帰らず名古屋でプログラミング合宿。
- stream stateを変更するタイミングはpayloadのデコードに決めた。
- いっしーの指摘をうけautomake, autoconfを導入。
08/09 2日目 11:00-23:00
よくねたので、集中力満点!と言っても、エンジンかかったのは17:00、スロースロースターター
- automakeの復習
- http://www.spa.is.uec.ac.jp/~kinuko/slidemaker/autotools/#slide9 を参考に作った。
- configure.in -> configure.acとした。
- bin_PROGRAMS = helloをhello.oとすると、Circular dependency droppedとなる。
- opensslのヘッダやライブラリは↓として与える。
./configure CPPFLAGS="-I/usr/local/opt/openssl/include" LDFLAGS="-L/usr/local/opt/openssl/lib"
- 下記は、configure.acのAM_INIT_AUTOMAKE([subdir-objects])として回避。
- https://autotools.io/automake/nonrecursive.html
Makefile.am:2: warning: source file './hpack/hpack.c' is in a subdirectory, Makefile.am:2: but option 'subdir-objects' is disabled
- https://autotools.io/automake/nonrecursive.html
- http://www.spa.is.uec.ac.jp/~kinuko/slidemaker/autotools/#slide9 を参考に作った。
- stream stateの変更関数を実装した。
- PUSH_PROMISEの送受信でpromised stream idのstream stateをidleからreserveに変える必要がある。
- END_STREAMフラグはDATA, HEADERSにのみある。
- server設計見直し(半年かそれ以上ぶりに眺めるけどひっでーな)
- 変数名直し、関数分割
- InitializeServerの整理途中まで、listen_socketの初期化の整理が中途半端でmakeは通るがbad file scripter。
- 変数名直し、関数分割
- メモ
- defineのスコープは.cならその記述ファイル内、必要でない限り.hに書くな!バグの元
- その他
- 前々から、見えなかったvimの行番号を見えるようにした。 http://jsapachehtml.hatenablog.com/entry/2014/10/29/220508]
- 半兵衛が死んだ。(太閤記)
08/10 3日目 09:30-23:30
エレーベーターがメンテナンスで止まるので、止まる前に到着。
- 引き続きserver設計見直し
- Non-Blockなfdのssl_acceptはssl_error_want_read or writeになる。そのときはssl_acceptをrepeatする。 https://www.openssl.org/docs/ssl/SSL_accept.html
- select通過後になんでfd一つ一つをFD_ISSETしたんだっけか。
- Linux Programming、epollの話
両方ともアプリケーションに呼ばれる度に監視下のディスクリプタセットをkernelに渡し、kernelは渡されたリストに対しstateを更新し送り返します。 送り返されたディスクリプタ達からready状態のディスクリプタをピックアップするためにアプリケーションはディスクリプタ達を一つ一つ調べます。 つまりディスクリプタの数が多くなればなるほど性能が劣化するという事ですね。
- Does OS X not support epoll function?
- *BSD で kqueue・kevent を使ってみよう
- epollとkqueueへの対応は必要のはずだが今はやらない。先延ばし。
- Linux Programming、epollの話
- 手がとまったので整理したい。
- 今の問題は何か?
- このままだとストリームの平行処理ができないだろうこと
- スレッドとソケットの関係がぐずぐずなこと
- 今何がしたいか?
- ブラウザに応答出したい。
- ブラウザからRST_STREAMでPROTOCOL_ERRORが返ってくるのが問題。まあ、エラーがとれたということは間違ってるが動作してるということだ。
- ブラウザに応答出したい。
- 今の問題は何か?
08/11 4日目 11:00-22:30
- ブラウザにレスポンスを表示させたい!
- ごりごりコードだけど、レスポンス出せたー!ミスは2つ。
- frame headerのlengthを32bit->24bitへするときのhtonl後のビットシフト抜け
- これは切り出して関数化してしまおう。済
- hpackのEncodeLiteralHeaderfieldの際のindexing typeの指定忘れ
- indexing typeを決めるロジック実装を先送りしていたために起きた。が、指定忘れに気づけるようになってないことに問題あり。
- 対策:assertでチェックさせるようにした。
- 外側から使って分かったけど、hpack.cの結合テストをしたほうがよい。
- indexing typeを決めるロジック実装を先送りしていたために起きた。が、指定忘れに気づけるようになってないことに問題あり。
- frame headerのlengthを32bit->24bitへするときのhtonl後のビットシフト抜け
- ごりごりコードだけど、レスポンス出せたー!ミスは2つ。
- レスポンスが出せたので、ごりごりを直す。どうやろう。
- recv, sendの関数に切り出してみた。もう少し考えよう。
- http2クライアント
- firefoxばっかり使ってたが、
- いっしー曰く「curlが使えるよ」ということ
- curl エクステンションで HTTP/2 リクエストを送信する見て、brewでインストール
- 使い方 ex)curl --insecure --verbose --tlsv1.2 --http2 https://localhost:11111
- sakamoto ryuichi
- aqua
08/12 5日目 11:00-
07:00に目が覚めそこから寝れなくなり、09:00-10:00で二度寝をかました朝。 きのことたけのこをセットで買ったら、糞やろう呼ばわりされた朝。
疲れる朝だな。やれやれだぜい。
- 課題
- streamへのread, writeをイベントドリブンで動作させたい?
- イベント発生時のデコードとその内容処理の整合とり?
- 対応のため仕様検討
- Nujabes
- Kumomi
- feather
08/13 6日目 14:00-
ねすぎたつもりはないが、ねすぎ。久しぶりにDeli飯を朝食にする。たけのこがおやつ。 仕様は一通り考えたものとして整理、実装を始める。
- 実装
- 考えながら実装してたら一日あっというまでした。Decode後の処理部分の書き方が納得いくように書けない。
- NOTE
- A non-blocking lexing toolkit for Scala in less than 800 lines of code, from regex derivatives
- lexでblock?
- bufferへの読み込みはnon-blockingだから、そのbufferをわたせばいいのでは?
- 変なのがきたら、lexに渡す前に蹴り返せばよい?
- ex. headerがでかいのはmax header list sizeがconnectionの設定にあるので、設定値超えたらoutとするとか?
- 僕の知らないことは多いのでどっかで問題に気づくかも。
- lexでblock?
- newとdeleteが対
- A non-blocking lexing toolkit for Scala in less than 800 lines of code, from regex derivatives
08/14 7日目 10:30-23:30
02:00に寝るも06:00に爽快に目覚める。昼間絶対眠くなるわ! 僕は器量が小さいことをしみじみ悟った。
- 実装
- ひたすらこりこり書き、ブラウザに文字列表示可能なところまで戻れた。
- nghttp2はconnection prefaceでリクエストまで送ってくる。
- 対応できてない、frameをタスクとして積む実装がない。
- http2クライアント
- NOTE
- その他
- 勝家が死んだ。(太閤記)
08/15 8日目 最終日 12:00-22:00
- 実装
- frameをタスクとして積む機構の実装
- QUEUEでリングバッファを使って実装することに。
- 一度に処理するフレーム上限を設定できるようにする?
- QUEUEのバッファ長の設定で可能になった。
- frameをタスクとして積む機構の実装
- はまり
- 疑問
- nghttpを使ってアクセス書けるとACKがたってると"SETTIGS expected"が返ってきてConnectionが確立できない。
- lib/nghttp2_session.c の4861-4862行目でそうなってる。
- 設定送ってきているのだけれど、serverがACKした場合Connectionが確立できない。
- nghttpを使ってアクセス書けるとACKがたってると"SETTIGS expected"が返ってきてConnectionが確立できない。
- NOTE
- 一週間でわかるプログラマのなり方
- プログラマーの本棚
- Cichlid-2.0は勉強になるので読もうby いっしー
- lib/data_proto.hのFrameTypeの書き方は参考にできる。
- lib/data_attr_int.hのunionの書き方は勉強すること。
- DEBUG CODEは色付けしよう。そのためのマクロ作ってちょby いっしー
- CppCheckを使おうby いっしー
- フリーのC/C++向け静的コード解析ツールCppCheckの使い方
- 使い方 ex) cppcheck --enable=all */.c