2009-07-09

Snow Leopard の GCD

Mac OS X の次期バージョン Snow Leopard には、Grand Central Dispatch というのがあるらしいです。これは OS なのか、フレームワークというかミドルウェアなのか微妙な感じがしないでもないですが、まあ、そこはよしとして。



概要を読んでみると、マルチコアCPU用の並列コードを書きやすく/並列化しやすくするテクノロジーっぽい。



Block というコンセプトがあって、これがひとつのコードのかたまりになる。資料をそのまま使うと、x = ^{ printf("hello world\n"); }  みたいに定義するそうで。で、後で、x( ); でBlock を実行するというか、呼び出すというか。



Block は、GCD が持っている Queue に突っ込まれて、あとは GCD がコアに振り分けて実行してくれるらしい。これで動的に並列化する部分をそれなりに並列化できる。



Block を Clump、Queue を RunQueue に置き換えると、どっかで聞いた事のある実装と似ているなぁと思った次第です。



2009-07-08

第7回 須磨海水浴場アクアスロン

2009年7月5日、第7回須磨海水浴場アクアスロンに行ってきました。諸事情により、かなり前のめりなテンションだったので、うっかり3列目からスタート。スタートしてから気づいたのですが、学生のときでも、そんな前からスタートしたことがありません。案の定バトルに巻き込まれました。しかもウェットスーツを着ていたので、もぐってコースから外れるとかもできず。



その後パニックですよ。息ができない感じです。立ち泳ぎ平泳ぎ背泳ぎでしのいだのですが、顔を水につけるのが怖くなってリタイヤしました。大会運営の方、ご迷惑をおかけしました。申し訳ないです。ボートに引っ張ってもらったのですが、途中でひもが切れたので、自力で海岸まで泳ぎました。いやもうほんと、そのくらい自力でやりますって感じで。



で、傾向と対策をば。まず問題は大きく2つに分けて、(1)パニックになったことと、(2) パニック時の対処です。



パニックになったのは、慣れていないバトルが原因。トライアスロンを再開してからは、いつも、後ろのほうからスタートしてました。ランニングレースでも、昨年の昭和記念でも須磨でも。なのでバトル経験がありません。泳力もバトル力もないのに、そんなポジションにいたら、当然溺れるわけです。



パニック対処の問題は、技術とメンタルの2つがあると思います。



技術的には、溺れたときに場当たり的に立ち泳ぎや背泳ぎをしたこと。最大の武器であるはずの平泳ぎをほとんどしていない。まず平泳ぎ、続いて背泳ぎ、最後に立ち泳ぎって感じにすればよいかと。



深呼吸した気がしない状態が続いて焦った。昨日、プールで泳いで気づいたけれど、泳いでいる最中に、深呼吸した気なんてしない。ちょっと息切れした状態が続いている。だから「大きくはいて、大きくすう」ことができれば実は御の字なのです。それをまず認識すること。



あとは練習かなぁ。「このくらいじゃ、溺れない」っていう成功体験が必要なのかも。オープンウォータースイムに出てみようかなぁ。



ちなみに海でウェットスーツ着用だと、普通にしてたら沈むことはありません。てんぱってるからリタイヤするはめになるだけです。



2009-07-03

仕事の合間に運動する

今週から、17時に運動して、また仕事に戻る、というのをやっています。なんかうまくいきそう。



いくつかメリットがあります。まず、夜更かしした翌日に寝坊しても大丈夫、ということ。朝練の最大の敵は睡魔なのですが、その影響を受けません。



夕方になると集中力が切れるのですが、一旦、職場を離れてから戻ってくると、頭がすっきりしているので、再び集中できます。あと、夜に帰宅すると、もう外出したくなくなるのですが、そういう心配もありません。



仕事の後でのみに行っても大丈夫です。



ひとつ工夫をしています。ジョギングをするときは、一旦帰宅するのですが、このとき携帯電話も他の荷物も、すべて職場に置いてきます。そうすると、職場に戻るインセンティブが働くからです。



2009-07-02

pyclbr

PyMOTW で pyclbr モジュールが紹介されていました。クラスブラウザを実装するのに便利なモジュールです。



たとえばこんなコードがあったとしましょう。


# foo.py
class Foo:
    def hello(self):
        print("hello")
    def bye(self, person):
        print("Bye,", person)
class Bar(Foo):
    def hello(self):
        pass
    def go(self):
        print()


で、pyclbr はこんな風に使います。


# browse.py
import pyclbr
for name, classinfo in pyclbr.readmodule("foo").items():
    print(name)
    for method in classinfo.methods.items():
        print(method)
    print()


実行結果はこんな感じ。


Foo
('bye', 4)
('hello', 2)

Bar
('go', 9)
('hello', 7)


Bar.bye() は表示されません。スーパークラスのメソッドは、明示的に取らないといけないようです。



テストシーケンス管理ツール TestStand 4.2 から Python に対応しています。実行時に関数やメソッドを指定して呼び出せるはずです。おそらく、このモジュールを使っているんだろうなあと思います。未確認ですが。