PythonでのORマッパー:SQLAlchemy

Pythonでデータベースを扱うときには,ORマッパーが便利.
ORマッパーとは,Pythonのクラスのインスタンスとデータベースのレコードとを対応付けるもの.
これを使うと,DBアクセスがとても簡単になるし,SQLを書かなくてすむ.
使用例

from sqlalchemy import Table, Column, Integer, String, Date
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
class User(declarative_base()):
    __tablename__ = 'observation'
    id = Column(Integer, primary_key=True)
    date = Date()
    pos_x = Integer()
    pos_y = Integer()
    def __init__(self, date, x, y):
        self.date = date
        self.pos_x = x
        self.pos_y = y
    def __repr__(self):
return "<Task('%s', '%d', '%d')>" % (self.date, self.pos_x, self.pos_y)

こんな感じで,クラス定義にちょこっと追加するだけで,このクラスに対応したデータベースが作成される.

Rubyスクリプト中から別のRubyスクリプトを呼び出した時の標準出力

Rubyスクリプトから別のRubyスクリプトを呼び出したい時がある.
そういう場合,

msg=`hoge.rb`

とすると,hoge.rbが標準出力へ出力した文字列すべてを変数msgで受け取ることが出来る.
1行ずつ受け取って処理したい場合は,

IO.popen("hoge.rb") do |pipe|
    pipe.each do | line |
         print line
    end
end

という感じにすれば,1行ずつとって表示することが出来る.
しかし,デフォルトだと,Rubyスクリプトの標準出力はバッファリングされるため,hoge.rbの処理に時間がかかる場合,長い時間立った後に,まとめてhoge.rbの出力をどかっと渡されるようになる.
(受け取ったプログラムは,それを1行ずつ処理することはできるけれど)
これは標準出力がバッファリングされているのが原因なので,バッファリングしないようにすればOK.
つまり,呼び出される側のスクリプトhoge.rbの最初に,

STDOUT.sync = true

と書けば良い.
[Ruby] Rubyの標準出力をバッファしないを参考にしました.)
これで,ばっちり動く.
例(STDOUT.sync=trueの有無での挙動の違いを確認)
呼び出される側:hoge.rb

#!/usr/bin/ruby
STDOUT.sync = true
puts "hoge"
sleep 3 # 長時間かかる処理
puts "hoge"

呼び出す側:main.rb

#!/usr/bin/ruby
puts "start"
IO.popen("test.rb") do |f|
        f.each do |line|
                print line
        end
end
puts "finish"

SubversionユーザがMercurialを使ってみた

Subversionといえば,かなり有名なバージョン管理システムです.
また,MercurialはPythonで書かれている,最近よくみかける分散リポジトリ型のバージョン管理システムです.
それぞれがどんな物かはここでは触れませんので各自調べてください.
今回は,中央リポジトリとしてSubversionを使い各自のローカルにリポジトリをMercurialで持つ,いいかえれば,Mercurialとしてリポジトリを管理するけどもマスターリポジトリとしてSubversionのリポジトリを利用する方法について説明します.
これをやるには,gitの場合だとgit-svnというのがあるように,HgSubversionというのがあります.
それをeasy_installで入れるだけでOK.
sudo easy_install hgsubversion
これで,hgにsubversionの拡張が入ったはずです.
次に,設定ファイル ~/.hgrc に,hgsubversion…eggをインストールしたパスを指定します.
Macの場合,~/.hgrcに以下を追記します
[extensions]
hgsubversion=/Library/Python/2.7/site-packages/hgsubversion-1.3-py2.7.egg/hgsubversion/

あとは,
hg clone svn+http://hogehoge/fuga .
とか
hg clone svn+ssh://hogehoge//fuga .
とやれば,Subversionのリポジトリからhgのローカルリポジトリを作成できるはず!

Macでnumpyモジュールのインストール

Pythonのモジュールはeasy_installを使ってインストールしています.
easy_install nose
easy_install numpy

という感じ.
ただし,numpyはインストールする際にCのコード,Fortranのコードのコンパイルが必要です.
ここで詰まったのでメモ.
Cのコードのコンパイル
Cのコードをコンパイルするためには,Python.hが必要です.
Python.hは /usr/include/python2.7/Python.h にありますが,インクルードのパスが通ってないので,Python.hがないと言われます.
なので,
sudo ln -s /usr/include/python2.7/Python.h /usr/include/Python.h
してやります.
Fortranのコードのコンパイル
デフォルトではFortranコンパイラのgfortranが入っていないので,
http://hpc.sourceforge.net/ から,gfortran-lion.tar.gzを取ってきて,
sudo tar zxvf gfortran-lion.tar.gz /
してやります.
この2点を済ませば,numpyがインストールできると思います.