2008-08-25

SQLObject の __init__ を触ってはいけない

web.py と SQLObject を使ってちまちまやっているわけですが、データベースに行を追加した後、サーバを再起動してから、Foo.select() の戻り値をイテレートしようとすると、応答しなくなりました。リターンしないと言うのでしょうか。エラーが出るわけではないけれど、ずーっと待ってる。



スレッドが分かれているのがいけないのかとか、いろいろ勘ぐったのですが、そんなことではなくて、SQLObject (のサブクラス)の __init__ を触っていたことが原因っぽい。



ちなみにやりたかったことは、各行に順序を表すコラムをつけたかったのです。

class Foo(SQLObject):
    value = StringCOl()
    order_ = IntCol()



    def __init__(self, *args, **kw):
        kw["order_"] = max([0]+[f.order_ for f in Foo.select()]) + 1
        SQLObject.__init__(self, *args, **kw)

ドキュメントには、__init__ に触るな、_init を使え、と書いてありました。ただ、私の今回の目的では、オブジェクトの生成前に order_ コラムを指定したいのですが、_init の引数は _init(self, id, connection=None, selectResults=None) です。connection に Foo インスタンスが入っているっぽい(WingIDE のデバッガが活躍)のですが、ほんとにこれに頼っていいのか分からないのと、どっちにしても Foo をインスタンス化するときに order_ を渡さないといけません。というわけで、こんな風にしました。

class Foo(SQLObject):
    #...



    @classmethod
    def tail(class_):
        return max([0]+[f.order_ for f in Foo.select()])+1

呼び出すときには、

Foo(value="spam", order_=Foo.tail())

です。



2008-08-20

北京オリンピックトライアスロン 田山選手メダル獲得ならず

レースを見られなかったので、非公式結果を眺めながら、田山選手のレースを妄想してみます。



スイムは 18分04秒、5位で上がっています。先頭のニュージーランド代表 Reed 選手とは 4 秒差、最後尾とは50秒ほどの差です。かなりな好位置につけていたようです。トランジットの時間なんかも記録されていて、バイクに出たときには 4 位です。先頭集団ではないですか。



NHK ニュースによると、山本選手も先頭集団に入っていたみたいで、バイク終了時点で、36位、1時間17分46秒。田山選手は、35位、1時間17分46秒。ほとんど一緒にバイクを終了していたってことでしょう。他の選手のラップタイムを見ても、だいたい同じくらいなので、大きな集団だったようです。



あれ?バイクラップをよく見ると、



  • 1位 1時間16分45秒 ベルギー代表 Zeebroek 選手


  • 2位 1時間16分45秒 ルクセンブルク代表 Dirk 選手


  • 3位 1時間17分30秒 メキシコ代表 Serrano 選手


先頭2人が 45 秒も、ちぎってるじゃないですか。おお、これは盛り上がったのではないかと。バイクで 500m くらい、ランで 200m くらいの差でしょうか。



そんなわけで、田山選手は大きな第2集団か、その後の第3集団くらいでバイクフィニッシュだったのでしょう。トップとは1分差。トランジットで1人抜いています。



ラン・スプリットは37分58秒で48位、最終タイムでも48位です。ランに出てから、15人に抜かれたことになります。結果をざっと見たところ、ラン・スプリットの順位と、総合順位がだいたい同じです。ランスプリット順位と総合順位が大きく違うのは、バイク先頭の2人くらいです。おそらく、ランに入ったところでは、ほとんど差がない状態で、徐々に集団が縦に長く伸びていったのでしょう。



そんなわけで、田山選手はメダル獲得ならず。田山選手は大変悔しがっている様子なので、私は残念がっておきます。それにしても、あいかわらず、ヨーロッパとオセアニアは強いですねぇ。



2008-08-18

北京オリンピック トライアスロン日本代表 田山寛豪選手

オリンピック盛り上がっているようですね。個人的に応援する選手がいたりすると、さらに盛り上がる気がします。私は田山寛豪選手を応援します。ワールドカップシリーズで優勝したことがありますし、暑いレースでは日本人の順位が上がる傾向があるので、期待大です。私がどんなに応援しても、競技のパフォーマンスには何ら影響はありませんが。



JOC のアテネ大会の選手プロフィールを見てみましょう。好きな歌・曲名に「トライユアーベスト(古代真琴)」とあります。分かりにくすぎる...。古代眞琴はシンガーソングライターで、自身もトライアスロンをするらしく、この曲はなんだかレースとかのテーマソングになったりしているようです。聴いたことはありません。



日本トライアスロン連合の有力選手情報も見てみると、得意種目に「トランジション」とあります。だから、分かりにくいってば。トライアスロンはスイム、バイク(自転車)、ランの三種目を連続して行う競技なのですが、各種目間を移行している間も時計は動き続けます。で、この種目間の移行のことをトランジションといいます。ワールドカップやオリンピックなんかだと、このトランジションの時間差も大きな影響があって、実際に田山選手はトランジションで泣いたことも笑ったこともあるようです。優勝したワールドカップ・エイラート大会でのバイク/ランのトランジションはものすごく速かったそうです。



