« 2007年4月 | トップページ | 2007年6月 »

2007.05.30

RubyCocoa 今日のコミット (2007.05.30)

  • NSString(Cocoa) と String(Ruby) に重複しているメソッドがあるとき、Ruby 側が優先されてしまい、length が予期しない値(バイト数)を返す副作用を訂正(r1789)。

現在問題があるのは NSString#length のみであることはわかってるので、暫定でそこだけ対応。ちゃんとやるには、Ruby のメソッドシンボル名を正しく Cocoa のセレクタに変更してやらないといけない。けれど、それはすぐにはできないし、ひとつのチェンジセットにはしたくないからあとまわし。

NSString#length は文字数を返し、NSString#size は String に委譲され バイト数を返すようになった。

|

i5TQConv 1.1 リリース

i5TQConv 1.1 をリリースしました

MacOSX でよく利用されている UTF-8(NFD) だと iPod Quiz 上で文字化けすることに気づいたので修正。NSStringでは UTF-8 の正規化を気にしないで利用できるのは便利なのだけど、明示的に扱うのにはどうしたらよいのだろう?わからんので Ruby の Iconv まかせにした。

いくつか .5TQ ファイルを変換してゲームやってみているけど、今のとこ問題なさそう。淡々と四択問題が続くので、ちょっと味気ないかも。正誤問題もまぜて生成するようにしてみようかなあ。

|

2007.05.27

i5TQConv - ごたくコンバータ for iPod Quiz リリース

i5TQConv バージョン 1.0 をリリースしました。RubyCocoa 製。

これはなに?

iPod のゲームで、iPod Quizというクイズゲームがあり(有償、150円)、このゲームではテキストファイルとして問題データを作成することができます。

i5TQConv は、日本に古来よりある「ごたく」用の .5TQ ファイルを iPod Quiz の trivia.txt に変換するアプリケーションです。iPod Quiz では回答の選択肢の数が最大4なので、てきとーに選択肢をひとつ抜いています。もちろん正解は抜いていません、たぶん。

SJIS から UTF-8 への変換をどこでやるか悩んだままウヤむヤに実装。ここがうまくできれば、コードかなりキレイになると思うのですけどねえ。添削歓迎します。

データ読み込みは人まかせ

.5TQ ファイルの読み込みには「ごたく開発キット」という LGPL の perl スクリプトを利用しました。ppc Mac 上ではエンディアンの影響でうまく動作しなかったのだけど、pack 文字列を直すだけでよかったのでパッチを作成して作者の人にメールしたところ、エラー。まあ 1999 年の情報ですからね…

というわけでここで感謝の意を表明しておきます。ごたく開発キットのおかげで、このアプリを簡単につくることができました、ありがとうございます。

|

2007.05.24

Cocoa勉強会 関西 #15 に行ってきた

というわけで報告。いろいろあったけれど、勉強会の話だけ。

発表

大森さんの「WiiRemote Frameworkの使い方」。WiiRemote Framework でのプログラミングの総ざらい。母艦から、LED の点灯や振動まで制御できるのは知らなかった。でも使い道が思いつかない。

北村さんの「Image I/O について」。ImageIO でのイメージの読み込み・出力について。NSImage との比較がすげえ参考になる。自分のやるようなプログラミング範囲では、当面は NSImage で事足りそう。

河本さんの「CoreData のフィールドの情報を取り出すデモ」。CoreData の Description を取り出して〜という話。技術的には RubyCocoa での CoreData サポートのときに調べたものなので知識はあったけれど、実際のビジネスでどんな感じに CoreData が使われている(または使われていない)というあたりが面白い。

木村の「らくらくアップデートSparkle in 関西」。3月に関東でやったやつの焼き直し。行きのサービスエリアなんかでがんがん見直ししたので、前よりもだいぶよくなったはず。発表よりもOmniDazzleの営業に成功。果たして売れたかな…?自分の資料はいつものとおりCocoa勉強会の発表資料においとく。今回はサンプルアプリもあり。

藤本さんの「RubyCocoaでFlickrViewerを作るデモ」。"to_s"ボクメツ運動の内職をしていて、ほとんど聞いていなかったのはヒミツ。

さえきさんの「AppKit meets QuartzCore!!」。以前に関東でやったものとだいたい同じ。苦手のグラフィック分野だけれど、前と比べて理解できた気はする。成長したかな。

感想

