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

2006年08月31日

日記

NHKの英語番組を久しぶりに見ました。「形が同じ物は共通の意味を持っている」だそうです。つまり春とバネと泉には共通の意味があるわけですね…あ、伸びるイメージ?


__ ワンライナーな作成スクリプトは、代入文x = yをglobals().__setitem__("x", y)に置き換える、なんて方法で一応出来そうではあるけど、構文木からコードに戻す方法が用意されてなさげ。単純にトークンを並べていくとNAMEトークンが2つ並んだときに貼り付いてしまうから空白文字で区切る必要があるのだけど、それってNAMEとNUMBERの間だけでいいのかな…。あとこの方法ではglobals()がうようよ出てくるダサいワンライナーになるので、最初の代入文の手前でglobals().__setitem__("g", globals())としておきたいところだけど、この時使うgがすでにグローバル変数として使われていると動かないコードを生成してしまうのであらかじめどういう変数が使われているかを解析しなければ行けない。必要のない括弧を省略したいとか、式に変換する必要のない文は変換しないとか、そういうことを要求すると…うわー、やっぱめんどくさー。


__ 任意のPythonスクリプトをワンライナーに自動変換をするためには、今回僕が使わなかった言語機能に関しても全部ワンライナーで実装する方法を考えないと行けないわけですね。breakとか。

>>> x = 0
>>> while True:
	if x == 3:
		break
	x += 1
	print x

whileには他にもelse節とかありますが…。

いちおう通常終了の場合にはTrueでブレイクされたときには"BREAKED"なので、それを見て分岐すればelse節相当の処理も出来ますね。


__ RigidChips。 今や入手困難な「パネキット」が進化したようなゲーム。スクリプト言語Luaで制御できてオンライン対戦も出来るという噂。時間を見つけて試してみたいところです。


__ 眠れないので、西尾泰和のブログ: Pythonでワンライナーを作成する際のノウハウ集にちょっと加筆。例外をキャッチしたときに、どういう状況だったかの情報が必要な場合にどうするか、必要な物全部cPickle.dumpsで文字列にダンプして出力しとけ、とかを加筆。一番はてなブックマークが多いのがこの記事で、その次が西尾泰和のブログ: Pythonでタブ区切りデータを出力する方法と、気合いが入っていない記事ばっかり評判がいいのはどういうことなのだろう(苦笑)


__ 【楽天市場】はぁとぷち☆おためしセット☆880円:プチプチSHOP。 で、はぁとを一つ一つつぶしていくわけですね(ぇー)

2006年08月30日

日記

結局、浴室に吊しただけで乾燥させ忘れた服は、乾燥させてみると微妙ににおうようになったので改めて洗濯して乾燥中です。にどでまー。


__ ささださんの日記のコメントに反応。 PyOne - Python によるワンライナー を使って「じゃんけんエージェントをPythonでワンライナーにしました」と言ってしまうと、会場からブーイングを受けたのではないかと思います。 構文に手を加えてしまっては、Pythonとは言えないと思います。かみ砕いてしまうと「ワンライナーを書くために実装されたPyOneという言語でワンライナーを書きました!ちなみにPyOneはワンライナーを書くのが困難なPythonに変換されて実行されます!」ということですから、そんな発表があったら僕なら「それのどこが難しいんだ!」と心の中で叫びます。あえてこの方向でネタに走らなければ行けないとしたら、Pythonスクリプトを出力して実行するRubyスクリプトを作ります。ワンライナーで。

まぁ、それはさておき、サポートツールを使ってしまっては面白みがないということを簡単に示すためにちょっとコードを書いてみました。

import sys
exec(eval('"%s"' % sys.argv[1]))

これを適当な名前(たとえばpyexec)で保存し、適当なフォルダに入れ次のようなバッチファイルを作ります。

@echo off
pyexec.py %1

これをpython.batという名前で保存します(ここ重要!w)

そうすると、ほら改行が必須なfor文がワンライナーで書けました!(ぇー)

C:\Python24\pyexec>python "for i in range(5):\n\tprint 'hello!'"
hello!
hello!
hello!
hello!
hello!

あ、でもサポートツールを使わなくてもこう書けばワンライナーですね…。ということはサポートツールを使ったことが問題なのではなくて、execを使ったことが問題なのかも知れませんね。

C:\Python24>python -c "exec(\"for i in range(5):\n\tprint 'hello!'\")"
hello!
hello!
hello!
hello!
hello!

__ 本当は早めにラボに行きたかったのだけど、洗濯物のせいでもう14時…。

そうだ、ベルトと家の鍵を探さないと…。

うわー、ベルト探してたら洗濯機の底に干し忘れの服が!

ベルトも鍵も見つからず…。ダメだ、どんどん時間が遅くなっている。締め切りを先に決めよう。3時の電車に乗ることにしよう。

しかしどうして、洗濯機の底にある洗濯物に他の洗濯物を取り出したときに気づかないんだろうな。

2006年08月29日

日記

CVSのリポジトリをSubversionのものに変換するcvs2svnはPythonスクリプトのようだ。


__ 今日は「Amazon.co.jp: 大人の常識 漢字力―漢字「脳」力がぐんぐん高まる!: 本: 漢字力研究会」を読みながら出勤したのだけど、やっぱり漢字は面白い。「唆す」を「諭す」と読んだり、「寧ろ」を「懇ろ」と読んだり、「漸く」を「暫く」と読んだり。こういう「漢字一文字+送りがな一文字」の物の一覧表とかどこかに落ちてないのでしょうかね。

当て字難読語(Win)(データ / 文書作成) から抽出するのもありかも。


__ Google Answers: Microsoft Visual C# Method: Externalを見ていると、やっぱり$200という高い報酬を提示することで質の高い回答が出たと思えます。質問をリストに掲載するのに50セントかかり、それは回答が付かなくても返金されないのかな。で、回答に対する報酬は$2~$200。しかも「Google Answers keeps only 25% of the price」。


__ ただいま帰宅。プロシンのポジションペーパーはできた。プリンタの特性か、強調のつもりで文字を少し青くしただけじゃほとんど変わらず、最終的に一番鮮やかな青にしたのにそれでもさほど目立たない。


__ 最近、お腹に電気を流して腹筋を鍛える装置を買ってしまったで、使わないのももったいないから装着しています。これ接着部分がかゆい。

強度の調節が出来て、最大が99なのですけど、50でもうかなりきついです。 体験談を読んでいると99でも平気な(というか効いてない?)人がいるみたいです。どうも脂肪が多いと効かないようで…。試しに99まで挙げてみようと思ったのですが70が限界でした。


__ 「オンデマンドによる録画の動画配信」だとオンデマンドで録画してくれるようにも取れる。 カメラ付きインターホンはオンデマンドの録画・配信ですね。


__ textfile経由でhail2u.net - Weblog - JavaScriptで配列をシャッフル。 仮にソートのアルゴリズムがクイックソートだとすると、まず最初にピボットが選ばれるのでそれをvとしましょう。リストの長さをnとしましょう。正しいシャッフルが行われるためには、vが0番目に来る確率は1/nで、1番目に来る確率も1/nでなければなりません。でも一定確率で大小を分けるリンク先の例ではvがリストの中央に来る確率が一番高くなりますね。

「1/3ずつのランダムだけを使って、任意の長さのリストを正しくシャッフルする」というのは実は結構いい問題になるのかも。


__ RSS。っていうかはてなブックマーク。はてなRSS - 西尾泰和のブログ。ほー。どの記事がウケたかがわかるわけですな。

