2009-04-20 [長年日記]
_ [twym][mac] QuartzComposer へUDP通信で入力
TwYM(IRCログ表示機能付きタイマー)を作る際に困ったのが
どうやってQuartzComposerへ文字列を送り込むかでした。
最初のバージョンは咳さんのページにあるRSSで流し込む方法にしました。
ただ、何秒分か貯めてRSSを作っていたので
ログ受信から表示まで最大20秒のタイムラグがありました。
これを解消しようといろいろ調べました。
mootohさんの SocketReaderPatch を使おうと思ったのですが、
あるバージョンのQCから動作しなくなってしまったとのこと。
また、QCのサンプルにunixコマンドを実行して結果を得るパッチがあったのですが、
これを使うとなぜか縮尺がおかしくなるバグ?が。
さらに調べて、
Network Receiver というpatchがあることが分かりました。
network通信でStringを受け付けるものだそうです。
たぶん昔はなかったんじゃないかなこれ。
Leopardくらいのタイミングで増えたんじゃないかと。
さて、network通信のプロトコルは何を使えばいいの?
と調べていくと、海外のサイトに
『"Apple"って送る場合は、UDPでこう送るといいよ。』
→"\0\0\0A\0\0\0p\0\0\0p\0\0\0l\0\0\0e"
と書いてあった。
早速rubyでサンプル書いて試す。数行で書けるruby便利。
さて、ここでいつものように日本語で困るわけです。
しかし、さきほどのサイトのコメント部に
「UTF-32BEで送るといいよ!」
とありました。なるほど、だから\0が3つなのか。
でもUTF-32BEなんて聞き慣れないエンコードだけどどうすれば?
とrubyのライブラリを調べていくと、
ruby 1.9.1 だと標準ライブラリのkconvが対応してました。すごい!
サンプルコードを書くとこんな感じ。
QC側のサンプルとあわせて添付しておきます。(QC_UDP_sample.zip)
QCでUDP通信をどのアドレス、どのポートで待つかはInspectorのSettingで指定できます。
1.8系の場合は外部ライブラリのrbuconvを使うとできます。
TwYM ver.0.50 にrbuconvを使ったサンプルコードが入っているので、そちらも参照ください。
# -*- coding: utf-8 -*- # kconv の UTF-32対応が必要なので、要ruby1.9 require 'socket' require 'kconv' socket = UDPSocket.open() socket.connect("225.0.0.0", 50000) # address, port str_u8 = "いがいが".encode("UTF-8") str_u32BE = Kconv.kconv(str_u8, Kconv::UTF32, Kconv::UTF8) socket.send(str_u32BE, 0)