NativeMessagingの処理とNativeMessagingHostを作るときのTips

試しに WebExtensions と Native Messaging Host を作って message のやり取りをしてみた時にハマったのでメモ。

WebExtensions側

  1. runtime.connectNative() で Host を起動する。起動したら runtime.Port が取得できる
  2. Host との communication はこの Port を通じて行う
  3. Port の diconnect() を呼ぶと起動した Host は終了する
    • disconnect() を呼ばずに破棄すると起動した Host は迷子プロセスになる
    • 例えば Extension を作る際になんらかの View Framework を利用している場合、この Framework の component の lifecycle と整合させる必要がある
  4. この Port には isConnected() のような API は存在せず、何らかの理由で disconnected な Port に message を送ると Error が発生する
    • runtime.onDisconnect プロパティで接続断は検知できるので、そっちのイベントで処理する

Native Messaging Host側

勝手が分かるまではなかなかつらい。

  1. STDIN, STDOUT が WebExtensions に握られるのでいつものデバッグ方法は使えない
    • STDERR に出力すればブラウザに何かメッセージを出すことはできるが、それも connection が keep できている場合だけなので、例えば例外のある言語の場合は例外の起きそうな場所で拾いまくる必要がある
  2. 先頭 32bit でその長さ + JSONエンコード済みのデータ(これの長さが先頭32bitに入る)のデータを読み書き
    • native endian で write はともかく read はちょっと気を使う
  3. 拾い損ねた例外や普段 STDOUT に出力したい情報は Logger などで外に出していくしかない
    • 例えば Ruby では $@ で最後の Backtrace を拾えるので、at_exit でこいつを Logger などに渡してやる
    • この時点ですでに WebExtensions との connection は切れている
  4. STDIN からの入力はいつ来るか分からないので無限ループを作る必要がある
    • 終了は WebExtensions から行われるので WebExtensions にバグがなければ問題はない(危険)

サンプル

ブラウザがHost起動時に渡す情報が変わる

これがめちゃくちゃハマった。

Native Messaging Host を起動する際に環境変数の渡し方がブラウザによって違う。この環境変数に依存する部分があると挙動が変わる。

これによって何が起きるかというと、例えば

#! /usr/bin/env ruby

のような shebang から Ruby を起動する場合に、以下のように異なる Ruby インタプリタを起動してしまう。

  • web-ext 経由の Firefox は rbenv 経由の Ruby
  • Chrome は system の Ruby

結果、Firefox と Chrome で WebExtensions の挙動が変わってしまっているように見える。

web-ext 経由でない Firefox では試していないが、Host 起動時に利用できる環境が変わっている可能性は十分にあるので、起動したプロセスから確認するクセをつけた方がよさそう。

cf.

感想

Native Messaging Host の開発は STDIN, STDOUT を奪われるのでだいぶ勝手の違う開発になるのと、普段から daemon process を扱っていないと勘所が分からずに苦労する。本当に力不足を感じましたとさ。

先にこの辺の取り回しをよくするライブラリを整備するといいんだろうなぁ。あと処理が複雑になると message に構造を持たせてそれで処理を分ける必要が出てくるだろうから、その router のようなものも欲しくなりそうな気がする。

あーあれだ。dRuby 使えばいいのか?

coLinuxのネットワークの設定

思い出せなくなるのでメモ。でも文字のメモで思い出せる気がしない。

17:47:19 >wtnabe< 802.11n ようやく draft 脱出か
18:02:33 >wtnabe< coLinuxのネットワークの設定やっぱむずい。NICが2つあ
るからか?
18:07:43 >wtnabe< インターネット接続を共有してくれるのは誰だ?物理NIC
か?
18:12:13 <showchan> @wtnabe windowsのICSと思われ。
http://www.atmarkit.co.jp/fwin2k/win2ktips/044nat/nat.html
18:12:13 <showchan> @wtnabe 前coLinuxつかったときはICSにブリッジしても
らったような儚い記憶があります
18:14:36 >wtnabe< 物理NIC側でICSを設定。XPだと「ホームネットワーク接
続」っていうものがあって、そこにTAPが入るようにする。らしい。
18:15:12 >wtnabe< TAP側はIPアドレスだけ指定すればok. coLinuxの中のネッ
トワークの設定でTAPのIPアドレスをgatewayに指定する。
18:15:22 >wtnabe< 言葉でも書いても分かりにくいんだよなぁー。ちゃんと思
い出せるかしら。

