<?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>candycane development blog &#187; PHP</title>
	<atom:link href="http://blog.candycane.jp/archives/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.candycane.jp</link>
	<description></description>
	<lastBuildDate>Wed, 01 Feb 2012 04:16:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CakePHP開発者によるPHP5.4の紹介資料が素晴らしい</title>
		<link>http://blog.candycane.jp/archives/1272</link>
		<comments>http://blog.candycane.jp/archives/1272#comments</comments>
		<pubDate>Tue, 31 Jan 2012 10:02:20 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP2]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1272</guid>
		<description><![CDATA[PHP 5.4 &#8211; Begin your love affair with traits View more presentations from Graham Weldon CakePHPの開発者の一人であるGraham Weldonさんが公開したPHP5.4についてのスライドがまとまっていてとてもわかりやすいです。&#8221;begin your love affair with traits&#8221;(traitsと恋に落ちよう！)と題されているとおりPHP5.4といえばtraitsなわけですが簡潔なサンプルが付いているのでまだtraitsわからないよという人は必ず目を通しておきましょう。 まだまだPHPの中心は5.2といったところのようです。（CakePHP2はボリュームゾーンである5.2を対象にしているわけですね) これがtraitsを用いたログ処理の実装の例ですね。 スライドには他にも様々な新機能についての紹介が載っています。PHPを書く機会のある方は目を通しておいて損はないと思います。 告知：大阪と福岡でCakePHP2のワークショップを開催します！ 8時間耐久CakePHP2勉強会@大阪 (2/5) http://atnd.org/events/24800 8時間耐久CakePHP2勉強会＠福岡 (2/12) http://atnd.org/events/24868]]></description>
			<content:encoded><![CDATA[<div style="width:425px" id="__ss_10118525"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/predominant/php-54-begin-your-love-affair-with-traits-10118525" title="PHP 5.4 - Begin your love affair with traits" target="_blank">PHP 5.4 &#8211; Begin your love affair with traits</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/10118525" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/predominant" target="_blank">Graham Weldon</a> </div>
</p></div>
<p>CakePHPの開発者の一人であるGraham Weldonさんが公開した<a href="http://www.slideshare.net/predominant/php-54-begin-your-love-affair-with-traits-10118525" target="_blank">PHP5.4についてのスライド</a>がまとまっていてとてもわかりやすいです。&#8221;begin your love affair with traits&#8221;(traitsと恋に落ちよう！)と題されているとおりPHP5.4といえばtraitsなわけですが簡潔なサンプルが付いているのでまだtraitsわからないよという人は必ず目を通しておきましょう。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/php.png"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/php-600x448.png" alt="" title="php" width="600" height="448" class="aligncenter size-medium wp-image-1273" /></a></p>
<p>まだまだPHPの中心は5.2といったところのようです。（CakePHP2はボリュームゾーンである5.2を対象にしているわけですね)</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/php2.png"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/php2-600x451.png" alt="" title="php2" width="600" height="451" class="aligncenter size-medium wp-image-1274" /></a></p>
<p>これがtraitsを用いたログ処理の実装の例ですね。<br />
スライドには他にも様々な新機能についての紹介が載っています。PHPを書く機会のある方は目を通しておいて損はないと思います。</p>
<p><strong style="color:red">告知：大阪と福岡でCakePHP2のワークショップを開催します！</strong></p>
<p>8時間耐久CakePHP2勉強会@大阪 (2/5)<br />
<a href="http://atnd.org/events/24800" target="_blank">http://atnd.org/events/24800</a></p>
<p>8時間耐久CakePHP2勉強会＠福岡 (2/12)<br />
<a href="http://atnd.org/events/24868" target="_blank">http://atnd.org/events/24868</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1272/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Azure + PHPな環境でSymfonyを動かす #symfonyadvent</title>
		<link>http://blog.candycane.jp/archives/1131</link>
		<comments>http://blog.candycane.jp/archives/1131#comments</comments>
		<pubDate>Wed, 21 Dec 2011 15:00:33 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1131</guid>
		<description><![CDATA[このエントリーはSymfonyアドベントカレンダー2011に参加しています。CakePHPの人として知られている私ですがSymfonyも業務では4年以上利用し続けております。今回は22日目担当とWindows Azure + PHPの環境でSymfonyを動かしてみました。いろいろと面倒なところがありそうな予感もしますが、これまでの知識を元に公式のチュートリアルを動かす事を目標にやってみます。 SQLite拡張の有効化 ではWindws Azure PHPプロジェクトを新規に作成し、Symfony2.0.7をダウンロードしたものをソースに取込んで動かしてみます。画面のようにSQLiteの拡張が見つからないというメッセージが表示されます。Azure SDKに同梱されたPHPではSQLiteが有効になっていなかったので、php/php.ini 内のコメントを外し、SQLiteを有効にします。 これでフレームワーク部分は動作していますので、デモ用のバンドルに含まれている画面などは上記のように動作しています。 データベースの接続設定 SQLiteを有効にした事で開発用のブートストラップからダッシュボードにアクセスできます。ここからデータベースの接続設定をしていきますが、残念ながらここにはMySQLやPDO_MSSqlといった選択肢しかありません。もちろんMySQLなどをAzureで動作させればここから設定をすれば問題はありません。とはいえせっかくAzureですからAzureSQLに接続して動かしたいですよね。 AzureSQLに接続するにはmicrosoftから配布されているsqlsrv拡張を導入する必要があります。Azureプロジェクトに同梱されているバージョンに併せた拡張をプロジェクト内にコピーして、これもphp.iniから正しく読み込まれるように設定します。 extension=&#34;php_azure.dll&#34; extension=&#34;php_mysql.dll&#34; extension=&#34;php_sqlsrv_53_nts_vc9.dll&#34; extension=&#34;php_pdo_sqlsrv_53_nts_vc9.dll&#34; またデータベースへの接続設定はダッシュボードからではなく直接設定ファイルを編集して設定します。 [parameters] database_driver = pdo_sqlsrv database_host = YOUR-PC\SQLEXPRESS database_port = database_name = symfony database_user = sa database_password = yourpassword Doctrineの操作 ここまでの設定を行った事でDoctrine経由でのスキーマ操作等が行えます。シェルを実行した際には少しエラーが出てしまいますが、タスクの実行自体に問題はありません。ソースコードの変更を伴うようなタスクを実行した後はプロジェクトを開発ファブリックに再度反映する必要がある点には注意してください。 ここまでの動作確認は開発ファブリック上で行っています。このプロジェクトを本当にデプロイできるかどうかを試してみたいのは山々なのですが、残念ながらAzureのアカウントを持っていません。とはいえsqlsrv拡張を通じてAzure SQLにアクセスできる事は周知されているので問題ないと言って差し支えないでしょう。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアデスク.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアデスク-300x239.jpg" alt="" title="クラウディアデスク" width="300" height="239" class="aligncenter size-medium wp-image-964" /></a></p>
<p>このエントリーは<a href="http://atnd.org/events/22378" target="_blank">Symfonyアドベントカレンダー2011</a>に参加しています。CakePHPの人として知られている私ですがSymfonyも業務では4年以上利用し続けております。今回は22日目担当とWindows Azure + PHPの環境でSymfonyを動かしてみました。いろいろと面倒なところがありそうな予感もしますが、これまでの知識を元に公式のチュートリアルを動かす事を目標にやってみます。</p>
<h3>SQLite拡張の有効化</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure1.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure1-300x138.png" alt="" title="symfony-azure1" width="300" height="138" class="aligncenter size-medium wp-image-1132" /></a><br />
ではWindws Azure PHPプロジェクトを新規に作成し、<a href="http://symfony.com/download" target="_blank">Symfony2.0.7をダウンロードしたもの</a>をソースに取込んで動かしてみます。画面のようにSQLiteの拡張が見つからないというメッセージが表示されます。Azure SDKに同梱されたPHPではSQLiteが有効になっていなかったので、php/php.ini 内のコメントを外し、SQLiteを有効にします。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure3.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure3-300x146.png" alt="" title="symfony-azure3" width="300" height="146" class="aligncenter size-medium wp-image-1134" /></a><br />
これでフレームワーク部分は動作していますので、デモ用のバンドルに含まれている画面などは上記のように動作しています。</p>
<h3>データベースの接続設定</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure2.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure2-300x172.png" alt="" title="symfony-azure2" width="300" height="172" class="aligncenter size-medium wp-image-1133" /></a><br />
SQLiteを有効にした事で開発用のブートストラップからダッシュボードにアクセスできます。ここからデータベースの接続設定をしていきますが、残念ながらここにはMySQLやPDO_MSSqlといった選択肢しかありません。もちろんMySQLなどをAzureで動作させればここから設定をすれば問題はありません。とはいえせっかくAzureですからAzureSQLに接続して動かしたいですよね。<br />
AzureSQLに接続するには<a href="http://www.microsoft.com/download/en/confirmation.aspx?id=20098" target="_blank">microsoftから配布されているsqlsrv拡張</a>を導入する必要があります。Azureプロジェクトに同梱されているバージョンに併せた拡張をプロジェクト内にコピーして、これもphp.iniから正しく読み込まれるように設定します。</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">extension=&quot;php_azure.dll&quot;
extension=&quot;php_mysql.dll&quot;
extension=&quot;php_sqlsrv_53_nts_vc9.dll&quot;
extension=&quot;php_pdo_sqlsrv_53_nts_vc9.dll&quot;</pre></div></div>

<p>またデータベースへの接続設定はダッシュボードからではなく直接設定ファイルを編集して設定します。</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">[parameters]
    database_driver   = pdo_sqlsrv
    database_host     = YOUR-PC\SQLEXPRESS
    database_port     =
    database_name     = symfony
    database_user     = sa
    database_password = yourpassword</pre></div></div>

<h3>Doctrineの操作</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure4.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/12/symfony-azure4-300x218.png" alt="" title="symfony-azure4" width="300" height="218" class="aligncenter size-medium wp-image-1135" /></a><br />
ここまでの設定を行った事でDoctrine経由でのスキーマ操作等が行えます。シェルを実行した際には少しエラーが出てしまいますが、タスクの実行自体に問題はありません。ソースコードの変更を伴うようなタスクを実行した後はプロジェクトを開発ファブリックに再度反映する必要がある点には注意してください。</p>
<p>ここまでの動作確認は開発ファブリック上で行っています。このプロジェクトを本当にデプロイできるかどうかを試してみたいのは山々なのですが、残念ながらAzureのアカウントを持っていません。とはいえ<a href="http://blogs.msdn.com/b/brian_swan/archive/2010/02/12/getting-started-with-php-and-sql-azure.aspx" target="_blank">sqlsrv拡張を通じてAzure SQLにアクセスできる事</a>は周知されているので問題ないと言って差し支えないでしょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1131/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Azure + PHPな環境でAPCを使う(失敗編)</title>
		<link>http://blog.candycane.jp/archives/1046</link>
		<comments>http://blog.candycane.jp/archives/1046#comments</comments>
		<pubDate>Wed, 30 Nov 2011 09:45:59 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1046</guid>
		<description><![CDATA[PHPの動作を高速化させる技術としてはAPCが知られています。スクリプトのコンパイル結果をキャッシュする事で構文解析をスキップすることができ、また任意のデータをキャッシュする事も出来る拡張モジュールです。今回はこのAPCをWindows Azure環境で導入を試みました。 拡張モジュールの入手 理由は不明ですが、APCの拡張モジュールはWindows版PHPにバンドルされていません。AzureのPHPはWindows版のPHPですから、やはり標準では含まれていません。とはいえWindows上でPHPの拡張をビルドするというのはなかなかチャレンジングです。いろいろと調べてみたところ下記のページでWindows用のAPCのバイナリが配布されていました。 http://downloads.php.net/pierre/ Azureに添付されているPHPに適合するのはVC9でビルドされたNon Thread Safeなバイナリですので該当するものをダウンロードして php/ext 以下にコピーし、php.iniからモジュールを読み込みます。 動作確認 さてphp.iniに設定を書きこんだのでphpinfo()にて読み込まれていることを確認してみます。 動作しているようです。がしかし、何度かリロードを繰り返すと、、、 クラッシュしてしまいました。このレベルでクラッシュしてしまうと前述した方法ではログが取れません。気になるのがAzureのローカルファイルに書き込めないという制限に対してAPCのWindows版についている注釈。 注意: Windows 版の APC では、temp パスが存在し、 Web サーバから書き込み可能になっていることが必要です。 APC は環境変数 TMP、TEMP、USERPROFILE の内容をこの順に調べ、 どれも設定されていない場合は WINDOWS ディレクトリを使用します。 該当の環境変数が指しているディレクトリを見てみると下記のような状態。 いくつかファイルは出来ていますがサイズが0です。どうにかしてこの状況を打開したい所ですがログが見れないという問題がある為、そこから考え直す必要がありそうです。現在の予想としてはファイルシステムがらみ（ロックとか）の問題が起きているかAPCとPHPの相性、スレッドセーフなどを疑っていますが果たして。。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディア石.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディア石-209x300.jpg" alt="" title="クラウディア石" width="209" height="300" class="aligncenter size-medium wp-image-1047" /></a></p>
<p>PHPの動作を高速化させる技術としてはAPCが知られています。スクリプトのコンパイル結果をキャッシュする事で構文解析をスキップすることができ、また任意のデータをキャッシュする事も出来る拡張モジュールです。今回はこのAPCをWindows Azure環境で導入を試みました。</p>
<h3>拡張モジュールの入手</h3>
<p>理由は不明ですが、APCの拡張モジュールはWindows版PHPにバンドルされていません。<a href="http://blog.candycane.jp/archives/929" title="Windows Azure + PHPな環境で動いているバイナリは普通のと同じ" target="_blank">AzureのPHPはWindows版のPHP</a>ですから、やはり標準では含まれていません。とはいえWindows上でPHPの拡張をビルドするというのはなかなかチャレンジングです。いろいろと調べてみたところ下記のページでWindows用のAPCのバイナリが配布されていました。</p>
<p><a href="http://downloads.php.net/pierre/" target="_blank">http://downloads.php.net/pierre/</a></p>
<p>Azureに添付されているPHPに適合するのはVC9でビルドされたNon Thread Safeなバイナリですので該当するものをダウンロードして php/ext 以下にコピーし、php.iniからモジュールを読み込みます。</p>
<h3>動作確認</h3>
<p>さてphp.iniに設定を書きこんだのでphpinfo()にて読み込まれていることを確認してみます。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/Image14.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/Image14-300x162.png" alt="" title="Image14" width="300" height="162" class="aligncenter size-medium wp-image-1052" /></a></p>
<p>動作しているようです。がしかし、何度かリロードを繰り返すと、、、</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/Image15.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/Image15-300x148.png" alt="" title="Image15" width="300" height="148" class="aligncenter size-medium wp-image-1055" /></a></p>
<p>クラッシュしてしまいました。このレベルでクラッシュしてしまうと<a href="http://blog.candycane.jp/archives/983" title="Windows Azure + PHPな環境でDiagnosticsを使ってログを記録する" target="_blank">前述した方法</a>ではログが取れません。気になるのがAzureのローカルファイルに書き込めないという制限に対してAPCのWindows版についている注釈。</p>
<blockquote><p>
注意: Windows 版の APC では、temp パスが存在し、 Web サーバから書き込み可能になっていることが必要です。 APC は環境変数 TMP、TEMP、USERPROFILE の内容をこの順に調べ、 どれも設定されていない場合は WINDOWS ディレクトリを使用します。</p></blockquote>
<p>該当の環境変数が指しているディレクトリを見てみると下記のような状態。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/Image12.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/Image12-300x200.png" alt="" title="Image12" width="300" height="200" class="aligncenter size-medium wp-image-1056" /></a></p>
<p>いくつかファイルは出来ていますがサイズが0です。どうにかしてこの状況を打開したい所ですがログが見れないという問題がある為、そこから考え直す必要がありそうです。現在の予想としてはファイルシステムがらみ（ロックとか）の問題が起きているかAPCとPHPの相性、スレッドセーフなどを疑っていますが果たして。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1046/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Azure + PHPな環境でDiagnosticsを使ってログを記録する</title>
		<link>http://blog.candycane.jp/archives/983</link>
		<comments>http://blog.candycane.jp/archives/983#comments</comments>
		<pubDate>Thu, 24 Nov 2011 09:42:01 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=983</guid>
		<description><![CDATA[前回はとりあえずエラーの情報を画面に表示する設定をしてみましたが、今回はエラーの情報を記録できるように設定してみます。インスタンスの再起動の際にディスクの内容が初期化されるAzureではログの情報はAzure Storageに記録する事になります。 Azure 運用時の考慮点 &#124; Tech Fielders コラム Windows Azure のインスタンスにはローカルディスクが用意されていますが、ここに保存されたデータは再起動時にクリアされてしまいます。つまり、永続的なデータについては Azure ストレージの使用を検討し、コンピューティングに関してはあくまで計算やサービスの提供窓口としての機能しか持たせないようにすることをお勧めします。 Azure StorageにアクセスするAPIを使ってログを書く事もできますが、Azure StorageはRESTでアクセスするサービスになっているのでログを一行出力する度にAPIをコールするというような使い方は現実的ではありません。そこでAzureではログなどの情報をトラッキングする為のDiagnostics(診断)という機能を持っています。この機能を有効にする事で任意のログをローカル側で貯めながら随時同期するという仕組みを実現できます。このログの仕組みそのものについてはwaritohutsuさんのブログの記事が詳しいです。 Windows Azure ログ講座第一弾 ～Windows Azure logs～ 上記の記事はC#での実装方法になっていますが、同様の挙動をPHPで試してみます。 Diagnosticsの設定と動作確認 Diagnosticsの設定を行うには新規にプロジェクトを作る際のウィザードの中で設定をするのが最も手軽です。ウィザードで設定した内容を元に各種設定が記述されています。既存のプロジェクトに設定を行う場合は、設定ファイルに該当の記述を追加する事でDiagnosticsを有効にすることができます。 まずはServiceDefinition.csdefのImport設定からDiagnosticsを読み込みます。何もImportしていない場合は開始タグと終了タグが存在していないので該当部分を置き換えてください。 &#60;Imports&#62; &#60;Import moduleName=&#34;Diagnostics&#34;/&#62; &#60;/Imports&#62; 次にServiceConfiguration.cscfg(関係する部分だけ抜粋しています)にログの転送設定などを記述します。今回は開発用ストレージを対象にした設定を記述していますが、クラウド環境のストレージを利用する場合は適切なアカウント情報などに置き換えてください。ログの転送頻度を表すScheduledTransferPeriodInSecondsに有効な値が設定されていないと記録されたログがストレージに転送されなくなるので特に注意が必要です。 &#60;ConfigurationSettings&#62; &#60;Setting name=&#34;StorageAccountName&#34; value=&#34;devstoreaccount1&#34;/&#62; &#60;Setting name=&#34;StorageAccountKey&#34; value=&#34;Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==&#34;/&#62; &#60;Setting name=&#34;UseDevelopmentStorage&#34; value=&#34;true&#34;/&#62; &#60;Setting name=&#34;LogLevel&#34; value=&#34;Error&#34;/&#62; &#60;Setting name=&#34;ScheduledTransferPeriodInSeconds&#34; value=&#34;10&#34;/&#62; &#60;Setting name=&#34;WindowsAzureStorageConnectionString&#34; value=&#34;UseDevelopmentStorage=true&#34;/&#62; &#60;Setting name=&#34;Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString&#34; value=&#34;UseDevelopmentStorage=true&#34;/&#62; &#60;/ConfigurationSettings&#62; 設定に文法エラーが無ければプロジェクトをパッケージして開発ファブリックにデプロイできるはずです。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアデスク.jpg"><img class="aligncenter size-medium wp-image-964" title="クラウディアデスク" src="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアデスク-300x239.jpg" alt="" width="300" height="239" /></a></p>
<p>前回はとりあえず<a href="http://blog.candycane.jp/archives/963" title="Windows Azure + PHPな環境でエラーログを見る方法" target="_blank">エラーの情報を画面に表示する設定</a>をしてみましたが、今回はエラーの情報を記録できるように設定してみます。インスタンスの再起動の際にディスクの内容が初期化されるAzureではログの情報は<strong>Azure Storageに記録する</strong>事になります。</p>
<p><a href="http://www.microsoft.com/japan/powerpro/TF/column/nt_01_2.mspx" target="_blank">Azure 運用時の考慮点 | Tech Fielders コラム</a></p>
<blockquote><p>
Windows Azure のインスタンスにはローカルディスクが用意されていますが、ここに保存されたデータは再起動時にクリアされてしまいます。つまり、永続的なデータについては Azure ストレージの使用を検討し、コンピューティングに関してはあくまで計算やサービスの提供窓口としての機能しか持たせないようにすることをお勧めします。
</p></blockquote>
<p>Azure StorageにアクセスするAPIを使ってログを書く事もできますが、<strong>Azure StorageはRESTでアクセスするサービス</strong>になっているのでログを一行出力する度にAPIをコールするというような使い方は現実的ではありません。そこでAzureではログなどの情報をトラッキングする為の<strong>Diagnostics(診断)</strong>という機能を持っています。この機能を有効にする事で任意のログをローカル側で貯めながら随時同期するという仕組みを実現できます。このログの仕組みそのものについては<a href="http://d.hatena.ne.jp/waritohutsu/20100603/1275586879" target="_blank">waritohutsuさんのブログの記事</a>が詳しいです。</p>
<p><a href="http://d.hatena.ne.jp/waritohutsu/20100603/1275586879" target="_blank">Windows Azure ログ講座第一弾 ～Windows Azure logs～</a><br />
<a href="http://blog.candycane.jp/wp-content/uploads/2011/11/20100604022124.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/20100604022124-300x163.jpg" alt="" title="20100604022124" width="300" height="163" class="aligncenter size-medium wp-image-1023" /></a></p>
<p>上記の記事はC#での実装方法になっていますが、同様の挙動をPHPで試してみます。</p>
<h3>Diagnosticsの設定と動作確認</h3>
<p>Diagnosticsの設定を行うには新規にプロジェクトを作る際のウィザードの中で設定をするのが最も手軽です。ウィザードで設定した内容を元に各種設定が記述されています。既存のプロジェクトに設定を行う場合は、設定ファイルに該当の記述を追加する事でDiagnosticsを有効にすることができます。</p>
<p>まずは<strong>ServiceDefinition.csdef</strong>のImport設定からDiagnosticsを読み込みます。何もImportしていない場合は開始タグと終了タグが存在していないので該当部分を置き換えてください。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Imports<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Import</span> <span style="color: #000066;">moduleName</span>=<span style="color: #ff0000;">&quot;Diagnostics&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Imports<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>次に<strong>ServiceConfiguration.cscfg</strong>(関係する部分だけ抜粋しています)にログの転送設定などを記述します。今回は開発用ストレージを対象にした設定を記述していますが、クラウド環境のストレージを利用する場合は適切なアカウント情報などに置き換えてください。ログの転送頻度を表す<strong>ScheduledTransferPeriodInSeconds</strong>に有効な値が設定されていないと記録されたログがストレージに転送されなくなるので特に注意が必要です。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ConfigurationSettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Setting</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;StorageAccountName&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;devstoreaccount1&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Setting</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;StorageAccountKey&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Setting</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;UseDevelopmentStorage&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Setting</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;LogLevel&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Error&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Setting</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ScheduledTransferPeriodInSeconds&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;10&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Setting</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;WindowsAzureStorageConnectionString&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;UseDevelopmentStorage=true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Setting</span></span>
<span style="color: #009900;">        <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;UseDevelopmentStorage=true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ConfigurationSettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>設定に文法エラーが無ければプロジェクトをパッケージして開発ファブリックにデプロイできるはずです。</p>
<h3>PHPのエラーをDiagnosticsへ流し込む</h3>
<p>では次にPHPからDiagnosticsに対してログ情報を送ってみます。PHPからAzure Logを記録するには<a href="http://phpazurecontrib.codeplex.com/wikipage?title=php_azure.dll&#038;referringTitle=Home" target="_blank">php_azure.dll</a>が提供するazure_log関数を使います。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">azure_log<span style="color: #009900;">&#40;</span>AZURE_LOG_CRITICAL<span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;This is error log.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>実行後にしばらく待つとログがWADLogsTableに記録されます。ログの情報の確認は<a href="http://azurestorageexplorer.codeplex.com/" target="_blank">Azure Storage Explorer</a>が便利です。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/Image9.png"><img class="aligncenter size-medium wp-image-991" title="Image9" src="http://blog.candycane.jp/wp-content/uploads/2011/11/Image9-300x149.png" alt="" width="300" height="149" /></a></p>
<p>次にこの関数を使ってPHPのエラーログをAzure Logに記録してみたいと思います。この為にはPHPのエラーハンドリング機構を使って自作したエラーハンドラーからazure_log関数を呼び出す形になります。これによりPHPから発せられた警告や任意にトリガーしたエラーを記録できるようになります。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> azure_log_handler<span style="color: #009900;">&#40;</span><span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errfile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errline</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$string</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%s</span> <span style="color: #009933; font-weight: bold;">%s</span> <span style="color: #009933; font-weight: bold;">%s</span> <span style="color: #009933; font-weight: bold;">%s</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errfile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errline</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	azure_log<span style="color: #009900;">&#40;</span>AZURE_LOG_CRITICAL<span style="color: #339933;">,</span> <span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">set_error_handler</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;azure_log_handler&quot;</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;PHP ERROR&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/Image10.png"><img class="aligncenter size-medium wp-image-992" title="Image10" src="http://blog.candycane.jp/wp-content/uploads/2011/11/Image10-300x149.png" alt="" width="300" height="149" /></a></p>
<p>ログのフォーマットはのちに検索する事なども考慮して使いやすそうなフォーマットにするとよいでしょう。</p>
<h3>現存するライブラリについて</h3>
<p>上記の方法では自前の実装でDiagnosticsを使っていますが、Azure向けの関数を活用するライブラリとして<a href="http://phpazure.codeplex.com/" target="_blank">Windows Azure SDK for PHP</a>があり、このライブラリにもDiagnosticsのクライアントが含まれています。このクライアントを使う事でパフォーマンスログなどをBlobオブジェクトで記録できます。このライブラリの活用方法については別の機会に紹介しようと思います。</p>
<p><strong style="color:red">Diagnosticsは設定を行ってもそれだけでは何も記録しません。</strong>ウィザードからとりあえず設定をしてみても何も起きていないので機能の存在に気がついていないケースもあるような気がします。なんらかの形でログを記録する処理を実装する必要があるとう点を留意する必要があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/983/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows Azure + PHPな環境でエラーログを見る方法</title>
		<link>http://blog.candycane.jp/archives/963</link>
		<comments>http://blog.candycane.jp/archives/963#comments</comments>
		<pubDate>Thu, 24 Nov 2011 07:40:07 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=963</guid>
		<description><![CDATA[異色のマーケティングで注目を集めているWindows AzureですがPHPの動作環境として真面目に取り組んでみています。今回は開発時に必ず必要になるログの確認方法を見てみようと思います。 Azure上のPHPの正体はFastCGIで動作するWindows上のPHPですが、FATALエラーなどが発生した場合は下記のようなエラー画面が表示されます。 詳細なエラー情報が無い為、エラーへの対処が難しいです。この場合、通常の環境であればログファイルを確認する事になります。ですがAzureの場合は永続化されるファイルストレージは通常では存在しないのでエラーログを出力しないように設定されています。この問題への根本的な対処は別にするとして、ひとまず画面へのエラー表示を行うように設定を変えます。 エラーを詳細に表示するにはWEBロールのプロジェクト内にあるWeb.configの&#60;system.webServer&#62;の中に下記のノードを追加します。(ペースト時にダブルクオートが全角に化けないように注意してください) &#60;httpErrors errorMode="Detailed"/&#62; この設定を行えば下記のようにFATALエラーの内容が画面に表示されます。 開発時はこの状態でよいですが、本番環境にこの設定をデプロイしないように注意してください。ログを記録する方法については別途記事にします。 元ネタは英語の記事から引用しました。 Launching My PHP Application On Azure: Take One]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアデスク.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアデスク-300x239.jpg" alt="" title="クラウディアデスク" width="300" height="239" class="aligncenter size-medium wp-image-964" /></a></p>
<p><a href="http://www.forest.impress.co.jp/docs/news/20111121_492756.html" target="_blank">異色のマーケティング</a>で注目を集めているWindows AzureですがPHPの動作環境として真面目に取り組んでみています。今回は開発時に必ず必要になるログの確認方法を見てみようと思います。</p>
<p>Azure上のPHPの正体は<a href="http://blog.candycane.jp/archives/929" title="Windows Azureで動いているPHPのバイナリは普通のと同じ" target="_blank">FastCGIで動作するWindows上のPHP</a>ですが、FATALエラーなどが発生した場合は下記のようなエラー画面が表示されます。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/500.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/500-300x86.png" alt="" title="500" width="300" height="86" class="aligncenter size-medium wp-image-966" /></a></p>
<p>詳細なエラー情報が無い為、エラーへの対処が難しいです。この場合、通常の環境であればログファイルを確認する事になります。ですがAzureの場合は永続化されるファイルストレージは通常では存在しないので<strong>エラーログを出力しないように設定されています</strong>。この問題への根本的な対処は別にするとして、ひとまず画面へのエラー表示を行うように設定を変えます。</p>
<p>エラーを詳細に表示するにはWEBロールのプロジェクト内にあるWeb.configの&lt;system.webServer&gt;の中に下記のノードを追加します。<strong style="color:red">(ペースト時にダブルクオートが全角に化けないように注意してください)</strong><br />
<code><br />
 &lt;httpErrors errorMode="Detailed"/&gt;<br />
</code><br />
この設定を行えば下記のようにFATALエラーの内容が画面に表示されます。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/error.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/error-300x18.png" alt="" title="error" width="300" height="18" class="aligncenter size-medium wp-image-967" /></a></p>
<p>開発時はこの状態でよいですが、<strong style="color:red">本番環境にこの設定をデプロイしないように注意してください。</strong>ログを記録する方法については別途記事にします。</p>
<p>元ネタは英語の記事から引用しました。<br />
<a href="http://www.ben-waine.co.uk/blog/php-azure/launching-my-php-application-on-azure-take-one.php" target="_blank">Launching My PHP Application On Azure: Take One</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/963/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows Azure + PHPな環境で動いているバイナリは普通のと同じ</title>
		<link>http://blog.candycane.jp/archives/929</link>
		<comments>http://blog.candycane.jp/archives/929#comments</comments>
		<pubDate>Wed, 16 Nov 2011 08:57:43 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=929</guid>
		<description><![CDATA[Windows Azure上でPHPを動かしてみています。SDKからそのまま作ったプロジェクトの場合、PHPのバージョンは5.3.4になっており、これをアップデートする方法を調べたのでメモ。 Windows Azure PHPの正体 Windows Azure PHPプロジェクトとしてプロジェクトを作った場合、プロジェクト内のphpというディレクトリの配下にWindows版のPHPのバイナリとおぼしきファイル群が自動的にコピーされる。このPHPはAzure SDKに同梱されていると思われるPHPかシステムにインストール済みのPHPのいずれかから選択してコピーする。またビルド日時から見て、通常配布されているWindows版PHPと同一とみなしてよさそうだ。 プロジェクトに同梱されたPHPはそのままデプロイ用のcspkg形式のパッケージに同梱されてAzure環境上にデプロイされる。 このPHPの導入は単純なコピーだけではなく、Azure Storageなどへのアクセスを実現するためのphp_azure.dll の導入も合わせて行っている。これに伴って php/php.ini には下記の記述が挿入されている。 extension="php_azure.dll" phpinfo()の出力内容をみるとこのPHPはWindows版の非スレッドセーフ版PHPをVC9でビルドしたものであることが分かる。xDebugのようなExtensionなどを導入する際にはこれを前提として取り扱えばよさそうだ。 PHP Version 5.3.4 Build Date Dec 9 2010 22:17:30 Compiler MSVC9 (Visual C++ 2008) Architecture x86 Configure Command cscript /nologo configure.js "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--disable-isapi" "--disable-nsapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--with-enchant=shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" Server API [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアななめ3.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/クラウディアななめ3-264x300.jpg" alt="" title="クラウディアななめ3" width="264" height="300" class="aligncenter size-medium wp-image-978" /></a></p>
<p>Windows Azure上でPHPを動かしてみています。SDKからそのまま作ったプロジェクトの場合、PHPのバージョンは5.3.4になっており、これをアップデートする方法を調べたのでメモ。</p>
<h3>Windows Azure PHPの正体</h3>
<p>Windows Azure PHPプロジェクトとしてプロジェクトを作った場合、プロジェクト内のphpというディレクトリの配下にWindows版のPHPのバイナリとおぼしきファイル群が自動的にコピーされる。このPHPはAzure SDKに同梱されていると思われるPHPかシステムにインストール済みのPHPのいずれかから選択してコピーする。またビルド日時から見て、<a href="http://windows.php.net/download/" target="_blank">通常配布されているWindows版PHP</a>と同一とみなしてよさそうだ。<br />
プロジェクトに同梱されたPHPはそのままデプロイ用のcspkg形式のパッケージに同梱されてAzure環境上にデプロイされる。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/11/Image4.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/Image4-300x53.png" alt="" title="Image4" width="300" height="53" class="aligncenter size-medium wp-image-930" /></a></p>
<p>このPHPの導入は単純なコピーだけではなく、Azure Storageなどへのアクセスを実現するためのphp_azure.dll の導入も合わせて行っている。これに伴って php/php.ini には下記の記述が挿入されている。</p>
<pre style="background:#EEE;overflow:auto">
extension="php_azure.dll"
</pre>
<p>phpinfo()の出力内容をみるとこのPHPはWindows版の非スレッドセーフ版PHPをVC9でビルドしたものであることが分かる。xDebugのようなExtensionなどを導入する際にはこれを前提として取り扱えばよさそうだ。</p>
<pre style="background:#EEE;overflow:auto">
PHP Version 5.3.4
Build Date  Dec 9 2010 22:17:30
Compiler  MSVC9 (Visual C++ 2008)
Architecture  x86
Configure Command  cscript /nologo configure.js "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--disable-isapi" "--disable-nsapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--with-enchant=shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static"
Server API  CGI/FastCGI
Virtual Directory Support  disabled
Configuration File (php.ini) Path  C:\Windows
Scan this dir for additional .ini files  (none)
Additional .ini files parsed  (none)
PHP API  20090626
PHP Extension  20090626
Zend Extension  220090626
Zend Extension Build  API220090626,NTS,VC9
PHP Extension Build  API20090626,NTS,VC9
Debug Build  no
Thread Safety  disabled
Zend Memory Manager  enabled
Zend Multibyte Support  disabled
IPv6 Support  enabled
Registered PHP Streams  php, file, glob, data, http, ftp, zip, compress.zlib, phar
Registered Stream Socket Transports  tcp, udp
Registered Stream Filters  convert.iconv.*, mcrypt.*, mdecrypt.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, zlib.*
</pre>
<h3>プロジェクトに同梱されたPHPのアップデート</h3>
<p>PHPのバージョンを上げる場合、該当のバイナリファイルを上書きする事でアップデートを行える。まずは利用したいバージョンの<strong>非スレッドセーフ版Windows版PHP</strong>をダウンロードしてくる。ダウンロードする際はインストーラー版ではなくZIPアーカイブをダウンロードしてファイルを展開する。次に展開したファイルをプロジェクト内のphpディレクトリに上書きしていく。この際にphpディレクトリごと上書きしてしまうとphp.iniが書き変わってしまう為、下記のファイルを個別に差し替える。</p>
<pre style="background:#EEE;overflow:auto">
php/php-cgi.exe
php/php5.dll
php/php.exe (ユニットテストなどで使っているなら)
ext/ (APIの互換が保たれているバージョンであれば更新しなくても大丈夫)
</pre>
<p>開発ファブリックで動作確認してみたところ、最新のPHPが動作している事が確認できた。同様の手順でパッチを当ててビルドしたPHPのバイナリを動作させることもできるかもしれない。<br />
<a href="http://blog.candycane.jp/wp-content/uploads/2011/11/Image7.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/11/Image7-300x110.png" alt="" title="Image7" width="300" height="110" class="aligncenter size-medium wp-image-941" /></a></p>
<p>※Windows版PHPにあまり詳しくないので正しい知識をお持ちの方がいればお知らせください。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/929/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHPをDisってアクセス増は3日間&amp;WPのアクセス解析はJetpack</title>
		<link>http://blog.candycane.jp/archives/632</link>
		<comments>http://blog.candycane.jp/archives/632#comments</comments>
		<pubDate>Mon, 25 Apr 2011 01:59:56 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[candycane]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=632</guid>
		<description><![CDATA[前々回のエントリはお陰様でホットエントリに入る事ができました。PHPをdisるともれなくアクセスが伸びるという現象が過去にもさまざまなブログで観測されていますが、その現象を再確認する事が出来ました。なお上記の画像を見ると分かりますがこのアクセス数増加の効果は３日で無くなりました。アクセス数を伸ばしたいブロガーの方は3日おきにPHPをdisってみるといいのかもしれません。 そんなネタエントリの何倍も頑張っているcandycaneのエントリは全くアクセスが伸びていないのが残念です。 それはさておき今回はWordPress用のJetpackプラグインが提供するアクセス解析の機能がとても便利に感じました。スクリーンショットにもあるようなわかりやすいアクセス解析グラフがほぼリアルタイムでダッシュボードに表示されます。似たようなアクセス解析ではGoogleAnalyticsがありますが、結果の反映が素早かったのでもうこれからはGoogle Analyticsを見る頻度が少なくなっていきそうです。 最近のアップデートで自分のブログにログインする表示されるツールバーの中にもアクセス数のグラフが分かりやすく表示されます。（これで何事かが起きているのに気づいたらダッシュボードで詳細が見れるという事ですね） ダッシュボード内ではリファラ解析や、エントリ中のリンクの何処がクリックされたのかというった情報がこれもほぼリアルタイムで閲覧できます。 Jetpackには他にもURLをツイッターやFacebookで共有するボタンを表示する機能とか色々な機能が入っていますが、WordPressを使っている方はインストールしてみて損は無いプラグインではないかと。っていうかアクセス数がリアルタイムで見れるのは気持ちが盛り上がるので楽しかったです。ありがとうJetpack。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/04/jetpack1.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/04/jetpack1.png" alt="" title="jetpack1" width="498" height="400" class="aligncenter size-full wp-image-633" /></a></p>
<p>前々回のエントリはお陰様で<a href="http://b.hatena.ne.jp/entry/blog.candycane.jp/archives/599">ホットエントリに入る事ができました</a>。PHPをdisるともれなくアクセスが伸びるという現象が過去にもさまざまなブログで観測されていますが、その現象を再確認する事が出来ました。なお上記の画像を見ると分かりますがこのアクセス数増加の効果は３日で無くなりました。アクセス数を伸ばしたいブロガーの方は3日おきにPHPをdisってみるといいのかもしれません。<br />
そんなネタエントリの<a href="http://blog.candycane.jp/archives/624">何倍も頑張っているcandycaneのエントリ</a>は全くアクセスが伸びていないのが残念です。</p>
<p>それはさておき今回はWordPress用の<a href="http://jetpack.me/">Jetpackプラグイン</a>が提供するアクセス解析の機能がとても便利に感じました。スクリーンショットにもあるようなわかりやすいアクセス解析グラフがほぼリアルタイムでダッシュボードに表示されます。似たようなアクセス解析ではGoogleAnalyticsがありますが、結果の反映が素早かったのでもうこれからはGoogle Analyticsを見る頻度が少なくなっていきそうです。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/04/jetpack2.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/04/jetpack2.png" alt="" title="jetpack2" width="573" height="138" class="aligncenter size-full wp-image-634" /></a><br />
最近のアップデートで自分のブログにログインする表示されるツールバーの中にもアクセス数のグラフが分かりやすく表示されます。（これで何事かが起きているのに気づいたらダッシュボードで詳細が見れるという事ですね）</p>
<p>ダッシュボード内ではリファラ解析や、エントリ中のリンクの何処がクリックされたのかというった情報がこれもほぼリアルタイムで閲覧できます。<br />
<a href="http://blog.candycane.jp/wp-content/uploads/2011/04/jetpack3.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/04/jetpack3-300x165.png" alt="" title="jetpack3" width="300" height="165" class="aligncenter size-medium wp-image-635" /></a></p>
<p>Jetpackには他にもURLをツイッターやFacebookで共有するボタンを表示する機能とか色々な機能が入っていますが、WordPressを使っている方はインストールしてみて損は無いプラグインではないかと。っていうかアクセス数がリアルタイムで見れるのは気持ちが盛り上がるので楽しかったです。ありがとうJetpack。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/632/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPプロジェクトの80-90％は巨大なクソの山であるという事実</title>
		<link>http://blog.candycane.jp/archives/599</link>
		<comments>http://blog.candycane.jp/archives/599#comments</comments>
		<pubDate>Wed, 20 Apr 2011 03:14:09 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[和訳]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=599</guid>
		<description><![CDATA[面白いエントリを見つけたので和訳しました。PHPが使われていた歴史が古い事や開発者のコミュニティの観点から見たPHP論。読みやすいので早速どうぞ。 なお画像は「各プログラム言語からは各言語オタクがどう見えるか？」です。 原文 Why PHP Was a Ghetto http://codefury.net/2011/04/why-php-was-a-ghetto/ なぜPHPはゲットーだったのか ダンボ地区のかなりクールなス​​タートアップの創始者と私は世の中の多くのPHPの開発者でない人たちがPHPとその周囲のコミュニティを軽蔑するのかについて話す機会があった。彼はとても興味深い点に言及した事が私の印象に残った。なぜなら私はこれまで聞いた事がない指摘だったからだ。 お気づきかもしれないが、開発者がPHPに対して通常抱く不満は、だいたい以下の通りである： 醜い構文 他の言語が備えているいくつかの必要な機能の欠如は（5.3以前における名​​前空間、クロージャ） 一貫性のない関数の名前、使用法、およびその他の奇行 手続き型とオブジェクト指向欠如のミックス PHPプロジェクトの80-90％は、おそらく巨大なクソの山であるという事実 しかし、彼にとってのPHPの問題は少し違っていたようだ。彼は、言語自体が悪いのではなく- 象徴となっている言語の創始者によって悪いプラクティスが推奨されているように見える言語を取り巻く文化が問題だと指摘した。PHPのコードベースには、魔術的でメンテナンス性が低くなりがちである。 言語やフレームワークを取り巻くコンセプトは作者の哲学が真実であるという事を具現化する。彼はRubyとMatzを例に挙げた 。Matzは読みやすくおよび書きやすい言語、および強化されたプログラマの生産性を望んでいた。Rubyの開発者は迅速なアプリケーション開発とその言語の優雅さに共鳴しているように見えないだろうか？ その後、 DHHとRailsが登場し、 GuidoとPythonが続いた。私は考えた：ではRasmusはどうだろう？ Rasmus Lerdorfは興味深い人物だ。彼はPHPのオリジナルのバージョンを作り、貢献をし続けた事でコミュニティでは神とされPHPに関するほぼ全ての権威と見られている。彼はカンファレンスの聴講者の別の講演者から奪取し 、 巨大なインターネットサイトに雇用された。ほとんどの非PHP開発者がPHPを嫌悪しているという事実にも関わらず彼は敬意を集めた。 Rasmusはフレームワークを使うのでなく、テンプレート言語としてPHPを使う事を推奨しているようだ。彼にとっては、これは生のPHPの速度とスケーラビリティという事だが、他の全ての人々には、手続き型スパゲッティコードの山、メンテナンス困難なプロジェクトを作る事であるという風に理解される事になる。1995年にPHPの誕生から約10年の間、PHPのプロジェクトはこのように書かれて来た。 また別の問題にも言及した：ピザ顔の思春期の頃（5.0以前）、PHPは初心者の間で強く支持されていく。文法は素晴らしく敷居が低く誰でも*ampかwindows用のバイナリをダウンロードすれば2分で使い始める事ができる。と。またMVCパラダイムは、この時点ではWeb開発にはまだ多く見られなかった。初心者とベストプラクティスの欠如が合わさるとどうなるか？維持不可能なゴミ。そして、それが増殖する。 誤解しないで頂きたい。いくつかの素晴らしいPHP開発者は存在していた。しかし周囲は濾過されていない初心者のソースだらけだった。カウボーイPHP開発者達が何の規約も無しにプロ​​ジェクトを行えば、それはphpBBや、PHPNuke、またはPHP3のファイルの節くれだったマッシュアップのようになった。しかし、あなたはPHP開発者だけを非難することができるだろうか？いいえ! 他のWeb言語の巨人達、ASPやPerlも地獄のようなスパゲッティコードの促進に加わっていた。 なぜPHPは、いわれのない非難を受けるのだろう？それは過去の遺産によるものだ。最古のPHP開発者達はPython、Rubyに逃亡した。そしてJavaはMVCの導入以前のWEB開発で何が起きていたかを知らない。超辛口の批評家でRuby野郎のZed Shawは”PHP脳(PHP Infected Brain)の開発者”の恐怖を訴えRubyInsideでこのようなもの(訳注:上部の画像と同じもの)を発表した 。 PHPはゲットーだった。 しかし、ZendとCodeIgniterのようなフレームワークの開発は大幅に正しい方向に言語発達を後押ししている。だがそれはRasmusは望んでいるのとは逆方向に向かっているである。ZendかCodeIgniterのフレームワークをチェックアウトし、ドキュメントが無く、よく書かれていないコードが一部でもあれば教えて欲しい。 ほとんどの開発者がRubyを知ったとき、彼らは同時にRailsとMVCを学んでいた。PHPは、その以前の10年間の間使われてきた。つまり(Rubyには)初心者によって凶悪なRubyが書かれていた期間は存在していない。Railsのために設立された規約があり、経験の少ない開発者を締め出すのに充分に敷居が高かった。 事実として、PHPアプリケーションは他の言語のように奇麗に記述する事が可能で、なおかつ速度の面でアドバンテージをおそらく持っている。PHPの世界でのMVCスタイルの開発の普及は、比較的最近の現象であり、それはおそらくRailsのおかげだ。 PHPが現在、備えているものはなんだろう？ 規約（一般的なほとんどのプロジェクトのためのMVCテイストと少し手続き的ながらくた） 非常に低い参入障壁 速度とスケーラビリティ（おそらく最高のスクリプトベースの言語の中で） 偉大な単体テストフレームワーク 任意の言語のためのおそらく最良のドキュメント さらにインターネットで最も影響力のあるWebサイトやツールでPHPは採用されている、FacebookやDigg、ウィキペディア、WordPress、Drupalなど、彼らは間違いなく他の多くの人々よりも確かな見識を持っている。 あなたは上記に同意しない場合は、この記事のコメント欄か、私にメールで &#8211; あなたはそうは思わない理由を聞きたいと思います。 私はPHPのおたくではない &#8211; 実際、私は非常に言語に対して懐疑論だ。私はPHPをよく書く。お分かりだろうが、それで金銭を得ている。だから、すべて、このようになる： あなたは賢明なソフトウェア設計の決定を行う場合、PHPはWebアプリケーションを構築するために優れた選択肢です。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/04/pG3q7.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2011/04/pG3q7-300x196.jpg" alt="" title="pG3q7" width="300" height="196" class="aligncenter size-medium wp-image-600" /></a></p>
<p>面白いエントリを見つけたので和訳しました。PHPが使われていた歴史が古い事や開発者のコミュニティの観点から見たPHP論。読みやすいので早速どうぞ。<br />
なお画像は「各プログラム言語からは各言語オタクがどう見えるか？」です。</p>
<h3>原文 Why PHP Was a Ghetto</h3>
<p><a href="http://codefury.net/2011/04/why-php-was-a-ghetto/">http://codefury.net/2011/04/why-php-was-a-ghetto/</a></p>
<h2>なぜPHPはゲットーだったのか</h2>
<p><a href="http://dumbonyc.com/">ダンボ地区</a>の<a href="http://www.saaspire.com/">かなりクールなス​​タートアップ</a>の創始者と私は世の中の多くのPHPの開発者でない人たちがPHPとその周囲のコミュニティを軽蔑するのかについて話す機会があった。彼はとても興味深い点に言及した事が私の印象に残った。なぜなら私はこれまで聞いた事がない指摘だったからだ。</p>
<p>お気づきかもしれないが、開発者がPHPに対して通常抱く不満は、だいたい以下の通りである：</p>
<ol>
<li>醜い構文</li>
<li>他の言語が備えているいくつかの必要な機能の欠如は（5.3以前における名​​前空間、クロージャ）</li>
<li>一貫性のない関数の名前、使用法、およびその他の奇行</li>
<li>手続き型とオブジェクト指向欠如のミックス</li>
<li>PHPプロジェクトの80-90％は、おそらく巨大なクソの山であるという事実</li>
</ol>
<p>しかし、彼にとってのPHPの問題は少し違っていたようだ。彼は、言語自体が悪いのではなく- 象徴となっている言語の創始者によって悪いプラクティスが推奨されているように見える言語を取り巻く文化が問題だと指摘した。PHPのコードベースには、魔術的でメンテナンス性が低くなりがちである。</p>
<p>言語やフレームワークを取り巻くコンセプトは作者の哲学が真実であるという事を具現化する。彼はRubyと<a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto">Matz</a>を例に挙げた 。Matzは読みやすくおよび書きやすい言語、および強化されたプログラマの生産性を望んでいた。Rubyの開発者は迅速なアプリケーション開発とその言語の優雅さに共鳴しているように見えないだろうか？</p>
<p>その後、 <a href="http://en.wikipedia.org/wiki/David_Heinemeier_Hansson">DHH</a>とRailsが登場し、 <a href="http://www.python.org/~guido/">Guido</a>とPythonが続いた。私は考えた：では<a href="http://en.wikipedia.org/wiki/Rasmus_Lerdorf">Rasmus</a>はどうだろう？</p>
<p>Rasmus Lerdorfは興味深い人物だ。彼はPHPのオリジナルのバージョンを作り、貢献をし続けた事でコミュニティでは神とされPHPに関するほぼ全ての権威と見られている。彼は<a href="http://www.urbandictionary.com/define.php?term=rasmussed">カンファレンスの聴講者の別の講演者から奪取し</a> 、 <a href="http://yahoo.com">巨大なインターネットサイトに雇用された。</a>ほとんどの非PHP開発者がPHPを嫌悪しているという事実にも関わらず彼は敬意を集めた。</p>
<p>Rasmusはフレームワークを使うのでなく、テンプレート言語としてPHPを使う事を推奨しているようだ。彼にとっては、これは生のPHPの速度とスケーラビリティという事だが、他の全ての人々には、手続き型スパゲッティコードの山、メンテナンス困難なプロジェクトを作る事であるという風に理解される事になる。1995年にPHPの誕生から約10年の間、PHPのプロジェクトはこのように書かれて来た。</p>
<p>また別の問題にも言及した：ピザ顔の思春期の頃（5.0以前）、PHPは初心者の間で強く支持されていく。文法は素晴らしく敷居が低く誰でも*ampかwindows用のバイナリをダウンロードすれば2分で使い始める事ができる。と。またMVCパラダイムは、この時点ではWeb開発にはまだ多く見られなかった。初心者とベストプラクティスの欠如が合わさるとどうなるか？維持不可能なゴミ。そして、それが増殖する。</p>
<p> 誤解しないで頂きたい。いくつかの素晴らしいPHP開発者は存在していた。しかし周囲は濾過されていない初心者のソースだらけだった。カウボーイPHP開発者達が何の規約も無しにプロ​​ジェクトを行えば、それはphpBBや、PHPNuke、またはPHP3のファイルの節くれだったマッシュアップのようになった。しかし、あなたはPHP開発者だけを非難することができるだろうか？いいえ! 他のWeb言語の巨人達、ASPやPerlも地獄のようなスパゲッティコードの促進に加わっていた。</p>
<p>なぜPHPは、いわれのない非難を受けるのだろう？それは過去の遺産によるものだ。最古のPHP開発者達はPython、Rubyに逃亡した。そしてJavaはMVCの導入以前のWEB開発で何が起きていたかを知らない。超辛口の批評家でRuby野郎のZed Shawは”PHP脳(PHP Infected Brain)の開発者”の恐怖を訴え<a href="http://www.rubyinside.com/holiday-fun-how-programming-language-fanboys-see-each-others-languages-2911.html">RubyInsideでこのようなもの(訳注:上部の画像と同じもの)を発表した</a> 。</p>
<p>
<h3>PHPはゲットーだった。</h3>
</p>
<p>しかし、ZendとCodeIgniterのようなフレームワークの開発は大幅に正しい方向に言語発達を後押ししている。だがそれはRasmusは望んでいるのとは<em>逆方向</em>に向かっているである。ZendかCodeIgniterのフレームワークをチェックアウトし、ドキュメントが無く、よく書かれていないコードが一部でもあれば教えて欲しい。</p>
<p>ほとんどの開発者がRubyを知ったとき、彼らは同時にRailsとMVCを学んでいた。PHPは、その以前の10年間の間使われてきた。つまり(Rubyには)初心者によって凶悪なRubyが書かれていた期間は存在していない。Railsのために設立された規約があり、経験の少ない開発者を締め出すのに充分に敷居が高かった。</p>
<p>事実として、PHPアプリケーションは他の言語のように奇麗に記述する事が可能で、なおかつ速度の面でアドバンテージをおそらく持っている。PHPの世界でのMVCスタイルの開発の普及は、比較的最近の現象であり、それはおそらくRailsのおかげだ。</p>
<p>PHPが現在、備えているものはなんだろう？</p>
<ol>
<li>規約（一般的なほとんどのプロジェクトのためのMVCテイストと少し手続き的ながらくた）</li>
<li>非常に低い参入障壁</li>
<li>速度とスケーラビリティ（おそらく最高のスクリプトベースの言語の中で）</li>
<li>偉大な単体テストフレームワーク</li>
<li>任意の言語のためのおそらく最良のドキュメント</li>
</ol>
<p>さらにインターネットで最も影響力のあるWebサイトやツールでPHPは採用されている、FacebookやDigg、ウィキペディア、WordPress、Drupalなど、彼らは間違いなく他の多くの人々よりも確かな見識を持っている。</p>
<p>あなたは上記に同意しない場合は、この記事のコメント欄か、私にメールで &#8211; あなたはそうは思わない理由を聞きたいと思います。</p>
<p>私はPHPのおたくではない &#8211; 実際、私は非常に言語に対して懐疑論だ。私はPHPをよく書く。お分かりだろうが、それで金銭を得ている。だから、すべて、このようになる：</p>
<p><em>あなたは賢明なソフトウェア設計の決定を行う場合、PHPはWebアプリケーションを構築するために優れた選択肢です。</em><br /><em> </em></p>
<p>ちなみに、私はちょうどHPの次のWebアプリケーションを構築する為にCodeIgniterをチェックアウトしたところだ。<a href="http://codeigniter.com">PHPのための魔法のようで、超高速フレームワーク</a> 。CodeIgniterのことになると、私はミーハーです。</p>
<p>&#8212; 翻訳ここまで</p>
<p>確かにラスマスは各カンファレンスでフレームワークの有効性や速度に対して懐疑的な姿勢を示しています。それにしても&#8221;PHP infected brain&#8221;なんてPHP脳の恐怖といって良い言葉が英語でもあったとはねぇ。。。「ゲットー」という言葉が日本語としては象徴的な意味が薄いのでタイトルは箇条書きから抜粋しました。<br />
ちょうどこんなつぶやきでラスマスさんも反論。アンチフレームワークというわけではなく、適切に使えという主義のようです。</p>
<p><!-- tweet id : 60549434743857153 --><br />
<style type='text/css'>#bbpBox_60549434743857153 a { text-decoration:none; color:#2FC2EF; }#bbpBox_60549434743857153 a:hover { text-decoration:underline; }</style>
<div id='bbpBox_60549434743857153' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#1A1B1F; background-image:url(http://a3.twimg.com/a/1302214109/images/themes/theme9/bg.gif); background-repeat:no-repeat'>
<div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#666666; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>Just for the record, I am not anti-frameworks just anti the indiscriminate use of frameworks and the inefficiencies that often brings. <a href="http://twitter.com/search?q=%23php" title="#php">#php</a></span>
<div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://blog.candycane.jp/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on 2011年4月20日 12:44 PM' href='http://twitter.com/#!/rasmus/status/60549434743857153' target='_blank'>2011年4月20日 12:44 PM</a> via web<a href='https://twitter.com/intent/tweet?in_reply_to=60549434743857153' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=60549434743857153' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=60549434743857153' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div>
<div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=rasmus'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a3.twimg.com/profile_images/52489510/rl_normal.jpg' /></a></div>
<div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=rasmus'>@rasmus</a>
<div style='margin:0; padding-top:2px'>Rasmus Lerdorf</div>
</div>
<div style='clear:both'></div>
</div>
</div>
<p><!-- end of tweet --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/599/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lithium0.9リリースノート（和訳）</title>
		<link>http://blog.candycane.jp/archives/331</link>
		<comments>http://blog.candycane.jp/archives/331#comments</comments>
		<pubDate>Sat, 22 May 2010 20:24:11 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[Lithium]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[和訳]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=331</guid>
		<description><![CDATA[ちょっと作業時間が取れなかったので大幅に遅れてしまいましたが、Lithiumの0.9のリリースノートの和訳です。すでに0.9.5が出ていますのでそちらも追って和訳している所です。また末尾で触れられているTekXでのセッションも見てきました。同じ内容のセッションを近日中にustreamで中継する事を相談しているので近々お目にかけられるかもしれません。 原文 http://rad-dev.org/lithium/wiki/blog/Lithium-0-9-The-Lambdas-are-awesome-Edition Lithium0.9 ラムダは素晴らしいエディション 私はLithium0.9を迅速にリリースできた事にとても興奮しています。[今すぐダウンロード！]。0.8からの3週間で、私たちに1.0にかなり近いところまで来ました。いくつかの新機能が含まれます： ErrorHandler：`ErrorHandler`クラスは、アプリケーション全体のPHPのエラーと例外をキャプチャして処理するための高度な設定を提供します。その革新的なデザインは、エラーを型（エラーまたは例外）を含む様々なパラメータ/例外を捕捉することができます。エラーコード、例外クラス名（継承関係を含む）、エラー発生元のクラス名メソッド名のバックトレースも含まれます。 あなたは0.9にアプリケーションを更新する場合は、今すぐ次の例を試すことができます： アプリケーション内に新しい設定ファイルを作成します。`config/bootstrap/error.php`をブートストラップからincludeしてから以下を追加します： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2009/12/designall.dll_.png"><img src="http://blog.candycane.jp/wp-content/uploads/2009/12/designall.dll_.png" alt="designall.dll" title="designall.dll" width="500" height="150" class="aligncenter size-full wp-image-188" /></a></p>
<p>ちょっと作業時間が取れなかったので大幅に遅れてしまいましたが、Lithiumの0.9のリリースノートの和訳です。すでに0.9.5が出ていますのでそちらも追って和訳している所です。また末尾で触れられているTekXでのセッションも見てきました。同じ内容のセッションを近日中にustreamで中継する事を相談しているので近々お目にかけられるかもしれません。</p>
<h3>原文</h3>
<p><a href="http://rad-dev.org/lithium/wiki/blog/Lithium-0-9-The-Lambdas-are-awesome-Edition">http://rad-dev.org/lithium/wiki/blog/Lithium-0-9-The-Lambdas-are-awesome-Edition</a></p>
<h3>Lithium0.9 ラムダは素晴らしいエディション</h3>
<p>私はLithium0.9を迅速にリリースできた事にとても興奮しています。[<a href="http://rad-dev.org/lithium/versions">今すぐダウンロード！</a>]。0.8からの3週間で、私たちに1.0にかなり近いところまで来ました。いくつかの新機能が含まれます：</p>
<p><strong>ErrorHandler：</strong>`ErrorHandler`クラスは、アプリケーション全体のPHPのエラーと例外をキャプチャして処理するための高度な設定を提供します。その革新的なデザインは、エラーを型（エラーまたは例外）を含む様々なパラメータ/例外を捕捉することができます。エラーコード、例外クラス名（継承関係を含む）、エラー発生元のクラス名メソッド名のバックトレースも含まれます。<br />
あなたは0.9にアプリケーションを更新する場合は、今すぐ次の例を試すことができます：<br />
アプリケーション内に新しい設定ファイルを作成します。`config/bootstrap/error.php`をブートストラップからincludeしてから以下を追加します：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * First, import the relevant Lithium core classes.
 */</span>
<span style="color: #000000; font-weight: bold;">use</span> \lithium\core\ErrorHandler<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> \lithium\analysis\Logger<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> \lithium\template\View<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Then, set up a basic logging configuration that will write to a file.
 */</span>
Logger<span style="color: #339933;">::</span><span style="color: #004000;">config</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'adapter'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'File'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Configure an error page renderer function that we can use to render 404 and 500 error pages (for
 * this part to work, you need to create errors/404.html.php and errors/500.html.php in your views/
 * directory).
 */</span>
<span style="color: #000088;">$render</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$template</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$view</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> View<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'paths'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'template'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'{:library}/views/{:controller}/{:template}.{:type}.php'</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'layout'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'{:library}/views/layouts/{:layout}.{:type}.php'</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'all'</span><span style="color: #339933;">,</span> <span style="color: #990000;">compact</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">compact</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'template'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'errors'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'layout'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'html'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Finally, wire up the error configuration. The first rule captures any exceptions where the
 * message matches one of the given regular expressions: eitheer a template or controller wasn't
 * found. In either case, render a 404.
 *
 * For all other exceptions, log them to the error log, and show the user a 500 error.
 */</span>
ErrorHandler<span style="color: #339933;">::</span><span style="color: #004000;">config</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Exception'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'message'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/(^Template not found|^Controller \w+ not found)/'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'handler'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$info</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$render</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'404'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$info</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Exception'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'handler'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$info</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$render</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Logger<span style="color: #339933;">::</span><span style="color: #004000;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$info['file']}</span> : <span style="color: #006699; font-weight: bold;">{$info['line']}</span> : <span style="color: #006699; font-weight: bold;">{$info['message']}</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'500'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$info</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Last but not least, tell the ErrorHandler to start capturing errors.
 */</span>
ErrorHandler<span style="color: #339933;">::</span><span style="color: #004000;">run</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>これで、あなたは完全にカスタマイズ可能なエラー管理ソリューションを即座に利用できます。ハンドラはエラーに対して独自に対応を行えるようにします。通常これは、それらをロギングしエラーページをレンダリングするという事になるでしょう。</p>
<p><strong>永続的パラメータ：</strong>多くの拡張機能の中で永続的なパラメータを追加しルーティングします。新しいルートを設置すると、あなたはルートがマッチした際の引数のリストを指定することができ、このリクエストの間は永続的に利用され後続のリンクでも使用されます。これらの2つのルートを考えてみましょう：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Router<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/admin/{:controller}/{:action}'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'persist'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'controller'</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Router<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/{:controller}/{:action}'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>さて、サイトのadminセクションを参照すると、生成された全てのリンクが永続化したプロパティを継承しています：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Add post'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'posts'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'add'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// links to /admin/posts/add ?&gt;</span></pre></td></tr></table></div>

<p>パラメータを無効するには、単に`null`を対応するキーの値に渡す：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'Add post'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'posts'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'add'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'admin'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// links to /posts/add ?&gt;</span></pre></td></tr></table></div>

<p><strong>ルートハンドラ：</strong>最も重要な新機能、ルートハンドラを使用すると、アプリケーションから直接のルートにコントローラロジックを実装することができます。これにより、いくつかのクールな実装や、小型で高速マイクロアプリケーションを実現できます。以前このプラグインはフレームワークの外部でしたが、この機能はコアに移動されているアプリケーションから直接利用できるようになりました。この単純な例を考えてみましょう：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> lithium\action\Response<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> \lithium\net\http\Router<span style="color: #339933;">;</span>
&nbsp;
Router<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/hello/{:name}'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> ?<span style="color: #339933;">:</span> <span style="color: #0000ff;">'World'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Response<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'body'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;Hello <span style="color: #006699; font-weight: bold;">{$name}</span>!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
Router<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/redirect'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Response<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'location'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>このルーティングでまず注意する点はルートハンドラーは全てのフレームワークの処理をバイパスして直接、Responseオブジェクトを返してレンダリングする事です。またハンドラは$requestパラメータを返し、処理を通常どおり継続することもできます。最初の例では /hello にアクセスした際に誰かわからないユーザへのあいさつ、&#8221;Hello World!&#8221; を画面に書いています。または`/hello/Nate`にアクセスし `{:name}`パラメータがURLで指定されたな会いは&#8221;Hello Nate!&#8221;と表示します。<br />
2番目の例では`/redirect`へのリクエストをキャプチャし、ハンドラはブラウザを別ページへリダイレクトするResponseオブジェクトを返しています。Responseオブジェクト（また、コントローラのプロパティとしても使用可能なオブジェクトです）では、レスポンスがブラウザに返される方法を直接コントロールします。</p>
<p><strong>テンプレート変数展開：</strong>コミュニティの一部の開発者が明示のテンプレートを作成したいので、テンプレート変数をアクセスするための代替構文を実装しました。また $titleというテンプレート変数は $this['title']としてアクセスすることも出来るようになりました。<br />
また、このテンプレート変数の展開を無効にするオプションもあります。設定に`extract`パラメータを追加することによって、我々は簡単に通常のテンプレート変数を無効にすることができます：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Media<span style="color: #339933;">::</span><span style="color: #004000;">type</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'html'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'text/html'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'view'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'\lithium\template\View'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'extract'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'paths'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'template'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'{:library}/views/{:controller}/{:template}.{:type}.php'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'layout'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'{:library}/views/layouts/{:layout}.{:type}.php'</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>この設定を適用すると、 $this['title']は引き続き動きますが、 $titleは動かなくなります。<br />
最後に、<a href="http://twitter.com/jperras">Joel</a>と私は一カ月後の<a href="http://tek.phparch.com/">TEK・X</a>のカンファレンスで講演する予定です。我々はLithiumについての合同セッションと、それぞれコードの品質やソーシャルグラフについての講演をする予定です。今すぐ登録して、会場で会ったら声をかけてください。シカゴでお会いしましょう。</p>
<p>~nate~</p>
<p>&#8211;翻訳ここまで</p>
<p>機能の断片を紹介しているのでちょっとピンと来にくいかもしれません。セッションでも語られていましたが、Lithiumはアスペクト指向を実装に取り入れている部分があり、従来のスタイルのフレームワークの知識を前提にして考えると分かりづらい所があります。これらの例は全体の継承関係や処理のフローを考慮することなく、断片的な修正をクロージャなどを使って実現できるという点がすごい所と言えるでしょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/331/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HipHopを実行するには(和訳)</title>
		<link>http://blog.candycane.jp/archives/300</link>
		<comments>http://blog.candycane.jp/archives/300#comments</comments>
		<pubDate>Sun, 21 Feb 2010 07:20:53 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[HipHop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=300</guid>
		<description><![CDATA[こちらはHipHopの利用法のドキュメントの和訳です。 PHPをC++に変換して高速化する「HipHop for PHP」をFacebookが公開 HipHopのビルドとインストール方法(和訳) HipHopを実行するには(和訳) 原文 http://wiki.github.com/facebook/hiphop-php/running-hiphop HipHopを実行するには 注：これらのコード例では、HipHopコンパイラが完全に組み込まれていると仮定します。 環境設定 まず最初に、2つの環境変数の設定が必要です。 cd .. # into the root of the hphp checkout export HPHP_HOME=`pwd` export HPHP_LIB=`pwd`/bin HipHopを実行するモードの選択 HipHopは5つの異なるモードで実行することができます。これらはHello Worldの例をそれぞれ示しています。すべてのコマンドはこれらの例では、src /ディレクトリから実行されます。 まず、test.phpをと呼ばれるファイルを作成します。テキストを下記のように流し込むなら、&#8221;echo Hello World!&#62; test.php&#8221;のような感じです。次に、以下のようにモードを選択します： モード1：HipHopでコンパイルし、直接実行する。 hphp/hphp test.php モード2：HipHopで一時ディレクトリにコンパイルし、コマンドラインからコンパイルしたプログラムを実行する。 hphp/hphp test.php --keep-tempdir=1 --log=3 /tmp/hphp_p6vSsP/program (use your own temporary directory name from output) --keep-tempdir=1も-k 1で指定することができます。ハイフン一つとkのあとにスペースが空いている事に注意してください。これは、boostのコマンドラインオプションでの作業を監視するものです。 --log=3いくつかの冗長な情報の出力。どの一時ディレクトリが作成されたかを見つけることができる。--output-dir=mypathまたは-o mypathで独自の出力ディレクトリを指定することができます。 [...]]]></description>
			<content:encoded><![CDATA[<p>こちらはHipHopの利用法のドキュメントの和訳です。</p>
<ul>
<li><a href="http://blog.candycane.jp/archives/275">PHPをC++に変換して高速化する「HipHop for PHP」をFacebookが公開</a></li>
<li><a href="http://blog.candycane.jp/archives/295">HipHopのビルドとインストール方法(和訳)</a></li>
<li>HipHopを実行するには(和訳)</li>
</ul>
<h3>原文</h3>
<p><a href="http://wiki.github.com/facebook/hiphop-php/running-hiphop">http://wiki.github.com/facebook/hiphop-php/running-hiphop</a></p>
<h3>HipHopを実行するには</h3>
<p><strong>注：</strong>これらのコード例では、HipHopコンパイラが完全に組み込まれていると仮定します。</p>
<h3>環境設定</h3>
<p>まず最初に、2つの環境変数の設定が必要です。</p>
<p><code>cd .. # into the root of the hphp checkout<br />
export HPHP_HOME=`pwd`<br />
export HPHP_LIB=`pwd`/bin</code><br />
<h3>HipHopを実行するモードの選択</h3>
<p>HipHopは5つの異なるモードで実行することができます。これらはHello Worldの例をそれぞれ示しています。すべてのコマンドはこれらの例では、src /ディレクトリから実行されます。</p>
<p>まず、test.phpをと呼ばれるファイルを作成します。テキストを下記のように流し込むなら、&#8221;echo Hello World!&gt; test.php&#8221;のような感じです。次に、以下のようにモードを選択します：</p>
<p><strong>モード1：</strong>HipHopでコンパイルし、直接実行する。</p>
<p> <code>hphp/hphp test.php</code>
<p><strong>モード2：</strong>HipHopで一時ディレクトリにコンパイルし、コマンドラインからコンパイルしたプログラムを実行する。</p>
<p> <code>hphp/hphp test.php --keep-tempdir=1 --log=3<br />
/tmp/hphp_p6vSsP/program    (use your own temporary directory name from output)</code>
<p><code>--keep-tempdir=1</code>も<code>-k 1</code>で指定することができます。ハイフン一つとkのあとにスペースが空いている事に注意してください。これは、boostのコマンドラインオプションでの作業を監視するものです。</p>
<p><code>--log=3</code>いくつかの冗長な情報の出力。どの一時ディレクトリが作成されたかを見つけることができる。<code>--output-dir=mypath</code>または<code>-o mypath</code>で独自の出力ディレクトリを指定することができます。</p>
<p><strong>モード3：</strong>HipHopで一時ディレクトリにコンパイルし、Webサーバーとしてコンパイルしたプログラムを実行する。</p>
<p> <code>hphp/hphp test.php --keep-tempdir=1 --log=3<br />
sudo /tmp/hphp_p6vSsP/program -m server</code>
<p>その後、別のウィンドウから実行：</p>
<p> <code>curl localhost/test.php</code>
<p>sudoを使用しない場合は、ポート8080上でHipHopを実行することができます。</p>
<p> <code>hphp/hphp test.php --keep-tempdir=1 --log=3<br />
/tmp/hphp_p6vSsP/program -m server -p 8080<br />
GET http://localhost:8080/test.php</code>
<p>あなたのサーバーを管理するにはこのコマンドを実行：</p>
<p> <code>GET http://localhost:8088</code>
<p>また、デーモンとしてサーバを実行することができます：</p>
<p> <code>sudo /tmp/hphp_p6vSsP/program -m daemon</code>
<p><strong>モード4：</strong>HipHopインタプリタで直接実行する。</p>
<p> <code>hphpi/hphpi -f test.php  (note the "-f" flag)</code>
<p><strong>モード5：</strong>HipHopインタプリタを逐次変換Webサーバかデーモンとして起動する。</p>
<p> <code>sudo hphpi/hphpi -m server (or daemon)<br />
curl localhost/test.php<br />
curl localhost:8088</code><br />
<h3>大きなコードベースのコンパイル</h3>
<p>まずコンパイラの様々なスイッチを理解しましょう：</p>
<p> <code>hphp/hphp --help</code>
<p>いくつかのフラグを指定する方法が３つあります。 <span class="caps">（1）HDF</span>形式の設定ファイル。hdf形式の詳細については doc/hdf をお読みください。次に、<code>--config</code>で、使用する設定ファイルを指定します。<span class="caps">（2）HDF</span>ファイル内のほぼすべてのオプションは、直接ドット表記形式で列挙することができます。たとえば<code>-v "node.subnode=value"</code> のように。（3）我々は、最も頻繁に使用されるものをいくつかのショートカットを作成しました。このようになります<code>--force</code> 。</p>
<p>最も重要なフラグはインクルードまたは除外するファイルやディレクトリを指定するものです。これらはきれいに設計されていないので、今後改善する必要があると感じています。疑問がある場合は、単にファイル名のリストを別のファイルに準備して<code>--input-list</code>のスイッチを使用します。</p>
<h3>オンデマンド解析モード使用する（オプション）</h3>
<p>コマンドラインから指定されていないファイルは、コンパイラがそれらを見つける事が出来る場合<strong>のみ</strong> 、インクルードされます。あなたの書いたinclude文下記のように扱われる事になります：</p>
<ul>
<li>単純なリテラルの結合、コンパイラはコンパイル時にそれを計算することができます。</li>
<li><code>"include_once $MY_ROOT.'/path/file.php';"</code>のような単純な形式で記述<br /><strong>注：</strong>ここでいう、$ MY_ROOTはこのような内容の設定ファイルを作成する事でコンパイラに指示することができます：</li>
</ul>
<p> <code>IncludeRoots {<br />
  * {<br />
    root = $MY_ROOT<br />
    path = lib/my_code<br />
  }<br />
  * {<br />
    root = $ANOTHER_ROOT<br />
    path = anotherlib<br />
  }<br />
}</code>
<p>この設定ファイルを含むように<code>--config</code>を使用する 。コンパイラは、上記のinclude文を&#8221;lib / my_code/path/file.php&#8221;として解決します。</p>
<p><strong>注：</strong>オンデマンドモードを設定することが困難な場合、すべてのコンパイルしたい<span class="caps">PHP</span>ファイル含めるように<code>--input-list</code>を使用してください。</p>
<h3>distccの使用</h3>
<p>大規模なコンパイルについては、我々は<a href="http://distcc.samba.org">distccの</a>セットアップをお勧めします。</p>
<h3>例：PHPUnitのコンパイル</h3>
<p>1. <span class="caps">PHPUnit</span>の PHPファイルをチェックアウトする：</p>
<p> <code>git clone git://github.com/sebastianbergmann/phpunit.git<br />
cd phpunit<br />
git checkout -b 3.4 origin/3.4</code>
<p>2.確実かつ安全な方法として入力ファイルを指定します。</p>
<p> <code>find . -name "*.php" &gt; files.list</code>
<p>これはコンパイルしたいすべてPHPファイルのリストです。</p>
<p>3.プロジェクトをコンパイルする準備が整いました。</p>
<p> <code>$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 \<br />
  --include-path="." --force=1 --cluster-count=50 \<br />
  -v "AllDynamic=true" -v "AllVolatile=true" </code>
<p><code>-k 1</code>または<code>--keep-tempdir=1</code>で、新しい一時的なディレクトリが毎回作成されます。この方法はコンパイルを試している時に便利です。</p>
<p>PHPUnitはPHPUnitのルートディレクトリから相対的にインクルードを行っているので、<code>--include-path</code>が必要です。このオプションを指定しない場合、すべてのこのような形式 &#8220;include &#8216;somepath/file.php&#8217;;&#8221; はそれを含むファイルからの相対パスとして扱われます。</p>
<p>HipHopがコードに発見した警告やエラーを無視するには<code>--force=1</code>が必要です。このオプションがなければ、コンパイラはエラーがあれば画面上にダンプして停止します。<code>--force=1</code>を使った場合、これらのエラーのほとんどは実行時エラーでしょう。この場合もあなたはまだ出力ディレクトリの下に生成された CodeError.js でそれらを確認できます。</p>
<p><code>--cluster-count=50</code>distcc無しでのコンパイルに役立ちます。このフラグがなければ、それぞれの<span class="caps">PHP</span>ファイルに対してcppファイルが1つ生成されます。PHPファイルの数が多い場合、cppファイルのコンパイルがToo Manyで終わる可能性があります。clusteringを使えばPHPファイルの数は重要ではありません。HipHopは指定された数の.cppファイルを生成し、より簡単にdistccに少ない回数でこれを渡す事ができます。クラスタの数はdistccのワーカー数より少し少ないくらいにすべきです。例えば20台のマシンで8つずつのdistccワーカーを動かしている場合はクラスタ数は100がよいでしょう。しかし、ある種の最適値を見つけるにはコンパイル時間を比較しながらにクラスタ数を上げたり下げたりしてください。</p>
<p><code>-v "AllDynamic=true"</code>このオプションにより 、動的な関数や、動的メソッド呼び出しを問題なくサポートすることができます。コーディング中に動的関数呼び出しや動的メソッド呼び出しをしている場合はオンを推奨します。少しパフォーマンスが犠牲になりますが、それが安全です。</p>
<p><code>-v "AllVolatile=true"</code>このオプションにより、関数やクラスの動的な宣言を問題なくサポートすることができます。<code>function_exists()</code>や<code>class_exits()</code>を宣言の前後で実行したり、その順序に意味があるような異常なテストを実行しない限りはオンにすることを推奨します。PHPUnitは、いくつかのクラスファイルをロードした後、新しいクラスを見つけるためその戻り値を比較する為に<code>get_declared_classes()</code>を呼び出すことがあります。したがって、PHPUnitにはこのスイッチを追加する必要があります。ほとんどの場合は、オンにする必要はありません。これは、パフォーマンスが場合によって犠牲になります。</p>
<p>4.これでコンパイルされたPHPUnitのバイナリができたはずです。もしここまで到達することはできない場合は、私たちに報告してください。バイナリを実行するには、</p>
<p> <code>php phpunit.php (in PHP)<br />
/tmp/hphp_po33pK/program -f phpunit.php (in HipHop, note the -f flag)</code> <code>php phpunit.php PHPUnit/Tests/Framework/SuiteTest.php<br />
/tmp/hphp_po33pK/program -v "Server.SourceRoot=`pwd`" \<br />
   -f phpunit.php PHPUnit/Tests/Framework/SuiteTest.php</code>
<p>コンパイルされたバイナリの&#8221;プログラム&#8221;は、通常<code>phpunit.php</code>と同じディレクトリから実行するよう注意してください。PHPUnitは、ローカルディスクから.phpファイルを探す際に<code>file_exists()</code>を使っているからです。より高度な設定をし静的ファイルキャッシュを構築することで、ディスク上の場所の依存関係を削除する事もできます。</p>
<p>注意<code>-v "Server.</code><code>SourceRoot=`pwd`"</code>は、通常は必要ありません。しかし、PHPUnitのかなりの数のファイル操作はいくつかのファイルの場所に基づく、ローカルディスク上にへの<code>realpath()</code>を呼び出しています。だから我々はテストを実行する場合にこれを追加する必要がありました。</p>
<p>5.いくつかの役に立つヒント：</p>
<p>（1）<code>--keep-tempdir=1</code>でバイナリを作ったが、その名前を忘れてしまった場合は、単純なコマンドは、通常それを見つけることができます。</p>
<p> <code>ls -altrd /tmp/hphp_* | tail -1</code>
<p>（2）多くの一時的なディレクトリがディスク容量を使い切る事があります。全てのHipHopの一時ファイルはこのよう削除できます。</p>
<p> <code>rm -fR /tmp/hphp_*</code><br />
<h2>例：HPHPiの下でPHPUnitの実行</h2>
<p> <code>$HPHP_HOME/src/hphpi/hphpi -f phpunit.php<br />
$HPHP_HOME/src/hphpi/hphpi -f phpunit.php PHPUnit/Tests/Framework/SuiteTest.php</code>
<p><font color="red">海平：私たちは、すべてのSuiteTest.php渡すことができますが、我々は、我々はまだ完全に、PHPUnitのいくつかのローカルディスク上の推定といくつかのマイナーなバグをのために、PHPUnit/Tests/Frameworkの下で完全にパスすることはできていません。</font><font color="red">全ての問題を修正する為に今もデバッグ中です。</font></p>
<h3>例：WordPressのコンパイル</h3>
<p>1.WordPressのコピーを取得します。注意、私たちはHipHopでWordPressをコンパイルする前に修正する必要がある2つ、3つの問題を見つけました。これらは、Wordpressの<span class="caps">SVN</span>のトランクにも反映されていますがバックポートはされていません。</p>
<p> <code>wget http://wordpress.org/latest.tar.gz<br />
tar zxvf wordpress-2.9.1.tar.gz<br />
cd wordpress<br />
[patch to fix some PHP coding problems that will cause compilation errors]</code>
<p>2.config.sample.phpをコピーするなどしてconfig.phpを作成し、データベース情報を設定します。このファイルは、 コンパイル<span class="caps">前に</span>準備しなければならないので、最終的なバイナリにされます。このファイルの変更がある場合はパッケージ全体の再コンパイルが必要です。</p>
<p>3.すべてのコンパイルしたいPHPファイルのリストを作成：</p>
<p> <code>find . -name "*.php" &gt; files.list</code>
<p>4.プロジェクトをコンパイルする準備が整いました。</p>
<p> <code>$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 \<br />
  --force=1 --cluster-count=50</code>
<p>WordPressはPHPUnitほど動的なコーディングを持っていないためPHPUnitよりも簡単です。</p>
<p>5.コンパイル済みのバイナリが出来たはずです。それを実行するには</p>
<p> <code>sudo /tmp/hphp_xpl7hT/program -m server -v "Server.SourceRoot=`pwd`" \<br />
  -v "Server.DefaultDocument=index.php" -c $HPHP_HOME/bin/mime.hdf</code>
<p><code>sudo</code> WordPressがそのポートのみで動作するのでポート80にListenする為に必要です。</p>
<p><code>-m server</code>  サーバーモードでプログラムを実行します<code>-m daemon</code>としても大丈夫です。</p>
<p><code>-v "Server.SourceRoot=`pwd`"</code> 画像やcssファイルを見つけるには、依然として必要です。</p>
<p><code>-v "Server.DefaultDocument=index.php"</code> http://server/ として動作する為に必要。</p>
<p><code>-c $HPHP_HOME/bin/mime.hdf</code>静的なコンテンツのファイル拡張子に応じて<span class="caps">異なる</span> MIMEヘッダを提供する必要とするサーバーではロードする必要がある。</p>
<p>冗長なログを参照するには、</p>
<p><code>-v "Log.Level=Verbose"</code>これはエラー、警告、情報よりも多く出力します。<br /><code>-v "Log.NoSilencer=on"</code>は、WordPressのコードで多く使用される@演算子でエラーを出力します 。<br /><code>-v "Log.Header=on"</code>ログの各行のヘッダに出力されます 。ほとんどのヘッダは16進数による長い文字列です。これは16進エンコードされたスタックトレースです。これを読めるように変換するには以下のコマンドを実行します。</p>
<p> <code>/tmp/hphp_xpl7hT/program -m translate the-long-hex-string-without-brackets<br />
</code></p>
<p>&#8211;訳ここまで</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/300/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

