<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>えびログ</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/" />
<modified>2008-06-11T09:15:50Z</modified>
<tagline>イーコマース関連、UNIX/LINUX、Perl/PHP、その他雑記など。</tagline>
<id>tag:blog.tanaka-cs.com,2008://1</id>
<generator url="http://www.movabletype.org/" version="3.35">Movable Type</generator>
<copyright>Copyright (c) 2008, 田中＠グリニッジ</copyright>
<entry>
<title>Zend FrameworkでDocTest</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2008/06/zend_frameworkd.html" />
<modified>2008-06-11T09:15:50Z</modified>
<issued>2008-06-11T08:50:10Z</issued>
<id>tag:blog.tanaka-cs.com,2008://1.148</id>
<created>2008-06-11T08:50:10Z</created>
<summary type="text/plain">Zend Frameworkをベースに開発している新しいカートのユニットテストを...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>Zend Framework</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>Zend Frameworkをベースに開発している新しいカートのユニットテストを効率的に行おうと色々考えていて、前から気になっていたDocTestを試してみることにしました。</p>

<p>ということで、<a href="http://d.hatena.ne.jp/kunit/20080205#1202142580">Mapleのkunitさん作のDocTest</a>をZend Frameworkのプロジェクトで使うための覚書。</p>

<p>といっても、割とすんなりいきました。</p>

<p>Zend Frameworkにて、MVCの形のプロジェクトを既に用意できている段階であれば、パスの通ったところに、DocTestのalpha2を解凍して、srcディレクトリの中のファイルをコピー。</p>

<p>TestControllerを作成して、その中で、DocTestを呼び出すようにする。</p>

<pre class=code>
&lt;?php
class TestController extends My_Controller_Action
{
    public function init()
    {
        parent::init();
    }
<br />
    public function preDispatch()
    {
        parent::preDispatch();
    }
<br />    
    public function indexAction()
    {
        $this->_helper->viewRenderer->setNoRender();
<br />
        $params = array('compileDir' => './var/tests_c');
        $testDir = './lib/My';
        $options = array('prefix' => 'My');
<br />
        echo '&lt;pre&gt;';
        Maple_DocTest::singleton($params)->run($testDir, $options);
        echo '&lt;/pre&gt;';
    }
}
</pre>

<p>こんな感じ。</p>

<p>テスト対象を指定するところで、当初ライブラリ関係を収めているディレクトリ（./lib）を指定していたため、Zend Framework自体や、Smartyなんかもテスト対象とされてしまって美しくなかったんですが、ソースを読んでprefixの指定でうまく解決できました。</p>

<p>あとは、テストから除外したいディレクトリを設定するために、DocTestにちょっと手を加えたのと、テストに関する情報を抜き出す正規表現をちょっと変更しました。</p>

<p>DocTest.phpのgetTestDataメソッドの853行目<br />
<pre class=code>-        if (preg_match_all('|(#test (.*?))?&lt;code&gt;(.*?)&lt;/code&gt;|s', $str, $matches, PREG_SET_ORDER)) {<br />
+        if (preg_match_all('|#test((.*?))&lt;code&gt;(.*?)&lt;/code&gt;|s', $str, $matches, PREG_SET_ORDER)) {</pre></p>

<p>どうも、元のままだと、#testから始まっていない（DocTest用ではない）Docコメントでも、&lt;code&gt;&lt;/code&gt;で囲まれた記述があると抜き出してしまう問題があるようでした。<br />
Zend Frameworkのコードの中にそのような箇所があって、当初エラーを吐いていたので修正。</p>

<p>ということで、いざ動いてくれるとすごく楽ちんです。感動ものです。</p>]]>

</content>
</entry>
<entry>
<title>本日生まれました。</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2008/06/post_54.html" />
<modified>2008-06-07T12:27:46Z</modified>
<issued>2008-06-07T12:25:34Z</issued>
<id>tag:blog.tanaka-cs.com,2008://1.147</id>
<created>2008-06-07T12:25:34Z</created>
<summary type="text/plain">私事ですが、本日、正午前に無事第２子が誕生いたしました。 女の子で3560g。元...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>ふむふむ雑記</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>私事ですが、本日、正午前に無事第２子が誕生いたしました。<br />
女の子で3560g。元気そうな赤ちゃんでした。</p>

<p>予定日が６月３日だったので、今か今かという感じだったのですが、ようやく生まれて、ほっとしました。</p>

<p>前駆陣痛が続いていたので、ここ２週間くらいで深夜に病院に５回くらいは駆けつけたと思いますが、今晩はぐっすり眠れそうです。<br />
</p>]]>

