« 2006年09月 | メイン | 2006年11月 »

2006年10月28日

日記

今日は朝の10時に留学生と待ち合わせをしてオープンキャンパスに行ってきました。着信履歴に入っていた番号を彼からの電話だと思ってかけたら佐川急便につながったり。

その後、彼が「デジカメ買いたいんだけどいい店知らない?」と言うので秋葉原に連れて行くことに。でもネットで調べた価格と比べて1万円も高い、とのこと。帰ってきて調べてみたら、最安値はPC-Successでした。それがわかっていれば行けたんだけども…まぁいいや。

脳の中にはやっぱり「英語スイッチ」がある。英語スイッチが入ると英語モードで考えてしゃべる。日本人が複数いては外国人と話そうが海外に行こうが日本語モードのままかもしれない。英語モードの状態をどれだけ続けたかが重要なのかも知れない。そう考えるとマンツーマンの(日本語で考えている暇のない)英会話スクールは結構有効かも知れない。

Pythonでコーディングしているときもやっぱり「Pythonスイッチ」が入る。 そうするとインタプリタの気持ちがわかるようになる。たぶん誇張。

2006年10月27日

日記

台湾から留学してきている人からのメールが見事にスパムフォルダに入っていた。中国や台湾の人とメアドを交換したら、すみやかにホワイトリストに入れなきゃいけないね。


__ コンシーラというものは、シミを隠したりするファンデーションのようなものらしい。今までまつげを挟む工具のことだと思ってた。


__ 昔、スタートメニュー直下に「,」(カンマ)という名前のフォルダを作って、そこによく使うショートカットを置いていました。僕の使っているThinkpadTabletX41にはWindowsキーがないので、右AltをWindowsキーにしています。だから右Altを押してからカンマを押すと、そのショートカット一覧が開かれるのです。しかしショートカットの数が増えると問題が明らかになりました。ショートカットの中にFirefoxとFFFTPとInternetExplorerがあったとすると、Fを押しても候補が複数あるので選ばれず、次にIを押すと直前のFのことは無視してInternetExplorerが立ち上がります。うーむ。

その後、C:\Home\shortcutsにパスを通して、ショートカットを置くようにしました。こうするとWin+Rで「名前を指定して実行」ダイアログを出して、そこにショートカットの名前を打ち込めばそれが起動されるようになります。しかも「名前を指定して実行」には補完機能があるので、全部打たなくてもWin+R FIR{DOWN}{Enter}でFirefoxが立ち上がります。

で、今日はその二つを統合しました。「,」フォルダにパスを通してショートカットをそちらへ移動。ファイル名を覚えているときは直接Win+Rして、忘れたときはWin+,して一覧から眺める、というわけです。


__ 3日くらいひたすら寝ていたので、Jythonの本、全然はかどっていません。 今日は新しい章にチャレンジ。


__ おなかすいてきた。よく考えたら昨日、ハクサイとネギを全部食べてしまったので鍋の材料を買ってこないと鍋ができない。

キムチ鍋を作りました。汗がすごい。


__ AutoHotKeyを使うとCtrlが押しっぱなしになったりとかするんですけど。

なんかSend,!+xjをSend,+!xjに変えたら起こらなくなったんですけど、元に戻しても起こるようにならず…うーん。


__ ウィンドウをきれいに切り抜いてくれるソフトが欲しい。

手で切り抜いた後で1ピクセルずれていたりするのを見つけると許せない。

8倍に拡大して切り抜く。ウィンドウの左上は白線じゃなくて灰色線であることに注意。


__ プトレマイオス超エジプト。

比戸君の「くらえ、モホロビチッチ・フレンゾクメン!!」に反応しつつ、世界史を履修したことをアピールw

それはさておき、何が負担なのかさっぱりわかりません。 どうせ履修していないのに履修したことにして単位を出すくらいモラルが欠如しているんだから、世界史の授業中に内職している生徒に気がつかない振りをし、世界史のテスト中にカンニングをしている生徒にも気がつかない振りをしたらいいだけじゃないかと。

2006年10月26日

日記

今日は起きて頭が痛くて寒くてまた寝て、何も食べていないことに気がついて、「すきや」に行ったら負けだと思って、野菜を買ってきて鍋にしました。ネギやハクサイは縮むからたくさん入れても大丈夫だけど、大根をたくさん入れると大変なことになると学びました。

KNOPPIXの頭のKは発音するらしい。

2006年10月25日

日記

昨日は、東京に着いてみるとえらい寒いし、 西船橋に着いてみると雨風激しくてずぶ濡れになるし、 途中まで歩いたところで手に持っていた紙袋が雨に負けるし、 傘は裏返るし、 やっとの事で家にたどり着いたらノートパソコンがブルースクリーンで落ちて、 その後起動しなくなるし、でさんざんでした。


__ Rozetkus power stripというACタップは、端子の丸いヨーロッパとかのプラグじゃないと刺さらないけど、十字にするとかしたら日本でも使えないかなぁ…などと思っていたのですが、こういう解決法もありですね。METAPHYS<メタフィス商品:node>


__ だいぶ寝たのでだいぶ楽になった。 雨もやんだし、備蓄食糧ばかり食べているよりタンパク質を取った方がよさそうなので近くのすきやに行ってこよう。

そうそう、杜仲茶来ました。後で書きます。


__ Hello, KNOPPIX!

ThinkpadA30にKNOPPIXを入れました。正確にいえばCDからブートしているので入れたというのも変かもしれません。CDイメージを焼いて入れて起動するだけ。

UNIXは日本語入力が面倒というイメージがあったのだけど、デフォルトではいっていたSCIMというものはなんだか賢いです。予測入力なんかをサポートしているみたいです。しばらく触れないうちにいろいろ進化したのですね。

最新のFlashPlayerを入れるとYouTubeも見られるようになりました。 なんかあっさり行き過ぎてこれでいいのかと(いいに決まっている)

ちなみにこのマシンが昨日の紙袋の中身です。水たまりの中に落としたけど大丈夫だったようです。


__ 久しぶりにラベルプリンタを取り出して、お気に入りキーボードのラベルを作ってみたのだけども、サイズが微妙に合わない。

今のところEclipseでお気に入りに割り当てているショートカットは「Java実行!+xj」「コンソール!+qc」「エディタ{F12}」の3つ。コンソールを閉じるのは結局「エディタにフォーカスを移す」でいいじゃないかと気がついたのでただのF12に。今後マウスを使う作業を徐々にキーボードに置き換えていこう。Alt+Tabで切り替えるのは画面を見て何番目かを把握しないといけないので、直接Eclipseにフォーカスするキーとか作ろうかな。

2006年10月24日

日記

やっぱり風邪を引いてしまいました。寒気が…。マフラー装着していいですか。

あー。マフラーをカバンから取り出して置いてきてしまった…。毛糸ならあるけど編むわけにもなぁ…。

Pythonのジェネレータを使ってprivateな変数

Pythonのジェネレータを使えば変数の値を隠せるんじゃないかとふと思ったのだけどダメだったという話。 下のようなコードならprivateな値にアクセスする方法がないんじゃないかと期待した。
>>> def Counter():
	private = {"count": 0} # private
	def push():
		private["count"] += 1
		print private["count"], "回押されました"
	def clear():
		private["count"] = 0
	public = {"push": push, "clear": clear}
	yield public

>>> c = Counter()
>>> c.next()
{'push': <function push at 0x00E3D1B0>, 'clear': <function clear at 0x00E3D370>}
>>> push = _["push"]
>>> push()
1 回押されました
>>> push()
2 回押されました
>>> push()
3 回押されました
でもdirしてみたらフレームの情報があるのが見えてしまったのですぐにprivateな値に到達。
>>> c.gi_frame.f_locals["private"]
{'count': 3}

2006年10月23日

日記

いやなブログ: 文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++。参考になる。いやなブログ: 配列操作の比較表: Ruby, Python, JavaScript, Perl, C++。これも。

__ 秋元@サイボウズラボ・プログラマー・ブログ: あなたの知らない5つの楽器ガジェット経由。 Hacked Gadgets » Blog Archive » Tesla Coil Music。放電。


__ Sun & Users - オープンソースプロジェクトの翻訳作業を支援するサン 第2回 ~サンの翻訳の方針とノウハウを公開~

「「日本語スタイルガイド」(中略) このスタイルガイドは、日本語の文体や定型の訳文を整理したもので、どのドキュメントを読んでも、表現(Look&Feel)に統一感を与えるという効果を持つ。 (中略) このスタイルガイドは、サンからの提供を受けてOpenOffice.orgプロジェクトやGNOMEプロジェクトで公開されており、誰でも閲覧できる。(中略) このほかに、英語でドキュメントを書く場合のスタイルガイドもあり、これはツールを使って自動的にスタイルをチェックすることができるという。

ふむふむ。


__ Kazuho@Cybozu Labs: JavaScript を学ぶ上で読むべきウェブサイト経由。Core JavaScript 1.5 Guide - MDC。参考になる。


__ Eclipseで、コンソールを高速ビュー化して全画面で表示するようにしているのだけど、今まではエディタとコンソールの切り替えがマウスだったので面倒だった。AutoHotKeyでAlt+Ctrl+CとDとに「コンソール表示」「コンソール最小化(正確にはフォーカスしているビューの最小化)を割り当ててみた。

^!c::
	Send,!+qc
return

^!d::
	Send,!wg{Down}{Down}{Down}{Enter}
return
(追記:コンソールは高速ビューにしてあるのでエディタにフォーカスを移すだけで最小化できると気がついたので^!dはSend, {F12}に変更しました。)

__ JYamlで空っぽのHashtableを出力した場合 「!java.util.Hashtable {}」となるべきところが「!java.util.Hashtable」になるので、出力したものを再度読み込みするとエラーになる。


__ 2.3.6 シーケンス型の注の6番目を訳し直したいけど、今日東京に帰らないといけないのに29時になってもまだ起きていて、しかもちょっと冷えて喉が痛くて体がほてってるのはとてもよくない。寝るべき。

もうちょっとで改良版の「3時間でわかるPython」が完成するんだけど、まぁ、また今度でいいか。

なおこの「3時間でわかるPython」は現在執筆中の「実用Jythonスーパーガイド」に入る予定です。出版社を伏せれば書いていること自体はむしろ公表しちゃった方がいいとのことなので公開してみました。以前言っていた「プロジェクトC」ってこれのこと。「プロジェクトB」は待機状態です。あと、ラボが週に1回進捗報告と飲み会をするようになったので、「今週は本書いてたから進捗しませんでした」ってわけにもいかない。マルチタスクをいかにして効率化するか…。

2006年10月22日

日記

12キー版ディスプレイキーボードUpravlator - Engadget Japanese

これでバイオモルフ(アプレット)のアニメーションバージョンを作ると面白いかも。親アニメーションに突然変異が加わったものがそれぞれのボタンに表示されて、クリックするとそれを親としてまた突然変異を加える。

2006年10月20日

日記

The Log of the No22 - それは逆ポーランドじゃない(1) , それは逆ポーランドじゃない(2) , それは逆ポーランドじゃない(3)。 「数値やリストのリテラルに見えるものも含めてすべてが実はスタックに対する関数」「関数合成のみの式では、どこで式を「切断」しても正当な式に分割することができ、また「連結」の順番が同じであれば式全体の意味は変わらない」。おおお、目から鱗!

なんか急に髪の毛が伸びていることに気がついて、 うっとうしいのでちょっと切ってみたのだけど、 右利きだから左側の切り具合が足りなくて気になる…。 左耳の上が右耳の上より長くて暑い。

クラスとは何なのか、なんで必要なのかを説明しようと思っていたら、 結局クラスなんてなくてもやりたいことはできることに気がついた。 ハッシュに必要なメソッドとかフィールドとかつっこんで、 メソッドを呼び出す際にそのハッシュをきちんと渡してやれば クラスを定義しなくても問題ない。 単にクラスを使うとすっきり書けるというだけ。


__ @大阪の実家。

長野テクトロン お気に入りキーボード。だいぶ前に買ったんですけど、間違えて郵送先を千葉じゃなくて大阪にしていたので今頃手にしたわけです。 あとはAutoHotkeyと組み合わせていろんな作業を自動化すると面白いかと思っています。


__ テーブルにハサミ型シュレッダーが乗っていて「あー、こーてやぁる」と思ったら、本棚には Amazon.co.jp: 暮らしに役立つ 2ちゃんねるの使い方が。あー。この二人の子供です、僕。


__ 渡辺さんはエディタにマクロ機能をつける方法を探してらっしゃるんだと勘違いしてPython埋め込みを紹介したんですけど、JavaScriptがいいんですねー。

サーバサイドのプログラムがクライアントサイドのプログラムを生成するというメタな感じが面白いと思う人におすすめなのはサーバサイドをJavaScriptで書いてしまうAJAJA。萌える。


__ スラッシュドット経由 asahi.com:リスク回避にネット監視活況 メールから取り付け騒ぎも - 暮らしのせいで「佐賀県庁が監視との報道で、2ちゃんねるでは「佐賀」が大流行 (中略)現在1万以上のスレッドに「佐賀」の文字が。」(やじうまWatch)って話題。

公式キャッチフレーズの「佐賀を探そう」を逆転した「佐賀を探してます」というネタかと思いました。


__ AutoHotKeyのスクリプト言語がかなり辛い。誰かPythonでラップしてくれないかな~なんていってみる。

2006年10月19日

日記

ここのところ鼻と喉の調子が悪いのは、知らないうちに冷えているからなのだろうか。


__ 部屋をきれいに片付ける人と、僕のようなすぐに散らかる人との間では、そもそも「あるべき部屋の状態」の認識が違うのだと思う。 片付ける人は、いろいろなものが「見えない」状態を好むのに対し、僕はいろいろなものが自分から「見える」状態を好む。

片付ける人にとっては、床には何も置かれていないのが「よい」状態で、それをキープするために片付けるのだろう。僕にとっては床は歩くところで、歩けるだけのスペース以外はものを置くところ。必要もないのに床の上のものを片付けるなんてのは、自分一人しか使っていないパソコンで毎日ブラウザのキャッシュとクッキーを削除しているようなもの。

…なんて書いてみたけども、この理屈では床に空き缶やペットボトルが落ちている理由を説明できないので捨ててきます。


__ やっと産総研のカードをもらえました。これで18時以降にコンビニに行って、入れなくなって悲しい思いをしたりしなくて済みます(笑)


__ いま流行っている風邪はmixi経由でうつるらしいですよ!やばい!


__ 10時まで働くと帰りの電車がすいているという仮説の検証のために10時まで働きました(今9時45分)

これで帰りに新木場から京葉線の普通電車に乗れば座れるはず。で、南船橋まで行きすぎてから逆向きに乗り換える。

