2006年 11月 16日

IIrcv - dRuby インターフェイスの時系列通知サーバ

IIrcv - 汎用通知サーバ with dRuby

Windows には Ircv というイカしたメッセージを表示するものがあるのですが、Mac だとこれっぽいのがないので作ってみました。Growl だと時系列が乱れたりするのでなんかだめだってときに便利かもしれません。

これを作るにあたりいろいろ学んだので楽しかった。

  • Cocoa 全般の構造
  • アプリケーションバンドルの作り方
  • バンドル内のファイルのアクセス法
  • NSLayoutManager の使い方少し
  • .icns ファイルの作り方 (/Developer/Applications/Utilities/Icon Composer.app)
  • dmg ファイルをコマンドラインから作る方法 (hdiutil create)
  • 拡張ライブラリの実装法とドキュメントの書き方
  • 拡張ライブラリ rubygems の作り方
  • ユーザ入力が必要な実装のテストの書き方

あと言語依存を解決したい。Interface Builder で nib 作って読み込む方法がいまだにわからないのでどうにかしたい。

Universal Binary 云々は確認がめんどい割に面白くないのでやる気がおきない。

catalyst


フォント等幅で ./script/testforiircv_server.pl -d 2>&1 | iircvstdout.rb

InterfaceBuilder

わかってきた。すっごい便利だなぁ。

  • アウトレットって何? => インスタンス変数の変な名称
  • アクションって何? => インスタンスメソッドの変な名称

Ruby のクラスを作りたい場合を(とは限らないけど)、例えば Classes で NSObject を選んで Classes -> Subclass ... するとサブクラスができるので、それに対してアウトレット/アクションを設定する。でもって Instantiate ... するとインスタンスが出現するので、Ctrl + ドラッグで配置したコントロールとアウトレット/アクションを結びつけていく。
例えばボタンを Ctrl クリックしてそのインスタンスされたオブジェクトにドロップするとアクション一覧がでてどれに接続するか選べる。
とかいうものらしい。あとは Ruby 側でインスタンス化したりするのと一緒だけど、アプリケーションバンドル化しないとうまく実行できないのでちょっとめんどい。Makefile 書いて、make clean; make; open IIrcv.app みたいなのを毎回実行するようにしてる。

おまけ。Create Files For ... するとクラスのひな形を作ってくれていいんだけど、もちろん Objective-C。なので Ruby に変換するのを Ruby ででっちあげた。

#!/usr/bin/ruby

require 'erb'

header = ARGF.read
_, class_name, super_class = */@interface ([^¥s]+) : ([^¥s]+)/.match(header)

outlets = header.scan(/IBOutlet id (.*?);/)
actions = header.scan(/^- ¥(IBAction¥)(.*?):¥(id¥)sender;/)

ERB.new(DATA.read, $SAFE, '-').run
__END__
require 'osx/cocoa'
include OSX

class <%=class_name%> < <%=super_class%>
	<%- outlets.each do |outlet| -%>
	ib_outlets :<%=outlet%>
	<%- end %>
	<%- actions.each do |action| -%>

	def <%=action%>(sender)
	end
	<%- end %>

	def awakeFromNib
	end
end