</content>
</entry>
<entry>
<title>フォーム二重送信防止の考察</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2008/02/post_53.html" />
<modified>2008-02-09T01:27:38Z</modified>
<issued>2008-02-06T14:40:21Z</issued>
<id>tag:blog.tanaka-cs.com,2008://1.146</id>
<created>2008-02-06T14:40:21Z</created>
<summary type="text/plain">Webアプリケーションなどにおいて、フォームの送信の際に、入力→確認→完了の手順...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>PHP</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>Webアプリケーションなどにおいて、フォームの送信の際に、入力→確認→完了の手順をとることが多い。CRUD(Create Read Update Delete)のように、Input Confirm Completeで、ICCなんて個人的には呼んでいる。</p>

<p>それはさておき、確認画面から送信ボタンを押して、データベースに登録するなり、メール送信するなりをした場合に、そこでブラウザをリロードしたり、ブラウザの戻るボタンを押して再送信したり、ボタンを２回クリックしたりすると、フォームが二重に送信されてしまう。</p>

<p>これらの対処としては、トランザクショントークンを用いた対策方法が主流である。<br />
確認フォームで、hiddenタグに乱数などで生成されたトークンを埋め込み、同時に同じキーをセッションに持つ。フォームが送信されたらトークンとセッションのキーが一致するか確認し、一致したら正常処理を行い、セッションのキーを破棄。一致しなかったら、エラーとみなし、処理を行わずにリダイレクトなど。</p>

<p>送信後にブラウザのバックなどで戻り、再送信した際には、セッションのキーは既に破棄されてしまっているので、一致することはなくエラーにしかならない。これで二重送信を防止。</p>

<p><br />
とまぁ、これで問題はなさそうなのではあるんですが。</p>

<p>PHPの場合、セッションをスタートすると、デフォルトでヘッダーにno-cacheをセットする。<br />
その状態で、ブラウザでバックし、確認画面などのhiddenタグを埋め込んでいるところに戻ると、no-cacheゆえにページが再読込されて、トークンキーの値が変わってしまい、セッションにもキーが再びセットされ、二重送信が行えるようになってしまう。</p>

<p>no-cacheにしない事がトランザクショントークンを使う場合の条件のようであるが、そのためには、セッションがスタートする前に、<br />
session_cache_limiter('private_no_expire'); <br />
なんて書いておけくと良い。これでブラウザでバックしても再読込されないので、二重送信もしっかりと防ぐことが出来るようになる。</p>

<p>一般的なユーザーは、入力内容に間違いがあったと気がつくと、直感的に戻るボタンを押すことが多いと思うので、ブラウザのバック自体は行えたほうが良いが、最終的なフォーム送信後に戻れてしまうと、たとえ二重送信防止となっていて、二回目の送信は実際の処理が行われないとしても、ユーザーは訂正を行ったうえで、再送信を行ったのだと思うかも知れず、そうなってしまうとユーザーの意図と、システムの振る舞いに差異が生じるので、一度送信完了したなら、そのフォームには戻れないようにしたい。</p>

<p><br />
ということで考えていること。</p>

<p>no-cacheが基本<br />
フォーム生成時に、乱数等にてformidを生成。同時にセッションにformidを格納<br />
formidパラメーターを付与したURLにリダイレクト。<br />
ブラウザでバックした場合は、formidに紐づくセッション内容を元にフォームを復元<br />
フォームの送信時にはformidに紐づくセッションを削除<br />
紐づくセッションがない場合は、どこかに遷移<br />
編集用のフォームは、初回の表示もセッションから呼び出し<br />
CSRF対策のトークンキーも盛り込む</p>

<p>みたいな感じ。<br />
こんな感じで、試しに実装してみようと思う。</p>

<p>最後の部分、何を書いているのか自分しか分からないかも。</p>]]>
<![CDATA[<p>2008-02-09追記<br />
amazonで本を注文したついでにブラウザで戻って再送信してみた。<br />
キャッシュが利くようになっていて、前に問題なく戻れるようになっている。<br />
で、2重送信してみたところ、以下のメッセージが表示された。</p>

<p>確定後の注文を、ブラウザの「戻る」ボタンで注文手続きページに戻って変更することはできません。 </p>

<p>ちゃんとメッセージを表示させれば、お客さんも混乱しないですね。</p>]]>
</content>
</entry>
<entry>
<title>Zend_Viewでescapeを勝手にやるための試行錯誤</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2008/01/zend_viewescape.html" />
<modified>2008-01-11T12:36:01Z</modified>
<issued>2008-01-11T12:08:28Z</issued>
<id>tag:blog.tanaka-cs.com,2008://1.144</id>
<created>2008-01-11T12:08:28Z</created>
<summary type="text/plain">Zend_View を使っていて、ビュースクリプトで都度都度 $this-&gt;es...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>Zend Framework</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>Zend_View を使っていて、ビュースクリプトで都度都度 $this->escape($this->hoge) みたいな事をやるのがいやなので、試行錯誤。Zend_View_Abstractを継承したMy_Viewを作ってみました。</p>

