<?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; ブログ</title>
	<atom:link href="http://blog.candycane.jp/archives/category/blog/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>HipHop for PHPでCakePHP2.1をC++にコンパイル</title>
		<link>http://blog.candycane.jp/archives/1278</link>
		<comments>http://blog.candycane.jp/archives/1278#comments</comments>
		<pubDate>Wed, 01 Feb 2012 04:16:55 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP2]]></category>
		<category><![CDATA[HipHop]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1278</guid>
		<description><![CDATA[PHPをC++にコンパイルして高速化するHipHop for PHPですが、CakePHP2をHipHop上で実行したという話が公開されていました。 So I finally found the time and published how to run #CakePHP with the facebook&#8217;s hiphop compiler http://t.co/rGhmBWGX 2012年1月30日 10:59 PM via Twitter for MacReplyRetweetFavorite @jose_zap jose_zap JoseはCakePHPのコアデベロッパの一人でこのHipHopに対応させる為のブランチの管理は彼が行なっていたようです。そもそもの問題としてHipHopは全てのrequireなどを静的に解決させる必要があり、動的な読み込みを行うフレームワークとは大変相性が悪いです。 このJoseの作成したプラグインはクラスのrequireリストを作成し、HipHopのコンパイラに与えることでフレームワークの動作を可能にするというアプローチをとっています。 大まかな手順は下記の通り。 CakePHPのHipHopプラグインの導入 クラスマップの生成 app/Console/cake HipHop.ClassPath フロントコントローラーの差し替え cp `app/Plugin/HipHop/Config/webroot/index.php app/webroot/index.php コンパイルの実行 粘り強く個別の問題に対処した事が伺える手順が元のポストにあります。トリッキーな構造になっていなければCakePHP2のアプリをHipHop上で稼働させることができそうですね。ベンチマークが行われていないので興味がある方はぜひトライをしてみるといいのではないでしょうか。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/cakephp/4960926853/" title="IMG_0546 by CakePHP, on Flickr"><img src="http://farm5.staticflickr.com/4149/4960926853_689710c692.jpg" width="500" height="333" alt="IMG_0546"></a></p>
<p>PHPをC++にコンパイルして高速化するHipHop for PHPですが、<a href="http://bakery.cakephp.org/articles/lorenzo/2012/01/30/running_cakephp_using_the_facebooks_hiphop_compiler" target="_blank">CakePHP2をHipHop上で実行したという話</a>が公開されていました。</p>
<p><!-- tweet id : 163984577881313280 --><br />
<style type='text/css'>#bbpBox_163984577881313280 a { text-decoration:none; color:#D02B55; }#bbpBox_163984577881313280 a:hover { text-decoration:underline; }</style>
<div id='bbpBox_163984577881313280' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#352726; background-image:url(http://a2.twimg.com/profile_background_images/86436020/DSC_0163.JPG); background-repeat:no-repeat'>
<div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#3E4415; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>So I finally found the time and published how to run <a href="http://twitter.com/search?q=%23CakePHP" title="#CakePHP">#CakePHP</a> with the facebook&#8217;s hiphop compiler <a href="http://t.co/rGhmBWGX" rel="nofollow">http://t.co/rGhmBWGX</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 2012年1月30日 10:59 PM' href='http://twitter.com/#!/jose_zap/status/163984577881313280' target='_blank'>2012年1月30日 10:59 PM</a> via <a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow" target="blank">Twitter for Mac</a><a href='https://twitter.com/intent/tweet?in_reply_to=163984577881313280' 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=163984577881313280' 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=163984577881313280' 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=jose_zap'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a1.twimg.com/profile_images/75591628/gran_sabanaaa__049_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=jose_zap'>@jose_zap</a>
<div style='margin:0; padding-top:2px'>jose_zap</div>
</div>
<div style='clear:both'></div>
</div>
</div>
<p><!-- end of tweet --></p>
<p>JoseはCakePHPのコアデベロッパの一人でこのHipHopに対応させる為のブランチの管理は彼が行なっていたようです。そもそもの問題としてHipHopは全てのrequireなどを静的に解決させる必要があり、動的な読み込みを行うフレームワークとは大変相性が悪いです。<br />
このJoseの作成したプラグインはクラスのrequireリストを作成し、HipHopのコンパイラに与えることでフレームワークの動作を可能にするというアプローチをとっています。</p>
<p>大まかな手順は下記の通り。</p>
<ul>
<li>CakePHPのHipHopプラグインの導入</li>
<li>クラスマップの生成 <code>app/Console/cake HipHop.ClassPath</code></li>
<li>フロントコントローラーの差し替え <code>cp `app/Plugin/HipHop/Config/webroot/index.php app/webroot/index.php</code></li>
<li>コンパイルの実行</li>
</ul>
<p>粘り強く個別の問題に対処した事が伺える手順が<a href="http://bakery.cakephp.org/articles/lorenzo/2012/01/30/running_cakephp_using_the_facebooks_hiphop_compiler" target="_blank">元のポスト</a>にあります。トリッキーな構造になっていなければCakePHP2のアプリをHipHop上で稼働させることができそうですね。ベンチマークが行われていないので興味がある方はぜひトライをしてみるといいのではないでしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1278/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>8時間耐久CakePHP2勉強会を大阪で開催します！</title>
		<link>http://blog.candycane.jp/archives/1263</link>
		<comments>http://blog.candycane.jp/archives/1263#comments</comments>
		<pubDate>Mon, 30 Jan 2012 07:33:12 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP2]]></category>
		<category><![CDATA[イベント]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1263</guid>
		<description><![CDATA[先日下北沢で開催した8時間耐久CakePHP2勉強会を今週末(2/5)に大阪で開催します。 参加登録はATND上で受け付けています。 http://atnd.org/events/24800 フレームワーク初心者でもCakePHPを動かせるような内容になっていますが、すでにCakePHPを使っている人でまだCakePHP2を使っていない人にとってはポイントの確認もできるかと思います。（プラス始めての方のヘルプもお願いすると思いますが） 時間も長いこともあって前回もざっくばらんに質問をしたり雑談したりと和気あいあいとした会でしたので今回もそんな雰囲気になればよいなと思います。 また2/12には福岡で同様の勉強会を開催する予定です。その他の都市も要望があれば行ってみたいと思っていますので希望があればお知らせ下さい。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp-のコピー-.001.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp-のコピー-.001-600x450.jpg" alt="" title="20120125_cakephp のコピー .001" width="600" height="450" class="aligncenter size-medium wp-image-1264" /></a></p>
<p>先日<a href="http://blog.candycane.jp/archives/1200" title="初心者向け 8時間耐久CakePHP2勉強会を開催しました" target="_blank">下北沢で開催した8時間耐久CakePHP2勉強会</a>を今週末(2/5)に大阪で開催します。</p>
<p>参加登録はATND上で受け付けています。<br />
<a href="http://atnd.org/events/24800" target="_blank">http://atnd.org/events/24800</a></p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/401444_258323880907349_131130253626713_620080_19393699_n.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/401444_258323880907349_131130253626713_620080_19393699_n-600x450.jpg" alt="" title="401444_258323880907349_131130253626713_620080_19393699_n" width="600" height="450" class="aligncenter size-medium wp-image-1266" /></a></p>
<p>フレームワーク初心者でもCakePHPを動かせるような内容になっていますが、すでにCakePHPを使っている人でまだCakePHP2を使っていない人にとってはポイントの確認もできるかと思います。（プラス始めての方のヘルプもお願いすると思いますが）<br />
時間も長いこともあって前回もざっくばらんに質問をしたり雑談したりと和気あいあいとした会でしたので今回もそんな雰囲気になればよいなと思います。</p>
<p>また2/12には福岡で同様の勉強会を開催する予定です。その他の都市も要望があれば行ってみたいと思っていますので希望があればお知らせ下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1263/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>初心者向け 8時間耐久CakePHP2勉強会を開催しました</title>
		<link>http://blog.candycane.jp/archives/1200</link>
		<comments>http://blog.candycane.jp/archives/1200#comments</comments>
		<pubDate>Fri, 27 Jan 2012 05:49:34 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP2]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1200</guid>
		<description><![CDATA[CakePHPを勉強したいという@shinichiNさんの要望に応えて<a href="https://www.facebook.com/events/279943722066633/" target="_blank">8時間耐久でCakePHP2を学ぶという勉強会</a>を1/25に<a href="http://www.osscafe.net/" target="_blank">下北沢OSSCafe</a>で開催しました。当日はUStreamも常時30人前後の人が視聴しており、現地の参加者も含めて50人弱が耐久形式で最新のCakePHP2の利用方法を学びました。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/399700_256092547797149_131130253626713_615087_1205903042_n.jpeg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/399700_256092547797149_131130253626713_615087_1205903042_n.jpeg" alt="" title="399700_256092547797149_131130253626713_615087_1205903042_n" width="600" height="398" class="aligncenter size-medium wp-image-1211" /></a></p>
<p><strong style="color:red">追記）大阪でも2/5(日)に開催します！</strong><br />
<a href="http://atnd.org/events/24800" target="_blank">http://atnd.org/events/24800</a></p>
<p>CakePHPを勉強したいという@shinichiNさんの要望に応えて<a href="https://www.facebook.com/events/279943722066633/" target="_blank">8時間耐久でCakePHP2を学ぶという勉強会</a>を1/25に<a href="http://www.osscafe.net/" target="_blank">下北沢OSSCafe</a>で開催しました。当日はUStreamも常時30人前後の人が視聴しており、現地の参加者も含めて50人弱が耐久形式で最新のCakePHP2の利用方法を学びました。<br />
なお今回のターゲットの<a href="https://twitter.com/#!/shinichiN" target="_blank">@shinichiN</a>さんはフレームワークなどは未経験とのことでしたので、<strong style="color:red">WordPressを使ったり簡単なPHPスクリプトを自分で書けるくらいの人がCakePHPの基本を理解する</strong>というのが今回の主旨です。</p>
<h3>MVCモデルとは牛皿定食である</h3>
<p><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.0141-600x450.jpg" alt="" title="20120125_cakephp.014" width="600" height="450" class="aligncenter size-medium wp-image-1223" /><br />
フレームワークを使ったことが無い人にとって、とっつきにくいのが<strong>MVCモデル</strong>の考え方です。ModelがデータベースでViewがHTMLでという説明を聞いているとまるでこれまで作っていたプログラムとまったく違うものを作らないと行けない気がしてきます。しかし実際のところMVCモデルは<strong style="color:red">大きくなったプログラムを分割する為の経験則</strong>です。牛丼を牛皿定食にしても内容物として肉、玉ねぎ、お米があることに変わりはないようにMVCモデルもこれまで作っていたプログラムを一定のルールに従って分割しただけです。</p>
<p>普通のPHPスクリプトの例で考えてみましょう。(クリックで拡大)<br />
<a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.012.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.012-600x450.jpg" alt="" title="20120125_cakephp.012" width="600" height="450" class="aligncenter size-medium wp-image-1225" /></a></p>
<p>上記のスクリプトはなるべくシンプルにデータベースのデータを画面に表示するという普通のPHPスクリプトですが、このうち<strong style="color:red">データベースに関連する処理とHTMLに関連する処理を別の場所に移す</strong>というふうに考えます。（このスクリプトはDB処理とHTMLが一箇所にまとまるように書いてありますが、分散していた場合はそれぞれを抜き出して移動します）</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.013.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.013-600x450.jpg" alt="" title="20120125_cakephp.013" width="600" height="450" class="aligncenter size-medium wp-image-1227" /></a></p>
<p>DB処理をモデルにHTMLをビューに移してみました。そしてそれでも残った元々の部分がコントローラーになり、モデルとビューを呼び出しています。<strong style="color:red">スクリプトの内容は分割してincludeで呼び出すようにしただけで全く同一です。</strong>こういったものが独自フレームワークと呼ばれCakePHPが一般的になる前からも大きなシステムでは活用されていました。また自分流でスクリプトを書いているとなんだかんだでこういった形を使うようになってきます。<br />
フレームワークを使う場合は各フレームワークごとに決められた場所にMVCのそれぞれの部分を配置することになります。CakePHPの場合であれば下記のような形です。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.015.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.015-600x450.jpg" alt="" title="20120125_cakephp.015" width="600" height="450" class="aligncenter size-medium wp-image-1231" /></a></p>
<h3>CakePHP2インストールの肝はPDOとmod_rewriteの確認</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.019.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.019-600x450.jpg" alt="" title="20120125_cakephp.019" width="600" height="450" class="aligncenter size-medium wp-image-1234" /></a></p>
<p>CakePHP2はCakePHP1やWordPressなどと違ってPDOというPHPの機能を使っています。インストールの際にはPDOが利用できることをphpinfo()で確認します。またXAMPPやMAMPPでは初期状態ではmod_rewriteが有効になっていません。mod_rewriteを有効にするか、core.phpのAPP.BaseUrlの設定を有効にしてください。<br />
またYukio Saitohさんが<a href="http://www.fxfrog.com/?p=4818" target="_blank">Windowsの場合の設定のポイント</a>をまとめて下さいました！</p>
<h3>Controller:: ディスパッチャを理解せよ</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.029.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.029-600x450.jpg" alt="" title="20120125_cakephp.029" width="600" height="450" class="aligncenter size-medium wp-image-1241" /></a></p>
<p>多くのフレームワークは指定されたURLに応じた所定のコントローラーを呼び出すという機構を採用しています。これをCakePHPではディスパッチャーが行なっており、指定されたURLに応じたコントローラーのメソッドを呼び出します。作ったコントローラーを呼び出す為のURLを考えたり、とあるURLに対応するコントローラーをどうすれば作れるのかを理解すれば自分で作った処理を自由に呼び出せるようになります。<br />
この際に<strong style="color:red">命名規則に従う必要もありません</strong>。$usesやアクションの設定を省略した場合は命名規則に従ったデフォルトが呼び出されるだけですので。きちんと指定をすれば自由に名前をつけられます。</p>
<h3>Model:: find()を極めろ</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.045.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.045-600x450.jpg" alt="" title="20120125_cakephp.045" width="600" height="450" class="aligncenter size-medium wp-image-1243" /></a></p>
<p>CakePHPはモデルの機能が中心といってもよいフレームワークです特にfind()メソッドを使えばほとんど全てのケースのデータベース処理を自動化できます。このfind()に慣れれば慣れるほどにCakePHPでの開発がスムーズになります。<br />
またこのfind()が返却する結果と要求するオプションは大きな配列変数になっています。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.046.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.046-600x450.jpg" alt="" title="20120125_cakephp.046" width="600" height="450" class="aligncenter size-medium wp-image-1244" /></a></p>
<p>配列に依存しすぎという批判もありますが、とにかく<strong style="color:red">えいやと配列を渡すとうりゃっと配列が返ってくるのがCakePHP流</strong>なのでそれに慣れるのが早道です。（そもそもPHP自体が配列中心なところがあるので僕はこの設計は成功していると思っています。)</p>
<h3>View:: URLやフォームはヘルパーで自動生成せよ</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.061.jpg"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/20120125_cakephp.061-600x450.jpg" alt="" title="20120125_cakephp.061" width="600" height="450" class="aligncenter size-medium wp-image-1246" /></a></p>
<p>ビューに関しては app/View/Layouts/default.ctpを変更してヘッダ、フッタなどを変更する事と、ヘルパーを利用したタグの自動生成くらいしか覚えることはありません。とりあえずはヘッダなどを任意のデザインに差し替えて、テンプレート内にURLを書くようなタグでヘルパーを使うところから始めればよいでしょう。</p>
<h3>お疲れ様でした</h3>
<p>実際にはいろいろとデモンストレーションや質疑応答をしながらの8時間の勉強会でしたが、多くの方がCakePHPを好きなように動かせました。（ソースコードを一字一句書き写すのではなく、好きな名前をつけたりしながら各自が確認をしていました）細かいことを詳細に確認するのも大事ですが、まずは全体像を掴んでいじり回せるようになる事が第一歩かと思います。</p>
<p>今回は下北沢OSSCafeという素晴らしい環境で、なおかつ<a href="https://twitter.com/#!/cognitom" target="_blank">@cognitom</a>さんのハイクオリティUStreamの録画が残っています。動画を全画面表示するとソースコードすら確認できる脅威のクオリティをご堪能ください。（残念ながら午前中のところは録画がありません）</p>
<p><a href="http://www.ustream.tv/recorded/19991352" title="http://www.ustream.tv/recorded/19991352" target="_blank">8時間耐久CakePHP(1/4) &#8211; Controller編</a><br />
<a href="http://www.ustream.tv/recorded/19992481" title="8時間耐久CakePHP(2/4) - Model編" target="_blank">8時間耐久CakePHP(2/4) &#8211; Model編</a><br />
<a href="http://www.ustream.tv/recorded/19993514" target="_blank">8時間耐久CakePHP(3/4) &#8211; Model編の続き</a><br />
<a href="http://www.ustream.tv/recorded/19994191" target="_blank">8時間耐久CakePHP(4/4) &#8211; View編</a></p>
<div style="width:425px" id="__ss_11250849"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/yandod/8cakephp" title="8時間耐久CakePHP" target="_blank">8時間耐久CakePHP</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/11250849" 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/yandod" target="_blank">yandod</a> </div>
</p></div>
<p>デモで使っていたプロジェクトはとりあえずgithubに置きました。<br />
<a href="https://github.com/yandod/shimokita8" target="_blank">https://github.com/yandod/shimokita8</a><br />
同様の勉強会を大阪と福岡でやろうかなと思っています。他にも開催の要望があれば場所さえあればなんとかなりますのでご相談ください。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1200/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ダッシュボードからプラグインのインストールが可能に &#8211; CandyCane v0.8.5リリース</title>
		<link>http://blog.candycane.jp/archives/1188</link>
		<comments>http://blog.candycane.jp/archives/1188#comments</comments>
		<pubDate>Tue, 03 Jan 2012 09:53:37 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[candycane]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1188</guid>
		<description><![CDATA[CandyCaneダウンロード(ページ下部にZipとtar.gzの圧縮ファイルへのリンクがあります) RedmineをPHPに移植したタスク管理システム、CandyCaneのバージョンが0.8.5になりました。一部で話題になったにゃーんダウンチャートを生んだプラグイン機構を改良し、プラグインのインストールとアンインストールがダッシュボードから出来るようになりました。またプラグインのひな形を生成するシェルコマンドも同梱され、プラグインの開発をすぐに始める事ができます。 今回は作例としてチケットに「イイね」の機能を付けるLike Itプラグインを作成してみました。CakePHPベースでの開発はやはり効率がよくかなり少ないコードの分量で機能を実装する事ができたと思います。このプラグインのデモ動画はこちらです。 プラグインのカタログはgist上で管理しています。みなさんが作成したプラグインもgithubで公開されていればカタログに追加する事でダッシュボードからの配布が可能になります。ガントチャートのような独立性の高い機能については是非ともプラグインとして実装された事例が出てくればと思います。また僕自身が公開しているプラグインもそうですが、ネタっぽいものでも作ってみると勉強になるのでCakePHPの学習題材としても良いのではと思います。 開発にかかった時間は25時間。また今回から@okonomiさんが送ってくださったプルリクエストも含まれています。 Bug #207: Supporting plugin architecture. Part3 Bug #208: Kindly notice mod_rewrite availability. Bug #209: list is broken on render if it has more than 3items. Bug #211: Plugin generation by console. Bug #214: 「トラッカー」画面でワークフロー未設定のエラーメッセージが表示されない Enhancement #185: &#8220;Like&#8221; feature for issue. Enhancement #210: Get plugin catalog from remote. まだバグつぶしや実現できていない構想もありますが、プラグイン機構で自由に機能を追加しやすい土壌が整ってきました。機能だけでなくデザインなどについても自由に組み替えて利用できるようなシステムにしていければよいなと思います。インストールも簡単ですので、お時間のある方はインストールの上でいじってみたり、プラグインを作ってみて貰えれば大変嬉しいです。 最近の反響 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2012/01/plugin.png"><img src="http://blog.candycane.jp/wp-content/uploads/2012/01/plugin-300x121.png" alt="" title="plugin" width="300" height="121" class="aligncenter size-medium wp-image-1190" /></a></p>
<p><a href="https://github.com/yandod/candycane/downloads" target="_blank">CandyCaneダウンロード<br/>(ページ下部にZipとtar.gzの圧縮ファイルへのリンクがあります)</a></p>
<p>RedmineをPHPに移植したタスク管理システム、CandyCaneのバージョンが0.8.5になりました。一部で話題になった<a href="http://blog.candycane.jp/archives/1103" title="にゃーんダウンチャートが使えます – CandyCane v0.8.4" target="_blank">にゃーんダウンチャート</a>を生んだプラグイン機構を改良し、<strong>プラグインのインストールとアンインストールがダッシュボードから出来るようになりました。</strong>またプラグインのひな形を生成するシェルコマンドも同梱され、プラグインの開発をすぐに始める事ができます。</p>
<p>今回は作例としてチケットに「イイね」の機能を付ける<a href="https://github.com/yandod/cc_like_it" target="_blank">Like Itプラグイン</a>を作成してみました。CakePHPベースでの開発はやはり効率がよくかなり少ないコードの分量で機能を実装する事ができたと思います。このプラグインのデモ動画はこちらです。</p>
<p><iframe width="600" height="450" src="http://www.youtube.com/embed/wsnByUby4HA?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>プラグインのカタログは<a href="https://gist.github.com/1550522" target="_blank">gist上で管理しています</a>。<strong>みなさんが作成したプラグインもgithubで公開されていればカタログに追加する事でダッシュボードからの配布が可能になります。</strong>ガントチャートのような独立性の高い機能については是非ともプラグインとして実装された事例が出てくればと思います。また僕自身が公開しているプラグインもそうですが、ネタっぽいものでも作ってみると勉強になるのでCakePHPの学習題材としても良いのではと思います。</p>
<p>開発にかかった時間は25時間。また今回から<a href="http://twitter.com/#!/okonomi" target="_blank">@okonomi</a>さんが送ってくださったプルリクエストも含まれています。</p>
<ul>
<li><a href="http://my.candycane.jp/issues/show/207" class=" issue closed">Bug #207</a>: Supporting plugin architecture. Part3</li>
<li><a href="http://my.candycane.jp/issues/show/208" class=" issue closed">Bug #208</a>: Kindly notice mod_rewrite availability.</li>
<li><a href="http://my.candycane.jp/issues/show/209" class=" issue closed">Bug #209</a>: list is broken on render if it has more than 3items.</li>
<li><a href="http://my.candycane.jp/issues/show/211" class=" issue closed">Bug #211</a>: Plugin generation by console.</li>
<li><a href="http://my.candycane.jp/issues/show/214" class=" issue closed">Bug #214</a>: 「トラッカー」画面でワークフロー未設定のエラーメッセージが表示されない</li>
<li><a href="http://my.candycane.jp/issues/show/185" class=" issue closed">Enhancement  #185</a>: &#8220;Like&#8221; feature for issue.</li>
<li><a href="http://my.candycane.jp/issues/show/210" class=" issue closed">Enhancement  #210</a>: Get plugin catalog from remote.</li>
</ul>
<p>まだバグつぶしや実現できていない構想もありますが、プラグイン機構で自由に機能を追加しやすい土壌が整ってきました。機能だけでなくデザインなどについても自由に組み替えて利用できるようなシステムにしていければよいなと思います。インストールも簡単ですので、お時間のある方はインストールの上でいじってみたり、プラグインを作ってみて貰えれば大変嬉しいです。</p>
<h3>最近の反響</h3>
<p><!-- tweet id : 153844502568767488 --><br />
<style type='text/css'>#bbpBox_153844502568767488 a { text-decoration:none; color:#0084B4; }#bbpBox_153844502568767488 a:hover { text-decoration:underline; }</style>
<div id='bbpBox_153844502568767488' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#C0DEED; background-image:url(http://a0.twimg.com/images/themes/theme1/bg.png); background-repeat:no-repeat'>
<div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#333333; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>CandyCane&#12398;&#12486;&#12540;&#12510;&#12434;&#12459;&#12473;&#12479;&#12510;&#12452;&#12474;&#12375;&#12383;&#12425;&#12289;&#12377;&#12372;&#12367;&#20351;&#12356;&#12420;&#12377;&#12381;&#12358;&#12394;&#35211;&#12383;&#30446;&#12391;&#23566;&#20837;&#12418;&#31777;&#21336;&#12394;BTS&#12364;&#12391;&#12365;&#12390;&#12289;OSS&#20351;&#12387;&#12383;&#38283;&#30330;&#12467;&#12531;&#12469;&#12523;&#12387;&#12390;&#12356;&#12358;&#12420;&#12426;&#12363;&#12383;&#12418;&#12354;&#12427;&#12394;&#8230; &#38283;&#30330;&#29694;&#22580;&#12414;&#12384;&#12411;&#12392;&#12435;&#12393;&#35506;&#38988;&#31649;&#29702;&#12364;&#12450;&#12524;&#12394;&#12398;&#12364;&#35506;&#38988;&#12384;&#12363;&#12425;</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 2012年1月2日 11:26 PM' href='http://twitter.com/#!/tanakahisateru/status/153844502568767488' target='_blank'>2012年1月2日 11:26 PM</a> via <a href="http://www.echofon.com/" rel="nofollow" target="blank">Echofon</a><a href='https://twitter.com/intent/tweet?in_reply_to=153844502568767488' 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=153844502568767488' 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=153844502568767488' 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=tanakahisateru'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a0.twimg.com/profile_images/1295928622/tanakahisateru_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=tanakahisateru'>@tanakahisateru</a>
<div style='margin:0; padding-top:2px'>Hisateru Tanaka</div>
</div>
<div style='clear:both'></div>
</div>
</div>
<p><!-- end of tweet --></p>
<p><!-- tweet id : 153455446647250944 --><br />
<style type='text/css'>#bbpBox_153455446647250944 a { text-decoration:none; color:#0084B4; }#bbpBox_153455446647250944 a:hover { text-decoration:underline; }</style>
<div id='bbpBox_153455446647250944' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#C0DEED; background-image:url(http://a0.twimg.com/images/themes/theme1/bg.png); background-repeat:no-repeat'>
<div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#333333; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>candycane&#35430;&#12375;&#12390;&#12415;&#12383;&#12369;&#12393;&#12475;&#12483;&#12488;&#12450;&#12483;&#12503;&#12364;&#31777;&#21336;&#12391;&#33391;&#12356;&#12290;&#23433;&#23450;&#29256;&#12364;&#20986;&#12383;&#12425;Redmine&#12363;&#12425;&#20055;&#12426;&#25563;&#12360;&#12383;&#12356;&#12394;&#12540;&#12290; <a href="http://t.co/QQfckHJy" rel="nofollow">http://t.co/QQfckHJy</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 2012年1月1日 9:40 PM' href='http://twitter.com/#!/okonomi/status/153455446647250944' target='_blank'>2012年1月1日 9:40 PM</a> via <a href="http://sites.google.com/site/yorufukurou/" rel="nofollow" target="blank">YoruFukurou</a><a href='https://twitter.com/intent/tweet?in_reply_to=153455446647250944' 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=153455446647250944' 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=153455446647250944' 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=okonomi'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a2.twimg.com/profile_images/1144221998/icon_twitter_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=okonomi'>@okonomi</a>
<div style='margin:0; padding-top:2px'>&#12458;&#12467;&#12494;&#12511;</div>
</div>
<div style='clear:both'></div>
</div>
</div>
<p><!-- end of tweet --></p>
<p><!-- tweet id : 151106830058266624 --><br />
<style type='text/css'>#bbpBox_151106830058266624 a { text-decoration:none; color:#0084B4; }#bbpBox_151106830058266624 a:hover { text-decoration:underline; }</style>
<div id='bbpBox_151106830058266624' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#C0DEED; background-image:url(http://a0.twimg.com/images/themes/theme1/bg.png); background-repeat:no-repeat'>
<div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#333333; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>CandyCane&#12434;&#35211;&#12390;&#12427;&#12290;Redmine&#12398;PHP&#29256;&#12391;&#12377;&#12363;&#12353;&#12290;&#23433;&#34276;&#12373;&#12435;&#12364;&#12476;&#12525;&#12363;&#12425;&#38283;&#30330;&#12375;&#22987;&#12417;&#12383;&#12392;&#12289;&#12373;&#12387;&#12365;&#30693;&#12387;&#12390;&#12499;&#12483;&#12463;&#12522;&#12290;&#20932;&#12356;&#12391;&#12377;&#12394;&#12353;&#12290; <a href="http://t.co/CrN15k3W" rel="nofollow">http://t.co/CrN15k3W</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年12月26日 10:07 AM' href='http://twitter.com/#!/khoshino/status/151106830058266624' target='_blank'>2011年12月26日 10:07 AM</a> via web<a href='https://twitter.com/intent/tweet?in_reply_to=151106830058266624' 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=151106830058266624' 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=151106830058266624' 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=khoshino'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a2.twimg.com/profile_images/1296040127/ccccc_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=khoshino'>@khoshino</a>
<div style='margin:0; padding-top:2px'>&#26143;&#37326;&#37030;&#25935;</div>
</div>
<div style='clear:both'></div>
</div>
</div>
<p><!-- end of tweet --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1188/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2011年を振り返る(206投稿,176コミット,8プレゼンテーション)</title>
		<link>http://blog.candycane.jp/archives/1158</link>
		<comments>http://blog.candycane.jp/archives/1158#comments</comments>
		<pubDate>Sat, 31 Dec 2011 05:24:44 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[candycane]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1158</guid>
		<description><![CDATA[激動の2011年が終っていきます。Nyan CatをBGMに今年の活動を振り返ってみようと思います。 ブログ記事 今年は新たに英語の情報を紹介するA-Listersというブログを立ち上げ、このブログと英語版のブログと併せてかなりたくさんのブログ記事を書いた一年になりました。それぞれのブログに投稿した記事数をせっかくなので数えてみます。 A-Listers 119 candycane development 47 CandyCane yet another Redmine on CakePHP 5 個人の英語ブログ 35 合計で206本。こんなに書いたのは初めてです。ただ夏頃に体調を崩したのでここまで書くと健康を害するようなのであまりお勧めできません。 オープンソース活動 今年はCandyCaneに大きな手応えを感じる事が出来た一年でした。さまざまな国からプルリクエストや感想などが届きはじめ、業務で利用しているという話も多く聞きます。思い描いていた機能を実現するまで後少しなのでこのまま頑張って行きたいですね。また、「CandyCaneで起業すればいいじゃん」というアドバイスも国内外から受けています。これについても思案中です。 githubでのコミット数はcandycaneとにゃーんダウンチャートのリポジトリの合計で176コミットでした。どうしても私生活が忙しい時などは引っ張られてしまいますね。 candycane$ git shortlog -sn 43690c..06ed 118 Yusuke Ando 88 Graham Weldon 46 yandod 13 ha1t 3 elboletaire 3 Steve Grosbois 3 Michito Suzuki 2 Òscar Casajuana 1 hiromi2424 1 tomo &#160; cc_nyancat$ git [...]]]></description>
			<content:encoded><![CDATA[<p><iframe width="600" height="450" src="http://www.youtube.com/embed/AaEmCFiNqP0?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>激動の2011年が終っていきます。Nyan CatをBGMに今年の活動を振り返ってみようと思います。</p>
<h3>ブログ記事</h3>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/12/alisters.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/12/alisters-300x129.png" alt="" title="alisters" width="300" height="129" class="aligncenter size-medium wp-image-1162" /></a></p>
<p>今年は新たに英語の情報を紹介するA-Listersというブログを立ち上げ、このブログと英語版のブログと併せてかなりたくさんのブログ記事を書いた一年になりました。それぞれのブログに投稿した記事数をせっかくなので数えてみます。</p>
<ul>
<li><a href="http://tech.a-listers.jp/" target="_blank">A-Listers</a> 119</li>
<li><a href="http://blog.candycane.jp/" target="_blank">candycane development</a> 47</li>
<li><a href="http://en.blog.candycane.jp/" target="_blank">CandyCane yet another Redmine on CakePHP</a> 5</li>
<li>個人の英語ブログ 35</li>
</ul>
<p>合計で206本。こんなに書いたのは初めてです。ただ夏頃に体調を崩したのでここまで書くと健康を害するようなのであまりお勧めできません。</p>
<h3>オープンソース活動</h3>
<p>今年はCandyCaneに大きな手応えを感じる事が出来た一年でした。さまざまな国からプルリクエストや感想などが届きはじめ、業務で利用しているという話も多く聞きます。思い描いていた機能を実現するまで後少しなのでこのまま頑張って行きたいですね。また、<strong>「CandyCaneで起業すればいいじゃん」</strong>というアドバイスも国内外から受けています。これについても思案中です。<br />
githubでのコミット数は<a href="https://github.com/yandod/candycane" target="_blank">candycane</a>と<a href="https://github.com/yandod/cc_nyancat" target="_blank">にゃーんダウンチャート</a>のリポジトリの合計で176コミットでした。どうしても私生活が忙しい時などは引っ張られてしまいますね。</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">candycane$ git shortlog -sn 43690c..06ed
   118  Yusuke Ando
    88  Graham Weldon
    46  yandod
    13  ha1t
     3  elboletaire
     3  Steve Grosbois
     3  Michito Suzuki
     2  Òscar Casajuana
     1  hiromi2424
     1  tomo
&nbsp;
cc_nyancat$ git shortlog -sn
    13  Yusuke Ando</pre></div></div>

<h3>プレゼンテーション</h3>
<p><a href="http://files.myopera.com/sizuhiko/blog/images/cakefest/100_1080.jpg"><img alt="" src="http://files.myopera.com/sizuhiko/blog/images/cakefest/100_1080.jpg" class="alignnone" width="320" height="240" /></a><br />
プレゼンテーションの活動についてはCandyCaneの発表を中心に8回行いました。特に今年はイギリスで行われたCakeFestでの発表に採択されたおかげで初めて海外のイベントで発表する機会を得たのが良かったです。英語的には反省点はいくらでもありますが、発表した事によって世界中からフィードバックを得る事が出来たので成功したと思っています。とはいえもっとスムースに話せるようになりたいので英語の練習はまだまだ欠かせないです。<br />
発表の後に得たフィードバックについては何本か記事を書いて多くの方に読んでもらえました。<br />
<a href="http://blog.candycane.jp/archives/773" title="CakeFest 2011に参加しました。" target="_blank">CakeFest 2011に参加しました。</a><br />
<a href="http://blog.candycane.jp/archives/776" title="CandyCaneの発表で感じた発信と恩返しの大切さ" target="_blank">CandyCaneの発表で感じた発信と恩返しの大切さ</a><br />
<a href="http://blog.candycane.jp/archives/863" title="プログラマがコードを書き、公開する事の価値" target="_blank">プログラマがコードを書き、公開する事の価値</a></p>
<h3>とにかくアウトプットが大事</h3>
<p>日本では震災の影響や海外進出が身近になったことでいろいろと日本のスタイルに対して物を言う空気が出来て来たように思います。自分自身も思う所はありますが、そういった事に対して議論をしているだけで労力を使うよりは自分が理想だと思う事を実行に移して、アウトプットを出して行く方が良いのではと思っています。<br />
来年も引き続きアウトプットを意識して自分が良いと思った事を実行に移す一年にできればよいなと思います。</p>
<p>各地、各方面でお会いした皆様やオンラインでやりとりした皆様には大変お世話になりました。来年も宜しくお願い致します。</p>
<p>昨年の振り返り記事<br />
<a href="http://blog.candycane.jp/archives/478" title="2010年を振り返る" target="_blank">2010年を振り返る</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1158/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>にゃーんダウンチャートが使えます &#8211; CandyCane v0.8.4</title>
		<link>http://blog.candycane.jp/archives/1103</link>
		<comments>http://blog.candycane.jp/archives/1103#comments</comments>
		<pubDate>Sat, 17 Dec 2011 14:37:39 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[candycane]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1103</guid>
		<description><![CDATA[RedmineをPHPに移植したCandyCaneのv0.8.4をリリースしました。 このリリースによりさまざまなプラグインを開発できるようになりました。完全なプロダクトを作るというのはかなり難しい目標です。そこでプラグインシステムを用意して必要な人が自分の好きな機能を追加できるというのが望ましいと考えていました。CandyCaneのプラグインはCakePHPの流儀で作成する事ができ、これによりプラグインを作ってみる方が増えてくればよいなと思っています。ではプラグインの概要を見てみましょう。 CandyCaneのプラグインの基礎 CandyCaneのプラグインはCakePHPのプラグインです。. CakePHPのMVCをベースにしたコードを書く事でCandyCaneにプラグインとして追加できます。また追加のコードからCandyCaneのモデルやヘルパー、コンポーネントなどを呼び出す事が出来ます。例えばチケットのデータやプロジェクトのデータをモデルから取得できます。作成したページがCandyCaneとやり取りをする為のAPIも用意されています。これらのAPIはプラグインの内部のinit.phpから呼び出します。 画面上部のメニューへのページ追加 アプリケーション全体のレベルのページを追加したい場合は画面左上のメニューにリンクを追加する事になるでしょう。リンクを追加するにはMenuContainerオブジェクトをプラグインの中のinit.phpから使います。 $menuContainer = ClassRegistry::getObject&#40;'MenuContainer'&#41;; $menuContainer-&#62;addTopMenu&#40; array&#40; 'url' =&#62; '/cc_nyancat/nyan/index', 'class' =&#62; 'nyan-cat', 'caption' =&#62; 'Nyan Cat', 'logged' =&#62; false, 'admin' =&#62; false &#41; &#41;; プロジェクトタブへのページ追加 CandyCaneの多くのページはプロジェクト以下の要素として動作します。このようなページを作成する場合はページをプロジェクトタブに追加することになります。その場合はMenuContainerクラスを使います。また現在のプロジェクトをURLから推定する為のルーティングの設定が必要です。 $menuContainer-&#62;addProjectMenu&#40; 'nyancat', array&#40; 'plugin' =&#62; 'cc_nyancat', 'controller' =&#62; 'cc_nyancat_chart', 'action' =&#62; 'index', 'class' =&#62; '', 'caption' =&#62; 'Nyan Down Chart', 'params' =&#62; 'project_id', [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://candycanebts.files.wordpress.com/2011/12/candycane1.png"><img class="alignnone size-full wp-image-94" title="candycane1" src="http://candycanebts.files.wordpress.com/2011/12/candycane1.png" alt="" width="450" height="146" /></a></p>
<p><a href="https://github.com/yandod/candycane" target="_blank">RedmineをPHPに移植したCandyCane</a>の<a href="https://github.com/yandod/candycane/tags" target="_blank">v0.8.4をリリースしました。</a> このリリースによりさまざまなプラグインを開発できるようになりました。完全なプロダクトを作るというのはかなり難しい目標です。そこでプラグインシステムを用意して必要な人が自分の好きな機能を追加できるというのが望ましいと考えていました。CandyCaneのプラグインはCakePHPの流儀で作成する事ができ、これによりプラグインを作ってみる方が増えてくればよいなと思っています。ではプラグインの概要を見てみましょう。</p>
<h2>CandyCaneのプラグインの基礎</h2>
<p>CandyCaneのプラグインはCakePHPのプラグインです。. CakePHPのMVCをベースにしたコードを書く事でCandyCaneにプラグインとして追加できます。また追加のコードからCandyCaneのモデルやヘルパー、コンポーネントなどを呼び出す事が出来ます。例えばチケットのデータやプロジェクトのデータをモデルから取得できます。作成したページがCandyCaneとやり取りをする為のAPIも用意されています。これらのAPIはプラグインの内部の<a href="https://github.com/yandod/cc_nyancat/blob/master/init.php" target="_blank">init.php</a>から呼び出します。</p>
<h2>画面上部のメニューへのページ追加</h2>
<p><a href="http://candycanebts.files.wordpress.com/2011/12/plugin1.png"><img class="alignnone size-full wp-image-99" title="plugin1" src="http://candycanebts.files.wordpress.com/2011/12/plugin1.png" alt="" width="450" height="262" /></a></p>
<p>アプリケーション全体のレベルのページを追加したい場合は画面左上のメニューにリンクを追加する事になるでしょう。リンクを追加するにはMenuContainerオブジェクトをプラグインの中のinit.phpから使います。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$menuContainer</span> <span style="color: #339933;">=</span> ClassRegistry<span style="color: #339933;">::</span><span style="color: #004000;">getObject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MenuContainer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$menuContainer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addTopMenu</span><span style="color: #009900;">&#40;</span>
	<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'url'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/cc_nyancat/nyan/index'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'class'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'nyan-cat'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'caption'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Nyan Cat'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'logged'</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;">'admin'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span>
	<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>プロジェクトタブへのページ追加</h2>
<p><a href="http://candycanebts.files.wordpress.com/2011/12/plugin2.png"><img class="alignnone size-full wp-image-102" title="plugin2" src="http://candycanebts.files.wordpress.com/2011/12/plugin2.png" alt="" width="450" height="116" /></a></p>
<p>CandyCaneの多くのページはプロジェクト以下の要素として動作します。このようなページを作成する場合はページをプロジェクトタブに追加することになります。その場合はMenuContainerクラスを使います。また現在のプロジェクトをURLから推定する為のルーティングの設定が必要です。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$menuContainer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addProjectMenu</span><span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">'nyancat'</span><span style="color: #339933;">,</span>
  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #0000ff;">'plugin'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'cc_nyancat'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'cc_nyancat_chart'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'class'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'caption'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Nyan Down Chart'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'params'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'project_id'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'_allowed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #666666; font-style: italic;">// for bypassing permmission system.</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;">// make sure put new route setting which includes project_id</span>
App<span style="color: #339933;">::</span><span style="color: #004000;">import</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Core'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Router'</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;">'/projects/:project_id/nyanchart/:action'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">'plugin'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'cc_nyancat'</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'cc_nyancat_chart'</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>ページ内の特定の場所へのHTML挿入</h2>
<p><a href="http://candycanebts.files.wordpress.com/2011/12/plugin3.png"><img class="alignnone size-full wp-image-104" title="plugin3" src="http://candycanebts.files.wordpress.com/2011/12/plugin3.png" alt="" width="450" height="282" /></a></p>
<p>CandyCaneの既存のページに変更を加えたい場合、テンプレートの構造を元に変更を加えられます。HookContainerクラスのオブジェクトを使って任意のテンプレートをフックできます。テンプレートが分離されているポイントに対しては好きなテンプレートを追加できます。例えばこの場合はNyan Catがissues/relationsテンプレートの後に表示されます。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$hookContainer</span> <span style="color: #339933;">=</span> ClassRegistry<span style="color: #339933;">::</span><span style="color: #004000;">getObject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HookContainer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hookContainer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">registerElementHook</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'issues/relations'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// target element name.</span>
	<span style="color: #0000ff;">'../../plugins/cc_nyancat/views/elements/nyancat'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// additional template you want to inject.</span>
	<span style="color: #009900; font-weight: bold;">false</span> <span style="color: #666666; font-style: italic;">// it should be true when you want to inject before the target template.</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>プラグインのインストール</h2>
<p><iframe width="600" height="450" src="http://www.youtube.com/embed/OuoBuQeSFdo?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>プラグインのインストールには手動の作業が必要ですが、近いうちに自動化する予定です。とはいえ手順はapp/pluginsの下にプラグインを展開するだけです。CandyCaneのプラグインは&#8221;cc_&#8221;で始まるディレクトリで作成され、CandyCaneは&#8221;app/plugins/cc_*&#8221;配下のinit.phpを探してプラグインをロードしています。</p>
<p><strong>注)</strong><br />
<a href="http://blog.candycane.jp/archives/1188" title="ダッシュボードからプラグインのインストールが可能に – CandyCane v0.8.5リリース" target="_blank">プラグインのインストールはすでに自動化されました！</a></p>
<p>実際の例を見るには<a href="https://github.com/yandod/cc_nyancat" target="_blank">cc_nyancat plugin</a> のgithub上のコードを動かしてみてください。みなさんが実際にプラグインを作成して面白い使い方ができるようになることを楽しみしています。</p>
<h3>おまけ：各界の反応</h3>
<p><!-- tweet id : 147181570883715073 --><br />
<style type='text/css'>#bbpBox_147181570883715073 a { text-decoration:none; color:#0084B4; }#bbpBox_147181570883715073 a:hover { text-decoration:underline; }</style>
<div id='bbpBox_147181570883715073' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#022330; background-image:url(http://a0.twimg.com/images/themes/theme15/bg.png); background-repeat:no-repeat'>
<div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#333333; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>PHP&#12377;&#12372;&#12356; / &#8220;&#12450;&#12472;&#12515;&#12452;&#12523;&#38283;&#30330;&#12398;&#12496;&#12540;&#12531;&#12480;&#12454;&#12531;&#12481;&#12515;&#12540;&#12488;&#12399;&#12418;&#12358;&#21476;&#12356;&#65311;&#65281;2012&#24180;&#12363;&#12425;&#12399;&#12300;&#12395;&#12419;&#12540;&#12435;&#12480;&#12454;&#12531;&#12481;&#12515;&#12540;&#12488;&#12301;&#12408; | &#19990;&#30028;&#8221; <a href="http://t.co/KjqtPSlQ" rel="nofollow">http://t.co/KjqtPSlQ</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年12月15日 2:09 PM' href='http://twitter.com/#!/kakutani/status/147181570883715073' target='_blank'>2011年12月15日 2:09 PM</a> via <a href="http://www.hatena.ne.jp/guide/twitter" rel="nofollow" target="blank">Hatena</a><a href='https://twitter.com/intent/tweet?in_reply_to=147181570883715073' 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=147181570883715073' 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=147181570883715073' 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=kakutani'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a3.twimg.com/profile_images/332765353/portlait-20090726-tad_normal.png' /></a></div>
<div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=kakutani'>@kakutani</a>
<div style='margin:0; padding-top:2px'>Kakutani Shintaro</div>
</div>
<div style='clear:both'></div>
</div>
</div>
<p><!-- end of tweet --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1103/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CakePHPの大きなリリースの歴史を振り返る</title>
		<link>http://blog.candycane.jp/archives/1096</link>
		<comments>http://blog.candycane.jp/archives/1096#comments</comments>
		<pubDate>Thu, 15 Dec 2011 16:18:18 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=1096</guid>
		<description><![CDATA[ちょっと気になったのでCakePHPのメジャーなリリースのタイミングを振り返ってみます。 2005 プロジェクト開始 CakePHP1.0 欠番？ 2006/5 ? CakePHP1.1.3 2008/12/26 CakePHP1.2 2010/4/25 CakePHP1.3 2011/10/17 CakePHP2.0 CakePHP1.0って欠番？]]></description>
			<content:encoded><![CDATA[<p>ちょっと気になったのでCakePHPのメジャーなリリースのタイミングを振り返ってみます。</p>
<ul>
<li>2005 プロジェクト開始</li>
<li>CakePHP1.0 欠番？</li>
<li>2006/5 ? CakePHP1.1.3 </li>
<li>2008/12/26 CakePHP1.2</li>
<li>2010/4/25 CakePHP1.3</li>
<li>2011/10/17 CakePHP2.0</li>
</ul>
<p>CakePHP1.0って欠番？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1096/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHPのコーディング規約違反をPHP_CodeSnifferでチェックする #CakephpAdvent2011</title>
		<link>http://blog.candycane.jp/archives/949</link>
		<comments>http://blog.candycane.jp/archives/949#comments</comments>
		<pubDate>Thu, 01 Dec 2011 23:00:00 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=949</guid>
		<description><![CDATA[この記事はCakePHP Advent Calendar 2011に参加しています。 記述したコードの表記ゆれを防ぐ為の手法としてコーディング規約があります。見通しが良く一貫性のあるスタイルで記述されたコードはメンテナンス性を維持する助けになり、コードレビューの際の不毛な論争を少し減らす手助けになります。今回はCakePHPでアプリケーションを開発する際にコーディング規約を適用する方法を検討してみます。 どのコーディング規約を適用するか PHPではPEARのコーディング規約が一般的に知られていますが、PEARはライブラリという事もありこの規約をそのままアプリケーションの実装に適用するのは冗長かもしれません。また同様にZendフレームワークやSymfonyもコーディング規約を持っています。 CakePHPでアプリケーションを実装する場合を考えてみても、PEARのスタイルはCakePHPが採用しているスタイルを使うよりはフレームワークに合わせてCakePHPのスタイルを採用するのはそれなりに妥当なのではないでしょうか。 CakePHPのコーディング規約 CakePHPのコーディング規約については公式のドキュメント内に記述があります。 CakePHP1.3のドキュメント http://book.cakephp.org/view/509/Coding-Standards CakePHP2.0のドキュメント http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html 二つのドキュメントは体裁が異なっていますが内容は現時点で同一です。CakePHPのコーディング規約が定めている内容を下記の通りです。 タブによるインデント 制御構文(if for foreach while switch)の記述 参考演算子 関数呼び出し メソッド定義 コメント ファイルのインクルード PHPタグ 命名規約(関数 クラス メソッド 変数) アクセス修飾子 メソッドチェーン サンプルのアドレス ファイル名 変数の型 定数 PHP_CodeSnifferの導入 コードが規約に沿って記述されているかをチェックするツールとしてはPHP_CodeSnifferが知られています。PEARで配布されているライブラリなのでインストールはPEARコマンドを使う事になります。標準のチャンネルからインストールできるパッケージなので１つのコマンドだけでインストールできます。 pear install PHP_CodeSniffer インストールが完了すれば下記のコマンドでPHP_CodeSnifferが起動します。またインストール済みのコーディング規約のリストを確認もできます。 $ phpcs --version PHP_CodeSniffer version 1.3.1 (stable) by Squiz Pty Ltd. (http://www.squiz.net) [...]]]></description>
			<content:encoded><![CDATA[<p><strong style="color:red">この記事は<a href="http://atnd.org/events/22721" target="_blank">CakePHP Advent Calendar 2011</a>に参加しています。</strong></p>
<p>記述したコードの表記ゆれを防ぐ為の手法としてコーディング規約があります。見通しが良く一貫性のあるスタイルで記述されたコードはメンテナンス性を維持する助けになり、コードレビューの際の不毛な論争を少し減らす手助けになります。今回はCakePHPでアプリケーションを開発する際にコーディング規約を適用する方法を検討してみます。</p>
<h3>どのコーディング規約を適用するか</h3>
<p>PHPではPEARのコーディング規約が一般的に知られていますが、PEARはライブラリという事もありこの規約をそのままアプリケーションの実装に適用するのは冗長かもしれません。また同様にZendフレームワークやSymfonyもコーディング規約を持っています。<br />
CakePHPでアプリケーションを実装する場合を考えてみても、PEARのスタイルはCakePHPが採用しているスタイルを使うよりはフレームワークに合わせてCakePHPのスタイルを採用するのはそれなりに妥当なのではないでしょうか。</p>
<h3>CakePHPのコーディング規約</h3>
<p>CakePHPのコーディング規約については公式のドキュメント内に記述があります。</p>
<p>CakePHP1.3のドキュメント<br />
<a href="http://book.cakephp.org/view/509/Coding-Standards" target="_blank">http://book.cakephp.org/view/509/Coding-Standards</a><br />
CakePHP2.0のドキュメント<br />
<a href="http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html" target="_blank">http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html</a></p>
<p>二つのドキュメントは体裁が異なっていますが内容は現時点で同一です。CakePHPのコーディング規約が定めている内容を下記の通りです。</p>
<ul>
<li>タブによるインデント</li>
<li>制御構文(if for foreach while switch)の記述</li>
<li>参考演算子</li>
<li>関数呼び出し</li>
<li>メソッド定義</li>
<li>コメント</li>
<li>ファイルのインクルード</li>
<li>PHPタグ</li>
<li>命名規約(関数 クラス メソッド 変数)</li>
<li>アクセス修飾子</li>
<li>メソッドチェーン</li>
<li>サンプルのアドレス</li>
<li>ファイル名</li>
<li>変数の型</li>
<li>定数</li>
</ul>
<h3>PHP_CodeSnifferの導入</h3>
<p>コードが規約に沿って記述されているかをチェックするツールとしては<a href="http://pear.php.net/package/PHP_CodeSniffer/" target="_blank">PHP_CodeSniffer</a>が知られています。PEARで配布されているライブラリなのでインストールはPEARコマンドを使う事になります。標準のチャンネルからインストールできるパッケージなので１つのコマンドだけでインストールできます。<br />
<code><br />
pear install PHP_CodeSniffer<br />
</code><br />
インストールが完了すれば下記のコマンドでPHP_CodeSnifferが起動します。またインストール済みのコーディング規約のリストを確認もできます。<br />
<code><br />
$ phpcs --version<br />
PHP_CodeSniffer version 1.3.1 (stable) by Squiz Pty Ltd. (http://www.squiz.net)<br />
$ phpcs -i<br />
The installed coding standards are MySource, PEAR, PHPCS, Squiz and Zend<br />
</code><br />
ご覧の通りPEARの規約などはインストールされていますが、CakePHP用の規約はインストールされていません。CakePHP用の規約は無いのかなとツイートしてみたところCakeのコアな開発者であるsavantさんがgithub上にで<a href="https://github.com/jrbasso/CodeSniffer_CakePHP" target="_blank">jrbassoさんが開発しているもの</a>を教えてくれました。他にも<a href="https://github.com/AD7six/cakephp-codesniffs" target="_blank">AD7sixさんがメンテナンスしているもの</a>もあるのですが、今回は最初のものを使ってみます。phpcsコマンドは任意のディレクトリに存在する規約を読み込む事もできますが、簡単に使うにはPEARのインストールディレクトリ配下の下記のパスにgithubから落としてきたコードを配置します。<br />
<code><br />
PHP/CodeSniffer/Standards/<br />
</code><br />
正常にインストールされていればphpcsコマンドから表示される規約の一覧にCakePHPが追加されているはずです。<br />
<code><br />
$ phpcs -i<br />
The installed coding standards are CakePHP, MySource, PEAR, PHPCS, Squiz and Zend<br />
</code><br />
これで任意のディレクトリのソースをチェックできるようになりました。カレントディレクトリ以下のphpファイルを検査する場合は下記のようなコマンドでOKです。<br />
<code><br />
phpcs  --report=summary --report-checkstyle=CakePHP --standard=CakePHP --extensions=php ./<br />
</code></p>
<h3>Jenkinsとの統合</h3>
<p>CodeSnifferのチェックが出来るようになっても任意で実行するというのはいかにも忘れそうです。ここはモダンにJenkinsからコードを検査するようにすればコミット毎に規約をチェックしてさらにグラフなどを生成してみましょう。Jenkinsから実行する場合は下記のようなコマンドを設定してcheckstyle形式のレポートを生成します。これによりJeninsのcheckstyleプラグインからレポートを読み込んでグラフを生成できます。ただ標準のままですと１つでもエラーがあるとビルドが失敗にマークされてしまうので最後にidコマンドを実行して常にビルドは成功するようにしています。<br />
<code><br />
phpcs  --report=checkstyle --report-checkstyle=checkstyle.xml --standard=CakePHP --extensions=php ./ || id<br />
</code><br />
生成されたグラフは下記のような感じです。いい感じですね。<br />
<a href="http://blog.candycane.jp/wp-content/uploads/2011/12/スクリーンショット（2011-12-01-17.15.31）.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/12/スクリーンショット（2011-12-01-17.15.31）-300x121.png" alt="" title="スクリーンショット（2011-12-01 17.15.31）" width="300" height="121" class="aligncenter size-medium wp-image-1075" /></a></p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/12/スクリーンショット（2011-12-01-16.57.32）.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/12/スクリーンショット（2011-12-01-16.57.32）-300x104.png" alt="" title="スクリーンショット（2011-12-01 16.57.32）" width="300" height="104" class="aligncenter size-medium wp-image-1074" /></a></p>
<p>githubなどでコードを公開する事が増えて来た昨今、コーディング規約に準拠した奇麗なソースを書きたいですね。PHP_CodeSnifferとJenkinsの統合を行えば自然とコードを奇麗に書く習慣がつきますので、まだ設定していない方は設定してみる事を強くお勧めします。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/949/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

