« 2007年01月 | メイン | 2007年03月 »

2007年02月28日

ラーメンズ日記

プレゼン画面のキャプチャー動画、 よく考えてみると「普段は直前のフレームと同じ画像」なのだから、 もっと圧縮効率がよくてもおかしくないのになぁ。

で、突き詰めて考えていくと、 変化した時の差分とそのタイミングだけ記録しておけばいいと言うことに。 おっと、それってPowerPointでクリックのタイミングを記録すればいいだけじゃないか。

もちろんそれでは生デモとかに対応できない。


= うわーん。 通帳の銀行印の上にシールが貼ってあって、どれが銀行印かわかんないよー。
= 名古屋で日記など

「全文引用しない」というルールは 「スレッドを切るな(スレッドを意識しろ)」というルールとセットだと思う。 スレッドがつながっていなければ 前のメールの内容が何だったかわからなくなってしまうから。

で、「全文引用をする」というルールが力を持ってきたのは、 GMailが引用文を折りたたんでくれるからではなくて、 「メールのスレッド?は?なにそれ?」 という人が増えたからだと思う。

「メールのスレッド」がわからない人相手にメールを送る際には、 全文を引用してつけた方が親切。 そしてそういう人はb-mobileを使ったりしない (たいがい会社の自分の席でメールを読む) ので全文引用されることにデメリットがない。

以上、事務とのメールのやりとりの途中で、 あまりに長くなった末尾の全文引用を削除して 「一件が終わるまでは勝手に引用を削らないでください!」 と怒られた経験から推測。 彼らにとって「全文引用して返しているメールの引用を 削って返信する」という行為は、 かつてのメーリングリストなどで 「スレッドをぶちぶち切って返信する」 のに等しい行為なのだろう。


= Jython。 挙動を観察した結果
JythonはJavaのオブジェクトoに対して「o.foo = 1」という 書き込みアクセスをしているのにpublicなフィールドfooが見つからない場合には、 publicなsetFooというメソッドがあるかを探します。
という結論に至ったのだけど、 ソースのどこに記述してあるのかよくわからない。

で、探し回っていたのだけど、 冷静に考えるとこんなことをやっていたのではいつまでたっても完成しない。

「JythonはJavaのオブジェクトoに対して「o.foo = 1」という 書き込みアクセスをしているのにpublicなフィールドfooが見つからない場合には、 publicなsetFooというメソッドがあるかを探しているように思えます。」 と正直に書くのか 「JythonはJavaのオブジェクトoに対して「o.foo = 1」という 書き込みアクセスをしているのにpublicなフィールドfooが見つからない場合には、 publicなsetFooというメソッドがあるかを探します。」 と書くのか、 どうすべきなんだろうか。

ちなみにsetFooが引数を取らない場合は「AttributeError: read-only attr: foo」となる。 あとfooという名前のメソッドがあったりするとさらにややこしいことが起きる。

うーむ。少なくとも、 このいろいろな挙動をHello, worldの章で解説するのはよくない。 文章を書く心がけの 「全部を説明しなくてもいいのだ。説明が理解を妨げる場合だってある。くどすぎる説明が重要点をぼかしてしまうからだ。」に該当する。

とりあえず簡単な説明をして「細かいことは付録に」ってやろう。

ああっ、あったあった。 PyJavaClassの551行目だ。 そうか、インスタンスの属性にアクセスしたときにリフレクションで動的に探すのではなくて、 Javaのクラスのラッパーを作る際に解決しておくのか。 確かにJavaのクラスは動的に変化しないからそうする方がいいな。 なるほど。

そしてソースを読んでみると、返り値がbooleanの場合限定で、 getFooじゃなくてisFooでもgetterと見なしていることが判明。 さぁて、どう書こう。

やっぱりおおざっぱに書いておいて、詳細は書くとしたら付録かなぁ。 付録がどんどんふくれていっている罠。


= 思い切って消してみた。 いやまて、消す前にコミットしよう(ぉ)
= Python Developer CampについてLingrで。 Lingrで遊ぼうかなぁ。

YouTube動画埋め込みって。 動画の内容についてコメントするとどんどん流れていってしまうぞw。


= しまった。 もう28時だ。 LingrのYouTube埋め込みで思い出して、 以前作ったYouTubeダウンロードスクリプトを動くように直して、 シーク・拡大・プレイリストでの連続再生ができるFLVPってプレイヤーを入れて、 YouTubeに上がっているラーメンズの動画ばっかり連続再生できるようにしてみた。 後はこれをテレビ用マシンに入れるだけ。

2007年02月27日

ちまちま執筆日記

Matzにっき(2007-02-19) によれば、 PLoS(Principle of Least Surprise, 驚き最小の原則)に言及すると減点らしいです。 盛んにPLoSを喧伝していた頃のRubyも、けっこう驚きが多くて、 フィーリングが一致しないユーザーからは 「俺様のフィーリング最優先の原則」とか言われていたようですけど。 そういうPLoSを捨てるというのは好ましい方向の変化なのかも知れませんね。

驚き最小の原則 - Wikipedia


= Google Groupのページ作成機能を使っていて、 preに枠が付かないのが嫌なので何とかできないか試してみたんだけど、 linkタグは削除されるし、Java Scriptも無効化されるし、 なんとかならないもんかなぁ。
= 眠いのに眠れない29時。 やっぱり眠いのに眠れないのは昼間の運動不足がいけないんだろうか。 いや、確実にソレも原因の一つなんだろうけどねぇ。
= 朝。 とりあえず新居のお金を振り込まないといけないから出かけるか…。

ああ、そうだ、洗濯してたんだった。 干してから出かけないと。

新居はレオパレスじゃないから洗濯機も買わないといけないんだなぁ。 面倒だなぁ。


= asahi.com:リスニング試験機器、ソニー製開示を答申 関係者は既知  - 社会
答申は、ICプレーヤーにロゴマークが標記されていたことや、プレーヤーに装着されたメモリー媒体を開発したメーカーが国内に1社しかないことなどを指摘。「約50万人の受験生や受験関係者にとっては、既に知っている、あるいは容易に知ることができるもの」だと判断し、メーカー名が開示されても、センター試験で不正を起こすことが容易になるわけではない、とした。

センター試験のリスニング機器なんて、 うまく動いたら当たり前だといわれ、 うまく動かなかったら針小棒大に取り上げられ、 少しでもノイズがあったら自分のヒアリング能力を棚に上げた受験者に 「ノイズのせいで聞き取れなかった」 とバッシングされるであろうことは十分予想できたはず。 効果的に自社ブランドをおとしめてるねぇ。

なんかケチが付き通しで人ごとながら心配になる。


= Emacsで正規表現で置換する方法を調べた。 M-x query-replace-regexpってやる。 \tがタブの意味にならないので、C-q TABする。 SPCで「置換」、DELで「置換せずに次の候補へ」、ENTERで「終了」になる。
= 最新Pythonエクスプローラ~Django,TurboGears,Twisted,IronPython 完全攻略|gihyo.jp

3月2日店頭発売の予定だそうです。 僕が書いた原稿が店頭に並ぶ初のケースになります。 「8ページでPythonの学術系ライブラリを紹介する」というお題だったのですが、 あんな感じになりました(どんな感じだ)。 厳しめの意見を頂ければ今後の糧にしたいと思います。


= 逃避エネルギーを発揮して、 色々教えてもらいながらデスクトップのブロードキャスト配信を試す。 Windows Media Encoderを使ったのだけど、 Windowsのサーバーがないと使えないからなぁ。 あとせっかく動画を保存しても、YouTubeやGoogleVideoにアップすると 高周波成分を落とされるせいで読めないスライドになってしまう。 プレゼン画面のキャプチャなんかだと同じ色の領域がたくさんあるわけだから、 それを利用した圧縮をすると小さくなりそうなのに。
= フンデルトヴァッサー展|日本橋三越本店

2007年02月24日

GRINEditを使ってソースコードの可視化

控えめな Brainfuck コードを色づけする GM < 04 < September < 2006 < nulog, NULL::something : out of the headphoneを見て、唐突に思いついたので作ってみました。

可視化する対象のコードは、 竹迫さんのTAKESAKO @ Yet another Cybozu Labs: Brainf*ckで100までの素数を列挙してみるテストと、奥さんのKazuho@Cybozu Labs: brainf*ck でマジメに素数探索

