2009/02/22

producingoss.com/ja translation complete

http://producingoss.com/ja/index.html

「オープンソースソフトウェアのつくりかた」の下訳を数日前に終えた。まだ多少ブラッシュアップが必要ではあるが。

と、いかにもひとりでやったかのように書いているけれども、これの翻訳プロジェクトは高木さんが founder であり、二人で進めてきたものである。俺は210コミットしたことになっているが、1年半という年月は非常に長いようで短かった。

この本は無意識のうちにオープンソース開発に関わるようになった人でも、今全く縁がない人でも、コンピューターの技術者であればきっと面白く読めると思う。たとえ緩い繋がりであっても世界中に影響を与えることができるソフトウェアを作り上げていける力、そして緩いゆえの脆さ。そういう不思議な世界を読み解くきっかけとして、必要十分な知識を提供してくれるだろう。

----

翻訳というのは「代弁」ともいえる。たとえ代弁であっても、労力を払って伝えたいと思うネタってそうはないと思う。この本は俺にとってまさにその労力を払うに値する内容であると信じているし、オープンソースソフトウェアに関心がある開発者にも影響を与えられる内容であると信じてやまない。

この本と出会うきっかけを与えてくれた高木さんには、改めて深く感謝したい。また、原著者である Karl Fogel には、翻訳作業にあたって様々な励ましやアドバイス、助力をメーリングリストで貰った。彼の深い懐があってこそ、この翻訳は成り立っている。

KVS

http://groonga.org/
http://luxio.sourceforge.net/
http://tokyocabinet.sourceforge.net/
http://lab.klab.org/wiki/Repcached
http://d.hatena.ne.jp/tasukuchan/20090220/groonga_test_release
http://kai.wiki.sourceforge.net/
http://overlayweaver.sourceforge.net/index-j.html
http://labs.gree.jp/Top/OpenSource/Flare.html
Key-Value Store 勉強会に行ってきた。いわゆる分散型の Key-Value Store の実装や研究をしている猛者たちに猛烈なツッコミを入れる会である。kzk君が幹事であるだけあって、メンバが豪華過ぎる(´ー`; )

発表した人の全てのスライドが公開されているわけではないので、発表された方々のリンク集という意味で上記を残しておく。

----

俺のように普段からフロントエンドの実装ばかり模索している人間は、この勉強会にとってはまさに「お客さん」だったろう。発表者は実装に寄った人からアカデミックに寄った人まで様々。多様な内容のおかげで、俺のようなお客さんであっても非常に楽しく聞くことができ、とても刺激になった。

個人的には首藤先生発表が新鮮で面白かった。なんだろう。現場の人たちって簡潔にしてツボを抑える的なスライドが多い気がするんだけど、研究者の方のスライドって言葉は多くても別の意味で凄くポイントをおさえていて、個人的にはとっても好きである。

----

たとえ「お客さん」であっても、こういう猛者たちを追いかけるきっかけという意味ではとてもよい機会だったと思う。幹事の kzk君 をはじめとして、この勉強会を運営頂いた方々には深く感謝申し上げたい。また、俺のような人間を誘ってくれた pascal に対しても同様である。

そういえば、kzk君とは5年越しで邂逅したな。俺は非常に出不精な人間なので、会う人会う人がXX年越しになったりする。あ、アサマシで「分散システム-原理とパラダイム」買っといたよ。

また、Ethnaのコミッタも何故か少なからずいたので、彼らとも話をした。いちいさん には現状の流れの報告。sotarokcocoitiban さんには 近々 Ethna_ViewClass の改善をレビューしてもらう予定であり、そのことをお願いしておいた。

2009/02/19

ActionChain de Ethna

http://www.mumumu.org/~mumumu/tmp/ethna_250p4_actionchain.patch

【注意】上記は patch の形式をとっていますが、当てても動きません!
Ethna 2.5.0 trunkに対するものです。

----

所謂アクションチェインを Ethna で実現するように改造するには、多分20行いらないんぢゃないかと思うんだけど、需要ってあるのかな。

アクションで次のアクションを登録すれば、それを次々呼び出してくれる、というアレ。
と思いながら、ORM の実装をしながら、適当に書いてみたのが上記patch。

あとは Ethna_ActionClass に getNextActionと、setNextAction() を実装してしまえば、上記は完成する。Ethna_Backend は 実質10行も改造していない。

こうできることがわかっていながら、これまで実装されてこなかった理由って何かあるのかな。とか言いつつ過去の記事をほじくってみて、ORMを弄ってみている。

----

といいつつ、今のEthnaの優先度からしてみれば、上記は非常に些細なことである(*´〜`)
発想の一つとして、このエントリをメモ代わりに記す。

