Monthly Archive for September, 2009

QSTwitter 1.7

Quicksilver の Twitter plugin である QSTwitter の最新版 1.7 をリリースしました。

1.6 での変更は、 following と follower を間違って取得していた問題の修正で、 1.7 での変更は Growl サポートを入れたことです。

Growl をアプリでサポートするのはわりとかんたんで、

  1. .plist を書く
  2. 通知 API を呼ぶ

たったこれだけで OK 。なのだけれど、 QSTwitter みたいなプラグインで Growl を使うにはそこまでかんたんでなく、以下のような手順になります。

  1. .plist を書くかわりに delegate を実装
  2. 通知 API を呼ぶ
  3. Framework のライブラリパスを @executable_path から @loader_path に変える

3つめで1時間ほどハマってしまいましたが、 install_name_tool というものを使えば OK でした。

% install_name_tool -change \
    '@executable_path/../Frameworks/Growl.framework/Versions/A/Growl' \
    '@loader_path/../Frameworks/Growl.framework/Versions/A/Growl

プラグイン (bundle) は、アプリケーション本体のパスと別のところにあるため、 @executable_path ではまずいわけですね。また、バイナリ配布されている Growl.SDK は @executable_path でビルドされているため、 @loader_path を指定してやらないとプラグインからはそのままでは組み込めない、と。

参考

Introduction to Algorithms を読む会

IMG_2097

@cesare さんと、 Introduction to Algorithms という殴ったら人の命がなくなりそうなほどに分厚い本を読む会を始めます ( ML )。 アルゴリズムイントロダクション の原書ですね。

まず方針など決めましょう、ということで第0回のミーティングを、女子ファッションのフロアしかない新宿マルイ上のスタバでやってきました。 最初に、各自のこの本を読むにあたっての目標を明確にして (基礎から CS 学びたい (@cesare)、アルゴリズムコンテストで泣きたくない (@mootoh))、以下のような進め方でやることになりました。

  • 毎回のゴール: 各自が、自分なりに理解すること。理解できないとやる意味ない。
  • 2週に一度、2時間くらい。50ページくらいずつを、全員が読んでくること。練習問題は分担する。
  • 場所は新宿あたり(もうちょっと西でもベターでございますよ)。
  • アウトプット: 特にないけれど、練習問題の解答や本文中のコードを好きな言語で実装してみるとかやってもよいですね。
  • あとはやっていくうちに適宜、軌道修正。

そんな感じで、第1回を 10/1 (木) 19:00-21:00 でやります。 さてさて完全読破なるか。


ぼくは数ヶ月前に 2nd edition を購入したのですが、 @cesare さんが 3rd edition を持ってきてたまげた。章立てはぱっと見変わってないけれど、 ChangeLog によると、2章を削って2章加えた、みたいなことが書いてある。

Introduction to Algorithms, Third Edition
Thomas H. Cormen Charles E. Leiserson Ronald L. Rivest Clifford Stein
The MIT Press
売り上げランキング: 14237

数学的基礎とデータ構造 (アルゴリズムイントロダクション)アルゴリズムの設計と解析手法 (アルゴリズムイントロダクション)

Twitter Developers Meetup in Tokyo

IMG_2091

いちおう Twitter をつかったアプリ (その1その2) の作者なので、参加資格はあるだろう。 ということで、 Twitter Developers Meetup in Tokyo のために原宿まで行ってきました。原宿というのはおそろしいところですね。

さいしょの説明セッション中では、iPhone アプリ開発者仲間4人で最前列に座り、態度大きめで話を聞いていました。あまり目新しいことはなくて、

  • Location
  • ReTweet

を開発者に提供していきますよー、というところで終わった。 あと、US では頻繁にこうした Developers meetup をやってるけど、国外でこうしたことをするのは初めての試みで、世界中の開発者とうまくやっていきたいんだよねー、と。

もちろんそれだけじゃつまらないので、質疑応答のセッションに突入したらみんなによる質問の集中放火状態だった。まぁでも、彼自身はプロキシみたいなものだからあまり面白い答えを引き出すことはできなかったんだけれど。 US の meetup だと、各チームの人間がいるだろうから、より中身のあるディスカッションができるんだろうな。

R0011823

Twitter 自身に、これ以上機能を加えてもらうのは特に望んでいなくて、ただ安定した、より自由に (たくさん) 使える API を提供してもらえれば、あとはこっちでいろいろ遊ぶから、と何人かの人が言ってたのが印象的だった。インフラとして安心してつかえることが求められている。 Twitter は場なんですよね。今回の Meetup でもそうで、開発者どうしが交流する場を提供してもらえるのがありがたいわけで。

どんどん、知らないひとたちとのつながりが大きくなっていけばいい。

iPod nano 5G

R0011825

妻にプレゼントしました。 毎日の通勤時間がとても長くて時間もったいないわー、とこぼすことが多かったので、ビデオ観れたらいいんじゃないかなーと思っていたのです。

都心に出る機会があったので、まずはポイントが貯まる有楽町ビックカメラに行って、在庫があるか聞いてみる。16GB だとブルーとピンクしかないの… 妻の希望はシルバーで、それだと 8GB のしかない。 8GB も悪くないんだろうけど、今回のは容量が倍になっても ¥3,000 しか変わらないから、 8GB を選ぶ理由がないわなー。

