また今夜も飲みにいくので、プログラムをする暇もない。
ましてパズルをやる暇もない。

御存知ない方も多いと思いますが、世の中には「全漢字ナンクロ」というものもありまして、
これが私が最近やってるパズルなんですけどね。
たとえばこういうのです。

私は漢字を書くのが苦手で、このブログに四字熟語なんて、たぶん1回も出てきてないし、
四字熟語どころか、そもそもパソコンが変換してくれなかったら、
このブログに漢字は1文字も出てこないでしょう。
ってのは言い過ぎですけど、それくらい漢字が苦手なので、
それを克服するためにやってみてます。

でもまぁ、当然すぐに挫折しちゃったんですけど、
それでもなんとか最後までやるために、こういうのを作りました。

http://puzzle.rulez.jp/kanji/view.html
裏では例の Tempita を使ってるので、酔っ払ってても簡単に作れました。
今もだいぶ酔っ払ってますけど。
Django は使われていません。

じゃぁ。

ちょっと元気なので追記
データベースには、芥川龍之介の作品約200作を青空文庫から持ってきて、
そこから漢字の並びを抽出したものを使っています。
だから「或」を含む3字の熟語を検索すると「或阿呆」が一番に出てきたりします。
とはいえ、このデータベースだけでは全漢字ナンクロを解くには不十分なので、
これからもちょっとずつ拡充していく予定です。

それから、携帯でも簡単にチェックできるのは便利でいいなぁ。
電車の中でも全漢字ナンクロができる。
2007.08.31 Fri l Python ナンクロ l COM(0) TB(0) l top ▲
Tempita っていうのは、前にここで紹介したこれのこと。
今、これを使って遊んでます。
私はパズルが好きなので、それ関連のものを作ってるところ。

必要な機能の実装はもう終わったんだけど、いかんせん、デザインがなぁ。
明日には公開するかも、しないかも。デザインはめんどくさい。

とりあえず今夜はちょっと飲みすぎた。
都内某所、ただいま麦焼酎6杯目。
2007.08.31 Fri l Python Template l COM(0) TB(0) l top ▲
おばあちゃんの原宿と言われている(?)巣鴨地蔵通り商店街。
その巣鴨地蔵通り商店街のサイトに Google マップを使ったページへのリンクがあった。
ちょっと意外。
2007.08.29 Wed l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
前々から気づいていたことだけれども、この世にはすごい人が多すぎる。
自分が何かをやろうとしても、ほとんどのことは既に誰かがやっている。
趣味でプログラミングをやっていても思うし、研究をやっていてもそう。

それにひきかえ、今の自分は何もできない。もっと貪欲に学ばなくては。

ところで、このブログを書いているということを、先日、父に知らせてみた。
家族のコミュニケーションをブログ上でやるわけではないけれど、
少なくとも生存報告ぐらいには使えるはず。
2007.08.28 Tue l 未分類 l COM(0) TB(0) l top ▲
http://d.hatena.ne.jp/toton/20051102/1130971334を見ながら、
「Python の正規表現を使って漢字のならびにマッチ」をやってみたのだけれど、うまくできない。
特に xyzzy で C-c C-e で実行したときが変な感じ。
あとでまた、いろいろ試してみようと思う。

とりあえずは、http://d.hatena.ne.jp/Isoparametric/searchdiary?word=*%5BPython%5Dの方法でやってみることにした。
2007.08.28 Tue l Python l COM(0) TB(0) l top ▲
約束をすっぽかされてしまったせいで、暇になる。
甲子園の閉会式を聞きながら、研究室で暇つぶし。
LLSpirit の「オレ様言語の作り方」をふと思い出して、簡単な字句解析器を書いてみた。

関数 Lex の中のリスト res に、正規表現とその名前の書いて拡張します。
続きはh_sakuraiさんのサイトを見ながらやれば、10分後には、あなただけのオレ様言語ができているかもね。
[JavaScript]10分で書く字句解析器を参考に作りました。
オレ様言語に興味がある人(俺とか)はどうぞ。

