ソケット経由でadxvにスポット位置表示をさせる方法の解析
adxv の遠隔操作の仕方: adxv -socket 8100 & で起動しておく。telnet localhost 8100 で接続。load_image test0001.osc と送れば、test0001.osc が開かれる。
2012-10-12 23:34:24SHIKAからadxvを立ち上げて、一度立ち上げたらソケットを使ってイメージを更新するようにしてみた。load_image以外にどんなコマンドが使えるのかと思ってバイナリをstringsで調べてみたらload_spotsなるコマンドを発見。しかし今のところ使い方が分からず。
2013-11-13 11:56:13@yam_cpp load_spots は謎ですね。スポットリストを読み込むだけなら、load_image で行けます。https://t.co/GCEyaAGCQI
2013-11-13 16:20:05@biochem_fan おお,有り難うございます…って,ふぁぼってますね自分…すみません(図らずも同じようにstringsで調べてました).load_spotsの後に入れた数字がスポットの数を表すことは分かったんですが,座標の与え方が謎のままでした.
2013-11-13 16:28:46load_spots 1 4000 1000 を送り込むと、malloc が mmap(size=3360026624) failed みたいなエラーを吐く。999 だとエラにならない。1000 の部分を変えて size がどう変化するかを見ることで、引数の意味を探る。
2013-11-13 16:52:31load_spots 1 4000 Y とすると、Y を 100 変えるごとに、4096 バイトずつ要求される size が増えていく。ということは Y は座標を100倍して整数化したものではないか。
2013-11-13 16:55:15load_spots 1 4000 1000 1 と load_spots 1 4000 1000 でも変わるなぁ。なんだろこれ。
2013-11-13 17:05:18@biochem_fan load_spotsとend_of_packは対になってるのかなと思ってたんですが,そこはどうでしょうか?
2013-11-13 17:12:36@yam_cpp そこまで行ってません(汗) とりあえず。malloc のエラー表示をついて、引数解析中です。(sscanf にブレークポイント仕掛けてデバッガで追えばいいんですが、それは最後の手段として……)
2013-11-13 17:15:17end_of_pack で Expected 1400010001 but Read 0 spots. ていうのが出るな。この数字も解析できそう。
2013-11-13 17:17:09なんか、ハタから見ると、すごくアヤシイことをやってるみたいで誤解されそうなので実況は自重しよう…… ある科学ソフトウェアの引数がマニュアルに書いてないので、調査してるだけですよ〜
2013-11-13 17:18:19@biochem_fan いえ,例のメッセージが出るので,関連がありそうだなと思っただけで…やられてるような解析はできません汗 試しに, load_spots 1 1500 1500 1 end_of_pack としたら"Read 1 spots"と出ましたが何も表示されません…
2013-11-13 17:21:10strings adxvしたらload_spotsの下に %f%f%d end_of_pack と続いていたので, load_spots 1 1500 1500 1 end_of_pack としたが,出ず.adxvのFind Peaksを実行してから叩いたら,表示が出た.謎.
2013-11-13 17:32:46これで矩形の表示は出るけど,色が黒い.変えられるのかも知れないけど,まあおとなしく.adxファイルを読ませておけって話ですかね…
2013-11-13 17:37:33. @yam_cpp スポットの与え方は、お気づきの通りです。load_spots N としたあと、X Y type の列を N 個与えます。X, Y は float で、type は 1-255 です。その後、end_of_pack を送るとスポットが表示されます。
2013-11-14 02:54:37. @yam_cpp 問題はこの前で、これを送る前にスポットタイプを定義する必要があります。メニューから Find peaks をしたり、adx ファイルでスポットリストを読み込ませた場合は、自動的にスポットタイプが定義されますが、そうでない場合は未定義のため、何も表示されません
2013-11-14 02:55:27. @yam_cpp スポットタイプを定義するには、define_type N dummy blue dummy R のようにします。N は 1-255 の整数で、タイプ番号、R はスポットの半径、blue の部分は色です。blue, green, red を受け付けます。
2013-11-14 02:56:25. @yam_cpp define_type で指定するのは、タイプごとの色と半径です。これで丸が描けますが、中心に四角を出すには、box 10 10 のようにして、寸法を指定します。これは全てのtypeに共通です。色はdefine_typeで指定したものになります。
2013-11-14 03:00:44. @yam_cpp 以上をまとめると、http://t.co/hOuVE4i3oA のようになります。なお、telnet で一気に送りすぎると、取りこぼすことがあるようです。
2013-11-14 03:02:13Mac OS X 版と違ってバイナリが strip されていたので時間がかかってしまったが、x86_64 の呼び出し規約が体に染み込んだ。rdi, rsi, rdx, rcx, r8, r9 の順にレジスタに積んで呼び出し。
2013-11-14 03:05:17