GML(Graffiti Markup Language)を画像化するレシピ


用意するもの

  • Python と PIL(Python Imaging Library) と lxml
  • GMLデータ

PythonとPIL、lxmlモジュールはシステムパッケージでもソースからの コンパイルでもどちらでもよいです。 以下はUbuntuでインストールする手順です。

$ sudo apt-get python python-imaging python-lxml

GMLデータは #000000book.com から取得したものを使います。

http://000000book.com/data/ から適当なものを取得します。 今回は Tag #148 を使ってみます。

作り方

#000000book.comからデータを取得してPNG形式データを出力するスクリプトは 以下になります。 GmlObject にファイルパスまたはURLを渡してインスタンスを生成し、 それを GmlDrawer にぶっこんで set_canvas_size してから、 draw します。 (日本語じゃなくなってるな。。)

import urllib2
from lxml import etree
import Image
import ImageDraw
import ImageOps


class GmlObject(object):

    def __init__(self, gmlfilename):
        gml = etree.parse(gmlfilename)
        self.xs = [float(i.text) for i in gml.xpath("//pt/x")]
        self.ys = [float(i.text) for i in gml.xpath("//pt/y")]
        self.zs = [float(i.text) for i in gml.xpath("//pt/z")]
        self.ts = [float(i.text) for i in gml.xpath("//pt/time")]
        self.length = len(self.xs)


class GmlDrawer(object):

    def __init__(self, gmlobj):
        self.gmlobj = gmlobj

    def set_canvas_size(self, x=640, y=480):
        self.canvas_x = x
        self.canvas_y = y
        self.canvas_size = (x, y)

    def draw(self, output_filename='test.png'):
        img = Image.new("RGB", self.canvas_size, (0, 0, 0))
        draw = ImageDraw.Draw(img)
        x = [(int(self.gmlobj.ys[i]/1.4*self.canvas_y),
              int(self.gmlobj.xs[i]/1.4*self.canvas_x)) \
                      for i in range(self.gmlobj.length)]
        draw.line(x, fill='rgb(255, 255, 255)', width=5)
        outimg = ImageOps.flip(img)
        outimg.save(output_filename)


def main():
    gmlobj = GmlObject('http://000000book.com/data/148.gml')
    gmldrawer = GmlDrawer(gmlobj)
    gmldrawer.set_canvas_size()
    gmldrawer.draw()

if __name__ == '__main__':
    main()

完成したもの

http://farm5.static.flickr.com/4072/4292262951_943a6a76d9.jpg

上記のようなPNG画像を出力できました。"hello world" って書いてます。

終わりに

GMLは奥行きと時間もデータとして保持しているのでアニメーションもさせたいところです。 面白そうな素材なので今後もウォッチしていこうかと。

では。


Django製のこのBlogにカテゴリってDBコラムを追加してみた


いずれはカテゴリ表示するために、まずはDBを追加。単なるメモです。

$ cp -p blog.db blog.db.bk201001
$ sqlite3 blog.db
> alter table blog_blog add category;
> Ctrl+D
$ vim blog/model.py
from django.db import models
class Blog(models.Model):
    category = models.CharField(max_length = 1000, blank=True)  ## ADD to this code
$ sudo /etc/init.d/apache2 restart

adminで追加されているのまで確認できました。以上、メモでした。


Zsh Completion Function for setup.py その2


先日作成したsetup.py用のZsh補完関数 をsetuptoolsの拡張サブコマンドに 対応してみました。

http://bitbucket.org/hhatto/zshcomp_for_setuppy/changeset/e92d57589d9b/

いちおうやりたいことは実現できたので、少しそっとしておきます。

zshcomp_for_setuppy プロジェクトページ


using SHPAML


SHPAML はHTML/XML/CSSを簡単に生成することができる言語・実装です。 Haml という言語がありますが、それと似たような感じのものです。 HAML for Python ですね。

チュートリアルをみれば使い方はわかると思いますが、 ちょっとだけコードを載せておきます。

from shpaml import convert_text

shpaml_text = """\
html
  head
    title | shpaml sample
  body
    p | Hello SHPAML.
"""
print convert_text(shpaml_text)

出力結果は以下のようになります。

<html>
  <head>
    <title>shpaml sample</title>
  </head>
  <body>
    <p>Hello SHPAML.</p>
  </body>
</html>

終わりに

Chameleon というXMLベースのテンプレートエンジンがあるのですが、 ちょっと肌に合わない感じなのでチュートリアル的に動かしただけで終わりました。 その時に何かないかなぁと思ってPyPIのRSSみてたらちょうどSHPAMLが アップデートされてたので使ってみました。

いいですねぇ。SHPAML。直感的に書けて簡略化できるので 今後かなり使っていくかも。 今のところはHTML生成くらいから使っていこうかな。 hamlみたいにコマンドから使えるといいのにね。


Zsh Completion Function for setup.py


setup.py のサブコマンド(install とか)やオプションをよく忘れるので、 Zsh補完関数を書いてみました。

http://farm3.static.flickr.com/2701/4274000899_0692d0967a.jpg http://farm5.static.flickr.com/4058/4274000717_130c32cf9b.jpg

hhatto / zshcomp_for_setuppy / source . _setup.py — bitbucket.org

補完関数自体の書き方がほとんどわからなかったので、 既にあるcvsコマンドの補完関数を参考に作成しました。 若干意味の無い処理が紛れ込んでいると可能性がありますが、 追々対応していきたいです。

工夫した点

setup.pyのヘルプ表示(--help オプション)を元にして手書きでもいいのですが、 それだとつまんないのでスクリプト組んでみました。

hhatto / zshcomp_for_setuppy / source . get_distutils-option.py — bitbucket.org

参考程度に書くとオプションリストを引き出すには、 以下のようなコードとなります。

from distutils import dist
d = dist.Distribution()
print d.get_command_list()
print d._get_toplevel_options()
print d.get_command_obj('install').user_options

どの辺にオプション処理あるのかなぁと思って、 ちょろっとソーストレースしてみました。 setup.pyにsetuptoolsがインポートされているので setuptoolsをダウンロードして検索してみましたがマッチしない。 あっ、と思って、distutilsを検索しなおしたら無事該当処理が 見つかりましたとさ。 setuptoolsは拡張コマンドをサポートしているので、 それ以外のコマンドについてはdistutilsを見てあげないといけませんね。

おわりに

そもそもがsetup.pyのZsh補完関数ってすでにありそうなんだけどな。。。 ググっても見つかりませんでした。 install しか使わないからそんなに需要無いんかな?

拙作のgenzshcompで生成したかったですが、 サブコマンドとか難しそうなので今回は一時しのぎ的に作成しました。

setuptoolsで拡張したコマンドについても今後対応したいです。 (bdist_egg とか。)


bpythonの設定もろもろ


Zshの設定を見つめ直す


A Happy New Year 2010


Older Blog Posts