<?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>INSPIRE TECH &#187; PHP</title>
	<atom:link href="http://inspire-tech.jp/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://inspire-tech.jp</link>
	<description>株式会社インスパイアデザインのプログラマーである家富正幸が、デザインやシステム開発、ソーシャルメディアや最近のトレンドなど、Webに関する様々な情報を発信しているブログです。</description>
	<lastBuildDate>Fri, 29 Jan 2016 05:25:58 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.8.41</generator>
	<item>
		<title>九星気学で本命星と月命星を算出できるPHPのコードを書いてみたよ。</title>
		<link>http://inspire-tech.jp/2012/02/nine_star_ki_php_class/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nine_star_ki_php_class</link>
		<comments>http://inspire-tech.jp/2012/02/nine_star_ki_php_class/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 16:49:42 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ライブラリ]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1335</guid>
		<description><![CDATA[九星気学という有名な占術があります。 九星気学 &#8211; Wikipedia 身近では厄払いの方位除けなどに使われ、方位の吉凶を占う際によく利用されるようです。 方位除けに行った際「五黄殺」や「暗剣殺」なんていう単 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>九星気学という有名な占術があります。</p>
<ul>
<li><a href="http://ja.wikipedia.org/wiki/%E4%B9%9D%E6%98%9F%E6%B0%97%E5%AD%A6" title="九星気学 - Wikipedia">九星気学 &#8211; Wikipedia</a></li>
</ul>
<p>身近では厄払いの方位除けなどに使われ、方位の吉凶を占う際によく利用されるようです。<br />
方位除けに行った際「五黄殺」や「暗剣殺」なんていう単語を見た・聞いたことがある方が多いかと思いますが、まさにそういった方位と関係があり、自分の生年月日から算出する「本命星」と「月命星」から、方位の吉凶を占います。（間違えていたらごめんなさい！）</p>
<p>九星気学の詳しい説明はWikipediaに任せるとして、仕事で生年月日から「本命星」と「月命星」を算出できるPHPのコードを書きましたので、何かに使えるかと思い、公開します。<br />
<span id="more-1335"></span></p>
<h3><span>必要環境</span></h3>
<ul>
<li>PHP5.0以上</li>
</ul>
<h3><span>ソースコード</span></h3>
<p><script src="https://gist.github.com/1901958.js?file=nine_star_ki.php"></script></p>
<p class="note">NineStarKiというのは、海外での九星気学の呼び方です。</p>
<h3><span>使い方</span></h3>
<p><code>NineStarKi::yearly(int year, int month, int day)</code></p>
<p>で、本命星が算出されます。</p>
<p><code>NineStarKi::monthly(int year, int month, int day)</code></p>
<p>で、月命星が算出されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2012/02/nine_star_ki_php_class/feed/</wfw:commentRss>
		<slash:comments>72</slash:comments>
		</item>
		<item>
		<title>WordPressのカスタムメニュー（nav menu）に画像を使うためのコードを書いてみたよ！</title>
		<link>http://inspire-tech.jp/2011/12/wordpress_use_image_for_nav_menu/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_use_image_for_nav_menu</link>
		<comments>http://inspire-tech.jp/2011/12/wordpress_use_image_for_nav_menu/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 04:30:33 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1232</guid>
		<description><![CDATA[WordPress3.0から搭載されたカスタムメニュー（nav menu）は、サイト内コンテンツをドラッグアンドドロップで自由にカテゴライズする事が可能となり、グローバルメニューやサイトマップなどを管理する場合にとても便 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPress3.0から搭載されたカスタムメニュー（nav menu）は、サイト内コンテンツをドラッグアンドドロップで自由にカテゴライズする事が可能となり、グローバルメニューやサイトマップなどを管理する場合にとても便利な機能です。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/12/nav-menu.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/12/nav-menu-570x252.png" alt="" title="nav-menu" width="570" height="252" class="alignnone size-large wp-image-1233" /></a></div>
<p>ただ、このカスタムメニュー、cssのクラス名などを指定する事は可能ですが、リンクボタンに画像を直接利用しようとなると、いろいろな工夫が必要になります。</p>
<p>単純に画像のURLを、メニューのに登録したエントリのタイトルに指定することもできますが、WordPressに多少詳しくないと、アップロードした画像のURLなどを指定するのは敷居が高いですし、メニューの管理上も画像のURLがエントリ名となってしまうため、管理がし辛くなってしまいます。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/12/bad-nav-menu.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/12/bad-nav-menu-300x389.png" alt="" title="bad-nav-menu" width="300" height="389" class="alignnone size-medium wp-image-1236" /></a></div>
<p><span id="more-1232"></span></p>
<h3><span>もっと簡単に画像を使う</span></h3>
<p>そこで、「メニュー名＋メニューに登録したエントリー名」と同一の画像がライブラリに登録されていた場合、自動的にその画像を利用するコードを書いてみました。</p>
<h4>利用条件</h4>
<ul>
<li>PHP 5.2</li>
<li>WordPress 3.1</li>
</ul>
<h4>functions.php</h4>
<p><script src="https://gist.github.com/1436723.js?file=functions.php"></script></p>
<p>上記のコードをfunctions.phpとして利用するか、既存のファイルに追記して使って下さい。</p>
<h4>使い方</h4>
<p>カスタムメニューを下記のような状態で登録したとします。</p>
<ul>
<li>メニュー名：　テスト</li>
<li>エントリー名：　テストの記事</li>
</ul>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/12/test-nav-menu.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/12/test-nav-menu-570x354.png" alt="" title="test-nav-menu" width="570" height="354" class="alignnone size-large wp-image-1240" /></a></div>
<p>この場合、ライブラリに「<code>テスト/テストの記事</code>」というタイトルの画像があった場合、<strong>自動的にその画像をメニューの画像として利用</strong>します。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/12/wordpress_use_image_for_nav_menu/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>CakePHPで指定したフォームにデータが存在する場合だけ、あるフォームのバリデーションを行うためのビヘイビアを書いてみた</title>
		<link>http://inspire-tech.jp/2011/10/cakephp_assoc_field_validation_behavior/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_assoc_field_validation_behavior</link>
		<comments>http://inspire-tech.jp/2011/10/cakephp_assoc_field_validation_behavior/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 02:30:07 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1193</guid>
		<description><![CDATA[CakePHPでフォームのバリデーションを行う場合、例えばチェックボックスで「選択肢A」が選択されている場合のみ、「アンケート」のテキストエリアを必須入力にしたい！といった事があるかと思います。 バリデーションルールを切 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPでフォームのバリデーションを行う場合、例えばチェックボックスで「選択肢A」が選択されている場合のみ、「アンケート」のテキストエリアを必須入力にしたい！といった事があるかと思います。</p>
<p>バリデーションルールを切り替えるというのも1つの手段かと思いますが、もっと簡単に、バリデーションの定義だけでそれを実現できる関数を、ビヘイビアとして書いてみたので公開します。<br />
<span id="more-1193"></span></p>
<h3><span>ソースコード</span></h3>
<p>下記の<code>assoc_field_validation.php</code>をダウンロードして、<code>APP/models/behaviors/</code>以下に設置してください。</p>
<p><script src="https://gist.github.com/1273549.js"> </script></p>
<h3><span>使い方</span></h3>
<p>ビヘイビアに含まれる<code>checkAssocField</code>関数を、バリデーションのルール（ユーザー定義関数）として指定します。</p>
<p>下記のコードは、先ほどの「選択肢A」が選ばれていた場合に「アンケート」の入力を必須入力にする、というサンプルです。</p>
<pre class="brush: php">
class Contact extends AppModel
{
	public $validate = array(
		'option' =&gt; array(
			'inList' =&gt; array(
				'rule' =&gt; array('inList', array('A', 'B', 'C')),
				'required' =&gt; true,
				'allowEmpty' =&gt; false,
			)
		),
		'questionnaire' =&gt; array(
			'checkAssocField' =&gt; array(
				'rule' =&gt; array('checkAssocField', 'option', array('A'), 'notEmpty'),
				'message' =&gt; '必ず入力してください。',
				'required' =&gt; true,
			),
		),
	);
}
</pre>
<p>checkAssocField関数は3つの引数を取ります。</p>
<dl>
<dt>assocField (string)</dt>
<dd>
値をチェックする入力フォーム名です。
</dd>
<dt>assocValueList (array)</dt>
<dd>
<code>assocField</code>で指定してた入力フォームの値がここで指定された値ならば、<code>delegateRule</code>を用いてバリデーションを行います。
</dd>
<dt>delegateRule (mixed)</dt>
<dd>
<code>assocField</code>で指定したフォームの値が<code>assocValueList</code>の値に含まれる場合に、実行するバリデーションのルールを指定します。<br />
ここでは他のバリデーションのルールを自由に指定する事が出来ます。<br />
例）<code>array('maxLength', 30)</code>、<code>array('between', 20, 30)</code>
</dd>
</dl>
<h3><span>注意</span></h3>
<p><code>checkAssocField</code>関数をバリデーションに利用した場合、そのフィールドの<code>allowEmpty</code>と<code>required</code>の指定に気をつけて下さい。</p>
<p>例えば上述の例の場合、<code>allowEmpty</code>を<code>true</code>と指定してしまうと、この関数は意味を成しません。（値が空でもOKということになるため、「選択肢」がAだとしても「アンケート」の値が空で通ってしまう）</p>
<p>また、<code>allowEmpty</code>を<code>false</code>と指定すると、「選択肢」がAであれBであれ、「アンケート」が空の場合はエラーになってしまうため、これもまた意味がありません。</p>
<p>そこで、<code>required</code>のみを<code>true</code>とすることで<strong>値が空の状態でもバリデーションルールは実行する</strong>、という状態にする事が出来ます。</p>
<p>必須のチェックがしたければ、<code>delegateRule</code>に<code>notEmpty</code>を指定する事で行う事ができるので、<code>allowEmpty</code>ではなくそちらを利用するようにしてください。</p>
<p>この指定にだけは気をつけて下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/10/cakephp_assoc_field_validation_behavior/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>CakePHPで簡単にメンテナンスモードを実装するMaintenanceコンポーネントを書いてみたよ。</title>
		<link>http://inspire-tech.jp/2011/10/cakephp_maintenance_component/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_maintenance_component</link>
		<comments>http://inspire-tech.jp/2011/10/cakephp_maintenance_component/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 02:00:09 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1187</guid>
		<description><![CDATA[CakePHPで開発したアプリケーションを公開する際、たとえばバグの修正やデータベースのアップデートを行う場合など、サイトの全機能をいったん止めて、バックエンドで作業したいことがあるかと思います。 エントリポイントである [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPで開発したアプリケーションを公開する際、たとえばバグの修正やデータベースのアップデートを行う場合など、サイトの全機能をいったん止めて、バックエンドで作業したいことがあるかと思います。</p>
<p>エントリポイントである<code>APP/webroot/index.php</code>を差し替えるという強硬手段もあるかと思いますが、もっと手軽に実現するためのMaintenanceコンポーネントを作成してみたので公開します。<br />
<span id="more-1187"></span></p>
<h3><span>利用可能な環境</span></h3>
<p>下記環境で作成・テストを行っています。</p>
<ul>
<li>PHP 5.3.1</li>
<li>CakePHP 1.3.11</li>
</ul>
<p>PHP4系列では動作しません。<br />
また、CakePHP1.2以前では動作するかわかりません。</p>
<h3><span>ダウンロードと設置</span></h3>
<p>下記ソースコードを、<code>maintenance.php</code>として<code>APP/controllers/components</code>/以下に配置してください。</p>
<p><script src="https://gist.github.com/1271972.js"> </script></p>
<h3><span>組み込み</span></h3>
<p>基本的に1つだけのコントローラーをメンテナンスモードにする、というのもあまり考えられないと思うので、<code>AppController</code>自体に組み込んでおくと良いです。</p>
<pre class="brush: php">class AppController extends Controller
{
    public $components = array('Maintenance');
}
</pre>
<h3><span>設定</span></h3>
<p>Maintenanceコンポーネントを動作させる上での設定を、下記の何れかの方法で設定を行います。</p>
<h4>Configureクラスを利用する場合</h4>
<p><code>bootstrap.php</code>などの設定ファイルに記述する際にこちらの方法を使います。</p>
<pre class="brush: php">
Configure::write('Maintenance.level', 2);
Configure::write('Maintenance.errorMethod', 'error404');
</pre>
<h4>コンポーネントの指定時に設定を行う場合</h4>
<pre class="brush: php">
class AppController extends Controller
{
    public $components = array('Maintenance' => array(
        'level' => 2,
        'errorMethod' => 'error404',
    );
}
</pre>
<h4>Controller::beforeFilterメソッドを利用する場合</h4>
<pre class="brush: php">
class AppController extends Controller
{
	public $components = array('Maintenance');
	
	public function beforeFilter()
	{
		$this->Maintenance->level = 1;
		$this->Maintenance->errorMethod = 'error404';
	}
}
</pre>
<h4>利用出来る設定の一覧</h4>
<p>下記の項目を設定可能です。</p>
<p>動作の仕様上、コンポーネントのコンストラクタで利用する設定や、<code>Component::initialize</code>メソッドの実行時に利用する設定もあるため、そういった設定は<code>bootstrap.php</code>で<code>Configure</code>クラスを利用して指定したり、コンポーネントの指定時に設定する方法しか利用できません。</p>
<p>そのため、注釈にbootstrap.phpのみ等と書いてある項目に関しては、設定のタイミングを間違える（例えば、<code>bootstarp.php</code>と書いてある項目を<code>Controller::beforeFilter</code>で設定する等）と正しく動作しませんので、ご注意下さい。</p>
<dl>
<dt>level (int) <small>※bootstrap.php、またはコンポーネントの指定時のみ</small></dt>
<dd>
メンテナンスモードのレベルを設定します。<br />
<code>0</code> &#8211; メンテナンスモードを利用しません。<br />
<code>1</code> &#8211; <code>allowedCIDR</code>で指定されたIPアドレス帯域以外からのアクセスは、強制的にデバッグレベルを0にします。<br />
<code>2</code> &#8211; <code>allowedCIDR</code>で指定されたIPアドレス帯域以外からのアクセスは、強制的にデバッグレベルを0にした上で、メンテナンス画面へリダイレクトします。
</dd>
<dt>debug (int) <small>※bootstrap.phpのみ</small></dt>
<dd>
<code>allowedCIDR</code>で指定されたIPアドレス帯域でアクセスした場合のデバッグレベルを設定します。
</dd>
<dt>allowedCIDR (array) <small>※bootstrap.php、またはコンポーネントの指定時のみ</small></dt>
<dd>
メンテナンスモードの影響を受けないIPアドレスを<a href="http://ja.wikipedia.org/wiki/Classless_Inter-Domain_Routing">CIDRの形式</a>で記述します。<br />
<code>level</code>が1以上の時にここで指定されたIPアドレス帯域でアクセスすると、<code>debug</code>で指定されたデバッグレベルでアプリケーションが実行されます。<br />
配列を利用する事で複数のパターンを指定する事が可能です。<br />
例）<code>192.168.0.1/32</code>
</dd>
<dt>baseURL (mixed)</dt>
<dd>
アプリケーションのホームURLを文字列またはCakeURLの形式で指定します。<br />
<code>level</code>が2の時にこれ以外のURLにアクセスがあった場合、このURLにリダイレクトした後にメンテナンス画面を表示させます。
</dd>
<dt>errorMethod (string)</dt>
<dd>
メンテナンス画面を表示するためのエラーメソッドの名前を指定します。<br />
内部的には<code>Object::cakeError</code>メソッドを利用しているため、<code>cakeError</code>クラスもしくは<code>appError</code>クラスに定義されているメソッド名を指定します。（デフォルトでは<code>error404</code>です）
</dd>
<dt>errorParams (array)</dt>
<dd>
エラーメソッドに渡すパラメータを配列で指定します。
</dd>
</dl>
<h3><span>利用方法</span></h3>
<p>上記設定を参考に、適切な設定を行うだけでOKです。<br />
あとは必要に応じて<code>level</code>を2に変更する事で、すぐさまアプリケーション全体をメンテナンス中にすることができます。</p>
<p>その際、<code>allowedCIDR</code>に指定されたIPアドレス帯域からは、<code>debug</code>に指定したデバッグレベルで通常通りのアクセスが可能なため、通常のユーザーにはメンテナンス中を表示させ、その間に管理者がシステムのアップデートやバグの調査などを行う事が可能になります。</p>
<p><code>level</code>が1の場合は、通常のユーザーはデバッグレベル0、許可されたIPアドレス帯域からは<code>debug</code>に指定したデバッグレベルでアクセスする事ができるので、小さなバグの検証などにも利用できるかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/10/cakephp_maintenance_component/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>CakePHPでデバッグモード以外でもPHPのエラーログを取る超簡単な方法</title>
		<link>http://inspire-tech.jp/2011/10/cakephp_error_logging/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_error_logging</link>
		<comments>http://inspire-tech.jp/2011/10/cakephp_error_logging/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 15:56:46 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[問題解決]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1196</guid>
		<description><![CDATA[CakePHPではデバッグレベルを0としている場合、あらゆるエラーが非表示になり、CakePHPのエラーをはじめPHPのWarningやFatalエラーも記録されなくなります。 例えば、その状態で致命的なエラーが発生して [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPではデバッグレベルを0としている場合、あらゆるエラーが非表示になり、CakePHPのエラーをはじめPHPのWarningやFatalエラーも記録されなくなります。</p>
<p>例えば、その状態で致命的なエラーが発生しても、画面が真っ白になったり、<code>ErrorHandler::error404</code>メソッドが実行されるだけで、どこかで能動的<code>に$this->log</code>などで記録していない限り、解決につながる情報が記録されません。</p>
<p>そんな時、下記ブログを参考にカスタムエラーハンドラや、PHPエラーを記録する条件を定義しておくだけで、手軽にログを取ることができるようになります。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/bennylee/20100427/1272368893" title="CakePHPでdebug=0の際にset_error_handler - benny毎日ラボ">CakePHPでdebug=0の際にset_error_handler &#8211; benny毎日ラボ</a></li>
</ul>
<p>この中の内容で、自分も利用させて頂いている2つめの方法が手軽でよいので、紹介させて頂きます。</p>
<blockquote cite="http://d.hatena.ne.jp/bennylee/20100427/1272368893" title="CakePHPでdebug=0の際にset_error_handler - benny毎日ラボ"><p>
/app/config/bootstrap.phpの中にphpエラーログを常に/app/tmp/log/php_error.logに出力するとか<br />
例えば：<br />
if ( Configure::read(&#8216;debug&#8217;) == 0 )  {<br />
   error_reporting(E_ALL &amp; ~E_NOTICE &amp; ~E_DEPRECATED);<br />
   ini_set(&#8216;display_errors&#8217;, 0);   ini_set(&#8216;log_errors&#8217;, 1);<br />
   ini_set(&#8216;error_log&#8217;, LOGS . DS . &#8216;php_error.log&#8217;);<br />
}
</p></blockquote>
<p><cite><a href="http://d.hatena.ne.jp/bennylee/20100427/1272368893">CakePHPでdebug=0の際にset_error_handler &#8211; benny毎日ラボ</a></cite></p>
<p>下記のコードをAPP/config/bootstrap.phpに書いておくだけです。</p>
<pre class="brush: php">
if (Configure::read('debug') == 0) {
    error_reporting(E_ALL &#038; ~E_NOTICE &#038; ~E_DEPRECATED);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', LOGS . DS . 'php_error.log');
}
</pre>
<p>これだけで、デバッグレベルが0の場合でも、<code>APP/tmp/logs/php_error.log</code>にエラー情報が記録されるようになります。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/10/cakephp_error_logging/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>CakePHPのデータベースを開発環境と本番環境で切り分ける方法</title>
		<link>http://inspire-tech.jp/2011/04/cakephp_database_settings/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_database_settings</link>
		<comments>http://inspire-tech.jp/2011/04/cakephp_database_settings/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 13:54:38 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=278</guid>
		<description><![CDATA[CakePHPには利用するデータベース定義を複数定義しておける機能がありますが、その使い分けに関するアイデアです。 よくある解決策 よく開発環境と本番環境で自動的にデータベース接続を切り替えられるように、以下のようにDA [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPには利用するデータベース定義を複数定義しておける機能がありますが、その使い分けに関するアイデアです。</p>
<h3><span>よくある解決策</span></h3>
<p>よく開発環境と本番環境で自動的にデータベース接続を切り替えられるように、以下のようにDATABASE_CONFIGクラスのコンストラクタを改良したり、AppModelクラスのコンストラクタに現在の環境を判別できるような設定を書いたりするアイデア多く見かけられます。</p>
<h4>DATABASE_CONFIGクラスの改良</h4>
<pre class="brush: php">
class DATABASE_CONFIG
{
	public $default = array();

	// 公開用
	public $production = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'production.mysql.server',
		'login' => 'admin',
		'password' => '****',
		'database' => 'production_database',
		'prefix' => 'prefix_',
		'encoding' => 'utf8'
	);

	// 開発用
	public $development = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'test',
		'password' => '****',
		'database' => 'development_database',
		'prefix' => 'prefix_',
		'encoding' => 'utf8'
	);

	public function __construct()
	{
		if (env('SERVER_ADDR') !== '127.0.0.1') {
			$this->default = $this->production;

		} else {
			$this->default = $this->development;
		}
	}
}
</pre>
<h4>AppModelの改良</h4>
<pre class="brush: php">
function __construct()
{
	if (env('SERVER_ADDR') == '127.0.0.1') {
		$this->useDbConfig = 'development';
	}  else {
		$this->useDbConfig = 'production';
	}
}
</pre>
<h3><span>よくある解決策の問題点</span></h3>
<p>よくある解決策では、httpから利用する場合には非常に便利で良いのですが、<strong>コンソールから利用する場合、この設定では不都合が発生します。</strong></p>
<p>たとえばschemaコマンドを利用する場合です。<br />
<strong>コンソールではREMOTE_ADDRやSERVER_ADDRなどの環境変数が利用できません。</strong><br />
そのため、コンソールで利用する場合はリモートで利用しているのかローカルで利用しているのかを環境変数から判別することができません。</p>
<p>であれば、schemaコマンドを実行する際に<code> -connection</code>オプションで利用する接続を選択してやれば良いと考えてしまうのですが、CakePHPのコンソールから起動するｓchemaコマンドは、<code>-connection</code>オプションで指定されたデータベース接続（指定されなければdefault）とModelのデータベース接続（Model::$useDbConfig）が一致しない場合、そのModelのスキーマを読み込んでくれません。</p>
<p>実行しているファイルのパスを見て判別するような荒技もありますが、実行ファイルのパスが被らない保証も無いので、こちらも確実とはいえません。</p>
<h3><span>シンプルな解決策</span></h3>
<p>ではどうすれば良いか、というと、Configureクラスを利用する方法が一番わかりやすくてベターです。<br />
<code>config/core.php</code> もしくは <code>config/bootstrap.php</code> に下記のように設定します。</p>
<pre class="brush: php">
Configure::write('database', 'production');
</pre>
<p>そして、config/database.php のDATABASE_CONFIGクラスを下記のように記述します。</p>
<pre class="brush: php">
class DATABASE_CONFIG
{
	public $default = array();

	// 公開用
	public $production = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'production.mysql.server',
		'login' => 'admin',
		'password' => '****',
		'database' => 'production_database',
		'prefix' => 'prefix_',
		'encoding' => 'utf8'
	);

	// 開発用
	public $development = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'test',
		'password' => '****',
		'database' => 'development_database',
		'prefix' => 'prefix_',
		'encoding' => 'utf8'
	);

	public function __construct()
	{
		$connection = Configure::read('database');
		
		if (!empty($this->{$connection})) {
			$this->default = $this->{$connection};
		}
	}
}
</pre>
<p>この方法であれば、データベースを切り替えたいときはデバッグモードの切り替えのように設定値を変更するだけで済みますし、ローカルに依存するコードを記述する必要もなくなります。</p>
<p>さらに今後新しいデータベース接続を追加した場合にも、設定値を変更するだけで対応可能なので、今後の拡張性の面でも安心できます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/04/cakephp_database_settings/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>PHPでstatic宣言されていないクラスメソッドを静的に呼び出すと、$thisのスコープが呼び出し元のオブジェクトになる</title>
		<link>http://inspire-tech.jp/2011/01/php%e3%81%a7static%e5%ae%a3%e8%a8%80%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%81%aa%e3%81%84%e3%82%af%e3%83%a9%e3%82%b9%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92%e9%9d%99%e7%9a%84%e3%81%ab%e5%91%bc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php%25e3%2581%25a7static%25e5%25ae%25a3%25e8%25a8%2580%25e3%2581%2595%25e3%2582%258c%25e3%2581%25a6%25e3%2581%2584%25e3%2581%25aa%25e3%2581%2584%25e3%2582%25af%25e3%2583%25a9%25e3%2582%25b9%25e3%2583%25a1%25e3%2582%25bd%25e3%2583%2583%25e3%2583%2589%25e3%2582%2592%25e9%259d%2599%25e7%259a%2584%25e3%2581%25ab%25e5%2591%25bc</link>
		<comments>http://inspire-tech.jp/2011/01/php%e3%81%a7static%e5%ae%a3%e8%a8%80%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%81%aa%e3%81%84%e3%82%af%e3%83%a9%e3%82%b9%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92%e9%9d%99%e7%9a%84%e3%81%ab%e5%91%bc/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 18:31:48 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=267</guid>
		<description><![CDATA[CakePHP製のCMSである Croogo のソースを眺めていて気付いたんですが、クラス内でstatic修飾子を使っていないインスタンスメソッドを、::演算子を使って静的に呼び出すと、$thisのスコープが呼び出した側 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHP製のCMSである Croogo のソースを眺めていて気付いたんですが、クラス内でstatic修飾子を使っていないインスタンスメソッドを、::演算子を使って静的に呼び出すと、$thisのスコープが呼び出した側のオブジェクトになるという現象に気付きました。</p>
<p>具体的には下記のコードを実行すると、&#8221;Test 2&#8243; が表示されます。</p>
<pre class="brush: php">
class Test1
{
	public function callName()
	{
		echo $this->name;
	}
}

class Test2
{
	public $name = 'Test 2';
	
	public function callMethod()
	{
		Test1::callName();
	}
}

$obj = new Test2();
$obj->callMethod();
</pre>
<p>ちなみにstatic修飾子を付けると、Fatal errorとなるので、本来であれば推奨されない使い方のような気もします。<br />
これってPHP5の常識なんでしょうか？</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/01/php%e3%81%a7static%e5%ae%a3%e8%a8%80%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%81%aa%e3%81%84%e3%82%af%e3%83%a9%e3%82%b9%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92%e9%9d%99%e7%9a%84%e3%81%ab%e5%91%bc/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>printfのフォーマットから、変換指定子を抜き出す正規表現</title>
		<link>http://inspire-tech.jp/2010/12/regular_expression_that_searches_conversion_specifications_of_printf_function/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=regular_expression_that_searches_conversion_specifications_of_printf_function</link>
		<comments>http://inspire-tech.jp/2010/12/regular_expression_that_searches_conversion_specifications_of_printf_function/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 14:34:41 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=265</guid>
		<description><![CDATA[そんなに用途は無いと思うんですが、PHPのpirntf構文やsprintf構文のフォーマットから変換指定子（%sや%d等）を抜き出す正規表現を書いてみました。 /(?:^&#124;[^%])%(?:[0-9]+\$)?(?:[\ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>そんなに用途は無いと思うんですが、PHPのpirntf構文やsprintf構文のフォーマットから変換指定子（%sや%d等）を抜き出す正規表現を書いてみました。</p>
<pre class="brush: text">
/(?:^|[^%])%(?:[0-9]+\$)?(?:[\+\-]?(?:0|\'[^%])?[\d]*?(?:\.\d+)?)?[bcdeEufFgGosxX]/u
</pre>
<p>preg_match_allなどで利用すれば、変換指定子が何個使用されているかなどを調べることができると思います。</p>
<h3><span>用途</span></h3>
<p>プログラム中でprintf構文に必要とされる引数の数を調べなくてはならなくなり、下記のような関数を作って利用しています。</p>
<pre class="brush: php">
function _argAmount($pattern)
{
	preg_match_all(
		'/(?:^|[^%])%(?:([0-9]+)\$)?(?:[\+\-]?(?:0|\'[^%])?[\d]*?(?:\.\d+)?)?[bcdeEufFgGosxX]/',
		$pattern,
		$matches
	);

	$count = 0;

	if (!empty($matches[1])) {
		$filtered = array_filter($matches[1]);
		$max = max($filtered);
		$empty = count($matches[1]) - count($filtered);
		$count = ($max > $empty) ? $max : $empty;
	}

	return $count;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2010/12/regular_expression_that_searches_conversion_specifications_of_printf_function/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>CakePHPのMediaプラグインでモデル毎にバージョンファイルを生成するアイデア</title>
		<link>http://inspire-tech.jp/2010/11/idea_for_witch_version_file_is_made_with_media_plugin_of_cakephp_in_each_model/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=idea_for_witch_version_file_is_made_with_media_plugin_of_cakephp_in_each_model</link>
		<comments>http://inspire-tech.jp/2010/11/idea_for_witch_version_file_is_made_with_media_plugin_of_cakephp_in_each_model/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 16:21:23 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=229</guid>
		<description><![CDATA[CakePHPのMediaプラグインは非常に多機能なプラグインで、バージョン管理という非常に便利な機能が備わっており、本画像に手を加えずにいくつものサムネイル画像を生成する事ができます。 ただ、その便利な機能であるバージ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPのMediaプラグインは非常に多機能なプラグインで、バージョン管理という非常に便利な機能が備わっており、本画像に手を加えずにいくつものサムネイル画像を生成する事ができます。</p>
<p>ただ、その便利な機能であるバージョン管理機能が少々複雑で、馴れないと使いづらい印象を受けてしまいます。</p>
<p>たとえば画像をアップロードする際、モデルごとに違ったサイズのサムネイルを生成したい、などという場合などが特に悩むポイントかと思います。</p>
<p>基本的にMediaプラグインは、あらかじめアップロードするファイルごとに生成するファイルを「バージョン」として定義しているため、Mediaプラグインを通してアップロードしたファイルは、全て定義した数のバージョンファイルが生成されてしまいます。</p>
<p>そこで、下記のように工夫することで、モデルごとに生成するバージョンファイル取捨選択するアイデアです。</p>
<h3><span>Attachmentモデルをコピーして改良</span></h3>
<pre class="brush: php">
App::import('Lib', 'Media.Media');

class Attachment extends AppModel
{
    public $name = 'Attachment';
    public $useTable = 'attachments';
    public $useVersions = array();

    public $actsAs = array(
        'Media.Transfer' => array(
            'trustClient' => false,
            'transferDirectory' => MEDIA_TRANSFER,
            'createDirectory' => true,
            'alternativeFile' => 100
        ),
        'Media.Generator' => array(
            'baseDirectory' => MEDIA,
            'filterDirectory' => MEDIA_FILTER,
            'createDirectory' => true,
        ),
        'Media.Polymorphic',
        'Media.Coupler' => array(
            'baseDirectory' => MEDIA
        ),
        'Media.Meta' => array(
            'level' => 2
        )
    );

    public $validate = array(
        'file' => array(
            'resource'   => array('rule' => 'checkResource'),
            'access'     => array('rule' => 'checkAccess'),
            'location'   => array('rule' => array('checkLocation', array(
                MEDIA_TRANSFER, '/tmp/'
            ))),
            'permission' => array('rule' => array('checkPermission', '*')),
            'size'       => array('rule' => array('checkSize', '5M')),
            'pixels'     => array('rule' => array('checkPixels', '1600x1600')),
            'extension'  => array('rule' => array('checkExtension', false, array(
                'jpg', 'jpeg', 'png', 'tif', 'tiff', 'gif', 'pdf', 'tmp'
            ))),
            'mimeType'   => array('rule' => array('checkMimeType', false, array(
                'image/jpeg', 'image/png', 'image/tiff', 'image/gif', 'application/pdf'
        )))),
        'alternative' => array(
            'rule'       => 'checkRepresent',
            'on'         => 'create',
            'required'   => false,
            'allowEmpty' => true,
        )
    );

    public function makeVersion($file, $process)
    {
        if (!is_array($this->useVersions) &#038;&#038; !empty($this->useVersions)) {
            $this->useVersions = array($this->useVersions);
        }

        if ($this->useVersions === false || !empty($this->useVersions) &#038;&#038; !in_array($process['version'], $this->useVersions)) {
            return true;
        }

        return $this->Behaviors->Generator->makeVersion($this, $file, $process);
    }
}
</pre>
<h3><span>モデルごとに生成するバージョンファイルを切り替える</span></h3>
<p>先ほどのモデルを継承したモデルを生成し、メンバー変数 $useVersions に利用したいバージョンファイル名を配列で列挙します。</p>
<pre class="brush: php">
App::import('Model', 'Attachment');

class UserImage extends Attachment
{
    public $name = 'UserImage';
    public $useVersions = array('main', 'sub');

    public $validate = array(
        'file' => array(
            'resource'   => array('rule' => 'checkResource'),
            'access'     => array('rule' => 'checkAccess'),
            'location'   => array('rule' => array('checkLocation', array(
                MEDIA_TRANSFER, '/tmp/', 'C:\xampp\tmp',
            ))),
            'permission' => array('rule' => array('checkPermission', '*')),
            'size'       => array('rule' => array('checkSize', '1M')),
            'extension'  => array('rule' => array('checkExtension', false, array(
                'jpg', 'jpeg', 'png', 'gif', 'tmp',
            ))),
            'mimeType'   => array('rule' => array('checkMimeType', false, array(
                'image/jpeg', 'image/png', 'image/gif',
            ))),
        ),
    );
}
</pre>
<p>$useVersions が空の場合は全てのバージョンファイルが生成されます。<br />
これにより、モデルごとに生成するバージョンファイルを切り替えることが可能になります。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2010/11/idea_for_witch_version_file_is_made_with_media_plugin_of_cakephp_in_each_model/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenPNE 3.4 導入メモ</title>
		<link>http://inspire-tech.jp/2010/09/open_pne_setup/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=open_pne_setup</link>
		<comments>http://inspire-tech.jp/2010/09/open_pne_setup/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 14:41:26 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[OpenPNE]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=125</guid>
		<description><![CDATA[クライアントからの要望でSNSを導入する機会があり、オープンソースではメジャーなイメージのOpenPNEをインストールしてみたので、そのメモです。 インストール環境 さくらインターネット (マネージドプラン) PHP 5 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>クライアントからの要望でSNSを導入する機会があり、オープンソースではメジャーなイメージの<a href="http://www.openpne.jp/">OpenPNE</a>をインストールしてみたので、そのメモです。</p>
<h3><span>インストール環境</span></h3>
<ul>
<li>さくらインターネット (マネージドプラン)</li>
<li>PHP 5.2.4</li>
<li>MySQL 5.1</li>
</ul>
<p><span id="more-125"></span></p>
<h3><span>インストールファイルのダウンロード</span></h3>
<p><a href="http://www.openpne.jp/pne-downloads/">http://www.openpne.jp/pne-downloads/</a><br />
上記URLより、安定版の3.4.2（2010年9月6日現在）をダウンロードします。</p>
<h3><span>サーバーへのアップロード</span></h3>
<p>ダウンロードしたファイルを解凍して、サーバー上にアップロードします。弊社では、<br />
/home/アカウント名/apps/open_pne/<br />
にアップロードしました。</p>
<p>この際、解凍したファイル群の中にwebという公開ディレクトリが含まれるのですが、これは<strong style="color: #f00;">移動してはいけません</strong>。インストール後に公開ディレクトリに<a href="http://e-words.jp/w/E382B7E383B3E3839CE383AAE38383E382AFE383AAE383B3E382AF.html">シンボリックリンク</a>を張る方法が確実なようです。</p>
<h3><span>コンフィグファイルの設定</span></h3>
<p>/open_pne/config 以下に存在する、以下のファイルをダウンロードして編集します。</p>
<ul>
<li>OpenPNE.yml.sample</li>
<li>ProjectConfiguration.class.php</li>
</ul>
<dl>
<dt>OpenPNE.yml.sample 7行目付近</dt>
<dd>
<pre class="brush: js;class-name:codeBlock"># SNS の URL
# URL of the SNS
base_url: "http://www.sample.com"</pre>
</dd>
<dd>
<dt>OpenPNE.yml.sample 14行目付近</dt>
<dd>
<pre class="brush:js;class-name:codeBlock"># SNS からのメール送信に使うドメイン
# Domain to use for sending e-mail from the SNS
mail_domain: "sample.com"</pre>
</dd>
<dt>OpenPNE.yml.sample 25行目付近（必要であれば）</dt>
<dd>
<pre class="brush: js;class-name:codeBlock"># SNS から送信するメールの Envelope From (Return-Path ヘッダ) に指定するアドレス
# Envelope From (Return-Path header) address for sending e-mail from the SNS
mail_envelope_from: "info@sample.jp"</pre>
</dd>
</dl>
<p>ProjectConfiguration.class.php.sampleは初期化に利用するファイルのようですが、インストール時には特に使用しないようなので編集しなくてもかまいません。</p>
<p>最後に、ファイル名の拡張子から .sample を除去して、</p>
<ul>
<li>OpenPNE.yml</li>
<li>ProjectConfiguration.class.php</li>
</ul>
<p>とします。</p>
<h3><span>編集したファイルのアップロード</span></h3>
<p>編集した</p>
<ul>
<li>OpenONE.yml</li>
<li>ProjectConfiguration.class.php</li>
</ul>
<p>を、先ほどの config ディレクトリにアップロードします。</p>
<p>この際、元のファイルである <strong style="color: #f00;">OpenONE.yml.sample は削除してはいけません。</strong>これを削除してしまうと、インストール後に Warning が表示されます。</p>
<h3><span>セットアップコマンドの実行</span></h3>
<p>ここからはサーバーにSSHでログインして操作を行います。SSHクライアントを持っていない方は、<a href="http://www.stackasterisk.jp/tech/engineer/putty01_01.jsp">こちら</a>などを参考にSSHクライアントを導入してください。</p>
<p>さくらインターネットでのSSHログインは、下記のようになっています。</p>
<ul>
<li>スタンダードプラン以上</li>
<li>ホストアドレス: 初期ドメイン (アカウント.sakura.ne.jp)</li>
<li>ID: アカウント (初期FTPアカウントと同一)</li>
<li>パスワード: サーバパスワード</li>
</ul>
<p>サーバー契約時のメールに全て記載されているようなので、変更していない場合はそれを参照してください。</p>
<p>SSHでのログイン後、下記のようにコマンドを実行します。</p>
<pre class="brush:shell;class-name:codeBlock">cd /home/_account_/apps/open_pne # OpenPNEをアップロードしたディレクトリ
php simfony openpne:install</pre>
<h3><span>データベース設定</span></h3>
<p>その後、対話形式でデータベースの種類とアカウント、パスワードなどを聞かれますので、適宜入力していきます。</p>
<dl>
<dt>Choose DBMS (mysql, pgsql or sqlite)</dt>
<dd>使用するデータベースの種類を入力します。さくらインターネットではmysqlを提供していますので、「mysql」と入力します。</dd>
<dt>Type database username</dt>
<dd>データベースのユーザー名を入力します。ここではさくらインターネットののアカウント名を入力します。※マネージドプランをご利用の場合は、作成したデータベース名を入力します。</dd>
<dt>Type database password (optional)</dt>
<dd>データベースのパスワードを入力します。</dd>
<dt>Type database hostname</dt>
<dd>データベースサーバのホスト名を入力します。ここでは「mysqlxxxdb.sakura.ne.jp」という形式のものを入力します。※マネージドプランをご利用の場合は、「localhost」と入力します。</dd>
<dt>Type database port number (optional)</dt>
<dd>データベースのポート番号を入力します。ここでは未入力のままでOKです。</dd>
<dt>Type database name</dt>
<dd>データベース名を入力します。ここではさくらインターネットのアカウント名を入力します。 ※マネージドプランをご利用の場合は、作成したデータベース名を入力します。</dd>
</dl>
<p>最後に入力した内容の確認表示がされますので、そこで問題なければ「y」を入力します。</p>
<pre class="brush: shell;class-name:codeBlock">The DBMS                        mysql
The Database Username           (ユーザー名)
The Database Password           ******
The Database Hostname           mysql***.db.sakura.ne.jp （またはlocalhost）
The Database Port Number
The Database Name               (データベース名)
The Database Socket

  Is it OK to start this task? (y/n)y</pre>
<p>確認が終われば、その後は自動的にインストール作業が進んでいきます。最終的にCompleteの表示が出れば、これでインストール作業は終了です。</p>
<h3><span>公開ディレクトリの設定</span></h3>
<p>最後に公開ディレクトリに対して、シンボリックリンクを設定します。今回はwww以下にsnsというディレクトリを作り、それを公開ディレクトリとします。</p>
<p>SSHで下記のようにコマンドを実行します。</p>
<pre class="brush:shell;class-name:codeBlock">cd /home/アカウント名/www
ln -s /home/アカウント名/apps/open_pne/web sns</pre>
<p>次に、/home/アカウント名/apps/open_pne/web ディレクトリに存在する .htaccess をダウンロードし、内容を書き換えます。（viで直接書き換えてもOKです）</p>
<pre class="brush: xml">
#Options +FollowSymLinks +ExecCGI # コメントアウト

&lt;IfModule mod_rewrite.c&gt;
 RewriteEngine On

 # uncomment the following line, if you are having trouble
 # getting no_script_name to work
 RewriteBase /sns/    # さきほど公開ディレクトリとした「sns」を入れる

 # we skip all files with .something
 #RewriteCond %{REQUEST_URI} \..+$
 #RewriteCond %{REQUEST_URI} !\.html$
 #RewriteRule .* - [L]

 # we check if the .html version is here (caching)
 RewriteRule ^$ index.html [QSA]
 RewriteRule ^([^.]+)$ $1.html [QSA]
 RewriteCond %{REQUEST_FILENAME} !-f

 # no, so we redirect to our front web controller
 RewriteRule ^(.*)$ index.php [QSA,L]

&lt;/IfModule&gt;</pre>
<p>最初の行をコメントアウトしているのは、さくらインターネットでは .htaccess によるOptionsの設定を許可していないため、これを忘れると500エラーが発生するためです。</p>
<h3><span>設置完了</span></h3>
<p>以上でOpenPNEの設置は完了です。公開ディレクトリにアクセスしてみてください。</p>
<p>OpenPNEは初めて触ってみましたが、画面のレイアウトやモジュールを自由に設定・入れ替えができるので自由度も高いですし、インストールのハードルさえ超えてしまえばいろいろとカスタマイズして利用できそうです。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2010/09/open_pne_setup/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
	</channel>
</rss>