Python ソースファイル
2007.08.22 Wed l Python l COM(0) TB(0) l top ▲
規模を拡大するためなら、データベースでいろいろやるよりも、 PHP でやったほうがいいよ。Ebay は、 join とか、それは普通データベースでやるだろって言うようなことまで、PHPでやるんだってさ。
The lightweight nature of PHP allowed them to move processing tasks from the database to PHP in order to improve scaling. Ebay does this in a radical way. They moved nearly all work out of the database and into applications, including joins, an operation we normally think of as the job of the database.
ってことが、ここに書いてあった。
2007.08.21 Tue l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
Pathtraq はまだ検討中だけれど、代わりに「あわせて読みたい」を導入してみた。
サイドフィードもサイボウズラボも、どっちもサイボウズの子会社だから、いいよね?(謎)
2007.08.19 Sun l 未分類 l COM(0) TB(0) l top ▲
Python が Google で3番めに使われている言語である。とよく言われている。
で、そのせいかどうかは知らないけれど、Google で pydoc を検索すると、
「Google が技術者を募集中」という広告が表示された。
Google で働いてみたいなぁと思ったけれど、俺は昔、書類選考であっさり不採用になったような気がする。

2007.08.18 Sat l Python l COM(0) TB(0) l top ▲
「複数のマシンを使った並列計算が Python を使って簡単にできちゃう!」ただし、 NetWorkSpaces を使えばの話ね。」
じゃぁその NetWorkSpaces って何?

ってことで、前に
簡単に並列計算 Python and NetWorkSpaces 前編
簡単に並列計算 Python and NetWorkSpaces 後編
というエントリーを書いたんだけれど、これを reStructuredText を使って見栄えをアップさせてみました。
内容は同じです。
NetWorkSpaces 適当翻訳メモ 追記: リンクが間違っていましたが、訂正しました。
2007.08.18 Sat l Python l COM(2) TB(0) l top ▲
reStruecturedText というものの存在を知ったので、それを使って Tempita の適当翻訳を作ってみた。 reStructuredText は簡単すぎてよい。マークアップが簡単でかつ直感的で、しかも見た目がすっきりしている。

Tempita が何かということを簡単に説明すると、
Python で使えるテンプレート言語で、テンプレートの中に Python のコードが書けるもの。
それが Tempita

Tempita 適当翻訳マニュアル
2007.08.18 Sat l Python Template l COM(0) TB(0) l top ▲
reStructuredText というものを知った。
5-minute Video Presentations About Python で。
2007.08.18 Sat l Python l COM(0) TB(0) l top ▲
あなたが好きな、あの飲み物のせいで死ぬ!? 飲み物に含まれているカフェインが原因で死ぬには、それを何倍飲めばいいか(?)を計算してくれるサイト。
私はコーヒーが大好きで、インスタントコーヒーをゴクゴク飲んでいる体重60キロの男性です。こんな私は、インスタントコーヒーを158カップ飲むと、死にます。飲み物は、コーヒー以外にコカコーラやペプシコーラなども選べます。
ちなみにダイエットペプシだと、250缶飲むと死にます。

Death of Caffeineより。
2007.08.14 Tue l ちょっと前に読んだもの l COM(0) TB(0) l top ▲

Status & License

Tempita は MIT-style license の元で利用可能です。

Tempita は積極的に開発されていますが、野心的なプロジェクトではありません。だから、テンプレートの世界を支配しようなんてものじゃなくて、新しい特徴を追加するのが目的のものです。私が作りたいと思ったものは、 % と string.Template だけじゃ不十分なときに使えるような、小さなテンプレート言語です。

なんでさらに別のテンプレート言語がいるの?

(略)

The Interface

インターフェースは string.Template に見えるように作ってあります。テンプレートオブジェクトは、こんなふうに作ります。

>>> import
>>> tmpl = tempita.Template("""Hello {{name}}""")
>>> tmpl.substitute(name='Bob')
'Hello Bob'

クラスを飛ばすこともできます。

>>> tempita.sub("Hello {{name}}", name='Alice')
'Helo Alice'

この言語は任意の Python で実行できます。だからあなたのテンプレートがより信頼できるものになります。