あー、しまった、明日大阪に帰るのに、ぷらっとこだまのチケット取ってないー。


__ mixiに貼った画像は誰でも見えてしまう、という問題、「過去にあまり考えずに決めた設計のせいで大きくなってから首が絞まったけどすでに変更不可能」という状態かと思っていたのですがそうではないようです。 ログインしなくても見える画像 | Okumura's Blog


__ GRINEditの作業ログをGRINEditのTracのWikiでつけるようにしようと思いつつ徹底できていない。


__ 座れなかったorz。 ちょっと遅すぎた模様。 武蔵野線の最終電車が終わってしまったので。


__ サーバがメンテナンスで止まるときに、リポジトリはsvkを使っているから問題ないのだけど、Tracが動かなくなるのは困りもの。

なんか本当に、できそこないのCommonLispを作っているような気分になってきた。結局のところ、頂点を辺よりも先に生成しないといけないのは、辺の生成時にシンボルを評価してしまうからであって、必要になるまで評価を遅延させれば何の問題もない。描画毎にヌルチェックが行われるだけなのでパフォーマンスにもさして問題はなさそう。西尾泰和のブログ: logで、なんで「微妙」と思ったのか「微妙」としか書いていないのでわからないけども、setterで頂点の名前を変更したときに、頂点そのものへの参照をnullに戻しておいてやれば、大したコストなしに「辺をつなぎ替えられる」というメリットも得られる。


スラッシュドット ジャパン | リアル「ロケットガール養成講座」開講 __ 秋田大学ものづくり創造工学センター

…。この絵は…。っていうかただでさえ女の子は集めにくいのにこの絵は…。あっ、そうか、「ロケットガールになったらメディアに露出できて、もしかするとそのまま芸能界デビューも夢じゃないかも?」と煽ればいいのか?!(違)

そして秋葉原に「ロケットガール喫茶」ができる、と。ペットボトルロケットをロケットガールと一緒に打ち上げるのが1000円。って打ち上げられるスペースがないか…。

2006年10月18日

テスト重要

ユーザが見て面白くない動作チェックのためのスクリプト、呼んでもいいけど読まれることを意識して書いているわけではないスクリプトはtestフォルダに、見て面白いスクリプトや簡単なサンプルになっているようなスクリプトはdemoに入れることにしよう。

過去のスクリプトを色々試していて問題が発覚。

PyUnit初体験。

suite = unittest.TestSuite()
[suite.addTest(XMLRPCTestCase(s)) for s in dir(XMLRPCTestCase) if s.find("test") == 0]
なんて書いてから
unittest.makeSuite(XMLRPCTestCase)
でよかったと知る。

こういうのの説明を書く際に、細かい所から始めて楽なところへ進むのと、 楽なのを最初に教えてから細かいことを教えるのはどちらがいいのかなぁ。

書いたコード

import unittest

class XMLRPCTestCase(unittest.TestCase):
    def setUp(self):
        import xmlrpclib
        self.server = xmlrpclib.Server('http://localhost:8080/RPC2')
        self.grinedit = self.server.grinedit
        
    def testAddVertexAndEdge(self):
        "simple test"
        g = self.grinedit

        v1 = g.addVertex("BoxVertex", {"label": "Hello"})
        v2 = g.addVertex("CircleVertex", {})
        g.addEdge("LinearEdge", {"v1": v1, "v2": v2})
    
    def testBatch(self):
        self.grinedit.batch([
            {"method": "addVertex", "params": ["CircleVertex", {}]},
            {"method": "addVertex", "params": ["CircleVertex", {}]},
            {"method": "addVertex", "params": ["CircleVertex", {}]}])
            

def suite():
    return unittest.makeSuite(XMLRPCTestCase)

if __name__ == "__main__":
    unittest.main()

簡単。問題は、目視しないと発見できないエラーが多いことだろうか。SWTからAWTに変えた際にCircleVertexの塗りが少しずれて隙間ができているとか。まぁ、全部のテストを自動化する方法を悩んでないで、簡単に自動化できるところから自動化するのが正しいのだろう。

日記

「電波目覚まし時計」というからには、時計を電波で合わせるだけだじゃなくて、目を覚まさせるのも電波でやって欲しい。

あ、ラジオ機能があるからいいのか。


__ 渡辺さん、「 5. 他のアプリケーションへの Python の埋め込み」なんてのもありますよ。Rubyにもあるかと思いますけど、見つけられませんでした。


__ 一昨日、ブルーベリーのハチミツ漬けを衝動買いしてしまったのだけども、何に使ったらいいかなぁ。「目にいい」と言われると弱い。

2006年10月17日

vim日記

*if_python.txt* For Vim version 5.7. Last change: 1999 Oct 28。そんな昔からPythonインターフェイスが付いていたのかー。vimで
:py << EOF
for i in range(10):
  print i
EOF
と打ってみて、ちゃんと動いてちょっと感動した。

KaoriYa.net からlibiconvをダウンロードし、iconv.dllをwindows/system32にコピーした。

vim各種設定を見ながら設定してみる。

「:echo $VIM」して確認した上で_vimrcに「set backupdir=$VIM/backups」と書いてみた。

サクラエディタ風にタブを表示するために

set listchars=tab:^\ 
set list
highlight SpecialKey guifg=#BBBBBB
バッドノウハウ…。 どこにも「タブ」という言葉が出てこないのはどういうことかと。

日記

PowerPointで資料を作って、PowerPointの配付資料作成機能で1ページに複数枚のスライドを割り付けると、空白がたくさん入ってスライドが小さくなってしまう。もっとスライドを大きくしようと調べたのだけどもわからず。Microsoft PowerPoint FAQ - 印刷にはオフィシャルではないものの「残念ながら、配布資料として印刷する場合、個々のスライドの大きさ及び間隔のカスタマイズをすることはできません。」と書かれている。

[225302]複数ページの PDF を 1 枚に出力する方法(Acrobat 7.0/Adobe Reader 7.0)を使って複数ページを印刷して配れば問題ないのだけど、印刷するのが自分でない場合には割り付けた状態で渡したい。

AdobeReaderでクセロPDFに対して印刷してPDFを作成してみたら、フォントがビットマップになってしまった。謎。dpiとJPEGの画質を最大限に上げれば見栄えはそんなに悪くないけど、ファイルサイズも大きい。あと、これでもやっぱりIとかが妙に太くなったりしてかっこわるい。

ああ、フォントを埋め込むようにすればよかったのか?むむ?

なんだかよくわからなくなってきたけどまぁいいや。

AcrobatReaderのカスタム4x2の割り付けを使えばちょうど普段使っているA7の付箋サイズになるなぁ。

前にWordで似たようなことに挑戦したのを思い出して検索。「"パワーポイントで1ページに8枚印刷できないかと試したけど無理で"」という文字列を含む記事があるのは簡単にわかったのだけど、そこから肝心のその記事にたどり着けない…。ブログのメインページや雑記カテゴリのような、変化が激しくてすでにそこには情報が載っていないようなページしかヒットしない…。サイト内限定検索にしてもヒットしない。うーん。自分がGoogleで検索できるというメリットを見込んで日々公開しているのに、こういう現象が起きると、やっぱりローカルで書いてローカルで検索する方がいいのかもなぁ、と思ってしまう。

キャッシュからパーマリンクを使ってジャンプ。

フォーマットに関する考察

JSONがほとんどPythonなのを利用して、PythonでpprintするだけでJSON形式で出力し、evalするだけでJSON形式を読む、という作戦が失敗したので次はXMLにするかYAMLにするか検討していたのだけども、YAMLはよく考えたらそれ自体でネットワーク構造を表現できるので、legacyフォーマット相当のことがシンプルに書けそう。頂点クラスの指定などの細かいことまでできるフォーマットの他に、ちょっと試してみるのに楽ちんなシンプルフォーマットがあってもいいのかも知れない。

- Vertex:
  - &vertex1 {label: Hello}
  - &vertex2 {label: World, bgcolor: [255, 0, 0]}
- Edge:
  - {v1: *vertex1, v2: *vertex2}
こんな感じかな。これなら見てすぐ理解できるし、print文しか使えないような ユーザでも問題なく出力できるだろう。

YAMLでグラフ構造を表現できる、と英語で書こうとして「YAML can represent ...」なんて書きかけたんだけど、Google先生に「YAML supports serializing native graph data structures through an aliasing mechanism」という例文を教えてもらった。「supports serialization of native graph structure」ではいけないのだろうか?いいらしい。


__ 早めに寝ようと思ったのに無意識にブラックブラックガムを口に入れるのは何とかしないと。もうすぐ26時。


__

Version: simplified
Vertex:
  - {label: Hello, id: vertex1}
  - {label: World, bgcolor: [255, 0, 0], id: vertex2}
Edge:
  - {v1: vertex1, v2: vertex2}
アンカーを使ったりしなくても、GRINEditでは全てのオブジェクトがid属性というアンカーに使えるものを持っているからこう表現できるんだった。シンプル表記用のフォーマットでやるべきことは、
  • キーVertexやEdgeに対応する値がマッピングでなくシーケンスの時は、シーケンスの中の各オブジェクトのidの値をキーとするハッシュの簡略表記として解釈する。
  • 各オブジェクトはマッピングを使って{classname: 文字列, params: マッピング}と表現されているが、もしこのマッピングがclassnameというキーを持たないなら、デフォルトのものが指定されたと見なし、そのマッピングはparamsに指定されたものと見なす。
  • もしトップのマッピングがLawというキーを持たないなら、デフォルトの物理法則が指定されたものと見なす。
もし物理法則を本当に指定したくない場合には「Law: {}」とやれば済む(頂点の移動すらできないからかなり無意味だが)(勘違い。頂点の移動はできる。単なる動的な整形のない「グラフ描画ソフト」に変わる)。そのほかの点については現在のフォーマットと共存させることに何の問題もない。こっちにしよう。

2006年10月16日

日記

いま領収書を整理していて気がつきました。 大垣のアパホテルに止まった際、禁煙のシングルを予約したはずなのに、その前に検討していた喫煙の安い部屋になってたので「あれれ?」と思いつつも、自分が予約を間違えたのかと思ってそこに泊まったのですけど、チェックインカードを見ると名前が間違っています。楽天トラベルで予約したのでカタカナ表記の名前を間違えるとは思いにくい…ということは僕はたまたま名字の同じ誰か他人が予約した部屋に泊まってしまったのかも?

確かに僕は「楽天トラベルで予約していた西尾ですけど」としか言わなかったし、予想と違う部屋を言われたときも自分が間違えたんだろうと思ったので否定しなかったけど…。

こんな部屋でした。P1060664 写真共有「フォト蔵」


__ 業務用 杜仲茶 100% 10g*30包 【ケンコーコム】を買おうかと思ったのですけど、念のため楽天で検索してみたら、同じ会社が楽天で売っているものの方がわずかに安いのを発見。謎。【楽天市場】業務用 杜仲茶 100% 10g*30包:ケンコーコム


__ ようやく産総研からゲストじゃないまともなIDカードがもらえるらしいです。これで夜18時を過ぎてコンビニに買い物に行ったときに中に入れなくて立ちつくすこともなくなるでしょう(2回も同じミスをしたし)。

あー、よく考えたらプロフィールに「5月から産総研にて外来研究員」ってのを書くべきなのかな?


__ 「後で書く」のまま忘れていた西尾泰和のブログ: 一連の関数のリストを作るを加筆修正。

2006年10月15日

log

どうして今まで気がつかなかったのかが謎だけど、GraphにanchorTableを持たせるんじゃなくて、アンカーを扱う物理演算PL_Anchorに持たせればJSONで物理演算を出力するのが面倒という問題は解決されるじゃないかと今朝5時に気がついた。

変更した。

JythonでJavaのクラスMapに対して isinstance(obj, Map)なんてのできるんだなぁ。 typeするとPyJavaInstanceとか表示されるけど、getClassすればJavaのクラスが得られるし。

IGRINObjectというインターフェイスを作ってみた。 XML-RPC経由で操作できるオブジェクトたちが持つべきメソッドを インターフェイスの形で明確化。

あー。 クラスでgetNameという名前のメソッドを宣言すると、 ClassクラスのgetNameとややこしくなりそう。 うーん。nameはそもそもクラスの名前と紛らわしいからと言ってクラスの名前の側をclassnameと書いているんだけど、nameもidに変えてしまったほうがいいのかもなぁ。nameでは一意であることがあまりアピールされていないし。

何も頂点のない状態でJSON形式で保存してpprintで整形するとこんな感じ。

{'Edge': {},
 'Law': {'Anchor': {'classname': 'org.nishiohirokazu.layout.PL_Anchor',
                    'params': {'target': {}, 'id': 'Anchor'}},
         'Repulsion': {'classname': 'org.nishiohirokazu.layout.PL_Repulsion',
                       'params': {'id': 'Repulsion',
                                  'repulsionK': 0.02,
                                  'repulsionRadius': 3.0}},
         'SpringEdge': {'classname': 'org.nishiohirokazu.layout.PL_SpringEdge',
                        'params': {'defaultNormalLength': 1.0,
                                   'defaultSpringStrength': 0.1,
                                   'id': 'SpringEdge'}}},
 'Vertex': {},
 'version': 'alpha0.20'}

ぎゃー。 JythonのPyFloatクラスやPyIntegerクラスはPyObjectを直接継承している!PyNumberとかないの?!

  File "plugins\grinedit-app\menu-saveAsJSON\init.py", line 52, in func
java.lang.ClassFormatError: Invalid method Code length 75346
in class file org/python/pycode/_pyx13
100頂点のグラフをJSONで出したものをJythonでevalしたら「そんな長いものはevalできない」と怒られてしまった。 JSONをPythonとして扱うのは無理みたいだ。 「Pythonとして読める」というメリットが使えないのであればJSONにこだわる理由はあまりない。単に永続化したいだけならpickleで、人間に見やすくしたいならYAMLで、XMLにしたいならXMLで。

Edgeの頂点をセットするメソッドで、引数として与えられた「頂点のid」を解決して自分のフィールドに頂点を置いている。 その為、単純に永続化されたファイルから復元したときにEdgeの作成が頂点の作成より先に来るとエラーになる。解決法はいくつかある。

  • ローダに手を加えて頂点を先に作成するようにする
    • 一番早いけど、やな感じ。
  • 実際にレンダリングなどで頂点オブジェクトを使うときまで評価を遅延させる
    • nullチェックの分遅い。あと、微妙。
  • 頂点への参照を直接持つのをやめて、頂点のidで持つ。
    • これが一番美しい。現状では作成した後で頂点のつながっている頂点を変えることはできない(消して新しく作るしかない)けど、これなら普通のsetterで頂点のidを変更するだけでつながる先が変わる。
    • ただし描画や整形のたびに全ての辺が2回ずつHashtableで名前解決をする。

