過去記事

2008年 Feb月の過去記事

[Akelos] FormTagHelper::radio_button_tag でのバグ

Akelos|2008年 02月 27日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
Akelos 0.8 にて。

app/lib/AkActionView/helpers/form_tag_helper.php を使ってラジオボタンを出力する際に気をつけるべき点。


このPHPコードをviewに貼り付けると、

<?php echo $form_tag_helper->radio_button_tag('user[is_deleted]', 1, !$user->is_deleted ? true : false); ?>有効
<?php echo $form_tag_helper->radio_button_tag('user[is_deleted]', 0, $user->is_deleted ? true : false); ?>削除


実際に出力されるHTMLは次のようになる。

<input checked="checked" id="user[is_deleted]" name="user[is_deleted]" type="radio" />有効
<input id="user[is_deleted]" name="user[is_deleted]" type="radio" />


あら? inputタグの中にvalue属性が存在していない。

結論から言うと、これはAkelosのバグ。
修正箇所: app/lib/AkActionView/helper/tag_helper.php内_tag_options()関数


//if(empty($value) && !is_string($value)){
// continue;
//}
if(empty($value) && (!is_string($value) && !is_numeric($value))){
continue;
}



$form_tag_helper-> radio_button_tag の引数構成は以下の通り。
・第1引数:モデル[カラム]
・第2引数:submit値
・第3引数:HTMLオプション(単にtrue だとchecked、falseはcheckedなし)

第2引数で数字を指定すると、value値が書き出されない、というバグでした。



Yahoo! メール次世代版を使ってみた。

日記|2008年 02月 25日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
Yahoo! メールがあたらしくなったというので使ってみた。
http://promo.mail.yahoo.co.jp/newmail/
画像入りの紹介記事



感想はと言うと、「いまOutlook ExpressをWeb実現してどうするんだろう?」と素朴な疑問を持った。なんというか、Webアプリがデスクトップアプリを永遠に超えられないということをまざまざと見せつけられて残念な気がするのと、そこまでのWindowインターフェースは必要なのか?と不思議な気持ちだ。

個人的にはメーラーは完全にWebメールしか使用しておらず、Gmailを使い込みまくりなので、単にそのシンプルなインターフェースに慣れすぎて変な色眼鏡で見てしまっているだけなのかもしれない。



Gmailはけっこうパソコンを使い込んでいる人向けのインターフェースではあると思うので、まったく別のベクトルを持つYahooメール次世代版がどうなるかは興味深い。はたして新しいYahooメールがどれだけ「一般の人」からよい印象を受けるのかな。



新Yahoo!メール的なUIがWebアプリの一般的なUIとして認知されてしまうとしたら、今後開発側でかかってくる対UIリソースがけっこう膨らんでくる時代に突入するのだと思う。つまり、開発リソース的に機能>UI だったものが 機能<UI になる、と。これがふつうになってしまうと、とてもじゃないけどWebサービスを少人数で開発するのは難しくなってしまう。


一般的に、UIの開発は機能の開発よりも工数がかかる。
また、開発順序の依存性がそれほどないので、UIの開発は機能の開発よりも同時開発性能が高い。

ということは、優れたUIデザイナーがすでに存在するとした場合、いかに多くのUIエンジニアを束ねられるか、ということが今後の大きなポイントになってくる。そうすると、Web業界もさらに中国、インド、フィリピン、ベトナム、東ヨーロッパなどへのシフトが進むことになるだろう。


そんなとき、自分はどんなところでどんな行動をとればよいだろうか。

最近見たDVDや小説など。

最近見たDVDなどのメモ。




大声、ハイテンション、筋肉むきむき、槍でざくざく人が刺されるという体育会系映画。
原作はグラフィック・ノベルでベストセラーになったとのことですが、グラフィック・ノベルってどんなんかしら。実物見てみたい。ストーリーは戯曲風で単純。CGがすぎちゃってちょっと感情移入できず。あと、変な化け物がたくさん登場するんだけど、あれ、必要かなぁ? ところで、王妃役のレナ・ヘディがとてもきれいでした。





