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

2007.04.27

Ruby で Objective-C 形式のメソッド名

セミコロンを含むメソッド名が定義できるようになるパッチ[ruby-dev:30735]。すげえ。

[ruby-dev:30737]

 [x copy: y from: z]

までいくと、もはや Ruby のコードに見えないよ。

|

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

5/12(土)に行われる、Cocoa勉強会のお知らせ。見学の申し込みは勉強会のメールフォームからどうぞ。

今回は、Mac で Wiiリモコン が使える DarwiinRemote/WiiRemoteFramework の開発者の Hiroaki さんが、ゲストスピーカー!

概要

  • 日時:2007年5月12日(土)13:00〜(終了は17:30くらい)
  • 会場:東京 初台 オペラシティ アップルトレーニングルーム
  • 予定されている発表(随時更新:2007.05.06 現在)
    • 「DarwiinRemote」
    • 「プラグイン(Cocoaバンドル)対応のアプリの作り方」
    • 「カスタムシートとModality」
    • 「CocoaアプリのAppleScript対応(その2)」
    • 「PaSoRi」
    • 「RubyCocoaでの非標準フレームワークの使い方」
    • 「Cocoaのコーディングスタイル」 kimuraw

個人的には、前回の勉強会で Wiiリモコンや パソリ といったガジェットがアツイんじゃないか、という印象を強く受けたので、すげー楽しみ。こないだ両方とも買っちゃった(封は開けてない)しな。

だけどまだ、その日は行けるかどうかがわからない…なんとか行けそう。

Cocoa勉強会について

Cocoa 勉強会は、MacOS Xのアプリケーションフレームワーク Cocoa についてあれやこれやする集まりです。当日は発表とその質疑応答、ツッコミや関係ない雑談で構成されます。

|

2007.04.25

SandTrip 0.9.4 リリース

SandTrip のバグ修正版 0.9.4 をリリースしました。バグ報告してくれた konnさん、ありがとうございます。

以下のバグを修正しました。

  • 拡張子に対応する実行プログラムがフルパスで設定されていないとき、CGI が実行できない

NSTask に perl とかそのまま渡しても、そりゃ動かないでしょう!自分でもなんだかわからん。さほど書いてた時期のかわらない EditCast では、ちゃんと /bin/sh -c 経由にしてるのになんでだろう?

ObjcUnit がダウンロードできなくて、手元のディスクを発掘していたので、リリースしてからテストコードを書くというありさま。

ちょっといじる気持ちがでてきたので、次のバージョンでは

  • PATH_INFO の実装
  • 設定インターフェイスをつける(さすがに .plist 編集はどうかと思う)

あたりが実現できる予定。

|

2007.04.23

lftp のミラーで .svn など特定のディレクトリを無視する

lftp のミラー機能はお手軽で、ディレクトリを再帰してたどり、指定した階層がまるまるコピーされる。スクリプト化して処理するのにも便利。でも、バージョン管理しているウェブサイトなんかを転送するときに CVS やら .svn などのディレクトリができてしまうのはイマイチ。

で、久しぶりに man を見ていたら スラッシュ - "/" 付きで指定すればディレクトリと解釈されるって書いてあることに気づく。

たとえば、.svn や CVS ディレクトリを無視して、html ファイル群をアップロードするならこんな感じ。

 mirror -R -X .svn/ -X CVS/ -I *.html -I *.css -I *.png

知らなかったので、svk 経由で .svn ができないようになどしていたけれど、そんなことしなくても大丈夫なのだ。man じゅーよう。

|

2007.04.16

MacPortsWiki-JP に inplace を登録

 % cat foo > foo

でファイルの内容がなくなってしまうわけだけど、意図としてこういう処理をしたいときってけっこうある。しかも対象が複数あると、しかたなく for をまわしたりする。

で、そんなとき便利なのが inplace(1) というコマンド。探しものをしていて、はてなの似たような質問 がひっかかった。

単純に使っても便利なのだけど、sed のように -e オプションで複数の処理を指定できるのがナイス。こっそり ruby で書かれていたりもする。

で、当然のようにローカルで Portfile を書いてインストール。ついでに MacPortsWiki-JP にも登録 しておいた。