多少不満が残るけども、1番目の選択肢で。

ふぅ。できた。 日曜日ももう終わりかぁ…。

JYaml - Yaml library for the Java language。ListとMapが扱えて、書いてないけどStringも当然扱えるだろうから、CommonGatewayを通せばほとんどコーディングなしでシリアライズできるかもなぁ。でもまぁ、それは今すぐじゃなくていいや。

日記

日曜日の朝起きるなり、まずキーボードに向かってJavaのソースコードを描いている自分に疑問を感じ始めた。

JythonでJavaのクラスMapに対して isinstance(obj, Map)なんてのできるんだなぁ。 typeするとPyJavaInstanceとか表示されるけど、getClassすればJavaのクラスが得られるし。

歩いていると開発できないとか言ってないで歩くべきなんだろうなぁ。 ダイエットのために。

2006年10月14日

日記

僕は「どうやって作るか」に偏りすぎていて「何を作るか」「なぜ作るか」をなおざりにしすぎなのかもしれない。

最初は「おざなり」って書いたけど「なおざり」の方が正しいのかな?


__ 一生懸命AntとかMavenとかでビルドさせようとしていたけども、Pythonで書いちゃう方が楽だなぁ。いいのかなぁ。


__ 昨日のニューラルネットは興味を持った人が何人かいるようなので、詳しく書いてみます。「ニューラルネット」というのは僕が勝手に言っているだけで、調べてみると説明のページが見つかったのでそちらを参考にしてください。 [AITIA WEB] moids。一つのコンデンサマイクと一つのスピーカが付いた同じ形の基盤がたくさんはしご状に並んでいました。上と下とで向きが逆になっているので、基盤4つの小さいループから6,8,…といろいろなサイズのループが存在しています。とても面白いです。個人的には(エンジニアのさがなのか)できあがったものを眺めるんじゃなくて、自分で回路を組み合わせて遊びたいのですけど(笑) スピーカもぐねぐね曲げられるようにして、0.5秒の遅延を起こす回路のマイクに自分自身のスピーカを近づけてそばで手を叩けば、理論上は鳴らされた音を拾ってテンポ120で拍をうつはずですよね。そういう「理解できる」素子をいくつか適当に組み合わせているうちに、ノイズや音漏れのせいで謎の挙動を示すようになるのが面白そう。そういうおもちゃを売っていたらぜひ買いたい。

「神社の中に巨大スクリーンが」という話は ICC Online | アート&テクノロジーの下の方にある「KODAMA」。 夕闇迫る頃に見ると、神社の中に森が広がっているみたいに見えて幻想的。

おおお、イッヒェンと世界一愛らしい妹ウッヒェンってオンラインで見れるじゃん。…再生中に画像の更新が止まってしまうなぁ…。うーん、残念。


__ Subversionのバージョンが1.3.1で「svn: このクライアントは、作業コピー '.' を扱うには古すぎます。もっと新しい Subversion クライアントをダウンロードしてください。」と言われたので subversion: ファイルの共有: Windowsから1.4.0をインストール。

JyConsoleには日本人にとってシビアな問題がある。

>>> a = u"あいうえお"
>>> a
'BDFHJ'
>>> import java
>>> java.lang.System.out.println(a)
(コンソールにBDFHJとでる)
(日本語文字列をprintするスクリプトをメニューから読み込み)
こんにちは世界
JyConsole上で入力された非アスキー文字の扱いがおかしいようだ。

Don Colemanの方のコンソールも同じだった。

Donのは複数行貼り付けた際に挙動がおかしくなる。JyConsoleはならない。

どちらを選ぶか難しいところだなぁ。とりあえずJyConsoleの方で、出力を本来のコンソールにもJyConsoleにも出すコードが書けたのでJyConsoleを使う方針で…。

あー。JyConsoleの中の人から「バグトラッカーにアカウント作ったから自由に使ってくれい」というメールが来た。やっぱりJyConsoleだなぁ。何か言ったときの反応が素早い。


__ 28時半か…。 最近太ったと指摘されて、考えてみたのだけども、 こういう時間まで起きていて、昼まで寝ていることで、1日2食になっているのがいけないのではないだろうか。あと運動してないし。運動しながらコーディングできるならいくらでも運動するんだが。エアロバイクこぎながらならコーディングできるかと思いきや、想像以上に頭が揺れるので近くのモニターは見づらい。ヘッドマウントディスプレイがモノクロでいいから1024x768とかになってくれればいいのになあ。

2006年10月13日

日記(大垣2日目)

19時半に新宿に帰らないといけないけど、3,4時間あれば帰れるだろうから今日も結構な時間見て回れますね。 説明が後先しましたがおおがきビエンナーレに来ています。 OGAKI Biennale 2006。 サイトを見てもいまいちピンと来なかったのですが、実際に回ってみると色々面白いです。

大垣駅を16時38分に出れば新宿の待ち合わせには間に合うようです。 あと今気づいたんですけど、新宿西口は新宿駅の西口ではなくて別の駅なの?まぎらわしい。


P1060699
P1060699 posted from フォト蔵

ニューラルネットだ! てんかん発作を起こしているニューラルネットの可聴化だ!

ニューラルネット in 日本家屋

僕は今まで、実世界に近い方(ハードウェアとか)をより抽象度の低い領域、 数学に近い側(アルゴリズムとか)をより抽象度の高い領域だと捕らえていたのですが、 これは間違いだったのではないかと気がつきました。 実世界に近い側やハードウェアでも、例えば「共鳴現象」という抽象概念や「赤外線カメラ」なんていうコンポーネントが存在しています。 ソフトウェアを使わずに実世界のコンポーネントだけを組み合わせて作られたものは、今までの僕の概念では「抽象化度が低いもの」だったのですけど、ある作品は、あえて比較するなら黄金比探索法よりも抽象化度が高いものでした。クイックソートといい勝負かもしれません。あれに比べればペアワイズアライメントの動的計画法による実装なんてはるかに泥臭いです。

ああ、そうか…。 例えばマンデルブロ集合をフラクタルっぽい画像を作り出すためのコンポーネントとしてとらえると、それをカスタマイズするために数式をハックするのは抽象化度の低い領域での作業になるわけか…。

なんだか色々やりたいことは増えたけども、 とりあえず、今一番やるべきことをやろう。


新幹線にて。 しまった。来た新幹線に飛び乗ったら全然座れなかった。 名古屋から新横浜まで座れないということは いったい金額に換算してどれだけの仕事機会が失われたのか。

車掌さんが来たので指定席が空いてないか聞いてみたら、 グリーン車の喫煙席が7席残っているだけで 他は指定席もグリーン席も全部埋まっているんだそうな。 ホテルが喫煙部屋なのは多少臭いだけだから耐えられるけど、 席が喫煙席だと周りでガンガン吸われる上に、 新幹線だから窓を開けられない…。 あきらめてデッキで作業することに。

健康>>作業効率>お金


__ 帰ってきました。

寿司に入っている緑のギザギザのことを、バレンと言っている人がいたので「バレンは版画をこするやつで、寿司に入っているのはバランじゃないのかなぁ」と思っていたのですが、調べてみたらバランのことを和歌山の方言でバレンというそうな。

大垣城にて。滝と木陰。時間があればここでコーディングしたかった。

P1060671
P1060671 posted from フォト蔵


__ route
route posted from フォト蔵

二日間の足取りを赤と青とで書き込んでみました。 初日まず、目的地と直角方向に進んで、お城を見つけるまで間違いに気づかない。途中、車で稲荷神社まで送ってもらってそこから改めて最初に間違えていって閉まったところを見に行く。2日目、南下して、細い皮と交差したところで曲がったつもりが、進んでいくとよくわからないところに到着。さまよったあげく自分が南に来すぎたことに気づく。戻る。その後、川に沿って大垣駅まで戻ろうとする。川とメインストリートの交差部分で駅と逆方向に進む。お城の前を素通りして銀行の先の交差点で地下道の入り口で自分向きの矢印に「大垣駅」と書かれているのを見て間違いに気づく。戻る。

ということでメインストリートの一部は7回通ったことになります。ひえー。 全部で何キロ歩いたんだろう。いい運動になりました。 そろそろ肩が悲鳴を上げ始めています。 明日は全身筋肉痛に違いない。

でも久しぶりに長距離歩いてみて、 意外とまだまだ歩けると言うことと、 歩くのはやっぱり楽しいと言うことを再発見。

肩の次はどうも右足首が痛くなりそうな予感。肩こりで緊張性頭痛が始まりそう。ねます。

2006年10月12日

日記(大垣1日目)

朝起きてメールチェックだけするつもりだったのに、コード書いて、仕方がないからコードだけ貼って説明は後で書こうと思ったのに、ついついほとんど書いてしまって…そんなことより先にすることがあるだろうと…。一連の関数のリストを作る

もう11時になっちゃう!


__ @12:33分発の新幹線

やっぱり、なぜか電車の中では集中して作業ができる。集中した状態に簡単に移行できる。気を散らせるものは多いはずなのに、多すぎて逆にシャットダウンしてしまうんだろうか。東京駅を乗り過ごして新橋まで行ってしまったけど。