そしてなんだかいくつかブログをおすすめされているので目を通してみたのですが、なんでおすすめなのか謎です。LLRingへ行ってきました (ueBLOG)以外は。


__ 今日は洗濯物を浴室に吊して、浴室乾燥機をつけずに学校に行ってしまった。洗い直すべきかどうか微妙。においはしないけど…。


__ パソコンをハイバネーションさせるときにUSB接続の機器を外し忘れるのがなんとかならないものか。

2006年08月28日

日記

LL Ringアンケート(open) — Lightweight Language Ring。あれ、「よく使う言語」の選択肢にPlaggerが含まれてないよ?(ぉ)

お弁当にご飯と昨日のナスと高菜を入れて、「あ、蛋白源がない」と思い、生卵をどーん。入れてから気づきました。もし今日の午後や明日にこの日記が更新されなければ、サルモネラ菌による食中毒で入院したと思ってください(ぉ)

サルモネラ食中毒。「あたり」の卵である確率は0.03%くらいだそうです。

あうっ。箸を忘れたorz


__ scripting: Project Home Page。JSR 223でPythonが使えると聞いて、Jythonの代わりになるか調べていたのだけど、結局Jythonを呼び出しているだけだと言うことが判明。 呼び出し用のAPIが統一されたというだけか…。


__ mac miniにplaggerをインストールしようとして、permission deniedと怒られる。どうも管理者アカウントはrootじゃないらしい。そしてsuしようとしてもsorryと言われるだけ。Google先生に聞いてみたらsudo suせよとのこと。sudo suならできた。謎。sudoしてcpanしてforce install Plaggerしてみた。YAML::Loaderがないとか言われたのでそれは別途インストールしけど、あとはなんか自動的にすごくたくさんいろいろな物をインストールしている気配。

そしてインストール完了したけど実行したらこけたorz。

Plaggerインストールしている場合ではないのでしばらくは保留。


__ 100ドルノートPCの正式名は「チルドレンズ・マシン」, CM1 - Engadget Japanese。 一般向けに倍の値段で売って、その利益でもう一台そのマシンを子供たちに届ける、と。自分用マシンにはどうかと思うけど、子供やヘビーユーザーでない他の家族用にマシンを買うときにはいいかもしれないですね。


__ Matzにっきのコメント。 ガレージ欲しいなぁ。


__ ベーコンをカリカリに加熱。買ってから3日経ってしまた小松菜はレンジで加熱して小分け。冷めたら冷凍庫に入れよう。しまったな、ベーコンをベーコン単体で加熱して、出てきた油は拭き取って捨ててしまったのだけど、冷蔵庫のカボチャを調理するのに使えばよかったかも。カボチャはたぶん持つだろうから今度でいいかな。

NHK放送文化研究所より

「カロチン」は「古い用語として文献などに見られるが、その使用は望ましくない」とされています。

ガーン。


__ プログラミングの教育にテストケースを用意するのは意外といいみたいですね、通った人は強い達成感を味わえるので。ただ、論理的に考えてバグを直していく能力が身についていない人には何の助けにもならないので、あくまである程度プログラミングを習得した人向けですね。

2006年08月27日

日記

ハードカバー製本。中身の作り方は(4)本文の作り方。面白い。今度やってみよう。


__ 惑星から冥王星が除外、太陽系惑星は8個

ちょうど来年度の教科書を仕上げなきゃならない時期で、 教科書屋さんが困惑しているっていう報道があったけど、 12個案が通っていたら今後も毎年のように惑星リストの 更新が起こっていた筈だ、ということを考えたら、彼らは もっと今回の決定に感謝すべきだと思う。

なるほど、確かに。

ボイジャーのレコードの画像ですが、よく見ると外惑星の直径 [nasa.gov] (一番上の数値)が現在分かっている数値 [wikipedia.org]とかなり違っていますね。 (中略) 冥王星についてはかなり間違っていて、直径14000kmと、なんと地球よりも 大きいことになっています。ボイジャー打ち上げ前には、そう考えられていたんですね。

( ・∀・) つ〃∩へー

なんたらかんたら: 冥王星「あたい…間違ってたんだ…」

みんなが楽しそうにあの人の周りを回ってるの見て、いいなぁって思ってた。
ここはとても寒くて、でも私はこんなだし、でも…さびしくて。
いつのまにか、こっそり私も回ってた。みんなみたいにうまくいかなかったけど。

見つかっちゃった時は少し恥ずかしかった。でも、うれしかった…
みんなが私に気づいてくれた。ここは寒いけど…もう寒くなかった。
私はもう、一人じゃないんだって。そう思えた。
でも…やっぱりいけない事だった。みんな今まで騙してゴメンね。やっぱり私には資格がなかった。

今まで私を仲間にしてくれて、ありがとう。
みんなにたくさんのあったかい思い出をもらったから、私はそれで十分です。

どうか、私が勝手に回ることをゆるしてください。
うまく回れるように、今も頑張っています。
そうしたら、もしかしたら、また…
それは絶対にない。頭ではわかってる。でも、そうせずにはいられない私を、どうかゆるしてください。

うまいなぁ。


__ キムチの容器の中に液体が溜まってしまう問題の発展的な解決方法を思いつきました。増えるわかめを投入。

思惑通り、水分が吸収されました。


__ 住む場所を探しているのだけども、だいたいわからない単語ばっかりで困る。分譲賃貸マンションって何だろう。分譲なのに賃貸ってどういう意味なんだろう。分譲賃貸マンションとは? 分譲賃貸とは? 分譲賃貸マンションの違いとは? 部屋探しの気づき!マスターのカフェ【リプロ】。分譲マンションを賃貸している物のことなのか。

叩いて硬い壁は防音? 鉄筋コンクリートのマンションの壁は防音? 賃貸部屋探しの気づき!マスターのカフェ【リプロ】。叩いてコンクリートの感触がする壁(コンクリートに直接壁紙を貼っている壁)は壁紙がはがれたり結露でかびたりする可能性が高いそうな。( ・∀・) つ〃∩へー。


__ もうすぐ11時だ…。今日は生産性が悪い。食べてないせいだ。今になって気がついた。気がついたらおなかすいた。おととい野菜を買ってきたのに調理してないじゃん…。今週末の新しく挑戦する野菜は「なす」です。2つで100円。

なすの田舎風しょうゆ煮 料理レシピ/ホームクッキング【キッコーマン】。これにしよう。 水1カップって何ccなんだろう。Google「1カップをccで」「1カップ = 200 cc」。おおー。こんな単位でも変換できるのかー。

うーん。料理酒はないのでみりんで代用することにしよう。砂糖はなしで。って結局調味料がみりんだけだけどいいのかな。醤油とか入れそうな気がするんだけど…。

はっ。ちゃんとレシピに醤油って書いてあるじゃん!色が違うから気づかなかった…。

ナス、高菜、キムチの3色丼。


__

  • 駅と家の間もしくは家からさほど遠くないところにスーパーがあるか
  • 携帯の電波が届くか
  • インターネットの接続方法は
  • 退去時のリフォームなどの条件
  • シャワーの水圧
  • エアコン、ガスコンロ、照明、網戸などが設備かどうか(設備なら修理は大家の責任)
  • 賃貸契約解除の方法
  • 網戸を取り付けるレールの有無
  • ガスメータの閉栓タグで前の住人がいつ出たかがわかる

「連帯保証人は契約者と同等かそれ以上の支払い能力がある親兄弟、祖父母」と書いてあったけども、一人っ子で親が定年を迎えた場合は誰を連帯保証人にしたらいいんだろう。関係ないけど気になった。