また、テンプレートに名前をつけることもできます。これによってエラーが起こったとき、その名前が表示されるので便利です。

>>> tmpl = tempita.Template('Hi {{name}}', name='tmpl')
>>> tmpl.substitute()
Traceback (most recent call last):
    ...
NameError: name 'name' is not defined at line 1 column 6  in file tmpl

substitute(...) の中身が引数になるような、デフォルトで使えるネームスペースを与えることもできます。

>>> tmpl = tempita.Template(
...     'Hi {{upper(name)}}',
...     namespace=dict(upper=lambda s: s.upper()))
>>> tmpl.substitute(name='Joe')
'Hi JOE'

最後に、 substitute 関数にディクショナリオブジェクトを引数で渡すこともできます。

>>> name = 'Jane'
>>> tmpl.substitute(locals())
'Hi JANE'

HTML を作るのには、もっと便利なテンプレート HTML Template もあります。

Template.from_filename(filename, namespace={}, encoding=None) を使えば、ファイル名からテンプレートを作ることもできます。こんなふうに。

Template(open(filename, 'rb').read().decode(encoding),
         name=filename, namespace=namespace)

Unicode

Tempita は Unicode を"優雅に"扱います。 Template オブジェクトは default_encoding の属性を持っています。

unicode と str のオブジェクトが混ざっているときに、それを使います。こんなふうに

>>> tmpl = tempita.Template(u'Hi {{name}}')
>>> tmpl.substitute(name='Jos\xc3\xa9')
u'Hi Jos\xe9'
>>> tmpl = tempita.Template('Hi {{name}}')

>>> tmpl.substitute(name=u'Jos\xe9')
'Hi Jos\xc3\xa9'

デフォルトのエンコーディングは UTF8 です。

The Languate

言語はとってもシンプルで、すべての要素は {{ごにょごにょ}} って感じになってます。

置換

変数や式を変数や式を挿入するには、 {{expression}} を使います。式の中では }} を使うことはできませんが、 } } なら使えます(間にスペースがある)。filter もこんなふう {{expression | filter}}にすれば渡すことができます。たとえば{{expression | repr}}とか。これは{{repr(expression)}}と同じです。 こっち表現のほうが好きな人もいるでしょう。この表現は Django と同じです。ネームスペースは共有されているので、 repr はネームスペースの中の単なるオブジェクトです。

もしテンプレートのなかで {{ や }} を使いたいときは、組込み変数である {{start_braces}} と {{end_braces}} を使います。エスケープ文字はありません。

デフォルト変数をテンプレートの中出設定するためのコマンドもあります。たとえばこんな。

{{default width = 100}}

こうしておけばテンプレートの中で width はいつも 100 です。たとえば tmpl.substitute(width=200) とかやると、この効果はありません。

値が未定義のときにだけ使われます。また、 = の右側にはどんな式を書いても OK です。

if 文

if 文はこんな風に書けます。

{{if 条件式}}
  true のときの処理
{{elif 別の条件式}}
  そのときの処理
{{else}}
  最後の処理
{{endif}}

命令だけの行は、評価されたときは取り除かれます。後に続く : は自由です。

for 文

ループにも、別に驚くことはありません。こんな風に書きます。

{{for a, b in items}}
    {{a}} = {{b | repr}}
{{endfor}}
2007.08.14 Tue l Python Template l COM(0) TB(0) l top ▲
Django を理解する前に、MySQL とか Cookie とか Session とか、そういう基本的なものを理解しなくちゃいけない。
そう思って、自分で簡単なコードを書いてみた。Django から参考になるコードを探しながら。
MySQLdb の使いかたがよくわからなくて、適当な感じで書いてます。
でもまぁ、このコードを書いて学んだことをまとめると、
  • Cookie の内容は Session の ID だけ。データは渡さない。
  • データは Pickle 化して base64 にエンコードすればデータベースで扱える
  • Session ID は、適当な乱数と適当な文字列をキーにしたハッシュ値を使う
コードはこちら。
import md5, base64, random, MySQLdb, sys, pickle