ガーン。昨日ラボに行ってb-mobileの更新手続きをしたつもりだったのに、 どうやら僕がやったことは更新手続きじゃなくて単にアンインストールしてもう一度インストールしただけらしい。CD-ROMの中のextend.htmから更新手続きをしないと行けなかったらしい。ネットに接続できない。(´・ω・`)

しまった。11時前に遅めの朝ご飯を食べて出発するつもりだったのに、どたばたしてたからすっかり忘れてしまった。おなかすいた。

先日の「「時間がない」状態から抜け出すには、時間がどれだけかかるか・どれだけかけるかを明確にするべきかも」という話の具体化として、 自分が英文をどれくらいのスピードで読めるのかを計測して、 毎日行き帰りの電車で読める予定の量を印刷してカバンに入れるというのもいいのかも知れない。本当は印刷すると資源がもったいないので電子ブックがいいのだけども。軽くて小さくてPDFをいくつも入れておけるA3サイズの電子ブックないかなぁ。


__ 大垣にて。 素直に30分に1本のバスに乗ればいい物を、歩いた方が早いと思って目的地と直角方向に歩いて、結局到着したのは1時間後。orz。

目的のものはあんまり見る時間がなかったので、明日もう一度見に行こう。同じ部屋にあった他の展示もなかなか面白そうだったし。

自己組織化写像を応用してもっといい感じのモーフィングができないかなぁとか思った、少なくとも3枚以上のモーフィングで画像Aから画像Bへのモーフィングが画像Bから画像Cへのモーフィングに切り替わるタイミングが「キツイ」のは、線形補間を単純につないだせいで微分不可能な点ができているからだ。ちょうど3Dのボーンアニメーションの補完で線形補間よりスプラインでの補間の方が自然なアニメーションになるのと同じように、モーフィングもスプラインでやった方が自然になるはずだ。

問:N枚の透明なシートに白と黒で適当な符号を印刷し、M枚を選んで重ねたときに、上から撮影した1枚の画像だけでどのシートがどの順番で重ねられているかを判別するにはどういう符号にすればよいか。

USBのウェブカメラで意外と簡単に自作のバーコード的なものを読ませることができる。重要なのは読まれるものの位置を固定すること。それならばQRコードなどの既存のコードを使わない方が、そういうコードを面白い目的に使うのが楽そうだ。QRコードなんかは誤り訂正の仕組みが大きすぎてハックがしにくい。

あと白いインクで印刷するのは面倒。 あと、OHPに印刷したものって透けるから、どっちが上か(どっちが覆い隠している側か)の判定が難しくなっちゃうね。 なるべく人間の作業はなくしたいのだけど、やっぱり「指定された場所を不透明な白いペイントで塗る」という作業は必要になるのかもなぁ…。 シートが完全に透けてしまうとどちらが上かの判断は無理だし。

N * N 個のマスを使うトリビアルな解がある。 最初のN個はx番目のシートのみxマス目が黒く塗られているもの。 これでどのシートが存在するかが判定できる。 続くN * (N - 1)は全てのシートからの2枚の組み合わせについて、 片方が白、片方が黒になっている。最初のN個で存在することがわかっている2枚について、そのどちらが上に来ているかを判定できる。

シートが5枚程度なら、マス目は25個だから1列に並べても十分そう。 シートが20枚とかになると問題。マス目を小さくして画像処理能力で頑張ってもらう方針と、白黒じゃなくて何色かの判別しやすい色を使う方法とがある。

仮に白黒に限定しないなら、一番下の紙の色(白)と異なる2色を使うことでN * (N - 1)までは簡単に削減できることがわかる。一般に背景色をのぞいてP色使える場合に、マスがいくつあればN枚のシートの組み合わせを表現できるか?

一連の関数のリストを作る

Pythonのメーリングリストで、リスト閉包内包を用いて一連の関数を定義しようとした際に、以下のような現象が起きることについての話題がありました。
>>> funcs = [lambda x: k * x for k in range(10)]
>>> funcs[3](4)
36
>>> funcs[1](4)
36

これはリスト閉包内包がスコープを作らないので、それぞれの関数が「グローバルスコープのk」を参照しており、その値は関数を呼び出すときにはすでにループが最後まで回って4になってしまっていることが原因です。

まつもとさんは、Pythonの「デフォルト引数が定義時に評価される」という特徴を利用したイディオムを紹介してらっしゃいました。これはわかっている人間が自分だけで使うぶんにはクールで楽ですが、他の人が読むコードに使うのは好ましくないように思います。

>>> funcs = [lambda x, k = k: k * x for k in range(10)]
>>> funcs[3](4)
12
[lambda x: k * x for k in range(10)]がダメな理由は、lambdaの中のkがグローバルスコープのkを指しているからです。もう一枚関数で包めば(ローカル変数にしてやれば)期待通りに動くようになります。こちらの方がlambdaに慣れた人にはわかりやすい書き方かも知れません。
>>> funcs = [(lambda k: lambda x: k * x)(k) for k in range(10)]
>>> funcs[3](4)
12
でも、わかりにくいのはそもそも無理に1行で書こうとするからです。ワンライナーは悪。 おのおのの「呼び出せる」オブジェクトがそれぞれ別個の「かける数」を持つんですから、その通りに書けば何の問題もありません。
>>> class Multiplier:
	def __init__(self, k):
		self.k = k
	def __call__(self, x):
		return self.k * x

	
>>> funcs = [Multiplier(k) for k in range(10)]
>>> funcs[3](4)
12
この最後の例が一番美しいと思うのは、僕がJavaに毒されているからでしょうか?(笑)

intをstrに変更できるか?

タイトルは長くなりすぎるので厳密さを捨ててはしょりましたが、 「intクラスの子クラスのオブジェクトのクラス属性(__class__)をstrやstrの子クラスに変更できるか?」が正解。 できませんでした。同じ「Cで書かれた基本クラス」を継承したクラスなら変更できるようです。まぁ、根っこがCである以上仕方がないですし、「これを可能にすることとパフォーマンスとどちらが大事か」と言われるとやっぱりパフォーマンスですものね。
>>> class MyInt(int):
	pass

>>> MyInt(1)
1
>>> x = _
>>> x.__class__

>>> x.__class__ = str

Traceback (most recent call last):
  File "", line 1, in -toplevel-
    x.__class__ = str
TypeError: __class__ assignment: only for heap types
>>> class MyStr(str):
	pass

>>> x.__class__ = MyStr

Traceback (most recent call last):
  File "", line 1, in -toplevel-
    x.__class__ = MyStr
TypeError: __class__ assignment: 'MyInt' object layout differs from 'MyStr'
>>> class AnotherInt(int):
	def __str__(self):
		return str(self + 1)

	
>>> x.__class__ = AnotherInt
>>> x
1
>>> print x
2

2006年10月11日

はてなブックマークの件数を表示

はてなブックマーク日記 - ブックマーク数を画像で取得する API の公開についてを参考に、はてなブックマークの件数を表示するようにしてみました。 といってもMovableTypeを使っているのでテンプレートの適当なところにimgタグを入れるだけです。エントリーのフッタ(時刻やパーマリンクのあるところ)はモジュールに切り出してあったので、そこに一つ。それからカテゴリアーカイブのそれぞれのエントリへのリンクに一つ。修正はたったの2カ所でした。解説するまでもないかと思うので解説は省略。

画像の背景がピンクなのでこのグリーンの背景では目立ちすぎるかも知れませんね。あとカテゴリ内一覧のようなページを開くと画像がなかなか読み込み完了しなくてうっとうしいかも知れませんね…。うーん。

日記

なんかダメっぽい雰囲気。 一つ一つは別にそれほどたいしたことのない小さな「ダメ」なのだけど、 タイミング悪く3つも重なって現れたので、共鳴しあってダメな気持ちだけが増幅しあって、 合理的な理由のない「ダメな感じ」が頭を取り巻いている。 どうしよう…。 どうしたらいいんだろう。

「旅に出ろ」という案を出されました。 明日岐阜に一泊する予定なんだけど、 そのまま帰ってこないでさまよってくるとか…。

本当にそうしようかなぁ。 バッテリーは予備も含めて満充電すれば6~7時間持つし、 PHSの電波が届く所でならさほど仕事に影響でないし…。 svkいれたからオンラインじゃなくてもコミットできるしなぁ。


__ 秋元@サイボウズラボ・プログラマー・ブログ: 新興宗教Google教

おもしろおかしい: +3

十戒:The 10 Commandments of Google - The Church Of Google . Org

  • 3: 汝、Googleを動詞として使うべからず。

おもしろい。本当は訳そうとしたのだけども、断念。2番目の「汝、コマーシャルフリーの検索エンジンを作るべからず。(以下略)」がなぜ2番目に来るかというと、元ネタの十戒で「汝、偶像を作るべからず」だからなのですが、 Ten Commandments - Wikipedia, the free encyclopediaによればJewish / ProtestantかCatholic / Lutheran / New Churchかで十戒の内容が異なるとのこと。Google十戒はJewish / Protestantバージョン?そして日本語のモーセの十戒 - Wikipediaでは省略されているフレーズがGoogle十戒の中でネタとして使われているので(たとえばfor I am a jealous Engine, bringing law suits and plagues against the fathers of the children unto the third and fourth generationsはfor I the Lord your God am a jealous God, punishing children for the iniquity of parents, to the third and the fourth generation of those who reject meから来ている)、元ネタの十戒をちゃんと理解していないとうまく訳せないような気がします。


__ textfile.org経由で プログラミングと開発者のためのCodeZine:数字パズルを半自動的に解くプログラムの作成(数字パズル, 解法, Javaアプレット)。 なんか問題の自動生成を行うプログラムがニュースになったり、こんな記事が出たりしているようなので便乗。Knuthの Dancing Links - Wikipedia, the free encyclopediaというアルゴリズムで数独を含むいくつものパズルが効率よく解けます。A Java Sudoku Solver using Knuth's Dancing Links MethodとかDancing Sudoku by Daniel Seilerとかもあります。あ、そういえば後輩がちょうどプログラミングの勉強を洋書の"Solving SUDOKU"とかいう本でやっているんでした。この本はサンプルコードがVBで、後輩が使っているのはJavaだから、codezineの記事にも目を通しておくとわかりやすいかも知れませんね。


__ 後でインストールしようと思ってb-mobileの新しいライセンスパックをまだ適用してなくて、それをお台場に置いてきているので、明日以降のネット接続のために取りに行かねばなるまいて。


__ 頭の回りに漂っていたダメダメな雰囲気は、外に出て新鮮な空気を吸うとな多少マシになりました。 で、換気のために窓を開けてみたら…そうだった、最近家の周りに変な悪臭が立ちこめているのだった。発生源はうちではなくて、道を挟んだ斜め向かいのアパート周辺のよう。

まぁ、明日は大垣に行くし。そのまま北上したら新潟に行けるかなぁ、とか計画していたのだけど金曜日の夜には東京に戻ることになりそう。残念。


__ キターーー?!

これは本当に「天から降ってきた」としかいいようがないかも。はてなブックマークの件数を表示を作って、次はブログにコードを貼り付ける方法.js alpha0.2(Firefox only)に弾さんの方法を取り入れて0.3を作ろうかなぁと思っていたところで、なぜか、Jythonのほうのいいアイデアが。あー、そうかここで日本語で書いてないでコード書いて試すべきか!


__ 「時間がない」と思ってしまうのは、そのタスクを実行するのに必要な時間を予測することができていないからではないか? 予測しようとしてできないものなら、決めてしまえばいい。 例えば「部屋を掃除したいのに掃除する時間がない」というケースは、 「部屋の掃除にどれだけ時間がかかるかわからないから後にいくらずれ込んでも大丈夫な時しか着手できないのでなかなか着手できない、どれだけ大変な作業かわからないからとても大変な作業に思えてしまいしりごみする」という状態になっている。仮に「じゃぁ1時間だけ掃除」と決めてしまうと「じゃぁ、1時間でできるようなことから始めよう」とタスクのブレイクダウンが始まる。


__ 404 Blog Not Found:勝手に翻訳 - Googleの十戒

検索窓をおぼえてこれを潔くすべし、六日のあいだ働きて汝のすべての業をなすべし、七日は汝の神Googleの安息なれば、別のHackに勤しむべし。
原文
Thou shalt remember each passing day and use thy time as an opportunity to gain knowledge of the unknown.
ええと…。 どこがどう対応するのかさっぱりわかりません。 これってGoogle教の十戒の翻訳ではなくて、Google教の十戒とオリジナルの十戒の2つの翻訳文にインスパイヤされて、弾さんが創作した新しい十戒じゃないですか?

自信はないですが、passing dayは「過ぎ去りつつある今日という日」ではないでしょうか。 shalt rememberは「(何かを)覚えろ」と言っているのではなく「(何かを)忘れるな、気にとめておけ」と言っているのではないでしょうか。 Thou shalt remember each passing dayはつまり「あなたは毎日毎日が過ぎ去っていくものだと言うことを常に意識しておくべきです」という意味なんじゃないでしょうか。そう訳せば、次の文章and use thy time as an opportunity to gain knowledge of the unknownと素直につながりますよね。「あなたの時間を、まだ知らないことを知るために与えられたチャンスとして使いなさい」と。


__ しまった、もう26時半。14時に大垣に着くためには11時にこっちを出ないといけないので、8時間寝ると30分しか時間がない。あんまりのんびりしていつものように27時就寝とかすると起きてからあわてるハメになる。

眠くないなぁ。


__ Java 2 Platform SE 1.3: クラス KeyStrokeのgetKeyStrokeの説明。

"INSERT" => new KeyStroke(0, KeyEvent.VK_INSERT);
"control DELETE" => new KeyStroke(InputEvent.CTRL_MASK, KeyEvent.VK_DELETE);
"alt shift X" => new KeyStroke(InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, KeyEvent.VK_X);
"alt shift released X" => new KeyStroke(InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, KeyEvent.VK_X, true);
"typed a" => new KeyStroke('a');
releasedとかがサポートされているとは知らなかった。

Swingが意外と便利。というかSWTがまだ不便なだけ? それとも僕の勉強が足りないだけ?(たぶん後者) SwingでsetAcceleratorしたら、自動でアクセラレータの表示が出てくれちゃう。アクセラレータの表示を出すのとアクセラレータの指定をするのの両方をするのは面倒なのでDRYしよう、という話の流れにするつもりだったのに。しかも「mniLoad.setAccelerator(KeyStroke.getKeyStroke("control L"));」でできてしまうのでさほど面倒ではない…。

Swingは、JFrame#setVisible(true)した時点でJMenuBarにJMenuが追加されていれば、その後でそのJMenuに追加されたJMenuItemもきちんと表示される。しかし、setVisibleしてからJMenuを追加した場合は表示されない。 setVisibleしてJMenuを追加した後でまたsetVisibleすればきちんと表示される。

やろうとしたことは「メニューのアクセレータを変更するメニュー」で、まぁそれを作ること自体は難しくないのだけども、どうもJythonを使うととても幸せになることの例としては適切ではない。getKeyStrokeが存在するのと、指定したアクセレータが自動的にメニューに表示されるのが…。SWTだとそうではないので、Jythonを使うと楽になるのだけどもなぁ。Swingにすでにあるそれらの機能を使うと、残った部分はあんまりJythonである必要性がなくて、むしろAspectJを使うと楽になる例になりそうな気配(メニューのアクションリスナにフックをかけるあたりが)

まぁ、いいや。 少なくともメニューを全部Javaで書くとうっとうしいのは間違いないから、ここをJythonにするってストーリーにして、そしたらカスタマイズも容易になりました、というオチにしよう。

パラメータを取るデコレータ

2通り書いてみました。

def showMessage(msg):
    def decorator(func):
        def foo(*args, **kw):
            print msg
            func(*args, **kw)

        return foo
    return decorator

@showMessage("Hello")
def foo():
    pass

foo()

# 以下は誤り
#class ShowMessage(object):
#    def __init__(self, msg):
#        self.msg
#    def __call__(self, func):
#        def foo(*args, **kw):
#            print msg
#            func(*args, **kw)
#
#        return foo
#
#@showMessage("Hello") # ←間違えて小文字にしたせいで1つめの定義を使って動いてしまった
def foo():
    pass

foo()

2006年10月10日

日記

おおおっ、GoogleによるYouTubeの買収が成功したんですか!

というか北朝鮮の核実験をスルーしてYouTubeの買収は書く自分って日本人としてどうなんですか(ぇ


__ textareaでソースコードを貼り付ける方法を考えた 西尾泰和のブログ: ブログにコードを貼り付ける方法.js alpha0.1は、IEとの挙動の違いに頭を悩ませて投げ出してしまったのですけど、 404 Blog Not Found:javascript - ある意味究極のソースコード添付法 でできるそうです。参考になります。


__ JythonでJavaのクラスとPythonのクラスをミックスできることのメリットはいったい何なんだろう。Pythonのクラスでなければミックスできないのだから、将来的にJavaに変える可能性を奪うことになる。


__ 調べる時間も含めて1ヶ月でCybozu Developer Network: Python 調査報告 (2006/10) ができたと聞いて焦燥感を感じたり。というよりむしろ自信喪失気味。僕がJythonの解説を書くよりも山本さんが今から1ヶ月サーベイして書いた方がいいものができるんじゃないかと…。


__ しまった。12日に大垣に行くのの宿泊予約を今頃やろうとしたらもうかなり埋まってる。安い順で喫煙のシングルの6,300円と「とにかく安く泊まりたいカップルに!★シングルA(2名利用) 」という謎のシングルの6,800円ってのは、要するに普通のはもう埋まっちゃったってことかな。後者のシングルに一人で泊まるのはありなんだろうか。でもこれ喫煙とは書いていないけど禁煙とも書いていないなぁ。バイキング付きの禁煙シングルが7,200円かー。部屋が臭いかも知れない可能性と900円と朝食と…。

禁煙で予約したー。


__ JyConsoleを作っている会社のCEOの人からメールが来ちゃった。 お返事書かなきゃ。大変だ。

書いた。


__ メタ構文変数としてmip, mopと書いているケースを見かけたので、そういう流儀もあるのかと調べてみた。Metasyntactic variable - Wikipedia, the free encyclopedia。すごい。こんなにいっぱいあるんだ。

もし将来カフェを開いたら「51966」って名前にしようと思っていたのだけど、 メニューの一番上には「12648430」と書くことにしよう。


__ もう29時だ! うー。


__ 今日は台湾からの留学生の人にあって話をしたのだけど、 やっぱり英語はふれ続けないとダメだと思った。 とっさにusが思い出せなかった。アルコールが入っていたからだと思いたい。

2006年10月09日

log

入れ子頂点の辺が途切れる問題の解決方法には二通りの戦略があります。

まず、Zオーダーを導入して、描画の順番を切り替えられるレンダラを作成するという方法。子頂点への辺より先に親頂点を描画することでとぎれを解決する方法です。これは、それぞれの頂点に適切なZオーダーを割り振る必要性が(プラグイン作者側に)出てきはしますが、コンピュータにはあまり負荷のかからない方法です。

もう一方は、頂点に辺の端点を返すメソッドをつけるというものです。 これはNarVisualizerのような頂点を作る際にも役に立つかも知れません。しかし、毎ステップ端点の計算を行うので計算量が多いかも知れません。


__ オブジェクトは実際にはPOJOだけどXML-RPC経由でいじるためにはクラス名とパラメータの対。これでオブジェクトの生成や保存に関しては問題ないけども、インタラクティブに動かすには「生きているオブジェクト」への参照が必要。もちろんこれもXML-RPC経由でいじれなければ行けないので、String nameを使う。全てのオブジェクトがnameをキーとしてハッシュに入っていれば、nameをポインタのように使うことが出来る。

GraphクラスがだんだんGraphクラスっぽくなくなってきた。 そもそもアプリケーションにひとつだけのインスタンスで、グラフのくせに物理演算まで持っていて、今後さらに全てのXML-RPCアクセシブルなオブジェクトを持つようになると…どう考えてもGraphじゃない。しかもrenderメソッドをRendererに移したのでRenderableGraphはとことん間違ったネーミング。

リファクタリング。いい名前が思いつかないのでまだGraphのままだけど。


__ makeTable, getNamedDict, namespaceなど、同じ物に違う名前が付いている。実体はHashtableで、キーが文字列なのでDictionaryであり、かつキーが文字列のDictionaryをnamespaceに使っている。さぁ、どれが一番適切な名前だろう。 とりあえず、Tableはダメかな。Hashtableは使っているけど、それは別に重要ではなく、HashMapでもよくて、むしろMapと呼ぶ方が適切。 やっぱnamedDictなのかなぁ。「Dict」で「キーが文字列のマッピング」であることをほのめかして、かつそれが名前で管理されている、と。ただ名前とDictは1対1対応じゃないんで、namedなのかといわれるとちょっと違う。Dictでいいのかな…。

Windowsユーザのためのsvn/svk覚え書き

  • Subversion
    • TortoiseSVN: Download TortoiseSVN | TortoiseSVNから自分の環境にあったインストーラを選ぶ。(多くの人はTortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi)
    • ダブルクリックしてインストール
  • svk
  • コマンドプロンプトで以下のように打つ。(サーバ名をfoo.bar、プロジェクト名をbazと書く)
    • svk mirror http://foo.bar/baz //mirror/baz
    • svk sync //mirror/baz
    • svk cp //mirror/baz //baz
  • 適当なフォルダで右クリックしSVN Checkoutを選び、リポジトリに 「file:///C:/Documents and Settings/あなたのユーザ名/.svk/local/baz」 を指定してチェックアウト。
    • この時、/.svk/local の下にbazフォルダがないが、ためらわずに/local/bazを指定する。
    • GRINEdit用のメモ。Eclipseで新しいJavaプロジェクトを作り、ワークスペースのそのプロジェクトフォルダの中身を全部削除、その中へチェックアウトしてから、Eclipse側でF5キーを押して更新する。
  • リモートリポジトリの最新の内容を取ってくる方法
    • svk sync //mirror/baz
    • svk pull //baz
  • ローカルで行った修正をサーバ側に返す方法
    • SVN commitでローカルのリポジトリ(ブランチ)にたいして修正を書き込む。修正内容や修正するファイル、コメントなどの画面が出るので、適切なコメントを書いてOKする。この作業はこまめに(作業内容がコメントに書ききれなくなる前に)行った方がいい。
    • svk push //baz でローカルリポジトリの中身をリモートリポジトリにコミットする。この時、他の人の修正と衝突したら修正する必要があったりするけどもそれは後で書く。

日記

svkでチェックアウト時にgrineditフォルダがなくて何か失敗したと思ったのが間違いで、svnのリポジトリURLは実体があるのは途中までなので見つからないのが正しい挙動。

Windowsユーザのためのsvn/svk覚え書き


__ ひきこもって没入(没頭)しているおかげで作業がはかどる。vimの話題なんて3,4日前かと思ったのに昨日だし。 常時没入できれば生産性高いんだろうけど、大人はそうも行かない事情がたくさんあるので、いかに素早く没入状態に移行するかの技術が重要なのかもなー。

最近のアロマ。足下のアロマライトにセージ+ゼラニウム+ジュニパー+場合によりおまけでベルガモットorローズマリー・シネオールを入れて、アルコールで希釈して香りが出るのをゆっくりにして、緩効性の効果を期待。モバイルアロマって道具で、コーヒーを飲んだりフリスクを食べたりする感じで、濃い香りをかぐ。モバイルアロマの中身はローズマリー・シネオールが主体。次点がジュニパーで、そのほかのものも少しずつ混ぜてある。


__ 自分Tracが欲しい、というより、ようするにTracのチケットみたいなTODO管理システムが欲しいのか?Howmもよさげ。でもどちらも、仮に自分用に導入したとしても満足はできない。というのは、人生の中で一番無駄になっているちょっとした待ち時間などの管理には使いづらいから。コンテキスト重要。こまぎれで無駄になっている時間はたいがい、パソコンに向かっていない時間で、パソコン自体を持ってきていないか、立ち上げても落ち着いて作業ができない。通勤が嫌いなのも毎日2時間パソコンできない時間ができるのが苦痛だからなんだけどね。そういう「パソコンがない」というコンテキストにはやっぱり紙の手帳。紙の手帳とTracとHowmが双方向にうまいことできればいいんだけどなぁ。


__ 集中力が切れたので一休み。

パワーポイントで1ページに8枚印刷できないかと試したけど無理で、Wordでできた。実際に印刷してみないと色々わからないことはあるけれども、これでワードの1ページがちょうど僕が普段使っている付箋のサイズになるので、あとは貼ったりはがしたりできる付箋用のノリを買ってくれば…。

僕の環境ではワードの印刷プレビューで拡大率38%にするとほぼ原寸。 20ポイントだとちょっと小さいけど、24ポイントなら問題なし。


__ 頭が回転しないなぁ。

上野でダリ回顧展なんかやってるじゃん!

Pythonインタプリタの>>>がhowmと衝突しそうな気配…。

ここ数日、引きこもって、パソコンもつけっぱなしで、寝て起きてキーボード叩いて寝る生活をしていたのだけども。明日からちょっと外に出て活動するので手帳の整理をしないと。


__ Pythonでオブジェクト指向の解説を書こうとして、なぜEiffelとかtraitとかの説明を読んでいたのだろう、自分。

2006年10月08日

vim7カテゴリを作りました。

保存して終了がZZだったのか:qだったのかわからないvi初心者がvim7でPythonを書くようになるまでのドキュメンタリーになる予定。


__

どっちも間違ってて:wqじゃん! と一応つっこんでみる。 by フシダ

orz.


__ とりあえず、vim7はすごくいいらしい。Pythonの補完が聞くらしい。 川o・-・)<2nd life - vim7の新機能 Omni completionpythoncomplete - Python Omni Completion : vim online

vim7自体のインストールは書くことがないくらい簡単に終了(Windowsだからインストーラを起動するだけ)

とりあえずREADME.txtを読む。

DOCUMENTATION

The best is to use ":help" in Vim. If you don't have an executable yet, read "runtime/doc/help.txt". It contains pointers to the other documentation files. The User Manual reads like a book and is recommended to learn to use Vim. See ":help user-manual".

The vim tutor is a one hour training course for beginners. Mostly it can be started as "vimtutor". See ":help tutor" for more information.

だそうな。gvim.exeを起動してみる。終了するには:q[Enter]と書かれている。

:help ZZ[Enter]

Write current file, if modified, and quit
あってたじゃん>フシダ

:help tutしてみる。Windowsならvimtutor.batを起動せよと書いてある。起動したら日本語のチュートリアルが出た!


__ 一番大事なコマンド。UNDOはu。Emacsよりだいぶ覚えやすいよ!(ぉ) REDOはCtrl+R。

今まで削除するときはDeleteだったので、目視で確認してから押していたのだけども、こっちはxだからブラインドで修正できる。

pasteはp。わかりやすい。行削除した後の貼り付けはカーソル位置に貼り付くのではなく、カーソルのある行の下に貼り付く。

EclipseのCtrl+Lに相当するのはG。数字を書いてからG。

/で検索。%で対応する括弧へ。

レッスン4あたりから覚えきれなくなってきた。

vを押すと範囲選択ができるようになる。

チュートリアル終了。ユーザーマニュアルを読む。Ctrl+]で進む。Ctrl+Oで戻る。

Pythonでプラグインを書く方法がどこに書いてあるのかいまいちわからず。

log

スクリプト中からexecfileされるスクリプトの中で 以下のようにして、自分自身を表示するメニューが追加できるかと思ったけども、できなかった。これはJythonがPython2.1相当で、Pythonにレキシカルスコープが導入されたのが2.2からだからかな?

def func():
    print menu

menu = menuMediator.addMenu(....handler = func)

もちろんクラスを作れば(グローバル名前空間を参照するんではなく、クラスの名前空間を使えば)下のように書ける。

class Menu:
    def __init__(self):
        self.menu = menuMediator.addMenu(... handler = self ...)
    def __call__(self):
        print self.menu
        

Menu()

__ スクリプト中からexecfileする際にexecfile(filename)としていると、グローバル空間の変数が全部引き継がれる。呼び出された側で書き換えた際に呼び出した側に影響を及ぼすのかどうかは確認していないけども、もしそうならあんまり好ましくない挙動だ。(例えばあるプラグインがSWT = Noneとやれば、そのプラグインではなく次のSWTを使うプラグインでエラーが発生する。デバッグが困難)。execfileは名前空間を渡して実行できるのでexecfile(filename, {})とやる。これでクリーンな環境で実行され、散らかしたグローバル空間もガベージコレクトされる。この場合、もちろんPythonInterpreter#setによってグローバル空間に置かれたオブジェクトは参照できないが、ビルトイン名前空間に置かれたものは参照できる。


__ 本体のGUI自体をプラグインにしてしまう計画に、想定外の所から待ったがかかった。本体GUIはSWTだが、SWTはメインループが裸なので、単純にプラグインにしたのではそこでプラグインのロードがブロックされてしまう。 プラグインにメインループがあるというのはなんともアレゲだ。 メインループのあるプラグインを二つ入れたりしたら何が起こるやら。 そもそもウィンドウを出さない使い方をするとしても、起動して即終了はあり得ないので、何らかの形でループが回る必要があるのか?今はXML-RPCサーバが別スレッドで回っているので、ウィンドウを閉じたときにサーバをシャットダウンするようになっているけど、これがもし別々のプラグインになったとすると、他のプラグインを終了するプラグインということになってしまうのか?XML-RPCサーバはメインループが隠れているので、特定のフィールドをウォッチして自発的に終了したりなんてことはできないし…。


__ SWTのMenuItemでCHECKやRADIOを選んだ場合の「チェックが付いているかどうか」はgetSelection()で取得する。チェックが付いていない状態のメニューをクリックしたら、チェックが付いてからハンドラが呼び出される。 「チェックが付いていればどこぞのフィールドをTrueにする」なんてハンドラは1行。

med.pause = self.menu.selection

そんなわけで「自動整形停止」のメニューを追加するのは以下の10行。

gettext.addMap({
"ja":{
  "stop auto-layout": "自動整形停止"
}})

class Menu:
    def __init__(self):
        self.menu = menuMediator.addMenu(_("stop auto-layout"), self, parentName = "File", type = SWT.CHECK)
    def __call__(self):
        med.pause = self.menu.selection
        

Menu()

と思ったけどこれ画面の再描画まで止めるからリサイズすると真っ白に。しまった。 あ、ちゃんとautoLayoutってフィールドも用意されていた。こっちをFalseにすればいいのか。

マウスによる頂点の移動は現在、実際には頂点を移動せずに「この場所に固定せよ」という物理演算の追加で行っているので、自動整形をオフにすると頂点をドラッグしても動かない(もちろんオンにすると行った移動はちゃんと反映されている)。仕様としては、そう作ってあるんだから当然そうなるんだけども、ユーザにとっては直感的ではない罠。

頂点をドラッグ中に、アンカー位置だけではなくて頂点の位置も更新すればいいだけじゃないかと下のように1行付け足したら、なぜか頂点をドラッグしてもアンカーされなくなってしまった。アンカー位置のテーブルを見てみると、アンカー自体は存在しているのに、頂点たちは自由に動いている。

    med.graph.anchorTable.put(target, anchorPos);
    target.position = anchorPos;
理由は簡単。正解はこう。
    med.graph.anchorTable.put(target, anchorPos);
    target.position = anchorPos.clone();
位置の更新時に新しいインスタンスを作ると、100頂点の場合で毎秒6000個の位置オブジェクトが生成されることになってイヤだったので、破壊的に更新しているのだった。その結果、アンカー位置が常に「現在の頂点の位置」に更新されてしまい、まったく役に立たないという罠。

まぁこれで自動整形の一時停止機能が付いた。


__ JythonにはPython2.3から入ったはずの「スライスの3番目の引数」がすでに入っている。入れるのが簡単な機能は入ってるんだなぁ。となると、やっぱり「最新のPythonのドキュメントを見て、使いたい機能が使えるかJythonインタプリタで試してみてから使う」ということになるのかな…。


__ CanvasをSWTからAWTに変えたために起こる現象と対処(たぶん今回1回修正するだけだけど一応記録)

  • GCへのキャストでClassCastException: sun.java2d.SunGraphics2Dと怒られる。
  • Graphicsへのキャストに帰る
  • インポートのswtが付いているものを全部削除
  • 「インポートの編成」をする。何回か、java.awt.Colorかorg.eclipse....Colorか、というように聞いてくるので全部AWT側を選ぶ。
  • UtilCast.o2swtColorか、古いソースならUtilCast.o2colorとなっているところがエラーになるのでUtilCast.o2awtColorに修正。
  • gc.setBackgroundなどがエラーになるのでsetColorに変更
  •  fillPolygonはawt.Polygonを引数に取るので修正

あれ、意外と簡単に修正できた。これで全頂点のAWT対応が完了。


__ GRINEditのTracを作ってもらったので早速使ってみているのだけども、 チケットシステムがまだ慣れない。TODOからデータを移しているのだけど、 「マウス操作をプラグインとして追加できるようにする」っていうチケットを登録した後で、「頂点を投げる機能を~~という方法で実装する」というチケットを登録しそうになって「いや、これはプラグインとして実装した方がいいから、前に登録したチケットの具体化だな」と思ったとする。これを前のチケットに追記するとチケット一覧にせっかく具体化した内容が表示されない。あっ、そうか、ここで#記法を使ってチケットへのリンクを貼るのか。なるほど。

投げる機能自体はtrivialなのだけど、マウス操作のプラグイン化はmajor。


__ Eclipseで新しいプロジェクトを作る。→フォルダの中身を全削除→そこへSubversionでチェックアウト→EclipseでF5→ビルドできた!


__ SWTのMouseMotionListenerにはmouseDoubleClickがあるが、AWTにはない。ダブルクリックを取得するにはmouseClickedでe.getClickCount() == 2。


__ クラスを作る→テストする→動いた!→エクスポートでJarにする→プラグインフォルダに入れる→プラグインのinit.pyでmed.loadClass→mouseMediatorにadd→エラーは出ないがメニューにも出ない(メニューに追加し忘れた!)→追加した→動いた→念のためワークスペースにある側をリネームしてみる→動かない→PluginClassLoaderがプラグインフォルダをフルパスで指定している!誰だこんなことしたの!(自分)→相対パスになおしたら動いた!


__ マウス操作を追加したときに、それをメニューに追加する作業はとても定型的なのでもっとシンプルに書けるようにすべき。どちらかというとマウス操作を追加しただけでメニューにも追加されればいいと思う。でも今はマウス操作の初期化がメニューの初期化より先だからできない。この順番を変えるリファクタリングは酔ってないときにする。


__ 次は何をしよう~。

XML-RPCハンドラをCommonGateway経由で追加できるようにした。 本体のXML-RPCハンドラも同じ方法で追加。


__ JSON形式での保存について。実はJSONほぼPythonなので、JSONObjectだのJSONArrayだの作らなくてもPyDictとPyListでPythonっぽいものが作れてしまう。違いはtrue/Trueの違いと、コメントが#か//かの違い。前者は何の問題もないのだけど後者は面倒。


__ ひとしきり作業した後でTracのタイムラインを見ると面白い。あとマイルストーンが何のためにあるのか今やっと理解した。大きなタスクをブレイクダウンしたら、その大きなタスクをマイルストーンにすれば、ロードマップの所でどの程度終わったかが確認できるわけですね。


__ 頂点がリッチになるより、コンパウンドな頂点がいいのかも…

日記

風がとっても強いので、自転車の風力走行に挑戦。

ある程度条件が整えば、人間の背中という効率の悪い帆でも、動力の9割以上を風力でまかなえることがわかりました。自転車は船と違って摩擦が少ないので、間欠的に吹く風でも走行を続けることができます。

問題点としては、まず、建物や信号、対向車などの障害物が多すぎること。帆がないので、横から風が吹くと風力エネルギーを有効活用できないこと。速度が遅くなると不安定になるので、横風でよろめくこと、などですね。建物や信号はどうにもなりませんが、自転車に補助輪をつけて、横風も利用できるヨットみたいな帆をつけた「風力自転車」を作ればかなりの部分が解決しそうです。

そんな自転車には乗りたくないですけど。


__ ささださんのところから痛いニュース(ノ∀`):妹「おはよう。おにいちゃん。起きてってば~、ほら。・・・ったく、しょうがないんだから!」 1回300円。 いやはや。1回300円って。一月で9000円じゃん。 劇的ビフォーアフターの奇跡を起こしたメイドさん(メイド服非着用)の3時間のお値段が8250円でしたよ。毎月メイド呼べるよ!

