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

2007年08月26日

Django勉強会日記

「土曜日は社員証がないとエレベータが動きません」 というのはデマでした。

詳しい講義の内容は後で動画とか公開される予定らしいのでそれを見た方がいい。

要約。

万能の工具はないのだから、 ある工具で作業がしにくいならその工具を使わないことも検討すべき。

テストは重要。 むしろテストと共に歩む。 新しい機能を追加したらその機能がどういう条件を満たしているかをテストで宣言し、 バグをつぶしたらそのバグを補足できなかったテストを修正し、 リファクタリングの時はテストを絶対いじらない。

Senna2.0で全文検索。Pythonバインディング同梱。 Wikipedia検索のソースコードが公開されているようなのであとで読む。

「高校生なのにすごい」という表現は適切ではない。 単純に「すごい」でいいと思う。 でもあと数年経って高校生っぽさが抜けたらもっとすごいかも。

newforms。 僕はnewformsしか使ったことがない。 initialを使ってフィールドの値がカスタマイズされた 非束縛フォームを作る話を後で書く。

django.doukaku.orgを作っちゃおうかという話は、 doukaku.orgにスニペット投稿機能が付いたら、 単にタグで絞り込むだけでいい気がした。

Disc4とかDisk 4とかD jangoとか表記ゆれがあるのはどうかと思った。

そうだ赤坂のDjango a la rahmenに行く話をすっかり忘れていた。