def openDB():
    return MySQLdb.connect(db="dbnane", host="dbhost.example.ne.jp", user="dbuser", passwd="dbpasswd")

secret_key = "gonyogonyo"
def getSessionKey():
    con = openDB()
    cur = con.cursor()
    while 1:
        session_key = md5.new(str(random.randint(0, sys.maxint - 1)) + str(random.randint(0, sys.maxint - 1)) + secret_key).hexdigest()
        
        cur.execute("select session_key from mysession where session_key='%s'" % session_key)
        r = cur.fetchall()
        if len(r) == 0:
            break
    cur.close()
    con.close()
    return session_key

def session_encode(data):
    return base64.encodestring( pickle.dumps(data))

def saveSession(session_key, session_data, session_expires):
    con = openDB()
    cur = con.cursor()
    cur.execute("select session_key from mysession where session_key='%s'" % session_key)
    r = cur.fetchall()
    if len(r) == 1:
        cur.execute('update mysession set session_data="%s" where session_key="%s"' % (session_encode(session_data), session_key))
        cur.execute('update mysession set expire_date="%s" where session_key="%s"' % (session_expires, session_key))
    elif len(r) == 0:
        cur.execute("insert into mysession (session_key, session_data, expire_date) values('%s','%s','%s')" %
                    ( session_key, session_encode(session_data), session_expires))
    else:
        raise Exception
    cur.close()
    con.close()
2007.08.13 Mon l Python l COM(0) TB(0) l top ▲
まえに Python - Djangoの開発環境が15分以内に作れちゃうよ!っていう記事を書いたけど、そんなことをしなくても、Ubuntu Linux だったら、

sudo apt-get install python-django

でインストールできます。Djangoに興味があるひとは、とりあえず試してみては?

Package: python-django (0.96-1)より。
2007.08.12 Sun l Python Django l COM(1) TB(0) l top ▲
Scheme とはLisp をよりカッコよくした言語で、書けたらカッコ( not () )いい。

A Scheme Case Studyより。

Web アプリケーションを作るのに Scheme を使う、という選択肢は、アリらしい。しかも、Ruby on Rails 並にいいフレームワークも作っちゃったってさ。へぇ〜。
まだ論文は読んでないけれど、Scheme をビジネスで使おうとした時に一番大変なのは、たぶん Scheme を書けるエンジニアを集めるのことだと思う。スタートアップの段階では、自分と同僚数人が使えれば何でも採用できるから Scheme という選択肢もアリなんだろうけど、そっから先はどうするんだろう。このあたりは、たぶん読んでも書かれてなさそうだなぁ。
2007.08.11 Sat l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
Pathtraq のアドオンを、インストールして、無効にした。一度はインストールしたんだけど、何かに抵抗を感じる。サイボウズラボの方々を疑っているわけじゃないんだけど、ね、うまく言えない感じ。もどかしい。
なんていうか、インストールする理由がないんだよね。結局のところ、みんながインストールしてくれれば、自分がインストールする理由はなくなる。みんながインストールしなかったら、自分がインストールする理由も、サービスの意味もなくなる。
もしかしたらセキュリティ上の問題があるかもしれないし、そうでなくてもブラウザが重くなっちゃう原因になるかもしれないアドオンを、メリットもないのにインストールする理由がない。「それでもインストールする」って人が、たくさんいるとは思えないし、たくさんいたとしても、やっぱり自分がインストールする理由にならない。
でも、たとえば自分の閲覧の履歴を管理してくれて、その情報を使ってサイトをリコメンドしてくれるとか、なんかそういうメリットがあれば試してみたいと思う。たぶん同じように思う人は、私だけでないと思う。とにかく、なんでもいいから情報を提供するユーザにメリットがほしい。

というわけで、そういう機能が追加されたら、いつでもアドオンを有効にします。
期待して待ってます。
2007.08.09 Thu l 未分類 l COM(0) TB(0) l top ▲
Django を使ってごにょごにょやっているなかで、自分がいま必要としているのは、DjangoのようなWeb アプリケーションのフレームワークではなくて、もっと簡単なテンプレートエンジンなのかもしれないと気づいた。