ちなみに現状


__ 「Emacsのホームが便利、ホームが便利」とよく聞くのだけどずっと「Home」だと思っていました。howm: Hitori Otegaru Wiki Modoki


__ DXPresentation 。ちょっww。


__ TeTrIs.vim - A tetris game in pure vim : vim online。vimスクリプトでテトリス。読んでみたけどvimスクリプトは自分で書いてみる気が起きないくらい気持ちが悪い。

pythonを使ってvimからGoogleカレンダーに予定を投げる (ueBLOG)から:

そこでpythoncomplete.vimを見てみると 570行中500行くらいが普通のPythonで書かれていることを発見!

つまりemacsでemacs-lispを使って書くようなものを ほとんどPythonで書けるってこと???

おおおおおお!ホントですね!

vimカテゴリ作りました。


__ プラネットアース見たいけど、お腹もすいた。っていうかデジタル録画の設備があるのにファンに埃がついて変な音が鳴るからって言って電源切りっぱなしなのはどうなのかと>自分。


__ 総理記者会見のテーブルに七五の桐が付いているのはなぜだろう。

キリ - Wikipedia

キリは鳳凰の宿る木として神聖視されており、天皇の衣類などに用いられるなど、「菊の御紋」に次ぐ高貴な紋章とされた。足利尊氏や豊臣秀吉などが天皇からこの家紋を賜っており、以来武家の間で流行した家紋の一つであった。