やっと賃貸部屋探し,不動産屋が言えない部屋探しのテクニックをあなたに 賃貸・部屋探しの気づき!マスターのカフェ【リプロ】賃貸編を読み終わった。疲れたけどだいぶ参考になった。

あー。冷蔵庫のカボチャと小松菜どうしよう…。

2006年08月26日

LL Gong日記

お疲れ様でした。

さっそくforce cpan Plagger。force: command not found. 修行してきますorz.

本物のリングに上がったり本物のゴングを叩いたり、Perlのrequireとuseの違いがわかったりで色々楽しかったです。チャンピオンベルトも本物だとよかったのだけど(無理)

LL GONGはLowlabel Language GONGだった。 他の奴らの下をいけ!

停電?

直った。

Sumibi.org ローマ字を日本語に変換できる無料サイトは、Wikipediaとかから学習して新しい芸能人の名前とかを変換できるようになるそうだ。単語で区切っているアドバンテージはあるとしても「チャングムの誓い」が一発で変換できました。これはいい。

と行った人にしかわからないネタをいくつも飛ばしつつ、わからない人のためにリンクリンク。セッション内容 — Lightweight Language Ring

目が痛い…。暗い中で強い照明が使われていたせいか眼精疲労で…。例の紫カクテル(ウェルチのグレープ100+ルジェのカシス)を飲むとしよう…。これは眼精疲労によく効く。と言っても、ポリフェノールにそんなに即効性があるわけがないので、アルコールの効果なのだろうけど。

JSR 223 and Scripting Java。現時点でJythonは便利だけど、JSR223の方が将来性があるのかもなぁ。JSRは「Java Scripting なんとか」かと思ったら「Java Specification Request」だった。あとBSF(Bean Scripting Framework)もJavaとスクリプト言語の橋渡しを目指した物らしい。Java技術最前線11月のお題「Java関連スクリプト言語」第2回(全4回):ITpro。「BSFが標準でサポートするスクリプト言語には,Rhino(JavaScript),Jython(Python),Jacl(Tcl)などがあります。独自のBSFエンジンを実装しているものとしては,BeanShell(Javaインタプリタ),JRuby(Ruby),JudoScript, Groovyなどがあります。」

Seaside: Seasideもすごかった。Webアプリがこけたときに、デバッグして再開。ユーザーが戻るボタンで戻っても問題なし。

2006年08月25日

日記

昨日「(1)自らの重力で球状となる(2)太陽を周回する(3)軌道周辺で、圧倒的に支配的な天体…。「圧倒的」って何…。IAUのサイトは負荷が高くて見られなくなっているみたいで確認できず…。」の続き。

IAU Website: NEWSによれば

The IAU members gathered at the 2006 General Assembly agreed that a "planet" is defined as a celestial body that (a) is in orbit around the Sun, (b) has sufficient mass for its self-gravity to overcome rigid body forces so that it assumes a hydrostatic equilibrium (nearly round) shape, and (c) has cleared the neighbourhood around its orbit.

おっと。「has cleared the neighbourhood around its orbit」って…。冥王星を惑星のままにするのは科学的じゃないとかどうとか争っていたんだと思っていたのに、この結論はどういうことなんでしょう。これが科学的なんでしょうか。「(b)表面の起伏が惑星の半径のxx%以下に収まり、(c)その惑星がyyの重力を発生させる範囲に惑星の質量のzz%以上の質量を持った天体が存在しない」とかじゃないと僕は納得できません。

大きさの比較(Max Planck Institute for Radio Astronomy)。わかりやすい。


__ 今日、出勤途中の電車の中で24ページからなる絵本のアイデアが唐突に振ってきたのですけど、どうしましょう、これ…。とりあえずメモだけして塩漬け。


__ この前は2値のラベリングが0/1でAdaBoostを実装したのだけど、今日は-1/+1で実装し直してみました。うん、こっちの方がきれい。


__ EclipseのProfilerプラグインを使ったときに

java.lang.ClassFormatError: java.lang.ClassFormatError: LVTT entry for 'result' in class file org/nishiohirokazu/grinEdit/UtilXMLRPC does not match any LVT entry

などというエラーが出る問題はVM引数に-noverifyをつけることで回避できる。おそらくBCELの問題、だそうな。djUnit - EclipseWiki

GRINEditのボトルネックは想像通り反発力の計算。しかし、高速化はさほど焦る必要がないという結論に。


__ 前にナイーブベイズで文章をクラスタリングするスクリプトをPythonで書いたのだけど、どこへやったかなぁ…。


__ ただいま。

楽天の期間限定ポイントが1129ポイントもある。なぜ。「プラチナ・ゴールド会員限定楽天カード新規入会でプラス1000ポイントプレゼント」で1000ポイント付いているみたい。8月19日に付いて、そして31日が期限。気づかないで欲しかったのかも…。


__ 秋元@サイボウズ研究所プログラマーBlog: Linux猫フィーダー(餌やり機) (動画)

コンピューターに接続してプログラムからコントロールできる動力の、一番入手が簡単な物がこれなのかも。たしかに…。USB扇風機とかがちゃんとソフトウェアからON/OFFできるとハックしがいがあるんですけどねー。


__ まだ公開(しない/できない)「ひみつのプロジェクト」が3つになりそうな気配。


__ MORI LOG ACADEMY: 読点をどこに打つか

僕も打つとしたら「それは嫌だ、と私は思う」と読点を打つ。でもあまり読点は多用しない。なぜなら僕にとって読点を使うことで読みやすくなるケースは少なく、却って読みにくくなるケースさえあるからだ。その典型例が「それは嫌だ、と私は思う」だと思う。これは「「それは嫌だ」と私は思う」であった方が(少なくとも僕にとっては)読みやすい。おそらく、読点を多用する人は文章を音声としてとらえているのだろうと思う。だから声に出して読んだときに間を開ける部分に読点を打つことで読みやすくなったと感じるのだろう。ひるがえって、僕は文章を音声としてとらえる割合が他の人よりおそらく少ない。というのも、「幼稚園に入った初日にうつむいて黙ってじっとしているから泣いているのかと思ったら絵本を黙読していた」らしいから。そういう僕にとっては、音声情報を盛り込んだ読点の打ち方をしてあっても読む助けにはならないようだ。


__ 高校生に紹介するためにmodulobe.com - Modulobeの名前を思い出そうとして色々検索した結果「西尾泰和 うねうね」で発見(ぇ)

もう一つsodaconstructor。sobaで検索して「違うなぁ」とか思ったけど「Java バネ 生き物」で検索して発見。今後のためにそれっぽいキーワードを周りにちりばめておくことにします。物理演算で生物っぽい動きをシミュレート。

パネキットとは。パネキットは紹介に都合のいいページが見つからないので、イメージ検索とかして欲しいです。

2006年08月24日

日記

ICTスクール2006生徒作品集。 やっぱりチーム「非常用電源」のムービーはこれじゃもったいない。クロスフェード時のブロックノイズが酷い。 何らかの方法でもっとマシなフォーマットで公開できないだろうか。


__ Winkで連番画像のインポートが出来ればいいのになぁ、などと考えつつもう八時半か。


__ 「父さんの子供の頃には冥王星という惑星があってな…」「わかった!冥王星人が戦争して粉々になっちゃったんでしょ!」

