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

2006.12.31

「Cocoa Life Vol.3」発売のお知らせ

宣伝ね。今日、12/31 に Cocoa 勉強会の会誌「Cocoa Life Vol.3」が発売です。(通販は明日から)

今回は関西組からの執筆者も増えて、内容としては今まででいちばん実戦的(実践でなく)なものになっていると思います。ピンポイントに当たればかなり役に立つかと。

簡単に内容を紹介します(注:本誌はまだ入手してないので、校正段階の原稿から)。

Cocoa アプリのスクリプト対応

Cocoa アプリで独自コマンドを実装する手順についての解説。サンプルは対応前/対応後となっているので、それを比較することもできます。

ログイン項目ハック

システム環境設定の「ログイン項目」(ユーザログイン時に自動開始するアプリを設定)の機能を自前で実装する話。この機能は LoginWindow によって実現されているので、そのへんをいじることになります。

最近調べてて知ったのだけれど、AppleEvent により登録することもできます

HID Device Interface 入門

I/O Kit を利用した、ユーザ入力インターフェイス装置の開発について。市販の(Macに対応してない)ジョイスティックの入力を扱うサンプルを通して開発されています。

緊急モーションセンサの秘密

2005年ごろからノート型の機種に搭載されている緊急モーションセンサ(SMS)。この SMS を自分のアプリでも利用しちゃおうという話。たたくと仮想デスクトップが変更されるとか、ややネタ系のツールで利用されているヤツね。

この記事とどっちが先だったのか忘れましたが、執筆者の温井さんが SMSUTILS という SMS へのインターフェイスを提供するライブラリを公開しています。

Automator を拡張する

コマンドラインツールを Automator に対応させる話。Automator のアクションの開発手順について説明されています。

著者の新居さんは Set Password to PDFという、PDF ファイルにパスワードを設定するツールを公開しています。このツールは、Automator アクションとしても利用することができます。

Cocoa アプリのタブレット対応

NSView では、タブレットを意識したメソッドがいくつか定義されています。それぞれの機能をお絵描きアプリのサンプルを通して説明します。

Growl の使い方

通知インターフェイスアプリとしてスタンダードにもなりつつある Growl について。Growl を利用した開発には、

  • 新規の通知インターフェイスを開発する
  • アプリケーションの通知に Growl を利用する

の2つがありますが、その両方について解説されています。

インデックスカラー画像を編集する

MacOS Xになってから「画像はフルカラーでしょ」みたいな空気もあるけれど、ゲーム開発現場なんかではまだまだ現役といえるインデックスカラー画像。Cocoa では Classic OS/Carbon と比べて、インデックスカラー画像の扱いが弱いので、対応するクラス(NSImage のサブクラス)をつくるという話。

30歳から始めるプログラミング

oomori.com の人として有名な(?)大森さんによるプログラミング入門。プログラムを理解する手法としての「サンプル削り」がおもしろい。

WWDCのススメ

Apple 関係の開発の最大のイベント WWDC のガイド。出発前の注意からおみやげの買い方まで、経験者ならではの情報が紹介されています。

(以上)

|

2006.12.23

MacPorts で evolution-data-server が原因で gnome のインストールに失敗するのをどうにかする

MacPorts では、libiconv を最初にインストールしとけよ!というお話。

最近 Rabbit を使っていないのは Keynote の修業ってのもあるんだけど、MacBook の ruby-gnome 環境が構築できなかったからでもあったりする。(PowerBook はだいじょうぶ)インストール中に evolution-data-server が libiconv のシンボル衝突でこけるっていう macports ticket#10940 と同じ現象にはまっていた。

依存プログラムの中に、/usr/lib/libiconv と /opt/local/lib/libiconv にリンクしているものがあって、evolution-data-server までくるとそいつらが矛盾してしまうようだ。じゃ、犯人探しだ。

 % for lib in `find /opt/local/lib -name \*.dylib -type f`; do otool -L ${lib}; done

この出力結果で /usr/lib/libiconv にリンクしているやつを port deps でたどって、起点になっているものを探す(かなり地味な作業。自動化できると思うけどそれもおっくう)。で、自分の環境では、以下の2つが原因であることがわかった。

  • libbonobo
  • popt