近代以後も「五七の桐」は慣例的に首相・政府の紋章として、あるいは菊花紋に準じる国章として用いられ、大礼服(宮中の重大儀式おいて着用する儀礼用制服)や旭日章、首相官邸の備品、首相記者会見の演台などに使用されている。

( ・∀・) つ〃∩

__ SVK Win32 Binaries


__ SVKをレポジトリミラーシステムとして使うノウハウをよみつつ、試す。

E:\>svk mirror https://foo.bar.baz/repos/grinedit //mirror/grinedit
Committed revision 1.
E:\>svk sync //mirror/grinedit
Syncing https://foo.bar.baz/repos/grinedit
Retrieving log information from 1 to 21
Committed revision 2 from revision 1.
(snip)
Committed revision 22 from revision 21.
E:\>svk cp //mirror/grinedit //grinedit
Waiting for editor...
Committed revision 23.
何のエラーも出ていないのに書いてあるとおりにできない。そもそもtrunkフォルダがどこにあるのか見つからない
- svn co file:///C:/home/hogehoge/.svk/local/ProjectName/trunk ProjectName
+ svk co //ProjectName
 ProjectName
とやるとチェックアウトのようなことはしてくれる。しかし.svnがないので役に立たない。svk syncの段階で、C:\Documents and Settings\nishio\.svk\local\db\revsの中にそれなりのファイルサイズのものがそれなりの個数作成されるので、サーバからデータは取ってきているのだと思う。上のコマンドでチェックアウトもどきができてるし。ただ、なんでこのパスにgrineditってのが含まれていないのかが謎。

(追記:localの下にgrineditというフォルダが作られて、その中にリポジトリができると思っていたのだけどそれは勘違いでした。西尾泰和のブログ: Windowsユーザのためのsvn/svk覚え書き)


__ 悲しいのでこのタイミングでKIRIN氷 結。

ブログにコードを貼り付ける方法.js alpha0.2(Firefox only)

ブログにコードを貼り付ける方法.js alpha0.1の続編。コード中の<, >, &をエスケープしてPREタグで囲い、後ろにimgタグを貼り、onLoadからJavaScriptで書かれた関数を呼び出すことで、画面には適切な長さで折り返して見やすく表示しつつ、JavaScriptで生成されたcopyボタンを押すとソースコードがクリップボードにコピーされます。この時はもちろん、&lt;が<に戻された状態でコピーされます。

クリップボードにコピーするコードは最速インターフェース研究会 :: Firefoxでテキストをクリップボードにコピーする方法から、ソースコードを新しいウィンドウで開くコードはKazuho@Cybozu Labs: Ajax な HTML ページのソースコードを表示するから流用しました。

サンプル。

print "very loooooooooooooooooooooooooooooooooooooooooooong striiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiing & <html> tag"
コードは下記。

追記:"aaa".replace("a", "b")では最初のaしか置換されないんですねぇ。 "aaa".replace(/a/ig, "A")に変更しました。

<script>
function findTarget(tag, tagName){
  do{
    tag = tag.previousSibling;
  }while(tag.tagName != tagName);
  return tag;
}

function wrapCode(start){
  LINE_WIDTH = 60;
  var target = findTarget(start, "PRE");
  var originalData = target.innerHTML;
  
  lines = originalData.split("\n");
  wrappedData = ""
  for(i = 0; i < lines.length; i++){
    line = lines[i];
    while(line.length > LINE_WIDTH){
      wrappedData += line.substring(0, LINE_WIDTH) + "\n";
      line = line.substring(LINE_WIDTH);
    }
    wrappedData += line + "\n";
  }

  var pureData = originalData.replace(/&lt;/ig, "<");
  pureData = pureData.replace(/&gt;/ig, ">")
  pureData = pureData.replace(/&amp;/ig, "&");

  function copy(){
    setClipboard(pureData);
  }
  insertButton(start, "Copy to clipboard", copy);

  function openWindow(){
    w = window.open(
      'about:blank', '',
      'scrollbars=yes,dependent=yes,resizable=yes,menubar=yes,toolbar=yes'
    );
    w.stop();
    w.document.write('<plaintext>' + pureData);
  }
  insertButton(start, "Open window", openWindow);

  target.innerHTML = wrappedData;
}

function insertButton(start, caption, handler){
  var newElem = document.createElement("INPUT");
  newElem.type = "BUTTON";
  newElem.value = caption;
  newElem.onclick = handler;
  start.parentNode.insertBefore(newElem, start);
}
</script>
<pre>
print "very loooooooooooooooooooooooooooooooooooooooooooong striiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiing &amp; &lt;html&gt; tag"
</pre>
<img src="http://www.nishiohirokazu.org/blog/images/codearea.png" onLoad = "wrapCode(this);" border = 1>

2006年10月07日

ブログにコードを貼り付ける方法.js alpha0.1

codearea.png←これを押すとTEXTAREAに変わる。

__ i d e a * i d e a - ブログにコードを貼り付ける方法で悩むの巻。最近僕も1行が長いソースコードを貼り付ける(例: Just Another Python Hacker, その3Just Another Ruby/Python Hacker,)のに、わざわざ改行してみたりtextareaを使ってみたり、と色々試行錯誤していたのですが、結局満足のいくできにならず。それならJavaScriptで、と思って試作したのが上のサンプルです。

最初のコードを<を&lt;に置換したりせずに直接貼り付けられないかと思ったのですが、preの中に貼り付けると、innerHTMLで取得した際に<br/>が<br>に置き換わるという現象が発生。それならとtextareaの中に貼り付けてみると、<の&lt;への変換も自動的に行われてラッキーと思ったのも束の間、IEで見ると改行が消えて1行になっていて使い物にならず…。むずかしいですねぇ。

やっぱり、手元で適当なツールで<のエスケープを行ってpreタグで貼り付けるのが一番なのかも知れませんね。textareaの中ならタグをエスケープしないでいいので楽かと思いきや、結局</textarea>が含まれている場合にはエスケープしなければ行けませんから。

後は、今はimgのonLoadで始動して、imgのaltをオリジナルのデータを保管する目的で使っていますが、もうちょっと何とかしたいですねー。

ソースコードは下記。 codearea.png←これを押すとTEXTAREAに変わる。

Pythonで階乗を求める(Yコンビネータ編)

Q: 「Pythonで階乗を求める(これはひどい)」はYコンビネータ?

A: いいえ。

再帰呼び出しは普通、以下のように関数が自分自身の名前を使って自分自身を呼び出します。

>>> f = lambda n: n and n * f(n - 1) or 1
>>> f(5)
120

ここで、名前をつけずに、関数自体にも手を加えずに、再帰呼び出しを実現するための手段がYコンビネータです。再帰呼び出しを実現するだけならばYコンビネータは必須ではありません。 前回のコードはYコンビネータを使わずに再帰呼び出しをしています。具体的には、元の関数をnだけを受け取るのではなく、自分自身も引数fに受け取るようにし、また再帰呼び出しでfを呼び出す際にも引数にfを渡してやるようにしています。

Yコンビネータ版は以下。

>>> Y = lambda f:((lambda g: f(lambda x: g(g)(x)))
	          (lambda g: f(lambda x: g(g)(x))))
>>> lambda f: lambda n: n and n * f(n - 1) or 1
<function <lambda> at 0x011DF9B0>
>>> Y(_)
<function <lambda> at 0x011EB770>
>>> _(6)
720
>>> (lambda f:((lambda g: f(lambda x: g(g)(x)))(lambda g: f(lambda x: g(g)(x)))))
(lambda f: lambda n: n and n * f(n - 1) or 1)(6)
720
「lambda n: n and n * f(n - 1) or 1」がそのまま手を加えられずに使われている(lambda f:~で囲われているだけ)というところがポイントです。前回の「lambda f,x:x and f(f,x-1)*x or 1」は引数を追加してしまっています。

Pythonで階乗を求める(これはすこしまし?)

>>> factorial = lambda n: eval("*".join(map(str, range(1, n + 1))))
>>> factorial(5)
120

0はサポート範囲外です。

はてなリングでブログのタイトルを押したときに、ブログのトップではなく、Pythonカテゴリーに来るように変えてみたのでテスト。

日記

JyConsoleの中の人にコンタクトを取ってみたら、来週新しいバージョンが公開される予定だと教えてもらいました。Dan ColemanのJython Consoleと比べてプロジェクトの回転が速いのが魅力的。ただ、残念なことにQPLなので、これを利用するとオープンソースにしなくてはいけなくなります。クローズなソフトウェアを作るための"developer license"を与えることもできますよ、と彼らは言ってますけど、英語で"developer license"の付与を求めたり、対価を要求されたり?するのは多くの人にとっては面倒な仕事でしょうねぇ。


__ なつみかん@はてな - 竹迫さんによるPlaggerプレゼン。 後輩が泊まりに来たときにLLRingの竹迫さんのプレゼンを見せようとしたのですけど、PerlのLanguage Updateの方しか見つけられなくて、後輩たちは弾さんを知らないのでいまいち受けなかったのでした。今見直してみると、持ち時間が始まる前に最初の笑いを取ってますね、

そしてこれ、高橋メソッドの例として見せようとしたのだけども、改めて見てみると高橋メソッドじゃないですね。どちらかというと僕の発表の方が高橋メソッドに近いのかも。でも、自分としては、高橋メソッドは高橋メソッドが許される場でしか使っていないつもりなのに、修士課程の最後の発表で20分の枠に60枚のスライドを投入したりしていたような…。世の中には狭義の高橋メソッド(字が大きくて背景白くて絵がなくてスライドが多くて畳みかける)よりも広い概念として、「スライドが多くて畳みかける」だけを特徴としている広義の高橋メソッドがあるようです。というよりも、これはもはや高橋さんのメソッドではないので「高橋メソッド」と呼ぶこと自体がおかしいのかも知れませんね。じゃぁなんと呼べばいいのだろう…。まくし立てるメソッド?スライド大杉メソッド?機関銃メソッド?


__ おとといNHKの英語番組で言っていた

You should have your hair cut.は「あなたは『your hair cut』を『have空間』に持つべきだ」
は、最初に聞いたときは「新しい変な文法用語を導入しただけじゃん!」などと思ったのですけど、2日経ってみて、やっぱり今までの文法よりこちらの方がいいような気がしてきました。

というのも、僕の脳の中では今までhaveがcanやshouldの仲間として認識されていて、否定形で使うときについつい「I haven't」と言ってしまっていたのですけど、haveを動詞としてとらえることで「I don't have」と言えるようになったので。

と思って台湾の友達に確認したら「"I have never"のほうがいいんじゃない?」と言われてしまいましたorz。

彼が言うには、英語はwell-definedな文法だからyaccでパーサがかけるはず、だそうです。

MUDというタイプのゲームが面白い、と色々説明されて、 telnetがあればいいとかSQLデータベースを作るとか言われてピンと来なかったけど、 「最近、日本語のMUDをプレイしたよ、KeyのKanonってやつ。」と言われてやっと理解。グラフィックや上下左右のコントローラで操作するのではない、文章がメインのゲームのことらしい。


__ Winnyの金子さんが著作権法違反幇助で逮捕されたときは「ソフトウェアの作者が幇助で逮捕されるなんて!」と憤ったものだけど、その理屈から言うと窓の杜 - 【Review NEWS】同一メールを複数人に対して個別に一括送信できる「Mail Distributor」の作者を「スパムメール送信の手助けをしている」なんて言って怒るわけにもいかなくて、なんか自分の中で納得がいかない。

