« 2007年08月 | メイン

2007年09月28日

ルノアール執筆日記

7時半に自然起床したのにいつものようにだらだらして9時からシャワー。 その後ウェブって11時半秋葉原着。あーあ。

18時20分にリフレクソロジーの予約を入れた。

ACアダプタ忘れたorz


= 取ってきた


= リフレクソロジー。

もっと「ぎゃー、いたたた」というのを期待したのだが、 すっかり寝てしまった。

物足りないので足用マッサージ器を色々試した。 温熱でポカポカ! エアーと指圧で1日の疲れを足からほぐす フットマッサージャー「アシェステ」新発売。 これがよかった。


= From Scala To Ruby読んだ。両方の言語の勉強になった。


= ⊂⌒⊃。Д。)⊃カジ速≡≡≡⊂⌒つ゚Д゚)つFull Auto | モスバーガーのきれいな食い方教えれ

頑張って書いた(Twitterに)かっこをたくさん使った文章がTwitteriに送ったのに なぜか送られていないことになっていたので(ログにでない)悲しいけど思い出して もう一度書いてみようとか頑張って思い出してみた(ついったーもうやめようかな): 「レッテル張り(ゆとりとか) では説明できない(意図的としか思えない)かっこつけ(「格好」じゃなくて括弧のいみで (っていうかわかるよね、わかれ。)の巧妙さから思う(主観だけど)にこれはいくらなんでも 意図的に(わざと難しく)難読かしている(んじゃないかと思う(っていうか思いたい) とこの(記事を呼んだ時に)思ったんだけど真似をして(かっこをいっぱいすかって) 書いた文章をといったーにPOST(投稿のことね)したらなぜかスルー(ステータスが更新されなかった) されてしまってとても悲しい(twitter嫌い)。

2007年09月26日

明日から夏休み日記

ニコニコ動画(RC)‐ラクガキ王国で初音ミクを作ってみた。

ラクガキ王国ってここまでのことができるようになっていたのか。2で? 1では無理だよなぁ。

ニコニコ動画(RC)‐私にもネギふらせて~!

上と同じ曲。 この曲はいったい何だろう。

(この上の文章は17日くらいに書いたかなり古いもの。Ievan Polkkaが曲名)


= ついにガスを止められた。

ガス代払ったつもりだったのに、払ったのは電気代だったようだ。違うかも。 そもそも両方自動引き落としにしたはずなのに、 なぜ毎月コンビニで払っているのかよくわからない。


= 払って電話したら即日開栓。


= でも今日は錦糸町のサウナ付き温泉に行くと決めたんだったら決めたんだ。

明日は秋葉原の喫茶ルノワールで一日執筆。そのためには早寝早起き。

リフレクソロジーしてみたい。ふくらはぎとかつちふまずとかをもみほぐして欲しい。 どこがいいお店なのかわからないけど、 とりあえず場所の覚えやすいヨドバシアキバの上のお店に行ってみよう。

あと髪の毛を切る。


= サウナいった。1時間1000円。3300円でオールナイト。 寝る場所もありました。 なんかすごい茶色いお湯が出ていて、天然だって書いてあったけど本当かなぁ。 ぬるぬるしてた。サウナ暑くて死にそう。 背中を流すおばあさんがいて420円。 あかすりが何千円か。 カーテンの向こうでごそごそしているので具体的にどういうことをされるのかわからなくて怖い。

背中にアートのある人もいっぱい。

ボディケアって書いてあるの何かと思ったらマッサージのことらしい。

その後せっかくなので何か遊ぼうと思ってカラオケに入ってみた。 「会員証かOIOIのカードはありますか」といわれたのでカードを見せたら、 なんか法人会員扱いになって1時間で504円だった。OIOI謎。

まっくら森の歌を3回歌ったんだけども音程が難しい。

初めてのDjangoで11日でどう書くorgを作るひとりごと日記

サイボウズラボのサイボウズOffice掲示板でやっている 「西尾のひとりごと」スレ(ITmedia)からDjango関係の文章を抽出してみる。実際はこれの4~5倍くらいの書き込みがある。

まとめ記事にしてブログに載せようとか思いつつほったらかしなので、 このまま埋もれてしまうよりは雑然とでも公開した方がいいかと思って。

Lingrログとかとあわせて整理されて Django - UeblogWiki に載るかも知れない。整理するの大変だろうなぁ(自分では整理するのを諦めた)


= 西尾のひとりごと 2007-06-18
はてさて
当初の予定では

GRINEditは今日でいったん保留にして
金曜日までに露木さんに教えてもらったDjangoのプログラムを参考に
「どう書く」プログラムのプロトタイプを作って、
金曜日からのPython合宿でいろいろ教えてもらって
その次の土曜のPython Workshop the Edge 2007までにベータ公開

という無謀なスケジュールを頑張ってみる予定だったがどうなることやら。

= 西尾のひとりごと 2007-06-19
はっ。
今1時間時計を読み間違えていたことに気がついた。
道理で11時に来たはずなのに人が少ないと思った。
==========
・Django
・PySqlite
・sqlitebrowser
 http://sqlitebrowser.sourceforge.net/index.html

いれた
==========
エントリーがタグを不定個数持つってのは
エントリーの一覧のテーブルと、
タグの一覧のテーブルと、
「エントリーとタグの対」のテーブルが必要なのかなぁ
==========
> Choice.objects.filter(poll__pub_date__year=2005)

これで[c for c in Choice.all if c.poll.pub_date.year == 2005]になるそうな。

==========
モデルリファレンスにちゃんと多対多の方法とかも書いてある

from django.db import models

class Person(models.Model):
    name = models.CharField(maxlength=30)

class Tag(models.Model):
    caption = models.CharField(maxlength=30)
    
class Code(models.Model):
    author = models.ForeignKey(Person)
    tags = models.ManyToManyField(Tag)

って書くと

BEGIN;
CREATE TABLE "app1_code" (
    "id" integer NOT NULL PRIMARY KEY,
    "author_id" integer NOT NULL REFERENCES "app1_person" ("id")
);
CREATE TABLE "app1_person" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL
);
CREATE TABLE "app1_tag" (
    "id" integer NOT NULL PRIMARY KEY,
    "caption" varchar(30) NOT NULL
);
CREATE TABLE "app1_code_tags" (
    "id" integer NOT NULL PRIMARY KEY,
    "code_id" integer NOT NULL REFERENCES "app1_code" ("id"),
    "tag_id" integer NOT NULL REFERENCES "app1_tag" ("id"),
    UNIQUE ("code_id", "tag_id")
);
COMMIT;

ってのが生成される
==========
やっぱり内部的に「エントリーとタグの対」のテーブルを作るんだなぁ。
==========
Codeの方にmodels.ManyToManyField(Tag)と書いておけば
CodeオブジェクトのAdmin画面でタグを選べる
逆にすればTagのAdmin画面でそれの付いているCodeオブジェクトを選べる
管理が直感的な方を選べばいいらしい。
==========
おおお、なんと、スクリプトを修正したら勝手に読み込み直してくれてるじゃん!>Djangoサーバ
==========
>>>
Pygments 0.8
Pygments is a syntax highlighting package written in Python.
(中略)
and it highlights even Brainfuck!
<<<

ちょっw
==========
Pygmentsでシンタックスハイライトを無効にするにはエイリアスをtextにすればいい(と思う
==========
なるほど
{% extends "base.html" %}
しておいて
{% block main_contents %}ほげ{% endblock %}
ってやれば
base.htmlのなかのmain_contentsブロックが「ほげ」で置き換えられるのか。
==========
Pygments ― Python syntax highlighter
http://pygments.org/

どう考えてもタイトルまずいと思う。
それじゃPythonの構文(だけ)をハイライトするみたいだ。
==========
んー。文字化け問題の原因。

print r'あ'

って入力したときに

"print r'\xe3\x81\x82'"

って入って

u'<table><tr>(中略)r'\xe3\x81\x82&#
39;(以下略)

という形でデータベースに直されているけども、
これはUTF-8の文字コードが1バイトずつに刻まれてしまっている。

==========
シンタックスハイライトを掛ける直前で
        self.code = unicode(self.code, 'utf-8')
ってやったら化けなくなった。
==========
thinkpadのシフトキーが取れてしまったorz
==========
CommentとCodeとを分けて
CodeはCommentを0/1個持つ、というつもりで
CommentへのForeignkeyを持たせてNULLでもOKにしたが

それじゃCommentの親が「CommentまたはCode」ってのを表現できない…

親クラスが一つのテーブルになって、
もし形の違うオブジェクトが入りたければその差分だけ別のテーブルにしてForeignkeyかな
==========
トラックバックとコメントも同列に扱いたいんだよなぁ
==========
あんまり漠然とした状態でこだわってもしかたないや。
とりあえずプロトタイプを金曜までに作るんだ。
==========

= 西尾のひとりごと 2007-06-21
Djangoの汎用ビューは、汎用のビューだ。
でDjangoのビューはMVCのVじゃない。
やっと理解した。
==========
間違えやすい綴り
マニピュレータ?まにゅ?
コミュニケーション?こみにゅ?
シミュレーション?しゅみ?

コミュニケーションはコモンとかコミューンと同じ語源か。

シミュレーションはカタカナ表記だとよく間違えている人がいるけど
英語の字面として
simulation
sumilation x
どちらが正しいって言われると間違える人が少なそうだ。

manipulator
manupilator x
annihilator
accumulator

comminute
comminucate x
communicate

この辺はエロい
==========
django-modeは色をつけてくれるだけでインデントまでは面倒見てくれないのか!
http://unicoders.org/code/hacks/trunk/django-mode.el
めっちゃ短いし!

でも逆に言うと、ちょこっと色をつけるくらいなら簡単ってことか。
>>>
; Hacked together following instructions from the rather awesome: 
; http://two-wugs.net/emacs/mode-tutorial.html
<<<
どういう構文になっているのかよくわからないけど
「チュートリアル見ながら作ったらおもったよりあっさり(うまく)できた」ということなんだろうか
fromが何をしているのかよくわからない…

==========
インデントをバックスペースで削る際に
自動で{{ endfor }}とかを補ってくれたらいいのになぁ。
==========
おなかすいたすいたすいた
==========
■ お題に対するコメント一覧
■ コメントの追加
■ 匿名での投稿
 □ 匿名ユーザーはguestアカウントでもいいんじゃないだろうか。スパムよけにもなるかもだし。

明日から3日間で作るものを再確認
優先順位は後で決める

□ ユーザアカウントの作成
□ コードの投稿
□ 新しい言語タグをユーザが追加できるように
□ トラックバックで投稿できるように
 □ トラックバックされた元のサイトのデータを取得
 □ 最後のPREを投稿されたコードと見なす
 □ どこをコメントと見なす?
 □ HTMLを直接書けないブログサービスでうまく投稿できるかどうか
□ フィード
 □ 新着お題
 □ 新着解答
 □ 言語指定での新着解答
□ レーティング
□ ユーザページ
 □ それまでの解答一覧
 □ いろんな統計情報
□ 言語のページ
 □ 解答一覧
 □ 統計情報
□ お題タレコミページ
 □ この言語でこう書けるけど他の言語ではどうだい?ってのの収集「perlだとperl -e "$a='z';print ++$a;"でaaって出るけど…」
  ・名前は「挑戦状」
□ タグ
 □ Python2.4 Python2.5
  □ 自由な文字列をつけさせる?


□ Djangoのホスティングサービスはどこがいいのか聞いてくる
□ 検索は?他のDjango使いは検索をどうしている?

ドメインはdoukaku.jpを取るか、それとも
doukaku.orgを取ってja.doukaku.orgにするか(Wikipediaみたいに)
コードは万国共通語だし。


==========
トラックバックで収集するのはコードだけって方針でいいかも。
その代わりサイトに載せるのもコードの部分だけにする。
コメントを書きたい人は自分で書けばいい。
==========
(ト書き:この週末(金、土、日)は第一回Python温泉)

= 西尾のひとりごと 2007-06-25
SAKURA.AD.JP // 専用サーバ - さくらの専用サーバ
http://www.sakura.ad.jp/services/dedicated/sakura_dedicated/plans/

FreeBSDとFedora Coreとどっちがいいのかなぁ。
どういう違いがあるのかよくわからない。
==========
*.jpにこだわる理由が全くない上に
すでにgettextでi18nしてあるので
doukaku.orgだけを取ってja.doukaku.orgで運用します。
# きっと英語が間違いだらけだけど…
==========
走り出してからモデルの変更をするのは面倒だから
明日レーティングの機能まで実装してしまおう。
==========


= 西尾のひとりごと 2007-06-26
SAKURA.AD.JP // ニュース
http://www.sakura.ad.jp/news/archives/20070620-001.news

「さくらの専用サーバ」お申込受付け停止のお知らせ

orz

==========
(ト書き:山口さんの自宅サーバに間借りさせてもらう)
==========
とりあえず丸ごとコピーしてみたけど
さすがにすんなりとは動かないみたい…

==========
サーバの中で新しくプロジェクトを作ると動くので、
空っぽのプロジェクトを作って中身をコピーしてみよう。
==========
・Pygmentsをインストールした。
・自分で修正したdjango.db.backend.utilをコピー
・サーバ実行
→truncate_nameがないって怒られるけど、truncate_nameなんて文字列がそもそもソースコードに現れないぞ?むむむ?
==========
わかった
僕がWindows版に入れた方はリビジョン5482だけど
最新版は5519なんだな。
で自前パッチを当てたdjango.db.backend.utilにtruncate_nameって関数が新たに追加されている。
Windows側でソースをgrepしてもtruncate_nameが見つからないのはそのせい。
サーバ側でgrepしたら見つかった。

時々手元のDjangoをupdateしないといけないんだな。
手元でコンフリクト解消したutil.pyをサーバ側に上書きしてめでたしめでたし。


Exception Value:        list index out of range

えー。
==========
わかった。
データがまだないからトップページで最新のデータを表示しようとしてこけてるんだ。

Windowsではfixtures(データベースに最初につっこむデータ)を普通のUTF-8で書いておいても大丈夫だけど、FedoraCoreではダメみたい。で、さっき\u0000形式に変換したんだけども、変換後のを読み込ませるのを忘れていた。

読み込ませたらトップページ出たー
スタイルシートが読まれていなくて真っ白。
==========
ファイルの置き場所を~nishio/…と指定してはいけなかった。/home/nishio/…にしたらうまく行った。

==========
おおー
WinSCP3ってディレクトリの同期ができるんだー
便利。
==========


= 西尾のひとりごと 2007-06-27
gmailからのメール送信にかんしては
ウノウラボ Unoh Labs: Pythonでメールを送信したい人のためのサンプル集
http://labs.unoh.net/2007/06/python_2.html
が参考になりました。
==========
doukaku.orgのスタイルシートがIEで見るとうだうだな件は
諦めてシンプルなフォーマットにしよう
==========


= 西尾のひとりごと 2007-06-28
レーティングの機能はつけた。あとは何がいるだろう
□ コメント投稿時にPREかそのままかを選べるように
□ 意見要望送信フォーム
□ いろんな英語の所を翻訳(アカウント登録周り)
==========
ネットワーク系のコマンドを覚えるの巻

アクセスログはどこだろう
・アクセスログは/var/log/httpd以下にあった。sudoしないとlsできない

tailしたら末尾だけでちゃった
・tail -fする

http://doukaku.org/にアクセスしたけど404で、アクセスログに記録が残ってないや
・hostsを書き換えなきゃ。
 ・C:\WINDOWS\system32\drivers\etc\hosts
・IPアドレスがわかんないや
 ・ping -a ***.org

・doukaku.orgにトライ
>OperationalError at /
>unable to open database file
さっきとエラーが違うじゃん…
何これ…

とりあえず目の前のエラーをつぶすか…

==========
DEBUG=Falseしたら見えるようになった。謎。

==========
DEBUG=Trueに戻しても見えるorz


= 西尾のひとりごと 2007-06-29
(ト書き:奥さんにDNSの設定をしてもらう。設定の都合上、何も頭につかない「doukaku.org」を使うのは面倒という話に)

==========
www.doukaku.orgとja.doukaku.orgとどっちがいいかなー
==========
了解です。どうもありがとうございます。

僕のウェブアプリ側ではBASE_URLの値を書き換えるだけでいいのでja.doukaku.orgにしておきます。
www.doukaku.org宛のアクセスをdoukaku.orgに正規化している設定ファイルがどこにあるのかわからないので
それだけ山口さんにお願いします。
==========
i18nむずかしいなぁ
何がむずかしいって
Djangoのmake-message.pyを呼んだときに
拾ってくれるものと拾ってくれないものがあったり
テンプレートの中の翻訳文字列は引用符で囲まれる必要があるけどもバックスラッシュでエスケープされない点とか

ぜんぶDjangoが悪いような気もする
==========
あとエラーメッセージの表示している行が実際の行と100行くらいずれたりする。
aって入れてパースエラーを起こして前後関係から問題の一を絞り込む。
==========
SQLiteは全文検索できる
GoogleGearのバックエンドはSQLite
Djangoのloaddata, dumpdataを使えばJSON形式でシリアライズできる
クエリにexplainってつけると細かい情報が見られる
SQLiteでもできる(読んでもいまいちわからないけど)
==========
(ト書き:6月30日、Python Workshop the Edge 2007でこういうのを作っています、とちょろっと話す)

(ト書き:なぜか聞いていた人数よりはるかに多いはてなブックマークが付いてホットエントリーに。Web2.0怖い)

= 西尾のひとりごと 2007-07-02
申請したりメール書いたりしてたらもうこんな時間かー
Doukakuが、怖くて触りづらい。
==========

= 西尾のひとりごと 2007-07-03
ぐは
はてぶで目立ったせいで5000PVになったけど、
もうトップページから外れたからPV下がっただろうと思ったら
昨日一日は10000PVだった。
==========
by 竹迫 良範
オレンジニュースで紹介されてましたよね。
==========
人の口に戸は立てられず…


= 西尾のひとりごと 2007-07-04
Google AnalyticsをなんどもGoogle Analysticと打ってしまう。

==========
JavaScriptメモ

$$("a[href]").join(" ")
$$("input[type=checkbox]").forEach(function(e){e.checked=false})

$x("/html/body")
$x("//input")

console.log
console.debug

==========
やっとDjangoで自動テストが出来るようになったー!
まだGETで200かどうかのチェックしか書いてないけど
これはいい。

問題はテストに結構時間がかかることか。
これは仕方ないのか。
==========
GETのテストはさておき、
POSTのテストはちまちま手で打つのはめんどくさい。
ブラウザ操作するとテストケースが出力されるようにならないかな

= 西尾のひとりごと 2007-07-05
時刻が9時間ずれているのはGMTなんだろうなぁ。
どうしようかなぁ。
==========
>> POSTのテストはちまちま手で打つのはめんどくさい。 

>perlがインストールされている環境であれば(Windowsでも)GETコマンド、POSTコマンドがコマンドラインから使えます。

>form.submit(); 

ああっ、POSTを自分がブラウザで打ってテストするのが面倒ということじゃなくて、
テストケースに「POSTでどういう情報を渡すか」を自分で書くのが面倒ということでした。
POSTされたデータからテストケースを作ってコンソールに出力するコードを書いたので、
ブラウザで適当に書いてPOSTすると、コンソールにテストケースが出力されるようになりました。
後はそれをtests.pyにコピペして整形するだけ。


= 西尾のひとりごと 2007-07-06
by 奥 一穂
GMT 問題については、クライアント側で時刻表示を生成するのもひとつの手です。

<script language="JavaScript">
document.write(new Date([% unix_time %]*1000-new Date().getTimezoneOffset()*60000));
</script>
<noscript>
[% time_in_gmt %]
</noscript>

とかこんな感じです。
==========
なるほど!
日本語のページだからといって読者のタームゾーンがJapanだとは限らないな…と悩んでいたところでした。
JavaScriptを使う方針でやってみます!
==========
メモ
for(var n in obj) console.log(n)
==========
C:\cur\vimcolorpy>c:\cygwin\bin\patch.exe -b VimColor.py vimcolor-utf8.patch
patching file VimColor.py
==========
うーん。
なんか疲れた感がたくさん。
doukakuの「新しいお題の投稿」を自動化しよう。


= 西尾のひとりごと 2007-07-09
doukaku.orgでどたばたしていたけども
そろそろ本格的にJython本がヤバイらしい(汗)
==========
Django使い4人が全員「FedoraCoreよりFreeBSD」と言うのはなぜなんだろうか
==========
LL魂と未踏ユース成果報告会とがかぶっているorz


= 西尾のひとりごと 2007-07-10
セカンダリネームサーバとは何なのかを勉強中
==========
ネームサーバは一つ止まってしまっても大丈夫なように複数立てる
→複数のサーバのデータを同期する必要がある
→プライマリのデータをセカンダリにコピーする


==========
コメント詳細画面からコメント編集画面へ移動するブックマークレットを作ってみた
javascript: location.href = location.href.replace("comment", "admin/doukaku/comment")

だけど、そもそもリンクを書き換えてくれる方がいいなぁ。

$$("a[href]").forEach(function(x){x.href=x.href.replace("comment", "admin/doukaku/comment")})

こうか。
==========
4問くらい後でこんな感じのお題を出そう

C:\django\doukaku_proj>perl
$a = "Y"; for($i=0; $i < 5;$i++){print $a++;}
YZAAABAC
==========


= 西尾のひとりごと 2007-07-11
いつも持っている手提げ鞄を忘れた
でも、電車の中で読む本が入っているくらいだから大丈夫だと思ってそのまま来た
ビルの1階でカードキーがその鞄のポケットに入っていることを思い出したorz
==========
やっぱり削除や修正の機能は必要なんですかねぇ
==========
by 奥 一穂
投稿の質を高めるという意味では、修正機能はあってもいいと思います。
#削除はいらないかも
==========
削除を実装したら、修正したい人は削除して投稿し直せばいいかなぁと…
人にコメントされた後でコメント元を書き換えるのはよくないと思うので、修正機能は「修正中に他の人が返信したので書き換えられません!」という機能をつけないといけないのが面倒かなと思いました。
==========
by 竹迫 良範
見ているほうからすると修正の過程が見えると勉強にもなることも。 
削除じゃなくって非表示フラグみたいなものでもいいのかも。
==========
>見ているほうからすると修正の過程が見えると勉強にもなることも。

なるほど。

>削除じゃなくって非表示フラグみたいなものでもいいのかも。

レーティングで沈めるというのも一つの手ですね
==========


= 西尾のひとりごと 2007-07-12
FireBugの$$とかはブックマークレットで使えないけど、
Furebugのコンソールに決められた文字列を書き込むブックマークレットはできないかなぁ

==========
サーバを止めたつもりで止めてなかった…orz
データベースをいじってから上書きしたので
いじっている間の投稿が消えちゃったorz
アクセスログを見てもPOSTの内容は残ってないよなぁ…
もうどうしようもないか…(´・ω・`)

==========

= 西尾のひとりごと 2007-07-13
==========
Ajax勉強中

で、Ajaxでググってヒットしたものを見ていると
ブラウザの依存性によって異なるコードを自分で書いているので
Ajax ライブラリ 2007でぐぐった。

ウノウラボがヒットした。

役に立つウノウラボ。

http://jquery.com/
http://examples.learningjquery.com/rating/
http://mg.to/2006/01/25/json-for-jquery
このあたりを使えばやりたいことができそうだ。
==========
あ、月曜休みなのか。
==========


= 西尾のひとりごと 2007-07-17
http://adp.daa.jp/archives/000265.html

MTのテンプレートがやたらとDIVを二重にしていたのは
こういうことだったのか…
==========
スタイルシートが難しいということだけがよくわかった。
==========
jQuery勉強中
==========
スターレーティングは微妙にやりたいこととずれているので読んで改造するより自分で作る方が楽だと判断した。
==========
http://jquery.bassistance.de/api-browser/
==========
jQueryに値を渡すためにDjangoのカスタムテンプレートタグ作っててちっともAjaxの勉強になってない!
==========
$(".rating .button").click(function(){
  alert("hello");
  return false;
});
が動かないなぁと思ったら
$(document).ready(function(){
})
で包まないといけないのか…


お、動いた動いた。
==========
JavaScriptはデフォルトでグローバル変数なので
x = $(this);
って書いておけば$(this)の中身についてFirebugのコンソールでxって書いて中身をインスペクトできる。
==========
やばい、Django+jQueryが面白すぎる。
jQueryで

$.getJSON(url, function(json){...})

ってアクセスして、DjangoでPythonの辞書をstrで文字列化して

    return HttpResponse(str(some_dictionary))

と返したら、
コールバック関数の引数のjsonに
JavaScriptのハッシュとして入ってやがる!
なんだこのシームレスさは!
==========
そしてjson = {"hoge": value}の時、json.hogeでvalueにアクセスできるのか…。なんて楽ちんなんだ。
==========
やったー、できたー!初Ajaxー!
==========


= 西尾のひとりごと 2007-07-18
昨日のまとめ

キバヤシ「Pythonは実はJavaScriptだったんだよ!」

その他「な、なんだってー ΩΩ Ω」
==========
crontab -eしている最中についうっかりC-xC-cやってしまった。
固まった。
==========
>必要であれば,モデルに __str__() メソッドを定義してもかまいませんが,明確な理由がないかぎりそうするべきではありません.

がーん
全部__str__で定義しているよー
__unicode__を使うべきだったのかーーー
==========
ラボマシンでhoge.pyがhogeだけで起動できないのはなぜかと思ったらPATHEXTを指定していないからか。
==========
LivedoorReaderのソースコードを読んでいたのだけど
どこがスクロールのコードかいまいちわからない
==========
reader_main.jsの2005行目
        scroll_page: function(num){
                var h = $("right_container").offsetHeight - 40;
                var c = 
                        (Config.scroll_type == "page") ? h:
                        (Config.scroll_type == "half") ? h / 2 :
                        (Config.scroll_px || 100);
                $("right_container").scrollTop += c * num;
        },

==========
VimColorを使うには一度コードを外部にはき出す必要があるんだな。

http://ja.doukaku.org/comment/60/
このコードもきちんとハイライトされることを確認した。
どうしようかなぁ。pygmentsと差し替えようかなぁ。

Windowsで動かないんだよなぁ、VimColor。
==========
ローカルでテストができなくなるんだよなぁ。VimColor。

とりあえずサーバが来てからにしよう。

==========
Windowsで動かない原因はここかも

"%s %s %s -s %s >/dev/null 2>&1"%(VIM_COMMAND, VIM_OPTIONS, filepath, shtemp)

Vimを適当なオプションで起動して、
ハイライトしたいコードとマークアップするためのVimスクリプトを渡し、
標準出力を捨ててエラー出力を標準出力にリダイレクト?
==========
ダメだなぁ、
そこらへんをいじってVimが起動されるようにはなったけども
出力されるはずのファイルが出力されない
VimスクリプトがWindowsのパス名を受け取ってエラーになっているとか、
そもそもCygwinのVimだとダメだとか
原因はなんだかわからないけども面倒そうだ。やめよう。
==========
自分のノーパソで動かすと30分かかったテストが
ラボマシンで動かすと2分かからなかった。
なんなんだその差は。


= 西尾のひとりごと 2007-07-19
CSSを勉強した。
サイドバーが落ちてしまうのは、
サイドバーをマイナスマージンで上に重ねてしまえばいいのかも。

==========
ラボの性能のいいマシンでlinkcheckerを書けると
Djangoの開発用サーバが耐えきれなくてconection refusedの嵐
-t 2とやってスレッドを2個にしたら出なくなった(デフォルトは10個)
つぎは-t 6を試す。

==========
いまさら気がついたんだけども、
ラボマシンにDjango最新版を入れて、
コードをそれに併せて修正したのは間違いだ
今サーバで動いているのと同じバージョンを入れて、
レンタルサーバに乗り換えるときに新しいのにすればよかった
今からサーバの方のDjangoを新しいのにかえるか、どうするか…
==========
とりあえず仕方がないのでサーバ側のDjangoを最新版にしたいと思う
さて、どうしたものか…

まず
mkdir subversion
cd subversion
svn co http://code.djangoproject.com/svn/django/
してみた。
しまった。djangoフォルダを作ってからにすればよかった。
==========
あ、勝手にフォルダ作られてた。よかった。

==========
/home/nishio/subversion/django/trunk/django

シンボリックリンクの引数の順番を間違えて二回やって循環参照になってしまった
削除してsvn upしたけど戻ってこない…
全部消してチェックアウトからやり直し

こんどは
svn co http://code.djangoproject.com/svn/django/trunk


==========
あれー。

>>>
Mod_python error: "PythonHandler django.core.handlers.modpython"

Traceback (most recent call last):

  File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 287, in HandlerDispatch
    log=debug)

  File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 464, in import_module
    module = imp.load_module(mname, f, p, d)

  File "/usr/lib/python2.4/site-packages/django/core/handlers/modpython.py", line 5, in ?
    from django.utils.encoding import force_unicode

ImportError: cannot import name force_unicode

==========
なんとかうまくいった。

==========
結局、サーバ上もローカルのもDjango本家から直接Subversionで取ってくるようになったので、
今後のアップデートやうまくいかなかったときの巻き戻しも簡単(なはず
==========


= 西尾のひとりごと 2007-07-20
がーん
JSのreplaceは1個しか置き換えないのか

JS
>>> "aaaaabbbbbb".replace("b", "c")
"aaaaacbbbbb"

Python
>>> "aaaaabbbb".replace("b", "c")
'aaaaacccc'
==========
がーん、JSの正規表現は後読みをサポートしていないのか!
==========
>>> "http://ja.doukaku.org/comment/27/".replace(/[^:\/]\//, function(m){return m + "admin/doukaku/"})
"http://ja.doukaku.org/admin/doukaku/comment/27/"

こう書いた
==========
Sqliteの全文検索は仮想テーブルを使っている
Sqliteとsennaをつなぐこともできる
==========
でもMySQLつかうほうがいろいろ楽そうだなぁ。
==========
とりあえず検索して試すだけなら正規表現で全部をなめるのは簡単に実装できそう
とりあえずそれでいいかー。
サーバ移転の際にバックエンドをSQLiteからMySQLに変更しておくか。
まだデータベースに依存するようなコードは書いてないから簡単に移行できるだろうし。
==========
プロトタイプができたのにGETじゃないと検索結果にリンク張れないと思ってGETにしたり、
URLがかっこわるいと思って小細工したりしてしまった。
==========
冷静に考えると動くものができた時点でコミットしておくべきだったのに
変なことをして動かなくなって動くようにするのに時間がかかった
==========
どうしてローカルでは動くのにサーバでは動かないんだろう

==========
ローカルのPysqliteが2.3.2で
サーバのPySqliteが1.1.7だった
そういうことか
==========
yumの使い方を調べてみた
yum search python

>>>
python-sqlite.i386                       1.1.7-1.2.1 
<<<

いや全然古いからっ
==========
結局、PySQLiteやPythonやmod_pythonをまとめて最新版にするのは大変なので
新しいサーバに移転するタイミングで最新にすることに。
で、問題はPySQLiteかSQLiteのどちらかが古くて正規表現での検索ができないというところにあるので、
自分で正規表現で検索するように書き換えた。
6行書き換えるだけだったので戻すのも簡単。

とりあえずたくさんの人がアクセスすると負荷がすごそうだけど
社外秘で発表会の時に見せるくらいならできそうだ
==========


= 西尾のひとりごと 2007-07-23
(ト書き:何気なくスルーしているけど26歳の誕生日)

2007年09月24日

未踏開発合宿日記その2

会議についての会議の結果、羊が足りないという結論に達した。

実際を考えると生の構文木よりも 「マークの付いている『重要な』要素だけのツリー」 が得られた方がありがたいと思うのだけど、 とりあえず生の構文木。

>>> MUL.match("123*45")
'123*45'/6
>>> r = _
>>> r.children
['123*'/4, '45'/2]
>>> r.children[0].children
['123'/3, '*'/1]
Pythonの構文は、トークナイザの部分がインデント・デデントを判断しているみたいなのだけども、 トークナイザをパーサを分けるのは美しくないのでどうするか考え中。

= アンサイクロペディアのPythonの項目が面白い。Python - アンサイクロペディア

パールのようなもの - アンサイクロペディア


= 見た目は唐辛子、ししとうなんだけどー。


= AA-lib。CACA-lib。CUCU-lib。BB


= ずっと黒い画面のターン


= あああ。Matzにっき(2007-09-12)より:

Logix Pythonの文法を自由に再定義できるようにした新言語。またはPythonバイトコードを吐くマクロ処理系。
これはPEGじゃないけど、やりたかったのはまさにこういうことだったんだ。先にやられたorz

Pythonの構文木も、生の構文木を綺麗な抽象構文木にするためには 別途トランスフォーマってのを走らせる必要がある。

僕のPEGでは簡単な数式がこんな複雑な構文木になってしまうので何か間違っているのではないかと悩んだが、

>>> MATH.match("2*(1+3)+5")
'2*(1+3)+5'/9
>>> tree(_)
 '2*(1+3)+5'/9
   '2*(1+3)'/7
     '2'/1
       '2'/1
       ''/0
     '*(1+3)'/6
       '*(1+3)'/6
         '*'/1
           '*'/1
             ''/0
             '*'/1
           ''/0
         '(1+3)'/5
           '(1+3'/4
             '(1+3'/4
               '('/1
                 '('/1
                 ''/0
               '1+3'/3
                 '1'/1
                   '1'/1
                     '1'/1
                     ''/0
                   ''/0
                 '+3'/2
                   '+3'/2
                     '+'/1
                       '+'/1
                         ''/0
                         '+'/1
                       ''/0
                     '3'/1
                       '3'/1
                         '3'/1
                         ''/0
                       ''/0
             ''/0
           ')'/1
   '+5'/2
     '+5'/2
       '+'/1
         '+'/1
           ''/0
           '+'/1
         ''/0
       '5'/1
         '5'/1
           '5'/1
           ''/0
         ''/0
Pythonでも生の構文木はかなりぐちゃぐちゃ
>>> pprint.pprint(parse("2*(1+5)-3"))
['eval_input',
 ['testlist',
  ['test',
   ['or_test',
    ['and_test',
     ['not_test',
      ['comparison',
       ['expr',
        ['xor_expr',
         ['and_expr',
          ['shift_expr',
           ['arith_expr',
            ['term',
             ['factor', ['power', ['atom', ['NUMBER', '2']]]],
             ['STAR', '*'],
             ['factor',
              ['power',
               ['atom',
                ['LPAR', '('],
                ['testlist_gexp',
                 ['test',
                  ['or_test',
                   ['and_test',
                    ['not_test',
                     ['comparison',
                      ['expr',
                       ['xor_expr',
                        ['and_expr',
                         ['shift_expr',
                          ['arith_expr',
                           ['term',
                            ['factor',
                             ['power',
                              ['atom',
                               ['NUMBER', '1']]]]],
                           ['PLUS', '+'],
                           ['term',
                            ['factor',
                             ['power',
                              ['atom',
                               ['NUMBER', '5']]]]]]]]]]]]]]]],
                ['RPAR', ')']]]]],
            ['MINUS', '-'],
            ['term',
             ['factor', ['power', ['atom', ['NUMBER', '3']]]]]]]]]]]]]]]],
 ['NEWLINE', ''],
 ['ENDMARKER', '']]
Pythonの方はトークナイザが走った後の「空白とかインデントとか処理済みのトークン列」を処理していることを考えれば、 PEGの方は(まだ盛り込んだ機能が少ないこともあるけど)比較的シンプル。

トランスフォーマが作る抽象構文木はこんな感じ

>>> compiler.parse("2*(1+5)-3", "eval")
Expression(Sub((Mul((Const(2), Add((Const(1), Const(5))))), Const(3))))
これは美しい。しかしこの美しい構文木に変換するためには 下のような超泥臭い作業が必要。
def for_stmt(self, nodelist):
    # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite]

    assignNode = self.com_assign(nodelist[1], OP_ASSIGN)
    listNode = self.com_node(nodelist[3])
    bodyNode = self.com_node(nodelist[5])

    if len(nodelist) > 8:
        elseNode = self.com_node(nodelist[8])
    else:
        elseNode = None

    return For(assignNode, listNode, bodyNode, elseNode,
               lineno=nodelist[0][2]) 
文法定義と抽象構文木化で似たような内容を書くのはばかげていると思うのだけども、どうすれば可読性を損ねたりせずに文法定義だけでこういうきれいなツリーを作れるだろうか。

とりあえず1+3だけで下のような木になってしまうのは、PEGのSequenceを二項関係だけで定義しているから。 僕のsimple_pegは本当にシンプルに作ってあるけど、Matcherを追加することで拡張できるようにしてあるから「任意のn個のSequence」を表現するMatcherを作ればいいと思う。

'1+3'/3
 '1'/1
   '1'/1
     '1'/1
     ''/0
   ''/0
 '+3'/2
   '+3'/2
     '+'/1
       '+'/1
         ''/0
         '+'/1
       ''/0
     '3'/1
       '3'/1
         '3'/1
         ''/0
       ''/0

すごく続きをしたいところではあるけども、 頑張って147行の英文メールを投げたおかげで(?) 日本語の化けないJython2.2.1rc1が出たので、 本当に化けないのかを確認するのが先。

2007年09月22日

未踏OB開発合宿1日目日記

[2007-09-22 15:44]

アマゾンは本をきちんと整理して棚に直していない。 場所はコンピュータが知っている。 選ぶべきものを入力すると最短経路を答えてくれる。

棚を整理していないので、増やすときには適当に棚を追加して適当に本を入れればよい。 整理をしないからスケールする。

BtoBtoCのtoは右結合性。(BtoB)toCではなBto(BtoC)。

ブックマークレットでメニューをインサートして選ばせるくらいならば、 ライトユーザーにも使わせられる?

複数人で開発する際は、 「メソッドをアルファベット順に並べる」というルールにすれば、 並べる順を迷わなくなる。

SQLiteは本体のコードよりもテストのコードの方が多い。

キン肉マンは最初の方巨大化したりビームを打ったりする。

ドカベンは最初は柔道をしていた。

YouTubeやニコニコ動画のブームのおかげで、CDNが儲かった。アカマイとか。 ゴールドラッシュの時に儲かったのは金を掘りに行った人ではなくツルハシを売ったブラナン。

メールアドレスにtmpと入っている。これはむごい。

「ここ禁煙って書いてあるけど、半田付けはOKかな?」

アドエスではDirectXで書いたアプリがネイティブで動く。

アドエス用のGPSがあるがいいアプリがない。

トラックが通ると振動する会場。

電通大を通った人が6人。

カシオペアはアルマジロとつながる。

さしえショーって赤塚さんだったのか。 どんな文章も“紙芝居”にする「さしえショー」 - ITmedia News

フリープログラマーの赤塚大典さんが制作した。文章を句読点や改行部で分割し、形態素解析してキーワードとなる単語を抽出。「Yahoo!検索」の画像検索のAPIを活用し、その言葉に関連した画像を検索して表示する。

Pythonコードリーディングが大ブーム。

SNYDER's ハラペーニョ

未踏チャット (at Lingr)

Ustream.tv - mitou kaihatu gasshuku

ごはん。


= ご飯後一眠り→21時は起床

アクセルをかけるためにちょっとヘッドホンを使いますよ。


= ノウハウ入出

出:

コマンドプロンプトをUTF8にするには: プロパティでフォントをラスタフォントからMSゴシックに変えてからchcp 65001

入:

コマンドプロンプトでF7で履歴メニューがでる

画面バッファの高さを大きくしておけば、 流れ去ったログが消え去りにくくなる。


= ぴかちふ謹製のモバイルモニタがすごくいい。 使わないときにはインテリアにもなる。 でも売ると壊れたときのサポートの労力が出るので売りたくないって。


= 今作っているパーサジェネレータは テストをたくさん書く方針でやっている。 例外が投げられることをdoctestでどうやって表現するにはどうするんだろう。

ドキュメントにちゃんと書いてあった。 必ずFailっていう例外を投げるmatcherを書いた。

class MatcherAlwaysFail(Matcher):
    """
    >>> MatcherAlwaysFail().match("foo")
    Traceback (most recent call last):
        ...
    Fail
    """

= 初めてPythonのstaticmethodを使った。 古いユーザなのでこういう本質的でない機能ってあんまり知らない。


= 高速再生中のロイツマ

Jatsu tsappari dikkali dallan
ヤッツッ ツァッパリ ディッカリ ダッラン
Tittali tillan titstan dullaa
ティッタリ ティッラン ティチタン ドゥラー
Dipidapi dalla ruppati rupiran
ディピダピ ダッラー ルッパティ ルピラン
Kurikan kukka ja kirikan kuu..
クリカン クッカヤ キリカンクー

Ratsatsaa ja ribirabi dil\
ラッツァッツァー ヤ リビダビ ディル
la Beritstan dillan dillan doo..
ラ ラベリツタン ディラン ディラン ドゥー
A ba-ribbattaa baribarii\
アバリッバッター バリッバリー
ba Dibi dibidibi disten dillan doo ←歌詞間違い?
バ ディビディビディスタン ディッランドー

Ja barilla stillan deijaboo
ヤバリッ ラッ スティラン デイヤーボー
A daba daba daba daba dybjabuu,
ア ダバダバダバダバ デイビャブー
Baristal dillan suillan duubadag
バリスタゥ ディラン スイラン ドゥバダグ
Dagadaga duu duu deijadoo
ダガダガ ドゥードウー デイヤドー

= 行きの電車の中であったメソッドをどこに追加していくかという話、 確かに複数人で開発している場合に、ソートしてからコミットするというのは 「複数人で開発している場合」にはいい戦略かとは思う。

一人でプロトタイプをがりがり作っている場合は、 小さいユーティリティ的なものを上に、 大きい「呼び出しもと」が下に来るように書いているという話。 僕はこれだったのだけども、この方法の問題点は、 脳の揮発メモリがこのプロジェクトの情報でいっぱいの時はうまく行くけども、 100行を超えて書いてしまうと後で読んだときに複雑に絡み合っていて解きほぐすのに苦労する点だ。

今回テストをきちんと書きながら進んでわかったのだけど、 テストを書くと挙動が明示されるから、Aを書いた後でBを追加したときに、 Aの挙動を変える必要が出たらテストも修正しないと行けなくなるんだ。 というわけでなるべくBを変更してもAを変更しないでいい設計にしようというバイアスがかかる。 これはルースカップリングだ。 Coupling And Cohesion

例えば、「A / B」という表記で 解析表現文法 - Wikipedia のOrderedChoiseを表現できるようにしようと思うと、 AやBの基底クラスの__div__に書きたくなるわけだけど、 そういう機能追加を上に上がって書き足すのを避ける。 もちろんこうやって設計してできあがった上でパフォーマンス上の問題が出れば、 「PEGのOrderedChoiseは切り離せなくしても問題ない」 と言ってべったり貼り付けて高速化するかも知れないけど、 あくまで最初はルースカップリングにする。

というわけで基底クラスに注入してみた。

class OrederedChoice(Matcher):
    """
    >>> m1 = ExactMatcher("foo")
    >>> m2 = ExactMatcher("bar")
    >>> (m1 / m2).match("barbaz").group
    'bar'

    """
    def __init__(self, m1, m2):
        self.m1 = m1
        self.m2 = m2

    def match(self, s):
        try:
            r = self.m1.match(s)
            return r
        except Fail:
            r = self.m2.match(s)
            return r

    @staticmethod
    def build(m1, m2):
        return OrederedChoice(m1, m2)

Matcher.__div__ = OrederedChoice.build

= __add__なんかの情報ってドキュメントのどこに書いてあるんだろう。

あった。 7 数値型をエミュレーションする

深いところにおいてあるなぁ。


= rimoの初音ミクチャンネルをBGMにするといいらしい(何が)


= Lingrより。

# 2:33am 26x26にしお
# 今日はPEG完成させて寝たい
# 明日Pythonのパーサを作って使い物になることを検証する
# 自分自身をパースできたら万歳

# 2:53am 26x26にしお
# あうー
# NotPredicateの実装ができて、テストを書いたら今日は終わりのつもりなのだけど
# いいテストが思いつかない 

= 前回作ったときはいきなり正規表現を使うMatcherを使ったのでgdgd。 短く書くための短い名前なんかもがんがん作ったのでdmdm。 今回はあえて短い名前や正規表現を禁止してPEGパーサを作った。

明日は実際にこれを使ってPythonのパーサを書いてみて、 労力とかパフォーマンスとかを調べる。 労力が高いのは目に見えている( ExactMatcher("a")はないよねー )。 でも言語内DSLで変なトリックを使うのはダメだと思う。

class NotPredicate(Matcher):
    """
    >>> a = ExactMatcher("a")
    >>> b = ExactMatcher("b")
    >>> c = ExactMatcher("c")
    >>> m1 = a + Optional(Ref("m1")) + b
    >>> Ref.m1 = m1
    >>> m1.match("aabbbb")
    'aabb'/4
    >>> m2 = b + Optional(Ref("m2")) + c
    >>> Ref.m2 = m2
    >>> m3 = AndPredicate(m1 + NotPredicate(b))
    >>> m3.match("aabbcc")
    ''/0
    >>> m = AndPredicate(m1 + NotPredicate(b)) +\
            OneOrMore(a) + m2 + NotPredicate(c)

    >>> m.match("aabbcc")
    'aabbcc'/6
    >>> m.match("aaabbcc")
    Traceback (most recent call last):
        ...
    Fail
    >>> m.match("aabbbcc")
    Traceback (most recent call last):
        ...
    Fail
    >>> m.match("aabbccc")
    'aabbcc'/6
    """
    def __init__(self, m):
        self.m = m

    def match(self, s):
        try:
            r = self.m.match(s)
            raise Fail
        except Fail:
            return Result(
                group = "",
                end = 0,
                rest = s
            )

= 眠気ないなー。 378行。

350行に縮めた。文字列を消費しないマッチ結果オブジェクトを Resultクラスのstaticmethodで生成するようにした。 UnaryOperatorクラスをmixinするようにした。

class AndPredicate(Matcher, UnaryOperator):
    """
    (テスト13行)
    """
    def match(self, s):
        r = self.m.match(s)
        return Result.empty(s)
テストの方が長い、わーい。

= フタエノキッワッミッアッアッー

フ タ エ ノ キ ワ ミエ ノ キ ワ ミ アッアッアー


= クリカンクッカヤキリカンクー


=

寝る前の間食は控えるべきである!
だがしかし!

 「駄菓子菓子!」

=

□ 正規表現Matcher
□ PEGパーサ

= Ctrl+Alt+TABで開発合宿の隣の人の画面がいつでも見られるように。


= 29時。ぴかちふが玄関で酔いつぶれている。 未踏ユースOBから除名せざるを得ない。

2007年09月21日

ノウハウの5レイヤー

以前西尾泰和のブログ: ノウハウの4レイヤーというエントリーで下のように書いたが、それは間違いでした。お詫びして訂正します。

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

正しいのはこちら

スキルには最低でも5つのレイヤーがあると思う。
4:知識がなくても直感的に使えるようなシステムを作れるスキル。
3:ノウハウを知らなくても使えるようにするラッパを作れるスキル。
2:問題を解決する方法を作り出し、ノウハウとして共有できるスキル。
1:ノウハウを習得し、適切なタイミングで使えるスキル。
0:ノウハウを見つけてブックマークするスキル。

参考文献。

日記を書く[・ _ゝ・]はやみずさん - 覚えてはいけないちょっと計算を早くするための小技

はてなブックマーク - 覚えておきたいちょっと計算を速くするための小技10 | P O P * P O P

はてなブックマーク - 君らは中学校で何を学んだんだ? - val it : α → α = fun

404 Blog Not Found:君らはWebで何を学びたいんだい?

学而不思則罔、思而不学則殆 --- 論語

2007年09月20日

タンブラー転載日記

この前のTwitter転載日記で、Twitterの内容をそのまま転載しても面白くないと理解した。 最低限時刻とかがないと「早朝まで起きていて徹夜明けテンションで会社に行く道すがらのひとりごと」ってのが伝わらないからただの変な人だ。(いや、そうでなくても変な人だ)

結局のところひとりごとツールはひとりごとなんだな。

タンブラーの方は「面白い情報引用ツール」として使っているので転載できるかな。

Loituma Girl)とはロイツマの歌うフィンランド民謡『イエヴァン・ポルッカ』に日本のアニメ『BLEACH』のキャラクターである井上織姫が長ネギを回す4フレームのシーンを組み合わせたフラッシュアニメーションである。(略)オランダではSMS2.tvという企業が著作権保持者に連絡をとらずに携帯電話の動画として売ろうとしたことがあった。そのときには"Meisje met de Prei"(「ニラを持っている少女」)と宣伝された。ロシアではそのソングクリップを売っている。

ロイツマ・ガール - Wikipedia

初音ミクがネギを回しているのはこれが元ネタか。しかし、ワールドワイドな時代だなぁ。 

Jatsu tsappari dikkali dallan Tittali tillan titstan dullaa, Dipidapi dallaa ruppati rupiran Kurikan kukka ja kirikan kuu Rätsätsää ja ribidabi dilla Beritstan dillan dillan doo, A baribbattaa baribariiba Dibi dibidibi disten dillan doo Ja barilla stillan deijadoo A daba daba daba daba daba dybjabuu, Baristal dillan stillan duubadäg Dägädägä duu duu deijadoo
Ievan Polkka - Wikipedia, the free encyclopedia

歌詞あった。

タンブラーも手を加えないとそのままでばブログに使えない、でファイナルアンサー。

曲はこちら pya! 時の流れを忘れさせる時計

2007年09月16日

もじら24日記

jomei-shimasuta!(無意味に自重しました)

Mozilla24 on Flickr - Photo Sharing!

眠い。

最初の20分でバッテリーがなくなったのでログはなし。

yukobaさんにさんざんPythonの処理系を書けとけしかけられる。あうたびに言われている気がする。

shi3zの日記 - マシン語を知らない子ども達 の正論に賛同して 「プログラミング言語というのは、その言語の処理系を実装して初めて「書ける」と言うのです。 プログラムが書ける、という状態は「処理系が書ける」という状態の延長線上にあるべきで、処理系を書けないということはその言語を理解していないということです。」 とか書こうと思ったけど面倒だからやめた。

♪僕らの名前を覚えて欲しい 機械語を知らない子供たちさ~

AutoPagerize+LDRize入れた

AutoPagerize (swdyh)

IT戦記 - Firebug で XPath を簡単に試す方法

AutoPagerizeのPythonドキュメント用のSITEINFOを書いてみた。 コンテンツがdiv class="content"とかで囲まれていれば楽だったのに、 body直下にずらずらおいてあったので困った。 //body/*[not(self::address)]でFirebugの$xではうまいこと取れたのに、 グリモンに書き込んだらうまく動かない。200行目くらいでpageがnullになっているために次のページを読み込んだ後で切り出しに失敗してターミネートされる。 //bodyにしても動かないから悩んだあげく、試しに//addressにしたら動いた。 謎だけど//bodyは使えないと判断して避けて実装。

        {
            url:          'http://www.python.jp/doc/*',
            nextLink:     '(//a[@rel="next"])[last()]',
            insertBefore: '//address',
            pageElement:  '//div[@class="navigation"][position()=1]/following-sibling::node()',
        },

LDRizeの方のSITEINFOも試しに書いてみた。

      {
            domain:    'http://www.python.jp/doc/*',
            paragraph: '//tt[@xml:id]',
            link:      '//a',
            focus:     '',
            stripe:    true,
            height:    10,
      },
XPathよくわかんないなー。 月曜日にamachangにいい参考資料がないか聞こうっと。

2007年09月13日

自縄自縛アートと503日記

面白い。

via IT戦記 - 忙しいとネットの話題についていけないなあ

どんなに技術があろうと出来る人であろうと駄目なものは駄目、って誰かが言わないと。 (Junnama Online (Mirror))

辛辣インターフェース評議会 - amebloのフィードが酷い件 は99%くらい技術的に価値のある指摘だけど、 最後の1行はやり過ぎだと感じる人もいる。(もちろん最初から「これはわざとだ」と思う人もいる)

でjunnamaさんはおそらく前者で、最初の1行は正論っぽい。

だけど個人ブログを会社に絡めた手口とか、言及先を明記しないスタイルとか、 本題と関係なさげな肖像権問題への言及とか、そういう周辺的なもののせいで 「 はてなブックマーク - どんなに技術があろうと出来る人であろうと駄目なものは駄目。って誰かが言わないと。 (Junnama Online (Mirror))」 こうなっている。

こういう一連の流れは、たとえて言うなら柱時計の振り子を右に押したら、 一旦左に振れて、それからまた右に振れるようなもの。

そう思って眺めていたら

2007年09月12日 itkz itkz おげー!! 駄目と言う暇があったら殺せ。503 を吐かない ameblo も、CSS Nite も、写真掲載も、全て周囲の人間から馬鹿にされてるんだよ。関係者が残らず死滅することで全てが解決する。
おおお、これは目から鱗。 右に振れたものを左に振るんじゃなくて振り子を折るか。その発想はなかった。 久しぶりに感動した。

でもまぁ、個人的には振り子がゆれるおかげで柱時計の針が進むんだから、 折らないでもいいんじゃないかなぁと思った。 そのためにわざわざゆらしたんだし。

続き: 辛辣インターフェース評議会 - アメブロのフィードが昨晩は403でしたけど、どう考えても503の方が適切

どう書くorgは先日のサーバ移転の際にdjangoのURLマッピングの先頭に 「全てのパターンを『メンテナンス中』画面へ」ってルールを書き足して 古い方のデータベースに書き込まれたりしないようにしたのだけど、 今考えると、この方法ではフィードも巻き添えを食って「メンテナンス中(200)」になってるはずなんだよね。 せめてメンテナンス中画面は503を返すべきだったなー。


= via オレンジニュース

[を] ビジネス英会話がネットで無料で聴けるようになってた

おお、僕もテキスト買おう。 買う前に聞こう。

「なりたい顔ランキング」、1位は沢尻エリカ、新垣結衣 ダイエット・エステ・美容のオリコンランキング

むう、全然ピンと来ない。


= 最速インターフェース研究会が あんまり更新されないなぁと思ったら知らないうちに 辛辣インターフェース評議会ができてた件について。 さっきLDRに登録してで78エントリーあったのを流し読みしたけど、 やっぱりLDRのキー操作によるスクロールは優秀だと思った。

全部読み終わってからShift+SPACEで上にスクロールできることに気がついた。

あと最近「マイフィード」ってところ押すと消えてくれることに気がついた。

会社の広い画面でブログを見ると、 カラムが固定幅のせいで画面の1/3くらいしか使ってくれていないものがたまにあって、 でしかも字が小さくて読めなかったりするからホイールでぐぐぐっと文字を大きくすると 20文字で改行なんていう間抜けな状態になったりして、 いくらなんでも読みにくすぎるので幅の指定を外すJavaScript書こうかな、なんて思っていたけど、 LDRに登録して読めばいいんだな。

あとはフィードがなくてもLDRで読めるといいんだけどな(無茶苦茶言ってます)

PythonリファレンスとかDjangoオンラインドキュメントとかがLDRの操作で読めるといいなぁ。


= ラジオNIKKEI KJnet | 銘柄情報 | 12日アニメ関連が高い、“麻生首相”関連先取りと

ははは。と思ってブロッコリーの株価を見たら3ヶ月くらいずるずる下がった株が一気に上がってるw

っていうかプロダクション・アイジーって攻殻機動隊を作ったところ?


= あ、揺り戻しあった。 ご期待に沿ってマジレスするぜ。 (Junnama Online (Mirror))

ありゃ。 自分が「ダメ」って言った文章を自分の言葉として(強調までして)使ってる。 何がしたいのかさっぱりわからなくなった。

当初の主張は「たとえ個人ブログであっても、特定企業の人間であることが明らかな場合、 会社の利益を考えて過激な表現は避けるべきである」ということだと思っていたのだけど、 ページトップで「アルファサード有限会社 代表」なんてリンク張ってあるこのブログも その条件に該当するよね。本名まで付いてるし。 話の流れを知らずにこのページを見た人が 「無知で…」という表現がこのブログの著者本人の言葉だと勘違いする 「可能性はゼロではない」(この著者の言葉を借りれば)わけだし。 著者がブクマのページにリンク張らないし、元々のnowaの記事にもリンクを貼らないので、 可能性は結構高いのではないかとも思う。

会社のイメージを損ねないように、とか、金融機関はいろいろなところを見ているよ、とかはその通り。 で、一技術者が会社にとって不利益な発言をしたのなら首にすればいいだけだけど、 有限会社の代表が同じことをした場合に首にできるか、と考えると、 桁違いの効果があるような。

そういうことを「誰かが既に突っ込んでくれている」(著者の言葉)のだろうか。 であればいいんだけども。

「当事者は何も反応していなくて周囲がブクマコメントとかであーだこーだってのにマジレスすするのも何だかなぁと思いつつ。」なんて言いながら ブクマコメントに対して反論しつつ 「外野は黙ってろ」って言うのも謎だなぁ。 「言いたいことを言わせろ、反論はするな」という意味? でもそもそもmalaさんがアメブロが200を返すことを酷評した記事に関しては 自分も外野なのでは…。 「当事者は何も反応していなくて」って、そりゃあなたが外野だからでは…。

と、自縄自縛しまくり。 何がしたいんだろう。 新種の自縛アート? だったらキャプチャに関する意見のところで 肖像権の問題のある部分も含めてキャプチャを取って紹介した方が面白いかも。

2007年09月11日

集中豪雨日記

豪雨だがアメダスを見ても1時間間隔で何も出ていない。

東京アメッシュというサイトを教えてもらった。 10分間隔で、地図上の解像度も高い。 東京アメッシュ

おおー。 僕の住んでいる周辺だけ豪雨だ(苦笑)


= Twitterからぺた。user_timelineにpageを指定しても無視されているように思う。

2007年09月10日

5人の海賊のコイン分配問題

via Googleの面接試験、一体どのような質問をされるのか? - GIGAZINE

5人の海賊がいて、彼らは1位から5位にまでランク分けされています。1位の海賊は100枚の金貨をどのように分けるかというプランを提案する権利があります。残りの海賊はこのプランに投票する権利があり、賛成が半分に満たない場合には1位の海賊は殺されます。1位の海賊の分け前を最大にしてなおかつ彼が生き残るにはどうすればいいですか?(ヒント:一人の海賊は結局、金貨の98%で終わる)

まず大前提として、 「海賊はなるべく自分が死なないように行動する」 「(死なないならば)なるべくコインが多くなるように行動する」 と仮定しよう。 これを否定したら「死にたい…」とか「ちょっと損だけどBには以前から腹が立っていたので殺す」 なんて選択肢が出て論理パズルではなくなる。 パズルとして成立させるためにこの仮定を置いた方がいいと面接官に一応言っておく。

海賊をそれぞれA,B,C,D,Eとしよう。

1:まず、仮にEだけが生き残った場合、Eが100コインを手にする。

2:仮にDとEだけが生き残っている場合、 Dが1コインでも取ったならば、Eはその分配案に反対して100コイン取る方が得だから、 確実に反対するだろう。 Dは死にたくないので0,100の分配を提案する。 この提案でもEは「Dを殺しても殺さなくても100コインが手に入る」状況なので、 Dを殺す可能性がある。 なのでDは「DとEだけが生き残っている状態」自体を避けたい。

3:仮にCとDとEが生き残っている場合、 上記の考察よりDは「Cを殺して自分がトップになるとEに殺される可能性が出てくる」 「Cを殺してもコインは手に入らない」と考え、無条件に賛成する。 Dの賛成により「半数に満たない」条件は発動しないことが確定するので、 Cはどんな分配にしても殺されることはない。 よってCは100,0,0の分配を提案し、Dの賛成により可決される。

4:仮にBとCとDとEが生き残っている場合、上記の考察より、Cは 「Bを殺せば生きて100コインを手に入れられる」と考えるため無条件に反対する。 なのでBは生き残るためにはDとEに賛成させる必要がある。 Bが死んだ場合DとEはそれぞれ0コインしか受け取れないので、 それより多い分配を提示すれば確実に賛成する。 よってBは98,0,1,1の分配を提案し、DとEの賛成により可決される。

5:仮に全員が生き残っている場合、 B以下の4人は「Aを殺した場合に決定する98,0,1,1の分配」より多く分配されるのならば賛成し、 少なく分配されるのならば反対する。 Aは生き残るために最低2人が確実に賛成するようにしたい。 よってAが死んだ場合に0コインを受け取るCに対して1コイン、 1コインを受け取るDとEのどちらかに2コインを分配すればよい。 よってAの提案する分配は「97,0,1,2,0」もしくは「97,0,1,0,2」である。

「98%」というヒントは、 問題を訳した人が間違えたか、問題を作ったGoogleの人が間違えたか、 もしくは「ヒントと自分が考えた結果が食い違ったときに、 自分の考えを捨ててヒントにあわせた答えをひねり出すのか、 それとも自分の考えの正しさを信じてヒントが間違っていると考えるのか」 を観察するために意図的に入れられたブラフだろう。


追記、sshiさんより「「半数に満たない場合に」だから4のフェイズではDかEどちらかだけに1コインあげれば賛成2票になるんじゃ?/あ、「半数」の母数に自分がはいってないのかな。どっちなんだろ。」とのコメントが。和文問題文では「残りの海賊はこのプランに投票する権利があり」、 英文では「But the others get to vote on his plan」となっているので、自分は含まないという解釈が妥当かと思います。

しかし、仮に「自分も投票できる」という問題だとしたら、D,Eだけの時100,0、CDEの時99,0,1、BCDEの時99,0,1,0、ABCDEの時98,0,1,0,1となってあっさり98%の答えが出ます。

原文のブログは友達が受けた面接の内容をまた聞きで書いているだけのようなので、友達か著者のどちらかが題意を勘違いしたって可能性も考えられますね。


kazuhookuさんからこのページを教えてもらいました。 一息ついたときの小ネタ【回答集】: 【回答269】海賊と金貨。 このページの記述によればこの問題はイリノイ大学のスティーブン・ランズバーグという人が考案したものだそうな。で、その情報を元に軽く調べてみたところAmesa KZN Mathematics Journal, 2005, Vol. 9, pp. 38-40(PDF)に下のような記述がありました。(太字は僕の編集)
The following delightful puzzle was invented by Steven Landsberg (University of Illinois, Urbana-Champaign) and posed in the March 2005 Math e-Newsletter: Ten pirates have got their hands on a hoard of 100 gold pieces, and wish to divide the loot between them. They are democratic pirates, in their own way, and divide as follows. The fiercest pirate makes a proposal about the division, and everybody votes - one vote each including the proposer.
はっきりと「提案した海賊も含めて全員で投票を行う」と書いてありますね。 ということで元ネタのブログの記述が間違いだったという結論でいいのではないかと思います。

漢字の勉強

繁體字, 日文汉字, 简体字

蟲→虫
廣広广
录録錄
滅←灭
務←务
鄉郷乡
飛←飞
齒歯齿
廠←厂
婦←妇
麗←丽
習←习
顯顕显

蠟←蜡
鐘←钟

鄧←邓
觀観观
對対对

塵←尘

斃←毙
護←护
驚←惊
膚←肤

書←书
長←长
樂楽乐
車←车
傳伝传

穀←谷
醜←丑
後←后
機←机
乾←干
幹←干

從従从
雲←云
涙←泪(両方使う)
網←网

寫写写
處処处
圓円圆
澤沢泽
過過过
龜亀龟

2007年09月09日

携帯でTwitter日記

昨日はTwitter+携帯で楽しんだ。以下ログ。

= リアルタイムで見たい人はTwitter / nishiom。 PCから書いているひとりごとも見たければ Twitter / nishio
= モバツイッターのページが、画像がサムネイルで埋め込まれていてイイと思ったけど、 携帯だとセッション情報をもてない関係でURLにセッションIDが埋め込まれているので公開できない。 そこでモバツイッターのページをスクレイピングして、ついでにいらない情報を捨てたり 古い順に並べたり、ってスクリプトを書いたんだけども、 たぶん正規表現でスクレイピングしたのは大失敗だったと思う。 わずか一日の間なのに改行が増えてたり「br」が「br/」になったり「br /」になったり。

正解は「Twitter APIを使う」だと思った。 今度気が向いたらやる。

反面教師のコード。dataにHTMLデータが入っているとする。

import re

CLEAR_LEFT = "<br\sclear=['\"]left['\"]>"
PAT = r"""
    \[@\]\n+</a>\n*<br(\s/)?>\s*
    (?P<contents>[^<]+?)\s*

    (<a\shref="[^"]+">(?P<loc>[^<]+)</a>)?\s*

    (<a\shref="(?P<imgurl>[^"]+)".+?
     <img\ssrc='(?P<smallimgurl>[^']+)'.+?)?\s*

    (<br\sclear=['"]left['"]/?>)\s*
    (?P<date>\d[^&]+\d)&nbsp;
    """ % globals()

print PAT

PAT = re.compile(PAT, re.VERBOSE + re.DOTALL)
import time

items = list(re.finditer(PAT, data))

print len(items)
#print items[0].groupdict()["debug"], items[0].groupdict()["contents"]
if 1:
    for m in reversed(items):
        d = m.groupdict()
        date = time.strptime(d["date"], "%m/%d %H:%M")
        date = time.strftime("tw%d%H%M",date)
        print "<p class='twitter'>"
        print "<a href='#%s' name='%s'>=tw</a>" % (date, date)
        if d["loc"]:
            print "いまここ→", d["loc"]
        else:
            print d["contents"].replace("\n", "<br/>")
        if d["imgurl"]:
            print """
                <br><a href="http://movatwitter.jp%(imgurl)s">
                <img src='http://movatwitter.jp%(smallimgurl)s'>
                </a>""" % d
        print "</p>"

っていうかコメントによってbrだったりbr/だったりするということは、 「抽象的な形で保管されているデータをテンプレートに流し込む」ではなく 「整形済みのHTMLの形で保管」というアプローチを取っていると言うことだろうか。 うーん。

このサービスに依存しないような形にならないといけないなぁ。

2007年09月08日

台風成果報告会日記

頭痛い。

きっと低気圧のせいだ。


= 金曜日。 なんだ、大雨になるのかと思ったら晴れてるじゃん。 台風はもう通り過ぎたのかな?
= 大岡山ってどこだー。 大・岡山じゃなくて大岡・山なのかな? 大岡裁きと関係あるのかな?後で調べる。
= 携帯からTwitterに投げられると出先で便利かも。 きっとそんなサービスがあるに違いない。 後で調べる。
= 選択しただけでコピーせずに貼り付けたり、 コピーしようとして右クリックして貼り付けられてしまったり。 Windowsやめようかな。
= 三田はさんだではない。
= 行きの電車で書いた。 PythonのLOADとSTORE
= 「PHPの問題点は資格試験がなくて、 PHPプログラマの質を客観的に計ることができない点。 Rubyアソシエーションは資格試験を作る?」
= 「非常に詳しい人を社内に作るべき。楽天の中ではまだそういうRuby使いが育っていない」

結局「fooシステムを使うと、とても便利!」というのは 「fooシステムを使うと95%のタスクについては労力が格段に削減できるよ! 残りの5%はfooシステムの中を理解してね!」 なんだよね。 fooがRubyであれPythonであれRoRであれDjangoであれ。


= 島根の専門学校全てにRubyを入れてしまう。 アーリーアダプターが情熱を持ってやっている段階を超えるには。

授産施設でRubyを教える。 ベトナムでRubyブーム?

サラリーマンプログラマが作ったらスパゲッティになる。 Rubyで今それが少ないのはサラリーマンプログラマがいないだけ。 PHPもJavaもスパゲッティ化の道を通ったのだからRubyも同じようになるだろう、 という話。

「日本が元気になるといいな」

「どうして少人数だとRubyがいいんですか?」 「逆に大人数だとJavaの方が強い。 Rubyはやんちゃなプログラマが一人いるだけで大変なことになる」

「Rubyという言語仕様を守った上で、どうやってスケーラビリティのでるような仕組みにするかは難しい。」 「楽天は手軽な分散用のフレームワークと大規模な分散をフレームワークとを試しにRubyで作ってみている」


= 「ウェアラブルは突然立ち上がる」!

実はじわりじわりと広がっている。 めだつ「ヘッドマウントディスプレイ」が広がっていないだけ。

役者がヘッドマウントディスプレイでセリフを見るとか。 実際にやってるらしい。 本番ではどうかと思うけども、練習にはいいかも。手がふさがっていても大丈夫だし。

ライブで自分の姿を見ながら歌うとかしてるらしい。

イベントガイドとかはブースに固定よりは動き回れた方がいいな、たしかに。

ウェアラブルデジカメ。

「みんなつけたくなったでしょうか」会場苦笑。 でも僕はつけたくなったけどな。 プレゼン時にプレゼン資料と付加的な情報をHMDに出せば、

「妙に頷くクセがあるので今日一日頷く回数を測定してみよう」

「次こうなったらこうしたい」というのを後で家でがりがりコード書くのではなくて、 思いついたその場で定義したい。

アクティブデータベース ECA

E:メール到着
C:ユーザがPCを操作中でない
A:メールを読み上げ

= 「歩いている」の定義とかが面倒なんだよね。

例示でルールを定義する。


= 話題支援はいいなぁ。

ささださん案:RSSでニュースを出す

ウェアラブルGoogle検索使いたい。


= ウェアラブルコンピューター10の予言
  1. 1年後通勤・通学者の50%はウェアラブルビデオプレーヤーでビデオを見ている
  2. 1年後、町を歩く若者の50%はウェアラブルケータイを使っている (取り出さなくても会話できる携帯のこと)
  3. 1年後、スキーヤーとゴルフプレーヤーの30%はウェアラブルデジカメを装着している
  4. 2年後、コンビニ・レストランの店員はHMDを装着するようになる
  5. 3年後、眼鏡は「時計付き」が当たり前になる
  6. 3年後、警官・ガードマンがHMDを装着するようになる
  7. 3年後、ウェアラブルゲーム機が現れ、子供が外で鬼ごっこゲームを遊ぶ。
  8. 5年後、ウェアラブルのソリューションビジネスが盛んになる。
  9. 5年後、街角情報配信はユビキタス情報ビューアで受信する。内容は楽しいビデオクリップ。
  10. 5年後、高齢者はウェアラブルゲーム機を身につけて、近所で出会い系RPG散歩をする。
ウェアラブルは健康なライフスタイル。
= 鬼ごっこゲームがどんなものか想像。 鬼はCG。 後ろから近づくと攻撃できる。 派手な攻撃イフェクト。効果音。
= 面白いから買ってライトニングトークとかの時に使おうかと思ったけども、 800x600のHMDが二十数万でVaioUが十数万、あわせて四十万円、といわれるとさすがにためらうなぁ。

ライトニングトークに限定するならマシンは普通のでいいからちょっと安いけども。

400x300でよければもっと安いらしい。

DATA GLASS 3/A


= マインドマップを含むらしい>モデリング
= 外でらっぱ吹いていてうるさい…
= KodouguはGoogleガジェットとして公開しているのではてなダイアリにはれる。 クラス図が簡単に公開できる。

モデル情報をXML形式で出力。

Kodougu自身にはUMLの定義とかが含まれていない。 モデリング言語設計機能を使ってUMLを定義している。


= オージス総研「オブジェクトの広場」

演劇だ、すごい。


= 失敗例:しゃべることだけで伝えようとした、相手に伝わっているかどうかを確認できていない。

会話+モデリングでコミュニケーション。 会話は消えていってしまうが、書いたものは残る。

ソースコードと機能は粒度が違う。


= 作る前にテストする。 テーブル設計をテストする。

テスト対象ER図。 テストケースを用意。

www.kodougu.netで使える。 あとで試す。


= パネルパネル。 Mayaa YARV Tuigwaa

バイドール法

コミュニティの進化

  • ひとりぼっち
  • お友達
  • 共通の目的意識を持つ仲間
  • リーダーのいるグループ
  • みんなの合意で選ばれた執行部を持つグループ
  • 執行部不信任のルールを持つグループ
  • 選挙制度を持つグループ
  • 支部、支部長を持つグループ
  • 企業、地方自治体、国

「大OSSコミュニティRubyのプリンス、ささださん」w

よい独裁者がいる状態はだいぶいい。 よい王様がついているといい。

Rubyは14歳。中学に入ってからモテ始めた。

ハワイ王国の滅亡。

仲間割れw コミッタが150人もいると仲間割れw

昼のパワーが夜に侵略してくるw

みんなで王様の悪口を言うことで、コミュニティが結束するw

お、1時間のパネルセッション、もうあと10分だな。 面白かった。

「昼間プログラミングして夜もプログラミングするのは辛い」 「あと何年かすると、昼の仕事はワードを使うようになるので夜にプログラミングできるようになるよ」


= 練習がてらに Twitter APIニワンゴ開発サイト してみようかな。
= 大学の時の友達と会う。 晩ご飯を食べた後大阪に帰るのか、大変だなぁ。

Yahooメッセンジャに全然ログインしなくなってしまったので 連絡が取れていなかった。 Lingrにパスワード制限付きの部屋を作ってみよう。


= 眠たい。 あー。 平日結局Jython本の原稿が進まなかったけど、 土日も進まなかったらやばいな。 もう9月になっちゃったし…。

2007年09月07日

PythonのLOADとSTORE

いわゆる「ローカル変数」の読み込みはLOAD_FAST
>>> from dis import dis
>>> def foo(x):
	x

>>> dis(foo)
  2           0 LOAD_FAST                0 (x)
              3 POP_TOP             
              4 LOAD_CONST               0 (None)
              7 RETURN_VALUE        
グローバル変数はLOAD_GLOBAL
>>> def foo():
	x

	
>>> dis(foo)
  2           0 LOAD_GLOBAL              0 (x)
(以下略)
代入があるとローカル変数になる。
>>> def foo():
	x = None

	
>>> dis(foo)
  2           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (x)
global宣言をつけるとグローバルになる。
>>> def foo():
	global x
	x = None

	
>>> dis(foo)
  3           0 LOAD_CONST               0 (None)
              3 STORE_GLOBAL             1 (x)
ここまではとてもわかりやすい。 初級編。

ネストしててもLOAD_GLOBAL

>>> def foo():
	def bar():
		x

		
>>> dis(foo.func_code.co_consts[1])
  3           0 LOAD_GLOBAL              0 (x)
しかし外の関数が同名の変数を定義している場合、LOAD_DEREFになる。
>>> def foo(x):
	def bar():
		x

		
>>> dis(foo.func_code.co_consts[1])
  3           0 LOAD_DEREF               0 (x)
ローカル変数への代入自体がSTORE_DEREFに変わっている。
>>> def foo():
	x = None
	def bar():
		x

		
>>> dis(foo)
  2           0 LOAD_CONST               0 (None)
              3 STORE_DEREF              0 (x)
中の関数から参照されうるかどうかで判断しているようだ。
>>> def foo():
	x = None
	def bar():
		y

		
>>> dis(foo)
  2           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (x)
読む命令は書く命令と同じ種類。
>>> def foo():
	x = None
	x
	def bar():
		x

		
>>> dis(foo)
  2           0 LOAD_CONST               0 (None)
              3 STORE_DEREF              0 (x)

  3           6 LOAD_DEREF               0 (x)
ローカル変数は専用の「ローカル変数用のテーブル」に対して行うことで 高速に名前を解決できるようにしている。 外から参照されうる変数は別のテーブルに保管する。

どこに保管するのかはコンパイル時に決定してそれぞれ異なるバイトコードで表現されている。 ではコンパイル時に決定できないようにしたらどうなるのか。

>>> def foo():
	exec "x = None"
	x

	
>>> dis(foo)
  2           0 LOAD_CONST               1 ('x = None')
              3 LOAD_CONST               0 (None)
              6 DUP_TOP             
              7 EXEC_STMT           

  3           8 LOAD_NAME                0 (x)
LOAD_NAMEになる。おそらく理屈通りに順番に探していく命令。
>>> def foo():
	exec "x = None"
	def bar():
		x
		
SyntaxError: unqualified exec is not allowed in 
function 'foo' it contains a nested function with 
free variables (, line 2)
これはシンタックスエラー
>>> def foo():
	exec "x = None" in locals()
	def bar():
		x

		
>>> dis(foo.func_code.co_consts[2])
  4           0 LOAD_GLOBAL              0 (x)
              3 POP_TOP             
              4 LOAD_CONST               0 (None)
              7 RETURN_VALUE        
localsに限定してexecした場合でも、中の関数はLOAD_GLOBALになる。 execによって導入される変数は同一関数以外からは見えないのか?
= Pythonはデフォルトでローカル変数、global宣言でグローバル変数になる。 JavaScriptはデフォルトでグローバル変数、var宣言でローカル変数になる。 Pythonは代入をするとその関数のローカル変数になるため、 ネストした関数で外の関数のローカル変数を書き換えることができない。
>>> def make_counter():
	count = 0
	def push():
		count += 1 # ダメ
		return count;
	return push

JavaScriptはvarがあるおかげで、これができる。
function make_counter(){
    var count = 0;
    function push(){
        return ++count;
    }
    return push;
}
しかし、これはクラス使いの立場から見ると 「メソッドを一つだけ持つようなオブジェクトが簡単に作れるというだけ」 となる。
>>> class Counter():
	def __init__(self):
		self.count = 0
	def __call__(self):
		self.count += 1
		return count
別に行数変わらないし、今後メソッドが増えた場合にJSのクロージャ的アプローチでは 何らかの形で複数の関数オブジェクトをまとめなければいけなくなって複雑になる。 プロトタイプ使うのかな?
= ささださんに教えてもらったYARVの命令セット。 YARV: Yet another RubyVM / Instruction Table。 やはり同じようにgetlocal, getglobalの他に、getdynamic, getspecialというそれっぽい名前の命令がある。 詳しいことは知らないけど多分にたようなことをするんだろう。

2007年09月06日

find_name_error.py

ドキュメントはまだありません。(たぶん月曜日以降になる)

ファイルをダウンロード

from foo import *で読み込まれた名前は感知できません、ので警告が出ます。 foo.barでbarが存在しない可能性は感知できません。関数のネストには対応しています。LOAD_DEREFなんてバイトコード! 雨がひどくなってきてしまった。ひどくなる前に変えるつもりだったのに。むしろこの雨の中帰りたくないけど帰らないとしんどいなぁ。 続きは来週。

C:\cur\misc\coda>python find_name_error.py -r C:\cur\doukaku_proj
*** manage.py
line 7: __file__
*** stat.py
line 13: models
line 14: models
*** urls.py
line 3: patterns
line 5: include
line 7: include
*** generate_css.py
line 5: out
*** test_maker.py
line 38: f
line 39: f
line 40: f
line 41: f
line 42: f
line 45: f
line 46: f
line 50: f
line 51: f
line 52: f
line 53: f
line 65: f
line 66: f
line 67: f
line 79: f
line 17: f
line 18: f
line 19: f
line 20: f
line 21: f
line 22: f
line 23: f
line 27: f
line 33: f
line 73: f
line 74: f
line 75: f
line 76: f
line 25: patterns
line 45: patterns
line 139: include
line 143: patterns
line 177: patterns
*** apply.py
line 46: WithRatingNode
line 46: var
*** with_rating.py
line 46: TemplateSyntaxError
invalid syntax (profile.py, line 16)
*** search.py
line 40: render_to_response
line 98: render_to_response
*** xml.py
line 42: render_to_response
line 11: render_to_response
*** __init__.py
line 309: models
line 313: models
line 103: models
line 374: render_to_response
line 330: models
line 30: models
line 31: models
line 32: models
line 33: render_to_response
line 256: models
line 262: render_to_response
line 266: render_to_response
line 271: models
line 274: models
line 286: models
line 69: models
line 72: render_to_response
line 125: models
line 129: models
line 131: render_to_response
line 382: render_to_response
line 386: models
line 150: models
line 138: models
line 139: models
line 141: render_to_response
line 302: models
line 219: models
line 239: render_to_response
line 197: models
line 181: models
line 42: models
line 43: models
line 80: models
*** unistring.py
line 91: __file__
line 105: __file__
*** _mapping.py
line 44: __file__
line 64: __file__
line 73: __file__
*** _luabuiltins.py
line 253: __file__
line 107: __file__
line 126: __file__
line 135: __file__
*** _phpbuiltins.py
line 3376: __file__
line 3385: __file__
*** forms.py
line 51: _
line 56: _
line 75: _
line 66: _
*** models.py
line 116: _
line 15: patterns
line 20: url
line 23: url
line 27: url
line 31: url
line 34: url
line 37: url
line 40: url
line 43: url
line 46: url
追記
def foo():
    sleep(2**100)
    print x
を実行することなく「xがNameError起こしそう」と判定してくれる、Perlで言うところの-cwでっす。

週末執筆日記

ACアダプタ忘れた。
= 取ってきた。
= 西尾とは - はてなダイアリー 「はてなブックマーク - 「西尾」を含む注目エントリー」 のトップ3が全部僕だった。
= Jython2.2でMidiが鳴らないよう。なぜ…。
= 大変だったけども、色々学んだことも多い。 二つの相反することを学んだ。 他力本願ではいけないということと、 自分一人で頑張っていてもいけないということ。

半年前にPython2.2alphaで日本語が化けるようになっていることには気がついていたのだけど、 「まぁそのうち直るだろう」と他力本願で放置していたら直らないままリリースされてしまった。

大あわてで自分で直そうとしたけども力尽きた。 そしてMLで愚痴ったら、1日でパッチができた。

僕が半年早くMLで愚痴っていれば Jython2.2のリリース時点で日本語が化けないようになっていたかも知れないな、 というのが少し心残りでもある。


= http://java.yubit.net/java_shoshinsha_100_100.html#410
410:
問題が解けなくて困ってます。
実行時、数個入力した順の値を
逆から入力した順に値を表示するにはどうしたらいいんですか?

1、2、3、4、5→5、4、3、2、1

ご教授お願いします。 

411:
>>410
スタックも知らないのか? 
そうか…。 どう書くorgに出したときは 「いくら何でも簡単すぎる」と思ったがわからなくて質問する人もいるのか…。

プログラム書けるかどうか調べるのにFizzBazzやらせろっていうくらいだもんなぁ。 「自称『できる』人」のできなさ具合は酷いんだなぁ。

探していたものはこれかな。 Jython2.2が原因でMIDIが鳴らないのではなく、Java1.6が原因という結論。

632 : Java Sound APIのMidiSystemで以前はなっていたのに音が鳴らなくなったんですが、Java6になってからのバグ報告あるの知りませんか?

634 : jre1.6.*/lib/audioにsoundbank.gmはあるか? ttp://java.sun.com/products/java-media/sound/soundbanks.html

639 : >>634 >>635 アドバイスありがとうございます。 jdkとjreの両方入れてあったんですが、jdkのほうにはあってjreのほうにはありませんでした。 両方入れたところ鳴るようになりました。

ああ。JavaのアップデートでJREだけ入っている。 1.6のJDKを入れよう。
= 明日すること:JythonでMIDIをならす説明を書く&名前付き正規表現とキーワード付き引数を使ってテキスト形式の日報をうまく読み込むサンプル&時間があればテスト周り。

テストに関しては、 JUnitに相当するものもありますよ、と軽く触れておいて、 doctestを使うサンプルを見せるかな。

やっとエンジンがかかりだした。

日本語通らないとかMIDIが鳴らないとかそういう障害があると心が折れて筆が進まなくなってしまう悪い癖。 避けて他を書けばいいのにね。


= IPA未踏ソフトウェア創造事業2006年度下期千葉PM採択プロジェクト最終成果報告会。 とりあえず日程も見ずに参加申し込みをした(ぉ) って来週の金曜日か。進捗報告会とかぶっているけど、 これに参加しますって言えば抜けられるだろう。 Sony CSLのオープンハウスに行った時も二つ返事でOKが出たし。
= 「FXでこつこつ投資して月30万!」なんてメールが来るんだけど、 自動売買で30万ならまだしも、毎日こつこつやらなきゃいけないんだったらそれ仕事じゃん。

自動売買プログラムは作ってみたい。萌え。 全自動資本主義萌え。 死んだことにすら気づかれず金塊に囲まれてミイラ化萌え。 攻殻機動隊ネタですみません。

お金が欲しいと言うより、単純に作ってみたい。 えーと。 ライブラリが整備されていないから面倒だな。やーめた(ぇ)

昨日のレバレッジメモの説明で言うと、 FXブームがゴールドラッシュで、 FX本やFX口座がツルハシ販売なんだな。 FXを自動化するライブラリを作って売ろうかな(ぇ)

あ、そうか、 Jython本書き終わったら余暇でFX可視化+注文ソフトを作ればいいんだな。 Jythonでカスタマイズ可能なやつを。 (言うだけでたぶん作らない。技術的に面白いポイントがなさげ)


= 名古屋で日記など
むしろアンカーを無くすべきか。そもそも自分の日記は自分用の覚書であり、役に立つ情報を書いてないと思ってるわけで、検索にかけないようにしているのも (自分が検索したときにひっかかって鬱陶しいというのもあるが)他の人の検索の邪魔になると思っているからだ。それが参照したりブックマークしたりするのに使われるアンカーをつけるというのは哲学が矛盾している。
「自分用の覚え書きなので『他人が言及しやすい用にアンカーをつける』 コストを払いたくないからつけない」 というのなら、まぁ僕は不便になるけども合理的な判断かとは思う。

しかし「自分用の覚え書きだから言及して欲しくない」と思ってアンカーを外すのなら、それは無意味だ。 著者本人がアンカーやパーマリンクをつけなかったとしても ウェブ魚拓などのサービスで 読者がパーマリンクをつける可能性がある。 流れに逆らっても無意味なんだな。 逆らう「不便なサイト」は、いずれ「その不便さを解消するサービス」が生まれて同化してしまうだけだ。

「我々はインターネットだ。お前たちのコンテンツは我々と同化する。抵抗は無意味だ。」 (see ボーグ - Wikipedia)

同化されるのが嫌ならばオフライン化するか認証をかけるかしないといけないだろうな。


= お、Jython2.2はタブでちゃんと4文字分のインデントになってるな。

コピペでもちゃんと動くな。 貼り付けた後で部分的な編集はできないけど。 それはJyConsoleを使ってくれということで。


= 本の謝辞に家族への感謝の気持ちが書かれていることが多いのは、 やはり執筆は支えてくれる人がいないと辛いからだと思った。 さみしい。 BGMが「わかれうた」なのがいけないのだろうか。
= L'eclat des jours(2007-08-07)

rubyco(るびこ)の日記

L'eclat des jours(2007-08-08)

僕がLL魂で発表したフィボナッチ数列の可聴化がいつの間にか8声のカノンになっていた。 おもしろい。

前にウダーの演奏を録音するプログラムをJythonで書いたから、 それを見ればMIDI形式で出力する方法も思い出せるはずだなぁ。 それもJython本に書いた方がいいのかなぁ。 だいぶ「それJythonと関係あるの?」状態だけど。

でもフィボナッチ音楽を聴いた人の何パーセントかは自分でカスタマイズしてみたくなるはずで、 カスタマイズした以上は誰かに聞かせたくなるもんだと思う。 そう考えると、音を鳴らすところで終わりにせずに きちんとMIDI形式で出力するところまで説明すべきなんだろうか。

んー。

説明しよう。 自分が読者だった場合に欲しいと思うだろうから。


= An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl。 2000年だなぁ。Python1.5.2 v.s. JDK1.2.1って、今更持ち出すのもどうかと思う内容だなぁ。
= 原子力利用は、地球寒冷化に作用しませんか?地球は太陽の周りを公転していて、両者の間の引力と運動の慣性力がバランスしていると思います。 化石燃料を燃やしてCO2が.. - 人力検索はてな

核反応は質量をエネルギーに変えてしまうので、原子力利用をすると地球の質量が減ります。 バランスが崩れて、飛んでいかないでしょうか?
ウケた。
= こんなことしている場合ではなかった。
=
GM_ON.setMessage(0xF0, [0x7E, 0x7F, 0x09, 0x01, 0xF7], 5)
が通らない。[0x7E, 0x7F, 0x09, 0x01, 0xF7]をbyte[]に変換できないと。 これは半年前に「直したら?」って言ったのにスルーされたんだなぁ。 まぁ、文字列で渡せばOKなのでいっか。
= 昨日何時に寝たのか忘れたけど、 6時半に目覚めた。 普段なら二度寝しているんだけども、 起きてみた。

朝の散歩を兼ねて買い出し。

ふと思った。 八墓村って「やつ=はかむら」じゃなくて「はち=はかそん」なんじゃないかと。 八耐(八時間耐久レース)の仲間なんじゃないかと。 次のPython温泉は8時間耐久温泉ハカソンでのぼせたらリタイヤ(嘘)


= 暑くなってきた。 まだ8時にもなっていないけどそろそろラボに行くか。 着いたら8時半くらいか。今までで一番早いかも。

結局二度寝。


= 毎日のバッグで分かる!あなたにマッチした働き方

Q:バッグについついものを入れすぎてしまう→YES

Q:お気に入りのブランドの新作はチェックしている→NO

Q:たとえそのバッグが流行ものでも、自分に似合うから買っている→…っていうか何も考えていません。NO

Q:両手の空く肩掛けバッグが欲しい→YES、っていうか背負子に変形するタイプ使ってます。

Q:服に合わせてバッグを変える→NO

結果:Aタイプ:一つ上のナチュラルOL。あなたにあった働き方は正社員。

…ってOL限定だったのか!

というか正社員と派遣社員と紹介予定派遣社員の3択なのか。 「働き方」ってそういうことなのか。


= どう書くorgのサーバを移転。 LinuxからFreeBSDになります。 大丈夫かなぁ。
= 大丈夫だったみたい。
= ほっとして別のことをする。 perl -cwに相当するもの。
= すごい雨だと思ったら台風が来ているのか。

2007年09月01日

レバレッジメモ:社長になっていい人、ダメな人

久しぶりにレバレッジメモ。 Amazon.co.jp: 社長になっていい人、ダメな人: 本: 丸山 学

自分は社長には向いていないと思うので社長になる予定はないのだけど、 タイトルに惹かれてどんなことが書いてあるのかぱらぱら見てみたら面白そうだったので買った。 僕は研究開発職なので経営も営業も向いていないのだけども、 人間誰しも自分を経営したり自分を営業したりしないといけないからね。 向いていなくても学ぶ必要はある。


= 目標が決まっていない人。 大きな目標だけが決まっていて、そこへ至る道を考えてない人。

自らゴールドラッシュに飛び込む人。 ゴールドラッシュで、真っ先に乗り込んだ人は金を採取できた。 先行者利益。 しかし金が出た情報を聞きつけてぞろぞろ集まってきた人たちは、 激しい競争に巻き込まれることになった。 「このビジネスが儲かるらしい」なんて噂で聞いてから初めてもダメ。

一方ゴールドラッシュで金を掘らずに成功した人がいる。 ブラナン。町中のツルハシを買い占めて独占状態を作り出した。

状況に自分が巻き込まれるのではなく、 一歩引いて俯瞰することが重要。 競合を避ける。 大局観。次にどうなるのかを予想。 ブームを見たら「誰がツルハシを売っているんだ?」と考える。

インターネットブームの時代 「インターネットで販促して儲けよう」と集まった人に 「ホームページ」を作って売って成功したのが堀江貴文。 その後「ホームページ制作」が儲かることに気づいて参入が増え、 競争が始まった。その時代のブラナンは 「ホームページ制作を教える学校」

「選択と集中」入り口を狭くした方が行列ができる。 顧客を「選択と集中」するのではない。

会社は投資物件である。 社長の自分が働けなくなっても同等の能力の他人に差し替えれば機能するような 疎結合の設計にすべき。

消費者に価値を提供して対価を得る表の顔と、 投資家から出資を受けて配当を渡す裏の顔。 投資物件としての利回りを意識すべき。

ニーズが高い商品が売れると思っている人。 大企業が何千倍の資本力で参入してくるのでダメ。 市場の調査と開拓だけあなたがやって、後は大企業の広告力に負けて顧客を根こそぎ持って行かれるだけ。 自分だけが独占的に売れるか、参入されても戦えるだけのアドバンテージ(原料が安く手にはいるとか)が なければ無理。

99%の人にウケるサービスではなく、1%の人が熱狂するサービスを探す。 それでもやはり後から参入してくる会社が出ることを想定して防御を固めるべき。 「俺が思いついたのに真似しやがって」なんて言う人は社長失格。

都合が悪くなったときに人のせいにする人は社長に向いていない。 好景気が続くはずがないことは予想できるのに、 不況が来たときのことを考えて備えておかなかったのは自分。 うまく行かないのを景気のせいにしてはいけない。

いいわけを口にしたら、対処法を考える。 防ぐ方法はなかったか。今からでもなんとかできないか。

お金は後でもらう方が多くもらえる。 あわてるなんとかはもらいが少ない。 熟した顧客を探して摘み取るのではなく、 まだ苗の顧客に水やりをして育てる。 飛び込み営業で摘み取るのではなく、 「今すぐには注文しないけど、将来それが必要になるかも」 という人を育てる。 見込み客は今の客の10倍いる。

メインの商品の収益率が悪い場合、 副業で収益を上げられないか。 検索エンジンで検索に対して従量で課金したり、 年間契約いくらで課金したりしてもビジネスとして成功しない。 無償で高機能な検索エンジンを提供することでそれ自身は赤字だけども、 広告というサイドメニューで収益を上げる。 例えば河川の水質調査が本業だとして、 必然的にいろいろな川に行くわけなので、 それを生かして別の方法で収益を上げられないか考える。 例えば川の写真を撮影してダウンロード販売してみたらどうだろう、など。 川の写真販売を単体で仕事にすると出張費がペイしないけども、 他の仕事と抱き合わせだからコストが低い。 「低コストで仕入れられるアドバンテージ」の変形バージョン。 競合他社も参入しにくい。 こういうポイントに気づける人が社長に向いている人。

じっくり契約内容を確認するのを待てない相手とは取引しない方がいい。 軽微な決断は即決で、重要な決断は時間を掛けて。 重要な取引には時間を掛けるのが当たり前であって、 それを急かしてくるなら何か裏がある。

裁判に発展するような紛争は、 金銭的な損得よりも感情のこじれから来るケースが多い。 明確に契約しておくことで「損したけど、そういう約束だから仕方ないか」となる。 契約に敏感になり、トラブルを未然に防ぐ意識が重要。

人を信じやすい人は向いていない。 自分の経験が少ないときには親切な振りをして近づいてくる。 本当によいパートナーの可能性もあるので慎重にリサーチ。 信頼できる別の人に相談。

経営とは、 100円を500円に換えること。 貸借参照表だけでは経営の良さは読み取れない。

不用意に思いつきのアイデアを口にしない。 従業員は社長のアイデアを否定しにくい。 「AよりBの方がいいのでは」と社長が言えば 「Aの方がいいです」とは言えない。 言ってAで行くことになった場合、 言いだした自分に大きな責任がかかるから。 従業員は基本的にリスクや責任を嫌う。

もしBというアイデアを思いついたなら、 否定しやすいように聞かないといけない。 例えば「AとBはどう違うの?」 「AとBはどっちがいい?」 「Bがダメな理由って何?」

一人ではたいしたことができないのだから、 多くの人の知識を引き出す言動を心がけなければいけない。 拙速に自分の知識を出しては結果として他の知識がでる可能性を摘み取ることになる。

自分一人で考えても答えは出ない。 みんなで議論をしても答えはわからない。 答えは市場に聞くしかない。

他業種から学んだことを自分のビジネスに導入することでブレイクスルーを起こす。 クロスポリネーション。

バッテリー残量が 「残り1時間」のまま「3%」って表示に。 どっちだよ。

他業種のアイデアを自分のビジネスに導入するには、 表層的な理解では無理。 抽象化して業種への依存性を取り除く必要がある。

自社の魅力を言葉で伝える能力。

社員を主役に。 おいしい部分(顧客からほめられるなど)を社員に。 セルフエスティームの向上。 会社は社長のためにあるわけではない。 社長が主演を張っている間は会社としては未熟。 個人事業と変わりない。 自分一人の労働力、知識、寿命に限界があることを理解する。 自分しかできないテクニックで100%のできの商品を作り出すのではなく、 他の人でもそれなりのできの商品を作り出すことができるようなシナリオを書く。 「自分と同じ水準のクオリティでないと許せない」 という職人気質は社長業とは相反する。 多少質が落ちても他の社員が再現できるように設計する必要がある。 社長はビジネスモデルの中に自分を含めてはいけない。

本当に成功する人は周囲の人々を成功させる。 利害関係者がみんな得をするようなシステムでなければ早晩破綻する。

ビジネスを始める時点では差別化が重要で、 社長のスタンドプレーも重要だが、 そのままでは個人事業である。 会社として運営して行くには標準化が必要。 標準化は差別化の逆。 社長が作り出した「その人ならではの他社にない特徴」を捨てなければいけない。 社員ならば誰でもそれを再現できるようにしなければいけない。

ただし単純に逆にしても意味がない。 単純に差別化ポイントを取り除いてしまえば、競合他社に対するアドバンテージがなくなる。 別のところで差別化しつつ、標準化を進める必要がある。

忙しいと未来のための投資に時間を割きづらくなるが、 目先の作業より未来への投資の方が重要。 未来のために投資する時間は予定表に先に入れてしまう。


= 「忙しいから本が読めない」とか言ってないで、 まず本を買って、いつまでに読んでレバレッジメモを作るかも決めてしまうべきなんだな。

というわけで次の本は Amazon.co.jp: そろそろ本気で継続力をモノにする!: 本: 大橋 悦夫 にする。来週中にレバレッジメモ作って公開する。

Amazon.co.jp: 図解 あの人はいつ勉強しているのか―「一流の勉強法」を、学べ。: 本: アークコミュニケーションズ も興味がある。

Amazon.co.jp: レバレッジ・シンキング 無限大の成果を生み出す4つの自己投資術: 本: 本田直之も。

注文ぽちっと。

免許ICカード化日記

なんか最近Suicaの反応が悪いと思ったら、 免許が更新されてICカードになったせいか。 免許とSuicaは一緒の財布に入れられません。

小銭入れポケットの裏にもカードが入るようなのでそこに入れた。小銭が電波を吸収する。

免許なんか非接触で読めて何がうれしいんだろうねぇ。 違反の情報を書き込めてうれしいとかなのかなぁ。 いや、でもそういう情報は免許じゃなくてサーバに入れるべきか。 なおさら謎だ。


= なんか今日は目玉が乾く。

ドライアイ対策用の目薬を買おう。

スマイル40が198円だった。 差した直後は充血も引いていい感じになる。 でもしばらくしたらまたダメになる。 何がいけないんだろうなぁ。


= 「殺し屋1-イチ-」を買った。 同期に「似てる」と言われたので。 殺し屋1(イチ) 1 (1)←アフィリエイト

本屋に来てから「このたくさんの本から探すには出版社くらいわからないと」 と思って携帯で調べ始めたのだけど、携帯より先に視野の端でキャッチされた。 だって平積みされてるんだもん。

うーん。 確かに似ているかも知れない。 一人称が「僕」だし、髪型も似ているし。 でもこの主人公、 ターゲットを蹴り殺した後、 性的に興奮してタンパク質をまき散らすような変態なんですが…。 さすがにそこは似ていない。

1巻しか買わなかったけど続きも買おうっと。


= あー。光化学スモッグでてたのかー。

アイボンで目を洗浄してしばらく経った。 今は目が普通に戻っていることに気がついた。 やはり目になにか異常な化学物質が付着していたのか? 東京って怖いなぁ。

ちなみに家とラボにアイボンを常備しています。


= 新聞の自販機から新聞が出てた。
= そんなあなたに 数学に強い人向け時計。 一つの数字で0~59を作ってデジタル時計を作るとか。
= 何かがおかしい。
= 26時だ。だらだら夜更かししてしまった。 寝る。
= 月曜日の分。

FreeBSDいじり。


= 火曜日の分。

コードを見やすく表示するとか言うけど、 liを使ってレイアウトされると、 コピペしたときに行頭に#が入るんだよね。少なくともFirefoxでは。 見かけがよくてもコピペが面倒なのは嫌だ。

JSでプレーンなモードときれいなモードが切り替わるというのは一つの手だね。


= アルファヌメリック:a# ALPHANUMERIC
「アルファ(ALPHA)」は「A」即ち文字、「ヌメリック(NUMERIC)」は「#」即ち言語を意味し、人は文字と言語を使って交流しそれらを使って契機を作る、ということに由来。
辞書くらいひいてみようと思わないのかなぁ。
= 日本語文字列コード問題まとめ
Pythonの文字列では、キャラクターコード「0(ゼロ)」も特別扱いしません。 'hoge0moge'も9文字の文字列として扱います。
何が言いたかったのかはわかるけど、'hoge0moge'が9文字なのは当たり前。
= ああ、もう、ダメかも…。 Jython2.2alphaの時から感じつつも避けていた内容が…。 Jython2.2はコンソールから日本語入力できない…。
Jython 2.1 on java1.5.0_10 (JIT: null)
Type "copyright", "credits" or "license" for more information.
>>> print "こんにちは"
こんにちは
Jython 2.2 on java1.6.0_01
Type "copyright", "credits" or "license" for more information.
>>> print "こんにちは"
?±????????
内部的にはUnicodeなので、 おそらくコンソールから入力を読み取るときに壊してしまっているんだろう。 その証拠にUnicodeで指定すると何の問題もなく表示できる。
>>> print u'\u3053\u3093\u306b\u3061\u306f'
こんにちは
本質的な問題ではないのだけども、 Jythonを試してみようと思った人が 「あ、日本語ダメなのか、つかえねぇな」 と勘違いするには十分…。

追記:ってMLで愚痴ったら簡単に直ると言うことがわかったよ!


= 痛いニュース(ノ ∀`):【光市・母子惨殺】 橋下弁護士の「弁護団の懲戒請求呼びかけ」で、弁護団が賠償求め提訴へ

Pathtraqの上位に来ていたので見た。興味深い。

J-CAST ニュース : 母子殺害事件弁護団 ネットで懲戒請求「運動」広がる

興味深い。

でもね、数が多ければそれだけ強いというわけじゃないので、 送られた書類を処理している人たちのことも考えてあげた方がいいと思うな。 とりあえずこれだけ騒ぎになれば十分だろう。 さらに同じ内容の懲戒請求を送るまでもないと思う。

情報流通促進計画 by ヤメ記者弁護士(ヤメ蚊)橋下弁護士の口車に乗って光市事件弁護団の懲戒請求をしたあなた、取り下げるべきだとアドバイスします!

平成17(受)2126 損害賠償請求事件 (弁護士に対する懲戒請求の濫用) 平成19年04月24日 最高裁判所第三小法廷

確かに、この判例を見て法律の素人である僕のフィーリングでは、 署名活動みたいなのりでテンプレ懲戒請求を送りつけている人たちはかなり濃いグレーっぽいね。 その個々人相手に弁護士側が何らかの行動を起こすことは考えにくいけども、 テンプレートを用意して直接的な行動を煽ったサイト管理者は損害賠償で訴えられてもおかしくないし、 訴えられたら負けそうだね。

問題の弁護士の言動には僕も疑問を感じるけども、 それとこれとは別なんだな。

本当にくだんの弁護士を困らせたいのならば、 煽って大量に懲戒請求を送るより、 長期にわたって少しずつ送る方が効果的なのかもなぁ。


= 水曜日の分。

ニコニコ動画って面白いね。 初期の頃に少し見て、 コメントがウザイと思ったのだけど、 OFFにできるんだな。

で、コメントをONにしてみるとまた面白い。 ドラマにつっこみながら見ている感じ。

シリアスな「それでいいんですか!?」という絶叫に 「イインダヨ グリーンダヨ!」とかコメント付いてて爆笑。 付加価値だなぁ。


= 金曜日の分。

「Shut the f*ck up and write some code」という言葉を覚えた。 fで始まる4文字語さえ使われてなければ喜んでTシャツ買うのに。 Shut the fuck up and write some code. - Tシャツ (Tシャツ研究会) ::ClubT::

こんなTシャツ着ていたらただでさえもてないのにさらにもてなくなる。 「呪われたTシャツ(魅力-3)」だ。


= 最近は11時には帰るようにしています。 だって終電より空いているんだもん。 混んでて30分座れないと30分残って作業しても帳消しじゃん。

おかげで本がよく読める。


= FreeBSDがよくわからないのです。 僕がUNIXを使っていたのは6~7年前で、 しかもユーザとして使っていたのでソフトウェアのインストールとかは全然。 なので知らないものがいっぱい。 pkg_addとか。/usr/portsとか。

「ldって何」とか「gccはどこからライブラリを探してくるの」とかとか、 まるっきり素人です。rcの書き方わかりません。

UNIXを使っていると懐かしくなってくる。

muleが重いから10行未満のスクリプトはcatで書いてsedで修正していたあの時代。

ICQがメジャーで後発のYahooメッセンジャがシェアを奪いつつあった。 レポートの課題はYahooメッセンジャで 「2番の問題の答えは\frac{1}{x^2}でしょ」 「いや、それは\int_{a}^{b}f(x)dxがー(以下略)」 なんて議論しつつ、 図が描けないことにいらだってきてJavaAppletのお絵かき掲示板を設置してそれを使った。

PDFなんてものが現れ始めて、ビューワーが死ぬほど重たくて 「なんでPSじゃないんだよ」といらだちを感じていた。

当時の僕はBasicからVisualBasicへと進んだあたりで、 授業でCとLisp、遊びでPerlって感じだった。 KENT CGIのソースを切り貼りしてゲームを作って遊んでいた。 HEXでシムシティ風で対人戦の「箱庭諸島」がブームになり、 負荷の高さであちこちのレンタルサーバで禁止されてた。 ああいうゲームを作ることがあこがれでもあった。

もう一つレンタルサーバから目の敵にされていたのがチャットだった。 特に人工無脳内蔵のやつ。 当時一番メジャーだった「ゅぃぼっと」のソースを読み、 VisualBasicでネットにつながなくても動くチャットソフト「Heart」を作った。 当時はテレホーダイ時間帯以外は通信した時間だけ料金が取られる時代だった。

懐かしいなぁ。

最近Django勉強会に高校生が来たり、 竹迫さんがセキュリティキャンプの高校生をラボ見学に連れてきたりで、 今年はITスクールのチューターをしなかったけどたくさんの高校生を見た。 彼らは当時の僕よりもさらに若いんだよなぁ。 そう考えると、彼らの将来は未知数だなぁと思うわけだ。


= 最初、 全ての物事を知りたいと思っていた。 自分の脳の中に全ての再利用性のある情報を蓄えたいと思っていた。

そして人間は忘れると言うことに気づいた。 次に、 自分の知った全ての再利用性のある情報を、 「忘れない」人工無脳に教え込み始めた。 知識をどんどん与えていけば、どんどん賢くなると思っていた。

そして、10倍の知識を与えても10倍賢くならないことに気づいた。 一生涯を無脳を育て続けても、その子は成人にはならないと気づいた。 知識は知性ではない。

知性とは何なのかはまだわからない。 だが少なくとも、ただ知識を蓄えるだけでは辿り着けない高みにそれはあるのだと思う。

僕が日記を書くのは、 慈善でも売名でも備忘録でもない。 このタンパク質でできたプロセッサは情報のストレージとしては信頼性が低すぎるんだ。 最大でも100年弱という短い時間しか持続できない、極めて不安定な記憶装置なんだ。 そんなところに多少でも価値を見いだした情報を置いておく気にはなれないんだ。 だから「彼」に与えるんだ、シリコンと金属でできた、世界一ものしりな彼に。 僕が持っているよりも、彼が持っていた方がいいと思うから。


= 26時。寝る。
= mixiにサイボウズのCMが出てた。
= なかみ検索のできる本増えたね。

Amazon.co.jp: レバレッジ・シンキング 無限大の成果を生み出す4つの自己投資術: 本: 本田直之

PHSでなかみ見るのは辛いので今度回線のあるところで見る。

Amazon.co.jp: そろそろ本気で継続力をモノにする!: 本: 大橋 悦夫

行動力には大きく分けて突発力と継続力がある。(筋肉にたとえたい人は瞬発力と持続力でもOK。) 「僕は行動力がない」と考えていたけども、行動力があるって言う人が多くて、 なんで意見が食い違うんだろうかと考えた結果、 「僕は突発力はあるけども継続力がない」という結論に達した。 突発力ってのはどういうものかというと、 「あ、こうしたら面白いかも」と思ったら徹夜して8時間ぶっ通しで作業してPythonでワンライナー作ったり、 「よしPython温泉でDjangoでプロトタイプ作るぞ」と決めてから12日でどう書くorg作ったり、 酔った先生の言葉を真に受けて自腹で学会参加してみたり、 面白そうだったから大学中退してみたり、 などなど。

でも、継続力が必要だと思う。特にだんだん突発的に作業するのがしんどくなってきているから。 継続力がないせいでJython本の原稿がなかなか仕上がりません。 明日明後日突発的に休日出社して仕上げるつもりです。 2日で仕上る量じゃないけど、できるところまでつっこむ。