« 2008年5月 | トップページ | 2008年7月 »

2008.06.30

ackでPortfileを検索

他の人のPortfileを参考にしたいときに、port treeのディレクトリで`grep -r keyword --include Portfile .'とかするのも飽きてきたので、ackの検索ファイルにPortfileを追加してみた。PerlわからないけどMakefileを参考に雰囲気でね。(拡張子ならコードいじらなくても対処できそうなんだが)

これで

 % ack --port keyword

で検索できるよ。速いし、色がつくし、かいてき。

 --- Ack.pm        2008-04-14 01:27:51.000000000 +0900
 +++ /opt/local/lib/perl5/vendor_perl/5.8.8/App/Ack.pm        2008-06-29 23:53:48.000000000 +0900
 @@ -95,6 +95,7 @@
          perl        => [qw( pl pm pod t )],
          php         => [qw( php phpt php3 php4 php5 )],
          plone       => [qw( pt cpt metadata cpy py )],
 +        port        => q{Portfiles},
          python      => [qw( py )],
          ruby        => [qw( rb rhtml rjs rxml erb )],
          scheme      => [qw( scm )],
 @@ -447,6 +448,8 @@
  
      return ('make',TEXT) if $filename =~ m{[$dir_sep_chars]?Makefile$}io;
  
 +    return ('port',TEXT) if $filename =~ m{[$dir_sep_chars]?Portfile$}io;
 +
      # If there's an extension, look it up
      if ( $filename =~ m{\.([^\.$dir_sep_chars]+)$}o ) {
          my $ref = $types{lc $1};

|

2008.06.29

StarRubyのPortfile書いた

はやってるようなので、Rubyのゲーム制作ライブラリStarRubyのPortfileを書いて、MacPortsWiki-JPにPrivatePortfile/rb-starrubyとして登録。実行につかうrsdlも一緒にrb-rsdlを入れたので、

% sudo port install rb-starruby

で、ひととおりそろうはず。

Portfileのリポジトリは、野良Ports for MacPortsを使わせてもらいました。ありがとうです。

|

2008.06.27

RubyCocoa 今日のコミット - Ruby 1.8.7まつり

ああぁ、完全に油断していたよ。けっこう動作変わってるのだね。

あとでちゃんとhttp://svn.ruby-lang.org/repos/ruby/tags/v1_8_7/NEWSを読むこと>自分

  • GC中にrb_inspect()しているところで[BUG]を吐くので修正 (r2208)
  • Ruby 1.8.7で、Enumerable#countが導入されたことによりmethod_missingでNSArrayやNSDictionaryのcountメソッドが呼ばれなくなった上に無限ループになるのを修正(r2209
  • Ruby 1.8.7で、Array#slice!で範囲外のパラメータを与えたとき、例外とならずにnilを返すようになった。テストケースのみ修正。実装はまだ。(r2210

最後のはどうしようね。RUBY_VERSIONみて動作変えるのもキモチワルイけどしかたないか。

|

2008.06.26

リンク切れ直しました ideotype 人柱版 Portfile

RubyKaigi2日めに直していたのですが、告知忘れ。IdeoType Portfile 人柱版のtarballへのリンクが切れてたのを直しました。

|

2008.06.24

MacRubyとRubyCocoa

昨日はRubyCocoa Dinnerと称して、Laurent夫妻・中川さん・ふじもとさんとうどんすきに。企画してくれた中川さん、ありがとうございました。おいしかったです。

関心のある人がそれなりにいるようなので、ちゃんとしたところで話したほうが良いのだろうけど、とりあえずここで。今後の方針とかについて。

RubyCocoa - Objective-Cブリッジ for Ruby 1.8

わりと安定。最近コミットが少ないけれど、もちろん開発・メンテナンスは続きます。なんたってMac OS Xの一部ですから。今のとこRuby 1.9対応をするという予定はありません。

MacRuby - Ruby 1.9 実装 with Cocoa/Objective-C

まだまだ不安定。みんな使って、問題やリクエストがあればレポートお願いします。RubyCocoaからの移行パス、というか互換レイヤとしての"osx/rubycocoa.rb"というライブラリの開発がEloyを中心に進んでいます(MacRuby-Devel 参照)。RubyCocoaとMacRubyでのメソッド呼び出しの構文や、モジュール階層の差異を吸収してくれ(るはず)ます。

どちらとも、これからもよろしくお願いします。

|

2008.06.21

MacPortsのrubyを1.8.7-p22に更新

さっそく新バージョンがでてたので更新してコミット。CVEも出てるし早めがいいかなと。ついでにインストール前にmake testするようにした。

んじゃ、RubyKaigiに出発しますか。

(追記:6/21)1.8.7になったとき(引き継ぎの前)に、vendor-specificが効かなくなっていたもよう。夕方にコミットした、1.8.7-p22_2で修正したはずです。1.8.7使ってる人はupgradeを。まあ、portから入れたライブラリがsite_rubyに入ったってたいした問題はないと思いますが。

いつのまにか追加されていたmkmf.rbの--vendorオプションをどうするかはちょっと悩む。MacPorts的には、しばらくはvendor-specificだろうし。

|

2008.06.20

MacPortsのコミッタになった

http://trac.macports.org/wiki/MacPortsDevelopers

  • rb-cocoa (RubyCocoa)
  • rabbit 関係もろもろ

を公式Portとしてメンテしたいからコミット権ちょうだい、とメールしたら申請とおった。いろいろ準備中。

「もしかしてrubyのメンテナ引き継ぐつもりない?」とずいぶん遠慮がちに聞かれたので、okしてみた。いきなり責任重大だぜ。

|

「詳解 Objective-C 2.0」読書会をやるよ

前のエントリにも書いたけど改めて告知。まだやる(つもり)ってことしか決まってないけどね。参加者だい募集中ですよ。

http://qwik.jp/objc20-reading/FrontPage.html

しかしあらためて思うけれど、qwikWeb/qwik.jpはすげーよ。こんなに便利でよいのかしら。

|

2008.06.15

lcovの野良Portfile書いた

gcc+gcovによるカバレージ測定の結果を、見やすいHTMLに加工するツールlcovの野良Portfileを書いて、MacPortsWikiJPに登録した。現バージョンは1.6。使い方はWikiページのほうに簡単に書いたので、そちらを参照のこと。

インストール中でinstall(1)にないオプションが使われているので、port destroot時にGNU Core Utilities(port:coreutils)を要求するようにした。

どうもObjective-Cでメソッド呼び出しが複数行になるところの処理に問題があるっぽい。lcov実行中に

 Argument "function -[(Class) (a part of sel)" isn't numeric in numeric gt (>)

と出てくる。他にも空行や#pragma markが実行されてないことになってたり。.gcovではその行は"-"になってるので、lcov側の問題だと思う。これが解決したら公式にチケット投げるつもり。

最近gcovを使ってみているのだけど、今は使われてないメソッドの消し忘れが見つかったりしてなかなか良いな。

|

2008.06.14

SandTrip 1.0.1 リリース - Safari 3.1で正常に動作しないことがある問題に対応

WebKitなブラウザにローカルCGI機能を追加するSIMBLプラグイン、 SandTripのバージョン 1.0.1をリリースしました。

  • SafariでCGI出力結果が正常に表示されないことがある問題を修正

この対応の結果、Safari 3.xでの体感応答が遅くなったかもしれません。ていうか、きっと遅くなった。

Safariでの問題

Safari 3.1になってからだと思うけど、SandTripによるローカルCGIの出力結果がうまく表示されないことがある。データの一部だけが表示されていて、うしろが切れているように見える。とくに影舞の検索が重症。読書記録が調べらんないよ。

以下、試してみたこと。

  • iCab 4.1で実行->ok
  • SandTripのURI Schemeをデフォルトの"file"から"http"に変更してSafari 3.1で実行->ok
  • プログラムを変更し、全出力を読み込んでからブラウザに渡すようにしてSafari 3.1で実行-> ok

となった。つまり、

  • Safari 3.1で
  • URI Schemeがfileのとき
  • CGIの出力をバッファ読み込みの都度ブラウザに返す

とうまく動作しない、ということのようだ。NSURLProtocolClientの動作をスキームごとに制御してるんだろうな。まあ、fileスキームにNSHTTPURLResponse返すこっちが悪いっちゃそうなのかもしれないけどさ。

というわけで、Safari 3.x上で動作しているときはCGIの完了を待って、ぜんたいの出力を一括してブラウザに返すこと(0.9.7以前の動作)にした。でも体感でだいぶ遅いんだよな。2ちゃんねるブラウザrep2でのスレッド一覧表示や新着まとめ読みとか。

|

2008.06.13

Objective-C技術者は稼げる?

ときどきの雑記帖 i戦士篇経由で"The Unix Geek: Programming Salaries"。求人サイトで、プログラミング言語やAPIを条件として検索した報酬の平均をリストしている。

(個人的には)意外なことに、言語別ではObjective-Cが$82,000と上位となっている。コメント欄もそのことについてが多く、ObjCという語が飛び交ってる。Haskellが大変なことになってるけど、後日追記されたためかコメントではほとんど言及されてない。てか、言語だとObjective-Cが上位でAPIではCocoaが最下位なのがもうナンダカ。

毛色がちがうのはわかるけれど、この手の記事でもABAPとかPL/SQLとかの業務系のも挙げてみてほしいなあ。件のサイトで調べたら、今日時点ではそれぞれ97kと80kだった。

それにしても報酬の単位がわからん。金額的には年俸かなあ。

|

「詳解 Objective-C 2.0」読書会はないの?

と言ってみる。東京近郊で週末の開催を希望するよ。

(6/17 追記)Googleで"詳解Objective-C"で検索すると、Amazonに続いて3番目に出てくるとかもうね。ブクマの影響か。

仕方ないのでRHGの逆襲を参考に(てか説明をパクって)qwikWebにMLだけとりあえず準備しました。興味ある人はふるってご参加ください。

http://qwik.jp/objc20-reading/FrontPage.html

今週末はRubyKaigiだから、来週(6/28-29)あたりに第0回(方針とか決めたりする?)ができたらいいなという感じ。7月に入るとちょっと時間とれないので。

|

2008.06.12

荻原剛志 著「詳解 Objective-C 2.0」読んだ

だいたいひととおり読んだので感想を。

はじめに

この書籍はObjective-Cの解説としては伝説的とも言える(言い過ぎ)、通称「荻原本」の最新刊です。Objetive-CとCocoaフレームワークによるプログラミングのHowToではない、哲学というか思想というか、デザインを理解する心強い武器となる書籍です。

本書の序文や、ネット上での紹介・感想でも言われているように、AppKitについては少なめです。ただ、AppKitのデザインとしてよく利用される

  • ターゲット・アクション
  • デリゲート
  • 通知

についてはChapter 14「メッセージ送信のパターン」十分に説明されているので、あとはAppleのリファレンスで補足すれば済む話でもあります。

オススメできる理由

今なら手に入る

本書と同じく Objective-C を扱った、荻原さんの「Mac OS X プログラミング入門 Objective-C」(2001年、広文社)や「Objective-C Mac OS X プログラミング」(2006年、ソフトバンククリエイティブ)は、今では大きめの書店でもなかなか見つかりません。これは買えます。

すぐに書店から消えてしまうことの多いMac関連書籍では、重要なことです。

最新のMacOS X 10.5に対応

当然のことながら、Objective-C 2.0/MacOS X 10.5に対応した内容です。Objective-C 2.0での新機能の中でも、特にガーベジコレクションは今までと感覚が異なることが多いようで、本書を読んでいるだけでも「それ罠じゃん!」と思うことがしばしば。

もちろんAppleのリファレンスにもちゃんと書いてあるのですが、この手のものは本のほうが見落としにくいです。

索引がすばらしい

うまく表現できませんが、索引が良いです。

コンピュータの世界では、同じコト・モノを指すのに英語・日本語の混じったりと異なる呼び方のあるものが少なからずありますが、それぞれに索引があったりします。また、ぱらぱら見ながら「採用」とか「out」など気になった語をチェックしてみるという読み方もおもしろいです。

残念ながら、こんな人には向いていません。

  • すぐにでもCoreAnimationなどを駆使したきらびやかアプリを作りたい人
  • Interface Builderは黒魔術だと悩み続ける人

これらについてはヒレガス本やAppleのサンプルをこなすなど、別のアプローチのほうがよいでしょう。

前の本と比べて

当時(2006年4月 だいたい2年前)の 「エバーグリーンな内容が中心なので、現在読んでも内容が古いと感じることはあまりありません。刊行からだいたい5年たっていますが、これから5年後に読んでもそんな感じでしょう。」 という自分の感想が、まあマチガイじゃないけど、新しいほうを読めば「けっこう変わったねえ」と思うのも事実。Objective-C "2.0" の名に値する変化があったと言えるのかもしれませんね。

「Objective-C Mac OS X プログラミング」のレビュー・感想もどこかに書いた記憶があるのだけど見つからない…

|

2008.06.11

第29回 Cocoa勉強会 (7/12)のお知らせ

7/12(土)に行われる、Cocoa勉強会のお知らせ。見学の申し込みは勉強会のメールフォームからどうぞ。会場は新宿 西口のあたりです。

注:見学の申し込みをした方には、遅くとも2日以内に担当(木村)から、当日の案内と内容の確認のメールを送信しています。そのメールを読んで、参加する場合は返信をお願いします。もし、こちらからメールが来ていない場合は、お手数ですが再度フォームから確認の書き込みをお願いします。見学はやっぱりやめた、ということであればよいのですが、返信をもらってない方が2名ほどいるので、ここでアピールしておきます。

概要

  • 日時:2008年7月12日(土)13:00〜
  • 会場:ファースト貸会議室 西新宿
  • 発表(2008.07.07 現在)
    • iPhoto8 PlugInの開発+小ネタ
    • HID Manager API
    • Core Graphics による縦書き描画(without Core Text)
    • ScriptingBridge
    • ほか

|

2008.06.09

User Defaults をコマンドラインオプションで指定する

はてブのcocoa新着経由で、Command Line Processing in Cocoa。コマンドで渡した引数がUser Defaultsに反映されるとのこと。コメントにあるように、AppleのドキュメントにもUser DefaultsのArgument Domainとして書いてある。

 Xcode.app/Contents/MacOS/Xcode -IndexOnOpen NO

で、IndexOnOpenの値がNOになる。ユーザのplistなどで値が設定されていたときは、このプロセス内のみ一時的に上書きされる。

ユニットテストでDefaults使うときに悩んだことがあるけど、これを利用しテストの実行時に値を入れるのがよさそう。

|

2008.06.07

RubyCocoa系の最近のリリース

それぞれMLにお知らせがあったのでご案内。

「RubyCocoa: Bringing Some Ruby Love to OS X Programming」by Brian Marick ベータ版

PragProgのRubyCocoa本 ベータ。PDFは22.0 USD也。1-6章までできていて、他の章は書きかけだったり、タイトルだけだったり。これから読む。

RubyCocoaのMLのほうにも、Brianからバグ報告や、新機能の提案があったり。こういう流れはおもしろいな。って、未対応のもあるけど。

MacRuby 0.2

Mac専用RubyのMacRuby バージョン0.2がリリースされた。svn upするとAやDがちらほら。最新(最近?)のruby-1.9も追っかけてるようだ。大変だろうなあ…

|

2008.06.05

RubyKaigi のチケットを入手し損ねたわけだが

まちがって買ってしまった懇親会のチケットをもらってくれる人はいませんか?(6/7追記:もらってくれる人が見つかりました。締め切り)

(6/18追記:RubyKaigiのチケットをtmaedaさんに譲ってもらいました。ありがとうございます!)

|

clang という LLVM フロントエンド

objc-lang ML に流れてた etoile の Compiler Fun 経由で LLVM の新しいコンパイラインターフェイス clang ていうものあることを知る。日本語の情報だと、マイコミの「GCCに匹敵するコンパイラ?! LLVM - BSDCan2008」が最近のBSDCan2008での発表を中心に紹介していてよさげ。

個人的に興味あるのは、Objective-C のサポートと IDE との協調のためにいろいろ用意している(これから?)らしいこと。Objective-C はマイナー言語であるために、Apple が提供する Xcode 以外の開発ツールではサポートがビミョウなことが多い。せめて ctags くらいは使えてほしいもの。まだドキュメント読んでいるところだけど、なんとかなりそうな感じ。

また、便利かはわからないけれど、おもしろい機能があったので紹介。clang には rewrite という機能があって、コードを操作することができる。そのサンプルとして、Objective-C のコードを C にするという -rewrite-objc というオプションがある。

たとえば

 #import "ECTAppController.h"
 #import "ECTValueTransformers.h"
 
 // 省略
 
 @implementation ECTAppController
 
 + (void)initialize
 {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   [self setupDefaults];
   [self registerTransformers];
   [pool release];
 }
 
 - (void)applicationDidFinishLaunching:(id)sender
 {
   NSNotificationCenter * center;
   center = [NSNotificationCenter defaultCenter];
   [center addObserver:self selector:@selector(syncDefaults:)
     name:NSUserDefaultsDidChangeNotification object:nil];
 }
 
 // save defaults in .plist immediately
 - (void)syncDefaults:(id)sender
 {
   [[NSUserDefaults standardUserDefaults] synchronize];
 }
 
 @end

 struct objc_selector; struct objc_class;
 #ifndef OBJC_SUPER
 // 省略
 #endif
 static __NSConstantStringImpl __NSConstantStringImpl_ECTAppController_m_0 __attribute__ ((section ("__DATA, __cfstring"))) = {__CFConstantStringClassReference,0x000007c8,"CFBundleName",12};
 static __NSConstantStringImpl __NSConstantStringImpl_ECTAppController_m_1 __attribute__ ((section ("__DATA, __cfstring"))) = {__CFConstantStringClassReference,0x000007c8,"CFBundleExecutable",18};
 
 #include "ECTAppController.h"
 #include "ECTValueTransformers.h"
 
 // 省略
 
 // @implementation ECTAppController
 
 
 static void _C_ECTAppController_initialize(id self, SEL _cmd) {
   NSAutoreleasePool * pool = ((id (*)(id, SEL))(void *)objc_msgSend)((id)((id (*)(id, SEL))(void *)objc_msgSend)(objc_getClass("NSAutoreleasePool"), sel_registerName("alloc")), sel_registerName("init"));
   ((void (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("setupDefaults"));
   ((void (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("registerTransformers"));
   ((void (*)(id, SEL))(void *)objc_msgSend)((id)pool, sel_registerName("release"));
 }
 
 
 static void _I_ECTAppController_applicationDidFinishLaunching_(struct ECTAppController * self, SEL _cmd, id sender) {
   NSNotificationCenter * center;
   center = ((id (*)(id, SEL))(void *)objc_msgSend)(objc_getClass("NSNotificationCenter"), sel_registerName("defaultCenter"));
   ((void (*)(id, SEL, id, SEL, NSString *, id))(void *)objc_msgSend)((id)center, sel_registerName("addObserver:selector:name:object:"), (id)self, sel_registerName("syncDefaults:"), (NSString *)NSUserDefaultsDidChangeNotification, (id)((void *)0));
 }
 
 // save defaults in .plist immediately
 
 static void _I_ECTAppController_syncDefaults_(struct ECTAppController * self, SEL _cmd, id sender) {
   ((BOOL (*)(id, SEL))(void *)objc_msgSend)((id)((NSUserDefaults *(*)(id, SEL))(void *)objc_msgSend)(objc_getClass("NSUserDefaults"), sel_registerName("standardUserDefaults")), sel_registerName("synchronize"));
 }
 
 // @end
 
 // 省略

という、C のコードに変換されて出力される(拡張子はなぜか .cpp)。NSAssert() や NS_DURING などのマクロがあるとうまく動作しないもよう。

|

« 2008年5月 | トップページ | 2008年7月 »