という会話がなされるのかどうかは知りませんが、冥王星は惑星ではなくなったそうです。太陽系惑星:冥王星を除外 最終案を賛成多数で IAU-今日の話題:MSN毎日インタラクティブ。そんなことより、最終的な定義:(1)自らの重力で球状となる(2)太陽を周回する(3)軌道周辺で、圧倒的に支配的な天体…。「圧倒的」って何…。IAUのサイトは負荷が高くて見られなくなっているみたいで確認できず…。

プルート (ディズニーキャラクター) - Wikipediaから引用: この名前は、プルートが生まれた1930年に発見された冥王星からきている。

( ・∀・) つ〃∩へー

IAUのページから引用:

Page is being generated. If this message does not disappear within 30 seconds, please reload.

あちゃぁ…。しばらく待つしかないか。

2006年08月23日

日記

ヨドバシアキバの有隣堂書店の椅子から接続中。でもさすがに本を読みながら作業したら怒られるだろうなー。

しまった、ポカミス。朝ご飯を駅のパン屋で買って食べるつもりだったのを忘れてた。おなかすいた。

思い出した。前回ここに来たときは体脂肪計に乗ってみたのだけど、すでに体脂肪は標準程度になっていることが判明。D論太りは解消されたみたい。問題は筋肉量がかなり低いところではないかと…。タンパク質を食べて運動をしろと言うことですか。むむむ。

自分の管理能力を超えて、たくさん手を出しすぎるのはよくないが、 「自分の管理能力を超えて、たくさん手を出しすぎるのはよくない」と言って手を出さないのもよくない。自分の管理能力を向上する手段を開発せねば。

スケジュール。 26日 LL Ring。29日ラボ内ミーティング。GRINEditに関するPPTは作ってあるので、デモの練習をしておく。2日~4日 プログラミングシンポジウム。これまでにGRINEditのポジションペーパーを作る。可能なら当日までに最新版のリリース。 終わって10日から未踏ユースのブースト会議。ほったらかしになってるWavからウダー譜を作るプログラムを掘り出して、もうちょっとまともなバージョンを作りたいところ。ブースト会議を聞くと「やりたいこと」が増殖してしまうので危険だ。きっちり優先しないといけないことを記録しておかないと。16日から情報科学若手の会。GRINEditの発表。そして29日に提出が締め切りを迎えるコンテスト状のものが2つ。両方応募したい。締め切りドリブンでぎりぎりでやっていると片方を捨てることになってしまうので、うまいことスレッドが2つあるような作業の仕方をしないといけない。たぶん今が一番時間に余裕があるんだろう。

頭が泡だってしまっている。 やっぱりウダー譜とmltfindは10月まで保留にするか。そうするとたぶんウダー譜はまた塩漬けになってしまうんだけどな。


__ シュレッダーにたくさん書類を入れられるように入れ口を広くしたら、指の細い子供の指が入ってしまうようになったのでやっぱり狭くします…って、それじゃ書類が入らなくなってしまうじゃない。入れ口から刃までの距離を伸ばして子供が手を入れても届かないようにするとか、口から刃までS字に折れ曲がるとかすればいいのでは…。


__ 冥王星の軌道が「細長い楕円形」ってのはいくら何でも言い過ぎでは>NHK

冥王星が発見されて世界が沸いて、その当時に発見された元素をプルートから取ってプルトニウムにしたほど、っての表現も微妙…。 二つ前の元素は天王星ウラノスから取ってウラン、一つ前の元素が海王星ネプチューンから取ってネプツニウム だからでは…。 一応、調べてみました。冥王星の発見は1930年。プルトニウムの発見が1940年。冥王星発見当時、プルトニウムの発見者は18歳。うーん。「当時」といえなくはないのか…。

Eccentricity (mathematics) - Wikipedia, the free encyclopediaを参考に計算してみたところ、離心率0.25の冥王星の軌道は、短径が長径の0.95倍くらいのようです。長い軸が10センチとすると、短い軸は9センチ5ミリ。これを「細長い」というのはさすがに言い過ぎでしょう。


__ キムチが発酵しすぎてちょっと酸っぱい。一昨日つけたばっかりのキュウリがもう酸っぱい。うーむ、底に水分が溜まっているなぁ。この水分は捨てた方がいいのだろうか?

2006年08月22日

日記

名刺印刷用紙のメーカーが出しているフリーのレイアウトソフトをダウンロードしようとしたらサーバが落ちていて悲しい。

名刺の裏に数独のルールの説明を書いてみたけど、字が細かくてごちゃごちゃするからやっぱりやめよう

うーむ。枠いっぱいに使うと、少し紙が斜めになっていたりするだけで印刷がはみ出してしまう。30枚印刷して10枚失敗。 シートからはがすところは適当にやっても大丈夫。こっちに細心の注意を払わないで、手差しの紙を入れるところに払えば失敗しない。


__ 404 Blog Not Found:役所仕事

アメリカにビザ無しで入国できるのはわずか27カ国。アジアでは日本、シンガポール、ブルネイの3カ国だけです。 http://www.travel.state.gov/visa/temp/without/without_1990.html#2

へぇー!( ・∀・) つ〃∩

信頼されてるんですねぇ。


__ 学校によって同じ科研費でありながら使えるかどうかが違うのが謎です。 書籍を買えるようになったのはうれしいのですけど、NAISTではすんなり買えたものが買えなくなったり理由書が必要になったりとややこしいです。b-mobileを買ったときはすんなり買えたのに、更新ライセンスの購入に理由書が必要だったり。ネットワーク接続機器が研究とどう関わりがあり、どう利用し、これがあればどうメリットがあり、ないとどうデメリットがあるか、を書かないといけないようです。えー。


__ 【楽天市場】ネフ社(naef) アークレインボウ:木のおもちゃWoodWarlock うわー。欲しい。でもこれは絶対子供へのプレゼントには買えないな、踏んで割りそう。買うなら自分で買って一人で楽しむ(ぇ)

【楽天市場】ネフ社(naef) ネフスピールウッドワーロック5周年記念バージョンモノクロ【世界限定200個】:木のおもちゃWoodWarlockの逆三角形の積み方とか、【楽天市場】ネフ社(naef) アングーラ:木のおもちゃWoodWarlockのふしぎな積み方とか、【楽天市場】ネフ社(naef) セラ:木のおもちゃWoodWarlockのグラデーションとかスゴイ。欲しくなってしまう。

【楽天市場】ネフの積み木いっぱいで遊ぼう!:木のおもちゃがりとん。 こんなこと書かれたら4セット大人買いしたくなってしまうじゃないか!


__ おなかすいた。今気がついたけど、20時からのミーティングだったら食事は済ませてから行ったほうがよさそうなのでその時間を見て早めに出ないといけないですね。じゃ、そろそろ。


__ 自転車の鍵をなくして駅からとぼとぼ歩いて帰ってきて悲しい。


__ タスクの管理方法について手帳に書いたことを整理。

子供の時みたいな、何にも邪魔されずに一番好きなことだけにつぎ込むことが出来る時間は、基本的にもう訪れない物だと思った方がいい。インタラプトや並列で走らせないといけないジョブがあることを前提として、どうやってうまく時間を使うかを考えないといけない。もしくは一攫千金して運用益だけで食べていけるようになって雑用は全部メイドに任せる。

人間の意識はシングルスレッド。パフォーマンス向上のためには、PC、他人、潜在意識などを使って並列化する必要がある。

タスクリスト、TODOリスト、などはようはwait setだ。手帳のTODOリストを見て次に何をすべきか決めるのはnotifyAllだ。きちんとnotifyAllする(タスクを取りこぼしたりしない)ためにはすべてのタスクがそのリストに載っていなければならない。だってwait setだもの。

