2007年04月16日

このブログは移転しました!

このブログは移転しました!


2007年09月28日の記事を最後にMovableTypeのデータベースが壊れてしまい、編集ができなくなりました。 復旧までのつなぎのつもりではてなダイアリーに移行したところ、戻るのが面倒になったのでそのまま移転してしまいました(><)

西尾泰和のはてなダイアリー

今後ははてなダイアリーの方をよろしくお願いします。


このドメインのルートページも参考にどうぞ。 結局あちこちにいろいろしても管理していけないので、最低限自分のドメインの根本くらいは最新に保とうと思っています。
近日発売:「Jythonプログラミング」

過去の記事

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から除名せざるを得ない。