うーん、でもやっぱりこのソフトの作者さんはメールのヘッダに正直に「X-Mailer: Mail Distributor ver.2.7」なんてつけてたりするわけで、このソフトがスパム業者に悪用されたからといって幇助の罪に問うのはよくないのか…。

結局のところ、ソフトウェアの作者が悪意を持っていたかどうかにかかってくるのか…。


__ 晩ご飯は豚キムチ丼。刻んでレンジでチンして冷凍しておいたニンジンと、ニンニクの芽一束を刻んだものと、昨日汁だけ使ったすきやの豚皿を炒めて、思いつきで酸っぱくなりかけていたキムチを全投入。食べたら鼻血が出ました。


__ はてなリング - Pythonに参加したのはいいのですが、せっかくPythonカテゴリー内のエントリーだけのRSSを出すようにしたのに、表示されるリンクはメインページへのもの。うーん。PythonだけのRSSをルートに出力したのが間違いで、 http://www.nishiohirokazu.org/blog/language/python/ の中に index.xml って名前で出力するようにするべきだったのかな。

ダメだ、http://www.nishiohirokazu.org/blog/language/python/を登録しているのにhttp://www.nishiohirokazu.org/blog/index.xmlを選んでしまう。ページのHTMLに<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="http://www.nishiohirokazu.org/blog/index.xml" />って書かれてしまっているんだなぁ。

テンプレートを一時的にいじってはてなに目的のRSSフィードを発見させた。

あー、ダメだ。なるほど、RSSの中に

<channel>
  <title>西尾泰和のブログ</title>
  <link>http://www.nishiohirokazu.org/blog/</link>
と書かれているのか…。こっちも変えないと行けなかったんだな。

できました。ふむふむ。RSSってこうなってるんだ…。


__ JavaScript。event.cancelBubbleなんてメソッドがあるんですねぇ。

HTMLの時はonClickなのにJavaScriptの時はobj.onclickなのか…。

"aaa".replace("a", "b")の結果はPythonとJavaScriptで異なるので要注意。同じことをしたければJavaScriptの方は"aaa".replace(/a/g, "b")と書く。

ブログにコードを貼り付ける方法.js alpha0.2(Firefox only)

JavaScriptは、varをつけなければデフォルトでグローバルであることとかに気をつければ、関数をネストした場合の挙動とかもPythonと同じでわかりやすい。宣言なしで書けるからついついPython同様に変数の初出がどこかとか意識しないで使ってしまうけども、JavaScriptの場合はvarをつけるように心がけた方がいいかも。


__ あー。もうすぐ28時だー。NHKでクラシックが流れ始めたー。

このタイミングでEclipseを起動する自分orz

クラシックの何がわかりにくいって、名前じゃないだろうか。 「セレナードなんたらト長調なんたら」と表示されたはずなのに、 曲はアイネ・クライネ・ナハトムジークだからびっくりした。検索したら「セレナード第13番ト長調K.525「アイネ・クライネ・ナハトムジーク」」とか書いてあるので同じ物らしい。「Gallirallus okinawae(和名ヤンバルクイナ)」みたいに「セレナード第13番ト長調K.525 by モーツァルト(通俗名 アイネ・クライネ・ナハトムジーク)」と書いて欲しい。

2006年10月06日

log

SWT_AWT.new_Frameの引数にshellを渡すと怒られる。そこでnew Composite(shell, 0)を渡してみると、やっぱり怒られる。new Composite(shell, SWT.BORDER)でも怒られる。new Composite(shell, SWT.EMBEDDED)ならOK。このあたりの引数の意味をよく理解できていない。[PDF] SWT 3.0 新機能解説には「親となるCompositeにはSWT.EMBEDDEDを指定せねばならない」ということが書いてあり、どうもSWT_AWTを使えるようにするためにSWTに開けた穴のような雰囲気。まぁ、知っていれば別になんということはない。

キャンバスをAWT化。 とりあえず動くところまで行くために、DrawOnPaintとResizeListenerはコメントアウト。背景画像の設定機能と描画されたものを保存する機能もコメントアウト。 一応コンパイルは通るようになったが、グラフを表示するとLinearEdgeがSWTのみ対応なのでエラー。AWT版を作ってあったので差し替え。

SWTのtextExtent(foo)に相当するのはgetFontMetrics().stringWidth(foo)とgetFontMetrics().getHeight()

BoxVertexのアドホックな「自分自身へのリンクを描画」機能をコメントアウト。

一応表示された。頂点が真っ黒で、ラベルの表示される位置がずれている。

AWTはsetColorの引数がnullの時に例外を投げずに真っ黒にする。

FontMetrics (Java 2 Platform SE 5.0)。あー。SWTで文字を表示した場合は指定したポイントに左上隅が来るが、AWTではベースラインの左端が来る。 正解はy + gc.getFontMetrics().getAscent()。

マウスイベント周りは、もともとAWT・SWT共通にすることを目指して設計したおかげで、まったく無修正でスルー。 SWT系のインターフェイスのimplementsを外したけど、外さなくてもよかったのかも。あ、でも外しておかないとアプレットを作るときにswt.jarを要求されるのか…。

とりあえずローカルで動く本体もキャンバスがAWTになったので、当分SWT系のはいらない。必要になるまであえてサポートしない方針で。

あー。AWTになったからメタキーの表現が変わってるんだ…。