(バージョン0.1) to do、done、defer、delegate、suspend、canceled、wait、depend、be depended

(バージョン0.2)

  • □ to do。実行すること。実行することが可能なことでなければならない。
  • to doの削除
    • [v] done。実行可能なことを実行完了したことを示す状態。手帳で管理する場合は本文部分を打ち消し線で消す。(以下、「打ち消し線で消す」と表記)
    • [x] canceled。実行可能なことを、実行するのをやめた状態。状況が変わったので実行する必要がなくなった、当初の記述では適切でないと気づいたので書き直す、など。打ち消し線で消す。
    • [d] delegated。canceledの一種。実行できると思っていたが、実は他者(PC、潜在意識含む)の行動を待たなければいけないと言うことに気がついた。もしくは、実行した結果、完了までに他者の行動を待たなければいけない状態になった。打ち消し線で消す。条件付きタスクを生む。例:「○○の実装」というTODOを書いたが、似た目的のソースをAさんが持っていたことを思い出したので、メールでソースをもらえないか問い合わせた。
    • [s] suspended。canceledの一種。実行できると思っていたが、今は実行できない状態になった。もしくは実行した結果、何かを待たなければ続行できない状態になった。打ち消し線で消す。条件付きタスクを生む。例:「郵便局で~を出す」というTODOを書いたが、うかうかしていたら閉まってしまったので明日出すことにする。
  • 条件付きタスク
    • ○条件→□ to do。条件は実行可能ではないので頭に□をつけるのは誤り。条件が満たされた場合に実行する内容が条件の満たされ方によって大きく変わる場合や、書くまでもない自明なことの場合は省略してもいいと思う。例:○Aさんからソースコード→□読む。○郵便局開いた→○○を出す。
    • 条件付きタスクは、条件を満たしている場合しか実行できないので、notifyAllの際にはきちんとチェックする。
  • 依存関係
    • 矢印。矢印の根本が依存される側。時間の流れと同じ矢印。条件付きタスク。手帳の場合は矢印は自由に曲がりくねっていい。複雑になったら書き直す。依存元を解決しないと後続が実行できないので、依存元は優先的に実行される。例:本Aを段ボールに入れる→本の小包をラボに持って行く→ラボのガムテープと小包を持って郵便局に行き、書籍小包で出す。(書籍小包は中身を局員が確認するので閉じて持って行ってはいけないので)
  • 書き直し
    • 手帳と付箋での管理では、打ち消し線で消しても実際には消えないのでいつかリソース(紙面)を食いつぶしてしまう。食いつぶす寸前はパフォーマンスが悪化するので、適当なタイミングでガベージコレクションが必要。これは打ち消し線で消されていない物だけを新しい付箋に書き写して、古い付箋を廃棄する
    • この際、書かれたけども手をつけられていないタスクは存在意義を見直す必要がある。特に、タスクブレイクダウンの可能性を検討する。例えば上の書籍小包のタスクは、実際には当初「ゲド戦記を実家に送る」だったが、郵便局のあるラボに来ても送るべき本がなく、本のある家に戻っても郵便局が近くにないので先延ばしになっていた。ブレイクダウンをすることで、まず家で段ボールに詰めてラボに持って行かないといけないことを理解することが出来た。
    • ルールとして、タスクブレイクダウンをせずに「そのまま書き写す」際には「そのまま書き写された=特にブレイクダウンせずに今すぐ実行できるはずなのになぜか実行されなかったタスク」として(-)マークをつける。このマークが1つつくだけならまだ付箋の回転が速くて仕事が追いつかなかっただけだとも考えられるが、積み重なっていくようなら何かが確実におかしい。

すごい、これだけの内容が 1枚の付箋に書かれていたはずがないので、ほとんどは「書いたつもりで実際には頭の中にあったこと」なのだろう。今書きだしていなかったらいつの間にか消え去っていたかも知れない。危ない危ない。


__ 夏のプロシンのプログラム。

 ・トーク1 「(未定)」
                                                    筧 捷彦 (早大)

は話す内容が単にまだ決まっていないということなんだろうけど、

・トーク1 「(不定)」
                                                  竹内 郁雄 (東大)

は話す内容は決まらないことが決まっているんだろう。 何人も「(不能)」を語ること能わず。

それはさておき、発表者じゃなくてもポジションペーパーを配布できるようだからGRINEditのポジションペーパーを作ろう。もともと去年のプロシンで発表した時に、グラフ可視化ライブラリを作った方がよさそうな気配を感じたのがそもそもの始まりだもの。


__ じゃこの中に小さいエビが入っているが、じゃこよりだいぶ小さい。どうしてもっと大きなエビはいないのか。じゃこと同じ程度の大きさのエビなら、同じように捕まってもおかしくないのに。

キミならどう書く 2.0 - ROUND 3 -

>>> def graph(xs):
	print "\n".join([str(x).rjust(max([len(str(y)) for y in xs]))
			 + ": " + "*" * (20 * x / max(xs)) for x in xs])

	
>>> graph([2, 5, 9, 11])
 2: ***
 5: *********
 9: ****************
11: ********************

寝る前に発見したのでとりあえずあっさり目の回答をして寝ることにします。グラフ簡約が欲しい。

「グラフを出力する」の「グラフ」を「グラフ理論」の「グラフ」だと無理矢理に解釈してうねうねするのも一興か。

2006年08月21日

日記

発表資料、また持ち時間×3になっちゃった。

ひょえー、どこぞの高校生対象のネットワークプログラミング講座はいつの間にかアスペクト指向になってるー。しかも高校生がちゃんと理解して課題を提出してるー。一番わかりやすいとか言ってるー。あうあう。負けてられないが参加する時間あるかな。って時間はひねりだすものだったか。


__ 秋葉原に行って名刺プリント用紙を買ってきました。最近は縁がギザギザにならない物とかもあるんですね。で、それだけにしとけばいいのに、ヨドバシカメラの雑誌コーナーになぜ料理があるのかと釣られてしまいました。Yahoo!インターネット検定 - 食育エキスパートですね。食べる食育と作る食育があるようですが、食べる食育の方は演習問題をあっさり全問正解してしまったので作る食育の方を買ってきました。ニンジンは赤いけど緑黄色野菜で、キュウリは緑色だけど緑黄色野菜ではなく、アスパラはキュウリ同様に「中が白い」けど緑黄色野菜、ってのは常識かと思っていたけどそうでもないんですかね。うちの母親が食育の英才教育を施したせいですかね。


__ 座長を頼まれて、座長って何するかよくわからないです、と答えたら、なんとなく進行して適当に質問したり場に問いかけたりして、キャラで乗り切れと言われてしまったorz。


__ そうそう。3WAYバッグも買ってしまいました。横向きの手提げになって、縦向きの手提げになって、リュックサック型になって、肩にかけることも出来る。あれ、4WAYだ?たぶん縦の手提げはリュックサックモードに含まれるんでしょう。でも混んだ車内で足の間に入れるときとか、既存のリュックサックだと紐を踏まれてしまったけど、これなら紐を中にしまえるので踏まれません。

今まで使っていた肩から提げるカバンは、パソコンを入れるといっぱいで、本を入れるとパンパンになってしまうのです。そこで別の袋にパソコン関連の物だけ移して両肩にかけていたのですが、これは自転車に乗っているとずり落ちて大変だし、(指摘されるまで気がつかなかったけど)紐が細いので肩に食い込んで痛いし、大変なのです。

2006年08月20日

日記