手元の野良 ports は subversion で管理しているのだけれど、これからアップロード用のファイルをつくるには余計なものが入らないようになど、意外と気を使うことが多い。勢いでてきとうなシェルスクリプトをでっちあげ。とりあえず動く。

 #!/bin/sh
 #
 # make port 
 #
 
 svnroot=file:///Users/kimuraw/Library/svn-repos/dports/trunk
 targets=${*}
 workdir=`mktemp -d /tmp/portXXXX`
 
 if [ "x$*" == "x" ]; then
   echo "[usage] port-arch port1 port2 ..." 1>&2
   exit 1
 fi
 
 port_version=`port -q info --version ${1} `
 if [ "${port_version}" == "No port foo found." ]; then
   echo "error: port \"${1}\" not found" 1>&2
   exit 1
 fi
 archname=${1}-${port_version}
 
 for target in ${targets}
 do
   portinfo=`port -q info ${target} | head -1`
   echo ${portinfo}
   path=`echo ${portinfo} | cut -d\, -f2 | tr -d \  `
   tmp_target="${workdir}/${path}"
   mkdir -p `dirname ${tmp_target}`
   svn export "${svnroot}/${path}" "${tmp_target}" >/dev/null
 done
 
 tar cvjf ${archname}.tbz2 -C "${workdir}" .
 rm -rf "${workdir}" 2>/dev/null

先頭の svnroot の値を書きかえれば、他の環境でも動くはず。複数 port を指定もいちおう可能。できあがる .tbz2 ファイルの名前は引数の先頭の port 名 + バージョンになる。

|

2007.04.08

Carbon と Cocoa のファイル保存時の挙動のちがい

UKKQueue の動作を確認していたとき(Cocoa 勉強会での発表)にうすうす気づいてはいたのだけれど、Cocoa と Carbon ではファイル保存の挙動が異なる。それについて、Carbon/Cocoa differences で説明されている。

  1. 新規文書を作成し保存する
  2. その文書を変更する
  3. 文書を開いたまま、Finder でファイル名を変更する
  4. さらに文書を変更して保存する

としたときに、Cocoa (TextEdit) では元の文書は名称変更されたままで、最初のファイル名で新しくファイルが作成される。Carbon(Photoshop) では名称が変更されたことが通知されたとのこと。

これは実際に Cocoa と Carbon でドキュメントファイルの扱いに違いがあるためで、cocoabuilder を "FSREF rename" あたりで検索するといろいろ議論が見つかったりする。

ユーザからすると、移動しても影響がないのが良いのは確かだけれど、少なくとも Cocoa/ NSDocument の振る舞いはずっとパスに依存した状態になっている。ドキュメントファイルのバンドルパッケージのことを考えると、解決が難しいのはわかるけれどどうにかうまい解決方法はないものだろうか。

|

2007.04.06

Omni Software Update Statistcs で Mac 界の情勢をキャッチ

どこで見かけたのか忘れてしまったのだけれど、OmniGroup が Omni Software Update Statistcs というユーザの統計情報を公開している。OmniGroup のソフトウェアのアップデート確認機能では、同意したユーザの環境情報を集計していて、その結果を外部にも公開しているのだ。

たとえば OmniGraffle なら「環境設定...」>「アップデート」で送信内容と、送信の可否について見ることができる。

なんとなく眺めていても、なかなか興味深い。個人的な感覚よりも新しい OS、ハードウェアの導入が進んでいるような気がする。10.3 (Panther) なんてまだまだ現役だと思っていたし、PPC -> intel の 2006 年の勢力図の移りかわりは劇的と言ってもよいくらい。

理由を想像してみよう。

  • Omni のユーザには新しいもの好きが多い
  • 情報収集を始めたの自体が比較的最近(ウラとれず)
  • 全体の傾向としてもこのとおりで、自分の感覚がまちがい

といったところだろうか。検証する気はぜんぜんないけれど。

以前 Sparkle について調べているときに、SparklePlus というユーザ情報を収集する拡張もあったことを思い出した。そのときはソフトウェアのこういった振る舞いに否定的な感想を持ったのだけれど、こうやって集計結果を見せられて、自分の感覚と少なからずギャップのあることがわかると、確かに価値のある情報なのかもなあと思い直してしまったりする。