前2作に比べてテンポがあまりよくないので、あれ?と思う人が多いのでは。
あと、ちょっとウケねらいのシーンがあざとすぎて、これをおもしろい人と興ざめの人に別れてしまうかも。いやはや、エンターテインメントって難しいですねぇ。





軽い感じで楽しく読める本。
まぁ、僕は小山薫堂ファンなので、ひいき目です。おすすめ。この人といっしょに仕事してみたいなぁ。





これも気軽に読める小説。短編なので楽ちん。
くすりと笑って、気が少しだけ楽になるよい本でした。





上下巻あるわりに、さらりと読める。
前半部(上巻)は文章のテンポがあまりよくないので、あれーベストセラーのわりにはおもしろくないなぁと一瞬思ったが、後半(下巻)に突入して猛烈な文章のテンポで引き込む引き込む。前半と後半でこれだけテンポのちがう作品もめずらしい。いやはや、おもしろかった。

小説では中年男性だった主人公が、映画版では竹内結子になっているとのこと。これは英断。主人公が中年男性だったら映画見る気しない。小説を読むとき、竹内結子を想像しながら読んでもまったく違和感がなかった。





僕が唯一やるゲームがメタルギアシリーズ。

語りが長いとかストーリーが押しつけがましいとか衒学的とかよく言われますが、そうは言ってもこれだけのネタを脚本に交えるのは相当勉強しないと難しい。著者が対象分野を十二分に調査した小説にあまりはずれがないように(あたりも少ないけど)、メタルギアシリーズも基本的な水準がとても高い。ただ、そういう内容なだけに日本ではなくて海外の方でよく受け入れられる、というのもよくわかる。

そんなゲームを作っている小島さんがどんな考えを持っているのか、ということがわかるのかと思ったらただのブログをまとめただけの本でした。別にそこからなにかがあぶり出されてくるわけでもなかった。イマイチ。

[Akelos] 文字列の暗号化と復号、ランダム文字列の取得

Akelos|2008年 02月 20日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
Akelos にはデフォルトで地味に便利なメソッドがそろっています。
いくつかご紹介。


基本的にAk::メソッド名の形で呼べば基本的にどこからでも呼ぶことができます。

Ak::randomString($maxlength)
ランダム文字列を取得します。
$maxlengthは省略可能引数で、デフォルトは8です。

$inokey = Ak::randomString();
echo $inokey;

実行結果はこちら。(環境によって変わります)

UIMZvO2N



Ak::encrypt($str, $key)
文字列$strを$keyで暗号化します。

$inokey = Ak::randomString();
$inoki = "お支払いはゲンキンですかー";
$inoki_encrypted = Ak::encrypt($inoki, $inokey);
echo $inoki_encrypted;

実行結果はこちら。(環境によって変わります)

ArQAgVTRW7Vcn1SoAbFVjlaQVbEM11TVB7BUhlWvCedci1LgBOgIg1K2ArJShlWqA7MFgQngUbdVgAbyAbcNgQLOAONU2lvYXOhUhAHr




Ak::decrypt($str, $key)
文字列$strを$keyで復号します。

$inokey = Ak::randomString();
$inoki = "お支払いはゲンキンですかー";
$inoki_encrypted = Ak::encrypt($inoki, $inokey);
$inoki_decrypted = Ak::decrypt($inoki_encrypted, $inokey);
echo $inoki_decrypted;

実行結果はこちら。

お支払いはゲンキンですかー




Ak::blowfishEncrypt($str, $key)
文字列$strをPEAR::Crypt_Blowfishライブラリを使って、$keyで暗号化します。

$inokey = Ak::randomString();
$inoki = "お支払いはゲンキンですかー";
$inoki_b_crypted = base64_encode(Ak::blowfishEncrypt($inoki, $inokey));
echo $inoki_b_crypted;

実行結果はこちら。

5ARRBQgWnDRJdTy5SLS98A==




Ak::blowfishDecrypt($str, $key)
文字列$strをPEAR::Crypt_Blowfishライブラリを使って、$keyで復号します。

