ハッカーと画家、そして自分との契約

ポール・グレアムの『ハッカーと画家』を読みました。実は、邦訳が出たばかりの頃に書店で一度手に取っていたのですが、他の本を買って「また今度」と棚に戻してしまった記憶があります。川井さんのサイトで拾い読みしてはいたのですが、あー、もっと早く読んでおけば良かったと後悔。でも、本というのは、その人が欲しているタイミングになって初めて出会えるもの。たぶん、人と人との出会いもまた然り。

前置きが長くなりましたが、本の内容はというと、僕がここ最近ずっと考えていたことが書かれていました。
  • 最良のイントラネットは、インターネットだ。
  • 信頼できる、良いプログラマからなる小さなチームでのほうが、大企業での平凡なプログラマからなるチームよりもうまくいく。
  • 良いハッカーになる鍵は、たぶん、自分がやりたいことをやることだ。
  • 人材募集がいかにもITといった匂いを漂わせていればいるほど、その企業は脅威ではない。一番安全なのはOracleの経験者を募集しているところだ。また、JavaやC++プログラマを募集しているところも安全だ。もしPerlやPythonプログラマを募集していたら、ちょっと気を付けたほうがいい。その企業の、少なくとも技術部門は本物のハッカーがやっている可能性が高いからだ。
  • 難しいのは問題を解くことではなく、どの問題を解くかを決めることだ。

Life is very short, and there’s no time, for...

DANIELS E.P. / the band apart

Amazonから注文していた"the band apart"のCDが届きました。
かっこいい!特に1曲目の「led」、ギターが最高!!

このCDは、アメリカのバンド「Mock Orange」とのスプリットシングルというちょっと変わった構成で、それぞれ新曲を2曲ずつとお互いのカバー曲が1曲ずつ収録されています。Mock Orange は、なんだか昔のXTCに感じが似てて懐かしい印象。

三菱東京UFJ銀行(旧東京三菱店)と三菱東京UFJ銀行(旧UFJ店)

三菱東京UFJ銀行(旧UFJ店)の口座から三菱東京UFJ銀行(旧東京三菱店)のモバイルバンキングを利用したかったのですが、できないようです。合併したのは名前だけで、中身は全く別の銀行らしいです。利用するには、旧UFJ店の口座を解約して、旧東京三菱店で新たに口座を開いてくださいとのこと。下記のQ&Aを読んで、ようやく分かりました。

合併関連情報 合併にともなうご案内Q&A:三菱東京UFJ銀行:


勘定系のシステム統合は、2008年を予定しているんだとか。こんなんでよく合併が承認されたなぁ、と思うのですが、「合併は同時にシステム統合を完了していることが条件」とかいう法律はないのでしょうか…

関連リンク: 三菱東京UFJ銀行 - Wikipedia

TurboGearsで作られたCoolなPIMアプリ


images/turbogears-pim060523.png

Oprius Software が開発中のPIMアプリケーションの スクリーンキャスト が公開されています。カレンダー、アドレス帳、ToDoの機能が利用可能で、もう定番となりつつあるAjaxによるシームレスな操作感がウリの模様。widgetの使い方が気になるのでソースが見たいです。

面白いのが、デモ中でTurboGears開発者のKevin Dangoorをサンプルデータとして使っていて、Kevinが自身のブログで「とてもクールだ。きっと、僕の名前が使われていなくても紹介してるよ。」と言っているところ。

さて、自分はTurboGearsでPlaggerをバックエンドにしたZaurusの情報サイトでも作ろうかな…


関連リンク: Kevin Dangoor's Blog

Bluetoothレシーバー付属で1GBメモリ内蔵の「W44T」

Bluetoothレシーバー付属で1GBメモリ内蔵の「W44T」

4GBのハードディスクドライブ(HDD)を搭載した「W41T」の後継機にあたる同端末は、HDDではなく1GBのフラッシュメモリを内蔵する音楽ケータイ。Bluetoothに対応し、新たにオーディオプロファイル「A2DP」をサポート。A2DP対応のBluetoothヘッドセットなどでワイヤレスで音楽が楽しめる。A2DP以外のプロファイルは、W41Tと同じ。 また、パッケージには「Bluetoothレシーバー」が付属する。イヤホンを接続することで、音楽プレーヤー機能のリモコンとして利用できる。ただし、レシーバーにはマイクが搭載されていないため、ハンズフリー通話は行なえない。Bluetoothのペアリングを行なえば、買ったその日からワイヤレスで音楽などが楽しめるようになる。Bluetoothレシーバーの大きさは、約54.9×27.7×17.4mm、重さは約15g。単4電池一本で動作する。

