Ruby で Objective-C 形式のメソッド名
| 固定リンク
| 固定リンク
5/12(土)に行われる、Cocoa勉強会のお知らせ。見学の申し込みは勉強会のメールフォームからどうぞ。
今回は、Mac で Wiiリモコン が使える DarwiinRemote/WiiRemoteFramework の開発者の Hiroaki さんが、ゲストスピーカー!
個人的には、前回の勉強会で Wiiリモコンや パソリ といったガジェットがアツイんじゃないか、という印象を強く受けたので、すげー楽しみ。こないだ両方とも買っちゃった(封は開けてない)しな。
だけどまだ、その日は行けるかどうかがわからない…なんとか行けそう。
Cocoa 勉強会は、MacOS Xのアプリケーションフレームワーク Cocoa についてあれやこれやする集まりです。当日は発表とその質疑応答、ツッコミや関係ない雑談で構成されます。
| 固定リンク
SandTrip のバグ修正版 0.9.4 をリリースしました。バグ報告してくれた konnさん、ありがとうございます。
以下のバグを修正しました。
NSTask に perl とかそのまま渡しても、そりゃ動かないでしょう!自分でもなんだかわからん。さほど書いてた時期のかわらない EditCast では、ちゃんと /bin/sh -c 経由にしてるのになんでだろう?
ObjcUnit がダウンロードできなくて、手元のディスクを発掘していたので、リリースしてからテストコードを書くというありさま。
ちょっといじる気持ちがでてきたので、次のバージョンでは
あたりが実現できる予定。
| 固定リンク
lftp のミラー機能はお手軽で、ディレクトリを再帰してたどり、指定した階層がまるまるコピーされる。スクリプト化して処理するのにも便利。でも、バージョン管理しているウェブサイトなんかを転送するときに CVS やら .svn などのディレクトリができてしまうのはイマイチ。
で、久しぶりに man を見ていたら スラッシュ - "/" 付きで指定すればディレクトリと解釈されるって書いてあることに気づく。
たとえば、.svn や CVS ディレクトリを無視して、html ファイル群をアップロードするならこんな感じ。
mirror -R -X .svn/ -X CVS/ -I *.html -I *.css -I *.png
知らなかったので、svk 経由で .svn ができないようになどしていたけれど、そんなことしなくても大丈夫なのだ。man じゅーよう。
| 固定リンク
% 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 名 + バージョンになる。
| 固定リンク
UKKQueue の動作を確認していたとき(Cocoa 勉強会での発表)にうすうす気づいてはいたのだけれど、Cocoa と Carbon ではファイル保存の挙動が異なる。それについて、Carbon/Cocoa differences で説明されている。
としたときに、Cocoa (TextEdit) では元の文書は名称変更されたままで、最初のファイル名で新しくファイルが作成される。Carbon(Photoshop) では名称が変更されたことが通知されたとのこと。
これは実際に Cocoa と Carbon でドキュメントファイルの扱いに違いがあるためで、cocoabuilder を "FSREF rename" あたりで検索するといろいろ議論が見つかったりする。
ユーザからすると、移動しても影響がないのが良いのは確かだけれど、少なくとも Cocoa/ NSDocument の振る舞いはずっとパスに依存した状態になっている。ドキュメントファイルのバンドルパッケージのことを考えると、解決が難しいのはわかるけれどどうにかうまい解決方法はないものだろうか。
| 固定リンク
どこで見かけたのか忘れてしまったのだけれど、OmniGroup が Omni Software Update Statistcs というユーザの統計情報を公開している。OmniGroup のソフトウェアのアップデート確認機能では、同意したユーザの環境情報を集計していて、その結果を外部にも公開しているのだ。
たとえば OmniGraffle なら「環境設定...」>「アップデート」で送信内容と、送信の可否について見ることができる。
なんとなく眺めていても、なかなか興味深い。個人的な感覚よりも新しい OS、ハードウェアの導入が進んでいるような気がする。10.3 (Panther) なんてまだまだ現役だと思っていたし、PPC -> intel の 2006 年の勢力図の移りかわりは劇的と言ってもよいくらい。
理由を想像してみよう。
といったところだろうか。検証する気はぜんぜんないけれど。
以前 Sparkle について調べているときに、SparklePlus というユーザ情報を収集する拡張もあったことを思い出した。そのときはソフトウェアのこういった振る舞いに否定的な感想を持ったのだけれど、こうやって集計結果を見せられて、自分の感覚と少なからずギャップのあることがわかると、確かに価値のある情報なのかもなあと思い直してしまったりする。
| 固定リンク
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" が変数の代入だということくらい意識しておけば、おおむね雰囲気で読める。
Portfile に PortGroup の設定を書くこと。
PortGroup ruby 1.0
次のたった2つだ(v1.4.0)。
前者は Config::CONFIG の値を取り出すもの、後者はインストール手順を簡易設定するためのものだ。意外と少なくて拍子抜け。
手続き ruby.setup の定義を見てみよう。
# ruby group setup procedure
proc ruby.setup {module vers {type "install.rb"} {docs {}} {source "custom"}}
すると、ruby.setup の引数は
ということになる。省略値のない module, vers は必須だ。
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 はバージョンだ。それ以上の説明はいらないよね。
type はインストール方式を指定する。これにより、extract/config/build などの設定をほとんど省略することができる。
指定できる値は次のいずれか(念押すけど v1.4.0)。
docs は ${prefix}/share/doc/${portname}/ にインストールするドキュメント類を指定する。どのファイルをインストールすればよいか悩んだら、README だけでもよいと思う。
source はアーカイブの取得方法を指定する。指定できる値は次のいずれか。
上記以外を指定したいときは、通常の Portfile と同様に master_sites で指定すればよい。
MacPorts によりインストールされた ruby についての情報。
インストール動作の設定として、次の変数が利用できる。
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 がじゃんじゃん書ける。みんなよろしく。
| 固定リンク
思い出した、Finder の「情報を見る」でいいんじゃなかろか。昔からあるんだし。ずいぶん前の Cocoa 勉強会の発表を参考に挙げておく、「Cocoaアプリのプラグイン作法」。
System Overview にすら言及があるのに、このアプリケーションバンドル配置に関しての OS 側のサポートってば全然ないよな。NSBundle も知らんぷりだし。
| 固定リンク
Rabbit 0.5.1 がリリースされたので、MacPorts も更新しました。詳しくは [rabbit-shockers:264] 参照のこと。
いいかげんバイナリパッケージも更新しようかなあと思ってみた。たぶん今月中には出します。(intel のみ)
| 固定リンク
なんかいろいろチカラ尽きてて遅くなってしまったけれど、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 の落日がせつなかったり。
次はもっと良い発表を!
| 固定リンク
最近のコメント