で、こいつらを構築しなおして、依存プログラムも再コンパイルすれば ok。なはずなのだけど、popt が以前としてアウト。仕方ないので、port edit で popt の Portfile に以下の 1行を追加。

 configure.env   LDFLAGS="-L${prefix}/lib" CFLAGS="-I${prefix}/include"

で、あとは port -f uninstall で /usr/lib/libiconv にリンクしているものを削除して、evolution-data-server を port install で今度こそ完了。と思ったら、今度は #9162 の後半にある _POA_ のシンボルが衝突。うへえ。

(2007.02.04 追記)1.8.3 の Portfile でインストールできるようになったもよう。

|

2006.12.21

Ruby のメソッド引数の初期値は実行時に評価される

こないだ書いたようにlib/resolv.rb の作業をしていたのだけど、そのとき気づいたのが、Ruby のメソッド引数の初期値は実行時に評価されるということ。

今までなんとなく def の実行時(スクリプトの読み込み時)に評価されると思い込んでいたよ。C 側で実装するときのことを思い出してみれば当たり前なのだけど、なぜ気づかなかったのだろう?

いくつか例を

 def sender(msg, data, queue, host=@host, port=@port)

インスタンス変数を初期値に

 def initialize(id = (@@identifier += 1) & 0xffff)

クラス変数に1加算して、4バイトに。最初見たときナニゴトかと思った。式が書けるのだから、演算したっていいわけだ。

で、「他にはどんなのがあるだろう?」と Google Code Searchで探してみたら、「これはうまいなあ」というのを見つけた。net/ftp.rb ね。

 def put(localfile, remotefile = File.basename(localfile),
         blocksize = DEFAULT_BLOCKSIZE, &block)

1番目の localfile が先に評価されるから、省略時にその値を利用して File.basename で初期値を設定できる。勉強になるなあ。

|

RubyCocoa のメソッドを irb で補完する

WIN32OLEのメソッドをirbで補完するを RubyCocoa に移植(ってまんまパクリ)してみた。

 require 'osx/cocoa'
 module OSX
   class ObjcID
     alias :_prev_osx_methods :methods
     def methods(flag = true)
       @osx_methods ||= objc_methods.map {|m| m.gsub(/([^_]):/, '\1_')}
       @osx_methods | _prev_osx_methods(flag)
     end
 
     class <<self
       alias :_prev_osx_methods :methods
       def methods(flag = true)
         @osx_methods ||= objc_methods.map {|m| m.gsub(/([^_]):/, '\1_')}
         @osx_methods | _prev_osx_methods(flag)
       end
     end
   end
 end

動かすとこんな感じ。

 % irb -r osx/cocoa
 irb(main):001:0> OSX::NSURL.URL[TAB][TAB]
 OSX::NSURL.URLFromPasteboard_
 OSX::NSURL.URLWithString_
 OSX::NSURL.URLWithString_relativeToURL_
 irb(main):001:0> OSX::NSURL.URL

require 'osx/cocoa' はそんなに軽い処理じゃないので、常用はオススメしかねる。

|

2006.12.15

Leopard Tech Talks

ADC News #473 で告知されたときは北米だけだったのだけど、日本でも東京と大阪で開催されるとのこと。スケジュールを見ると、北米より日本のほうが項目少ないのは残念だけど仕方ないか。

開催日当日は本人確認のためお名刺をご持参ください。 お持ちになられていない場合は免許証、社員証等ご本人の確認出来る物をご持参し受付にてご呈示ください。

仕事の持っていっても仕方ないから、Cocoa 用の名刺でもつくるか。つーか、名刺に本人確認の能力はないと思うのだが。

|

続・プロパティのはなし

HMDT の mkino さんからも反応アリ。いろいろ前提を省略して書いてしまったところがフォローされている。ありがとうございます。