$inokey = Ak::randomString();
$inoki = "お支払いはゲンキンですかー";
$inoki_b_crypted = base64_encode(Ak::blowfishEncrypt($inoki, $inokey));
$inoki_b_decrypted = Ak::blowfishDecrypt(base64_decode($inoki_b_crypted), $inokey);
echo $inoki_b_decrypted;

実行結果はこちら。

お支払いはゲンキンですかー


【注意】
PEAR::Crypt_Blowfish は、$strと$keyが同じ文字列である場合に暗号化されないというバグ(なのかな)があるようです。これを使う場合は、$strには入り得ない記号を使用するなど必ず$keyが$strと一致しないように工夫する必要があります。

http://www.phppro.jp/qa/159


暗号化の強度については、上記はいずれもすごく強いというわけではなさそうです。ですので簡易的な用途にとどめた方がよいでしょう。より高度に暗号化する必要がある場合は、上記メソッドを多重的に使う工夫をしてみたり、あるいはより強度の高い別の暗号化システムを採用するとよいでしょう。


[Akelos] コントローラにfatal errorがあるとまっしろけ

Akelos|2008年 02月 16日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
コントローラ編集中にPHPのfatal error を出すことはよくありますね。
セミコロン忘れたとか、中カッコの数があってないとか。


AkelosではコントローラにPHP fatal errorが発生したとき、なんと画面にもPHPログ(/var/log/messagesとか)Akelos側のログにも(これは当たり前)なにもエラー情報が吐かれません。

これはおもいっきりバグみたいです。


自分でバグを追おうとしてみましたが、時間がなかったので断念。
ということで、本家に修正のお願いを投げておきました。


とりあえずは、開発中にまっしろけ画面になったら、あわてずさわがず次のことを試すこと。

1. コマンドラインから次のようにPHPのsyntax errorの存在を試す。

$ php -l {いままで編集していたファイル名}


2. app/config/config.php で次の定義を行い、app/log/development.log の中身をチェックする。

define('AK_LOG_EVENTS', true);
define('AK_ERROR_REPORTING', E_ALL );



いきなり画面がまっしろになるとびびっちゃってやる気がゼロになりがちですが、コマンドラインでのsyntax errorチェックはばっちり効くので、めげずに開発を続けてくださいな。


あ、ちなみに、モデルやライブラリ、ビューなど、コントローラ以外の部分ではきちんとfatal errorは画面表示もPHPログ出力もされます。



2008.02.17追記
さっそく修正していただきました。
最新のtrunkバージョンでは修正されています。
http://trac.akelos.org/ticket/119

いやはや対応も速くてありがたいですね。

バグも勝手に直さず、どんどん報告した方がいいかも。

ものづくりの手法がかわるとき

日記|2008年 02月 15日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
最近はめっきりプログラミングの話題だらけ。
読む人によってはつまらん話題が続いてすんませんね。

ほんとはブログを分けて書くか、新しいサイトの方に書いていくべきなんですが、あっちゃこっちゃ書くのは苦手で、とりあえず書き込み先をこのブログにしちゃってるわけで。書き込みがたまってきたら、随時書き込みを移していくので少々お待ちのほどを。



こういう話題が続いているのは、「ソフトウェアの作り方やあり方が、これまで知っている自分のやり方から大きく変わろうとしている」という危機感を猛烈に感じているため。

これ、すごく深刻で重要な問題なんです。自分の中で。


トヨタが最高益を更新している要因に、車のプラットフォームの種類を絞って、「抽象化」「共通化」を推し進めた結果があると聞きます。簡単に言えば、高度に抽象化された同じ骨組みから、いろんな車を作る、ということ。

これまであるような抽象化だとどうしても車の種類ごとの微調整に対応できず、結果として骨組みの種類が増えてしまっているのが通常でした。これを、多段的に抽象化させていく仕組みを確立することで、同じパーツを使用でき、同じ組み立て工程を行うことができるフェーズを増やしていくようにした結果が、いま行われている「プラットフォームの共通化」ということなんですね。(単に同じような車を他種類製造しているだけという批判もありますが、その批判で片付けられるような話でもないと思います。)