新聞を見ていたら「特にパソコンを多く使う人は目元の血行が悪化し、実年齢より上に見られることがある」だそうな。確かに、目元の血行は悪いような気もする。でもそこで目元用の化粧品を使うのは問題の解決になっていない気が…目元の血行を促進する

昨日一昨日の夜更かしがたたってちょっと調子が悪い。

青汁は、クエン酸を加えるとにおいが気になりにくくなるかも知れない。


__ えー、昨日一昨日の疲労と生活リズムの変調のせいで、目がかなり疲れています。そこで作業は置いておいて、駅前のスーパーに行ってきました。

ここでオリジナルカクテルを紹介したいと思います。 まず用意するのはウェルチのグレープ100。濃い紫色の濃厚なジュースです。これ単体でもソーダで割りたくなる人はいるかも知れません。次に用意するのはルジェのクレーム・ド・カシス。カシスオレンジを頼むとたまに底に溜まっていたりするあのリキュールです。濃い紫色をしています。この2つを適当に混ぜます。見た目ちっとも変わらないじゃん!


__ 人力検索はてな - よく「因数分解が何の役にたつんだよ」という子どもがいます(中略) これに対するスマートな反論をお願いします。 。えー。因数分解なんか日常生活にはちっとも役に立たないと思います。そして因数分解と素因数分解と混同している回答があるのにスルーされているのが個人的には不安感を煽ります(笑)

2006年08月19日

Just Another Python Hacker, その3

Python リファレンスマニュアルを読んでいて、単項演算子は-, +の他に~(ビット否定)もあることを知ったのでそれを導入して西尾泰和の日記(2006-02-02)を改良してみました。

>>> print''.join([chr(x) for x in 7^77,-~7*7^77,-77^-~7*~7,77^7*7-~7,7*7&~-7*7,7
^77-7,~-777/7,777/7,77^7*7-~7,7^777/7,7777/77,~7*7^7-77,7*7&~-7*7,~7&7+77,7^7*7+
77,77^7*7-~7,7^777/7,777/7,~-777/7,7*7&~-7*7,~7&77,-777/~7,-7777/~77,7-7777/~77,
7777/77,~7*7^7-77,~-7^~-7*7])
Just Another Python Hacker,

80文字改行で、1行くらい短くなりましたね。なお見やすくするために80文字で改行しているので実行してみる人は改行を取り除いてくださいね。

この他に括弧をつける機能も入れてみたのですけど、括弧はコストが高いみたいでちっとも使われませんでした。


__ ちょっと行数は短くなったけども、7だらけなのは変わらないので見栄えは大して変わらず、ちょっと面白くないので0と1のバージョンを作ってみました。

>>> print''.join([chr(x) for x in -~0111,100|10+11,10^11*11,100|10+10,-0101/~1,0
101,110,111,100|10+10,~11^-100,101,1+111-~1,-0101/~1,10*010,11*11,100|10+10,~11^
-100,111,110,-0101/~1,0110,~1%~-100,~-100,10|~-100,101,1+111-~1,11*~1*~1])
Just Another Python Hacker,

今のところこれが一番短いですね。0と1から10進数と8進数の両方を作れるからでしょう。

>>> print''.join([chr(x) for x in 7^77,77^070,~-77^077,700/~-7,7*7&7*70,7^70,770
/7,777/7,700/~-7,7^777/7,707/7,77^077,7*7&7*70,70+70/7,70^077,700/~-7,7^777/7,77
7/7,770/7,7*7&7*70,~7&77,-777/~7,~-700/7,7+700/7,707/7,77^077,700&70700])
Just Another Python Hacker,

0と7の方がわずかに短いですね。でも0/1版は最初の項がマイナスで始まるからinの後のスペースを詰めることが出来てやっぱり同じですね…。


__

>>> print''.join([chr(x) for x in -~0111,100|10+11,10^11*11,100|10+10,-0101/~1,0
101,110,111,100|10+10,~11^-100,101,1+111-~1,-0101/~1,10*010,11*11,100|10+10,~11^
-100,111,110,-0101/~1,0110,~1%~-100,~-100,10|~-100,101,1+111-~1,11*~1*~1])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in -222/~2,20|202/2,22^202/2,20|200/2,2*020,0202/
2,220/2,222/2,20|200/2,2-~202/2,202/2,0202-020,2*020,2*2*20,20+202/2,20|200/2,2-
~202/2,222/2,220/2,2*020,0220/2,~2+200/2,~-200/2,~2+220/2,202/2,0202-020,22*2])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in 3^0333/3,-3-~3*30,3-~333/3,~3-~3*30,~-33,0303/
3,330/3,333/3,~3-~3*30,3+303/3,303/3,3+333/3,~-33,330/3-30,30*3-~30,~3-~3*30,3+3
03/3,333/3,330/3,~-33,3*030,333^300,33*3,330/3-3,303/3,3+333/3,33+33/3])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in 044^440/4,~-4*~-40,4+444/4,4*40-44,040,0404/4,
440/4,444/4,4*40-44,4+400/4,404/4,4+440/4,040,40+40,4*40-~-40,4*40-44,4+400/4,44
4/4,440/4,040,0440/4,4^404/4,~-400/4,4^444/4,404/4,4+440/4,44])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in 55^5*5*5,5-~555/5,5+55+55,5+555/5,50&050,0505/
5,55+55,555/5,5+555/5,55+~-50,505/5,5+55+~-55,50&050,55+5*5,-5&5*5*5,5+555/5,55+
~-50,555/5,55+55,50&050,0550/5,5^50+50,50+~-50,5^55+55,505/5,5+55+~-55,~-055])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in 66|6+66,6+666/6,066-~60,66^066,~6&6*6,~-66,660
/6,666/6,66^066,6^660/6,606/6,66|060,~6&6*6,66^6+6+6,60-~60,66^066,6^660/6,666/6
,660/6,~6&6*6,66+6,6*6-~60,~-600/6,6+606/6,606/6,66|060,60&6060])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in 7^77,77^070,~-77^077,700/~-7,7*7&7*70,7^70,770
/7,777/7,700/~-7,7^777/7,707/7,77^077,7*7&7*70,70+70/7,70^077,700/~-7,7^777/7,77
7/7,770/7,7*7&7*70,~7&77,-777/~7,~-700/7,7+700/7,707/7,77^077,700&70700])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in 8*8+80/8,80|808/8,808/~-8,80|800/8,8+8+8+8,8*8
-~0,880/8,888/8,80|800/8,8|8+88,808/8,800/~-8,8+8+8+8,80,88|8-~88,80|800/8,8|8+8
8,888/8,880/8,8+8+8+8,80-8,88-~8,88+88/8,8-888/~8,808/8,800/~-8,-88/~-~0])
Just Another Python Hacker,

>>> print''.join([chr(x) for x in 90&-9-9,9+99+9,99|9+9,99+9+~-9,99&9000,99&9*9,
990/9,999/9,99+9+~-9,99^99/9,909/9,~99^-9-9,99&9000,~9%90,9|9+9^99,99+9+~-9,99^9
9/9,999/9,990/9,99&9000,9*~-9,~-~-99,99,9|99,909/9,~99^-9-9,9+99&9-90])
Just Another Python Hacker,

4が一番短いですね。そしてやっぱりどれも括弧は使わないですね。コストが高いんでしょう。

DIGIT = 1
OPERATORS = "%/&|^*+-"
PREFIX = "-~0" + str(DIGIT)
SUFFIX = "0" + str(DIGIT)
caches = [{}, {DIGIT: str(DIGIT), 0: "0"}]
numLetters = {}
QUERY = [ord(x) for x in "Just Another Python Hacker,"]
query = QUERY
 
