September 30th, 2009  |  Published in Uncategorized
            
              Quicksilver の Twitter plugin である QSTwitter の最新版 1.7 をリリースしました。
              1.6 での変更は、 following と follower を間違って取得していた問題の修正で、 1.7 での変更は Growl サポートを入れたことです。
              Growl をアプリでサポートするのはわりとかんたんで、
              
                - .plist を書く
- 通知 API を呼ぶ
たったこれだけで OK 。なのだけれど、 QSTwitter みたいなプラグインで Growl を使うにはそこまでかんたんでなく、以下のような手順になります。
              
                - .plist を書くかわりに delegate を実装
- 通知 API を呼ぶ
- Framework のライブラリパスを  から  に変える
3つめで1時間ほどハマってしまいましたが、 install_name_tool というものを使えば OK でした。
              % install_name_tool -change \
    '/../Frameworks/Growl.framework/Versions/A/Growl' \
    '/../Frameworks/Growl.framework/Versions/A/Growl
              プラグイン (bundle) は、アプリケーション本体のパスと別のところにあるため、  ではまずいわけですね。また、バイナリ配布されている Growl.SDK は  でビルドされているため、  を指定してやらないとプラグインからはそのままでは組み込めない、と。
              参考
              
             
            
           
          
            Introduction to Algorithms を読む会
            September 15th, 2009  |  Published in book
            
              
               さんと、  という殴ったら人の命がなくなりそうなほどに分厚い本を読む会を始めます (  )。  ・ の原書ですね。
              まず方針など決めましょう、ということで第0回のミーティングを、女子ファッションのフロアしかない新宿マルイ上のスタバでやってきました。 最初に、各自のこの本を読むにあたっての目標を明確にして (基礎から CS 学びたい ()、アルゴリズムコンテストで泣きたくない ())、以下のような進め方でやることになりました。
              
                - 毎回のゴール: 各自が、自分なりに理解すること。理解できないとやる意味ない。
- 2週に一度、2時間くらい。50ページくらいずつを、全員が読んでくること。練習問題は分担する。
- 場所は新宿あたり(もうちょっと西でもベターでございますよ)。
- アウトプット: 特にないけれど、練習問題の解答や本文中のコードを好きな言語で実装してみるとかやってもよいですね。
- あとはやっていくうちに適宜、軌道修正。
そんな感じで、第1回を 10/1 (木) 19:00-21:00 でやります。 さてさて完全読破なるか。
              
              ぼくは数ヶ月前に 2nd edition を購入したのですが、  さんが 3rd edition を持ってきてたまげた。章立てはぱっと見変わってないけれど、 ChangeLog によると、2章を削って2章加えた、みたいなことが書いてある。
              
                
                  
                
                
                  
                  
                    Thomas H. Cormen Charles E. Leiserson Ronald L. Rivest Clifford Stein
                    The MIT Press
                    売り上げランキング: 14237
                  
                  
                    
                  
                 
                
               
              
             
            
              Tags: I2A, 読書会
            
           
          
            Twitter Developers Meetup in Tokyo
            September 12th, 2009  |  Published in Uncategorized
            
              
              いちおう Twitter をつかったアプリ (その1、その2) の作者なので、参加資格はあるだろう。 ということで、 Twitter Developers Meetup in Tokyo のために原宿まで行ってきました。原宿というのはおそろしいところですね。
              さいしょの説明セッション中では、iPhone アプリ開発者仲間4人で最前列に座り、態度大きめで話を聞いていました。あまり目新しいことはなくて、
              
              を開発者に提供していきますよー、というところで終わった。 あと、US では頻繁にこうした Developers meetup をやってるけど、国外でこうしたことをするのは初めての試みで、世界中の開発者とうまくやっていきたいんだよねー、と。
              もちろんそれだけじゃつまらないので、質疑応答のセッションに突入したらみんなによる質問の集中放火状態だった。まぁでも、彼自身はプロキシみたいなものだからあまり面白い答えを引き出すことはできなかったんだけれど。 US の meetup だと、各チームの人間がいるだろうから、より中身のあるディスカッションができるんだろうな。
              
              Twitter 自身に、これ以上機能を加えてもらうのは特に望んでいなくて、ただ安定した、より自由に (たくさん) 使える API を提供してもらえれば、あとはこっちでいろいろ遊ぶから、と何人かの人が言ってたのが印象的だった。インフラとして安心してつかえることが求められている。 Twitter は場なんですよね。今回の Meetup でもそうで、開発者どうしが交流する場を提供してもらえるのがありがたいわけで。
              どんどん、知らないひとたちとのつながりが大きくなっていけばいい。
             
            
           
          
            Google Code Jam 2009 Qualification Round
            September 4th, 2009  |  Published in Uncategorized
            
               がはじまったので、今年も参加しています。
              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)
            September 2nd, 2009  |  Published in Uncategorized
            
              その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 でバリバリと次世代並列プログラミングができてよいんじゃないでしょうか。