« 2009年07月 | メイン | 2009年11月 »

2009年10月 アーカイブ

2009年10月06日

Ruby + GDB

Rubyで書いたデーモンプログラムがどこかでDeadlockして止まっているのだけどGDBではRubyインタプリタのバックトレース見れないしどこで止まってるのかよくわからない、という経験をした方はいらっしゃるかと思うのですが、そういう場合にはGDBとRuby用のGDBスクリプトを使うと結構いい感じです。

代表的なものとして
http://github.com/michaelklishin/gdb-macros-for-ruby
などから取得してきたスクリプトを~/.gdbinitに追加しておけば、あとはデッドロックしているプロセスにgdb -p pidでアタッチして、GDB内でrb_backtraceなりrb_raiseなりを実行するとバックトレースが取れます。Googleで検索すると、他にもいくつかスクリプトがあるようです。

Pythonでも同じようにGDB用のスクリプトが用意されているようです。
http://wiki.python.org/moin/DebuggingWithGdb

不意にRubyがC Extention内などでSEGVってしまった場合などでも同様にインスぺクションが可能ですので、なかなか便利なように思います。

追記:コアを取るようにしていた場合はもちろんコアダンプの解析にも使えますね。

2009年10月21日

SQLAutocode

普段はなんぞRubyだのObjective-Cだの書いているのですが
少々諸般の都合(主にRubyに疎行列ライブラリがあんまりない!)で久々にPythonを使っています。
で、既存のDBからデータを取ってくるために
SQLAlchemyを使おうと思ったのですが、SQLAlchemyはどうやらスキーマ定義が必要らしく、
まあSQLSoupを使えばなんとでもなるようなのですが微妙に気に食わなかったため、
DBからリバースエンジニアリングでスキーマ定義ファイルをつくってくれるのはないかなーと探したところ、
SQLAutocodeというのを使えばよいみたいでした。

http://turbogears.org/2.1/docs/main/Utilities/sqlautocode.html

使い方は


easy_install sqlautocode
sqlautocode -d -o model.py sqlite:///moviedemo.db
とかするだけです。
べりー簡単ですねえ。

追記:relationはどうにもならないので手で書いて上げる必要があります。

PythonでHTMLのスクレイピング:scrapemark

一個前のエントリと関連して、PythonでWebサーバ上のHTMLをスクレイピングしてくるべーということをやろうとしたのですが、これはScrapemark : http://arshaw.com/scrapemark/docs/examples/というのを使うと大変簡単にできました。

使い方はまあ簡単で


>>> scrape("""
<div id='content'>
{{ before_table }}
<table />
</div>
""",
url="http://example.com")

>>> {'before_table': 'Look at these data points'}

みたいなかんじです。
HTMLの繰り返しになっているところの中身をリスト化してとってくることもできます。これは


>>> scrape("""
<body>
{*
<div class='section' id='{{ [section_ids] }}' />
*}
</body>
""",
html)

>>> {'section_ids': ['nav', 'content', 'footer']}

というかんじで大変使い勝手が良いですねー。開発元のexampleを見ると、もっと構造化したデータも取ってこれるようです。
RubyでNokogiriとかするより楽な気が致しますねえ。

あと、スーパー便利な事に結果にはユニコード化された文字列が入ってきますので扱いも楽ちんです。