今度はちゃんと一般的なA2DPのプロファイルに対応したみたいです。

1GBのminiSDカードを持ってるから、合わせて2GBで容量は充分。EZナビウォークも3D表示できるしで、かなり欲しいです。問題は、おさいふケータイじゃないのとレシーバにマイクが付いてないこと。うーん、auのシャープ端末もソフトバンクのノキア端末も気になるのですが、それを待たずに乗り換えそうな予感。

他には、たぶん無理だと思うけど、BluetoothでPCのスケジューラやミュージックライブラリとSyncできたら最高ですね。そしたら、Google CalendarとSyncするようなプログラムを自分で作ったり、Podcastを自動で取り込んだりできます。
夢がひろがりんぐw

最近のPHPフレームワークに思うこと

最近のPHPフレームワークに興味があったので、会社帰りにいつもの紀伊國屋で『超・極める! PHP』を買ってきました。

僕がPHPでプログラムを書いていたのは、ちょうど3年前です。その頃は、EclipseプラグインのTruStudioが出たばかりで(最初はWebStudioという名前でした)、PEARのライブラリも今ほど整備されていなくて、RSSパーサも自分で書いて、Log出力くらいしか使わなかった記憶があります。他には、NuSOAPを使ってAmazon Web Servicesにアクセスしたり、libcurlでWebスクレイピングをしたりしていました。今は、全部PEARのライブラリでできるのでしょうか?それから、Turk MMcacheというバイトコンパイルされたソースをキャッシュするモジュールを使ってチューニングをしていました。日本語の情報は全くなかったけど、負荷テストをして問題なかったので実戦投入しちゃったんだっけ…

で、最近のPHPフレームワーク状況ですが、Maple, Ethna, symfonyZend Frameworkを加えた4つが主流のようです。ちょうど後輩がどれを使うかで悩んでいて相談されたのですが、現時点ならsymfonyが良さそうな気がしました。まだベータ版ではあるものの、少々の問題は自分で対処できるようならば、Zend Frameworkっていう選択肢もありかなと思います。Zend Frameworkのドキュメントは素晴らしいです。コーディング規約もしっかりしていて、使う気にさせてくれます。サンプルもAmazonやFlickr, Yahoo!とツボをついたものだし、JSONやAtom/RSSで出力するクラスも用意されているようです。いっそのこと、PHPはこのクラスライブラリを標準にして、その上でフレームワークを作ればよいのにな、というのが私の感想です。

「Railsで作るAjax住所録」をTurboGearsで作ってみた

masuidriveさんの「Railsで作るAjax住所録」をTurboGearsで作ってみました。Railsだとscaffoldで超簡単にできるようですが、widgets.ListFormを継承してフォームの雛型を作って、必要なビューとコントローラを書いて、と進めていきました。ビューはほとんどそのまま頂いたので、ajax_scaffold.jsを使っています。30分どころじゃなくてかなり時間がかかりましたが、おかげでTurboGearsの流儀がだいぶ分かったような気がします。
動作サンプルを公開できるようにしていて思ったのですが、CherryPyを使って開発している分には簡単軽快なのですが、Apache + mod_pythonな本番サーバにデプロイする方法に黒魔術が必要なようです。HTTPヘッダへ値がうまくセットできなくて、modpython_gateway.pyっていうプログラムを使いました (5/21 遅いのでCherryPy + mod_proxyに変更しました)。この辺が1.0リリースまでに改良されるといいのですが。それから、このサーバはPython2.3なのですが、controllers.pyの@expose()を[expose()]に書き換える必要がありました(デコレータが使えないため)。まだ、2.3で動いているサーバも多いと思いますが、一応問題なく動いているようです。

大したプログラムではありませんが、ソースコードはMITライセンスで公開します。世の中の誰かの参考になれば… 展開したら、dev.cfgのsqlobject.dburiを適当に書き換えてください。その後、以下のコマンドで必要なテーブルが自動生成されます。
$ tg-admin sql create
次のコマンドを実行すると、CherryPyのWebサーバが8080ポートで起動します。
$ ./start_address.py

Unisonのバージョンが違うんだからっ!