<pre class=code>
&lt;?php
<br />
class My_View extends Zend_View_Abstract
{
    public $autoEscape = true;
<br />
    protected function _run()
    {
        $varBackup = null;
        if($this-&gt;autoEscape)
        {
            $vars = $this-&gt;getVars();
            $varBackup = $vars;
<br />
            foreach($vars as $k =&gt; $v) {
                if (is_string($v)) {
                    $this-&gt;assign($k . '_raw', $v);
                    $this-&gt;$k = $this-&gt;escape($v);
                } elseif (is_array($v)) {
                    $this-&gt;$k = $this-&gt;_arrayEscape($v);
                    $this-&gt;{$k . '_raw'} = $v;
                }
            }
        }
<br />
        include func_get_arg(0);
<br />
        if($varBackup !== null) {
            $this-&gt;clearVars();
            $this-&gt;assign($varBackup);
        }
    }
<br />
    private function _arrayEscape($vs)
    {
        foreach($vs as $k =&gt; $v) {
            if (is_string($v)) {
                $vs[$k] = $this-&gt;escape($v);
            } elseif (is_array($v)) {
                $vs[$k] = $this-&gt;_arrayEscape($v);
            }
        }
        return $vs;
    }
}
</pre>

<p>こんな感じです。<br />
使い方は、</p>

<pre class=code>
// setup view
$view = new My_View();
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
</pre>

<p>みたいな感じで（ViewRendererは使わなくてもいいけど）、あとはアクションの中などで、</p>

<pre class=code>
// 変数
$this-&gt;view-&gt;hoge = 'ほげ&lt;br /&gt;ほげ';
// 配列
$tmp = array('aaa', 'bbb&lt;br /&gt;bbb');
$this-&gt;view-&gt;hoge_array = $tmp;
</pre>

<p>とセットする。<br />
ビュースクリプトの中では、エスケープ済みのものと、エスケープしないものがそれぞれ、</p>

<pre class=code>
&lt;!-- エスケープ済み変数 --&gt;
&lt;?php echo $this-&gt;hoge; ?&gt;
<br />
&lt;!-- エスケープなし変数 --&gt;
&lt;?php echo $this-&gt;hoge_raw; ?&gt;
<br />
&lt;!-- エスケープ済み配列 --&gt;
&lt;?php echo $this-&gt;hoge_array[0]; ?&gt;
&lt;?php echo $this-&gt;hoge_array[1]; ?&gt;
<br />
&lt;!-- エスケープなし配列 --&gt;
&lt;?php echo $this-&gt;hoge_array_raw[0]; ?&gt;
&lt;?php echo $this-&gt;hoge_array_raw[1]; ?&gt;
</pre>

<p>みたいな感じ。多重配列も同じような感じ。</p>

<p>単純な用途の場合はこれはこれでいいのだけれど、いろいろとZend Frameworkのソースやドキュメントを追っていくと、自動でエスケープすると、却ってフォーム関係のView_Helperが使いづらくなりそうだったり、毎回別名の変数や配列を生成したりして、どうなのと思うところもあり。何か良いアイデア合ったら教えてください。</p>

<p>ビュースクリプト側でエスケープを書きたくないというのは、もちろん、不注意からXSSを生み出してしまわないためなのですが、そのためにややこしくなるのもいやなので、Viewにセットする段階で、フィルターかましてエスケープしてあげるほうがいいのかなぁとも思っています。</p>

<p>なるべくZend Frameworkの素のままで使ってみようと思ってましたが、やはりSmartyと、Smartyのプラグインを使ってViewまわりを固めたほうが早いかなと思って、現在そっち方面で検討中。</p>

<p>ViewRendererとかは結構便利なので、Zend Frameworkの良い所を生かしつつ。<br />
ということで、Smartyを使ったViewの話は次回にします。</p>]]>