もちろんこれによるデメリットも。それは、プラットフォームそのものに不具合があった場合の影響力が大きいということ。トヨタのリコールに関わる台数が常に何十万台という規模となるので、この辺は明らかですね。



さてさて、Webアプリケーション作りにおいてもその波は顕著になってきてまして。
Rails登場以降、アプリケーションを「どう効率的に作るか」の部分がすごく進化していると感じています。

実際、最近のサービスは企画からリリースまでのスピードがきわめて速いですね。ニコニコ動画やモバゲーなんかはその具体例。そして、「完成度の高いものをすぐに作れること」がそのままサービスや企業の勢いやビジネス的な成功に直結しています。「ぱっと思いついてさっと作る」ということが、とても重要ということですね。



この、「ぱっと思いついてさっと作る」ということ。
実はけっこうセンスが必要だったりします。苦もなく作れる人はどんどん作れるし、一度考え込んでしまう人は、たぶん、ずっと作れない。これはまさに「身軽さの格差社会やー」(彦麻呂)


で、なぜ「身軽かどうか」で差が出てしまうかを考えてみたところ、結局「効率的に作ることが身に染みているかどうか」の差だ、ということになります。効率的に仕事をすることを学んだ人と、効率的に仕事をすることが身体の奥底に染みついている人の差、ということですね。これ、違いは少ないようで、とても大きい。前者は考えようとしなければ効率よくできないのに比べて、後者は(そもそも面倒なことだから)自然と効率よく仕事を進めることができる、という決定的な差があります。


経営者がものづくりの本質を理解していない場合、えてしてどうしようもないものを作りがちです。気合いだけでは優れた製品やサービスはできないのに、いまだに「寝ないでがんばれ」とか言ってしまうようなリーダー。いままでは根性論でプロダクトが作れたかもしれませんが、今後10年、ソフトウェア業界には「どう作ったか」によって業績が変わる時代がきっとくるでしょう。(もう来ているかも)



自分は、近い未来、非常に優れた人たちといっしょに仕事をしたいと考えています。

そのとき、そういう優れた人たちと同じ温度で、同じレベルの高さで会話ができなくちゃいけない。それにはまず、自分自身が高いレベルでのものづくりの本質を身体に染みつかせる必要があります。それにはまず自分で美しいものづくりをする必要があるだろう、と。

そんなわけで、最近は自分のものづくりに没頭する毎日でございます。

[Akelos] セッションの使い方メモ。

Akelos|2008年 02月 13日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
Akelos 0.8 でのセッションの使い方についてのメモ。


DBベースのセッション管理と、ファイルベースのセッション管理の2種類の方法がある。

app/config/config.php に下記のようにセットするとDBベースのセッション管理になり、

define('AK_SESSION_HANDLER', 1);

下記のようにセット、または、定数をconfig.phpに定義しない場合はファイルベースのセッション管理になる。

define('AK_SESSION_HANDLER', 0);



続きはこちら

[Akelos] $form_options_helper->select() のバグ

Akelos|2008年 02月 12日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
Akelos0.8 で、ヘルパメソッド $form_options_helper->select() にバグがあった。
(ハマった。。。)


■前提
都道府県をセレクトメニューで表示させて、選択するというありがちなモノ。
入力値はセッションに格納しておいて、一度別の画面に遷移したあとで戻ってきたら入力値がデフォルトで選択されているようにしたい。


■内容
下記のようなコードがあるとする。

<dt>_{都道府県}</dt>
<dd><?php echo $form_options_helper->select('user', 'state_id', $State->collect($State->find(), 'name', 'id'), array('selected' => $session['user']['state_id']), array('prompt' => '---')); ?></dd>


$form_options_helper->select() のパラメータ構成は以下の通り。

 ・第1引数:モデル名
 ・第2引数:カラム名
 ・第3引数:選択肢配列
 ・第4引数:array('selected' => 値) で選択済み値を指定可能
 ・第5引数:HTMLオプション。array('prompt' => '---') を指定すると、選択肢の一番最初を"---"という文字列にしてくれる。


