2009年3月17日火曜日

pythonで、Objective-Cのカテゴリのように、あるクラスのソースを変更せずに任意のメソッドを追加する方法

■結論
すべてのクラスには__bases__という隠しフィールドがあるので、そこに任意のスーパークラスを作って追加する


■何がしたいか
たとえば以下のようなクラスがあります。
class Foo:
def do_something(self, x):
  print x
  return

このクラスのソースコードに指一本触れずに以下のメソッドを追加したい。
  def another_method(self, x, y):
  print x+y
  return

って将軍様が言っていたので、一⑨さんは考えました。


■チーン!ひらめいた!
まずは以下のようにスーパークラスになるクラスを作ります。
class SampleCategory:
def another_method(self, x, y):
  print x+y
  return

そしてここからがポイント。__bases__というTupleに、今作ったスーパークラスのtype型を追加します。
スーパークラスを宣言した後で・・・
from com.akisute.example import Foo
Foo.__bases__ += (SampleCategory,)

これだけです。
なぜかこれでうまくいくのがPythonのふしぎ。

実際のソースコードの例は以下のようになります(以下、拙作のプログラムから抜粋)
#!/usr/bin/env python
# encoding: utf-8
"""Login Authentication plugin.
Extends BasicController to give it an additional function for authentication
using Google account.
"""
import sys
import os

class LoginAuthPlugin:
    def is_login(self):
        """Returns True if requesting user is logged in."""
        #Do some work here
        return false

from gaeo.controller import BaseController
BaseController.__bases__ += (LoginAuthPlugin,)


JavaScriptのprototype書き換えにも似ていますね。
ただしprototype書き換えに比べて優れているのは、__bases__はTupleなので、簡単に好きなだけスーパークラスを追加することが出来ます。
(prototypeだと複数のスーパークラスを追加するのがきわめて困難)
from com.akisute.example import Foo
Foo.__bases__ += (SampleCategory,)
Foo.__bases__ += (AnotherCategory,)


■元ネタ
GAEOでpluginを読み込んでBaseControllerを拡張するときにこのテクが使われていました。
GAEO作った人は凄い。

2009年3月14日土曜日

Firebugのconsole APIを使ってLoggerもどきを作ってみた

突然ですが、Firebugのconsole APIは凄く便利です。
console.log("abesi");
console.debug("object:%o, decimal:%d, float:%f", anObject, count, Math.PI);

問題はこれ、Firebugがインストールされていて、かつコンソールが有効になっているとき以外は
エラーになってしまいます。
(consoleというオブジェクトがないから)
これをなんとかしたい。
それからついでに、せっかくlog, debug, info, warn, errorと5つも種類があるので、ログレベル制御もしてみたい。

ということで思い立ったが吉日、車輪の再発明をしようということで、ちょっとLoggerもどきを書いてみました。
http://gist.github.com/79018

使い方はこんな感じです。
    //Get logger
    var logger = new Logger(Logger.LEVEL_DEBUG);

    logger.debug($("abesi"));
    logger.info(hidebu);
    logger.warn("tawaba=%d", 100);

ログレベル制御をしているので、ログレベルをInfoにするとdebugログが出なくなる・・・はずです。
JavaScriptのprototypeなんて触ったのは実は人生初なので問題点が多々あるかと思いますが、まぁ、せっかくですから、どうぞお使いください。

2009年3月4日水曜日

MacとiPhone向けの高機能GTDツール、OmniFocusを使って、ThinkingRockと比べてみました


  • 非常にMac的なショートカットと、GTDツールというよりアウトラインプロセッサーのような操作感覚に慣れるまでが大変だが、慣れてしまえば大変高速にタスクを収集・処理できる優良ソフト=OmniFocus
  • 名前の通り、フォーカス能力が超強力。自分が今何をしているか、何をするべきかに一瞬でフォーカスできる
  • 「次に今すぐ行動可能なアクション」だけが目の前に表示される快感
  • Macのどこからでもショートカットキー一発でタスクを収集できる機能や、現在の検索条件および画面設定をパースペクティブとして保存できる機能など、地味に便利な機能がそろっている
  • 入力補完がかなり高レベルのできばえで気持ちよく使える。Remember the Milkと同等以上
  • 日本語版のOmniFocusは翻訳が狂っていたり日付指定フォーマットに一部問題があるので、英語版を推奨
  • 欠点は高すぎることと、Mac+iPhoneの環境が前提になっていること(それ以外の環境で利用できない)
  • 安くてどこでも使えるシステムを構築したい方にはThinkingRock + Remember the Milkをお勧め