</content>
</entry>
<entry>
<title>PHPのソースコードを貼り付けるために</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2008/01/php_2.html" />
<modified>2008-01-11T12:28:48Z</modified>
<issued>2008-01-11T11:16:29Z</issued>
<id>tag:blog.tanaka-cs.com,2008://1.143</id>
<created>2008-01-11T11:16:29Z</created>
<summary type="text/plain">PHPのこのソースコードを貼り付けるために、よく他のブログとかでやっているような...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>その他TIPS</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>PHPのこのソースコードを貼り付けるために、よく他のブログとかでやっているような方法を行おうと調べてみて、ちょっと古いエントリだけれども、</p>

<p><a href="http://www.ideaxidea.com/archives/2006/09/post_128.html">ブログにコードを貼り付ける方法で悩むの巻</a></p>

<p>を参考にスタイルシートを変更してみた。</p>

<pre class="code">
pre.code{
	display:block;
	background : #EEE;
	color : #444;
	font-size : 1em;
	margin  : 1em;
	padding : 0.5em;
	border  : 1px solid #CCC;
	width   : 90%;
	overflow : scroll;
}
</pre>

<p>こんな感じ。</p>

<p>実態参照に変換するために<br />
<a href="http://labs.m-logic.jp/2006/12/movabletypeentityrefbutton_v00.html">MovableType用EntityRefButtonプラグイン v0.0.5</a><br />
も入れました。</p>

<p>エントリーを書くのがかったるくて、覚書みたいなものをあちらこちらに散乱させていたけれど、これでちゃんと書きたいものが書けるようになるかな。あとでソースコードに色も付けちゃおう。</p>]]>

</content>
</entry>
<entry>
<title>PerlでLWPでMultipleな送信</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/12/perllwpmultiple.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-12-26T12:34:43Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.141</id>
<created>2007-12-26T12:34:43Z</created>
<summary type="text/plain">なんか、毎回どうするんだっけと調べているような気がするので覚書。 HTTP::R...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>Perl</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>なんか、毎回どうするんだっけと調べているような気がするので覚書。</p>

<p>HTTP::Request::Commonの最近のやつには</p>

<p>Multivalued form fields can be specified by either repeating the field<br />
name or by passing the value as an array reference.</p>

<p>と書いてあるけれど、日本語訳のドキュメントは古いバージョンのやつだからか、この部分が存在しない。<br />
以前は簡単には行えなかったのかな？</p>

<p>use HTTP::Request::Common;<br />
my $ua = LWP::UserAgent->new;<br />
my $req = POST "http://www.example.com/", <br />
             [ foo => 'bar', <br />
               bar => 'foo', <br />
               hoge => [ qw( aaa bbb ccc ) ]<br />
             ];<br />
my $res = $ua->request($req);</p>

<p>みたいな感じ。</p>

<p>これで、POSTの内容は、</p>

<p>foo=bar&bar=foo&hoge=aaa&hoge=bbb&hoge=ccc</p>

<p>になる。<br />
WWW::Mechanize とか使ったほうがいいんでしょうけどね。</p>]]>

</content>
</entry>
<entry>
<title>会社のサイトがリニューアル</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/12/post_52.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-12-06T02:19:49Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.140</id>
<created>2007-12-06T02:19:49Z</created>
<summary type="text/plain">会社のサイトがリニューアルしました。よろしければご覧ください。 今回のリニューア...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>ふむふむ雑記</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>会社のサイトがリニューアルしました。<a href="http://www.greenwich.co.jp/">よろしければご覧ください。</a></p>

<p>今回のリニューアルにあたり、WordPressというPHPで書かれたオープンソースのブログソフトウェアを採用いたしました。私はほとんどノータッチで、デザインのラフから、専用のモジュール開発やシステムの組み込みまで全て社員にまかせっきりだったのですが、横で見ているのも楽しい経験でした。</p>

<p><a href="http://www.greenwich.co.jp/results/greenwich/">制作の経緯はこちら</a></p>

<p>現在会社のほうでは、「ウルトラ藤井ちゃんPLUS」という新サービスのテスト運用を行っています。</p>

<p><br />
「ウルトラ藤井ちゃんPLUS」につきまして</p>

<p>このソフトを開発する元となりました「ウルトラ藤井ちゃん」は、ひと気を演出することが難しいネットショップ運営において、いかにページ上で行列感を演出するかに主眼を置き開発したソフトでした。</p>

<p>多くの店舗様にご利用いただく中で、売上状況を積極的に開示させることによって、購入件数の増加や、客単価の上昇といった効果が実証され、一定の評価を頂いておりますが、その効果をさらに高めるために開発したのが、この「ウルトラ藤井ちゃんPLUS」です。</p>

<p>楽天の受注メールを元に、ある特定商品の購入状況を、共同購入のように表示させることができます。</p>