|

2007.04.05

MacPorts の Portfile における ruby 用の拡張

Portfile を書くときには、似たようなのを見つくろって真似することが多い。で、わからないことがあれば MacPortsWiki-JP の Portfile(7) を見ればよい。

でも Ruby のライブラリなんかの Portfile をつくろうとして適当な Portfile を見てみると、

 ruby.setup        uconv 0.4.12 extconf.rb {README README.ja}

などと、のっけから書いてある。ruby.setup なんて man のどこにもないよ!と思うものの、なんとなくフィーリングで書けてしまったりするわけだ。

さすがに知らないままなのもどうかと思ったので、ちょっと調べてみた。答えはすべてソース(port1.0/resources/group/ruby-1.0.tcl)にあるのだから。

"proc" が手続きの定義、"set" が変数の代入だということくらい意識しておけば、おおむね雰囲気で読める。

ruby-1.0.tcl を使うために必要なこと(2007.04.15 追加)

Portfile に PortGroup の設定を書くこと。

 PortGroup    ruby 1.0

ruby-1.0.tcl で定義される手続き

次のたった2つだ(v1.4.0)。

  • ruby.extract_config
  • ruby.setup

前者は Config::CONFIG の値を取り出すもの、後者はインストール手順を簡易設定するためのものだ。意外と少なくて拍子抜け。

ruby.setup のひみつ

手続き ruby.setup の定義を見てみよう。

 # ruby group setup procedure
 proc ruby.setup {module vers {type "install.rb"} {docs {}} {source "custom"}}

すると、ruby.setup の引数は

  • module
  • vers
  • type (省略値 install.rb)
  • docs (省略値 {})
  • source (省略値 "custom")

ということになる。省略値のない module, vers は必須だ。

module

module は対象のパッケージの名称だ。通常、ruby/ 以下にある port は rb-module という名称になる。対象のツール・アプリがたまたま ruby で書かれているだけで、port 名には "rb-" とはつけたくない、でも ruby.setup は利用したい、と考えたならば、答えは簡単だ。あとで name で port 名を上書きしてやればよい。

 ruby.setup   myapp 1.0
 name         myapp     # override "rb-myapp"

ruby.setup での指示は Portfile の内容に変換されているだけなので、このようにあとで変更することもできる。いくつかの設定を一括でしておいて、ルールに沿わないもの、複雑なものは別途コードを書けばよい。

vers

vers はバージョンだ。それ以上の説明はいらないよね。

type

type はインストール方式を指定する。これにより、extract/config/build などの設定をほとんど省略することができる。

指定できる値は次のいずれか(念押すけど v1.4.0)。

basic_install.rb
???
copy_install
ライブラリ専用の単純なコピー。 copy_install:lib とすると、展開した lib/ 以下のファイルが ruby のライブラリディレクトリにインストールされる。
install.rb
その名の通り
setup.rb
その名の通り
extconf.rb
その名の通り
gnu
いわゆる configure & make
gem
その名の通り
docs

docs は ${prefix}/share/doc/${portname}/ にインストールするドキュメント類を指定する。どのファイルをインストールすればよいか悩んだら、README だけでもよいと思う。

source

source はアーカイブの取得方法を指定する。指定できる値は次のいずれか。

rubyforge
"rubyforge:12345" のように rubyforge のアーカイブ番号を指定する。プロジェクト名が module と異なるときは "rubyforge:12345:myproj" のようにするか、ruby.project 変数で指定できる。
rubyforge_gem
rubyforge の gem を指定する。module とプロジェクト名が異なるときは ruby.project 変数で指定できる。
sourceforge
プロジェクト名が module と異なるときは "sourceforge:myproj" のようにするか、ruby.project 変数で指定できる。

上記以外を指定したいときは、通常の Portfile と同様に master_sites で指定すればよい。

設定される・利用できる変数

MacPorts によりインストールされた ruby についての情報。

  • ruby.bin
  • ruby.version
  • ruby.arch
  • ruby.lib
  • ruby.archlib

インストール動作の設定として、次の変数が利用できる。