つい先日にThinkingRockを使いはじめた旨の記事を書いたのですが
アレからしばらくして、やっぱり我慢ならなくなり、ついにMac&iPhone向けの高機能GTDツール、OmniFocusに手を出してしまいました。
ということでThinkingRockと比較してみたレポをアップしたいと思います。


■そもそもGTDとは何ぞや

グーグル先生にお尋ねになるか、または以下の本を読んでみていただけるとよいかと思います。
はじめてのGTD ストレスフリーの整理術


■これまで試したGTDツール変遷

フランクリンプランナー

Remember the Milk + フランクリンプランナー

Remember the Milk Pro + Appigo Todo + フランクリンプランナー

Remember the Milk Pro + Remember the Milk for iPhone + フランクリンプランナー

ThinkingRock + Remember the Milk for iPhone + フランクリンプランナー

OmniFocus + OmniFocus for iPhone + フランクリンプランナー


新しい物好きが災いして、いろいろと試してます。
一時期フランクリンプランナーを辞めようかと思った時期もあったのですが、紙の手帳はやはり絶対必須みたいです。
私はアナログな人間だからか知りませんが、ペンで書かないと頭に入ってこないですし、モニタを見るのも嫌だというぐらい疲れているときでも紙でしたら平気です。あと、会議中にiPhoneを取り出してメモを取るのがはばかられるという問題もあったりします。

その後長いことRemember the Milkを使っていたのですが、使い込んでいるうちにRemember the Milkは備忘録としては超一級でもGTDツールとしては3流という結論に至ってしまったため、別のツールを探す必要性が出てきました。
(コンテキストの概念がないのはまだ運用で何とかなったのですが、プロジェクトの階層化ができないのと、プロジェクトとアクションをシームレスに追加変更できないのが致命的でした)


えーマジ?階層化できないの?キモーイ!orz

そこで最初に目を付けたのが前回ご紹介したThinkingRockです。


■ThinkingRock + Remember the Milk
この組み合わせの長所と短所を簡単にご紹介すると以下のようになります。

○長所
  • ThinkingRockは厳密にGTDのプロセスを体現しているので、GTD初心者には最適。使っているだけでGTDの考え方を学べる
  • プラットフォームを全く選ばない。ThinkingRockはJavaさえあればどこでも動きますし、Remember the MilkはWebに接続できればどこからでも利用できます
  • プラットフォーム間の連携が容易。DropBoxを利用してThinkingRockのデータベースを共有することで、手持ちのマシン全てで簡単に同期を行うことが出来ます。WinとMacの間の連携もスムーズ
  • ほとんど無料。必要な出費は、せいぜいRemember the MilkをProにして(年間たったの25ドル)iPhoneからでも利用できるようにする程度
×短所
  • ThinkingRockとRemember the Milkの間の連携が全くない。Remember the Milkで収集したタスクをThinkingRockに移動したり、逆にThinkingRockから明日やりたいタスクを持ち出すためにRemember the Milkに書き出すなどといった無駄な作業を行う必要があります
  • ThinkingRockは厳密にGTDのプロセスを体現しているがゆえに厳密すぎ、逆にRemember the Milkは備忘録程度の機能しかなくプロジェクトを扱うには不向き
  • どちらのツールもフォーカス力不足。プロジェクトが30程度、アクションが100を超えてくるともはや制御不能


ThinkingRockとRemember the Milkで、無料&どこでも使えるGTDを!

お金がかからずに、どこでも使える組み合わせと言う意味で、これからGTDをやってみようとお考えの方には最適ではないかと思われる組み合わせです。ThinkingRockは本当にお勧め。
問題はプロジェクトとアクションの数が増えてきたときです。どちらのツールもフォーカスをするための機能が貧弱です。
ThinkingRockには検索とソート程度しかフォーカスをするための選択肢がなく、
RtMには強力な検索機能がありますが、ThinkingRockがメインのシステムになっているため生かしきれませんでした。あと、検索結果を残すためのSmart Listが10とか20とか大変な数になってしまい、今度はどのSmart Listを利用すればよいのかわけがわからなくなるという別の問題が生じる恐れが・・・


■それで結局、OmniFocusってどうなの?
対するOmniFocus。こちらも長所と短所をまとめてみました。

○長所
  • 「今すぐ出来る行動」と「今すぐは出来ない行動」を自動的に判断してくれるのが素晴らしい
  • Mac版、iPhone版ともに、タスクに対するフォーカス能力が超強力
  • MacとiPhoneが完全にシームレスに同期可能。iPhoneからいつでもメインのシステムに入っているアクション一覧を参照可能だし、iPhoneからいつでもInboxの整理をしたり出来る
  • ThinkingRockに比べ入力補完やショートカットキーが大変充実しておりサクサク使える
