<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-957690751924967735</id><updated>2012-02-06T11:17:13.650+09:00</updated><category term='雑記'/><category term='PHP'/><category term='Web/CMS/etc.'/><category term='SQL'/><category term='JavaScript'/><category term='会社業務'/><category term='Cena'/><title type='text'>仕事SPOT</title><subtitle type='html'>WorkSpot.JP （ワークスポット･ジェーピー）のブログ。&lt;br&gt;
仕事･技術･その他の雑記。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>99</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5245033811131152387</id><published>2012-02-03T22:02:00.002+09:00</published><updated>2012-02-03T22:40:46.581+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>AmidaMVC：設計方針を決める</title><content type='html'>さてコントローラーのアミダ式チェーンが出来たので、&lt;br /&gt;
今度は中身のフレームワーク。&lt;br /&gt;
&lt;br /&gt;
HTTPのリクエストはコントローラーが受け取り、&lt;br /&gt;
コンポーネントを次々と実行する。&lt;br /&gt;
&lt;br /&gt;
で、コンポーネントで何をするか？&lt;br /&gt;
まずは、&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;リクエストから読み込むファイルを探して、&lt;/li&gt;
&lt;li&gt;ファイルを読み込んで、&lt;/li&gt;
&lt;li&gt;テンプレートに流し込んで、出力。&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
これが最低必要な流れでしょう。&lt;/div&gt;
&lt;div&gt;
それぞれ、Router、Loader、そしてRenderという名前のコンポーネントを開発することにしました。&lt;/div&gt;
&lt;div&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;試してませんが、今でもこの３つのコンポーネントだけで動くんじゃないかな？&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;Router&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
コントローラーからpath_infoを読み込む。&lt;/div&gt;
&lt;div&gt;
単純に最後のパスがファイル名で、残りがフォルダー名。&lt;/div&gt;
&lt;div&gt;
で、探し出せればLoaderにファイル情報を渡す。&amp;nbsp;&lt;/div&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;今はルートマップから探索できるようになりました。どちらの方法でもファイルが見つから無ければPageNotFoundにアクションを変更。&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;Loader&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ファイル情報からファイルの中身を読み込む。&lt;/div&gt;
&lt;div&gt;
拡張子から中身の種別を判断（HTML、markdown、テキスト、PHPのソースコード）したうえで読み込む。&lt;/div&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;PageNotFoundの場合は、前もって決めておいたファイルを読み込む。最初、ファイルはLoader内に直書きしてたが、今は設定コンポーネント（Config）で設定するよう変更済み。ファイルが正常に読み込めれば、アクションをデフォルトに戻してRenderに処理を渡す。&lt;/span&gt;&lt;/blockquote&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;Render&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
中身の種別により、マークダウンならHTMLに、テキストならnl2brとhtmlspecialcharsをかけて、PHPならソースコードハイライトして、と前処理を行う。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
それから中身のデータをテンプレートに流し込む。&lt;/div&gt;
&lt;div&gt;
とにかく簡単に。単なるPHPをインクルードするだけ。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆$siteObj&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
コンポーネントで色んなデータを扱う必要があるので、必要な情報は全部このオブジェクトにぶち込んで、コンポーネント間で持ち回します。デザインパターンで言えばData Transfer Objectですな。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
◆Toolsフォルダー&lt;br /&gt;
&lt;br /&gt;
コンポーネントが行う実際の処理はここに書く。&lt;br /&gt;
コンポーネントは、処理を行うルーチンを呼び出すのが仕事。&lt;br /&gt;
&lt;br /&gt;
こういう汎用的なルーチンは再発明しても仕方ないので、出来るだけ自分で書かないのが方針。実際、『&lt;a href="http://www.amazon.co.jp/dp/4774144371"&gt;パーフェクトPHP&lt;/a&gt;』のフレームワークの章から、ほとんどのコードを書き写しました。とても参考になったいい本だと思います。&lt;br /&gt;
&lt;br /&gt;
理想はsymfonyなどのフレームワークのライブラリを再利用できるといいな。&lt;br /&gt;
&lt;br /&gt;
◆以上、簡潔に方針をまとめると&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
・コントローラーは単純に、&lt;br /&gt;
・コンポーネントは薄く、&lt;br /&gt;
・ツールは汎用的かつコピペで書く、&lt;br /&gt;
のが開発方針です。&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5245033811131152387?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5245033811131152387/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5245033811131152387' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5245033811131152387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5245033811131152387'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/02/amidamvc.html' title='AmidaMVC：設計方針を決める'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3570953574099036847</id><published>2012-02-02T21:20:00.000+09:00</published><updated>2012-02-02T21:20:12.521+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>AmidaMVC：Amida式チェーンを思いついた流れ</title><content type='html'>何故Amidaなんてチェーンを思いついたか？&lt;br /&gt;
&lt;br /&gt;
昔作った簡単なページコントローラーがあったけど、&lt;br /&gt;
コードが汚くて使いづらくて。&lt;br /&gt;
&lt;br /&gt;
つい書き直し始めたのが始まりだった･･･&lt;br /&gt;
&lt;br /&gt;
最初は入力の値によって、決まった関数を呼び出すだけ。&lt;br /&gt;
次に、ひとつのクラス内のメソードを呼び出すようにしてみた。&lt;br /&gt;
&lt;br /&gt;
ふむ。簡単すぎるぐらいの改造。&lt;br /&gt;
&lt;br /&gt;
それではと、複数のクラスを登録して、&lt;br /&gt;
次のクラスを呼び出せるようにしてみた。&lt;br /&gt;
&lt;br /&gt;
何か面白いぞ。&lt;br /&gt;
&lt;br /&gt;
じゃぁ、デフォルトで次のクラスに進んでみよう。&lt;br /&gt;
お～、いい感じ。&lt;br /&gt;
&lt;br /&gt;
おや？MVCフレームワークにちょうどいいんじゃない&lt;br /&gt;
&lt;br /&gt;
じゃ作ってみようか。&lt;br /&gt;
&lt;br /&gt;
作ってみた　←　いまここ。&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3570953574099036847?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3570953574099036847/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3570953574099036847' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3570953574099036847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3570953574099036847'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/02/amidamvcamida.html' title='AmidaMVC：Amida式チェーンを思いついた流れ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5801179010328737497</id><published>2012-02-02T18:10:00.001+09:00</published><updated>2012-02-02T18:10:26.463+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Windows 7 買ってVirtualPCでXPを立ち上げてみる</title><content type='html'>もう10年前のデスクトップが未だに必要なのはXPで納入したお客さんのサポートのため。今回こそは廃棄に回せるようWindows 7 Professionalの入ったノートブックを購入した。&lt;br /&gt;&lt;br /&gt;◆まずは作業開始&lt;br /&gt;&lt;br /&gt;ノートブックが来て最初にしたのは&lt;br /&gt;avastというフリーのウィルス対策ソフト。&lt;br /&gt;気が利いてることに一緒にChromeをインストールをしてくれる。&lt;br /&gt;&lt;br /&gt;それからOSのアップデート。&lt;br /&gt;半日近くかかったがダウンロードして再起動。&lt;br /&gt;それを２～３回繰り返したら最新の状態になったようだ。&lt;br /&gt;&lt;br /&gt;◆Virtual PC/XP Modeのインストール&lt;br /&gt;&lt;br /&gt;スタート→全てのプログラム→Windows Virtual PCの&lt;br /&gt;Windwos XP Modeをクリックすると&lt;a href="http://www.microsoft.com/windows/virtual-pc/download.aspx"&gt;Microsoftのページ&lt;/a&gt;が立ち上がる。&lt;br /&gt;&lt;br /&gt;そこからXP Modeをダウンロードするんだけど、&lt;br /&gt;RunしてOpenして･･･&lt;br /&gt;どうにも動かない。&lt;br /&gt;&lt;br /&gt;そうだ、Chromeだからだ。&lt;br /&gt;IEで同じURLにアクセスしたら、なるほど、こういう意味だったのか。&lt;br /&gt;&lt;br /&gt;Windows XP Modeをダウンロードして実行して、&lt;br /&gt;しばらくするとXPが立ち上がった。パスワードを設定して･･･&lt;br /&gt;&lt;br /&gt;あれ？Virtual PCはダウンロードしなくても動くようだ。&lt;br /&gt;&lt;br /&gt;◆ファイルの共有のセットアップ&lt;br /&gt;&lt;br /&gt;XPのコントロールパネルから&lt;br /&gt;ネットワークセットアップウィザードを立ち上げて設定。&lt;br /&gt;懐かしいねぇ。最初に見たときはすごいと思ったけど、今見ると面倒なだけ。OSも進歩している。&lt;br /&gt;&lt;br /&gt;が、ファイルを共有してくれない。&lt;br /&gt;XPの設定を色々いじくったけど、駄目だ。&lt;br /&gt;&lt;br /&gt;これは&lt;a href="http://mbsupport.dip.jp/watson/network_06.htm"&gt;ホスト側のネットワークの設定を変更&lt;/a&gt;することで解決。&lt;br /&gt;デフォルトでは「共有ネットワーク（NAT）」になっているので、&lt;br /&gt;ここにホストPCのLANカードを指定して動きました。&lt;br /&gt;&lt;br /&gt;◆ホストPCとのファイル共有が遅い&lt;br /&gt;&lt;br /&gt;ホストPCからネットワークを開いて、VirtualXPの共有フォルダーへ、30MBほどのファイルをコピー。時間が30分とでた。何これ。遅い。&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://kawae.dyndns.org/xt/modules/d3blog/details.php?bid=182"&gt;原因と対策はここに一緒&lt;/a&gt;に書いてありました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
しかし。&lt;/div&gt;
&lt;div&gt;
面倒だ。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
別のPCからVirtualXPの共有フォルダーへコピーしたら、&lt;/div&gt;
&lt;div&gt;
早い。問題なし。&lt;br /&gt;&lt;br /&gt;これなら使えそうだ。&lt;br /&gt;&lt;br /&gt;何とかなりそうです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5801179010328737497?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5801179010328737497/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5801179010328737497' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5801179010328737497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5801179010328737497'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/02/windows-7-virtualpcxp.html' title='Windows 7 買ってVirtualPCでXPを立ち上げてみる'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4748692001927087027</id><published>2012-02-02T11:25:00.001+09:00</published><updated>2012-02-02T11:37:17.927+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>AmidaMVC：アミダ式チェーンとChain of Responsibilityパターン</title><content type='html'>Amida式Chainのコードです。&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;function dispatch( $action, &amp;amp;$data=NULL ) {
    // set current action.
    $return = NULL;
    $this-&amp;gt;_dispatchAct = $action;
    $this-&amp;gt;setAction( $action );
    $this-&amp;gt;fireStart();
    // -----------------------------
    // chain of responsibility loop.
    while( $this-&amp;gt;moreModels() )     {
        $this-&amp;gt;fireDispatch();
        $action = $this-&amp;gt;getAction();
        $return = $this-&amp;gt;execAction( $action, $data, $return );
        if( $this-&amp;gt;useNextComponent() ) {
            // go to next component. 
            $this-&amp;gt;nextComponent();
        }
        else {
            $this-&amp;gt;useNextComponent( TRUE ); // reset to TRUE. 
        }
    }
    // -----------------------------
    return $return;
}


&lt;/pre&gt;
内部に$this-&amp;gt;_componentsという配列にコンポーネントを登録しておいてwhile文でループしているだけです。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;コンポーネントの扱い&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
nextComponent()でarray_sliceをして、&lt;br /&gt;
次のコンポーネントに進みます。つまり、後へは戻れません。&lt;br /&gt;
&lt;br /&gt;
ただしコンポーネント内で別のコンポーネントを登録できます。&lt;br /&gt;
例：prependComponent( 'appHello',  'app' );
&lt;br /&gt;
&lt;br /&gt;
これで自分自身の次に実行するコンポーネントを追加します。&lt;br /&gt;
その他、チェーンの最後に追加する、チェーンを終了するする、指定したコンポーネントまでスキップする、などが出来ます（まだAPIで全てに対応はしてませんが）。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;アクションの扱い&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
$actionはコンポーネント内で必要に応じて変更されます。それ以外は変わらず同じアクション（つまり同じ名前のメソード）を呼び続けます。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Chain of Responsibilityパターン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Amida式チェーンは、Chain of Responsibility (CoR)パターンの一種だと思ってます。&lt;a href="http://ja.wikipedia.org/wiki/Chain_of_Responsibility_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3"&gt;WikipediaでのCoRのページ&lt;/a&gt;を見てもよく分かりません。&lt;br /&gt;
&lt;br /&gt;
自分の理解では、何かを達成するのに複数のオブジェクトを使う、複数のオブジェクトを使うためにAPIを共通にする、そして実行するオブジェクトの順番を適宜変更できるようにする、というパターンだと思ってます。&lt;br /&gt;
&lt;br /&gt;
なのでCoRの実装方法はいろいろあると思います。&lt;br /&gt;
多分、LithiumというPHPのフレームワークは、各オブジェクト内で次に呼ぶオブジェクトを指定しているようです。リンクトリストみたいですね。&lt;br /&gt;
&lt;br /&gt;
それに比べるとAmida式チェーンは比較的単純だと思います。実行するオブジェクト（あるいはクラス）を最初に配列で持っています。一方、途中でオブジェクトの順番を変えたり、呼び出すメソード名を変更できるのが特徴です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4748692001927087027?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4748692001927087027/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4748692001927087027' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4748692001927087027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4748692001927087027'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/02/amidamvcchain-of-responsibility.html' title='AmidaMVC：アミダ式チェーンとChain of Responsibilityパターン'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3941566999713987919</id><published>2012-02-01T21:46:00.000+09:00</published><updated>2012-02-02T11:37:17.921+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>AmidaMVC：appHelloを書いてみよう</title><content type='html'>今度はちゃんと俗に言うModelみたいな書き方を。&lt;br /&gt;
&lt;br /&gt;
「demo/hello」フォルダーを作ります。&lt;br /&gt;
その下に「_App.php」ファイルを作って、
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;
&lt;br /&gt;
&lt;pre class="brush:php"&gt;&amp;lt;?php
$_ctrl-&amp;gt;prependComponent( 'appHello', &amp;nbsp;'app' );
class appHello extends \AmidaMVC\Component\Model
{
&amp;nbsp; &amp;nbsp; static function actionDefault(
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \AmidaMVC\Framework\Controller $ctrl,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \AmidaMVC\Component\SiteObj &amp;amp;$siteObj &amp;nbsp;)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $html = '&amp;lt;h1&amp;gt;Hello Application&amp;lt;/h1&amp;gt;' .
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; '&amp;lt;p&amp;gt;Hello World from Application&amp;lt;/p&amp;gt;';
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $siteObj-&amp;gt;setContents( $html );
&amp;nbsp; &amp;nbsp; }
}&lt;/pre&gt;
&lt;br /&gt;
と書き込みます。&lt;br /&gt;
&lt;br /&gt;
次のURLにアクセス。&lt;br /&gt;
http://&lt;i&gt;your.host.here&lt;/i&gt;/&lt;i&gt;pathto&lt;/i&gt;/AmidaMVC/demo/hello/&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;your.host.here&lt;/i&gt;と&lt;i&gt;pathto&lt;/i&gt;は適宜環境に合わせてください。&lt;br /&gt;
すると、&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-NNAzyUgvnlU/Tyjb1Fob9OI/AAAAAAAAEgU/Uj5uDqyUq_c/s1600/IMG134.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://4.bp.blogspot.com/-NNAzyUgvnlU/Tyjb1Fob9OI/AAAAAAAAEgU/Uj5uDqyUq_c/s400/IMG134.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
と表示されます。&lt;br /&gt;
&lt;br /&gt;
今度はたくさんのルールがあります。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;_App.php&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
アプリケーションは_App.phpファイルにあるという規約になってます。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;自分自身をコンポーネントとして登録&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Componentとして自分自身をチェーンに登録する必要があります。&lt;br /&gt;
AmidaMVCのコントローラーが$_ctrlで取得できるので、prependComponentメソードを使って登録しています。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:php"&gt;$_ctrl-&amp;gt;prependComponent( 'appHello', &amp;nbsp;'app' );&lt;/pre&gt;
&lt;br /&gt;
ここにクラス名（appHello）を入れます。&lt;br /&gt;
この時点では、Loaderコンポーネント内で動いています。次に実行するコンポーネントとしてクラスを登録することになります。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;正直、これは格好悪いと思いってます。クラス名を固定にしてコントローラー側で自動で読み込ませようかと思ったのですが、規約を増やすより、自分でコード書いた方がいいかな、と思って。というのは嘘で、ここでViewも読み込ませたいのですが、二つのクラスを上手に読み込ませるよい規約を思いつかなかったからです。&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
◆&lt;b&gt;actionDefaultメソード&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Loaderがファイルを読み込んだ後、appHelloクラスを実行します。&lt;br /&gt;
このURLだとアクションはデフォルトになります。なのでactionDefaultメソードが呼ばれることになります。&lt;br /&gt;
&lt;br /&gt;
変数は３つあります。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;$ctrl：AmidaMVCのコントローラーオブジェクト。&lt;/li&gt;
&lt;li&gt;$siteObj：ウェブサイトに関するデータを収集するオブジェクト。&lt;/li&gt;
&lt;li&gt;$data：前のコンポーネントから受け渡されるデータ（必要なければ無視）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;
◆&lt;b&gt;HTMLを返す&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
結果のHTMLは$siteObjに登録します。&lt;/div&gt;
&lt;div&gt;
これがRenderに運ばれて、テンプレートなどの処理を行います。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="brush:php"&gt;$siteObj-&amp;gt;setContents( $html );
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
◆&lt;b&gt;個人的な感想･･･&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ちょっと書いてますが、もっと規約を増やして自動で処理する項目を増やしたほうがいいかもしれません。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;たとえばRenderが受け取る$data（3番目の変数）は常にコンテンツにするとか。するとappあるいはviewメソードの最後にHTMLをreturnすればRenderが受け取ってコンテンツとして処理してくれるとかです。&lt;/li&gt;
&lt;li&gt;それから、コンポーネントの登録を自動で行うとか。&lt;/li&gt;
&lt;li&gt;_initメソードを前もって呼び出すとか。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
フレームワークは作っていて楽しい理由は、ここら辺でしょうね。&lt;br /&gt;
やりすぎて使いにくくならないようにするのが難しいのかもしれません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3941566999713987919?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3941566999713987919/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3941566999713987919' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3941566999713987919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3941566999713987919'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/02/amidamvcapphello.html' title='AmidaMVC：appHelloを書いてみよう'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-NNAzyUgvnlU/Tyjb1Fob9OI/AAAAAAAAEgU/Uj5uDqyUq_c/s72-c/IMG134.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5451616783718892867</id><published>2012-02-01T21:18:00.000+09:00</published><updated>2012-02-02T11:37:17.934+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>AmidaMVC：Hello Worldを書いてみよう</title><content type='html'>何はともあれ「Hello World」&lt;br /&gt;
一番簡単な方法からです。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;マークダウンでHello World&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
AmidaMVCを落としてくるとdemoフォルダーがあります。&lt;br /&gt;
この下に「hello.md」というファイルを作ります。&lt;br /&gt;
&lt;br /&gt;
ここに&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
#Hello World&lt;br /&gt;
Hello to AmidaMVC. &amp;nbsp;&lt;/blockquote&gt;
と書きます。&lt;br /&gt;
&lt;br /&gt;
そして次のURLにアクセス。&lt;br /&gt;
http://&lt;i&gt;your.host.here&lt;/i&gt;/&lt;i&gt;pathto&lt;/i&gt;/AmidaMVC/demo/hello.md&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;your.host.here&lt;/i&gt;と&lt;i&gt;pathto&lt;/i&gt;は適宜環境に合わせてください。&lt;br /&gt;
すると、最初のHello World画面が出るはず。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-sDkWnb-cObA/TyjTigq85sI/AAAAAAAAEf8/wemXHQpJZ94/s1600/IMG131.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://1.bp.blogspot.com/-sDkWnb-cObA/TyjTigq85sI/AAAAAAAAEf8/wemXHQpJZ94/s400/IMG131.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;demoフォルダーの下に置いたのは、AmidaMVC直下だとルータマップが効いてしまって直接ファイルを指定してもアクセスできないためです。&lt;/span&gt;&lt;/blockquote&gt;
中身のマークダウンファイルをHTMLに変換しています。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;PHPでHello World?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
次は「hello.php」を作ってみましょう。&lt;br /&gt;
「demo/hello.php」ファイルを作って、&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&amp;lt;?php&lt;br /&gt;
echo 'Hello World from AmidaMVC';&lt;br /&gt;
?&amp;gt;&lt;/blockquote&gt;
と入力して、アクセス。すると、どうでしょう。&lt;br /&gt;
PHPのソースコードが出てきました。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-26NwaDTDwdM/TyjTjOB7-oI/AAAAAAAAEgA/VbPOYafDfDo/s1600/IMG132.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://4.bp.blogspot.com/-26NwaDTDwdM/TyjTjOB7-oI/AAAAAAAAEgA/VbPOYafDfDo/s400/IMG132.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
面白いでしょう？&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;現状でPHPを走らせるには･･･&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
「demo/hello.html」ファイルを作って、こう書きます。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;?php echo '&amp;lt;p&amp;gt;Hello World from Html&amp;lt;/p&amp;gt;'; ?&amp;gt;&lt;/blockquote&gt;
と入力して、アクセスすると･･･&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-EZFdDv7p7Fs/TyjXvHjLZ9I/AAAAAAAAEgM/4iEOQRWSqh0/s1600/IMG133.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://1.bp.blogspot.com/-EZFdDv7p7Fs/TyjXvHjLZ9I/AAAAAAAAEgM/4iEOQRWSqh0/s400/IMG133.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ちゃんとPHPとして動きました。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;スキャンモードで各種ファイルを表示&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
AmidaMVCは要求されたURLを元にファイルシステムをスキャンできます。&lt;br /&gt;
ファイルを見つけたら、拡張子から中身を推測、HTMLに変換して、テンプレートに放り込んだ上で表示します。&lt;br /&gt;
&lt;br /&gt;
ルートマップもあります。ルートマップに引っかかったファイルを優先して読み込みます。&lt;br /&gt;
&lt;br /&gt;
対応している拡張子は：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;マークダウン（md、markdown）&lt;/li&gt;
&lt;li&gt;HTML（html）&lt;/li&gt;
&lt;li&gt;テキスト（text,txt）&lt;/li&gt;
&lt;li&gt;PHP
ソースコード&amp;nbsp;（php）&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
があります。&lt;/div&gt;
&lt;div&gt;
ソースコードを表示する機能は、ちょっとgitHubみたいで気に入っているのですが、さすがに変すぎるので、PHPファイルなら実行して、HTMLとして表示する予定です。&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5451616783718892867?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5451616783718892867/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5451616783718892867' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5451616783718892867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5451616783718892867'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/02/amidamvchello-world.html' title='AmidaMVC：Hello Worldを書いてみよう'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sDkWnb-cObA/TyjTigq85sI/AAAAAAAAEf8/wemXHQpJZ94/s72-c/IMG131.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8351909284910431361</id><published>2012-01-31T21:13:00.001+09:00</published><updated>2012-02-02T11:37:17.951+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>AmidaMVC：ComponentとAction</title><content type='html'>AmidaMVCが何をしているのか？&lt;br /&gt;
&lt;br /&gt;
一言で言えば、コンポーネント（部品）を次々と実行するだけ。&lt;br /&gt;
格好良くコンポーネントと言ってますが、要するにクラスです。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;コンポーネントの登録&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
たとえば、こんなコードです。&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;
&lt;br /&gt;
&lt;pre "="" class="brush: php"&gt;// Controllerを作成、
$ctrl = new \AmidaMVC\Framework\Controller();
// コンポーネントを追加。
$ctrl
    -&amp;gt;addComponent( 'Config', 'config' )
    -&amp;gt;addComponent( 'Router', 'router' )
    -&amp;gt;addComponent( 'Loader', 'loader' )
    -&amp;gt;addComponent( 'Render', 'render' )
;
// フレームワーク実行
$data = new \AmidaMVC\Component\SiteObj();
$ctrl-&amp;gt;start( $data );
&lt;/pre&gt;
&lt;br /&gt;
最初にSiteObjとControllerのオブジェクトを作成してから、&lt;br /&gt;
&lt;b&gt;コントローラーにコンポーネントを追加&lt;/b&gt;してゆきます。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
これらのコンポーネントを順番に実行してゆきます。&lt;br /&gt;
&lt;br /&gt;
クラスなので、実際に走らせるにはメソード名が必要です。&lt;br /&gt;
最初は「actionDefault」というメソードを呼び続けます。つまり正常に動いている場合の処理をこのメソード内に書きます。&lt;br /&gt;
&lt;br /&gt;
上の例だと、&lt;br /&gt;
・Config：設定用クラス。必要そうな値を設定。&lt;br /&gt;
・Router：URLから読み込むファイルを決定する。&lt;br /&gt;
・Loader：見つけたファイルを読み込む。&lt;br /&gt;
・Render：テンプレートを呼び出してHTMLを出力する。&lt;br /&gt;
という処理を順番に行います。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;アクション&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
実行するメソード名は、アクションと読んでいます。&lt;br /&gt;
実際は&lt;b&gt;actionAction&lt;/b&gt;、最初に「action」をつけて呼び出します。&lt;br /&gt;
例えばactionHelloとかです。&lt;br /&gt;
&lt;br /&gt;
もしアクションが存在しない場合。&lt;br /&gt;
デフォルトのアクション「&lt;b&gt;&lt;span style="color: blue;"&gt;Default&lt;/span&gt;&lt;/b&gt;」を呼び出します。&lt;br /&gt;
つまり「actionDefault」のメソードが呼ばれます。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;エラー処理の例&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
途中でエラーが起きたとします。&lt;br /&gt;
たとえばRouterでファイルがみつからなかった場合について考えてみます。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Router&lt;/b&gt;でファイルがみつからない。&lt;br /&gt;この場合、&lt;b&gt;Router&lt;/b&gt;はアクションを「&lt;b&gt;&lt;span style="color: blue;"&gt;_PageNotFound&lt;/span&gt;&lt;/b&gt;」に変えて、次のコンポーネントに処理を渡します。&lt;/li&gt;
&lt;li&gt;これ以降、「&lt;b&gt;&lt;span style="color: blue;"&gt;_PageNotFound&lt;/span&gt;&lt;/b&gt;」が呼び出されます。無ければデフォルトのアクションを実行します。&lt;/li&gt;
&lt;li&gt;さて、&lt;b&gt;Loader&lt;/b&gt;の「&lt;b&gt;&lt;span style="color: blue;"&gt;_PageNotFound&lt;/span&gt;&lt;/b&gt;」のアクションでは、設定で指定していたファイル（PageNotFound.md）を読み込みます。&lt;br /&gt;この時点で、表示に必要なデータはそろったことになるので、正常系に戻します。つまり「&lt;b&gt;&lt;span style="color: blue;"&gt;actionDefault&lt;/span&gt;&lt;/b&gt;」を呼ぶようにコントローラーに命令します。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Render&lt;/b&gt;はファイルが読み込まれているので、正常系の処理と同じになります。&lt;/li&gt;
&lt;/ul&gt;
とまぁ、こんな感じで、エラーがあった場合に異常系の処理をして、処理が終われば正常系の処理に戻したりが出来ます。これでフレームワークの設計が簡単になるんじゃないかと思った訳です。&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8351909284910431361?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8351909284910431361/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8351909284910431361' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8351909284910431361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8351909284910431361'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/01/amidamvccomponentaction.html' title='AmidaMVC：ComponentとAction'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-7063541213840972121</id><published>2012-01-30T21:29:00.001+09:00</published><updated>2012-02-02T11:37:17.941+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>AmidaMVC：今更PHPマイクロフレームワーク作ってみた</title><content type='html'>ちょこちょこ書いてますが、PHPのmicroframework作ってみました。&lt;br /&gt;
今更の感覚が強いですが、&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;勉強のため、&lt;/li&gt;
&lt;/ul&gt;
と思って作ってみました。&lt;br /&gt;
&lt;br /&gt;
でも勉強のためだけで作ることは無かったですね。&lt;br /&gt;
実は&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;アミダ式Dispatcher&lt;/b&gt;（と勝手に命名）&lt;/li&gt;
&lt;/ul&gt;
というロジックを思いついてしまって。&lt;br /&gt;
それをMVCフレームワークに応用したら面白そうだなと思ったら、作ってみたくて仕方がなくなり作ったという次第です。&lt;br /&gt;
&lt;br /&gt;
ウェブサイトを作っていて、面倒なのがエラー処理。&lt;br /&gt;
ページが見つからないなどの処理をきれいに行いたいと思ってました。&lt;br /&gt;
&lt;br /&gt;
アミダ式の説明は後で行いますが、&lt;br /&gt;
標準の処理が簡単なだけでなく、エラーなどの異常系の処理も簡単にできるのではないかと思っています。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;まぁ自分が初めて考えついたロジックとは思いませんし、誰かがMVCに応用していてもおかしくはない、というか実はこれがMVCの標準的な処理だった、なんてオチはないといいのですが。こういうのは広い知識を持ってないのがつらいところです。&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
◆特徴は？&lt;br /&gt;
&lt;br /&gt;
せっかく作ったので、何か特徴があるはず…&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;モデルやビューが無くても動く。&lt;/b&gt;&lt;br /&gt;一つのファイルにPHPとHTMLが混在していても、ちゃんとテンプレート内に入るようになります。もちろんクラスを作っても大丈夫。&lt;/li&gt;
&lt;li&gt;ルートを設定してもしなくても動く。&lt;/li&gt;
&lt;li&gt;ファイルビューワーとして、&lt;b&gt;マークダウンファイルやテキストファイルをHTMLとして表示&lt;/b&gt;することが出来ます。PHPファイルもソースコードとして表示できたりします。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ファイルシステムがベース&lt;/b&gt;&lt;br /&gt;特徴なのかどうか分かりませんがデータベースは必要ありません。遅いと思いがちなファイルですが、今後SSDが普及するにつれ十分なスピードが出るようになるのではないでしょうか？すると簡単にファイルで作れるフレームワークも便利かなぁと。&lt;/li&gt;
&lt;/ul&gt;
その他、ファイルを直接修正したりすることも（多分簡単に）出来るはずなのですが、こうなるとフレームワークなのかCMSなのか分からなくなるので、適当なところで切り上げないと。&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-7063541213840972121?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/7063541213840972121/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=7063541213840972121' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7063541213840972121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7063541213840972121'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/01/amidamvcphp.html' title='AmidaMVC：今更PHPマイクロフレームワーク作ってみた'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8967073804763667862</id><published>2012-01-17T13:57:00.005+09:00</published><updated>2012-01-30T21:57:08.241+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>クロージャーを使ったPSR-0準拠のクラスローダー</title><content type='html'>PSR-0をベースにしたクラスローダーを探したのですが、全て&lt;a href="http://scopenote.blogspot.com/2011/02/psr-0.html"&gt;クラスベースのクラスローダー&lt;/a&gt;しか見つかりませんでした。でコピーするのが面倒だったので、クロージャーを使ったクラスローダー作ってみました。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;こういうのにクロージャーって便利なんですね。&lt;br /&gt;初めてクロージャーをちゃんと使った気がする。&lt;/span&gt;&lt;/blockquote&gt;
ソースコードはgitHubのGistにて公開しました。&lt;br /&gt;
&lt;a href="https://gist.github.com/1620960#file_class_loader_ns.php"&gt;https://gist.github.com/1620960#file_class_loader_ns.php&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;特徴は、&lt;span style="font-size: large;"&gt;パラメータ無しで動きます。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
◆使い方は、たとえば次のようなクラスをロードする場合。&lt;br /&gt;
new AmidaMVC\Folder\SomeClass();&lt;br /&gt;
&lt;br /&gt;
対応するクラスのが次の場所だったとします。&lt;br /&gt;
pathto/src/AmidaMVC/Folder/SomeClass.class&lt;br /&gt;
&lt;br /&gt;
こういう場合は、pathto/src/AmidaMVC/bootstrap.php&lt;br /&gt;
などに上のGistコードを貼り付けてください。&lt;br /&gt;
&lt;br /&gt;
spl_autoload_register( ClassLoader() );&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;普通、多分、他のコードを見る感じだとクラスをロードするには、ライブラリで使っているネームスペースとパスを指定する必要があります。&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;この関数は、呼ばれた場所がライブラリの一番上と仮定して、現在のフォルダーをネームスペース（例の場合はAmidaMVC）、そして現在のフォルダーをのぞいたパス（例の場合はpathto/src/）を設定します。&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
◆ただし、関数の定義が別ファイルにある場合は、先のbootstrap.phpで&lt;br /&gt;
&lt;br /&gt;
spl_autoload_register( ClassLoader( __DIR__ ) );&lt;br /&gt;
&lt;br /&gt;
とすれば動く「はず」です（動作は未確認）。&lt;br /&gt;
&lt;br /&gt;
◆注意&lt;br /&gt;
&lt;br /&gt;
今コードを見たら、&lt;b&gt;&lt;span style="color: #cc0000;"&gt;バグがあります&lt;/span&gt;&lt;/b&gt;ね。&lt;br /&gt;
少なくとも自分の環境では動いているので、ちょっと修正すれば動くと思います。また時間を見つけたら修正します。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8967073804763667862?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8967073804763667862/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8967073804763667862' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8967073804763667862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8967073804763667862'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/01/psr-0.html' title='クロージャーを使ったPSR-0準拠のクラスローダー'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-9127720214070182407</id><published>2012-01-11T00:00:00.001+09:00</published><updated>2012-01-30T21:57:15.252+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>[PHP] Chain of Reponsibility (CoR)を使ったDispatcher</title><content type='html'>なぜかChain of Reponsibility (CoR)を使ったDispatcherをPHPで書いている。今、必要なこととも思えないが、一度始めたら見切りを付けるまで頭から離れない。仕方ないので書いている感じ。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: x-small;"&gt;そもそもは、Html5のローカルアプリ開発にJavaScriptのMVCいるよね、という話から始まって、Mediatorパターンいいよと言われたところからスタートした気がする。&lt;br /&gt;&lt;br /&gt;で、JavaScriptの簡易MVC・フレームワークを探したら…&lt;br /&gt;簡単に見つかる。&lt;br /&gt;で、コードを読んでも追いかけられない。&lt;br /&gt;モデルが既に存在しているので、Cenaをそのまま使えない。&lt;br /&gt;&lt;br /&gt;じゃあ自分で書いてみるか、となって、&lt;br /&gt;MVCを勉強することにした。&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
MVCモデルって、要はリクエスト（httpの要求ですね）をもとに、&lt;br /&gt;
処理するルーチン（関数でもクラスでも）を決めるだけだよね？&lt;br /&gt;
それってなんて言うDispatch？&lt;br /&gt;
だからDispatchを書き始めた。&lt;br /&gt;
&lt;br /&gt;
◆車輪の再発明だけど&lt;br /&gt;
&lt;br /&gt;
書いているうちに、簡単なのだと使いづらいと思い始めた。&lt;br /&gt;
実際にデータを読み込むところをモデルと考えた場合、&lt;br /&gt;
その前後にたくさんの処理が必要になる。&lt;br /&gt;
&lt;br /&gt;
例えば認証、キャッシュ。&lt;br /&gt;
認証でエラーがあればモデルなんか読み込む必要がない。&lt;br /&gt;
キャッシュにヒットすれば、これまたモデルを読み込む必要がない。&lt;br /&gt;
一方、モデルの処理中に致命的エラーが起きたら、まったく別の画面に飛ばす場合もあるでしょう。&lt;br /&gt;
で、全部OKだったら、読み込んだデータをHTMLに直す処理を始められる。&lt;br /&gt;
&lt;br /&gt;
つまり途中で処理をかえる必要がある。&lt;br /&gt;
思ったより、複雑。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
◆CoR&lt;br /&gt;
&lt;br /&gt;
で、CoRを使ってみることにした。&lt;br /&gt;
これしか使えそうなパターンを知らなかったからだけど、symfonyやstrutsでも使われてるとどこかで読んだので間違った選択ではなかったみたい。&lt;br /&gt;
&lt;br /&gt;
と、この辺りで気づいたのは、&lt;br /&gt;
リクエストから処理するルーチンをDispatchする部分（Router）と、&lt;br /&gt;
実際に処理を行うルーチンでのDispatchする部分（なんて言うんだ？）と、&lt;br /&gt;
別の話だなと。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-9127720214070182407?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/9127720214070182407/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=9127720214070182407' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9127720214070182407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9127720214070182407'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/01/php-chain-of-reponsibility.html' title='[PHP] Chain of Reponsibility (CoR)を使ったDispatcher'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5987454618059771801</id><published>2012-01-06T14:25:00.004+09:00</published><updated>2012-01-06T14:25:57.825+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>2012年の抱負</title><content type='html'>おめでとうございます。&lt;br /&gt;2012年（平成24年）が明けました。&lt;br /&gt;&lt;br /&gt;せっかくなので今年の抱負を書きます。&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;アウトプットを増やす&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
もともと書くのは遅いと思うので、今年は余り推敲せずに書くことにして、アウトプットを増やしてみたいです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;もう上の一行で何度も推敲してますがｗ&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;Cena-DTAを何とかする&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ひとまず日本での特許を取得。&lt;/div&gt;
&lt;div&gt;
今はアメリカで特許の出願済み、まだ取得は出来てません。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
今年はCena-DTAを広める動きをしたいです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
また、コーディングも「着々と」進める予定。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;ちゃんと仕事する&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
今まで適当に仕事をしてきたわけではないのですが。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
つい後回しにする悪い癖があるので、今年は頑張りたいです。請求書をちゃんと書く、とかですかね。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
それと、受注した仕事が中心だったので、今年は少し能動的に仕事したいです。というかCena-DTAに力を入れてみたいです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;個人的なその他の目標&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
家族サービスは今までどおり（むしろ増やしたい）&lt;/div&gt;
&lt;div&gt;
勉強会を月2回ぐらい参加する（家族との協議が必要）&lt;/div&gt;
&lt;div&gt;
体重を5kgぐらい減らす（減らしすぎないようにするｗ&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆&lt;b&gt;東日本大震災を受けて&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
今年の抱負を考えるにあたり、忘れられないのが東日本大震災。&lt;/div&gt;
&lt;div&gt;
家族･親戚で直接的な被害をこうむってはいませんが、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
「今まで通りでは駄目だ」&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
という思いをいっそう強くしました。&lt;/div&gt;
&lt;div&gt;
一昨年のリーマンショック以来感じてたことでもあります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
まだ大きな地震が来るという予想もあります。&lt;/div&gt;
&lt;div&gt;
いろんなことを見直して、しっかりと生き延びてゆきたいです。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5987454618059771801?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5987454618059771801/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5987454618059771801' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5987454618059771801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5987454618059771801'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2012/01/2012.html' title='2012年の抱負'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-810560542224590889</id><published>2011-12-14T16:18:00.005+09:00</published><updated>2011-12-25T20:47:23.326+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>コンポーネント指向について調べてみた</title><content type='html'>イベント駆動から始まって、次はコンポーネント指向について調べてみました。&lt;br /&gt;
&lt;br /&gt;
いつものように&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88"&gt;Wikipediaでコンポーネント指向&lt;/a&gt;を見ると、まったくわけが分かりません。いや、部品から組み立てようということらしいんですが、それって当たり前だし、ほとんど全てのフレームワークはコンポーネント指向でしょう。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;要はGUIのあれと同じ･･･&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
困って別のサイトを見てたら、いい解説がありました。&lt;br /&gt;
全然別のフレームワークの紹介なのですが、上手に説明されていたので、そのまま抜き出します。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="font-family: 'ＭＳ Ｐゴシック', Osaka; line-height: 22px;"&gt;コンポーネント指向のフレームワークでは，リクエストごとではなく，コンポーネントが発火するイベントに対するハンドラとして処理を記述します。これは既存のGUIアプリケーションと同様のモデルです。&lt;br /&gt;
http://itpro.nikkeibp.co.jp/article/COLUMN/20070305/263875/&lt;/span&gt;&lt;/blockquote&gt;
既存のGUIアプリと同じモデルだそうです。&lt;br /&gt;
あれ、&lt;a href="http://wsjp.blogspot.com/2011/12/phpevent-driven.html"&gt;イベント駆動についての最初の例&lt;/a&gt;と同じだ。&lt;br /&gt;
&lt;br /&gt;
つまりコンポーネント指向とは、&lt;br /&gt;
・ウェブの画面上の各要素に対して、&lt;br /&gt;
・サーバー上のクラスを一対一に対応付けて処理する、&lt;br /&gt;
という設計方針という意味だと理解しました。&lt;br /&gt;
&lt;br /&gt;
一方、イベント駆動とは、コンポーネント指向を実現するための実装技術なのでしょう。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Yiiのコンポーネントについて想像をめぐらす&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
YiiのウェブサイトにComponentについての説明があります。コンポーネントとは、パブリックなプロパティを持って、イベントを発生・処理できるとあります。&lt;br /&gt;
&lt;br /&gt;
いまひとつよく分かりませんが、Yii Blog Demoを見ていて、面白いフォーム構造をしているのに気がつきました。&lt;br /&gt;
&lt;br /&gt;
新規ポストの登録で、タイトルの名称は&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;input type="text" name="Post[title]" /&amp;gt;&lt;/span&gt;&lt;br /&gt;
となってます。&lt;br /&gt;
&lt;br /&gt;
残念ながらデモのソースコードが見つからなかったので、想像ですが、おそらくPostというコンポーネントクラスが存在するのでしょう。新規投稿をすると、何らかのイベントが発生してPostコンポーネントを呼び出して、titleというプロパティに値を設定して、DBに保存する、という流れになっているのではないでしょうか。&lt;br /&gt;
&lt;br /&gt;
ちなみにコメントの追加では、名前のところは&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;input type="text" name="Comment[author]" /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
です。&lt;/div&gt;
&lt;br /&gt;
ポスト先を見ると、&lt;br /&gt;
&lt;span style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-family: Tahoma;"&gt;&lt;a href="http://www.yiiframework.com/demos/blog/index.php/post/1/Welcome%21"&gt;http://www.yiiframework.com/demos/blog/index.php/post/1/Welcome%21&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
Commentという文字がURI内に見当たりません。&lt;br /&gt;
どうやってCommentコンポーネントに処理を渡しているのか･･･&lt;br /&gt;
単にURIを解析して対応するコンポーネントを決定しているわけではなさそうです。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;バインディング&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
最後に･･･&lt;br /&gt;
&lt;br /&gt;
このように、フォームや画面上に表示された要素と、バックエンド側での処理クラスを関係付けることを&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%A2%E4%BF%82%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0"&gt;データバインディング&lt;/a&gt;と呼ぶようです。&lt;br /&gt;
&lt;br /&gt;
最初にこの言葉を聞いたのがJavaServer Faces(JSF)でした。&lt;br /&gt;
調べてみるとWindowsなど様々な場所で使われてる技術･言葉みたいですね。&lt;br /&gt;
&lt;br /&gt;
リクエストを処理→テンプレートで表示、というウェブの作りとはちょっと違っていて面白いですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-810560542224590889?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/810560542224590889/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=810560542224590889' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/810560542224590889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/810560542224590889'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/12/blog-post.html' title='コンポーネント指向について調べてみた'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3058598449061571394</id><published>2011-12-14T11:21:00.000+09:00</published><updated>2011-12-14T15:34:43.758+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Underscore.phpとarryと_wwの速度比較してみた</title><content type='html'>PHP Advent jp 2011で書いた_ww（Underscore-Walla-Walla）ですが、せっかくなので他の実装と速度比較してみました。&lt;br /&gt;
&lt;br /&gt;
比較対象は、実装の&lt;a href="http://brianhaveri.github.com/Underscore.php/"&gt;元ネタの__&lt;/a&gt;と、同じく&lt;a href="http://www.1x1.jp/blog/2011/12/php_arry.html"&gt;PHP Adventで発表されたarry&lt;/a&gt;です。&lt;br /&gt;
&lt;br /&gt;
また比較用のコードとデータはarryで使われていた「悲しき今シーズンの結果」を利用させてもらいました。ありがとうございました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;まずはリファクタリングから&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
が、利用するにはsortがないし、クラスは二つに分かれてるし。&lt;br /&gt;
最初は_wwのリファクタリングから始めました。&lt;br /&gt;
&lt;br /&gt;
まずは&lt;a href="http://wsjp.blogspot.com/2011/11/gitbranch.html"&gt;gitでブランチを切って&lt;/a&gt;、開発開始です。&lt;br /&gt;
次にテストクラスを作成してから、さくっとクラスをマージ。&lt;br /&gt;
簡単に出来ました。テストがあると、変更するのに気が楽ですね。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;速度比較について予測してみる&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
測定する前に予測を立てます。&lt;br /&gt;
&lt;br /&gt;
まずは、自分の_wwが一番遅いと予想。&lt;br /&gt;
理由はマジックメソードを使っているので。&lt;br /&gt;
&lt;br /&gt;
一番早いのはShinさんのarryクラス。&lt;br /&gt;
最初からチェーンするようにメソードが組み立てられているので、一番早いはず。&lt;br /&gt;
&lt;br /&gt;
すると中間は、Underscore.php。&lt;br /&gt;
これもマジックメソード使ってないけれど、各メソード内での処理があるので、チェーンすると少し処理が増えると予想。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;速度比較の結果&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://gist.github.com/1460352"&gt;ソースコードはgistで公開&lt;/a&gt;してあります。&lt;br /&gt;
インストールですが、どこかのフォルダーでgit bashを開始して、&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;git clone git://gist.github.com/1460352.git gist-1460352&lt;br /&gt;git clone git://github.com/shin1x1/arry.git&lt;br /&gt;git clone git://github.com/brianhaveri/Underscore.php.git&lt;br /&gt;git clone git://github.com/asaokamei/_ww.git
&lt;/span&gt;&lt;/blockquote&gt;
と打ち込んで、からgist-1460352内のcompare.phpを走らせてください。&lt;br /&gt;
測定ですが、Core2Duo 2.13GHzのWindows Vistaでの結果です。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;2.2504210472107  // 素のPHP
5.0997409820557  // arry
9.1629009246826  // Underscore.php
7.959762096405  // _ww&lt;/pre&gt;
&lt;br /&gt;
予想通りarryが一番早かったです。&lt;br /&gt;
素のPHPに比べて2倍強になりました。結構、速い気がします。&lt;br /&gt;
&lt;br /&gt;
意外だったのがUnderscore.phpより_wwのほうが速かったこと。&lt;br /&gt;
何度か走らせると、値が結構変わるので「ほんの少し速い」だけですが、各メソード内での処理が意外と重いのでしょう。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;PHPのプロファイリング&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
そういえばプロファイリング（速度の測定）なんて何年振りです。&lt;br /&gt;
PHPだとxdebugを使えば出来るようですが、今回は簡単な関数を自作して計ることにしました。最近使い始めたNetBeansから直接測定結果が見られると便利なんですけどね。&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3058598449061571394?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3058598449061571394/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3058598449061571394' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3058598449061571394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3058598449061571394'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/12/underscorephparryww.html' title='Underscore.phpとarryと_wwの速度比較してみた'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1405870945766631565</id><published>2011-12-13T11:49:00.000+09:00</published><updated>2011-12-14T15:36:04.279+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Pradoのイベント駆動を想像してみる</title><content type='html'>PradoというPHPフレームワークのイベント駆動がどうなっているのか、&lt;a href="http://www.pradosoft.com/"&gt;Pradoのホームページ&lt;/a&gt;を眺めているうちに、何となく想像がついてきました。&lt;br /&gt;
&lt;br /&gt;
ただし、ソースコードは一切読まずの想像ですので、間違ってるかもですが。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;&lt;a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.RadioButton"&gt;QuickStartサンプル&lt;/a&gt;から&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
単純なラジオボタンのデモですが、このページからソースコードを眺めると、&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Home.pageの97行目：&lt;br /&gt;&amp;lt;com:TButton Text="Submit" OnClick="&lt;b&gt;selectRadioButton&lt;/b&gt;" /&amp;gt;&lt;/li&gt;
&lt;li&gt;Home.phpの10行目：&lt;br /&gt;public function &lt;b&gt;selectRadioButton&lt;/b&gt;($sender,$param)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div&gt;
とあって、サブミットボタンがクリックされると「&lt;b&gt;selectRadioButton&lt;/b&gt;」というイベントが発生して、&lt;b&gt;HomeクラスのselectRadioButton&lt;/b&gt;メソードに処理を渡しているようです。&lt;br /&gt;
&lt;br /&gt;
なるほど、Pradoのいうイベント駆動は、まさGUIでのイベント駆動に近いようです。JavaScriptを使ってHtml上のボタンなどにイベントを発生させて、サーバー側のPHPクラス・メソードに結び付けているのでしょう。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Yiiはイベント駆動ではないのか？&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
さて、Pradoは「終了？」したのか、&lt;br /&gt;
新しい「Yii」というフレームワークの開発を始めているということです。&lt;br /&gt;
&lt;br /&gt;
Yiiの特徴は「コンポーネント指向」&lt;br /&gt;
&lt;br /&gt;
これまた新しい言葉が･･･&lt;br /&gt;
いや、よく見たらPradoでも同じ言葉を使ってました。&lt;br /&gt;
&lt;br /&gt;
ともあれ、Yiiはイベント駆動をやめたのでしょうかね？&lt;br /&gt;
&lt;br /&gt;
これまた想像ですが、Restが優勢になってイベント駆動というパラダイムが分かりにくくなったからではないでしょうか？&lt;br /&gt;
&lt;br /&gt;
要するにリクエストがあった場合に、どのクラスのメソードに処理をさせるのかを決定できればいいわけで、RestならURIだけで決定できます。ボタンクリックでわざわざイベントを発生させるのは無駄な気がします。&lt;br /&gt;
&lt;br /&gt;
さ、次は「コンポーネント指向」について調べてみよう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1405870945766631565?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1405870945766631565/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1405870945766631565' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1405870945766631565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1405870945766631565'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/12/prado.html' title='Pradoのイベント駆動を想像してみる'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1105955835637310475</id><published>2011-12-08T09:57:00.001+09:00</published><updated>2011-12-14T15:36:04.272+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHPでイベント駆動（event driven）って何だろう？</title><content type='html'>PHPの&lt;a href="http://www.google.co.jp/search?q=%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88+prado+php"&gt;Pradoというフレームワークがイベント駆動&lt;/a&gt;で、すごいらしい。&lt;br /&gt;
で、イベント駆動って何だろう？と思って、ちょっと調べてみた。&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
◆&lt;b&gt;オブザーバーパターン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
イベント駆動というと、jQueryを使って、あるDOM要素にクリックしたら～～する、というのが、まさによい例だそうです。&lt;br /&gt;
&lt;pre class="brush: js"&gt;$( '#button' ).click( function() { alert( 'hi' );});&lt;/pre&gt;
&lt;br /&gt;
が、一般的に&lt;a href="http://ja.wikipedia.org/wiki/Observer_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3"&gt;オブザーバーパターンという&lt;/a&gt;らしい。&lt;br /&gt;
&lt;br /&gt;
しかし、イベント駆動のPHPフレームワークと言われても、サーバー側でどうイベントを利用するのかぴんと来ません。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;こういうときは、自分で書いてみる。&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/6846118/event-driven-architecture-and-hooks-in-php"&gt;Stackoverflowで見つけた「Event-driven architecture and hooks in PHP」&lt;/a&gt;を参考に、自分で書いてみました。&lt;br /&gt;
&lt;br /&gt;
イベント駆動というよりは、「dumb hook」あるいは「単なるdispatcher」と書いてあるように、非常に簡単なものです。&lt;br /&gt;
&lt;br /&gt;
ともかく、&lt;br /&gt;
&lt;br /&gt;
◆&lt;a href="https://github.com/asaokamei/eventHook"&gt;&lt;b&gt;eventHookというクラス（github）&lt;/b&gt;&lt;/a&gt;が出来ました。。&lt;br /&gt;
&lt;br /&gt;
最初にイベント名に対して実行する関数（クロージャーでも何でも）を登録します。
&lt;br /&gt;
&lt;pre class="brush: php"&gt;eventHook::hook( 'some_event', 
  function() {  echo 'do something'; });&lt;/pre&gt;
イベント発行は、イベントメソードを叩きます。&lt;br /&gt;
&lt;pre class="brush: php"&gt;eventHook::event( 'some_event' );&lt;/pre&gt;
簡単だなぁ。&lt;br /&gt;
&lt;br /&gt;
でも、イベント実行時に必要な情報はどうやって渡すんだろう？&lt;br /&gt;
&lt;br /&gt;
そのとき、例に挙げられてた通信バッファーを思い出した。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;通信を受け取ると、（OSが？）受け取った内容をメモリ上のバッファーに書き込み始めます。オブザーバーはバッファーを監視していて、バッファーの状態が変わるとイベントを発行、関連付けられてた何かを実行します。当然バッファーに必要な情報が入っている「はず」です。&lt;br /&gt;&lt;br /&gt;つまりイベントとは観察している対象が変わることであり、対象自体に情報があるはずです。&lt;br /&gt;&lt;br /&gt;eventHookクラスの場合は、eventメソードのイベント名はあくまでバッファーの場所（の代わり）であり、バッファー内の情報はeventメソードと一緒に渡せばいいわけです。&lt;/span&gt;&lt;/blockquote&gt;
説明すると難しいですが、コードにすると簡単。&lt;br /&gt;
&lt;pre class="brush: php"&gt;eventHook::hook( 'more_event', 
  function( $arg1=NULL, $args=NULL ) {
    echo "doSomething: '$arg1', '$args'\n";
});
eventHook::event( 'more_event', 'arg#1', 'arg#2' );
//&amp;nbsp;出力：doSomething: 'arg#1', 'arg#2'&lt;/pre&gt;
単にeventメソードに必要そうなデータを渡せば、実行関数にも同じものを渡します。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;うん？実行関数で生成された何か（プライマリキーとか）受け取りたい場合はどうするんだろう？別のイベントを発行してもらうのかな？？？やばそうな匂いがするなぁ。&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
◆&lt;b&gt;で、イベント駆動って何？&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
未だに肝心の「イベント駆動」がよく分かりません。&lt;br /&gt;
多分、イベントを連続して発行することでフレームワークの動きを実装しているのでしょう。MVCの代わりみたいなイメージなのかな。&lt;br /&gt;
&lt;br /&gt;
そういえば&lt;a href="http://wpdocs.sourceforge.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7"&gt;ワードプレスにもフックがたくさんある&lt;/a&gt;と聞いたことが･･･&lt;br /&gt;
あぁ、こういうことか。&lt;br /&gt;
&lt;br /&gt;
先は長いなぁ。&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1105955835637310475?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1105955835637310475/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1105955835637310475' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1105955835637310475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1105955835637310475'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/12/phpevent-driven.html' title='PHPでイベント駆動（event driven）って何だろう？'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4062420055001800045</id><published>2011-12-06T08:00:00.000+09:00</published><updated>2011-12-06T08:30:15.058+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHPからlocalStorageに書き込み・読み込み（PHP Advent JP 2011）</title><content type='html'>「&lt;a href="http://atnd.org/events/22781"&gt;PHP Advent Calendar jp 2011&lt;/a&gt;」6日目（12月6日）のエントリーです。&lt;br /&gt;
&lt;br /&gt;
初めてアドベントカレンダーに参加したのですが、いきなり内容が被ってしまいました。そのまま公開しようと思ってたのですが、急遽ネタを思いついたので、早速作ってみました。&lt;br /&gt;
&lt;br /&gt;
ちなみに&lt;a href="http://wsjp.blogspot.com/2011/12/underscore-walla-wallaphp.html"&gt;最初のネタは_ww（アンダースコア･ワラワラ）というクラス&lt;/a&gt;です。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;PHPから&lt;/b&gt;&lt;b&gt;ローカルストレージを使う&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
HTML5とスマートフォンが登場してから、クライアント（ブラウザー側）の技術が急速に進化していると感じます。今までのPHPでサーバー側でHTMLを構築するとは違ったウェブの構築になるのではないでしょうか。&lt;br /&gt;
&lt;br /&gt;
という前振りで、HTML5で登場したlocalStorageをPHPからを操作するクラスを作ってみました。&lt;br /&gt;
&lt;br /&gt;
ソースコードは&lt;a href="https://github.com/asaokamei/phpadventjp2011"&gt;githubのphpadventjp2011&lt;/a&gt;で公開してあります。&lt;br /&gt;
localStorageクラスとサンプルが入っています。&lt;br /&gt;
&lt;br /&gt;
一応、妙なスクリプトを入れられても大丈夫なはずですが･･･&lt;br /&gt;
セキュリティに関しては自己責任でお願いします。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;基本的な使い方&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
基本的な考え方は&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;PHPの変数をlocalStorageに保存するJavaScriptを自動生成。これをHTMLのどこかに貼り付けると、ブラウザーにデータを保存。&lt;/li&gt;
&lt;li&gt;ブラウザーのlocalStorageから値を読み出て隠しタグに変換するJavaScriptを自動生成。これをHTMLのフォーム内に貼り付けて、サブミットしてもらう。&lt;/li&gt;
&lt;li&gt;フォームデータを受け取るときに隠しタグから値を取得。&lt;/li&gt;
&lt;/ol&gt;
です。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;ローカルストレージに保存してみる&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
PHPコードです。&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;pre class="brush: php"&gt;require_once './localStorage.php';
$data = array( 'test'=&amp;gt;'test', 'more'=&amp;gt;'more' );
$js = localStorage::saveStorage( $data, 'testID' );
$js2 = localStorage::saveStorage( 'just value', 'valID' );&lt;/pre&gt;
この$jsや$js2をHTML内で出力すると、$dataの中身をブラウザーに保存します。&lt;br /&gt;
&lt;br /&gt;
ちなみに生成されたJavaScriptです。&lt;br /&gt;
PHP変数をJSONに変換して、localStorageに保存しています。&lt;br /&gt;
&lt;pre class="brush: js"&gt;&amp;lt;script&amp;gt;localStorage.setItem( 
'saveID_testID', '{"test":"test","more":"more"}' );
&amp;lt;/script&amp;gt;&lt;/pre&gt;
この後、クライアント側で保存した値を使えるようになります。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;PHPで受け取ってみる&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
面倒ですが、まずはフォームが必要です。そこで次のPHPコードを走らせてJavaScriptを生成します。 
&lt;br /&gt;
&lt;pre class="brush: php"&gt;require_once './localStorage.php'; 
$js = localStorage::loadStorage( 'testID' );
$js2 = localStorage::loadStorage( 'valID' );&lt;/pre&gt;
保存する際につけた名前（「testID」や「valID」）を指定します。&lt;br /&gt;
&lt;br /&gt;
生成されたJavaScriptです。&lt;br /&gt;
これをフォームのどこかに出力しておきます。
&lt;br /&gt;
&lt;pre class="brush: js"&gt;&amp;lt;input type="hidden" name="saveID_testID" id="saveID_testID"&amp;gt;
&amp;lt;input type="hidden" name="saveID_testID_EncType_" value="json"&amp;gt;
&amp;lt;script&amp;gt;
 document.getElementById( 'saveID_testID' ).value =
 localStorage.getItem( 'saveID_testID' );
&amp;lt;/script&amp;gt;

&amp;lt;input type="hidden" name="saveID_valID" id="saveID_valID"&amp;gt;
&amp;lt;input type="hidden" name="saveID_valID_EncType_" value="json"&amp;gt;
&amp;lt;script&amp;gt;
document.getElementById( 'saveID_valID' ).value =
localStorage.getItem( 'saveID_valID' );
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
◆&lt;b&gt;PHPで受け取ってみる（パート２）&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
こんなPHPコードで受け取れます。&lt;br /&gt;
&lt;pre class="brush: php"&gt;require_once './localStorage.php'; 
$data = localStorage::loadPost( 'testID' ); 
$val = localStorage::loadPost( 'valID' );&lt;/pre&gt;
保存する際につけた名前（「testID」や「valID」）を指定してください。&lt;br /&gt;
&lt;br /&gt;
保存したままの値が入ってくる（はず）です。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;使い方を考えてみる&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
勢いで作ったクラスですが、どう使うか考えてみました。&lt;br /&gt;
意外と使いどころがないｗ&lt;br /&gt;
&lt;br /&gt;
フォームに一旦出力するので使い勝手が悪い気がします。サーバーだけで使うデータならセッション使ったほうが楽でしょう。ただクライアント側のJavaScriptと変数を共有したい場合に便利かもと思ってます。&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4062420055001800045?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4062420055001800045/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4062420055001800045' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4062420055001800045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4062420055001800045'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/12/phplocalstoragephp-advent-jp-2011.html' title='PHPからlocalStorageに書き込み・読み込み（PHP Advent JP 2011）'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4193044493169805992</id><published>2011-12-06T00:00:00.000+09:00</published><updated>2011-12-06T00:00:15.094+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Underscore-Walla-WallaというPHPクラスを作ってみた</title><content type='html'>初めてアドベントカレンダーに参加したのですが、いきなり&lt;a href="http://www.1x1.jp/blog/2011/12/php_arry.html"&gt;内容が被って&lt;/a&gt;しまいました。&lt;strike&gt;&lt;span class="Apple-style-span" style="color: #999999;"&gt;別のトピックを考えたのですが、思いつかず。まぁ実装が違うので、このままで参加することにしました。&lt;/span&gt;&lt;/strike&gt;別ネタを思いついたので、そちらを書きました。&lt;br /&gt;
&lt;br /&gt;
◆&lt;a href="http://brianhaveri.github.com/Underscore.php/"&gt;&lt;b&gt;Underscore.phpという面白いクラス&lt;/b&gt;&lt;/a&gt;が紹介されてました。&lt;br /&gt;
&lt;br /&gt;
なんでもはunderscoreというjavaScriptをPHPにポートしたものだそうです。何が面白いって、&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;jQueryみたいにPHPコードが書ける&lt;/b&gt;。&lt;/div&gt;
&lt;br /&gt;
早速ソースコードを追いかけてみたのですが、すぐ理解できなかったので自分で書き直してみました。なるほど、分かってしまえば、単純なことを丁寧に積み重ねていたんですね。&lt;br /&gt;
&lt;br /&gt;
理解のために書いたコードですが、せっかくなので、衆目の下に晒すことにしました。クラス名は&lt;i&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;_ww&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;。アンダースコア・ワラワラと読んでください。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ちなみにWalla Wallaはアメリカ合衆国はワシントン州にある小さな町です。昔、あの近くのもっと辺鄙な場所で学生してたことがあったので、名前に使ってみました。&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
◆&lt;b&gt;簡単な使い方。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
まずは一番簡単なスタティック・メソードで呼ぶ方法。&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;pre class="brush: php"&gt;// use as static method. 
$ww = _ww::each( 
    array( 1,2,3 ), 
    function($n) { echo $n . "\n"; } 
  );&lt;/pre&gt;
実際のeachの中身は、&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;i&gt;_wwm&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;というクラス内で定義されています。&lt;br /&gt;
&lt;pre class="brush: php"&gt;class _wwm
{
  static public function each( $collection, $iterator ) {
    if( !empty( $collection ) )
    foreach($collection as $k=&amp;gt;$v) {
      call_user_func($iterator, $v, $k, $collection);
    }
  }
}&lt;/pre&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;i&gt;$collection&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;が配列で、foreach文を使って各要素について&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$iterator&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;関数を呼んでいます。&lt;br /&gt;
&lt;br /&gt;
これだと、普通なPHPといった感じです。&lt;br /&gt;
次はメソードチェーンをしてみます。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;チェーンで次々と処理する&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
eachとかをつなぎ合わせてチェーンのように使えます。&lt;br /&gt;
&lt;pre class="brush: php"&gt;// use as a chain of methods. 
_ww::chain(  array( 1,2,3 ) )
  -&amp;gt;each(  function($n) { echo "in chain $n" . "\n"; } )
  -&amp;gt;get(   $mid )
  -&amp;gt;map(   function($n) { return $n * 2; } )
  -&amp;gt;value( $result );
var_dump( $mid );
var_dump( $result );&lt;/pre&gt;
ポイントは、&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;chain&lt;/b&gt;メソードで始めること。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;value&lt;/b&gt;メソードでチェーンを終了して、結果を受け取ること。&lt;/li&gt;
&lt;li&gt;チェーンの途中で値を使いたい場合は&lt;b&gt;get&lt;/b&gt;メソードが使うこと。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
といった所でしょうか。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;チェーンの仕方を理解する&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
一体どうなっているか、&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;_ww&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;クラスの中を少し見てみます。&lt;br /&gt;
&lt;pre class="brush: php"&gt;class _ww
{
  private $_wrapped = NULL;  // holds the data
  
  public function __construct( $collection ) {
    $this-&amp;gt;_wrapped = (array) $collection;
  }
  public static function chain( $collection ) {
    return new _ww( $collection );
  }
}&lt;/pre&gt;
&lt;b&gt;chain&lt;/b&gt;メソード内で、自分を&lt;b&gt;new&lt;/b&gt;してます。いや、自分自身のインスタンスを作成してます。入力された配列はオブジェクト内の&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$_wrapped&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;という変数に保存されます。&lt;br /&gt;
&lt;br /&gt;
で、作ったオブジェクトをすぐにreturnしてます。&lt;br /&gt;
これでチェーンが始まるというわけです。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;メソードの呼び出し方は？&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
次は&lt;b&gt;each&lt;/b&gt;を呼ぶのですが、_ww自体にはeachなどのメソードは実装されてません。その代わりに「magicメソード」と呼ばれる&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;__call&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;メソードが呼ばれます。&lt;br /&gt;
&lt;pre class="brush: php"&gt;class _ww
{
  public function value( &amp;amp;$result=NULL ) {
    $result = $this-&amp;gt;_wrapped;
    return $this-&amp;gt;_wrapped;
  }
  public function __call( $method, $args ) {
    $arg  = array_merge( array( $this-&amp;gt;_wrapped ), $input );
    $return = call_user_func_array( "_wwm::$method", $arg );
    if( !is_null( $return ) ) {
      $this-&amp;gt;_wrapped = $return;
    }
    return $this;
  }
}&lt;/pre&gt;
この中で、最初に&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$_wrapped&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;に保存しておいた配列を呼び出して、残りの引数と一緒にして、実際のeachメソードを呼び出しています（&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;call_user_func_array( "_wwm::$method", $arg )&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;の部分&lt;/span&gt;）。&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ここらへんがShinさんの&lt;b&gt;&lt;i&gt;arry&lt;/i&gt;&lt;/b&gt;クラスと実装が違うところです。あちらはeachとかが最初からチェーン内で使われることを想定して書かれてます。一方、元ネタのUnderscore.phpは書くメソードがチェーン内にいるかどうかを判定して、引数と返値を制御しています。ちなみに、&lt;i&gt;&lt;b&gt;_ww&lt;/b&gt;&lt;/i&gt;はスタティックはチェーン外、インスタンスの場合はチェーン内と割り切って、&lt;i&gt;&lt;b&gt;__call&lt;/b&gt;&lt;/i&gt;マジックメソードで引数などを作り直しています。&lt;/span&gt;&lt;/blockquote&gt;
メソードの最後に&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;return $this&lt;/span&gt;をして次のチェーンへつなぎます。&lt;br /&gt;
この後の&lt;b&gt;map&lt;/b&gt;メソードも、同じように処理されます。ただ&lt;b&gt;map&lt;/b&gt;だと返り値があるので、&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$_wrapped&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;の値が変わることになります。&lt;br /&gt;
&lt;br /&gt;
こうして次から次にチェーンにしたがって、&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$_wrapped&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;に入っている配列に対して処理を行ってゆくことが出来ます。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;チェーン部分の出力です&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;in chain 1       // each内で出力
in chain 2
in chain 3
array(3) {       // $midのvar_dump
  [0]=&amp;gt;  int(1)
  [1]=&amp;gt;  int(2)
  [2]=&amp;gt;  int(3)
}
array(3) {       // $resultのvar_dump
  [0]=&amp;gt;  int(2)
  [1]=&amp;gt;  int(4)
  [2]=&amp;gt;  int(6)
}&lt;/pre&gt;
&lt;br /&gt;
◆&lt;b&gt;最後に&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/asaokamei/_ww"&gt;_wwのソースコードはgithubでホスティング&lt;/a&gt;しています。&lt;br /&gt;
ライセンスはMITライセンスです。&lt;br /&gt;
&lt;br /&gt;
コードをちゃんと見ると、テストコードが入り込んでる、クラスが二つに分かれた、とか問題はたくさんあるのですが、ひとまず動いたので今回はここで完了としました。&lt;br /&gt;
&lt;br /&gt;
よく「車輪の再発明」とか言われますが、こういう小さなクラスを書くのはとても楽しいです。実際に使うとか考えると微妙ですが、細かいことは気にしないで作ってみると楽しいと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4193044493169805992?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4193044493169805992/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4193044493169805992' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4193044493169805992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4193044493169805992'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/12/underscore-walla-wallaphp.html' title='Underscore-Walla-WallaというPHPクラスを作ってみた'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1852848073035936978</id><published>2011-12-01T10:08:00.001+09:00</published><updated>2011-12-14T15:35:12.798+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Synergyで「failed to save autostart configuration」エラーが出る</title><content type='html'>&lt;b&gt;Windows VistaでSynergy&lt;/b&gt;を1.3.1から1.3.8に&lt;br /&gt;
アップグレードして、「Start」ボタンを押すと&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;failed to save autostart configuration&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
というエラーメッセージが出て動きませんでした。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;◆解決方法：&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
このページにて発見。&lt;br /&gt;
&lt;a href="http://code.google.com/p/synergy-plus/issues/detail?id=256"&gt;http://code.google.com/p/synergy-plus/issues/detail?id=256&lt;/a&gt;&lt;br /&gt;
まぁグーグルの一番最初のエントリですが。&lt;br /&gt;
&lt;br /&gt;
まず、synergy.exeを「管理者として」走らせます。&lt;br /&gt;
自分のPCだと以下のフォルダーにありました。&lt;br /&gt;
C:\Program Files\Synergy\synergy.exe&lt;br /&gt;
&lt;br /&gt;
次に、Optionsの中の「AutoStart...」ボタンを押す。&lt;br /&gt;
&lt;br /&gt;
「Uninstall」を押して、一旦オートスタートをリセット。&lt;br /&gt;
OKを何度か押す。&lt;br /&gt;
&lt;br /&gt;
これで解決しました。&lt;br /&gt;
&lt;br /&gt;
例によって、管理者権限の問題のようですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1852848073035936978?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1852848073035936978/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1852848073035936978' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1852848073035936978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1852848073035936978'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/12/synergyfailed-to-save-autostart.html' title='Synergyで「failed to save autostart configuration」エラーが出る'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5273352171258484023</id><published>2011-11-30T10:49:00.001+09:00</published><updated>2011-11-30T16:19:12.029+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHPのNullとissetとarray_key_exists</title><content type='html'>先ほど気がついたのですが、PHPのissetの動きを勘違いしていました。&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;pre class="brush: php"&gt;$var=NULL;
isset( $var ); // returns FALSE
is_null( $var ); // return TRUE
is_null( $none ); // E_NOTCE&lt;/pre&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;issetはNULL値をFALSE判定します。&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
いつから勘違いしてたんだろう。&lt;br /&gt;
&lt;br /&gt;
たとえばis_nullで調べればいいのですが、&lt;br /&gt;
変数が存在しない場合は&lt;b&gt;E_NOTICE&lt;/b&gt;が出ます。&lt;br /&gt;
&lt;br /&gt;
実は、あることにNULL値を使おうと思ってたのです。PHPだと空白（''）、FALSE、NULLと三種類あるので便利だなぁと思ってたのですが、変数の判定が出来なければ使いにくい。困ったぞ、というわけです。&lt;br /&gt;
&lt;br /&gt;
で、気がついたのが&lt;b&gt;array_key_exists&lt;/b&gt;を使うこと。&lt;br /&gt;
こういう構造になっている場合、NULLでも存在判定が出来ます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;$data[ 'test' ] = NULL;
array_key_exists( 'test', $data ); // returns TRUE
&lt;/pre&gt;
&lt;br /&gt;
何とかなりそうです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5273352171258484023?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5273352171258484023/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5273352171258484023' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5273352171258484023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5273352171258484023'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/phpnullissetarraykeyexists.html' title='PHPのNullとissetとarray_key_exists'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-7344528709244029057</id><published>2011-11-28T16:55:00.001+09:00</published><updated>2011-11-28T17:18:35.240+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>formUpDownというJavaScript</title><content type='html'>Ctrl＋矢印キーで、テーブル内のフォーム要素間を動き回るコードを書きました。&lt;br /&gt;
長らくリンク切れになってましたが、デモをアップしました。&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.workspot.jp/tech/formUpDn/formupdnTable.html"&gt;http://www.workspot.jp/tech/formUpDn/formupdnTable.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
かなり格好の悪いHTMLですが、実際に動きます。&lt;br /&gt;
ちなみに&lt;a href="https://github.com/asaokamei/formUpDown"&gt;ソースコードはgithub&lt;/a&gt;にあります。&lt;br /&gt;
&lt;br /&gt;
まだjQueryのプラグイン化すらしてませんが。&lt;br /&gt;
&lt;br /&gt;
実際に使うと分かりますが、セレクト要素の動きが変です。&lt;br /&gt;
作ったときから、そして今でも、更にはブラウザーによって挙動が変わります。&lt;br /&gt;
&lt;br /&gt;
こういったところは、JavaScriptの問題かなと考えてます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-7344528709244029057?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/7344528709244029057/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=7344528709244029057' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7344528709244029057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7344528709244029057'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/formupdownjavascript.html' title='formUpDownというJavaScript'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8312486123866426936</id><published>2011-11-23T10:57:00.001+09:00</published><updated>2011-11-28T17:18:42.719+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>yet another な Validator クラス</title><content type='html'>なんで、世の中に数あるValidatorクラスを作ってるのか、&lt;br /&gt;
などと自問自答しながら作ってます。&lt;br /&gt;
&lt;br /&gt;
開発中なのですが、特徴をはっきりさせておくために、ブログでまとめます。&lt;br /&gt;
&lt;br /&gt;
◆まず、面白くも何ともない普通の特徴から。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;できるだけ簡単に使えるインターフェース、&lt;/li&gt;
&lt;li&gt;タイプ（テキスト、メールアドレスとか）を指定すると前もって決めておいたルールに従ってバリデーションする、&lt;/li&gt;
&lt;li&gt;フォーム入力だけでなく、普通の変数・配列でも適用可能。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
とかでしょうか。&lt;br /&gt;
こういうのルールベースでのバリデーションとか言うのでしょうか。&lt;br /&gt;
&lt;br /&gt;
◆これだけなら、別に作る必要はないわけで、一応自分なりの理由があって作ってます。ただ、他のValidatorクラスで実現してるか確認してはいませんが。&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;バリデーション、サニテーション、フィルター、全部入り&lt;/li&gt;
&lt;li&gt;ルールの適用順番があらかじめ決まっている&lt;/li&gt;
&lt;li&gt;複数に分割している項目も一つとしてバリデーション可能&lt;/li&gt;
&lt;li&gt;配列入力もバリデーション可能&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
◆もう少し詳しく説明します。&lt;br /&gt;
&lt;br /&gt;
１．全部入りルール&lt;br /&gt;
&lt;br /&gt;
次のような３種類のルールがあると思うのですが、全部に対応しています。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;サニテーション：&lt;br /&gt;
ヌルバイトアタック、エンコーディングチェック、を行い、&lt;br /&gt;問題があれば安全な内容で上書きします。&lt;/li&gt;
&lt;li&gt;フィルター：&lt;br /&gt;
全角→半角、大文字・小文字変換、その逆、など。&lt;/li&gt;
&lt;li&gt;バリデーション：&lt;br /&gt;レギュラーエクスプレッションによるフォーマットチェックなど。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
２．ルールの順番を決めてある&lt;br /&gt;
&lt;br /&gt;
まぁ大量のルールがある訳です。&lt;br /&gt;
が、例えば日本語だと、大文字→小文字変換を行う前には、全角→半角に変換しないと行けません。こういう順番を意識してルールを適用しても問題がないよう、ルールの順番を内部で持ってます。&lt;br /&gt;
&lt;br /&gt;
３．複数分割項目対応&lt;br /&gt;
&lt;br /&gt;
日付など、一つのデータでありながらフォーム上は複数の項目から成り立っている場合があります。例えば&lt;br /&gt;
&lt;br /&gt;
$_POST = array(&lt;br /&gt;
&amp;nbsp;'date_y' =&amp;gt; '2011',&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&amp;nbsp;'date_m' =&amp;gt; '11',&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&amp;nbsp;'date_d' =&amp;gt; '23',&lt;/div&gt;
);&lt;br /&gt;
&lt;br /&gt;
find( $_POST, 'name', array( 'multiple' =&amp;gt; array(&lt;br /&gt;
&amp;nbsp;'suffix' =&amp;gt; array('y','m','d'),&lt;br /&gt;
&amp;nbsp;'sformat' =&amp;gt; '$4d/$02d/$02d',&lt;br /&gt;
) ) );&lt;br /&gt;
&lt;br /&gt;
４．配列入力のバリデーション&lt;br /&gt;
&lt;br /&gt;
フォームのチェックボックスからだと、入力が配列の場合があります。&lt;br /&gt;
入力が配列の場合でも、それぞれの要素ごとにルールを適用してバリデーションします。またエラーがあった場合は、入力と同じ構造でエラーメッセージを返します。&lt;br /&gt;
&lt;br /&gt;
例えば、数値のみの入力を可能にしている場合、&lt;br /&gt;
input: $input = array( 0 =&amp;gt; '1', 1=&amp;gt;'3', 2=&amp;gt;'x', 3=&amp;gt;'4' );&lt;br /&gt;
error: $error = array( 2=&amp;gt;'not a number' );&lt;br /&gt;
という構造でエラーメッセージを作ります。&lt;br /&gt;
&lt;br /&gt;
◆ソースコード&lt;br /&gt;
&lt;br /&gt;
まだ開発中。&lt;br /&gt;
Cena-DTA内に組み込む予定なので、それから公開します。&lt;br /&gt;
githubにおいてあるので、探せば見つかりますが。&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8312486123866426936?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8312486123866426936/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8312486123866426936' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8312486123866426936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8312486123866426936'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/yet-another-validator.html' title='yet another な Validator クラス'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8986677526758836178</id><published>2011-11-19T14:08:00.001+09:00</published><updated>2011-11-28T17:18:50.579+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@高円寺、2011/11/19</title><content type='html'>今日はいつものSimple勉強会＠高円寺。&lt;br /&gt;
何をしようか考えながら、だらだらとして昼食して・・・&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;注目のPHPのフレームワーク&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
いろんなソースコードを読めるようにしようと思い立ち。&lt;br /&gt;
いくつか、すごそうな最新のPHPフレームワークなどを選んでみた。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/UnionOfRAD/lithium"&gt;&lt;b&gt;Lithium&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;CakePHPの人たちが作ってるPHP5.3用フレームワーク。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fuel/core"&gt;&lt;b&gt;Fuel&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;CodeIgniterの人たちが作ってるPHP5.3用フレームワーク。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/brianhaveri/Underscore.php"&gt;&lt;b&gt;underscore.php&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;underscoreというjavaScriptのPHPポート。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
コードをみても、追いかけられないorz&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;macでnetbeansでPHPのデバッグ環境を設定&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
コードを追いかけられないならデバッガーで追いかける。&lt;br /&gt;
MacBookAirにxdebugインストールして、デバッグ環境を整えました。&lt;br /&gt;
詳細は、&lt;a href="http://wsjp.blogspot.com/2011/11/macbrewxdebugnetbeansphp.html"&gt;こちらのページ&lt;/a&gt;で。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;で、underscore.phpを追いかけてみた。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
が、追いかけられない。&lt;br /&gt;
何となくやってることは分かるけど。&lt;br /&gt;
&lt;br /&gt;
staticクラスでメソードチェーンを、実現するため、引数を統一処理して、次のメソードに渡して、それを次々と処理している・・・と思う。が、追いかけきれない。&lt;br /&gt;
&lt;br /&gt;
本当にすごいと思う。けど、&lt;br /&gt;
&lt;b&gt;「こういうコードが書けるようにならなくてもいいはず」&lt;/b&gt;&lt;br /&gt;
と思うようにしよう。&lt;br /&gt;
&lt;br /&gt;
◆Dioのコーディングでも&lt;br /&gt;
&lt;br /&gt;
することにしました。&lt;br /&gt;
えぇと、フィルター（サニテーションとかバリデーション）を行うのに無名関数を使うように変更。これで変更しやすくなるはず・・・&lt;br /&gt;
&lt;br /&gt;
と、static変数に無名関数を代入できない・・・&lt;br /&gt;
多分、staticなのに無名関数を実行しようとしてエラーなのか。&lt;br /&gt;
う〜ん、Lithiumみたいに__initとかで設定するか。&lt;br /&gt;
&lt;br /&gt;
してみた。が、こんなのでいいのか悩む。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8986677526758836178?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8986677526758836178/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8986677526758836178' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8986677526758836178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8986677526758836178'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/simple20111119.html' title='Simple@高円寺、2011/11/19'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-9216049780971561215</id><published>2011-11-19T13:18:00.001+09:00</published><updated>2011-11-30T16:20:33.742+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>MacのbrewでxdebugインストールしてnetbeansでPHPのデバッグ</title><content type='html'>Simple勉強会＠高円寺の作業ログ。&lt;br /&gt;
&lt;br /&gt;
◆xdebugのインストール&lt;br /&gt;
&lt;br /&gt;
マックでライオンでbrew使ってxdebugどうやってインストールするのか検索したが、いい感じのページが見つからず。そんなときは打ち込んでみる。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;pr&gt;&lt;code&gt;&amp;gt; brew install xdebug&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;==&amp;gt; Downloading http://xdebug.org/files/xdebug-2.1.2.tgz&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;######################################################################## 100.0%&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;==&amp;gt; phpize&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;==&amp;gt; ./configure --disable-debug --prefix=/usr/local/Cellar/xdebug/2.1.2 --enable&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;==&amp;gt; make&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;==&amp;gt; Caveats&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;To use this software:&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;&amp;nbsp; * Add the following line to php.ini:&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; zend_extension="/usr/local/Cellar/xdebug/2.1.2/xdebug.so"&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;&amp;nbsp; * Restart your webserver.&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;&amp;nbsp; * Write a PHP page that calls "phpinfo();"&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;&amp;nbsp; * Load it in a browser and look for the info on the xdebug module.&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;&amp;nbsp; * If you see it, you have been successful!&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;==&amp;gt; Summary&lt;/code&gt;&lt;/pr&gt;&lt;pr&gt;&lt;code&gt;/usr/local/Cellar/xdebug/2.1.2: 348K, built in 15 seconds&lt;/code&gt;&lt;/pr&gt;&lt;/blockquote&gt;
&lt;br /&gt;
なんだ。&lt;br /&gt;
インストール一発でできたみたい。&lt;br /&gt;
&lt;br /&gt;
◆次はphp.iniの修正。&lt;br /&gt;
&lt;br /&gt;
インストールからのメッセージを読めば書いてある、親切設計。&lt;br /&gt;
が、その通りに書いただけではnetbeansからデバッグできなかった。&lt;br /&gt;
&lt;br /&gt;
ちょっとググって、下記のURLから&lt;br /&gt;
http://wiki.netbeans.org/HowToConfigureXDebug&lt;br /&gt;
これをxdebugのセクションの下にコピー。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
これでnetbeansでデバッグできるようになりました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-9216049780971561215?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/9216049780971561215/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=9216049780971561215' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9216049780971561215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9216049780971561215'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/macbrewxdebugnetbeansphp.html' title='MacのbrewでxdebugインストールしてnetbeansでPHPのデバッグ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3001651499816386417</id><published>2011-11-09T10:34:00.002+09:00</published><updated>2011-12-02T14:12:26.758+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Chromeのuserスクリプト書いてみた</title><content type='html'>なんて簡単に･･･&lt;br /&gt;
FireFoxでGreacemonkey書いたときは苦労した記憶がある。&lt;br /&gt;
まだJavaScriptに慣れてなかったからか、jQueryのインストールに苦労したのか･･･&lt;br /&gt;
&lt;br /&gt;
ともあれ、&lt;br /&gt;
JavaScript書く⇒Chromeにインストール&lt;br /&gt;
がこんなに簡単なんて。&lt;br /&gt;
&lt;br /&gt;
◆書いたコード：&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;pre class="brush: javascript"&gt;
// ==UserScript==
// @match http://dev.example.com/*
// ==/UserScript==

links = 
  document.evaluate(
    '//a[contains(@href,"http://www.example.com")]|', 
    document, null, 
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (i = 0; i &lt; links.snapshotLength; i++) {
  links.snapshotItem(i).href = 
    links.snapshotItem(i).href.replace( 
    /\/\/www.example.com/i, "//dev.example.com" );
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
開発サーバー（dev.example.com）を立ち上げたけど、絶対パスでリンクが張ってある箇所が多いので、ユーザースクリプトでリンク先を強制書き直し。&lt;br /&gt;
&lt;br /&gt;
◆上のファイルを自分のPCに保存。&lt;br /&gt;
&lt;br /&gt;
「test-server.user.js」とかにして保存した。&lt;br /&gt;
&lt;br /&gt;
で、&lt;b&gt;Chrome上にドラッグ＆ドロップ&lt;/b&gt;で、ドロップ。&lt;br /&gt;
&lt;br /&gt;
すると、&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;左下に確認画面（Extensionはコンピュータにダメージ与えるかもしれないけど、続けていい？）が出るので「&lt;b&gt;Continue&lt;/b&gt;」を押す、&lt;/li&gt;
&lt;li&gt;ダイアログウィンドウが出るので「&lt;b&gt;Install&lt;/b&gt;」ボタンを押す、&lt;/li&gt;
&lt;li&gt;で、インストール完了。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
何度もやる作業なので、インストールが簡単なのは素晴らしい。&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3001651499816386417?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3001651499816386417/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3001651499816386417' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3001651499816386417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3001651499816386417'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/chromeuser.html' title='Chromeのuserスクリプト書いてみた'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-2535563391865617913</id><published>2011-11-08T17:09:00.002+09:00</published><updated>2011-11-10T14:02:22.138+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>ChromeでGreasemonkey：JavaScriptでリンク先を変更</title><content type='html'>仕事で使いそうなので。メモ。&lt;br /&gt;
&lt;br /&gt;
◆ChromeでもGreasemonkeyが使えるらしい。&lt;br /&gt;
&lt;a href="http://internet.watch.impress.co.jp/docs/news/20100202_346437.html"&gt;http://internet.watch.impress.co.jp/docs/news/20100202_346437.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
知らなかった～&lt;br /&gt;
早速、ウェブページ内のリンクを書き換えるスクリプトを書きたい。&lt;br /&gt;
&lt;br /&gt;
◆が、jQueryが使えないとの話。&lt;br /&gt;
&lt;br /&gt;
まぁこういうスクリプトを入れればよさそうだ。&lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/2246901/how-can-i-use-jquery-in-greasemonkey-scripts-in-google-chrome"&gt;http://stackoverflow.com/questions/2246901/how-can-i-use-jquery-in-greasemonkey-scripts-in-google-chrome&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆でも、もっとピュアJavaScriptでリンクの書き換えぐらい出来ないのか？&lt;br /&gt;
&lt;br /&gt;
ちょっとググルと、サンプルコードがあった。&lt;br /&gt;
&lt;a href="http://userscripts.org/topics/1966?page=1"&gt;http://userscripts.org/topics/1966?page=1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;document.evaluate&lt;/b&gt;ってなんだ！&lt;br /&gt;
&lt;br /&gt;
そんなメソード知らなかった！！！&lt;br /&gt;
XPathって言うんだ。。。&lt;br /&gt;
うん？「XPath」は聞いたことがある気がする･･･&lt;br /&gt;
&lt;br /&gt;
なんか、とてつもなく、使えそう。&lt;br /&gt;
&lt;a href="http://www.softel.co.jp/blogs/tech/archives/2067"&gt;http://www.softel.co.jp/blogs/tech/archives/2067&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
こちらは、引数について説明が細かくある。&lt;br /&gt;
&lt;a href="http://deltatech.blog90.fc2.com/blog-entry-332.html"&gt;http://deltatech.blog90.fc2.com/blog-entry-332.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ちょっとしたことでも、jQueryが便利だから使ってたけど、&lt;br /&gt;
ピュアJavaScriptでも、かなりのことが出来そう。&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-2535563391865617913?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/2535563391865617913/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=2535563391865617913' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2535563391865617913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2535563391865617913'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/chromegreasemonkeyjavascript.html' title='ChromeでGreasemonkey：JavaScriptでリンク先を変更'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5150350693636927521</id><published>2011-11-06T10:32:00.000+09:00</published><updated>2011-11-10T14:03:19.284+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>gitのbranchを覚える</title><content type='html'>gitを使うなら、branchを覚えるべきらしい。&lt;br /&gt;
なので、勉強がてらにメモ。&lt;br /&gt;
&lt;br /&gt;
◆githubにレポジトリがある状態から&lt;br /&gt;
&lt;br /&gt;
既にgithubでレポジトリを作ってるとして、まずはclone。&lt;br /&gt;
&lt;br /&gt;
git clone&amp;nbsp;git@github.com:asaokamei/test.git&lt;br /&gt;
&lt;br /&gt;
◆ブランチの作成と確認&lt;br /&gt;
&lt;br /&gt;
覚えるのはgit {branch|checkout} コマンド。&lt;br /&gt;
これでローカルレポジトリ上でbranchを作成したり、&lt;br /&gt;
branchを行ったり来たりできる。&lt;br /&gt;
&lt;br /&gt;
まずはブランチを作成。そして現在のブランチを確認。&lt;br /&gt;
&lt;blockquote class="tr_bq" style="background-color: #cccccc; font-size: smaller;"&gt;
&amp;gt; git branch jpn&lt;br /&gt;
&amp;gt; git branch&lt;br /&gt;
&amp;nbsp; jpn&lt;br /&gt;
* master&lt;/blockquote&gt;
&lt;div&gt;
新しいブランチ「jpn」に切り替え。そして現在のブランチを確認。&lt;/div&gt;
&lt;blockquote class="tr_bq" style="background-color: #cccccc; font-size: smaller;"&gt;
&amp;gt;&amp;nbsp;git checkout jpn&lt;br /&gt;
Switched to branch 'jpn'&lt;br /&gt;
&amp;gt;git branch&lt;br /&gt;
* jpn&lt;br /&gt;
&amp;nbsp; master&lt;/blockquote&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
◆で、ここからgit gui（笑&lt;br /&gt;
&lt;br /&gt;
軟弱ものなので、gui版を使ってます。&lt;br /&gt;
「git gui &amp;amp;」でgui版を走らせます。&lt;br /&gt;
&lt;br /&gt;
すると「現在のブランチ jpn」と出てます。&lt;br /&gt;
うまくいってる感じ。&lt;br /&gt;
&lt;br /&gt;
適当にファイルを追加・編集したら&lt;br /&gt;
コミットしてプッシュを押すと、「元のブランチ」で&lt;br /&gt;
&lt;blockquote class="tr_bq" style="background-color: #cccccc; font-size: smaller;"&gt;
jpn&lt;br /&gt;
master&lt;/blockquote&gt;
&lt;br /&gt;
が出た。&lt;br /&gt;
「jpn」が選ばれてるのを確認してから、&lt;br /&gt;
「リモート：origin」でプッシュ。&lt;br /&gt;
&lt;br /&gt;
githubで確認したら、ちゃんとブランチが切られてできてました。&lt;br /&gt;
&lt;br /&gt;
◆簡単でした。&lt;br /&gt;
&lt;br /&gt;
なんか悩んでましたが、これだけなら簡単ですね。&lt;br /&gt;
gui版を使えば、どこにプッシュするかもわかりやすいので、&lt;br /&gt;
間違えないですみそうです。&lt;br /&gt;
&lt;br /&gt;
まぁブランチの入門編でしかないですが。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5150350693636927521?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5150350693636927521/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5150350693636927521' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5150350693636927521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5150350693636927521'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/11/gitbranch.html' title='gitのbranchを覚える'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6149970634296881280</id><published>2011-10-22T16:36:00.002+09:00</published><updated>2011-11-10T14:03:19.290+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>fluxflexを使ってみる＠Simple</title><content type='html'>PHPが使えて、githubから簡単インストール、で有名な？&lt;br /&gt;
Fluxflexを使ってみます。&lt;br /&gt;
&lt;a href="https://www.fluxflex.com/"&gt;https://www.fluxflex.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
日本人がサンホセ（シリコンバレーのことですね）で立ち上げた新しいPaaSらしいです。&lt;br /&gt;
&lt;br /&gt;
◆アカウント作成・認証。&lt;br /&gt;
&lt;br /&gt;
簡単にtwitterを使って認証。&lt;br /&gt;
ものの５分たたずに最初のsandoboxが立ち上がった。&lt;br /&gt;
&lt;a href="http://sandbox-6bh0ihgi.fluxflex.com/"&gt;http://sandbox-6bh0ihgi.fluxflex.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
素晴らしい。&lt;br /&gt;
&lt;br /&gt;
◆新しいプロジェクト作成&lt;br /&gt;
&lt;br /&gt;
適当にプロジェクト名を決定して・・・&lt;br /&gt;
もしかして大文字不可？&lt;br /&gt;
&lt;br /&gt;
ともあれ、名前を入力して、Create A New Project を押して、完了。&lt;br /&gt;
&lt;br /&gt;
名前：cenadta-demo&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
◆fluxflex用のgithubレポジトリを作成&lt;br /&gt;
&lt;br /&gt;
CenaDTA-fluxflexというレポジトリを作成。&lt;br /&gt;
&lt;br /&gt;
次に作業フォルダーを作って、&lt;br /&gt;
public_htmlというフォルダーを作成。ここが公開フォルダーになるとのこと。&lt;br /&gt;
&lt;br /&gt;
その中に、Cena-DTAを放り込む。&lt;br /&gt;
噂ではgit内に別のgitがある場合、fluxflexが動かないらしい。&lt;br /&gt;
ので、.gitフォルダーはすべて削除。&lt;br /&gt;
&lt;br /&gt;
データベース接続の設定ファイル内のユーザー名などをCENA_DB_USERに変更。後述しますが、設定を変換できるらしい。&lt;br /&gt;
&lt;br /&gt;
そんで、git commit してpush。&lt;br /&gt;
&lt;br /&gt;
◆fluxflexでの設定の方法&lt;br /&gt;
&lt;br /&gt;
さて、githubからimportする際に、DBへの接続パラメータを上書きできるようになってます。これがないと、公開レポジトリ使うとパスワードが漏れてしまいます。&lt;br /&gt;
&lt;br /&gt;
まずは、SetUpの中のDatabaseで、データベース接続パラメターを確認。&lt;br /&gt;
同じくSetUp内のInitialize Scriptで、Initializer ScriptとSetEnv Variablesをセットアップ。こんな感じ。&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;[replace]&lt;br /&gt;public_html/demo/dba.ini.php &amp;nbsp; CENA_DB_USER &amp;nbsp; &amp;nbsp; DBA_USER&lt;/span&gt;&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;DB_USER &amp;nbsp; cenadta-demo&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
ここで、Github Importで、先のgithubレポジトリ&lt;/div&gt;
&lt;div&gt;
git@github.com:asaokamei/CenaDTA-fluxflex.git&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
を指定してimport！&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
◆動いた・・・が、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
早速、DBの初期化。&lt;br /&gt;
が、データベースの接続で&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red; font-family: メイリオ, Arial, 'ＭＳ Ｐゴシック'; font-size: 14px; font-weight: bold; line-height: 22px;"&gt;SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red; font-family: メイリオ, Arial, 'ＭＳ Ｐゴシック';"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 22px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
と怒られた。&lt;br /&gt;
&lt;br /&gt;
◆なぜでしょう？&lt;br /&gt;
&lt;br /&gt;
まずimportする際に、「Run initialize scripts for setting up the project.」にチェックを入れて押すことに。これで少し前進した様子。&lt;br /&gt;
&lt;br /&gt;
次に、fluxflexのstatistics内のInitialization Logsにエラーを発見。&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: #efefef; color: #555555; font-family: arial, helvetica, clean, sans-serif; font-size: 12px; line-height: 15px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre style="font-family: monospace; line-height: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[!FAILED] invalid fixture key : XPS in line 3&lt;/pre&gt;
&lt;br /&gt;
とあって、XPSという文字列の変換に失敗している様子。その後のファイルが見つかりませんのエラーは、最初のエラーが原因で発生しているようで、無視して大丈夫みたい。&lt;br /&gt;
&lt;br /&gt;
うん？XPSなんて文字は指定してないぞ。&lt;br /&gt;
どうやら、XPSは環境変数に設定されていない場合のエラーのようです。&lt;br /&gt;
&lt;br /&gt;
◆もう一度、落ち着いてimportとinitializationから&lt;br /&gt;
&lt;br /&gt;
まず、Initialize Scriptの[replace]ですが、&lt;br /&gt;
&amp;nbsp; ファイル名、変換する文字、変換後の文字、&lt;br /&gt;
なのですが、変換後の文字はEnvironemntを通して設定するようです。&lt;br /&gt;
&lt;br /&gt;
ただし、最初から次の変数は環境変数に設定されているようです。&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="td1" valign="top"&gt;&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;# DB_USER ... The username of the project database. This name is the same as project name in almost all cases.&lt;br /&gt;# DB_PASSWORD ... The password of the project database.&lt;br /&gt;#&amp;nbsp;DB_HOST ... The hostname of the project database.&lt;br /&gt;#&amp;nbsp;PROJECT_NAME ... The project name.&lt;/span&gt;&lt;/blockquote&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
なので、Initialize Scriptに、&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;[replace]&lt;br /&gt;public_html/demo/dba.ini.php &amp;nbsp; CENA_DB_USER &amp;nbsp; &amp;nbsp; DB_USER&lt;br /&gt;public_html/demo/dba.ini.php &amp;nbsp; CENA_DB_PASSWORD &amp;nbsp; &amp;nbsp;DB_PASSWORD&lt;br /&gt;public_html/demo/dba.ini.php &amp;nbsp; CENA_DB_HOST &amp;nbsp; &amp;nbsp; DB_HOST&lt;br /&gt;public_html/demo/dba.ini.php &amp;nbsp; CENA_DB_NAME &amp;nbsp; &amp;nbsp; PROJECT_NAME&lt;/span&gt;&lt;/blockquote&gt;
と設定するだけで動きました。&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;追記：最初は.fixファイルを使うつもりだったのですが。&lt;br /&gt;忘れてた。こちらの方がgitで管理できるので便利と思われる。&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
◆Cena-DTAのでもサイトが公開！&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://cenadta-demo.fluxflex.com/"&gt;http://cenadta-demo.fluxflex.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
よろしく〜&lt;br /&gt;
まだセキュリティ関係があれなので、気をつけて使ってください。&lt;br /&gt;
変なデータ入れられても、XSSしてしまいます。&lt;br /&gt;
また、定期的にDB内はクリーンアップしますので、大事なデータとか入れないように。&lt;br /&gt;
&lt;br /&gt;
◆文字化けしている。&lt;br /&gt;
&lt;br /&gt;
が、ちょっとみたら文字化けしていますね。&lt;br /&gt;
DBに入れた文字が化けてるみたいです。&lt;br /&gt;
&lt;br /&gt;
fluxflexからphpMyAdminを使えますので、早速ログイン。&lt;br /&gt;
データベースの操作メニューで、照合順序をみたら、latinとなってます。&lt;br /&gt;
これをutf8_unicode_ciに変更して、実行。&lt;br /&gt;
一旦テーブルをドロップしてから、作り直したらなおりました。&lt;br /&gt;
&lt;br /&gt;
午後いっぱいかかりましたが、サイト一個アップするのも簡単になりました。&lt;br /&gt;
素晴らしいサービスです。いい時代です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6149970634296881280?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6149970634296881280/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6149970634296881280' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6149970634296881280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6149970634296881280'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/10/fluxflexsimple.html' title='fluxflexを使ってみる＠Simple'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4901767142523651887</id><published>2011-10-22T13:42:00.004+09:00</published><updated>2011-11-10T14:02:37.373+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@中山</title><content type='html'>いつもの勉強会＠中山。&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-DleTLp8XHqo/Tp7Eu9OtWUI/AAAAAAAAB24/zXjubaQOTrY/s1600/2011-10-19+21.32.36.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-DleTLp8XHqo/Tp7Eu9OtWUI/AAAAAAAAB24/zXjubaQOTrY/s320/2011-10-19+21.32.36.jpg" width="240" /&gt;&lt;/a&gt;◆まずは血圧の測定。&lt;br /&gt;
&lt;br /&gt;
最近、医者に高血圧といわれ薬を飲み始めた。&lt;br /&gt;
ので、今日は一日の血圧の変動を測定する。&lt;br /&gt;
&lt;br /&gt;
測定器は、アマゾンで評価のよかった手首ではかるタイプのやつ（右）。ただ医者で測定するより２０ぐらい低く出る。&lt;br /&gt;
&lt;br /&gt;
０６：０９　１１６−６６&lt;br /&gt;
１１：４５　１２６−７９&lt;br /&gt;
１６：５４　１３９−８０&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
◆何しようかな。&lt;br /&gt;
&lt;br /&gt;
◆Dioモジュール作ってます（PHP）&lt;br /&gt;
&lt;br /&gt;
https://github.com/asaokamei/Dio&lt;br /&gt;
&lt;br /&gt;
Yet-another-validatorですが、入力値のサニタイズ、文字種変換、バリデーション、の全部入りモジュールです。こんな感じで使える予定。&lt;br /&gt;
&lt;br /&gt;
&lt;pr&gt;$mail = Dio::request( 'user_mail', 'email', &lt;br /&gt;&amp;nbsp; array(&lt;br /&gt;&amp;nbsp; &amp;nbsp; 'default'  =&amp;gt; 'text@example.com',&lt;br /&gt;&amp;nbsp; &amp;nbsp; 'required' =&amp;gt; TRUE,&lt;/pr&gt;&lt;br /&gt;
&lt;pr&gt;&amp;nbsp; &amp;nbsp; 'toHankaku' =&amp;gt; TRUE,&lt;br /&gt;&amp;nbsp; &amp;nbsp; 'string'   =&amp;gt; 'lower',&lt;/pr&gt;&lt;br /&gt;
&lt;pr&gt;&amp;nbsp; &amp;nbsp; 'regexp' =&amp;gt; array( '*jp$', 'err_msg' =&amp;gt; '日本ドメインのみ可' ),&lt;br /&gt;&amp;nbsp; )&lt;br /&gt;
);&lt;/pr&gt;
&lt;br /&gt;
&lt;br /&gt;
特徴は：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;できるだけ簡単に。&lt;br /&gt;例のような感じで、普通に簡単に使えるようにしたい。&lt;/li&gt;
&lt;li&gt;文字種変換など順番を指定できる。&lt;br /&gt;全角英数字を半角に変換してからバリデーションする、とか順番が大事なので、前もって順番を指定しておいて、適当に使っても大丈夫にしたい。&lt;/li&gt;
&lt;li&gt;複数の項目を一つにして読み込める。&lt;br /&gt;例：date_y, date_m, date_d を「date」として読み込めます。&lt;/li&gt;
&lt;/ul&gt;
まだ一度も走らせてません。シンタックスエラーすら未チェック状態。&lt;br /&gt;
&lt;br /&gt;
◆今日の課題を決定：fluxflex&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://wsjp.blogspot.com/2011/10/fluxflexsimple.html"&gt;to-be-continue&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4901767142523651887?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4901767142523651887/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4901767142523651887' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4901767142523651887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4901767142523651887'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/10/simple.html' title='Simple@中山'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-DleTLp8XHqo/Tp7Eu9OtWUI/AAAAAAAAB24/zXjubaQOTrY/s72-c/2011-10-19+21.32.36.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-7792602374431165672</id><published>2011-09-17T16:08:00.003+09:00</published><updated>2011-11-10T14:02:50.195+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Simple@高円寺、Qunitなど</title><content type='html'>いつものSimple勉強会。今日は高円寺にて。&lt;br /&gt;
まったりとスタート。&lt;br /&gt;
&lt;br /&gt;
◆QUnitでユニットテスト&lt;br /&gt;
&lt;br /&gt;
Cena-DTAのJavaScriptのユニットテストをするためにQUnitを使ってみた。&lt;br /&gt;
&lt;a href="http://docs.jquery.com/Qunit"&gt;http://docs.jquery.com/Qunit&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
テストコードを作るのはとても簡単。&lt;br /&gt;
&lt;br /&gt;
非同期（asynchronous）の場合のテストもできる。&lt;br /&gt;
&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/how-to-test-your-javascript-code-with-qunit/"&gt;http://net.tutsplus.com/tutorials/javascript-ajax/how-to-test-your-javascript-code-with-qunit/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
「QUnit asynchronous」でググって最初のページだけど。&lt;br /&gt;
疑似コードは：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;test( "asynchronous test sample", function() {
&amp;nbsp; stop(); // テストを一旦止める
&amp;nbsp; async( callback_func );
&amp;nbsp; &amp;nbsp; var callback_func = function() {
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;start(); // テスト再開
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;ok( true );
&amp;nbsp; &amp;nbsp;&amp;nbsp;}
{);
&lt;/pre&gt;
&lt;br /&gt;
・時間の読めない関数（async）を呼ぶ前に、一旦テストをstop、&lt;br /&gt;
・コールバック関数で、実際に実行される箇所で、テストstart、&lt;br /&gt;
・それからテスト条件を書く、&lt;br /&gt;
という感じ。&lt;br /&gt;
&lt;br /&gt;
面倒な点といえば・・・&lt;br /&gt;
テストしたいのがDOMに正しく書かれたかどうかのため、テストの設定が大変だった。また書かれた内容をjQueryで読み込んでとかも面倒。&lt;br /&gt;
&lt;br /&gt;
これはQUnitが原因ではなくて、おしなべてJavaScript全般にいえることでしょう。&lt;br /&gt;
&lt;br /&gt;
◆もっとテストを&lt;br /&gt;
&lt;br /&gt;
結構、テスト書くのは大変です。&lt;br /&gt;
どの機能を、どうやってテストしたらいいのか、考えるだけでも時間がかかってます。先にテストを考えてから作るといいんですかね？&lt;br /&gt;
&lt;br /&gt;
それって、ボトムアップみたいな開発ならできそうなのですが、トップダウンで作ってるとき（つまり試行錯誤しながらクラス設計する場合）後回しにしてしまいそう。いや、後回しにして、後でテスト足りなくて困るという・・・&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-7792602374431165672?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/7792602374431165672/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=7792602374431165672' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7792602374431165672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7792602374431165672'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/09/simplequnit.html' title='Simple@高円寺、Qunitなど'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4474173037259390934</id><published>2011-09-13T13:14:00.002+09:00</published><updated>2011-11-10T14:02:56.283+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><title type='text'>PHPカンファレンスでCena-DTA発表</title><content type='html'>2011年9月10日のPHPカンファレンスでCena-DTAの発表してきました。&lt;br /&gt;
緊張したなぁ～&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UStream&lt;/b&gt;：&lt;br /&gt;
&lt;a href="http://www.ustream.tv/recorded/17175804"&gt;http://www.ustream.tv/recorded/17175804&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
発表&lt;b&gt;資料&lt;/b&gt;：&lt;br /&gt;
&lt;a href="http://www.slideshare.net/asao_jp/cenadta-php-conference-2011-slides"&gt;http://www.slideshare.net/asao_jp/cenadta-php-conference-2011-slides&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;技評さん&lt;/b&gt;の「PHPカンファレンス2011 スペシャルレポート」&lt;br /&gt;
&lt;a href="http://gihyo.jp/news/report/01/phpcon2011/0001?page=2"&gt;http://gihyo.jp/news/report/01/phpcon2011/0001?page=2&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
技術評論社さんには&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;「まだ過渡期の技術ですが&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;今後どんどん&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;　開発が進んでいく注目の技術かもしれません。」&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
と書いてもらえました。&lt;br /&gt;
&lt;br /&gt;
うん？&lt;br /&gt;
&lt;b&gt;「今後どんどん開発が進んでいく～かも」&lt;/b&gt;とは、どういう意味でしょう？&lt;br /&gt;
もっと頑張れ、ということかも知れません。&lt;br /&gt;
&lt;br /&gt;
確かに、発表内容は技術の紹介が半分近くを占めてます。&lt;br /&gt;
発表タイトルにある「アプリ開発」には、ちょっとしか触れてません。&lt;br /&gt;
聞いてくれた人には、思ってたのと違う内容だったかも知れません。&lt;br /&gt;
&lt;br /&gt;
そういう意味で、まだまだ過渡期。&lt;br /&gt;
次こそは、「ぜひ使ってください」という発表をしたいです。&lt;br /&gt;
&lt;br /&gt;
使ってもらえるためには、何が必要でしょう？&lt;br /&gt;
コードとプロトコルをきれいにする？&lt;br /&gt;
セキュリティを極める？&lt;br /&gt;
&lt;br /&gt;
自分としては、摘要可能なRDBの範囲を見極めたいです。&lt;br /&gt;
まだまだ単純なケースでしかCena-DTAが有効であることを示せてません。&lt;br /&gt;
もっと複雑な構造だったら？&lt;br /&gt;
もっと大量のデータだったら？&lt;br /&gt;
&lt;br /&gt;
それと、他の技術もあるけど、&lt;br /&gt;
どういう場合にCena-DTAを使うべきなの？&lt;br /&gt;
&lt;br /&gt;
こういった疑問に答えられるようになりたいです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4474173037259390934?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4474173037259390934/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4474173037259390934' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4474173037259390934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4474173037259390934'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/09/phpcena-dta.html' title='PHPカンファレンスでCena-DTA発表'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-297046140675081021</id><published>2011-08-11T19:26:00.001+09:00</published><updated>2011-11-10T14:03:19.278+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>Mac OS X Lion で homebrew を使ってみる。</title><content type='html'>◆homebrewかmacports&lt;br /&gt;
&lt;br /&gt;
今はhomebrewがおされらしい。&lt;br /&gt;
macportsの問題は色々あるみたいだけど、OSアップデートしたら環境全部壊れた、見たいな事がある、らしいと理解しました。&lt;br /&gt;
&lt;br /&gt;
◆インストール&lt;br /&gt;
&lt;br /&gt;
色々なサイトを参考に、インストール自体は問題なく出来たように見えました。&lt;br /&gt;
&lt;br /&gt;
◆が、インストールがおかしい&lt;br /&gt;
&lt;br /&gt;
最初はインストールしたのですが、&lt;br /&gt;
&lt;blockquote&gt;brew update&lt;br /&gt;
/usr/local/.git: Permission denied&lt;br /&gt;
Error: Failure while executing: git init&lt;/blockquote&gt;などといわれます。&lt;br /&gt;
もう一度homebrewをインストールしてみても、似たようなエラー。&lt;br /&gt;
&lt;br /&gt;
まさかね、と思いながら探していると&lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/6936678/cant-install-homebrew-on-mac-os-x-lion"&gt;http://stackoverflow.com/questions/6936678/cant-install-homebrew-on-mac-os-x-lion&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ちょっと怖いけど、次のコマンドを発行。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;chmod 777 /usr/local&lt;/blockquote&gt;&lt;div&gt;エラーは直りました。&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
◆早速、mysql.server start&lt;br /&gt;
&lt;br /&gt;
エラーはなし。&lt;br /&gt;
が、今度はmysql -u root -pでソケットがありませんとエラーが出ます。&lt;br /&gt;
mysql_config --socketなどで調べたけど、訳が分からず。&lt;br /&gt;
リブートしたら動いた。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-297046140675081021?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/297046140675081021/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=297046140675081021' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/297046140675081021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/297046140675081021'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/08/mac-os-x-lion-homebrew.html' title='Mac OS X Lion で homebrew を使ってみる。'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5797668473414473986</id><published>2011-06-25T15:29:00.000+09:00</published><updated>2011-06-25T15:29:40.904+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2011/06/25</title><content type='html'>CenaをGithubに登録する作業。&lt;br /&gt;
&lt;br /&gt;
数ヶ月前にSSHを設定して、動いていたのだけど、&lt;br /&gt;
パスフレーズをなくしてしまった。&lt;br /&gt;
&lt;br /&gt;
ので、SSHの再設定するのに四苦八苦。&lt;br /&gt;
いろいろググッたけど、結局Githubのヘルプ読むのが&lt;br /&gt;
一番簡単だった。&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/asaokamei/Cena-DTA"&gt;https://github.com/asaokamei/Cena-DTA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
で、Cena-DTAのソースコードをプッシュ。&lt;br /&gt;
友人のマック上で展開して、動作確認してもらって、&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;　　動＊い＊た。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
MySQLの設定部も問題なく進んだし。&lt;br /&gt;
&lt;br /&gt;
さて、GPLｖ２で公開した。&lt;br /&gt;
ということは、もう後戻りはできない、ということですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5797668473414473986?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5797668473414473986/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5797668473414473986' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5797668473414473986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5797668473414473986'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/06/simpleidx-20110625.html' title='Simple@Idx 2011/06/25'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-599415848778218583</id><published>2011-04-23T16:25:00.000+09:00</published><updated>2011-04-23T16:25:40.479+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2011/04/23</title><content type='html'>久々に中山で勉強会。&lt;br /&gt;
&lt;br /&gt;
◆CenaDTAと名づけることに&lt;br /&gt;
&lt;br /&gt;
cenaはイタリア語で夕食の意味。&lt;br /&gt;
意味のある言葉をプロジェクト名にすると、後々面倒なので「Cena-DTA」にすることにした。&lt;br /&gt;
「Cena Data Transfer Agent」の略ということで。&lt;br /&gt;
&lt;br /&gt;
◆gitHub&lt;br /&gt;
&lt;br /&gt;
今後のバージョン管理はgitHub使うことにした。&lt;br /&gt;
有名だからという程度の理由。今まではローカルHDD上でmercurial使ってたので、過去の履歴はすべて破棄されることになる。が、仕方ないんだろうなぁ。&lt;br /&gt;
&lt;br /&gt;
で、早速インストール。&lt;br /&gt;
セットアップの方法にしたがって、インストーラーをダウンロードして走らせると、説明とまったく同じ画面とバージョン番号が出ていた。これって、実はすごいことだと思う。&lt;br /&gt;
&lt;br /&gt;
説明にしたがってSSHキーを取得したりしているうちに動き出した。&lt;br /&gt;
&lt;br /&gt;
が、コミットしてもgitHubに反映されない。&lt;br /&gt;
これはpushが必要だから、と思ったがgitGuiからpushできず。&lt;br /&gt;
結局、gitBashから説明どおりに打ち込んで公開完了した。&lt;br /&gt;
&lt;br /&gt;
https://github.com/asaokamei/Cena-DTA&lt;br /&gt;
&lt;br /&gt;
◆眠くなってきたのでウェブサイトでも作ることに&lt;br /&gt;
&lt;br /&gt;
ざっくりとデザインを決めてアップ。&lt;br /&gt;
&lt;a href="http://www.workspot.jp/cena/"&gt;http://www.workspot.jp/cena/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-599415848778218583?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/599415848778218583/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=599415848778218583' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/599415848778218583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/599415848778218583'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/04/simpleidx-20110423.html' title='Simple@Idx 2011/04/23'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3656754371846415703</id><published>2011-02-26T17:27:00.000+09:00</published><updated>2011-02-26T17:27:29.956+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2011/02/26</title><content type='html'>デモをアンドロイドの実機で動かすのが目標。&lt;br /&gt;
&lt;br /&gt;
実機はGalaxy S。Android 2.2が乗ってます。&lt;br /&gt;
デモはノートブックPCのローカル環境で動いてます。&lt;br /&gt;
&lt;br /&gt;
◆無線LAN環境を整えよう&lt;br /&gt;
&lt;br /&gt;
LogitecのUSB無線LANはAPモードになる。&lt;br /&gt;
アンドロイドからWiFiでPCにつなげられる。&lt;br /&gt;
&lt;br /&gt;
つながったと思ったら不安定だったので、&lt;br /&gt;
最新のドライバーにアップグレード。&lt;br /&gt;
&lt;br /&gt;
◆つなげてみよう&lt;br /&gt;
&lt;br /&gt;
PCのローカルIPを調べて、&lt;br /&gt;
ブラウザーに直接打ち込むと、&lt;br /&gt;
お、動いた。&lt;br /&gt;
&lt;br /&gt;
ここまでは簡単。&lt;br /&gt;
&lt;br /&gt;
◆デモが動かない。&lt;br /&gt;
&lt;br /&gt;
HTMLは表示されるが、WebSqlDatabaseからの読み込まない。&lt;br /&gt;
PHP、JavaScript自体の問題はないみたい。&lt;br /&gt;
デバッグ情報もalertもOK…&lt;br /&gt;
さて、どうしたものか。&lt;br /&gt;
&lt;br /&gt;
◆Android SDKをインストールしてみる。&lt;br /&gt;
&lt;br /&gt;
するとJDKもインストールしろといわれたので、した。&lt;br /&gt;
インストールは簡単に終了。が、動かない。&lt;br /&gt;
&lt;br /&gt;
どうもコンポーネントのダウンロードに失敗していたらしい。&lt;br /&gt;
Windowsなので、「管理者として実行」としたら動いた。&lt;br /&gt;
例の「Program Files」フォルダー以下に書き込めないのが原因だろう。&lt;br /&gt;
&lt;br /&gt;
・・・&lt;br /&gt;
&lt;br /&gt;
なんか動いたみたい。&lt;br /&gt;
すごく遅い。&lt;br /&gt;
&lt;br /&gt;
お、動いた。&lt;br /&gt;
WebSqlDatabaseも動いた。&lt;br /&gt;
エミュレーター上では問題なし。&lt;br /&gt;
&lt;br /&gt;
◆Galaxy Sの問題？&lt;br /&gt;
&lt;br /&gt;
お、Galaxy Sのファームウェアバージョンアップがあった。&lt;br /&gt;
Samsung KiesをPCにインストールする必要があるのか。&lt;br /&gt;
どうしよう。&lt;br /&gt;
&lt;br /&gt;
簡単なWebSqlDatabaseのサンプル･デモを作ったのを思い出した。&lt;br /&gt;
Galaxy Sで確認すると、動いた。&lt;br /&gt;
&lt;br /&gt;
◆jQueryをアップグレード&lt;br /&gt;
&lt;br /&gt;
デモのjQueryが1.4.1と古かったので、1.5.1にアップグレードしてみた。&lt;br /&gt;
すると、PC上のChromeでも動かない。&lt;br /&gt;
直さないといけないみたい。&lt;br /&gt;
&lt;br /&gt;
仕方ないので1.4.4にアップグレード。PC、エミュレーターでは動く。&lt;br /&gt;
が、実機では動かない。&lt;br /&gt;
&lt;br /&gt;
◆実機でデバッグ&lt;br /&gt;
&lt;br /&gt;
しろと。&lt;br /&gt;
ADBとやらを動かして、consoleのアウトプットをみると。&lt;br /&gt;
このあたりのリンクを参考にして。&lt;br /&gt;
&lt;a href="http://www.nanaze.com/2009/01/debugging-javascript-on-android.html"&gt;http://www.nanaze.com/2009/01/debugging-javascript-on-android.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
以上で、時間切れ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3656754371846415703?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3656754371846415703/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3656754371846415703' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3656754371846415703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3656754371846415703'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2011/02/simpleidx-20110226.html' title='Simple@Idx 2011/02/26'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6926175483761460639</id><published>2010-12-19T17:15:00.000+09:00</published><updated>2010-12-19T17:15:38.230+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/12/19</title><content type='html'>本年度最後のSimple勉強会です。&lt;br /&gt;
気がつけば終わってました。&lt;br /&gt;
&lt;br /&gt;
◆特許について&lt;br /&gt;
&lt;br /&gt;
特許取得を考えてます。&lt;br /&gt;
詳細は以降。&lt;br /&gt;
&lt;br /&gt;
◆Dioモジュール&lt;br /&gt;
&lt;br /&gt;
もう6年目も昔に書いた、いまだに使っているクラスを書き換えてました。&lt;br /&gt;
&lt;br /&gt;
実は一昨年に書き換えようと思い立って90%ぐらい作ったのがあるんですが、気に入らなくて没にしてました。もう一度、インターフェースを考え直してみました。&lt;br /&gt;
&lt;br /&gt;
名前だけは思いついてます。&lt;br /&gt;
Data Input/Output、すなわちDIO！&lt;br /&gt;
&lt;br /&gt;
が、だらだらと書いているうちに、&lt;br /&gt;
気がつけば勉強会終了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6926175483761460639?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6926175483761460639/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6926175483761460639' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6926175483761460639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6926175483761460639'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/12/simpleidx-20101219.html' title='Simple@Idx 2010/12/19'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3255052837451997789</id><published>2010-12-10T17:26:00.000+09:00</published><updated>2010-12-10T17:26:17.234+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>NetBeansでPHPのデバッグ</title><content type='html'>今まで何度も試してみたPHPのデバッグ。&lt;br /&gt;
WebStudio、TruStudio、PDTと試したけれど、うまく動かない。&lt;br /&gt;
やはり自分は設定作業が苦手らしい。&lt;br /&gt;
&lt;br /&gt;
で、本日NetBeansでPHPのデバッグ出来るようになりました。&lt;br /&gt;
ブレークポイントで、一行ずつPHPを実行できる気持ちよさ。&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;面倒なので、Twitterのまとめです。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;しかし、いい加減、ドリームウィーバーから卒業したいな。&lt;/li&gt;
&lt;li&gt;NetBeansでPHPデバッグしようかと2時間ばかり設定したが、ブレークポイントが効かない。でDreamWeaverに戻る、と。この5年ぐらい、この繰り返しな気がする。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;あ、動いた。ブレークポイント&lt;/b&gt;。&lt;/li&gt;
&lt;li&gt;PHPのデバッガーが動いているのを見るのはTruStudio以来だｗ&lt;/li&gt;
&lt;li&gt;要するに&lt;b&gt;php.ini内のxdebug設定が間違ってただけ&lt;/b&gt;だった。ただxdebugが中途半端に動いてたので間違いに気づくのに時間がかかったと。&lt;/li&gt;
&lt;li&gt;php.iniで「&lt;b&gt;zend_extension&lt;/b&gt;=...」でxdebugを設定するのだけど、なぜか「&lt;b&gt;zend_extension_ts&lt;/b&gt;」を使ってた。&lt;br /&gt;
あぁ、まとめがあった。http://goo.gl/qRpya&lt;/li&gt;
&lt;li&gt;NetBeansで気になった点。１）最初の&amp;lt;?phpタグで必ずブレークする。２）制限時間30秒ルールが生きてること。２）は仕方ないか。１）は設定できないのかな？&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;付け加えるならextensionでxdebugを読んではいけない、ということです。&lt;/div&gt;&lt;div&gt;php.iniにextension=php_xdebug_...dllが入っていて、中途半端に動いてました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;分かってしまえば簡単。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
これでDreamWeaverから卒業できるか？&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;あとNetBeansで気になった点ですが、いまだに解決できてません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3255052837451997789?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3255052837451997789/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3255052837451997789' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3255052837451997789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3255052837451997789'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/12/netbeansphp.html' title='NetBeansでPHPのデバッグ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6304487124791759494</id><published>2010-11-20T16:31:00.003+09:00</published><updated>2010-11-20T16:40:48.827+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><title type='text'>Cenaとは何？特徴は？</title><content type='html'>Cenaを使うと何が便利になるのか？&lt;br /&gt;
&lt;a href="http://wsjp.blogspot.com/2010/11/html5db.html"&gt;前回のエントリーで書いたローカルデータベースを使った場合の問題&lt;/a&gt;を解決できます。&lt;br /&gt;
&lt;br /&gt;
つまり、&lt;b&gt;データのシンクロナイズ、&lt;/b&gt;ローカル上のデータをサーバーにアップロードする処理が簡単になります。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;新規登録および既存データのID（プライマリキーですね）の追跡が簡単になるため、&lt;b&gt;レコード間のリレーションを含めてアップロードできる&lt;/b&gt;。&lt;/li&gt;
&lt;li&gt;更新したデータのみをサーバーにアップロードできる。&lt;br /&gt;
しかもレコード単位でなく、&lt;b&gt;修正した項目のみのアップロードが可能&lt;/b&gt;。&lt;/li&gt;
&lt;li&gt;一度に複数の更新および新規登録データのシンクロが可能。&lt;/li&gt;
&lt;/ul&gt;そもそもが難しい問題（と思う）ので、簡単にシンクロが出来るというよりは「（比較すれば）簡単になる」と書くべきかもしれません。&lt;br /&gt;
&lt;br /&gt;
また、HTML5などのようなサーバー&amp;amp;クライアントといった関係でのみ対応が可能と考えてます。全てのどんなデータベースでも通信、というのは解決できてません。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;Cenaの本質は？&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cenaの本質は、多分トランスファープロトコルです。&lt;br /&gt;
データをシンクロするための通信内容を規定しています。&lt;br /&gt;
&lt;br /&gt;
このため、クライアント側とサーバー側の両方でプロトコルを理解する必要があります。サーバーはPHP（5.3以降）、クライアントはJavaScript（jQueryプラグイン）で開発しています。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;CenaのPHPライブラリ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ORMの上にCenaのレイヤーをかぶせることで、Cenaに対応しています。ただしORMは自分で開発しているものになります。&lt;br /&gt;
&lt;br /&gt;
理論的には他のORM（Doctrine2とか）でも使えると思いますが、今のところは作業は進んでいません。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;CenaのjQueryプラグイン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
HTML5のローカルデータベースを使うためにjQueryのプラグインを開発しています。現在はWebSqlDatabaseを使っているため、Webkit系（Chrome、Safariなど）のブラウザーで動作します。&lt;br /&gt;
&lt;br /&gt;
WebIndexDatabaseが安定したら、対応する予定です。&lt;br /&gt;
個人的にはsynchronous APIが早く動いて欲しいところですが。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6304487124791759494?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6304487124791759494/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6304487124791759494' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6304487124791759494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6304487124791759494'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/11/cena.html' title='Cenaとは何？特徴は？'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4013366370657984266</id><published>2010-11-19T05:07:00.001+09:00</published><updated>2010-11-19T05:10:20.728+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><title type='text'>HTML5のローカルDBを使う場合の問題点</title><content type='html'>Cenaというフレームワーク、のようなものを作ってますが･･･&lt;br /&gt;
なぜCenaを作る｜使うのか？&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;HTML5が登場し、ブラウザーにローカルデータベースが出来たことで、ウェブアプリケーションの機能が飛躍的に向上します。サーバーと通信することなく、大量のデータを変更したり追加することが可能となります。リレーショナルデータベースを扱えるので、複雑な構造のデータでも扱える利点があります。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;ただし、ローカルデータベースを使った場合、&lt;br /&gt;
難しい問題がいくつかあります。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;データのシンクロにおける問題&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ローカルで作成したデータをサーバーにアップロードする際、リレーションを保つのが難しいです。&lt;br /&gt;
&lt;br /&gt;
たとえば、新たにデータを追加したうえで、既存のデータをリンクさせる場合です。新しいデータにはIDが振られていません。サーバーにアップロードするとIDが振りなおされるため、リレーションが切れてしまいます。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;複数デバイスの更新問題&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
複数のクライアントにデータをダウンロードして、アップロードした場合にどうなるのか？&lt;br /&gt;
&lt;br /&gt;
たとえばデバイスAとBがあったとします。&lt;br /&gt;
まずデバイスAとBの両方にデータをダウンロード。&lt;br /&gt;
次にデバイスAでデータ１を修正、アップロード。&lt;br /&gt;
そしてデバイスBでデータ２を修正、アップロード。&lt;br /&gt;
&lt;br /&gt;
そのとき、データ１はどうなるのでしょう？&lt;br /&gt;
デバイスBのデータ１には、デバイスAの修正は反映されてません。このデータを全てアップロードすると、データ１は元のデータに戻ってしまいます。&lt;br /&gt;
&lt;br /&gt;
つまり修正したデータのみをアップロードする必要があります。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Cenaフレームワーム&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cenaは上記二つの問題を解決するために開発しています。&lt;br /&gt;
汎用性のある解決法だと思っていますが、クライアント（HTML5）とサーバーの両方で対応する必要があります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4013366370657984266?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4013366370657984266/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4013366370657984266' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4013366370657984266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4013366370657984266'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/11/html5db.html' title='HTML5のローカルDBを使う場合の問題点'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4062700541804467106</id><published>2010-10-30T15:12:00.005+09:00</published><updated>2010-10-30T17:33:00.542+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/10/30</title><content type='html'>台風（ほぼ？）直撃の中のSimple勉強会。&lt;br /&gt;
作業は、いつものCena開発。&lt;br /&gt;
&lt;br /&gt;
前回までに、既存データの&lt;br /&gt;
→　サーバーからダウンロード&lt;br /&gt;
→　ローカルHTMLでデータ修正&lt;br /&gt;
→　サーバーにアップロード&lt;br /&gt;
の一連の作業が動くようになった。&lt;br /&gt;
&lt;br /&gt;
今回は、新しいデータをローカルで追加→サーバーにアップ、の部分。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;新規登録できるようになった&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
何箇所かはまったが新規登録を追加。&lt;br /&gt;
UpdateからReplaceにSQLを変更するところで少しはまった。ぜんぜん違う文なのを忘れてた。&lt;br /&gt;
&lt;br /&gt;
既存のデータを修正する場合に比べると、リレーションを作ったりといろいろな作業が増える。&lt;br /&gt;
&lt;br /&gt;
ともあれ、新規登録ボタンを押すと何も入ってないフォームを表示。&lt;br /&gt;
後は修正と同じ要領で登録してゆく。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;フォームの動きについて&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
今までは、&lt;br /&gt;
フォームで修正してchangeイベントが発行されたら、&lt;br /&gt;
即ローカルDBにアップデート、&lt;br /&gt;
としていた。&lt;br /&gt;
&lt;br /&gt;
わざわざボタンを押さなくてもいいので簡単かな？と思ったからだけど。&lt;br /&gt;
&lt;br /&gt;
が、操作ミスがあっても、すぐDBが書き換わることを考えると、従来のようにフォームにすべてを記入・修正してから「完了」ボタンを押させるほうが安全な気がしてきた。&lt;br /&gt;
&lt;br /&gt;
アンドゥが上手にできれば別かもしれない。&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;◆&lt;b&gt;機能が豊富になってきた。&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;するとボタンを増やしたり、意味合いを変えたりと面倒。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;いい方法はないか考えないと。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;MVCを導入するのがひとつあるが、もう少し簡便な方法があるといいけどなぁ。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;◆&lt;b&gt;TODO&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;アップロードしたら、アップしたデータのステータスを変更。&lt;/li&gt;
&lt;li&gt;ダウンロードしたら、localStorageの変数をイニシャライズ。&lt;/li&gt;
&lt;li&gt;フォームの動きを調整。&lt;/li&gt;
&lt;li&gt;データの削除（これが大変。。。）&lt;/li&gt;
&lt;li&gt;WebSqlDatabaseでcallback関数を指定するように変更する。&lt;/li&gt;
&lt;li&gt;データ数を増やして、パフォーマンスチェック。&lt;/li&gt;
&lt;li&gt;フォームのバリデーション（HTML5の機能）&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;まだまだ、たくさんあるなぁ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4062700541804467106?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4062700541804467106/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4062700541804467106' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4062700541804467106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4062700541804467106'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/10/simpleidx-20101030.html' title='Simple@Idx 2010/10/30'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-2771894689634510905</id><published>2010-10-22T16:27:00.003+09:00</published><updated>2010-10-22T16:29:25.989+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP5.3でJavaScriptのようにメソードを上書きする（ように見せる）方法</title><content type='html'>JavaScriptをしばらくいじくった後、PHPに戻ると、一旦メソードを上書きでいないのにいらいらします。継承するか、インスタンス化して別クラスに委譲して別メソードをかぶせる、とかぐらいしか出来ません。&lt;br /&gt;
&lt;br /&gt;
で、PHP5.3のクロージャー（無名関数）と__callを使って、&lt;br /&gt;
メソードを上書きできる、ように見せることが出来ました。&lt;br /&gt;
&lt;script type="text/javascript"&gt;
 
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆まぁ、こんな感じ。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;echo 'test closure' . '
';

class test
{
 var $name;
 // +------------------------------------------+
 function __construct() {
  $self = $this;
  $this-&amp;gt;name = 'my test';
  $this-&amp;gt;getName = function() use( $self ) {
   echo $self-&amp;gt;name . '&amp;lt;br /&amp;gt;';
  };
 }
 // +------------------------------------------+
 public function __call( $name, $args ) {
  if( is_callable( $this-&amp;gt;$name ) ) {
   call_user_func_array( $this-&amp;gt;$name, $args );
  }
 }
 // +------------------------------------------+
}

$t = new test();
$t-&amp;gt;getName();   // works.

$t-&amp;gt;name = 'new test';
$t-&amp;gt;getName();   // works fine.

// kind of overwriting method... 
$t-&amp;gt;getName = function() use( $t ) {
 echo 'new: ' . $t-&amp;gt;name . '
';
};
$t-&amp;gt;getName();   // works great!

&lt;/pre&gt;&lt;br /&gt;
自宅のローカルPCでは動いてます。出力は、&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;test closure
my test
new test
new: new test&lt;/pre&gt;&lt;br /&gt;
となって、ほぼ想定どおりの動きです。&lt;br /&gt;
クロージャーを作るときにuseを使って、クラス自身を受け渡すこと、クラス内の変数にクロージャーを渡して、__callでオーバーライドするのがポイント。&lt;br /&gt;
&lt;br /&gt;
$selfとかjavaScriptっぽくて、妙ですね。&lt;br /&gt;
&lt;br /&gt;
実際使うかといわれると･･･&lt;br /&gt;
う～ん、&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-2771894689634510905?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/2771894689634510905/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=2771894689634510905' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2771894689634510905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2771894689634510905'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/10/php53javascript.html' title='PHP5.3でJavaScriptのようにメソードを上書きする（ように見せる）方法'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6269330169943433509</id><published>2010-10-02T17:12:00.002+09:00</published><updated>2010-10-02T17:27:32.756+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/10/02</title><content type='html'>今回のSimpleは朝倉さんの事務所にて。&lt;br /&gt;
自転車で4km。明大前→下北沢経由で16kmに伸ばしてきました。&lt;br /&gt;
&lt;br /&gt;
前回から、Html5のWeb Sql Databaseと格闘。&lt;br /&gt;
昨日、やっと動き始めました。&lt;br /&gt;
&lt;br /&gt;
で、Simpleでは残りの開発。&lt;br /&gt;
&lt;br /&gt;
サーバー上のDBからデータをダウンロード&lt;br /&gt;
→ローカルのWebSqlDBにデータを登録。&lt;br /&gt;
→Html5+JavaScript(jQuery)のみでデータの表示・修正。&lt;br /&gt;
→データのアップロード、サーバー上のDBを書き換え。&lt;br /&gt;
&lt;br /&gt;
までできました。&lt;br /&gt;
&lt;br /&gt;
これで&lt;br /&gt;
－差分アップロード（修正した部分のみの変更）&lt;br /&gt;
－参照関連の変更（別項目へのリンクの変更）&lt;br /&gt;
ができるようになりました。&lt;br /&gt;
&lt;br /&gt;
まだ新規データの登録ができてませんので、&lt;br /&gt;
次回への宿題？ということになりました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6269330169943433509?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6269330169943433509/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6269330169943433509' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6269330169943433509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6269330169943433509'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/10/simpleidx-20101002.html' title='Simple@Idx 2010/10/02'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4182243892429148085</id><published>2010-08-17T17:54:00.002+09:00</published><updated>2011-02-16T17:08:14.836+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><title type='text'>Cena/HTML5でのローカルアプリ開発を考えてみる</title><content type='html'>開発中のCenaですが、&lt;br /&gt;
本命はHTML5のローカルアプリの開発です。&lt;br /&gt;
それもIndexed Databaseを使って、ローカル側のDBを使ったアプリです。Cenaを使えば、そういうウェブサイト･アプリが「簡単に」出来るような気がするもので。&lt;br /&gt;
&lt;br /&gt;
と書いておいて、Indexed DatabaseのAPIを読み始めたばかりという状態なので、どれだけ「簡単」なのかは検討もつきません。少なくとも頭の中で考える分には･･･簡単なはず。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;現状のクラス構造&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
今のCenaクラスの動きを図にしました（下図）。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_vyklshRxsKY/TGpKJY5wZaI/AAAAAAAABBI/yYlwcZ7DJd4/s1600/cena_flowchart1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/_vyklshRxsKY/TGpKJY5wZaI/AAAAAAAABBI/yYlwcZ7DJd4/s400/cena_flowchart1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
パッと見、簡単です。&lt;br /&gt;
Active Record (AR)のクラスをCena Record (CR)が委譲して受けて、そこからHTML要素を出力しています。&lt;br /&gt;
&lt;br /&gt;
が、ARとCRの関係が意外と面倒。&lt;br /&gt;
もともとCenaはHTMLなんて（あまり）知りません。&lt;br /&gt;
結局ARなりDAOなりが、頑張ってHTMLになる元を作る必要があります。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;できたらいいなの&lt;/b&gt;&lt;b&gt;理想の構造&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_vyklshRxsKY/TGpKMGeGUyI/AAAAAAAABBQ/zofLEpvOFw4/s1600/cena_flowchart2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://3.bp.blogspot.com/_vyklshRxsKY/TGpKMGeGUyI/AAAAAAAABBQ/zofLEpvOFw4/s400/cena_flowchart2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
そこで、Cenaからの出力は単なるメタデータ(MD)とし、実際のHTML要素とのバインディングはJavaScriptに任せてしまいます。MDとは、つまりスキームやクラス名やらのデータの配列みたいなイメージ。&lt;br /&gt;
&lt;br /&gt;
もし、簡単に、ローカルDBにメタデータを登録できたら。そして簡単に読み出せたとしたら。同じ処理でHTML要素を作成できます。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;で、何が便利になるのか？&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
まぁ実現するのは可能でしょうが、&lt;br /&gt;
これにどんなメリットがあるのでしょう？&lt;br /&gt;
&lt;br /&gt;
う～ん、考えられのは、&lt;br /&gt;
メタデータとしてCenaをあらわしているので、既存のみならず新規データの管理が簡単、新規と既存のデータも組み合わせられるし。それに複数データ間の関連も表せるし。何でもできるきがします。&lt;br /&gt;
&lt;br /&gt;
サーバーもローカルも同じように開発できそうなところが気にいってます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4182243892429148085?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4182243892429148085/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4182243892429148085' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4182243892429148085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4182243892429148085'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/08/cenahtml5.html' title='Cena/HTML5でのローカルアプリ開発を考えてみる'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vyklshRxsKY/TGpKJY5wZaI/AAAAAAAABBI/yYlwcZ7DJd4/s72-c/cena_flowchart1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-2980593873594290705</id><published>2010-08-16T14:06:00.002+09:00</published><updated>2010-10-02T17:26:49.430+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><title type='text'>「Restっぽいやつ」あらためcenaに</title><content type='html'>例の「Restっぽいやつ」ですが、&lt;br /&gt;
リファクタリングを機に名前付けました。&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;クラス名をつけるときに統一しないとめちゃくちゃになるので。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;で、&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;cena&lt;/b&gt;&amp;nbsp;：&lt;b&gt;C&lt;/b&gt;hained &lt;b&gt;E&lt;/b&gt;ntity &lt;b&gt;N&lt;/b&gt;otation and &lt;b&gt;A&lt;/b&gt;ugumentation&lt;br /&gt;
&lt;br /&gt;
です。&lt;br /&gt;
すでにインパクトにかけるとか悩んでますが。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
他には、&lt;br /&gt;
CONST: Chained Object Notation for State Transfer&lt;br /&gt;
REPPOI: Rest PPoi&lt;br /&gt;
&lt;br /&gt;
とか考えましたけどね～&lt;br /&gt;
名前のセンス無いな～&lt;br /&gt;
&lt;br /&gt;
変えるかもです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-2980593873594290705?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/2980593873594290705/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=2980593873594290705' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2980593873594290705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2980593873594290705'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/08/restcena.html' title='「Restっぽいやつ」あらためcenaに'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4631430373947184463</id><published>2010-08-10T12:33:00.000+09:00</published><updated>2010-10-02T17:26:49.431+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><title type='text'>「Restっぽいやつ」を書き直し</title><content type='html'>ざーっと開発していた「Restっぽいやつ」ですが、&lt;br /&gt;
さすがに書き直すことに決定。&lt;br /&gt;
&lt;br /&gt;
今まで、DAO（Data Access Object）というパターンを使っていて、AR（Active Record）というのは横目でうらやましいなぁと思いながらも使ってませんでした。&lt;br /&gt;
&lt;br /&gt;
が、この「Restっぽいやつ」はARと親和性が高い。&lt;br /&gt;
というかARを想定して考えてるようなもの。&lt;br /&gt;
&lt;br /&gt;
なので、がーっと作ったら、ARとRestっぽいやつが混ざり合ったクラスになってしまいました。ということで、AR＋RestっぽいRecord＋Restっぽいマスター、の3レベルに分離。&lt;br /&gt;
&lt;br /&gt;
が、元のコードが350行、分離して→合計700行に増えた。&lt;br /&gt;
まだ無駄なコードが少しあるけど、すっきりとした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4631430373947184463?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4631430373947184463/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4631430373947184463' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4631430373947184463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4631430373947184463'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/08/rest.html' title='「Restっぽいやつ」を書き直し'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6102100481443753466</id><published>2010-08-06T14:06:00.000+09:00</published><updated>2010-08-06T14:06:45.616+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHPUnitで一度の複数のテストを実行（addTestFile）</title><content type='html'>日本語の情報が少なかったので…&lt;br /&gt;
PHPUnitでテストを書いてますが、複数のテストクラスを一度に実行する方法。&lt;br /&gt;
&lt;a href="http://www.phpunit.de/manual/3.2/en/organizing-test-suites.html"&gt;PHPUnitの第7章「Organizing Test Suites」&lt;/a&gt;を読んだのですが、いまひとつ理解不能でした。で、&lt;a href="http://forums.netbeans.org/topic8955.html"&gt;ググって見たら簡単な方法を見つけました&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;複数のファイルを読み込む方法&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
下のコードのように書きましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;pre class="brush: php"&gt;require_once 'PHPUnit/Framework.php';
class allTests
{
 public static function suite() {
  $suite = new PHPUnit_Framework_TestSuite( 'all tests' );
  $folder = dirname( __FILE__ ) . '/';
  $suite-&amp;gt;addTestFile( $folder . 'someTest.php' );
  $suite-&amp;gt;addTestFile( $folder . 'moreTest.php' );
  return $suite;
 }
}&lt;/pre&gt;&lt;br /&gt;
AllTestのあるファイルと同じフォルダーに、各テストファイルを作成。各ファイルにはひとつずつユニットテスト用のクラスを記述。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;class someTest extends PHPUnit_Framework_TestCase {
 public function a_test() {
  // do some test...
 }
}&lt;/pre&gt;&lt;br /&gt;
これで、一度の複数のテストを実行してくれました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6102100481443753466?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6102100481443753466/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6102100481443753466' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6102100481443753466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6102100481443753466'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/08/phpunitaddtestfile.html' title='PHPUnitで一度の複数のテストを実行（addTestFile）'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5641916487185535555</id><published>2010-08-03T14:17:00.000+09:00</published><updated>2010-08-03T14:17:34.964+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>HTML5のローカルストレージまとめ</title><content type='html'>ローカルで動くウェブアプリケーションを作ってみたいと思い立って、HTML5関連について調べてます。今はローカルストレージ中心。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;たくさんありすぎのローカルストレージ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ちょっと調べたところ「cookie」「SessionStorage」「LocalStorage」「Web SQL Database」「Indexed Database」の5種類がありました。多すぎっ！&lt;br /&gt;
&lt;br /&gt;
ただし、「Web&amp;nbsp;SQL&amp;nbsp;Database」はドロップされる模様。&lt;br /&gt;
このあたりを参考に。&lt;br /&gt;
&lt;a href="http://groups.google.co.jp/group/html5-developers-jp/browse_thread/thread/d4d6676527a3ef1b?pli=1"&gt;http://groups.google.co.jp/group/...&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.publickey1.jp/blog/09/websql.html"&gt;http://www.publickey1.jp/blog/09/websql.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
SQL互換地獄に陥らなくてよかった…&lt;br /&gt;
&lt;br /&gt;
また「SessionStorage」「LocalStorage」は大きく&lt;a href="http://d.hatena.ne.jp/Syunpei/20090804/1249375857"&gt;「Web Storage」という括りで理解すべき&lt;/a&gt;みたい。そして「Cookie」は、もういいでしょう。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;となって、要するに&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Web Storage (Session+Local）&lt;/li&gt;
&lt;li&gt;Indexed Database&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
の２つを追いかければよさそうです。&lt;br /&gt;
ただ肝心のIndexed Databaseは、正式サポートしてるブラウザーがない･･･&lt;br /&gt;
&lt;br /&gt;
簡単なサンプルデモを作るだけならLocal Storageで出来るかも。でも、ちょっと複雑なことをする必要があれば、今のところ「Web SQL Database」で作るしかなさそうですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5641916487185535555?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5641916487185535555/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5641916487185535555' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5641916487185535555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5641916487185535555'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/08/html5.html' title='HTML5のローカルストレージまとめ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4339381308366663112</id><published>2010-07-24T15:15:00.006+09:00</published><updated>2011-01-20T13:18:41.875+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/07/24</title><content type='html'>中山でSimple勉強会。&lt;br /&gt;
暑い一日。でも勉強会は結構涼しい。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;データバインディングについて&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
例の「Restっぽいやつ」に関して、JavaServer Facesを調べてみた。&lt;br /&gt;
で、こちらのページに上手にまとまっていた。&lt;br /&gt;
&lt;a href="http://dev.ariel-networks.com/articles/workshop/javaee6"&gt;http://dev.ariel-networks.com/articles/workshop/javaee6&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;JSF2.0:「データバインディング問題」(直感的にはHTMLフォームの表示/編集と内部オブジェクトのマッピング)&lt;/blockquote&gt;&lt;br /&gt;
その通りでございます、という気分。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;いい加減に「Restっぽいやつ」に名前をつけたい。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Chained Object Notation for State Transfer (CONST)&lt;br /&gt;
Entity Notation for Augumented Forms (ENAF)&lt;br /&gt;
Chained Entity Representation for Manipulation Injection and Transfer (CERMIT)&lt;br /&gt;
&lt;br /&gt;
とか考えたけど、いまひとつピンとこない。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;「Restっぽいやつ」に参照を実装&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
今までは基本的機能、つまりHtmlフォームから実体（オブジェクトのこと）に対して操作を行っていた。&lt;br /&gt;
&lt;br /&gt;
今回は、操作のデータとして他の実体を参照させることを行った。&lt;br /&gt;
なお今回もデモと割り切って作ってるので汎用性は？です。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;「Restっぽいやつ」の予定&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
どこまでできるかわかりませんが、今後の予定を考えて見ます。&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;遅延参照&lt;br /&gt;
俗に言うリンカーの実装。&lt;/li&gt;
&lt;li&gt;リファクタリング&lt;br /&gt;
クラス設計を見直して書き直したい。いや、次にやるべきかも。&lt;/li&gt;
&lt;li&gt; エンベロープ&lt;br /&gt;
順番を指定できるように。&lt;/li&gt;
&lt;li&gt;ドロップボックス&lt;br /&gt;
ドラッグ＆ドロップに対応したい。&lt;/li&gt;
&lt;li&gt;ローカルDBの保存＆同期&lt;br /&gt;
ブラウザー上のローカルDBに保存して、サーバーDBと同期して…&lt;/li&gt;
&lt;/ol&gt;という感じでしょうか。&lt;br /&gt;
これ全部できたら、すごいことじゃあるまいか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4339381308366663112?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4339381308366663112/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4339381308366663112' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4339381308366663112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4339381308366663112'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/07/simpleidx-20100724.html' title='Simple@Idx 2010/07/24'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-2703294860514393622</id><published>2010-06-26T18:31:00.003+09:00</published><updated>2010-10-02T17:25:56.863+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/06/26</title><content type='html'>◆&lt;b&gt;PHP5.3のPDOでMYSQL_ATTR_INIT_COMMANDが未定義だと？！！&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
お隣のY本さんがささやいた。&lt;br /&gt;
phpMyAdminで文字化けすると。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
おや、自分のphpMyAdminでも文字化けしている。&lt;br /&gt;
&lt;br /&gt;
で、調べ始めたら…&lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/2424343/undefined-class-constant-mysql-attr-init-command-with-pdo"&gt;このページでPHP5.3で上記のコンスタントが定義されていない&lt;/a&gt;、とある。&lt;br /&gt;
&lt;br /&gt;
え、この間納品したプロジェクト大丈夫か？&lt;br /&gt;
一瞬青ざめた。&lt;br /&gt;
&lt;br /&gt;
あ、あれはPDO使ってないので大丈夫。&lt;br /&gt;
&lt;br /&gt;
とはいえ、これって本当？&lt;br /&gt;
バグレポートを見ると、本当なのは確か。&lt;br /&gt;
ただバグはCloseされているので、もう直っている。ただ、PHPのどのバージョンで直っているのかがよくわからないので、もうちょっと調べないとなぁ。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;RESTっぽいフォーム&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
相変わらず、RESTっぽいフォームの作成。&lt;br /&gt;
今度は複数のテーブルを一度に作成・修正・削除するやつ。&lt;br /&gt;
&lt;br /&gt;
一応、複数テーブル・複数レコードに対応はできたが、&lt;br /&gt;
リレーションまでは手が回らなかった。&lt;br /&gt;
&lt;br /&gt;
実は、リレーションはRESTっぽい考え方と相性が悪いと思う。&lt;br /&gt;
リレーションに対応しようとすると、処理の順番が重要になる。&lt;br /&gt;
が、RESTはステートレス、つまり順番という考え方がない。&lt;br /&gt;
&lt;br /&gt;
なので、リレーションに対応するには、ちょっと考え方を変える必要がある。&lt;br /&gt;
たぶん、リンカーのような処理になると思う。&lt;br /&gt;
&lt;br /&gt;
なので、リンカーは今後の対応。。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;RESTっぽいフォーム２&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
今回対応したもうひとつが新規登録の場合。&lt;br /&gt;
何も入力しない（つまり登録しない）場合、フォームを無視するように修正。&lt;br /&gt;
&lt;br /&gt;
ちょっとアドホックな修正だけど、ともかく対応完了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-2703294860514393622?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/2703294860514393622/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=2703294860514393622' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2703294860514393622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2703294860514393622'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/06/simpleidx-20100626.html' title='Simple@Idx 2010/06/26'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4097559710110576164</id><published>2010-06-24T12:17:00.000+09:00</published><updated>2010-06-24T12:17:37.890+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PDFLibで「Invalid UTF-16 string (odd byte count)」エラー</title><content type='html'>久々にPDFlibをいじくってたら、エラー。&lt;br /&gt;
ppsでfill_textblockした際に発生する。&lt;br /&gt;
&lt;br /&gt;
動いてたコードを、そのまま持ってきたのになぁ…&lt;br /&gt;
バージョンの問題？CMapがおかしい？&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
頼みのグーグルもそれらしい答えをなかなか見つけられない。&lt;br /&gt;
やっと見つけたとき、グーグル検索では2件しかヒットしてなかった。&lt;br /&gt;
&lt;a href="http://www.google.co.jp/search?q=PDFlib+%22odd+byte+count%22"&gt;http://www.google.co.jp/search?q=PDFlib+"odd+byte+count"&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
PDFlibの情報少なすぎじゃあるまいか？&lt;br /&gt;
&lt;br /&gt;
そもそもマニュアルとかもPDF、しかも200ページ超えてたりして検索しづらい事といったら。端的にまとめられた大量のHTMLとグーグル検索が仕事効率が一番いいんじゃないかと思った次第。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;で、解決方法は？&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
PDF_set_parameter( $pdf, "textformat", "utf8");&lt;br /&gt;
と設定すること。&lt;br /&gt;
&lt;br /&gt;
まぁバージョンが変わって、デフォルトの挙動が変わったのか、&lt;br /&gt;
普通は設定してあるものなのか…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4097559710110576164?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4097559710110576164/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4097559710110576164' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4097559710110576164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4097559710110576164'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/06/pdflibinvalid-utf-16-string-odd-byte.html' title='PDFLibで「Invalid UTF-16 string (odd byte count)」エラー'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4777496194850770989</id><published>2010-06-03T10:59:00.004+09:00</published><updated>2010-06-03T11:11:43.519+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>PDOとPrepared Statementへ対応するぞ、と</title><content type='html'>こちらも長年の課題だったPrepared Statement。&lt;br /&gt;
なにしろ今使っているSQLマッパー（ORMなのか？）は2002年ごろ作ったコードを基にしてます。改良を加えつつ、使ってたのですが、いよいよPDOとプリペアドステートメントへ対応させることに決定。&lt;br /&gt;
&lt;br /&gt;
しかし･･･PDOも、そしてPrepared Statementも、&lt;br /&gt;
なんて使いづらいんだ！&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Prepared Statementへの対応方法&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
方向としては、下記のように名前つきのパラメータ（以下、ホルダーと呼称）を使って構築します。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;// 古きよきqueryを使った方法 
$rdb-&amp;gt;query( "SELECT * FROM table WHERE id='1234'" );
// Prepared Statementを使った方法
$h = $rdb-&amp;gt;prepare( "SELECT * FROM table WHERE id=:id" );
$h-&amp;gt;execute( array( ':id' =&amp;gt; '1234' ) );&lt;/pre&gt;&lt;br /&gt;
どこかで、'1234'と':id'を結び付けておく必要があります。&lt;br /&gt;
次のような関数でホルダーを一元管理することにしました。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;function getHolder( &amp;amp;$val ) {
&amp;nbsp; static $prepare_values=array();
&amp;nbsp; if( $val ) {
&amp;nbsp; &amp;nbsp; $holder = ':prep_' . count( $prepare_values );
&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;prepare_values[ $holder ] = $val;
&amp;nbsp; &amp;nbsp; $val = $holder;
&amp;nbsp; }
&amp;nbsp; return $prepare_values;
}

$id = '1234';
getHolder( $id );
$h = $rdb-&amp;gt;prepare( "SELECT * FROM table WHERE id={$id}" );
$h-&amp;gt;execute( getHolder() );&lt;/pre&gt;&lt;br /&gt;
SQLマッパーはクラスなので実際はメソードですが、こいつをマッパーのあちこちに仕掛けておけば、簡単に対応可能、というわけです。 &lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;PDOではrowCountが使えない&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
薄々知ってましたが、SELECTを発行した場合、結果セットの総数が分かりません。「SELECT COUNT(*) ...」で対応しろという話です。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;仕方がないので、対応しました。&lt;br /&gt;
「SELECT ～ FROM...」の「～」部分をCOUNT(*)に無理やり変更。&lt;br /&gt;
&lt;br /&gt;
SELECT文を保存しておいて、rowCountが呼ばれたら、裏でSQL文を変更して、発行して、数を数えて、返す。&lt;br /&gt;
お、動いた、動いた。&lt;br /&gt;
&lt;br /&gt;
が、これとPrepared Statementを組み合わせると大変な事態に。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;MySQLのHY093エラー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
MySQLで動作テスト開始をしたとたんのエラーコード。&lt;br /&gt;
テストのXAMPP環境だとエラーメッセージすら出ない。&lt;br /&gt;
&lt;br /&gt;
調べると、「無効なパラメータ番号」という意味らしい。&lt;br /&gt;
なんとexecuteで与える配列で使ってないデータがあるとエラーになるらしい。&lt;br /&gt;
&lt;br /&gt;
どんだけ細かいんだよ！&lt;br /&gt;
と文句をいいながら、適度なタイミングで「$prepare_values」をクリアすることに。この適度なタイミングってのが難しい。使っているうちにぐちゃぐちゃになりそうだ。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;で、気がついた。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Prepared Statementを使って数える場合、万が一COUNT(*)に変更した部分にホルダーがあったら、絶対に動かんじゃないか。たとえば&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;例）
SELECT :what AS what, id, name FROM table WHERE type=:type

SELECT COUNT(*) FROM table WHERE type=:type&lt;/pre&gt;&lt;br /&gt;
これだとHY093エラーで動かないのは確実。 &lt;br /&gt;
&lt;br /&gt;
こういうSELECT文の場合、裏で上手カウントするのは無理っぽい。&lt;br /&gt;
使う人が、明示的にSQLを二つ作って対応するしかないか。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;まだまだあるぞPDOの妙なエラー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
こんなエラーメッセージもありました。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll(). Alternatively, if your code is  only ever going to run against mysql, you may enable query buffering by  setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. &lt;/blockquote&gt;&lt;br /&gt;
書いてある通りにアトリビュート設定しても駄目。&lt;br /&gt;
バージョンの問題なのか？&lt;br /&gt;
&lt;br /&gt;
原因は･･･&lt;br /&gt;
一度に二つのSQL文を渡してたからでした。&lt;br /&gt;
DROP TABLE IF EXIST table;&lt;br /&gt;
CREATE TABLE table ( ... );&lt;br /&gt;
&lt;br /&gt;
ひとつずつ発行するとエラー無しになりました。&lt;br /&gt;
&lt;br /&gt;
◆感想 &lt;br /&gt;
&lt;br /&gt;
新しいライブラリが登場しても、すぐ飛びつかない理由を思い出した。 &lt;br /&gt;
マニュアルに出てこないような癖があるので避けてしまう。 &lt;br /&gt;
面白いと思う人もいるけど、私は面倒くさがりだから。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4777496194850770989?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4777496194850770989/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4777496194850770989' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4777496194850770989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4777496194850770989'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/06/pdoprepared-statement.html' title='PDOとPrepared Statementへ対応するぞ、と'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3825007319451648212</id><published>2010-05-29T16:31:00.001+09:00</published><updated>2010-05-29T17:52:07.818+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/05/29</title><content type='html'>今回は久々に5人集まった勉強会。&lt;br /&gt;
お、iPad登場。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;iPadに触ったよ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
触ってみて、「おぉ～」&lt;br /&gt;
やっぱり欲しくなった。&lt;br /&gt;
&lt;br /&gt;
単に大きくなっただけだが、大きさは大事だ。&lt;br /&gt;
これならおじいちゃんでも大丈夫だ。&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;一家に一台、になるでしょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
それと子供にもぜひ欲しい。&lt;br /&gt;
でもまだ3歳だから、落としたりして壊すだろうな～&lt;br /&gt;
実際、壊すのは子供が触ってというパターンが多いらしい。&lt;br /&gt;
もう少し子供が大きくなってからにしよう。うん。&lt;br /&gt;
&lt;br /&gt;
◆&lt;a href="http://wsjp.blogspot.com/2010/05/resthtml.html"&gt;&lt;b&gt;RestっぽいHTMLフォーム&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
実装してみた。&lt;br /&gt;
家で作業してアップロードしておいて、勉強会でダウンロードして・・&lt;br /&gt;
パスワードが入ってない！&lt;br /&gt;
仕方ないので適当にエラー処理すくなめで作ってみた。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
そしたら動いた。&lt;br /&gt;
簡単な修正だけだが1時間でできた。&lt;br /&gt;
削除も・・・表示修正も含めて1時間でできた。&lt;br /&gt;
&lt;br /&gt;
簡単だったなぁ。&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;ただし、データのバリデーション、変数汚染への対策などはなし。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
100個ぐらいのデータを10個ずつでページ送りをしている一覧表に実装。&lt;br /&gt;
適当なページで編集、とすると表示されてた10個だけ、修正できる。&lt;br /&gt;
ウェブのUIを少し複雑にできそう。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;なんとなくePub触ってみる&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
SigilというePub編集ソフトをインストールしてみる。&lt;br /&gt;
ePubというのは、iBooksやSonyなんかでサポートされている電子書籍の標準フォーマットのひとつ。中身は、要するに&lt;s&gt;劣化版&lt;/s&gt;コンパクトなHTML+CSS。それにXMLをつけて、ある順番にZipしたもの。&lt;br /&gt;
&lt;br /&gt;
何か作るのは簡単。&lt;br /&gt;
ただ、見た目があまりにもNetscape時代のWWWを思い出すような出来だ。&lt;br /&gt;
よささげなCSSを探したが、タイムアップ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3825007319451648212?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3825007319451648212/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3825007319451648212' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3825007319451648212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3825007319451648212'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/simpleidx-20100529.html' title='Simple@Idx 2010/05/29'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8753127303135693445</id><published>2010-05-28T14:57:00.006+09:00</published><updated>2010-05-29T16:36:10.712+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQLのストアドプロシージャー使ってCMS多言語化の設計を考えてみた</title><content type='html'>ここしばらくCMS評価をしてましたが、&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;「多言語化がサードパーティのプラグインでサポートされてる」&lt;/b&gt; &lt;br /&gt;
場合が多いのが気になります。本体をバージョンアップしたら多言語化プラグインが対応してない場合、最悪はサイト全てがダウンするかも（試してないので分からないけど）。&lt;br /&gt;
&lt;br /&gt;
ということで、CMSなどで多言語化に対応するためのデータベース設計について考えてみました。で、今回は初めてストアドプロシージャーを使ってみました。&lt;br /&gt;
&lt;br /&gt;
なんて、実際に走らせてないので動きませんが、上手に使えば便利そうですね→ストアドプロシージャー。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;単一言語のページデータ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
まぁ次のような構造じゃないでしょうか？ &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;page_contents
&amp;nbsp; page_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; serial PRIMARY KEY,
&amp;nbsp; lang_code&amp;nbsp;&amp;nbsp; char(2),
&amp;nbsp; title&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text,
&amp;nbsp; content&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text,
&amp;nbsp; active&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date

languages
  lang_code    char(2),
  lang_name    text,
  lang_default char(1)

&lt;/pre&gt;&lt;br /&gt;
各ページにつきひとつレコード作成。&lt;br /&gt;
レコード内にはタイトルとコンテンツ、そして言語コードも入れてみた。こういう設計だと、複数言語データを入れることは出来ても、ウェブサイトの動きは制限されるでしょう。&lt;br /&gt;
&lt;br /&gt;
なので、title・contentといった文字が入るところを多言語化しようと思います。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;多言語化したページデータ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;pages
&amp;nbsp; page_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; serial PRIMARY KEY,
&amp;nbsp; title_id&amp;nbsp;&amp;nbsp;&amp;nbsp; int,
&amp;nbsp; content_id&amp;nbsp; int,
&amp;nbsp; active&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date

nodes
&amp;nbsp; node_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; serial PRIMARY KEY,
&amp;nbsp; active&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date

contents
&amp;nbsp; node_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int,
&amp;nbsp; lang_code&amp;nbsp;&amp;nbsp; char(2),
&amp;nbsp; contents&amp;nbsp;&amp;nbsp;&amp;nbsp; text,
&amp;nbsp; PRIMARY KEY( node_id, lang_code )&lt;/pre&gt;&lt;br /&gt;
ここでpagesのタイトルとコンテンツは、それぞれtitle_idとcontent_idに変更してnode_idをさします。で、node_idと指定された言語コードから、contentsテーブル内にあるcontentsを取ってくることが出来ます。&lt;br /&gt;
&lt;br /&gt;
この設計のいいところは、多言語化できる項目･テーブルに制限がないことです。たとえばコメントも多言語化しようと思ったら、たとえば次のように作れます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;comments
&amp;nbsp; comment_id&amp;nbsp; serial PRIMARY KEY,
&amp;nbsp; page_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int,
&amp;nbsp; title_id&amp;nbsp;&amp;nbsp;&amp;nbsp; int,
&amp;nbsp; comment_id&amp;nbsp; int,
&amp;nbsp; active&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date&lt;/pre&gt;&lt;br /&gt;
◆&lt;b&gt;ストアドプロシージャーで多言語データを読み書き修正&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
とはいえ、こんな設計のテーブルに書き込んだり読み込むのは大変。&lt;br /&gt;
そこでストアドプロシージャーを使ってみました。 &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;-- 新しいページを書き込む
INSERT pages SET
&amp;nbsp; title_id&amp;nbsp; =new_contents( '...title...', '{l_code}' ),
&amp;nbsp; content_id=new_contents( '..content..', '{l_code}' ),
&amp;nbsp; active=CURR_DATE();

DELIMITER //
CREATE FUNCTION new_contents( content text, l_code char(2) ) 
RETURNS int
BEGIN
&amp;nbsp; DECLARE n_id int;

&amp;nbsp; IF l_code IS NULL THEN 
&amp;nbsp; SELECT lang_code INTO l_code 
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM languages
&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE lang_code='l_code'
&amp;nbsp;&amp;nbsp;&amp;nbsp; LIMIT 1;

&amp;nbsp; INSERT nodes; 
&amp;nbsp; SELECT last_insert_id() INTO n_id;

&amp;nbsp; INSERT contents SET
&amp;nbsp;&amp;nbsp;&amp;nbsp; contents='{content}',
&amp;nbsp;&amp;nbsp;&amp;nbsp; node_id ='n_id'&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp; RETURN n_id;

END;
//

-- ページデータを読み込む
SELECT page_id, 
&amp;nbsp; get_contents( title_id,&amp;nbsp;&amp;nbsp; '{l_code}' ) AS title, 
&amp;nbsp; get_contents( content_id, '{l_code}' ) AS contents
FROM pages 
WHERE page_id='{id}'&amp;nbsp;

DELIMITER //
CREATE FUNCTION get_contents( n_id int, l_code char(2) ) 
RETURNS text
BEGIN
&amp;nbsp; DECLARE text content;

&amp;nbsp; SELECT contents INTO content 
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM contents
&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE node_id='n_id' AND lang_code='l_code'
&amp;nbsp;&amp;nbsp;&amp;nbsp; LIMIT 1;

&amp;nbsp; IF content IS NOT NULL THEN RETURN contents;

&amp;nbsp; SELECT contents INTO content 
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM contents JOIN languages USING( lang_code )
&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE node_id='n_id' AND lang_default=TRUE
&amp;nbsp;&amp;nbsp;&amp;nbsp; LIMIT 1;

&amp;nbsp; RETURN contents;

END;
//&lt;/pre&gt;&lt;br /&gt;
生まれた初めて書いたストアドプロシージャーと思う。&lt;br /&gt;
ちなみにMySQLのV5.1を参考にして書いてみた。&lt;br /&gt;
&lt;br /&gt;
書込・読込のときに言語コード（l_code）を指定します。値がなかったら言語テーブルのデフォルト言語コードを使います。&lt;br /&gt;
&lt;br /&gt;
nodesテーブルの構造が激しく簡単すぎるが･･･&lt;br /&gt;
もうちょっと改善できるかな？&lt;br /&gt;
そもそも動くのか？ &lt;br /&gt;
&lt;br /&gt;
まぁ動くと仮定して・・・&lt;br /&gt;
いや～、実は、昔から、 ストアドプロシージャーを使ってみようかなと思ってたんです。&lt;br /&gt;
&lt;br /&gt;
SQL側の複雑さを上手に隠せば、使う側（つまりミドルウェア側）の負担を大きく減らせそうでいい感じです。&lt;br /&gt;
&lt;br /&gt;
やはりSQLは「知っておいて損はない」と思った次第。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8753127303135693445?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8753127303135693445/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8753127303135693445' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8753127303135693445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8753127303135693445'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/sqlcms.html' title='SQLのストアドプロシージャー使ってCMS多言語化の設計を考えてみた'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1788332588746212102</id><published>2010-05-27T14:12:00.001+09:00</published><updated>2010-05-29T16:36:03.376+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>WordPressで多言語化のメモ</title><content type='html'>WordPressを使って多言語対応のウェブサイトを作るメモ。&lt;br /&gt;
メインは「&lt;a href="http://www.qianqin.de/qtranslate/"&gt;qTranslate&lt;/a&gt;」というプラグイン。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;qTranslateは簡単に使えた&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ちなみにWordPressは日本語版の2.9.2、&lt;br /&gt;
qTranslateは2.5.7というバージョン。&lt;br /&gt;
&lt;br /&gt;
普通にWordPressをインストールしてからqTranslateプラグインをインストール。最初は管理者画面が英語になって、3言語（独･英･中）がデフォルトとしてインストールされているので、qTranslateの管理画面で日本語をEnableする。と日本語が使えるようになった。&lt;br /&gt;
&lt;br /&gt;
で、ページなり投稿なりの作成画面では…&lt;br /&gt;
お～タイトルが言語ごとに設定できる。&lt;br /&gt;
本文の上に言語ごとのタブが出来てる。&lt;br /&gt;
すご～く、使いやすい。&lt;br /&gt;
&lt;br /&gt;
多言語化プラグインとしてはWPMLというのもあって、&lt;a href="http://www.openscriptsolution.com/2009/08/30/comparing-translation-plugin-qtranslate-vs-wpml/"&gt;技術的な側面から両者を比較したページ（英語）&lt;/a&gt;なんかを読んだ感じでは、qTranslateだとちょっと不十分なところがあるらしい。そういう部分はテンプレートを編集する必要があるとのこと。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;言語ごとに違うメッセージを表示する場合&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
たとえばテンプレートのどこかで文字を表示するような場合、qTranslateだけで対応しきれない。みたい。そういう場合は、テンプレートに次のような一行を加える（or修正する）。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;?php _e("&amp;lt;!--:en--&amp;gt;english&amp;lt;!--:--&amp;gt;&amp;lt;!--:ja--&amp;gt;日本語&amp;lt;!--:--&amp;gt;");?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まぁ、見た目そのままです。英語ならenで囲まれた部分を表示してくれます。ちなみに_eはechoの多言語版という感じしょうかね。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;言語ごとにイメージを変更したい場合&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
同じような状況で、言語によってヘッダーのイメージを変更するには、たとえば次のようなPHPコードが使えた。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;img src="&amp;lt;?php bloginfo( 'template_url'); ?&amp;gt;/images/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; img-&amp;lt;?php echo qtrans_getLanguage();?&amp;gt;.jpg" alt="NPO" /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
画像ファイルとしてimg-en.jpgとimg-ja.jpgを用意しておいて、言語コードそのものを「qtrans_getLanguage()」という関数で取得して、イメージを指定できます。&lt;br /&gt;
&lt;br /&gt;
もっといい方法があるかもしれませんが、ちょっと調べた中では上記の方法で対応可能でした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1788332588746212102?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1788332588746212102/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1788332588746212102' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1788332588746212102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1788332588746212102'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/wordpress.html' title='WordPressで多言語化のメモ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-2583107916339014141</id><published>2010-05-24T11:45:00.006+09:00</published><updated>2010-10-02T17:26:49.432+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cena'/><title type='text'>RESTっぽいHTMLフォームについて考えてみる</title><content type='html'>RESTのようなHTMLフォームについて考えてみた。&lt;br /&gt;
何を言いたいのか上手に説明できないので例を使って説明してみる。&lt;br /&gt;
&lt;br /&gt;
◆まずは下記のようなHTMLフォームがあったとして･･･&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;pre class="brush: js"&gt;&amp;lt;form name="html_form" method="post" action="users/put/1234"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;input type="..." name="user_name" value="my_name"&amp;gt;&lt;/pre&gt;&lt;br /&gt;
あるRDBの「users」というテーブルで、プライマリキーが「1234」のデータの「user_name」という項目を書き換えるフォーム、だとする。&lt;br /&gt;
&lt;br /&gt;
これを、次のように書いてみたい。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: js"&gt;&amp;lt;form name="html_form" method="post" action="restic"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;input name="restic[users][put][1234][user_name]"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value="my_name"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;input name="restic[users][put][1235][user_name]"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value="my_name"&amp;gt;&lt;/pre&gt;&lt;br /&gt;
要するに変数名に色々な情報を入れ込んでみた。&lt;br /&gt;
&lt;br /&gt;
こう書けるなると、IDが「1235」の修正も一度に出来る。&lt;br /&gt;
別テーブルの修正も簡単に入れ込むことが可能になる。&lt;br /&gt;
&lt;pre class="brush: js"&gt;&amp;lt;input name="restic[addr][put][1234][address]"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value="my_addr"&amp;gt;&lt;/pre&gt;&lt;br /&gt;
◆何に使うのかというと、&lt;br /&gt;
&lt;br /&gt;
一度に複数のデータを登録･修正･削除するようなUIが必要な時に便利かな、と。エクセルのような表形式に大量のデータを一覧表示するようなケース。&lt;br /&gt;
&lt;br /&gt;
ひとつのフォームで、データの新規登録、既存データの修正、既存データの削除、が入り乱れたりするような場合。 &lt;br /&gt;
&lt;br /&gt;
今まで一度に一レコードのCRUD（登録･修正･削除･読込）だったけど、少しずつ複雑怪奇なUIが求められるようになって来た。毎度ロジックを書くのだけど、複雑なUIに対応すると、「ロジックが汚くなる」のが嫌で嫌で。クリーンな方法はないかと考えて出てきた。&lt;br /&gt;
&lt;br /&gt;
◆一般化すると、フォームの変数から受け取る内容は：&lt;br /&gt;
&lt;br /&gt;
restic[ scheme ][ model ][ method ][ id ][ column ] = value;&lt;br /&gt;
&lt;br /&gt;
と書けることになる、と思う。&lt;br /&gt;
&lt;br /&gt;
ここで、&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;schemeはオブジェクトの大雑把な分類（データベース名とか）、&lt;/li&gt;
&lt;li&gt;modelがオブジェクトのインスタンス（テーブル名とか）、&lt;/li&gt;
&lt;li&gt;methodがCRUDに対応、&lt;/li&gt;
&lt;li&gt;idでレコードのキーを指定、&lt;/li&gt;
&lt;li&gt;columnのデータ項目にvalueを設定する、&lt;/li&gt;
&lt;/ul&gt;といった感じ。&lt;br /&gt;
実装する場合、schemeやmodelあたりは省略するかも、かな。&lt;br /&gt;
削除の場合はcolumnは不要、新規登録の場合のidの処理も要検討でしょう。&lt;br /&gt;
&lt;br /&gt;
ともあれ、これで、一つのHTMLフォームで複数のデータを処理可能になる。&lt;br /&gt;
&lt;br /&gt;
◆こういう考え方はすでに存在するのだろうか？&lt;br /&gt;
&lt;br /&gt;
ちょっとウェブを調べた限りでは見つからなかったけど、自分の不勉強＝知らないことの多さに気がめいる。ちょっと考えただけで、アクティブレコード、O/Rマッピング、など聞きかじっただけ、実装を見たことすらない。&lt;br /&gt;
&lt;br /&gt;
ともあれ、これで、本当に開発が簡単になりそうなら、実装してみようかと考えている。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-2583107916339014141?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/2583107916339014141/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=2583107916339014141' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2583107916339014141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2583107916339014141'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/resthtml.html' title='RESTっぽいHTMLフォームについて考えてみる'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5724314031408603682</id><published>2010-05-20T14:38:00.002+09:00</published><updated>2010-05-20T14:41:19.350+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>久々のjQuery：checkboxの扱い方、eachとmapの違い、など</title><content type='html'>久々にjQuery使ったら、指が止まった。&lt;br /&gt;
ので、適当にメモ。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;checkboxの扱い方&lt;/b&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: js"&gt;// チェックボックス要素を取得
$( "input:checkbox" )
//チェックされたチェックボックスを取得
$( "input:checkbox:checked" )&amp;nbsp;

// チェックボックスを全てチェックする
$( "input:checkbox" ).attr( { checked: "checked" } );
// チェックボックスのチェックを全て外す
$( "input:checkbox" ).attr( { checked: "" } );

//チェックされたチェックボックスの値のリスト
$( "input:checked" ).map( function() {
&amp;nbsp; return $(this).val();
}).get().join(",");&lt;/pre&gt;&lt;br /&gt;
◆&lt;b&gt;mapとeachの違いは？&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
jQueryは常に配列を扱う感覚。&lt;br /&gt;
配列を一括で操作する場合は、ピリオド（.）で関数をつなげればOK。&lt;br /&gt;
配列内の要素について、一つ一つ操作する場合は「each」か「map」を使う。&lt;br /&gt;
&lt;br /&gt;
両方とも、配列内の各要素をループする感じ。&lt;br /&gt;
違いを自分の解釈で言えば、&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;each：元の配列を操作する。&lt;/li&gt;
&lt;li&gt;map：元の配列を操作して、新しい配列を返す。&lt;/li&gt;
&lt;/ul&gt;上の例で言えば、最初に出来る配列にはcheckbox要素そのものが入ってます。なのでmapを使って、各チェックボックスの値を返すことで、値の配列が出来るわけですね。&lt;br /&gt;
&lt;br /&gt;
面白いことに、returnの挙動も違います。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;eachの場合、return falseでループが終了。&lt;/li&gt;
&lt;li&gt;mapの場合、何もreturnしないと配列に入らない。&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
◆&lt;b&gt;formとfunctionの名前が同じ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
関数が見つからない、といって怒られました。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: js"&gt;&amp;lt;script language="javascript" type="text/javascript"&amp;gt;
function do_this() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; $( ".do_this" ).val();
}
&amp;lt;/script&amp;gt; 
&amp;lt;form name="do_this" action="do_this.php" method="post"&amp;gt;
...&lt;/pre&gt;&lt;br /&gt;
FireFox 3、Chrome 4で確認。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5724314031408603682?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5724314031408603682/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5724314031408603682' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5724314031408603682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5724314031408603682'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/jquerycheckboxeachmap.html' title='久々のjQuery：checkboxの扱い方、eachとmapの違い、など'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4327800001277026327</id><published>2010-05-19T13:14:00.003+09:00</published><updated>2010-05-29T16:36:03.376+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>Drupalで多言語サイトの構築メモ</title><content type='html'>このページを見てリンクを辿れば、今回のエントリーはいらなかったかも。&lt;br /&gt;
&lt;a href="http://www.drupal-module.info/mod/i18n"&gt;http://www.drupal-module.info/mod/i18n&lt;/a&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;ダウンロード＆インストール&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
まずは日本語版ディストリビューションがあるので、そちらをダウンロード。&lt;br /&gt;
&lt;a href="http://drupal.jp/"&gt;http://drupal.jp/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
インストール手順は、とても簡単に&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;ダウンロードしたファイルを解凍&lt;/li&gt;
&lt;li&gt;アパッチのドキュメントルートのどこかに移動。&lt;br /&gt;
（たとえばhttp://localhost/drupal/とか）&lt;/li&gt;
&lt;li&gt;MySQLでDrupal用のDBを切っておく&lt;br /&gt;
（drupalとか）&lt;/li&gt;
&lt;li&gt;おもむろに移動したDrupalのURLを叩く。&lt;br /&gt;
するとインストール画面が表示される。&lt;/li&gt;
&lt;li&gt;今回は英語を標準として使うので、英語版でインストール。&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;◆&lt;b&gt;次に多言語化&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;こちらにサイト構築手順があります。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://drupal.org/node/275705"&gt;http://drupal.org/node/275705&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;ので、下記のメモはほとんど訳したようなものです。&lt;/div&gt;&lt;ol&gt;&lt;li&gt;まず多言語化モジュールをダウンロード。&lt;br /&gt;
&lt;a href="http://drupal.org/project/i18n"&gt;http://drupal.org/project/i18n&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;解凍して「INSTALL.txt」に書いてあるとおりにインストール。といっても解凍したi18nフォルダーを「&lt;b&gt;sites/all/modules/i18n&lt;/b&gt;」に移動するだけ。&lt;/li&gt;
&lt;li&gt;管理者メニューの「&lt;b&gt;Administrator/Site Building/Modules&lt;/b&gt;」でDrupalを多言語化します。次のモジュールにチェック。&lt;br /&gt;
・&lt;b&gt;Locale&lt;/b&gt;&lt;br /&gt;
・&lt;b&gt;Content Translation&lt;/b&gt;&lt;br /&gt;
で、「Save Configuration」ボタンをクリックすると、国際化モジュールを使えるようになります。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;国際化モジュール（Multilanguage）の全てのモジュールにチェックを入れて&lt;/b&gt;「Save Configuration」をクリック。&lt;/li&gt;
&lt;li&gt;管理者メニューの「&lt;b&gt;Administrator/Languages&lt;/b&gt;」から日本語言語をインストールします。「Add language」をクリック。Language name:でJapaneseを選んで「Add language」ボタンで一発インストール。&lt;/li&gt;
&lt;li&gt;うわ～まだたくさんあるよ。&lt;br /&gt;
後はDrupalサイトの多言語化のページを見てください。&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
◆&lt;b&gt;メニューの構築&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ひとつメニューの入れ物を作って、そこにメニューアイテムを追加してゆく。で、各言語のアイテムを複数入れる。たとえばHome （英語）とホーム（日本語）を二つ作って、それぞれに言語を指定する。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;多言語化、一応できた。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
最初に入れたとき、日本語をデフォルトにしたからなのか、マニュアル通りになってなかったからか、言語ネゴシエーションが駄目だった（日本語と英語が区別つかない）。が、今回は問題なし。マニュアルをよく読め、という話か。&lt;br /&gt;
&lt;br /&gt;
記事やブログを投稿すると、言語選択が分かりやすく表示されている。&lt;br /&gt;
&lt;br /&gt;
日本語でブログを登録、&lt;br /&gt;
内容を確認すると･･･ブログ記事ないよ、といわれた。&lt;br /&gt;
おや？&lt;br /&gt;
お、言語に日本語を選択したら出てきた。&lt;br /&gt;
&lt;br /&gt;
メニューもそうだけど、複数の言語毎のサイトを作って、ひとつのサイトのように表示する、と考えればよさそうだ。&lt;br /&gt;
&lt;br /&gt;
後は、もう少し軽いといいのだけどな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4327800001277026327?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4327800001277026327/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4327800001277026327' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4327800001277026327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4327800001277026327'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/drupal.html' title='Drupalで多言語サイトの構築メモ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1724902178130804477</id><published>2010-05-18T16:38:00.005+09:00</published><updated>2010-05-18T16:50:30.136+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>遅まきながらの･･･PHPUnit</title><content type='html'>前からやろうと思いつつ、後回しにしていたユニットテスト。&lt;br /&gt;
遅まきながら手を動かすことにしました。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;&lt;a href="http://www.phpunit.de/"&gt;PHPUnit&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
これからはアジャイルですよ、テスト駆動型ですよ、と思いつつも後回しにしていたユニットテスト。今後、長く使っていたライブラリのリファクタリングが出てきそうなので、PHPUnitを導入。&lt;br /&gt;
&lt;br /&gt;
似たようなのにSimpleTestというのも見つけた。&lt;br /&gt;
どうも機能としては、こちらのほうがいいらしい。 &lt;br /&gt;
&lt;br /&gt;
が、ウェブサイトをちょっと見て、最新版が2年前リリースされたまま。微妙にサポートを心配したり、やはり有名どころを使うのがよいだろう、と判断して無難にPHPUnitを使うことにした。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;インストール&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pear経由でインストールするとのこと。 &lt;br /&gt;
そういえば開発環境のPearは何年もアップデートしていない。&lt;br /&gt;
しかもVista上にXamppを使って環境作ったためか、いきなりCLI版が動かない。&lt;br /&gt;
対応方法は&lt;a href="http://d.hatena.ne.jp/dodoya/20080426/1209225618"&gt;php.iniのphp_mysqli.dllをコメントアウト&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
ついでにVistaのコンピュータ→プロパティ（あるいはコントロールパネルのシステム）→システムの詳細設定→環境設定→システム環境変数の「Path」にPHP.exeのあるフォルダーを追加。&lt;br /&gt;
&lt;br /&gt;
いよいよPearのフォルダ （\xampp\PHP）で作業。&lt;br /&gt;
確か、以下のコマンドを打ち込んだら動いた。 &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com
pear upgrade --force PEAR
pear install phpunit/PHPUnit&lt;/pre&gt;&lt;br /&gt;
ここまでで半日以上使ってる。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;ユニットテスト&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
早速コードを書いてみた。カートクラスをテストしてみよう。 &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;require_once( "PHPUnit/Framework.php" );
class CartTest extends PHPUnit_Framework_TestCase
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; private $cart;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public function setUp()
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;cart = new svCart();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; function testAdd() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;cart-&amp;gt;add( '100', 1 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $cart = $this-&amp;gt;cart-&amp;gt;get_list();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;assertEquals( $cart[0]['pid'], '100' );
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;assertEquals( $cart[0]['num'], 1 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/pre&gt;&lt;br /&gt;
「testCart.php」とかいう名前で保存して動かしたら･･･動いた。&lt;br /&gt;
そりゃそうだ。&lt;br /&gt;
&lt;br /&gt;
が、いちいちコマンドを叩くなんて、非常に原始的だ。&lt;br /&gt;
もうシェルなんか、ましてはcmdなんて、コピペすら出来ない。&lt;br /&gt;
ので、簡単にウェブから走るようにした。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;if( preg_match( '/[-_a-zA-Z0-9]+/', $_REQUEST[ 'test' ] ) ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; $test = $_REQUEST[ 'test' ];
&amp;nbsp;&amp;nbsp;&amp;nbsp; $msg&amp;nbsp; = do_unittest( $test, $result );
}

function do_unittest( $test, &amp;amp;$result )
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; $cwd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = dirname( __FILE__ );
&amp;nbsp;&amp;nbsp;&amp;nbsp; $command = "PHPUnit {$cwd}/{$test}.php";
&amp;nbsp;&amp;nbsp;&amp;nbsp; $results = my_exec( $command );
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; $result = $results[ 'stderr' ];
&amp;nbsp;&amp;nbsp;&amp;nbsp; return $results[ 'stdout' ];
}

function my_exec( $cmd, $input='' )
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; $proc = proc_open( 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $cmd, 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; array( 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0 =&amp;gt; array('pipe', 'r'), 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 1 =&amp;gt; array('pipe', 'w'), 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 2 =&amp;gt; array('pipe', 'w')
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ), 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $pipes
&amp;nbsp;&amp;nbsp;&amp;nbsp; );
&amp;nbsp;&amp;nbsp;&amp;nbsp; fwrite( $pipes[0], $input );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fclose( $pipes[0] );
&amp;nbsp;&amp;nbsp;&amp;nbsp; $stdout = stream_get_contents( $pipes[1] ); fclose( $pipes[1] );
&amp;nbsp;&amp;nbsp;&amp;nbsp; $stderr = stream_get_contents( $pipes[2] ); fclose( $pipes[2] );
&amp;nbsp;&amp;nbsp;&amp;nbsp; $rtn&amp;nbsp;&amp;nbsp;&amp;nbsp; = proc_close( $proc );
&amp;nbsp;&amp;nbsp;&amp;nbsp; return array(
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 'stdout' =&amp;gt; $stdout,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 'stderr' =&amp;gt; $stderr,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 'return' =&amp;gt; $rtn
&amp;nbsp;&amp;nbsp;&amp;nbsp; );
} &lt;/pre&gt;&lt;br /&gt;
この「my_exec」というのはPHP.netのsystemに書いてあるコード。&lt;br /&gt;
PHPUnitはメッセージをstdoutとstderrの両方に書き込むので、必要になった。後は「test.php?test=testCart」とか叩くようにするとテスト結果が出る。&lt;br /&gt;
&lt;br /&gt;
【追記：あ～セキュリティホール見つけた！】&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1724902178130804477?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1724902178130804477/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1724902178130804477' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1724902178130804477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1724902178130804477'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/phpunit.html' title='遅まきながらの･･･PHPUnit'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1550374015888803118</id><published>2010-05-14T15:35:00.004+09:00</published><updated>2010-05-29T16:36:03.377+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>Joomlaのセクション/カテゴリとMenuについて</title><content type='html'>Joomla!で迷ったこととしてセクション･カテゴリがあります。&lt;br /&gt;
ちょっと思ったことがあるので、書いて見ます。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;Joomlaで最初の作業は･･･記事の投稿。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
管理者メニューのコンテンツ→記事管理から「新規」ボタンを押すと、記事の新規登録画面になります。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_vyklshRxsKY/S-zsJSyF8jI/AAAAAAAAA-I/YqOEH3lfog0/s1600/Joomla_1273817890953.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://1.bp.blogspot.com/_vyklshRxsKY/S-zsJSyF8jI/AAAAAAAAA-I/YqOEH3lfog0/s400/Joomla_1273817890953.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
「Hello Joomla!」とか書いて保存しようとすると「セクションとカテゴリを指定してください」とか何とか文句言われました。未分類を選択できますが、まずはセクションとカテゴリを作ってみました。作ること自体は簡単ですから。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
でも、どういう構造がいいのだろう？&lt;br /&gt;
&lt;br /&gt;
そもそも&lt;b&gt;セクション･カテゴリって何だ？&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;メニュー構造からセクション･カテゴリを決めてみた&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ウェブサイトを作る際、大体のメニューは想像がつく（はず）。&lt;br /&gt;
たとえば会社のサイトなら、会社情報・所在地・製品情報・サポート、などのメニューが並ぶと思う。そこで、メニュー構造からセクションを作ってみたのだけど･･･&lt;br /&gt;
&lt;br /&gt;
実際にメニューを作ってから気がついたが、&lt;br /&gt;
&lt;br /&gt;
メニューと同じにする必要はないみたい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Joomla!のメニューの作り方&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
たとえば「所在地」というメニューを作ってみる。所在地や地図のあるページ（記事）を作っておいて、所在地のメニューでクリックで、そのページを表示したい。&lt;br /&gt;
&lt;br /&gt;
管理者メニューのメニュー→メインメニューを選び、「新規」ボタンでメニューアイテム（メニューの中身）を追加する。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_vyklshRxsKY/S-ztGChVg8I/AAAAAAAAA-Q/WIJqU12je3o/s1600/Joomla_1273818238217.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="102" src="http://4.bp.blogspot.com/_vyklshRxsKY/S-ztGChVg8I/AAAAAAAAA-Q/WIJqU12je3o/s400/Joomla_1273818238217.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
すると、メニューアイテムタイプを選択しろといわれる。&lt;br /&gt;
この中の「記事」をクリックすると、更に色々な選択肢が出現する。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_vyklshRxsKY/S-ztajzSQiI/AAAAAAAAA-Y/TS_8DCjfhCg/s1600/Joomla_1273818423322.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="353" src="http://3.bp.blogspot.com/_vyklshRxsKY/S-ztajzSQiI/AAAAAAAAA-Y/TS_8DCjfhCg/s400/Joomla_1273818423322.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
所在地ページを選ぶには「スタンダード記事レイアウト」を選択する。&lt;br /&gt;
するとメニューアイテム（タイトル、メニューの構造などを設定）と一緒に記事を選択できる。セクションやカテゴリ関係なく、どの記事でも選択できるのがポイント。&lt;br /&gt;
&lt;br /&gt;
今度はブログをメニューに追加したい場合、あるいは製品の紹介をブログのように追加して、メニューから見せたい場合、メニューアイテムタイプに「Blogカテゴリレイアウト」を選ぶとブログのような表現になる。 &lt;br /&gt;
&lt;br /&gt;
Joomla!のメニューはかなり自由度が高くて、セクション･カテゴリとはまったく関係なく構築が出来るのがわかった。 &lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;セクション･カテゴリは編集者の勝手に合わせてOK&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
なので、メニュー構造に一致させるよりも、たとえば&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;静的コンテンツ&lt;/li&gt;
&lt;li&gt;動的コンテンツ&lt;/li&gt;
&lt;/ul&gt;ぐらいのセクションのほうが分かりやすいと思った。&lt;br /&gt;
&lt;br /&gt;
で、カテゴリで、静的コンテンツには「会社情報」ぐらいにして会社情報や所在地 をぶち込んでおく。動的コンテンツには後から追加されるタイプ、たとえば「ブログ」や「商品情報」などを作る。&lt;br /&gt;
&lt;br /&gt;
複数の編集者がいるなら、それこそセクションを編集者の名前にしてもかまわないかもしれない。&lt;br /&gt;
&lt;br /&gt;
そういう意味では、Joomla!のセクション･カテゴリって、記事を見つけやすくするためにある、と考えてもいいのじゃないだろうか。ひとつのカテゴリに記事が多すぎても少なすぎても管理しづらいので、適度な分類を考えるのがよいのでしょう。この「適度」というのがむつかしいのですけど。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1550374015888803118?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1550374015888803118/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1550374015888803118' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1550374015888803118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1550374015888803118'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/joomlamenu.html' title='Joomlaのセクション/カテゴリとMenuについて'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vyklshRxsKY/S-zsJSyF8jI/AAAAAAAAA-I/YqOEH3lfog0/s72-c/Joomla_1273817890953.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8051820214536950363</id><published>2010-05-13T14:23:00.002+09:00</published><updated>2010-05-29T16:36:03.377+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>Joom!Fishで多言語の管理について</title><content type='html'>前回は、&lt;a href="http://wsjp.blogspot.com/2010/05/joomla.html"&gt;Joomla!にJoom!Fishを導入してウェブサイトを多言語化&lt;/a&gt;しました。&lt;br /&gt;
&lt;br /&gt;
が、ひとつ不満だったのが、どの記事が翻訳されたのか分からなかったことでしたが、素晴らしい管理者画面が用意されてました。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Joom!Fishの管理&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
管理者メニューの&lt;b&gt;コンポーネント→Joom!Fish→翻訳&lt;/b&gt;、にありました。&lt;br /&gt;
アクセスすると空っぽのテーブルが出てくるだけ。&lt;br /&gt;
何のことやら？と思ってましたが、&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;言語を選ぶ　：English&lt;/li&gt;
&lt;li&gt;選んで下さい：Contents&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
とすると、記事の一覧が出現。&lt;br /&gt;
どの記事が翻訳済みか、元の記事に修正が入ったか、一目で管理できるようになってました。素晴らしい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;選んで下さい：Menus、&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
を選択すると、今度はメニューの一覧が出現。&lt;br /&gt;
日本語のメニューを英語にして翻訳、（状態を有効に変更）するとメニューが英語になりました。&lt;br /&gt;
&lt;br /&gt;
素晴らしい。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;その他の機能&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
言語構成からは、ウェブサイト全体で使うメッセージなどを翻訳できます。本番環境では必須でしょう。&lt;br /&gt;
&lt;br /&gt;
統計も面白そうな数字が表示されます。&lt;br /&gt;
その他、Joom!Fishのコントロールパネルを見ると、様々な機能がありますね。&lt;br /&gt;
一体何に使うのか、よく分からないのも多いです。&lt;br /&gt;
&lt;br /&gt;
ともあれ、素晴らしい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8051820214536950363?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8051820214536950363/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8051820214536950363' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8051820214536950363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8051820214536950363'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/joomfish.html' title='Joom!Fishで多言語の管理について'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8619366704799685166</id><published>2010-05-12T15:37:00.005+09:00</published><updated>2010-05-29T16:36:03.378+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>Joomla 多言語のインストールのメモ</title><content type='html'>メモメモ。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Joomla 1.15をインストール&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;日本語版Joomlaをダウンロード→解凍して、Apacheのドキュメントルートにコピー。&lt;/li&gt;
&lt;li&gt;前もってJoomla用のDBを切っておく。&lt;/li&gt;
&lt;li&gt;おもむろにJoomlaのフォルダーにアクセス（http://localhost/joomlaとか）。&lt;/li&gt;
&lt;li&gt;するとインストールプロセスが自動的に開始される。&lt;/li&gt;
&lt;li&gt;ほぼ「Yes」ばかり押してておくとインストール完了。&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;多言語化（Joom!Fish2.0.4インストール）&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Joom!Fishをダウンロード。ZIPファイルのままでOK。&lt;br /&gt;
ついでにJoomFishJapaneseLanguage_2.0.3.zipもダウンロード。&lt;/li&gt;
&lt;li&gt;管理者メニューのエクステンション→インストール/アンインストールをクリック。&lt;br /&gt;
パッケージファイルのアップロードで、Joom!Fishのジップファイルを参照してから「アップロードファイル＆インストール」ボタンを押す。で、インストール完了。ちょっと感動した。&lt;br /&gt;
同じくJoomFishJapaneseLanguage_2.0.3もインストール。これでJoom!Fishメニューも日本語になった。&lt;/li&gt;
&lt;li&gt;管理者メニューの&lt;b&gt;コンポーネント→Joom!Fish→言語&lt;/b&gt;をクリック。&lt;br /&gt;
日本語（Japanese(JP)）の「能動されてます」にチェックを入れて、&lt;br /&gt;
上にある「保存」ボタンをクリック。「能動」って（有効のことだよね）。&lt;/li&gt;
&lt;li&gt;これで日本語と英語の多言語化が完了。&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;◆&lt;b&gt;まずは&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;日本語のコンテンツを作成&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;管理者メニューのコンテンツ→記事管理をクリック。&lt;/li&gt;
&lt;li&gt;上にある「新規」ボタンを押して、記事の新規登録を始める。&lt;br /&gt;
多分、日本語ページ（つまりデフォルト言語）で最初に登録が必須と思われる。&lt;/li&gt;
&lt;li&gt;最初はフロントページ（ウェブサイトの最初に表示されるページ）を作成。&lt;br /&gt;
タイトル、エイリアス、セクション、本文、を入力。&lt;br /&gt;
タイトルには「トップページ」と入力したとする。&lt;/li&gt;
&lt;li&gt;「フロントページ」のラジオボタンがあるので「はい」を選択する。これで、ウェブサイトのフロントページになる、っぽい。複数のページをフロントページに選択できるのは謎。（コンテンツメニューにフロントページ管理に出現する）。&lt;br /&gt;
最後に「保存」ボタンで記事の作成完了。これで日本語の記事が作成される。&lt;/li&gt;
&lt;li&gt;サイトにアクセスして、記事が表示されること＆日本と英語の言語選択が上に表示されることを確認。&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;◆&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;次に記事&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;を&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;翻訳して&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;作成&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;次は英語コンテンツの作成。&lt;br /&gt;
管理者メニューのコンテンツ→記事管理をクリック。&lt;br /&gt;
すると、作成した記事の一覧が表示される。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;「トップページ」のチェックボックスにチェック&lt;/b&gt;を入れて、&lt;br /&gt;
上部にある「&lt;b&gt;Translate To:」でEnglishを選択&lt;/b&gt;。&lt;br /&gt;
すると&lt;b&gt;「Joom!Fish::通訳」という別ウィンドウが開く&lt;/b&gt;。&lt;br /&gt;
これは翻訳の間違いですな。&lt;/li&gt;
&lt;li&gt;元記事のデータとともに翻訳する箇所が表示されるので、&lt;br /&gt;
ラベル、アライアス、本文、を入力して「保存」ボタンを押す。&lt;br /&gt;
これで多言語コンテンツの作成が完了。&lt;/li&gt;
&lt;li&gt;サイトにアクセスして、英語を選択すると英語版が表示されるはず。&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;結構簡単に複数言語のページを作成できる。&lt;/div&gt;&lt;div&gt;選択した言語（たとえば英語）のページがない場合は、デフォルトの言語から表示されるのはGood。また「There are no translations available.」と表示されて、選択された言語でないことが分かる。&lt;/div&gt;&lt;div&gt;思ったのは、どのページが翻訳済みか管理者画面から確認しにくい。言語が二つぐらいならいいが、４つとか増えたら管理できない気がする。&lt;br /&gt;
【追記：&lt;a href="http://wsjp.blogspot.com/2010/05/joomfish.html"&gt;記事やメニューの翻訳一覧機能&lt;/a&gt;を見つけました。素晴らしい（2010/05/13）】&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;ひとまず、こんなところで。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8619366704799685166?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8619366704799685166/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8619366704799685166' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8619366704799685166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8619366704799685166'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/joomla.html' title='Joomla 多言語のインストールのメモ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6433312597018121470</id><published>2010-05-10T17:33:00.007+09:00</published><updated>2010-05-29T16:36:03.379+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web/CMS/etc.'/><title type='text'>CMSを試してみる</title><content type='html'>出世払いでウェブサイトの構築をすることになった。&lt;br /&gt;
簡単にページの更新ができて、そして複数言語（日本語、英語、それから色々）サポートが必要ということで、CMSを使ってみることにした。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆家のローカルPCには&lt;b&gt;WordPress&lt;/b&gt;がインストールされていて、ちょっとしたリンクを管理している。さすが有名なBlog用CMSのことはあって、ウェブサイト構築にも使える。多言語化はqTranslateというプラグインを使えば可能らしい。&lt;br /&gt;
&lt;br /&gt;
が、実際に個人で使っていて、WYSIWYGエディタや管理者画面に不満があった。また、ブログとページとに分かれているのは分かりやすいと思うけど、ページ内にブログの一部を表示とか出来ない（みたい？）だし。ちょっと複雑なこと言われたら、対応できない気がする。 &lt;br /&gt;
&lt;br /&gt;
◆一度だけ&lt;b&gt;DRUPAL&lt;/b&gt;をインストールしたことがあったけど、管理者画面を一目見て、使うのをあきらめた。 むつかしすぎます。ホワイトハウスのウェブサイトにも使われている高機能＆オープンソースということだけど、もう少し簡単そうなものを物色することにした。&lt;br /&gt;
&lt;br /&gt;
【追記：2010/05/11】&lt;br /&gt;
もう一度試してみた（Ver.6.16）ところ、随分と管理者画面がすっきりしていてびっくり。記憶違いなのか、バージョンアップで改善されたのかは分からないけど、使いやすそうでした。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;eZ Publish&lt;/b&gt;は試してみたいのだけど、一社が開発しているらしいので後回し。&lt;br /&gt;
&lt;br /&gt;
◆そして、&lt;b&gt;Joomla!&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
ぱっと使った感じはよさそう。&lt;br /&gt;
管理者画面も、すっきりしていて好き。&lt;br /&gt;
プラグインやテンプレートのインストールする際、ZIPファイルごと読み込んでインストールできるのに感動した。そして安定してそうな雰囲気がある。&lt;br /&gt;
&lt;br /&gt;
テンプレートにはBeezを選択してみたら、&lt;a href="http://docs.joomla.jp/Customizing_the_Beez_template"&gt;レイアウトDIVのIDの解説ページ&lt;/a&gt;があった。&lt;br /&gt;
&lt;br /&gt;
しかし･･･セクションにカテゴリ、複数メニューにメニューアイテムが入り乱れて、最初は混乱した。というか、まだよく分からない。おそらく最初の2つが記事についてであり、後者はメニューに関すること、らしい。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;管理者の「コンテンツ」&lt;/b&gt;にて、&lt;br /&gt;
セクションとカテゴリを設定する。&lt;br /&gt;
記事を投稿する際にはセクション･カテゴリを指定する。&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;管理者の「メニュー」&lt;/b&gt;にて、&lt;br /&gt;
メニューアイテム（まぁページのこと）を作成する。&lt;br /&gt;
その際、どのセクション･カテゴリの記事を表示するかを指定。&lt;br /&gt;
で、メニューは複数のメニューアイテムをまとめたもので、 &lt;br /&gt;
さらに複数のメニューを作成可能。&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;管理者の「エクステンション」のモジュール管理&lt;/b&gt;にて、&lt;br /&gt;
各メニューの表示場所などを指定している。&lt;/li&gt;
&lt;/ul&gt;分かりにくいかも。&lt;br /&gt;
でも、一度理解できれば、便利＆かなり使いでがありそう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6433312597018121470?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6433312597018121470/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6433312597018121470' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6433312597018121470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6433312597018121470'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/05/cms.html' title='CMSを試してみる'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6220724965108977208</id><published>2010-04-24T17:50:00.013+09:00</published><updated>2010-04-24T17:58:29.145+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/04/24</title><content type='html'>Simple勉強会＠中山にて。&lt;br /&gt;
今日は何をしようか…&lt;br /&gt;
ひたすらPHPのコーディングをすることにした。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;ページ・コントローラー作ってみた&lt;/b&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;
 
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
今までMVCといったパターンを避けてきましたが、少し作ってみることに。&lt;br /&gt;
あるプロジェクトで、ちょっと複雑なことをしたら、コードが汚くなってしまった。IF文が続いて、追加・修正が面倒な感じ。そこで、ページコントローラー（Page Controller）なるパターンのクラスを作ってみた。&lt;br /&gt;
&lt;br /&gt;
ちょこっと60行程度のクラス。&lt;br /&gt;
連続するIF文の代わりに関数で区切って、コントローラーに関数と条件を登録。&lt;br /&gt;
たとえばこんな感じ。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;$mc = new pageMC();
$mc-&amp;gt;setFunc( 'search_data', 'act', &amp;nbsp; 'search' );&lt;/pre&gt;&lt;br /&gt;
URIに「&lt;b&gt;act&lt;/b&gt;」という変数に「&lt;b&gt;search&lt;/b&gt;」が入っていると「&lt;b&gt;search_data&lt;/b&gt;」という関数を走らせます。&lt;br /&gt;
&lt;div&gt;次々と関数と条件を設定してあげると、比較的簡単に移植はできた。&lt;/div&gt;&lt;br /&gt;
すべての関数で共通して使うオブジェクトの渡し方とか、メッセージ表示方法など、使い方を取り決めておかないと問題が起きそう。&lt;br /&gt;
&lt;br /&gt;
その代わり、一度作ってしまえば、新しい関数を追加するのは簡単になりそうだ。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;データアクセスの制限&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
たとえば会員専用のデータがあったとして、&lt;br /&gt;
DBのレコードに会員IDを記録させるとして、&lt;br /&gt;
他の会員のデータの読み書きを制限したい。&lt;br /&gt;
&lt;br /&gt;
それをDAO（Database Access Object）のレベルで自動的？に制限するルーチンを書いてみた。&lt;br /&gt;
コードとしては20行程度のメソード二つ追加して、5箇所ぐらいの修正でできた。こんなに簡単にできると、かえって心配になる。&lt;br /&gt;
&lt;br /&gt;
本当に便利になるのかどうか、バグとかは使い込まないと分からないかも。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6220724965108977208?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6220724965108977208/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6220724965108977208' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6220724965108977208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6220724965108977208'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/04/simpleidx-20100424.html' title='Simple@Idx 2010/04/24'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3223868801815196944</id><published>2010-04-01T19:51:00.024+09:00</published><updated>2010-05-29T16:36:57.233+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP：エラー処理いろいろ</title><content type='html'>&lt;a href="http://wsjp.blogspot.com/2010/03/php_30.html"&gt;例外について書いて&lt;/a&gt;いて、本当に楽になるのかエラー処理を何通りか書いてみたくなりました。元ネタは&lt;a href="http://d.hatena.ne.jp/shimooka/20100319/1268965586"&gt;こちらのページで&lt;/a&gt;、コードをそれっぽく写したものです。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
◆&lt;b&gt;コード＃１：エラー処理なし&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
まずはエラー処理無しの場合。&lt;br /&gt;
なんてシンプルなんでしょう。これで納品できれば天国のような（後で地獄になるような）世界ですね。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;$conn = DB::connect( 'test', 'test' );
$stmt = DB::parse( $conn, 'sql statement' );
DB::execute( $stmt );
$num  = DB::num_row();
for( $i = 0; $i &amp;lt; $num; $i ++ ) {
  DB::fetchRow($i);
}
&lt;/pre&gt;&lt;br /&gt;
◆&lt;b&gt;コード＃２：if文でネストしたエラー処理&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ここに適当にエラー処理を書加えてみます。&lt;br /&gt;
これはif文をネスとして処理を行ってます。こんな単純な処理にもかかわらず、ネストが4重（3重か？）になってます。これで処理が20行とか続いたらバグ発生率が高くなりそう。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;$conn = DB::connect( 'test', 'test' );
if( $conn === FALSE ) {
  $error_msg = "DBにつながりません";
}
else {
  $stmt = DB::parse( $conn, 'sql statement' );
  if( $stmt === FALSE ) {
    $error_msg = "SQLが理解できません";
  }
  else {
    DB::execute( $stmt );
    $num  = DB::num_row();
    if( !$num ) {
      $error_msg = "データが存在しません";
    }
    else {
      for( $i = 0; $i &amp;lt; $num; $i ++ ) {
        DB::fetchRow($i);
        // 何か処理しよう
      }
    }
  }
}
&lt;/pre&gt;&lt;br /&gt;
◆&lt;b&gt;コード＃３：連続したif文のエラー処理&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
深いネストは嫌いなので、出来るだけネストしないよう、elseで続けてみます。が、一箇所大変なことになってます。こんなコード書いたら･･･&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;if( !$conn = DB::connect( 'test', 'test' ) ) {
  $error_msg = "DBにつながりません";
}
else 
if( !$stmt = DB::parse( $conn, 'sql statement' ) ) {
  $error_msg = "SQLが理解できません";
}
else 
if( DB::execute( $stmt ) || TRUE ) {
  // こんなコード書いたら仕事失うかも･･･
}
else 
if( !$num  = DB::num_row() ) {
  $error_msg = "データが存在しません";
}
else {
  for( $i = 0; $i &amp;lt; $num; $i ++ ) {
    DB::fetchRow($i);
    // 何か処理しよう
  }
}
&lt;/pre&gt;&lt;br /&gt;
こう書き直してみようかな。&lt;br /&gt;
それでも、何となく気に入らないなぁ。&lt;br /&gt;
DB::executeの戻り値が分からないので、怪しいコードです。 &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;else 
if( DB::execute( $stmt ) &amp;amp;&amp;amp;
    !$num  = DB::num_row() ) {
  $error_msg = "データが存在しません";
}
&lt;/pre&gt;&lt;br /&gt;
◆&lt;b&gt;コード＃４：例外を使ったエラー処理&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
では例外をメッセンジャーみたいに使ってみた例です。&lt;br /&gt;
こういう使い方をしていいのかどうか、実はよく知らないのですが、まぁ、これはこれで動きます。メンテもやりやすそうです。例外投げると遅くなるらしいですが、めったに投げるエラーではなさそうなのでOKではないでしょうか？&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;class AppException extends Exception {}
try {
  if( !$conn = DB::connect( 'test', 'test' ) ) {
    throw new AppException( 'DBにつながりません' );
  }
  if( !$stmt = DB::parse( $conn, 'sql statement' ) ) {
    throw new AppException( 'SQLが理解できません' );
  }
  DB::execute( $stmt );
  if( ! $num  = DB::num_row() ) {
    throw new AppException( 'データが存在しません' );
  }
  for( $i = 0; $i &amp;lt; $num; $i ++ ) {
    DB::fetchRow($i);
    // 何か処理しよう
  }
}
catch( AppException $e ) {
  $error_msg = $e-&amp;gt;getMessage();
}
&lt;/pre&gt;&lt;br /&gt;
◆&lt;b&gt;コード＃４b：DBが例外を投げる場合のエラー処理&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
最後に、この「DB」なるクラスが例外を投げる場合。&lt;br /&gt;
かつ、DBが例外投げたら外でキャッチしてOKな場合です。&lt;br /&gt;
もうちょっとシンプルになりますね。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;class AppException extends Exception {}
try {
  $conn = DB::connect( 'test', 'test' );
  $stmt = DB::parse( $conn, 'sql statement' );
  DB::execute( $stmt );
  if( ! $num  = DB::num_row() ) {
    throw new AppException( 'データが存在しません' );
  }
  for( $i = 0; $i &amp;lt; $num; $i ++ ) {
    DB::fetchRow($i);
    // 何か処理しよう
  }
}
catch( AppException $e ) {
  $error_msg = $e-&amp;gt;getMessage();
}
catch( Exception $e ) {
  $error_msg = "申し訳ありませんッ！";
}
&lt;/pre&gt;&lt;br /&gt;
◆&lt;b&gt;まとめ･･･のようなもの&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
例外を使ってエラーメッセージを処理すると楽になるかどうかですが、&lt;br /&gt;
後から条件を追加するのが楽だった気がします。何しろエラーと一緒にメッセージも飛ばせるので、余りコードを追いかけることなく変更できると思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3223868801815196944?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3223868801815196944/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3223868801815196944' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3223868801815196944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3223868801815196944'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/04/php.html' title='PHP：エラー処理いろいろ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6123751971487792254</id><published>2010-03-30T17:24:00.008+09:00</published><updated>2010-03-31T22:14:58.329+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP：例外をメッセンジャーとして使ってみる</title><content type='html'>プログラミングで一番重要で面倒でつまらないのがエラー処理で、&lt;br /&gt;
少しでも楽にならないかと、&lt;a href="http://wsjp.blogspot.com/2010/03/php.html"&gt;例外を使うことにした&lt;/a&gt;わけですが･･･&lt;br /&gt;
&lt;br /&gt;
エラー処理の中でも、一番面倒でつまらないエラーメッセージの扱いが楽にならないか例外使ってみました。って、簡単な話で、例外中にエラーメッセージ入れて飛ばします。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;pre class="brush: php"&gt;class AppException extends Exception {}
try {
  try {
    ABC::do_something();
  }&amp;nbsp;
  catch( NotBadAbcException $e ) {
    throw new AppException( 'ちょっと変だよ' ); 
  }
  if( !ABC::count_something() ) {
    throw new AppException( '何もないよ' ); 
  }
}
catch( AppException $e ) {
  $error_msg = $e-&amp;gt;getMessage(); 
}
catch( Exception $e ) {
  $error_msg = '申し訳ございませんッ！'; 
}&lt;/pre&gt;&lt;br /&gt;
AppExceptionというは、エラーメッセージを運ぶための例外です。&lt;br /&gt;
下流のライブラリで例外をキャッチしたら、適当なエラーメッセージをAppExceptionに入れて飛ばします。その他、どんな条件でも問題があればAppExceptionを投げます。&lt;br /&gt;
&lt;br /&gt;
で、AppException以外の例外は極めて深刻なエラーでしょうから、ひたすら謝るとかするわけです。実際は、もう少し細かく対応すると思いますが、こんな使い方です。&lt;br /&gt;
&lt;br /&gt;
ようするにgoto文のような使い方ですね。&lt;br /&gt;
でもメッセージを内包できるのが少し楽。 &lt;br /&gt;
&lt;br /&gt;
これで実際に開発してみたのですが、ほんのちょっとコードが見やすくなったと思います。またエラーが起きた場所でエラーメッセージを書くので、的確なメッセージを考えやすいのもいいです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6123751971487792254?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6123751971487792254/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6123751971487792254' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6123751971487792254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6123751971487792254'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/03/php_30.html' title='PHP：例外をメッセンジャーとして使ってみる'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4636175096215544719</id><published>2010-03-29T20:22:00.020+09:00</published><updated>2010-03-31T22:14:22.461+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP：例外の投げ方を考えてみる</title><content type='html'>長い間悩んでいたが、PHPの例外を使うことを決心しました。&lt;br /&gt;
ただしキャッチの話じゃなくてthrowの方です。例外を投げるライブラリを使うと、catchしないといけません。ずっと&lt;b&gt;「勝手に例外を放り投げるなよ」&lt;/b&gt;と思ってたのは秘密です。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆そうじゃなくて、&lt;b&gt;自作ライブラリで例外を投げること&lt;/b&gt;にしました。&lt;br /&gt;
&lt;br /&gt;
こうなると、今後全てのコードで例外対応する必要があるわけですね。&lt;br /&gt;
大変だ。&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
さて、例外を使うと決めたのはいいのですが、いざ投げようとすると疑問が。&lt;br /&gt;
何を投げればいいんだ？&lt;br /&gt;
メッセージはどうする？&lt;br /&gt;
下の方のライブラリのエラーメッセージなんか表示してもねぇ･･･&lt;br /&gt;
&lt;br /&gt;
◆で、調べたところ、例外はネストして使うと便利なようです。&lt;br /&gt;
&lt;br /&gt;
たとえば「ABC」なるライブラリがあったとして、このライブラリが投げる例外をこうやって定義します。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;class AbcException extends Exception {};
class NotBadAbcException extends AbcException {};
class WrongAbcException extends AbcException {};&lt;/pre&gt;&lt;br /&gt;
こう書くと、どういうメリットがあるのでしょう？&lt;br /&gt;
こんなcatchの仕方が出来ます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;try {
  abc::do_something_wrong();
}
catch( NotBadAbcException $e ) {
  //&amp;nbsp; 何かエラー処理
}
catch( AbcException $e ) {
  // その他のエラー処理 
}
catch( Exception $e ) {
  // わけの分からないエラー処理 
}&lt;/pre&gt;&lt;br /&gt;
つまり例外のクラスを見るだけ何が起きたかが分かります。&lt;br /&gt;
つまりメッセージは読まなくてもいいのです。多分。&lt;br /&gt;
さらにライブラリの例外をまとめてキャッチしたりと、様々なケースにも対応可能。&lt;br /&gt;
エラーコード？そんなもの知らん。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
またエラーの種類が分かるので、キャッチした側でメッセージを作ってしまえば、大体大丈夫みたいです。今のところ。&lt;br /&gt;
&lt;br /&gt;
続き：「&lt;a href="http://wsjp.blogspot.com/2010/03/php_30.html"&gt;PHP：例外をメッセンジャーとして使って みる&lt;/a&gt;」&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4636175096215544719?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4636175096215544719/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4636175096215544719' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4636175096215544719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4636175096215544719'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/03/php.html' title='PHP：例外の投げ方を考えてみる'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3448931665588666192</id><published>2010-03-13T16:39:00.002+09:00</published><updated>2010-03-13T17:45:14.433+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/03/13</title><content type='html'>前回から3週間と短い間隔でSimple。&lt;br /&gt;
う、何しよう？&lt;br /&gt;
面倒なので、思いっきり仕事することに決定。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;HTMLデザイン＆スクレイピング&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
お得意様のウェブサイトはこつこつと10年かけて作り上げたもので、全部で1000ページ以上あります。これのリニューアルをしたいと、長いこと話をしてたのですが、さすがに手間とお金を考えて二の足を踏んでました。&lt;br /&gt;
&lt;br /&gt;
で、この間ですが意を決して、リニューアルすることにしました。&lt;br /&gt;
方法は、PHPを使ってスクレイピングを利用すること。&lt;br /&gt;
まず、.htaccessファイルを使って、すべてのHTMLファイルをPHPファイルとして認識させ、つぎにHTMLファイルについて、あるPHPファイルを読み込みます。 &lt;br /&gt;
&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;AddType application/x-httpd-php .html .php&lt;br /&gt;
&amp;lt;Files ~ "\.html"&amp;gt;&lt;br /&gt;
php_value auto_prepend_file '/usr/.../scrape.php'&lt;br /&gt;
&amp;lt;/Files&amp;gt; &lt;/blockquote&gt;この、「scrape.php」でHTMLファイルを読み込んで、Bodyタグに囲まれた部分だけを抽出して、前後にメニューとフッターを出力して出来上がりです。&lt;br /&gt;
&lt;br /&gt;
やってみたら数時間でひとまず完成。 &lt;br /&gt;
まぁ本番環境でどうなるかはわかりませんが、開発環境では意外と簡単に動きました。&lt;br /&gt;
&lt;br /&gt;
ついでにHTMLのデザインも。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;開発環境でVirtualHostを使ってみる&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
HTMLをデザインしていて、DocumentRootが違うと面倒なことが多い。VirtualHostを設定してみたところ、&lt;br /&gt;
「client denied by server configuration:」とか吐いたままストップ。&lt;br /&gt;
&lt;br /&gt;
ひとまず、Aliasだけ設定して作業を進めてたが、いよいよデザインの段階でにっちもさっちも行かず、調べてみた。らすぐに原因がわかった。&lt;br /&gt;
&lt;a href="http://blog.plastik.jp/archives/24"&gt;http://blog.plastik.jp/archives/24&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3448931665588666192?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3448931665588666192/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3448931665588666192' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3448931665588666192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3448931665588666192'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/03/simpleidx-20100313.html' title='Simple@Idx 2010/03/13'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5783772900463183957</id><published>2010-02-27T13:48:00.018+09:00</published><updated>2010-02-27T17:23:15.710+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2010/02/27</title><content type='html'>今日は勉強内容を決めずに出発。&lt;br /&gt;
何しようかなぁ…&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;AMQP&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
最初に会話に出たのがAMQP (Advanced Message Queing Protocol)。&lt;br /&gt;
何ですか、それ？&lt;br /&gt;
&lt;br /&gt;
スケールアウトしてすさまじい量の処理を行えるらしい。自分の仕事に使うことはなさそうだなぁ。と、ちょっと調べて、すぐギブアップ。&lt;br /&gt;
&lt;br /&gt;
でも、今バッチ処理で対応していることをメッセージキューを利用すると簡単にできそうだ。ただ、わざわざAMQPを使うほどの量ではないと思う。ので、自作で簡単なキューを作ったほうが早くてメンテナンスも楽なきがする。&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://labs.cybozu.co.jp/blog/akky/archives/2007/10/php-activemq-stomp.html"&gt;PHPでも簡単&lt;/a&gt;にできるみたい。ただ、ずっとPHPをCLIでまわすのもいやだし、CRONだとタイミングが会わないかもしれない。とすると、親プロセスからthread使って子プロセス走らせて、サブスクリプト側を処理して…、&lt;a href="http://d.hatena.ne.jp/moriyoshi/20091114/1258204128"&gt;みたいな実装&lt;/a&gt;がいいのだろうか？&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;HTML5&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
微妙に気になってきたHTML5。何が変わるのだろうか？&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;・&lt;/b&gt;&lt;b&gt;フォーム要素&lt;/b&gt;&lt;span id="goog_1267246264159"&gt;&lt;/span&gt;&lt;span id="goog_1267246264160"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
サンプルで&lt;a href="http://www.workspot.jp/tech/html5_input.php"&gt;HTML5のフォーム要素をいくつか作ってみた&lt;/a&gt;。&lt;br /&gt;
使いやすいフォームが簡単に作れそう。これは、素直に便利になりそう。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;・HTML5のローカルデータベース機能&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ローカル（つまりブラウザー側）にデータベースを作成して、データを保存できるようになるそうだ。これができると…オフラインで動くウェブアプリケーションができる。すごい。そういえばGoogleが昔からやろうとしてたことだっけ…&lt;br /&gt;
&lt;br /&gt;
ただ、今のお客様で必要なケースが思いつかない…&lt;br /&gt;
どこでどう利用しようか考えてしまう。 &lt;br /&gt;
&lt;br /&gt;
と、考えていたらアイディアがひとつ浮かんだ。&lt;br /&gt;
フォームに入力をしていて、間違ってウィンドウを閉じた場合の処理。フォームの内容をローカルDBに保存しておいて、次にあけたときはローカルDBから中身を読み出す。&lt;br /&gt;
そんな&lt;b&gt;&lt;a href="http://www.workspot.jp/tech/html5_db.php"&gt;サンプルを作ってみました&lt;/a&gt;&lt;/b&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5783772900463183957?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5783772900463183957/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5783772900463183957' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5783772900463183957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5783772900463183957'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/02/simpleidx-20100227.html' title='Simple@Idx 2010/02/27'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4955574385830025277</id><published>2010-02-16T18:32:00.005+09:00</published><updated>2010-02-16T18:41:27.902+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Synergyに感動した･･･</title><content type='html'>世の中バンクーバーで盛り上がってるみたいですが、&lt;br /&gt;
私は、Synergyというソフトで一人で盛り上がりました。&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
「&lt;a href="http://sourceforge.jp/magazine/10/02/08/109236"&gt;オープンソースソフトウェアで強化するWindowsデスクトップ&lt;/a&gt;」というページで見つけてインストールしてみた。インストールして立ち上げて、一瞬、設定が分からなかったけど、5分ぐらいで動いた。&lt;br /&gt;
&lt;br /&gt;
おぉ、カーソルがPCの間を行き来する。すげぇ。&lt;br /&gt;
もうKVMとかいらない。いや、モニターはつけてないと動かないか･･･&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.simeji.com/synergy/running_ja.html"&gt;設定方法の和訳&lt;/a&gt;があったけど、微妙に違ってたので訂正してみた。 &lt;br /&gt;
なお、Windows Vistaの場合のみなので。&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;SynergyInstallerをダウンロードしてインストール。&lt;br /&gt;
サーバー側とクライアント側の両方のPCにインストールします。&lt;/li&gt;
&lt;li&gt;サーバー側でSynergyをスタートして設定する。&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;「Share this computer's keyboard and mouse (server)」のラジオボタンにチェックを入れて、「Configure」ボタンを押す。すると「Screens &amp;amp; Links」という設定画面がポップアップ。&lt;/li&gt;
&lt;li&gt;「&lt;b&gt;Screens:&lt;/b&gt;」の下がPCの一覧。要するに「&lt;b&gt;コンピューター名&lt;/b&gt;」のこと。 &lt;br /&gt;
「＋」ボタンを押して、Screen Nameにサーバーのコンピューター名を入力。&lt;br /&gt;
もう一個、クライアントのコンピューター名も入力。&lt;br /&gt;
この時点で、Screens:の下に2台のPCの名前がリストされます。&lt;/li&gt;
&lt;li&gt;次は「&lt;b&gt;Links:&lt;/b&gt;」でスクリーンのつながりを設定します。&lt;br /&gt;
たとえば、「.... [right] of [server PC] goes to ... [client PC]」みたく設定してみました。もひとつ、「.... [left] of [client PC] goes to ... [server PC]」とすると、両方向で行き来できます。&lt;/li&gt;
&lt;li&gt;以上、設定が終わったら「OK」ボタンでOk。 &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&amp;nbsp;クライアント側でSynergyをスタートして設定する。 &lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;「Use another computer's shared keyboard and mouse (client)」のラジオボタンにチェックを入れて、「Other Computer's Host Name:」にサーバーとなるコンピューター名を入力。&lt;/li&gt;
&lt;li&gt;以上で設定は終了。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;サーバーとクライアント、それぞれ「Start」ボタンを押して完了。&lt;/li&gt;
&lt;/ol&gt;&amp;nbsp;一瞬戸惑ったのは&lt;b&gt;Screensがコンピューター名のこと&lt;/b&gt;、という点。&lt;br /&gt;
そしてLinksで双方向（要するにマウスの行き先を2箇所）設定すること。 &lt;br /&gt;
それさえ分かれば、後は適当に設定してたら動いた。&lt;br /&gt;
&lt;ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4955574385830025277?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4955574385830025277/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4955574385830025277' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4955574385830025277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4955574385830025277'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/02/synergy.html' title='Synergyに感動した･･･'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-7552121228960325648</id><published>2010-02-09T14:40:00.001+09:00</published><updated>2010-02-09T14:40:18.682+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>メモ：アパッチのログ解析</title><content type='html'>ふとアパッチのログ解析について調べてみた。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;ApacheLogViewer&lt;/b&gt;&lt;br /&gt;
今まで使っていたWindowsのソフト。&lt;br /&gt;
結構使いやすいのだけど、ログのサイズが増えると重い･遅い･メモリ食いすぎる。&lt;br /&gt;
バージョンも古く2004年に出たのが最後っぽい。なのでOS/ブラウザーなどの判別が出来てない。ということはBotも弾けてないのじゃないか？&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Visitors&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.hping.org/visitors/index_jp.php"&gt;http://www.hping.org/visitors/index_jp.php&lt;/a&gt;&lt;br /&gt;
なんだかすごく早くて、すごい感じのソフト。が、Windows用のバイナリが有料･･･&lt;br /&gt;
別のを探すか･･･&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;AWFFull&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.stedee.id.au/awffull"&gt;http://www.stedee.id.au/awffull&lt;/a&gt;&lt;br /&gt;
これもコンパイルが必要と･･･&lt;br /&gt;
&lt;br /&gt;
ここにいたって、PHP自作でログをDBにぶち込んで、&lt;br /&gt;
という考えが頭に浮かびました。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;Apache Log Analyzer 2 Feed&lt;/b&gt; &lt;br /&gt;
&lt;a href="http://code.simonecarletti.com/projects/apachelog2feed/wiki"&gt;http://code.simonecarletti.com/projects/apachelog2feed/wiki&lt;/a&gt;&lt;br /&gt;
すごそうなPHPクラス。RSSフィードとして解析結果を報告するそうな。ダウンロードできないのですが、どうなってるのでしょう？&lt;br /&gt;
そのクラスを使ったPHPのサンプルコード。確かに簡単に解析できそう。&lt;br /&gt;
&lt;a href="http://memo.mashmesh.net/?%28PHP%29Apache%A5%ED%A5%B0%A4%CE%B2%F2%C0%CF"&gt;http://memo.mashmesh.net/?%28PHP%29Apache%A5%ED%A5%B0%A4%CE%B2%F2%C0%CF&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;「アクセスログ解析スクリプトの作り方」&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.geekpage.jp/web/access-log/"&gt;http://www.geekpage.jp/web/access-log/&lt;/a&gt;&lt;br /&gt;
そのものずばりな、作り方指南。&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;「Parsing Apache access log files using PHP」&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.php-scripts.com/php_diary/012103.php3"&gt;http://www.php-scripts.com/php_diary/012103.php3&lt;/a&gt;&lt;br /&gt;
もうひとつ、PHPでのログのパーシングの仕方。ただし英語のみ。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;なんだか、もう自作した気分･･･&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-7552121228960325648?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/7552121228960325648/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=7552121228960325648' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7552121228960325648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7552121228960325648'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/02/blog-post.html' title='メモ：アパッチのログ解析'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1066217258858233572</id><published>2010-02-02T18:44:00.001+09:00</published><updated>2010-02-02T18:45:07.408+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>クラス設計は難しい</title><content type='html'>この一年近く、ライブラリを全面的に書き直している。&lt;br /&gt;
PHP5も出て随分経つし、早く移行したかったのだけど、なかなか機会がなくって。つい後回しにしてたのです。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
で、色々なライブラリ、つまりクラスを書いてるのだけど、&lt;br /&gt;
やはりクラス設計は難しいなぁ、と。&lt;br /&gt;
&lt;br /&gt;
汎用クラスを書いているのに、プロジェクト専用の値の入ったメソードを書いてたりする。作っていて、まずいというのはわかっていても、どうすればよいのか先が見えないので、ひとまず動くものを書いてしまう。&lt;br /&gt;
&lt;br /&gt;
で、後で、新しいプロジェクトを始めると、&lt;br /&gt;
そのたびに書き直したり、別のクラスで継承して修正したりするのだけど。&lt;br /&gt;
クラス名が変わったりして、面倒だったりする。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
その点JavaScriptやRubyは後からメソードを追加したりオーバーライトできる（よね？）のがうらやましい。PHPもこうなればいいのにね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1066217258858233572?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1066217258858233572/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1066217258858233572' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1066217258858233572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1066217258858233572'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/02/php.html' title='クラス設計は難しい'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3722965237669189411</id><published>2010-01-23T16:28:00.005+09:00</published><updated>2010-01-23T17:37:39.755+09:00</updated><title type='text'>Simple@Idx 2010/01/23</title><content type='html'>2010年、最初のSimple。&lt;br /&gt;
お題目は「俺々ツールの拡張」 。&lt;br /&gt;
ツールの名前はfmDB3。面白くない名前だ。何をするかというと、DBの登録・修正・削除を簡単に行うツール。なんというかRailsみたいな感じだろうか。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
で、その俺々ツールで、&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;ワードで仕様書作成、&lt;/li&gt;
&lt;li&gt;エクセルで設定、&lt;/li&gt;
&lt;li&gt;必要なPHPコードを生成、 &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;ファイルに生成、&lt;/li&gt;
&lt;/ol&gt;を行うというのが目標。&lt;br /&gt;
現状、1～3まで一応できていたので、今日は4のステップ。&lt;br /&gt;
&lt;br /&gt;
で、できました。&lt;br /&gt;
まずは3.で使ったクラスを拡張。&lt;br /&gt;
そして中身を適当なファイル名に出力すればOK。 &lt;br /&gt;
&lt;br /&gt;
と書くと簡単だけれども、微妙な修正が多くて一日かかった。&lt;br /&gt;
&lt;br /&gt;
コードについて書くこともないので、&lt;br /&gt;
俺々ツールを作っていて思うことをいくつか。&lt;br /&gt;
過去の失敗などから、以下の点について注意しています。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;設定は簡単に&lt;/li&gt;
&lt;li&gt;出力は簡潔かつ訂正が確認しやすい&lt;/li&gt;
&lt;li&gt;ライブラリの進化に追いつける修正の簡単なツール&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
以上。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3722965237669189411?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3722965237669189411/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3722965237669189411' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3722965237669189411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3722965237669189411'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/01/simpleidx-20100123.html' title='Simple@Idx 2010/01/23'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8484962635323466617</id><published>2010-01-21T12:41:00.008+09:00</published><updated>2010-03-29T20:30:26.592+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP::いろんな日付のフォーマットを統一するクラス</title><content type='html'>知り合いがTwitterでつぶやいたので、PHPでさくっと作ってみた。&lt;br /&gt;
いろんな日付＋時間の入力を統一するクラスです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
     SyntaxHighlighter.all()
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;使い方：&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;echo my_datetime::parse_datetime( 'Wed, 21 Jan 2010 11:41:25 +0000' );&lt;/blockquote&gt;&lt;br /&gt;
◆&lt;b&gt;出力：&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;2010-01-27   11:41:25&lt;/blockquote&gt;&lt;br /&gt;
◆&lt;b&gt;コード： &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;class my_datetime {
 /* ------------------------------------------------------------ */
 function parse_datetime( $str )
 {
  $date = self::std_date( $str, $e_part );
  $time = self::std_time( $str );
  
  return trim( "$date $time" );
 }
 /* ------------------------------------------------------------ */
 function std_time( $time )
 {
  if( preg_match( '/([0-9]{1,2})[:]([0-9]{1,2})[:]([0-9]{1,2})/', $time, $regs ) ) {
   list( $h, $m, $s ) = array( $regs[1], $regs[2], $regs[3] );
   $t_part = sprintf( "%4d:%02d:%02d", $h, $m, $s );
  }
  else 
  if( preg_match( '/([0-9]{1,2})時([0-9]{1,2})分([0-9]{1,2})秒/', $time, $regs ) ) {
   list( $h, $m, $s ) = array( $regs[1], $regs[2], $regs[3] );
   $t_part = sprintf( "%4d:%02d:%02d", $h, $m, $s );
  }
  return $t_part;
 }
 /* ------------------------------------------------------------ */
 function std_date( $date, &amp;amp;$e_part )
 {
  if( preg_match( '/([0-9]{4})[-.\/]([0-9]{1,2})[-.\/]([0-9]{1,2})(.*)/', $date, $regs ) ) {
   list( $year, $month, $day ) = array( $regs[1], $regs[2], $regs[3] );
   $d_part = sprintf( "%4d-%02d-%02d", $year, $month, $day );
   $e_part = $regs[4];
  }
  else 
  if( preg_match( '/([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日(.*)/', $date, $regs ) ) {
   $e_part = NULL;
   list( $year, $month, $day ) = array( $regs[1], $regs[2], $regs[3] );
   $d_part = sprintf( "%4d-%02d-%02d", $year, $month, $day );
   $e_part = $regs[4];
  }
  else 
  if( ereg( '([0-9]{4})([012][0-9])([012][0-9])(.*)', $date, $regs ) ) {
   list( $year, $month, $day ) = array( $regs[1], $regs[2], $regs[3] );
   $d_part = sprintf( "%4d-%02d-%02d", $year, $month, $day );
   $e_part = $regs[4];
  }
  else 
  if( ( $utime = strtotime( $date ) ) !== FALSE ) {
   $d_part = date( 'Y-m-d', $utime );
  }
  return $d_part;
 }
}
&lt;/pre&gt;&lt;br /&gt;
すでに似たようなクラスを持ってたので、ちょっと手を加えてみました。&lt;br /&gt;
と、ひとまず、こんな感じでどうでしょう？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8484962635323466617?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8484962635323466617/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8484962635323466617' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8484962635323466617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8484962635323466617'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/01/php.html' title='PHP::いろんな日付のフォーマットを統一するクラス'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-2161236191346426034</id><published>2010-01-21T09:52:00.004+09:00</published><updated>2010-05-28T15:26:26.732+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='会社業務'/><title type='text'>新サイトアップとメール設定完了</title><content type='html'>ふぅ、&lt;a href="http://www.workspot.jp/"&gt;新サイトのアップ&lt;/a&gt;が完了しました。&lt;br /&gt;
トップページだけ、jQueryを使って簡単な動きを出しました。まったくの静的ページじゃ面白くないし、凝ると大変だし。結局、画像の透過率（Opacity）の変化だけになりました。余り&lt;b&gt;意味のある動きではない&lt;/b&gt;のですが、まぁいいでしょう。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆「DNSの変更を申請してから、設定を行うのに中3日程度ほどお待ちください」などとホスティングのページに書いてあったので、申請後にのんびりしていたら、1時間ほどで開通。あわてて&lt;b&gt;メールの設定を見直す&lt;/b&gt;ことになった。&lt;br /&gt;
&lt;br /&gt;
新旧サイトのアドレスにメールが届くかもしれないので、両方見に行くことになるのだけど、いざ作業を始めると、Thunderbirdのアカウント設定を理解してないことに気がついた。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
特にThunderbird 3になってから、アカウントの新規登録が変わっていて、&lt;b&gt;自動でサーバーの種類（POP/IMAP）や接続方法を設定&lt;/b&gt;してくれる。&lt;br /&gt;
すげぇ、と思ったのは一瞬で、いきなり間違って設定されて、IMAPのアカウントとなった。&lt;br /&gt;
いや、POPなんですけど。&lt;br /&gt;
&lt;br /&gt;
で、サーバーの種類は後から変えられないし･･･&lt;br /&gt;
&lt;b&gt;自動設定をスキップする方法&lt;/b&gt;を見つけるまで設定が出来なくてあせった。設定の検索を「中止」してから、「詳細設定」ボタンを押すとマニュアルで設定できた。&lt;br /&gt;
&lt;br /&gt;
◆で、大量のアカウント追加･削除を繰り返したら、&lt;b&gt;アカウント設定画面がフリーズ&lt;/b&gt;するようになった。もう忘れかけているのだけど、原因は「同じサーバー設定」のアカウントがある様子。同じサーバー設定とは、サーバー設定で&lt;b&gt;「サーバー名」と「ユーザー名」が同じ&lt;/b&gt; というケース。これが二つ登録されると動かなくなる。（確かね）&lt;br /&gt;
&lt;br /&gt;
アカウントを修正したら治ったけど、「新着メールを全て受信」ボタンを押しても、最初のひとつのアカウント分しかダウンロードしてくれない。これは未だに治らず。&lt;br /&gt;
&lt;br /&gt;
また既存のメッセージフィルターも全滅した。&lt;br /&gt;
アカウントが変わったのが原因と思ったけど、「今すぐ実行」ボタンでも動かない。ので、何かがジャムって設定が壊れた様子。仕方がないので、ひとつずつ設定しなおしている。こんなにフィルター作ってたんだ、と思いながら。&lt;br /&gt;
&lt;br /&gt;
◆と、愚痴をこぼしながらの作業もほぼ完了。&lt;br /&gt;
新サイトを見ながら、文面をちょっとづつ変更したりしてます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-2161236191346426034?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/2161236191346426034/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=2161236191346426034' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2161236191346426034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2161236191346426034'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/01/blog-post_21.html' title='新サイトアップとメール設定完了'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6407045113277115505</id><published>2010-01-19T11:31:00.003+09:00</published><updated>2010-05-28T15:26:26.733+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='会社業務'/><title type='text'>サイトのリニューアル</title><content type='html'>腰が重かったサイトのリニューアルですが、&lt;br /&gt;
とうとう実行しました。→　&lt;a href="http://www.workspot.jp/"&gt;http://www.workspot.jp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;◆作ってから、ほったらかしだったワークスポット･ジェーピーのウェブサイト。もう5年以上更新してないし、デザインに関してはいつ作ったっけ？な状態でした。&lt;br /&gt;
&lt;br /&gt;
で、久々にホスティングサービスをチェックしたら、新しいサービスプランが出ていて、現状のプランより安くてオプションも豊富になってました。薄々知ってたのですけど、ホスティングの値崩れはすごい。&lt;br /&gt;
#知り合いは月額500円でVPS借りてるし･･･&lt;br /&gt;
&lt;br /&gt;
◆ということで、新しいサービスに移行することを決意。&lt;br /&gt;
ついでにデザインもリニューアルしようと。&lt;br /&gt;
&lt;br /&gt;
もっとも文章を新たに起こすのは大変なので、基本はデザインの更新のみ。&lt;br /&gt;
空白を多めに使った、最近はやりのデザインにしてみました。&lt;br /&gt;
余り凝らないで作ってみました。 &lt;br /&gt;
楽ですね～このデザイン。&lt;br /&gt;
&lt;br /&gt;
写真も今のところ同じものを使いまわし。&lt;br /&gt;
&lt;br /&gt;
それでも、雰囲気がガラッと変わって、気に入ってます。&lt;br /&gt;
&lt;br /&gt;
◆ただDNSの設定が申請してから3日かかるとのこと。&lt;br /&gt;
さっき申請したばかりなので、新デザインがお披露目されるのは3日後。しかもDNSが広まるまで旧サイトとの混在になります。なので、今見たい人は、こちら↓&lt;br /&gt;
&amp;nbsp;&lt;a href="http://119.245.215.33/"&gt;http://119.245.215.33/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6407045113277115505?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6407045113277115505/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6407045113277115505' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6407045113277115505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6407045113277115505'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/01/blog-post.html' title='サイトのリニューアル'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-244852070368944874</id><published>2010-01-05T11:19:00.002+09:00</published><updated>2010-01-05T11:21:23.315+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQLでの空白をどうしよう？</title><content type='html'>SQL文をPHPで生成させる場合、空白のデータをどう扱うか悩んでいます。ウェブフォームでテキスト（form_text）や日付（form_date）という入力があったとして、何も入れていない場合です。ここから次のようなSQLを作成すると、&lt;br /&gt;
&lt;blockquote&gt;UPDATE table SET form_text='', form_date='';&lt;br /&gt;
&lt;/blockquote&gt;日付は空白設定できないといって怒られるはずです。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;じゃぁ&lt;br /&gt;
&lt;blockquote&gt;UPDATE table SET form_text=NULL, form_date=NULL;&lt;br /&gt;
&lt;/blockquote&gt;とするのもいかがなものかと。&lt;br /&gt;
&lt;br /&gt;
人間様にはNULLも’’も区別が無いなのですが、データベースに渡す際には区別しなくてはいけないのが問題なのでしょう。ここは汎用SQLルーチンを書く際に面倒な部分と思います。今はDefaultに設定してしまえ、と思ってはいるのですが･･･要は、&lt;br /&gt;
&lt;blockquote&gt;UPDATE table SET form_text=DEFAULT, form_date=DEFAULT;&lt;br /&gt;
&lt;/blockquote&gt;とするだけなのですが。&lt;br /&gt;
&lt;br /&gt;
◆データベースでのデフォルトの扱いについて読んでみた。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;MySQL：&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;デフォルト値は数値型では         &lt;code class="literal"&gt;0&lt;/code&gt;         であり、文字列型では空の文字列（&lt;code class="literal"&gt;''&lt;/code&gt;）であり、日付と時刻型では ``ゼロ'' 値です。 &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-types.html"&gt; &lt;span style="color: #999999; font-size: x-small;"&gt;MySQLの日付で「ゼロ値」&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;って？&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: #999999;"&gt;&lt;span style="font-size: x-small;"&gt;ODBC では、日付または時刻型の値 ``ゼロ'' を処理できないため、MyODBC バージョン 2.50.12 以降では、MyODBC を通して日付または時刻型の値 ``ゼロ'' を使用すると、自動的に NULL に変換される。 &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;PostgreSQL：&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=957690751924967735" name="AEN2223"&gt;&lt;/a&gt; 明示的に宣言されたデフォルト値がない場合は、デフォルト値はNULL値になります。NULL値は不明のデータを表すものとみなすことができるので、通常はこの方法で問題ありません。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
何のデータベースを使っていて、どう設定されてるかによって挙動が変わるということになりそうです。まぁデータベースを作成した人に責任を取ってもらおう、ということですね。←それって自分かも･･･&lt;br /&gt;
&lt;br /&gt;
◆アプリ（PHP）側で設定をする&lt;br /&gt;
&lt;br /&gt;
本来はこの対応が正しいかもしれないですね。特にフォームの入力といった場合は、アプリ側でデフォルトを設定することは可能です。一方、データベース上にデフォルトが設定されているならば、それにあわせるべき、という考え方もあると思うので、難しいところです。&lt;br /&gt;
&lt;br /&gt;
どちらにしても、データベース上のテーブルから別のテーブルへデータをコピーする場合などで、Default値が違ったりすると扱いが難しくなるんじゃないでしょうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-244852070368944874?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/244852070368944874/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=244852070368944874' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/244852070368944874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/244852070368944874'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2010/01/sql.html' title='SQLでの空白をどうしよう？'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-9086406853768916954</id><published>2009-12-26T17:59:00.001+09:00</published><updated>2009-12-26T18:02:33.957+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple@Idx 2009/12/26</title><content type='html'>今年最後になるかもしれない、Simple勉強会＠Idx。&lt;br /&gt;
今回も、crud_sessの続き。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
流れとしては・・・&lt;br /&gt;
&lt;br /&gt;
エクセルでDB定義書　→　その他の設定を自動生成&lt;br /&gt;
→　エクセルで修正　→　DB定義、テーブル表示、DAO設定などを生成&lt;br /&gt;
&lt;br /&gt;
で、一覧画面とデータ画面の２つ、そして２つのインクルードファイルを適当に編集するとデータベースのCRUDができるようになった。要するにRoRのようなものだけど、わざわざ自作してどうしよう？と自問しながらの作業でした。&lt;br /&gt;
&lt;br /&gt;
定義書から生成まで1時間かからずできるようになりました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-9086406853768916954?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/9086406853768916954/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=9086406853768916954' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9086406853768916954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9086406853768916954'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/12/simpleidx-20091226.html' title='Simple@Idx 2009/12/26'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1200758765329751952</id><published>2009-12-12T16:29:00.006+09:00</published><updated>2009-12-12T17:03:38.523+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Simple@Idx 2009/12/12</title><content type='html'>今年最後のSimpleミーティング。&lt;br /&gt;
内容は、&lt;br /&gt;
◆jQueryでフォームのUp/Down&lt;br /&gt;
◆PHPでセッション使ってDBのCRUD&lt;br /&gt;
◆CentOSがインストールできないよ&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;jQuery使ってフォームUp/Down&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
いい加減に飽きてきたこのプロジェクト。昨日思いついたことを試してみた。&lt;br /&gt;
セレクトボックスで不振な挙動を示すのは、イベントが終了しきっていない間にフォーカスを変えてしまうからではないか？と思って、下記のサイトを参考に、jQueryで強制的にイベントをストップしてみた。&lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/652495/jquery-multiple-event-handlers-how-to-cancel"&gt;http://stackoverflow.com/questions/652495/jquery-multiple-event-handlers-how-to-cancel&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
次のエレメントにfocusする前に&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;event.stopImmediatePropagation();&lt;/code&gt;&lt;/pre&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;を発行したのですが、&lt;/code&gt;結果は・・・だめでした。&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;PHPのクラス：：sess_crud&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
自作のDAOライブラリを便利に使うdao_crudなるクラスを使っている。これを使うとDBデータの読込・登録・修正・削除を統一的に扱えて、かつ&lt;b&gt;エラーメッセージを適宜設定してくれる&lt;/b&gt;ところが便利。 &lt;br /&gt;
&lt;br /&gt;
が、セッションを使って対応しようとすると、ベースとしているクラスでセッションに保存するのが非常に面倒であった。俗に言う、遅延静的束縛（Late Static Binding）なる問題がPHPで解決されるまで待つことにしていた。&lt;br /&gt;
&lt;br /&gt;
コードのイメージは↓の感じ。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;class dao { 
&amp;nbsp; // セッションに保存するメソードを作成する
&amp;nbsp; function saveSession() { ...} 
}

class table extends dao {
&amp;nbsp; // 適宜テーブルにアクセスするメソードを作成
}

$dao = new table();
$dao-&amp;gt;saveSession();&lt;/pre&gt;&lt;br /&gt;
saveSessionで、データをセッションに保存するわけなです。ところがtableが複数ある場合でも、毎回同じセッション名を使うことになってしまう。なぜならばsaveSessionのあるdaoクラスから継承されたクラス名がわからないため。 &lt;br /&gt;
&lt;br /&gt;
で、PHP5.3.0で、&lt;strike style="color: #999999;"&gt;地厭世的束縛&lt;/strike&gt;遅延静的束縛が使えるようになったのですが・・・&lt;br /&gt;
これまた先日思いついたですが、5.3.0より前でも問題ないということに気がついた。&lt;br /&gt;
イメージとしては・・・ &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;$dao = new table();
$crud = new dao_crud( $dao );
$crud-&amp;gt;saveSession();&lt;/pre&gt;&lt;br /&gt;
この「crud」なるクラスでDAOを持つので、DAOのクラス名がわかる。セッションにデータを保存する際、DAOのクラス名を使えば汎用のクラスがかけることに気がついた。←気づくの遅すぎorz&lt;br /&gt;
&lt;br /&gt;
そこで、コンセプトコードと称して一度も動かさずにゴリゴリとコーディング。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
◆CentOSの起動ができない&lt;br /&gt;
&lt;br /&gt;
話し変わって、先週CentOSのインストールに失敗。&lt;br /&gt;
&lt;br /&gt;
DVDからブートしようとして「Boot...」は出るのだけど、その後キーボードの入力ができない。Enterを押そうとも「TEXT」と入力しようとも無反応。指をくわえて30秒すると目の前にMS Windowsが起動してしまうという・・・&lt;br /&gt;
&lt;br /&gt;
そんな話をしながらググッたら、それらしいのを発見。 &lt;br /&gt;
&lt;a href="http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a032hpetdisable.html"&gt;http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a032hpetdisable.html&lt;/a&gt;&lt;br /&gt;
現象としては似てます。&lt;br /&gt;
&lt;br /&gt;
もうひとつ。 &lt;br /&gt;
&lt;a href="http://slashdot.jp/comments.pl?threshold=1&amp;amp;mode=flat&amp;amp;commentsort=4&amp;amp;sid=424915%20"&gt;http://slashdot.jp/comments.pl?threshold=1&amp;amp;mode=flat&amp;amp;commentsort=4&amp;amp;sid=424915 &lt;/a&gt;&lt;br /&gt;
原因はわからないみたいですねぇ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1200758765329751952?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1200758765329751952/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1200758765329751952' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1200758765329751952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1200758765329751952'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/12/simpleidx-20091212.html' title='Simple@Idx 2009/12/12'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-9136526080958394693</id><published>2009-12-01T18:09:00.006+09:00</published><updated>2009-12-01T18:17:24.237+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>MySQLでサブクエリ（エラー#1093を回避する方法）</title><content type='html'>MySQLでもサブクエリーが使えることを思い出して、とあるプロジェクトで使ってみることにした。さくっと、以下のようなSQLを書くと･･･&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;INSERT INTO exam ( type, code ) VALUES ( 
'A', ( 
&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT IFNULL( MAX( code ) + 1, 1000 ) 
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM exam WHERE type='A' )
);&lt;/pre&gt;&lt;br /&gt;
&lt;code&gt;#1093 - You can't specify target table 'exam' for update in FROM clause &lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
と怒られてしまった。&lt;br /&gt;
正直な話、SQLは得意というわけではないので、 最初はやっぱり無理？と思ってしまった。 &lt;br /&gt;
&lt;br /&gt;
が、気を取り直して「mysql 1093」でググってみると、&lt;a href="http://www.mysqlfaqs.net/mysql-faqs/Errors/1093-You-can-not-specify-target-table-comments-for-update-in-FROM-clause"&gt;答えのページ&lt;/a&gt;を発見。MySQLだからではなく、SQL標準から見ても間違った構文なんだそうだ。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;＊　＊　＊　＊　＊　＊　＊　＊　＊　＊&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
簡単に問題の説明をすると、下記のようなテーブルがあるとします。&lt;br /&gt;
&lt;pre class="code"&gt;CREATE TABLE exam (
&amp;nbsp;&amp;nbsp; id SERIAL,&amp;nbsp; 
&amp;nbsp;&amp;nbsp; code int,
&amp;nbsp;&amp;nbsp; type char(1)
)&lt;/pre&gt;&lt;br /&gt;
ここでidがプライマリキーで自動でナンバーリングしてくれます。typeは、例えば試験会場とかをあらわしていて、&lt;b&gt;codeには各会場での連番&lt;/b&gt;を振りたい、といった要望です。&lt;br /&gt;
&lt;br /&gt;
サブクエリが使えないと、一旦テーブルをロックして、「type='A'」 の条件でcodeの最大値を読み出して、それを使って･･･と面倒なことをしなければいけません。&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;＊　＊　＊　＊　＊　＊　＊　＊　＊　＊&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
で、そのページ曰く、SQLでは&lt;b&gt;あるテーブルに対してデータを追加･更新する場合、同じテーブルをサブクエリーに使えない&lt;/b&gt;のだそうです。&lt;br /&gt;
&lt;br /&gt;
それじゃ、意味ないじゃない！&lt;br /&gt;
と思ったが、続きがあって、上手にFROM句を使う方法が書いてあった。SQLでは、&lt;b&gt;サブクエリー内のFrom句はテンポラリテーブルとして扱うことが可能&lt;/b&gt;で、次のように書き換えれば動くとのこと。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;INSERT INTO exam ( type, code ) VALUES ( 
'A', ( 
&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT IFNULL( max_code + 1, 10001 ) 
&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM (&amp;nbsp;SELECT MAX( code ) AS max_code FROM exam WHERE type='A' ) AS temp1 )
);&lt;/pre&gt;&lt;br /&gt;
何をしているのかというと、&lt;br /&gt;
まさにサブクエリー内のFromを&lt;br /&gt;
「&lt;b&gt;SELECT MAX( code ) AS max_code FROM table WHERE type='A'&lt;/b&gt;」&lt;br /&gt;
というクエリで書き換えて、それをtemp1とか名前をつけてます（つけないと怒られます）。&lt;br /&gt;
そこから「&lt;b&gt;max_code+1&lt;/b&gt;」で最大値を読み取ってます。ちなみにIFNULLがあるのは、データが無い場合にNULLが帰ってきてしまうから。&lt;br /&gt;
&lt;br /&gt;
これで動きました。テーブル名と項目名は適宜書き換えているので、ミスっているかも知れません。ともあれ初めて真面目にサブクエリーを使ったのでメモしておきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-9136526080958394693?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/9136526080958394693/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=9136526080958394693' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9136526080958394693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9136526080958394693'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/12/mysql1093.html' title='MySQLでサブクエリ（エラー#1093を回避する方法）'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6561558006996218886</id><published>2009-11-06T11:35:00.004+09:00</published><updated>2009-11-06T11:52:46.030+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>jQuery::Up/Downキーでフォームを移動、パート６：テーブル用とデバッグ用コード</title><content type='html'>前回のSimpleで発表したテーブル用のサンプルですが、アップしました。&lt;br /&gt;
&lt;a href="http://www.workspot.jp/tech/formupdnTable.html"&gt;http://www.workspot.jp/tech/formupdnTable.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ctrl＋up/down/left/rightキーを使って、テーブル内を自由に上下左右に動き回れます。コードは直接HTMLを見てください。&lt;br /&gt;
ま、グローバル変数使いまくりのコピペなコードですが、初めてのJavaScript/jQueryということで勘弁してください。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆デバッグ用コード &lt;br /&gt;
&lt;br /&gt;
さて、FireFoxで上記のサンプルでセレクトボックスに移動すると、セレクトの内容が変わってしまいます。前からあるバグで、IE6、IE7、Opera、Safariではみられません。&lt;br /&gt;
&lt;br /&gt;
ということでデバッグ用にコードを簡単にしてみました。&lt;br /&gt;
&lt;a href="http://www.workspot.jp/tech/formupdn_not_work.html"&gt;http://www.workspot.jp/tech/formupdn_not_work.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
もうひとつ、最低限のコードで動くバージョンも作ってみました。&lt;br /&gt;
&lt;a href="http://www.workspot.jp/tech/formupdn_only_js.html"&gt;http://www.workspot.jp/tech/formupdn_only_js.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
◆問題はイベント処理？&lt;br /&gt;
&lt;br /&gt;
要するにjQueryのイベント処理を使うと、キーの本来の処理が実行されてしまうようです。&lt;br /&gt;
これがjQueryの問題なのか、FireFoxなのかがわかりません。&lt;br /&gt;
&lt;br /&gt;
【追記：2009/11/6】&lt;br /&gt;
&lt;br /&gt;
先ほどjQuery-1.4preでデバッグ用コードを試してみたところ、FireFoxでも問題なくなってます。が、テーブル用のコードだとだめです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6561558006996218886?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6561558006996218886/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6561558006996218886' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6561558006996218886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6561558006996218886'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/11/jqueryupdown.html' title='jQuery::Up/Downキーでフォームを移動、パート６：テーブル用とデバッグ用コード'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3605647069600832659</id><published>2009-10-24T15:45:00.009+09:00</published><updated>2009-10-24T17:07:13.092+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Simple@Idx 2009/10/24</title><content type='html'>今日のシンプルは3人。&lt;br /&gt;
のんびりと、おいしいサツマイモを食べながらコーディング・・・&lt;br /&gt;
今日の作業内容は・・・&lt;br /&gt;
－formUpDnのコンセプト画面&lt;br /&gt;
－FireFoxで問題が出るのでバグレポートを提出したい&lt;br /&gt;
－久々にCのコードを見たよ&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
◆&lt;b&gt;formUpDnのコンセプト画面&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
デモ画面というか、「おぉ　これは便利かも」と思ってもらいたいケースを作成。&lt;br /&gt;
phpMyAdminのようにテーブル型（列と行）のフォームがある場合、上下左右に動けるコードを作成。Ctrl+[Up|Down|Left|Right]で自由にテーブル内を動き回れる。テキストエリアやセレクトからも簡単に動けるようになった。&lt;br /&gt;
&lt;br /&gt;
うぅ、サイトの設定を忘れたのでファイルをアップできない・・・ &lt;br /&gt;
ので、気が向いたときに発表予定。&lt;br /&gt;
&lt;br /&gt;
ちなみにコードはコピペで作成したので汚い。&lt;br /&gt;
さらにグローバル変数使いまくり・・・ &lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;FireFoxで問題が出るのでバグレポートを提出したい&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
と思ったので、コードを簡単にする。&lt;br /&gt;
JavaScriptだけで、簡単なコードを書いたら問題ない。ふむ。&lt;br /&gt;
jQueryとHotKeysというプラグインを使ってたので、まずはプラグインを削除。で、問題なし。プラグインの問題でもない。&lt;br /&gt;
仕方ないので、jQueryのコードから少しずつコードを減らして何とか20行ぐらいまで削った。もう十分でしょう。&lt;br /&gt;
&lt;br /&gt;
次は、どこのコミュニティにバグをレポートするべきか？&lt;br /&gt;
jQuery？&lt;br /&gt;
FireFox？&lt;br /&gt;
&lt;br /&gt;
◆&lt;b&gt;久々にCのコードを見たよ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
こんな感じ・・・&lt;br /&gt;
&lt;br /&gt;
ErnDrv drv = {&lt;br /&gt;
&amp;nbsp;.name = NULL,&lt;br /&gt;
&amp;nbsp;.form = form_func()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
最初の感想は、「なんじゃこりゃ～！」&lt;br /&gt;
こんな構文、Cにあったっけ？&lt;br /&gt;
&lt;br /&gt;
えっと、ErnDrvがstructだとして、いきなり初期化しているとして、最初の「.」は何？メンバー？ &lt;br /&gt;
&lt;br /&gt;
そのほか、mallocとかポインターとかみただけでめげそうだ。もうCで開発はできないよなぁ。間違っても「Cで開発してた」などと自慢しないように気をつけよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3605647069600832659?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3605647069600832659/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3605647069600832659' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3605647069600832659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3605647069600832659'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/10/simpleidx-2009829.html' title='Simple@Idx 2009/10/24'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5661817627689671683</id><published>2009-10-15T15:26:00.005+09:00</published><updated>2009-10-24T15:59:40.679+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>FireFoxアドオン：Google Toolbarインストールでエラー#-203</title><content type='html'>古いPCのFireFoxをアップデートして、&lt;br /&gt;
ついでに&lt;span style="font-weight: bold;"&gt;Google Toolbarもアップデートしたらエラーが出た&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
エラー番号は：-203&lt;br /&gt;
&lt;br /&gt;
でした。&lt;br /&gt;
で、ググって見ると、英語のページしかヒットしなかったのでログしてみます。参考にしたのは&lt;a href="http://groups.google.com/group/FFToolbar-group-GettingStarted/browse_thread/thread/ff90f515baad0dff?hl=en"&gt;このページ&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;◆まずはオプションをチェック&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
メニューの「ツール」　→　「オプション」、　そして、タブの「プライバシー」を開く。&lt;br /&gt;
「サードパーティのCookieも保存する」にチェックを入れる。&lt;br /&gt;
&lt;br /&gt;
場合によっては「履歴を記憶させる」を選択するのかもしれません。&lt;br /&gt;
&lt;br /&gt;
自分の場合は、これでは駄目でした。&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;◆エクステンションを一旦削除&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
エクステンションが駄目になった可能性があるそうです。&lt;br /&gt;
&lt;br /&gt;
対処方法は、&lt;a href="http://kb.mozillazine.org/Unable_to_install_themes_or_extensions_-_Firefox#Corrupt_extension_files"&gt;エクステンションのファイルを削除&lt;/a&gt;！&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;FireFoxを完全にクローズする。&lt;/li&gt;
&lt;li&gt;プロファイルの入っているフォルダーを探す。&lt;br /&gt;
ちなみに、このページに&lt;a href="http://kb.mozillazine.org/Profile_folder_-_Firefox"&gt;プロファイルのあるフォルダー&lt;/a&gt;が乗ってます。&lt;br /&gt;
XPの場合は下記の場所にありました。&lt;br /&gt;
C:\Documents and Settings\&lt;i&gt;&lt;user&gt;&lt;/user&gt;&lt;/i&gt;\Application Data\Mozilla\Firefox\Profiles\&lt;profile&gt;&lt;br /&gt;
&lt;/profile&gt;&lt;/li&gt;
&lt;li&gt;次の3ファイルを削除&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;extensions.ini &lt;/li&gt;
&lt;li&gt;extensions.cache&lt;/li&gt;
&lt;li&gt;extensions.rdf&lt;/li&gt;
&lt;/ul&gt;本当に削除してしまわず、別ファイルにリネームするのが安全、とのこと。 &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;FireFoxを再起動。&lt;br /&gt;
再起動したらGoogle Toolbarもインストールされた状態になってました。&lt;/li&gt;
&lt;/ol&gt;以上。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5661817627689671683?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5661817627689671683/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5661817627689671683' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5661817627689671683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5661817627689671683'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/10/firefoxgoogle-toolbar-203.html' title='FireFoxアドオン：Google Toolbarインストールでエラー#-203'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-2296814451481612560</id><published>2009-09-26T17:21:00.016+09:00</published><updated>2009-10-24T16:15:29.800+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Simple@Idx 2009/9/26</title><content type='html'>作業ログ&lt;br /&gt;
－FoxServアンインストール　→　Xamppインストール&lt;br /&gt;
－jQueryでformUpDn（オブジェクト化）&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;◆FoxServアンインストール　→　Xamppインストール&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
今のラップトップはFoxServで環境をインストールしていて、PHP4.2.2が入っている。これだとsymfonyは動かないので、新しくXamppでインストール。バージョンは1.7.2。&lt;br /&gt;
&lt;br /&gt;
が、MySQLをサービスとしてインストールに失敗。&lt;br /&gt;
&lt;br /&gt;
原因は・・・FoxServでインストールした古いMySQLのサービスの残骸がレジストリに残っていた様子。久々にregeditを立ち上げ。適当に怪しそうな場所を見てみると・・・&lt;br /&gt;
&lt;pre class="code"&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL&lt;/pre&gt;&lt;br /&gt;
を発見。&lt;br /&gt;
削除して・・・大丈夫だよね？？？&lt;br /&gt;
不安なのでググッてみたが、よくわからず。まぁいいや。&lt;br /&gt;
削除して、再起動して、動いているからよし。&lt;br /&gt;
&lt;br /&gt;
これでXamppが動いた。&lt;br /&gt;
&lt;br /&gt;
この後、Eclipseもダウンロード→インストール→PHPプロジェクトの作成、でプロジェクトを開始しようとしたが、既存のフォルダを開けず。&lt;br /&gt;
&lt;br /&gt;
めげたので、symfonyは、ひとまずやめ。&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;◆jQueryでformUpDn&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
前回作成したjQueryをOOPにしてみる。&lt;br /&gt;
&lt;pre class="code"&gt;var formUpDn = function () { ... }
formUpDn.prototype.down = function() { ... }&lt;/pre&gt;と新しいオブジェクトとメソードを定義して、オブジェクト内で、&lt;br /&gt;
&lt;pre class="code"&gt;// UPキーが押された場合の処理。
$(this.jFormElem).bind( 'keydown', 'up', this.down );&lt;/pre&gt;とやっても、this.downなんて知りませんと起こられる。&lt;br /&gt;
肝心のjQueryのbind内で「this」が変わっている。&lt;br /&gt;
&lt;br /&gt;
JavaScriptの特徴で、イベント発生時のスコープは、イベントが発生したDOMオブジェクトに設定されるらしい。つまりthis.downのthisはフォームの要素になってしまう、ということ（と理解してます）。&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;◆jQueryにスコープを追加する&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
どうするの？&lt;br /&gt;
と思いつつググルと&lt;a href="http://16c.jp/2008/0528214632.php"&gt;解決法&lt;/a&gt;があった。&lt;br /&gt;
&lt;br /&gt;
下記の「scope」という関数を追加して、不思議な呼び方をすると動いた。&lt;br /&gt;
&lt;pre class="code"&gt;jQuery.scope = function( target, func ) {
return function() {
return func.apply( target, arguments );
}
};

formUpDn.prototype.bind = function()
{
// DOWNキーが押された場合の処理。
var that = this;
$(this.jFormElem).bind( 'keydown', 'down', jQuery.scope( this, that.down ) );
}&lt;/pre&gt;&lt;br /&gt;
これで、キーが押されると、formUpDnオブジェクトのdownメソードを呼び出すようになりました。&lt;br /&gt;
が、まだ動いてません。また次回の続きに。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-2296814451481612560?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/2296814451481612560/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=2296814451481612560' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2296814451481612560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/2296814451481612560'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/09/simpleidx-2009926.html' title='Simple@Idx 2009/9/26'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-1539074924231261813</id><published>2009-09-12T11:35:00.010+09:00</published><updated>2009-10-24T16:00:26.636+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP::symfony 1.2 を勉強中･･･４～７日目</title><content type='html'>&lt;a href="http://www.symfony-project.org/jobeet/1_2/Propel/ja/"&gt;Jobeetチュートリアル&lt;/a&gt;も、いよいよPHPコードをいじくる4日間。&lt;br /&gt;
モデル、ビュー、モジュール、テンプレート、そしてconfigの間を行ったりきたり。&lt;br /&gt;
&lt;br /&gt;
今まで開発はDreamWeaverで行ってきたけど、ここにきて限界がきた。&lt;br /&gt;
早速Eclipseをインストール。&lt;br /&gt;
&lt;br /&gt;
というか、&lt;a href="http://www.google.co.jp/search?q=PHP+Development+Tools&amp;amp;lr=lang_ja&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:ja:official&amp;amp;client=firefox"&gt;PHP Development Tools（PDT）&lt;/a&gt;という便利なのがあるんですね。&lt;br /&gt;
昔TruStudioとか試したことはありましたが、いつのまにか進んでます。&lt;br /&gt;
ありがたいです。&lt;br /&gt;
&lt;br /&gt;
が、ZendDebuggerが動かない。&lt;br /&gt;
う～ん、debugテストは通るのだけど、ブレークポイントが利かない。&lt;br /&gt;
後で原因を探ることにして、Jobeetチュートリアルを進めます。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;＊　＊　＊　＊　＊　＊　＊　＊&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
で、Jobeetの４～７日なのですが、基本的にコードをコピペしていれば順調に進みました。&lt;br /&gt;
時々、といより、しょっちゅう動かなくなるので前に戻って間違いを探してました。どうも定型仕事は苦手。自分は履歴書とか全部埋められないタイプです。&lt;br /&gt;
&lt;br /&gt;
ただ基本的に全てPHPコード（と多目の設定ファイル）で出来ているのはよかった。これで新しい言語（テンプレートタグ）を覚えろ、と言われたらやめてたかも。&lt;br /&gt;
&lt;br /&gt;
最初はsymfonyの癖、というか作法が大変。&lt;br /&gt;
ファイルを探すのに一苦労。&lt;br /&gt;
でも7日目となると少しは慣れてきた。&lt;br /&gt;
&lt;br /&gt;
今のところ理解したのは、URLの意味。&lt;br /&gt;
&lt;pre class="code"&gt;http://localhost:8080/frontend_dev.php/module/action&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;frontend_dev.php&lt;br /&gt;
jobeet/web/ffrontend_dev.phpのコード内で&lt;span style="color: #3366ff; font-weight: bold;"&gt;application&lt;/span&gt;を指定している。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;apps/&lt;span style="color: #3366ff; font-weight: bold;"&gt;application&lt;/span&gt;/*&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #3366ff; font-weight: bold;"&gt;module&lt;/span&gt;&lt;br /&gt;
applicationにおける&lt;span style="font-weight: bold;"&gt;モジュール&lt;/span&gt;を指定している。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;apps/application/&lt;span style="color: #3366ff; font-weight: bold;"&gt;modules&lt;/span&gt;/*&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #3366ff; font-weight: bold;"&gt;action&lt;/span&gt;&lt;br /&gt;
モジュールにおける&lt;span style="font-weight: bold;"&gt;アクション&lt;/span&gt;を指定している。&lt;br /&gt;
アクションが決まると、MVCにおけるモデル（データを読み込む部分）とビュー（表示する部分）が決まるようで、以下のような関係になっている。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;apps/application/modules/actions/actions.class.phpのexecute&lt;span style="color: #3366ff; font-weight: bold;"&gt;Action&lt;/span&gt;()のメソード。&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;apps/application/modules/templates/&lt;span style="color: #3366ff; font-weight: bold;"&gt;action&lt;/span&gt;Success.phpのテンプレート&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
実際のURLは&lt;span style="font-weight: bold;"&gt;application&lt;/span&gt;のrouting.ymlで指定された方法で解析されるので、微妙に違ってくる。何がどう解析されているのかは、なれないとよく分からん。&lt;br /&gt;
&lt;br /&gt;
また、上記のapplicationやmoduleの全てから利用できるライブラリとして、&lt;br /&gt;
lib/*&lt;br /&gt;
config/*&lt;br /&gt;
などがある。lib/*にはデータベースのアクセス用クラスがあるぞ、と。&lt;br /&gt;
ここら辺は、次回にでも。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-1539074924231261813?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/1539074924231261813/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=1539074924231261813' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1539074924231261813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/1539074924231261813'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/09/phpsymfony-12_12.html' title='PHP::symfony 1.2 を勉強中･･･４～７日目'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4810588469935865816</id><published>2009-09-07T12:48:00.007+09:00</published><updated>2009-10-24T16:01:42.044+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP::symfony 1.2 を勉強中･･･１～３日目</title><content type='html'>symfonyを勉強中。&lt;br /&gt;
&lt;br /&gt;
◆まずはXAMPPを使ってローカルに環境を整える。&lt;br /&gt;
&lt;br /&gt;
えぇと、すでにXAMPPを使っているのでアップグレード･･･&lt;br /&gt;
が、動かない。&lt;br /&gt;
&lt;br /&gt;
仕方が無いので最新のxamppliteをインストール。&lt;br /&gt;
このままだと動かないので、既存のXAMPPのApacheを停止。&lt;br /&gt;
その後、xamppliteのxampp_control.exeからApacheをスタート。&lt;br /&gt;
これで最新のXAMPP、つまりPHP5.3.0が使えるようになりました。&lt;br /&gt;
&lt;br /&gt;
◆&lt;a href="http://www.symfony-project.org/jobeet/1_2/Propel/ja/"&gt;Jobeetチュートリアル&lt;/a&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
素晴らしい（そうな）symfonyのチュートリアル。&lt;br /&gt;
が、3日目で先に行けなくなる。エラーは下記の通り。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;D:\xampplite\jobeet&amp;gt;symfony propel:generate-module --with-show --non-verbose-templates frontend job JobeetJob

Fatal error: Class 'JobeetJobForm' not found in D:\xampplite\jobeet\lib\vendor\symfony\lib\generator\sfModelGenerator.class.php on line 321&lt;/pre&gt;&lt;br /&gt;
調べると、&lt;a href="http://d.hatena.ne.jp/s_kaneda/20090403/1238754065"&gt;このページに対応策&lt;/a&gt;が出ていた。&lt;br /&gt;
つまり、次の呪文を唱えるべし。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;symfony propel:build-forms&lt;/pre&gt;&lt;br /&gt;
をぉ、動いた。&lt;br /&gt;
フォームのクラス自動生成をしてくれる。のでしょう。&lt;br /&gt;
&lt;br /&gt;
◆それでは、ブラウザーでアクセスしてみましょう。&lt;br /&gt;
http://localhost:8080/frontend_dev.php/job&lt;br /&gt;
&lt;br /&gt;
うぅ、動かない。なぜ？&lt;br /&gt;
&lt;br /&gt;
これも、次の呪文で解決。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;symfony cache:clear&lt;/pre&gt;&lt;br /&gt;
これで、めでたくチュートリアルどおり、下記のエラーが表示された。&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;500 | Internal Server Error | RuntimeException&lt;/h1&gt;&lt;h2 id="message"&gt;Class "JobeetCategory" must implement a "__toString" method to be rendered in a "sfWidgetFormPropelChoice" widget&lt;/h2&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4810588469935865816?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4810588469935865816/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4810588469935865816' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4810588469935865816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4810588469935865816'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/09/phpsymfony-12.html' title='PHP::symfony 1.2 を勉強中･･･１～３日目'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4522447889378094455</id><published>2009-09-03T10:55:00.007+09:00</published><updated>2009-10-24T16:16:08.619+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP：：sprintf 引数の番号付</title><content type='html'>前から使ってみたくても動かなかったのが&lt;br /&gt;
&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;PHPのsprintf関数の引数の番号付&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
という機能。&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://jp.php.net/manual/ja/function.sprintf.php"&gt;PHPのマニュアル&lt;/a&gt;に書いてあるのだけど、&lt;br /&gt;
どうも動かなかった。&lt;br /&gt;
&lt;br /&gt;
動かないなぁ、変だけど、まぁいいや、&lt;br /&gt;
と使わないでいたが、原因が分かった。&lt;br /&gt;
教えてくれたのは、&lt;a href="http://nyx.pu1.net/function/strings/sprintf.html"&gt;このページ&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
要は、ダブルとシングルクオートの問題だった。&lt;br /&gt;
簡単に、下に３通りの例を（例題もほぼ上のページと同じ）&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;span style="color: #0000bb;"&gt;$format &lt;/span&gt;&lt;span style="color: #007700;"&gt;= &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"これは動く：%2\$s %3\$02d %1\$04d"&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;
&lt;/span&gt; &lt;span style="color: #0000bb;"&gt;printf&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$format&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$year&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$month&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$day&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: #0000bb;"&gt;$format &lt;/span&gt;&lt;span style="color: #007700;"&gt;= &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'これも動く：%2$s %3$02d %1$04d'&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;
&lt;/span&gt; &lt;span style="color: #0000bb;"&gt;printf&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$format&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$year&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$month&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$day&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: #0000bb;"&gt;$format &lt;/span&gt;&lt;span style="color: #007700;"&gt;= &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"これは動かない：%2$s %3$02d %1$04d"&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;
&lt;/span&gt; &lt;span style="color: #0000bb;"&gt;printf&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$format&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$year&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$month&lt;/span&gt;&lt;span style="color: #007700;"&gt;, &lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$day&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;
&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
なるほど、分かってみれば簡単なことだった。&lt;br /&gt;
「$」がPHPの変数と認識されちゃうことが原因だったわけですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4522447889378094455?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4522447889378094455/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4522447889378094455' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4522447889378094455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4522447889378094455'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/09/phpsprintf.html' title='PHP：：sprintf 引数の番号付'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-9222106343839578349</id><published>2009-08-29T17:37:00.008+09:00</published><updated>2009-10-24T16:16:34.562+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Simple@Idx 2009/8/29</title><content type='html'>シンプルインデックス＠２００９年８月２９日&lt;br /&gt;
まずはラップトップ、じゃなくてノートブックの電源をオン。&lt;br /&gt;
出掛けに&lt;br /&gt;
「仕事に行ってきます」&lt;br /&gt;
と娘に言ったので、これで約束は果たしたぞ、と。&lt;br /&gt;
&lt;br /&gt;
で、jQueryでフォームのアップ・ダウンの続き。&lt;br /&gt;
JavaScriptのオブジェクトを勉強。&lt;br /&gt;
JANさんからJSのオブジェクトの話を教わる。&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;var O = function() {
a = 'hi';
alert( a );
}

var Q = new O();

var P = {};
for( var p in O.prototype ) {
P.prototype[p] = p;
}&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
なコードを教わる。&lt;br /&gt;
PとQの違いは？&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Qを作るととアラートが出る。&lt;/li&gt;
&lt;li&gt;Pを作ってもアラートは出ない。&lt;/li&gt;
&lt;/ul&gt;という話。&lt;br /&gt;
&lt;br /&gt;
プロトタイプはポインタ？見たいという理解でよさそう。&lt;br /&gt;
&lt;br /&gt;
最初は、まったく動かず。&lt;br /&gt;
理由は、以下のコードで「var form1 = 」の部分を「ready」の外においていたから。&lt;br /&gt;
HTMLがロードされる前にJavaScriptが実行→HTMLがまだ読み終わってないのでフォームの要素がない→配列が空。&lt;br /&gt;
というのが原因でした。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$(document).ready( function()&lt;br /&gt;
{&lt;br /&gt;
var form1 = new FormUpDn();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function FormUpDn() {&lt;br /&gt;
this.jFormElem = ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
でも、結局動かず。&lt;br /&gt;
やはりスコープが足りなかったようです。&lt;br /&gt;
以上&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-9222106343839578349?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/9222106343839578349/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=9222106343839578349' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9222106343839578349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/9222106343839578349'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/08/simpleidx-2009829.html' title='Simple@Idx 2009/8/29'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4568823775862746384</id><published>2009-07-08T18:59:00.005+09:00</published><updated>2009-07-08T19:10:57.076+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>ファイルの圧縮で改行コードが変わる？</title><content type='html'>まさかね。
そんなはずはない、と思ってました。

でも、この&lt;a href="http://ap.atmarkit.co.jp/bbs/core/fwin/11854"&gt;改行コードと圧縮についてのエントリー&lt;/a&gt;を読んで、
もしかしてと思い立ち、調査したんです。

そうしたら、圧縮→解凍して、改行コードが変わる場合を見つけました。
まだ調査中なのですが、以下のような条件です。
&lt;ol&gt;&lt;li&gt;あるテキストファイルは、改行コードが「LF」と「CR+LF」で混在している。&lt;/li&gt;&lt;li&gt;このファイルをWindowsXP上で圧縮。&lt;/li&gt;&lt;li&gt;圧縮したファイルを別マシーン（これもWindowsXP）で解凍。&lt;/li&gt;&lt;li&gt;するとファイルの改行コードが「CR+LF」に統一される。&lt;/li&gt;&lt;/ol&gt;という現象です。

この後調べて、
&lt;ul&gt;&lt;li&gt;解凍は「解凍レンジ」というフリーソフトを使用している。
多分、圧縮はWindows XPの機能を使っている。
&lt;/li&gt;&lt;li&gt;で、圧縮したファイルを、
WindowsXP上で解凍レンジで解凍すると改行コードが変わる。
でもVista上で解凍レンジで解凍しても改行コードは変わらない。&lt;/li&gt;&lt;li&gt;両方ともバージョンは1.40　（最新が1.41なので少し古い）。&lt;/li&gt;&lt;/ul&gt;ということが分かり、「Windows XP上で解凍すると改行コードが化ける」事例を見つけました。

さて、どうしましょう？
やっぱりWindowsXPを使うのをやめるか？

まずは、改行コードを統一すべきだよな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4568823775862746384?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4568823775862746384/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4568823775862746384' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4568823775862746384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4568823775862746384'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/07/blog-post.html' title='ファイルの圧縮で改行コードが変わる？'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8322132755511645987</id><published>2009-06-29T15:45:00.001+09:00</published><updated>2009-06-29T15:49:31.418+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>やった～、85点</title><content type='html'>思ったよりよかった。
&lt;a href="http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001531"&gt;http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001531&lt;/a&gt;

ほかに書くことが無のか？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8322132755511645987?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8322132755511645987/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8322132755511645987' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8322132755511645987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8322132755511645987'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/06/85.html' title='やった～、85点'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-7551117266032444704</id><published>2009-06-27T16:44:00.006+09:00</published><updated>2009-06-30T15:05:06.199+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>CF-Y2のHDD換装作業＠Simple.Index</title><content type='html'>Simple.Indexには2度目になります。
&lt;a href="http://wsjp.blogspot.com/2009/05/simpleindex.html"&gt;前回参加したときは途中でノートブック（レッツノートCF-Y2)が故障&lt;/a&gt;。
即座に原因を特定してもらったものの、修理は延び延びになってしまっていた。

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_vyklshRxsKY/SkmqNtoEEGI/AAAAAAAAA0o/NrwPTcC2wfg/s1600-h/DSC00289.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 245px;" src="http://2.bp.blogspot.com/_vyklshRxsKY/SkmqNtoEEGI/AAAAAAAAA0o/NrwPTcC2wfg/s400/DSC00289.jpg" alt="" id="BLOGGER_PHOTO_ID_5352996784669200482" border="0" /&gt;&lt;/a&gt;
そこで、今回は壊れたHDDの換装作業。
Simple.IndexにCF-Y2と新HDDを持ち込んで作業開始。
HDDは日立HGST製のHTS541680J9AT00の80GB。

分解の参考にしたのは↓のページ。
&lt;a href="http://homepage2.nifty.com/o-nikko/Hard/cf-y2_hdt.htm"&gt;http://homepage2.nifty.com/o-nikko/Hard/cf-y2_hdt.htm&lt;/a&gt;

HDDは↓のページに載っていたのを確認してから購入。
&lt;a href="http://dank.cocolog-nifty.com/blog/2008/03/cfyhdd_6c1c.html"&gt;http://dank.cocolog-nifty.com/blog/2008/03/cfyhdd_6c1c.html&lt;/a&gt;

&lt;span style="font-weight: bold;"&gt;分解中のねじはガムテープに貼り付けながら作業すると楽&lt;/span&gt;、
というのをどこかで読んだので、早速使わせてもらった。
少なくともねじが余る、ということはなかった。

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_vyklshRxsKY/SkmqViexmAI/AAAAAAAAA0w/xoSD49bINEk/s1600-h/DSC00288.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 269px;" src="http://3.bp.blogspot.com/_vyklshRxsKY/SkmqViexmAI/AAAAAAAAA0w/xoSD49bINEk/s400/DSC00288.jpg" alt="" id="BLOGGER_PHOTO_ID_5352996919116404738" border="0" /&gt;&lt;/a&gt;
最後の裏蓋がとれずに苦労したが、ねじ一個はずし忘れたのとビデオ端子横のねじ二個を取るのに気がつくと簡単に取れた。

HDD２つを上下に並べて、折る端子を確認。
ぐりぐりと４回ほど折り曲げると、ポロっと取れた。

後は同じ手順を逆にしたら元に戻った。

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_vyklshRxsKY/Skmq0-iQnwI/AAAAAAAAA04/FZ0iYOQLI-4/s1600-h/DSC00287.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_vyklshRxsKY/Skmq0-iQnwI/AAAAAAAAA04/FZ0iYOQLI-4/s320/DSC00287.jpg" alt="" id="BLOGGER_PHOTO_ID_5352997459223158530" border="0" /&gt;&lt;/a&gt;リカバリーDVDで再起動→Cドライブ20GBを切ってOSからインストール→動いた。

ただし、名誉の負傷が2点。
どこから出てきたんだろう？
まぁ無くても動いているからいいか。
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_vyklshRxsKY/SkmqDplU8_I/AAAAAAAAA0g/rTXHI4nBxK8/s1600-h/DSC00286.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer; width: 150px; height: 200px;" src="http://2.bp.blogspot.com/_vyklshRxsKY/SkmqDplU8_I/AAAAAAAAA0g/rTXHI4nBxK8/s200/DSC00286.jpg" alt="" id="BLOGGER_PHOTO_ID_5352996611785290738" border="0" /&gt;&lt;/a&gt;

OSセットアップ→FireFoxインストール→Avastインストール、
と作業したところで、このブログをアップしました。

ということで、本日の予定は終了。
ありがとうございました→Simpleの皆様。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-7551117266032444704?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/7551117266032444704/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=7551117266032444704' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7551117266032444704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/7551117266032444704'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/06/cf-y2hddsimpleindex20090627.html' title='CF-Y2のHDD換装作業＠Simple.Index'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vyklshRxsKY/SkmqNtoEEGI/AAAAAAAAA0o/NrwPTcC2wfg/s72-c/DSC00289.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-344983736587269180</id><published>2009-06-08T10:55:00.012+09:00</published><updated>2011-12-26T15:24:37.348+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>jQuery::Up/Downキーでフォームを移動、パート5：完成コードとデモ</title><content type='html'>&amp;nbsp;&lt;span style="font-weight: bold;"&gt;(1)動作デモ&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;ブログ上で動かなかったので、ここで&lt;a href="http://www.workspot.jp/tech/formUpDown/"&gt;フォームのUp/Downデモ版&lt;/a&gt;を公開してます。

IE6、IE7、Chromeで動いてます。
FireFoxは基本的には動いてますが、とセレクトで挙動がおかしいです。&lt;br /&gt;
&lt;br /&gt;
【追記2009/06/11：Safariでも動きました。ちなみにWindows Vistaです】&lt;br /&gt;
【追記2011/12/26：&lt;a href="https://github.com/asaokamei/formUpDown"&gt;githubでソースコード公開&lt;/a&gt;してます。&lt;br /&gt;　コードはかなり変わっていますので、githubのほうを参照してください。】&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;

&lt;span style="font-weight: bold;"&gt;(2)全部入りソースコード&lt;/span&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;&amp;lt;script language=&lt;span style="color: #009900;"&gt;"javascript"&lt;/span&gt; type=&lt;span style="color: #009900;"&gt;"text/javascript"&lt;/span&gt; src=&lt;span style="color: #009900;"&gt;"./jquery-1.3.2.min.js"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script language=&lt;span style="color: #009900;"&gt;"javascript"&lt;/span&gt; type=&lt;span style="color: #009900;"&gt;"text/javascript"&lt;/span&gt; src=&lt;span style="color: #009900;"&gt;"./jquery.hotkeys-0.7.8.js"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;SCRIPT LANGUAGE=&lt;span style="color: #009900;"&gt;"JavaScript"&lt;/span&gt;&amp;gt;
&amp;lt;!--
&lt;span style="color: #000099;"&gt;var&lt;/span&gt; focusElem;  &lt;span style="color: #990000;"&gt;// フォーカスされたオブジェクトそのもの&lt;/span&gt;
&lt;span style="color: #000099;"&gt;var&lt;/span&gt; jFormElem;  &lt;span style="color: #990000;"&gt;// フォーム内のエレメント一覧（jQueryオブジェクト）&lt;/span&gt;
&lt;span style="color: #000099;"&gt;var&lt;/span&gt; jFormLeng;  &lt;span style="color: #990000;"&gt;// エレメントの数&lt;/span&gt;

$(document).ready( &lt;span style="color: #000099;"&gt;function&lt;/span&gt;()
{
&lt;span style="color: #990000;"&gt;// フォーム要素の配列を生成。&lt;/span&gt;
jFormElem =
   $( &lt;span style="color: #009900;"&gt;'form'&lt;/span&gt; ).map( &lt;span style="color: #000099;"&gt;function&lt;/span&gt;() {
       &lt;span style="color: #000099;"&gt;var&lt;/span&gt; ele = $.makeArray( &lt;span style="color: #000099;"&gt;this&lt;/span&gt;.elements );
       &lt;span style="color: #000099;"&gt;return&lt;/span&gt; ele;
   }).filter( &lt;span style="color: #000099;"&gt;function&lt;/span&gt;() {
       &lt;span style="color: #000099;"&gt;if&lt;/span&gt;( &lt;span style="color: #000099;"&gt;this&lt;/span&gt;.type == &lt;span style="color: #009900;"&gt;'hidden'&lt;/span&gt; ) {
           &lt;span style="color: #000099;"&gt;return&lt;/span&gt; &lt;span style="color: #000099;"&gt;false&lt;/span&gt;;
       }
       &lt;span style="color: #000099;"&gt;return&lt;/span&gt; &lt;span style="color: #000099;"&gt;true&lt;/span&gt;;
   }).&lt;span style="color: #000099;"&gt;each&lt;/span&gt;( &lt;span style="color: #000099;"&gt;function&lt;/span&gt;(i) {
       $(&lt;span style="color: #000099;"&gt;this&lt;/span&gt;).attr( &lt;span style="color: #009900;"&gt;'focusIndex'&lt;/span&gt;, i );
   });
jFormLeng = jFormElem.length;

&lt;span style="color: #990000;"&gt;// フォームエレメントがフォーカスされたら記録。&lt;/span&gt;
$(jFormElem).focus( &lt;span style="color: #000099;"&gt;function&lt;/span&gt;() {
   focusElem = jQuery( &lt;span style="color: #000099;"&gt;this&lt;/span&gt; );
});
&lt;span style="color: #990000;"&gt;// 要素#0にフォーカスを当てる。&lt;/span&gt;
jFormElem.&lt;span style="color: #000099;"&gt;get&lt;/span&gt;(&lt;span style="color: #009900;"&gt;0&lt;/span&gt;).focus();

&lt;span style="color: #990000;"&gt;// DOWNキーが押された場合の処理。&lt;/span&gt;
$(jFormElem).bind( &lt;span style="color: #009900;"&gt;'keydown'&lt;/span&gt;, &lt;span style="color: #009900;"&gt;'down'&lt;/span&gt;, &lt;span style="color: #000099;"&gt;function&lt;/span&gt;( event )
{
   &lt;span style="color: #000099;"&gt;var&lt;/span&gt; keyPropagate = &lt;span style="color: #000099;"&gt;true&lt;/span&gt;;
   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;( !focusElem ) &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;
   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;( !$(focusElem).attr( &lt;span style="color: #009900;"&gt;'focusIndex'&lt;/span&gt; ) ) &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;
   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;(  $(focusElem).attr( &lt;span style="color: #009900;"&gt;'type'&lt;/span&gt; ) == &lt;span style="color: #009900;"&gt;'textarea'&lt;/span&gt; ) &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;

   &lt;span style="color: #000099;"&gt;var&lt;/span&gt; fIndex = parseInt( $(focusElem).attr( &lt;span style="color: #009900;"&gt;'focusIndex'&lt;/span&gt; ) );

   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;( fIndex == jFormLeng-&lt;span style="color: #009900;"&gt;1&lt;/span&gt; ) {
       $(jFormElem).&lt;span style="color: #000099;"&gt;get&lt;/span&gt;(&lt;span style="color: #009900;"&gt;0&lt;/span&gt;).focus();
   }
   &lt;span style="color: #000099;"&gt;else&lt;/span&gt; {
       $(jFormElem).&lt;span style="color: #000099;"&gt;get&lt;/span&gt;( fIndex+&lt;span style="color: #009900;"&gt;1&lt;/span&gt; ).focus();
   }
   keyPropagate = &lt;span style="color: #000099;"&gt;false&lt;/span&gt;;
   &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;
});
&lt;span style="color: #990000;"&gt;// UPキーが押された場合の処理。&lt;/span&gt;
$(jFormElem).bind( &lt;span style="color: #009900;"&gt;'keydown'&lt;/span&gt;, &lt;span style="color: #009900;"&gt;'up'&lt;/span&gt;, &lt;span style="color: #000099;"&gt;function&lt;/span&gt;( event )
{
   &lt;span style="color: #000099;"&gt;var&lt;/span&gt; keyPropagate = &lt;span style="color: #000099;"&gt;true&lt;/span&gt;;
   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;( !focusElem ) &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;
   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;( !$(focusElem).attr( &lt;span style="color: #009900;"&gt;'focusIndex'&lt;/span&gt; ) ) &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;
   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;(  $(focusElem).attr( &lt;span style="color: #009900;"&gt;'type'&lt;/span&gt; ) == &lt;span style="color: #009900;"&gt;'textarea'&lt;/span&gt; ) &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;

   &lt;span style="color: #000099;"&gt;var&lt;/span&gt; fIndex = parseInt( $(focusElem).attr( &lt;span style="color: #009900;"&gt;'focusIndex'&lt;/span&gt; ) );
   &lt;span style="color: #000099;"&gt;if&lt;/span&gt;( fIndex == &lt;span style="color: #009900;"&gt;0&lt;/span&gt; ) {
       $(jFormElem).&lt;span style="color: #000099;"&gt;get&lt;/span&gt;( jFormLeng-&lt;span style="color: #009900;"&gt;1&lt;/span&gt; ).focus();
   }
   &lt;span style="color: #000099;"&gt;else&lt;/span&gt; {
       $(jFormElem).&lt;span style="color: #000099;"&gt;get&lt;/span&gt;( fIndex-&lt;span style="color: #009900;"&gt;1&lt;/span&gt; ).focus();
   }
   keyPropagate = &lt;span style="color: #000099;"&gt;false&lt;/span&gt;;
   &lt;span style="color: #000099;"&gt;return&lt;/span&gt; keyPropagate;
});
});
--&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-344983736587269180?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/344983736587269180/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=344983736587269180' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/344983736587269180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/344983736587269180'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/06/jqueryupdown5.html' title='jQuery::Up/Downキーでフォームを移動、パート5：完成コードとデモ'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-5091299987231966956</id><published>2009-06-05T09:56:00.007+09:00</published><updated>2009-06-05T14:54:53.764+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>jQuery::Up/Downキーでフォームを移動、パート4：Up/Downキーイベントを作成</title><content type='html'>いよいよメインです。
上（Up）あるいは下（Down）キーが押されたときの処理です。

（１）最初に書いたとおり、&lt;span style="font-weight: bold;"&gt;hotKeyプラグインを使うとキーのイベントを簡単に書く&lt;/span&gt;ことが出来ます。
&lt;pre class="code"&gt;    $(jFormElem).bind( &lt;span style="color: rgb(0, 153, 0);"&gt;'keydown'&lt;/span&gt;, &lt;span style="color: rgb(0, 153, 0);"&gt;'down'&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;( event )
{
 &lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; keyPropagate = &lt;span style="color: rgb(0, 0, 153);"&gt;true&lt;/span&gt;;
 &lt;span style="color: rgb(153, 0, 0);"&gt;// ・・・イベント処理･･･&lt;/span&gt;
 &lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; keyPropagate;
});&lt;/pre&gt;見たまんまです。最初に作成していたフォーム内の要素についてキーのイベント処理を書いています。おそらく、こう書くことでフォームの要素のフォーカスがあたっているときだけ、イベント処理が行われるはずです。

なお、イベント処理が実行された場合、キーのデフォルトの挙動を阻止しないといけません。そこでキーの処理が行われた場合、「keyPropagate」変数にfalseを設定します。

（２）やっとですが、&lt;span style="font-weight: bold;"&gt;Upキーが押された場合の処理&lt;/span&gt;です。

&lt;pre class="code"&gt;    &lt;span style="color: rgb(153, 0, 0);"&gt;// UPキーが押された場合の処理。&lt;/span&gt;
 $(jFormElem).bind( &lt;span style="color: rgb(0, 153, 0);"&gt;'keydown'&lt;/span&gt;, &lt;span style="color: rgb(0, 153, 0);"&gt;'up'&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;( event )
 {
     &lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; keyPropagate = &lt;span style="color: rgb(0, 0, 153);"&gt;true&lt;/span&gt;;
     &lt;span style="color: rgb(0, 0, 153);"&gt;if&lt;/span&gt;( !focusElem ) &lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; keyPropagate;
     &lt;span style="color: rgb(0, 0, 153);"&gt;if&lt;/span&gt;( !$(focusElem).attr( &lt;span style="color: rgb(0, 153, 0);"&gt;'focusIndex'&lt;/span&gt; ) ) &lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; keyPropagate;
     &lt;span style="color: rgb(0, 0, 153);"&gt;if&lt;/span&gt;(  $(focusElem).attr( &lt;span style="color: rgb(0, 153, 0);"&gt;'type'&lt;/span&gt; ) == &lt;span style="color: rgb(0, 153, 0);"&gt;'textarea'&lt;/span&gt; ) &lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; keyPropagate;
  
     &lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; fIndex = parseInt( $(focusElem).attr( &lt;span style="color: rgb(0, 153, 0);"&gt;'focusIndex'&lt;/span&gt; ) );
     &lt;span style="color: rgb(0, 0, 153);"&gt;if&lt;/span&gt;( fIndex == &lt;span style="color: rgb(0, 153, 0);"&gt;0&lt;/span&gt; ) {
         $(jFormElem).&lt;span style="color: rgb(0, 0, 153);"&gt;get&lt;/span&gt;( jFormLeng-&lt;span style="color: rgb(0, 153, 0);"&gt;1&lt;/span&gt; ).focus();
     }
     &lt;span style="color: rgb(0, 0, 153);"&gt;else&lt;/span&gt; {
         $(jFormElem).&lt;span style="color: rgb(0, 0, 153);"&gt;get&lt;/span&gt;( fIndex-&lt;span style="color: rgb(0, 153, 0);"&gt;1&lt;/span&gt; ).focus();
     }
     keyPropagate = &lt;span style="color: rgb(0, 0, 153);"&gt;false&lt;/span&gt;;
     &lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; keyPropagate;
 });&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;if(  $(focusElem).attr( 'type' ) == 'textarea' ) return keyPropagate;
テキストエリアの場合は、キーの処理を行いません。&lt;/li&gt;&lt;li&gt;var fIndex = parseInt( $(focusElem).attr( 'focusIndex' ) );
プロパティ：focusIndexの値にはストリングで設定されるようです。
このままだと次の配列のインデックスとして使えないのでintに変換します。&lt;/li&gt;&lt;li&gt;if( fIndex == 0 ) {
要素の先頭にフォーカスがあっている場合の処理です。
&lt;/li&gt;&lt;/ul&gt;とまぁ、こんな感じで動きました。
Downキーの場合も似たような処理になります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-5091299987231966956?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/5091299987231966956/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=5091299987231966956' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5091299987231966956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/5091299987231966956'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/06/jqueryupdown4updown.html' title='jQuery::Up/Downキーでフォームを移動、パート4：Up/Downキーイベントを作成'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8441235925824295314</id><published>2009-06-04T09:38:00.007+09:00</published><updated>2009-06-05T14:54:08.345+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>jQuery::Up/Downキーでフォームを移動、パート3：フォーカスされた要素を見つける</title><content type='html'>次はフォーカスされているフォームの要素を見つける方法について。

最初は「this.focused();」なんて関数があるとばかり思っていた。
ところがフォーカスされた要素を返す関数が無いどころか、要素のプロパティにも現在フォーカスがあたっているかどうか判別できるものが無い！

仕方が無い、作るか･･･
簡単な動作は以下の通り。
&lt;ol&gt;&lt;li&gt;フォーカスを調べたい要素の一覧を作成。&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;フォーカスがあたった時点で、どこかの変数に要素の情報を記録。&lt;/span&gt;
&lt;/li&gt;&lt;/ol&gt;すでに1については作成済み。ちなみに変数名が「jFormElem」。
そして2についてもjQueryを使うと非常に簡単に出来た。
&lt;pre class="code"&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;// フォームエレメントがフォーカスされたら記録。&lt;/span&gt;
$(jFormElem).focus( &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;() {
focusElem = jQuery( &lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt; );
});&lt;/pre&gt;簡単に説明すると、
&lt;ul&gt;&lt;li&gt;$( jFormElem )
前もって作成していた要素の配列のそれぞれについて、&lt;/li&gt;&lt;li&gt;.focus( function() {
フォーカスがあたったらfunction()で設定されている処理を&lt;/li&gt;&lt;li&gt;focus Elem = jQuery( this )
「focusElem」という変数に自分自身を保存。
jQuery（）で囲ってあげることで、普通のDOMオブジェクトの「this」をjQueryオブジェクトに変換しています。
&lt;/li&gt;&lt;/ul&gt;という処理になっているはずです。

ところがっ！
保存したのはいいけれど、&lt;span style="font-weight: bold;"&gt;結局どの要素だか分からない、という事態&lt;/span&gt;になりました。

なんと説明していいのやら、保存したオブジェクトのプロパティを見たのですが、要素を特定する方法が無いみたいなのです。「name」とかが近いのですが、ラジオボタンだと同じ名前になってしまいます。

そこで、先に作成していた要素の一覧にプロパティを追加することにしました。
&lt;pre class="code"&gt;    &lt;span style="color: rgb(153, 0, 0);"&gt;// フォーム要素の配列を生成。&lt;/span&gt;
jFormElem =
  $( &lt;span style="color: rgb(0, 153, 0);"&gt;'form'&lt;/span&gt; ).map( &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;() {
      &lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; ele = $.makeArray( &lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;.elements );
      &lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; ele;
  }).&lt;span style="color: rgb(0, 0, 153);"&gt;each&lt;/span&gt;( &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;(i) {
      $(&lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;).attr( &lt;span style="color: rgb(0, 153, 0);"&gt;'focusIndex'&lt;/span&gt;, i );
  });&lt;/pre&gt;
とこうすることで、focusIndexというプロパティが要素の一覧に追加されます。後は番号を比べれば、どの要素なのかがすぐに分かるという算段です。
&lt;div style="text-align: right;"&gt;&lt;a href="http://wsjp.blogspot.com/2009/06/jqueryupdown4updown.html"&gt;「パート4：Up/Downキーイベントを作成」へ続く&lt;/a&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8441235925824295314?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8441235925824295314/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8441235925824295314' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8441235925824295314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8441235925824295314'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/06/jqueryupdown3.html' title='jQuery::Up/Downキーでフォームを移動、パート3：フォーカスされた要素を見つける'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-8441229917325579039</id><published>2009-06-02T14:29:00.020+09:00</published><updated>2009-06-04T09:57:05.271+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>jQuery::Up/Downキーでフォームを移動、パート2：フォーム要素一覧</title><content type='html'>では、jQueryのインストールから。手順は省略。

&lt;span style="font-weight: bold;"&gt;（１）キー入力イベント&lt;/span&gt;

調べると、キー入力イベントを簡単に扱える&lt;a href="http://code.google.com/p/js-hotkeys/"&gt;jQueryプラグイン：hotkeys&lt;/a&gt;を発見。
簡単にUp/Downキーが押された場合の処理が書ける。

&lt;span style="font-weight: bold;"&gt;（２）HTMLが読み込まれたときにJavaScriptを走らせる。&lt;/span&gt;
&lt;pre class="code"&gt;$(document).ready( &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;() {}&lt;/pre&gt;これでHTMLが読み込まれたときにJavaScriptを走らせられる。
&amp;lt;body onload="javascript:..."&amp;gt;と書く方法は知っていたが、色々と面倒だった。これなら、どこにでも、そしていくつでも書けるので便利。また変数のスコープが関数内に限られるため、さらに便利らしい。他にも書き方があるらしい。

&lt;span style="font-weight: bold;"&gt;（３）フォーム内の要素を一覧にする。&lt;/span&gt;
&lt;pre class="code"&gt;$( &lt;span style="color: rgb(0, 153, 0);"&gt;'form'&lt;/span&gt; ).map( &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;() {
&lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; ele = $.makeArray( &lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;.elements );
&lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; ele;
});&lt;/pre&gt;&lt;a href="http://groups.google.com/group/jquery-en/browse_thread/thread/d66cdce9742c6658/2d0055377dd5efd7?pli=1"&gt;このページで見つけた&lt;/a&gt;コード。
自分なりに読み解いてみました。
&lt;ol&gt;&lt;li&gt;this.elements
最初はjQueryかと思いましたが、どうやらJavaScript標準の動きでした。フォーム内の要素を一覧で返します。ここの「this」はフォームを指定しています。&lt;/li&gt;&lt;li&gt;$.makeArray
要素の一覧を配列に変換しています。また、「ele」はjQueryオブジェクトの配列として保存されます。&lt;/li&gt;&lt;li&gt;$( "form" ).map
フォームが複数存在する場合に対応するため、map関数で配列を集約している（？）みたい。
&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;（４）以上をくっつけると、&lt;/span&gt;
&lt;pre class="code"&gt;&amp;lt;script language=&lt;span style="color: rgb(0, 153, 0);"&gt;"javascript"&lt;/span&gt; type=&lt;span style="color: rgb(0, 153, 0);"&gt;"text/javascript"&lt;/span&gt; src=&lt;span style="color: rgb(0, 153, 0);"&gt;"../scripts/jquery-1.3.2.js"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script language=&lt;span style="color: rgb(0, 153, 0);"&gt;"javascript"&lt;/span&gt; type=&lt;span style="color: rgb(0, 153, 0);"&gt;"text/javascript"&lt;/span&gt; src=&lt;span style="color: rgb(0, 153, 0);"&gt;"../scripts/jquery.hotkeys-0.7.8.js"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;SCRIPT LANGUAGE=&lt;span style="color: rgb(0, 153, 0);"&gt;"JavaScript"&lt;/span&gt;&amp;gt;
&amp;lt;!--
&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; jFormElem;  &lt;span style="color: rgb(153, 0, 0);"&gt;// フォーム内のエレメント一覧（jQueryオブジェクト）&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; jFormLeng;  &lt;span style="color: rgb(153, 0, 0);"&gt;// エレメントの数&lt;/span&gt;

$(document).ready( &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;()
{
&lt;span style="color: rgb(153, 0, 0);"&gt;// フォーム要素の配列を生成。&lt;/span&gt;
jFormElem =
$( &lt;span style="color: rgb(0, 153, 0);"&gt;'form'&lt;/span&gt; ).map( &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;() {
&lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; ele = $.makeArray( &lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;.elements );
&lt;span style="color: rgb(0, 0, 153);"&gt;return&lt;/span&gt; ele;
});
jFormLeng = jFormElem.length;
}&lt;/pre&gt;ふぅ～。
まだ続きます。
&lt;div style="text-align: right;"&gt;&lt;a href="http://wsjp.blogspot.com/2009/06/jqueryupdown3.html"&gt;「パート3：フォーカスされた要素を見つける」へ続く&lt;/a&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-8441229917325579039?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/8441229917325579039/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=8441229917325579039' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8441229917325579039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/8441229917325579039'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/06/jqueryupdown2.html' title='jQuery::Up/Downキーでフォームを移動、パート2：フォーム要素一覧'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4591185038089653505</id><published>2009-06-02T12:19:00.009+09:00</published><updated>2009-06-05T14:57:48.440+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>jQuery::Up/Downキーでフォームを移動</title><content type='html'>お客さんからUp/Downキーを使って、HTMLのフォームを移動したいという要望が出てきた。多いと100件近くの入力を行う日があるらしく、少しでも楽に入力したいらしい。

ということでウェブを調べたが、大体こんな感じ･･･
&lt;ol&gt;&lt;li&gt;キー入力をイベントでキャッチ。&lt;/li&gt;&lt;li&gt;Downキーなら、代わりにTABをイベントとして発行。&lt;/li&gt;&lt;li&gt;Upキーなら、代わりにShift+TABをイベントして発行。
&lt;/li&gt;&lt;li&gt;が、しかしながら！
&lt;span style="font-weight: bold;"&gt;現状では「Shift」をイベントとして発行できない。&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;というところで終わっていた。

ということで自作してみることにした。

基本的な方向性としては、以下の手順でフォームの移動を行う。
&lt;ol style="font-weight: bold;"&gt;&lt;li&gt;フォーム内の要素の一覧を作成。&lt;/li&gt;&lt;li&gt;現在、フォーカスされている要素を保持。&lt;/li&gt;&lt;li&gt;Downキーが押されたら、現在フォーカスされてる要素の次の要素にフォーカスを当てる。&lt;/li&gt;&lt;li&gt;Upキーが押されたら、･･･以下略。&lt;/li&gt;&lt;/ol&gt;こういうことを実行するにはjQueryが最適だろうということで、jQueryを使って開発することにした。実際に作ってみて、やっぱり「&lt;span style="font-weight: bold;"&gt;jQueryはすごい&lt;/span&gt;」ということがよく分かった。

ということで、次は実際のコードと簡単なコードの説明をしてみます。
正直、JavaScriptもjQueryも初心者のようなものなので、間違い・訂正･改善方法などご指摘いただけると助かります。

&lt;div style="text-align: right;"&gt;&lt;a href="http://wsjp.blogspot.com/2009/06/jqueryupdown2.html"&gt;「パート2：フォーム要素一覧」へ続く&lt;/a&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4591185038089653505?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4591185038089653505/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4591185038089653505' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4591185038089653505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4591185038089653505'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/06/jqueryupdown.html' title='jQuery::Up/Downキーでフォームを移動'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-3978996356281651311</id><published>2009-05-31T23:53:00.006+09:00</published><updated>2009-06-05T14:59:00.230+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Simple.Indexに参加</title><content type='html'>この土曜日、&lt;a href="http://s-me.co.jp/"&gt;セサミさん&lt;/a&gt;のところで開催されている&lt;a href="http://groups.google.co.jp/group/simple_index/web/simple-index-2"&gt;Simple.Index&lt;/a&gt;に参加してきました。
参加というか、気になっている仕事以外の作業を行って、お互いに発表、というのが趣旨。

自分はjQueryのコーディングをしようと、ラップトップ持っていった。
TABを使ってHTMLフォームを移動するのように、矢印キーの上と下を使いたい。
というのが内容。
【追記：&lt;a href="http://wsjp.blogspot.com/2009/06/jqueryupdown.html"&gt;ブログで書きました&lt;/a&gt;（2009/06/05）】

しばらく作業しているうちに、ラップトップがブルースクリーン連発。
あれ？動かなくなったとおもうとブルースクリーン。

「ブルースクリーンなんて、最近見ないなぁ」
「多分ハードの問題でしょうね」
「HDDが原因じゃないですかね？」
「メモリなら一発で飛びますものね」
「多分HDDドライバーが飛んだんでしょう」
「そうみたいですね～」
とほとんど状況を説明することなしに、（僕の反応だけで）原因を解析してゆく他の参加者たち･･･

「あぁ、&lt;a href="http://homepage2.nifty.com/o-nikko/Hard/cf-y2_hdt.htm"&gt;このサイトでHDD換装してます&lt;/a&gt;よ」
と次々と情報も入ってくる。

いや～、故障するにはいい場所だったかも。

でも、タイミングがまずい。
来月はお客さんのサポートが入るかもしれない月。
ラップトップが無いと困る。

ま、飲んでいるうちに、いいアイディアでも浮かぶでしょう。
そんなこんなで楽しい土曜日を過ごせました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-3978996356281651311?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/3978996356281651311/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=3978996356281651311' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3978996356281651311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/3978996356281651311'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/05/simpleindex.html' title='Simple.Indexに参加'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-120781137386544564</id><published>2009-05-28T15:23:00.002+09:00</published><updated>2009-05-28T20:05:37.057+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>少しは勉強しないと･･･</title><content type='html'>仕事が順調に進んでいるとき、
次々といいペースで締め切りが続いているとき、
目の前の仕事を片付けることに集中してしまい、
勉強しなくなります。

頭のどこかで、勉強しないとまずいなぁと思ってますが、
根が面倒くさがりなので先延ばししてしまいます。

さて、金融危機。
やってきましたよ、小さなSOHOのところまで。

締め切りのある大きなプロジェクトがなくなりました。
次のプロジェクトは決まってませんが、いくつか見積もりは出しているので、どれかは通るでしょう。

おかげさまで最近は暇です。

まぁよい機会と考えて、勉強しようというわけですね。
この業界は進歩が早いので、気をつけないといけないですし。

でも、こんな話は妻には出来ないなぁ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-120781137386544564?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/120781137386544564/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=120781137386544564' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/120781137386544564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/120781137386544564'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2009/05/blog-post.html' title='少しは勉強しないと･･･'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4331026994872368640</id><published>2009-05-26T18:30:00.001+09:00</published><updated>2009-05-26T18:56:46.634+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>ブログについて</title><content type='html'>まともな仕事のブログを始めることにしました。

内容はウェブ開発（PHP、JavaScriptなど）、
仕事で思ったことなど。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4331026994872368640?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4331026994872368640/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4331026994872368640' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4331026994872368640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4331026994872368640'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2007/09/blog-post.html' title='ブログについて'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-4449511873958383136</id><published>2007-09-19T11:14:00.001+09:00</published><updated>2009-05-28T15:36:24.847+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='会社業務'/><title type='text'>実績･経験</title><content type='html'>&lt;p style="font-weight: bold;" class="main-header"&gt;ウェブサイト構築&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;日本公認会計士協会　CPEグループ&lt;/span&gt;

&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jsrae.or.jp/" target="_blank"&gt;&lt;b&gt;日本冷凍空調学会&lt;/b&gt;&lt;/a&gt;
会員専用ページ、メールマガジンを開発。メールやフォームに関連した運用のお手伝いを行っています。

&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;今半ギフトショップ、三徳ネットショップ、住宅新報など&lt;/span&gt;
各社の業務や要望にあわせてショッピングカートを構築。

&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;日本会計士協会、財務会計標準機構&lt;/span&gt;
主催するセミナーへの登録・キャンセル作業をウェブ上で行実現しました。また財団法人の会員管理やセミナー講習の受付をオンライン化するのに伴い、会員データベースシステムの構築を行いました。&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;プロジェクトマネージメント、情報技術コンサルタント&lt;/span&gt;
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;KLASI2008&lt;/span&gt;
慶応大学が提唱するKLASI2008プロジェクトに参加。大学キャンパスの熱需要モデルを元に、需要予測アプリケーション開発を担当しました。

&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;日本冷凍空調学会の広報委員、状態式作成WG&lt;/span&gt;
学会の広報活動はホームページやインターネットを活用することが多くなってきました。技術の面から広報活動を支援しています。また冷媒の熱状態式を作成するわー君グループにも参加しています。

&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;北米テレアトラス&lt;/span&gt;
ベルギーに本社のある地図会社で、主としてカーナビに用いられています。日本のカーナビ開発エンジニアとの技術支援を行いました。
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-4449511873958383136?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/4449511873958383136/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=4449511873958383136' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4449511873958383136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/4449511873958383136'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2007/09/blog-post_6123.html' title='実績･経験'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957690751924967735.post-6279131809833911458</id><published>2007-09-19T10:57:00.000+09:00</published><updated>2007-09-19T13:11:42.208+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='会社業務'/><title type='text'>業務内容</title><content type='html'>&lt;b&gt;ウェブサイト構築&lt;/b&gt;
主なウェブサイトの構築はショッピングカートと会員サイトを行ってます。もちろん、それ以外の機能についても対応いたします。
&lt;ul&gt;&lt;li&gt;&lt;b&gt;ショッピングカート&lt;/b&gt;
ウェブサイトの定番、ショッピングカートを構築。データベースと連動して在庫を管理することから、出荷指示、倉庫管理などの業務に対応します。&lt;/li&gt;&lt;li&gt;&lt;b&gt;会員サイト&lt;/b&gt;
PDFやGIFファイルもプロテクトできる会員だけが見れるホームページの作成や、会員の入会・退会・情報更新などの管理を行います。
&lt;/li&gt;&lt;/ul&gt;
&lt;b&gt;情報技術コンサルタント、プロジェクトマネージメント&lt;/b&gt;
不思議なもので優秀な技術者がそろっていても、プロジェクトがうまく進まないときもあります。特に複数の会社や、海外の企業との共同開発を行っている場合、問題原因の追究が難しくなることが多いようです。こんなとき、プロジェクトマネージャーがうまく調整を行うと、(不思議なことに）開発がスムーズに行えるようになります。
&lt;ul&gt;&lt;li&gt;&lt;b&gt;情報技術コンサルタント
&lt;/b&gt;カーナビゲーション設計やワイアレスパームの開発と経験を生かし、情報技術全般にかかわるコンサルティングサービスを提供しています
&lt;/li&gt;&lt;li&gt;&lt;b&gt;日米の橋渡し
&lt;/b&gt;コミュニケーション不足、文化の差による考え違いなど、国境を越えた開発にはさまざまな困難が存在します。技術のみならず文化的な理解度もプロジェクト成功の重要な要因です。
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957690751924967735-6279131809833911458?l=wsjp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wsjp.blogspot.com/feeds/6279131809833911458/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957690751924967735&amp;postID=6279131809833911458' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6279131809833911458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957690751924967735/posts/default/6279131809833911458'/><link rel='alternate' type='text/html' href='http://wsjp.blogspot.com/2007/09/blog-post_19.html' title='業務内容'/><author><name>Asao Kamei</name><uri>https://profiles.google.com/103151641931704052253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-UG6ipSGuM1Y/AAAAAAAAAAI/AAAAAAAABLM/tFYFdSTdwpk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