cf.

coLinuxのメモ - coLinuxのインストール(0.8.x) [TAP-Win32でのNAT接続]

そろそろMercurialで日本語ログ書いていいらしい

なんか一応 hg 1.2 以降は ok っぽいかな?

11:48:55 >wtnabe< TortoiseHG っていま日本語のログ書ける?
14:00:35 >wtnabe< 返事がもらえなかったので TortoiseHG を試しにインストー
ルするする
18:17:35 >wtnabe< TortoiseHGで書いた日本語ログをcoLinux上のhgで認識で
きないか?
18:28:26 >wtnabe< あー andLinux 上の bash + hg 1.1 の問題か。OSX の
zsh + hg 1.2 では日本語ログ読めた。
18:29:15 >wtnabe< ということでとりあえず TortoiseHG 0.8.2 上で日本語ロ
グを書いても問題なしということか。
18:46:05 >wtnabe< CentOS 上の hg 1.3 も ok

まとめるとこんな感じ。

TortoiseHG 0.8.2
hg 1.1 (andLinux + bash)×
hg 1.2 (OSX 10.5 + Fink)
hg 1.3 (CentOS + rpmforge)
19:59:17 >wtnabe< @kuy えとhgですよね?TortoiseHGで書いた日本語ログを
Linux上のhgで普通に読めたので、相互運用できるんじゃないかなーと期待し
てたんですが、ダメっぽいすかね?
21:05:33 >wtnabe< @kuy 日本語ファイル名には期待してしません。
TortoiseHG 0.8.2 と hg 1.2/1.3 の組み合わせでは日本語ログは文字化けせ
ずに読めましたね…。
21:45:13 >wtnabe< @kuy CentOS で hg 1.3 は rpmforge かな? OSX 上の
Fink の hg 1.2 でも大丈夫だったと思います。
22:08:42 >wtnabe< @kuy どうも TortoiseHG 0.8.1 + hg 1.3.1 辺りで状況は
よくなってきてるっぽいですね。

ポイントは TortoiseHG. Windows で共有フォルダ上で使いつつ、OSX や Linux からちょっかい出す(というか共有フォルダが Samba 上)と幸せになれるかなーと思っています。

北陸セキュリティサミットに行ってきた

※ サミットとは大きく出たよねぇ

KIT・北陸セキュリティサミット '08

いいとこ悪いとこ、感想、提案、その他織り交ぜて。

当日にまとめ書くヒマねーっ。

告知&サイト

個人的には IT 勉強会カレンダーのフィルタ

Pipes: IT勉強会カレンダー 開催場所フィルタ

を利用して北陸地域の勉強会の情報を feed で取得していたので気づいたけど、他の人はどうやってこの開催を知ったのだろう?というぐらい告知が不足していたような気がする。

というのと日程が。連休のなかびって。自分は何も予定なかったからいいけど、結構困った人多いんじゃないかな。

あと登録フォームが生 http だったような。「おい、セキュリティ。」と思った記憶がある。(今はもう登録フォームのページないけど。)

あ、そうそう会費無料の意味がちょっと分かりにくかったです。講演&パネルディスカッションと懇親会はベツモノと思った人の方が多かったんじゃないかな。懇親会も無料ってちょっと嬉しい誤算でしたが、事前にそこまで理解できなかったという意味では不安が残りました。

会場

案内はしてあったんだけど看板が小さかったなぁ。あと建物の入り口の扉のところにも看板が欲しいし、部屋の入り口にも欲しかった。うるさいくらいに案内があった方がいいです。何せキャンパスでかいから。(たぶんそれを補うために学生さんがいっぱい立ってたんだろうけど。)

そうそう、野々市は emobile 圏外でした(T_T) Wi-Fi が入ったけど、WiFi が入るとか、そういう情報もあればちょっと嬉しかった。電源は忘れてったのでどっちみち取れなかったんだけど、ネットワークの様子は教えてほしかったかも。