<p><br />
といったソフトです。既に、数店舗様よりすぐに使いたいとのご連絡を頂きまして、お試し運用もスターとさせております。もしご興味ございます方はご連絡くださいませ。</p>

<p><br />
今月半ばにはASPサービス向けでは6台目となる新サーバーも運用を開始します。<br />
今までは募集店舗を限ってまいりましたが、サービスのメニューも増えてきましたので、今回のサイトのリニューアルを契機に、広く募集を行っていこうと思っています。</p>]]>

</content>
</entry>
<entry>
<title>PHPの整数型と浮動小数点数型の境界</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/09/php.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-09-26T11:29:17Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.139</id>
<created>2007-09-26T11:29:17Z</created>
<summary type="text/plain">PHPでは、整数型の範囲を超えると自動で浮動小数点数型に変換される。 環境に依存...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>PHP</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>PHPでは、整数型の範囲を超えると自動で浮動小数点数型に変換される。<br />
環境に依存するが、通常、整数型の範囲は、-2147483647 ～ 2147483647<br />
これを超えた値で、(int)で整数型に変換するとオーバーフローする。</p>

<p>大きな数字を扱っていて、少々はまった。</p>]]>

</content>
</entry>
<entry>
<title>EclipseでPHP開発　その２</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/07/eclipsephp_1.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-07-31T09:28:49Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.138</id>
<created>2007-07-31T09:28:49Z</created>
<summary type="text/plain">Eclipse自体を使うのが初めてなので、いろいろ試行錯誤中。 PHPやLLの開...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>PHP</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>Eclipse自体を使うのが初めてなので、いろいろ試行錯誤中。</p>

<p>PHPやLLの開発にいろいろ使ってきましたけれど、これというものが無くて結局はエディタで書いてしまうことが多いんですが、今後チーム開発とかを考えると、開発環境を改めて考えたほうが良さそうということで、Eclipse＋PDTをお試し中。</p>

<p>IDEでは無いですが、WinCVS＋Exam Diff＋テキストエディタ　という環境で長らく使っていて、それなりに使えていたんだけれども、PHPエディタを使ってみて、なんか良いかもと思いつつ、Subversionを使うようになると、バージョン管理と統合されていないIDEは非常に使いづらいということで、Eclipseがうまく使えるといいなぁと思っているところ。</p>

<p><br />
Ecripse ＋ PDT の設定覚書</p>

<p><strong>-clean オプションを付けて起動するために、専用のショートカットを作成</strong></p>

<p>ショートカットのアイコンを右クリックでプロパティを開き、リンク先を</p>

<p>C:\eclipse\eclipse.exe -clean</p>

<p>に変更し、適用</p>

<p>-clean オプションは、言語パックを入れた場合など、Eclipse のキャッシュ情報を初期化したい場合に使用</p>

<p><br />
<strong>メニューの日本語化</strong></p>

<p>当初、Eclipse 3.2.1 LanguagePack を利用してメニューの日本語化を図ろうとしたけれども中途半端にしか日本語化されないので、Pleiades にて日本語化。<br />
http://eclipsewiki.net/eclipse/?%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%C6%FC%CB%DC%B8%EC%B2%BD%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3</p>

<p>インストール方法は解凍したファイルの中の readme.txt を参照。</p>

<p><br />
<strong>文字コードの設定　デフォルトを EUC-JP に設定する場合</strong></p>

<p>eclipse ではファイルごとに文字コードを設定することになっています。<br />
初期設定では文字化けするので、PHPのソースを「EUC-JP」で開くように設定する。</p>

<p>メニューのウィンドウ→設定 <br />
メニュー「一般→コンテンツ・タイプ」 <br />
「テキスト → PHP コンテンツ・タイプ」でデフォルト・エンコードを「EUC-JP」と入力し、更新、OKボタンをクリックする。</p>

<p>でも、今後はUTF-8で開発することに決めました。</p>

<p><br />
<strong>表示のフォントサイズを変更</strong></p>

<p>MS ゴシック 9 ポイントで最適となるように調整。 <br />
フォントの設定は、ウィンドウ -> 設定 -> 一般 -> 外観 -> 色とフォント -> 基本 -> テキスト・フォント -> 変更</p>

<p><br />
<strong>JStyle　エディターに全角空白、半角空白、改行、タブを表示</strong></p>

<p>http://mergedoc.sourceforge.jp/jstyle.html</p>

<p>上記のプラグインを、pdt-all-in-one-S20070611_M1-win32.zip で利用する場合は、JStyle for Eclipse 3.3.0 を利用。</p>