まず、竹迫さんのコードの全体像。

そして一部拡大した物がこれ。 各頂点が1つの命令で、太い辺が命令の隣接関係、 細い辺が括弧の対応関係です。+が赤、-が青、.が緑になっています。

竹迫さんのコードは実は数字を作って表示するだけのコードなので、 大局的な構造がありません。 大まかに見ると「小さなループが所々にある1本の紐」です。 可視化する際も、頂点を徐々にy座標を増やしながら作るだけでこんな風に ほとんどもつれずに表示されました。

いっぽう奥さんのコードはこんな感じ。

ぱっとみで、竹迫さんのコードより緑の頂点が少ないことに気づきます。

一部拡大。

括弧のネストがあるために、複雑な構造をしています。

少し引っ張って見たのがこちら。 赤い頂点(+)が、かなり局在していることがわかります。

赤丸で囲んだ部分を拡大したのが次の図。

実はこの部分にしか緑の頂点がありません。 つまりこの固まりが「表示ルーチン」に相当する物だと考えられます。


= コードはPythonでXML-RPCを使って個々の頂点を投げる物で、 コード中に直接貼り付けたBrainf*ckのコードを除けば 50行程度。 GRINEditの次のリリースの時にでもサンプルの中に入れます。

思ったこと。 反発力を使った整形は、 こういう「長いヒモ」状の構造を整形するのにはあまりむいていません。 また、かりに十分時間をかけて整形させたとして、竹迫さんのコードのうねうね曲がっているヒモが、 一直線に伸びたら、それは本当に見やすい可視化なのだろうか?と言われると多少疑問です。 適切に折りたたまれている方が見やすいです。

竹迫さんのコードを適切に折りたたんで可視化するのは難しくないですね。 例えば20個おきの頂点に「左右に引っ張る力」を足してやれば、自然と折りたたまれるはずです。

問題は奥さんのコードの方です。 大局的な構造があるために、竹迫さんのコードを可視化する際に使った 「頂点の初期位置を順番にずらす」という方法ではきれいになりません。 かといって今の手動整形では頂点の移動しかできないので、つまんで引っ張っても 「隣の頂点が半分くらいの速度で付いてくる+ その隣の頂点がさらに半分の速度で付いてくる+ その隣の頂点がさらに半分の速度で付いてくる…」 となって、いまいちです。

これは今まで考えなかったわけではないのですけど、 いい「整形しづらさを感じるグラフ」が手元になかったので対策していませんでした。 これに対処する方法は、一つは前処理です。 ある種の性質を持っているグラフには、 見やすく表示することができる「静的なレイアウト」があります。 例えば今回の場合は平面グラフなので、 辺が交叉しないように平面に埋め込むアルゴリズムがあります。 実はそういう静的な処理を動的な整形の前に挟む機能がすでにGRINEditに実装されています。 今は「非連結グラフを連結成分ごとにばらして配置する」っていうシンプルな物だけですけども、 「平面グラフを交叉しないように埋め込む」っていう前処理は汎用性も高いので 用意しておくのもいいですね。

もう一つは、よりリッチな動的整形手法を作ること。 こちらの方がどちらかというと萌えます。 例えば頂点でマウスダウンした際に、 その頂点が紐の一部であることの判定や、 紐を構成する頂点を取得することは難しくありません。 そこで紐をドラッグ中だけ一時的に剛体化してしまうこともできます。 使い勝手は実装して試してみないとわかりませんが。

他のアイデア: 辺の間に角度バネをつけると、 反発力が届きにくいような長い構造でもきれいに伸びる、かも。 紐状の部分を一時的に1つの頂点に置き換えてしまう。 ソースコードのフォールディングみたいな感じ。 必要なときにダブルクリックすれば元通りに展開されるとか。 n本の辺からなるパスを自然長nの辺で置き換えてみると、 すばやく大局的な整形が行われる、かも。

Non-coding RNAs: Transfer-RNA (tRNA)

原稿書き日記

原稿が進まないのは、 全部の章を並行して書いているからかも知れない。 とりあえずノリと流れで前から順番に埋めていって、 後から読み直す方がいいのかも知れない。

TODOリストに複数のTODOが入っているときに、 どれから最初に着手するかの決定に時間をかけすぎてしまうケース。 普通のTODOでも、タスク同士が絡み合っていて 「タスクAをやってからタスクBをやると楽そう。 タスクBをやってからタスクAをやったほうがいいかも…」 なんて悩んでしまう。

作業を効率化しようとするために陥る罠。

優先度の判定として妥当な時間をかけても、 どちらを先にすべきか判断が付かないと言うことは、 今の僕の知識や力量では判断できないということだ。 だから考えてないで、どっちからでもいいから始めてしまうべき。 どちらから始めるか決心が付かないのならソートして前に来る方。 アイウエオ順でも章番号順でも。


= トリテク経由、 OLPC, Python...。 OLPCってGUIとかがPythonで作られてるんだそうな。 それがbestな解かどうかは少々疑問だけど、 まぁreasonableではあったのかも。
= おびなたのはてな日記 - ダーツ。 「投擲精度によって、狙うべき場所が変わる」ってのには同意。 たとえばゆらぎがすごく小さい場合は20のトリプルを狙うのが一番いいけども、 揺らぎがボードくらいのサイズである場合は 「ボードの上に外れて0点になるリスク」が大きいので、 なるべくはずれないように中心を狙った方がいい。

精度の向上に対して得点の期待値が単調増加かどうか、 という疑問には即答はできない。

で前話したときは 「モンテカルロシミュレーションしないとわからない」という結論だったわけだけど、 もっといい方法があるかも。 「狙った点から正規分布でランダムにある程度ずれた点に刺さって、 そこの点数が入る、それを集計する」ってのは、 ゆらぎを表現する正規分布が狙った位置にかかわらず一定なわけだから、 ただのたたみ込み積分なんじゃないかと。

でもって値域が2次元。 これって、画像処理の分野の言葉で言えば 「画像に対してガウシアンぼかしをかける」 じゃないかと。 つまり、256階調グレースケールの画像を用意して、 20のトリプルが240、1点の領域が4、番外は0、という得点に比例した色の塗り方をしておいて、 それをいろいろな半径でぼかしたときに一番値の高いピクセルはどれか、 またそのピクセルの値はいくらか、 って問題と同じなんじゃないかと。

ライブドアに入りました。

そして出てきました。

あとで書く。


= ライブドアに入る前はサイボウズラボにいました。 CNET Japan Blog - 江島健太郎 / Kenn's Clairvoyance:Lingr and Comet - 技術解説編

Kazuho@Cybozu Labs: Comet の正しい使い方

スケールアウトとは 【scale out】 - 意味・解説 : IT用語辞典 e-Words

FrontPage - FreeStyleWiki

oberhumer.com: LZO real-time data compression library。 しかしLZOというネーミングはLZ0と紛らわしい。

すごく速いらしい。辞書式なので圧縮を使ったクラスタリングにも使えるだろう。


= P1060936
P1060936

(R)まで作ってある。もしかして勝手に撮影して公開すると登録商標の不正使用になる?

MFPM (My Favorite Perl Modules)

中略メソッドという物があるらしい。

Boofyが最も(中略)なフレームワーク。

柔軟性と拡張性が大事。 拡張性も柔軟性の一部かも知れない。 どの部分が柔軟か。

プラグインを受け入れることができるような拡張性が必要なわけか…。

Wikipediaは意外な記事が意外なほど詳細。

Senna 組み込み型全文検索エンジン - Senna 組み込み型全文検索エンジン

あとオフレコとかオフレコとかオフレコとか。

総武線の最終電車が酷かった。 アスパラガスでももうちょっとやさしく運ばれている。 揉んじゃダメだよ。傷むから。


= そうそう、 アークヒルズ - Wikipedia六本木ヒルズ - Wikipedia とは別物だそうだ。知らなかった(ぉ) 六本木ヒルズのあのクモの化け物みたいなオブジェは「ママン」と言うらしい…。

2007年02月23日

起きられなかった日記