というわけで、[python template web]で検索してみると、 Pythonのテンプレートエンジンというズバリなエントリをウノウラボさんのブログで見つけた。
そのエントリーに載ってないテンプレートエンジンでは、ClearSilverがよさそうな感じ。API をPython から呼べるらしい。でもCのライブラリになってる必要もないし、インストールがめんどくさそう。それに、できればテンプレートの中にも Python のコードを書きたい。
そういう条件で絞っていくと、そんな都合のいいテンプレートエンジンは、ない。と思っていたら、ついによさそうなのを見つけた。それはTempita
Python Pasteについても、ものすごく気になるけれど、それはまた今度。
2007.08.07 Tue l Python Template l COM(0) TB(0) l top ▲
どう書く?orgにアカウントを作ってみた。
doukaku.jpg

2007.08.05 Sun l 未分類 l COM(0) TB(0) l top ▲
LLSpiritに行ってきました。

10時に会場へ着けるように平日並の早起きをしたにもかかわらず、起きた瞬間、なぜ早起きしたのかを忘れてしまって、のんびり洗濯をしていて遅刻してしまった。
着いたときには、Ioという言語のLanguage Update をやっていた。

というわけで、そこで印象に残った内容の勝手メモ

Language Update Io
予約語が0個ってどういうことだ?
プロトタイプベースの意味がようやく分かった。
メッセージを送りあうというのは、NetWorkSpacesと同じ仕組みか。

Language Update R
Bioinformatics の分野でよく使われている。これは確かにそう。
Bioinformatics における informatics とは、 statistics と同義だ。と ISMB でも言われていたこと裏付けていると思う。

Language Update Python
Python 大好きっ子な私としては、一番楽しみだった時間。
Python が CG 作成とかに使われているよ〜って話が一番意外だった。
POGL Benchmarks - Perl vs Pythonとかを見ると、Python と 3D や数値計算は相性が悪いのかと思っていた。
それから、言語のロードマップがあるからエンタープライズで使われやすいという話。
特に制約がない人は Python 2.5 -> Python 2.6 -> Python 3.0 とアップデートしていけばいいらしい。

Language Update Lua
初めて知った言語。かなり速いLL言語らしい。
Bioinformatics の分野でよく使われているらしいけど、知らなかったのは私の勉強不足。
データファイルを Lua のプログラムで表現する、というのはちょっとビックリ。
スクロールバーを操作するんじゃなくて、マウスをぐるぐる回してスクロールするという UI にもビックリ。

Language Update Ruby
普通にだまされた。マジで2.0 が出るのかー!!と思ってしまった。
1.9 からは継続が使えるらしい。継続ってScheme の継続のことだよね。どういう文法になるんだろう。

オレ様言語の作り方 ひまわり
ここまで日本語っぽいプログラムが書けるとは思わなかった。
I17nなひまわりで書いたプログラムは excite 翻訳しても同じ動作をします、なんてのができたらもっとすごい。
作るきっかけ(の1つ)になったという女の子の、その後が気になる。


オレ様言語の作り方 Xtal
カッコいい。カッコいいー!
Boost.Python ってなんだろう。今夜、調べる。

オレ様言語の作り方 Crowbar&Diksam
今夜 kmaebashi.com にアクセスする。

オレ様言語の作り方 Sukuna
Forth ってなんだ? Joyってなんだ?Concatenative ってなんだ?
FizzBuzz が、なんとなく分かるような、分からないような。

VM魂 全体
全体的にエンタープライズな感じ。
マイクロソフトの荒井さんのプレゼンが凄すぎた。
Python でオブジェクトをインポートして、Javascript でインスタンスを作って実行する。が可能になる世界。
ルー大柴さんの日本語英語混交文のようなものか。(違うか)

キミならどう書く 〜プレゼンソフトを作る〜 全体
逸般人はプレゼンでも、S 式を使うらしい。かなり笑った。
プレゼンテーションというのは、プレゼンデータの作成を含まないってことか。

Lightning Talk PRagger でピザが頼めるようになるまで
PRagger = Plagger + Ruby
Plagger + Python = ???

