2008年6月30日月曜日

validator in TG

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Schemaをつかったほうがよいですな。methodにGETをつかっていて、同じ引数をとるメソッドをvalidateしたい場合とか。

今回はformでimage生成のparameterを受け取るメソッドと、imageを生成するメソッドの両方をvalidateしたかったのですが、当然両者は同じvalidatorを使う必要があって、それを共通コードとして抜き出すためにはSchemaを使う必要があったわけです。

個人的にはformにvalidatorをセットするのはあまり趣味じゃないです。TG/cherrypyはメソッドにparameterが「降って来る」ので、メソッドをvalidatorでガードするような書き方が趣味に合っています。

ugettext in TG

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
python setup.py test
はおかしくなるが
nosetest
だと大丈夫。くだらないことではまった。


strange validator behaviour


Seems to have something to do with the obscure trickery of translating
messages in FormEncode and TurboGears. There is a special version of
gettext in Turbogears that can handle an additional domain parameter.
FormEncode and TurboGears switch between the gettext versions. The
Validator class has a class attribute dictionary gettextargs which is
used as a parameter for gettext. If the standard version of gettext is
called with that parameter, it throws that exception.

2008年6月27日金曜日

RangedInt Validator

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
上限と下限をチェックできる整数値のValidatorを書いてみた。formencodeになんでないのかねぇ。
ひょっとして組み合わせて作れるのかな?しかしこの程度ならprimitiveとしてライブラリにあってもいい気がする。


82 class RangedInt(formencode.validators.Int):
83 """
84 Convert a value to an integer.
85
86 Example::
87
88 >>> Int.to_python('10')
89 10
90 >>> Int.to_python('ten')
91 Traceback (most recent call last):
92 ...
93 Invalid: Please enter an integer value
94 """
95 not_empty = True
96 min = None
97 max = None
98
99 messages = {
100 'integer': "Please enter an integer value",
101 'tooLarge': "Enter a value %(max)i or less",
102 'tooSmall': "Enter a value %(min)i or larger",
103 }
104
105 def _to_python(self, value, state):
106 try:
107 iv = int(value)
108 except (ValueError, TypeError):
109 raise Invalid(self.message('integer', state),
110 value, state)
111 if (self.max is not None and value is not None
112 and iv > self.max):
113 raise Invalid(self.message('tooLarge', state,
114 max=self.max),
115 value, state)
116 if (self.min is not Nonejavascript:void(0)
117 and (not value or iv < self.min)):
118 raise Invalid(self.message('tooSmall', state,
119 min=self.min),
120 value, state)
121 return iv
122
123 _from_python = _to_python

2008年6月25日水曜日

人間の時間、コンピュータの時間。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
HPC用最適化 @ Ruby

 このような実装はHPCに最適化された処理系と比較すると遥かに低速であるが、人間がフルHPC対応の処理系で3日かけてプログラミングした後に実行時間1時間で結果を得る代わりに、人間がRubyを使って1日でプログラミングして実行時間1日で結果を得れば、むしろ1日の得になるという点に着目している。

大事な着目である。人間を含めた系でのアムダールの法則。

PILでimageを生成するcgi

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
実装する際に、

  • Image::tostring(format, parameter)
  • Image::save(file object or path, format)

という二つの選択肢があるが、前者はgif, pngで機能しない。

TurboGearsだとこんなコードになる。

@expose(content_type='image/jpeg')
def jpeg(self):
buf = StringIO.StringIO()
[ここでimageを生成]
assert image.mode == 'RGBA'
image.save(buf, 'jpeg')
return buf.getvalue()


参考
画像ファイル関係 (PIL) @ kei@sodan

2008年6月20日金曜日

PerlとLinux v.s. PythonとOpenBSD

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
思想とライセンスの関係をふと感じたのですよ。かかわっている開発者の数が違うだろうから
なんともいえませんが、Linuxは、変異の速度がやたら速い生物みたいな感じですね。で、どんどん淘汰されてもっとも適応した子孫が生き残る・・・。

Linux:
GPLv2
what I can tell is that there no "one right way".

Perl:
GPL/AL
There's More Than One Way To Do It.


Python:
PIL
There should be one-- and preferably only one --obvious way to do it.
http://www.python.org/dev/peps/pep-0020/

OpenBSD
We want to make available source code that anyone can use for ANY PURPOSE, with no restrictions
Be as politics-free as possible; solutions should be decided on the basis of technical merit.
http://www.openbsd.org/goals.html

2008年6月18日水曜日

2008年6月16日月曜日