目覚ましをかけ忘れたのか、起きたら15時。 うむむ。 普段ならたとえ朝の6時に寝たとしても、 8時間後の14時には目が覚めるのに。 誤差プラスマイナス1時間くらいで8時間睡眠なのに。 うむむ。 4時には寝たはずなのに…。
= 英語漬け、英語レベルE。orz。 how machとかthenk youとか、活字で見ると間違っているのがわかるのに、 手で書くと間違えて書いてしまう。
= 西尾泰和のブログ: 言語融合の時代 をプレゼン資料にまとめると、話の筋道もまとまる。 PythonDeveloper'sCampの資料も作らないといけないんだけど、まだまだ。

言語融合の時代のスライドだけで27時になっちゃった。寝よう。

あっ、手帳手帳。スケジュール確認。 メール見ただけでスルーしたら忘れてしまう。 26~28日の間で引っ越し先の契約。 それまでに代金の振り込み。 2~4がPythonDeveloper'sCamp。 CampまでにJythonの説明がある程度の形になってるといいなぁ。 そしたら興味のある人には読んでもらえるしなぁ。 Campまでにプレゼン資料も作らないといけない、と。 あと事務から今年度の予算をさっさと使い切れという催促が。 39,370円。何を買ったらいいでしょうか。

2007年02月22日

PythonでRubyっぽいmap