def evalEq(eq):
    try:
        v = eval(eq)
        if not(numLetters.has_key(v)):
            numLetters[v] = level
            result[v] = eq
    except:
        pass


for level in range(2, 100):
    result = {}
    
    for a in caches[level - 1].values():
        for prefix in PREFIX:
            evalEq(prefix + a)
        for suffix in SUFFIX:
            evalEq(a + suffix)

    for i in range(1, level - 1):
        j = level - i - 1
        for a in caches[i].values():
            for b in caches[j].values():
                for f in OPERATORS:
                    eq = a + f + b
                    evalEq(eq)

    for i in range(1, level - 3):
        j = (level - 3) - i
        for a in caches[i].values():
            for b in caches[j].values():
                for f in OPERATORS:
                    eq = "%s%s(%s)" % (a, f, b)
                    evalEq(eq)
                    eq = "(%s)%s%s" % (a, f, b)
                    evalEq(eq)

    for i in range(1, level - 5):
        j = (level - 5) - i
        for a in caches[i].values():
            for b in caches[j].values():
                for f in OPERATORS:
                    eq = "(%s)%s(%s)" % (a, f, b)
                    evalEq(eq)

 
    query = [q for q in query if not(q in result)]
    caches.append(result)
    if query == []: break
    print level
 

print "print''.join([chr(x) for x in " + ",".join(
    [caches[numLetters[x]][x] for x in QUERY]) + "])"

Pythonの構文木を見る

ワンライナーから不要な空白文字を取り除くスクリプトを作ったのですが、「取り除いてパースに成功するなら取り除いてOK」とやってしまったので文字列の中の空白まで取り除かれてしまいました。そこできちんと構文木を眺めてみることにしました。love unstable: Pythonの構文木を見るを参考に。

import parser, symbol, pprint, token
def change(ast):
    if type(ast) is list:
        return map(change, ast)
    else:
        leaf = symbol.sym_name.get(ast, ast)
        return token.tok_name.get(leaf, leaf)
parse = lambda s: change(parser.ast2list(parser.expr(s)))

pprint.pprint(parse("('1 1'       * 2)   + (3 - 4)"))

これで出力は

['eval_input',
 ['testlist',
  ['test',
   ['and_test',
    ['not_test',
     ['comparison',
      ['expr',
       ['xor_expr',
        ['and_expr',
         ['shift_expr',
          ['arith_expr',
           ['term',
            ['factor',
             ['power',
              ['atom',
               ['LPAR', '('],
               ['testlist_gexp',
                ['test',
                 ['and_test',
                  ['not_test',
                   ['comparison',
                    ['expr',
                     ['xor_expr',
                      ['and_expr',
                       ['shift_expr',
                        ['arith_expr',
                         ['term',
                          ['factor',
                           ['power',
                            ['atom',
                             ['STRING', "'1 1'"]]]],
                          ['STAR', '*'],
                          ['factor',
                           ['power',
                            ['atom',
                             ['NUMBER', '2']]]]]]]]]]]]]]],
               ['RPAR', ')']]]],
            ['STAR', '*'],
            ['factor', ['power', ['atom', ['NAME', 'x']]]]],
           ['PLUS', '+'],
           ['term',
            ['factor',
             ['power',
              ['atom',
               ['LPAR', '('],
               ['testlist_gexp',
                ['test',
                 ['and_test',
                  ['not_test',
                   ['comparison',
                    ['expr',
                     ['xor_expr',
                      ['and_expr',
                       ['shift_expr',
                        ['arith_expr',
                         ['term',
                          ['factor',
                           ['power',
                            ['atom',
                             ['NUMBER', '3']]]]],
                         ['MINUS', '-'],
                         ['term',
                          ['factor',
                           ['power',
                            ['atom',
                             ['NUMBER', '4']]]]]]]]]]]]]]],
               ['RPAR', ')']]]]]]]]]]]]]]],
 ['NEWLINE', ''],
 ['ENDMARKER', '']]

当たり前ですが、文字列の中の空白は残って、トークンの間の空白は消えていますね。後はNAME、NUMBERなどが隣接するときには空白を挟み、RPAR(括弧)などは空白を挟まないでトークンを結合してやれば目的は果たせるでしょうかね…?

日記

結局西尾泰和のブログ: Pythonでワンライナーを作成する際のノウハウ集なんかを作って徹夜してしまいました。

和田君から。

西尾さん、Fnキー+F7にあるメニューの設定でのカスタマイズは既にをお使いですか?変なサイズのディスプレイや最近はやりのワイドタイプの場合はともかく、4:3タイプのディスプレイの大きさなら大体、何とかなると思います。もし使われてないならぜひ。こういう機能はThinkPadはしっかりしていると思います。

おすすめされたモニタをよく考えずに買ったらその最近はやりのワイドタイプで、切り替えられるサイズ一覧に適切なサイズが出てこないという罠にはまっています。画面のプロパティで変える場合も、一度デュアルモニタの設定にしてOKを押さないと選択肢に出てこないので、不便です。 現在の状況を保存・復元できればいいだけなんですけどね。


__ まいねーむいず


__ 喉が渇いたなぁ…。薬局でクレジットカードが使えなかったので青汁を買わなかったのは間違いだったのかも知れないなぁ。


__ うまく動かなかったEclipseのProfilerプラグイン、消してインストールし直したら動きました。何が原因だったのだろう。とりあえずProfilerDLL.dllが適切なところにコピーされていないというのではないと思われる。なぜなら「ProfilerDLL.dllが~~に入っていないと起動できないよ?コピーする?」という趣旨のダイアログが表示されたから。親切ー。

GRINEditのプロファイリングをしたいのをぐっとこらえてDancingLinks。

ふむ。 僕はJavaプログラムの高速化はあまり詳しくはないが…2次元配列をd[x][y]を{{x, y, d[x][y]},....}というリストに一度変換した上で、制約に反せずにx,yに値vを入れることが出来るかどうかをこのリストから線形探索して調べているように見える…。9 * 9 * 9回、このリストからの線形探索をしているように見える…。 はっ、しかも制約に反することがわかったところでreturnすればいいものを、毎回全部探索してる!

書き換えたら一時的に作られるリスト自体がいらなくなりました。16%高速化。


__ 「ふつうのはすける」で変換したら「普通のは透ける」になりました。


__ Dancing Linksの肝は4方向リスト。本当は昨日読むはずだったのに、ワンライナーなんか作ってしまって、急いで読もうと思ったのに晩ご飯を食べたら眠くて…寝てから読むか、月曜にプリントアウトして電車の中で読むか。火曜日はラボのミーティングだしなぁ。


__ 渡辺さんの裏に迷路が付いている名刺を見てから、ずっと裏につけようと思っていた物がやっと完成しました。

sudoku.png

一応、数字の入っているマスも、印の付いているマスも点対称なのだけど、3*3*3*3の普通の数独に比べて制約が弱くなるからなのか、これくらいたくさん数字を入れないと解けてくれません。うまく配置するともっと少なくても解けるのかも知れないけど…。

あとはこれを名刺の裏にうまく印刷できるか試さなきゃ。

Pythonでワンライナーを作成する際のノウハウ集

これはLL Ringというイベントの「じゃんけん2.0」に出場する際に「多くの構文に改行が必須であるPythonで書かれたじゃんけんエージェントをワンライナーにしていたらウケるかな」と思ってワンライナー化しているときに書いたメモです。自分用のメモのつもりだったので書き殴ってありますが、意外と人気のようなので近いうちに加筆します。 実は後から書いた英語版(How to make oneliner in Python?)の方が整理されているのかも。

