« 2007年1月 | トップページ | 2007年3月 »

2007.02.28

RubyCocoa 今日のコミット (2007.02.28)

むやみに早起きしたのでデバッグ。[rubycocoa-devel:780]

  • Cocoaオリジナルのクラスについて、自動オーバライド機能が働いてしまう問題を修正

以前は RubyCocoa での Ruby 側のクラス階層は

OSX::ObjcID
  + OSX::NSObject
  + OSX::NSArray
  + OSX::NSMutableArray
  + OSX::NSProxy
  :

とフラットになっていたのだけれど、0.5.0 以降は

OSX::ObjcID
  + OSX::NSObject
    + OSX::NSArray
      + OSX::NSMutableArray
  + OSX::NSProxy
  :

と、Cocoa の世界の継承階層が Ruby でもそのまま反映されている。この変更に際して、自動オーバライド機能が適用可能なクラスかどうかの判定がうまくいかなくなっていた。

この修正にともなって、テストケースが1つ、Fになってしまった。けれども、このテストケースが誤り、というのが今回の判断。

|

2007.02.22

RubyCocoa 今日のコミット (2007.02.22)

こないだ、結局いらなくなった修正のテストコードを書いているときに気づいたのだけれど、

 sel = "foo_bar_baz_"
 SomeClass._obc_export(sel, types)
 p sel
 # => foo:bar:baz:

と Objective-C 風味に中身が破壊されてしまうことに気づいた。C側の処理 rbobj_to_cselstr() で、Ruby オブジェクトからセレクタを生成する際、引数のオブジェクトが String クラスのインスタンスだったら String#dup してから加工するようにする。

|

2007.02.20

第22回 Cocoa勉強会 のお知らせ

まだ内容は固まっていないのですが、1ヶ月前になったのでお知らせ。満員になってしまったため、見学の申し込みは締め切りました。

  • 日時: 2007/03/17(土) 13:00- (終了は17:30くらい)
  • 会場: 東京都内
  • 予定されている発表(随時更新)
    • GrowlのJava版の使い方
    • 旧NextStep形式のtarとRTF、そしてOpenStepリファレンス
    • CGIをつくる
    • ソフトウェアアップデートライブラリ Sparkle <- おれ
    • QuartzComposerとCocoaをつかったゲームみたいなもの
    • OgreKitを使ってみよう
    • RubyCocoaについて

(2007.03.10 現在)

|

2007.02.18

bcscan 2007.02.18 版

bcscan をちょっと更新。

 % bcscan --help
 scan barcode with isight and print barcode numbers.
  
 Usage: bcscan [options]
   -m, --mirrored                   use mirrored window
       --digits, --digit=digits     validate digit(s)
   -v                               display verbose message
   -h, --help                       show this help message

というわけで

  • コマンドラインオプションを追加
    • -m/--mirrored : 左右を反転したウィンドウを表示(MacBook 組み込みの iSight など向かって操作するときにはこのほうが、対象を動かすときに左右をまちがえにくい)
    • --digits : 数字の桁数を指定。指定した長さの値が読み込まれるまで終了しない。
  • LSUIElement を 0 に。

といったところ。

|

RubyCocoa の .app コマンドラインツールでのオプション操作

bcscan にオプションを追加しようと、optparse でオプションを書いてみたら。

 % bcscan --mirrored 
 /Users/kimuraw/build/Release/bcscan.app/Contents/MacOS/bcscan:
 invalid option --mirrored  (-h will show valid options)

と言われてしまう。あー、そうか。 RubyCocoa では RBApplicationMain() でオプションは Ruby 側に渡されちゃうんだよな。前もなんかで悩んだような気がする。ようするに、

 % MyApp.app/Contents/MacOS/MyApp -foo -bar baz
 # -> ruby -foo -bar baz rb_main.rb

となるのだ。これはこれで便利なのだけど(-d とか -r とか)、独自のオプションを扱おうとすると上述のように Ruby 本体から「そんなオプション知らねーよ」と言われてしまう。しかたないので、main.m で

 int main(int argc, const char *argv[])
 {
     return RBApplicationMain("rb_main.rb", 1, argv); // argc -> 1
 }

と、オプションを渡さないようにした上で、ruby スクリプト側で

 args = OSX::NSProcessInfo.processInfo.arguments.collect {|arg| arg.to_s}

と、NSProcessInfo から実際に渡されたオプションを取るようにした。

 % MyApp.app/Contents/MacOS/MyApp -foo -bar baz
 # -> ruby rb_main.rb -foo -bar baz 

となるような RBApplicationMain() の代替 API を RubyCocoa プロジェクトとして用意するといいのかな?

|

2007.02.17

RubyCocoa で非定型プロトコルの objc_export を自動的に

Leopard Tech Talks のあとでふじもとさんと話して「こうしたらいいんじゃ?」てなったのが、とりあえず実装できたので [rubycocoa-devel:745] として投げた。ちょっと追加した API で気に入らない部分があるんで、まだコミットはしてない。

このパッチで実現できること

  • 非定型プロトコルと同名のメソッドが定義されると、自動的に objc_export/objc_method 相当の処理を行う
  • その処理中で必要なので、BridgeSupport の非定型プロトコルに関するメタデータをとってくる API を Ruby からも呼べるように

しばらく devel で様子見かな。