※ 当日、パネルディスカッションの中で proxy が 2ch 弾いてるんじゃないかという話があったけど、バッチリ専ブラでは見えてました。前の席の方で ok サイン出してたんだけど、気づかなかった?

内容

園田さんはさすが先生、という感じでソツがなかった。でも wakatono さんは内容のレベルもペースも設計がむちゃくちゃでしたぞ。まぁ学生も社会人もっていう席で、かつ園田さんと違って特定技術についての内容だとそりゃ難しいとは思いますが。

個人的には wakatono さんの Xen 情報は Web も書籍も含めてかなり目にしているし、自分で手を動かしてアレコレやっているのでなんとかなったけど、会場でついていけていた人間が果たして何人いたのやら。

それより気になったのはパネルディスカッション。テーマでかいなーとは思っていたけど、案の定パネラーとの擦り合わせを全然やってない感出まくり。コーディネータがコーディネータの仕事してないっす。

懇親会

個人的にはちょっと懇親会が(職場の人と一緒に行った都合もあり) wakatono モードになりすぎたのが反省点なのですが、例えば学生と社会人の交流、みたいなことを意識しているのであれば、もう少し強制的に学生側と社会人側が挨拶を交わさざるを得ないような持って行き方とかあったのではないかなぁと思いました。特に社会人は少なかったので、自己紹介くらいさせてもよかったかも。とは言え次回以降、人数が変動すればこのアイディアは全然使えないかもしれない。

スケジュール

質問やらアンケートを書かせるには合間の時間がなさすぎます。まぁ会場の都合とかいろいろあったんでしょうけど。

まとめ

何かの契機になればいいなーと思います。もごもごもご。(いろいろ飲み込んでいるところ。)

dump file の手作業での修正を試みる

とりあえず必要なパスが含まれている node とそれを含む revision、copy してる revision をスクリプトで抜き出して、全部で 700 ちょい。これを load しながらどうしてもエラーの出るところに関しては手作業で dump ファイルを修正してみている。

エラーが起きるのは基本的に svn copy を実行する、ブランチタグを切る revision がほとんどなので、そんなにむちゃくちゃな数にはならない。あとは必要なパスの上の階層がすでに add されていないといけないので、その分も加えてやる。

これを全部自動化できればベストだが、とりあえず方法として間違っていないかどうかの確認を兼ねて実験。

結果、dump ファイルのパースをする際に無造作に改行コードを chomp したのがいけなかったのか、途中でデータに矛盾が出てきた。そこまででできあがったリポジトリを見る限り、そこまではうまく抜き出せていそうなので、あとはその辺をクリアできるかどうかだけかな?

改行コード周りかなーと踏んでいるのは、Subversion は内部の改行コードを LF に統一しているとマニュアルに書いてあるのに CRLF がそのまま入ってる箇所があったため。これはたぶん何らかの不具合の結果なんだと思うけど、実際に CRLF になってしまっているため、Ruby で chomp( "\n" ) すると \r\n が削れてしまい、出力時に \n しか付加しなかった場合は変換後のデータがオリジナルのデータと食い違ってしまう。結果、Content-length も md5 も合わない。

続きは休み明け。とりあえず狙った形のリポジトリには近づいている。

※ 最終的には手作業での dump ファイル修正を含めて目的の形にリポジトリを分割することができました。

cf.

Wiki でゲームブックって作れるな

いや、ふいに思いついたんだけど。つかたぶんいろんな人がとっくに思いついてるんだけど。

ページの一覧とかその辺の便利機能を殺していけばゲームブックになるんじゃなかろうか。あーでもその場合はページ名と URL が密接に結びつかないシステムがいいな。無意味な番号の方がいい。そこら辺は普通はシステムに組み込みだからなぁ。URL の設計って最初に考えておかないと、あとからいじるの面倒だもんね。

で、ここがミソなんだけど、最終的に一続きのテキストになる機能があるといいな。つまり本物のゲームブックを作れる機能。

やっと終わった ... < Meta-CVS 翻訳

やーやっぱ「自分は英語得意だったぜぇ?」とか言う学校教育時代の淡い自信のもとに翻訳なんかやるもんじゃないな。スピードの上がらないこと上がらないこと。実力のなさを痛感。

これでやっとセキュリティの勉強に集中できる。すっきりした。

About

例によって個人のなんちゃらです