PyPI Author になりました

Pyxis は現在オープンソース化を目指して開発が進められています。
その第一歩として Pyxis で利用しているパッケージをオープンソースで公開することにしました。

tw.starrating は Amazon の 5つ星みたいな機能を提供するための ToscaWidgets のウィジットで、 jQuery Star Rating Plugin を利用しています。 tw.jtageditor も同様に jTagEditor (現在はバージョンアップして markItUp! という名前になっています) を ToscaWidgets 化したものです。

tw.starrating の方は PyPI にも登録しました。

PyPI への登録は初めての経験だったのですが、 http://d.hatena.ne.jp/jYoshiori/20080104/1199440115 の記事などを参考にさせていただいて、あっけないほど簡単に終わりました。これで easy_install コマンドを使って一発でインストールできるようになったので、ぜひ使ってみてください。

 $ easy_install tw.starrating

(いま見たらもう何回かダウンロードされていました)

Pyxis 本体も早く公開できるように頑張ります。

Posted by id:knzm

書評: 10日で覚える Python 入門教室

初めての経験なのですが、書籍を頂いたのでご紹介いたします。CMS コミュニケーションズの穂刈さん、寺田さんたちが著者に名を連ねている「10日で覚える Python 入門教室」です。翔泳社から送って頂きました。

Python の書籍といえば、これまでオライリーの「初めてのPython」や「Python クックブック」、柴田さんの書かれた「みんなの Python」など、どちらかというと Python 全体を網羅的に扱った書籍や堅めの本しかなかったのですが、「10日で覚える Python 入門教室」は、「Python の機能を余すところなく紹介せねば…」という重圧から解放され、楽しいトピックを非常にのびのびと扱っています。

目次を見て頂くと分かりますが、 Amazon API からデスクトップアプリ、Pylons を用いたウェブアプリケーションまで、初学者の方が初めから退屈することなく、ものを動かすワクワク感を感じながら Python を学べる構成になっています。また、「第7日 エラーとテストを学ぼう」もイチオシです。デバッグやテストの手法はプログラマが押さえておくべき重要項目の1つですが、リファレンスマニュアル等を見てもなかなか分かりません。このトピックについて一章を割いてしっかりと説明しているのは、初学者にとって助けになるのではないかと思います。

また、本書の後半では SQLAlchemyPylons に触れていますが、前者は Python の OR Mapper としてデファクトスタンダードであり、学んでおいて絶対に損をしないでしょう。また、Pylons は日本ではまだまだ認知度が低いですが、私の会社でも利用していてお勧めです。WSGI ベースの非常に小さなフレームワークですが、様々な拡張に耐えられるように設計されており、自由度が高いです。MVC の紹介に Pylons を使ってくれたのには、なんだか嬉しくなりました。1人でも多くの Pylons ユーザが増えてくれればと思います。

それにしても、楽しい題材を選びながら、重要なポイントはしっかりと押さえられていて、著者の皆さまの構成力には脱帽します。初学者の方は、リファレンス系の Python 本とこの本をセットにして学ばれると良いのではないでしょうか。うちの会社でも、今年の新人に早速この本で学ばせています。

目次:

第0日 オリエンテーション

第1日 Pythonはじめの一歩

  • 1時限目 インタープリタを使ってみよう
  • 2時限目 変数とデータ構造について
  • 3時限目 ファイルに保存して実行しよう

第2日 Pythonを本格的に使ってみよう

  • 1時限目 制御構造を理解しよう
  • 2時限目 処理を関数にして流用しよう
  • 3時限目 モジュールを読み込んで処理しよう

第3日 Web APIを使ってみよう

  • 1時限目 Amazon APIを使って書籍情報を取得しよう
  • 2時限目 動作結果のログを出力しよう
  • 3時限目 各地の天気予報を比べよう

第4日 日本語とファイルの扱いを学ぼう

  • 1時限目 日本語について再考しよう
  • 2時限目 Yahoo翻訳APIを使って翻訳してみよう
  • 3時限目 結果をファイルに保存しよう

