<?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; CakePHP</title>
	<atom:link href="http://blog.candycane.jp/archives/tag/cakephp/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>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>にゃーんダウンチャートが使えます &#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>
		<item>
		<title>candycane v0.8.3 をリリースしました</title>
		<link>http://blog.candycane.jp/archives/1083</link>
		<comments>http://blog.candycane.jp/archives/1083#comments</comments>
		<pubDate>Thu, 01 Dec 2011 09:43:12 +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=1083</guid>
		<description><![CDATA[Version 0.8.3 ダウンロード RedmineをPHPに移植したチケット管理システム、CandyCaneのv0.8.3をリリースしました。今回のリリースではphpmatsuriでの成果とバグフィックスを含んでおり、これによりプラグインを用いてCandyCaneを拡張できるようになりました。 サンプルとしてNyan Catを表示するcc_nyancatプラグインを開発しました。このプラグインを導入するデモ動画があります。こちらの動画ではプラグインがサブディレクトリに配置するだけで有効になる様子をご覧になれます。 延べ作業時間は10時間、6のバグ修正と2つの機能追加です。 Bug #65: チケットの移動時に関連削除処理でエラーがでる Bug #67: チケットを移動させると起票者が変わる Bug #75: ログインしていないのにニュースが編集できてしまう Bug #158: News module was spamed. Enhancement #159: Sending email on updating news. Bug #178: Users can&#8217;t Update issues Enhancement #186: Supporting plugin architecture. Part1 Bug #190: Fix denial of permissions for users with permissions moving issues イベントの開催などが一段落したので今後は開発に多くの時間を割けるようになりそうです。githubでのプルリクエストや実際に使ってみたなどのご報告も歓迎です。宜しくお願い致します。]]></description>
			<content:encoded><![CDATA[<p><a href="https://github.com/yandod/candycane/tags" target="_blank">Version 0.8.3 ダウンロード</a></p>
<p>RedmineをPHPに移植したチケット管理システム、CandyCaneのv0.8.3をリリースしました。今回のリリースではphpmatsuriでの成果とバグフィックスを含んでおり、これによりプラグインを用いてCandyCaneを拡張できるようになりました。</p>
<p>サンプルとしてNyan Catを表示する<a href="https://github.com/yandod/cc_nyancat" target="_blank">cc_nyancatプラグイン</a>を開発しました。このプラグインを導入するデモ動画があります。こちらの動画ではプラグインがサブディレクトリに配置するだけで有効になる様子をご覧になれます。<br />
<iframe width="480" height="360" src="http://www.youtube.com/embed/OuoBuQeSFdo" frameborder="0" allowfullscreen></iframe></p>
<p>延べ作業時間は10時間、6のバグ修正と2つの機能追加です。</p>
<ul>
<li><a href="http://my.candycane.jp/issues/show/65" class=" issue closed">Bug #65</a>: チケットの移動時に関連削除処理でエラーがでる</li>
<li><a href="http://my.candycane.jp/issues/show/67" class=" issue closed">Bug #67</a>: チケットを移動させると起票者が変わる</li>
<li><a href="http://my.candycane.jp/issues/show/75" class=" issue closed">Bug #75</a>: ログインしていないのにニュースが編集できてしまう</li>
<li><a href="http://my.candycane.jp/issues/show/158" class=" issue closed">Bug #158</a>: News module was spamed.</li>
<li><a href="http://my.candycane.jp/issues/show/159" class=" issue closed">Enhancement  #159</a>: Sending email on updating news.</li>
<li><a href="http://my.candycane.jp/issues/show/178" class=" issue closed">Bug #178</a>: Users can&#8217;t Update issues</li>
<li><a href="http://my.candycane.jp/issues/show/186" class=" issue closed">Enhancement  #186</a>: Supporting plugin architecture. Part1</li>
<li><a href="http://my.candycane.jp/issues/show/190" class=" issue closed">Bug #190</a>: Fix denial of permissions for users with permissions moving issues</li>
</ul>
<p>イベントの開催などが一段落したので今後は開発に多くの時間を割けるようになりそうです。githubでのプルリクエストや実際に使ってみたなどのご報告も歓迎です。宜しくお願い致します。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/1083/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPMatsuriの楽しさは参加者自身です</title>
		<link>http://blog.candycane.jp/archives/879</link>
		<comments>http://blog.candycane.jp/archives/879#comments</comments>
		<pubDate>Wed, 19 Oct 2011 14:29:01 +0000</pubDate>
		<dc:creator>yandod</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[candycane]]></category>
		<category><![CDATA[Lithium]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[イベント]]></category>

		<guid isPermaLink="false">http://blog.candycane.jp/?p=879</guid>
		<description><![CDATA[参加者の写真やブログも公開されてきてまだまだ熱気が醒めやらない感じですが今年のPHP Matsuriが無事に終りました。あまりにも多くの事が頭を巡っているのですが、特に大きいものをいくつかまとめて書こうと思います。 Epic Sax Guy 参加された方で来日したGarrettの人柄とEpic Sax Guyが印象に残っていない人は皆無なのではないでしょうか。強烈に明るくオープンでひょうきんな彼のキャラクターはハッカソンの空気を支配していましたね。前回はLithiumの機能についての評判を多く耳にしましたが、今回は逆にLithiumをGarrettの人柄の話題が食っていた気がします。最新のフレームワークの機能やツールは確かに魅力的ですがそれ以上に魅力的なのはその人自身なのではと彼に会ってから感じています。そして毎日数時間はEpic Sax Guyを聞いてしまうわけです。 言葉では伝わらない体験 今年は昨年よりもさらに増えて総勢で90名を越える規模でのハッカソンになりました。初めての参加者の方も居ましたが多くの方から聞いたのが「どういうイベントなのかよくわからなかった」というものです。2年連続の参加となるSioさんも誤解していたようにハッカソンとはどういう雰囲気なのかを言葉で伝えるのは難しい所があります。 朝のあいさつでも話しましたがPHPMatsuriはヤフーが開催しているOpen Hack Day(現在は Hack Uに改名された模様)をコピーしたイベントです。画像やビデオ、文章などのさまざまな手段では伝わらない楽しさを伝える為に自分たちで開催してしまおうと思ったのがきっかけです。 実際にスタッフの１人である@shin1x1さんも「2日目のデモ発表の時間になってみてこういうイベントだったのかとわかった」と言っていました。参加者のレポートから漂う謎の熱気を理解したい方は実際に参加する事が唯一の方法なのだと思います。 参加者の力 豪華ゲストによる講演や忍者軍団、スイーツ、ワークショップと企画が目白押しですが、PHPMatsuriの本当の目玉コンテンツは参加者の皆さん自身です。参加した方それぞれが感じた楽しさは参加者が実際に開発した発表した体験そのものが中心になっていると思います。参加したけれど発表をしなかった方が「次回は発表する」と強く思う人が多いのも周囲を見ていてそれを感じているからではないでしょうか。 今年も@sizuhikoさんをはじめとしたスタッフの献身的な努力で無事にイベントを終える事ができました。まだ余韻に浸っている段階ですが今後も参加者自身の活動が中心となるハッカソン形式のイベントをさらに幅を広げて行って行きたいと思います。 参加者の皆さん、スタッフの皆さんお疲れさまでした！ ※写真は@koyhogeさんと@suzukiさんのFlickrから引用しています。素晴らしい写真をありがとうございます！]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/zatsu/6260016899/sizes/l/in/photostream/" title="Untitled by zatsu, on Flickr"><img src="http://farm7.static.flickr.com/6051/6260016899_9f10852909.jpg" width="500" height="333" alt=""></a></p>
<p><a href="http://2011.phpmatsuri.net/page/blog-and-picture-of-participants">参加者の写真やブログ</a>も公開されてきてまだまだ熱気が醒めやらない感じですが今年のPHP Matsuriが無事に終りました。あまりにも多くの事が頭を巡っているのですが、特に大きいものをいくつかまとめて書こうと思います。</p>
<h3>Epic Sax Guy</h3>
<p><a href="http://www.flickr.com/photos/koyhoge/6247892041/" title="DSC05794 by koyhoge, on Flickr"><img src="http://farm7.static.flickr.com/6235/6247892041_47ae89eff9.jpg" width="500" height="333" alt="DSC05794"></a><br />
参加された方で来日した<a href="http://twitter.com/#!/gwoo">Garrett</a>の人柄と<a href="http://www.youtube.com/watch?v=KHy7DGLTt8g">Epic Sax Guy</a>が印象に残っていない人は皆無なのではないでしょうか。強烈に明るくオープンでひょうきんな彼のキャラクターはハッカソンの空気を支配していましたね。前回はLithiumの機能についての評判を多く耳にしましたが、今回は逆にLithiumをGarrettの人柄の話題が食っていた気がします。最新のフレームワークの機能やツールは確かに魅力的ですがそれ以上に魅力的なのはその人自身なのではと彼に会ってから感じています。そして毎日数時間はEpic Sax Guyを聞いてしまうわけです。</p>
<h3>言葉では伝わらない体験</h3>
<p><a href="http://www.flickr.com/photos/koyhoge/6247047576/" title="DSC05647 by koyhoge, on Flickr"><img src="http://farm7.static.flickr.com/6034/6247047576_4ea6bbf91d.jpg" width="500" height="333" alt="DSC05647"></a><br />
今年は昨年よりもさらに増えて総勢で90名を越える規模でのハッカソンになりました。初めての参加者の方も居ましたが多くの方から聞いたのが<strong>「どういうイベントなのかよくわからなかった」</strong>というものです。2年連続の参加となるSioさんも<a href="http://tyouji.sakura.ne.jp/WordPress/?p=3709" target="_blank">誤解していた</a>ようにハッカソンとはどういう雰囲気なのかを言葉で伝えるのは難しい所があります。<br />
朝のあいさつでも話しましたがPHPMatsuriはヤフーが開催している<a href="http://www.flickr.com/photos/yodelanecdotal/sets/72157622549624826/">Open Hack Day</a>(現在は Hack Uに改名された模様)をコピーしたイベントです。画像やビデオ、文章などのさまざまな手段では伝わらない楽しさを伝える為に自分たちで開催してしまおうと思ったのがきっかけです。<br />
実際にスタッフの１人である<a href="http://twitter.com/#!/shin1x1">@shin1x1</a>さんも<strong>「2日目のデモ発表の時間になってみてこういうイベントだったのかとわかった」</strong>と言っていました。参加者のレポートから漂う謎の熱気を理解したい方は実際に参加する事が唯一の方法なのだと思います。</p>
<h3>参加者の力</h3>
<p><a href="http://www.flickr.com/photos/koyhoge/6245018507/" title="もくもくと作業するみなさん。 #phpmatsuri by koyhoge, on Flickr"><img src="http://farm7.static.flickr.com/6238/6245018507_d93935237f.jpg" width="500" height="375" alt="もくもくと作業するみなさん。 #phpmatsuri"></a><br />
豪華ゲストによる講演や忍者軍団、スイーツ、ワークショップと企画が目白押しですが、<strong>PHPMatsuriの本当の目玉コンテンツは参加者の皆さん自身です</strong>。参加した方それぞれが感じた楽しさは参加者が実際に開発した発表した体験そのものが中心になっていると思います。参加したけれど発表をしなかった方が「次回は発表する」と強く思う人が多いのも周囲を見ていてそれを感じているからではないでしょうか。</p>
<p>今年も<a href="http://twitter.com/#!/sizuhiko">@sizuhiko</a>さんをはじめとしたスタッフの献身的な努力で無事にイベントを終える事ができました。まだ余韻に浸っている段階ですが今後も参加者自身の活動が中心となるハッカソン形式のイベントをさらに幅を広げて行って行きたいと思います。</p>
<p>参加者の皆さん、スタッフの皆さんお疲れさまでした！</p>
<p>※写真は@koyhogeさんと@suzukiさんのFlickrから引用しています。素晴らしい写真をありがとうございます！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/879/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CandyCane v0.8.1 をリリースしました</title>
		<link>http://blog.candycane.jp/archives/849</link>
		<comments>http://blog.candycane.jp/archives/849#comments</comments>
		<pubDate>Sun, 18 Sep 2011 22:19:10 +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=849</guid>
		<description><![CDATA[v0.8.1ダウンロードページ CakePHPで作られた第3のRedmine、CandyCaneのバージョンをv0.8.1のバージョンを打ちました。 ご存知の方もいると思いますが、github上でウォッチされたPHPのプロジェクトのランキングで4位にCandyCaneが入りました！(※ただし、１日限り)。前回のエントリで一連の流れについて書きましたが、CakeFestでの発表で認知度が高まった事が数字に現れたようです。またCakePHPのコアデベロッパのグラハムが開発に協力してくれているのでかなり開発速度が上がっています。 今回は世界中でインストールしてみた人が増えた事から得られたフィードバックを中心に修正しています。やはりインストーラーでWordPressのようにインストールできる点についてはうまくいっているようです。 また既存のRedmineのスキーマを流用する場合はRedmineのV0.8以降に行われたスキーマ変更に追従していない部分があることが分かっています。この部分のキャッチアップについてはスキーマを更新するMigrateをインストーラーに統合してからの対応になるでしょう。 延べ作業時間は16時間、11のバグ修正と1つの機能追加です。また次回のリリースからはPHP5向けにコードを記述していきます。困る人も殆どいないと思いますが、PHP4向けの修正が継続できるようにブランチだけは作っています。 Bug #97: チケットの複数編集時に選択内容が保持されない Bug #103: チケットの状態を終了にした際に進捗率が100％になっていない Bug #114: 最近のプロジェクトにアーカイブされたプロジェクトが表示されている Bug #138: 複数のチケットを編集した際に履歴が1つしか作られていない Bug #153: 送信元メールアドレスとフッタの設定が機能していない Bug #154: 活動のアイテムの並び順が日付の降順になっていない Bug #160: 非公開プロジェクトのwikiがメンバー外から見える Bug #164: Search hits against wiki of pravate project for unlogged in user. Bug #166: (user/edit) don&#8217;t load user&#8217;s language Enhancement #167: (user/edit) Option without password Bug #168: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/09/397328922.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/09/397328922.png" alt="" title="397328922" width="408" height="307" class="aligncenter size-full wp-image-852" /></a></p>
<p><a href="https://github.com/yandod/candycane/archives/v0.8.1">v0.8.1ダウンロードページ</a><br />
<a href="https://github.com/yandod/candycane">CakePHPで作られた第3のRedmine、CandyCane</a>のバージョンをv0.8.1のバージョンを打ちました。</p>
<p>ご存知の方もいると思いますが、<strong>github上でウォッチされたPHPのプロジェクトのランキングで4位にCandyCaneが入りました！</strong>(※ただし、１日限り)。<a href="http://blog.candycane.jp/archives/796" title="日本のCakePHP使いが死力を尽くしたCandyCaneにブレイクの兆し">前回のエントリ</a>で一連の流れについて書きましたが、CakeFestでの発表で認知度が高まった事が数字に現れたようです。またCakePHPのコアデベロッパのグラハムが開発に協力してくれているのでかなり開発速度が上がっています。</p>
<p>今回は世界中でインストールしてみた人が増えた事から得られたフィードバックを中心に修正しています。やはりインストーラーでWordPressのようにインストールできる点についてはうまくいっているようです。<br />
また既存のRedmineのスキーマを流用する場合は<strong>RedmineのV0.8以降に行われたスキーマ変更に追従していない部分</strong>があることが分かっています。この部分のキャッチアップについてはスキーマを更新するMigrateをインストーラーに統合してからの対応になるでしょう。</p>
<p>延べ作業時間は16時間、11のバグ修正と1つの機能追加です。また次回のリリースからはPHP5向けにコードを記述していきます。困る人も殆どいないと思いますが、PHP4向けの修正が継続できるようにブランチだけは作っています。</p>
<ul>
<li><a href="http://my.candycane.jp/issues/show/97" class=" issue closed">Bug #97</a>: チケットの複数編集時に選択内容が保持されない</li>
<li><a href="http://my.candycane.jp/issues/show/103" class=" issue closed">Bug #103</a>: チケットの状態を終了にした際に進捗率が100％になっていない</li>
<li><a href="http://my.candycane.jp/issues/show/114" class=" issue closed">Bug #114</a>: 最近のプロジェクトにアーカイブされたプロジェクトが表示されている</li>
<li><a href="http://my.candycane.jp/issues/show/138" class=" issue closed">Bug #138</a>: 複数のチケットを編集した際に履歴が1つしか作られていない</li>
<li><a href="http://my.candycane.jp/issues/show/153" class=" issue closed">Bug #153</a>: 送信元メールアドレスとフッタの設定が機能していない</li>
<li><a href="http://my.candycane.jp/issues/show/154" class=" issue closed">Bug #154</a>: 活動のアイテムの並び順が日付の降順になっていない</li>
<li><a href="http://my.candycane.jp/issues/show/160" class=" issue closed">Bug #160</a>: 非公開プロジェクトのwikiがメンバー外から見える</li>
<li><a href="http://my.candycane.jp/issues/show/164" class=" issue closed">Bug #164</a>: Search hits against wiki of pravate project for unlogged in user.</li>
<li><a href="http://my.candycane.jp/issues/show/166" class=" issue closed">Bug #166</a>: (user/edit)  don&#8217;t load user&#8217;s language</li>
<li><a href="http://my.candycane.jp/issues/show/167" class=" issue closed">Enhancement  #167</a>: (user/edit) Option without password</li>
<li><a href="http://my.candycane.jp/issues/show/168" class=" issue closed">Bug #168</a>: Issue priority changes when adding update/comment to issue</li>
<li><a href="http://my.candycane.jp/issues/show/170" class=" issue closed">Bug #170</a>: Emain wont be sent on bulk edit of issue.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/849/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>日本のCakePHP使いが死力を尽くしたCandyCaneにブレイクの兆し</title>
		<link>http://blog.candycane.jp/archives/796</link>
		<comments>http://blog.candycane.jp/archives/796#comments</comments>
		<pubDate>Tue, 13 Sep 2011 04:34:38 +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=796</guid>
		<description><![CDATA[前回のエントリを書いてからまだ一週間も経っていませんが、CakePHP版RedmineのCandyCaneへの反響に驚いています。CakeFestでの発表の後に下記の反応を貰った事は前回触れましたが、その後も色々な反応がありました。 CakePHPのコアメンバーの１人である@predominantさんからの反応や、会場に来ていた@theMojoWillさん、配信を見ていた@sumardiさんからの反応は発表のあとすぐに届きました。 Really enjoying @yando&#8216;s talk at #CakeFest on CandyCane. http://t.co/vT775reless than a minute ago via Twitter for Mac Favorite Retweet ReplyGraham Weldonpredominant @yando have a few more candycane questions for u after a beer or two tonight! #CakeFestless than a minute ago via Twitter for iPhone Favorite Retweet ReplyWill WilsontheMojoWill @yando cool. thanks. watched [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane4.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane4.png" alt="" title="candycane4" width="278" height="162" class="aligncenter size-full wp-image-838" /></a></p>
<p><a href="http://blog.candycane.jp/archives/776" title="CandyCaneの発表で感じた発信と恩返しの大切さ">前回のエントリ</a>を書いてからまだ一週間も経っていませんが、<a href="https://github.com/yandod/candycane">CakePHP版RedmineのCandyCane</a>への反響に驚いています。<a href="http://blog.candycane.jp/archives/773" title="CakeFest 2011に参加しました。">CakeFestでの発表</a>の後に下記の反応を貰った事は前回触れましたが、その後も色々な反応がありました。<br />
CakePHPのコアメンバーの１人である@predominantさんからの反応や、会場に来ていた@theMojoWillさん、配信を見ていた@sumardiさんからの反応は発表のあとすぐに届きました。</p>
<style type='text/css'>.bbpBox109940221977702400 {background:url(http://a2.twimg.com/profile_background_images/65287766/GrahamTwitterBackground.png) #1a1420;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox109940221977702400'>
<p class='bbpTweet'>Really enjoying @<a class="tweet-url username" href="http://twitter.com/yando" rel="nofollow">yando</a>&#8216;s talk at <a href="http://twitter.com/search?q=%23CakeFest" title="#CakeFest" class="tweet-url hashtag" rel="nofollow">#CakeFest</a> on CandyCane. <a href="http://t.co/vT775re" rel="nofollow">http://t.co/vT775re</a><span class='timestamp'><a title='Sat Sep 03 10:46:06 +0000 2011' href='http://twitter.com/#!/predominant/status/109940221977702400'>less than a minute ago</a> via <a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow">Twitter for Mac</a> <a href='http://twitter.com/intent/favorite?tweet_id=109940221977702400'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=109940221977702400'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=109940221977702400'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/predominant'><img src='http://a3.twimg.com/profile_images/1130623398/Slavitica_Avatar__No_Text__normal.png' /></a><strong><a href='http://twitter.com/predominant'>Graham Weldon</a></strong><br/>predominant</span></span></p>
</div>
<style type='text/css'>.bbpBox109944537836830721 {background:url(http://a3.twimg.com/profile_background_images/136225507/twitterbg.jpg) #ffffff;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox109944537836830721'>
<p class='bbpTweet'>@<a class="tweet-url username" href="http://twitter.com/yando" rel="nofollow">yando</a> have a few more candycane questions for u after a beer or two tonight! <a href="http://twitter.com/search?q=%23CakeFest" title="#CakeFest" class="tweet-url hashtag" rel="nofollow">#CakeFest</a><span class='timestamp'><a title='Sat Sep 03 11:03:15 +0000 2011' href='http://twitter.com/#!/theMojoWill/status/109944537836830721'>less than a minute ago</a> via <a href="http://twitter.com/#!/download/iphone" rel="nofollow">Twitter for iPhone</a> <a href='http://twitter.com/intent/favorite?tweet_id=109944537836830721'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=109944537836830721'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=109944537836830721'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/theMojoWill'><img src='http://a2.twimg.com/profile_images/1526675317/image_normal.jpg' /></a><strong><a href='http://twitter.com/theMojoWill'>Will Wilson</a></strong><br/>theMojoWill</span></span></p>
</div>
<style type='text/css'>.bbpBox109988572299403264 {background:url(http://a0.twimg.com/images/themes/theme1/bg.png) #C0DEED;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox109988572299403264'>
<p class='bbpTweet'>@<a class="tweet-url username" href="http://twitter.com/yando" rel="nofollow">yando</a> cool. thanks. watched ur presentation from Kuala Lumpur. great.<span class='timestamp'><a title='Sat Sep 03 13:58:13 +0000 2011' href='http://twitter.com/#!/sumardi/status/109988572299403264'>less than a minute ago</a> via <a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow">Twitter for Mac</a> <a href='http://twitter.com/intent/favorite?tweet_id=109988572299403264'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=109988572299403264'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=109988572299403264'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/sumardi'><img src='http://a1.twimg.com/profile_images/1338320519/290762341_normal.png' /></a><strong><a href='http://twitter.com/sumardi'>SuMrDi</a></strong><br/>sumardi</span></span></p>
</div>
<p><!-- end of tweet --></p>
<p>その後、数日たってNYにお住まいでCakeFestにもいつも来ている@savantさんが他にもRedmineを移植しようとしているフランスのユーザーがが居るのを発見したと教えてくれました。この@kwikyさんは勇敢にもフルスクラッチでRedmineを移植しようとしており、最初の画面が表示された所までで協力者を探しているようでした。<br />
<!-- http://twitter.com/#!/savant/status/111882323758288896 --><br />
<style type='text/css'>.bbpBox111882323758288896 {background:url(http://a3.twimg.com/profile_background_images/316982999/background.png) #242424;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox111882323758288896'>
<p class='bbpTweet'>@<a class="tweet-url username" href="http://twitter.com/yando" rel="nofollow">yando</a> Just saw this: <a href="http://t.co/TRkDOWi" rel="nofollow">http://t.co/TRkDOWi</a><span class='timestamp'><a title='Thu Sep 08 19:23:19 +0000 2011' href='http://twitter.com/#!/savant/status/111882323758288896'>less than a minute ago</a> via <a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow">Twitter for Mac</a> <a href='http://twitter.com/intent/favorite?tweet_id=111882323758288896'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=111882323758288896'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=111882323758288896'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/savant'><img src='http://a0.twimg.com/profile_images/1362739988/IMG_20110520_2150310-2_normal.jpg' /></a><strong><a href='http://twitter.com/savant'>Jose Diaz-Gonzalez</a></strong><br/>savant</span></span></p>
</div>
<p><!-- end of tweet --></p>
<p>このまま2つのPHP版Redmineが開発されていくのはあまりにも悲しいという事でさらに@phpMagpieさんが会話に参加。この方もイギリスの方でCakeFestの参加者です。<br />
<!-- http://twitter.com/#!/phpMagpie/status/111892146847629312 --><br />
<style type='text/css'>.bbpBox111892146847629312 {background:url(http://a0.twimg.com/images/themes/theme1/bg.png) #C0DEED;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox111892146847629312'>
<p class='bbpTweet'>@<a class="tweet-url username" href="http://twitter.com/yando" rel="nofollow">yando</a> would be much better for the guy to help out with CandyCane rather than going it alone &#8230; I&#8217;m sure he will when he realises <img src='http://blog.candycane.jp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span class='timestamp'><a title='Thu Sep 08 20:02:21 +0000 2011' href='http://twitter.com/#!/phpMagpie/status/111892146847629312'>less than a minute ago</a> via <a href="http://www.hootsuite.com" rel="nofollow">HootSuite</a> <a href='http://twitter.com/intent/favorite?tweet_id=111892146847629312'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=111892146847629312'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=111892146847629312'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/phpMagpie'><img src='http://a1.twimg.com/profile_images/1529499264/paul_normal.jpg' /></a><strong><a href='http://twitter.com/phpMagpie'>Paul Gardner</a></strong><br/>phpMagpie</span></span></p>
</div>
<p><!-- end of tweet --></p>
<p>メッセージをkwikyさんに送ったところ、自分のプロジェクトを速攻で閉鎖し、すぐにCandyCaneに<a href="https://github.com/yandod/candycane/pull/8">フランス語のロケールとフッターのコードの修正</a>やスキーマのミスの修正を送って来てくれました。<br />
<a href="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane2.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane2-300x87.png" alt="" title="candycane2" width="300" height="87" class="aligncenter size-medium wp-image-820" /></a></p>
<p>会話に参加していた@phpMagpieさんもCandyCaneをインストールしてCSSのリンク切れを教えてくれました。<br />
<!-- http://twitter.com/#!/phpMagpie/status/113196489555181568 --><br />
<style type='text/css'>.bbpBox113196489555181568 {background:url(http://a0.twimg.com/images/themes/theme1/bg.png) #C0DEED;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox113196489555181568'>
<p class='bbpTweet'>@<a class="tweet-url username" href="http://twitter.com/yando" rel="nofollow">yando</a> I&#8217;m installing candycane, seems there are missing css files at first install page? admin.css 960.css reset.css<span class='timestamp'><a title='Mon Sep 12 10:25:20 +0000 2011' href='http://twitter.com/#!/phpMagpie/status/113196489555181568'>less than a minute ago</a> via <a href="http://www.hootsuite.com" rel="nofollow">HootSuite</a> <a href='http://twitter.com/intent/favorite?tweet_id=113196489555181568'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=113196489555181568'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=113196489555181568'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/phpMagpie'><img src='http://a1.twimg.com/profile_images/1529499264/paul_normal.jpg' /></a><strong><a href='http://twitter.com/phpMagpie'>Paul Gardner</a></strong><br/>phpMagpie</span></span></p>
</div>
<p> <!-- end of tweet --></p>
<p>このあたりの状況を見ていた@itemanさんが「ブレイク」という言葉で祝福してくれました。ちなみに何ヶ月か前に徹夜のネットラジオでCandyCaneの今後の展開について語ったりもしたので、状況を分かって頂けたのかもしれません。<br />
<!-- http://twitter.com/#!/iteman/status/113291089548558336 --><br />
<style type='text/css'>.bbpBox113291089548558336 {background:url(http://a1.twimg.com/images/themes/theme8/bg.gif) #8B542B;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox113291089548558336'>
<p class='bbpTweet'>candycaneブレイクしていますね。おめでとうございます。<span class='timestamp'><a title='Mon Sep 12 16:41:15 +0000 2011' href='http://twitter.com/#!/iteman/status/113291089548558336'>less than a minute ago</a> via <a href="http://www.hootsuite.com" rel="nofollow">HootSuite</a> <a href='http://twitter.com/intent/favorite?tweet_id=113291089548558336'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=113291089548558336'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=113291089548558336'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/iteman'><img src='http://a2.twimg.com/profile_images/756483666/kubodog2-512-512_normal.jpg' /></a><strong><a href='http://twitter.com/iteman'>iteman</a></strong><br/>iteman</span></span></p>
</div>
<p> <!-- end of tweet --></p>
<p>時を同じくしてバグ管理のプロジェクトにも<a href="http://my.candycane.jp/issues/show/165">インストール時に不具合に遭遇したという報告</a>や、いくつかの挙動の報告をIgorさんがしてくれています。またインストール方法について案内した後にすばらしい一言をくれました。<br />
<strong>&#8220;good job about porting Redmine to PHP. I was really looking for something like this.&#8221;<br />
(Redmineの移植すごいですね。こういうのを探していたんです)</strong></p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane3.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane3-300x222.png" alt="" title="candycane3" width="300" height="222" class="aligncenter size-medium wp-image-827" /></a></p>
<p>そしてその後、CakeDCでのCandyCane導入を考えているといっていた@predominantさんが本気を出して怒濤のリファクタリングを開始。<a href="https://github.com/predominant/candycane/commits/master">一晩に33ものコミット</a>を行って不具合の修正などをしてくれています。結果的にネットワークチャートがすごいことに。<br />
<a href="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane1.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane1-300x119.png" alt="" title="candycane1" width="300" height="119" class="aligncenter size-medium wp-image-829" /></a></p>
<p>また気づいていないうちにドイツの@meinnerdさんがRedmineを移植した上に結構できてるみたいで、こいつらおかしい！というお褒めの言葉をくれていました。<br />
<!-- http://twitter.com/#!/meineerde/status/113355427986673664 --><br />
<style type='text/css'>.bbpBox113355427986673664 {background:url(http://a1.twimg.com/images/themes/theme9/bg.gif) #1A1B1F;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
<div class='bbpBox113355427986673664'>
<p class='bbpTweet'>I think I&#8217;m losing it. Somebody actually ported Redmine to PHP. And even included all of the warts. This is insane! <a href="http://t.co/4XGJnPr" rel="nofollow">http://t.co/4XGJnPr</a><span class='timestamp'><a title='Mon Sep 12 20:56:54 +0000 2011' href='http://twitter.com/#!/meineerde/status/113355427986673664'>less than a minute ago</a> via <a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow">Twitter for Mac</a> <a href='http://twitter.com/intent/favorite?tweet_id=113355427986673664'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=113355427986673664'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=113355427986673664'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/meineerde'><img src='http://a1.twimg.com/profile_images/429255848/210300298_e9bfa8d551_normal.jpg' /></a><strong><a href='http://twitter.com/meineerde'>Holger Just</a></strong><br/>meineerde</span></span></p>
</div>
<p> <!-- end of tweet --></p>
<p>地道にインストーラーの国際化などをしておいたおかげか、ひとまず各所でインストールしてみる事は成功しているようです。最新のRedmineから移行するとスキーマーの違いでエラーになる部分があることも分かってきましたが、この辺りの対応はバグが落ち着いて来た所ですることになるでしょう。<br />
また日本からも<strong><a href="https://github.com/yandod/candycane/pull/7#commitcomment-460756">リアル案件でCandyCaneを使っている</a></strong>！という熱い情報がすでに寄せられています。</p>
<p>元々CandyCaneは当時東京に居たCakePHPユーザーが中心になって行った開発合宿の成果物ということで多くの人の手が入っているのですが、ここに来てコントリビューターのリストが一気に国際色を帯びました。日本でも有数のCakePHP使いの皆さんが死力を振り絞って作ったコードがこういう形で陽の目を見るのはとてもうれしいです。またその事を忘れない為にもフッターにはコントリビューター一覧へのリンクを付ける事にしました。</p>
<p><a href="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane5.png"><img src="http://blog.candycane.jp/wp-content/uploads/2011/09/candycane5.png" alt="" title="candycane5" width="249" height="61" class="aligncenter size-full wp-image-846" /></a></p>
<p>思えば２泊３日で睡眠時間が１日数時間という地獄のような合宿があってこそ。gitもそこで覚えた人もいたし。</p>
<p><a href="http://www.flickr.com/photos/zatsu/3438252712/" title="DSC06895 by zatsu, on Flickr"><img src="http://farm4.static.flickr.com/3415/3438252712_e50f69f118.jpg" width="500" height="333" alt="DSC06895"></a></p>
<p><a href="http://www.flickr.com/photos/zatsu/3438241230/" title="DSC06861 by zatsu, on Flickr"><img src="http://farm4.static.flickr.com/3361/3438241230_2604b17a04.jpg" width="500" height="333" alt="DSC06861"></a></p>
<p>すでに立ち上げからは2年が経過し、こんなに多くの人の手が入ったコードを扱っている事には我ながら驚いています。またフィードバックを受けながらソフトウェアが進化するというオープンソースの基本原理を実際に体験する事が出来てなんとも不思議な気持ちです。<br />
日本に居なかったので日本の勉強会での発表やハッカソンなどは全くできていなかったのですが、協力して頂いた皆さんのコードや声を無駄にしないように気長に続けて行ければと思います。</p>
<p>さしあたってはバグの修正とプラグイン開発の土台作りまではこのまま走って行ければと思います。アジャイルの対応やSCMなどの連携はプラグインとして実装できるようにしておいて、各地のCake使いが作れるのが理想かなと思っていますので。</p>
<p>今後も宜しくお願いします。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.candycane.jp/archives/796/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