自作アプリのちょっとしたデモなんかもあって、関東とはまた少しちがう雰囲気。北村さんとかさえきさんのサンプルコードのボリュームに(またも)驚く。

|

Cocoa勉強会 #23 に行ってきた

というわけで報告。

発表

温井さんによる「IOKit で使う PaSoRi」。MacOSX から PaSoRi を利用するには、libpasori が既にあるけれど、Cocoa アプリケーションから利用するときには問題がある。じゃあ、I/O Kit で作っちゃおうぜ、という野心的な話。

大森さんによる「プラグイン対応アプリの作り方」。Cocoa では NSBundle があることによって、プラグインをもつアプリケーションが(比較的?)簡単に作ることができる。で、実際につくる手順の話。質疑応答では、Xcode で別プロジェクトを依存させる方法や、それの構成を合わせてビルドする方法など、Xcode の操作について盛り上がり。

新居さんによる「カスタムシートとModality」。シートをはじめとするモーダルな UI についてのモダリティのモードとそのハックについて。ふつうはドキュメントモーダルとアプリケーションモーダルの2種類なのだけど、iWork のように、アプリケーションモーダルかつ終了可能なようにするにはどうすればよいか、など。stepwise が復活していたっていう情報がイチバンの収穫だったり。

ゲストスピーカーの Hiroaki さんによる「DawiinRemote」。DawiinRemote の生まれるきっかけから、使い方、技術的な話ももちろん、開発のこぼれ話みたいのが面白い。やっぱモノが動くのは見ていて楽しいよな。これからは英語のリリースノートもちゃんと書こう、と(今のところは)決心した。

関根さんによる「CocoaアプリのAppleScript対応 その二」。「その一」はアプリケーション独自の AppleScript コマンドを実装する方法で、今回はオブジェクト(アイテム)を参照できるようにする話。このくらい定型的なら、スクリプト一発でできないかなあとぼんやりと思う。

藤本さんによる「RubyCocoaでの非標準フレームワークの使い方」。前回に続いて RubyCocoa の紹介 第2弾。BridgeSupport や rb_nibtool.rb など最近導入された機能がメイン、だったような(関西と混ざって思い出せない)。個人的には、プロジェクトにあんまり参加していなかった時期の内容なので助かった。

木村の「Cocoaのコーディングスタイル」。幸か不幸か持ち時間が少なかった(15分)ので、ひととおりの紹介と、面白そうなとこのピックアップ。やっぱヒレガスのが毛色かわってて勉強になる。自分の資料はいつものとおりCocoa勉強会の発表資料においとく。

その他

こんなアプリ作ったのだけど売れないかなあ、とか今後の勉強会の活動内容などなど。

次回は7月下旬くらいの予定。

|

RubyCocoa 昨日のコミット(2007.05.23)

  • NSApplication.run_with_temp_app が動かなくなっていたので修正

[rubycocoa-devel:890]を試そうとしたら動かなかったので直した。

この問題については、Ruby オブジェクトと Cocoa/Objective-C オブジェクトマッピングのキャッシュが原因らしいとこまでわかったあたりで睡眠。起きたら Laurent が直し終わっていた。仕事はええ!

|

2007.05.21

RubyCocoa 今日のコミット(2007.05.21)

すげえ久しぶりのコミット。多くのケースで Cocoa の文字列に対して to_s が不要に(たぶん)。

Cocoa勉強会 関西で沼田さんに「to_s がいろんなとこで必要なのってどうにかならない?」と言われたのでトライ。たしかに、なぜ to_s が必要なのかを説明するのも大変だし、そこをプログラマが意識しなけりゃいけないのってなんかバカバカしいよな。

最初はパッチだけ投げて意見を聞いてみようと思ったけれど、いきなりコミットしてみた(r1755)。ダメなら revert すりゃいいだけだしね。

  1. to_str を実装。open() などいくつかのメソッドで String として扱われる
  2. NSString と String 間の比較を Ruby の文字列と同じに。rbstr.to_s としなくても比較できる。
  3. String が実装しているメソッドが呼ばれたら、Ruby の文字列として実行。rbstr.gsub() とかできるように。

3.は内部では単純に to_s してそのメソッドを呼び出しているので、破壊的メソッドのときは操作結果を NSString(NSMutableString) に反映してやらなくちゃいけない。でもさ、あるオブジェクトが mutable か immutable かを判定することって Cocoa 的にはできないんだよね。クラスクラスタでは isKindOfClass: は全体について効いてくるから、[NSString isKindOfClass:(Class) NSMutableString] が YES になったりするのだ。