いちおう自分でも補足。まずは、こないだの Cocoa 勉強会のスライドを 公開しとく (PDF 568KB) ので、「プロパティってなにさ?」という人は見てください。これは、Clues to Objective-C 2.0 の内容をてきとーに要約したもので、5 - 11 ページがプロパティの話になっている。

プロパティには(GCC の testsuite からわかる範囲で)大別して2つの機能がある。

  • プロパティを定義する @property ディレクティブ
  • "." によるアクセサの簡易表記

後者の表記方法についてが、今回話題になったこと。

発表したときにも話したけれど、自分の感想はこんなところ。

  • "." アクセスちょー便利そう。
  • むしろ遅すぎたくらいだよ!10.3 の Cocoa Bindings、10.4 の Core Data といった タイミングで導入されててもおかしくなかった。

と、歓迎ムード満載だったところで、「Smalltalk 的にどうなのよ」という視点がとてもおもしろいなと思ったので紹介しました。

|

2006.12.12

Objective-C 2.0 のプロパティてばダメなんじゃねーの?

と言っている人がいますよと。

Theocacao で、新しい Cocoa サイト Cocoa Blogs の開設が告知されていたCocoa Dev Central の "Cocoa + Mac Blogs" のコーナーが拡張されたって感じかな。RSS なり Atom で一発で全部読めたらよいのに。

で、まだぜんぜん読んでいないのだけれど、タイトルが目をひいた "Does Objective-C Really Need Properties?" について少し書いてみよう。これは、「Objective-C 2.0 で導入される(らしい)プロパティてばどうなのさ?」というちょっと煽り気味の内容だ。キモの部分のみ抜き出すと、

Objective-C の Smalltalk のルーツを失いつつあるよな。 なんで [object property] という形式じゃなくて object.property なんだ?

といったところ。その発想はなかった。たしかに "." での表記は Objective-C 的にはメッセージじゃないものな。

自分としては setValue:forKey: や valueForKey: を書くのはかったるいので "." での表記は歓迎。キー・パスは Smalltalk 形式では、どう書くのが「らしい」のだろう?

(2006/12/13 追記)

トーフサロン でこの件に関して議論されています。Tweak では近いモノがあるのか、ふむふむ。

(2006/12/22 追記)

HMDT の 12/15 で、この記事への言及とプロパティについてのフォローがされています。

自分もフォローする内容を書きました

|

2006.12.11

るりま参戦

Rubyリファレンスマニュアル刷新計画 に参加することに。

  • Ruby のコミュニティにも参加したいと思っていた
  • 青木日記の るりマ! / 作業方法 の作業手順がなんだかおもしろそう
  • 現在の作業(第2段階)ならとにかくやればできそう

とりあえず BitClust の Portfile を書くところからはじめてみたり。

 # $Id: $
 PortSystem		1.0
 PortGroup		ruby 1.0
 
 ruby.setup		bitclust 0.0.846 setup.rb {README}
 revision		0
 maintainers		kimuraw
 description		BitClust is the Next-Generation Ruby reference manual interface.
 
 fetch.type	svn
 svn.tag		846
 svn.url		http://i.loveruby.net/svn/rubydoc/bitclust/trunk bitclust
 worksrcdir	bitclust
 platforms		darwin
 
 homepage        http://doc.loveruby.net/
 master_sites    http://i.loveruby.net/svn/rubydoc/bitclust/trunk
 post-build {
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bc-classes.rb
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bc-convert.rb
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bc-list.rb
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bc-methods.rb
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bc-preproc.rb
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bc-rdoc.rb
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bc-tohtml.rb
  reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/bitclust.rb
 }

手始めに lib/resolv.rb を選んでみたのだけど、内部クラスがたくさんありすぎ!

 % rdefs lib/resolv.rb | wc -l
      235

|

2006.12.10

RubyCocoa-0.5.0.1

