<?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/"
	>

<channel>
	<title>CYPHER-WORKS（コピペプログラマから書けるプログラマへ）</title>
	<atom:link href="http://blog.cypher-works.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.cypher-works.com</link>
	<description>Ruby(Ruby on Rails)、PHP（主にCakePHP）、iPhone、OpenSocial、JQuery、ネットワークの技術レベルを上げるための奮闘記。</description>
	<pubDate>Tue, 31 Aug 2010 13:58:16 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>「お泊まりごろごろgeek in twitterアプリ」に行ってきた</title>
		<link>http://blog.cypher-works.com/?p=1180</link>
		<comments>http://blog.cypher-works.com/?p=1180#comments</comments>
		<pubDate>Tue, 31 Aug 2010 13:55:17 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1180</guid>
		<description><![CDATA[				いまさら報告。
				コンドミニアムに泊まってみんなでtwitterアプリを作ろう。
				なる趣旨のイベントに行ってきました。
				どんなことしかというと、下のがだいたいの流れです
				◆9時に東京駅集合
				↓
				◆車レンタルしてコンドミニアム（千葉県南房総市白浜）に出発
				↓
				◆車内からでもあいのりという形でネットをする。雑談でSencha TouchやらTwitter関連の話をする。
				途中アクアライン入り口でのメロンパンにテンションマックス。
				↓
				◆コンドミニアム到着。荷物をおいてお昼に出掛ける。そこで今回のイベントの趣旨を聞きつつゴールを決める。
				今回の趣旨は「Twitter APIを利用して、みんなでアイデアをだして、Webアプリを作成しよう」おおまかにこんな感じ。
				30分くらいブレインストーミングをして作成するアプリを決めた。
				別に目的ある人は、これに参加しなくて自分の作成したいものを作るのもあり（これ自分。協調性ない？汗）。
				↓
				◆２時くらいから７時くらいまでガリガリプログラミング。得意な分野でわかれたような気がする。
				デザイン出来る人はコーディング、JS得意な人はフロントまわり、その他、みたいな。
				自分は作業BGMききながらプログラミング。
				合宿さいこーと思ったひととき。
				↓
				◆７時くらいになったら夕ごはん。このくらいになるとだいぶ形になってきた。
				正直一日で完成できるくらいのゴールにしたのがよかったと思う。
				こんだては主催者の方が野菜たっぷりカレーを作ってくれました。
				ほんとありがとう。おいしかったです。というか家みたいな感じでほんとよかったです。
				合宿さいこーと思ったひととき。
				↓
				◆夕ごはん食べ終わって引き続き作業。
				ごろごろしながら作業してなんとなく完成迎える。
				これ。http://measure.nextfun.asia/
				１１時くらいまで。そっからお風呂入ったり、布団敷いたりでその日は終了。
				↓
				◆朝。朝ごはんも主催者の方が作ってくれてみんなでおいしくほおばる。
				ありがとう。
				１０時（だったかな？）前にはこのコンドミニアム出なきゃいけなかったので、
				出発。帰路。
				↓
				◆おわり。
				ではなく、なんなとなく時間もあるから千葉のドイツ村に行った。
				ビール飲みーの、芝そりーの、ゲーセンやりーの遊ぶ。
				これでおわり。
				所感：
				かなり楽しかったです。
				開発合宿は今まで一回も行ったことはないけど、こんなアットホームを感じる合宿はめずらしいと思います。
				開発合宿に行く機会があるならこれからも行ってみようと思える経験になりました。
				合宿に行った皆様ありがとうございました。
				なおなお、2010/10/02に開催されるPHP Matsuriに行きます。
				これも日にちをまたいで行われるイベントです。興味ある方はぜひ。
				ではでは。
]]></description>
			<content:encoded><![CDATA[				<p>いまさら報告。<br />
				<a href="http://atnd.org/events/5104">コンドミニアムに泊まってみんなでtwitterアプリを作ろう。</a><br />
				なる趣旨のイベントに行ってきました。</p>
				<p>どんなことしかというと、下のがだいたいの流れです<br />
				◆9時に東京駅集合<br />
				↓<br />
				◆車レンタルして<a href="http://www.jalan.net/jalan/jweb/yado/YADS_318746.HTML">コンドミニアム</a>（千葉県南房総市白浜）に出発<br />
				↓<br />
				◆車内からでもあいのりという形でネットをする。雑談でSencha TouchやらTwitter関連の話をする。<br />
				途中アクアライン入り口でのメロンパンにテンションマックス。<br />
				↓<br />
				◆コンドミニアム到着。荷物をおいてお昼に出掛ける。そこで今回のイベントの趣旨を聞きつつゴールを決める。<br />
				今回の趣旨は「Twitter APIを利用して、みんなでアイデアをだして、Webアプリを作成しよう」おおまかにこんな感じ。<br />
				30分くらいブレインストーミングをして作成するアプリを決めた。<br />
				別に目的ある人は、これに参加しなくて自分の作成したいものを作るのもあり（これ自分。協調性ない？汗）。<br />
				↓<br />
				◆２時くらいから７時くらいまでガリガリプログラミング。得意な分野でわかれたような気がする。<br />
				デザイン出来る人はコーディング、JS得意な人はフロントまわり、その他、みたいな。<br />
				自分は作業BGMききながらプログラミング。<br />
				合宿さいこーと思ったひととき。<br />
				↓<br />
				◆７時くらいになったら夕ごはん。このくらいになるとだいぶ形になってきた。<br />
				正直一日で完成できるくらいのゴールにしたのがよかったと思う。<br />
				こんだては主催者の方が野菜たっぷりカレーを作ってくれました。<br />
				ほんとありがとう。おいしかったです。というか家みたいな感じでほんとよかったです。<br />
				合宿さいこーと思ったひととき。<br />
				↓<br />
				◆夕ごはん食べ終わって引き続き作業。<br />
				ごろごろしながら作業してなんとなく完成迎える。<br />
				これ。<a href="http://measure.nextfun.asia/">http://measure.nextfun.asia/</a><br />
				１１時くらいまで。そっからお風呂入ったり、布団敷いたりでその日は終了。<br />
				↓<br />
				◆朝。朝ごはんも主催者の方が作ってくれてみんなでおいしくほおばる。<br />
				ありがとう。<br />
				１０時（だったかな？）前にはこのコンドミニアム出なきゃいけなかったので、<br />
				出発。帰路。<br />
				↓<br />
				◆おわり。<br />
				ではなく、なんなとなく時間もあるから千葉の<a href="http://www.t-doitsumura.co.jp/parkguide/attraction/index.html">ドイツ村</a>に行った。<br />
				ビール飲みーの、芝そりーの、ゲーセンやりーの遊ぶ。<br />
				これでおわり。</p>
				<p>所感：<br />
				かなり楽しかったです。<br />
				開発合宿は今まで一回も行ったことはないけど、こんなアットホームを感じる合宿はめずらしいと思います。<br />
				開発合宿に行く機会があるならこれからも行ってみようと思える経験になりました。<br />
				合宿に行った皆様ありがとうございました。</p>
				<p>なおなお、2010/10/02に開催されるPHP Matsuriに行きます。<br />
				これも日にちをまたいで行われるイベントです。興味ある方はぜひ。</p>
				<p>ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1180</wfw:commentRss>
		</item>
		<item>
		<title>第五回CakePHP勉強会に行ってきた</title>
		<link>http://blog.cypher-works.com/?p=1159</link>
		<comments>http://blog.cypher-works.com/?p=1159#comments</comments>
		<pubDate>Sat, 29 May 2010 19:00:54 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1159</guid>
		<description><![CDATA[				第五回CakePHP勉強会に行ってきました。
				以下、覚書の印象に残った事柄を抜粋して書きます。
				内容
				// {{{ 特報目玉イベント2010 安藤さん
				海外からスカイプを通してのプレゼンです。
				今年のCakeMatsuriの紹介をしてくれました。
				発表のスライドショーです。http://www.slideshare.net/yandod/20100529-phpday
				  オールナイト！！！！！！！
				  朝9時から翌日5時まで
				  講演スペースと開発スペースが用意される？各自開発するスペース
				  未発表作成・機能のコンテストを開催
				  開発タイム終了後いデモを実施
				  作業スペースは終夜可
				  レクレーションやイベントを開催予定
				  Litiumの思想をセッション
				  ワークショップ
				    入門者向け、中級者向け、Litium入門者
				  プラグインライブラリ賞
				    wordpressやsymfonyでも
				  ハッカソン賞
				    イベント開始後にテーマに沿って開発
				  ドキュメント賞
				    ベンチマークなどなど
				  協賛して頂ける企業を募集
				    コンテスト各賞のスポンサー
				      [...]]]></description>
			<content:encoded><![CDATA[				<p>第五回CakePHP勉強会に行ってきました。<br />
				以下、覚書の印象に残った事柄を抜粋して書きます。</p>
				<h3>内容</h3>
				<p><strong>// {{{ 特報目玉イベント2010 安藤さん</strong></p>
				<p>海外からスカイプを通してのプレゼンです。<br />
				今年のCakeMatsuriの紹介をしてくれました。<br />
				発表のスライドショーです。<a href="http://www.slideshare.net/yandod/20100529-phpday">http://www.slideshare.net/yandod/20100529-phpday</a></p>
				<p>  オールナイト！！！！！！！<br />
				  朝9時から翌日5時まで<br />
				  講演スペースと開発スペースが用意される？各自開発するスペース<br />
				  未発表作成・機能のコンテストを開催<br />
				  開発タイム終了後いデモを実施<br />
				  作業スペースは終夜可<br />
				  レクレーションやイベントを開催予定<br />
				  Litiumの思想をセッション<br />
				  ワークショップ<br />
				    入門者向け、中級者向け、Litium入門者<br />
				  プラグインライブラリ賞<br />
				    wordpressやsymfonyでも<br />
				  ハッカソン賞<br />
				    イベント開始後にテーマに沿って開発<br />
				  ドキュメント賞<br />
				    ベンチマークなどなど<br />
				  協賛して頂ける企業を募集<br />
				    コンテスト各賞のスポンサー<br />
				      ディナー協賛などなど<br />
				  運営スタッフ募集</p>
				<p>かなりおもしろそーー！！！！！<br />
				twitterの方で情報が流れます。@phpmatsuri<br />
				// }}}</p>
				<p><strong>// {{{ CakePHP 1.3 Stable cakephperさん</strong><br />
				発表資料です。<a href="http://www.slideshare.net/ichikaway/cakephp-tokyo5">http://www.slideshare.net/ichikaway/cakephp-tokyo5</a></p>
				<p>1.3の新機能</p>
				<p>  Routes<br />
				    Prefix Routing<br />
				      Adminルーディングと同じ扱いに<br />
				    RouteClass<br />
				      ルーティング処理マッチング時に自作クラス呼び出し<br />
				      DBの値を見てマッチング処理を行う<br />
				        →例1:該当のslugがDBにあればroutingする<br />
				        →例1:urlの一部変更でリダイレクト</p>
				<p>config/routes.php</p>
				<pre class="syntax-highlight:php">
App::import( &#039;Lib&#039;, &#039;routes/SlugRoute&#039; );
Router::connect(
    &#039;/:slug&#039;,
    array( &#039;controller&#039; =&gt; &#039;posts&#039;, &#039;action&#039; =&gt; &#039;view&#039; ),
    array( &#039;routeClass&#039; =&gt; &#039;SlugRoute&#039; )
);
</pre>
				<p> app/libs/routes/slug_route.php</p>
				<pre class="syntax-highlight:php">
class Slug extends CakeRoute {

    function parse( $url ) {

        $params = parent::parse( $url );

        App::import( &#039;Model&#039;, &#039;Post&#039; );

        $Post = new Post();

        $count = $Post-&gt;find( &#039;count&#039;, array( &#039;conditions&#039; =&gt;
            array( &#039;Post.slug LIKE ?&#039; =&gt; $params[&#039;slug&#039;] . &#039;%&#039; ) ) );

        if( $count ) {
            return $params;
        }
        return false;
    }
}
</pre>
				<p>  Virtual Fields<br />
				    DBカラムを仮想定義して、Fieldとして扱える<br />
				    詳細：<a href="http://book.cakephp.org/ja/view/1608/Virtual-fields">http://book.cakephp.org/ja/view/1608/Virtual-fields</a><br />
				    　　；<a href="http://d.hatena.ne.jp/hiromi2424/20100204/1265274976">http://d.hatena.ne.jp/hiromi2424/20100204/1265274976</a></p>
				<p>  Validation<br />
				    マルチバイト対応<br />
				      maxLength()などはmb_strlen()を使用<br />
				      mb_strlen()が定義されていなければマルチバイトクラスのMultibyte::strlen()を利用<br />
				    国別のルールを適用<br />
				      Phone, postcode, SSN<br />
				      例；日本のpostcodeなら222-3333というルール<br />
				      →例あるからスライド参照しろ</p>
				<p>// }}}</p>
				<p><strong>// {{{ Ktai Library on CakePHP1.3  MASA-Pさん</strong></p>
				<p>  ライブラリクラスの分割<br />
				    絵文字や機種情報なとをすべて読み込むとメモリを消費するので<br />
				    →サブクラス化して必要なものだけ読み込むようにした</p>
				<p>  絵文字コンバートルーチンの改良<br />
				    絵文字総当たりで置換していたためとても重かったためアルゴリズムを改良<br />
				    異なるエンコーディングへの変換の場合に<br />
				    絵文字のキャッシュ機能を付加</p>
				<p>  IPアドレスによるキャリア判定を搭載!!!!!!!!!!!<br />
				    ユーザーエージェント偽装によるアクセスを対応</p>
				<p>// }}}</p>
				<p><strong>// {{{ コアライブラリのエレガントなハック hiromi2424さん</strong><br />
				<a href="http://github.com/hiromi2424/hack_plugin">http://github.com/hiromi2424/hack_plugin</a></p>
				<p>  どうしてハックするの</p>
				<p>  アプリケーションポリシーの埋め込み<br />
				    sessionハイジャック対策でlogを吐きたいときなどなど</p>
				<p>  どうやってハックするの<br />
				    エイリアスみたいにマップされたオブジェクトを置換する</p>
				<p>  マップングされたオブジェクトの置換<br />
				    Component::_loaded[ $key ] // $keyにくるのはコンポーネントの名前<br />
				      オブジェクトへのリファレンス<br />
				    フックするタイミング<br />
				      initialize() </p>
				<p>    init() ←オブジェクトのマッピング<br />
				    initialize()←プロパティなどの設定<br />
				    startup()←staring process処理を開始 </p>
				<p>// }}}</p>
				<p><strong>// {{{ twitterとcloud serverとcakeで新規サービス 谷井さん</strong><br />
				スライド：<a href="http://docs.google.com/present/view?id=d4b7q8p_21cq5hkjg8">http://docs.google.com/present/view?id=d4b7q8p_21cq5hkjg8</a></p>
				<p>  twitterアプリの問題<br />
				    APIの返事が遅すぎる</p>
				<p>    1時間に150回制限<br />
				      oauthを使う<br />
				    APIの返事が遅すぎる<br />
				      twitterのデータをDBに保存してキャッシュすればいけんじゃない？</p>
				<p>    rackspaceはいい<br />
				      スケールの設定<br />
				      DNSの逆引きができる</p>
				<p>  負荷対策<br />
				    apatchの設定<br />
				      MaxClient       150 → 1000<br />
				      MaxKeepAliveRequests  100 → 20000</p>
				<p>    mysqlの設定<br />
				      my.cnfをいじる<br />
				        [mysqld-5.0]<br />
				          max_connections=450<br />
				          thread_cache=450<br />
				          key_buffer_size=10M<br />
				// }}}</p>
				<p>以下LTです<br />
				<strong>「WordPressの中でCakePHPを使って連携する」 </strong><br />
				スライド：<a href="http://www.slideshare.net/karadweb/cakephp-and-wordpress">http://www.slideshare.net/karadweb/cakephp-and-wordpress</a><br />
				おもしろい。自分でも動かしてみようかな。</p>
				<p><strong>「CakePHPでjQueryを使ってみた」</strong><br />
				<a href="http://github.com/nano-eight">http://github.com/nano-eight</a><br />
				スライド：<a href="http://www.slideshare.net/nanoeight/cakephpjquery-4357936">http://www.slideshare.net/nanoeight/cakephpjquery-4357936</a><br />
				素晴らしすぐる！jQueryのプラグインをヘルパーで利用できるようにする。<br />
				使わせてもらいます!</p>
				<p><strong>「CakePHP tips for mys next project」</strong><br />
				スライド：http://bit.ly/9yFAps<br />
				参考になるサイトを紹介してくれました。</p>
				<p><strong>「あのCMS eZ publishをCakePHPのModelにしちゃう」 </strong><br />
				スライド：<a href="http://prezi.com/ugsu8hwgypud/datasource-for-ez-publish-in-cakephp/">http://prezi.com/ugsu8hwgypud/datasource-for-ez-publish-in-cakephp/</a><br />
				eZ publishとCakePHPの連携方法です</p>
				<p><strong>実&#8221;戦&#8221;CakePHP Plugin」</strong><br />
				スライド：<a href="http://www.slideshare.net/k1LoW/cakephp-plugin-4364102">http://www.slideshare.net/k1LoW/cakephp-plugin-4364102</a><br />
				pluginの紹介でした。</p>
				<h3>所感</h3>
				<p>自分的にはKtai Libraryがip addressチェックを実装してくれていることがうれしいですね。<br />
				jQueryプラグインをヘルパーで吸収して利用出来るようにしたnano_eightさんのサンプルとソースはかなりそそられます。<br />
				「勉強会は懇親会が本番です。」こういうふうに言う勉強会は珍しいですよね。<br />
				運営者が勉強会を運営するにあたって大切にしていることが、勉強会で出逢う人との「つながり」だそうです。<br />
				やはり運営にそういう意識があるからなのか、アットホームな勉強会になりとても楽しいものでした。<br />
				この場でお礼申し上げます。運営者の皆様、また発表者の皆様ありがとうございました。</p>
				<p>話は変わりますが、勉強会で全員にプレゼントされたマシュマロです。<a href="http://twitpic.com/1s1rmx">http://twitpic.com/1s1rmx</a><br />
				かわいいですね。</p>
				<p>ではでは</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1159</wfw:commentRss>
		</item>
		<item>
		<title>Ktai Library勉強会に行った</title>
		<link>http://blog.cypher-works.com/?p=1154</link>
		<comments>http://blog.cypher-works.com/?p=1154#comments</comments>
		<pubDate>Sun, 25 Apr 2010 05:42:24 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1154</guid>
		<description><![CDATA[				第二回目が開催されたので行ってきましたー。
				概要
				アジェンダとしては、「PHPで作る携帯サイト-デベロッパーズガイド-」の第五章を読んでローカルで実装するのみといったかなりシンプルなものです。
				ただ特典というかかなりうれしいのが本の著者であるMASA-Pさんがサポートとして出席してくれていることです。
				分からないことや、質問は直接著者に問うことができます。またまた誤植の報告などもこの場ですることもw・・。
				実際勉強会の雰囲気はモクモク開発を行う人、談笑しながら開発を行う人、MASA-Pさんに質問をしながら開発を行う人それぞれです。
				所感
				本に沿って勉強していく中で、だいたい躓くところが決まっているようでした。今回でいうと、configurationモデルの存在です。cakephpにもともとあるconfigureクラスと勘違いしてモデルの生成をしないで開発を進めていくと躓きます。あらかじめconfig/sqlにあるソースでテーブルを作成しておきましょう。また後々にシェルの説明がある箇所で躓くことが多いようです。こういう場で発見できた躓きポイントは、後から勉強する人たちのためにサポートサイトに残しておきたいですね。
				あと、今後の勉強会ではKtai Libraryを使用した携帯サイト開発実体験というライトニングトークがあったらいいですよねー。公式サイトで使用しました、でもこういう苦労がありました。みたいな。。今のところないなら、自分でやりますか、携帯サイト作りますか！！そんなこんなの所感です。
				開催してくれたyashioさん、会場提供してくれたE2さん、サポートで来てくれているMASA-Pさん、ありがとうございました。
]]></description>
			<content:encoded><![CDATA[				<p>第二回目が開催されたので行ってきましたー。</p>
				<h3>概要</h3>
				<p>アジェンダとしては、「<a href="http://www.amazon.co.jp/PHP%E3%81%A7%E4%BD%9C%E3%82%8B%E6%90%BA%E5%B8%AF%E3%82%B5%E3%82%A4%E3%83%88%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89-%E6%BB%9D%E4%B8%8B-%E7%9C%9F%E7%8E%84/dp/4798024767" target="_blank" >PHPで作る携帯サイト-デベロッパーズガイド-</a>」の第五章を読んでローカルで実装する<strong>のみ</strong>といったかなりシンプルなものです。</p>
				<p>ただ特典というかかなりうれしいのが本の著者であるMASA-Pさんがサポートとして出席してくれていることです。<br />
				分からないことや、質問は直接著者に問うことができます。またまた誤植の報告などもこの場ですることもw・・。</p>
				<p>実際勉強会の雰囲気はモクモク開発を行う人、談笑しながら開発を行う人、MASA-Pさんに質問をしながら開発を行う人それぞれです。</p>
				<h3>所感</h3>
				<p>本に沿って勉強していく中で、だいたい躓くところが決まっているようでした。今回でいうと、configurationモデルの存在です。cakephpにもともとあるconfigureクラスと勘違いしてモデルの生成をしないで開発を進めていくと躓きます。あらかじめconfig/sqlにあるソースでテーブルを作成しておきましょう。また後々にシェルの説明がある箇所で躓くことが多いようです。こういう場で発見できた躓きポイントは、後から勉強する人たちのためにサポートサイトに残しておきたいですね。</p>
				<p>あと、今後の勉強会ではKtai Libraryを使用した携帯サイト開発実体験というライトニングトークがあったらいいですよねー。公式サイトで使用しました、でもこういう苦労がありました。みたいな。。今のところないなら、自分でやりますか、携帯サイト作りますか！！そんなこんなの所感です。</p>
				<p>開催してくれたyashioさん、会場提供してくれた<a href="http://www.e-2.co.jp/index.html" target="_blank" >E2</a>さん、サポートで来てくれているMASA-Pさん、ありがとうございました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1154</wfw:commentRss>
		</item>
		<item>
		<title>ﾌﾚｰﾑﾜｰｸを作る ルーティング処理 調査編 その3</title>
		<link>http://blog.cypher-works.com/?p=1145</link>
		<comments>http://blog.cypher-works.com/?p=1145#comments</comments>
		<pubDate>Tue, 16 Mar 2010 07:30:02 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1145</guid>
		<description><![CDATA[				 Url Routing with PHPを紹介してきました。このシリーズはラストみたいです。ルーティング処理だけでなく、MVCフレームワークのCを重点的にした単純なフレームワークを作成したところで完了みたいですね。元ネタはこちらです。
				最後にデモとサンプルソースのダウンロードがありますが、URLからコントローラーとアクションの指定まで考慮している作りみたいです。
				このシリーズを読んでき来た人たちへ。今までのコードに多少修正を加えました。多少ディレクトリ構成とAxial_URLInterpreterとAxial_Command objectを、多くはAxial_CommandDispatchクラスです。今回新たにAxial_Controllerというクラスを作成していきます。
				フロントコントローラからコントローラーへアクセスするようにしましょう。方法として、名前のつけ方とディレクトリ構成のルールを決めて、各コマンド（アクション）を実行させるようにしましょう。コマンドが実行されるとき、該当のコントローラーが読み込まれ、executeメソッドが読まれるようにします。
				
&#60;?php
/**
  * コントローラー実行クラス
  */
class Axial_CommandDispatcher
{
    var $Command;

    //  コンストラクタ 実行するコマンド（コントローラー）の格納
    function Axial_CommandDispatcher(&#38;$command)
    {
        $this-&#62;Command = $command;
    }

    // 指定したコントローラーが存在するか
    [...]]]></description>
			<content:encoded><![CDATA[				<p> Url Routing with PHPを紹介してきました。このシリーズはラストみたいです。ルーティング処理だけでなく、MVCフレームワークのCを重点的にした単純なフレームワークを作成したところで完了みたいですね。元ネタは<a href="http://www.phpaddiction.com/tags/axial/url-routing-with-php-part-three/">こちら</a>です。<br />
				最後にデモとサンプルソースのダウンロードがありますが、URLからコントローラーとアクションの指定まで考慮している作りみたいです。</p>
				<p>このシリーズを読んでき来た人たちへ。今までのコードに多少修正を加えました。多少ディレクトリ構成とAxial_URLInterpreterとAxial_Command objectを、多くはAxial_CommandDispatchクラスです。今回新たにAxial_Controllerというクラスを作成していきます。</p>
				<p>フロントコントローラからコントローラーへアクセスするようにしましょう。方法として、名前のつけ方とディレクトリ構成のルールを決めて、各コマンド（アクション）を実行させるようにしましょう。コマンドが実行されるとき、該当のコントローラーが読み込まれ、executeメソッドが読まれるようにします。</p>
				<pre class="syntax-highlight:php">
&lt;?php
/**
  * コントローラー実行クラス
  */
class Axial_CommandDispatcher
{
    var $Command;

    //  コンストラクタ 実行するコマンド（コントローラー）の格納
    function Axial_CommandDispatcher(&amp;$command)
    {
        $this-&gt;Command = $command;
    }

    // 指定したコントローラーが存在するか
    function isController($controllerName)
    {
        if(file_exists(&#039;axial/controllers/&#039;.$controllerName.&#039;/controller.&#039;.$controllerName.&#039;.php&#039;))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    // コントローラー実行
    function Dispatch()
    {
        $controllerName = $this-&gt;Command-&gt;getControllerName();

        //  指定したコントローラーが存在していなかったらエラーコントローラークラスを指定
        if($this-&gt;isController($controllerName) == false)
        {
            $controllerName = &#039;error&#039;;
        }

        // 指定したコントローラーを読み込む
        include(&#039;axial/controllers/&#039;.$controllerName.&#039;/controller.&#039;.$controllerName.&#039;.php&#039;);

        // インスタンス生成・実行
        $controllerClass = $controllerName.&quot;Controller&quot;;
        $controller = new $controllerClass($this-&gt;Command);
        $controller-&gt;execute();
    }
}
?&gt;
</pre>
				<p>include(&#8217;axial/controllers/&#8217;.$controllerName.&#8217;/controller.&#8217;.$controllerName.&#8217;.php&#8217;);の箇所を見て分かるように、コントローラー名に使用するディレクトリを作成し、実行するファイル名もcontrollerコントローラー名.phpのように名前付しなければならないような作りにしています。</p>
				<p>自分でコントローラーを追加していく中で継承しなければいけないクラスがあります。Axial_Controllerです。Axial_Controllerでは、ディスパッチコントローラーから（Axial_CommandDispatcher）execute()が必ず呼ばれ、指定したアクションを実行する処理をします。指定したアクションがなかったら_error()関数を実行し、そもそも指定アクションがnullだったら_default()関数を実行します。指定アクションの命名規則は_を頭に付けるようにしています。</p>
				<pre class="syntax-highlight:php">
&lt;?php
class Axial_Controller
{
    var $Command;

    // コンストラクタ
    function Axial_Controller(&amp;$command)
    {
        $this-&gt;Command = $command;
    }

    // アクションの指定がなければ、この関数が呼ばれる
    function _default()
    {
    }

    // 指定したアクションがなければ、この関数が呼ばれる
    function _error()
    {
    }

    // ディスパッチャからこの関数が呼ばれる。アクションの振り分け。
    function execute()
    {
    	// アクション取得
        $functionToCall = $this-&gt;Command-&gt;getFunction();

        // アクションがnull
        if($this-&gt;Command-&gt;getFunction() == &#039;&#039;)
        {
            $functionToCall = &#039;default&#039;;
        }

        //  指定したアクションがない
        if(!is_callable(array(&amp;$this,&#039;_&#039;.$functionToCall)))
        {
            $functionToCall = &#039;error&#039;;
        }

        // 指定したアクションを実行
        call_user_func(array(&amp;$this,&#039;_&#039;.$functionToCall));
    }
}
?&gt;
</pre>
				<p>あとアクションの指定ができるようになったことで、URLのパース処理も多少修正されているはずです。ちょっと見てみましょう。</p>
				<pre class="syntax-highlight:php">
&lt;?php
class Axial_URLInterpreter
{

    var $Command;

    function Axial_URLInterpreter()
    {
        $requestURI = explode(&#039;/&#039;, $_SERVER[&#039;REQUEST_URI&#039;]);
        $scriptName = explode(&#039;/&#039;,$_SERVER[&#039;SCRIPT_NAME&#039;]);
        $commandArray = array_diff_assoc($requestURI,$scriptName);
        $commandArray = array_values($commandArray);
        $controllerName = $commandArray[0];

        // ここが追加された箇所
        $controllerFunction = $commandArray[1];

        $parameters = array_slice($commandArray,2);

        // ルートで実行されているか
        // コントローラーの指定がなかったらrootコントローラーを指定
        // _defaultアクションが実行される
        if($controllerName == &#039;&#039;)
        {
            $controllerName = &#039;root&#039;;
        }

        $this-&gt;Command = new Axial_Command($controllerName,$controllerFunction,$parameters);
    }

    function getCommand()
    {
        return $this-&gt;Command;
    }
}
?&gt;
</pre>
				<p>$controllerFunction = $commandArray[1];が追加されていますね。/でexploadされたものに0番目にコントローラー名、1番目にアクション名がくるだろうってだけですね。</p>
				<p>他に特筆すべきことは、その2とその3のindex.phpを比べるとルーティング処理とコントローラーの呼び出し部分の処理は変わっていないのですが、HTMLの記述がなくなっています。各コントローラーのアクションで呼び出しされるようになっています。確かにMVCのCに重点的に実装したフレームワークになっているようです。</p>
				<p>デモとサンプルコードが<a href="http://examples.phpaddiction.com/urlrouter/part_3/">こちら</a>に公開されています。</p>
				<p>とりあえず、このチュートリアルは以上になります。</p>
				<p>このチュートリアルを書いたDoug Hillさん。Thank you!!</p>
				<p>ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1145</wfw:commentRss>
		</item>
		<item>
		<title>ﾌﾚｰﾑﾜｰｸを作る ルーティング処理 調査編 その2</title>
		<link>http://blog.cypher-works.com/?p=1132</link>
		<comments>http://blog.cypher-works.com/?p=1132#comments</comments>
		<pubDate>Tue, 16 Mar 2010 05:18:49 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1132</guid>
		<description><![CDATA[				前回の続きです。
				今回は第２弾です。元ネタはこちら。
				前回の例には２点問題があるので、解決していきましょう。
				１点目に、URLをパースする方法
				２点目に、コマンドの実行がswitch文での振り分け
				目的は、もっとフレキシブルなURLの解釈をさせることです。そのために基本的なコマンドオブジェクトを作成していきます。
				
&#60;?php
class Axial_Command
{
        var $commandName = &#039;&#039;;
        var $parameters = array();

        // コマンド名格納、パラメータ格納
        function Axial_Command($commandName,$parameters)
        {
      [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://blog.cypher-works.com/?p=1123">前回</a>の続きです。</p>
				<p>今回は第２弾です。元ネタは<a href="http://www.phpaddiction.com/tags/axial/url-routing-with-php-part-two/">こちら</a>。</p>
				<p>前回の例には２点問題があるので、解決していきましょう。<br />
				１点目に、URLをパースする方法<br />
				２点目に、コマンドの実行がswitch文での振り分け</p>
				<p>目的は、もっとフレキシブルなURLの解釈をさせることです。そのために基本的なコマンドオブジェクトを作成していきます。</p>
				<pre class="syntax-highlight:php">
&lt;?php
class Axial_Command
{
        var $commandName = &#039;&#039;;
        var $parameters = array();

        // コマンド名格納、パラメータ格納
        function Axial_Command($commandName,$parameters)
        {
            $this-&gt;commandName = $commandName;
            $this-&gt;parameters = $parameters;
        }

        // コマンド名取得
        function getCommandName()
        {
            return $this-&gt;commandName;
        }

        // パラメータ格納
        function getParameters()
        {
            return $this-&gt;parameters;
        }
}
?&gt;
</pre>
				<p>次にURLをパースするクラスが必要です。前回で紹介したパース処理と上の処理を使ってコマンドオブジェクトを作成します。</p>
				<pre class="syntax-highlight:php">
&lt;?php
class Axial_UrlInterpreter
{
	var $command;
	function Axial_UrlInterpreter()
	{
		$requestURI = explode(&#039;/&#039;, $_SERVER[&#039;REQUEST_URI&#039;]);
		$scriptName = explode(&#039;/&#039;,$_SERVER[&#039;SCRIPT_NAME&#039;]);
	for($i= 0;$i &lt; sizeof($scriptName);$i++)
	{
		if ($requestURI[$i]	== $scriptName[$i])
		{
			unset($requestURI[$i]);
		}
	}

	$commandArray = array_values($requestURI);
	$commandName = $commandArray[0];
	$parameters = array_slice($commandArray,1);
	$this-&gt;command = new Axial_Command($commandArray[0],$parameters);

	}

	function getCommand()
	{
		return $this-&gt;command;
	}
}
?&gt;
</pre>
				<p>最後にコマンドオブジェクトを実行箇所に渡します。まだこの時点ではコードをシンプルにさせたいのでswitch文を使用しておきます。</p>
				<pre class="syntax-highlight:php">
&lt;?php
class Axial_CommandDispatcher
{
    var $command;
    function Axial_CommandDispatcher($command)
    {
        $this-&gt;command = $command;
    }

    function Dispatch()
    {
        switch ($this-&gt;command-&gt;getCommandName())
        {
            case &#039;commandOne&#039; :
                include(&#039;commandone.php&#039;);
                break;
            case &#039;commandTwo&#039; :
                include(&#039;commandtwo.php&#039;);
                break;
            case &#039;&#039;:
                include(&#039;root.php&#039;);
                break;
            default:
                include(&#039;default.php&#039;);
                break;
        }
    }
}
?&gt;
</pre>
				<p>今回の挙げたものを統合した例です。前回に作成した.htaccessが必要です。動作するデモとサンプルソースが<a href="http://examples.phpaddiction.com/urlrouter/part_2/">こちら</a>からダウンロードできます。</p>
				<pre class="syntax-highlight:php">
// 今回例に挙げたファイル読み込み
include(&#039;axial.command.php&#039;);
include(&#039;axial.urlinterpreter.php&#039;);
include(&#039;axial.commanddispatcher.php&#039;);

// URLパース処理 コマンド名取得 axial.command.phpにコマンド名とパラメータ格納
$urlInterpreter = new Axial_UrlInterpreter();

// 上のパース処理からコマンド名取得
$command = $urlInterpreter-&gt;getCommand();

// 実行処理にコマンド名格納
$commandDispatcher = new Axial_CommandDispatcher($command);

// コマンド実行
$commandDispatcher-&gt;Dispatch();
</pre>
				<p>次にチュートリアルでswitch処理を直します。</p>
				<p>以上です。</p>
				<p>ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1132</wfw:commentRss>
		</item>
		<item>
		<title>ﾌﾚｰﾑﾜｰｸを作る ルーティング処理 調査編 その1</title>
		<link>http://blog.cypher-works.com/?p=1123</link>
		<comments>http://blog.cypher-works.com/?p=1123#comments</comments>
		<pubDate>Mon, 15 Mar 2010 07:45:31 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1123</guid>
		<description><![CDATA[				ルーティング処理を調査します。
				ルーティングの設定によってURLの構成とロジックファイルの構成が変わってくるので重要な部分です。
				以下のサイトをまず見てみましょう。ルーティング処理のチュートリアルみたいですね。
				Url Routing with PHP – Part One
				ダメな例から挙げていってなぜダメかを説明しながらブラッシュアップするチュートリアルみたいです。
				まず、.htaccessから紹介しています。
				
				Options +FollowSymLinks #1
				IndexIgnore */* #2
				# Turn on the RewriteEngine
				RewriteEngine On #3
				#  Rules
				RewriteCond %{REQUEST_FILENAME} !-f #4
				RewriteCond %{REQUEST_FILENAME} !-d #5
				RewriteRule . index.php #6
				
				#1 FollowSymLinksはシンボリックリンクのリンク先に辿れることを許可します
				#2 「IndexIgnore命令はディレクトリをリスト表示しているときに隠すためのファイルのリストに追加します」だそうです。ワイルドカードで/を囲むって意味はすべてのファイルってことなんですかね？？
				#3 「mod_rewriteを使用するという宣言」だそうです。
				#4 存在するファイルがなかったらtrue（下の処理にいく） / あったらfalse
				#5 存在するディレクトリがなかったらtrue（下の処理にいく） / あったらfalse
				#6 すべてindex.phpを実行しろ
				みたいな感じだと思いまぷ(汗
				エントリポイントを作成していきましょう
				エントリポイントとは起点となる処理を意味します。
				単純なルーティングを設定してみましょう。URLをスラッシュで区切る方法です。
				例１：www.example.com/command/parameter1/parameter2/
				
$requestURI = explode(&#039;/&#039;, $_SERVER[&#039;REQUEST_URI&#039;]);

				
				 Array ( [0] => [1] => command [2] => parameter1 [3] => parameter2 [4] [...]]]></description>
			<content:encoded><![CDATA[				<p>ルーティング処理を調査します。<br />
				ルーティングの設定によってURLの構成とロジックファイルの構成が変わってくるので重要な部分です。</p>
				<p>以下のサイトをまず見てみましょう。ルーティング処理のチュートリアルみたいですね。<br />
				<a href="http://www.phpaddiction.com/tags/axial/url-routing-with-php-part-one/">Url Routing with PHP – Part One</a></p>
				<p>ダメな例から挙げていってなぜダメかを説明しながらブラッシュアップするチュートリアルみたいです。</p>
				<p>まず、.htaccessから紹介しています。</p>
				<blockquote><p>
				Options +FollowSymLinks #1<br />
				IndexIgnore */* #2<br />
				# Turn on the RewriteEngine<br />
				RewriteEngine On #3<br />
				#  Rules<br />
				RewriteCond %{REQUEST_FILENAME} !-f #4<br />
				RewriteCond %{REQUEST_FILENAME} !-d #5<br />
				RewriteRule . index.php #6
				</p></blockquote>
				<p>#1 FollowSymLinksはシンボリックリンクのリンク先に辿れることを許可します<br />
				#2 「IndexIgnore命令はディレクトリをリスト表示しているときに隠すためのファイルのリストに追加します」だそうです。ワイルドカードで/を囲むって意味はすべてのファイルってことなんですかね？？<br />
				#3 「mod_rewriteを使用するという宣言」だそうです。<br />
				#4 存在するファイルがなかったらtrue（下の処理にいく） / あったらfalse<br />
				#5 存在するディレクトリがなかったらtrue（下の処理にいく） / あったらfalse<br />
				#6 すべてindex.phpを実行しろ</p>
				<p>みたいな感じだと思いまぷ(汗</p>
				<p>エントリポイントを作成していきましょう<br />
				エントリポイントとは起点となる処理を意味します。</p>
				<p>単純なルーティングを設定してみましょう。URLをスラッシュで区切る方法です。<br />
				例１：www.example.com/command/parameter1/parameter2/</p>
				<pre class="syntax-highlight:php">
$requestURI = explode(&#039;/&#039;, $_SERVER[&#039;REQUEST_URI&#039;]);
</pre>
				<blockquote><p>
				 Array ( [0] => [1] => command [2] => parameter1 [3] => parameter2 [4] => )
				</p></blockquote>
				<p>しかしこの例は、commandの前にディレクトリが一つでも噛んでいると正常に動作しません。（フロントコントローラ-ここではエントリポイントのこと-がルートディレクトリでないと正常に動作しません）<br />
				例えば、次のURL：www.example.com/myapps/app1/command/parameter1/parameter2/<br />
				（commandの前にapp1が入っている。）<br />
				この場合$requestURIは次のようになります。</p>
				<blockquote><p>Array ( [0] => [1] => myapps [2] => app1 [3] => command [4] => parameter1 [5] => parameter2  [6] => )</p></blockquote>
				<p>myappsとapp1が邪魔なのでこれを除去するためには$_SERVER['SCRIPT_NAME'] の変数が必要です。</p>
				<pre class="syntax-highlight:php">
$scriptName = explode(&#039;/&#039;,$_SERVER[&#039;SCRIPT_NAME&#039;]);
</pre>
				<p>中身は</p>
				<blockquote><p>Array ( [0] => [1] => myapps[2] => app1 [3] => index.php )</p></blockquote>
				<p>以下が不要なURL（パスと実行スクリプト）を消去する処理です。</p>
				<pre class="syntax-highlight:php">
$requestURI = explode(&#039;/&#039;, $_SERVER[&#039;REQUEST_URI&#039;]);
$scriptName = explode(&#039;/&#039;,$_SERVER[&#039;SCRIPT_NAME&#039;]);

for($i= 0;$i &lt; sizeof($scriptName);$i++)
{
    if ($requestURI[$i]     == $scriptName[$i])
    {
                unset($requestURI[$i]);
    }
}
$command = array_values($requestURI);
</pre>
				<p>以下が$commandの中身です。パスと実行スクリプトが失くなっています。</p>
				<blockquote><p>Array ( [0] => command [1] => parameter1 [2] => parameter2  [3] => )</p></blockquote>
				<p>実行コマンドを指定するスクリプトを書いてみましょう。</p>
				<pre class="syntax-highlight:php">
switch($command[0])
{
      case &#039;commandOne&#039; :
                echo &#039;You entered command: &#039;.$command[0];
                break;
      case &#039;commandTwo&#039; :
                echo &#039;You entered command: &#039;.$command[0];
                break;
      default:
                echo &#039;That command does not exist.&#039;;
                break;
}
</pre>
				<p>こんなんブサイク過ぎですね。次のチュートリアルで改善されたスクリプトがあるますのでご安心を。</p>
				<p>以下に実際に振る舞うサンプルが紹介されています。<a href="http://examples.phpaddiction.com/urlrouter/part_1/">examples.phpaddiction.com/urlrouter/part_1/ </a></p>
				<p>次のチュートリアルはルーティング処理をクラスにまとめて、名前空間を使用することをやります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1123</wfw:commentRss>
		</item>
		<item>
		<title>ﾌﾚｰﾑﾜｰｸを作る 初級者からの脱却 調査編</title>
		<link>http://blog.cypher-works.com/?p=837</link>
		<comments>http://blog.cypher-works.com/?p=837#comments</comments>
		<pubDate>Wed, 03 Mar 2010 19:50:14 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=837</guid>
		<description><![CDATA[				フレームワークを自分で作れるようになりたい！
				というか、CakePHPやら、Ethnaやら、Symfonyやら、ついでにCodeIgnighterだって、コアファイルと付属品が多すぎて実力がにぇ自分には（汗）把握できにぇ。
				ということで自分で作ってみたらそれらの設計思想やらコードの理解が深まるんでないの？さらには自分のスキルも高まるんでないの？
				よし！作るか、作りながらパクってもいいから、とにかく一から理解してみよう！
				自分で景気付けしたわけですが、そんなこんなでこれから色々調べつつ自作フレームワーク完成を目標に挑戦してみようと思います。
				まずは「PHP 自作フレームワーク」でGoogle先生に問い合わせましょう。
				うん、けっこう作り方ありますね。
				The symfony platform: Create your very own framework
				これなんてほぼ作り方網羅してるんじゃないですかね。Symfonyを作成してる方かな。ただSymfonyのsfCoreAutoLoadを使用していて、それを前提に構築していくんですけど、結局コアな部分は大きいライブラリ。。かなり良い資料でもしかしたら解答以上のものかもしんないけど、雰囲気しか分からないです〜泣。
				よく出てくる言葉「ジェネリック」。忘れてます。wikipediaだと
				ジェネリック（総称あるいは汎用）プログラミング (generic programming)はデータ形式に依存しないコンピュータプログラミング方式。
				これはデータ型でコードをインスタンス化するのか、あるいはデータ型をパラメータとして渡すかということに関わらず、同じソースコードを利用できるということである。
				なるほど。それでこの例のものを自分の技術レベルで書ければ最高。けど、コア部分が高度。まぁ迷った時にこの設計方針と記述内容を参考にするくらいでいいかな。
				　
				次行ってみます。
				PHPフレームワーク　ちいたん
				ちいたんとは世界最軽量のPHP用MVCフレームワーク
				だそうです。
				コードを見てみました。なるほど〜。ただ素のままだとフレームワーク上のエントリポイントがないので設定ファイルの読み込みを各アクションファイルに書かないといけないので煩わしいし、DRYじゃないですね。
				はい、エントリポイントを追加してみた方がいらっしゃるみたいです。ソースも公開しているみたいですね。
				ちいたん カスタム① フロントコントローラ化その他
				ちいたんはかなり勉強になるんじゃないでしょうか。よい感じだと思います。たぶんかなり参考にするか、ほぼ流用していく気がします。
				　
				PHPで（M）VCフレームワーク自作
				ルーティング処理だけの例ですね。
				　
				[memovie] 自作フレームワークについてとフォームからのPOST 
				これは勉強になる！素晴らしすぎではないでしょうか。参考にします。
				PHP Webフレームワークを自作するサイトです。(＠^^＠)
				んっ？全体さらってみたけど、これで読んだら今回の趣旨完結してしまわないか？
				そのくらい俊逸サイトかも。
				自作フレームワークをgithubへ公開
				（くわ、そろそろ疲れてきた。寝よう。）あとでソース読ませて頂きます。
				CakePHP内の処理を理解する 
				参考になるかな。とりあえず載せておきます。
				軽量なMVCフレームワークの自作（改訂版）
				セッション管理、永続オブジェクトの保持の概念など勉強になりました。
				CakePHPの何か
				おまけくらいに。古いバージョンのが今よりも軽量だろうから参考になるかも？
				速構Web Framework
				あとで読まさせて頂きます。
				よし、Google先生に聞くのはこの辺でおしまいと。作りながら、上記のサイトだったり、有名どこのフレームワークを参考にやっていこうと思います。
				　
				最後にどんなフレームワークを作りたいか、というか最低限どの点を抑えていくか挙げていきたいと思います。
				・MVCパターン
				・エントリポイントのティスパッチャでコントローラー、モデル、ビューを振り分ける。
				・コントローラー、モデル、ビューはフォルダ毎に分かれる構成。
				・セッション管理
				・データベース接続管理
				とりあえず以上のものを目指します。
				ではでは。
]]></description>
			<content:encoded><![CDATA[				<p>フレームワークを自分で作れるようになりたい！</p>
				<p>というか、CakePHPやら、Ethnaやら、Symfonyやら、ついでにCodeIgnighterだって、コアファイルと付属品が多すぎて実力がにぇ自分には（汗）把握できにぇ。</p>
				<p>ということで自分で作ってみたらそれらの設計思想やらコードの理解が深まるんでないの？さらには自分のスキルも高まるんでないの？</p>
				<p>よし！作るか、作りながらパクってもいいから、とにかく一から理解してみよう！</p>
				<p>自分で景気付けしたわけですが、そんなこんなでこれから色々調べつつ自作フレームワーク完成を目標に挑戦してみようと思います。</p>
				<p>まずは「PHP 自作フレームワーク」でGoogle先生に問い合わせましょう。</p>
				<p>うん、けっこう作り方ありますね。</p>
				<p><a href="http://fabien.potencier.org/talk/10/symfony-platform-phpquebec-2008">The symfony platform: Create your very own framework</a><br />
				これなんてほぼ作り方網羅してるんじゃないですかね。Symfonyを作成してる方かな。ただSymfonyのsfCoreAutoLoadを使用していて、それを前提に構築していくんですけど、結局コアな部分は大きいライブラリ。。かなり良い資料でもしかしたら解答以上のものかもしんないけど、雰囲気しか分からないです〜泣。<br />
				よく出てくる言葉「ジェネリック」。忘れてます。wikipediaだと</p>
				<blockquote><p>ジェネリック（総称あるいは汎用）プログラミング (generic programming)はデータ形式に依存しないコンピュータプログラミング方式。</p>
				<p>これはデータ型でコードをインスタンス化するのか、あるいはデータ型をパラメータとして渡すかということに関わらず、同じソースコードを利用できるということである。</p></blockquote>
				<p>なるほど。それでこの例のものを自分の技術レベルで書ければ最高。けど、コア部分が高度。まぁ迷った時にこの設計方針と記述内容を参考にするくらいでいいかな。</p>
				<p>　<br />
				次行ってみます。<br />
				<a href="http://php.cheetan.net/">PHPフレームワーク　ちいたん</a></p>
				<blockquote><p>ちいたんとは世界最軽量のPHP用MVCフレームワーク</p></blockquote>
				<p>だそうです。<br />
				コードを見てみました。なるほど〜。ただ素のままだとフレームワーク上のエントリポイントがないので設定ファイルの読み込みを各アクションファイルに書かないといけないので煩わしいし、DRYじゃないですね。</p>
				<p>はい、エントリポイントを追加してみた方がいらっしゃるみたいです。ソースも公開しているみたいですね。<br />
				<a href="http://stbr.no-ip.org/daizu/2009/06/post-22.html">ちいたん カスタム① フロントコントローラ化その他</a></p>
				<p>ちいたんはかなり勉強になるんじゃないでしょうか。よい感じだと思います。たぶんかなり参考にするか、ほぼ流用していく気がします。</p>
				<p>　<br />
				<a href="http://www.jamboree.jp/cms/archives/72">PHPで（M）VCフレームワーク自作</a><br />
				ルーティング処理だけの例ですね。</p>
				<p>　<br />
				<a href="http://blogs.yahoo.co.jp/nob_ll/52608611.html">[memovie] 自作フレームワークについてとフォームからのPOST </a><br />
				これは勉強になる！素晴らしすぎではないでしょうか。参考にします。</p>
				<p><a href="http://donmo.net/">PHP Webフレームワークを自作するサイトです。(＠^^＠)</a><br />
				んっ？全体さらってみたけど、これで読んだら今回の趣旨完結してしまわないか？<br />
				そのくらい俊逸サイトかも。</p>
				<p><a href="http://d.hatena.ne.jp/quill3/20090331/p1">自作フレームワークをgithubへ公開</a><br />
				（くわ、そろそろ疲れてきた。寝よう。）あとでソース読ませて頂きます。</p>
				<p><a href="http://codezine.jp/article/detail/768">CakePHP内の処理を理解する </a><br />
				参考になるかな。とりあえず載せておきます。</p>
				<p><a href="http://codezine.jp/article/detail/104">軽量なMVCフレームワークの自作（改訂版）</a><br />
				セッション管理、永続オブジェクトの保持の概念など勉強になりました。</p>
				<p><a href="http://puyo2.upper.jp/cake/">CakePHPの何か</a><br />
				おまけくらいに。古いバージョンのが今よりも軽量だろうから参考になるかも？</p>
				<p><a href="http://www.pm9.com/newpm9/itbiz/php/framework/">速構Web Framework</a><br />
				あとで読まさせて頂きます。</p>
				<p>よし、Google先生に聞くのはこの辺でおしまいと。作りながら、上記のサイトだったり、有名どこのフレームワークを参考にやっていこうと思います。<br />
				　<br />
				最後にどんなフレームワークを作りたいか、というか最低限どの点を抑えていくか挙げていきたいと思います。<br />
				・MVCパターン<br />
				・エントリポイントのティスパッチャでコントローラー、モデル、ビューを振り分ける。<br />
				・コントローラー、モデル、ビューはフォルダ毎に分かれる構成。<br />
				・セッション管理<br />
				・データベース接続管理</p>
				<p>とりあえず以上のものを目指します。</p>
				<p>ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=837</wfw:commentRss>
		</item>
		<item>
		<title>第50回PHP勉強会に行った</title>
		<link>http://blog.cypher-works.com/?p=1104</link>
		<comments>http://blog.cypher-works.com/?p=1104#comments</comments>
		<pubDate>Sun, 28 Feb 2010 12:37:29 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1104</guid>
		<description><![CDATA[				第50回PHP勉強会に参加したので、そのエントリ。
				発表は三つあって、
				1. mixiアプリについて（Weboo!）
				2. PHPでWEB開発を行うようにしてオープンソーシャルアプリを作る（KuniTsuji）
				3. 運用した気になるモバイルオープンソーシャル (個々一番) 
				1. mixiアプリについて（Weboo!） 
				
				ユーザ属性
				だいたい20代以前半。ちょっと女性
				アプリ嗜好性
				mixi：ソーシャルグラフ（リアルなともだちと）
				gree：バーチャルグラフ（見ず知らずな人）
				ユーザアクティブ数
				ログインユーザ：1189 →1257
				滞在時：2:40→ 3:42
				pV：150.6→ 270
				PCでは、OpenSocial Javascript API。モバイルでは、OpenSocial Restful Protocol。
				最新阪のOAuthにはバグがある
				$request->to_header();
				→
				引数に以下みたいなものを指定する
				$reqeust->to_header( apimixipralform);（たぶん間違ってます）
				どんアプリがヒットするか？
				・友人と一緒に遊べないアプリは流行らない
				・分かりやすさが大事
				・ほとんど友人からの招待でアプリを始める
				・友達と一緒にプレイしている空気感
				・巻き込み感→友人に紹介したくなる
				・継続性→変化がある→更新情報など
				・初期はアプリはゲームと勘違いされていたが、結局長くプレイされるのはコニュニケーション性が強いアプリ
				モバイルの開発もPCからアクセス可能な静的ファイルを配信可能なサーバも準備中
				3/16にDeNA技術セミナーがあります
				
				　
				所感：アプリを作成する上でコミュニケートするという部分がミソだよということを伝えたかったように思われます。人間の心理を利用したもの、飽きられないものが人気を出す秘訣ではないかなと感じました。
				2. PHPでWEB開発を行うようにしてオープンソーシャルアプリを作る（KuniTsuji）
				
				webサービスをそのままmixiアプリに移植することができないか？
				モバイルは可能そうだが、PCはできなそう。
				CodeIgnighterを利用してやってみた。
				・通常のaタグと、formタグは利用できない。それを吸収する処理を利用した。（anchor(),form_openなどの関数を作成）
				・セッションの処理、oauthの処理を隠蔽
				その他処理
				1.gadgets.util.registerOnLoadHandler(init)でVIEWER,OWNER,アプリ情報を取得
				2. gedgets.io.makeRequest
				3. gadgets.views.requestNavigateTo(supportedViews[view].params)で遷移処理
				
				　
				所感：既存にあるサービスをそのままオープンソーシャル対応にする試みは大変ファンキーなものです。ぜひ汎用化できたら是非オープン化してほしいものです（笑）
				3. 運用した気になるモバイルオープンソーシャル (個々一番) 
				
				PCとモバイルの違い
				絵文字
				javascriptが使えない
				会社間契約が必要
				公式・勝手サイトの違い
				携帯識別番号が必要ない
				 opensocailの仕組み上で認証する
				 注意点（opensocialに限らず）
				 外部のAPIは信用しない
				 ・返事が帰ってこない
				 ・バグだってあるさ
				ちょっとしたヒント
				 PHPでAuthorzationヘッダとれないよ
				 Basic認証とかはパースして置き換えてるよ
				 apache_request_headersを使うとよい
				ゆるふわコーディング
				エラーが出ました画面より、mixiと繋がりませんみたいな画面を出したほうがよい
				インフラ・パフォーマンス
				 画像生成をキュー処理に書き換え
				 画像サーバを外部に→AmazonS3
				 サーバ間に間に合わないので一部の機能をEC2へ。現在は使ってない
				memcacged適用範囲を増やす
				L7ロードバランサを増やす
				DBマスター分割
				結局いいサーバかったら（100万しないくらい）問題の部分は解決した
				
				所感：インフラの戦いは人気が出たらマストです。結局性能の高いサーバを購入したら悩んでいたことが解決したっていうのは、お金がある時分はいいのですけど、最初はなかなかアプローチできないことかもしれませんね。やはりウノウさんが試したようにできることのなかで最善のパフォーマンスを出すことが必須なような気が致します。その過程を発表して頂いて勉強になりました。ありがとうございます。
				最後に会場を提供して頂いた株式会社コンテンツワン川井様、並びにスピーカー、運営して頂いた方々ありがとうございました。
				ではでは。
]]></description>
			<content:encoded><![CDATA[				<p>第50回PHP勉強会に参加したので、そのエントリ。</p>
				<p>発表は三つあって、<br />
				1. mixiアプリについて（Weboo!）<br />
				2. PHPでWEB開発を行うようにしてオープンソーシャルアプリを作る（KuniTsuji）<br />
				3. 運用した気になるモバイルオープンソーシャル (個々一番) </p>
				<p><strong>1. mixiアプリについて（Weboo!）</strong> </p>
				<ul>
				<li>ユーザ属性</li>
				<p>だいたい20代以前半。ちょっと女性</p>
				<li>アプリ嗜好性</li>
				<p>mixi：ソーシャルグラフ（リアルなともだちと）<br />
				gree：バーチャルグラフ（見ず知らずな人）</p>
				<li>ユーザアクティブ数</li>
				<p>ログインユーザ：1189 →1257<br />
				滞在時：2:40→ 3:42<br />
				pV：150.6→ 270</p>
				<li>PCでは、OpenSocial Javascript API。モバイルでは、OpenSocial Restful Protocol。</li>
				<li>最新阪のOAuthにはバグがある</li>
				<p>$request->to_header();<br />
				→<br />
				引数に以下みたいなものを指定する<br />
				$reqeust->to_header( apimixipralform);（たぶん間違ってます）</p>
				<li>どんアプリがヒットするか？</li>
				<p>・友人と一緒に遊べないアプリは流行らない<br />
				・分かりやすさが大事<br />
				・ほとんど友人からの招待でアプリを始める<br />
				・友達と一緒にプレイしている空気感<br />
				・巻き込み感→友人に紹介したくなる<br />
				・継続性→変化がある→更新情報など<br />
				・初期はアプリはゲームと勘違いされていたが、結局長くプレイされるのはコニュニケーション性が強いアプリ</p>
				<li>モバイルの開発もPCからアクセス可能な静的ファイルを配信可能なサーバも準備中</li>
				<li>3/16にDeNA技術セミナーがあります</li>
				</ul>
				<p>　<br />
				所感：アプリを作成する上でコミュニケートするという部分がミソだよということを伝えたかったように思われます。人間の心理を利用したもの、飽きられないものが人気を出す秘訣ではないかなと感じました。</p>
				<p><strong>2. PHPでWEB開発を行うようにしてオープンソーシャルアプリを作る（KuniTsuji）</strong></p>
				<ul>
				<li>webサービスをそのままmixiアプリに移植することができないか？</li>
				<p>モバイルは可能そうだが、PCはできなそう。</p>
				<li>CodeIgnighterを利用してやってみた。</li>
				<p>・通常のaタグと、formタグは利用できない。それを吸収する処理を利用した。（anchor(),form_openなどの関数を作成）<br />
				・セッションの処理、oauthの処理を隠蔽</p>
				<li>その他処理</li>
				<p>1.gadgets.util.registerOnLoadHandler(init)でVIEWER,OWNER,アプリ情報を取得<br />
				2. gedgets.io.makeRequest<br />
				3. gadgets.views.requestNavigateTo(supportedViews[view].params)で遷移処理
				</ul>
				<p>　<br />
				所感：既存にあるサービスをそのままオープンソーシャル対応にする試みは大変ファンキーなものです。ぜひ汎用化できたら是非オープン化してほしいものです（笑）</p>
				<p><strong>3. 運用した気になるモバイルオープンソーシャル (個々一番) </strong></p>
				<ul>
				<li>PCとモバイルの違い</li>
				<p>絵文字<br />
				javascriptが使えない<br />
				会社間契約が必要</p>
				<li>公式・勝手サイトの違い</li>
				<p>携帯識別番号が必要ない<br />
				 opensocailの仕組み上で認証する</p>
				<li> 注意点（opensocialに限らず）</li>
				<p> 外部のAPIは信用しない<br />
				 ・返事が帰ってこない<br />
				 ・バグだってあるさ</p>
				<li>ちょっとしたヒント</li>
				<p> PHPでAuthorzationヘッダとれないよ<br />
				 Basic認証とかはパースして置き換えてるよ<br />
				 apache_request_headersを使うとよい</p>
				<li>ゆるふわコーディング</li>
				<p>エラーが出ました画面より、mixiと繋がりませんみたいな画面を出したほうがよい</p>
				<li>インフラ・パフォーマンス</li>
				<p> 画像生成をキュー処理に書き換え<br />
				 画像サーバを外部に→AmazonS3<br />
				 サーバ間に間に合わないので一部の機能をEC2へ。現在は使ってない<br />
				memcacged適用範囲を増やす<br />
				L7ロードバランサを増やす<br />
				DBマスター分割</p>
				<p>結局いいサーバかったら（100万しないくらい）問題の部分は解決した
				</ul>
				<p>所感：インフラの戦いは人気が出たらマストです。結局性能の高いサーバを購入したら悩んでいたことが解決したっていうのは、お金がある時分はいいのですけど、最初はなかなかアプローチできないことかもしれませんね。やはりウノウさんが試したようにできることのなかで最善のパフォーマンスを出すことが必須なような気が致します。その過程を発表して頂いて勉強になりました。ありがとうございます。</p>
				<p>最後に会場を提供して頂いた株式会社<a href="http://www.contents-one.co.jp/">コンテンツワン</a>川井様、並びにスピーカー、運営して頂いた方々ありがとうございました。</p>
				<p>ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1104</wfw:commentRss>
		</item>
		<item>
		<title>VirtualBox install CentOS to Mac</title>
		<link>http://blog.cypher-works.com/?p=1082</link>
		<comments>http://blog.cypher-works.com/?p=1082#comments</comments>
		<pubDate>Wed, 17 Feb 2010 14:21:16 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[サーバー関連]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1082</guid>
		<description><![CDATA[				いつもミドルウェアのインストールはapt-getやらyumやらportやらで楽していたので、丁度環境構築する機会があったのでソースからのインストールでやってみました。以下その作業ログです。
				CentOSのインストール過程は下記のサイトに詳しく記載されています。必要最低限のものしか設定したくない人にはうってつけの参考サイトです。
				CentOS5インストール
				ちょっとはまりました。ネットワークに繋がらなかったので以下のコマンドを叩きました。
				ifdown eth1
				ifup eth1
				こんな設定ありなのか・・・
				　
				ホストOSからゲストOSにsshとhttpの接続をする設定。かなりはまりました。以下のサイト通りに行えばできます。ネットワークの設定の箇所とiptablesの設定の箇所です。
				VirtualBox 2.2 と CentOS 5.3 でローカル開発環境
				　
				ちょっと余談。ここまでくる間に使えそうな情報を見つけたので載せておきます。
				FireWallとSELinuxの設定画面を再表示するコマンド
				$ system-config-securitylevel-tui
				コマンドラインからVirtualBox立ち上げ
				$ VBoxManage startvm &#8220;仮想マシン名&#8221; &#8211;type headless
				コマンドラインからVirtualBox止め
				$ VBoxManage controlvm &#8220;仮想マシン名&#8221; poweroff
				　
				　
				では、やっとお目当ての者たちを取り込みます。
				apacheインストール
				まず、必要なライブラリインストール
				yum -y install gcc
				yum -y install openssl-devel
				ソースの置き場所はこちら：http://ftp.riken.jp/net/apache/httpd/
				# cd /usr/local/src/
				# wget http://ftp.riken.jp/net/apache/httpd/httpd-2.2.14.tar.gz
				# tar xvfz httpd-2.2.14.tar.gz
				# cd httpd-2.2.14
				# ./configure &#8211;prefix=/usr/local/apache2 &#8211;enable-module=so &#8211;enable-so &#8211;enable-ssl &#8211;enable-rewrite
				起動スクリプトの作成
				参考サイト：CentOS 5.3にApache をインストールの起動スクリプトの作成以降を同じことやりました。
				ちょっとつまづいたのは、参考サイトの中にある実行ユーザを作成したあと、httpdを起動しようとしたら以下のエラーが吐かれました。
				
				httpd を停止中:              [...]]]></description>
			<content:encoded><![CDATA[				<p>いつもミドルウェアのインストールはapt-getやらyumやらportやらで楽していたので、丁度環境構築する機会があったのでソースからのインストールでやってみました。以下その作業ログです。</p>
				<p>CentOSのインストール過程は下記のサイトに詳しく記載されています。必要最低限のものしか設定したくない人にはうってつけの参考サイトです。<br />
				<a href="http://centossrv.com/centos5.shtml">CentOS5インストール</a></p>
				<p>ちょっとはまりました。ネットワークに繋がらなかったので以下のコマンドを叩きました。</p>
				<blockquote><p>ifdown eth1<br />
				ifup eth1</p></blockquote>
				<p>こんな設定ありなのか・・・<br />
				　<br />
				ホストOSからゲストOSにsshとhttpの接続をする設定。かなりはまりました。以下のサイト通りに行えばできます。ネットワークの設定の箇所とiptablesの設定の箇所です。<br />
				<a href="http://d.hatena.ne.jp/p4life/20090413/1239624784">VirtualBox 2.2 と CentOS 5.3 でローカル開発環境</a></p>
				<p>　<br />
				ちょっと余談。ここまでくる間に使えそうな情報を見つけたので載せておきます。</p>
				<blockquote><p><strong>FireWallとSELinuxの設定画面を再表示するコマンド</strong><br />
				$ system-config-securitylevel-tui<br />
				<strong>コマンドラインからVirtualBox立ち上げ</strong><br />
				$ VBoxManage startvm &#8220;仮想マシン名&#8221; &#8211;type headless<br />
				<strong>コマンドラインからVirtualBox止め</strong><br />
				$ VBoxManage controlvm &#8220;仮想マシン名&#8221; poweroff</p></blockquote>
				<p>　<br />
				　<br />
				では、やっとお目当ての者たちを取り込みます。<br />
				<strong>apacheインストール</strong><br />
				まず、必要なライブラリインストール</p>
				<blockquote><p>yum -y install gcc<br />
				yum -y install openssl-devel</p></blockquote>
				<p>ソースの置き場所はこちら：<a href="http://ftp.riken.jp/net/apache/httpd/">http://ftp.riken.jp/net/apache/httpd/</a></p>
				<blockquote><p># cd /usr/local/src/<br />
				# wget http://ftp.riken.jp/net/apache/httpd/httpd-2.2.14.tar.gz<br />
				# tar xvfz httpd-2.2.14.tar.gz<br />
				# cd httpd-2.2.14<br />
				# ./configure &#8211;prefix=/usr/local/apache2 &#8211;enable-module=so &#8211;enable-so &#8211;enable-ssl &#8211;enable-rewrite</p></blockquote>
				<p><strong>起動スクリプトの作成</strong><br />
				参考サイト：<a href="http://d.hatena.ne.jp/aiueo88/20090901/1251787696">CentOS 5.3にApache をインストール</a>の起動スクリプトの作成以降を同じことやりました。<br />
				ちょっとつまづいたのは、参考サイトの中にある実行ユーザを作成したあと、httpdを起動しようとしたら以下のエラーが吐かれました。</p>
				<blockquote><p>
				httpd を停止中:                                            [失敗]<br />
				httpd を起動中: (98)Address already in use: make_sock: could not bind to address [::]:80<br />
				(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80<br />
				no listening sockets available, shutting down<br />
				Unable to open logs [失敗]
				</p></blockquote>
				<p>すでに使用しているポートに働きかけしてるから失敗？<br />
				同じサイトなのかな。解決方法が載ってます。<a href="http://d.hatena.ne.jp/geek_it/20090824/1251131134">apacheの再起動でエラー　(98)Address already in use: make_sock: could not bind to address [::]:80</a>とても参考になりました。ありがとうございました。</p>
				<p>　<br />
				<strong>MySQLのインストール</strong><br />
				ソースはこちら：<a href="http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.1/">http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.1/</a><br />
				参考サイトはこちら：<a href="http://wiki.livedoor.jp/callistoiv/d/MySQL%20Memo">http://wiki.livedoor.jp/callistoiv/d/MySQL%20Memo</a><br />
				<a href="http://tatsunet.net/contents/linux/centos4/lamp/">http://tatsunet.net/contents/linux/centos4/lamp/</a><br />
				必要なもの取得</p>
				<blockquote><p># yum -y install ncurses-devel<br />
				# wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.1/mysql-5.1.41.tar.gz
				</p></blockquote>
				<p>ユーザ作成</p>
				<blockquote><p># groupadd mysql<br />
				# useradd mysql -g mysql -M -s /sbin/nologin</p></blockquote>
				<p>インストール作業</p>
				<blockquote><p># tar xvfz mysql-5.1.41.tar.gz<br />
				# cd mysql-5.1.41<br />
				# ./configure &#8211;prefix=/usr/local/mysql &#8211;with-charset=utf8 &#8211;with-collation=utf8_general_ci &#8211;with-extra-charsets=all &#8211;with-readline &#8211;with-mysqld-user=mysql<br />
				# make<br />
				# make install</p></blockquote>
				<p>DB初期化</p>
				<blockquote><p># ./scripts/mysql_install_db<br />
				# chown -R mysql:mysql /usr/local/mysql/var/<br />
				# /usr/local/mysql/bin/mysqld_safe &#8211;user=mysql &#038;<br />
				# /usr/local/mysql/bin/mysqladmin -u root password &#8216;XXXXXXXXXX&#8217;<br />
				# /usr/local/mysql/bin/mysqladmin -u root -p shutdown</p></blockquote>
				<p>MySQLの自動起動の設定</p>
				<blockquote><p># cp support-files/mysql.server /etc/rc.d/init.d/mysql<br />
				# chmod 755 /etc/rc.d/init.d/mysql<br />
				# chkconfig &#8211;add mysql<br />
				# chkconfig &#8211;list mysql<br />
				mysql           0:off   1:off   2:on    3:on    4:on    5:on    6:off<br />
				# /etc/rc.d/init.d/mysql start</p></blockquote>
				<p>　<br />
				では次に、<strong>PHPインストール</strong><br />
				ソースの置き場所はこちら：<a href="http://www.php.net/downloads.php">http://www.php.net/downloads.php</a><br />
				参考サイト：<a href="http://sj6.org/vmware_setup_by_centos/">http://sj6.org/vmware_setup_by_centos/</a><br />
				必要なものインストール</p>
				<blockquote><p># yum install libxml2*<br />
				# yum install libjpeg*<br />
				# yum install gd-devel<br />
				# yum install openldap-devel<br />
				# yum install libxslt-devel<br />
				# yum -y install curl-devel<br />
				# yum -y install libmcrypt-devel
				</p></blockquote>
				<blockquote><p># wget http://jp.php.net/get/php-5.3.1.tar.gz/from/this/mirror<br />
				# tar xvfz php-5.3.1.tar.gz<br />
				# cd php-5.3.1<br />
				# ./configure &#8211;prefix=/usr/local/lib/php5 &#8211;with-apxs2=/usr/local/apache2/bin/apxs &#8211;with-pear=/usr/local/lib/php5/pear &#8211;enable-zend-multibyte &#8211;enable-mbstring &#8211;enable-mbregex &#8211;with-xsl &#8211;with-mysql=/usr/local/mysql &#8211;with-pdo-mysql=/usr/local/mysql &#8211;with-curl &#8211;with-curlwrappers &#8211;with-zlib-dir &#8211;with-zlib &#8211;with-gd=shared &#8211;with-png-dir &#8211;with-jpeg-dir &#8211;with-ttf &#8211;with-ldap=shared &#8211;with-mcrypt<br />
				# make<br />
				# make install<br />
				# cp php.ini-development /usr/local/lib/php.ini</p></blockquote>
				<p>次に、/usr/local/lib/php.iniを編集します。編集内容は参考サイトにある通りにしました。<br />
				最後に/usr/local/apache2/conf/httpd.confに.phpがphpだと分からせるようにする設定を記述します。</p>
				<pre class="syntax-highlight:c">
&lt;IfModule dir_module&gt;
    DirectoryIndex index.html index.php # index.phpを追加
&lt;/IfModule&gt;

 ・・・・・
    # If the AddEncoding directives above are commented-out, then you
    # probably should define those extensions to indicate media types:
    #
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php # この行を追加
</pre>
				<p>/usr/local/apache2/htdocs/phpinfo.phpを作成したりして動作確認。</p>
				<p>以上です。ふぅ、かなり時間かかった。</p>
				<p>ではでは</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1082</wfw:commentRss>
		</item>
		<item>
		<title>ExtJS GridPanelについて groupingとか</title>
		<link>http://blog.cypher-works.com/?p=1059</link>
		<comments>http://blog.cypher-works.com/?p=1059#comments</comments>
		<pubDate>Sat, 13 Feb 2010 10:47:14 +0000</pubDate>
		<dc:creator>toshio</dc:creator>
		
		<category><![CDATA[ExtJS]]></category>

		<guid isPermaLink="false">http://blog.cypher-works.com/?p=1059</guid>
		<description><![CDATA[				前回はGridPanelでインタラクティブに動く方法を調査してみました。
				今回はGridPanelにレンダリングする情報を、グループに分けてみようと思います。
				グループに分けていない普通のグリッドは以下の記述で実現できます。というか前回の一番最初に紹介したものと同じです。
				デモはこちら
				
    &#60;script&#62;
    Ext.onReady(function(){

        Ext.BLANK_IMAGE_URL = &#039;./extjs/resources/images/default/s.gif&#039;;
        Ext.QuickTips.init();

        // グリッド設定
        var grid = new Ext.grid.GridPanel({

        [...]]]></description>
			<content:encoded><![CDATA[				<p>前回はGridPanelでインタラクティブに動く方法を調査してみました。<br />
				今回はGridPanelにレンダリングする情報を、グループに分けてみようと思います。</p>
				<p>グループに分けていない普通のグリッドは以下の記述で実現できます。というか前回の一番最初に紹介したものと同じです。<br />
				<a href="http://blog.cypher-works.com/wp-content/uploads/2010/02/sample/grid-1.php" target="sample">デモはこちら</a></p>
				<pre class="syntax-highlight:javascript">
    &lt;script&gt;
    Ext.onReady(function(){

        Ext.BLANK_IMAGE_URL = &#039;./extjs/resources/images/default/s.gif&#039;;
        Ext.QuickTips.init();

        // グリッド設定
        var grid = new Ext.grid.GridPanel({

            // 表示設定
            renderTo: document.body,

            // フレーム設定
            frame: true,

            // サイズ設定
            height: 300,
            width: 500,

            // ボーダー設定
            border: false,

            // カラムモデル設定
            cm: new Ext.grid.ColumnModel({

                columns: [{
                    width: 180,
                    header: &#039;作業年&#039;,
                    dataIndex: &#039;YYYYMM&#039;,
                    sortable:true
                },{
                    width: 180,
                    header: &#039;作業年月&#039;,
                    dataIndex: &#039;DD&#039;,
                    sortable:false
                },{
                    width: 180,
                    header: &#039;出勤時間&#039;,
                    dataIndex: &#039;ATTEND_FROM&#039;
                },{
                    width: 180,
                    header: &#039;退出時間&#039;,
                    dataIndex: &#039;ATTEND_TO&#039;
                },{
                    width: 180,
                    header: &#039;状況&#039;,
                    dataIndex: &#039;STATUS&#039;,
                    sortable:false
                }]

            }),

            // ビュー設定
            viewConfig: {

                 // 強制フィット設定
                 forceFit: true

            },

            // ストア設定
            store: new Ext.data.JsonStore({

                 // 自動読み込み設定
                 autoLoad: true,

                 // 自動破棄設定
                 autoDestroy: true,

                 // リクエストURL設定
                 url: &#039;sss/attend-list.php&#039;,

                 // StoreID設定
                 storeID: &#039;AttendListStore&#039;,

                 // ルートノード設定
                 root: &#039;items&#039;,

                 // ID設定
                 idProperty: &#039;id&#039;,

                 // フィールド設定
                 fields: [&#039;ID&#039;, &#039;YYYYMM&#039;, &#039;DD&#039;, &#039;ATTEND_FROM&#039;, &#039;ATTEND_TO&#039;, &#039;STATUS&#039;]

            })

        });

    });
    &lt;/script&gt;
</pre>
				<p>では次に、グルーピングをするコードを記載します。<a href="http://blog.cypher-works.com/wp-content/uploads/2010/02/sample/grid_group.php" target="sample">グルーピングしたデモはこちら</a></p>
				<pre class="syntax-highlight:javascript">
    &lt;script&gt;
    Ext.onReady(function(){

        Ext.BLANK_IMAGE_URL = &#039;./extjs/resources/images/default/s.gif&#039;;
        Ext.QuickTips.init();

        var grid = new Ext.grid.GridPanel({

            // 表示設定
            renderTo: document.body,

            // フレーム設定
            frame: true,

            // サイズ設定
            height: 300,
            width: 500,

            // ボーダー設定
            border: false,

            // カラムモデル設定
            cm: new Ext.grid.ColumnModel({

                columns: [{
                    width: 180,
                    header: &#039;作業年&#039;,
                    dataIndex: &#039;YYYYMM&#039;,
                    sortable:true
                },{
                    width: 180,
                    header: &#039;作業年月&#039;,
                    groupable: false,
                    dataIndex: &#039;DD&#039;,
                    sortable:false
                },{
                    width: 180,
                    header: &#039;出勤時間&#039;,
                    groupable: false,
                    dataIndex: &#039;ATTEND_FROM&#039;
                },{
                    width: 180,
                    header: &#039;退出時間&#039;,
                    groupable: false,
                    dataIndex: &#039;ATTEND_TO&#039;
                },{
                    width: 180,
                    header: &#039;状況&#039;,
                    groupable: false,
                    dataIndex: &#039;STATUS&#039;,
                    sortable:false
                }]

            }),

            // ビュー設定
            viewConfig: {

                 // 強制フィット設定
                 forceFit: true

            },

            // ストア設定
            store: new Ext.data.GroupingStore({

                // 自動読み込み設定
                autoLoad: true,

                // 自動破棄設定
                autoDestroy: true,

                // リクエストURL設定
                url: &#039;sss/attend-lIst.php&#039;,

                // ソート設定
                sortInfo: {
                    field: &#039;YYYYMM&#039;,
                    direction: &#039;DESC&#039;
                },

                // グループ単位でソート設定
                groupOnSort: true,

                // グループ単位でのソート設定
//                groupDir: &#039;DESC&#039;,

                // グループフィールド設定
                groupField: &#039;YYYYMM&#039;,

                // StoreID設定
                storeID: &#039;AttendListStore&#039;,

                // 読み込み設定
                reader: new Ext.data.JsonReader({

                    // ルートノード設定
                    root: &#039;items&#039;,

                    // ID設定
                    id: &#039;id&#039;,

                    // フィールド設定
                }, [&#039;ID&#039;, &#039;YYYYMM&#039;, &#039;DD&#039;, &#039;ATTEND_FROM&#039;, &#039;ATTEND_TO&#039;, &#039;STATUS&#039;]
                )

            }),

            view: new Ext.grid.GroupingView({
                forceFit:true,
                hideGroupedColumn: true
//                groupTextTpl: &#039;{text} ({[values.rs.length]} {[values.rs.length &gt; 1 ? &quot;Items&quot; : &quot;Item&quot;]})&#039;
            })
        });

    });

    &lt;/script&gt;
</pre>
				<p>それでは、コードを見ていきましょう。上と下で違うのはデータレコードを保持する設定のstoreと、それに付随するviewの設定です。まずstoreの設定から見ていきましょう。上はExt.data.JsonStoreを設定していますが、下はExt.data.GroupingStoreを設定しています。もう少し詳しく見てみると、GroupingStoreの中でJsonStoreを設定しています。<br />
				そもそもstoreは何を設定するかというと、Ext.data.storeを設定することになっています。ではGroupingStoreは大丈夫なのかというとExt.data.GroupingStoreはExt.data.storeを継承しているので使用しても問題ないようです。</p>
				<p>では、グルーピングで設定しているコンフィグオプションを見ていきましょう。、</p>
				<pre class="syntax-highlight:javascript">
                // ソート設定
                sortInfo: {
                    field: &#039;YYYYMM&#039;,
                    direction: &#039;DESC&#039;
                },

                // グループ単位でソート設定
                groupOnSort: true,

                // グループ単位でのソート設定
//                groupDir: &#039;DESC&#039;,

                // グループフィールド設定
                groupField: &#039;YYYYMM&#039;,

                // StoreID設定
                storeID: &#039;AttendListStore&#039;,

                // 読み込み設定
                reader: new Ext.data.JsonReader({

                    // ルートノード設定
                    root: &#039;items&#039;,

                    // ID設定
                    id: &#039;id&#039;,

                    // フィールド設定
                }, [&#039;ID&#039;, &#039;YYYYMM&#039;, &#039;DD&#039;, &#039;ATTEND_FROM&#039;, &#039;ATTEND_TO&#039;, &#039;STATUS&#039;]
                )
</pre>
				<p>sortInfoはソート順を指定します。ローカルなソートのために、ソート方向（direction）プロパティが大文字小文字の違いを識別することに注意してください。<br />
				そして次にgroupOnSort 。これはgroupFieldで指定したフィールドでソート可、不可設定の役割をします。これをfalseにすると、groupFieldで設定したフィールドでソートできません。ここでちょっと話がそれますが、sortに関して今回私は手こずりました。というか、満足した形で終えられてません。あとで詳しく書かせてもらいます。<br />
				groupFieldは何でグルーピングするか。<br />
				storeIDはStoreMgrに登録するために使用するidです。 メモ: もし、id（非推奨）が指定される場合、割り当てがstoreIdに変わります。<br />
				readerはデータレコードを取り扱います。<br />
				あと、注意することに、groupFieldで指定したカラムはcm(columnModel)の方でも記述しないと正常に動作しませんので気をつけてください。</p>
				<p>最後にviewの設定を付け加えます。hideGroupedColumnでグルーピングしたカラムを隠しています。</p>
				<pre class="syntax-highlight:javascript">
            view: new Ext.grid.GroupingView({
                forceFit:true,
                hideGroupedColumn: true
//                groupTextTpl: &#039;{text} ({[values.rs.length]} {[values.rs.length &gt; 1 ? &quot;Items&quot; : &quot;Item&quot;]})&#039;
            })
</pre>
				<p>さてさて、とりあえず動くようにはなると思います。<br />
				　<br />
				　<br />
				ただ、ソート処理に関して今でもクエスチョンの疑問符が頭の上に浮いてます。</p>
				<p>デフォルトではグルーピングのソート処理は、グルーピングされた中のレコードを対象にソート処理ができます。<a href="http://blog.cypher-works.com/wp-content/uploads/2010/02/sample/grid_group_default.php" target="sample">グルーピングでソート処理していないデモです</a></p>
				<p>今回、私はグルーピングした中の情報だけでなく、グルーピングそのもののソートも実現しようとしました。デモを見ていただければ、グルーピングした情報でソートできると思います（デモではグルーピングしたフィールドが隠れているので、一旦「作業年月」のフィールドを表示してからでないと見ることができません）。groupOnSortを指定すると中のレコードでなくグルーピングでソートができるようになりました。<br />
				で、問題はgroupField以外でソートしようとすると、そのカラムでグルーピングしようとしてしまいデフォルトで実現されていたグルーピング内でのソートが実現できませんでした。なのでgourpField以外はソートできないようにしています。本当はグルーピングされた中のレコードでソートしたかったのですけど。。</p>
				<p>う〜ん、そんなこんなで実現できなかったこともあるので、今回の実装は満足していません。分かる方いましたら是非教えてください。</p>
				<p>ではでは</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cypher-works.com/?feed=rss2&amp;p=1059</wfw:commentRss>
		</item>
	</channel>
</rss>
