«前の日記(2009-04-19) 最新 次の日記(2009-04-21)» 編集

いがいが日記


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)

«前の日記(2009-04-19) 最新 次の日記(2009-04-21)» 編集