×短所
  • 高い。高すぎる。Mac版とiPhone版あわせて1万円、さらにMobile Me代が年間1万円
  • Mac+iPhone以外では利用できない。うかつに携帯を買い換えたりPCを買い換えたりしようものならタスクが参照できなくなる危険がある
  • 同期が重い。Mobile Meを利用しているのですが、同期ボタンを押したらたまに2分とか待たされるときがあります。RtMなら20秒程度で済むのに


OmniFocus for iPhone

OmniFocusの機能で特筆に価するのはなんといってもフォーカス力です。
Thingsのようなほかの有名GTDツールを使ったことがないので比較は出来ないのですが・・・

「期日が明日までで、かつ仕事先のオフィスの近くで出来るタスクだけを表示してほしい」
「今週どうしてもやっておきたかったとマークしたタスクだけを、今すぐ行動できるものだけ表示してほしい」
「そういえば最近Blog書いていなかったので、Blogネタの中で一番時間がかからないものを書きたいからアクションを表示してほしい」
「時間が空いたので開発をしたい。開発タスクの中で次に行動できるアクションを表示してほしい」

このようなニーズを(設定さえしておけば)ショートカットキー一発で満たしてくれるというのが神業的に素晴らしいです。
しかもMacの中だけではなく、iPhoneでもほぼ同じことが出来ます。
帰りの電車の中で、「家に帰ったら寝るまで1時間しかないけれども、何が出来るか」などと考えたりできるわけです。もう最高。


今日、帰ってから実行するアクションは・・・

「今すぐここで出来る行動」を管理できると言うのも素晴らしい点です。
たとえば3月3日現在の地点で、「今すぐやる」リストに3月8日開催の「例大祭の列に並ぶ」なんてアクションを出されてもイラッとするだけです。
このアクションは3月8日の朝に「今すぐやる」リストに表示されてほしいのです。そしてこれが実現できているGTDツールが意外なほど少ない。
RtMには「開始日時」の概念がないですし、ThinkingRockには「開始日時」の設定項目がありますが、それを使って今すぐ実行可能なタスクだけにフォーカスをすることが出来ないに等しかったので役に立ちませんでした。


これで安心!あとは例大祭のことは忘れてソースでも書きましょうか!


あとは完全に主観になってしまいますが、「使っていて楽しい」というのも非常に重要なポイントです。
はじめてのGTD ストレスフリーの整理術にも、「使っていて楽しいツールを利用するとタスクを管理するのが楽しくなる」といった旨の記述がありますし、使っていて楽しくて仕方がないと思うのであれば少々高くてもお金を出す価値はあると思います。


ただしOmniFocusは欠点も無茶苦茶多いです。まず第一にMac + iPhoneの組み合わせ以外では利用不可能。これだけで使う人を選んでしまいます。
残念ながら今後Windowsなど他のプラットフォームで利用可能になることも永遠にないと思います・・・(開発元のOmni社がMac製品しか作らないので)。
そしてべらぼうに高い値段。「無料でいくらでもネット上に落ちているタスク管理ツールに1万円+αも出せるかどうか」というところがポイントになりそうです。
この「Mac信者のMac信者によるMac信者のためのGTDツール」と言わんばかりのハードルの高さを乗り越えられるかどうかが肝だと思います。実際にはMac信者とか全く関係なしに非常に良いツールなのですが・・・


■まとめ
初めての人、複数台マシンを持っている方、Linuxユーザーの方、無料だけれどもしっかり使える優良ツールをお探しの方にはThinkingRock+αを、 手持ちのコンピュータが全てMacで携帯はもちろんiPhoneという方、人とは違うものを使ってみたい方、「次にいますぐ行動可能なアクション」だけが目の前に出てくる快感を味わってみたい方にはOmniFocusをお勧めします。


■おまけ:日本語版のOmniFocusはイマイチ
何がイマイチって、まず翻訳が何かおかしい。所々見ていてへんな単語が・・・フォマーットとか・・・
そして何より、日付の指定が日本語じゃないとできないのです。


英語版だとこう指定できます。「next sun@8」で来週の日曜日の8時にセットできます。
「tod」だけで今日の0時、「tom」で明日0時、「now」で今この瞬間にセット。
便利!


ところが日本語版だとこうなります。ちょっと!なんだよ「翌週日曜日」って!
「明日」とか「今日」とか「今」って入力面倒じゃないの!
こんなところまで余計なローカライズしなくていいよ!!

と言うことで私は英語版を強くお勧めいたします。
英語版のダウンロードは、http://www.omnigroup.com/applications/omnifocus/ の画面右端、



こちらをクリックすると英語版がダウンロードできますよ。