構成管理ツール

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
現状はsubversionをつかっているが、状況が変わっていないか軽くチェック。
候補たち。$が必要なものはもちろん入りません。
  • git

  • mercurial

  • どっちも触っておいていいと思うけどね。まあmercurialかなぁ。集中タイプはsubversionをリプレースできるようなものがでてくるのかな。ただ、日本語の扱いとwindows上で少々ナンがあるかな、あとcygwinを要求しないでほしい。どっちもtracのpluginがあるようなので、そのへんは特に心配することはなさそうだ。

    あと半年もしたらmercurialはいいところまで到達しそうだ。

    ほかはブックマークに入れた。/.Jは、まあ、調査の出発点ですな。しかし管理ツールを入れないもしくはVSSをつかっている人がいるというのは理解できない。マゾ過ぎる。

    久々にKernel Build

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    rpm -ihv src.rpmして~/rpmbuild下でrpmbuild -baしてできたBUILDを観察中

    * realtekのパッチはそのまま持ってくるしかないようだ。カーネルのほうがサイトで手に入るdriverより明らかに古い
    * 3wareは差が縮まったがまだ違いがある。おかげで差分をとってから再パッチしてあげないと多分あたらない。
    * PCI周り。変わりすぎていてパッチ適用不能。

    うーむ今回は場所ごとにpatchを分けてつろう。当たり前だが当てにくくてしょうがない。

    2008年6月13日金曜日

    どんどんかけなくなる。

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    指が文法忘れてる・・・。あまりのへたれ加減に投稿する気も起きず。


    #include
    #include


    int main(int argc, char **argv){
    int ord[256];
    int i;
    FILE *fp;
    char c;

    for(i=0; i< 256; i++)
    ord[i] = 0;
    if (argc < 2){
    printf("give me file to count.");
    return 1;
    }

    fp = fopen(argv[1], "r");
    while (fread(&c, 1, 1, fp))
    ord[c]+=1;
    for(i = 0; i < 256; i++)
    printf("%i %i\n", i, ord[i]);
    fclose(fp);
    }

    2008年6月6日金曜日

    ふしだらなclass

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    ちょっと寿命が縮みそうなクラスです。正しく使えば強力でしょうが。
    数行のスクリプトを書くならこの方が幸せかな。

    In [3]: class Hoge(object):
    ...: def __setattr__(self, name, value):
    ...: self.__dict__.update({name: value})
    ...:
    ...:

    In [4]: h = Hoge()

    In [5]: h.x =1

    In [6]: h.
    h.__class__ h.__init__ h.__setattr__
    h.__delattr__ h.__module__ h.__str__
    h.__dict__ h.__new__ h.__weakref__
    h.__doc__ h.__reduce__ h.x
    h.__getattribute__ h.__reduce_ex__
    h.__hash__ h.__repr__

    In [6]: h.x
    Out[6]: 1

    今日の懺悔

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    pythonで

    class Hoge(object):
    def foo(self):
    self.piyo = 1

    ができないと思っていた。__init__の中だけだと思っていたが違う。


    In [1]: class Hoge(object):
    ...: def foo(self):
    ...: self.piyo = 1
    ...:

    In [2]: h = Hoge()

    In [3]: h.piyo
    ---------------------------------------------------------------------------
    exceptions.AttributeError Traceback (most recent call last)
    /home/nori/Desktop/work/wxpygammon/src/

    AttributeError: 'Hoge' object has no attribute 'piyo'

    In [4]: h.foo()

    In [5]: h.piyo
    Out[5]: 1


    まあ、必然的な理由がない限りやらないほうが、混乱を避けられるから好ましいだろうが。

    メソッド内と外部からでは__dict__へのアクセスレベルが違うということだろう。
    外からでは__dict__に対してkey Errorになるようなupdateをかけられない。
    また、メソッド内での代入typoには注意したほうがいいですね。

    7.6 クラス定義

    プログラマのための注釈: クラス定義内で定義された変数はクラス変数です; クラス変数は全てのインスタンス間で共有されます。インスタンス変数を定義するには、__init__() メソッドや他のメソッド中で変数に値を与えます。クラス変数もインスタンス変数も ``self.name'' 表記でアクセスすることができます。この表記でアクセスする場合、インスタンス変数は同名のクラス変数を隠蔽します。変更不能な値をもつクラス変数は、インスタンス変数のデフォルト値として使えます。新形式のクラスでは、デスクリプタを使ってインスタンス変数の振舞いを変更できます。

    2008年6月1日日曜日

    alphaのあるimageを重ねて描画する。

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

    wx.Image::Pasteをしても駄目。

    wxEmptybitmap, blit and transparency

    MemoryDCにDrawしてしまうのが簡単。

    追記:
    - EmptyBitmap全体に描画しないと画像にゴミが残る・・・。
    - MemoryDCといえどもPaintDCと同時に存在できない(Windows)。


    import wx

    class MyFrame(wx.Frame):
    def __init__(self, parent):
    wx.Frame.__init__(self, parent)
    bitmap = wx.EmptyBitmap(400, 400)
    dc = wx.MemoryDC()
    dc.SelectObject(bitmap)
    other = wx.Image('other.jpg', wx.BITMAP_TYPE_JPEG)
    dc.DrawBitmap(other.ConvertToBitmap(), 0, 0)

    chip = wx.Image('chip.png', wx.BITMAP_TYPE_PNG)
    dc.DrawBitmap(chip.ConvertToBitmap(), 0, 0)
    self.bitmap = bitmap
    self.Bind(wx.EVT_PAINT, self.OnPaint)
    self.Show()

    def OnPaint(self, evt):
    dc = wx.BufferedPaintDC(self)
    dc.SetBackground(wx.Brush('sky blue'))
    dc.Clear()
    dc.DrawBitmap(self.bitmap, 0, 0)


    app = wx.PySimpleApp()
    frame = MyFrame(None)
    frame.Show()
    app.MainLoop()