2011年9月28日水曜日

COBOLerが書いたPythonコードを晒す

これを読んで思ったこと。議論に混ざりたいとまでは思わないので、トラックバックはしてない。

普通の構造化プログラマーがオブジェクト指向の存在意義を理解するコツ
http://d.hatena.ne.jp/ryoasai/20110926/1317044975


GoogleAppEngineを使いたいという理由でPythonを始めたのだけど、Pythonそのものが面白くてローカルPC上で動くアプリも作ってみた。toodledoのタスクを俺基準で抽出して、それをGrowlforWindowsから通知させよう、というもの。これを自宅のPCに突っ込んでおいて、ちょっとゲームでもとPCの電源をいれれば、残っているタスクが画面に現われて出鼻をくじかれる、そんな機能。

オブジェクト指向プログラミングの観点で言えば、クラス1つ定義していない。やりたいと思った処理をダラダラ書いただけのソースだ。しかも、出来合いのpoodledo(GitHub)、gntp(GitHub)にタダ乗りしているだけ。

公開されているパッケージ、モジュールがたくさんあって、それらを使わせてもらえるというのがとてもありがたかった。
インストールも(その名もeasy_installのおかげで)楽だし、「これってうまく動くの?」と思えば、付属のテストコードでテストもできる。至れり尽くせりだ。テストが足りてるか心配なら、そのテストコードを読めるし、足りてないと思えば自分でテストを追加して作者に送ることすらできる。
オブジェクト指向そのものより、この気軽さ、親切さ、文化がうらやましいと思った。

GoogleAppEngineにしても、Webアプリののひな形があって、そのリクエストハンドラさえ継承すれば俺様webアプリが作れるという手軽さだ。(ニコニコ動画のランキングを引っぱがすアプリはこれで作った)
Pythonの文法をいちいち調べながら書いたので、それなりに時間もかかったけど、はっきり言って楽だ。こんなに簡単にできていいのかと思えるくらい。(仕事で作ってるものほどガリガリとテストしてない、というのはある。)

でも、Pythonで企業の業務システム書けって言われたらどうだろう。無数のベンダーに同時にロックインされているような気分になるかもしれない。「このモジュールのメンテが終わったらどうしよう」とか、「ライセンス条項が変わって使用できなくなったらどうしよう」とか。個人で作れる規模のちょっとしたアプリなら、必要に応じて自分で直すこともできる(やった)けど。

#!/usr/bin/env python
#!/usr/bin/env python
#  -*- coding: utf-8 -*-
"""
toodledo2grwol : Display grwol notify tasks of Toodledo

"""
from datetime import datetime
from apiclient import ApiClient
import gntp.notifier

# Task Filters
def _taskFilter(tasks):
    """
     Task Filter -- return filtered tasks
    """

    def _isUncompleted(task):
        """
         Task Uncomplered 
        """
        if hasattr(task, "completed") == False:
            return True
        else:
            if task.completed == "0":
                return True
            else:
                return False

    def _hasDuedate(task):
        """
         Task Has Duedate
        """
        if hasattr(task, "duedate") == True:
            if task.duedate != "0":
                return True
            else:
                return False
        else:
            return False

    for task in [ task for task in tasks if (_isUncompleted(task) == True) and \
                                            (_hasDuedate(task) == True)]:
        yield task

# create Toodledo Client
api = ApiClient(app_id = "aaaaaaaa", app_token="bbbbbbbb")

# Toodledo Authentication
api.authenticate('cccccc@cccc.cccc', 'dddddddd')

# Get Task list from Toodledo
task_list = api.getTasks(fields="duedate")

# Register to Growl
growl = gntp.notifier.GrowlNotifier(
    applicationName = "aaaaaaaa",
    notifications = ["Task"],
    defaultNotifications = ["Task"],
)
growl.register()

# Send Notify to Growl
for hot_task in _taskFilter(task_list):
    duedate = datetime.fromtimestamp(float(hot_task.duedate))
    growl.notify(
        noteType = "Task",
        title = hot_task.title,
        description = duedate.strftime("DueDate: %Y/%m/%d"),
        icon = "file:///C:/Users/eeeeeeeeeeeeeee/icon.png",
        sticky = False,
        priority = 1,
    )
# end

自分PCローカルで動くGrowl通知に加えて、boxcar経由で通知を送るWebサービス(GAE/p)版も作ろうとしてる。こっちは難航中。GAEにモジュール突っ込むときのimportのルールがいまいち怪しいのだ。

0 件のコメント:

コメントを投稿