Repo
kjana00@gmail.com
2012-03-31 01:06:17
今朝は薄ぐもり。朝ごはんはパンとサラダとソーセージ。だいぶあったかい。何かいきなり春らしい。
メインマイコンからの非同期なエラー検知とエラーキャンセルの通知を PC にスルーしてたのが止められて、今はそこのログに意味が無いっていうのに対処。コンパイルオプションでスルー機能を切った時には、サブマイコンで持ってるエラー情報を返してやることにしましょう。ということで、何でこんなコードにしたんだろうとか、このファイル二つ、多分実験する時に切り替えてるんだろうけど生きてるのどっちだっていうか Subversion 使ってるんだからブランチ切りなさいよそんなのとかでちょっと悩みつつあれこれ。
エラーレポートはメインから勝手に飛んでくるものだからこの仕組みに乗せる必要なくてキャッシュもいらないとかしてから、PC からの実験ログ取り用コマンドの処理でキャッシュ使わない場合という枝を作って返事を出すようにして出来上がり……のつもりがそもそも 7seg の表示すら出ませんよ……って、プログラムライタ繋いだままだったわ、なんていうのの後で確認。まあとりあえずいいか。
……と思ったけど、PC 上のログ取りスクリプトでエラーが出る頻度がえらく上がってる。これはまずいんで調査開始。何がエラーを引き起こすかって、変なものが届いた時の処理が無いからなわけだけど……はともかく、その変なのの内容がサブマイコンが返してる非対応コマンドエラーだったりするのだね。ログ取得用のコマンドって全部 1 byte で投げてるのは対応してるのだけだからあり得ないんだけど。で、しばらく悩んでみたり、エラーを投げる代わりにマーカーと受信したコマンド投げ返すようにしたりした結果、たまに二つのコマンドが繋がって見えてることがあるのがわかる。
つまりはこの、手抜きコマンド処理が悪いのよねとちょっと直し方を考えて、一旦元のコードに引きずられて妙な解決策を取りそうになりつつも、素直にコマンド区切りで読み出すようにしたらいいじゃないという真っ当な方向に落ち着く。元のコードがコマンド間に十分な隙間がある想定で、一度に読めたバイト数全部を一つコマンドとして扱ってたから二つ繋がったりするわけで、1 byte 読んで 1 byte コマンドならそこで終わり、もっと長いコマンドの場合はヘッダ長わかってて、ヘッダの中にペイロードデータ長が入ってるということで必要なだけ追加で読み込むっていう……むしろ何で最初からそうなってないんだという話。
これでだいぶエラーは減ったけどまだ出ることは出る。何で出てるのかと思ったら、何かスクリプトの方で余計なバイトをどこからか読み出してる風。さっぱり意味不明なんで、ちょっと前に IO#read_nonblock が動かないから IO#readpartial に切り替えてみたりしたっけな、とログ取得スクリプトを書き換えてみたらこっちの方が安定してるっぽい。ぽいだけで根拠無いけど、もうちょっと長いこと置いといてみて確認しようかな。サブマイコンプログラムの方では特に余分なバイトを投げそうになくて、スクリプトの方で 2 bytes 読み込むって言ってるところで 4 bytes とかもうちょっととか読めちゃってるからスクリプトの、というか Cygwin 上の Ruby の問題っぽいし。
エラーキャンセルのレポートの方にはとりあえず、新しくエラーコードがセットされる時に前のコードを保存しといてそれを投げるようにしてみた。ちょっと意味が複雑になるけど。でもリクエスト-レスポンスで時刻情報自体はデータに載せてないということだととりあえずこれぐらいが関の山でしょうという。その関の山が当初ちゃんと動かなかったりしてたわけだけど。エラーをクリアする関数っていうのが思ってたよりも高頻度かつ無条件に呼ばれてたんで、ログデータ取得のコマンド処理タイミングでは常に前のコードは 0 ってなってた。しょうがないからエラークリアの時は、0 でないコードの場合のみ保存するってしたけどこれ、ますます意味が複雑になるな……
そんな感じでおしまい。これもまあ、トリビアルなはずの修正にえらく手間を取られた感じ。うーん。まあそれはともかく夕日がきれいね、なんて思いつつ帰って晩ごはんに餃子と酢の物とみそきゅうり。きゅうり食べ過ぎ。おまけに晩ごはん前にブリーを一つ食べてたりもするんで単に食べ過ぎという話もある。餃子も大粒で 14 個とかだし。でもおいしいからいいんだよ?
後は WWW 見たりゲームしたり。ダークエルフの王のクエストはばんばん寝てる子起こしてしまう状態で踏み込むにはまだ弱い、ということでとりあえず 25 階まで降りてみてから森に行きましょう、という感じ。面倒臭いよね、森……