ruby.module
ruby.setup に渡した module の値。
ruby.filename
アーカイブファイル名に利用。初期値は module の指定値。
ruby.project
rubyforge や sourceforge のプロジェクト名。初期値は module の指定値。
ruby.docs
ruby.setup に渡した docs の値。
ruby.srcdir
copy_install でのみ利用される、コピー対象のファイルの場所。

その他の豆知識

shebang を変更するには reinplace を利用するとよい。rb-rabbit だとこんな感じ。

 post-build {
     reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/rabbit
     reinplace "s|^#!.*ruby|#!${ruby.bin}|" \
         ${worksrcpath}/bin/rabbit-theme-manager
     reinplace "s|^#!.*ruby|#!${ruby.bin}|" ${worksrcpath}/bin/rabrick
 }

おわり

resources/group/ には ruby 以外の環境向けにも便利な機能が用意されているので、ちょっとのぞいてみるのもおもしろいかもしれない。xcode-1.0.tcl なんてのもあったりする。

さあ、これで ruby の Portfile がじゃんじゃん書ける。みんなよろしく。

|

2007.04.03

InputManager 後のプラグインインターフェイス

思い出した、Finder の「情報を見る」でいいんじゃなかろか。昔からあるんだし。ずいぶん前の Cocoa 勉強会の発表を参考に挙げておく、「Cocoaアプリのプラグイン作法」

System Overview にすら言及があるのに、このアプリケーションバンドル配置に関しての OS 側のサポートってば全然ないよな。NSBundle も知らんぷりだし。

|

2007.04.02

Rabbit 0.5.1 の MacPorts 更新

Rabbit 0.5.1 がリリースされたので、MacPorts も更新しました。詳しくは [rabbit-shockers:264] 参照のこと。

いいかげんバイナリパッケージも更新しようかなあと思ってみた。たぶん今月中には出します。(intel のみ)

|

2007.04.01

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

なんかいろいろチカラ尽きてて遅くなってしまったけれど、3/17の報告。

今アツイもの

今アツイのは、Wii リモコンと Quartz Composer だ! という結論。なぜか Wii リモコンを持ってきた人が数名(4人くらい?)。自作のセンサーバー代替の赤外線装置が2タイプ(USB、乾電池)あったり。

発表

Cocoa 考古学者の成田さんによる、OpenStep 日本語リファレンスの発掘など。時は流れたけれど、Cocoa の根幹部分や Interface Builder はあまり変わっていないので、まだまだ実用に耐える。内容もさることながらこういうことを実現してしまう熱さがカッコイイ。

木村の Sparkle の紹介。発表スライド SparkleSlide20070317.pdf (620kb)

ちゃーりーさんによる QuartzComposer デモみたいの。途中から、ミニ QC 講座が開催。「おもしろそうなんだけど、どこから手を付けたらいいかわからない」「パッチが多すぎてどれがなんだかわからない」という人も多いみたい。自分もそう。勉強のおすすめとして「Quartz Composerにどっぷり!」が紹介されていました。

ふじもとさんによる RubyCocoa 入門。スライドの表示文字をそのまま eval するてのはカッコイイな。ナイスアイディア。

大森さんによる、Cocoa で CGI をつくっちゃう話。CGI の仕組みから、オフスクリーンではどこまでできるか、分散オブジェクトによる AppKit の利用までと幅広めの話題。関西でやったのの改訂版。たまにはこっちも関西に行かないとなあと、やや無関係なことを思ったり。

三浦さんによる OgreKit を使ってみよう。Cocoa での正規表現ライブラリとしてほぼ独壇場といえる OgreKit の紹介。思っていたよりもずっと簡単につかえそうな印象。これは便利そうだなあ。なによりも読みかたが『おーがきっと』であることに会場がざわざわ。

新居さんによる Growl の Java での利用解説。内容よりも、Cocoa-Java の落日がせつなかったり。

反省

  • 発表では簡単さをアピールするつもりが上滑り。資料の翻訳に時間割きすぎた。
  • OmniDazzle で拡大すればいいやと、文字小さめのページもあったのだけど、メインウィンドウ(本体のディスプレイ)に表示された。

次はもっと良い発表を!

|

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