第5日 便利なツールを作ってみよう

  • 1時限目 アクセスログ解析を作ろう
  • 2時限目 Excelのファイルを読み込んで編集しよう
  • 3時限目 写真を加工しよう

第6日 デスクトップアプリを作ろう

第7日 エラーとテストを学ぼう

  • 1時限目 エラーとトレースバックを学ぼう
  • 2時限目 デパッガとイントロスペクションを学ぼう
  • 3時限目 テストとアサーションを学ぼう

第8日 データベースを操作しよう

  • 1時限目 SQLAlchemyをSQLツールキットとして使おう
  • 2時限目 SQLAlchemyのO/Rマッパーを使ってみよう
  • 3時限目 SQLAlchemyの複数テーブルを操作しよう

第9日 Webフレームワークを使ってフォトログを作ろう

  • 1時限目 Webフレームワークはじめの一歩
  • 2時限目 Pylonsとデータベースを知ろう
  • 3時限目 Webアプリケーションを作ろう

第10日 Google App Engineを使ってフォトログを作ろう

posted by id:junya_hayashi

jQuery

Pyxisではフォーム制御にToscaWidgetsを利用しているのですが、
その中でjQueryを提供しているモジュールがあります。
これを活用しない手はない!とうことでただ今鋭意勉強中…

jQueryで作る Ajaxアプリケーション

jQueryで作る Ajaxアプリケーション

Paste:URLMap で VirtualHost

Paste の URLMap を利用すると VirtualHost と同じようなことができる。

[DEFAULT]
debug = false
email_to = foo@example.com
smtp_server = localhost
error_email_from = foo@example.com

[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000

[composite:main]
use = egg:Paste#urlmap

domain 127.0.0.1 port 5000 = main-app
domain main.example.com port 5000 = main-app
domain dev.example.com port 5000 = debug-app
domain pony.example.com port 5000 = debug-app

[composite:main-app]
use = egg:Paste#urlmap

/ = myapp
/blog = blogapp

[app:myapp]
use = egg:MyApp#main
...

[app:blogapp]
use = egg:BlogApp#blog
...

[app:dev-app]
use = main-app
debug = true

[app:pony]
use = main-app
filter-with = egg:Paste#pony

Paste Deploy のマニュアル に載っていなかったので、これまで domain や port オプションが使えることに気付かなかった。

余談

全く同じ Pylons アプリケーションを、DB 設定や data ディレクトリ設定のみ変えて、複数動かしたい。ハードウェア資源をできる限り有効活用したいのだけれども、上記構成だとたいしてメモリの節約にはならない。かと言って、 pylons.config オブジェクトはアプリケーションの初期化時に一度だけ作られるので、安易には書き換えられない(特に SQLAlchemy 周りで注意が必要)。1つの Pylons アプリで複数サイトを動かすには、 Dynamic に DB 設定や data ディレクトリ設定を変える仕組みをもう少し掘り下げて考える必要がありそうだ。

Posted by id:junya_hayashi

mimetypes.guess_type problem

実行時間を計測してみました。

試行1:

>>> import timeit
>>> setup = "from mimetypes import guess_type"
>>> stmt = "guess_type('test.jpg')"
>>> print timeit.Timer(stmt = stmt, setup = setup).timeit(1000)
4.73700714111

試行2:

>>> import timeit
>>> setup = "import mimetypes"
>>> stmt = "mimetypes.guess_type('test.jpg')"
>>> print timeit.Timer(stmt = stmt, setup = setup).timeit(1000)
0.0164821147919

補足

上記の試行はそれぞれ、インタプリタを起動しなおして実行する必要があります。
コマンドの実行が、モジュールの中身を書き換えてしまうので。

補足2

より簡単なコードで現象を再現すると、以下のようになります。

foo.py

def foo():
    init()
    print "foo called"
    return foo()

def bar():
    print "bar"

def init():
    global foo
    print "initialized"
    foo = bar

試行3:

>>> from foo import foo
>>> foo()
initialized
foo called
bar
>>> foo()
initialized
foo called
bar

試行4:

>>> import foo
>>> foo.foo()
initialized
foo called
bar
>>> foo.foo()
bar

posted by id:junya_hayashi