「if((mask & 0x40000) > 0){ // ctrl」なんてのがあちこちにあるのは美しくないので、どのメタキーが押されているかを判断するクラスを作成しよう。

現状のスパゲッティな起動 - GRINEdit#main - GRINEdit() - Infrastructure#getPyi - インタプリタの初期化 - builtinにいくつかの必須なものを入れる - config.pyの起動 - init.pyの起動 - start.py - GRINEditDefaultGUI() - とても汚いGUI生成 - initMouseMediator.py - initMenu.py

config.pyにDEFAULT_START_SCRIPTって項目を入れて、それでstart.pyを指定しよう。例えばその項目をnarVisualizer.pyに書き換えると、起動時にNarVisualiserモードで起動するようになる。起動時のコマンドライン引数でスクリプトが渡された場合にはDEFAULT_START_SCRIPTを無視して渡された方を起動。

initMenu.pyも割と酷いことになっている。 プラグインでメニューに項目を追加したい。 今はMenuWrapperっていう、楽にメニューの項目が追加できるだけのオブジェクトなのだけど、あとあとスクリプトからのメニューの追加ができるようなMenuMediatorになるべきか。

MouseMediatorをJavaではなくPythonで実装。 整理しようと試行錯誤して、Editメニューをそれぞれ別のモジュールに切り分けてその中でメニューを作成していたのを撤回。そもそもEditメニューの一部の「メニューを押されたときの実装がPythonで書かれているもの」がinitMenu.pyにその定義まで書かれているのが目障りだったので切り分けようとしたのだけど、メニューの作成まで別のモジュールに切り分けたせいでわかりにくくなってしまったのだ。修正版では、動作の定義だけを別モジュールに置いて以下のように使う。

mmed.addCascade(_("&Edit"), "Edit")

from menu.blodenSelection import func
mmed.addMenu(_("bloden selection"), func)

from menu.selectWithCaption import func
mmed.addMenu(_("select vertex with its caption"), func)

mmed.addMenu(_("make group selected vertex"), ma.MA_Grouping())

前よりはマシになったけど、これでカンペキかと言われると自信がないなぁ。

でもMouseMediatorはいい感じ。Cascadeを追加した際に、それをハッシュに入れていくので、後からでも「Editメニューの下に新しいメニューボタンを追加」なんてのができる。あと、もともとSWTだけを使っていたときに作ったMenuWrapperと、さらにPythonでアクセレータを追加しやすいようにもう一枚皮をかぶせたaddMenu関数とが統合されてひとつになったのでだいぶ読みやすくなった。パラメータが色々変わるものはやっぱりPythonで書く方がすっきりするね。仮にパラメータが5つあってそれぞれにデフォルトの値があって、可能な限り省略して指定したいなんて場合、JavaでやるよりPythonでやるほうがだいぶ楽。


__ pluginsフォルダ内のinit.pyって名前のPythonスクリプトを全部実行、ってのをJavaで書くつもりだったのだけど、Pythonで書けばいいじゃんと気がついて

import os
for (root, dirs, files) in os.walk("plugins"):
    for f in files:
        if f == "init.py":
            execfile(os.path.join(root, f))

Python楽だ。


__ Jythonだとこうなるのか。

import os
def func(args, root, items):
    for f in items:
        if f == "init.py":
            execfile(os.path.join(root, f))

os.path.walk("plugins", func, None)

__ プラグインで取り外し可能にしておきたかったのだけど、インタプリタ自体を

console = new JyConsole();
JInteractiveInterpreter pyi = console.getPythonInterpreter();
とやってしまう方がパフォーマンスがよさそう。 うーん。 リフレクションを使えば「JyConsoleがあればそれを使い、なければJythonのPythonInterpreterを使う」ってのはできそうだけど、JyConsoleがQPLってだけでそこまでして切り離す必要性があるのかどうかが謎。底までする必要はないとは思うんだけどねぇ。ああ、そうか、作者に確認するべきなのか。

日記

GRINEditについてのライトニングトーク(前半はワンライナー)をDevCamp2006s 「GRINEdit」についての西尾さんのプレゼン動画 (ueBLOG)でご紹介いただきました。ありがとうございます。 わかめがウケるのは想定外です(笑)

はっ、僕もしかしてIronPythonを「アイロンパイソン」って発音してます?!してますねorz

あと「グラフ」という言葉を避けてとっさに「ネットワーク状のもの」と言ったのが「ネットワーク上のもの」と紛らわしいですね。

普段はfor文の所は直接前でタイプするのだけど、時間を節約するためにコピペして失敗してますね。 テイク2で成功してよかったです。動画が後10秒早く終わっているととても悲しい状態になっているところでしたね(笑)


__ SPAM SPAM SPAM Python Developer SPAM Campの写真。

P1060631
P1060631 posted from フォト蔵


__ Google Code Searchで「とりあえず」を検索した結果。ウケる。


__ 雨ひどいですね。


__ 柿は意外と食べやすい。リンゴも。カボチャはレンジで加熱すると簡単に切れる…というところまではよかったのだけど、一気に全部食べないのでマッシュ状態で冷凍したまま放置…。カボチャって何に使えばいいのかなぁ。マヨネーズとかと混ぜてポテトサラダ風にしてしまうと日持ちがしないし。


__

カボチャプリンー!!
火曜日のミーティングに楽しみにシテマスヨw

残念、もう食べちゃったよ。

冷凍カボチャとニンニクの芽を刻んだものを油で軽く炒めてから、水とすきやの豚皿の汁を入れて煮込みました。見た目がカレー。味はカボチャ。カレー粉があればなぁ、と思いながら粗挽きこしょうをたくさん投入したら、カレーのようでカレーでない謎の食べ物ができました。


__ いやなブログ: スルカン開催中止。ネタだろうという読みは当たっていたけども、それを言いたくてたまらなくてスルーしきれなかったということで自己採点で50点(ぇー)


__ 誰かスパムを形態素解析してタグクラウドとかやってないかなぁ。

2006年10月05日

日記

うさぎ: Nabaztag - The first smart rabbit - Nabaztag。欲しくなってしまう。


__ 体調不良だ。

雨のせいだ(ぇ)

うわー、外はすごい雨だ。もしかしたら本当に雨のせいで体調が悪いのかも。


__ 今まで頑張ってスルーしていたのですが、いやなブログ: スルー力カンファレンス (スルカン) 開催決定!は記事自体がネタだという僕の理解は間違ってるんでしょうか。スラッシュドットに記事(スラッシュドット ジャパン | ITエンジニアにはスルー力が足りません)が出て、 こんな返信まで付いているのを見て、ついにスルーしきれなくなって言及してしまいました(笑)

# いわゆる「ネタにマジレス」ですが…。

「何をスルーすべきか」という判断能力までセットで「スルー力」でしょう。 このストーリーをスルーすべきでないと判断することは、スルー力が足りない、 ということと等価ではないです。

# Firefoxの脆弱性ネタの時はスルーできたのになぁ。


__ うーむ。頭が痛い。


__ 地震で起きたけど、この程度じゃニュース速報とかでないのかな。

テレビを点けたのでNHKの英語番組を見る。You should have your hair cut.は「あなたは『your hair cut』を『have空間』に持つべきだ」

2006年10月04日

Pythonで階乗を求める(これはひどい)

>>> (lambda f:lambda x:f(f,x))(lambda f,x:x and f(f,x-1)*x or 1)(5)
120

はてなのPythonリングに参加してみたので、うまく参加できているかのテストを兼ねて変な物を作ってみました。

日記

コメントがあったときに、それに対する返事を自分でコメント欄から書いて、自分で承認するのは面倒なので、コメントの中に直接返事を書いてしまおうと考えました。で、<div class = "reply">で

こんなかんじ
に表示されるようにしたのに、期待通りの結果にならず…。なぜかと思ったら管理者が直接コメントを編集した場合にも禁止されたタグは除去されるからでした。divが禁止されていたので許可してみた物の、やっぱりclass属性が剥奪されて無意味に…。

「a href,b,i…」と許可するタグの一覧が記述されているので、「div class」って書き足せばうまく行くと思ったのに…。

greenplastic.net: 未だにMT3.3へ移行できない理由。 今はサブカテゴリをタグの用に使ってるので、移行して本体側のタグ機能を使うとなると色々手直しが必要かも知れないですねぇ。タグ周りが頻繁に修正されているのなら、もうしばらく待って落ち着いてから移行する方がいいのかも。

とりあえずご要望のあった「Python関連の記事だけのRSS」は python_rss2.0.xml に出力するようにしてみました。デフォルトのRSSを出力しているテンプレートをコピペしてMTEntriesタグにcategory属性をつけるだけで出来ました。

はてなリングに登録してリロードをしてみると、きちんとリンクが現れました…が、クリックするとBlogのメインページに飛びますね。これで正しい挙動なのかな?あと丸いボタンを押すと記事の一覧が出るようですけど、こちらは一番新しい記事のリンクが出ていません。うーむ。RSSにはちゃんと最新の記事の情報が入っているけど…。

まぁいいや。


__ メインのマシンは持ち歩くので、据え置いて色々するように中古の安いマシンを買おうかなぁ。でもタワーは引っ越しの時に運ぶのが面倒なのでノートパソコンで。うーん。

【楽天市場】IBM ThinkPad A20m (2628-31J/32J)(128MB):ピーチファーム 3万円しないのかー。思ったよりも安かった。

でもメインメモリが128MBと聞いてぎょっとしてしまった。

いろいろなことに使えたらと思ってサブマシン購入を検討したのだけど、 やる必要があることは「EclipseやPythonの入っていないマシンに新しくインストールする」だったので128MBのメモリのマシンに入れると遅いだろうなぁ、と。


__ あっ、上の方で書いたMovableTypeのコメントで「div class」を許可したのに期待した動きにならない問題は、ふと気がついて<div class=reply>と書いていたのを<div class="reply">に変えてみたらうまく動くようになりました。そういうことだったのか…。


__ うーん。 論文にしても他の文章にしても、本題ではない前置き部分の政治的な発言が一番書きにくい。 ちょっとPythonを持ち上げる文章を書く必要があるのだけど、あんまりRubyを叩くと後でRubyコミュニティの人に叩かれそう。

逆転の発想でRubyをほめてみるとか(ぇ)

意外といいかも。


__ Jythonでdir(1)しても__add__とかが見えないのか…。

type(a)が<jclass org.python.core.PyInteger at 13184726>なのに a.getClass()がAttributeError: 'int' object has no attribute 'getClass'になるのはどうなんだろうなぁ。

3つの数字でスライシングすることはできる。

PyListのappendはdirで見える。PyListの__str__を呼ぼうとすると怒られる。 __str__じゃなくてtoStringを呼び出しているからか…。でもPython側からはtoStringが不可視になっている。str(x)で実用上はいいのだけど「str(x)ってオブジェクト指向っぽくないように見えるけど実際はx.toString()の呼び出しだよー」と説明しにくい。だって見えないのだもの。うーん。

あ、lenはちゃんと__len__を呼べるんだな。dirでは見えないけど。…これじゃdirは使い物にならないなぁ。教えない方がいいのかも。APIリファレンスを見ましょう、の方が…。

一時間で覚える?PythonのJython版を作ろうとしているのですが。


__ MovableTypeをちょっとハックして、テキストエリアを巨大にして、原稿書き用のブログを作ろうかなぁ。


__ はっ。もう5日?!

2006年10月03日

日記

RPyで軸ラベルに日本語の文字「軸」が入っていると大文字のZに谷型のアクセントが付いた物になってしまう問題は、文字コードではなくフォントが原因のようです。テキストエディタなどで「軸」をCourierで表示させると同じ化け方をしますから。しかし「r.postscript(family = "MS Gothic")」などとやっても「unknown postscript font family, using Helvetica」と怒られてしまいます。まずは日本語フォントのインストールが必要なのかもしれません。


__ 全てのメールをGMailに転送する設定にしていると、 PythonのMLに自分がどのメールアドレスで登録しているのかわからなくなる罠…。


__ 子クラスでオーバーライドすべきメソッド内で「assert 0, "some message"」と書くのはraiseでもいい、というメモの続き。2.4 組み込み例外のNotImplementedErrorの説明は「ユーザ定義の基底クラスにおいて、そのクラスの導出クラスにおいてオーバライドすることが必要な抽象化メソッドはこの例外を送出しなくてはなりません。 」となっているので「raise NotImplementedError("some message")」が一応正統派の書き方ということになるかと思います。


__ ノートパソコンの下に置いてファンで冷却する機械を買って、それにアロマオイルを仕込んでみようかなぁ。


__ うーん。アロマの効いていた2時間前は仕事がはかどっていたので、中断して新しいアロマグッズを買いに行くのはやめたのですが、だいぶバッテリーが減った今はもうお店が閉まっているので買いに行けません。うーん。

アロマオイルの成分の直接的な薬効より、においをかぐことによる脳への刺激が重要なのであれば、アロマオイルの成分を部屋に拡散させる(あんど成分の濃度があまり変化しなくなるので鼻に感じなくなる)より、何か小さな物に閉じこめておいて必要なときに吸う方がいいと思うんですよ。PythonDeveloperCampで自分の発表の前に紙コップにローズマリーを入れて試したのですけど。

あーっ、つい最近まで捨てずにとってあった、空になったこしょうの瓶がない!捨ててしまった!(´・ω・`)

ビニール袋に入れてスーハーすると職務質問されそうだしなぁ…。


__ おれはJython第1回に、Jythonで日本語を扱うとうまく行かないという話題があったのを思い出したので、試してみました。最初readで試してみてちっとも再現しなかったのですが、readの結果はユニコード文字列で、readlinesの結果は違う物みたいですね。JythonスクリプトからJavaのString型のフィールドに値を入れたときも問題なく使えました。これはソースコードがUTF-8だから…ではないみたいですね。sjisでした。readlinesしてフィールドに値を入れさせると…化けますね。readlinesの代わりにread().split("\n")とやってみると問題なく動きました。うーん。

PyFile.javaを読んでみました。全部で1000行弱だし、関係ありそうなコードはそのごく一部だし、readはOKでreadlineがダメとなると、怪しいところはほんの数行…。「パッチ」なるものを作ってみようかなぁ。使うだけで貢献しないのはかっこわるいことらしいし。


__ スラッシュドット ジャパン | 「詳しくはWebで」と言われて本当に検索する人は3割。 「「詳しくはWebで」と言われて本当に検索した人は3割」。


__ 24時。眠くなってきたので後片付け開始。

洗濯物を入れるかごは、同じ物が二つないと、洗濯が終わった物を干すために終わってない物をかごから出すことになってしまう。

明日ダイソーに行って、同じ型のかごと小さい瓶を買ってこよう。瓶はアロマオイルを入れる用。


__ Amazon.co.jp: RNAi実験プロトコール―高効率で簡便な遺伝子ノックアウトの新技術がわかる!のレビュー: 本: 多比良 和誠,宮岸 真,川崎 広明,明石 英雄

東大が、男達が、創った, 2005/9/14
レビュアー:梅星太郎 (京都市右京区) - レビューをすべて見る
多比良和誠、川崎 広明の師弟コンビが世に送る業界騒然の創作ドラマ。ノーベル賞を夢見た男達が下した決断とは?幻の実験ノートはどこへ?誰もが予期していた終末に向けて遂に走り始めた!もう…誰にも止められない。

面白い(笑)

このレビュー書いた人に売り上げの何‰かあげてもいいんじゃない?(笑)


__ 事務から「10月5日までに出張申請を出さないと旅費が出ないぞ! 別府の学会はまだ名前も聞いていないし、URLもわかんないぞ!情報科学若手の会は2005年のと2006年のとどっちなんだ!」とお怒りのメールが来ました。ちなみに軽く検索してみると6月26日に当の本人から別府の学会の名称と住所と日時の入ったメールを受け取っていました。もちろんそれ以前に僕が学会のURLをメールで送ったからですが。

まぁいっか。 きっと色々忙しかったんでしょう。

検索して過去のメールを読んでみて気づいたのですけど、 僕の方もメールで言われたことを100%実行できていないです。 たとえば、参加費のみの領収書をできれば見積・納品・請求書・日付いり・宛名「東京大学」で取れと言われたのに、思いっきり無視してしまいましたし。 (でも学会参加費に見積・納品・請求書が付く理由は事務処理の苦手な僕にはさっぱり理解できませんが。)

まぁいいや。さっさと必要な情報送ってTODOから消そうっと。


__ VIEWスイカカードも、楽天カードも、口座引き落としじゃなくなってしまったので口座引き落としにするための書類を書かないと行けない。でも、メインバンクのみずほの通帳を今確認したら、僕が持っている判子じゃダメだと判明。うーん。実家に通帳を持って帰って、一致する判子をもらってくるか、その判子を借りてみずほに行って判子の変更をしてくるかしかないのだろうか…。

2006年10月02日

日記

昨日は奈良から来た後輩2人を部屋に泊めたのですが、お酒を飲んで体が温かかったので掛け布団を後輩にあげてTシャツでしまい、冷えてしまいました。


__ 腕に毛を生やして引っ張るCMで有名な「プロピア」から ひげが通販で3000円で買えます。 プロピア -Propia-。送料とか除去液とかを含めても5000円あればあの毛を試せるようですね。


__ 「Web 2.0 ツールのつかいかた」が「Web 2.0 シールのつかいかた」に見えて、「Web 2.0 シールを今お使いの電子レンジに貼るだけで、Web 2.0の電子レンジに!」なんて妄想をしてしまったのは秘密。


__ 段ボールの底で放置されているモバイルギアにLinuxを入れてEmacsをいれてスケジュール管理に使おうかと思ったけども、面倒なので今のままでいいや(ぇ)


__ 最も凶悪な言語Malbolgeの説明をロベールの小部屋 - 最凶言語 Malbolgeで読んだのだけども、必然性のない余計なものがたくさんつっこんであるだけで、それほど理論的に凶悪なわけではないようです。個人的にはこういうのは言語の設計が汚くて嫌いです。brainf*ckは美しい。

余計な物を足して複雑にしたシステムではなくて、 システム自体を(何らかの基準で)シンプルにした結果、 記述方法が人間の自然言語からかけ離れた物になってしまった物がよい「変な言語」だと思いました。 例えば、プログラムは一つの実数値で、レジスタも一つの実数値が入るもので、ただし「実数値」ってのはdouble型とかではなくて「無限に精度が高い非負の実数」です、とか。プログラムxを1ステップ実行すると、1/xの整数部分の値によって実行される命令が決まり、それ以上実行するプログラムは小数部分になる、とか。プログラムが0になったら、それ以降何をしても整数部分は0なので、プログラムの終了になるわけですね。

わかりました。プログラムは実数メモリの1番地に入っていて、データの位置を指すポインタDとプログラムの位置を指すポインタPが最初は1で初期化されているんです。で、番地も実数で、それぞれのポインタについて、値を1増やす命令(incPtr)、2倍にする命令(dblPtr)と、逆数にする命令(invPtr)があります。それぞれのポインタの指すメモリの値についても同様のincVal, dblVal, invValの3つの命令があります。あと入出力の命令と、条件付き命令の「[D]が1以上であれば、[1/D]をinvする」があれば、Brainf*ckに出来ることは全部出来るはず。incPtrとdblValはなくてもチューリングコンプリートのような気がするんですけど、対称性が損なわれるし、取り除いても大丈夫という自信がないので保留。[inc, dbl, invの3通り] * [PtrかValかの2通り] * [DかPかの2通り] + 入力・出力・条件分岐で、全部で15個の命令。実数値レジスタが2つと、実数値のメモリが実数濃度の無限個あるだけのシンプルなアーキテクチャです。いや、レジスタを別に取らなくても、メモリ上の特定の位置を特別な目的で使うことを決めておけばいいだけですね…。プログラム開始時に2つのポインタは1番地を指していて、その2つのポインタの値は2番地と1/2番地に保管されている、と。おー、シンプルで美しい。


__ そんなことはどうでもよくて。

でも日記は基本的にどうでもいいことばっかり書いているような気もします。


__ 「スパムでないもの」は個人的にはベイクドビーンズなのですけど。もちろん品切れで。


__ 二つの物の同期を取るプラグインがPlaggerにあれば便利だろうなぁ。 何と何の同期を取るかはプラガブルに。


__ Djangoの使える安いサーバってどこでしたっけ。聞いたのに忘れてしまいました。まぁ、まだしばらくDjangoで遊ぶ余裕がないので今聞いても使うまでにまた忘れそうですけど。


__ 僕のMovableTypeは3.2で、3.3からタグや管理機能の強化を図った「Movable Type 3.3」日本語版という強化がされているんだそうな。話によるとタグ単位でRSSを出せるようになるので、Pythonタグの付いている記事だけのRSSを購読とかが出来ると言うことらしい。


__ 過去にPythonSpeedに言及したことがあったような気がしたので検索してみました。 PythonSpeed @ NISHIO HIROKAZU # Archived COREBlog


__ 思い出したので忘れないうちにメモメモ。 高速道路の休憩所で僕と柴田さんが話していた内容は、ようするに下のコード。

>>> int(True)
1
>>> int(False)
0
>>> x = 5
>>> if x > 5:
	"TRUE"
else:
	"FALSE"

	
'FALSE'
>>> x > 5 and "TRUE" or "FALSE"
'FALSE'
>>> ["FALSE", "TRUE"][x > 5]
'FALSE'
>>> (x > 5 and ["TRUE"] or ["FALSE"])[0]
'FALSE'

"TRUE"が空リストやNoneのような「偽と見なされる」オブジェクトの場合に、単純なand/orではうまく行かないという問題の解決方法2つ。今ただの文字列である"TRUE"などが、副作用を持つ関数の場合にはこの二つは挙動が異なりますが、詳しい説明はまた今度。


__ 今の手帳と紙の管理システムは、過去の記録がどんどんと握りつぶされて消えていくのがちょっと問題かも知れない。でもどんどんため込んでもうまく利用できないのであればやっぱり意味がないのかも知れない。どうするのがいいのだろうか。


__ 去年、Lightweight Language Day & Night で発表した、Jython関数電卓のソースコードはどこへ行ってしまったんだろうか。

2006年10月01日

Python Developer Camp日記

マインドマップでプレゼンというのも面白い。 箇条書きのマインドマップでも、閉じておいて後から開くことが出来れば、PowerPointで箇条書きで説明するのに似たことは出来る。 これもGRINEditでやると面白いかも知れない。 問題点は、グラフが見えるようにすると字が小さくなってしまうことか…。

Djangoは管理画面が便利。普通のPythonインタプリタでオブジェクトを作って.save()ってするだけでデータベースに入ってくれるのが便利だと思っていたら、デフォルトで付いてくる管理画面だけでも簡単に色々できて便利。

テンプレートも継承できるらしい。ウェブページの共通部分を親テンプレートにくくりだしてまとめることが出来るのか。テンプレート作者のための Django テンプレート言語ガイド

Python関数の定義できるチャット by 柴田さん。 Pythonインタプリタをチャットとして共有できればプログラミングの授業に使えるのかも?普通の文章はコメントとして書けばいいし。

ビューをlogin_requiredデコレータでデコレートすれば認証付きビューのできあがり、だそうな。 ビューは関数で、urlを正規表現でマッチングしてその関数を呼び出す。

ネットワーク周りは詳しくないのだけど、127.0.0.1をlistenしたら自分だけしか見えなくて、0.0.0.0をlistenしたらみんな見えるということなのかな。

<input type = …>とやらなくても{{ form.content }}で適切なフォームが出来るらしい。

確かにDjangoは簡単だなぁ。

インターフェイス。ぬぬぬ? AnInterface.__call__がAnInterface.__adapt__に中継されていて、アダプターパターンがAnInterface(AnObj)と書ける??

def foo(x: int, y:int) -> int:
   ...body...

何そのVBみたいなの!