2008年3月31日月曜日

import .. in python but 2.4 or before(2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
my implementation ended up with following code....

import os
import sys
import imp

def module(root_path, module_name, locals):
# avoid reload, do not import twice.
try:
return sys.modules[module_name]
except KeyError:
pass

if os.path.isabs(root_path):
base_path = os.path.normpath(os.path.dirname(root_path))
else:
path = os.path.dirname(os.path.abspath(locals['__file__']))
base_path = os.path.normpath(os.path.join(path, root_path))

search_paths = [base_path]
package_name = ''
for m in module_name.split('.'):
mod = import_one(search_paths, m)
if package_name:
setattr(locals[package_name], m, mod)
package_name = package_name + '.' + m
else:
package_name = m
locals.update({package_name:mod})
try:
search_paths = mod.__path__
except AttributeError:
assert(package_name == module_name)
break


def import_one(search_paths, module_name):
try:
f, pathname, description = imp.find_module(module_name, search_paths)
except ImportError:
raise ImportError('no such module %s in %s', module_name, search_paths)

try:
mod = imp.load_module(module_name, f, pathname, description)
finally:
if f:
f.close()
return mod

2008年3月30日日曜日

python setup.py mingw32 SWIG @ windows xp

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
D:\bin\mingw\includeにrexec.hをコピーしたらcompileされるようにはなったのだが、
D:\bin\mingw\lib\にコピーしたlibrexec.aがリンクされない。なにが悪いのだろう?

D:\work\FIBSCookieMonster>python setup.py build -c mingw32
running build
running build_py
copying FIBSCookieMonster.py -> build\lib.win32-2.4
running build_ext
building '_FIBSCookieMonster' extension
swigging FIBSCookieMonster.i to FIBSCookieMonster_wrap.c
D:\bin\swigwin\swig.exe -python -o FIBSCookieMonster_wrap.c FIBSCookieMonster.i
D:\bin\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -Ic:\Python24\include -Ic:\P
ython24\PC -c FIBSCookieMonster_wrap.c -o build\temp.win32-2.4\Release\fibscooki
emonster_wrap.o
In file included from FIBSCookieMonster_wrap.c:2508:
clip.h:31:48: warning: no newline at end of file
writing build\temp.win32-2.4\Release\_FIBSCookieMonster.def
D:\bin\mingw\bin\gcc.exe -mno-cygwin -shared -s build\temp.win32-2.4\Release\fib
scookiemonster_wrap.o build\temp.win32-2.4\Release\fibscookiemonster.o build\tem
p.win32-2.4\Release\_FIBSCookieMonster.def -Lc:\Python24\libs -Lc:\Python24\PCBu
ild -lpython24 -lmsvcr71 -o build\lib.win32-2.4\_FIBSCookieMonster.pyd
build\temp.win32-2.4\Release\fibscookiemonster.o:FIBSCookieMonster.c:(.text+0xbf
): undefined reference to `regexec'
build\temp.win32-2.4\Release\fibscookiemonster.o:FIBSCookieMonster.c:(.text+0x10
7): undefined reference to `regexec'
build\temp.win32-2.4\Release\fibscookiemonster.o:FIBSCookieMonster.c:(.text+0x14
7): undefined reference to `regexec'
build\temp.win32-2.4\Release\fibscookiemonster.o:FIBSCookieMonster.c:(.text+0x1a
0): undefined reference to `regexec'
build\temp.win32-2.4\Release\fibscookiemonster.o:FIBSCookieMonster.c:(.text+0x1f
6): undefined reference to `regexec'
build\temp.win32-2.4\Release\fibscookiemonster.o:FIBSCookieMonster.c:(.text+0x26
d2): undefined reference to `regcomp'
build\temp.win32-2.4\Release\fibscookiemonster.o:FIBSCookieMonster.c:(.text+0x27
1d): undefined reference to `regfree'
collect2: ld returned 1 exit status
error: command 'gcc' failed with exit status 1


考えらること
  • pathが通っていない。
  • librexec.aが認識できない。
  • 何らかの理由によりlinkの指定に含まれていない。

    参考になりそうなスレッド
  • 2008年3月29日土曜日

    import .. in python but 2.4 or before

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    You can't have relative import if you are using 2.4 or before. We have relative import function 2.5 or later, though.

    Of cause you are a good python user (I knew it), definently need to create name hierarchy.

    suppose "well named" package like below.

    setup.py
    MANIFEST
    src/
    __init__.py
    a.py
    b.py
    One/
    __init__.py
    a.py
    b.py
    Two/
    __init__.py
    a.py
    b.py


    in setup.py,

    setup(name="python-library-wellnamed",
    packages=["wellnamed", "wellnamed.One", "wellnamed.Two",],
    py_modules=[
    "a.py",
    "b.py",
    "One.a",
    "One.b",
    "Two.a",
    "Two.b",
    ],
    )

    It looks OK.


    Here my question: in src/One/a.py, you need to import src/a.py. What do you do?

  • One solution is "close your eyes, and use setuptools develop command, so using setuptools instead of standard distutils."
    in this case Any way, you have to understand how it works.

  • Another solution is $PYTHONPATH to let your interpreter to get light module.
  • Other solution "edit your sys.path"
    In this case Any way, you have to find a right way to do it. Thus, understanding setuptools functionality is a sensible choice.


    Very first clue is in page 11 of setuptools presentation.

    • develop installs a package without moving it into site-packages/
    • Paste.egg-link is the poor man's symlink to ~/co/paste
    • easy-install.pth also points to ~/co/paste
    Well, if you are not using rpm or not using py2exe, you should be very happy. If you are using rpm like I do, not so happy. Fear about name collision between package from rpm and your applications.

    When using buildbot(some notes in Japanses found here), I hate to use $PYTHONPATH. You can not package it clean. 'Clean' means you do not need to anything else but svn checkout + setup.py. I think it is evil to do something beside it. You are not AUTOMATED build process if you need to set something by hand.

    Can you change $PYTHONPATH from setup.py? I do not know how, I do not know it is right thing to do.

    On the other hand, I'm very sure that you can use .pth in this case. You can install .pth file with
    What is .pth? Look at documentation of site module(JP).

    package_data = {'One':['One.pth']}

    etc.


    It is still half way. You can not test One/a.py during development.

    some thing like

    /src/One$ python a.py


    .pth solution can't handle this propery. It just too global...
    So, hacking sys.path is right way. Look at concept code is below.

    import sys
    sys.path.append(target dir)

    ok, now we need find target dir.
    first, we must calculate relative thing.
    To get absolute path of doing import,

    import os
    os.path.abspath(__file__)

    Be careful, it give you ".pyc" file instead of ".py".

    What we want to do is:

    in file of src/One/a.py,
    type

    import relative
    relative.imp(dotdot='a', from=__file__)

    to import src/a.py

    And
    type

    import relative
    relative.imp(dotdot='Two.a', from=__file__)

    to import src/Two/a.py

    It looks good idea to define "base path for import" for each imp() call.
    in this case, src/ is base path for import.
    It is very important that keep relative.imp have no side effect on sys.path.
    i.e. imp() has to restore sys.path after import of specified module.


    import os
    import sys
    def imp(**kw):
    path = os.path.abspath(kw["from"])
    module_name = kw["dotdot"]
    base_path = xxx(path, module_name)
    sys.path.append(base_path)
    exec("import %s"%module_name)
    sys.path.remove(base_path)

    implementing xxx is not so though.

    Now, we improve imp().

    import relative
    relative.imp(from='..', module='Two.a', importer=__file__)

    changed arguments and their names. "from" was error prone.
    now "from" means "from" of " from xxx import", not "from" file of where you are looking at.
    we can use os.path.join to generate base_path. Won't be tough. very good.
  • 2008年3月26日水曜日

    wxPython On Mac OS X

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


    ちゃんと動くようだ。app.MainLoop()しないとwindowが反応しません(イベントが処理されないので当たり前)。wxのVersionがCentOSで使っているのと異なるのでちょっと心配だったが。影が美しい。

    Mac mini 環境構築編

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    • ipython: eggして終わり。pythonのversionにこだわるとreadlineまわりが面倒なようだが気にしない。標準のpythonで通す。
    • Xcode: gccがないとopen sourceは始まらない。
    • fink
    • MacPorts コンセプトはFreeBSDのportsだが実装方法がまったく異なるらしい。
    • MacWiki
    しかしports, portage, yum/apt-get/rpmの類の再発明が多いなあぁ。なんとかしてほしい。しかもfinkは/下にswとか掘ってくれるし。変更可能だけどね。やれやれ。appleには標準的なpackage管理を用意してほしかったね。で、仕様とreference実装が公開されていてrpmやportsからのconvertが可能ならすばらしい。

    XにはX11が入っているのでXをM$ windowsにいれてつなげるのかな?だとしたらXを入れることについては前向きだね。しらべてみるか。

    Mac mini

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



    • sshの設定
      • 現状使っているキーのpub keyを.ssh/authorized_keyにコピー
        • fileのpermissionの設定(自分以外の読み書き禁止)に注意
      • /etc/sshd_configを編集。password認証によるloginを禁止、rootでのloginを禁止
        • terminalからsudoしてeditorを立ち上げて編集するなり何なりしてください
      • /etc/servicesに書かれているportを変更
        • とくに外部にマシンを直接さらすなら22だとよくない。望まぬ来訪者多数ということになる。
      • 環境設定からリモートログインを許可する
        • system preference => sharing でRemote Loginにチェックを入れる。userも制限しましょう。

    • VNC server(Vine VNCを使用)
      • dmgをとってきて実行すればいい。
        • かなりもっさり感がある。quartz serverは存在しないのかねぇ。
        • sshだけでがんばるという手もあるが。
      • 設定
        • System server: login画面を出すためのserver. sshだけでは許してくれない。
          • port 5900で実行
          • require remote login(ssh)をチェック
        • (Application) server: 実際に作業をするGUIを表示するサーバ
          • Dockに組み込んでOpen at Loginにチェック
          • connectionのタブ
            • port 5901で実行
            • require remote login(ssh)をチェック
          • sharingのタブ
            • Bonjourでのadvertiseのチェックをはずす
          • Start up
            • Start server when Vine Server Application is launchedのチェックをはずす
    • sshのクライアントのport forwardの設定
      • localのportは重複しなければお好みで
      • localhost:20100 -> port 5900 @ Mac mini
      • localhost:20101 -> port 5901 @ Mac mini
    • VMware Fusion
      • CentOS5.0を入れてみた。動いた。updateも問題なし。
        • guest os とHost os のnetworkはNATで。guest上でなにかサーバを動かすときになにかいじる必要があるかもしれないが。
        • マウスカーソルをとられるときがあるがVNC越しなら強制的にMac OSにもどれる。

    2008年3月25日火曜日

    myサーバセンタ構築を妄想して思った。

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    ICタグって機材管理に使うべきじゃない?ケーブルとか。いちいちテプラとかでシール作って貼ってエクセルシートに登録してとかやってられん。つないだら自動で認識されてしかるべし。んで、ハンディリーダーみたいなもんでスキャンすると情報が取れるの。無線でDBに問い合わせできるとか。

    マシン10台くらいから便利になると思うのですがどうでしょう?

    2008年3月19日水曜日

    組み込みってそういうもんだ。

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    iPhone SDKとその制限:いいことずくめではないディテール

    ユーザーは一度に1個のアプリだけ実行できる。そしてユーザーがアプリを離れるとアプリは停止する―大した問題には見えないが、この一文は、あるアプリから別のアプリに切り替えができない上、作業の継続もできないことを意味する。

    ようこそ、組み込みの世界へ。電話である以上、電話が優先でUIおよびリソースを使う権利を持っているからなぁ。110できないと電話として問題があるし。大体アプリを走らせっぱなしにしたら電池切れるよ・・・。安全側に倒してあるのだろうなぁ。

    ん~~しかしiPhoneのosはなんなんだ?
    gizmodの記事を読む限りOS Xのように見えるがほんとか?バックグラウンドタスクなしでは通信ねたはつらいのお。どうなっているやら。

    ぶっちゃけ、iphoneが電話をやめて携帯デジタルツールになってしまえばいいのだが。電話も一応できます、みたいな。尻尾の痕というか。


    JoelがJavaで携帯について何ができるかぶちぶち文句をかいていたなぁ。記事がなかなか見つからない。おかげさまで大脱線だ。


    ひさびさにチェックしたらだいぶ変わっていた。ハンガリアン記法の真実は収穫だな。

    開発抽象化レイヤはトムデマルコ本にもあったね。たしかにサーバを用意する作業はめんどくさい。
    ポインタの話

    ソフトウェアにおける高音域

    あいにくとこれは非製品ソフトウェア開発には適用できない。インターナル、インハウスソフトウェアが、ロックスターを雇うのを正当化できるほど重要性を持つことは滅多にない。結婚式で歌ってもらうためにドリー・パートンを雇う人がいないのと同じことだ。だからソフトウェア開発者であれば最も満足できるキャリアはソフトウェア会社なのであって、どこかの銀行のIT部門ではない。

    どっかの学生が外資系銀行のIT部門に就職して現状ベストだといっていたが、日本の現状はかなしいものだ。ブログを読む限りおいらよりはるかに才能がありそうだったが。優れたソフトウェアをつくるっていうのはサービスを通して世界を変えたいという欲求がないとできないので、才能以外にもきっと別のマインドも必要なのだろう。それらが別々のひとにやどった時にそれらを結びつけることができることが、社会としては大事なのではないだろうか。その点でIPAの最近の動きはちょっと驚く。

    サルにタイプライターをどうのこうのというジョークがあるが、回線とマシンパワー、ドキュメントがあるのだから日本のどこからか天才クリエーターが現れるだろう。彼・彼女がリソースが理由で阻まれる可能性は低い。しかも一人二人ではなくてたくさん出てくるだろう。よいことだ。


    私はなぜフレームワークが嫌いか
    落語かスケッチかという勢い。www.ファクトリーファクトリーのくだりで気づくと思うが、これはマクロ能力に関するJavaに対する風刺ではないかと思う。

    2008年3月18日火曜日

    turbogearsでimageを返す2

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    なんかimage moduleで切り貼りをがんばっていたのでsvgかなんかをつかってもっとデザインに幅を持たせられないものかと思ってsvgのrendererを探したらすぐにpycairoなるものを発見。epelかなにかに入っていてウマー。ドキュメントが少ないらしいので、Cのドキュメントをみてがんばるですよ。なにもないのにくらべたら天国です。

    ファイルからsvgを読み込んでrenderするのはどうしたらよいのかな?うろうろ・・・。それからrenderした結果をバイナリで取り出したい。IOStringかなんかに書かせてそれをreadすればよさそうだな。

    長いものに巻かれろなスタンスならcairoはよいチョイスでしょう。GIMPとかの統合の話で土台に使うらしい。

    winな人はこちらかな?。「cairo.svgモジュールは上記pycairoバイナリには含まれていないようです。」とあるがwinにははlibrsvgがないからなのかな?

    手元で試すとcairo.SVGSurfaceとかならあるが。contextにドローする方法は表現に依存しないのでは??まだ試していないからなんともいえないが。

    さすがIBMいつも思うがかれらは太っ腹だ。


    cairo での設計上の重要な決定は、可能な限り同一の出力をサポートするということです。一貫した出力は、GUI ツールキットのプログラミングやクロスプラットフォームのアプリケーション開発に格別に適したものとなります。高解像度で画面を出力できること、そして画面のコンテンツを同じ描画ライブラリーで描画できるということは明らかな利点です。


    ん~~これならpythonのユーザがもと増えていいはずだが。


    なかでも特筆するに値するのは Python バインディングです。このバインディングによって、迅速なプロトタイピングが可能になるだけでなく、cairo を初めて使う人でも cairo の描画 API を容易に理解できるようになっています。


    ?!ひょっとしてわかりやすすぎるからないとか・・・。

    http://cairographics.org/cookbook/roundedrectangles/
    はpythonでかかれてるよ・・・。
    rsvgを使うほうが普通らしい。

    svt to pycairoが今回おいらがやりたいことに関連してそう。svgのcmdをcairoのコマンドにマップしてexecで書いてる。
    サンプルだからif文つかってるけど辞書を用意してTemplateで置換すればよさげ。タプルをdictにマップしておけば不定数の引数も処理できるはず。

    pyrsvgとpycairoいまいちわからないのだが、rsvgで読み込んだファイルをcairoのdrawing contextを使って描画しているようによめる?!rsvgがcairoが実際に描画するための下回りかな?

    あとsvgの書けるドローソフトを拾ってきてリソースをつくらなきゃ。

    2008年3月17日月曜日

    DBとinduction

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    「排中律(論理学)」と「閉世界仮説(induction)」と「NULL(SQL)をめぐる話」ってなんだか根底にながれるものが同じ気がする。とぼんやりおもった。

    turbogearsでimageを返す

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    やっていたような気もするがどうなんだろ。コード見てみよう。自分がどう実装したか忘れてるしwww。まあ、データをreturnしているのだとは思っていましたが。

    @expose()
    def image(self, image_id, *arg, **kw):
    print "in controller: ", image_id
    return imageserver.gen_image(image_id).data


    なんかバイナリがりがりreturnしてた。content-typeとかどうなっちゃってんだろ。いままでの分はbrowserがguessしていたのでちゃんと表示されていたのだろう。

    webを漁っていると簡素なStarting TG pageで気づいた。


    @expose(format="json")
    def editItem(self, itemID, value):
    try:
    itemID = int(itemID)

    を、expose(format="png")とかすりゃいいのかな?google codeで検索するもformatはjsonしか出てこない。"expose(content_type="を検索するとビンゴ。ドキュメントよめ~~>俺

    XMLRPCとweb app frame work

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    pylonsのドキュメントを見ていたらこんなページがあった。

    まあ、そのうちに必要になりますなぁ。
    SimpleXMLRPCServerのAPIとどう違うのかが興味の対象だね。判然としないなぁ。う~む。XMLRPCってそもそも/下は見ないから意味なしか?そんなこともないようだが使いにくそう。Controllerの勉強をかねてSimpleXMLRPCServerと同じAPIなControllerでも考えるか?

    tg1だとどう共存するのだろう?Controllerというコンセプトは大差ないだろうからなんとなるべ。この辺か?/下の部分がmethod名にmapされるようだ。indexは特別扱いのようだ。まあ汎用的に書き直せますね。methodの名がとれるので、registerされたobjectに転送してあげればいい。

    本家のtracだとTicket #521 (reopened enhancement).

    TG2.0はsqlobject->sqlachemyらしい。

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    影響が気になるですこし調べていた。

    TurboGears Japanese > Archives > April 04, 2007
    を読んで思ったのは、transactionを意識したくないんだなぁってこと。sessionがtransaction管理をするのは必然なので。transactionをいじる人はあまりいないのね。まあ、ページの更新だけを扱っていればPostの処理で書き込み、GETで読み込み+認証での読み書き以外には考えられないからねぇ・・・。で、POSTでの粒度とtransactionの粒度が一致しているわけで。


    で、sessionをだれがもつかという話なんだけど、processのグローバル変数/threadのローカル変数にまかせてよきに計らうが基本スタンスっぽい。tgの__sqlhub__かなんか。コンテキストか。

    いつcommitするのよ?ってのが多分SAだとunitOfWorkかなんかでまとめてcommitになっているのだと推定。この点はActiveRecordだろうがDataMapperだろうが関係はず。

    SQLAlchemy, Declarative layers, and the ORM 'Problem' @ matzにっき

    SQLAlchemy @ TokuLog 改め だまってコードを書けよハゲ

    テストしにくいというのは確かにその通りかも。継承が「汚染」されずにすむだろうし。

    2008年3月15日土曜日

    開発環境

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    う~~作るのめんどくさい。
    サーバが絡んでくると特に。

    既存のやつをコピーして始められればいいのに。

    仮想化したOSのsnapshotをコピーとかいう方向に走るのかなぁ。
    OSのsnapshotだけじゃなくてbranchとかも作れればいいのに。要はversion管理ができたらいいなってこと。仮想化したOSのimageをsvnに管理させるのはどうなのさ??2GBもあるファイルとか突っ込んで大丈夫な??

    2008年3月14日金曜日

    setup.py bdist_rpm with SWIGのはまりどころ

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    setup.pyをいろいろ書き間違えて学んだ。結局、MANIFESTをちゃんとかく(setuptoolsを使えばそうでもないのかもしれないが・・・)、とext_modulesの名前の付け方に注意することだ。

    今回の方法でインストールすると、site-package下にhogehoge.pyと_hogehoge.soが配置される。hogehogeというdirectoryを掘ってその下に入れてほしい場合はまた考える必要がありそうだが、Extensionがfileを生成すると思っていれば多分ただしくsetup.pyをかけるだろう。

    hogehoge.cをhogehoge.iを書いて, site-packageからimport hogehogeできるようにするには次のようにする。


    MANIFEST

    hogehoge.c
    hogehoge.i
    hogehgoe.h
    setup.py


    setup.py

    from distutils.core import setup, Extension

    setup(
    name='hogehoge',
    version='0.1',
    description='hogehoge module',
    ext_modules=[
    Extension(
    '_hogehoge',
    [
    'hogehoge.i',
    'hogehoge.c',
    ],
    ),
    ],
    py_modules=['hogehgoe'],
    )


    解説:

    MANIFEST
    buildに必要なファイルは全部書きます。
    ここにhogehoge.pyが入っていないことに注意(SWIGが生成するから)。

    setup.py
    setupの引数のname='hogehoge'だが、import hogehogeしたいのだから必然
    Extension の第一引数のnameが'_hogehoge'になっているのに注意。SWIGは.soの名前が_XXX.soになることを期待しているので、こうしなければならない。

    第2引数はソースリストだが、これはSWIGに渡すものとgccに渡すファイルを指定する。こうすると勝手にSWIGを呼び出してhogehoge_wrap.cとhogehoge.pyを生成し、次にgccを呼び出してhogehoge.cとhogehoge_wrap.cをコンパイルし、リンカを呼び出してそれらの.oから_hogehoge.soを生成してくれる。ここで注意しなければならないのは.cを指定し忘れてもpackgaeが生成でき、.soがインストールされてしまうということだ。もちろん.c内で定義されているものを呼び出すことはできないのでimport先でexceptionを起こして止まってしまう。

    最後にsetup.pyのpy_modulesで、hogehoge.pyを指定しているが、これによりSWIGの生成したhogehgoe.pyがsite-package下にコピーされます。これがないとhogehoge.pyがコピーされません。setupの途中、手元にないpyを指定するのでエラーが出ますが続行されます。最終的にはSWIGが生成したpyがコピーされるので問題はないですが。

    2008年3月12日水曜日

    Buildbotその7

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    ShellCommandのコンストラクタに渡すnamedな引数のcommandはstrじゃないといけないみたいです。listをわたそうとしてはまった。

    ちょっといじってみたけど、手を入れるのが困難なソフトだね。gnubgのCをいじるほうがらくだ。
    rpmbuildで使うtar.gzのファイル名がハードコードされるのを回避したいのだがなかなか・・・。svn updateでとってきたspec fileを読み込んで、source dirをrenameしてからtar czfしたほうがいいようだ。しかしファイル名を渡す手段があまりない。こういうときにさくっといじれないのが、苛立ちの元で精神衛生上きわめて悪い。spec書き直すたびにcfgを書き直すんですか?筋悪いです。

    あーむかつく。

    いいニュースは、ソースを読んだところ、slaveからmasterにファイルを転送する手段があるということ。まあ、stdioがリアルタイムで転送されてくるところを見ると当然ですが。

    Joelがきてたんだ・・

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    Joelに聞く、「優れた開発者」の要件・心構え・努力すべきこと

     いろいろな側面があると思いますが、私が成功する開発者か判断するときに見るのは、ごく特定のことで、それは第一に再帰が使えること、第二にポインタが使えるということです。もちろんこれらがプログラマに必要とされるすべてというわけではありませんが、この二つは優れたプログラマになるかどうかの非常にいい指標になるのです。この二つができるというのは才能であって、ある人は持っているし、ある人は持っていないものなのです。

    どっかで福地さんがポインタがど~~してもわからない人たちがいるといっていたがほんとらしい。


    これについては『計算機プログラムの構造と解釈』(注2)という良い本があります。MITのコンピュータ科学科で1年次の必修科目のテキストになっています。

    日本でこれに勝てるコースのある大学はどのくらいあることか。


     私はまた、プログラミング言語の進歩にも勇気づけられるように感じます。かつてプログラムをすべてC++のような言語で書いていた頃にあった非本質的複雑さの多くが、新世代の言語によって解消されています。言語がガベージコレクションを持つようになり、最新のPythonやRubyといった言語には関数プログラミング的な機能があって、少ない量のコードでプログラムを書くことができます。非本質的複雑さは減っていき、残るのは考えを表現する上で本当に必要な部分だけということになります。プログラミング言語の進歩にはとても興奮しますね。

    :-D

    2008年3月10日月曜日

    哲学

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    produceすることとmanifactureすることの違い。

    • AlexanderのDesign Patternは前者

    • GoFのそれは後者


    後者を顧客のところに持っていって話になるかい?ほぼないだろう。前者は意味がある。指差しをさせることができるからね。IT業界を「混乱」させている要因はここにあるのでは?自動車の設計を見ても、セダンとトラックではフレーム構造にしているかどうかでぜんぜん違う。でも使う側からはどうでもいいことだ。アクセルとブレーキの概念はまったく同じ。

    どっかでPHPは「ものづくりが好きな人の言語」でRubyは「プログラムが好きな人の言語」とあったが、ちょうどこの関係とおなじなのではないだろうか。一般人にわかりやすい価値を提供しているのは前者で、いわゆるSIerのITアーキテクトとか、デマルコ本の話は前者にはいるのだろうな。

    ポールグラハムはlisp/schemeマンセーだが、彼の富を作り出したのは前者の要素で、まちがいなく優れたプログラマ(これは後者の要素)だろうが、あまり寄与していないだろう。かれの著書を読む限り、それに関してどのくらい自覚的かは不明だが。前者のもっとも有名な人物はappleのジョブスだろう。ゲイツも両者の要素をもっているが、やはり前者が彼の富を作り出したのだと思う。rubyのmatzは後者。

    問題は前者と後者をつなげる過程で経済的にうまくやれるかどうか。ゲイツやグラハムがこの点で非常に有利だったのは間違いないだろう。よく作ること抜きにスケールが大きいことをするのは難しい。はてなやgoogleが計算機の基盤にものすごく注力していることからもわかるだろう。

    • 顧客の価値は何ぞや:前者、発見的。

    • よく作ることとは何ぞや:後者、継続、経験的。



    言語設計者は、前者と後者が一致しているケース(matzがそう)なので特異なのだ。

    さて、ニュースで取り上げられる日本のものづくりは、最近後者に矮小化されているような気がするのですがどうでしょうか?

    2008年3月8日土曜日

    gnubg その2

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    気づいたらpatchを作っていた。いい線まできている。
    PySys_SetArgvにmainからもらったargvのdeep copyを渡した後でdeep copyしたものを開放しようとするとdouble freeしているといっているっぽい警告に出くわす。どーなっているのやら。まあ、freeするのをやめてしまえば消極的な解決策になる。

    かなり久しぶりにcをコードしたらpythonの文法で間違って書いてしまう。ifの()とかforの()とかを忘れるし、;もわすれる。printfの()も忘れる。[]と*の結合順序を忘れていた。さらにずぼらになったようだ。メモリの解放はわすれないのだが・・・。

    2008年3月6日木曜日

    gnubg

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    sys.path, sys.argvの内容が使い物にならない。困ったものだ。
    おかげさまでconfigからテストとprodを自動的に読み取ることができない。
    daemonizeするものならcwdも怪しいものでhard cordした設定ファイルを使うしかない。

    cwdで妥協するか。getcwdはとりあえず正しい値を返すので。
    ん~~ということはcwdに.svnがあったらlocalのcfgを使い、そうじゃなかったら/etc/の下を使うようにすればいいのかな?

    yum updateしたらdaily buildがこけた

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    python-paste-scriptが1.3.6-1.el5にあがったのが原因でTurbo Gearsのプロジェクトをbuildできなくなった。

    VersionConflictといわれるのだが、そんなこといわれてもpackageを使っているだけだからねぇ・・・。

    ConfigProxy

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    attribute proxyを使って.cfgの中身に.でアクセスできるようにしたコードを用意しました。標準のconfig parserを裸のままではあんまりに使いにくいので。

    サンプルとしてはこんな感じ。

    .cfg
    [connection]
    uri = http://hogehoge

    .py
    import config
    print config.active.connection.uri

    実行結果
    http://hogehoge

    また、loadするcfgに、実行の基点となったスクリプトの位置にある、拡張子を.pyから.cfgにしたものを使うようになっています。もちろん明示的にcfgを指定することもできます。メインのスクリプトで指定してあげるのかな。

    テスト用(__name__=='__main__'トリック)のconnectionとサービス用のconnectionを、importされるpyで意識せずに書けるのでいいはず。


    ちょっと違うが似たようなもの。importされたmoduleは、importしたmoduleについてどのくらい知ることができるかのかに興味があるので、その点で近い。
    Can module access global from __main__?



    #!/usr/bin/env python
    # -*- coding: us-ascii -*-
    # vim: syntax=python
    #
    # Copyright 2006-2008 Noriyuki Hosaka nori@backgammon.gr.jp
    #

    import os
    import sys
    import glob
    import ConfigParser

    __all__ = ['active', 'available', 'load_config']
    """
    Assuming that we have config.cfg and config.py(this file) in same directory.


    """
    def _example():
    """
    >>> import config
    >>> available(config.active)
    ['sample']

    >>> config.active.sample.uri
    'http://www.asahi.com'
    """
    pass


    class SectionProxy:
    def __init__(self, config, filenames, name):
    self.__dict__['_config'] = config
    self.__dict__['_filenames'] = filenames
    self.__dict__['_name'] = name

    def __getattr__(self, option):
    return self._config.get(self._name, option)

    def __setattr__(self, option, value):
    self._config.set(self.name, option, value)

    def __delattr__(self, option):
    self._config.remove_option(option)

    def __repr__(self):
    return ""%str(self._filenames)
    __str__ = __repr__

    def __len__(self):
    return len(self._config.options(self._name))

    def __iter__(self):
    for option in self._config.options(self._name):
    yield option

    def __contains__(self, option):
    return self._config.has_option(self._name, option)


    class ConfigProxy(object):
    def __init__(self, config, filenames):
    self.__dict__['_config'] = config
    self.__dict__['_filenames'] = filenames
    self._config.read(filenames)

    def __getattr__(self, section):
    if self._config.has_section(section):
    return SectionProxy(self._config, self._filenames, section)
    raise ValueError('No such section: %s'%section)

    def __setattr__(self, section):
    self._config.add_section(section)

    def __delattr__(self, section):
    self._config.remove_section(section)

    def __repr__(self):
    return ""%(self._filenames)
    __str__ = __repr__

    def __len__(self):
    return len(self._config.sections())

    def __contains__(self, section):
    return self._config.has_section(section)

    def __iter__(self):
    for section in self._config.sections():
    yield section


    def find_config_path():
    caller = sys.modules['__main__']
    trunk = caller.__file__.rsplit('.', 2)[0]
    return glob.glob(os.path.join(sys.path[0], trunk+'.cfg'))


    def load_config(paths):
    config = ConfigParser.SafeConfigParser()
    active = ConfigProxy(config, paths)
    return active

    def available(proxy):
    return list(proxy)


    active = load_config(find_config_path())

    if __name__ == '__main__':
    import doctest
    doctest.testmod()

    2008年3月5日水曜日

    wxPython::ListCtrl

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    wx.LC_VIRTUALでリストをアプリの側で握ったのはよいが、リストの変更があった場合にwindow systemに通知する方法がいまいちわからない。EVT_LIST_INSERT_ITEMなきがするのだが。

    wxEVT_COMMAND_LIST_INSERT_ITEMとかも関係ありそうだが、きょうは時間切れ。

    清掃

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    あまりにもファンの音がうるさいので、フィルタを清掃したら非常に静かになった。めづまりしかけていて、ファンの回転数が上がっていたようだ。

    2008年3月4日火曜日

    graphviz plugin for trac

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    GraphvizPluginをpackageしました。いつものところからご利用になれます。

    しかしさぁ、licenseを複数行でかくなよな~~bdist_rpmが通らないじゃないか。nameをgraphvizにするなよ。graphvizと衝突するじゃないか。trac-graphvizとか。もうちょっと気を使ってほしい。

    2008年3月3日月曜日

    wxPython

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    どれをいれていいかわからなかったからsrc.rpmからビルドすることにした。
    ビルドに結構時間かかる。できたrpmがほしい奇特な人はこちらから。ちなみにx86_64で、python2.4じゃないと動かないと思う。Centos5でbuildしました。あったりまえですが自己責任で使ってください。


    開発機とサービス機の2台があるのだが、開発機はduo, サービス機はquad+raidなのでマシンパワーを要求しかつファイルアクセスが多い作業をすると差が出る。yum makecacheとかはlocalなfile accessかどうかの差もでるので極端に違う。MBはまったく同じなのでここでは差が出ないw。

    wxPython in Actionはとってもいい本なので買うことをオススメします。日本語じゃないのがアレですが。

    TIPS:
    いきなりimport wxとしても動かなくてimport wxversionとしてwxversion.select('2.8-unicode')などどする必要がある。

    2008年3月2日日曜日

    メガフレームワークの進化速度

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    ソフトウェアって生物と一緒だなぁとふと思った。真核生物のミトコンドリアを連想した。

    自前でやるより大腸菌がプラスミドを交換するように、ソフトウェアもいい部品(コンポーネントモジュール)を共有したほうが生き残りに有利になる。


    Pylonsのコミュ@ mixiの照会文より

    PythonのWebアプリケーションフレームワークPylonsのコミュニティです。

    http://pylonshq.com/

    Pylonsには以下のような特徴があります。

    ・Plaggableなモジュール構成 - O/Rマッパーやテンプレートエンジンを取り替え可能
    ・Railsインスパイアな各種機能 - 好き嫌い無く良いものを取り入れるという開かれた思想
    ・WSGI準拠
    ・俺フレームワークに発展するメタフレームワーク

    同じくPythonのフレームワークTurboGears 2.0は,Pylonsをベースとして開発が進められています。

    2008年3月1日土曜日

    SWIGってイイ。

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    しかしgoogleでひっかかる日本語のちょっとつかってみた記事はだめだめだなぁ。

    本家のドキュメントできわめて簡単にことたりるはず。まあ、ちゃんと情報探せる人はこれみて終わりなんだろうな。1時間ちょっとでなにもswigを知らない状態からipythonで人様がかいたxxx.cをimport xxxとかできる状態になったからなぁ。

    こちらの作業としては
    - .hの定数をexport
    - .iをsetup.pyで記述する方法を見つける。今は3行ほどのmakefileになっている。
    - 最終的にできたものをwindows上でも動かしたい。py2exeと共存できるのかな?
    をすれば終わり。

    extensionをC/C++で書くことを考慮してあるdistutilsは偉大だ。