<p>pdt-all-in-one-S20070611_M1-win32.zip は Eclipse のバージョンが3.2.1 と表示されるけれども、プラグインのディレクトリ内を覗くと3.3.0用のプラグインが多く見受けられる。<br />
そのためか、JStyle for Eclipse 3.2.2 はうまく動かない（Eclipse が起動しなくなる）。</p>

<p><br />
<strong>Subversion を使えるように。</strong></p>

<p>当初、Subclipse をインストールしたけれど、Subversive のほうがよさげ。<br />
調査中。</p>]]>

</content>
</entry>
<entry>
<title>EclipseでPHP開発</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/07/eclipsephp.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-07-20T08:12:26Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.137</id>
<created>2007-07-20T08:12:26Z</created>
<summary type="text/plain">を試してみようということで、Eclipse PDT(PHP Developmen...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>PHP</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p>を試してみようということで、Eclipse PDT(PHP Development Tools)をインストールしてみての覚書。</p>

<p>EclipseでPHP開発</p>

<p>http://journal.mycom.co.jp/column/ide/006/index.html<br />
を参考に。</p>

<p><br />
XAMPPのインストール<br />
http://www.apachefriends.org/jp/index.html<br />
http://www.thinkit.co.jp/free/article/0701/12/3/</p>

<p><br />
PDT(PHP Development Tools)のインストール<br />
http://download.eclipse.org/tools/pdt/downloads/<br />
オールインワンパッケージをダウンロード</p>

<p><br />
ZendDebuggerをインストール<br />
http://downloads.zend.com/pdt/server-debugger/</p>

<p>以下を参考に<br />
http://liosk.blog103.fc2.com/blog-entry-13.html</p>

<p>ZendOptimizerとZendDebuggerを共存させるには<br />
\Program Files\xampp\php\zendOptimizer\lib の下にでもデバッガ用フォルダを作成し、</p>

<p>\Program Files\xampp\php\zendOptimizer\lib\Debugger\php-5.2.x</p>

<p>ここに ZendDebugger-5.2.3-Windows-i386\5_2_x_comp 下の ZendDebugger.dll をコピーする。</p>

<p>php.ini には以下のように記述。 </p>

<p>zend_extension_manager.debug_server_ts = "C:\Program Files\xampp\php\zendOptimizer\lib\Debugger"</p>

<p><br />
ちなみに、php.iniは以下が通常用<br />
C:\Program Files\xampp\apache\bin\php.ini</p>

<p>php-switchを使う場合は、以下なんかも変更の必要があるみたい<br />
C:\Program Files\xampp\php\php.ini<br />
C:\Program Files\xampp\php\php4\php.ini<br />
</p>]]>

</content>
</entry>
<entry>
<title>CakePHPが面白い</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/07/cakephp.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-07-06T07:48:37Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.136</id>
<created>2007-07-06T07:48:37Z</created>
<summary type="text/plain">Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOO...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>PHP</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p><a href="http://www.amazon.co.jp/gp/product/4774131393?ie=UTF8&tag=greenwich-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4774131393">Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 2)</a><img src="http://www.assoc-amazon.jp/e/ir?t=greenwich-22&l=as2&o=9&a=4774131393" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />を読みつつ、他のフレームワークを物色していて、CakePHPの面白さに目覚めました。</p>

<p>最近、百式の管理人さんが、<a href="http://www.ideaxidea.com/">idea*idea</a>でCakePHP修行をしていたり、gihyo.jpで<a href="http://gihyo.jp/dev/serial/01/cakephp/0001">CakePHPで高速Webアプリ開発</a>なんて連載が始まったりして、気にはなっていたんですが。</p>

<p>良いなぁと思った点は、日本語でもドキュメント類が結構しっかりと揃っている点、ちゃんと使えそうなO/Rマッパーが組み込まれている点、インストールが簡単で、レンタルサーバーでも簡単に動作させられそうな点。</p>

<p><a href="http://www.cakephp.jp/doc/">CakePHP プログラマーズ リファレンスガイド</a>の<a href="http://www.cakephp.jp/doc/blog_tutorial.html">付録 A. Cake ブログチュートリアル</a>をこなしてみるだけで、一通り、Webアプリケーションを作るうえでの作業を体験できるのも良いですね。</p>

<p>とっつきやすさでは、いままで触ってみたPHPのフレームワークでは一番です。</p>

<p>Ruby on Rails の影響を受けているだけあって、規約が重視されますが、規約にのっとって開発さえすれば結構楽チンなのかも。</p>

<p>ということで、CakePHPでカートを作ってみることにしましょう。<br />
海外のユーザーが多いのもメリットだと思います。</p>