僕の今後のキャリアパスのためにはCSSが重要だということがわかった(ぉ

インフラの欠陥を回避する知識だけに自分の時間を投資していたのでは 欠陥が修正されてその知識の価値が暴落した時(バブルの崩壊)に大打撃を受ける。 バブルの時には株価が永遠に上がり続けるような錯覚をしがちだが、 実際にはすでに過熱していていつか必ず暴落する。

ライセンスの話は、僕は専門外なので詳しく知らないし、 書くほどのことじゃないと思っているのだけども、 これで別ルートから2回目の「ブログに書いた方がいいのでは」

Jython本が完成しない最大のデメリットは、 「必須でない文章を書いている暇があったらJython本の原稿を書くべき」 というプレッシャーに押されて心おきなく時間を割けなくなってしまったことだ。 早く終わらせて変なことをいっぱいしたい。

人生で初めて飲み会の幹事をしたけど、 やっぱり向いていないと思った。 3500円を15人から集めて 手元には50250円。支払金額は60140円。あれれ全然足りないぞ…、 とお札を数え直したり、計算し直したりとかなり悩んだ。 結論から言うと500円玉が5枚あったら250円じゃなくて2500円だ。 そして自分ともう一人の立て替え分7000円を足すのも忘れてた。

朝まで飲もうと言い出した本人が記憶ないって! 酔ってないような顔をして記憶が飛んでるって! 要注意人物だw

やっぱり寝てしまった。

たとえば:朝まで飲まない。

2007年08月20日

開発合宿についてサーベイその1

開発合宿サーベイ

とりあえずゆるーくまとめた。

開発合宿(三月号)にいってきたぞ、と。 | i d e a * i d e a

長野県松本市まで行ってきました。 (snip) 「温泉 24時間 無線LAN」あたりで検索 、ホテル池田屋さんにしました。12畳の和室でもちろん座椅子つき。作業用の机も出していただきました。 (snip) 温泉はもちろん24時間。 (snip) プロジェクター大活躍 (snip) お互いのナレッジシェアはやはりいいですね。 (snip) iPodも持って行きました。いままでiTunesを使っていたのですが、iTunes立ち上げているとCPUに負荷がかかるし、なによりMusic Storeをついつい見てしまうのでいけません (snip)
座椅子もいいのですが、机と椅子の方がなんとなく作業効率がいいような気が (snip) ちょっとした緊張感が大部屋の方にはありますね。他の人ががんばっている姿は多く見られたほうがいいですしね。
たしかに。 Python温泉は会議室だったのでよかった。 一方冬山PythonDevelopersCampは個室に分散したのでいまいちだった。
合宿の位置づけを事前に堅く決意しておくこと。
前回のPython温泉での僕の目標は「どう書くorgのプロトタイプを作ること」だったなぁ。

松本 蔵の街中町 ホテル池田屋 ビジネス 予約 観光 松本城 ネット無料

ストレスのないネット環境をお探しなら市内最速のホテル池田屋をお選びください

= ウノウラボ Unoh Labs: 開発合宿の Tips
机が良い (snip) 和室にちゃぶ台、座布団または座椅子でさえも畳の上に長時間座っての合宿はつらいです。腰に来ます。
良く寝る (snip) 徹夜で開発するのは僕の場合は無理です。効率がみるみる落ちていきます。 (snip) つまづいたら散歩、あるいは風呂 (snip) 薬とかコンタクトの洗浄液などを忘れない  前回、コンタクトの洗浄液を忘れてしまって、普段あまりかけなれてない眼鏡で開発せざるをえませんでした。また今回は、なぜか頭痛に悩まされたのですが、宿の方に頭痛薬を分けてもらい助かりました。
開発系-開発合宿にむいた温泉パック -旅ぱけ [テーマで選ぶ旅行] 開発合宿のススメ Web Service:@nifty ペンション木馬(群馬県みなかみ町)
= はてなを見習って開発合宿レポート | i d e a * i d e a 山喜旅館
無線LAN完備 (snip) 予約するときに作業をする旨を伝えておいたので広い机を貸してくれたり、広めのお部屋にしてくれたり、LANがつながりやすい部屋にしてくれたり、いろいろ便宜を図ってくれました。感謝。 (snip) 悩んだらちょっと調べて聞く。 (snip) 旅館の条件。(1) 安いこと(高いところに行くと落ち着かない)、(2) オフシーズンであること(接客がよくなります)、(3) まわりに何もないこと(出かける気がなくなります)、(4) 無線LAN完備、(5) 早い時間のチェックイン、遅い時間のチェックアウトができること、(6) 基本和室で。ただずっとそれだと疲れるので途中途中で椅子がある場所で作業ができること、(7) 昼食もそこで食べられると一歩も外に出ないのでさらにいい感じかも。 (snip) 24時間温泉はポイント高し。 (snip) 一滴もお酒なし (snip) 高めの目標設定をすべき (snip) 「集合するときに3日後に出すプレスリリースを書いてから集まろう」 (snip) 画鋲&テープを忘れました。3日間の目標やちょっとしたメモは張り出しておきたいものです。ひょっとしたら人のメモ見てひらめくこともあるだろうし。
和室がいいか椅子がいいかは意見の分かれるところかな?
= 弥彦村FREESPOT浪漫化計画

情報科学若手の会 厚生年金会館 ウェルシティ湯河原(静岡県熱海市)

富士 CALM(山梨県富士吉田市)

東富士リサーチハウス (静岡県駿東郡小山町) 研修施設のご案内(研修所、会議室、合宿、セミナー、講演会などに最適な中部地区の宿泊研修施設)


= FFTT : はじめての開発合宿
* 照明が暗かったので合宿ではもう行かなさげ もしくは電灯持参 (snip) 照明はまあ、作業するのに貸してもらった食堂はもともとリラックス目的の間接照明ですから。 (snip) 他に行楽客がいたりしてお互いに邪魔だと思うので、食堂などの共有スペースを作業スペースとして使うのはお勧めできない。
ローカル開発環境は必須 (snip) RSSチェックとか禁止はよかった (snip) 行きの車の中では雑談が多くなった ブレストむずいよブレスト (snip) 飲み物とかもっと買っとけばよかった

= ひげぽん OSとか作っちゃうかMona- - 開発合宿に行っていました 日光霧降高原 囲炉裏の宿・ペンションはじめのいっぽ
外界からの割込みが極端に少ない
合宿のメリットにも二つのベクトルがあるのかも知れない。 割り込みが多くて生産性が上がっている人にとって、 普段の仕事場から離れてインタラプトを減らすことで生産性を上げる効果がある。 でもそれだけが合宿のメリットならば別に他の人と一緒に泊まる必要はなくて、 適当なホテルに一人缶詰になるだけでいいはず。 もう一つのメリットはインタラクトを増やすことかもしれない。 雑談や誰かが質問したことに誰かが答えている内容を聞くとはなしに聞くこと。
プチ合宿@スタバ or 図書館でも企画しようかなぁ

= IEEE 802.11b対応の宿リンク集

合宿の宿一覧 東京・埼玉・神奈川 研修旅行,ゼミ合宿,会議室,温泉


= 「家に帰るまでが開発合宿です」なのかもなぁ、と思った。 車で行き来すれば、行き来の車の中で情報交換とかブレスとかがトできる。 意図的にブレスとしようと思わなくても、 同じ傾向の技術者が集まっているわけだから自発的に起きる。 問題は車を運転する人の負担。 いっそ運転手付きでワンボックスカーを借りてもいいんじゃないだろうか。 金額いくらくらいになるのか計算してないけど。
= 未踏ユース ブースト会議。 どこでやったかという情報は秘密情報じゃないと思うので書き出す。

2007年第一期 2、30人? ホテルコンチネンタル http://www.hotel-continental.co.jp/ 有線だがインターネット使用可能

2006年下期 晴海グランドホテル http://www.maxpart.co.jp/harumi/index.html

2005年下期 川崎グランドホテル  http://www.maxpart.co.jp/kawasaki/ 

基本的に人数は大体同じで、昼間は会議室でプレゼン、 夜は10時ぐらいには会議室を追い出される感じだったかなぁ。

サーベイその2を作るためにはどうすればいいかなぁ。 ぐぐって情報収集では限界がある。

中型免許になりました日記

免許の更新行ってきた!想像以上に面白かった!

結局昼前に目覚めたので昼過ぎに江東免許試験場に到着。 人が多い。 まず入り口のそばに4列に並ぶ。どきどき。

列に並んでいる間に更新のはがきを忘れたことに気がつく。

「はがき忘れたんですけど、大阪からの引っ越しで住所変わっているんです」 「はいじゃぁ、この書類のこことここを埋めて3番に並んでね」 一つ前の人は0番に誘導されていたように思う。 すごいシステマティック。 まるでブロイラーになったような気分だ。

書類を書くための台が不足するくらい受付が速い。

免許証がICカードになるので暗証番号を決めなければいけない。

3番は2列。印紙の販売窓口。

印紙販売の係の人がすごい。 4250円の請求に5550円出したら瞬時に1300円返ってきた。 自動販売機よりも速い。 自動販売機なんか千円札吐き出したりするから全然ダメだ。

そして「4250円」という判子がは作ってあるのに、 印紙は3950円+300円という組み合わせなのが片手落ち。

次は暗証番号を打ち込んでバーコードを作る。

作ったらあっちに並んでください。

並んだら視力検査だった。 深視力検査のやりかたがわからなくて壁の説明を一生懸命読んだけど、 普通の視力検査で3つ答えただけで終わった。

視力検査の後に一人の係員が座っているコーナーがあった。 律速になるんじゃないかと不安だったけど、 この人の仕事がまた速い。 雰囲気こんな感じ→展示 0-000 学天則

ただスルーしているだけかと思いきや、 僕が見ているだけでも3人くらい差し戻しを喰らっていた。 コンタクトレンズなのに申告しなかったりすると喰らうのかな。

その後データ打ち込み。なんか手間取った。 きっと名前の漢字が変換候補になかったからだ。 古い免許に穴が開けられる。 住民票は返却された。

写真撮影。 一瞬。

2階の11で講習を受けて下さいと。 ここで20分待ち。 予定時間の1分前くらいに、 講習室にちょうどいっぱいになった。 すごい。 鉄工所もびっくり。

飲食禁止。 しまった、のど乾いた。

映画を見る。 思うんだけども、この手の映画ってストーリーが完全に予測できるからつまらない。 昇進と結婚を控えた青年が友達と旅行に行って煽られてスピードを出して事故る。 ここは逆転の発想で、昇進と結婚を控えた青年が登場して、 こいつが主人公でこの後事故を起こすんだろうなと思った瞬間飲酒運転の車がつっこんできて死亡、 とかそういうのではダメなんだろうか。

でも退屈な映画だと思っていたけど意外と面白かった。 ベタさ加減が。

トイレ休憩5分。お茶を飲む。 廊下のポスターを眺める。 「交通事故で死亡した後部座席同乗者の9割がシートベルトをつけていませんでした! (普通道路での後部座席同乗者のシートベルト着用率9.1%)」 というポスター。 それって「シートベルト着用の有無は死亡率には影響しません」ってアピールしているようにしか見えないんだが…。

後方座席のシートベルト着用も近いうちに義務化されるんだってー。 あと6歳未満のチャイルドシート利用って義務なんだって。

免許の暗証番号は更新までの3年間変更できないって。 8桁の整数。

免許ゲット。 中型免許になりました。 中型自動車 - Wikipedia

当該改正法施行前に普通自動車免許を受けた者は、改正後は「中型車(8t)限定」又は「AT中型車(8t)限定」の条件を付された中型免許を所持しているとみなされる。その後免許更新の際に、免許の種類は「中型」に変更され、条件欄に「中型車は中型車(8t)に限る」と表示され、(以下略)
「中型車は中型車(8t)に限る」という表記が気にくわない。 なんで「中型車は8t未満に限る」とか書けないのか。
= 安全運転自己診断
  • 赤信号に遅れてブレーキを強めにかけることがある。
  • 前の車のブレーキランプに気づくのが遅れてあわてることがある。
  • 横断歩道のすぐ手前で歩行者に気づくことがある。
選択肢が手ぬるいと思った。

勝手に追加

  • 赤信号の存在に気づかずに進んだことがある。
  • 視界にはいるまでサイレンを鳴らしている緊急車両に気づかないことがある。
  • 後ろの車がクラクションを鳴らしていることに気がつかないことがある。
さらに追加
  • 高速道路で気づかずに中央分離帯に接近して「音の鳴る路面」にびっくりしたことがある。
  • 速度を落とさずに直角の交差点に進入して曲がりきれずにふくらんで正面衝突しかけたことがある。
  • 対面2車線の道路を時速60キロで走行中に、目的地を通り過ぎたことに気がついてそのままUターンしてガードレールに激突しかけたことがある。
全ての条件に当てはまる人(僕)は運転には向いていないと思います。 そしてそんな僕が1年以上運転していて「無事故無違反」なのはどうかと思う。 事故は全部自損事故だったり私有地内だったりするので免許には記録が残ってない。 怖い怖い。

おかげで青信号になったときに車がつっこんでこないことを確認してから渡るようになりました(ぉ)

2007年08月18日

週末アスタリスク嫌い日記

で、関数のバイトコードをなめているだけじゃなくて モジュールのバイトコードをなめられるようになれば、 モジュールをインポートすることなく、それこそ何も実行せずにテストできるというわけで。 なめまわしています。

悲しいお知らせがあります。

「from something import *」が来ると心が折れる。


= 開発合宿をどこでやったかという情報を集めたサイトを作ると 開発合宿が開きやすくなっていいのではないかと思った。 ノウハウとかもまとめる。 Macの人はACアダプタを無駄に占有しないように短いケーブルを持ってくるとか。
= 土日の日記はこの下に続く↓
= まともな温度の日。

地震多いなぁ。

首都圏の土地はよく揺すられてしまってそう。 あー、でも関東ローム層か?

3時から歯医者。

んー。どうしようかなぁ。


= 月曜日にどっかにWikiを設置して、 開発合宿についてサーベイして載せる。 どういう趣旨で何人くらいの開発合宿が過去にどこで行われたかetc

あ、自分のところにWiki立てるんじゃなくてGoogleGroupを使った方がいいのか?


= 絶望先生を読んだ。 面白い。

一般論として「面白い」という感情を引き起こす言動の大部分は、 共通の知識を前提としている。 (残りのは変顔とか片桐仁とかアイーンとか)

共通知識を前提としている笑いは、 その知識が狭く深いものであるほど反応も大きくなる傾向がある。 しかし狭くなればなるほどヒットする可能性も低くなる。 聴衆の前提知識を仮定できる場合は別だが (同窓会で教師の物まねとか)、 ターゲットが広くなればなるほど難しくなる。 (LL魂でサスペンダーネタが通らなかったらどこで通るんだ)

絶望先生はメディアが2次元的であることを利用して、 狭いネタを狭い範囲にたくさん詰め込むことで単位面積あたりのヒット率を上げている。

読者のスルー力を仮定しているのか。 細かい活字を全部読むと疲れるが、 十分スルー力が高ければわからない細かいネタをスルーしつつ、 わかるネタには敏感に反応する。 人間の認知の仕組みをうまく利用している。

自分のわからないネタを押しつけられると不愉快になるけども、 「わからなくても言い細かいネタがたくさんあることを示唆するパターン」を 作り上げて、わからないネタの無意識でのスルーを促している。

ノスタルじいとか。 しごと館とか。個人的にはツボだったけども、 そもそもそういうネタがあったことすら記憶に残っていない人も多かろう。 原作の2巻を読んだけども「ノスタルじい」って何のことかわからない人は、 まさに「わからないネタをスルーさせられている」という実例。

余談だけども藤子不二雄は子供向けじゃない短編も面白いのでおすすめ>ノスタル爺

こういうタイプの笑いをどうやってテレビのような時間軸のある笑いに変換するのかが気になったので、 アンテナをつないでみようと思った。何曜日に放送しているのか調べなきゃ。


= 錦糸町のヨドバシカメラでe-mobileにUSB接続バージョンがあるのに気がつき、 これなら普段は家の据え置きのMac miniにつないでおいて、 出かけるときだけ持って出ればいいかな、と買おうとしたのだけども、 契約書を作る段になって自宅の住所がわからなくて断念。
= しまった、だらだら起きていて28時半だ。 明日は免許の更新に行こうと思っていたのに、この調子じゃ起きたら昼過ぎだ。

2007年08月17日

ワンライナーはダークサイド。改行をいれるべし

PBoMC - LL魂のタイムテーブルが出てた
今年は西尾さんのワンライナー芸が見られなさそうで残念だ。
いやいや、去年のLL Ringで懲りましたから。ワンライナー イクナイ!

ワンライナーはダークサイド。 やすきに流されてワンライナーを書いてはいけないのですよ!

先日のプログラミングシンポジウムで「カレンダーを表示するプログラムを書け」というお題が出されて、 ついついワンライナーで書いてしまったのですが…

やっぱりこれはいけないですよね。 いくら資料を作り始めたのが開始の前日の夜だったからといって、 手抜きしてワンライナーなんか書いちゃいけないんですよ。 やっぱりPythonのコードは読みやすく改行を入れるべきなのですよ。

「本当は一行なんだけどもエディタの折り返し幅を32文字にすることで正方形!」とか 何を寝ぼけたことを言っているのかと。 そんなトリッキーなコードを書いていないできちんと改行入れて読みやすいコードを書けと。

というわけできちんと改行を入れて作り直しました。

ほらこの通り、ちゃんと改行を入れれば読みやすい!

最初のバージョンでlamndaのdとaの間に改行が入っているのなんか全然ダメダメですよね。 実行するためにはわざわざ改行文字を取り除かないとシンタックスエラーになっちゃうよね! こっちはちゃんと改行してあるからこのままPythonで実行できますよ!

>>> \
(lambda s=__import__("sys"),(y,m
)=input("year and month (y, m)>"
):(lambda w=s.stdout.write,l=[28
+v for v in 3,(lambda y,x=lambda
 y,d:y/d-(y-1)/d:x(y,4)-x(y,100)
+x(y,400))(y),3,2,3,2,3,3,2,3,2,
3][m-1],z=lambda y,m,d:(lambda a
,b:(int(m*2.6-0.2)+d+b+b/4+a/4+5
*a)%7)(*divmod(y,100)):w(("%d/%"
"d"%(y,m)).center(20)+"\n")or w(
" S  M Tu  W Th  F  S \n")or[[1-
(0<e<=l)and[w(" "*3)]or w("%2d \
"%e)for e in range(d,d+7)]and w(
"\n")for d in range(1-(lambda y,
m,d:(m<3)and[z(y-1,m+10,d)]or[z(
y,m-2,d)])(y,m,1)[0],l,7)])())()
year and month (y, m)>2007, 8
       2007/8       
 S  M Tu  W Th  F  S 
          1  2  3  4 
 5  6  7  8  9 10 11 
12 13 14 15 16 17 18 
19 20 21 22 23 24 25 
26 27 28 29 30 31    
[None, None, None, None, None]
実行すると年と月を聞いてくるので「2007, 8」とか入力してやってくださいな。

注: 西尾泰和のブログ: Pythonでワンライナーを作成する際のノウハウ集 を真に受けて反論したりしている人がいるみたいですが、 これはネタなので業務コードで実践しないように! 追記:

最初話を聞いたとき、前者の「エディタの論理改行をつかったワンラーナー」と「有効な改行を入れた非ワンライナー」の違いがはっきりとは分からなかったが、よく見たら前者だとlambdaが途中で切れていたのね。
おびなたのはてな日記 - ワンライナーは悪

そう。識別子の途中で改行されると読みにくいのです。lambdaは色が付いていてわかりやすいけども、__import__("sys").stdout.writeとかも途中で改行されています。この行を決められた長さで改行するのが一番難しかったです。結局lambdaが2重になっていることを利用して2行に分けてから改行したのですが。

ぱさにき

言語内DSLの主張:
新しい文法を覚える必要はないよ!だって言語○○で書けるもんね!
その実態:
でも(他のライブラリを使うとき同様)クラスとか関数とかどの演算子でつなぐのかとかは覚えてね! あとこの言語のパーサに理解させるために頑張ったところはちょっと直感的じゃないけど、 言語○○で書くためなんだ、あきらめてね! 他の言語で同じことをするライブラリと微妙に記法が違うけど、しかたないよね、 言語○○だもんね!
そこまで言語○○が好きですか?

もちろん「言語○○でシームレスに拡張できる」とかなら大歓迎。


= Packrat Parser勉強中。 BNFと違う表記をしていたのをPackratParserなのかなと思っていたけども、それは 解析表現文法 - Wikipedia だった。 で、この文法で表現できる言語の範囲はBNFで記述できる言語の範囲より広い。 正規表現で表現できる文法よりももちろん広い。 ただ、無制限に先読みができるので、文法によっては指数時間がかかる。 そこでメモ化を使って計算時間を減らしたのがPackrat Parser、なのかな?

で、そのWikipediaの 「PEGにおける繰り返しは常に貪欲であり、マッチし続ける限り入力を消費し、バックトラックしない。」 ってほんとかなぁ。 でも、その方が楽なのでそれで実装してみた。


= 自分に言いたい。 「長さ0のマッチはFailではないっ!」
= 荒削りだけど大体やりたかったことができるようになった。 Packratパーサではない。 解析表現文法ですらないかもしれない。定義がよくわからないし。 やりたいことが実現できるのが一番重要。
IDENT = RE(r"[\w_][\w\d_]*")
SPACE_GE0 = RE(r"\s*")
SPACE_GE1 = RE(r"\s+")
DOT = RE(r"\.")
COMMA_W_S = SPACE_GE0 + RE(",") + SPACE_GE0

AS_PHRASE = (
    SPACE_GE1 + RE("as") + SPACE_GE1 + IDENT
)

IMPORT = (
    RE("import") + SPACE_GE1 + 
    LOOP1(
        (
            GROUP(
                LOOP1(IDENT, DOT), "modname"
            ) + OPTION(AS_PHRASE)
        ), COMMA_W_S
    )
)

IMPORT.match("import xxx.yyy.zzz as bar, os.path")
print GROUP.result
# [('modname', 'xxx.yyy.zzz'), ('modname', 'os.path')]
もろもろのクラス定義は現時点で公開しても荒削りすぎるので全部は載せない。 例えば解析表現文法の「Sequence」にあたる表現の順接は こんな感じの実装。
class Add(RE):
    def __init__(self, r1, r2):
        self.r1 = r1
        self.r2 = r2

    def match(self, s):
        try:
            m1, s = match(self.r1, s)
            m2, s = match(self.r2, s)
            return Result((m1, m2))

        except Fail, f:
            return None
で、実は正規表現で可能な場合は正規表現に落とすような実装になっているので、 さっきのimport文の構文からGROUPを取り除くと生の正規表現が見られる。
IMPORT = (
    RE("import") + SPACE_GE1 + 
    LOOP1(
        (
            LOOP1(IDENT, DOT)
            + OPTION(AS_PHRASE)
        ), COMMA_W_S
    )
)
print IMPORT.pat
#import\s+[\w_][\w\d_]*(?:\.[\w_][\w\d_]*)*(?:\s+as\s+[\w_][\w\d_]*)?
#(?:\s*,\s*[\w_][\w\d_]*(?:\.[\w_][\w\d_]*)*(?:\s+as\s+[\w_][\w\d_]*)?)*
正規表現で可能であったとしても、 その正規表現を人間が直接書くかどうかは別というわけ。 機械語を直接書かずにコンパイルして生成するのと同じ。

全部機械語に直してしまわずに 機械がやっているようなことを ソフトウェア的に実装して、 速度を代償に柔軟性を得るのだ。 これも、全部正規表現のオートマトンに落としてしまわずに、 部分的にオートマトンがやるようなことをPythonで実装することで、 正規表現ライブラリが持っていないような機能を追加していると言えるだろう。

逆に 正規表現に落とさずに全部自分でオートマトンを作るのが スクリプト言語的なアプローチだとすれば、 部分的に正規表現に落とすのは 「部分的に機械語に変換して高速化」 ってのと同じかも。

まぁ、パフォーマンスがどの程度出るのかにはあまり興味がない。 実用上十分であればそれでいい。


= もう3時か…。
= 次の日の日記。

最初に言語内DSLを批判しておきながらできあがったものが結局言語内DSLである件について。

だから言語内DSLってのはなにも高尚なことじゃなくて、 単にパーサをかくのが面倒だから手抜きをしたってだけじゃないかと。

ごくまれに、言語○○のパーサが、作ろうとしてたDSLに完璧にマッチしていて、 すばらしいできの言語内DSLになる可能性もないとは言えないけども、 基本的には違うでしょう。

解析表現文法 - Wikipediaの例にあった a^nb^nc^nを実装してみた。

元の記法:

    S ← &(A !b) a+ B !c
    A ← a A? b
    B ← b B? c 
Pythonのコード:
    # non-context-free language
    A = RE("a") + OPTION(REF("A")) + RE("b")
    B = RE("b") + OPTION(REF("B")) + RE("c")
    S = ANDP(A + NOTP(RE("b"))) + LOOP1(RE("a")) + B + NOTP(RE("c"))
    print S.match("aaabbbcccc").group() #=> aaabbbccc
REFって。定義する前に参照できないというプログラミング言語上の制約のせいで、 文字列として受け取って評価を遅延させるREFが挟まっている。 Sの定義が一番下に来ているのもAとBの定義の後にしたいから。

本質的にはAの参照は全てREF("A")にすればすむのだけども、 それを簡潔に書く手段がないのは言語内DSLだからに他ならない。

2007年08月15日

Tシャツ展示即売日記

【河田 一規のデジカメナビ】松下電器産業 LUMIX DMC-FZ20
【お詫びと訂正】記事初出時、「充電中はインジケーターがグリーンに点灯し、充電完了すると消灯する。一般的にはグリーンの点灯は充電完了と間違われやすいので、オレンジか赤の点灯の方がいいような」と表記しましたが、「充電中にグリーン点灯、完了後にオレンジまたは赤の点灯のほうがいい」との誤解を招くことがありました。著者の意図は「充電中はオレンジまたは赤が点灯、完了後は消灯のほうがいい」であるため、表記を変更させていただきました。お詫びして訂正させていただきます。
いったいどこをどう読めばそういう誤読ができるのか、 と思うような誤読に対してもお詫びして訂正するのが大人の態度。
= 声を大にして言いたい。 画像とか使っているゲームはローグライクとは認めん!
= エアコンをつけるようになって早3日。重大な問題点が発覚しました! 机に座ると首筋に冷気が直撃して効率よく頭痛を発生させます! うーん、どうしよう。マフラー出すかなぁ。
= 電気代払わないと電気止めるぞという書面が来ていたので昨日電気屋さんに電話した。 返事の要約「明日の9時~5時に電話し直せ」 今日、気がついたら7時だった。あー。
= 電子レンジとか売ってるお店は電気屋じゃなくて電器屋? 電機屋は何?電動カッターとか売ってるの?
= 名古屋で日記など
欲しい論文がマニアックなところで印刷されていて読むことができない。重要な結果だと思うなら簡単に読めない雑誌に投稿して欲しくないし、また簡単に手に入らない論文を参照して欲しくない。
重要な結果だと思うので誰でも読めるウェブ以外に(お金払ってまで)投稿する気にならないし、 またウェブで誰でも読める文献以外は参考文献に書きたくない。

こういうことを言うと「いや、論文は査読があるから重要なんだ」という反論がでるんだろうなぁ。 査読はあるけども、別に利害関係のない第三者が追試をしてくれているわけでもなく、 誰が査読したのかも明らかにならない。

企業からの論文投稿数が少ないとかそういう議論はかまびすしいが、 企業の視点で費用対効果を考えたときに、論文誌に投稿するのは採算性が悪いんだよな。 もちろん、採択された論文の本数が評価に直結するような職種では 「効果」が大きくなって採算が取れるのかも知れない。


= 2年前のLL Day&NightのTシャツがお気に入りなのだけど、 なんだか最近湿り気を帯びるとかび臭い臭いが漂うことに気がついた。 前洗濯したときに臭って、干したら臭わなくなったから安心して着たら、 汗で湿るにつれてまた臭ってきた。 捨てるしかないのだろうか…。

ちなみに1年前のLL RingのTシャツは、 1回洗濯したら肩のところが破れてしまったので全然着てない。

今年のは薄手で黄色いなぁ。 まぁ黄色いのが好きな人もいるだろうから別にいいけど。

amachangの着てきたラムダTシャツが僕も欲しかった。

λTシャツ。 お、売ってる。

会場では販売できないのかー。うーん。 本は売ってるから会場が販売禁止の会場ってわけではないと思うのだが…。 本はOKで物品はNG?? 可能ならば本を売っている長めの休みで Tシャツの展示即売会とかできると面白いんだけどなぁ。 そしたら僕も VM魂の時に着ていた現在世界に1着しかないTシャツ を増産して参加する。 僕のはシルクスクリーン印刷(端的に言うとプリントゴッコ)だったけども、 数が出るのならマット印刷にすることもできるのかも。 2色刷ってどれくらいかかるんだろう。

あっ、参加するとまた他のを見に行く暇がなくなって買い損ねるのか!

2007年08月14日

ぼそっと

def foo(left, top, right, bottom):
    "function for test"
    width = right - left
    hieght = top - botom
    print height, width
        
>>> checkfunc(foo)
variable 'botom' is global
variable 'height' is global
variable 'hieght' is not used
variable 'bottom' is not used
PythonにPerlの-wみたいなのないのかといわれたので作ってみた。 変数に代入されているけども読み出されていないと「not used」と警告される。 グローバル空間からのロードの警告もつけられる(オプショナル、デフォルトTrue) 指定した変数だけ警告を出力する対象から取り除くこともできる。
@deco_check(["set"])
def checkfunc(func,
          print_globals = True,
          print_not_used = True,
          print_func_name = False,
          surpress = []):
(以下略)
整理してラボブログに書く。

西尾泰和のブログ @ Cybozu Labs: Pythonでtypoを素早く察知する方法。書いた。

2007年08月12日

週末体調不良日記

9時起床

朝ご飯に買っておいたドーナツと牛乳を食べる。

二度寝

腹痛

トイレに行く

全身から汗が噴き出して体が熱くなる

熱中症を疑い、水分補給、汗が出る

体温を下げるために冷たいシャワーを浴びる

ベッドに倒れる

お腹が痛い→トイレ→吐き気→嘔吐、を3回くらい繰り返す

ベッドに戻る気力がなくなって廊下で寝る

よくわからない

ベッドの上でお腹が空いたので手の届くところにあったかりんとうを食べる。 3時。

出かけたいけどこの体調で電車の空調とかに触れたり、 直射日光を浴びたりしたら大変なことになりそうでためらう。

冷凍庫に冷凍食品があることを思い出して作る、食べる。寝る。

6時←いまここ。

7時。イトーヨーカドーに行って電池を買ってきた。 エアコンのリモコンが見つからない。

エアコンのリモコンに電池を入れる。 ずっと窓を開けていたのに外の方がだいぶ涼しいのはなぜだ。 最上階(3階)なので日中加熱された天井が熱を蓄えているから?

涼しい。エアコンは文明の利器だ。 ドライしかつけてないけどだいぶ快適だ。

ひらめいったー - twitterを使ってみんなでアイデアを共有するサービス

ソースコード添削させろ.org
うけたw どう書くorgはソースコードの添削も大歓迎です。 よい添削ならよい評価が付くことでしょう。

実際のところ、他の人の投稿に対して 「それは~~だからうまく動かない」とか 「こうしたほうがもっといい」という投稿は高い評価を受ける傾向があるように思います。

2007年08月11日

プログラミングシンポジウム日記(ただし手抜き)

電車混み混み。 混んでたら指定席を買おうと思ったのに、 指定席・グリーン席、全部販売済みだって。

乗務員の雑談を聞いたら、この電車は一発で軽井沢に行ける電車らしい。 お昼頃に軽井沢に着くから混み混みなんだそうな。

軽井沢って途中にあるんだなぁ。人が降りて座れるようになるかも。 あ、でもあと20分くらいか…。

自由席座れたよ!


= IPアドレス取れない…。

Packrat Parsing面白そう。

CやJavaで/*~*/を入れ子にできないのはなぜか。→そこにyaccがあるからだ。

Modula-2はコメントの入れ子が可能。Common Lispも可能。 CやJavaはできない。

Rubyで複数の代入。

(a, b) = [1, 2]
(a,) = [1]
と書かないといけないらしい。Pythonでは角括弧で書ける。
>>> [x, y] = [1, 2]
>>> x
1
f = {|x| x + 1} # ダメ
f = lambda {|x| x + 1} # OK
ダメなのか…。「f = {」の時点でハッシュだと思われてしまうそうな。 Pythonで「1.__add__(2)」とやろうとすると 「1.」の時点で実数型リテラルだと思われてしまうのに似た感じかな。

バックトラックしないのがいけないらしい。 Packratは効率よくバックトラックするらしい。

Pythonで書かれたPacrat Parsingライブラリ、あるかなぁ。 なかったら作ろうかなぁ。

syntactic predicate。&E Eとマッチした !E Eとマッチしない。

ordered choise 順序があるのが重要。E? 1回または0回。

文脈依存文法までOK。

S <- &(A !"b") "a"+ B !"c";
A <- "a" A? "b"
B <- "b" B? "c"

Pythonの実装があるらしい。 検索したいけどIPアドレス取れないなぁ。 PHSでつなごうか…。

Packratはメモリが線形なのが問題なのだけども、 どう書くorgの場合はコード片がさほど大きくないしな。

よく考えたらPygmentsにしてもVimcolorにしても、 Rubyの「手で書いた1900行のスキャナー」と同じことをするのは どう考えても困難なので、 そもそもRubyのコードを完璧にシンタックスハイライトするのは 不可能ということか。

Excelプログラミング。 面白い。 Excelでピラミッド書いたのであとでどう書くorgに投稿しよう。 =IF(AND(ROW(A2)-$A$1-2 < 0, 1+ABS(COLUMN(A2)-$A$1)-ROW(A2) < 0),"*", "")

通暁する。

sideway additionを調べる。

オーバーフローしていなくなっちゃう。

本を鵜呑みにしないで自分で早くなるようにこだわる。


= 25年前の言語。 25年前はプリンタに中かっこ文字がなかった!
= Okitac System 50/40
= XS = Lego Mindstorms上で動くLisp(インタラクティブ) by 湯淺先生
= ポインタって本質だろうか。 僕がポインタの本質をわかっているから、 Pythonでいいじゃないかと思うだけなんだろうか。 他の物をポイントする概念が本質的に必要とは言うけども、 PythonでもJavaでもポインタが裸になっていないだけで 何もかもポインタじゃないかと思う。(Javaのプリミティブ型を除く)
= やっとネットにつながったー!
= 大学の授業にBrainf*ck。 開発環境を携帯で。
= 手続き型: 計算結果につけたのが名前

データフロー同期

「3+5って答え存在しないよな」「いや、8という反例があるぞ」

配列なんてなくてもツリーでいい。 そんなに遅くならない。

連想リストによるDeep Binding。 変数束縛は先頭への追加。 パラレルワールド化もO(1)

Shallow Bindingはスタックを使う。 パラレルワールド化が簡単ではなくなる。

Bakerの方法。

データフロー同期で結果として逐次実行。

逐次実行で書いても勝手にout of order実行される。 最近のコンパイラは 静的単一代入 (Static single assignment form - Wikipedia)とかするので 逐次実行で書いているつもりでも実際の実行は宣言型でデータフロー同期。

具体的にわかりやすく書きたければ手続き型、抽象的にわかりやすく書きたければ宣言的。

「君の説明は具体的すぎてよくわからない。もっと抽象的にわかりやすく説明してくれ。」

手続き型の考え方が染みついてしまっている人がPrologを使うとassert/retractが多くなってしまう。 Lispでsetqを使いまくる人がいるのと同じかな。

ああ、確かにprognも隠して置いた方がいいのかも。

assertをググってみた「変数名とその値を記憶しておくには,assertを用います.」 うひゃー。

衆生が救われるような研究をしてこそ大乗

カットしてファイルを切り換えるとカットした部分が永遠に失われる…。

おおお、 フィジェット - AOI2 葵から使える!

構造体が書けない人はOOPも書けない。

Packrat Parsing: Simple, Powerful, Lazy, Linear Time

packratはpack+ratか。

Packrat Parsing and Parsing Expression Grammars

pythonGrammarParser.py

「ICPCに出てくるパターンは限られている。 3年間プログラムプロムナードを書いたらネタがなくなった。」

「ちゃんとしたプログラムは醸し出されてくるもの。 それに比べるとICPCは非常にくだらない。 若い人にこんなことに熱中させるのはもったいない。」

まぁ、でも、 選択肢はプログラミング以外にもたくさんあるので、 ゲームに熱中して時間を無駄にするくらいであれば、 ゲーム的なプログラミングに熱中するのもいいのではないかと思った。

「まさに弾圧としか言いようがない」

anarchy golfはXenだって。

何か一つくらいといてみるかと思ってライフゲームを見てみた。 anarchy golf - Life game

これ、テストケースに書かれている3通りの出力をランダムに表示して、 1/27の確率でテストを通るというコードだなぁ。

サンプルデータの入力に、成長によって入力の枠の外にはみ出るケースがないので、 そういう場合の処理をどうすればいいのかがわからない。 適当でいいんだろうなぁ。

フロッピーROM。 リードオンリーなディスク。

表と裏にレジスタがある?!

「それはね、8ビットしか処理していないからですよ!」

論より「RUN」

USO

NetaTen


= ループは糊で貼り付ける。
= セッションハイジャック、ただし犯人は座長。

ノウハウの4レイヤー

プログラミングシンポジウムに行く新幹線の中で思いつきで書いた文章を載せてみる。

スキル(ノウハウ)には最低でも4つのレイヤーがあると思う。 1:バッドノウハウ。2:バッドノウハウを作るスキル。 3:バッドノウハウを取り除くスキル。4:バッドノウハウを作らせないスキル。

1の「バッドノウハウ」は例えば「~という問題に対処するにはソースの一行目にhoge=1と書くとよい」 という知識。この知識を持っていることで、その問題を解決することができる。 しかし、その問題しか解決できない。

2の「バッドノウハウを作るスキル」は、なぜその問題が起こるのかを調べて、 本来1になっているべきhogeの値が0になっていることを発見してそれを書き換えるなどができるスキル。 このスキルがあれば、まだ誰も解決していない問題に直面した場合にも 自力で解決することができる。 また作り出したバッドノウハウを公開することで、 「同じ問題に直面し、かつそのバッドノウハウにたどりつくことのできたひと」 の問題も解決することができる。

3の「バッドノウハウを取り除くスキル」は、 なぜ本来1になるべきhogeの値が0になっているのかを調べ、そこを修正するスキル。 「ソースの一行目にhoge=1と書く」というバッドノウハウ自体が必要なくなる。 このスキルのある人が活動すると 「同じ問題に直面したorする可能性のあった全ての人」の問題を解決することができる。

4の「バッドノウハウを作らせないスキル」は少し逆説的。 なぜバッドノウハウを作られてしまったか、3ではなく2になってしまったか。 それは「なぜ本来1になるべきhogeの値が0になっているのか」が調べにくい、 またはなぜかわかっても修正しにくいからだ。 これを容易にするスキル。 誰でも理解できる整理されたシステム、柔軟に修正や拡張ができるシステム、 そういうものを作るスキル。 このスキルのある人が活動すれば、 将来発見されうる問題も含めて「バッドノウハウを作らない対策」が容易になる。

目指すべきところは4なのだけども、なかなかそこに到達するのは難しい。 高林さんが主張されたこと(バッドノウハウと「奥が深い症候群」)は 「1や2のレイヤーでバッドノウハウを集めて喜んでいてはいけない。 バッドノウハウがたくさんあるのはシステムがよい設計ではない証拠だ」 だろうし、結城さんの主張されたこと(バッドノウハウからグッドラッパーへ)は 「『システムの設計が悪い』と言うだけでは生産的ではない。 レイヤー3の活動で対処しよう」 ということだろう。

バッドノウハウの多くできるようなソフトウェアは2と3の間の段差が大きいから、 そのソフトの手のひらの上で活動していると3というレイヤーがあることに 気づけないのかも知れないなぁ。

2007年08月07日

LL魂日記

どうも、こう書く課Jythonの西尾です。 ブログと顔はなかなか一致しないと思うので、 1行目で宣言してみました。

はてなブックマーク - タグ llspirit ←スタンドプレーの結果としてのチームワーク?

ということはうぇぶ2.0って「攻殻機動隊風」ということなのか?

冗談はさておき 生デモいくぞー


= LL魂のスライド | スパムとか

露木さんのプレゼンの語り口があんな感じだとは知らなかった。 いきなりサイボウズラボでDjango勉強会をやることを発表するからびっくりしたよ!


= Yoshioriの日記: [LLSpirit] LL 魂の発表資料と感想
プレゼンでは FX の表示領域( screenx )を 1440 にしてもう一個の画面に表示するという荒技のためにプロジェクタに繋げてから起動をしなくてはいけなくなりしょうがないので可符香ちゃんを写して時間稼ぎ
なるほど。
= LL魂 参加! VM魂 感想! (nakatani @ cybozu labs)
「Jython vs JRuby」は JRuby の不戦勝(Python2.1 相当じゃ……)、「IronPython vs IronRuby」は IronPython の不戦勝(IronRuby はまだまだまともには動かない)
えーー。「Python2.1相当でもこんだけのことができるよん」というプレゼンのつもりだったのにー。
= d.y.d.
# 近くにいる人がサイト持ちならURLがわかるような端末が欲しいよねとか言いまくってた気がする
# 各自CSSからそれっぽい柄のTシャツを生成してそれを着てくるとかどうだ
ブログ&ハンドルネームと顔&実名が対応していない。 せめて名札にブログ名とハンドルネームを入れてはどうだろう。
= ページ送り式以外のプレゼン - ただのにっき (2007-08-05)
どうせなら発表者もアバターになって、ぜんぶ3D世界の中で完結したプレゼンをして欲しい。
たとえばVisual Scene Editor - インタラクティブ3Dアニメーションツール -の発表はそんな感じでした。 未踏ユース面白いよ未踏ユース!
= sh1.2 pyblosxom : LLSpirit行ってきました。
発表聞いてたら無性にIronPythonの本が欲しくなってきた。でもロビーでは売ってなかったので帰りに本屋で見つけた。でもでも冷静に考えたら特にWindowsだけで何かしたいってことないし、Cygwin上のPythonで不自由してないので、不要かなと思いなおして購入せず。
IronPythonのプレゼンで使われていた「JavaScriptとPythonが切り換えられるコンソール」は、 amachangの持ってるMacのマシンで動いているのを見た記憶が…。 Microsoftの技術は「おー、すげー、でもWindowsじゃぁなぁ」と言われてしまいがちだから、 あえてMacBookでプレゼンした方がいいのかもなぁ、と思った。
= Kawasaq通信  LLSpirit に行ってきました。
Python が CG 作成とかに使われているよ~って話が一番意外だった。 POGL Benchmarks - Perl vs Pythonとかを見ると、Python と 3D や数値計算は相性が悪いのかと思っていた。
生Pythonでグラフィックの計算をごりごりやるわけではなくて、 Maya、Blender、Metasequoia、Paint Shop Pro、Poser、RenderMan、Shade…と CG関係の有名なツールが軒並みPythonでのスクリプティングをサポートしているということ。 重たい処理はツール側がやる。

「こう書く機動隊」という1行コメントだけの日記が多い!(;_;) あの画像は ひとりごとスレでの 誤変換をみて竹迫さんがスタンドプレー したものだったりする。


= SumiTomohiko の日記 - Lightweight Language Spirit 2007報告

すごい。びっしりメモを取ってある!


= たくさんあるなぁ、LLSpiritタグの付いている日記。
= 今日は大学5年生。来年は6年生。そん次は1年生(の予定 - LLSpirit行ってきたレポ。
VM魂のときに誰か「大きなシステムは脚遅いじゃないですか、象とか」と言ってた。たぶん。象はおよそ時速40kmで走るます。
あうっ(x_x
= LL魂 - ぷっちん日記 (2007-08-05)
実は、昨年行ったときはあまりのムサさに圧倒されて、こんな日記を書いた。

ベルサイユ運動をはじめよう

今年はkoとくーさんと連れ立って行った。せっかくなのでベルサイユ運動を推進すべく、くーさんと二人してかなり着飾ってみた。私が着たのは、この前、西武のバーゲンでバーゲン対象外なのにあまりに好みで降参して買ってしまったワンピース。かなり華やかなやつなので何処へ着ていくんだコレ系なのだが、ちょうどよい場所(?)があって良かった、良かった。結果はというと、圧倒的に男性の多い空間で、多分私たちは異彩を放ってたかも。それって勝利! というか、マジでそのくらいやらないとあの空間ではATフィールドが保てません。

発表者控え室で誰かさんが鼻の下伸ばしてたなーw
= ささださんの日記が「sagasanaidekudasai.」になってるから、 おいおい大丈夫か、っていうか明日からプログラミングシンポジウムじゃん、 と思っていたら大丈夫そうで一安心。

プログラミングシンポジウムの発表の準備ができていないー。 資料を印刷しないといけないから、今日中にやって会社で印刷しないと…。


= VM魂、打ち合わせの時は 「XMLで例外処理とかしちゃいけません」 「XMLをパーサに使ってプログラミング言語を作っちゃいけません」 「DSLを作りたいならXMLじゃなくてLLで」 とか 「Javaはあくまで部品言語」 「LLが糊言語として間をつなぐ」 「DIコンテナなんかいらないよね」 とかが話題に出ていたように思うけど、 セッションでは話題に出なかったような気がするなぁ。 割と重要なポイントだと思うのだけど。
= とりあえずよく考えたら全部の記事に目を通して色々書いたりしている場合じゃないので、 プログラミングシンポジウムの準備をしてから続きを書くことにします。 (ラボブログ用のまじめ風記事も作らなきゃ…)

LTの資料はサニタイズしたやつを発表時のまま、 こちらにアップしました。 え?発表時と違う?そんなことないですよ? なにものかに記憶を書き換えられた痕跡がありますね…


= 他のもパラパラ見てみたけども、 「XXはひどい」という意見と「XXはすばらしい」という意見が入り交じってるなぁ。 それだけ観客が多様化したということかなぁ。 ウケねらいの発表が不快な人は、発表者がスーツを着ている系のカンファレンスに行けばいいと思います。

ところでこの3年間、いつも二つ返事で出演を引き受けてきましたが、 「宗教論争をしてくれ」というセッションはさすがに断ります。 むしろそういう需要があることに驚き。

ライトニングトークが俺ソフト自慢なのって当たり前だと思うのだけども、 ライトニングトークに一体何を求めているんだろうなぁ…。


= プログラミングシンポジウムの発表資料印刷中。 代入の除去って、
y = f(x)
g(x, y)
fが短くて軽いときか、1回しか出現しないときに使う埋め込みと
g(x, f(x))
fが重いときに使うlambdaのローカル変数化
(lambda y: g(x, y))(f(x))
の2通りしか使ってこなかったけども、 Pythonにはデフォルト引数があるから
lambda y=f(x): g(x, y)
という手もあるんだなぁ。 こうすると見苦しいかっこが必要なくなるのでワンライナーが読みやすくなる(ぇ)
=
>>> lambda y,f=lambda x:x+1:f(y)
<function <lambda> at 0x014E8FB0>
>>> _(5)
6
やっぱり読みやすくならない方に1票w
= 多少は実用性のかけらが感じられるコード。
>>> x=lambda x=lambda x:x:lambda y:lambda:x(y)
>>> x()(1)()
1
>>> x(lambda x:-x)(1)()
-1
まったく見かけ倒しのコード。
= amachang、また油を注いでる…。

人間は基本的に自己正当化する仕組みになっているから、 自分が価値を見いだしているものを否定する意見を見ると その意見がたとえ正しかろうと、そんなことと無関係に反発する傾向がある。

そんなことより、今日僕は昼過ぎ出社したのでその昼食会に参加できなかったのが残念だよ!(ぉ)

さてと。

amachangは浅い/深いという発言はしていないのに、 「いや、CSSは浅くない!十分深い!」 という反論をしている人がいるようです。 そういう人は バッドノウハウと「奥が深い症候群」 を一度読んでみることをおすすめします。

知識には再利用性の高い知識と、再利用性の低い知識があります。 どういう知識が再利用性が高いのかというと、 より一般化されている知識です。(大衆化という意味ではない) 人生は限られているので、 同じ時間を割くのならばなるべく再利用性の高い知識を身につける方がいいですね。

LL魂準備日記

逃避力発揮中。 (追記:あっ、この日記にはLL魂の話は全然入っていないのでブクマしないでっ)

Matzにっき(2007-07-19)経由 :gnuvince.net ? Blog Archive ? My 5 things I hate about Python

私がPythonで嫌いな5つのこと。

   1. listにdictのget相当(範囲外でNoneを得る)がない
   2. (x)rangeが終端を含まない 「for month in xrange(1,13)」とか
   3. (Cの)static変数相当がない
   4. メソッドだったり関数だったり。len()とかsort()とか
   5. lambdaが1行式しか書けない
これはライトだなぁ。 僕はもっと嫌いなところがある。
僕がPythonで嫌いな5つのこと。

   6. 代入が式ではない
   7. lambdaが式しか書けない(5')
   8. 組み込みのリストや辞書にメンバを追加できない
    (まぁ高速化のために仕方ないのかも知れないが)
   9. defined(x)がない
   10. 識別子に?や!が使えない
   11. locals()が返す辞書を操作してもローカル変数を操作できない。
で、原文に関していくつかつっこむと、 4の「don’t modify in place.」、そんな無茶な。 Pythonのリスト関係のメソッドはin placeで、 メソッドではなくて関数になっているreversedとかはジェネレータを返すけど、 どちらもパフォーマンスに配慮してのこと。

3のstaticに関する話。 彼の書いたコードは以下。

fibs = {0: 1,
        1: 1,}
def fib(n):
    global fibs
    if n in fibs:
        return fibs[n]
    else:
        x = fib(n - 1) + fib(n - 2)
        fibs[n] = x
        return x
「global fibs」削ってもOKだよ。 あと、グローバル変数にするのが嫌ならば これでいいんじゃない?
>>> def fib(n):
    if n in fib.cache:
        return fib.cache[n]
    else:
        x = fib(n - 1) + fib(n - 2)
        fib.cache[n] = x
        return x

>>> fib.cache = {0: 1, 1: 1}
>>> fib(5)
8
「staticは本質的に関数というシングルトンオブジェクトのクラス変数」と考えると 下の書き方でもいいかも。
>>> class Fib():
	cache = {0: 1, 1: 1}
	def __call__(self, n):
	    if n in Fib.cache:
	       return Fib.cache[n]
	    else:
		x = fib(n - 1) + fib(n - 2)
		Fib.cache[n] = x
	    return x

	
>>> fib = Fib()
>>> fib(5)
8
やっぱり、個人的にはlambdaが嫌だなぁ。 [x: x + 1]とか(x + 1 for x)とか{|x| x + 1}とか、なんでもいいから何とかして欲しい。 むしろJavaScript風に下のようなのでもいい。
hoge.add_function(def(x):
    return x + 1
)
これでいいじゃん、これで。
= やはり同じ日に2つ発表をするのは無謀だったか。 辛い。 一つのターゲットに集中できないのは辛い。
= 発表した。
= その足で未踏ユースの成果報告会へ。
= 日曜日。今日も成果報告会。

公開されている成果報告会だから内容について語ってもいいんだよなぁ。

公式サイトができてからリンク張った方がいいのかも知れないけど、 ファイルシステム丸ごとEclipseのローカルヒストリーみたいに 「自動的に履歴を保存してあっていつでも巻き戻せる」 とかかなりすごい。 ファイルを間違えて消しても大丈夫。 上書き保存してしまっても、それをコピーして片方を巻き戻せばOK。 これはすごい。

もちろん部分的に履歴管理をOFFにしたりとかもできるし、 リポジトリはSubversionみたいな感じに普通のファイルとして扱えるらしい。


= おおお、rubyのrequireが構文の定義にも予約語にもないと思ったら、 あれって組み込み関数なのか。再定義できるのか。へえぇ。

「require ".*?" | require '.*?' | require :.*?」 でいいのかなぁ。 まー、大体動くのを作っておいて、あとはコミュニティに任せる形でいいかなぁ。

Pythonだとこんな感じに決まっている。 6.12 import 文。 おおお、rubyのrequireが構文の定義にも予約語にもないと思ったら、 あれって組み込み関数なのか。再定義できるのか。へえぇ。

「require ".*?" | require '.*?' | require :.*?」 でいいのかなぁ。 まー、大体動くのを作っておいて、あとはコミュニティに任せる形でいいかなぁ。

Pythonだとこんな感じに決まっている。 6.12 import 文


= 漫画レビュー買い取ります
ネットには漫画や小説、ビジネス書から自己啓発書まで、ありとあらゆるもののレビューが載っているので、それを勝手にこのサイトでさも自分のレビューのように登録してお金(小金だけど)を稼ごうと考える人が居ても不思議じゃない。  その辺何か対策がとってあるのかが少し気になります。

普通対策取ってあるだろう…利用規約に。


= 「ドント方式」で検索するとどう書くorgが9位に入っている。 そのリンクをたどったセッションが75件あるとGoogleAnalyticsが言うんだけど、 そんなに検索されるようなキーワードだろうか。 どこかの先生とかが安易にどう書くorgのお題を生徒に出して、 今時の生徒だからまずググってみたら答えが書いてあったとか、 そういうことだったりするのだろうか。
= http://www.ipa.go.jp/jinzai/esp/message/pdf/seika.pdf。 これか。 学校ごとの応募数と採用数が出ているので、 学校ごとの採用率が計算できる。 試しに計算して高い順にソートして、Y軸を採用率の対数にしてみると、 上位5件まで見事なまでに一直線に並ぶ。
= Pythonで、グループに名前をつけられる(番号ではない)のはとても便利だけど、
IMPORT_STMT = toRE(
    """import (?P<result>\w+)( as \w+)?(, (?P<result>\w+)( as \w+)?)*""")
こんな感じで複数のグループに同じ名前をつけたらリストになって返ってくるといいのになぁ。