少し足をのばして、本家 Apple Store 銀座へ。さすがにありますよね、と聞いてみるとそりゃありますよ、みたいな返事をもらい、即購入。

カメラが動画専用なのは残念だけれど、まぁこれは使ってるうちに楽しくなってくるのかもしれない。(ぼくが使うわけじゃないけれど) その昔に、ソニーの DSC U-10 というとっても小さなデジタルスチルカメラが出て、そのときのキャッチフレーズが「ビジュアルブックマークしよう」というものでした。あの感覚に近いのかもね。日常をビデオでブックマークする。

液晶が小さいので、動画再生が果たして試聴に耐えるかというところが懸案だったのですが、けっこう観れる。文字はさすがに小さくてつらいけれど、動画を全体としてばん!と観るぶんには問題なさげかな。

あとは Nike+ iPod と組み合わせてジョギング生活をより豊かにしてあげたい。

Google Code Jam 2009 Qualification Round

Google Code Jam 2009 がはじまったので、今年も参加しています。

Aの small/large 、 C の small が解けてなんとかパスしました。 スコアはこんなところ

A : Alien Language

正規表現で一発だよなーということで Ruby に丸投げ。我ながらこれはひどい。

C : Welcome To Code Jam

再帰っぽいよねー、でもふつうに再帰でやると問題サイズに耐えられなくて時間切れだろうなー、とか思いつつ再帰で書いた。

small set は OK だったけれど、案の定 large set の計算がぜんぜん終わらないので次へ。

B : Watersheds

ちまちま机上で考えてコードに落としてみたところ、サンプルケースは通ったのでさっそく small set に書けるとアウト。そのあとしばらくあれやこれやいじってるけどだめげなのでふて寝。


けっきょく、去年からあんまし変わっていないなーというのはよくないですね。 力任せのアルゴリズムしか浮かばないか、まるで見当違いのところをぐるぐるしているだけで時間が過ぎるという。 DP とか日常で使わないので、なかなか身に付かないというのがあるかな。

次のラウンドまでに、他の参加者のコードをみて勉強べんきょうですね。

Grand Central Dispatch をためす (2)

その1では、man ページしかドキュメントのない状態で手探りで GCD をさわってみる、ということをしていました。

で、その1を書いた数時間後に全世界で Snow Leopard の発売開始が完了したためか、 ADC で Snow Leopard の開発資料すべてに、ヒラ会員でもアクセスできるようになっていました。すばらしい。

でもそのあたりはロクに読まないまま、今回も man ページを頼りに遊んでみます。

dispatch_apply

man ページによれば、データ並列を実現するもののようですね。与えられた Block を、指定された回数だけ並列実行して回す、という並列プログラミングパターン。

たとえばこんな感じになる。

実行結果:

% ./apply_dispatch
1
0
3
4
5
6
2
8
9
7

ちゃんと非決定的に、突っ込まれた順序でなく Block が実行されている様子が見てとれます。

とはいえ、 dispatch_apply はそのままだと、ループが終わるまで処理をブロックしてしまうので、それがイヤなら dispatch_apply そのものを dispatch_async でくるむといいよ、とか書いてます。

(さいしょ、iteration の各 Block が並列に実行されないのかと勘違いしていて、なんだよそれじゃ意味ないじゃんと思って実験してみたら、ちゃんと個々の Block が並列に実行されてるのを見て感心してました)

こんな感じになる。

実行結果は前のと同じ傾向になります。 違いは、 dispatch_apply の終了を待たずに main が終わりそうになるというところ。 (なので sleep で適当に待っている)

ローカル変数はどうなるの

Block の中から、外のスコープにある変数を参照するとどうなるでしょうか。

タイミング的には、

  • x=3 in 外のスコープ
  • Block を評価
  • x=7 in 外のスコープ
  • Block が実行される

となるように仕組んでいるわけです。

実行してみましょう。

% ./dispatch_local_var
x in outside block : 7
x in async block : 3

おおっと、 Block から参照する、外のスコープにある変数は、 Block が評価された時点の値になるようですね。

クロージャ

それってなんてクロージャ、という。

Apple が GC と Block をC1X に提案している中で (APPLE’S EXTENSIONS TO C March 10, 2009)、Block はクロージャを C に導入する、といった文脈で提案されています。コールバック関数を実装する際に、いちいち関数にコンテキストを引数で渡すのはめんどうだし、コンテキストはレキシカルスコープにある情報そのものでしょうよ、という。

並列プログラミングするときに問題になるのがレースコンディションといった共有変数への競合アクセスですが、クロージャを使うことで評価時に値を束縛してしまうので、 Block が実行されるときの変数の値が決定的になる、ということでしょうか。

並列プログラミングとクロージャの関係についてはもうちょっと考えてみないと。

まとめ

dispatch_apply は、parallel_for のようなデータ並列モデルを提供するものです。また、 Block は C でクロージャを記述できるようにする構文拡張でした。

次は、上でさらっと流した変数を Block 間で共有するあたりの話を掘り下げてみたいと思います。あとイベントとかもセマフォとかも。 Queue でタスク間の依存関係の制御をするあたりも。おわらない…

参考


いま MacBook Pro を買うと Snow Leopard が入ってて Grand Central Dispatch で遊べるし NVIDIA GPU が載ってるので OpenCL でバリバリと次世代並列プログラミングができてよいんじゃないでしょうか。