ここ最近、PyQtを使って以前公開した株価取得ライブラリのGUI化をやってたら思いの外楽しかったのだけど、インストーラーとかパッケージングとかそのあたりがまあ面倒くさくてまあダルい。
ごにょごにょいろいろ試してようやく動くっぽくなったので忘れないうちに書くけれども、深い理解まで至っていないので間違いがあるかも。
MacとWindowsの両方。
実行環境は、Mac OSX 10.6.8とWindows7。
Pythonのバージョンは2.7.2。当初は3.2でいこうとしていたのだけど、使用ライブラリが3系に未対応だったので2.7.2。

作ったアプリ

ある銘柄の指定期間の株価(当日の高値, 安値, 終値, 出来高)をcsv形式でファイルに書き出すツール。

Mac版はこちら
Windows版はこちら

ソースコードはこちら

レジストリとかは未使用。
SnowLeopardだと微妙にうまく動かないかもしれない。Lionでは問題なし。
QCalendarWidgetを使うと落ちるような。謎。

Mac

使ったもの:py2app

py2appは、フツウにeasy_installもしくはpipからインストール。
サンプルをそのまま実行したら以下のようなエラーが出た。

error: argv-emulation is not supported for 64-bit executables

argv-emulationが何の役割を果たしているのかはよく分かっていないのだけど、いろいろごにょごにょやったあげく最終的にsetup.pyのargv_emulationをFalseにして逃げた。
当初は、universalなPythonだったりQtだったりをインストールして32-bit版で動かそうとしてみたのだけど、まーどうにもうまく動かなかったので諦め。

他はとくに問題なくドキュメント通りにsetup.pyを作成して以下のコマンドを叩いたらパッケージングされた。

$ python setup.py py2app

参考ソース:setup.py

Windows

使ったもの:py2exe, innosetup

py2exeはこのあたりからインストーラをダウンロードしてきてインストール。
innosetupはまずこのあたりから本家をダウンロードしてきてインストール。
手元の環境では、isetup-5.4.2.exeを入れた。
そのあとこのあたりからpywin32をダウロードしてきてインストール。
最後にここからinnosetupのzipをダウンロードしてきて解凍して中身(innosetup.py)を作業ディレクトリに置いた。

こちらもサンプルをそのまま実行するだけではうまく行かず、手元の環境ではinnosetup.pyの794行目あたりのBOMを付けてる部分がどうやら悪さをしているようで、そいつをコメントアウトしたら動作した。
innosetupのChangeLogを見ると0.6.3からBOMをつけてるっぽいのだけど、理由は不明。
コメントアウトしたソースはこちら

あとはサンプル通りにsetup.pyを書いて以下のコマンドを実行するとsetup.exeが作成された。

> c:\Python27\python.exe setup.py innosetup

参考ソース:setup.py

おしまい

簡単そうに見えたのだけど意外とハマりどころが多かったし、ただ単にパッケージングとsetup.exeを作成するだけで1日かかってしまった。
深く理解するとしたらもっとずっとかかると思われる。
クロスプラットフォームなアプリは簡単にかけて良いのだけど、パッケージングの方法がそれぞれ異なるので、なにかと面倒に感じたなあ。

参考

PyQt でクロスプラットフォームなデスクトップアプリケーションを — Kosei Kitahara's Blog
How-to: Deploying PyQt applications on Windows and Mac OS X

 

PyCon JP 2011のセッションで見かけた「PyQtではじめるGUIプログラミング / Tutorial: GUI Programming with PyQt」がとっても良かったので、さっそくPyQtやろうと思って、Macで環境づくりした。

前提

homebrewpythonbrewがインストールされているMac。
homebrewだけでいける気がするけど、どうせだからpythonbrewのとこに入れてみる。

PyQt

Python3.2.1のインストール。

$ pybrew install -nv -j4 --framework 3.2.1
$ pybrew switch 3.2.1

Qtのインストール。

$ brew install qt