<p>方針としては、<br />
・多言語対応　まずは日本語と英語<br />
・最近のいろいろなカートのスタンダードな仕様に準拠</p>]]>

</content>
</entry>
<entry>
<title>読書目録 - ウィキノミクス</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/07/post_51.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-07-02T14:26:59Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.135</id>
<created>2007-07-02T14:26:59Z</created>
<summary type="text/plain">ウィキノミクス マスコラボレーションによる開発・生産の世紀へ Web2.0という...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>読書目録</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p><a href="http://www.amazon.co.jp/gp/product/482224587X?ie=UTF8&tag=greenwich-22&linkCode=as2&camp=247&creative=1211&creativeASIN=482224587X">ウィキノミクス マスコラボレーションによる開発・生産の世紀へ</a><img src="http://www.assoc-amazon.jp/e/ir?t=greenwich-22&l=as2&o=9&a=482224587X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>

<p>Web2.0という言葉はもはや口にするのもはばかれる言葉になっちゃいましたが、そうは言っても、Web2.0的なサイト、サービスが盛り上がっているのは紛れもない事実。そんな中、本書で取り上げられている成功事例は初めて知るものも多く、新鮮な驚きと共に読み進むことができた。<br />
これからの時代、企業がどう舵取りをすれば生き残っていけるのか、非常に示唆に富んだ本。</p>

<p>Web2.0的企業がサイトを作りユーザーを集める。サイトが大きくなるのはユーザーの貢献が不可欠。そして、サイトを運営する企業はユーザーの活動によってお金儲け。見方によっては、搾取する側とされる側という構造。<br />
誰もが感じてはいても、ではどうするのが良いのか、そんな疑問に答えのヒントを与えてくれただけでもすばらしい。</p>

<p>ふと楽天という会社も、Web2.0企業なんだなぁとちょっと感じた。コミュニティを作り上げるプレーヤーは、お客さまよりも、出店者という意味合いでですが。</p>

<p>Web2.0企業は、要はプラットフォーム・プロバイダーなのでした。</p>]]>

</content>
</entry>
<entry>
<title>読書目録 - まもなく宇宙人が到着します</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/07/post_50.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-07-02T14:22:13Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.134</id>
<created>2007-07-02T14:22:13Z</created>
<summary type="text/plain">まもなく宇宙人が到着します なぜか家にあったので（笑）読んでみた。 なんか、非常...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>読書目録</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p><a href="http://www.amazon.co.jp/gp/product/4938907380?ie=UTF8&tag=greenwich-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4938907380">まもなく宇宙人が到着します</a><img src="http://www.assoc-amazon.jp/e/ir?t=greenwich-22&l=as2&o=9&a=4938907380" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>

<p>なぜか家にあったので（笑）読んでみた。<br />
なんか、非常にトンデモ本のような雰囲気がたっぷり。<br />
ネットでNESARAとか、アセンションとか検索すると、いろいろな熱いやり取りを目にすることができて、これまたびっくり。<br />
「不都合な真実」のアル・ゴアはこれから大活躍！？<br />
混迷の時代を生きる必読書です。１時間で読めます。</p>]]>

</content>
</entry>
<entry>
<title>読書目録 - フューチャリスト宣言</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/07/post_49.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-07-02T14:14:11Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.133</id>
<created>2007-07-02T14:14:11Z</created>
<summary type="text/plain">フューチャリスト宣言 梅田さんも茂木さんという志向性が同じような二人の対談という...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>読書目録</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p><a href="http://www.amazon.co.jp/gp/product/4480063617?ie=UTF8&tag=greenwich-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4480063617">フューチャリスト宣言</a><img src="http://www.assoc-amazon.jp/e/ir?t=greenwich-22&l=as2&o=9&a=4480063617" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>

<p>梅田さんも茂木さんという志向性が同じような二人の対談ということもあって、楽しんでいるんだなぁというのは伝わってくるんだけれども、もう少し意見のぶつかり合いみたいなのも読みたかったかも。やはり世代が違うので、違和感みたいなものも否めないかな。梅田さんはブログとかで追っているので理解可能なのですが、茂木さんがどういう人なのかがいまいち読み取れない。過去の著作に当たってみようか。<br />
</p>]]>