思いつきでやった。
>>> Array([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5]
>>> _.map("""|x|
	if x % 2 == 0:
		return x / 2
	else:
		return x * 3 + 1""")
[4, 1, 10, 2, 16]

種明かしは下記

>>> class Array(list):
	def map(self, code):
		import re
		m = re.match("\|(.*?)\|(.*)", code, re.DOTALL)
		d = {}
		exec("def foo(%s):\n%s" % m.groups(), d)
		return map(d["foo"], self)

2007年02月21日

脱ひきこもり野菜日記

ピーマンとほうれん草を買ってきた。

野菜を食べないから元気がなくなったのか、 元気がなかったから食生活が乱れたのか、 どっちだろう。 どっちにしてもポジティブフィードバック。


= 教育用プログラミング言語ワークショップ2007 -ワープロ07- - 情報処理学会 初等中等情報教育委員会

面白そうではあるし、 一昨年の夏のプロシンで発表したNarVisualizerを発表する手もあるけども、 発表するならGRINEditの上に移植したいしなぁ。 うーん。 やっぱり今回はスルーするべきだなぁ。 さっさと本の原稿を完成させないと。


= (財)日本鯨類研究所からいくつか引用。

(リストから一部抜粋)
2007.2.09 日新丸のすぐ脇に接近したシーシェパード船「ロバート・ハンター号」から発煙弾などが投げ込まれる(Part.2)
2007.2.09 シーシェパード船「ロバート・ハンター号」が日新丸のプロペラを破壊しようと、船の前でロープを投げ込む
2007.2.12 シーシェパード船「ロバート・ハンター号」から放たれたゾディアック・ボートが目視専門船海幸丸のプロペラを破壊しようと、船の前で網を投げ込む映像(Part.1)
2007.2.12 シーシェパード船「ロバート・ハンター号」が目視専門船海幸丸に衝突する(Part.1)
鯨類捕獲調査に対する不法なハラスメント及びテロリズム

2月15日未明に南極海で発生した鯨類捕獲調査母船日新丸の火災で、乗組員避難時に行方不明となっていた共同船舶(株)の牧田和孝製造員(27才)が、本日日本時間05:20に、火災現場を捜索していた乗組員により遺体で発見されました。
行方不明者の発見について

ちなみに直接的な因果関係はあるのかどうかは不明です。

グリーンピース及びシーシェパードは、互いに連携して、我が国が国際捕鯨取締条約に基づき実施している鯨類捕獲調査に対し、執拗な妨害活動を繰り返しています。
 このような行為は、決して平和的行動などではなく、断じて許すことの出来ない危険なテロ行為です。
 我々は両団体に対し、今後一切このようなテロ活動をしないように強く抗議しています。この抗議に賛同する方は、以下のリンクにて抗議書にご署名をお願いします。
日本の鯨類捕獲調査を妨害するグリーンピース及びシーシェパードに対する抗議書-署名のお願い
= アルゴリズムが生む表現。 面白そう。どこのカリキュラムだろう。武蔵野美術大学か。

2005年度シラバス案。 他の授業も面白そう。

美大ってこういうことをやっているのかー。

ATOKは武蔵美を一発で変換してくれてびっくりしました。 ムササビ。ムササビは変換しないのか…。 あー、候補にはあって、機種依存文字マークが付いている…。 親切だなぁ、ATOK。

野菜引きこもり日記

キッチン用漂白剤を使えば野菜クズなどのぬめりもつけておくだけでなくなる。 それじゃ食器なんか洗わなくてもいいのではないか、と思って試してみました。 食べた後しばらく放置して乾燥したお皿を漂白剤につける。 結論から言うと、ご飯粒やお皿にへばりついていた野菜はきれいに取れます。 真っ白なお皿になって、一見きれいになったように見えます。 触ってみると「うわー、あぶらー」。 脂質は分解されないらしい。

最近ひきこもりぎみです。 軽いデプレッションモード。

うつ病 - Wikipedia によれば、体を動かさないことはリスクファクターの一つなんだそうな。 やっぱ運動しないといけないんだなぁ。 たぷたぷ

野菜をほとんど摂取していないことに気がついたので、 今日はバーミヤンで野菜を多めに摂取してきました。 冷蔵庫にオクラはあるんだけどな。

はっ。 最近毎日のように夜中にコンビニに出かけて大福とおかきを買ってきたり、 十分寝ているはずなのに眠かったりするのは、 あからさまに冬季うつ病の症状じゃないか!なんで今まで気づかなかったんだ! 冬季うつ病には光療法が効果的。とにかく日中に光を浴びない生活を改善しないと!

今晩はドリエルを飲んで早めに寝て、 明日早く起きて日中に光をたくさん浴びよう。そうしよう。


= とりあえず確定申告で検索してみて、3月15日までだと言うことを確認。
= 人力検索はてな - 有能なプログラマが嗜んでいる言語・技法・テクニックとは何ですか? この場合の、"有能なプログラマ"の定義については以下のURLをご覧ください。 http://d.hatena.ne.jp/f..

興味深い。細々した解答はさておき 「生産性の高いプログラマは「生産性を上げる事」そのものに無上の喜びを見いだしてる」とか 「道具をブラックボックスとして使うのではなく、  中の挙動を理解して使う」とか。


= 確定申告よくわからない。 大体、学振ポスドクという立場が意味不明。 学術振興会からは「雇用関係はない」と言われているし、 かといってもらっているお金は源泉徴収されている。 源泉徴収 - Wikipedia。 はっ、そうか。「所得税が源泉徴収されている」ってのは 別にその所得が給与所得かどうかとは無関係か。 雑所得として源泉徴収されてるのかも知れないな。 っていうかどういう徴収のされ方をしているのかってどうやったらわかるんだろう。 謎。

源泉徴収票ってのをもらっているはずだそうな。 確かにアントラッドからはもらってた。 0って書いてあるだけの紙切れを何に使うのかわからなかったのでとりあえずファイルしてあった。 これが源泉徴収に役に立つのかー。 学術振興会の方は手元にはないけど、順当に考えると実家の方に届いているんだろうな。 学校側に届いているのなら何か言ってくるだろうし。

「学術振興会 源泉徴収票」で検索。 「JSPSは外国人研究者と雇用関係を結んでいないので、源泉徴収票の発行はできません。」 ポスドク研究員とも雇用関係は結んでいないので、 充当に推理すると源泉徴収票はもらえないことになるなぁ。 源泉徴収票がもらえない場合はどうなるんだろう。 ややこしいなぁ。 書類キライ。

今までPh. D.って書いていたけどDoctor of Scienceだなぁ。

FAQ (in earning Ph.D at MEIP, Univ. of Tokyo, 2002)

学振から振り込まれる「研究奨励金」は,税法上は「給与収入」になります.だから,所得税が源泉徴収されていますし,確定申告する場合は,給与収入にカウントすることになります.

あー、船井若手奨励賞の賞金は雑所得になるのか。 これも申請が必要なんだろうか。ややこしいなぁ。 表彰は4月の予定なのかぁ。じゃぁ来年忘れずに申請しないといけないわけだな。

絶対忘れると思う。

うーむ、とりあえず学術振興会からの源泉徴収票は手元にはないなぁ。


= スラッシュドット ジャパン | 開発プロジェクトで使える(かもしれない)アニメの名台詞
  • 「謀ったなchar!!」(バグの原因がchar型だったときにどうぞ)
  • 「立ったぁ、フラグが立ったァ!」(ハイジ)
  • 「バグラッシュ‥‥‥僕もう疲れたよ。それに、なんだかとっても眠いんだ‥‥‥。」
  • ♪男には 自分の 世界がある ♪例えるなら 修羅場続く ひと月のデスマーチ~
    • やな世界だw
  • ナウシカ
    • 蟲達が居ない。なんだろう、胸がドキドキする。
    • 綺麗なコードと仕様では、バグが出ないとわかったの。汚れているのは、クライアントなんです。
    • だめよ!そんな品質でサービスに入ったら!!
    • 姫様の画面、青地に異国の文字が表示されているの。
面白おかしい。 天空のプログラマ 風の谷のプログラマ(ARCHIVE by CROSSBREED)
「バルス!」
Are you sure? (Y/N)
「リ-テ・ラトバリタ・ウルス・アリアロス・バル・ネトリ-ル 」
How many robots ?(0-15)
面白おかしい。

こんなのを読んでいる場合じゃない。


= 平成教育委員会DSを買ってしまった。 いろいろ不満が。 入力方法を勘違いしてわかっている算数問題が不正解になった上に 「よくわかる解説」をスキップする方法がない…。 理科の問題で体の断面図を出すのはいいけど、 脊椎は体の外に露出していないし、人間には肋骨があります。 おかげで算数も理科も0問なのが悔しすぎる。

あとBGMもSEもOFFにできない。 音自体はミュートにすればいいだけだからいいんだけど、 いちいち時間がかかるのが困りもの。 平方数の数列が一部穴あきになっているだけの問題に答えて、 いちいち「プレイヤー君の答え!」とか再生されて、 よくわかる解説まで出されると正直だるい。 タレントの間違えた答えとかも削りたい。 番組の雰囲気を再現したゲームが欲しかったのじゃなくて、 ああいう問題を次々と解きたいだけなのだが…。


= [Python-3000] Refactoring tool available (work in progress) via steps to phantasien t(2007-02-05) 。 Guido本人の書いたPythonリファクタリングツール。 これはよさそう。 プラグイン的に整形手法を追加することができる設計になっているらしいので、 空白の使い方を厳密化するエイプリルフールPEPにそうような変換とか、 ワンライナーへの変換とかができてしまいそうな気配。

2007年02月19日

豚丼がないのでDS liteを買いました日記

僕の主食は家の近くのすきやの豚丼なのですが、 なんだか牛丼祭りとか言って豚丼がメニューから外されてしまいました。 仕方がないのでこの前ランニング中に見つけたココイチに行ってきました。 帰りにゲームソフトとかCDとかを売っているお店の前を通りかかったら 「DS liteあります」と書いてありました。 普通に売っていました。 昨日の日記は訂正。 DS liteは普通に買えます。 ヨドバシアキバに行くのがいけなかったんだと思いました。 客の流量が多いから入荷時期を外すと売り切れになってしまう。 ドンキホーテとかGEOとかトイザらスがいいんだそうな。

漢字検定のソフトは2種類合ったので迷ったけど、 「200万人の漢検」の方が対応しているレベルが1級までと広かったのでそちらを購入、 「漢検DS」は2級まで。

さっそくプレイしてみたら2級まではクリアできたので、この判断は正しかったと思いたいが、 「200万人の漢検」は問題数が少ない…。1級問題が少ないだけなのか全部少ないのか。 「漢検DS」と比べてどうなのかは知らないが、とにかく少ない。 書き取り問題で、 7%未出題の状態から3問未出題の問題が出て未出題0%になった。 不正解率70%の状態から4問正解して不正解率が60%になった。 つまり問題数は40~42問くらいしかないと言うことだ。

あと字が小さい。 わからなかった漢字の解答が表示されても小さくて潰れていて辛い。 お年寄りには絶対勧められない。


= 確定申告のシーズンらしいのだけど、 僕は自分が申告すべきかどうかがよくわかっていません。 あー、そんなことを言ってだらだら先延ばしにしているうちに締めきられそうな雰囲気。
= おびなたくんとこ経由で 松本クリエイターズナイト
■プレゼン内容について
 
・まず、楽しいプレゼンであること!
・10枚、15枚、20枚のいずれかの枚数の静止画スライドショー
・1枚につき20秒で自動的に切り替わります(止められないし、やり直しも出来ません!)
これはなかなか面白いアプローチかも。
= 「東大脳」という言葉を聞いて、「ゲーム脳」のような悪い意味の言葉だと思ってしまった。 例えば「東大に入れば大手企業に入社できて 給料いっぱいもらえて人生順風満帆で幸せな人生を楽に送れると思ったのに… あれー、なんかうまくいかないぞ?なんでだろう?うまく行かないのは社会が悪いんだ!」 みたいな脳。
= 昨日作ったウダー録音ソフトは宇田君からのバグレポートを元に さりげに1.2までバージョンが上がっていたりします。
= お風呂に入って上がって、息抜きに「200万人の漢検」の続きをプレイしたら ラストの「準一級/一級」の検定をクリアしてしまったorz

正解率100%を目指すくらいしかすることがなくなってしまった。 とりあえずカバンに入れておいて、暇なときとかにやろう。

英語漬けも買おうかなぁ。

Amazon.co.jp: やわらかあたま塾: ゲームAmazon.co.jp: ELECTROPLANKTON エレクトロプランクトン: ゲームAmazon.co.jp: 英語が苦手な大人のDSトレーニング えいご漬け: ゲーム


= とりあえず次々ソフトを買うのはよくないので 「200万人の漢検」をコンプリートしてからにしよう。 コンプリートしたらエレクトロプランクトンと英語漬けを買おう。

ニンテンドーDS用の英語トレーニングソフト発売 - 語学のアルクと共同開発 (MYCOMジャーナル)

インターチャネル・ホロンはアルクと共同開発したニンテンドーDS用ソフト『アルクの10分間英語マスター 初級』『同 中級』『同上級』を2007年3月8日に同時発売する。価格はそれぞれ3,990円。35年以上に渡り英語教材を制作し続けているアルクだけに、ソフトの内容はかなり本格的だ。
これも買おう。

2007年02月18日

週末音楽日記-JythonでMIDIの録音

溺死寸前の万歩計を辛くも救出いたしました!(洗濯機から)

帝都高速度交通営団。珍走団っぽい名前。 http://www.tokyooooooooooo.net/。


= 明るいうちに買い物に出かけようかと思ったけど、 洗濯物を回したのでちょっとハック。
= Jythonのモジュールって、 Javaの何に一番近いかって言われると、 もしかしてユーティリティクラスなんじゃないだろうか。 インスタンス化されることを想定していない、 staticでpublicなメンバをたくさん持ったクラス。
= なるほどなぁ。 NintendoDSを希望小売価格の16800円で手に入れて アマゾンで20480円で売れば3000円くらいは儲かるわけか。 自分で販路を持っていなくてもアマゾンが客を見つけてきてくれるし、 古本とかに比べれば、体積あたりの利益率もいい。 となると組織的に転売して利益を上げている団体がいてもおかしくないね。

あとふと思ったのは、 電車の中でDS liteを使っている人って 男女比がかなり女性に偏っていませんか? 気のせい? 僕は自分で使うのでアマゾンで調べてみても 「4000円も高いのか、もうちょっと待ってからでいいか」 と思うのだけども、 これがもし女性へのプレゼントだとしたらためらわずに即カートに入れていると思う。 きっとそういう需要がつきないから転売価格が値下がりせず、 値下がりしないので転売屋が群がってきて…というフィードバックが起きているに違いない。

ホワイトデー過ぎたら値下がりするかな?


= 指定された文字列をクリップボードに入れるFlashが動かなくなっちゃって困っていた問題、 Javaアプレットでやろうか、ActiveScriptを勉強しようかと悩んでいたけど、 すごく当たり前な解決方法を思いついた。

クリップボードに入れられないんだから、画面に出して自分でコピーすればいいじゃん。

javascript: '&lt;a href="' + location.href + '">' + document.title + '&lt;/a>'
こんだけ。なーんだ。
= 宇田君にウダーのファームウェアの初期化部分のソースコードをもらって、 こちらでもソフトウェア的に初期化ができるようになりました。

ノートオンのメッセージは来ているけども、 ノートオフのメッセージは来ていない。 ノートオンでベロシティを0にするとノートオフになるので、 それかと思ったけどそうでもないみたい。 なんかピッチベンドで0が来ている。

謎は解けた。 コントロールメッセージを表示させてみたら、 音が鳴っている間は11(エクスプレッション)が送られてくるんだけども、 鳴り終わったときには123(オールノートオフ)が送られてきている。

音が生まれてから死ぬまで。

NOTEON   1 71 127
PITCHBND 1 596
EXPRESS  1 2
PITCHBND 1 664
EXPRESS  1 5
PITCHBND 1 652
EXPRESS  1 9
PITCHBND 1 672
EXPRESS  1 15
EXPRESS  1 24
PITCHBND 1 664
EXPRESS  1 31
PITCHBND 1 656
(中略)
NOTEOFF  1
PITCHBND 1 -8192
EXPRESS  1 5
ここで「NOTEOFF 1」ってのはチャンネル1に対するオールノートオフ。 ピッチベンドは8192を引いた値を表示している。 音を鳴らしたときに、必ずしも一番近い音階からスタートするとは限らないようだ。 最初からピッチベンドが596になっている。 596っていうと、半音上の13セント下だが…。おそらく切り捨てで計算しているんだろう。
= Jythonで、当たり前だけどJavaっぽくないこと。

Pythonでクラスのインスタンスを作成するのは、 Javaみたいにnewとかがなくて、一見単なる関数呼び出しのように見える。

つまり、当然だけど リストのそれぞれの値をコンストラクタに渡して作った インスタンスのリストを「map(ClassName, argList)」で作れる。


= 一応、ウダーの演奏をMIDIに保存することはできた。 MIDIファイル 。 (追記:WINAMPでは聞けたけどFirefoxからQuickTimeで聞くと聞こえ方が違うな…)

昨日はウダーから来たメッセージを初期化メッセージも含めて全部記録して失敗したのだけど、 今回は中継ソフトウェアが初期化メッセージを投げつつ、 トラックに必要そうな初期化メッセージだけ追加する形で実装。

ただ、シーケンスの初期化の際のパラメータがまだよくわからない。 下記コードの☆印の2カ所。 SMPTE_25を指定すると、1秒あたり25フレームになって、 その隣のresolution = 400で1フレームあたりのティックを指定できると書いてある。 (Sequence (Java 2 プラットフォーム SE v1.4.0))

でウダーから来るメッセージのtickを表示させてみると 「17603000」なんて数字でいつも1000の倍数なので、 これはマイクロ秒だと思う。

だからSMPTE_25でresolutionを40000にすればいいと思ったのだけど、 それをやると間延びした曲が録音される。 で、resolutionを40にして、二つめの☆のところで1000で割ってやると、 今度はつまりすぎて再生できない。

適当に聞こえるようにアドホックに決めうちしてみるとこんな感じになった。


= PPQ(四分音符あたりのティック数)方式に変更してみた。 アドホックな調節なしでも期待通りの音が出るようになった。 時間軸方向にはQuickTimeでも期待通りの挙動をする。

ただ、QuickTimeでは一度押した音が全部次の音を押したときにも鳴ってしまう。 うーん。 オールノートオフを普通のノートオフに変換してみるか…。

できたっぽい。

うは、長めの曲を弾いたらTICKの計算部分でオーバーフローしたw

今度こそできた。 聖者の行進


= 東京マラソンってすごいイベントだったんだなぁ。 銀座が5時間にわたって通行止めって。

マラソンとか興味なかったけど、ニュースで見ていると面白そう。

来年もまたあるんだったら参加できるといいなぁ。 今の体力では完走できない気がするけど。


= JythonでJavaのアクセス制限を無視する設定は常時ONにしてはいけない。 理由1:jythoncが失敗するようになる。 理由2:さっきまで動いていたプログラムが動かないと思ったら、 そうと気づかずにprotectedなコンストラクタを呼んでいた。 これはイクナイ。
ShortMessage([status, data1, data2])
s = ShortMessage()
s.setMessage(status, data1, data2)
と書き換えるだけではあるので修正は面倒ではないけども、 アクセスされないつもりで作られたものを、 「うっかり気づかずに」アクセスするのはよくない。 アクセス制限は、故意に無視したいときだけ一時的にONにするようにしないと。

うわっと、 0xF0はShortMessageとしては扱えないと怒られた。 SysexMessageを使うべきだったようだ。 これはまずい。 使うべきクラスを間違えていることに気づかないのは非常にまずい。

むむ。0xFEのメッセージはSysexでもMetaでもないのか…。

データ領域が両方0のShortMessageでいいようだ。


= テラカナシス。 ウダー録音ソフトを他の人も使えるようにしようと 色々わかりやすいメッセージを表示するようにしたのに、 jythoncでコンパイルしたら日本語化けるんだったorz。

望み薄だけどJython2.2 betaでコンパイルしてみるか…。

ぐは。 PyListからbyte[]への変換が効かなくなってるじゃん…。 やっぱりjython2.2はまだまだベータ版ということか。

スタックトレースの行番号が全部0だな…。


= できた。 UdahRec version 1.0

一応Jython単体で作った初の実用的ソフトウェア。 今まではJavaにエンベッドしてたから。 規模としてはudahLib:142行 + udahInit:88行 + udahRec:24行、で254行。 もちろん1行で書こうと思えば書けてしまうのでバイト数でいえば、6938バイト。


= 後輩がGRINEditから拡張性をそぎ落としたソフトを、 GRINEditCと呼んでいるのを今知った。 確かにソースは渡したけどさ。 GRINEditって名前まで使われるとは思わなかったなぁ。

あー。GRINEditCって名前で論文書いてIPSJ Digital Courierに載ってるじゃん…。 知らない間に…。 6月に僕の知らない間に発表者に僕の名前も入れて発表申し込んでたときも 「一言くらい連絡くれてもいいのに」ってつっこんだのに…。

This is an upgraded version of GRINEdit which has been developed previously in our laboratory for visualizing complicated networks.

ふーん。XML-RPCを積む前のGRINEditから拡張性を取っ払って、 タンパク質間相互作用の可視化に特化したソフトウェアがupgrade versionかぁ。 ふーん。

まぁいいけど。ようするに「蛋白間相互作用の可視化が簡単である」という特徴が 付け加わったからupgradeってことなんだろう。価値観の違いだ。

うーん。 スルーすべきなのかそうではないのか。 僕の知らない間に論文の著者に名前を入れられて、 「僕のソフトウェアを僕の意に沿わない形で変更したものを upgrade versionと呼ぶ」 っていう僕が認めるはずがない主張をされているって言うのは。

このことを教えてくれた人と色々話をして 「GRINEditのソースを利用しただけのソフトウェアがGRINEditの改良版と名乗っている」という問題だけじゃなくて、 「GRINEdit which has been developed previously in our laboratory」が「GRINEditの著作権がラボにあるかのように誤解されうる」という問題、 そして「その論文に僕が共著者として入っているせいで、僕が『GRINEditの著作権はラボに帰属する』と認めているかのように見える」という問題もあることは理解した。「君はもっと怒っていい」とも言われた。 どうするべきか、いろんな人に聞いてみようと思う。


=
  • 事実の補足
    • 論文のreceivedは2006-08-25、GRINEdit alpha0.10の公開は2006-06-10
    • GRINEditのライセンスはLGPL
    • 研究室での研究とは無関係のソフト:修論にもD論にもそのソフトへの言及がない
    • 論文投稿後ではあるが、一応共著で出す旨のメールは受け取っていた
  • うーん。 LGPLで論文よりも先に公開されているのはSourceForgeを見ればわかるから、 著作権に関しては問題なさそうだ。 共著の件も、事後ではあるけど一応原稿が送られてきているから、 その時にきちんと読んでいれば少なくとももっと早い時点で 「GRINEditCって名前はやめて」と言えたはずだなぁ。 とりあえず今回のソフトに関してGRINEditCと呼ぶのはしかたないけど、 今後はGRINEditという名前は使わないでもらうということでいいのかなぁ。

    週末音楽日記-JythonでMIDIいじり

    今日は楽器で演奏したデータをシンセサイザーに中継するプログラムを書いてみようと思う。
    >>> import javax.sound.midi.MidiSystem as MS
    >>> MS.getMidiDeviceInfo()
    array([YAMAHA USB IN 0-1, Microsoft MIDI ?}?b?p?[, YAMAHA XG WDM SoftSynthesizer
    , Microsoft GS Wavetable SW Synth, YAMAHA USB OUT 0-1, Real Time Sequencer, Java
     Sound Synthesizer], javax.sound.midi.MidiDevice$Info)
    >>> ds = _
    >>> midiIn = ds[0]
    >>> ds[2]
    YAMAHA XG WDM SoftSynthesizer
    >>> midiOut = _
    
    入口と出口は取得できた。 しかしリフレクションでメソッドを眺めても次に呼ぶべきメソッドがわからない。 あ、そうか、MidiSystemを使うのか。
    >>> MS.getMidiDevice(midiIn)
    com.sun.media.sound.MidiInDevice@473f4c
    >>> midiIn = _
    >>> midiOut = MS.getMidiDevice(midiOut)
    
    getMidiDeviceInfoで取得できるのはあくまでデバイスの情報だけであって、 いろいろなメソッドは getMidiDeviceで取得したMidiDeviceクラスのオブジェクトが持っている。

    さて、デバイスは取れた。 楽器を演奏すると外部の機器からMIDIメッセージが送られてくる、と。 それを取得する方法はまぁ順当に考えてリスナを登録してコールバックしてもらう方法だろう、と。

    >>> midiIn.receiver
    javax.sound.midi.MidiUnavailableException: MIDI IN receiver not available
    (中略)
    >>> midiIn.transmitter
    com.sun.media.sound.MidiInDevice$MidiInTransmitter@3b6dbd
    >>> midiInTrans = _
    
    レシーバーじゃなくてトランスミッタを取得するんだそうな。 インタフェース Transmitter インタフェース Receiver 。 レシーバを作成してこのトランスミッタに登録すればよさそう。
    >>> from javax.sound.midi import *
    >>> class MyRecv(Receiver):
    ...     def send(self, msg, time):
    ...             print msg, time
    ...
    >>> midiInTrans.receiver = MyRecv()
    
    何も起きない…。
    >>> midiIn.isOpen()
    0
    
    デバイスを開いていないじゃん!w
    >>> midiIn.open()
    >>> com.sun.media.sound.FastShortMessage@18430a5 4293265700000
    
    お、メッセージが表示された。 でもこの一つだけで、楽器を操作しても続きが表示されない…。

    やりなおし。 デバイスを開いてからレシーバを登録する方針で。

    >>> from javax.sound.midi import *
    >>> MidiSystem.getMidiDeviceInfo()
    array([YAMAHA USB IN 0-1, Microsoft MIDI ?}?b?p?[, YAMAHA XG WDM SoftSynthesizer
    , Microsoft GS Wavetable SW Synth, YAMAHA USB OUT 0-1, Real Time Sequencer, Java
     Sound Synthesizer], javax.sound.midi.MidiDevice$Info)
    >>> midiIn = _[0]
    >>> midiIn = MidiSystem.getMidiDevice(midiIn)
    >>> midiIn.open()
    >>> class MyRecv(Receiver):
    ...     def send(self, msg, time):
    ...             print ",",
    ...
    >>> midiIn.transmitter.receiver = MyRecv()
    >>> , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
    , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
    , , ,
    
    おー、定期的にメッセージが送られてきている。

    楽器を操作すると一気にたくさん表示される。 とりあえずこれをどうしようか。

    >>> from javax.sound.midi import *
    >>> MidiSystem.getMidiDeviceInfo()
    array([YAMAHA USB IN 0-1, Microsoft MIDI ?}?b?p?[, YAMAHA XG WDM SoftSynthesizer
    , Microsoft GS Wavetable SW Synth, YAMAHA USB OUT 0-1, Real Time Sequencer, Java
     Sound Synthesizer], javax.sound.midi.MidiDevice$Info)
    >>> midiIn = _[0]
    >>> midiOut = _[2]
    >>> midiIn, midiOut = map(MidiSystem.getMidiDevice, (midiIn, midiOut))
    >>> [x.open() for x in (midiIn, midiOut)]
    [None, None]
    >>> midiOut.receiver
    com.sun.media.sound.MidiOutDevice$MidiOutReceiver@186d315
    >>> midiOutRecv = _
    >>> class MyRecv(Receiver):
    ...     def send(self, msg, time):
    ...             midiOutRecv.send(msg, time)
    ...
    >>> midiIn.transmitter.receiver = MyRecv()
    
    おー、音が鳴った!

    第 15 章: MIDI サービスの提供

    >>> mySeq = Sequence(Sequence.SMPTE_24, 48)
    >>> mySeq.tracks
    []
    >>> mySeq.createTrack()
    javax.sound.midi.Track@1feab48
    >>> mySeq.tracks
    [javax.sound.midi.Track@1feab48]
    >>> myTrack = _[0]
    >>> class MyRecv(Receiver):
    ...     def send(self, msg, time):
    ...             myTrack.add(MidiEvent(msg, time))
    ...
    >>> midiIn.transmitter.receiver = MyRecv()
    >>> myTrack.size()
    163
    >>> myTrack.size()
    565
    
    演奏するとトラックのサイズが増える。 記録できてそう。
    >>> MidiSystem.getMidiFileTypes(mySeq)
    array([1, 0], int)
    >>> import java.io.File as File
    >>> MidiSystem.write(mySeq, 1, File(r"c:\foo.mid"))
    2129
    >>> midiIn.close()
    >>> midiOut.close()
    
    MidiSystemのwriteを使ったらMIDIファイルができた。 とりあえず再生してみる。…なんか期待していたものと違う。 しかもなぜかFastShortMessageのキャストエラーで保存に失敗したりする。

    とりあえずメッセージをリストに保存しておいて見てみることにした。

    >>> [hex(m[0].command) for m in messages[-20:]]
    ['0xe0', '0xe0', '0xb0', '0xb0', '0xb0', '0xe0', '0xe0', '0xe0', '0xb0', '0xb0',
     '0xb0', '0xe0', '0xe0', '0xb0', '0xe0', '0xb0', '0xb0', '0xe0', '0xe0', '0xb0']
    

    コントロールチェンジとピッチベンドチェンジがたくさん来ている…。

    >>> foo = []
    >>> for m in messages:
    ...     com = hex(m[0].command)
    ...     if not com in foo: foo.append(com)
    ...
    >>> len(foo)
    4
    >>> foo
    ['0xf0', '0x90', '0xe0', '0xb0']
    
    その他はノートオンとエクスクルーシブだけみたいだ。 特に不審なものは…あっ、そうか、わかった。 最初に保存に成功したときにはウダーの初期化をしなかったけど、 失敗した二回目には初期化をしたんだった。 で、今回もただのテストだからと初期化をしなかったんだ。 初期化の時にはSysexMessageが送られるはずだ。 FastShortMessage「の」キャストに失敗したんじゃなくて、 SysexMessageのFastShortMessageへのキャストに失敗したんだな、きっと。

    むむむ、違うのか? わからなくなってきた。 ドキュメントもないし…。 ソースコードを読もう。

    ソース無かったorz。 com.sun.media.sound.StandardMidiFileWriter。

    とりあえずウダーを初期化しなかった場合はMIDIファイルの出力は成功する。 でも実際の演奏よりかなり間延びをした記録のされ方をしている。


    = あうー。 毎回ウダーのケーブルを抜き差しして初期化するのが面倒なので、 ソフトウェア的に初期化できるようにしようと、 ウダーが初期化するときに送っているメッセージをそのまま ソフトウェア的に送ってみたんだが、期待通りの結果にならない。

    ピッチベンドがどうなっているのかを出力させながら演奏してみた。 普段は8192くらいの値にいて、音をずらしていくと値が上がっていく。 ただ、てっきり隣の音の領域に入ったら0になるんだと思っていたら、 ずいずい上がって行くよこれ。

    あー。 ピッチベンドの仕組み で説明されているとおりのメッセージが送られている。 1オクターブピッチベンドで移動できるのか…。


    = どうも、グリッサンドしたときにはずっと同じ音符のようだ。 「ド」の鍵盤を押したときに、「ド」になるときと 「ド#」の低めのピッチベンドになるときとの違いがよくわからない。

    もう疲れた。


    = 走ってきた。
    = http://la.ma.la/misc/js/setclipboard.txtを使って、 リンクを貼りたいページで起動するとタイトルとURLからAタグを作ってクリップボードに入れてくれる ブックマークレットを作って使っていたのだけど、今日は全然動かない。 なんでだろう…? と考えて今やっと気がついた。 今日再起動したときにFLASHのアップデートが入った記憶が…。 ぁぅぁぅ。

    なんかいい方法ないもんかなぁ。 署名付きJavaアプレットだったらクリップボードにアクセスできるかな? それなら自分のサーバに自分の署名したアプレットをおけばいいのかな?

    ActionScriptを勉強して自分で新しいバージョンのを作るのと Javaアプレットで作るのとどっちが早いだろう。


    = 今日のまとめ。

    Jythonなら24行で「MIDI楽器から入ってきたMIDI信号を ソフトウェアシンセサイザに中継するプログラム」が書ける。 ただし今のところMIDI機器が決めうち。

    ウダー練習ソフトでは、MIDIの中継と一緒に画面の描画処理もしているが、 こちらは単純に中継するだけなので負荷が軽い。 前者は僕のマシンでCPU使用率100%だけど、後者は50%くらい。 負荷が軽いので遅延も起こりにくいはず。 もっともウダー練習ソフトのほうでも優先度を最大限に上げれば 遅延は起こらないように思えるけども。

    ピッチベンドを使うと 上下1オクターブのグリッサンドが可能な上に、 音の解像度は半音の600分の1。

    MIDIの生演奏の保存は思ったほど簡単ではなかった。 トラックの解像度の指定とかを適当にしたのがよくない。 あとSysexが悪さをしていると思うのだけど情報不足。

    走ると膝が痛い。 いい運動靴を買うべきか。 ナイキの。 センサーが入っていてiPodと通信するアレ。 買おうかなぁ、本当に。

    リンクを貼るブックマークレットが動かなくなったのがすごく不便。

    2007年02月17日

    執筆日記9

    Yet Another COINS-snapshot Viewer
    COINSとGRINEditを使って,プログラムのフローグラフ等を描画する(まだ可遊化には至っていない)ツールです.

    おお、自分以外がGRINEditを使っているのを初めて見た!


    = 「6ヶ月と1日前」って何だろう。 9月1日の「6ヶ月と1日前」は2月28日なんだろうか? 8月31日の「6ヶ月と1日前」も2月28日なんだろうか? 8月29日の「6ヶ月と1日前」も2月28日なんだろうか?

    気になったのでつっこんでいたらもう3時半だ…。 お腹空いた…。


    = 向かいのホームのお姉さんが、 片方は膝下、片方は膝上の靴下をはいていたのですけど、 あれが流行のアシンメトリーってやつですか?
    = 「東松戸~ 東松戸~」

    はあっ?! 何?! ここどこ?!(だから東松戸だって)

    原稿書いていたらいつの間にか変なところにいた…。


    = 章があって、章リードがあって、 節があって、節リードがある、 という構造の文章は書き慣れていない。 「3時間で覚えるPython」のノリで 「5時間で覚えるJython」を作ったのだけども、 書籍としてはダメな感じ。 適当な長さで切って節リードを入れないと。 Webと違ってページがあるから、 刻むことも考えないと。 難しい。

    D論とかの時は、TeXで自分で組版していたので、 最終版がどういう見え方になるのか自分で確認できた。 書籍の場合は組版をするのが専門の人なので、 僕の手元ではテキストファイルで原稿を書くように言われている。 イメージがわかないのでHTMLに変換するプログラムを書いた。

    でも、このHTMLは 実際に本になった時のイメージとはかけ離れている。 もらったレイアウトのサンプルを参考にして、 少し近づけてみるか…。 せめて章扉、章リード、節見出し、節リードだけでも。 今のただのH2タグのではイメージがわかない。


    = 今年の植村直己賞の受賞者がテレビに映って、 「あれ、ずいぶん若いお姉さんだな」 と思ったら24歳だった。年下だった。

    たぶんこの人と腕相撲したり長距離走で競ったりしたら負けるんだろうなぁ。

    萌え。(ぇ


    = すごいなぁ。高潮の侵入を防ぐための 340キロのステンレスの防潮扉が盗まれたんだそうな。 SFなんかで「鉄を食べる細菌が増殖して鉄が使えなくなった時代」なんて設定があったりするけど、 現実はもうちょっと夢がないようで、 高価な資源は監視していないと消えて無くなる時代。

    バブル時代に作られたけいはんな研究都市のチタン製3億円の日時計はいつ盗まれることやら。 あれだけ巨大なものを盗むと、ただの窃盗じゃなくて怪盗になる。

    お、あの日時計、ギネスにも載っているらしい。


    = 「自分がダメな子だと感じるか」という質問に対して、 外で遊んでいる子は4.4%、外で遊んでいない子は22%だそうな。 何が影響しているんだろうな。

    番組宣伝でこういう数字紹介したときに、 番組宣伝の中でソースの紹介をする余裕がないのは理解できるけども、 番組の公式ページにくらい載せてくれてもいいのではないかと思う。


    = スタイルシートと原稿のレンダリングエンジンをいじって それっぽい見かけにした&原稿のコンパイル時にTOCを出力するようにしてみた。

    うーん。 今までに書いた原稿は基本的に、一つの章を一つのまとまりと考えて書いていたから 章が「イントロ、中身、中身、中身、まとめ」という構造になっている。 でも章の中に節が入るとすると、イントロの節をどうすればいいかがよくわからなくなる。

    イントロが2段落くらいなのが問題なのであって、 もうちょっと削ってしまえは章リーダーに入れられるし、 もっと増やせば単独の節にできる。 Webと違って紙の本にはページという概念があるから、 コンテンツの役割によって適度な分量がある。 論文と違ってデザインが絡んでくるので、 制約の種類も増えている。

    ああ、同じことを何度も言っている気がするけども、 一本のつながった糸として作った文章を、 節単位に刻むのはなんだか…。 でも量がここまで増えたら刻んだ方がいいんだろうなぁ。

    循環参照が起きたときにはどうしたらいいのだろう。 名前空間の説明ではクラスのインスタンスの名前空間に言及したいが、 名前空間は辞書のところで言及したくて、 で辞書はクラスより前に来て欲しい。さぁ困った。


    = マイクロソフトさん、パッチを当てるたびにMS-IMEをデフォルトのIMEにするのは勘弁してください。 ATOKユーザなので。

    2007年02月15日

    Pythonにおけるタプルの存在意義 リターンズ

    書き足しているうちに長くなったので日記から転載しました。 昔書いたよくない説明→Pythonにおけるタプルの存在意義

    __ タプルの分かりやすい説明 ? Weboo! Returns.。 なるほど、本とリフィルにたとえるのですね。

    僕のJython本の解説では袋と真空パックになっています。

    おおざっぱなイメージとしては 「リストはいくつものモノを入れることのできる長細い袋で、 タプルはいくつかのモノの入った真空パックだ」と言えます。
    でも最近はもうタプルとリストの違いを説明するのに飽きてきて、 なんでタプルなんかがあるのかとこちらが問いたい気分。 全部リストでいいじゃないか、と。 タプルが必要なところだけ勝手に変換すればいいじゃないか、と。 要素が1個のタプルが美しくないよ、と。 タイムマシンでPythonが公開される前に戻れるのなら、 「タプルはやめて」と進言したい(笑)

    mutable、immutableという言葉を使った説明も僕のJython本ではしない予定。 だって変更可能なものはハッシュのキーになれませんとか言うけど、

    >>> class Foo:
    ...     value = []
    ...
    >>> {Foo: 1}
    {<class __main__.Foo at 21859329>: 1}
    >>> Foo.x = 1
    >>> Foo.value.append(2)
    
    どう見てもこのFooってオブジェクトは変更可能に見えるでしょう。 少なくともJythonの実装では、クラスオブジェクトPyClassは __hash__をPyObjectクラスから継承していたりするので、 PyListが同じことをできない技術的な理由は全くないわけです。

    おそらく 「{[]: 1, []: 2}」 という状態が起きるのを快く思わなかったのでしょう。 リストもタプルも、2つ作れば2つとも別のインスタンスなので、 PyObjectと同じidベースのハッシュ関数ではこういう状態が起きてしまいます。 それを避けるために「中身を見て同じなら同じと判断する」 という「特殊なリスト」(後のタプルである)をつくったのでしょう。

    今になって思えば、この「タプルとリストって何が違うんだ」という質問の多さを考えると 「{[]: 1, [], 2}」を許容してしまった方がよかったのではないかと。 「なんで同じ[]をキーにして複数のエントリがあるんですか?」 「あー、たまたま両方とも空っぽだから同じに見えるけど別のオブジェクトだからね。 片方に何かをappendしてももう片方は影響受けないでしょー」

    >>> a = []
    >>> b = []
    >>> a is b
    0
    >>> a.append(1)
    >>> a
    [1]
    >>> b
    []
    
    こっちの説明のほうがよっぽど楽です。

    __ あっ、ダメだ。その仕様だとdata[(1, 2)] = 3ってやってから後でprint data[(1, 2)]ってやってもKeyErrorになってしまう…。言語の設計は難しい…。

    執筆日記8

    情報処理技術と刑事事件に関する共同シンポジウム。 講演者を殺害するという内容の脅迫状が届いたそうです。 大変だなぁ。
    =

    昨日は、

    バレンタインデーだからというわけではないですが、

    ふと、とある女性に連絡しようと思ったのです。

    でも、

    連絡先を探したのだけども、

    どこへ行ってしまったのか…

    まったく見つかりませんでした。

    がっかり。

    いや、相手は掃除のおばちゃんなんだけどね。


    = JythonでインタラクティブにMIDIで音を鳴らしてみる。
    >>> from javax.sound.midi import *
    >>> MidiSystem.getSynthesizer()
    com.sun.media.sound.MixerSynth@fc63be
    >>> synthe = _
    >>> synthe.open()
    >>> synthe.channels[0]
    com.sun.media.sound.MixerMidiChannel@4120aa
    >>> c = _
    >>> synthe.defaultSoundbank.instruments[0]
    Instrument Piano (bank 0 program 0)
    >>> synthe.loadInstrument(_)
    1
    >>> from time import sleep
    >>> for i in range(48, 60):
    ...     c.noteOn(i, 100)
    ...     sleep(0.25)
    ...     c.noteOff(i)
    >>> synthe.close()
    

    なんだ、超かんたんだ。 import *しなくてもMidiSystemだけでいいし、そぎ落とせばもっと短くなるし。 とりあえずPython使いに「Jythonのどこがいいの」と言われたら 「Javaのライブラリが全部使えるからねー、インタラクティブにMIDIで音が鳴らせるよ?」 と答えればいい、と。

    JythonでJavaのライブラリをインポートして使うという説明で、 なにをインポートしたら楽しいかなぁと考えた結果がこれ。 最初はSwingで窓を出していたのだけど、 行数的に大差がないからこっちを使おう。 こっちのほうがきっと楽しい。


    = 今日は東西線で三鷹まで往復しながら執筆。 参考書に付箋を貼ってその上で文章書き。 筆が進むときは下の英文は無視して書き連ねて、 筆が止まったら英文を読み進めてインスピレーションを得る。
    = ご飯を炊くときに、水の代わりに杜仲茶を入れてみたらすごい色になった。 そぼろ。
    = ここにあった文章は 西尾泰和のブログ: Pythonにおけるタプルの存在意義 リターンズ に転載。
    = 生駒日記(2007-02-13)

    知り合いのことを知らない人が書いている日記って面白い(ぇ)

    バレンタインデー日記

    「Pythonのprivateモドキはほげほげするとアクセスできてしまうから真のprivateではない」 というJava使いの言葉を耳にすることもありますが、 Javaだってほげほげすればprivateなフィールドにアクセスできてしまいますね。 意外と簡単。
    String s = "Jython";
    Field f = s.getClass().getDeclaredField("value");
    f.setAccessible(true);
    System.out.println(f.get(s));
    

    = バレンタインデー - Wikipedia
    祭りの前日、娘たちは紙に名前を入れた札を桶の中に入れることになっていた。翌日、男たちは桶から札を1枚ひいた。ひいた男と札の名の娘は、祭りの間パートナーとして一緒にいることと定められていた。そして多くのパートナーたちはそのまま恋に落ち、そして結婚した。

    えー。 再現しようよ(ぇ)

    冗談はさておき、これって女性が男性より多くないと 「あれー、僕の分の札がない!」 ってことになってしまうね。


    = おおおおおおおおおおっ! 8ヶ月間行方不明だった実家の鍵が見つかった!

    えっと、「鍵を適当なところに入れるとわからなくなるから、 かばんとかポケットじゃなくて、箱に入れたはず」 というのは正解。 ただし、貴重品を入れている箱でも、鍵を入れる箱でもなく、 「引っ越しぎりぎりまで必要だった書類や本が入っている箱」 の中にあった。 引っ越してきて「鍵を置く場所」が無くなったタイミングで、 その書類入れの中に入れてしまったのだろう。 行方不明だった今の住居の2つ目の鍵も同じ場所で見つかった。 これで退室時に追加料金を取られずに済む。


    = Javaのリフレクションを使えば、 private finalなフィールドをいじることもできるけども、 static finalなフィールドはいじることができないようだ。 ググってみたら [JavaSpecialists 096] - Java 5 - "final" is not final anymore に同じことが書いてあった。
    = 「,」という名前のフォルダにパスを通す、 というLifeHackを先日のグラスホッパーの会で(意図せず)披露したのだけど、 今日はそこにccd.batという名前で下のような内容を保存してみた。
    @echo off
    cmd /k cd %1
    
    これで「Win+R ccd フォルダ名」とやるとそのフォルダがコマンドプロンプトで開かれる。
    = ささださんじょうほう。

    ⊂⌒⊃。Д。)⊃カジ速≡≡≡⊂⌒つ゚Д゚)つFull Auto | 新ジャンル「ツンギレ」

    ツンギレ。


    = 「開発合宿にあるといいものってなんだろう?」と聞かれて 「癒し系の女の子」と即答。

    「お金で解決できるもので!」と言われて 「お金で解決できそうだよ?」と答えたら 「お金で雇う女の子では癒されない!」と言われた。 なんて贅沢な。

    でも人選がむずかしい。 うっかりすると開発に集中できなくなりそう。


    = 気がついた! ウダー立てれば回さなくても裏が見える!

    今日は何の日~? 写真共有「フォト蔵」

    バレンタインデーだからそれにふさわしい曲を弾いてみました(ぇ

    音が割れたりとかしないでうまく撮る方法はないものかなぁ。

    2007年02月13日

    差分リストを作るには

    問:空欄を埋めて、与えられた数値のリストrawdataから、差分のリストdiffdataを作成せよ(via [Python-ml-jp 3850] リスト要素の差分リストの求め方)
    >>> rawdata = [3, 1, 4, 1, 5, 9, 2, 6, 5]
    (空欄)
    >>> d = 0
    >>> for diff in diffdata:
    	d += diff
    	print d,
    
    	
    3 1 4 1 5 9 2 6 5
    
    for文でそうやってアクセスするだけなのであれば、 僕ならこう書くかな。
    >>> rawdata = [3, 1, 4, 1, 5, 9, 2, 6, 5]
    >>> def diffGen(aList):
    	yield aList[0]
    	for i in range(1, len(aList)):
    		yield aList[i] - aList[i - 1]
    
    		
    >>> diffdata = diffGen(rawdata)
    >>> d = 0
    >>> for diff in diffdata:
    	d += diff
    	print d,
    
    	
    3 1 4 1 5 9 2 6 5
    
    もし添