■現象
第4引数に正しく array('selected' => '13') などの値を指定したが、はき出されるHTMLタグが以下のようになる。


...(中略)...
<option value="10" selected="13">群馬県</option>
<option value="11" selected="13">埼玉県</option>
<option value="12" selected="13">千葉県</option>
<option value="13" selected="selected">東京都</option>
<option value="14" selected="13">神奈川県</option>
<option value="15" selected="13">新潟県</option>
...(中略)...


ということで、あきらかに初期化忘れっぽい感じだ。


■修正
修正ソースは lib/AkActionView/helpers/form_options_helper.php の options_for_select() 内

$options_for_select .= TagHelper::content_tag('option',$text_is_value ? $value : $text,
array_merge($options, ($compare_captions ?
(isset($selected[$text]) && $selected[$text] == $value) :
in_array($value, $selected)) ? array('value'=>$value,'selected'=>'selected') : array('value'=>$value))
)."\n";



$options_for_select .= TagHelper::content_tag('option',$text_is_value ? $value : $text,
array_merge($options, ($compare_captions ?
(isset($selected[$text]) && $selected[$text] == $value) :
in_array($value, $selected)) ? array('value'=>$value,'selected'=>'selected') : array('value'=>$value,'selected'=>NULL))
)."\n";

に変更する。


[2008/06/05 追記] ※注意
ソースコードを読み違えていました。
間違った情報を書いてしまって大変申し訳ないです。

フレームワーク側のソースコードを編集しなくても、$form_options_helper->select() の呼び出し方を下記のようにすることで解決できることが判明しましたので、訂正します。


$form_options_helper->select() を呼び出す際、


<dt>_{都道府県}</dt>
<dd><?php echo $form_options_helper->select('user', 'state_id', $State->collect($State->find(), 'name', 'id'), array('selected' => array($session['user']['state_id'])), array('prompt' => '---')); ?></dd>

のように、

array('selected' => array(値))

値をarray()で囲めばOK。
これで正しく表示されます。

生者と死者と陽気な神様

日記|2008年 02月 10日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
わくラボPandaさんに誘われて、不思議におしゃれな青山の葬儀屋さんのギャラリーで開催されているシーサー展に行ってきた。


ここしばらくアートなんてまるで触れる機会がなかったのだけど、いやはや、エネルギーあふれる作品がたくさんあってなんだかすごくよかった。刺激になった。

シーサーというのは沖縄の護り神様。なんともユニークでとても陽気な顔をしている。
http://tensaimitsuo.kirisute-gomen.com/0_3gall00.htm

生気にあふれていて、ユーモラスで、弱そうで、強そうで、派手で、鼻の穴がデカイ。
親しみやすくて、明るくて、優しくて、エネルギッシュで、声がでかそうだ。
そして、大川栄策に似ている。

いま自分が抱える悩みなんて、なんと小さいことかと笑い飛ばしてくれそうな、そんな感じ。


聞けば、沖縄ではもともと火葬の習慣がなかったらしい。
死んだら大きめのお墓にそのまんま土葬して、白骨化するまでしばらく待つ。
白骨化してきたら骨を取り出して、洗って、骨壺に入れて祀る、というものだったとのこと。
(※現在は火葬)

死者と生者がこれだけ近くにいる、という世界観がとても新鮮だった。

一度埋めて、取り出して、洗う。
この「洗う」という行為は、生と死の境界をまたぎ、先祖と自己の存在を再定義する。洗う生者は自己のルーツを確認できて、洗われる死者は死んでも自分が孤独ではないこと(生の世界とつながること)を再確認できる。

沖縄で舞踊や歌などの芸能が根付いているのも、こうした世界観があることときっと関係あるんだろうな。舞踊も歌も、もともと生と死の境界にあるチャネルをつないで、どちらの人たちもさみしくないように楽しむ行為だもんね。

[Akelos] link_to_remote の使い方

Akelos|2008年 02月 08日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
Akelos 0.8 にて、Akelos APIリファレンスのサンプルの表記が間違っていた。
ので、AJAXを動作させるのにちょっとハマった。


まずは動作させる正解を。