PyQtの前にSIPのインストール。

$ wget http://www.riverbankcomputing.com/static/Downloads/sip4/sip-4.12.4.tar.gz
$ tar zxvf sip-4.12.4.tar.gz
$ cd sip-4.12.4
$ python configure.py
$ make
$ make install

PyQtのインストール。

$ wget http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-mac-gpl-4.8.5.tar.gz
$ tar zxvf PyQt-mac-gpl-4.8.5.tar.gz
$ cd PyQt-mac-gpl-4.8.5
$ python configure.py
$ make -j4
$ make install

Qtのドキュメント

homebrewでqtをインストールしたときに一緒に入るっぽい。Assistant.appとかDesigner.appとか。

とりあえずホームディレクトリのApplicationsにAssistant.appのリンクを作って、それを起動する形にした。

$ cd ~/Applications/
$ ln -s /usr/local/Cellar/qt/4.7.3/bin/Assistant.app Assistant.app

おしまい

ひさびさのGUI。PyQtなにかと楽でいいわあ。

 

株価取得ツールのjsmをバージョン0.2に更新した。

今回の更新では、APIの整理と少しのバグ修正を行った。APIの整理をしたことで多少は使い勝手がよくなったと思われる。

今までは取得対象ごとにクラスのインスタンスを作成してメソッドを呼び出す形だったのだけれども、今回の修正でインスタンスの作成は1度きりで良くなって、そのインスタンスが全てのデータにアクセスできる形になった。

before:

from jsm.quotetoday import QuoteToday
from jsm.finance import Finance
q = QuoteToday()
q.get(4489)
f = Finance()
f.get(4489)

after:

import jsm
q = jsm.Quotes()
q.get_price(4489)
q.get_finance(4489)

Facadeパターンを適用したみたいな。
厳密に正しいか分からんけど。

そんな感じ。

 

Yahoo!ファイナンスから株価や財務データをスクレイピングして取得するライブラリをPyPIに公開した。
名前は、jsmといってjapanese stock marketの略。

このプログラムは去年の12月ぐらいにぼんやり書いてそのまま放置していたブツなのだけど、わりとまじめに作ったわりにこのまま放置するのは、なんかもったいないような気がしないでもなかったので、とりあえず公開した。

使い方は簡単で、証券コードをAPIにわたすだけといった感じなのだけど、まぁ例で示した方が分かりやすいと思うので、インストールから株価データの取得までをコードで示す。

インストール

PyPIにアップしたので、easy_installまたはpipでインストールするのが簡単。

$ easy_install jsm

これでjsmの最新版とBeautifulSoupとhtml5libがインストールされる。

株価取得

あくまでライブラリなので、Pythonのコードがかける人しかまぁ使えないけど、以下のような感じで呼び出すことでスクレイピングしてきてくれる。