仕方ないので、そのまま setString: して例外が発生するのにまかせることに。immutable であることがわかっていれば、to_s.freeze したオブジェクトにメッセージ送ればよいから、今の実装よりはキレイに書けるのになあ。

ちなみにハッシュのキーとしてはまだ to_s が必要。これをちゃんと実装するには、String#eql? をオーバーライドする必要があり、それは影響が大きすぎるだろう、と思うのだ。NSString#hash、NSString#eql? を定義すれば、ハッシュ内のキーが NSString で検索するキーが String というケース以外は動作するようにはなる。けれど、中途半端だよね。これは。

|

2007.05.14

svk view で svn:externals に対応(まだ実用的ではない、と思う)

BridgeSupport が RubyCocoa プロジェクトから独立した。で subversion リポジトリでは svn:externals で BridgeSupport を取得するようになった。そこで、svk pull しても svn:externals のコードが取得されないことに気づいた。(ていうか、ふじもとさんに「チェックアウトできないっすよ!」とリフジンな文句つけた。スミマセン)

どうやら svk では svn:externals を解釈してローカルリポジトリには取得してくれないようで、苦労している人が多いみたいで、実装を詳しく提案している人もいる。

まだベータ機能ながら、svk 2.0 で導入された svk view で解決できるらしいと書かれている。なんだこれ?面白そうじゃん、ということでトライ。(今回利用したバージョンは svk 2.0.1)

svk view は svk:view:(ビューの名前) というプロパティを作成することで、仮想的なリポジトリを構成することができる機能だ。RDB でいうところの VIEW、というよりもリポジトリの unionfs と考えたほうがとらえやすいかな。

まず、手元の svk リポジトリはこうなっている。

 % svk ls //local
 bridgesupport/
 rubycocoa/
 % svk info //mirror/bridgesupport
 Depot Path: //mirror/bridgesupport
 Revision: 45
 Last Changed Rev.: 39
 Mirrored From: http://svn.macosforge.org/repository/bridgesupport/trunk, Rev. 9
 % svk info //mirror/rubycocoa
 Depot Path: //mirror/rubycocoa
 Revision: 45
 Last Changed Rev.: 36
 Mirrored From: https://rubycocoa.svn.sourceforge.net/svnroot/rubycocoa/trunk, Rev. 1727

で、現在設定されている svn:externals は次のとおり。

 % svn propget svn:externals https://rubycocoa.svn.sourceforge.net/svnroot/rubycocoa/trunk/src/misc
 bridgesupport http://svn.macosforge.org/repository/bridgesupport/trunk

これと同じような svk のビューを作成したいわけ。svk help view にあるように、

  • &: で取得するリポジトリのルートを指定
  • -* でルートディレクトリにファイルを除外

ができることがわかる。

今回設定した内容は次のとおり。

 % svk propget svk:view:rbcocoa //local
 &:/local
 -*
 . rubycocoa/src
 misc/bridgesupport bridgesupport

これで

 % svk co //^local/rbcocoa rubycocoa

とチェックアウトして、意図したとおり misc/bridgesupport に BridgeSupport のコードが含まれいることを確認した。

だけれども、svk pull で変更をとってくることができない。ルートがミラーされてるディレクトりじゃないからかと考えて、もうひとつビューを作成。

 % svk propget svk:view:src-merged //local/rubycocoa
 &:/local/rubycocoa
 -*
 . src
 misc/bridgesupport //local/bridgesupport

これもだめ。単一のディレクトリを指してもダメだったので、現状では pull 自体が効かない感じ。merge はできるけど、sync が行われない。

結局、それぞれリポジトリをチェックアウトしてシンボリックリンクをはるという対処が今のところよさそう。多くの状況では、svn:externals により取り込みしたコードはいじらないのだからそれで十分か。

|

2007.05.10

黒パネルフレームワーク×2

Cocoaライブラリの調査。黒い半透明なパネルを提供する2つのフレームワーク、iLifeControlsHMBlkAppKitについて調べてみた。現実逃避。

コードの中身より、使い方・どんなコントロールを提供しているのかを中心に。