【前提】
http://example.com/sample/index がメインアプリとする。
このviewに <div id="result"></div> というタグを用意しておく。
このアプリがAJAXによる非同期通信で http://example.com/sample/remote を実行し、実行結果の文字列を受け取り、<div id="result"></div> の中に表示させる。


まずは、layoutファイルでprototype.jsを読み込ませておく。

【app/views/layout/sample.tpl】
〜タグの間に下記のコードを追加する。

<?php echo $asset_tag_helper->javascript_include_tag('defaults'); ?>


これを追加すると、実際のページでは以下のコードが自動的に付加される。

<script src="/projectname/public/javascripts/prototype.js" type="text/javascript"></script>
<script src="/projectname/public/javascripts/event_selectors.js" type="text/javascript"></script>
<script src="/projectname/public/javascripts/scriptaculous.js" type="text/javascript"></script>



次に、メインアプリであるsample/index の viewファイルに非同期通信で実行させるためのコードを書く。

【app/views/sample/index.tpl】

<?php echo $prototype_helper->link_to_remote('非同期通信実行', array('url' => array('action' => 'remote'), 'update' => 'result')); ?>
<div id="result"></div>



さて、コントローラ側。非同期通信先で実行されるメソッドを書こう。

【app/controllers/sample_controller.php】

function remote()
{
$this->renderText('リモート先ですよ。');
}


コントローラが書けたら、リモート先で実行されるはずのURLを先にブラウザでチェックしておこう。上記の例で言えば、

http://example.com/sample/remote

にブラウザでアクセスしたとき、「リモート先ですよ。」とだけ表示されればOK。

http://example.com/sample/index にアクセスして、「非同期通信実行」リンクをクリックしてみよう。<div id="result"></div> の中に「リモート先ですよ。」という文字列が表示されれば、無事にAJAXの利用が成功。



APIリファレンスのサンプルは間違っているポイントは下記の通り。

