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

2008.02.28

MacRuby - Ruby1.9 powered by Objctive-C 2.0 Runtime

lrz's diary の Hello MacRuby 経由で Why MacRuby。以前に Laurent が計画していたらしい(参考:MatzにっきのRubyConf 2006)、Objective-C ベースの Ruby 実装がついに登場(する予定)。

  • 1.9 ベース
  • Ruby インタプリタ中のクラス・オブジェクトは実際の Objective-C/Cocoa のクラス・オブジェクトになる
  • Objective-C ライクなキーワード引数の構文 dict.setObject(o, forKey:k)
  • ネイティブな POSIX スレッド
  • Objective-C (2.0) のガベージコレクタを利用

まだまだ完成とはいかないのだけれど、これによって RubyCocoa の問題がたくさん解決する(らしい)。すげえな、正直なとこ本気だとは思っていなかったぜ。

難しそうなのは、String と GC あたりかな。

そういや昔ふじもとさんが作っていた Classic Mac OS 用の Ruby も MacRuby という名前だった。まあ間違える人はいないだろうし、かまわないのか。

(2008.02.29 追記)

  • マイコミに記事が出てた。「かつて同名の旧Mac OS用Ruby実行環境も存在したが」あたりが、、、そんなこと言わんでもと思わないでもなく
  • MacRubyTutorial で、どういうふうに Cocoa オブジェクトが扱えるのかが紹介されてる

(2008.03.06 追記)

(2008.03.12 追記)

|

2008.02.20

RubyCocoa 0.13.2 の MacPorts 更新をチケット登録