完成したワンライナー

jankenoneliner.png

def文を式にする

defは改行を要求するのでlambdaに置き換える必要がある。

def foo(x): return x + 1(ここに改行)
foo = lambda x: x + 1
globals().__setitem__("foo", lambda x: x + 1)

lambdaは式しか含むことが出来ないので、代入などの文は全部式に置き換える必要がある。

if文を式にする

if condition:
    p("True")
else:
    p("False")
condition and p("True") or p("False")

andやorが遅延評価することを利用している。このandとorを使った評価順の制御が、式しか使えないlambdaの中ではすべての基礎になる。

p("True")が0, NoneなどのFalseと判定される値になりうる場合は例えばこうする。

(condition and [p("True")] or [p("False")])[0]

空でないリストやタプルはTrueと判定されることを利用している。

柴田さん(TRIVIAL TECHNOLOGIES 2.0)情報によればbool値をintに変換した際に0と1になることを利用して以下のように書くこともできる。これは上の例での関数pが副作用を持たない場合にのみ使うことができる。

["False", "True"][condition]

for文を式にする

リスト閉包内包を使う。

>>> for i in range(5):
	print i

	
0
1
2
3
4
>>> import sys;[sys.stdout.write(str(i) + "\n") for i in range(5)]
0
1
2
3
4
[None, None, None, None, None]

最後の[None, None, None, None, None]がこの式の値である。

代入文を式にする

リストのappendや辞書の__setitem__を使用する。 グローバルな名前空間globals()、ローカルの名前空間locals()、そしてオブジェクトxの名前空間x.__dict__がよく使われるだろう。

while文を式にする

ループ回数が十分少なければ再帰呼び出しでも構わないが、多い場合は再帰回数の上限を超えてしまうので使えない。 そこで、itertoolsのcountとifilterfalseを使う。countはいわゆる無限リスト。ifilterfalseによって生成されたイテレータのnextメソッドを呼ぶと、最初にfalseになる所まで実行して中断することを利用する。

>>> i = 1
>>> while i < 100:
	i *= 2

	
>>> i
128

break文とelse節

breakを実現するためには「式を評価した結果が特定の値になったら続きを実行しない」という必要がある。 「特定の値」をわかりやすくするために"BREAKED"という文字列にすると、これはTrueと判断される値なので、orで繋いでおき、Trueと判断される値になったらループを終了する。itertools.ifilterfalseではなくitertools.ifilterを使う。ループがブレイクされた場合には値が"BREAKED"になり、されなかった場合にはTrueになることを利用してelse節を実現できる。

>>> primes = []
>>> for i in range(2, 100):
	for p in primes:
		if i % p == 0:
			break
	else:
		primes.append(i)

>>> primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

この素数を求めるコードをまず下のように書き換え、forを消す。

>>> primes = []
>>> for i in range(2, 100):
	j = 0
	while j < len(primes):
		if i % primes[j] == 0:
			break
		j += 1
	else:
		primes.append(i)

		
>>> primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

>>> globals().__setitem__("primes", []) or [
  globals().__setitem__("j", 0) or
  ifilter(bool,
    (
      not(j < len(primes)) or
      (i % primes[j] == 0 and "BREAKED") or
      globals().__setitem__("j", j + 1)
      for c in count()
    )
  ).next() == True and primes.append(i)
  for i in range(2, 100)
] and None
>>> primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

改行の除去と適切なimportはお任せします。

2つの式を順次実行する

一つめの式がTrueと判定されるならandで結ぶ。Falsと判定されるならorで結ぶ。わからないなら一つめの式を[]で囲ってTrueと判定させる。

NoneはFalseと判定される。__setitem__やsys.stdout.writeなどのメソッドはNoneを返すのでa or b or c or ...と続けていくのが一番自然だが、Trueと判定される物が混ざっている場合は(a and False)などとやって無理矢理Falseにする必要がある。もちろん、文字数を減らしたい場合は(a and 0)でOK。数値であることがわかっているならa * 0がよいだろう。

逆にandで続けていくのなら、Falseと判定されうる物は最初に書いたように[]で囲うことでTrueと判定させる必要がある。Falseと判定される物が連続しているなら[sys.stdout.write("1"), sys.stdout.write("2"), sys.stdout.write("3")]というようにリストにしてしまうのも字数を減らす上では一つの手である。

class文を式にする

read-onlyでないクラスをインポートする。そのクラスのインスタンスを作ってメンバを動的につっこむ。もし複数のインスタンスを作る必要があるならlambdaで囲ってbuilder関数にする。

>>> class Counter:
	def __init__(self):
		self.count = 0
	def __call__(self):
		self.count += 1
		return self.count

	
>>> c = Counter()
>>> c()
1
>>> c()
2

クラスを定義するのは多くの場合トップレベルなのでこの例ではimport文や代入文を使っている。完全に式としてクラスの生成をしたければimportを式にし、生成したインスタンスを引数として無名関数を呼び出して、その中で各種メンバの挿入を行って返せばよい。この関数をクラス名をキーとして名前空間に入れれば、普通のクラス定義と同じように使うことが出来る。

例外のハンドリング

例外を投げうるコードをパイプとして開き、例外が投げられたときにPythonが標準で出力するエラーメッセージをパースすればtry catchに相当することが出来る。以下はじゃんけんエージェントのプロトタイプからの引用。まず最初にコマンドライン引数に"SAFETY_NET"を渡す。渡された場合には引数を"GO"に変えて自分自身を起動する。

    if sys.argv[3] == "SAFETY_NET":

        ifilterfalse(bool,
            (
                re.search("Software caused connection abort",
                    os.popen3(
                        r"python %s %s %s GO" % (
                            sys.argv[0],
                            sys.argv[1],
                            sys.argv[2]
                        )
                    )[2].read()
                )
                for x in count()
            )
        ).next()


    elif sys.argv[3] == "GO":
        #  例外を投げ得る処理

これで

while True:
    try:
        #  例外を投げ得る処理
    except ....: # Software caused connection abortだけキャッチして無視
        pass

に相当する処理が出来る。

この場合は特定の例外だけをキャッチして無視するコードであるが、実際には例外が発生したときの状況が必要だったりするケースもあるかと思う。それは、必要になるデータをすべてまとめてcPickle.dumpsで文字列にダンプし、切り出しやすいように適当な印をつけて例外が投げられそうな部分の手前で出力しておき、キャッチ側ではそれをcPickle.loadsする。

import文を式にする

組み込み関数__import__を使う。でも、lambdaの中でimportせずに冒頭でimportするほうが関数にする必要がないので楽。

字数の削減

最もよく使うメソッドを__call__にする。 __setitem__は頻出するので、x.__dict__.__setitem__("__call__", x.__dict__.__setitem__)がよいかもしれない。

[N]でN文字の文字列を意味することにする。from [N] import [M]をfrom [N] import [M] as [1]に置き換えると、インポート部分は5文字増え、呼び出し部分はM - 1文字減る。Mが7文字以上なら使うのが1回でも置き換えるメリットがあり、使うのが2回あればMが4文字でもメリットがある。

長い名前を1~2文字の短い名前にするのは字数を減らす上で有効だが、うっかり衝突してしまうと目で見て直すのは大変なのでバージョン管理とこまめなテストが重要。あとどの文字をどのスコープで何に使ったかを記録するといいかもしれない。

2006年08月18日

日記