田山選手が所属しているチームブレイブの前身「チームテイケイ」の練習に、学生のころ参加させてもらったことがあります。選手も監督も忙しいのに、無名学生を受け入れていただいたにも関わらず、私は選手としては鳴かず飛ばずで、競技もやめてしまって、挙句の果てに30歳にして中年太りが始まるという、どうしようもない展開です。何の恩返しもできていません。というわけで、兵庫県トライアスロン協会経由で支援基金に微力ながらお手伝いしました。



Google で「オリンピック トライアスロン」で検索すると、教示時刻が表示されます。女子が 18日 11:00から、男子が19日 11:00 からです。日本トライアスロン連合のページによると、
8月18日(月)女子 録画放送 NHKBS 16:00-18:50
8月19日(火)男子 中継放送 NHKBS 10:55-13:00、録画放送 NHK総合 15:12-18:45
だそうで。問題はテレビもビデオも持っていないってことですよ。有給休暇とってヨドバシカメラのテレビ売り場か?



2008-08-17

Wing IDE の使用感

Wingwre 社の Wing IDE という Python の IDE の 一番高い Professional 版を試用(そうです「試」用です)し始めました。web.py と SQLObject を使ったウェブアプリ開発を前提にしています。ちなみに本職は開発ではありません。日曜プログラマです。



これまでの開発環境は



  • Windows XP SP2


  • CTRL+TAB や TopDesk(似非Expose)でフォルダ、Command Prompt、Firefox、xyzzy (Emacs っぽいエディタ)、Python ヘルプを切り替える


  • TortoisSVN でバージョン管理


  • TODO はテキストファイルで管理


でした。で、



  • 編集ソースの切り替えとウィンドウ切り替えのキーストロークが異なるのがやだ


  • 自動補完が欲しい


という不満がありました。



Wing IDE の使い方は



  • エディタのパーソナリティをEmacsに設定


  • Edit-Preference-Layout で個別ウィンドウに設定


  • Python Shell も Wing IDE から開く


  • Wing IDE の SVN 機能はまだ使っていない


です。感想は、



  • エディタもシェルも自動補完は思いのほか便利


  • すべての作業・閲覧対象を Ctrl+tab で切り替えられて便利


  • 編集時にシンタックスチェックしてくれて便利


  • あんまり使わないけど、Shift+F6でユニットテスト実行も便利


  • あんまり使わないけど、ブレークポイントとか変数ウォッチも便利


  • Code Folding 機能は使っているけど、編集しているうちに expand してしまうので微妙


  • TopDesk ではWingの画面が真っ黒になってがっかり


というわけで、なかなか良いです。



編集ソースが増えてくると、TopDesk で表示したウィンドウが真っ黒になるのが痛いです。が、実際のところ、あんまりたくさんの画面を縮小表示されても、どれを選べばいいのかわからないのかも知れません。Vista の Flip 3D にするといいのかも。



30日使えるらしいので、もう少し試用を続けてみようと思います。無料の 101 版でもいい程度の機能しか使っていませんね。Personal 版の $35、Professional 版の $179 でも支払っていいと思っていたわけですが。



2008-08-04

フロントパネル更新を高速にする

LabVIEW のメリットのひとつは GUI や GUI がらみのプログラミングが手軽だということでしょう。ですが、手軽さの代償としてパフォーマンスが犠牲になっています。



添付の bad.vi は、フロントパネル上のオブジェクトを表示したり、非表示したりします。これを遅いとするか速いとするかは、PC のスペックと、アプリケーション

の要件によるでしょう。



LabVIEW はフロントパネルのオブジェクトの値やプロパティが変更されたとき、自動的に更新します。メインのスレッドと、GUI のスレッドが定期的に通信して、値の変更を反映するからです。もしも多数のオブジェクトがある場合には、この変更通信が頻繁に起こり、その結果、再描画も頻繁に起こります。これが LabVIEW の GUI が遅くなりがちな理由です。



.NET フレームワークの Form オブジェクトは、明示的に Update メソッドを呼び出さないと更新されません。なのでパフォーマンスはよいでしょうが、頻繁に更新してほしいときにはコードが煩雑になりがちです。たぶん。



LabVIEW ではフロントパネルの「パネルアップデートを延期」プロパティを使って同じことができます。このプロパティを True にすると、それ以降フロントパネルの操作が描画に反映されません。False にすると、それまでに発生しているプロパティや値の変更が描画に反映されます。つまり .NET Form オブジェクトの Update メソッドに該当します。



添付の good.vi はそれを実装したもの、better.vi はフロントパネル操作をサブ VI 化したものです。手元の環境では、bad.vi の2倍くらい高速に動作します。



PanelUpdating85.zipをダウンロード