ついでなので、 MacPorts 本家に RubyCocoa の port を最新の 0.13.2 にするパッチを [#14400] として登録しておいた。10.5 では --build-universal が自動で yes になってしまうので、universal バリアントが指定されていないときは no を config 時に追加するようにした。(2008.04.02 追記:本家にコミットされた)

10.4 では、まだ [#13135] の件が解決されていないので、config で失敗すると思う。(2008.02.28 追記:ruby 1.8.6-p111 になったついでにマージされた)

|

ソースコード整形ツール uncrustify の野良 Portfile を書いた

ソースコード整形ツール uncrustify の 野良 Portfile を作成して MacPortsWikiJP に置いた。先週の Cocoa勉強会でリクエストされたので。

この手のツールとしては珍しく、Objective-C 対応。なのだけど、とりあえず Objective-C はまだ対応が開始されたばかりで、いくつか不具合がある。

  • sp_before_oc_colon が remove のとき、なぜか空白が追加される(空白があるときは削除される)
  • indent_label を 0 にすると、メッセージの書式がそれなりになる

くわしくは勉強会で発表者だった成田さんから情報がでるかもしんない。

|

2008.02.17

インストーラ.app + .pkg でインストールされたファイルが、どのパッケージからなのかを検索する

MacPorts でいえば port porvides [file] のように、あるファイルがどのインストールパッケージでインストールされたか知りたいことがある。/Library/Receipts/ 以下にそれぞれのパッケージがあるので、その中の .bom ファイルに lsbom をかければ、そのパッケージが提供するファイルの一覧を取得できる。

検索するてきとーなスクリプトが手元にあるのだけど、なんか Leopard になってからヒットしないものが増えたと思っていたら、.bom ファイルの場所が変わっていた。

というわけで、場当たりの対応。アタマワルソウな書きかたなのに、意外と遅くない。

 % cat =greceipts
 #!/bin/sh
 for receipt in `ls -1d /Library/Receipts/*.pkg`
 do
   bom=${receipt}/Contents/Archive.bom
   if [ -r ${bom} ]; then
     lsbom ${bom} | grep $@ | sed -e "s/^/`basename ${receipt}`:/g"
   fi
 done
 # 10.5, Receipts/boms
 for bom in `ls -1d /Library/Receipts/boms/*.bom`
 do
   if [ -r ${bom} ]; then
     lsbom ${bom} | grep $@ | sed -e "s/^/`basename ${bom}`:/g"
   fi
 done

なんで今日気づいたかというと、RubyCocoa の SF.net のバグトラッカーにきてたビルドエラーの件を調べる際に、libxml2 のヘッダがインストールされるのはどのパッケージか知りたかったから。

 % greceipts -l include/libxml2
 MacOSX10.4.Universal.pkg:(standard input)
 com.apple.pkg.DevSDKLeo.bom:(standard input)

なので「XcodeToolsインストールしてないんじゃない?」と答えておくことに。

|

2008.02.16

RubyCocoa 0.13.2 リリース!

RubyCocoa 0.13.2 でました([rubycocoa-devel:1325])。ダウンロードは RubyCocoa: GettingStarted あたりからどうぞ。こないだ Apple からリリースされた MacOSX 10.5.2 では 0.13.1 になっているので、またちょっと新しくなっています。

日本語のリリースノートは今日中には出せると思うので、しばしお待ちを。

(2008/02/16 追記:出しました [rubycocoa:0463]

以下コピペ。

RubyCocoaの新しいバージョン0.13.2をリリースしました。

http://rubycocoa.sf.nethttp://sourceforge.net/project/showfiles.php?group_id=44114

から入手することができます。

  • MacOS X 10.5 (Leopard)用のバイナリパッケージ
  • MacOS X 10.4 (Tiger)用のバイナリパッケージ
  • ソースコードのtarball

が用意されています。

Leopardのシステムに用意されているRubyCocoa.frameworkは/System/Libraryにありますが、バイナリパッケージは/Libraryにインストールするので、元からあるRubyCocoaは上書きされません。また、先日のソフトウェアアップデートMacOSX 10.5.2ではRubyCocoa 0.13.1が提供されています。

オリジナルの英語のリリースアナウンスについては以下を参照してください。http://lists.sourceforge.jp/mailman/archives/rubycocoa-devel/2008-February/001297.html

新しい機能
  • サンプル Growl が追加されました
  • NSSizeにメソッド /, *, +, - が追加されました
  • NSPointにメソッド +, - が追加されました
  • ActiveRecordSetControllerで複数選択しての削除ができるようになりました
バグ修正など
  • Objective-Cクラスのサブクラスでメソッドをオーバーライドした際のバグを修正しました
  • 構造体の配列がreturnされたときのバグを修正しました
  • 参照があるにもかかわらずGCにより開放されてしまうことがある問題を修正しました
  • NSNumber#float?を廃止し、integer?を追加しました。これはNumber#integer?と合わせたためです。
  • NSString#scan(regexp){block}のブロック引数が、StringでなくNSStringになるようにしました
  • NSString#splitが返す配列にimmutableなNSStringが含まれることがあるバグを修正しました
  • NSArray#deleteが常にブロックをyieldするバグを修正しました
  • NSNumber#to_fがdoubleを返すようにしました
  • ActiveRecordに多くの関連があるときのパフォーマンスを改善しました
  • ActiveRecord#to_activerecord_proxyのバグを修正しました
  • gen_bridge_docは最新のAppleのドキュメントに対応しました
  • libffiがmacosx-deployment-target=10.4で必ず作成されてしまうバグを修正しました
  • Tiger用のリリースパッケージを作成できるようにしました
  • 修飾子in|out|inoutなどのあるObjective-Cメソッドに対応しました
  • サンプル中のデバッグ用ENV['BRIDGE_SUPPORT_PATH']=を削除しました
  • メソッドの引数をキャッシュするようにしました

|

WebKit と Apple ライブラリのびみょーな関係

Planet WebKit を見ていると、Windows 版のグラフィックスライブラリが Cairo になったりWindows 版で CFNetwork をやめて CURL を採用しようとしていたり と、両方とも同じ人が実装しているっぽいものの Apple のライブラリ(CF/CoreGraphics)から オープンソースのライブラリを採用する傾向がでてきたのがおもしろい。Cairo にしろ CURL にしろ、いろいろな環境で実績のあるものだし。

|

2008.02.12

10.5.2 で Time Machine のメニューバーが

出るようになったのは別にかまわないのだけど、バックアップ中に時計マークが反時計まわりに動くのは、データが勝手に戻されているようで不安になる。だからって時計まわりでも、もちろんオカシイのだけど。

そういえば Finder のサイドバーのアニメーションは前から時計回りだな。こっちは時計マークではないけれど、もうわけがわからない。

|

Google Toolbox for Mac でなにができるか

いつか音楽と呼ばれるもの » Google Toolbox for MacGoogle Toolbox For Mac MacResearch を見て、Google Toolbox が気になったので、とりあえず Foundation についてまとめてみた

ヘッダに(おどろくほど)詳しい説明が書いてあるので、何ができるかがわかれば、利用するかどうかの評価は簡単なはず。なので、個々のメソッドの使い方とかはスルーしまくり。それでも、その情報があるだけでだいぶ違うと思うよ。

正規表現は libc の regex なので、日本語とか過剰な期待はしないこと!

|

2008.02.11

RubyCocoa 昨日のコミット(2008.02.10)

ObjC オブジェクトに対応する Rubyオブジェクトが同一にならないことがある問題

r2174で追加された(最初から失敗していた)テストケースを調べた。これは、Nib のアウトレットの取り出し方法によって、同一のアウトレットの Ruby オブジェクトの id 値が異なるというもの。

RubyCocoa では、 ObjC オブジェクトとその Ruby 側のオブジェクトの関連を、ハッシュテーブルとして管理していて、それによって ObjC と Ruby のオブジェクトが一対一になるように制御している。それがうまくいっていないようだ。

原因は ObjC から Ruby に引き数として渡されたオブジェクトはキャッシュしないようになっていたため。そのため、

  1. Nib がロードされて、アウトレット(Ruby のインスタンス変数)に保存される。ここではキャッシュされない
  2. NSNib#instantiateNibWithOwner_topLevelObjects でアウトレットを取り出すとき、キャッシュにないため 新しい VALUE が生成される。その後この値がキャッシュされる。

となっていた。なので、今回は Nib 関連で見つかったのだけど、なにも Nib に限定して発生する問題ではない。

キャッシュするようにすれば直るのはわかったのだけど、わざわざ ocdata_to_rbobj() において Qfalse というある種のマジックナンバーで特殊処理をしているので、そのまま直してよいかわからず、ML に簡単な報告を投げた。そしたら、どうも問題なかったようで、lrz がコミットしてくれた(r2189)。さんきゅー。

[rubycocoa-devel:1313] で Laurent が言うように、このキャッシュシステムはけっこーナーバスで、ややこしい問題を発生させることがある。もともとラッパーオブジェクトの生成を抑制する(初期の RubyCocoa では毎回 VALUE を生成していたケースがあった)ことでパフォーマンスを向上させるのが目的だったのだけど、そこから派生してObjC<=>Rubyのオブジェクト対応を保証する仕組にまでなっている。

個人的には、同一判定を __ocid__ で比較する(文字列などは適切に #==(other)をオーバライドして定義することが必要)だけで良くって、ラッパーはどうなっててもいいと思っているのだけど、当時は賛同得られなかったしなあ。

キャッシュしてない他の場所も対応

上記の件と関連して思い出したので、以下も対処した。

  • キャッシュされない rbobj_get_ocid() 呼び出しを rbobj_to_nsobj() に置き換え(R2190)

まだ何箇所か直したほうがよいところがありそうだろうけど、確認できたところから。rbobj_get_ocid() はかなり深いところにある機能で、ふつーはホイホイ呼ばれるような関数じゃない。(昔はそうじゃなかったので、以前からあった実装にはいくつか残っている)

この件は、[ruby-list:44464] の確認をしているときに、やばそうな箇所をいくつか見つけたので直さなくちゃと思っていたのだ。

|

2008.02.09

RubyCocoa Book from Pragmatic Bookshelf

rubycocoa-talk に Pragmatic Bookshelf の新刊として RubyCocoa の本を書いていて、第1章のサンプルを公開したよ、との告知が。今後は google-group:rubycocoa-book にアナウンスなどを流すとのこと。

RubyCocoa 単体の書籍としては、たぶん世界初になるはず。わくわく。

|

macports.org にログインすると Safari が落ちる件

DarwinPorts スレとかでもぜんぜん聞かないので、うちだけの問題だと思っていたのだけど "It is a known bug in Safari/MacOS" ということらしい。チケット登録は Firefox とか w3m とか、他の非 WebKit のブラウザでやらないとダメなもよう。

めんどっちいな。

|

RubyCocoa 今日のコミット(2008.02.08)

前から欲しかったのだけど、ほったらかしていた機能。使い方はこんな感じ。

 ####
 ## メソッド test_ocid だけを実行
 % ruby install.rb test  --test-args="--name=test_ocid"
  :
 Started
 .
 Finished in 0.000792 seconds.
  
 1 tests, 2 assertions, 0 failures, 0 errors
 
 ####
 ## テストケース TC_NSArray だけを実行 
 % ruby install.rb test  --test-args="--testcase=TC_NSArray"
  :
 Started
 ........................................................................
 Finished in 0.106226 seconds.
  
 72 tests, 542 assertions, 0 failures, 0 errors

|

2008.02.08

Porfile: ack 1.77_02

プログラムコードで便利なテキスト検索ツール ack がアップデートしてたので、MacPortsWikiJP の PrivatePortfile/ack を更新。前に Portfile だった 1.68 からの変更点は、対応するファイルタイプが増えたとかオプションが増えたとかバグ修正したとかそんなあたり。

説明するのがめんどうなので置いておいた、はてブのackを久しぶりに見てみると、Rak という Ruby 実装の類似ツールがあるみたい。(ack は Perl 製)コマンドラインオプションを見た感じでは、だいたい同じ機能のようだ。(2008/02/15 追記:今日まで気づかなかったけど、Rake と名前が似すぎているんじゃなかろーか。コマンド入力の補完時などに「うざっ」と思うかも)

|

RubyCocoa 昨日のコミット(2008.02.07)

sf.net のトラッカーに バグレポート [bug:#1883245] が上がっていたのに対応。

引数の型に "out" などの修飾子がついているとき、うまく扱えない問題があった。

 - (NSString*)foo:(id)param error:(out NSError**)error;

修飾子については、ADC の Type Encodings あたりを参照のこと。

  • 上記の問題の修正とテストの追加 (r2183, r2184)
  • r2183 で追加した関数 encoding_skip_notype() と既存の関数 encoding_skip_modifiers() がまぎらわしいので名称を変えた(r2186)

もともと const 修飾子には対応していたので、その対象を修飾子 in, out, inout, bycopy, oneway に拡張することで修正完了。byref は Objective-C ランタイムの扱いがほかの修飾子とちがうっぽいので、対応は保留に。

r2183 をコミットしたあとにトラッカーにパッチが添付されてるのに気づいてヘコんだものの、内容は(意味的に)似たようなものだったので、方針はまちがってなかったと安心することにする。

関係ないけど、r2181 あたりから tc_active_record.rb のテストが通らないものが増えてる。Rails のバージョンかなあ。あとで調べる。(2008.02.10 追記:結局わからんかんったのでMLに投げた [rubycocoa-devel:1310])

|

2008.02.03

Ruby-GetText-Pacakge の Portfile を 1.90.0 に更新

Ruby-GetText-Pacakge が更新された <> ので、Rabbit の Portfile を更新 (trunk r51)。Rabbit を簡単に動かして動作確認。

前のバージョンは 1.10.0 だったので、いっきにバージョン番号が大きくなったけど、次は 2.0 なのだろーか。

ついでに、前からだらだらと作業をしていた INSTALL.macosx-macports.en をコミット。ひどい出来だけど、まあないよりはマシだろう。

|

2008.02.02

iCab が WebKit ベースに

Mac 用ウェブブラウザの老舗、iCab が 4.0 で WebKit を採用 とのこと。Uli's Web Site の iCab goes WebKit より。

iCab といえば Classic Mac OS のころからあるウェブブラウザで、

  • 動作が軽い
  • 68K Mac にも対応
  • 画像サイズや URL によるフィルタリング機能(バナー広告全盛期に効果を発揮)
  • HTML チェッカーを内蔵し、スマイル表示
  • 早くから link 要素でのナビゲーションに対応(「ごく簡単なHTMLの説明」での例示

などが特長で、自分も Mac OS 9 のあたりまではメインで使っていました。まだ開発が続いているってのはすごいな。

4.0 をダウンロードして、環境設定パネルを見てみたところ

  • Cookie ストレージが iCab 独自と、システム共通のどちらかから選べる
    • Cocoa は、ふつー共通になってしまう(NSHTTPCookieStorage)
  • JavaScript の機能ごとの有効/無効

あたりが Cocoa プログラマとしては実現方法が気になるところ。

|

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