Examples: $prototype_helper->link_to_remote('Delete this post', array('url' => array('action' => 'destroy', 'id' => $_POST['id']), array('update' => 'posts'));

まず、開きカッコ「(」と閉じカッコ「)」の数が合わない。
また、上記のサンプルでは 'update' のところを array で囲む必要がない。
ということで、上記サンプルは下記が正解。

Examples: $prototype_helper->link_to_remote('Delete this post', array('url' => array('action' => 'destroy', 'id' => $_POST['id']), 'update' => 'posts'));



また、非同期通信が成功した場合、失敗した場合で表記を切り替える場合のサンプルが

Example: $prototype_helper->link_to_remote('Delete this post', array('url' => array('action' => 'destroy', 'id' => $_POST['id']), array('update' => array('success' => 'posts', 'failure' => 'error');

とかかれているが、これも下記が正解。

Example: $prototype_helper->link_to_remote('Delete this post', array('url' => array('action' => 'destroy', 'id' => $_POST['id']), 'update' => array('success' => 'posts', 'failure' => 'error')));


まあ、rubyとちがっていちいち array() と書かなくちゃいけないので、ぱっと見た感じ確かに紛らわしいけど。

「売り込まれる恐怖」と「気づかれない恐怖」

日記|2008年 02月 07日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
「2つの恐怖」を与えない [NBOnline]


このロジックをぜひeコマース側にも適用させたいのでメモ。
はてさて、具体的な施策はどんなものがあるかな。



[Akelos] PHPのADODBデータディレクトリ構文

Akelos|2008年 02月 07日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
AkelosのマイグレーションにはADODBデータディレクトリ構文というやつが使えます。

要するにCREATEとかUPDATEとかを行うときに、SQL文自体を抽象化しちゃうので、いろんなDBで使えるSQL文を自動生成しまっせというやつです。

で、ADODBデータディレクトリの解説がこちら(英文)


自分用に日本語で書いたものがこちら
よかったら参考にしてみてください。

[Akelos] マイグレーションでTEXT型にはNOTNULLがつかない

Akelos|2008年 02月 07日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
テーブルを作成するファイルでちょっとおかしな挙動があったのでメモ。


こんなファイルを作るとする。
app/installers/user_installer.php

class UserInstaller extends AkInstaller
{
function up_1()
{
$this->createTable('users', "
id,
name C(255) NOTNULL,
description X NOTNULL,
created_at T NOTNULL,
updated_at
");
}

function down_1()
{
$this->dropTable('users');
}
}
?>


上記の「X」とは、テキスト型のカラムを作りたいときに使用する識別子。
だが、これを実行したとき、実際のテーブルの description には NOTNULL属性がつかない。


mysql> desc users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| description | text | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+


なぜかを調べてみると、vender/adodb/adodb-datadict.inc.php で、NOTNULL を強制的に削除していた。

551行目付近

if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls


これを


if ($ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls


のようにしてしまえば、NOTNULLが削除されることはない。

でも、フレームワーク元のソースをいじりたくないよ、という場合は、user_installer.php には次のように書くようにする。こちらの方がおすすめ。

app/installers/user_installer.php

class UserInstaller extends AkInstaller
{
function up_1()
{
$this->createTable('users', "
id,
name C(255) NOTNULL,
description TEXT NOTNULL,
created_at T NOTNULL,
updated_at
");
}

function down_1()
{
$this->dropTable('users');
}
}
?>



PHPフレームワーク CodeIgniter を調べてみた

日記|2008年 02月 06日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
Akelos に煮詰まったので、半分本気、半分気分転換に他のPHPフレームワークを調べてみた。
CodeIgniter
CodeIgniter Users Group in Japan


非公式ながら、ほぼ完璧な日本語のユーザマニュアルがある。
CodeIgniter ユーザガイド 日本語版 Version 1.5.4


特徴は以下の通り。

・フレームワークにありがちな、あまり使わない機能が削がれている
・フレームワークにありがちな、よく使う機能もけっこう削がれている。
・だから、ステップ数が他のPHPフレームワークと比べて格段に少ない。
・だから、実行速度が速い。(ベンチマークはこちら
・フレームワーク自体が複雑なことをしようとしていないので、潜在バグの深刻さも小さい。(たぶん)
・マニュアルがかなり読みやすく、取っつきやすい。
・cakePHPには名前のインパクトには負ける。
・ZendFramework には格式の高さで負ける。
・MVCというよりは、VCだ。モデルはあくまでもおまけ的。
・PHPがそもそもテンプレート的なんだからテンプレートエンジンいらない、と考えているふしあり。(だから速い、と)
・でも、簡単な変数置き換えの簡易テンプレートはデフォルトでついてるし、Smartyとの連携もできる。

といった印象。
ver.3時代のMySQLを思い起こさせるような潔さ。

でも、PHPの言語特性を考えると、無理してMVCするより、チャカチャカっと作ったほうが早くね? という思想で突っ走ってる、という感じですね。

こういう考え方、とても好きです。
なぜなら、Webアプリの賞味期限はおいしく食べれて3年、もって5年だから。
経験上、5年もすると全部作り替える必要が出てくるくらい、いろんなところにガタがくるものです。



AJAXとの連携はデフォルトでは含まれていないけれど、下記のような形でAJAXを組み込むこともできる。
Code IgniterとxajaxのPHPでの組み合わせ(・∀・)イイ!! [ぎじゅっやさん]



もちろん欠点もある。

・モデルがおまけ的で、ほとんどモデル的な意味合いが薄い。
・モデルは単純にDBアクセス系の関数を集めた手続き的ライブラリの役割しか持たない。
・バリデーションはモデルではなく、コントローラ側で行う。
・だから、実際にソースを書いてみると、コントローラのソースが(かなり)膨らむ。
・セキュリティのためという理由で、デフォルトでGET引数を消し去るというものすごい設計(設定でGETも使えるようになりますが)
・セキュリティに強いと強調しているが、ライブラリ中で使用されているhtmlspecialchars()で、第2引数にENT_QUOTESが指定されていない。
・デフォルトのバリデーション機能が弱い。一次配列しかチェックできないので、下記のように配列の形で取得したいような場合は、バリデーションを自前で拡張する必要がある。


<input type="text" name="user[name]" />


・ちなみに、チェックできる形式はこんな感じ。$_POST['name'] という一次配列ね。

<input type="text" name="name" />



結論としては、今回のプロジェクトでは見送るものの、スピードが重視されてそれほど規模の大きくないプロジェクトではかなり威力を発揮しそう。習得もすごく簡単なので、フレームワークになれていない人やそれほどプログラマプログラマしていない人でもなじめると思います。

WebDAVがすごく重い

日記|2008年 02月 05日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
外出先からもセキュアに会社ファイルへアクセスできるように構築したWebDAV。
だが、これ、実際に試してみると非常に重い。
重すぎて実用には耐えられんです。ハイ。

Apacheで作るファイルサーバ(WebDAV over SSL編) [@IT]


MacのFinder経由でもWinのネットワークフォルダでも重い。
WebDAV用クライアントを使えばそれなりの速度だけど、それならWinSCP(Win用)とかCyberDuck(Mac用)とかでSFTP接続すればすむ話。これじゃWebDAVまったく使う必要ないじゃんか。


クライアント側に特別なソフトをインストール必要なしでファイルサーバ、しかもセキュアにやりとりできるっすよ、というふれこみだけど、なんだかとっても中途半端な仕様だよ、というお話でした。

オバマし

日記|2008年 02月 04日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
福井県に小浜(おばま)市がある。

というわけで。

もしもバラック・オバマが小浜市長になったら


日本初のアフリカ系市長。
呼ばれ方は「オバマ小浜市長」か「小浜市のオバマ市長」
もしくは単に「オバマ市長」


なるほど。



オバマ氏の出身地が福井県小浜市だというのは本当ですか? [Yahoo! 知恵袋]

なんと高校時代まで同級生だった人が。

本当です。僕と同じ町内の生まれで、高校まで同期でした。

すごいな。うらやましい。



沖縄オバマ島出身という説も。

いやあの日焼け具合からして沖縄県の小浜島出身でしょう。




オバマ市の人かな。
もうすぐ、オバマ氏が大統領になりそうですが、 福井県小浜市としては何かアクショ... [Yahoo! 知恵袋]
やはり、オバマ氏はオバマ市出身らしい。



小浜温泉(長崎・雲仙市)と小浜市(福井県)の「オバマ」キャンペーンを調査(その1) [ohmynews]


ただ、2006年の来日時、オバマ氏が成田空港で「『福井県 オバマ』から来た」というジョークを言ったという放映が、テレビでありました。このことから、小浜市の宣伝に1役買っていただいたということで、お礼を出させていただいた


なるほど。本人もそんなことを言ってたのね。


オバマさんが勝って、福井県に凱旋したらおもしろいなぁ。

pythonが気になる

日記|2008年 02月 03日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
開発環境の再構築中、Tracのソースをちょっと追いかける必要があってpythonソースを初めてみてみた。

rubyより好きかもしれない。

rubyはプログラミングの試行錯誤を楽しむ言語、pythonは目的を早く実現させるための言語、という印象。ビジネスの種をポコポコ生み出したい自分にとっては、ひょっとしたらpythonの方がしっくりくるかな、と思った。



1冊本を読んでみようかな。

TBS「エジソンの母」がおもしろい

日記|2008年 02月 02日|固定リンクコメント(0) このエントリーを含むlivedoorクリップ このエントリーを含むはてなブックマーク del.icio.usへブックマーク Yahoo!ブックマークに登録
たまたまつけた第一話がとてもおもしろかった。
エジソンの母


すばらしいところをいくつか。

・主人公の子役がすばらしい
・お話はベッタベタ。でもベタベタな話を開き直って作っている姿勢がすばらしい。
・話の作り方や表現方法、脚本など、主に裏方さんの仕事ぶりがすばらしい。
・子役以外の役者がほぼ全員ヘタ(あるいはヘタに見せている)感じがすばらしい。(これによって主人公の子役がより光る)
・悪役の杉田かおるがはまり役。
・主題歌が非常にすばらしい。


これ見続けよう。