Lightning Talk PRagger 外付け web フレームワーク flowr
ブログでモノポリー。面白そう。
flowr については、後で調べる。


…このあたりから盛り上がりすぎて、メモがどんどん適当になっている。
このあといろいろ。
後で調べようと思った単語リスト。
Hentai++
Scala
Coq バグがないことを証明する
Tenjin 高速なテンプレートエンンジ
PHP を使わない
こう書く機動隊


楽しかった。来年は8月30日土曜日に中野で開催されるそうなので、また行きたい。

2007.08.05 Sun l 未分類 l COM(0) TB(0) l top ▲
Erlang のいいところ。
1. Ubuntu を使っている人なら、インストールが簡単。 sudo apt-get install erlang で一発!
2. 対話式のシェルがある。 erl で起動。
3. erlang.orgに入門者用のドキュメントがある(英語)
4. 関数型の言語だから、勉強になる。
5. 大規模システムで実際に使われている。
6. Web のフレームワークがある
7. Planet Erlangがある。
8. 言語を作った人の本も出てる。
9. アルファギークの仲間入り?

Erlang for Python Programmersより。
2007.08.04 Sat l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
美しいコードなんて、幻想だ。美しいコードを書く方法は、トライアルアンドエラーしかない。
だれでもそんなに賢くない。すごい人でも基本的なミスを犯す。タイポどころじゃない、基本的なデザインのミスを。
だから自分が賢くないってことを自覚しよう。そして、すでにあるものをなんとか使って、慎重にテストをして、単純さを重んじよう。
それから、コードの美しさにとらわれてはいけない。ソースコードと結婚すると考えると(!)美しさがいい結婚の条件にはなりえない。

Beautiful Codeより、適当翻訳。

でも、美しくないコードを書いてしまったら、後々(その「後々」は意外に早く来る)ぜったい苦労するよなぁ。結婚はどうか知らないけど。
2007.08.03 Fri l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
A "Linear Logic" Quicksortより。

概要をちょっと読んだだけだけど、計算時間がリニアなんじゃなくて、in a "linear" fragment of Lisp でクイックソートをやるらしい。
なんだそれ?意味が分かんない。
後でゆっくり読む…。のか?
2007.08.03 Fri l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
スラドの記事より。

今さらだけど、まだ買えるのかなぁ。ちょっと読んでみたくなった。
2007.08.02 Thu l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
あなたはプロジェクトマネージャになりたいですか?

How Do People Become Project Managers? (人々はどのようにしてプロジェクトマネージャになるのか)より

Project@workのアンケート結果によると、

Q1.なりたいと思ってプロジェクトマネージャになったのですか?それとも、プロジェクトマネージャに「なっちゃった」んですか?
なりたくてなった …30%
なっちゃってなった…70%

Q2.プロジェクトマネージャになるまえに、プロジェクトマネージャ用の研修を受けましたか?
はい …15%
いいえ…85%

Q3.プロジェクトマネージャという職業を、今後もやりたいと思っていますか?それとも、別の何かにステップアップしたいと思っていますか?
今後もやりたい…60%
別の何かにステップアップしたい…40%

これをまとめると、プロジェクトマネージャというのは、それになりたくてなった、という人が少数派になる職業で、なりたくてなった人の中でも事前に研修を受けずになった人が半分以上いる職業で、どちらかといえば続けたい職業らしい。
なんだそりゃ。

このブログを書いてるMikeさんはブルガリアで働いている人らしく、彼によると、アメリカだけでなくブルガリアでも同じような感じだそうだ。

プロジェクトマネージャって、チームとか、その他の関係者をマネージメントするのが仕事でしょ?だから、エンジニアじゃないよなぁ。技術的な知識が求められる場面があるとしても。
なのに、情報処理技術者検定で資格扱いされてるのはどういうわけだ?IT以外のプロジェクトはマネージメントなしでもうまくいくのか?

そういえば秋試験の申し込みは8月20日までだ。
2007.08.02 Thu l ちょっと前に読んだもの l COM(0) TB(0) l top ▲