ZaurusとFedoraでhowmのディレクトリを同期したいのですが、unisonのバージョンが違うようで怒られます。

[zaurus@C860]$ unison howm/ ssh://fedora/howm
Contacting server...
Enter passphrase for key:
Fatal error: Received unexpected header from the server:
 expected "Unison 2.9" but received "Unison 2.1".
This is probably because you have different versions of Unison
installed on the Client and server machines.

困った。どこかにunison-2.13のarm.ipkないかな…

久しぶりにSharp ROMなZaurusに戻してみた

Kernel 2.6採用の pdaXrom beta4 なんていう非常にそそられるモノが出てきましたが、これはSL-Cx000用なんですよね。自分のC860じゃ動かない… "for extreme testers only"みたいですが、誰か試したらレポートしてください。同じKernel2.6なOpenZaurusの軽快な動作をみると、かなり期待できそうなんですが。

悔しいので、1年半振りくらいに標準Sharp ROMを使ってみました。スペカを v14h に上げたり、最近とても速くなったらしいDGenをインストールしてみたりしました。自分で設定したKeyHelperのキーバインドは忘れちゃってたけど、けっこう使い易いですね、Sharp ROMは。やっぱりOperaという軽いブラウザがあるのがポイント高いです。互換性はFirefoxにはかなわないけど、JavaScriptのサポートも必要充分だし、キーボードだけで操作できるのがいい。

Sharp ROMもいいな、と再認識したこの週末でした。しばらくこのまま使ってみるつもりです。でもやっぱり、僕はコンソールとXEmacsを使っていることがほとんどなので、画面が広くて、この2つがキビキビと動くpdaXromに戻っちゃうと思いますが。


「全事務職員がLinux Zaurusを使用している町役場は実在する」 - ガセビア

MeCabとPythonでマルコフ連鎖を書いてみる(改)

Python界でも自分で書いたプログラムを晒すとえらい人が添削してくれます、という仕組みはまだないですが、ちょうど時を同じくしてマルコフ連鎖のプログラムを書いている人がいました。

マルコフ連鎖プログラム - pyletの日記


なるほど、マルコフ辞書のキーはタプルにしたほうがスッキリしますね。こういうサンプルソースを公開してくれる人がいると勉強になるなぁ。ありがとうございます。> pyletさん
というわけで、 こないだのプログラム に手を入れてみました。だいぶスッキリしたみたい。これなら、連鎖数3にも5秒でできるよ。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import MeCab

def wakati(text):
    t = MeCab.Tagger("-Owakati")
    m = t.parse(text)
    result = m.rstrip(" \n").split(" ")
    return result

if __name__ == "__main__":
    filename = "test.txt"
    src = open(filename, "r").read()
    wordlist = wakati(src)

    # Create table of Markov Chain
    markov = {}
    w1 = ""
    w2 = ""
    for word in wordlist:
        if w1 and w2:
            if (w1, w2) not in markov:
                markov[(w1, w2)] = []
            markov[(w1, w2)].append(word)
        w1, w2 = w2, word

    # Generate Sentence
    count = 0
    sentence = ""
    w1, w2  = random.choice(markov.keys())
    while count < len(wordlist):
        tmp = random.choice(markov[(w1, w2)])
        sentence += tmp
        w1, w2 = w2, tmp
        count += 1

    print sentence

『プログラムは、人々がそれを読むために書かれるべきである。
たまたま、それが計算機で実行されるにすぎない。』 - Gerald Sussman

MeCabとPythonでマルコフ連鎖を書いてみる(連鎖数2)

PythonでMeCabを使ったわかち書きができるようになったので、マルコフ連鎖のプログラムを書いてみました。
MeCabとPythonで遊んでみたメモ(パパパパパイソン) に載っているものを参考に連鎖数を2に変更してみました。

パパパパパイソンさんのと同じ文章を元に自動生成した文章がこれです。やっぱり連鎖数1の時よりも、それらしい文章を出力してくれるようです。まぁ、意味が分からないのは一緒ですが。

それは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。掌の上で少し落ちついて書生の顔を見た。はここで始めて人間というものである。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものである事はようやくこの頃知った。これが人間の飲む煙草というものである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この書生という人間中で一番獰悪な種族であったそうだ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした所でニャーニャー泣いていた事だけは記憶している。第一毛をもって装飾されべきはずの顔がつるつるしている。第一毛をもって装飾されべきはずの顔を見たのがいわゆる人間というものの見始であろう。