両方ともヘッダファイルをInterface Builderにドラッグしてカスタムクラスを指定するのだけれど、全部のクラスをまとめて追加するにはやっぱり全ヘッダファイルをドラッグするしかないのだろうか。HMBlkAppKitはまとめたヘッダファイルがあるのだけれど、Interface Builderはimportを解釈しないからなあ。

|

2007.05.06

WiiRemoteFramework を MacPortsWiki-JP に登録

devel/wiiremote として WiiRemoteFrameworkMacPortsWiki-JPに登録した。DawiinRemote は抜きでフレームワークのみ。

PortGroup xcode のおかげでらくちん。

|

2007.05.03

Cocoa のオブジェクト間の関連、NSNotificationCenter を使ってはいけないケースほか

NetNewsWire の作者、 Brent Simmons のinessential.com の Thoughts about large Cocoa projects というエントリに注目。彼(なの?)の経験に照らして、Cocoa プログラミングの注意点を挙げている。

  • 通知(notification)はコードを追いづらくなるよ
  • Key-Value Observing は環境設定に限定すべし
  • バインディングは簡単なときに。複雑になったらデータソース/デリゲートに
  • #pragma mark を使おう
  • プロジェクトのソースは階層化しない

などなど。

このエントリ自体も興味深いのだれけれど、ここから派生していろいろなノウハウが飛び交っている。(誰か整理プリーズ!)

なかでも In Defense of Observers がオブジェクトの関連という観点に焦点を当てた話を展開していて面白い。NSNotificationCenter と delegate を対比して、NSNotificationCenter は「Observer パターンではないのだ!」とした上で、 Observer パターンとしての delegate の解説をしている。

自分も昔のコードを振り返ってみると、本来は通知を使うべきではないところに通知を適用してしまって、あとで直しづらいものができあがったような記憶がある。delegate ってフレームワークならともかく、アプリケーション内で閉じているときにオブジェクトを delegate のためにもうひとつ用意しなければならないってことに抵抗あるのだよね。

他の人のコードになるけれど、最近 XmlToolBar のコードを見ていて「あれっ?」と思うところがあったのだ。XmlToolbar ではツールバー上のボタンを押すと通知が発行される。「これってばふつー firstResponder へのアクションでしょ!」と言いたくなってしまう。ツールバーの操作対象として期待されるのって

  • アプリケーション
  • アクティブウィンドウ
  • アクティブウィンドウ上の選択オブジェクト

くらいで、これなら Target-Action で記述されるべきものだと思うのだ。

|

2007.05.02

Mac で使えるコードを収集 Code Beach

ソースコード検索としては KodersGoogle Code Search なんかがあるけれども

  • Mac OS X 限定
  • 商用利用を認めること

という独特なポリシーで開始されたのが Code Beach。アプリケーション/フレームワーク全体よりも、クラス/メソッドレベルのコード片を集めることを目的としている。単純な Wiki でも目的は果たせるものの、議論が返ってじゃまになってしまうということが CocoaDev なんかでもあるので、価値のあるアプローチなんじゃないかと期待。

現状のとこ(自動収集ではなく)登録制のためか、まだエントリは多くはない。とりあえず自分の TODO リストの 3ヶ月後に「Code Beachチェック」を入れといてみた。

|

2007.05.01

EditCast 1.0 リリース

Cocoaのリハビリがてらに EditCast 1.0 をリリース しました。WebKitベースのブラウザ上で TEXTAREA をユーザが指定したテキストエディタで編集できるようにする SIMBL プラグインです。

2004年10月の Cocoa 勉強会の発表で実現できそうな予感がして、2004年の12月にはほとんどできあがりだったにもかかわらず、ようやくそれらしいリリース。正直なとこ、あんまり使っていません…

日本語化、環境設定ツールをバンドル内に入れたことと、アイコンクリックでエディタが起動するようになったのが大きな変更点。あとはコード整理したくらいになります。

今後実現するかもしれない機能

  • エンコーディング指定のインターフェイス(defaults コマンドで ECTEditorStringEncoding キーに NSStringEncoding の値を指定すれば、現在でも変更は可能です)
  • エディタアイコンを半透明に(背後の文字が読めない)
  • アイコンから環境設定ができるように(option+クリックなどで)

エディタの設定変更直後は、アイコンが変更されません。実装は難しくはありませんが、たいしたことない目的に Observer のオブジェクトを生成するのもなんだかなあと思ったので。

|

« 2007年4月 | トップページ | 2007年6月 »