[ Update Febrary 19th 2:35 a.m by m ]

あー、わかった。単純にチェインさせるだけなら簡単だけど、フォーム定義どうする?的な問題が。そこは無視しちゃっていいのかねぇ。と妄想は続く。

2009/02/16

Licensor's power

日本語訳を入れさせるのに(バージョン違いとはいえ)対象ライセンスを拡大してくれた作者は偉大である。当たり前であるがライセンサーは万能である(2行独白)

sexually arousing?

http://mumumu.tumblr.com/post/78558623

受験数学は性的に興奮するという漢がいた。いや、確かに何かの問題を解くとき、解に近付くときの興奮はもちろんプログラミングでもあるし、文系の俺にもわからなくはない。だが、「性的に興奮する」というのは発想になかった(´ー`; )

2009/02/13

Autopagerize

http://userscripts.org/scripts/show/8551
https://addons.mozilla.org/ja/firefox/addon/748

遅ればせながら、ようやく入れてみた。

これは対応しているサイトのページングを自動で行った上で HTML の下部に追加する GreaseMonkey スクリプトである。よって、対応しているサイトはスクロールを下にずっと続けていくだけで光速な流し読みが可能になる。

「光速でインストールすべし」と言う他人の言説は滅多に信用せず、放置さえする技術者失格、かつスーパー天邪鬼の俺がなぜこれを入れたか。それは id:scinfaxi の日記が1日分しか見ることを許していないのに半分カッとなったからである。

一度入れてしまうとその効果はてきめんに現れるもので、はてなばかりでなく常用しているサイトの多くが対応しているという siteinfo の濃さに感心するやら唖然とするやら。もう手放せない。

2009/02/11

INTP

http://www32.ocn.ne.jp/~emina/

性格診断テスト。俺はINTP型だそうだ。よく当たっている。
もうちょっとE型(外向的)に寄ったエンジニアになりたいものだ。最近そう思うようになった。

2009/02/09

Ethna 2.3.6 announced

http://ml.ethna.jp/pipermail/users/2009-February/001099.html

安定版ブランチに、開発版で直したバグのバックポートを取り込んでリリースした。

当初 2.3.x 系の安定版はもうメンテナンスしないつもりだったが、syachi5150さんの多次元配列を取り込むにあたって、ファイルアップロードのバグが見つかった。ただ、それも当初は安定版に取り込まないつもりだった。

だが、このエントリを見て、こんな間違ったコードが広まっているのは安定版のバグのためではないか? こんなコードが広まるのはメンテナとして絶対嫌だと思った。安定版も直しておいた方がいいのではないか? そう考えて急遽方針を転換し、コードを二日でバックポートした。

もう、2.3.x 系にはよほどのことがない限り手を入れないと思う。

How to File Upload with Ethna?

http://blog.cypher-works.com/?p=169

上記は Ethnaと組み合わせてファイルアップロードの処理を説明している。

だが、アップロードされた値を検証するのにくどくど長いコードが書いてあり、Ethnaのウリであるフォーム定義をまったく理解していないといわざるを得ない。

上記のような処理は、Ethna では、以下のようにすれば簡単にできる。コアは フォーム定義と、$this->af->validate() だ。

尚、以下のコードは安定版である 2.3.6 を前提にしている。
$ ethna add-project sample
$ cd sample
$ ethna add-action upload
$ ethna add-view -t upload

app/action/Upload.php を以下のように編集する
class Sample_Form_Upload extends Sample_ActionForm
{
/** @var bool バリデータにプラグインを使うフラグ */
var $use_validator_plugin = true;

var $form = array(
'sample' => array(
// ファイルアップロードのフォーム定義
// 複数アップロードしない場合は、'type' の array を外すこと
'type' => array(VAR_TYPE_FILE), // 入力値型
'form_type' => FORM_TYPE_FILE, // フォーム型
'name' => 'アップロードされるファイル', // 表示名

// バリデータ(記述順にバリデータが実行されます)
'required' => true, // 全てのアップロードが必須
'min' => '50', // 50KB「以上」のファイルが必要
'max' => '100', // 100KB「以下」のファイルが必要
),
);
}

class Sample_Action_Upload extends Sample_ActionClass
{
function prepare()
{
// フォーム定義に従ってアップロードしたファイルを検証
// エラーの場合は元の画面に戻り、エラーを表示する
// いちいち $this->af->get したものをループして全部確かめる
// 必要は全くない
if ($this->af->validate() > 0) {
return 'upload';
}
return null;
}

function perform()
{
// 検証済みのアップロードファイルの中身を取り出し、
// 一時ファイルに保存
$files = $this->af->get('sample');
$photo_ids = array();
foreach ($files as $idx => $file_info) {
// アップロードされている場合のみ、一時ファイルに保存
if ($file_info['error'] != UPLOAD_ERR_NO_FILE) {
$tmp_name = $file_info['tmp_name'];
$tmp_name_new = sha1($tmp_name);
// アップロードされたファイルを /tmp 以下に保存
// 別アクションで、$tmp_name_new を引数としてファイルを
// 見せるようにすれば、アップロードファイルの
// 確認画面も作ることができる
move_uploaded_file($tmp_name, '/tmp/' . $tmp_name_new);
$photo_ids[$idx]['new_tmp'] = $tmp_name_new;
}
}
// 保存したファイル名をフォームに設定する
// テンプレート側では、$form.sample で値が見える
$this->af->set('sample', $photo_ids);
}
}

template/ja/upload.tpl では、以下のようにする。{form_input} や {form} という Smartyタグは、Ethna組み込みの「フォームヘルパ」と呼ばれるもので、ethna_action で指定したフォーム定義にあわせて、入力フォームを自動で生成してくれる。この機能を知らなかった人は、マニュアルをよく読むこと!

ファイルアップロード用なので、{form} タグで、enctype="file" としているのに注意。

{if count($errors)} {* エラーで戻ってきた場合のメッセージ *}
{foreach from=$errors item=error}
{$error}
{/foreach}
{/if}
{* アップロードのフォーム *}
{form ethna_action="upload" enctype="file"}
{form_input name="sample"}
{form_input name="sample"}
{form_submit value="アップロード"}
{/form}


こうした上で、 index.php?action_upload=true にアクセスすれば、以下のような画面が見えるはずだ。50KB以上、100KB以下のファイルを全てアップロードしないとエラーになる。エラーが出なかったら、/tmp 以下にファイルが保存されているのを確認できるはず。


2009/02/06

C++ memo

以下のようなことはどのようなC++本にも書いてある。スルー推奨。
意識したとき(再認識したとき)に書き留めるのは「個人的に」重要なので書いておく。

----
  • クラスメンバとしてポインタを定義する場合は、コピーコンストラクタと operator= に注意
  • クラスメンバとしてポインタを定義する場合は、これらを暗黙のうちに定義させると、コピー元 が消えた際に、コピー先のポインタメンバの実体も消えてしまう。必ず意識し、定義すること
  • コンストラクタとデストラクタは比較的注意がいくが、この二つは見落とされがちである
----
  • (ポインタではない)実体として定義されたメンバは、そのメンバが含まれたクラスのコンストラクタが呼ばれるたびに初期化され、破棄される際に消える
  • 実体として定義すると、そのクラスのインスタンスのサイズが大きくなる。通常、クラスには他のオブジェクトもメンバとして含められるので、ポインタよりサイズが大きいから。
  • 実体として定義されたメンバは、そのメンバが含まれたクラスのインスタンスが生存している間存在する。よって、メンバ関数からその参照を返しても構わないが、そのインスタンスの生存期間は参照を使う側が意識する必要が出てくる

2009/02/03

Ethna DBLayer Discussion

http://ethna.jp/ethna-dblayer-discuss.html

Ethna ではUTF-8化と並ぶ大手術になりうる DBレイヤの変更。これまで変更に対して比較的保守的だった動きともあいまって、議論が比較的熱くなっている。

俺はこの議論が炎上するくらいで丁度いいと思っているので、このブログにもORMに関するエントリを書きまくって、火に油を注ぐつもりです。造詣がない部分なんて、補えばいいんです。チャレンジするのが技術者でしょう?(*゜ー゜)

2009/02/02

Happy Birthday id:[hkn|scinfaxi]!

id:hkn が企画した誕生日オフに参加してきた。
俺は事前に本人の欠席投票により、なぜかスケスケの服を着てこいと言われていた。

出席者は10人。俺はそのうちロリ系の服を着てくる人が二人いると事前に認識していた。ちょっくら遅れて(← 申し訳ない)会場に行くと確かに二人いたんだけど、そのうちのひとりが男だったのでびっくらこいた。この人物がテクニカルな面でも、それ以外の面でも一番面白い漢だったことは間違いない。lisp「コンパイラ」を書いているそうだ。しかしニート。不思議な人が世の中にはいる。タバコや性的倒錯の話でえらく盛り上がってしまった。

twitter や IRC で少ないながらも人々のつぶやきやURLを追いかけていると、それなりに注目する人が決まってくる。以前からの知り合いばかりでなく、そうやって眼をつけた人たちが多く出席していた。id:hayamiz さんや、id:Ubuntu さん、美女撮影会以来の lovalottaもじら組くみちょ。「ガキの使い」が縁で運命の出会いを果たした hasami さん、「中止ボタンがしいたけに見えて困る」 であまりにも有名な裸電球さん、サッカー大好き Makoto1987 さん、など。旧交を温める的な話をしたり、「おおーこれで俺はおまいに眼をつけたんだよ」的な話で盛り上がったりした。

最後に誕生日ケーキが出てきたんだけど、それなりの大きさだったのと、運ばれてきた時に鳴り響く大音量のバースデーソングに余計にびっくらこいた。写真がそのケーキである。いや、本当にめでたいことです。

----

それなりに年齢を重ねた人が「age++」なエントリをブログに書いているのを見ると、果たして素直に「おめでとう」と書いてよいのか迷うことがある。年齢を多く重ねるにつれ、思うところやその人に起こった出来事などから「本当にめでたいと本人が思っているのかどうか」がわからないことがあるからだ。

だけど、今日の主賓であった id:hknid:scinfaxi については、そんな心配は無用だ。彼らは十分に若く、心からおめでとうと言い、それを祝える会であった。屈託なく、心からそう言える間柄。そう思える場をこれからも持ちたいと思うし、維持したいと思う。

2009/02/01

mod_chxj

http://sourceforge.jp/projects/modchxj/
http://www.amazon.co.jp/Apache-Modules-Book-Application-Development/dp/0132409674

mod_chxj は、Cookie が効かない携帯、キャリアごとにバラバラなHTML、対応画像、絵文字等、たくさんのバッドノウハウを埋めるために開発された Apache module である。maru_cc がIRC でひょんなことから話題にしたことで知った。

・・・とはいえ俺は携帯向けコンテンツ開発に詳しい訳ではない。だが、それでも mod_chxj のソースコードは比較的綺麗で、どんなノウハウが詰まってるのか、という部分で、非常に良い学習材料になるから、敢えてここで取り上げた。

基本的には様々な携帯の capability を etc/device_data.xml に持っておいて、そこに定義されたルールと、ディレクティブに基づいて変換ルールを適用するという方法をとっている。Cookieのシミュレートについては、やはりといえばやはりOne time ID または固定ID を URLに埋め込むことで実現している。

絵文字データは etc/emoji.xml にある。こんなノウハウの塊がオープンになるなんて、いい時代に生まれたものだ。

----

閑話休題。mod_chxj は、Apache module の良いサンプルでもある。以下に当てはまる方は、是非お読みになってみると良いだろう。Apache module については、moriyoshi さんにも酔ってお勧めしたものだが、The Apache Modules Book が素晴らしい本である。
  • mod_[php|python|perl] なんて読んでられるか!
  • C言語が読める
  • 携帯コンテンツにも興味がある