$ python
Python 2.7.2 (default, Jul 18 2011, 22:43:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from jsm.quotetoday import QuoteToday
>>> q = QuoteToday()
>>> q.get(9984)
<date:2011-08-09 00:49:00.328744 open:2776 high:2808 low:2731 close:2749 volume:6460000 adj_close:2749>

おしまい

他にも業種別銘柄一覧を取得したり、財務データを取得したりもできたりするけど、興味ある人はGitHubのREADMEなりソースコードなりみてくさい。

 

Python + Flaskでサンプルアプリを書いてfluxflexにデプロイしてみたら、思いの外使い勝手が良かった。

fluxflex

fluxflexとは、クラウドホスティングサービスのひとつ。
Platform as a Service、略してPaaSなどと呼ばれてるサービス。

競合するサービスにdotcloud, Heroku, GAEなどが存在してる。
複数の言語(いまのところPHP, Ruby, Python, Perl, Node.js, Haskell)が利用できて、フレームワークも好きなものが使えて、FastCGIで動く。
個人的な印象で言えば、dotcloudに近いものを感じる。

dotcloudは、規定のクライアントをインストールして、基本コンソールでデプロイしたりなんやかんやする形だけど、fluxflexは、Githubにソースコードが存在していたらボタン1つでデプロイすることが出来る。
なので、お手軽度からいったら断然fluxflex。
sshにログインできたりとかできそう?な感じはするけど、まだ試していない。
cronの設定なんかもできるならパーフェクトな気がする。

Github連携と共有

Githubにソースコードがあったらボタン1つでデプロイすることが出来る。
試しにFlaskで動くサンプルを書いてみた。
https://github.com/utahta/flask-on-fluxflex
このURLを設定してボタンを押すだけでデプロイされるという、おそろしく簡単な仕組みが構築されている。

さらに凄いのが、このコードをライブラリとして提供することが可能で、みんなで共有できることだ。
自分が書いたようなサンプル野良アプリを共有すると、どんな良いことがあるのかは、まぁよく分からない。
けど、WordPressやRedmineなどのキチンとしたアプリが共有されているとなると話は違う。
これらもボタン1つでデプロイすることが可能で、無料ユーザーは3つまでプロジェクトの作成が認められているので、3つまでOSS用のRedmineを無料で立ち上げることが出来たり、WordPressでブログを書いたりすることが出来る。
もはやレンタルサーバにいくらか払ったり、自宅サーバを管理したりする必要はないわけだ。
(もちろん一定量のアクセスを超えたら課金が必要になるけれども)

ちなみに共有済みのライブラリは、こちらのページのSharedというところから確認できる。

自分が試しに共有してみたのが、これ
現在、5回ほどインストールが試みられているようだ。
こんななんでもないアプリでも共有可能だとすると、どんどんアレなライブラリが増えていってしまいそうなので、タグ付けとか、いろいろ絞り込みできるようになると、さらに便利かもしれない。
まぁ数が増えていくにつれなんらかの対応は入るだろう。

おわり

昨今話題のfluxflexを試してみた。
dotcloudよりもお手軽で分かりやすく料金も安い。
なによりも無料で気軽にアプリを試せる環境が増えたことは、とても嬉しい。
今後に期待!

 

その1はこちら
pythonbrewってなんぞ?という人は、こちらも併せて見ると良いかもです。

その2では、pythonbrew-0.9で追加したbuildoutとvenvコマンドについて解説します。

概要

buildout : buildoutをラップしたコマンド。
venv : virtualenvとvirtualenvwrapperをラップしたコマンド。

buildout

pythonbrewの管理下にあるPythonを使って、buildoutを実行するコマンド。
bootstrap.pyのダウンロードから./bin/buildoutまで、多少面倒な部分を代わりにやってくれます。

zc.buildoutを知っていれば、とりあえず使用例を見れば大体なにをやっているか分かると思います。
以下は、buildout.cfgの置いてあるディレクトリprojへ移動し、`pybrew buildout`を実行したコマンドの履歴。

$ cd proj
$ ls
buildout.cfg
$ pybrew buildout
Using Python-2.7.2
Downloading bootstrap.py as /Users/utah/.pythonbrew/dists/bootstrap.py
######################################################################## 100.0%
Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.19.tar.gz
Extracting in /var/folders/hO/hO8hMlByFNqghdPKssrR7U+++TI/-Tmp-/tmpT0oTyw
Now working in /var/folders/hO/hO8hMlByFNqghdPKssrR7U+++TI/-Tmp-/tmpT0oTyw/distribute-0.6.19
Building a Distribute egg in /var/folders/hO/hO8hMlByFNqghdPKssrR7U+++TI/-Tmp-/tmpCuNaFk
/var/folders/hO/hO8hMlByFNqghdPKssrR7U+++TI/-Tmp-/tmpCuNaFk/distribute-0.6.19-py2.7.egg
...

-pオプションでPythonのバージョンを指定することもできるます。
pythonbrewで完結できるのが楽でいいですね。

venv

こちらは、pythonbrewの管理下にあるPythonを元に独立したPython環境を作ったり消したり使ったりするコマンドです。
中身は、virtualenvvirtualenvwrapperをラップしたもので、大したことはやってません。

virtualenvwrapperがまだPython3に対応していなくて、予めPython2系をインストールしていないと使えない制限があります。

仮想環境は、インストールされているPythonのバージョンごとにワークディレクトリを分けて作られます。
ここらへんは、rvmのgemsetっぽくしてみた感じです。

使い方は、役割ごとに箇条書きにしました。
事前にpythonbrewでPython-2.7.2とPython-3.2をインストールしているものと仮定しています。
あと独立したPythonの環境のことを仮想環境と呼んでます。

・仮想環境の作成
デフォルトでは、現在使用中のPythonを元に仮想環境が作られます。
構文: `pybrew venv create プロジェクト名`

$ pybrew venv create hoge
# Create `hoge` environment into /Users/utah/.pythonbrew/venvs/Python-2.7.2
Already using interpreter /Users/utah/.pythonbrew/pythons/Python-2.7.2/bin/python
New python executable in hoge/bin/python
Installing setuptools............done.
Installing pip...............done.
...

-pオプションで、指定のPythonを元にした仮想環境が作られます。

$ pybrew venv create hoge3 -p 3.2
# Create `hoge3` environment into /Users/utah/.pythonbrew/venvs/Python-3.2
Running virtualenv with interpreter /Users/utah/.pythonbrew/pythons/Python-3.2/bin/python
New python executable in hoge3/bin/python
...

・仮想環境の確認
いままでに作成した仮想環境を一覧にして表示します。
デフォルトでは、現在使用中のPythonを元にした仮想環境の一覧が表示されます。
構文: `pybrew venv list`

$ pybrew venv list
# virtualenv for Python-2.7.2 (found in /Users/utah/.pythonbrew/venvs/Python-2.7.2)
hoge

-aオプションで、全ての仮想環境の一覧が表示されます。

$ pybrew venv list -a
# virtualenv for Python-2.7.2 (found in /Users/utah/.pythonbrew/venvs/Python-2.7.2)
hoge
# virtualenv for Python-3.2 (found in /Users/utah/.pythonbrew/venvs/Python-3.2)
hoge3

・仮想環境を使用
作成した仮想環境を使うってそのまんまですね。
virtualenvwrapperでいうところの`workon hoge`をします。
構文: `pybrew venv use プロジェクト名`

$ pybrew venv use hoge
# Using `hoge` environment (found in /Users/utah/.pythonbrew/venvs/Python-2.7.2)
# To leave an environment, simply run `deactivate`
...
 
$ pybrew venv use hoge3 -p 3.2
# Using `hoge3` environment (found in /Users/utah/.pythonbrew/venvs/Python-3.2)
# To leave an environment, simply run `deactivate`
...

・仮想環境の削除
作成済みの仮想環境を消します。
構文: `pybrew venv delete プロジェクト名`

$ pybrew venv delete hoge
# Delete `hoge` environment in /Users/utah/.pythonbrew/venvs/Python-2.7.2

おわり

pythonbrewとbuildout, virtualenvの親和性が微妙に上がった気がします。
venvは、rvmのgemsetを目指してそれっぽいものが出来たかなーと思いつつ。
フィードバックは、以下までよろしくお願いします。
utahta/pythonbrew – GitHub

 

プログラミング書籍をソーシャル的に人気っぽい物から順位付けするランキングサイトをつくりました。

Amazon Social Book Ranking

PHPやPerlやRubyやPythonやCやC++やJavaなどの有名どころっぽい言語をわしゃわしゃっとまとめてます。

使いどころなんてあってないようなもんですけど。

例えばですけど。

PHP本のランキングをチラ見すると、よくわかるPHPの教科書パーフェクトPHP (PERFECT SERIES 3)が注目されているみたいです。

はてぶとかツイッターとかフェイスブックとかで、ですね。

注目されるには、なにか良かったり悪かったり、それなりに理由があるんだと思います。

それは、もしかしたらあなたがよりよい良書、もしくは悪書を見つけるときのヒントになるかもしれません。
(そしておれにアフィが入る可能性が高まるのかもしれません…)

これをもっとうまく積極的にやっているのが、goodreadsだったり…。

ちなみにこのこは、dotcloudやFlaskやSQLAlchemyやその他もろもろ含めた習作です。

dotcloudは、無料でデプロイできるのでスーパー節約できて良いですね。
アクセスが大量にきたらそうはいきませんけど、こんなもんじゃほとんどないでしょうし。(T ∀ T)

ソースコードも公開しました。Githubに。

よかったら見てください。

 

最近、AmazonのProduct Advertising APIをPythonでごにょごにょするということをやっていて、ある程度やり方というかライブラリを見つけたりとかしたので、忘れないように書き残しておきます。

1.Product Advertising API への登録

ここから登録します。
登録が完了するとアクセスキーとシークレットキーが配布されます。

もしアクセスキーを忘れるなどして分からなくなったら、ここからアカウント→セキュリティ証明書と辿って確認できます。

2.Pythonライブラリ選択

Product Advertising APIをうまくラップしていつつ簡単に使えそうなライブラリとして、bottlenoseを選んでみました。

選んだ理由は、探した中で最もシンプルかつ実装の把握が容易で、さらに開発が比較的活発と思われたからです。
(他にもっといいのがあれば教えてください)

3.インストール

bottlenoseをインストールします。
残念ながらPyPIに上がっているbottlenoseは、バージョンがかなり古いようで、日本語(というかマルチバイト文字列)がうまく扱えません。
けれども、GitHubの最新版だと問題ないので、GitHubからソースをダウンロードして、インストールします。

$ curl -L https://github.com/dlo/bottlenose/tarball/master -o bottlenose.tgz
$ tar zxvf bottlenose.tgz
$ cd dlo-bottlenose-xxxxxxx
$ python setup.py build
$ python setup.py install

また、bottlenoseはAmazonのAPIを叩いて取得したXMLデータを自動でオブジェクト化したりはしてくれないので、そのあたりを自分で面倒見る必要があります。
世の中には、XMLからオブジェクトを作成するlxmlという便利なライブラリがあるので、それを今回は使います。

$ pip install lxml

4.商品検索

準備が整ったところでAmazonの商品を検索してみます。
サンプルとして、Amazonのブックカテゴリを対象に「東野圭吾」を検索してみました。
そのコードがこちら。
(access_key_idとsecret_access_keyには、登録時に配布されたものを入れます)

そして結果がこちら。

$ python sample.py
真夏の方程式
秘密 (文春文庫)
麒麟の翼 (特別書き下ろし)
悪意 (講談社文庫)
赤い指 (講談社文庫)
夜明けの街で (角川文庫)
ダイイング・アイ (光文社文庫 ひ 6-11)
流星の絆 (講談社文庫)
白夜行 (集英社文庫)
さまよう刃 (角川文庫)

すばらしく簡単です。

5.参考

Product Advertising APIのドキュメント

 

pythonbrewvirtualenvを使ってPythonの開発環境を整えてみました。
ツールの詳しい説明は、リンク先を見てくださいということではぶきます。
続きました→ その2

対象

環境:LinuxやFreeBSDなど。Bourne Shell系(bash, ksh, zshは確認済み)
人:Pythonインタプリタのインストールを手動でしたくない上に複数のバージョンを切り替えて使いたい人。

1.pythonbrewのインストール

ざっくり言って、Pythonインタプリタのインストールを楽にするツールです。
これがないと、このエントリの意味が分からないので、とりあえずインストール方法の解説からしていきたいと思います。

以下のコマンドを実行すると、pythonbrew一式がインストールされます。

$ curl -kL http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install | bash

インストールが終わったら、有効化します。

$ echo "source ~/.pythonbrew/etc/bashrc" >> ~/.bashrc
$ source ~/.bashrc

以上です。
csh, tcshは、未対応です。ごめんなさい。

2.Pythonインタプリタのインストール

Python-2.6.6と3.2を使うという想定で、その2つをインストールします。
pythonbrewと打つのが面倒くさい人は、pybrewというショートカットコマンドを使えばいいと思います。

$ pybrew install -f 2.6.6 3.2

-fはmake testをスキップするオプション。
仕様が変わりました。-nがmake testをスキップするオプションで、-fはmake testが失敗しても気にしないオプションになりました。
さっさとインストールを終えたい人は、-fと-nをオススメ。
makeをもっと早くしたい人は、-jというオプションもあるので試してみてください。ジョブ数が指定できます。

以上で、なにごともなければ、Python-2.6.6と3.2がインストールされます。

*** 2011/0722 追記 ***
ここから先に書いてる事は、その2で解説しているvenvというコマンドで置き換え可能です。
特に拘りがなければ、そちらの利用をオススメします。

3.virtualenvをインストール

いろいろする前に、Python-2.6.6の環境を有効にします。

$ pybrew switch 2.6.6

これで、2.6.6環境のpythonやらpipをデフォルトで使うようになります。

virtualenvとvirtualenvwrapperをインストール。

$ pip install virtualenv virtualenvwrapper

2.6.6環境にvirtualenvとその仲間がインストールされました。

続いてvirtualenvwrapperの設定をしますが、その前にPython-2.6.6と3.2へのシンボリックリンクをつくっておきます。
のちのち、楽をするためです。

$ pybrew symlink

これで、py2.6.6, py3.2という名前のシンボリックリンクがつくられました。
ちなみに、なぜpy2.6.6みたいな名前か?
とくに意味はありません。
GitHubのIssuesに対応したらこうなりました。
つかいやすいので文句もありません。

もいっこシンボリックリンクを作成します。

$ pybrew symlink -d 2.6.6 virtualenvwrapper.sh

これで、2.6.6環境のvirtualenvwrapper.shが、どの環境のvirtualenvwrapper.shよりも優先的につかわれます。

一応、VIRTUALENVWRAPPER_PYTHONの設定もしときます。
うっかりpybrew switch <別のバージョン>としたときもこれで安心。

$ echo "VIRTUALENVWRAPPER_PYTHON=py2.6.6" >> ~/.bashrc

最後に、virtualenvwrapperを有効化します。

$ echo "source ~/.pythonbrew/bin/virtualenvwrapper.sh" >> ~/.bashrc
$ source ~/.bashrc

4.仮想環境を作成

それぞれ仮想環境をつくります。

Python-2.6.6の仮想環境をつくる。

$ mkvirtualenv -p py2.6.6 hoge1

Python-3.2の仮想環境をつくる。

$ mkvirtualenv -p py3.2 hoge2

シンボリックリンクが活きてますね。

5.なにかを開発

開発環境は、ととのいました。
あとは、つくりたいものをつくるだけです。

Python-2.6.6環境で何かつくるとき。

$ workon hoge1

Python-3.2環境で何かつくるとき。

$ workon hoge2

開発環境から抜けるとき。

$ deactivate

以上、pythonbrewとvirtualenvの合わせ技で、Pythonの開発環境を構築するエントリでした。

 

今更ながら「大規模サービス技術者入門」を読み返したんだす。

AhoCorasickのこと今までアホコラシックて読んでたけど、
正しくはエイホコラシック(Wikipedia調べ)だそうなんだす。

ソースコード -> pyahocorasick

failure linkを作るところを理解するのに時間がかかった。
トライ木を構築した後、根から順繰りに次ぎのノードを見てって、最長接尾辞を決定するところ。
再帰でつくってみた。

最終的にこんな感じでテスト。

参考

Aho Corasick 法 – naoyaのはてなダイアリ