(2007/02/18 追記)Laurent から「これって意味ないんじゃ?」との指摘([rubycocoa-devel:746])。あー確かに。考え直してみると、RubyCocoa bundle で正しくハンドルできない API がある のが全部同じ原因なことがわかった。ようするに .bridgesupport が読まれてないのだ([rubycocoa-devel:748])。mach-o モジュールと、.bridgesupport ファイルのロード状況を同一と見なしているのが問題。oc_import.rb に手をいれれば、わりと簡単に直せるはず。

|

2007.02.15

コマンドラインツール bcscan

masuidrive さんのコメントに触発されてつくってみた。とりあえず動くレベルはあっさり終了。

「起動する -> バーコード読む -> 標準出力に値を出力」が可能。

ダウンロード

ソースのコンパイルには、RubyCocoa が必要。バイナリは RubyCocoa 0.5.0 を同梱しているので、RubyCocoa を別途インストールする必要はない。

使いかた

実装は HMDT の Coral 方式。アプリケーションの bcscan.app とそのラッパーシェルスクリプト bcscan の2つで構成される。

  • bcscan.app - /Applications/ にコピー
  • bcscan - 実行可能なパス ${HOME}/bin や /usr/local/bin にコピー

bcscan.app のインストール位置が /Applications でないときは、シェルスクリプト bcscan をそれに合わせて変更すること。

ちなみに RubyCocoa 側のコードはこんだけ。

 require 'osx/cocoa'
 OSX.ns_import :MyBarcodeScanner
 
 class AppDelegate < OSX::NSObject
 
   def awakeFromNib
     scanner = OSX::MyBarcodeScanner.sharedInstance
     scanner.setStaysOpen(false)
     scanner.setDelegate(self)
     scanner.setMirrored(false)
     # start scan
     scanner.scanForBarcodeWindow(nil)
     OSX::NSApplication.sharedApplication.activateIgnoringOtherApps(true)
   end
 
   # MyBarcodeScanner delegate methods
   def gotBarcode(barcode)
     $stdout.puts barcode.to_s
     OSX::NSApplication.sharedApplication.terminate(self)
   end
 
 end

これしかないので、C/Objective-C で書いてもよかったのだけれど、今後コマンドラインオプションを追加しようと思ったときに getopt(3) より Ruby の optparse のほうがやりやすいかなあという理由で Ruby/RubyCocoa を選択。

今後の予定

  • exit status をきちんと(中止時などは 0 以外に)
  • オプションの追加
    • 読み込み値の検証(指定された桁数や形式の値を読み込むまで終了しない)
    • タイムアウトの指定
  • UI の改善(優先度低。めんどくさいから)

あんまりがんばるつもりはないので、興味のある人の開発引き取りを歓迎します。

|

2007.02.12

iSight でバーコードを読む

ふと探してみたら、iSight を利用してバーコードを読む Cocoa のコード Barcode scanner を見つけた。ライセンスは MIT ライセンスなので、好きにいじれる。

手元の本や CD で試したところ、問題なく読めるので、十分実用になりそう。ただ、はじっこがはみ出していてもスキャン対象の領域の中だけ読んでしまうので、両端にある程度バーコードでない領域があるときのみ読むようにしたほうがよいかも。あと、上下逆さは読めないようだ。スキャンの開始はしてるようなので、うまく読めないときに逆さにしてみるって動作に変更すればいいかな。

もうずいぶん前になるけど Delicous Library がリリースされたころ(3年前くらいかな?)、iSight でバーコードを読むというアイディアを知ったときは「その手があったか!バーコードリーダより iSight のほうが安いもんな」とちょっと感動したものだ(けっきょく iSight は買わなかったけれどね)。今は MacBook 本体に iSight がついてるから、いろいろ遊べる予感。

(2007/02/15 追記)簡単なコマンドラインツール bcscan を作成してみた。Leopard Tech Talks でたまたま会った GNUE さんにデモしようとしたら、部屋の明るさが足りなかったのか読み込めず。ある程度、明るい環境でないとダメみたい。

(2007/07/07 追記)bcscan のプロジェクトページを作成しました。最新リリースはこちらから取得できます。

|

2007.02.05

Keynote3 対応の LinkBack プラグイン出た

Keynote LinkBack Plugin の Keynote3 対応版がリリースが linkback の ML でアナウンスされた。1年以上止まってたので、もう出ないかなーと思っていたよ。これで OmniGraffle の図を別ファイルで保存しとかなくてもいいや。

今回からソースつき。class-dump してヘッダを生成など、リリースエンジニアリングばりばり。このへんが Objective-C の柔軟だけどランタイムいじり放題なパワーだよな。ユーザとしてはありがたいけど。

|

2007.02.04

Rabbit 関連の Portfile 更新

MacPorts の evolution-data-server が 1.8.3 になっていたので再チャレンジ。MacBook でもインストールできた。(configure.env_add を configure.env-append に書きかえたけど)

というわけで、手元の MacBook で Rabbit が動くようになった。Rabbit の svn に入れてる、以下の port を更新。

  • rb-gnome 0.14.1 -> 0.16.0
  • rb-gettext 1.8.0 -> 1.9.0

とりあえず Rabbit-0.5.0 を簡単に動かした感じでは問題なさそう。コミット。

|

« 2007年1月 | トップページ | 2007年3月 »