ふじもとさんが直してくれた VERSION ファイルのバグを反映し忘れ。svnversion コマンドがインストールされていない環境で、ruby install.rb config が失敗するという問題がありました。(rubycocoa-talkでの指摘

この問題を修正した ソースコードアーカイブを 0.5.0.1 としてリリースしました。マジごめんなさい。

|

2006.12.09

ack の Portfile を作成

ソースコード検索コマンド ack を使ってみたいと思ったのだけれど、MacPorts 公式になかったので作成して DarwinPortsWikiJP に 貼っておいた

 % ack --help
 Usage: ack [OPTION]... PATTERN [FILES]
   (省略)
 File inclusion/exclusion:
     --[no]cc        .c and .h
     --[no]cpp       .cpp, .m and .h

.m は cpp ですか。

|

RubyCocoa プログラミングでバグを減らすアイディア

MiniKidsGames の Tat さんとのコメントのやりとりで思いついたのだけれど、「nil が来ないことを期待されているところで nil を渡されてしまうことによるクラッシュ」を減らすためのちょっとしたアイディアが浮かんだ。

通常、Cocoa のメソッドでパラメータに nil を渡してはいけないものに nil 渡すと NSInvalidArgumentError が発生する。なので、それでわかるのだけれど、ここでハマリがちなのが、Array -> NSArray や Hash -> NSDictionary への自動変換だ。ちょっと試してみると

 % irb -r osx/cocoa
 irb> ary = [1, nil, 3]
 => [1, nil, 3]
 irb> nsary = OSX::NSArray.arrayWithArray(ary)
 2006-12-09 07:43:40.565 irb[13501] *** Uncaught exception: <NSInvalidArgumentExc
 eption> *** -[NSCFArray addObject:]: attempt to insert nil
 zsh: trace trap  irb -r osx/cocoa

とまあこうなったりする。これはどこが問題かわかりにくいので、変換時 (framework/src/objc/ocdata_conv.m の中の処理) で明示的に例外を出すようにしたほうがいいんじゃないかと思うのだ。これで、配列にいれた要素が予期せず nil になっているときは Cocoa 側には渡せないってことになる。

悩むのは NSDictionary ではキー、値とも nil は禁止なのだけど、値には NSNull が利用できるってところだな。nil のとき、これを NSNull で置き換えてよいかなあ。

(以下 2006.12.09 追記)

[rubycocoa-devel:481] で提案とパッチ。個人的な見解としては例外にすること自体は全然問題はなくって、あとは例外のクラスが ArgumentError でいいかどうかってあたりが議論したいとこ。この例外が発生するのは、Ruby から Objective-C 側に渡すときだけだから ArgumentError であるってのはそんなにおかしくはないと思うのだけれど、もっと適したものがあるかもしれない。

今回の実装では、ハッシュの値は NSNull に変換するようにした。これでなにか問題になるようなら、-w や -d でメッセージを冗長にしたとき NSNull への変換に関するメッセージを出力するようにすればいいかなと考えている。

|

2006.12.08

RubyCocoa 0.5.0 リリース!

しました[rubycocoa:378]

|

2006.12.07

SourceForge.net の Subversion リポジトリの URL が変更された

rubycocoa-devel にも投げたけれど、SourceForge.net の Subversion サービスの URL が変更された。SF.net で開発している人はご注意を。

変更されたといっても、以前の URL でもアクセスできるし、コミットなどの更新操作も問題なくできる。RubyCocoa のリリースのために tags に trunk をコピーしようとしたら、エラーになっるので Site Status を見たらわかった。

svk の参照先を変更。

 % svk mirror --relocate //mirror/rubycocoa_sf/trunk \
     https://rubycocoa.svn.sourceforge.net/svnroot/rubycocoa/trunk

それにしても

SVN is a complex tool.

はほとんど捨てゼリフだな。

|

0.5.0 coming soon?

10月に一度見送りされた 0.5.0 のリリースを準備ちゅう。[rubycocoa-devel:470] に書いたとおり、配布ファイルは用意しました。とくに問題がなければ(もしくはあっても無視可能なら)明日あたりにリリースします。

大きな変更点としては

  • ライセンスの変更
  • ruby-1.8, MacOSX 10.4 (Tiger) 以降に対応

といった、非機能強化の部分があります。もちろん、要求バージョンの変更は機能強化の結果ではあるのですけれど。個人的な見解としてこのバージョンは来るべき 1.0 までのツナギで、かなり寿命の短いリリースとなる予定です。

VERSION の件は確認が足りませんでした、ゴメンナサイ>ふじもとさん。

|

2006.12.04

RubyCocoa 今日のコミット(2006.12.05)

  • OSX モジュールを include したとき、const_missing が複数回定義されてしまう(あまり影響のない)問題を修正

-w オプションをつけて試していたら見つけた。

MiniKidsGames で 「NSShadow や NSFont が未定義だぜ」と、RubyCocoa 0.5.0-preview7 では言われてしまう。これを調べていたのだ。この原因は、include OSX をトップレベル (Object) でしているため、ShadowMaker などのモジュール内では OSX.const_missing が呼ばれないから。これに対応するかどうかは悩むなあ。

|

2006.12.03

RubyCocoa 製の Game Framework for RubyCocoa と MiniKidsGames

[rubycocoa-devel:465] で、「MiniKidsGames というのをつくったよ」という投稿がされた。ドキュメントもいっぱいあって、こりゃ読まなくちゃ!と思うのだ。

なんだけど、どうもウチの環境では動かない。0.5.0-preview7 にして、定数探索のところをちょっといじると、タイトルまでは出るのだけど。要調査。

|

最近の Cocoa 事情? from Theocacao

Cocoa Dev Central の中の人 Scott Stevenson の最近の記事 "Odds-And-Ends for Dec 2" がおもしろい。

Cocoa のサードパーティライブラリウォッチャーとしては、特に気になるのはこのあたり。

  • XmlToolBar - ふつうにつくるとちょっと手間のかかるツールバーを XML ファイルから生成できる。
  • ReflectionView - CoverFlow みたいなビューが簡単につくれる。

他には今まで Cocoa 勉強会で見かけたネタがちらほら。

  • eBook: Xcode animations - Core Graphics - CoreGraphics のプライベート関数を利用して、キューブが回転するようなウィンドウ(Quicksilver のアップデート時にでるアレ)をつくるって話。勉強回では、第18回 にあった「CoreGraphicsのプライベート関数」が似たような話。
  • How to use Mach clocks - ミリ秒じゃ幅が大きすぎるときに、もっと高精度の時間として Mach clock を使うという話。勉強回では、第10回 にあった「高分解能実時間」が同じ話だったかも。
  • Using the ImageIO Framework with Mac OS X 10.4 Tiger - Apple からようやく ImageIO framework のドキュメントが。勉強回では、第17回 にあった「RAW画像の展開とExifの取得」で ImageIO の使いかたがでてきた。

つっこんで調べるなら、やっぱり XmlToolbar だな。また課題が増えた。

|

第21回 Cocoa 勉強会に行ってきた

今年最後の勉強会。いつもより発表の件数が少なかったのだけれど、かえって質疑応答でかなりつっこんだ話ができた。とりあえず覚えてる範囲で。

「Clues to Objective-C 2.0」(木村)

いろいろあって、自分の発表はこれに。8月にでた "Clues to Objective-C 2.0" を解説。読んでもよくわからなかったあたりを発表後に他の人に教えてもらったり。

「IBで複雑なビューを設計する時のテクニック。」

Interface Builder 上でスーパークラスの outlet を定義することにより、NSBox や NSTabViewItem のビューをデザインしやすくできるって話。今回いちばんみんなに反響があったと思う。やっぱり Interface Builder てばスゲーよな。

途中までデザインしたものも、パレットに追加できるってのは知らなかった。

「HIG:ソフトウエアアップデートの方法」

Apple Human Interface Guidelines の Updating Installed Applications の解説と、このガイドラインに沿ったサンプルアプリ。こういうのまでガイドラインあるんだなあ。知らなかった。

ちょうど来年の勉強会あたりで、ソフトウェアアップデートライブラリ sparkle を紹介しようと思ってたので参考になる。

「CocoaとDock」

Cocoa アプリにおける Dock のあれこれ。Dock のメニューやアイコンをカスタマイズする話。こういうのって知りたいときに探してみると、はまるキーワードが思いつかないことが多いので、まとまった情報があるのは助かる。

|

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