</content>
</entry>
<entry>
<title>アビランドでお買い物</title>
<link rel="alternate" type="text/html" href="http://blog.tanaka-cs.com/archives/2007/05/post_48.html" />
<modified>2008-01-11T10:33:43Z</modified>
<issued>2007-05-25T01:19:26Z</issued>
<id>tag:blog.tanaka-cs.com,2007://1.132</id>
<created>2007-05-25T01:19:26Z</created>
<summary type="text/plain">アミファ藤井さんのところで、高級芸術洋食器のお店がオープンしました。 http:...</summary>
<author>
<name>田中＠グリニッジ</name>
<url>http://www.greenwich.co.jp/</url>
<email>tanaka@greenwich.co.jp</email>
</author>
<dc:subject>ふむふむ雑記</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blog.tanaka-cs.com/">
<![CDATA[<p><a href="http://www.amifa.jp/">アミファ</a>藤井さんのところで、高級芸術洋食器のお店がオープンしました。</p>

<p><a href="http://www.rakuten.ne.jp/gold/haviland/">http://www.rakuten.ne.jp/gold/haviland/</a></p>

<p>誰よりも早くと思いまして、フライング的に注文を行いまして（笑）、第一号カスタマーとなった私めのところに本日朝、無事商品が到着しました。</p>

<p><a href="http://blog.tanaka-cs.com/archives/P10000411.html" onclick="window.open('http://blog.tanaka-cs.com/archives/P10000411.html','popup','width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.tanaka-cs.com/archives/P1000041-thumb.JPG" width="240" height="180" alt="" border="0" /></a></p>

<p>わくわく。箱にちゃんとロゴマークが入ってます！<br />
ガムテープで隠れてしまっているところがちょっと残念。</p>

<p><a href="http://blog.tanaka-cs.com/archives/P10000421.html" onclick="window.open('http://blog.tanaka-cs.com/archives/P10000421.html','popup','width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.tanaka-cs.com/archives/P1000042-thumb.JPG" width="240" height="180" alt="" border="0" /></a></p>

<p>ご開帳です。<br />
と、携帯のカメラで撮影してましたが、バッテリーが切れたので、ちゃんとしたデジカメを持ってきました。</p>

<p><a href="http://blog.tanaka-cs.com/archives/P10101121.html" onclick="window.open('http://blog.tanaka-cs.com/archives/P10101121.html','popup','width=960,height=720,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.tanaka-cs.com/archives/P1010112-thumb.jpg" width="320" height="240" alt="" border="0" /></a></p>

<p>緩衝材を掘っていきまして、現れてきました。<br />
しっかり梱包してありますので、これなら安心ですね。</p>

<p><a href="http://blog.tanaka-cs.com/archives/P10101141.html" onclick="window.open('http://blog.tanaka-cs.com/archives/P10101141.html','popup','width=960,height=720,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.tanaka-cs.com/archives/P1010114-thumb.jpg" width="320" height="240" alt="" border="0" /></a></p>

<p>箱も高級です。<br />
こんな食器を買ったの初めてです(^_^;<br />
ドキドキします。</p>

<p><a href="http://blog.tanaka-cs.com/archives/P10101151.html" onclick="window.open('http://blog.tanaka-cs.com/archives/P10101151.html','popup','width=960,height=720,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.tanaka-cs.com/archives/P1010115-thumb.jpg" width="320" height="240" alt="" border="0" /></a></p>

<p>ついにご対面。</p>

<p><a href="http://blog.tanaka-cs.com/archives/P1010116.html" onclick="window.open('http://blog.tanaka-cs.com/archives/P1010116.html','popup','width=960,height=720,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.tanaka-cs.com/archives/P1010116-thumb.jpg" width="320" height="240" alt="" border="0" /></a></p>

<p>2客揃って。<br />
後ろにある紙は無造作においてあるように見えますが、勿体無いので、<br />
何かの出番のときまでしまっておくために包みなおすので、そっと置いてあるだけです。<br />
雑に置いているように見えますね～<br />
右隅にはサッカーボールが（笑）</p>

<p><a href="http://blog.tanaka-cs.com/archives/P1010117.html" onclick="window.open('http://blog.tanaka-cs.com/archives/P1010117.html','popup','width=960,height=720,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.tanaka-cs.com/archives/P1010117-thumb.jpg" width="320" height="240" alt="" border="0" /></a></p>

<p>ソーサーの裏を激写！</p>

<p>うーん、高級食器、いいですね。<br />
嫁さんも朝から大喜びでした。</p>

<p><br />
<a href="http://www.rakuten.ne.jp/gold/haviland/">アビランド</a></p>

<p>ねらい目のプレゼントも開催中のようです！<br />
<a href="http://www.rakuten.co.jp/haviland/1847947/">http://www.rakuten.co.jp/haviland/1847947/</a></p>]]>

</content>
</entry>

</feed>