<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ScriptWorks.JP</title>
	<atom:link href="http://scriptworks.jp/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://scriptworks.jp/blog</link>
	<description>ただいま調整中。( ひとりで作るWebサービス開発ノート )</description>
	<lastBuildDate>Thu, 17 May 2012 07:55:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>書評 Ruby on Rails 3 ポケットリファレンス</title>
		<link>http://scriptworks.jp/blog/2012/03/book_review_rails3_pocket_reference/</link>
		<comments>http://scriptworks.jp/blog/2012/03/book_review_rails3_pocket_reference/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 03:25:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Rails3]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=223</guid>
		<description><![CDATA[Ruby on Rails 3.1 に対応した ポケットリファレンス を送って頂きました。 前回、送って頂いた Ruby on Rails 3アプリケーションプログラミング が Rails3.0ベース なので、Rails [...]]]></description>
			<content:encoded><![CDATA[				<a href="http://scriptworks.jp/blog/wp-content/uploads/2012/03/Rails3_Pocket_Reference.jpg" title="もう Rails 3.1 は安定版ということで移行作業を進行中。" rel="wp-prettyPhoto[g223]">
				<img src="http://scriptworks.jp/blog/wp-content/uploads/2012/03/Rails3_Pocket_Reference-300x200.jpg" alt="Ruby on Rails 3 ポケットリファレンス" title="Ruby on Rails 3 ポケットリファレンス" width="300" height="200" class="alignnone size-thumbnail wp-image-222" />
				</a>
				<br />
				Ruby on Rails 3.1 に対応した <a href="http://www.amazon.co.jp/gp/product/4774149802/?ie=UTF8&#038;tag=scriptworks-22&#038;linkCode=ur2&#038;camp=247&#038;creative=1211">ポケットリファレンス</a> を送って頂きました。<br />
				前回、送って頂いた <a href="http://scriptworks.jp/blog/2011/05/rails3-%E9%96%8B%E7%99%BA%E6%89%8B%E9%A0%86%E3%81%BE%E3%81%A8%E3%82%81%E6%9C%AC%E3%81%8C%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%E3%80%82/">Ruby on Rails 3アプリケーションプログラミング</a> が Rails3.0ベース なので、Rails3.1 で追加になった <a href="http://guides.rubyonrails.org/asset_pipeline.html">アセットパイプライン</a> や <a href="http://coffeescript.org/">CoffeeScript</a> と <a href="http://sass-lang.com/">Sass</a>( CoffeeScriptのCSS版 ) といった新しい仕組みを試してます。<br />
				<br />
				環境は さくらのVPS で Rails3.1+Passenger を設定し Rails 3アプリケーションプログラミング のサンプル( 3.0ベース )をもとに使っているのですが、さすがにそのままでは動きません(汗)。　エラーが出るたびにポケットリファレンスを見て修正、次へ進むの繰り返しで進行中。　コンソールでよく使う、gem や rails、rake、bundle といったコマンドのオプション解説もコンパクトにまとまっているので、Rails3.1の情報をぱぱっと手早く探すのに便利です。<br />
				<br />
				Rails3レシピブックと比べると <a href="http://beginrescueend.com/">rvm</a> と <a href="https://github.com/capistrano/capistrano/wiki/">Capistrano</a> や <a href="http://rspec.info/">RSpec</a> の解説はありませんが、<a href="https://github.com/plataformatec/devise">Deviseプラグイン</a> を使ったユーザー登録とログイン認証やユーザー管理ページなど<b>会員制サイトを作るときに使える設定方法</b>や <a href="https://github.com/tobi/delayed_job">Delayed::Jobプラグイン</a> で非同期のバッチ処理を組む方法も解説されている点がポイント高し。　特に、Deviseプラグインがカバーしている機能は自分で実装＆テストすると何日も
				かかるので、持ち歩きサイズのリファレンス本に、この情報があるのはとても助かります。<br />
				<br />
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2012/03/book_review_rails3_pocket_reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP 複数コア のお手軽バージョン管理 : CakePHP Advent Calendar 2011 Day 15</title>
		<link>http://scriptworks.jp/blog/2011/12/how_to_setup_multiple_cakephp_core/</link>
		<comments>http://scriptworks.jp/blog/2011/12/how_to_setup_multiple_cakephp_core/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 14:57:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=198</guid>
		<description><![CDATA[CakePHP Advent Calendar 2011 15日目のエントリです。 ※ 12/16追記 : こっそり、解説文を書き足しました ※ 12/18追記 : さらに改訂(汗)。 ※ 前日( 14日目 )のエントリ [...]]]></description>
			<content:encoded><![CDATA[				<br />
				<a href="http://atnd.org/events/22721">CakePHP Advent Calendar 2011</a> 15日目のエントリです。<br />
				※ 12/16追記 : こっそり、解説文を書き足しました<br />
				※ 12/18追記 : さらに改訂(汗)。<br />
				<br />
				※ 前日( 14日目 )のエントリーは <a href="https://twitter.com/#!/kaz_29">@kaz_29</a> さんの 『 <a href="http://d.hatena.ne.jp/kaz_29/20111214/1323862538">CakePHP2+PostgreSQLでGeoデータを簡単に扱う!?</a> 』です。<br />
				<br />
				新しいバージョン・リリースのたびに発生するバージョンアップ作業ですが、ソースコードの取得と配置といった定形作業をスクリプト化する方法( 簡単コース )と、はじめからCakePHPコアのバージョン管理を git で行う方法( Gitコース )を考えてみました。<br />
				※ インストール方法はCakePHP Cookbook の <a href="http://book.cakephp.org/ja/view/915/%E5%BF%9C%E7%94%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">応用インストール手順</a> をベースにしています<br />
				<br />
				簡単コースのスクリプトは github のリポジトリから CakePHP のソースコードを取得し、ディレクトリ単位でバージョン管理するので git を知らなくても大丈夫です。一度設定すれば、スクリプトを実行するだけの簡単バージョンアップ！<br />
				<br />
				Gitコースのバージョンアップは git pull コマンドが使えます。<br />
				※ こちらは git を普段から使っているプログラマー向け <br />
				
				<span id="more-198"></span>
				
				<h3>Ａ．簡単コースの解説</h3>
				
				<h4>A-1 : 作業の前提となるディレクトリ構成</h4>
				
				ユーザーディレクトリを使う場合を例に以下のディレクトリ構成で話を進めます。<br />
				※ CakePHP 1.3 と 2.0 の複数コアを扱うため、Cookbookとは配置を変えてあります
				<table>
				
				<tr>
				<td>~/cakephp/cake_core_1.3</td>
				<td>CakePHPコア 1.3</td>
				</tr>
				
				<tr>
				<td>~/cakephp/cake_core_2.0</td>
				<td>CakePHPコア 2.0</td>
				</tr>
				
				<tr>
				<td>~/cakephp/plugins</td>
				<td>プラグイン</td>
				</tr>
				
				<tr>
				<td>~/cakephp/vendors</td>
				<td>ベンダー・ライブラリー</td>
				</tr>
				
				<tr>
				<td>~/cakephp/app</td>
				<td>開発するアプリケーションを配置</td>
				</tr>
				
				<tr>
				<td>~/cakephp/tmp</td>
				<td>作業用 : CakePHPコアの一時置き場</td>
				</tr>
				
				</table>
				
				<h4>A-2 : ディレクトリの用意</h4>
				まず、CakePHPコアを配置するディレクトリと作業用のディレクトリなどを作ります。<br />
				
				<pre class="brush: bash; title: ; notranslate">
sh make-dirs.sh
</pre>
				
				※ スクリプトのソースコードは <a href="#A-6">A-6</a> にまとめてありますので、お使いください<br />
				
				
				<h4>A-3 : cakeコマンドへのalias設定</h4>
				必須ではありませんが、複数バージョンのcakeコマンドを使い分けるために .bashrc などで alias を設定しておくと便利です。<br />
				<pre class="brush: bash; title: .bashrc; notranslate">
alias cake13='~/cakephp/cake_core_1.3/cake/console/cake'
alias cake20='~/cakephp/cake_core_2.0/Cake/Console/cake'
</pre>
				
				<h4>A-4 : ソースコードの取得と配置</h4>
				次に CakePHP 1.3 のソースコードを github の <a href="https://github.com/cakephp/cakephp">リポジトリ</a> から取得し、必要なコアだけを配置するスクリプトを実行します。<br />
				
				<pre class="brush: bash; title: ; notranslate">
% sh get-cakephp-1.3.sh
Cloning into cakephp...
remote: Counting objects: 138190, done.
remote: Compressing objects: 100% (27658/27658), done.
remote: Total 138190 (delta 109350), reused 134528 (delta 106944)
Receiving objects: 100% (138190/138190), 18.88 MiB | 4.37 MiB/s, done.
Resolving deltas: 100% (109350/109350), done.
Branch 1.3 set up to track remote branch 1.3 from origin.
Switched to a new branch '1.3'

CakePHPコアを配置しました : /home/foo/cakephp/cake_core_1.3/cakephp-1.3-2011-1215-2225

</pre>
				スクリプト一発で、1.3のソースコードを git clone し、make-dirs.sh で準備しておいた配置ディレクトリへコアの配置とスクリプト実行時のバージョンを最新版としたシンボリックリンクが設定されます。<br />
				↓<br />
				1.3コアの配置先 ： ~/cakephp/cake_core_1.3/cakephp-1.3-年-月日-時分<br />
				1.3コアの最新版 ： ~/cakephp/cake_core_1.3/cake<br />
				<br />
				CakePHP 2.0 はコアのpathが少し違っているので、別に get-cakephp-2.0.sh を用意しました。<br />
				
				<pre class="brush: bash; title: ; notranslate">
% sh get-cakephp-2.0.sh
Cloning into cakephp...
remote: Counting objects: 138190, done.
remote: Compressing objects: 100% (27658/27658), done.
remote: Total 138190 (delta 109350), reused 134528 (delta 106944)
Receiving objects: 100% (138190/138190), 18.88 MiB | 3.11 MiB/s, done.
Resolving deltas: 100% (109350/109350), done.
Branch 2.0 set up to track remote branch 2.0 from origin.
Switched to a new branch '2.0'

CakePHPコアを配置しました : /home/foo/cakephp/cake_core_2.0/cakephp-2.0-2011-1215-2225

</pre>
				↓<br />
				2.0コアの配置先 ： ~/cakephp/cake_core_2.0/cakephp-2.0-年-月日-時分<br />
				2.0コアの最新版 ： ~/cakephp/cake_core_2.0/Cake<br />
				<br />
				上記スクリプトの実行を繰り返すたびに最新版を示すシンボリックリンクも更新していますので、このリンクを貼り直すことで、CakePHPコアに何か問題があった場合 や 障害などの切り分けに活用しています。<br />
				
				<pre class="brush: bash; title: ; notranslate">
% ls -l ~/cakephp/cake_core_1.3
合計 8
lrwxrwxrwx 1 foo foo   26 2011-12-15 22:25 cake -&gt; cakephp-1.3-2011-1215-2225/
drwxrwxr-x 6 foo foo 4096 2011-12-15 22:24 cakephp-1.3-2011-1215-2224/
drwxrwxr-x 6 foo foo 4096 2011-12-15 22:25 cakephp-1.3-2011-1215-2225/

% ls -l ~/cakephp/cake_core_2.0
合計 8
lrwxrwxrwx  1 foo foo   26 2011-12-15 22:26 Cake -&gt; cakephp-2.0-2011-1215-2225/
drwxrwxr-x 18 foo foo 4096 2011-12-15 22:24 cakephp-2.0-2011-1215-2224/
drwxrwxr-x 18 foo foo 4096 2011-12-15 22:26 cakephp-2.0-2011-1215-2225/
</pre>
				※ 過去バージョンへの切戻し( リンクの張替え )は今のところ手動でやってます(汗) 
				
				
				
				<h4>A-5 : フロント側の設定</h4>
				
				あとは CakePHP の 複数コア配置 に合わせて、フロント側のwebroot( ~/cakephp/app/アプリケーション名/ )の index.php と test.php で APP_DIR、ROOT、CAKE_CORE_INCLUDE_PATH を設定すればOKです。
				
				<pre class="brush: php; title: 設定例; notranslate">

define( 'APP_DIR',					'アプリケーション名' );
define( 'ROOT',                     '/ホームディレクトリのパス/cakephp/app' );

define( 'CAKE_CORE_INCLUDE_PATH',   '/ホームディレクトリのパス/cakephp/cake_core_1.3' );

　または

define( 'CAKE_CORE_INCLUDE_PATH',   '/ホームディレクトリのパス/cakephp/cake_core_2.0' );
</pre>
				
				
				<a name="A-6"></a>
				
				<h4>A-6 : 簡単コースで使用したスクリプト</h4>
				
				配置用のディレクトリ作成スクリプト(↓)です。
				<pre class="brush: bash; title: make-dirs.sh; notranslate">
#!/bin/bash

CAKEPHP=~/cakephp

CAKE_CORE_13=$CAKEPHP/cake_core_1.3
CAKE_CORE_20=$CAKEPHP/cake_core_2.0
APP=$CAKEPHP/app
PLUGINS=$CAKEPHP/plugins
VENDORS=$CAKEPHP/vendors
TMP=$CAKEPHP/tmp

if [ ! -d $CAKE_CORE_13 ]; then mkdir -p $CAKE_CORE_13; fi
if [ ! -d $CAKE_CORE_20 ]; then mkdir -p $CAKE_CORE_20; fi
if [ ! -d $APP          ]; then mkdir -p $APP; fi
if [ ! -d $PLUGINS      ]; then mkdir -p $PLUGINS; fi
if [ ! -d $VENDORS      ]; then mkdir -p $VENDORS; fi
if [ ! -d $TMP          ]; then mkdir -p $TMP; fi
</pre>
				
				
				CakePHPのGitリポジトリからソースコードを取得＆配置するスプリプト(↓)です。
				<pre class="brush: bash; title: get-cakephp-1.3.sh; notranslate">
#!/bin/bash

CAKEPHP_VER=1.3

CAKEPHP=~/cakephp
## TODAY=`date +%Y-%m%d`
TODAY=`date +%Y-%m%d-%H%M`
CAKE_CORE=$CAKEPHP/cake_core_$CAKEPHP_VER
CAKE_VER_TODAY=cakephp-$CAKEPHP_VER-$TODAY
TMP=$CAKEPHP/tmp

if [  -d $CAKE_CORE/$CAKE_VER_TODAY ]; then
    echo $CAKE_CORE/$CAKE_VER_TODAY が既にあります。
    exit
fi

cd $TMP
git clone git://github.com/cakephp/cakephp.git
mv cakephp $CAKE_VER_TODAY
cd    $TMP/$CAKE_VER_TODAY
git checkout $CAKEPHP_VER

cd $TMP/$CAKE_VER_TODAY
cp -a ./cake/ $CAKE_CORE/$CAKE_VER_TODAY

cd $CAKE_CORE

if [ -e $CAKE_CORE/cake ]; then
    rm  $CAKE_CORE/cake
fi

ln -s $CAKE_VER_TODAY cake

chmod -R +w $TMP/$CAKE_VER_TODAY
rm -r $TMP/$CAKE_VER_TODAY

echo
echo CakePHPコアを配置しました : $CAKE_CORE/$CAKE_VER_TODAY
echo
</pre>
				
				
				<pre class="brush: bash; title: get-cakephp-2.0.sh; notranslate">
#!/bin/bash

CAKEPHP_VER=2.0

CAKEPHP=~/cakephp
## TODAY=`date +%Y-%m%d`
TODAY=`date +%Y-%m%d-%H%M`
CAKE_CORE=$CAKEPHP/cake_core_$CAKEPHP_VER
CAKE_VER_TODAY=cakephp-$CAKEPHP_VER-$TODAY
TMP=$CAKEPHP/tmp

if [  -d $CAKE_CORE/$CAKE_VER_TODAY ]; then
    echo $CAKE_CORE/$CAKE_VER_TODAY が既にあります。
    exit
fi

cd $TMP
git clone git://github.com/cakephp/cakephp.git
mv cakephp $CAKE_VER_TODAY
cd    $TMP/$CAKE_VER_TODAY
git checkout $CAKEPHP_VER

cd $TMP/$CAKE_VER_TODAY/lib
cp -a Cake $CAKE_CORE/$CAKE_VER_TODAY

cd $CAKE_CORE

if [ -e $CAKE_CORE/Cake ]; then
    rm  $CAKE_CORE/Cake
fi

ln -s $CAKE_VER_TODAY Cake

chmod -R +w $TMP/$CAKE_VER_TODAY
rm -r $TMP/$CAKE_VER_TODAY

echo
echo CakePHPコアを配置しました : $CAKE_CORE/$CAKE_VER_TODAY
echo
</pre>
				
				
				
				
				
				<h3>Ｂ．Gitコースの解説</h3>
				
				<h4>B-1 : 作業の前提となるディレクトリ構成</h4>
				
				<table>
				<tr>
				<td>~/cakephp/cakephp_1.3</td>
				<td>CakePHP 1.3 ローカルリポジトリ</td>
				</tr>
				
				<tr>
				<td>~/cakephp/cakephp_2.0</td>
				<td>CakePHP 2.0 ローカルリポジトリ</td>
				</tr>
				
				<tr>
				<td>~/cakephp/plugins</td>
				<td>プラグイン</td>
				</tr>
				
				<tr>
				<td>~/cakephp/vendors</td>
				<td>ベンダー・ライブラリー</td>
				</tr>
				
				<tr>
				<td>~/cakephp/app</td>
				<td>開発するアプリケーションを配置</td>
				</tr>
				</table>
				
				<h4>B-2 : ディレクトリの用意</h4>
				
				<pre class="brush: bash; title: ; notranslate">
mkdir -p ~/cakephp/app
mkdir -p ~/cakephp/plugins
mkdir -p ~/cakephp/vendors
</pre>
				※ 簡単コースの A-2 でディレクトリを用意した場合はそのままでも大丈夫です
				
				
				<h4>B-3 : cakeコマンドへのalias設定</h4>
				必須ではありませんが、複数バージョンのcakeコマンドを使い分けるために .bashrc などで alias を設定しておくと便利です。<br />
				<pre class="brush: bash; title: .bashrc; notranslate">
alias cake13='~/cakephp/cakephp_1.3/cake/console/cake'
alias cake20='~/cakephp/cakephp_2.0/lib/Cake/Console/cake'
</pre>
				※ 簡単コースの A-3 とは異なるパスを指定
				
				<h4>B-4 : Gitリポジトリの用意( ソースコード取得 )</h4>
				<pre class="brush: bash; title: ; notranslate">
cd ~/cakephp
git clone git://github.com/cakephp/cakephp.git cakephp_1.3
cd ~/cakephp/cakephp_1.3
git checkout 1.3

cd ~/cakephp
git clone git://github.com/cakephp/cakephp.git cakephp_2.0
cd ~/cakephp/cakephp_2.0
git checkout 2.0
</pre>
				
				
				バージョンアップは 各メジャーバージョンのリポジトリ・ディレクトリで git pull を実行。<br />
				
				<pre class="brush: bash; title: ; notranslate">
cd ~/cakephp/cakephp_1.3
git pull

cd ~/cakephp/cakephp_2.0
git pull
</pre>
				
				
				<h4>B-5 : フロント側の設定</h4>
				
				あとは CakePHP の 複数コア配置 に合わせて、フロント側のwebroot( ~/cakephp/app/アプリケーション名/ )の index.php と test.php で APP_DIR、ROOT、CAKE_CORE_INCLUDE_PATH を設定すればOKです。
				
				<pre class="brush: php; title: 設定例; notranslate">

define( 'APP_DIR',					'アプリケーション名' );
define( 'ROOT',                     '/ホームディレクトリのパス/cakephp/app' );

define( 'CAKE_CORE_INCLUDE_PATH',   '/ホームディレクトリのパス/cakephp/cakephp_1.3' );

　または

define( 'CAKE_CORE_INCLUDE_PATH',   '/ホームディレクトリのパス/cakephp/cakephp_2.0' );
</pre>
				
				
				
				<h3>おしまい</h3>
				
				以上、ざっくりとした解説なので スクリプトのカスタマイズ とか質問があれば <a href="https://twitter.com/#!/scriptwork">@scriptwork</a> までご連絡ください。<br />
				<br />
				それでは、明日の <a href="http://atnd.org/events/22721">CakePHP Advent Calendar 2011</a> 16日目は <a href="https://twitter.com/#!/bimihoujyun">@bimihoujyun</a> さんです。<br />
				<br />
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2011/12/how_to_setup_multiple_cakephp_core/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DateTimeクラスの落とし穴と対策 : PHP Advent Calendar jp 2011 Day 7</title>
		<link>http://scriptworks.jp/blog/2011/12/how_to_avoid_pitfall_of_php_datetime/</link>
		<comments>http://scriptworks.jp/blog/2011/12/how_to_avoid_pitfall_of_php_datetime/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 12:28:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=187</guid>
		<description><![CDATA[PHP Advent Calendar jp 2011 7日目担当の @scriptwork です。 DateTimeクラス は PHP5.3 で日付や時刻の加減算を行う add / subメソッド や 差分を計算する  [...]]]></description>
			<content:encoded><![CDATA[				<br />
				<a href="http://atnd.org/events/22781">PHP Advent Calendar jp 2011</a> 7日目担当の <a href="http://twitter.com/scriptwork">@scriptwork</a> です。<br />
				<br />
				DateTimeクラス は PHP5.3 で日付や時刻の加減算を行う add / subメソッド や 差分を計算する diffメソッド などが追加され、日付と時刻を取り扱う面倒な処理をサポートしてくれるクラスです。<br />
				<br />
				DateTimeクラス が実装されるまでは PHP関数 の strtotime() と date() で日付と時刻の加減算を行なっていましたが、2038年問題 への対応もあり、新しくコードを書くなら DateTimeクラス を使うのが良さそうですね。<br />
				<br />
				とはいえ、現在の PHP5.3.8 と PHP5.4.0RC2 の DateTimeクラス は 日付の加減算 で strtotime() と 同じ問題 をかかえていますので、使い所を押さえておく必要があります。<br />
				<br />
				<h3>DateTimeクラスの問題とは何か？</h3>
				
				まずは正常なケースとして、日付に対する日数の加減算で DateTimeクラス の動作を確認してみましょう。<br />
				
				<span id="more-187"></span>
				
				<pre class="brush: php; title: DateTimeクラスで日数の加減算; notranslate">
// 日数の加算
$day = new DateTime( '2011-2-28' );
echo $day-&gt;format( 'Y-m-d' );                         // 2011-02-28
$day-&gt;add( new DateInterval('P1D') );                 // １日後
echo ' +1 day ', $day-&gt;format( 'Y-m-d' ), '&lt;br&gt;';     // 2011-03-01

// 日数の減算
$day-&gt;setDate( 2011, 3, 1 );
echo $day-&gt;format( 'Y-m-d' );                         // 2011-03-01
$day-&gt;sub( new DateInterval('P1D') );                 // １日前
echo ' -1 day ', $day-&gt;format( 'Y-m-d' ), '&lt;br&gt;';     // 2011-02-28
</pre>
				
				１日づつの単純な加減算ですが、カレンダーどうりに 月をまたいだ日付 を返すことに成功しています。<br />
				
				
				<pre class="brush: php; title: DateTimeクラスで週の加減算; notranslate">
// 週の加算
$day-&gt;setDate( 2011, 2, 22 );
echo $day-&gt;format( 'Y-m-d' );                         // 2011-02-22
$day-&gt;add( new DateInterval('P1W') );                 // １週間後
echo ' +1 week ', $day-&gt;format( 'Y-m-d' ), '&lt;br&gt;';    // 2011-03-01

// 週の減算
$day-&gt;setDate( 2011, 3, 7 );
echo $day-&gt;format( 'Y-m-d' );                         // 2011-03-07
$day-&gt;sub( new DateInterval('P1W') );                 // １週間前
echo ' -1 week ', $day-&gt;format( 'Y-m-d' ), '&lt;br&gt;';    // 2011-02-28
</pre>
				
				同様に 月をまたぐ週の加減算 も問題ありません。<br />
				
				次に月の加減算です。
				
				<pre class="brush: php; title: ; notranslate">
// 月の加算
$day-&gt;setDate( 2011, 1, 31 );
echo $day-&gt;format( 'Y-m-d' );                         // 2011-01-31
$day-&gt;add( new DateInterval('P1M') );                 // １ヶ月後
echo ' +1 month ', $day-&gt;format( 'Y-m-d' ), '&lt;br&gt;';   // 2011-03-03

// 月の減算
$day-&gt;setDate( 2011, 3, 29 );
echo $day-&gt;format( 'Y-m-d' );                         // 2011-03-29
$day-&gt;sub( new DateInterval('P1M') );                 // １ヶ月前
echo ' -1 month ', $day-&gt;format( 'Y-m-d' ), '&lt;br&gt;';   // 2011-03-01
</pre>
				
				おや？<br />
				
				１月３１日 の １ヶ月後 が ３月３日 ？<br />
				３月２９日 の １ヶ月前 が ３月１日 ？<br />
				<br />
				本当はどちらも ２月２８日 を返してほしいのですが、日付や月数のパラメーターを変えて試してみると、月の加減算 で演算前後の『 月の日数 』が違うと日付が狂ってしまうことがわかりました。<br />
				<br />
				最初は自分の使い方が悪いのかと思ったのですが、 DateTimeクラス の <a href="http://www.php.net/manual/ja/datetime.add.php">addメソッド</a> と <a href="http://www.php.net/manual/ja/datetime.sub.php">subメソッド</a> それぞれのドキュメントに注意点(例３)が書いてあり、どうも現状は仕様(？)扱いになっているようです。<br />
				
				
				<h3>対策方法</h3>
				
				対策として DateTimeクラス を extend しようかとも思いましたが、まずはDRYということで誰かコードを書いていないか探してみると Zend Framework の <a href="http://framework.zend.com/manual/ja/zend.date.overview.html">Zend_Dateクラス</a> を発見。<br />
				
				さっそく、試して見ると…<br />
				
				<pre class="brush: php; title: Zend_Dateクラスで月の加減算; notranslate">
require_once 'Zend/Date.php';

// 月の加算
$day1 = new Zend_Date( array('year'=&gt;2011, 'month'=&gt;1, 'day'=&gt;31) );
echo $day1-&gt;toString('yyyy-MM-dd');                             // 2011-01-31
$day1-&gt;add( 1, Zend_Date::MONTH );                              // １ヶ月後
echo ' +1 month ',  $day1-&gt;toString('yyyy-MM-dd'),  '&lt;br&gt;';     // 2011-02-28

// 月の減算
$day2 = new Zend_Date( array('year'=&gt;2011, 'month'=&gt;3, 'day'=&gt;29) );
echo $day2-&gt;toString('yyyy-MM-dd');                             // 2011-03-29
$day2-&gt;sub( 1, Zend_Date::MONTH );                              // １ヶ月前
echo ' -1 month ',  $day2-&gt;toString('yyyy-MM-dd'),  '&lt;br&gt;';     // 2011-02-28
</pre>
				
				こんな感じで、Zend_Dateクラス は 月の加減算OKです。他にも日、週、年の加減算も試しましたが問題ありません！<br />
				<br />
				理想としては PHP5.4 で DateTimeクラス が改修されると良いのですが、CakePHP など他のフレームワークを使っていても require_once で使えますので、当面の対策として Zend_Dateクラス お勧めです。<br />
				<br />
				<h3>おまけ( クライアントサイドの対策 )</h3>
				
				PHP Advent Calendarの記事ではありますが、クライアントサイドということで JavaScript も試したところ、同じ現象を確認しました(汗)。
				
				<pre class="brush: jscript; title: JavaScriptの場合; notranslate">
// ■ 月の加算
var day = new Date( 2011, 0, 31 );
document.writeln( day.toLocaleDateString() + ' +1 month ' );    // 2011年1月31日
day.setMonth( day.getMonth() + 1 );                             // １ヶ月後
document.writeln( day.toLocaleDateString() + '&lt;br&gt;' );          // 2011年3月3日

// ■ 月の減算
day.setMonth(2); day.setDate(29);
document.writeln( day.toLocaleDateString() + ' -1 month ' );    // 2011年3月29日
day.setMonth( day.getMonth() - 1 );                             // １ヶ月前
document.writeln( day.toLocaleDateString() + '&lt;br&gt;' );          // 2011年3月1日
</pre>
				
				JavaScript も 日数の加減算 は OK だけど、月の加減算 が NG です。<br />
				※ 週の加減算 は javascript に setWeek() と getWeek() が無いので確認を省略しました<br />
				<br />
				そこで、やはり DRY(笑) ということで流行りの <a href="http://momentjs.com/">Moment.js</a> を導入。<br />
				
				<pre class="brush: jscript; title: ; notranslate">
// 月の加算
var day = moment([2011, 0, 31]); // JavaScriptなので、月は０から
document.writeln( moment(day).format(&quot;YYYY-MM-DD&quot;) + ' +1 month ' );    // 2011-01-31
day.add('months', 1);                                                   // １ヶ月後
document.writeln( moment(day).format(&quot;YYYY-MM-DD&quot;) + '&lt;br&gt;' );          // 2011-02-28

// 月の減算
day = moment([2011, 2, 29]); // JavaScriptなので、月は０から
document.writeln( moment(day).format(&quot;YYYY-MM-DD&quot;) + ' -1 month ' );    // 2011-03-29
day.subtract('months', 1);                                              // １ヶ月前
document.writeln( moment(day).format(&quot;YYYY-MM-DD&quot;) + '&lt;br&gt;' );          // 2011-02-28
</pre>
				
				１月３１日 の １ヶ月後 は ２月２８日<br />
				３月２９日 の １ヶ月前 も ２月２８日<br />
				↓<br />
				Moment.js 正解です。<br />
				<br />
				Zend_Date と同様に Moment.js で 日、週、年の加減算も対応していることを確認しましたので、日付操作はこの２つで決まりですね。<br />
				<br />
				それでは、明日の <a href="http://atnd.org/events/22781">PHP Advent Calendar jp 2011</a> ８日目は <a href="http://twitter.com/koyhoge">@koyhoge</a> さんです。<br />
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2011/12/how_to_avoid_pitfall_of_php_datetime/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>書評 JavaScript本格入門  function前の init: って何？</title>
		<link>http://scriptworks.jp/blog/2011/10/book_review_javascript-nuts-and-bolts/</link>
		<comments>http://scriptworks.jp/blog/2011/10/book_review_javascript-nuts-and-bolts/#comments</comments>
		<pubDate>Sat, 29 Oct 2011 07:32:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=166</guid>
		<description><![CDATA[まず、この JavaScript本格入門 を読んで ３年以上前 の JavaScript入門書 は処分しました。 ※ 基本的な JavaScript言語構文 のおさらいも解説されているので問題なし もう１冊 パーフェクト [...]]]></description>
			<content:encoded><![CDATA[				<br />
				<a href="http://scriptworks.jp/blog/wp-content/uploads/2011/10/javascript-nuts-and-bolts.jpg" title="実はオブジェクト指向JavaScriptの入門書です！" rel="wp-prettyPhoto[g166]">
				<img src="http://scriptworks.jp/blog/wp-content/uploads/2011/10/javascript-nuts-and-bolts-300x200.jpg" alt="JavaScript本格入門" title="JavaScript本格入門" width="300" height="200" class="alignnone size-medium wp-image-124" />
				</a>
				
				<br />
				<br />
				まず、この <a href="http://www.amazon.co.jp/gp/product/4774144665/?ie=UTF8&#038;tag=scriptworks-22&#038;linkCode=ur2&#038;camp=247&#038;creative=1211">JavaScript本格入門</a> を読んで ３年以上前 の JavaScript入門書 は処分しました。<br />
				※ 基本的な JavaScript言語構文 のおさらいも解説されているので問題なし<br />
				<br />
				もう１冊 <a href="http://www.amazon.co.jp/gp/product/477414813X/?ie=UTF8&#038;tag=scriptworks-22&#038;linkCode=ur2&#038;camp=247&#038;creative=1211">パーフェクトJavaScript</a> も手元にあり、こちらはまだ拾い読み中ですが、
				ざくっと難易度をTOEIC目標スコア的に書くとこんな感じ。<br />
				<table>
				<tr>
				<td>一般的(？)な入門書</td>
				<td>300-500</td>
				</tr>
				<tr>
				<td>JavaScript本格入門</td>
				<td>500-700</td>
				</tr>
				<tr>
				<td>パーフェクトJavaScript</td>
				<td>700-900</td>
				</tr>
				</table>
				※ 実際の守備範囲はオーバラップした部分もあるので、目標スコアということで。<br />
				<br />
				わたし自身のスコア(汗)は一般的な入門書を読み終えたレベル( スコア300！ )で、たとえば jQueryソースコード の<br />
				
				<pre class="brush: jscript; first-line: 100; highlight: [102]; title: jquery-1.6.4.js; notranslate">
jQuery.fn = jQuery.prototype = {
          constructor: jQuery,
          init: function( selector, context, rootjQuery ) {
</pre>
				
				といったコードを見ると 『 function の前の init: って何？ 』 という感じです。<br />
				<br />
				差し迫って困っている疑問ではなかったので、本格入門を１回読んだだけでは気づかなかったのですが…<br />
				<br />
				
				<blockquote>
				JavaScriptにおいては、連想配列とオブジェクトは同一のものです。 <br />
				　　…<br />
				　 配列内の個々のデータは「要素」と呼んでいたのに対して、オブジェクト内の個々のデータは<br />
				　「プロパティ」と呼びます。関数が格納されたプロパティのことは、特別にメソッドと呼びます。<br />
				</blockquote>
				
				<br />
				この説明を読み返しつつ、解説図を眺めるうちに謎は解けた。　メソッド名ですね！<br />
				<br />
				分かってしまえばなるほどという感じですが、PHPなどのスクリプト言語で実装されている
				 オブジェクト指向( クラスベース ) とはだいぶ違うので、こういったJavaScriptの
				 オブジェクト指向( プロトタイプベース ) が初めてなら、サイ本 や パーフェクトJavaScript へ
				ジャンプする前の足場固めとして効果的な１冊だと思いました。
				
				
				<br />
				<br />
				おまけ( サンプルコード・カスタマイズ )<br />
				<span id="more-166"></span>
				<br />
				<br />
				Chapter 8 と Chapter 9 の 一部サンプルコード は Yahoo の ウェブ検索API が
				<a href="http://developer.yahoo.co.jp/webapi/search/premium.html">今年３月から有料</a>
				になった関係でそのままでは動きません。<br />
				<br />
				そんなわけで、Chapter 9 の サンプルコード だけですが、今のところ無料で使えて JSONP対応 の
				<a href="http://developer.yahoo.co.jp/webapi/auctions/auction/v2/search.html">オークション検索API</a>
				で書き換えてみましたので、Yahoo! API の アプリケーションID を書き換えてお試しください。<br />
				
				
				
				<pre class="brush: php; highlight: [4,10]; title: yahooJson.php; notranslate">
&lt;?php
header('Content-Type: application/json;charset=UTF-8');
$params = array(
  'appid'  =&gt; '■アプリケーションID',
  'query'  =&gt; $_REQUEST['keywd'],
  'results'=&gt; 20
);

// $url = 'http://search.yahooapis.jp/WebSearchService/V2/webSearch?'.http_build_query($params);
   $url = 'http://auctions.yahooapis.jp/AuctionWebService/V2/search?'.http_build_query($params);

$doc = simplexml_load_string(file_get_contents($url));
print(json_encode($doc));
</pre>
				
				
				
				<pre class="brush: jscript; highlight: [4,21,24,29,31]; title: yahooJquery.html; notranslate">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
&lt;title&gt;Yahooオークション検索 jQuery + PHP版&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&lt;!--
$(
        function(){
                $('#btnsend').click(
                        function() {
                                $('#result').html('通信中...');
                                $.ajax({
                                        url: 'yahooJson.php',
                                        type: 'GET',
                                        //cache: false,
                                        dataType: 'json',
                                        data: $('form').serializeArray(),
                                        timeout: 5000,
                                        success: function(data){
                                                var items = data.Result.Item;
                                                $('#result').empty();
//                                              for(var i = 0; i &lt; data.Result.length; i++){
                                                for(var i = 0; i &lt; items.length; i++){
                                                        $('#result').append(
                                                                $('&lt;li&gt;&lt;/li&gt;').append(
                                                                        $('&lt;a&gt;&lt;/a&gt;')
//                                                                              .attr('href', data.Result[i].ClickUrl)
                                                                                .attr('href', items[i].AuctionItemUrl)
//                                                                              .html(data.Result[i].Title)
                                                                                .html(items[i].Title)
                                                                )
                                                        );
                                                }
                                        },
                                        error: function(){
                                                $('#result').html('サーバエラーが発生しました。');
                                        }
                                });
                        }
                );
        }
);
//--&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form&gt;
&lt;label&gt;キーワード：
&lt;input type=&quot;text&quot; name=&quot;keywd&quot; size=&quot;15&quot; /&gt;&lt;/label&gt;
&lt;input type=&quot;button&quot; value=&quot;検索&quot; id=&quot;btnsend&quot; /&gt;
&lt;hr /&gt;
&lt;ul id=&quot;result&quot;&gt;&lt;/ul&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
				
				
				<br />
				※ 個人的にアプリケーションIDは一般公開するべきではないと思うので、以下の getJSON.html は<b>ローカル環境でのみ</b>お試しください。<br />
				
				<pre class="brush: jscript; highlight: [4,11,13,16]; title: getJSON.html; notranslate">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
&lt;title&gt;Yahooオークション検索 jQuery + JSONP版&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&lt;!--
$(function() {
        $('#disp').click(function() {
                $.getJSON(
                        'http://auctions.yahooapis.jp/AuctionWebService/V2/json/search?callback=?',
                        {
                        appid: '■アプリケーションID',
                        query: encodeURIComponent( $('#query').val() ),
                        type : 'all',
                        category: '21600' // 本カテゴリー
                        },
                        function(data) {

                                var attributes = data.ResultSet[&quot;@attributes&quot;]
                                var firstResultPosition   = attributes.firstResultPosition;
                                var totalResultsAvailable = attributes.totalResultsAvailable;
                                var totalResultsReturned  = attributes.totalResultsReturned;

                                var items = data.ResultSet.Result.Item;

                                $('#count_all').html( totalResultsAvailable );
                                $('#count').html( items.length );

                                for (var i = 0; i &lt; items.length ; i++) {

                                        var item = items[i];

                                        $('#result').append(
                                                $('&lt;li&gt;&lt;/li&gt;').append(
                                                        $('&lt;a&gt;&lt;/a&gt;')
                                                                .attr('href', item.AuctionItemUrl)
                                                                .html(item.Title)
                                                )
                                        );
                                }
                        }
                );
        });
});
//--&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form name=&quot;fm&quot;&gt;
&lt;label&gt;検索キーワード ： &lt;input type=&quot;text&quot; id=&quot;query&quot; name=&quot;query&quot; size=&quot;50&quot; value=&quot;&quot; /&gt;&lt;/label&gt;
&lt;input type=&quot;button&quot; id=&quot;disp&quot; value=&quot;検索&quot; /&gt;
&lt;/form&gt;
&lt;hr /&gt;
全&lt;span id=&quot;count_all&quot;&gt;-&lt;/span&gt;件中 &lt;span id=&quot;count&quot;&gt;-&lt;/span&gt;件表示
&lt;ul id=&quot;result&quot;&gt;&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2011/10/book_review_javascript-nuts-and-bolts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webデザイナーの技を磨く『 10日でおぼえる jQuery 入門教室 』</title>
		<link>http://scriptworks.jp/blog/2011/08/book_review_10days_jquery_shool/</link>
		<comments>http://scriptworks.jp/blog/2011/08/book_review_10days_jquery_shool/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 13:38:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=94</guid>
		<description><![CDATA[今回の 書籍レビュー は、すでに Webデザイナー の 必修技能 となりつつある jQuery の 入門書 　『 10日でおぼえる jQuery入門教室 』　 です。 ＃ 対象 jQueryバージョン は 最新 の１.６ [...]]]></description>
			<content:encoded><![CDATA[				<br />
				<a href="http://scriptworks.jp/blog/wp-content/uploads/2011/08/jQuery_10days_School.jpg" title="セミナー でも使われそうな フルカラー の 講義形式テキスト です。" rel="wp-prettyPhoto[g94]">
				<img src="http://scriptworks.jp/blog/wp-content/uploads/2011/08/jQuery_10days_School-300x200.jpg" alt="10日でおぼえる jQuery入門教室" title="10日でおぼえる jQuery入門教室 表紙" width="300" height="200" class="alignnone size-medium wp-image-92" /></a>
				
				<br />
				今回の 書籍レビュー は、すでに Webデザイナー の 必修技能 となりつつある jQuery の <br />
				入門書
				　『 <a href="http://www.amazon.co.jp/gp/product/4798123447/?ie=UTF8&#038;tag=scriptworks-22&#038;linkCode=ur2&#038;camp=247&#038;creative=1211">10日でおぼえる jQuery入門教室</a> 』　
				です。<br />
				＃ 対象 jQueryバージョン は 最新 の１.６系 <br />
				
				<h3>どんな本？</h3>
				
				ひと通りこの 講義形式テキスト を使い込んだ 学習効果 は HTML と CSS の 基本 を理解している方なら、
				あの <a href="http://www.slideshare.net/hayatomizuno/jquery-7665168">ノンプログラマーのためのjQuery入門</a> 
				を サクサク理解 できる レベル まで行けると思います。<br />
				<br />
				他に２冊 jQueryの本 を持っていますが、分かりやすさ という点で 最初に読むべき jQuery本 として オススメ！<br />
				<br />
				学習期間 の 『 １０日間でおぼえる… 』 については、連日の 室温３２度 以上 に 負けて ２０日間 もかかりましたが(汗)<br />
				全４０レッスン の サンプルコード を実際に動かしたので、jQuery の DOM操作 や イベント処理 の 基本 と <a href="http://bakera.jp/ebi/topic/4449">あぶない 落とし穴</a> の 原理 を 知ること ができました。<br />
				
				<h3>全ページカラー の 図解 jQuery</h3>
				
				jQueryメソッド の 効果 を 図解 で 説明 するページが多く、ソースコードさえも 一つの図 のように解説されていて、サイト制作 でよく スクリプト の 作り込み が要求される フォーム回り の 制御 もしっかり学べます。<br />
				<br />
				これから jQuery を使い始める方でも、よくある jQuery入門セミナー に行かずとも良さそうなくらい分かりやすい。<br />
				
				<h3>jQuery で マッシュアップ！？</h3>
				
				<a href="http://developer.yahoo.co.jp/sitemap/">Yahoo API</a> の 動画検索 や ブログ検索 を jQuery単体、もしくは jQuery と PHP を組み合わせて 活用する方法 が解説されています。<br />
				<br />
				レッスンごとに 単一のAPI を解説しているので、複数API を 組み合わせて開発する マッシュアップ の 足がかり として参考になりました。<br />
				
				<h3>自分で jQueryプラグイン を作れる</h3>
				
				すぐに 何か凄い プラグイン ができるわけではありませんが、自分で書いて良く使う処理なら 簡単にプラグイン化 して ストック しておけるようになりました。<br />
				これは便利！<br />
				<br />
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2011/08/book_review_10days_jquery_shool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP Authコンポーネントでパスワード・ハッシュをストレッチングするには？</title>
		<link>http://scriptworks.jp/blog/2011/05/cakephp-auth%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%81%a7%e3%83%91%e3%82%b9%e3%83%af%e3%83%bc%e3%83%89%e3%83%bb%e3%83%8f%e3%83%83%e3%82%b7%e3%83%a5%e3%82%92%e3%82%b9/</link>
		<comments>http://scriptworks.jp/blog/2011/05/cakephp-auth%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%81%a7%e3%83%91%e3%82%b9%e3%83%af%e3%83%bc%e3%83%89%e3%83%bb%e3%83%8f%e3%83%83%e3%82%b7%e3%83%a5%e3%82%92%e3%82%b9/#comments</comments>
		<pubDate>Fri, 27 May 2011 04:08:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=67</guid>
		<description><![CDATA[『 体系的に学ぶ 安全なWebアプリケーションの作り方 』で解説されていたパスワード・ハッシュのストレッチングをCakePHPで実装してみました。　 ストレッチング処理の肝となる部分は書籍に書いてある内容のままですので( [...]]]></description>
			<content:encoded><![CDATA[				『 <a href="http://www.amazon.co.jp/gp/product/4797361190/?ie=UTF8&#038;tag=scriptworks-22&#038;linkCode=ur2&#038;camp=247&#038;creative=1211">体系的に学ぶ 安全なWebアプリケーションの作り方</a> 』で解説されていたパスワード・ハッシュのストレッチングをCakePHPで実装してみました。　
				ストレッチング処理の肝となる部分は書籍に書いてある内容のままですので(汗)、設定方法を簡単に説明します。<br />
				<br />
				
				<strong>【 注意事項 】</strong><br />
				今回実装したStretchAuthコンポーネントの導入にはパスワード( ハッシュ )の再登録が必要です。<br />
				また、運用中のシステムへの導入や導入後の設定変更により、ハッシュ方式やストレッチ回数が異なるパスワードがDBへ登録されますので、必ずDB及びシステムのバックアップを行ってからお試しください。<br />
				<br />
				
				<a href="http://scriptworks.jp/blog/wp-content/uploads/2011/05/WASBOOK.jpg" title="3/11にBK1で注文したけど震災で届かず、物流が回復してから仙台駅前で購入しました。" rel="wp-prettyPhoto[g67]"><img src="http://scriptworks.jp/blog/wp-content/uploads/2011/05/WASBOOK-150x150.jpg" alt="体系的に学ぶ 安全なWebアプリケーションの作り方" title="WASBOOK" width="150" height="150" class="alignnone size-thumbnail wp-image-68" /></a>
				<br />
				<br />
				※ 諸般の事情により、CakePHP-1.2.10 でしか動作確認していませんので 1.3 や 2.0 で動いた方は <a href="http://twitter.com/#!/scriptwork">@scriptwork</a> まで教えて頂けると助かります<br />
				<br />
				それではまず bootstrap.php でパラメーターを設定。
				
				<pre class="brush: php; title: bootstrap.php; notranslate">
define( 'HASH_TYPE',     'sha256' ); // 使用するハッシュ関数の種類
define( 'STRETCH_COUNT', 1000 );     // ハッシュのストレッチング回数
</pre>
				
				HASH_TYPE は 使用するハッシュ関数のアルゴリズムでPHPのhash関数へのパラメーターになります。<br />
				sha1 / sha256 / sha512 など、お使いのサーバー環境に合わせて指定してください。<br />
				※ CakePHP 1.3.9 と 2.0-alpha はデフォルトが sha1 になっていますが、できれば sha256 か sha512 がお薦め<br />
				<br />
				HASH_TYPEの指定によって、生成されるハッシュ値の長さが変わります。<br />
				このため、mysql側もパスワードハッシュを格納するフィールドサイズの調整が必要。<br />
				※ 実際にPHP 5.3.6で生成されたハッシュの長さを見るとsha256で６４バイト、sha512なら１２８バイトでした<br />
				<br />
				STRETCH_COUNT でパスワード文字列に対するハッシュ関数の適用回数を指定。<br />
				ここはサーバー性能とアクセス負荷のバランスによって調整が必要なところですが、とりあえず１０００回で様子見中…<br />
				<br />
				<span id="more-67"></span>
				<br />
				<del>次に今回実装した StretchAuthコンポーネント を使うため app_controller.php で
				$components への登録(1行目) と 既にAuthコンポーネント を使っている場合を考慮して beforeFilter() で
				デフォルトのハッシュアルゴリズムの指定(5行目) と $this->Auth に StretchAuth かぶせます(6行目)</del>。<br />
				↓<br />
				次に今回実装した StretchAuthコンポーネント を使うため app_controller.php で $components に登録します。<br />
				＃ 以前、beforeFilterで行っていた初期化処理は <a href="http://twitter.com/#!/nojimage/status/74078967828721664">@nojimage</a> さんのアドバイスで stretch_auth.php の initialize() へ収容しました。( 情報感謝 )<br />
				<pre class="brush: php; highlight: [1,5,6]; title: app_controller.php; notranslate">
var $components = array( 'StretchAuth' );
</pre>
				<br />
				<br />
				
				StretchAuthコンポーネント( ↓stretch_auth.php )を app/controllers/components へ配置。<br />
				<br />
				コントローラーから使うときの変更点は passwordメソッド(33行目)で新たにユーザー固有のソルトを使用するため、引数に $username を追加しています。　また passwordメソッド の変更に合わせて、hashPasswordsメソッド 側も passwordメソッド を呼び出すときの引数に username を追加(23-24行目)。<br />
				<br />
				40-42行目がストレッチング処理 powerd by WASBOOK！<br />
				<pre class="brush: php; highlight: [9,10,23,24,33,40,41,42]; title: stretch_auth.php; notranslate">
&lt;?php
App::import( 'Component', 'Auth' );

// Authコンポーネントの拡張
class StretchAuthComponent extends AuthComponent {

    // コンポーネント初期化
    function initialize( &amp;$controller ){
        $controller-&gt;Auth =&amp; $this;     // コントローラー側の $this-&gt;Auth をオーバーライド
        Security::setHash( HASH_TYPE ); // デフォルトのハッシュアルゴリズムを設定

        parent::initialize( $controller );
    }

    // ログインフォームからの username と password でハッシュ生成
    function hashPasswords($data) {
        if (is_object($this-&gt;authenticate) &amp;&amp; method_exists($this-&gt;authenticate, 'hashPasswords')) {
            return $this-&gt;authenticate-&gt;hashPasswords($data);
        }

        if (is_array($data) &amp;&amp; isset($data[$this-&gt;userModel])) {
            if (isset($data[$this-&gt;userModel][$this-&gt;fields['username']]) &amp;&amp; isset($data[$this-&gt;userModel][$this-&gt;fields['password']])) {
                $data[$this-&gt;userModel][$this-&gt;fields['password']] = $this-&gt;password($data[$this-&gt;userModel][$this-&gt;fields['password']],
                                                                                     $data[$this-&gt;userModel][$this-&gt;fields['username']]
                    );
            }
        }
        return $data;
    }


    // パスワード・ハッシュ生成( ストレッチング対応版 )
    function password( $password, $username = null ) {

        // ユーザーごとの固有ソルトを設定
        $salt = $username . pack( 'H*', Configure::read('Security.salt') );

        // パスワード・ハッシュのストレッチング処理
        $hash = '';
        for( $i = 0 ; STRETCH_COUNT &gt; $i ; $i++  ){
            $hash = hash( HASH_TYPE, $hash . $password . $salt );
        }

        return $hash;
    }

} // End class
?&gt;
</pre>
				
				<br />
				<br />
				<pre class="brush: php; title: コントローラーでの使用例; notranslate">
$password_hash = $this-&gt;Auth-&gt;password( $raw_password, $username );
</pre>
				以上、コントローラーから使うときは第２引数の $username を忘れずに！<br />
				<br />
				
				<h2>今後は？</h2>
				<br />
				WASBOOK著者の <a href="http://twitter.com/#!/ockeghem/status/74357322721398784">徳丸さん</a> からアドバイス頂き、運用中の ハッシュ方式 と ストレッチング回数 そして ソルト の変更に対応する機能を実装します。<br />
				<br />
				構想としては 障害切り分け や 切り戻し を考慮して、Usersテーブルとは別にPasswordsテーブルを用意してパスワード、ハッシュ方式、ソルトのタイプ、ストレッチ回数を持たせる<a href="http://twitter.com/#!/scriptwork/status/74390858954317824">予定です</a>。<br />
				<br />
				<br />
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2011/05/cakephp-auth%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%81%a7%e3%83%91%e3%82%b9%e3%83%af%e3%83%bc%e3%83%89%e3%83%bb%e3%83%8f%e3%83%83%e3%82%b7%e3%83%a5%e3%82%92%e3%82%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails3 開発手順まとめ本がやってきた。</title>
		<link>http://scriptworks.jp/blog/2011/05/rails3-%e9%96%8b%e7%99%ba%e6%89%8b%e9%a0%86%e3%81%be%e3%81%a8%e3%82%81%e6%9c%ac%e3%81%8c%e3%82%84%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%9f%e3%80%82/</link>
		<comments>http://scriptworks.jp/blog/2011/05/rails3-%e9%96%8b%e7%99%ba%e6%89%8b%e9%a0%86%e3%81%be%e3%81%a8%e3%82%81%e6%9c%ac%e3%81%8c%e3%82%84%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%9f%e3%80%82/#comments</comments>
		<pubDate>Sat, 07 May 2011 08:44:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Rails3]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=59</guid>
		<description><![CDATA[昨年、WEB+DB PRESS( Vol.58 ) で Rails3特集 が組まれた頃は『 実務ベースはまだ Rails2 で 』といった話も聞いたが、リリースから半年以上たってそろそろ Rails3 を導入したいと考え [...]]]></description>
			<content:encoded><![CDATA[				<p>
				昨年、WEB+DB PRESS( Vol.58 ) で <a href="http://gihyo.jp/magazine/wdpress/archive/2010/vol58#toc">Rails3特集</a> が組まれた頃は『 実務ベースはまだ Rails2 で 』といった話も聞いたが、リリースから半年以上たってそろそろ Rails3 を導入したいと考えていた。　そんなおり Twitter で Rails3本 の レビューアー募集 があり申し込んでみたところ、
				『 <a href="http://www.amazon.co.jp/gp/product/4774146633/?ie=UTF8&#038;tag=scriptworks-22&#038;linkCode=ur2&#038;camp=247&#038;creative=1211">Ruby on Rails 3 アプリケーションプログラミング</a> 』という発売前の本が到着！<br />
				日本語で今すぐ Rails3 の開発手順をざざっと読めるのはとても助かります。</p>
				
				
				<a href="http://scriptworks.jp/blog/wp-content/uploads/2011/05/Rail3_Book.jpg" title="全４６３ページの新刊。まず使い込むためにカバーを外すと…" rel="wp-prettyPhoto[g59]"><img src="http://scriptworks.jp/blog/wp-content/uploads/2011/05/Rail3_Book-150x150.jpg" alt="Ruby on Rails 3 アプリケーションプログラミング" title="Rail3_Book" width="150" height="150" class="alignnone size-thumbnail wp-image-58" /></a>
				
				<a href="http://scriptworks.jp/blog/wp-content/uploads/2011/05/Rail3_Book_UnderCover.jpg" title="鮮やかな Ruby Red デザイン。机の上にあるだけで作れそうな気が…" rel="wp-prettyPhoto[g59]"><img src="http://scriptworks.jp/blog/wp-content/uploads/2011/05/Rail3_Book_UnderCover-150x150.jpg" alt="Ruby on Rails 3 アプリケーションプログラミング" title="Rail3_Book_UnderCover" width="150" height="150" class="alignnone size-thumbnail wp-image-57" /></a>
				
				
				<p>
				全体の構成は Rails3 の開発環境を準備する手順から、MVC ごとの新しい開発手順や開発したプログラムのテスト方法がコンパクトに解説されていて、一言でいうと　『  <strong>図解</strong> <a href="http://guides.rubyonrails.org/">Ruby on Rails Guides</a> 』　という感じで、内容も Rails3 の <a href="http://guides.rubyonrails.org/3_0_release_notes.html">リリースノート</a> にある ５つのハイライト のうち４つをカバーしている。<br />
				<ul>
				<li>RESTfulなインターフェイスをともなった新しいルーティング</li>
				<li>手軽になったAction Mailerでのmultipartメッセージ送信方法</li>
				<li>Active Recordのクエリでメソッドチェーンの利用方法と遅延ロード</li>
				<li>控えめなJavaScript と jQueryドライバー( rails.js )の利用方法</li>
				</ul>
				　※ ５つめのハイライトはプロジェクトごとにgem依存関係を管理する <a href="http://gembundler.com/">Bundler</a> 
				ですが今回は解説なし<br />
				<br />
				読み始めて１週間ほどですが図解が豊富で <a href="http://www.wings.msn.to/index.php/-/A-07/978-4-7741-4663-8/">掲載コードのダウンロードサービス</a> もあり、Webで情報を捜し回るよりも この１冊 で楽に Rails3 を使い始められそうです。</p>
				
				<p>
				以下、詳しい目次を掲載。<br />
				<span id="more-59"></span>
				<pre class="brush: plain; highlight: [1,12,39,60,119,178,213,230,244]; title: ; notranslate">
第１章　イントロダクション
    Railsというフレームワーク
		アプリケーションフレームワークとは
		フレームワーク導入の利点
		Rubyで利用可能なフレームワーク
    Railsを利用するための環境設定
		Railsプログラミングに必要なソフトウェア
		Windowsにおける環境設定の手順
		Linuxにおける環境設定の手順
		Windows / Linux 共通の環境設定

第２章　Ruby on Railsの基本
    アプリケーションの作成
    コントローラの基本
		コントローラクラスの作成
		コントローラクラスの基本構文
		ルーティングの基礎を理解する
		サンプルの実行
		補足：コントローラの命名規則
    ビューの基本
		テンプレート変数の設定
		テンプレートファイルの作成
		補足：共通レイアウトの適用
		補足：コメント構文
    モデルの基本
		O/Rマッパーとは？
		データベース接続の設定
		モデルクラスの作成
		マイグレーションファイルによるテーブル作成
		フィクスチャによるテストデータの準備
		補足：データベースクライアントの起動
		データ取得の基本
		補足：アプリケーションの実行環境を指定する
    Rails の設定情報
		主な設定ファイルの配置
		利用可能な主な設定パラメータ
		アプリケーション変数を定義する

第３章　Scaffolding機能によるRails開発の基礎
    Scaffolding機能によるアプリケーション開発
		Scaffolding開発の手順
		自動生成されたルートを確認する
    一覧画面の作成（ indexアクション ）
		indexアクションメソッド
		index.html.erbテンプレート
    詳細画面の作成（ showアクション ）
		showアクションメソッド
		show.html.erbテンプレート
    新規登録画面の作成
		new.html.erbテンプレートファイル
		new / createアクションメソッド
    編集画面の作成（ edit / updateアクション ）
		edit / updateアクションメソッド
		edit.html.erbテンプレートファイル
    削除機能の確認（ destroyアクション ）
    準備：本書で使用するデータベース
		データベースの構造
		データベースの準備

第４章　ビュー開発
    フォーム関連のビューヘルパー
		フォーム生成の基礎
		汎用的なフォームを出力する
		モデル編集のためのフォームを生成する(1)
		モデル編集のためのフォームを生成する(2)
		&lt;input&gt;、&lt;textarea&gt;要素を生成する
		選択ボックス / リストボックスを生成する
		データベースの情報をもとに選択肢を生成する
		選択ボックスの選択肢をグループ化する
		モデルを関連づかない選択ボックスを生成する
		日付／時刻選択のための選択ボックスを生成する
		その他のフォーム系ヘルパー
    文字列／数値関連のビューヘルパー
		改行文字を&lt;p&gt;、&lt;br&gt;タグで置き換える
		文字列を指定行で切り捨てる
		文字列を特定の部分のみを抜粋する
		テキストに自動的にリンクを設置する
		テーブルやリストの背景色をn行おきに変更する
		特定のキーワードをハイライト表示する
		スクリプトブロックの中に出力コードを埋め込む
		文字列をHTMLエスケープする
		文字列からタグを除去する
		文字列を整形する
		数値をさまざまな形式で加工する
		日付データを整形する
    リンク関連のビューヘルパー
		ハイパーリンクを生成する
		ルート定義から動的にURLを生成する
		条件に応じてリンクを生成する
		現在のページの場合はリンクを無効にする
		メールアドレスへのリンクを生成する
    外部リソース指定のためのビューヘルパー
		イメージタグを生成する
		音声、動画をブラウザで再生する
		JavaScriptファイルをインクルードする
		スタイルシートをインクルードする
		ブラウザのフィード検出機能を有効にする
		サイトのFaviconを定義する
		外部リソースのパスを取得する
    その他のビューヘルパー
		構造化データをダンプ出力する
		出力結果を変数に格納する
		本体を持たない任意のタグを生成する
		本体を持つ任意のタグを生成する
    ビューヘルパーの自作
		シンプルなビューヘルパー
		HTML文字列を返すビューヘルパー
		本体を持つビューヘルパー
    アプリケーション共通のデザインを定義する - レイアウト -
		レイアウトを適用するさまざまな方法
		ページ単位にタイトルを変更する
		レイアウトに複数のコンテンツ領域を設置する
		レイアウトを入れ子に配置する
    テンプレートの一部をページ間で共有する - 部分テンプレート -
		部分テンプレートの基本
		部分テンプレートにパラメータを引き渡す
		コレクションに繰り返し部分テンプレートを適用する

第５章　モデル開発
    データ取得の基本 - findメソッド -
		主キー列による検索
		動的ファインダによる検索
    より複雑な条件での検索を行う - クエリメソッド -
		クエリメソッドの基礎
		基本的な条件式を設定する
		プレイスホルダによる条件式の生成
		名前付きパラメータと名前なしパラメータ
		データを並べ替える
		取得列を明示的に指定する
		取得範囲のレコードだけを取得する
		先頭 / 末尾のレコードを取得するには
		データを集計する
		集計結果をもとにデータを絞り込む
    データ取得のためのその他のメソッド
		データの存在を確認する
		よく利用する条件句をあらかじめ準備する
		デフォルトのスコープを定義する
		検索結果の行数を取得する
		特定条件に合致するレコードの平均や最大／最小を求める
		生のSQL命令を直接指定する
    レコードの登録 / 更新 / 削除
		レコードを追加／更新する
		登録 / 更新時に一部のフィールドを保護する
		複数のレコードをまとめて更新する
		レコードを削除する
		複数のレコードをまとめて削除する
		トランザクション処理を実装する
		オプティミスティック同時実行制御
		補足：その他の更新系メソッド
    検証機能の実装
		Active Modelで利用できる検証機能
		検証機能の基本
		その他の検証クラス
		検証クラス共通のパラメータ
		自作検証クラスの定義
    アソシエーションによる複数テーブルの処理
		リレーションシップと命名規則
		参照元テーブルから被参照テーブルの情報にアクセスする
		１：ｎの関係を表現する has_many
		１：１の関係を表現する has_one
		ｍ：ｎの関係を表現する(1) has_and_belongs_to_many
		ｍ：ｎの関係を表現する(2) has_many :through
		アソシエーションによって追加されるメソッド
		アソシエーションで利用できるオプション
    コールバック
		利用可能なコールバックを実行タイミング
		コールバック実装の基本
		コールバックのさまざまな定義方法
    マイグレーション
		マイグレーションのしくみ
		マイグレーションファイルの構造
		マイグレーションファイルの作成
		マイグレーションファイルで利用できる主なメソッド
		マイグレーションファイルの実行
		スキーマファイルによるデータベースの再構築
		データの初期化

第６章　コントローラ開発
    リクエスト情報
		リクエスト情報を取得する
		リクエストヘッダを取得する
		リクエストヘッダやサーバ環境変数を取得するための専用メソッド
		ファイルをアップロードする(1)	ファイルシステムへの保存
		ファイルをアップロードする(2)	データベースへの保存
    レスポンスの操作
		テンプレートファイルを呼び出す
		レスポンスをインラインで設定する
		空のコンテンツを出力する
		処理をリダイレクトする
		ファイルの内容を出力する
		バイナリーデータを出力する
		補足：ログを出力する
    HTML以外のレスポンス処理
		モデルの内容を XML / JSON形式 で出力する
		ERBテンプレートでXML文書を生成する
		応用：Atomフィールドを生成する
    状態管理
		クッキーを取得 / 設定する
		補足：永続化クッキー、署名付きクッキー
		セッションを利用する
		フラッシュを利用する
    フィルタ
		アクションの事前 / 事後に処理を実行する
		アクションの前後で処理を実行する
		フィルタの適用範囲をカスタマイズする
		例：フィルタによる基本認証の実装
		例：フィルタによるフォーム認証の実装
    アプリケーション共通の挙動を定義する - Applicationコントローラ -
		共通フィルタの定義	ログイン機能お実装
		共通的な例外処理をまとめる
		クロスサイトリクエストフォージェリ対策を行う

第７章　ルーティング
    RESTfulインターフェイスとは
		RESTfulインターフェイスを定義する
		単一のリソースを定義する
    RESTfulインターフェイスのカスタマイズ
		ルートパラメータの制約条件
		より複雑な制約条件の設定
		コントローラクラス / Urlヘルパーの名前を修正する
		モジュール配下のコントローラをマッピングする
		RESTfulインターフェイスに自前のアクションを追加する
		RESTfulインターフェイスのアクションを無効化する
		階層構造を持ったリソースを表現する
    非RESTfulなルートの定義
		非RESTfulルートの基本
		matchメソッドによるさまざまなルート表現
		ルートへのマッピングを定義する

第８章　テスト
    テストとは
    テストの準備
		テストデータベースの構築
		テストデータを準備する
    Unitテスト
		Unitテストの基本
		Unitテストの具体例
		テストの準備と後始末
    Functionalテスト
		Functionalテストの基本
		Functionalテストで利用できるAssertionメソッド
    Integrationテスト

第９章　Railsの高度な機能
    電子メールを送信する - Action Mailer -
		Action Mailerを利用する準備
		メール送信の基本
		複数フォーマットでのメール配信
    キャッシュ機能の実装
		ページキャッシュ
		アクションキャッシュ
		フラグメントキャッシュ
		フラグメントキャッシュでのロジックの記述
		補足：アクションキャッシュやフラグメントキャッシュの格納先を変更する
		スイーパーでキャッシュのクリア処理をまとめる
    アプリケーションの国際化対応 - I18n API-
		国際化対応アプリケーションの全体像
		国際化対応の基本的な手順
		ロケールを動的に設定する方法
		辞書ファイルのさまざまな配置と記法
		Rails標準の翻訳情報を追加する
		ビューヘルパー t の各種オプション
    Ajax 開発
		Ajaxの基礎知識
		RailsでjQueryを利用するための準備
		Ajax対応のハイパーリンクを生成する
		補足：更新コンテンツの生成は部分テンプレートで
		Ajax対応のフォームを生成する
		補足：Ajax呼び出しの際に進捗メッセージを表示する
		例：Yahoo!検索Web APIを利用する
    プラグインによるRails の機能拡張
		Railsのプラグイン
		ページング機能を実装する
    Apache＋Passenger への配置
</pre>
				</p>
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2011/05/rails3-%e9%96%8b%e7%99%ba%e6%89%8b%e9%a0%86%e3%81%be%e3%81%a8%e3%82%81%e6%9c%ac%e3%81%8c%e3%82%84%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%9f%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressの設定メモ wp.Vicuna Ext. Custom &amp; SyntaxHighlighter Evolved</title>
		<link>http://scriptworks.jp/blog/2011/04/wordpress%e3%81%ae%e8%aa%bf%e6%95%b4%e3%83%a1%e3%83%a2/</link>
		<comments>http://scriptworks.jp/blog/2011/04/wordpress%e3%81%ae%e8%aa%bf%e6%95%b4%e3%83%a1%e3%83%a2/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 05:12:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://scriptworks.jp/blog/?p=7</guid>
		<description><![CDATA[月日がたつと何をどんな理由で設定したか忘れてしまうので今回設定したThemeとPluginのメモを残しておこう。 WP Theme　：　wp.Vicuna Ext. Custom オリジナルの Vicunaテーマ 1.5 [...]]]></description>
			<content:encoded><![CDATA[				月日がたつと何をどんな理由で設定したか忘れてしまうので今回設定したThemeとPluginのメモを残しておこう。
				
				WP Theme　：　<a href="http://fos.uzusionet.com/wordpress/vicuna">wp.Vicuna Ext. Custom</a>
				<blockquote>
				オリジナルの <a href="http://wp.vicuna.jp/">Vicunaテーマ</a> 1.5.9ベース の カスタマイズ版。
				WordPressのウィジット対応で、管理画面からサイドバーやヘッダー＆フッターのレイアウト設定機能付き。
				</blockquote>
				
				WP Plugin　：　<a href="http://wordpress.org/extend/plugins/syntaxhighlighter/">SyntaxHighlighter Evolved</a>
				<blockquote>
				ソースコードの表示プラグイン
				任意の行番号を指定しハイライト表示が可能。
				同様のプラグインが他にもあるが、表示ソースコードから行番号を含めずにテキストエディターへコピー＆ペーストできるのでコレを選択。
				</blockquote>
				
				<pre class="brush: php; highlight: [5,12]; title: ; notranslate">
    function engine($name = 'File', $settings = array()) {
        $cacheClass = $name . 'Engine';
        $_this =&amp; Cache::getInstance();
        if (!isset($_this-&gt;_Engine[$name])) {
            if ($_this-&gt;__loadEngine($name) === false) {
                return false;
            }
            $_this-&gt;_Engine[$name] =&amp; new $cacheClass();
        }

        if ($_this-&gt;_Engine[$name]-&gt;init($settings)) {
            if (time() % $_this-&gt;_Engine[$name]-&gt;settings['probability'] === 0) {
                $_this-&gt;_Engine[$name]-&gt;gc();
            }
            return true;
        }
        $_this-&gt;_Engine[$name] = null;
        return false;
    }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://scriptworks.jp/blog/2011/04/wordpress%e3%81%ae%e8%aa%bf%e6%95%b4%e3%83%a1%e3%83%a2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