次に某芸能人のブログの文章を元にしたものがこれ。もともと意味分かんないから、本人が書いたと言われても分からない気がする…

ルナ溺愛する!前世から のデスティニー!チャットおもしれえ(゜∀゜)(゜∀゜)(゜∀゜)━━━━━━カワユス!キティマ ミタス!キティマミタスDSギザカワユス地球大図鑑いただいてしまった!うれしい(´;ω;`)なんかGJってコメントが沢山ですごいお(^ω^)セラムンコス貪欲にとりくんでプロクオリティめざしてるとこだお

ソース

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import random
import MeCab

def wakati(text):
    t = MeCab.Tagger("-Owakati")
    m = t.parse(text)
    result = m.rstrip(" \n").split(" ")
    return result

if __name__ == "__main__":
    filename = "test.txt"
    src = open(filename, "r").read()
    wordlist = wakati(src)

    # Create table of Markov Chain
    markov = {}
    prev1 = ""
    prev2 = ""
    for word in wordlist:
        if prev1 and prev2:
            if not markov.has_key(prev2):
                markov[prev2] = {}
            if not markov[prev2].has_key(prev1):
                markov[prev2][prev1] = []
            markov[prev2][prev1].append(word)
        prev2 = prev1
        prev1 = word

    # Generate Sentence
    count = 0
    prev2= random.choice(markov.keys())
    prev1 = random.choice(markov[prev2].keys())
    sentence = prev2 + prev1
    while count < 100:
        tmp = random.choice(markov[prev2][prev1])
        sentence += tmp
        prev2 = prev1
        prev1 = tmp
        count += 1

    print sentence

関連リンク:

改良版です → MeCabとPythonでマルコフ連鎖を書いてみる(改)

POLYSICS

今、テレビでPOLYSICSのライブを観てるんだけど、キてるなー
初めて聴いたけど、メチャクチャなようでも破綻してない。

あっ、バイザー取った!


Now is the time!

恋人選びもブログで見極める時代

うーん、今まで自分のことを至って普通の好青年だと思ってたんだけど、どうも違うようです。やっと気づいたよw


昨日、学生時代の仲間が久しぶりに集まりました。関東近県や名古屋から9人ほどが集まったのですが、ほとんどが妻子ありか結婚秒読み段階でした。子供がいるorお腹の中にいるっていう奴も3人いました。彼女もいないで寂しい生活を送っているのは、いつの間にかMINIクーパー氏と自分だけになってました…
さすがにちょっと焦りを感じて、その場にいたT君に誰かいい子がいたら紹介してよ、とお願いしてみました。すると、T君は携帯電話を取り出して同じ職場の後輩の子にメールしてくれました。おぉっ、なんていい奴なんだ。ワクテカ

すぐに返事が返ってきました。反応いいよ、これはもしや! > ワクテカ×2

後輩女子「Tさんの友達は嫌です!」

あぁ、そうだよね。分かる分かる。T君の友達だから、アイドルおたくだと思って警戒してるんだよね、きっと。そこで、普通の好青年だから心配しないでってT君に返信してもらいました。次に返ってきた回答は、

後輩女子「勘違いしてるだけ はらたいらさんに5,000点」

撃沈。


後で聞いたら、どうもこのブログを読んだことがあるらしく、 姉キャンのエントリ を見て"ドン引き"してしまった模様。くー、バレちゃあしょうがねー。もう諦めて、このまま今流行りの「ちょいエロおやじ」目指して進んで行くでありますよ。
しかし、会社の採用試験で応募者のブログを参考にして人柄を見極めるっていう話があるけど、恋人選びにおいてもブログを活用する時代になってきているんですかね。確かにお見合いや合コンに行く前に相手のブログを読んでいると、話が進むのは早そうです。僕は、SNSを立ち上げて一番効果がありそうなのは結婚相談所だと思ってるんですが、既にビジネスとして行っている会社ってあるのかな。誰か一緒にやりませんか?

MecabのPythonバインディングを使ってみる

例によって、FedoraとCentOS用のPRMパッケージを作りました。利用するには、先に Mecabをインストール しておく必要があります。


インストールしたら、さっそく試してみましょう。次のようなサンプルプログラムを書きます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import MeCab

sentence = "太郎はこの本を二郎を見た女性に渡した。"

try:
    t = MeCab.Tagger()
    m = t.parseToNode(sentence)
    while m:
        if m.stat < 2:
            print m.surface, "\t", m.wcost, "\t", m.feature
        m = m.next
except RuntimeError, e:
    print "RuntimeError:", e;

実行すると、下記のような結果が出力されます。

太郎    7473    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      2919    助詞,係助詞,*,*,*,*,は,ハ,ワ
この    1017    連体詞,*,*,*,*,*,この,コノ,コノ
本      5040    名詞,一般,*,*,*,*,本,ホン,ホン
を      2670    助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二郎    5667    名詞,固有名詞,一般,*,*,*,二郎,ニロウ,ニロー
を      2670    助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      6208    動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      3939    助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    2278    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      3622    助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    5101    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      3939    助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      -12     記号,句点,*,*,*,*,。,。,。
ふむふむ、この結果から名詞だけを取り出して、単語生起コストをごにょごにょすればよいわけですね。
"二郎"が"ニロー"になってるけど、固有名詞だからしょうがないのかな…

Mecab 0.91のFedora用とCentOS用RPMを作った

Mecab 0.91がリリースされたようなのでRPMパッケージを作りました。辞書の文字コードは、UTF-8にしてあります。

[Fedora Core5用]

[CentOS4.3用]


使い方は、mecabコマンドを実行すると入力モードになるので、「すもももももももものうち」とか解析したい文章を入力すると 、わかち書きをして品詞の種類などを教えてくれます。

$ mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

お部屋探しだにゃー

今住んでいる所から諸事情により引っ越さなくてはならないため、GWは不動産屋巡りの日々を送っています。

社会人になってから既に4,5回引越しましたが、今まで住まい選びで悩むことはありませんでした。ずっと会社の寮だったので、選択の余地がなかったので。ところが、急にどこに住んでもいいよとになると、余りにも自由度が高すぎて困ってしまいます。刑務所に長く入っていた者が出所しても落ち着かず、刑務所に戻るためにあえて罪を働いてしまうのも何となく分かる気がします(何かで読んだ。 「刑務所のリタ・ヘイワース」 だったかな…)。思わず、中央線、小田急線、京王線、東横線、田園都市線、つくばエキスプレス沿線とか、節操もなく、あちこち見学に出掛けてしまいました。それぞれの先で地元のおばちゃんに、「スーパーはどこにあるんですか?」とか「住みやすいですか?」とか聞いたりして、なかなか楽しかったりするんですが。聞いてない噂話まで教えてくれたりするし。

いろいろ見たんですけど、やっぱり駅前がごみごみしている所はあまり好きではないのと街路樹フェチなので、今住んでる田園都市線沿いに決まりそうな感じかなぁ。


関連リンク:

あなたの部屋に春は来る!?「意外と密接な部屋と恋愛の関係」

Ploneでcontent:encodedを使ってRSS全文配信

今日からRSSフィードで全文配信するように変更しました。Plone(COREBlog2)での設定手順は次の通りです。

Zopeの管理画面から、portal_skins/plone_templatesを開きます。次にrss_templateをクリックし、[Customize]ボタンを押して編集画面に入ります。itemセクションのdescriptionタグを探してください。みつけたら、</description>の後に次の行を挿入します。

<content:encoded
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     tal:content="structure python: obj_item.getBody()">blah</content:encoded>

今まで全文配信してなかったのは、単純にPloneのデフォルトの設定がそうなっていたからです。PloneはCMSなので、Blogエントリだけでなく、かなり長文のコンテンツも管理することができます。そのため、コンテンツの概要(Description)をインデックスとして保持していて、検索結果やRSSにはこの概要を表示するようになっています。

BlogエントリをRSSで全文配信するべきかどうかという議論が少し前に盛り上がっていましたが、Ploneのこの仕様は正しいと思いますね。個人的には、全文読まなくても概要が分かるようなRSSを配信して欲しいです。その内容について詳しく知りたかったら、そのサイトを訪れるので。もちろん、RSSリーダ上で全部読みたいというのも理解できます。上で紹介した方法では、概要に加えてcontent:encodedで記事全文を配信するようにしています。Bloglinesだと、RSSを購読している人の方で概要/全文どちらの表示にするかを選択できるので、これがベストな方法かと。

参考リンク: http://plone.org/documentation/how-to/add-full-body-to-rss-feed