<?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; 参考</title>
	<atom:link href="http://inspire-tech.jp/category/reference/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>SublimeTextで最後に開いていた文章（タブ）が、次に起動したときも開いてしまうのを防ぐ方法</title>
		<link>http://inspire-tech.jp/2013/09/sublimetext_disable_remember_open_files/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sublimetext_disable_remember_open_files</link>
		<comments>http://inspire-tech.jp/2013/09/sublimetext_disable_remember_open_files/#comments</comments>
		<pubDate>Thu, 19 Sep 2013 10:21:43 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[問題解決]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1537</guid>
		<description><![CDATA[SublimeTextは一度使い始めたら手放せなくなるほど軽くて使い安く、プログラマーだったら絶対に入れておいて損は無いテキストエディタです。 僕は普段はPHPStormでプログラミングをしますが、CSSやJavaScr [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>SublimeTextは一度使い始めたら手放せなくなるほど軽くて使い安く、プログラマーだったら絶対に入れておいて損は無いテキストエディタです。</p>
<p>僕は普段はPHPStormでプログラミングをしますが、CSSやJavaScript、PHPなどをちょこっと編集する際はほとんどコレを利用しています。</p>
<p>しかしながらこのエディタ、起動時に前回開いたファイルがそのままタブとして開かれてしまい、何となく気持ち悪い。</p>
<p>そういうときは <code>Preferences > Settings - User</code> を開き、設定値として下記を追加します。</p>
<pre class="brush: plain">
{
	"hot_exit": false,
	"remember_open_files": false,
}
</pre>
<p>ポイントなのは <code>hot_exit</code> も合わせて <code>false</code> にすることで、<code>remember_open_files</code> のみを <code>false</code> にしただけでは、動作に変わりがありません。</p>
<p>どちらも false とすることで、次回から起動した際にブランクの状態で開かれるようになります。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2013/09/sublimetext_disable_remember_open_files/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>WordPressの「投稿」機能から「カテゴリー」や「タグ」をメニューごと消す方法</title>
		<link>http://inspire-tech.jp/2013/04/wordpress_remove_category_and_tag_from_post/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_remove_category_and_tag_from_post</link>
		<comments>http://inspire-tech.jp/2013/04/wordpress_remove_category_and_tag_from_post/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 12:22:05 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1472</guid>
		<description><![CDATA[WordPressでカスタム投稿やカスタム分類を使って、新しく分類や投稿を作成することは簡単に情報が見つかります。 しかし逆に、デフォルトの「投稿」機能から「カテゴリー」や「タグ」といった、 デフォルトで設定されている分 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPressでカスタム投稿やカスタム分類を使って、新しく分類や投稿を作成することは簡単に情報が見つかります。</p>
<p>しかし逆に、デフォルトの「投稿」機能から「カテゴリー」や「タグ」といった、 デフォルトで設定されている分類機能を取り外したいといった場合の情報はあまり見つかりません。</p>
<p>そんな時は下記のコードを<code>functions.php</code>に記述して利用します。</p>
<pre class="brush: php">
function my_unregister_taxonomies()
{
	global $wp_taxonomies;

	/*
	 * 投稿機能から「カテゴリー」を削除
	 */
	if (!empty($wp_taxonomies['category']->object_type)) {
		foreach ($wp_taxonomies['category']->object_type as $i => $object_type) {
			if ($object_type == 'post') {
				unset($wp_taxonomies['category']->object_type[$i]);
			}
		}
	}

	/*
	 * 投稿機能から「タグ」を削除
	 */
	if (!empty($wp_taxonomies['post_tag']->object_type)) {
		foreach ($wp_taxonomies['post_tag']->object_type as $i => $object_type) {
			if ($object_type == 'post') {
				unset($wp_taxonomies['post_tag']->object_type[$i]);
			}
		}
	}

	return true;
}

add_action('init', 'my_unregister_taxonomies');
</pre>
<p>これだけで簡単に「カテゴリー」や「タグ」などを外すことができます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2013/04/wordpress_remove_category_and_tag_from_post/feed/</wfw:commentRss>
		<slash:comments>147</slash:comments>
		</item>
		<item>
		<title>CakePHPの超便利なファイルアップロードプラグイン、FileBinderプラグインの使い方をまとめてみた。</title>
		<link>http://inspire-tech.jp/2011/07/cakephp_file_binder_plugin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_file_binder_plugin</link>
		<comments>http://inspire-tech.jp/2011/07/cakephp_file_binder_plugin/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 02:00:39 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=975</guid>
		<description><![CDATA[CakePHPを利用している上で、一番悩むのがファイルのアップロードとその管理です。 MediaPluginという有名なファイルアップロードプラグインがありますが、高機能・多機能との引き替えに、インストール方法やその利用 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPを利用している上で、一番悩むのがファイルのアップロードとその管理です。</p>
<p>MediaPluginという有名なファイルアップロードプラグインがありますが、高機能・多機能との引き替えに、インストール方法やその利用方法が非常にわかりづらく、さらにプラグインをバージョンアップしただけでエラーを吐いて動かなくなったりと、常時メンテナンス、するプロジェクトに導入するには少々の抵抗があります。</p>
<p>そこで、もっとシンプルで使いやすいファイルアップロードプラグインである、FileBinderプラグインを紹介したいと思います。</p>
<p><span id="more-975"></span></p>
<h3><span>FileBinderプラグインの特徴</span></h3>
<p>FileBinderプラグインは、ファイルアップロードに関して下記のような機能を持っています。</p>
<ul>
<li>ファイルサイズの制限やファイルタイプの制限など、アップロードしたファイルのバリデーション</li>
<li>ファイルの保存方法を任意のディレクトリに保存するか、DBにバイナリとして保存するか選べる</li>
<li>全てのファイルを1つのテーブルで管理できる</li>
<li>任意のテーブルにファイルの情報を仮想のフィールドとして組み込むことができる</li>
</ul>
<p>ファイルアップロードで必要とされるであろうほとんどの機能が実装されていて、普通に使う分であれば何一つ不自由はしません。</p>
<p>そして、FileBinderプラグインの特徴と言える機能が、上記でも紹介している、<strong>任意のテーブルにファイルの情報を仮想フィールドとして組み込むことができる機能</strong>です。</p>
<p>この機能は、特定のテーブルの検索結果に仮想のフィールドを作成し、そこにファイルの情報を埋め込むことで、あたかもそのテーブルにファイルのデータが格納されているかのように扱うことができるのです。</p>
<h4>仮想フィールドの例</h4>
<p>例えば下記のようなプロフィールを管理するテーブルがあったとします。</p>
<ul>
<li>first_name</li>
<li>last_name</li>
<li>age</li>
<li>blood_type</li>
<li>address</li>
<li>email</li>
<li>phone</li>
</ul>
<p>このテーブルにはプロフィール画像などを格納するフィールドはありません。<br />
しかし、FileBinderプラグインを用いると、このテーブルの構造に全く手を付けずに、検索結果にプロフィール画像の情報を埋め込む事が可能になります。</p>
<ul>
<li>first_name</li>
<li>last_name</li>
<li>age</li>
<li>blood_type</li>
<li>address</li>
<li>email</li>
<li>phone</li>
<li><strong>profile_image</strong>
<ul>
<li>file_size</li>
<li>file_name</li>
<li>file_content_type</li>
<li>file_object</li>
<li>&#8230;</li>
</ul>
</li>
</ul>
<p>この機能は非常に便利です。</p>
<p>テーブルに手を加えなくても良いのでデータベース設計が柔軟になりますし、1つのテーブルにいくつでも仮想フィールドを加えることができるため、仕様変更が発生した場合でも簡単に対応できます。</p>
<p>また、Mediaプラグイン同様にファイルの情報を1つのテーブルで管理できるため、情報の管理がしやすくなるというメリットもあります。</p>
<h3><span>基本的な利用の流れ</span></h3>
<p>FileBinderプラグインの基本的な利用方法は、下記のようになっています。</p>
<ol>
<li>ファイルの情報を組み込みたいモデルにBindableビヘイビアを組み込む</li>
<li>上記のモデルにファイルアップロードに関する設定を定義</li>
<li>上記のモデルを利用するコントローラーにRingコンポーネントを組み込む</li>
<li>ファイルアップロードを含んだフォームをコントローラーに送信</li>
<li>コントローラーでbindUpメソッドを実行</li>
<li>モデルのsaveメソッドでフォームデータを保存</li>
</ol>
<p>ビヘイビアとコンポーネントを利用するので多少複雑に感じますが、利用し始めると全くその複雑さは感じません。</p>
<h4>実行環境</h4>
<p>解説は下記の環境を前提に行っています。</p>
<ul>
<li>PHP5系</li>
<li>CakePHP 1.3系
</ul>
<p>CakePHPのバージョンは1.2系でも動作しそうではありますが、実際に試していないので動作保証はできません。</p>
<p>1.2系をご利用の場合は、コンソールからの実行コマンドが一部違ったりするため、その点は読み替えてご利用下さい。</p>
<h4>プラグインファイルのダウンロード</h4>
<p>下記のURLにアクセスして、最新バージョンをダウンロードして、<code>app/plugins/</code> ディレクトリ以下に展開してください。</p>
<p><a title="fusic/filebinder - GitHub" href="https://github.com/fusic/filebinder">fusic/filebinder &#8211; GitHub</a></p>
<h4>Attachmentモデルの作成</h4>
<p>まずはファイル情報を格納するためのモデルである、Attachmentモデルを作成します。</p>
<p>プラグインの<code>config/</code>ディレクトリ以下に<code>schema.php</code>ファイルがありますが、そのまま実行するとバイナリデータ保存用のフィールドの型指定がCakePHPの許可する型に無いため、エラーが発生してしまいます。</p>
<p>そのため、下記のように<code>file_object</code>フィールドの型を<code>longtext</code>から<code>text</code>などに変更します。</p>
<pre class="brush: php">
class AppSchema extends CakeSchema {
    var $name = 'App';

    function before($event = array()) {
        return true;
    }

    function after($event = array()) {
    }

    var $attachments = array(
                           'id' => array('type' => 'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
                           'model' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'model_id' => array('type' => 'integer', 'null' => false, 'default' => NULL),
                           'field_name' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'file_name' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'file_content_type' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'file_size' => array('type' => 'integer', 'null' => false, 'default' => NULL),
                           'file_object' => array('type' => 'text', 'null' => true, 'default' => NULL), // この行のタイプを text に変更
                           'created' => array('type' => 'timestamp', 'null' => true, 'default' => NULL),
                           'modified' => array('type' => 'timestamp', 'null' => true, 'default' => NULL),
                           'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)),
                           'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'InnoDB')
                           );
  }
</pre>
<p>そして、コンソールから先ほどの<code>schema.php</code>を利用してテーブルを作成します。</p>
<p><ins datetime="2011-07-26T03:03:16+00:00">コンソールからの実行コマンドが間違えていたのを修正しました。（2011.07.26）</ins></p>
<pre class="brush: shell">cake schema create -app your_app_name -plugin filebinder -name app</pre>
<p>データベースにファイルを保存する場合、先ほど変更した<code>file_object</code>フィールドのデータ型を、データベースのコンソールや設定画面から変更しておきましょう。</p>
<p>さもないと、<strong>text型では最大サイズの都合から、テキストファイルや小さな画像程度しか保存できなくなってしまいます</strong>。</p>
<p>また、忘れずにモデルクラスも作成しておきます。<br />
<code>app/models/attachment.php</code></p>
<pre class="brush: php">
class Attachment extends AppModel
{
}
</pre>
<h4>Bindableビヘイビアの組み込み</h4>
<p>ファイルアップロードのキモとなるBindableビヘイビアを、ファイルの情報を結び付けたいモデルに組み込みます。</p>
<pre class="brush: php">
class Profile extends AppModel
{
	public $actsAs = array(
		'Filebinder.Bindable' => array(
			'model' => 'Attachment', // ファイル情報を保存するモデル名
			'filePath' => WWW_ROOT . 'img' . DS, // ファイルを保存するディレクトリ（絶対パス）
			'dbStorage' => true, // ファイルをバイナリデータとしてデータベースに保存するか
			'beforeAttach' => null, // フック関数（ファイル保存前）
			'afterAttach' => null, // フック関数（ファイル保存後）
			'withObject' => false, // 検索結果にファイルのバイナリデータを付加するか
		)
	);
}
</pre>
<p>オプションを指定しない場合、上記の値がデフォルト値として利用されます。</p>
<h4>bindFields変数の定義</h4>
<p>そして、ファイル情報を結び付ける仮想フィールドの設定を、<code>$bindFields</code>というメンバ変数として下記のように定義します。</p>
<pre class="brush: php">
class Profile extends AppModel
{
	public $actsAs = array(
		'Filebinder.Bindable' => array(
			'model' => 'Attachment',
			'filePath' => WWW_ROOT . 'img' . DS,
			'dbStorage' => true,
			'beforeAttach' => null,
			'afterAttach' => null,
			'withObject' => false,
		)
	);

	public $bindFields = array(
		array(
			'field' => 'profile_image', // ファイル情報を組み込む仮想フィールド名
			'filePath' => WWW_ROOT . 'profile_image' // ファイルを保存するディレクトリ（絶対パス）。指定されない場合、ビヘイビアの設定が利用されます。
		),
	);
}
</pre>
<p>もし、仮想フィールドを複数指定したい場合は下記のように指定します。</p>
<pre class="brush: php">
public $bindFields = array(
	array(
		'field' => 'file_upload_filed_name1',
		'filePath' => WWW_ROOT . 'file1'
	),
	array(
		'field' => 'file_upload_filed_name2'
		'filePath' => WWW_ROOT . 'file2'
	),
	array(
		'field' => 'file_upload_filed_name3'
	),
);
</pre>
<h4>バリデーションの定義</h4>
<p>Bindableビヘイビアにはファイルアップロード専用のバリデーションメソッドが揃っています。</p>
<dl>
<dt>checkContentType</dt>
<dd>ファイルのメタ情報を制限します。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkContentType', array('image/jpeg', 'image/gif', 'image/png'))
	)
);
</pre>
</dd>
<dt>checkExtension</dt>
<dd>ファイルの拡張子を制限します。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkExtension', array('jpg', 'gif', 'png'))
	)
);
</pre>
</dd>
<dt>checkFileSize</dt>
<dd>ファイルサイズを制限します。<code>KB</code>、<code>MB</code>、<code>GB</code>などの単位が利用出来ます。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkFileSize', '10MB')
	)
);
</pre>
</dd>
<dt>checkMinFileSize</dt>
<dd>ファイルの最小サイズを制限します。<code>KB</code>、<code>MB</code>、<code>GB</code>などの単位が利用出来ます。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkMinFileSize', '10MB')
	)
);
</pre>
</dd>
<dt>funcCheckFile</dt>
<dd>ユーザー関数でファイルのバリデーションを行います。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('funcCheckFile', 'userFunction')
	)
);
</pre>
</dd>
<dt>notEmptyFile</dt>
<dd>ファイルの未アップロードを制限します。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('notEmptyFile')
	)
);
</pre>
</dd>
</dl>
<p>必要に応じて、仮想フィールドを組み込むモデルにバリデーションを定義します。</p>
<pre class="brush: php">
class Profile extends AppModel
{
	public $actsAs = array(
		'Filebinder.Bindable' =&gt; array(
			'model' =&gt; 'Attachment',
			'filePath' =&gt; WWW_ROOT . 'img' . DS,
			'dbStorage' =&gt; true,
			'beforeAttach' =&gt; null,
			'afterAttach' =&gt; null,
			'withObject' =&gt; false,
		)
	);

	public $bindFields = array(
		array(
			'field' =&gt; 'profile_image',
			'filePath' =&gt; WWW_ROOT . 'profile_image'
		),
	);

	public $validate = array(
		'profile_image' =&gt; array(
			'fileSize' =&gt; array(
				'rule' =&gt; array('checkFileSize', '1MB'),
				'message' =&gt; 'ファイルサイズは1MB以内でアップロードしてください。'
			),
			'fileExt' =&gt; array(
				'rule' =&gt; array('checkExtension', array('jpg', 'gif', 'png')),
				'message' =&gt; '許可されていない拡張子を利用しています。'
			)
		)
	);
}
</pre>
<h4>Ringコンポーネントの組み込み</h4>
<p>フォームからのデータを受け取るコントローラーに、Ringコンポーネントを組み込みます。</p>
<pre class="brush: php">
class ProfileController extends AppController
{
	public $components = array(
		'Filebinder.Ring'
	);
}
</pre>
<p>特に設定は必要ありません。</p>
<h4>フォームを作成</h4>
<p>ファイルアップロードを行うフォームを作成します。<br />
このとき、ファイルを選択する入力フォームは、先ほど定義した仮想フィールドの名前と同一にします。</p>
<p><ins datetime="2011-07-26T03:03:16+00:00">フォームの内容がおかしかったのを修正しました。 （2011.07.26）</ins></p>
<pre class="brush: php">
&lt;?php echo $this-&gt;Form-&gt;create(array('type' =&gt; 'file')) ?&gt;
&lt;dl&gt;
&lt;dt&gt;性&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('first_name') ?&gt;&lt;/dd&gt;
&lt;dt&gt;名&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('last_name') ?&gt;&lt;/dd&gt;
&lt;dt&gt;年齢&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('age') ?&gt;&lt;/dd&gt;
&lt;dt&gt;血液型&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('bloodtype') ?&gt;&lt;/dd&gt;
&lt;dt&gt;住所&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('address') ?&gt;&lt;/dd&gt;
&lt;dt&gt;メールアドレス&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('email') ?&gt;&lt;/dd&gt;
&lt;dt&gt;電話番号&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('phone') ?&gt;&lt;/dd&gt;
&lt;dt&gt;プロフィール画像&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;file('profile_image') ?&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;?php echo $this-&gt;Form-&gt;end() ?&gt;
</pre>
<p>仮想フィールドを複数作成した場合、それに対応した入力フォームを用意しましょう。</p>
<h4>BindUpメソッドを実行し、データを保存</h4>
<p>フォームのデータを受け取るコントローラーのアクションで、Ringコンポーネントのの<code>bindUp</code>メソッドを実行し、あと通常通りデータを保存します。</p>
<p><code>bindUp</code>メソッドはファイルアップロードの前処理を行うメソッドで、この<code>bindUp</code>メソッドを実行しないとファイルが保存されません。</p>
<pre class="brush: php">
class ProfileController extends AppController
{
	public $components = array(
		'Filebinder.Ring'
	);

	public function add()
	{
		if (!empty($this->data)) {
			$this->Ring->bindUp();

			if (!$this->Profile->save()) {
				// 保存完了
			}
		}
	}
}
</pre>
<p>このとき、<code>bindUp</code>メソッドの引数には、ファイルの保存処理を行うモデル名を指定する事ができます。</p>
<p>このモデル名は、先ほどBindableビヘイビアを組み込んだモデルを指定しますが、省略した場合、自動的にコントローラーの<code>$modelClass</code>変数に定義されたモデルが利用されます。</p>
<h4>データが登録されているか確認する</h4>
<p>保存したモデルのデータを実際に確認してみます。</p>
<pre class="brush: php">
$profile = $this->Profile->read();
debug($profile);
</pre>
<pre class="brush: php">
[Profile] => Array
(
    [id] => 1
    [first_name] => 太郎
    [last_name] => 山田
    [age] => 25
    [blood_type] => A
    [address] => 東京都千代田区
    [email] => taro.yamada@test.com
    [phone] => 03-1234-5678
    [craeted] => 2011-07-20 00:00:00
    [modified] => 2011-07-20 00:00:00
    [profile_image] => Array
        (
            [id] => 1
            [model] => Profile
            [model_id] => 1
            [field_name] => profile_image
            [file_name] => sample.jpg
            [file_content_type] => image/jpeg
            [file_size] => 65536
            [created] => 2011-07-20 00:00:00
            [modified] => 2011-07-20 00:00:00
            [file_path] => /app/webroot/profile_image/Profile/1/profile_image/sample.jpg
            [bindedModel] => Attachment
        )
)
</pre>
<p>正しくファイルの情報が結びついて読み出されているのがわかりますね。</p>
<h3><span>注意</span></h3>
<p>この検索結果にファイルの情報を結びつける機能は、ビヘイビアのafterFindメソッドで実現しています。</p>
<p>CakePHPでは、<strong>ビヘイビアのaftetFindメソッドは、そのビヘイビアが組み込まれたモデルが直接検索された時にしか呼ばれません</strong>。</p>
<p>要するに、AというモデルにhasManyで結びつけられたBというモデルがあり、そのBモデルにFileBinderビヘイビアが組み込まれているとします。</p>
<p>この時、<strong>Aモデルをfindした結果にBモデルの情報が存在していても、Bモデルの情報にはファイルの情報は結びついて来ません。</strong></p>
<p>これは実に不便なのですが、CakePHPの仕様のため、ビヘイビアではどうすることもできません。</p>
<h3><span>ビューでの使い方</span></h3>
<p>取得したファイルの情報を表示するには、付属のLabelヘルパーが便利です。<br />
Labelヘルパーには下記のような機能があります。</p>
<ul>
<li>ファイル情報の配列からaタグ（リンク）を生成</li>
<li>ファイル情報の配列からimgタグを生成</li>
<li>ファイルがブラウザから参照出来ない場所にある場合でも、ファイルがダウンロード・表示できるようにURLを生成してくれる</li>
</ul>
<h4>Labelヘルパーの使い方</h4>
<p>HTMLヘルパーに似ているので、使い方は簡単です。</p>
<dl>
<dt>ファイル情報からａタグを生成する</dt>
<dd>
<pre class="brush: php">
echo $this->Label->link($profile['profile_image']);
</pre>
</dd>
<dt>ファイル情報からimgタグを生成する</dt>
<dd>
<pre class="brush: php">
echo $this->Label->image($profile['profile_image']);
</pre>
</dd>
</dl>
<h3><span>ファイルの削除</span></h3>
<p>仮想フィールドに登録したデータを削除したい場合、下記のようなフィールドを利用します。</p>
<pre class="brush: php">
$this->Form->checkbox('profile_image_delete');
</pre>
<p><code>仮想フィールド名＋_delete</code>という名称のフィールドが送信された場合、そのフィールドの値が真であれば、対応する仮想フィールドに結びついているファイル情報が削除されます。</p>
<h3><span>とても便利なプラグイン</span></h3>
<p>以上、基本的な使い方を解説しましたが、使い慣れると手放せなくなるほど便利なプラグインです。</p>
<p>ファイルのバージョン生成機能やキャッシュ機能などはありませんが、Mediaプラグインのように面倒なインストールや設定作業が必要ではなく、フック関数を利用することで様々な利用方法が考えられます。</p>
<p>是非一度、利用してみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/cakephp_file_binder_plugin/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Facebookの仕様に記載されているog:imageのアスペクト比についての誤解を解く</title>
		<link>http://inspire-tech.jp/2011/07/facebook_og-image_aspect_ratio/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facebook_og-image_aspect_ratio</link>
		<comments>http://inspire-tech.jp/2011/07/facebook_og-image_aspect_ratio/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 01:22:09 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[OGP]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=981</guid>
		<description><![CDATA[FacebookのOpen Graph Protocolの解説ページにはOGPに関する詳しい説明が記載されていますが、og:imageの仕様に関して下記のような記載があります。 og:image &#8211; An i [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>FacebookのOpen Graph Protocolの解説ページにはOGPに関する詳しい説明が記載されていますが、og:imageの仕様に関して下記のような記載があります。</p>
<blockquote cite="http://developers.facebook.com/docs/opengraph/" title="Open Graph protocol - Facebook開発者"><p>
og:image &#8211; An image URL which should represent your object within the graph. The image must be at least 50px by 50px and have a maximum aspect ratio of 3:1. We support PNG, JPEG and GIF formats. You may include multiple og:image tags to associate multiple images with your page.
</p></blockquote>
<p><cite><a href="http://developers.facebook.com/docs/opengraph/">Open Graph protocol &#8211; Facebook開発者</a></cite></p>
<p>要は<strong>og:imageに利用する画像は、縦横のサイズが50ピクセル以上、アスペクト比は3:1まで</strong>という仕様のようで、この仕様にあわない画像は取り扱ってくれません。</p>
<p>というような簡単な説明なのですが、あまりに簡単すぎるためか、このog:imageのアスペクト比に関しては、<strong>横長の画像なら大丈夫だけど縦長の画像はダメ！という誤解</strong>をしている方を、ちらほら見かけます。</p>
<h3><span>アスペクト比の定義</span></h3>
<p>しかしながら、このアスペクト比というのは、Wikipediaによると下記のように解説されています。</p>
<blockquote cite="http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E6%AF%94" title="アスペクト比 - Wikipedia"><p>
アスペクト比（アスペクトひ）またはアスペクト・レシオ（Aspect Ratio）とは2次元形状の物の長辺と短辺の比率を指し示す言葉。
</p></blockquote>
<p><cite><a href="http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E6%AF%94">アスペクト比 &#8211; Wikipedia</a></cite></p>
<p>アスペクト比とは<strong>長辺と短辺の比率</strong>ということになので、縦の長さが横の長さの3倍だったとしても、3:1という比率で表現できるわけですね。</p>
<p>ということで、Facebookのog:imageに利用できる画像の規格は、正しくは<strong>長辺の長さが短辺の3倍までの画像</strong>となります。</p>
<h3><span>実際に登録してみる</span></h3>
<p>実際に縦長の画像をog:imageに登録してみました。</p>
<div class="component img"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-settings.png" alt="" title="facebook-comment-settings" width="449" height="682" class="alignnone size-full wp-image-906" /></div>
<p>これを指定したページを、FacebookのURL Linterで読み込ませてみます。</p>
<div class="component img"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-aspect-ratio.png" alt="" title="facebook-aspect-ratio" width="307" height="207" class="alignnone size-full wp-image-1012" /></div>
<p>URL Linterにも正しく認識されていますね。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/facebook_og-image_aspect_ratio/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>英語版WordPress3.2を日本語化する</title>
		<link>http://inspire-tech.jp/2011/07/wordpress_localize/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_localize</link>
		<comments>http://inspire-tech.jp/2011/07/wordpress_localize/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 14:01:01 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=965</guid>
		<description><![CDATA[先日、今まで利用していたWordPress3.1.4から自動アップグレードを利用してWordPress3.2にアップデートしました。 このWordPress3.2はまだ日本語版のアップデータが提供されていないようなので、 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>先日、今まで利用していたWordPress3.1.4から自動アップグレードを利用してWordPress3.2にアップデートしました。</p>
<p>このWordPress3.2はまだ日本語版のアップデータが提供されていないようなので、英語版になってしまいましたが、過去バージョンの言語ファイルがあるためか、「投稿の一覧」や「インストール済みのプラグイン一覧」などを除いてほとんどが日本語化された状態で利用出来ます。</p>
<p>プラグインが多少エラーを起こしていたくらいで、機能的にもほとんど問題無く利用できる状態のようです。</p>
<p>ただ、英語の未翻訳がどうしても気になる！という方のために、現状でWordPress3.2を完全に翻訳する方法がありましたので、ご紹介します。</p>
<h3><span>最新の言語ファイルをダウンロードする</span></h3>
<p>基本的にWordPressはi18nに対応しているので、翻訳用の言語ファイルさえあればすぐに多言語化対応が可能です。</p>
<p>そこで、WordPress日本語版のサイトから、最新の日本語ファイルをダウンロードして適用します。</p>
<p>2011年7月9日現在、WordPress日本語版のサイトではWordPress3.2の日本語版はダウンロードできませんが、WordPress3.2に対応した言語ファイルはすでに整っているようです。</p>
<p>言語ファイルのリポジトリから、SVNを利用して、言語ファイルをダウンロードします。</p>
<pre class="brush: shell">svn checkout http://svn.automattic.com/wordpress-i18n/ja/trunk/messages/ languages</pre>
<h3><span>SVNが利用出来ない場合</span></h3>
<p>svnって何？という方やsvnの利用出来ない環境の方は、下記のURLにブラウザでアクセスします。</p>
<ul>
<li><a href="http://svn.automattic.com/wordpress-i18n/ja/trunk/messages">http://svn.automattic.com/wordpress-i18n/ja/trunk/messages</a></li>
</ul>
<p>言語ファイルの一覧で表示されるので、ローカルに <code>languages/</code> というディレクトリを作成し、ファイルを全て保存してください。</p>
<h4>TwentyElevenテーマも日本語化する</h4>
<p>WordPress3.2に付いてくるデフォルトのテーマである、TwentyElevenも日本語化する場合は、ローカルに <code>twentyeleven/</code> というディレクトリを作成し、下記URLに存在するファイルも全てダウンロードしてください。</p>
<p><a href="http://svn.automattic.com/wordpress-i18n/ja/trunk/messages/twentyeleven/">http://svn.automattic.com/wordpress-i18n/ja/trunk/messages/twentyeleven/</a></p>
<h3><span>言語ファイルを適用</span></h3>
<p>ダウンロードした language/ ディレクトリに存在する <code>.po</code>, <code>.mo</code> という拡張子の言語ファイルを、WordPressの <code>wp-content/languages/</code> ディレクトリに全てコピーします。<br />
古いファイルが存在する場合は上書きして下さい。</p>
<p>また、TwentyElevenテーマも日本語化される場合は、<code>wp-content/themes/twentyeleven/languages/</code> に、ダウンロードした <code>twentyeleven/</code> ディレクトリのファイルを全てコピーしてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/wordpress_localize/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP1.3でデバッグレベルが0の時でもSQLのログを記録する方法</title>
		<link>http://inspire-tech.jp/2011/07/cakephp_save_sql_log/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_save_sql_log</link>
		<comments>http://inspire-tech.jp/2011/07/cakephp_save_sql_log/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 13:11:13 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=857</guid>
		<description><![CDATA[CakePHPではデバッグレベルが2の場合、レンダリングした画面の下部に発行したSQLのログを表示してくれます。 この機能は非常に便利ですが、本番環境などでデバッグレベルを0にしていると、発行したSQLを確認する手段があ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPではデバッグレベルが2の場合、レンダリングした画面の下部に発行したSQLのログを表示してくれます。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/cakephp-sql-log.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/cakephp-sql-log-570x196.png" alt="" title="cakephp-sql-log" width="570" height="196" class="alignnone size-large wp-image-957" /></a></div>
<p>この機能は非常に便利ですが、本番環境などでデバッグレベルを0にしていると、発行したSQLを確認する手段がありません。</p>
<p>本番環境で何かしらデータベースエラーが発生した場合に、発行されているSQLを確認したいと思っても、そのままでは方法が無いのが現状です。</p>
<p>そこで、利用しているデータベースのドライバクラスを改良して、CakePHPのデバッグレベルに関わらず、発行したSQLをログファイルに保存できるように改造してみます。</p>
<h3><span>ロギング用のデータベースドライバを作成</span></h3>
<p>CakePHPのコアファイルに手を入れるのは避けたいので、データベースのドライバクラスを継承したログファイル保存用のドライバクラスを作成します。</p>
<p>ここではMySQLを利用する場合を想定します。<br />
他のデータベースを利用している場合は、適宜利用しているデータベースのドライバクラスにを読み替えて下さい。</p>
<h4>ファイルを作成</h4>
<p><code>app/models/datasources/</code> に <code>dbo_mysql_log.php</code> を作成します。</p>
<h4>dbo_mysqlを継承したコードを記述する</h4>
<p>ここでは<code>DboMysql</code>を継承した<code>DboMysqlLog</code>という名前でクラスを作成します。</p>
<p>そして、SQLを発行するための関数である<code>execute</code>関数と、SQLのログ表示に関する処理を行う<code>logQuery</code>関数をオーバーライトして、SQLをログに保存する設定であれば、実行したSQLをログファイルに保存できるように改良します。</p>
<p><script src="https://gist.github.com/1073579.js"> </script></p>
<p><code>App::import()</code>関数を利用してスーパークラスを読み込んでおかないとエラーが出ますので注意して下さい。</p>
<h3><span>データベースの接続設定を行う</span></h3>
<p><code>app/configs/database.php</code> ファイルの中で、利用するデータベースのドライバ指定を、先ほど作成したドライバに切り替えます。</p>
<pre class="brush: php">
public $development = array(
	'driver' => 'mysql_log',
	'persistent' => false,
	'host' => 'localhost',
	'login' => '********',
	'password' => '********',
	'database' => 'test',
	'prefix' => '',
	'encoding' => 'utf8'
);
</pre>
<p><code>driver</code>の指定は、作成したドライバのファイル名から <code>dbo_</code> と拡張子を除いたもので指定しましょう。</p>
<h3><span>ログ保存用の設定を行う</span></h3>
<p><code>config/bootstrap.php</code> に下記のようなコードを記述します。</p>
<pre class="brush: php">
Configure::write('Sql.log', true);
</pre>
<p>これで、デバッグレベルに関係なく、発行されたSQLが <code>tmp/logs/sql.log</code> に出力されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/cakephp_save_sql_log/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Facebookのコメントプラグインに管理者用の画面を表示させる方法をまとめてみた。</title>
		<link>http://inspire-tech.jp/2011/07/facebook_comment_plugin_admin_panel/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facebook_comment_plugin_admin_panel</link>
		<comments>http://inspire-tech.jp/2011/07/facebook_comment_plugin_admin_panel/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 15:02:07 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[OGP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[ソーシャルメディア]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=827</guid>
		<description><![CDATA[Facebookのコメントプラグインは設置も簡単で、さらにフィードバックも得られやすい素晴らしいソーシャルプラグインだと思いますが、ちょっとした設定を加えるだけで「コメントの管理画面」を表示できるので、その方法を簡単にま [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Facebookのコメントプラグインは設置も簡単で、さらにフィードバックも得られやすい素晴らしいソーシャルプラグインだと思いますが、ちょっとした設定を加えるだけで「コメントの管理画面」を表示できるので、その方法を簡単にまとめてみました。</p>
<p>以下は何も設定していないFacebookのコメントプラグインです。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-normal.png" alt="" title="facebook-comment-normal" width="445" height="140" class="alignnone size-full wp-image-897" />
</div>
<p>コメントができる以外に、特に機能はありません。</p>
<p>ここで、ちょっとした設定を加えるだけで下記のような、<strong>コメントのモデレーションやコメントプラグインの挙動を設定できる、管理画面を表示する</strong>ことができます。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-settings.png" alt="" title="facebook-comment-settings" width="449" height="682" class="alignnone size-full wp-image-906" /></div>
<p><span id="more-827"></span></p>
<h3><span>fb:adminsを指定する</span></h3>
<p>まずは自身がWebサイトの管理者であることをコメントプラグインに知らせるために、OGPの属性であるfb:adminsを指定します。</p>
<p>OGPってなんぞ？という方は、下記の記事を参照ください。</p>
<ul>
<li><a href="http://inspire-tech.jp/2011/06/ogp/">Facebookのいいね！ボタンを設置しても、OGPの設定がされていなければ意味が無い » INSPIRE TECH</a></li>
</ul>
<h3><span>fb:app_idを指定する</span></h3>
<p>コメントを管理するためのFacebookアプリケーションのIDを、こちらもOGP属性であるfb:app_idとして指定します。</p>
<p>「アプリなんて作ったことないよ！」という方も、Facebookのいいね！ボタンを作成したことがあれば、その際に自動的にいいね！ボタン用にFacebookアプリケーションが作成されていますので、そちらを使うと手間が省けます。</p>
<p>すでに存在するFacebookアプリケーションのIDを確認するには、Facebookにログインした状態で下記のURLにアクセスします。</p>
<ul>
<li><a href="https://developers.facebook.com/apps">Facebook開発者</a></li>
</ul>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-apps.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-apps-570x217.png" alt="" title="facebook-apps" width="570" height="217" class="alignnone size-large wp-image-899" /></a></div>
<p>ログインした人が作成したFacebookのアプリ一覧が表示されますので、その中の「アプリID」をメモして利用して下さい。</p>
<h3><span>Facebookアプリケーションを作成したことが無い場合</span></h3>
<p>Facebookアプリケーションを作成していない場合、上記URLにアクセスすると、下記のような画面が表示されます。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/app-confirm-570x341.jpg" alt="" title="app-confirm" width="570" height="341" class="alignnone size-large wp-image-902" />
</div>
<h4>開発者登録</h4>
<p>Facebookでアプリケーションを作成するには、必ず開発用のアプリケーションを許可し、さらにデベロッパー登録が必要になります。</p>
<p>このデベロッパー登録については、下記のURLに詳細が記載されていますので参照ください。</p>
<ul>
<li><a href="http://worldwidedeb.net/2011/05/17/facebook-developer-mobile">Facebookデベロッパーに登録する際、携帯アドレスでアカウント認証する方法-がんばるデザイナ tuts!</a></li>
</ul>
<h4>アプリ作成</h4>
<p>デベロッパー登録が完了したら再度先ほどの画面に戻り、右上にある「Create New App」をクリックします。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app-570x208.png" alt="" title="create-new-app" width="570" height="208" class="alignnone size-large wp-image-920" /></a>
</div>
<p>表示されたウィンドウに必要事項を記入してOKをクリックして下さい。<br />
アプリケーション名は基本的に外部に公開するようなアプリケーションでは無いので、サイト名＋Appとしておくのがわかりやすくて良いと思います。、</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app-confirming.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app-confirming-570x239.png" alt="" title="create-new-app-confirming" width="570" height="239" class="alignnone size-large wp-image-921" /></a>
</div>
<p>CAPTCHAの確認後、アプリケーションの作成が完了します。<br />
完了後の画面にあるApp IDをメモして利用して下さい。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/created-app-data.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/created-app-data-570x247.png" alt="" title="created-app-data" width="570" height="247" class="alignnone size-large wp-image-918" /></a>
</div>
<h3><span>fb:app_idを指定しない場合</span></h3>
<p>fb:app_id、すなわちFacebookのアプリケーションIDを指定しないと、コメントプラグインの設定画面は表示されますが、機能が大きく制限されてしまいます。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-no-appid.png" alt="" title="facebook-comment-no-appid" width="447" height="207" class="alignnone size-full wp-image-914" /></div>
<p>Facebookのアプリケーションは、必ずしもFacebookのソーシャルプラグインの導入には必要ではないのですが、導入することによって、今回紹介している機能を含めて、下記のような機能が利用できます。</p>
<ul>
<li>すべてのコメントをFacebookアプリケーションの管理画面から一括で管理できる</li>
<li>Webページに設置したコメントプラグインで、Facebookアプリケーションのコメント管理画面と同等の設定が可能になる</li>
<li>いいね！ボタンを押してくれた人全員にアプリケーションを通じてお知らせなどを送ることができる</li>
</ul>
<p>よほどのことがない限り、Webサイト用にひとつ作っておくことで、その後の管理が楽になります。</p>
<h3><span>URL LinterでFacebookに通知</span></h3>
<p>上記の作業が終わったところで、Fecebookにログインしてから、設置したURLをURL Linterで読み込んでみましょう。</p>
<ul>
<li><a href="http://developers.facebook.com/tools/lint/" title="URLリンター - Facebook開発者">URLリンター &#8211; Facebook開発者</a></li>
</ul>
<p>この作業は行わなくても、約一日で反映されるのですが、一応正しく設置されているのを確認する為に、読み込んでおくと良いでしょう。</p>
<p>すると、コメントプラグインのUIが下記のように変わります。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-login.png" alt="" title="facebook-comment-login" width="449" height="205" class="alignnone size-full wp-image-904" />
</div>
<p>ここで「設定」リンクをクリックすると、最初に紹介したようなコメントプラグインの挙動をカスタマイズ画面が表示されるようになります。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/facebook_comment_plugin_admin_panel/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WordPressでドメイン移転をしたので、そのときに行ったことをまとめてみた。</title>
		<link>http://inspire-tech.jp/2011/07/wordpress_domain_change/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_domain_change</link>
		<comments>http://inspire-tech.jp/2011/07/wordpress_domain_change/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 15:39:52 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=863</guid>
		<description><![CDATA[本日、ドメインをietomi.is-blog.netより、inspire-tech.jpに移転しました。 旧ドメインでもアクセス可能ですが、もしブックマークされている方がいらっしゃれば、URLの変更をお願いいたします。  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>本日、ドメインを<code>ietomi.is-blog.net</code>より、<code>inspire-tech.jp</code>に移転しました。</p>
<p>旧ドメインでもアクセス可能ですが、もしブックマークされている方がいらっしゃれば、URLの変更をお願いいたします。</p>
<p>というわけでドメイン移転をしたので、その際に行ったことをまとめてみます。</p>
<h3><span>前提</span></h3>
<p>自分の場合、下記のような条件でドメインの移転を行いました。</p>
<dl>
<dt>サーバー</dt>
<dd>変更無し</dd>
<dt>データベース</dt>
<dd>同一サーバー上なので変更無し</dd>
<dt>ドメインのディレクトリへのマッピング</dt>
<dd>
<ul>
<li><code>ietomi.is-blog.net</code> &#8211; <code>/www/ietomi.is-blog.net/</code></li>
<li><code>inspire-tech.jp</code> &#8211; <code>/www/inspire-tech.jp/</code></li>
</ul>
</dd>
<dt>行ったこと</dt>
<dd><code>ietomi.is-blog.net</code>を<code>inspire-tech.jp</code>に切り替える</dd>
</dl>
<p>新しく取得したドメインを古いドメインと同一のサーバーにマルチドメインとして割り当てて、新しいドメインでWordPressが稼働するようにしました。</p>
<h3><span>ファイルを移動</span></h3>
<p>まずは稼働しているWordPressの全ファイルを、古いドメインのディレクトリ<code>/www/ietomi.is-blog.net/</code>から新しいドメイン用のディレクトリ<code>/www/inspire-tech.jp/</code>に移動します。</p>
<p>何か不具合があったときのために、まずはコピーで対応すると良いでしょう。</p>
<h3><span>データベースの書き換え</span></h3>
<p>ファイルを移動しただけだと、WordPressの管理画面が404エラーになってしまい、ログインすることさえできなくなってしまっています。</p>
<p>これは、WordPressの環境変数に古いドメインが含まれているためです。</p>
<p>また、投稿記事の内容などにも古いドメインが含まれているため、データベースの内容を全て新しいドメインに書き換えてやる必要があります。</p>
<p>下記は最低限変更を書き換えを行ったテーブルです。<br />
必要に応じて他のテーブルも書き換えて下さい。</p>
<dl>
<dt>wp_options</dt>
<dd>
<pre class="brush: plain">UPDATE wp_options SET option_value=REPLACE(option_value, 'ietomi.is-blog.net, 'inspire-tech.jp')</pre>
</dd>
<dt>wp_posts</dt>
<dd>
<pre class="brush: plain">UPDATE wp_posts SET post_content=REPLACE(post_content, 'ietomi.is-blog.net', 'inspire-tech.jp'), guid=REPLACE(guid, 'ietomi.is-blog.net', 'inspire-tech.jp')</pre>
</dd>
</dl>
<h3><span>.htaccessのでリダイレクト設定</span></h3>
<p>古いURLを参照した場合に404になってしまうのは問題なので、ModRewireを使ってリダイレクトを設定します。</p>
<p><code>.htaccess</code>は<code>/ietomi.is-blog.net/</code>に設置することにします。</p>
<pre class="brush: plain">
RewriteEngine on
RewriteBase /ietomi.is-blog.net/
RewriteRule ^$ http://inspire-tech.jp/ [R=301,L]
RewriteRule ^(.+)$ http://inspire-tech.jp/$1 [R=301,L]
</pre>
<p>ステータスコード301を返すことで、検索エンジン等に恒久的なURL移動があったことを伝えます。</p>
<h3><span>移行完了</span></h3>
<p>以上でドメインの切り替えは完了です。</p>
<p>切り替えは非常にあっけなく終わりましたが、ソーシャルプラグインのカウントが0になってしまったのはちょっと寂しいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/wordpress_domain_change/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>OGP属性のog:imageは複数指定することができる</title>
		<link>http://inspire-tech.jp/2011/07/multiple_og_image/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=multiple_og_image</link>
		<comments>http://inspire-tech.jp/2011/07/multiple_og_image/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 08:44:35 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[OGP]]></category>
		<category><![CDATA[ソーシャルメディア]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=698</guid>
		<description><![CDATA[Facebookで利用され初めてから、最近ではmixiやgreeなど日本の大手ソーシャルメディアも対応し、利用者の増え続けているOGPですが、その属性の1つであるog:imageには、複数の画像が利用できることはご存知で [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Facebookで利用され初めてから、最近ではmixiやgreeなど日本の大手ソーシャルメディアも対応し、利用者の増え続けているOGPですが、その属性の1つであるog:imageには、複数の画像が利用できることはご存知でしょうか？</p>
<p>OGPっていったい何？という方や、Facebookやmixiのいいね！ボタンは設置してみたけどOGPなんて知らないという方は、下記の記事をご覧ください。</p>
<ul>
<li><a href="http://inspire-tech.jp/2011/06/ogp/">Facebookのいいね！ボタンを設置しても、OGPの設定がされていなければ意味が無い « INSPIRE TECH</a></li>
</ul>
<p>OGP属性のog:imageは、Webページのサムネイルを示すもので、正しく指定しておくと、例えばFacebookのいいね！ボタンが押された時などに、リンクやその他情報と共に、そのサムネイルがボタンを押した方のウォールに投稿されます。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-wall.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-wall-300x134.png" alt="" title="facebook-wall" width="300" height="134" class="alignnone size-medium wp-image-762" /></a>
</div>
<p>実はこのog:imageですが、他のOGPタグと違って、以下のように複数指定しておくことができます。</p>
<pre class="brush: xml">
&lt;meta property=&quot;og:image&quot; content=&quot;http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-wall-300x134.png&quot; /&gt;
&lt;meta property=&quot;og:image&quot; content=&quot;http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-share-300x258.jpg&quot; /&gt;</pre>
<p>複数指定する事でどんな意味があるかというと、Facebookのシェアボタンをサイトに埋め込んでいる場合に、クリックした人が<strong>シェアする際のサムネイルを、自由に選んでもらうことができる</strong>ようになります。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-share.jpg"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-share-300x258.jpg" alt="" title="facebook-share" width="300" height="258" class="alignnone size-medium wp-image-764" /></a>
</div>
<h3><span>Facebookのいいね！ボタンではあまり意味なし</span></h3>
<p>ただ、Facebookのいいね！ボタンに限ってみた場合、og:imageを2つ以上記述する意味はあまりありません。</p>
<p>いいね！ボタンはシェアボタンとは違い、og:image属性が複数指定されていても、シェアボタンが押された場合の画面のような、画像の選択は表示されません。</p>
<p>選択が表示されないばかりか、設定してあるog:image属性の中から1つが、Facebookによって自動的に利用されます。</p>
<p>しかしながら、この自動的に選択する部分の仕様が不透明で、どういった条件で1枚の画像を選ぶのか、その条件が全くわかりません。</p>
<p>画像サイズやファイル名、アスペクト比などでソートされているのかと思っていろいろと実験してみましたが、特に関係が無いようでした。</p>
<h3><span>今後のソーシャルメディア側の対応に期待</span></h3>
<p>今後、各ソーシャルメディアやそのほかのサービスで、さらにOGPを使った機能が増えてくると思いますが、いつ如何なるサービスで、この複数指定が生きてくるかわかりません。</p>
<p>現状ではあまり使い道はないですが、覚えておいても損はないでしょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/multiple_og_image/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Facebookのいいね！ボタンを設置しても、OGPの設定がされていなければ意味が無い</title>
		<link>http://inspire-tech.jp/2011/06/ogp/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ogp</link>
		<comments>http://inspire-tech.jp/2011/06/ogp/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 14:11:55 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[mixi]]></category>
		<category><![CDATA[OGP]]></category>
		<category><![CDATA[ソーシャルメディア]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=675</guid>
		<description><![CDATA[Facebookのいいね！ボタンがとても流行していますが、いいね！ボタンの真の力を発揮させるためには、Open Graph Protocol（OGP）の設定が不可欠なのはご存じでしょうか？ 今回はOGPとは何なのか、どの [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Facebookのいいね！ボタンがとても流行していますが、<strong>いいね！ボタンの真の力を発揮させるためには、Open Graph Protocol（OGP）の設定が不可欠</strong>なのはご存じでしょうか？</p>
<p>今回はOGPとは何なのか、どのように設定すれば良いのかを調べてみました。</p>
<p><span id="more-675"></span></p>
<h3><span>OGPとは？</span></h3>
<p>OGPとは一言で言うと、そのWebサイトのタイトルやWebサイトの説明、制作者の情報やWebサイトの種別などを、ソーシャルメディア側から正しく認識できるように決まった形で記述しておく仕組みを作ろう、というものです。</p>
<p>OGPについての説明は下記サイトが非常にわかりやすく詳細に載っていますので、OGPを知らない方は是非目を通して下さい。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/amachang/20110117/1295233078">フェイスブック、ミクシィ、グリーで使われている OGP (Open Graph Protocol) とは何か &#8211; IT戦記</a></li>
</ul>
<h3><span>Facebookのいいね！ボタンはOGPが必須</span></h3>
<p>タイトルにも記述しましたが、Facebookのいいね！ボタンを設置したページに<strong>OGPが設定されているかされていないかで、Facebook上での挙動に大きな差が出ます。</strong></p>
<p>まず、OGPが設定されていないWebページのいいね！ボタンがクリックされた場合、クリックしたユーザーのウォールにWebサイトの情報が表示されるだけで、それ以上は特に何もありません。</p>
<p>しかし、OGPが設定されているWebページのいいね！ボタンがクリックされた場合、<strong>クリックしたユーザーのウォールと、その友達のニュースフィードにWebサイトの情報が表示されます。</strong></p>
<p>これは、とてつもなく大きな差です。</p>
<p>たった一人のユーザーに認知されて終わるか、<strong>そのユーザーのつながっているユーザー全員に認知されるかの差になる</strong>からです。</p>
<p>つながりの多いユーザーがいいね！をクリックしてくれれば、そのつながっているユーザー全員にWebサイトの情報が通知されるわけですから、そこからさらに大きな反響を呼び、「いいね！」が「いいね！」を呼ぶことも、大いに考えられます。</p>
<h3><span>OGPの設定</span></h3>
<p>と、非常に重要な役割を担うOGPですが、設定自体は非常に簡単です。<br />
決められた属性を持つmetaタグを、決まったフォーマットでWebページのheadタグ内に記述しておくだけでいいのです。</p>
<h4>metaタグを設置するだけ</h4>
<p><code>meta</code>タグの <code>property</code>属性にOGPの属性名を指定し、<code>content</code>属性にその内容を記述します。</p>
<pre class="brush: xml">
&lt;meta property=&quot;属性名&quot; content=&quot;内容&quot; /&gt;
</pre>
<p>例えば下記のように設定します。</p>
<pre class="brush: xml">
&lt;meta property=&quot;og:site_name&quot; content=&quot;Webサイト名&quot; /&gt;
&lt;meta property=&quot;og:title&quot; content=&quot;Webページのタイトル&quot; /&gt;
&lt;meta property=&quot;og:url&quot; content=&quot;http://example.com/test_page.html&quot; /&gt;
&lt;meta property=&quot;og:description&quot; content=&quot;サンプルのWebページです。&quot; /&gt;
</pre>
<h4>OGPの属性</h4>
<p>OGPの代表的な属性を紹介します。</p>
<dl>
<dt>og:site_name</dt>
<dd>Webページの所属するWebサイトのタイトル</dd>
<dt>og:title</dt>
<dd>Webページのタイトル。</dd>
<dt>og:type</dt>
<dd>Webページの種類。OGPの<a href="http://ogp.me/#types">仕様で規定されている種類一覧</a>から選択します。</dd>
<dt>og:image</dt>
<dd>Webページのサムネイル画像のURL。この属性に限り、複数設置しても大丈夫なようです。</dd>
<dt>og:url</dt>
<dd>WebページのURL。ブログの記事などに設定する場合は、この属性にパーマリンクを出力するテンプレートタグを仕込みましょう。</dd>
<dt>og:description</dt>
<dd>Webページの簡単な説明です。</dd>
</dl>
<p>上記以外にもOGPには多数の属性がありますので、興味がある方は下記のOGPの詳細仕様を参照して下さい。</p>
<ul>
<li><a href="http://ogp.me/">The Open Graph Protocol</a></li>
</ul>
<h4>Facebook独自属性</h4>
<p>FacebookではOGP用の独自属性を定義していて、これを設定することでFacebookプラグインの機能を拡張したり、Facebookでいいね！ボタンのクリック率を計ることが出来る「インサイト」機能などを利用することが可能になります。</p>
<dl>
<dt>fb:admins</dt>
<dd>Webページの管理者が誰であるかをFacebookのユーザーIDで指定します。管理者が複数存在する場合、ユーザーIDを半角カンマで区切って入力できます。</dd>
<dt>fb:app_id</dt>
<dd>Webページと結びつけたいFacebookのアプリケーションIDを指定します。</dd>
<dt>fb:page_id</dt>
<dd>Webページと結びつけたいFacebookのファンページIDを指定します。</dd>
</dl>
<p>例えばFacebookコメントプラグインを利用している場合、<code>fb:admin</code>と<code>fb:app_id</code>を指定していると、コメント欄をカスタマイズできる「管理者画面」を表示することが可能になります。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/06/facebook-comment-admin1.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/06/facebook-comment-admin1-300x472.png" alt="" title="facebook-comment-admin" width="300" height="472" class="alignnone size-medium wp-image-823" /></a>
</div>
<p>Facebookのいいね！ボタンからのアクセスを一覧・解析できるインサイト機能については下記の記事をご覧下さい。</p>
<ul>
<li><a href="http://www.dakiny.com/archives/sns/facebook_insights/">Facebookインサイト 「いいね！」でわかるアクセス解析！簡単設定！: 世界中の１％の人々へ</a></li>
</ul>
<h4>ソーシャルメディア毎の独自属性</h4>
<p>上記の他にも、Facebookやmixiなど各ソーシャルメディア毎に独自に追加された属性もあるので、設置の際は各ソーシャルメディアのOGPの説明を、合わせてチェックしてみてください。</p>
<dl>
<dt>FacebookでのOGPの詳細説明（英語）</dt>
<dd><a href="http://developers.facebook.com/docs/opengraph/#types">Open Graph protocol &#8211; Facebook開発者</a></dd>
<dd>※ OGPの基本属性からFacebook用の独自属性まで、かなり詳細に記載されていますので是非チェックしてください。</dd>
<dt>mixiでのOGP拡張属性の説明</dt>
<dd><a href="http://developer.mixi.co.jp/connect/mixi_plugin/mixi_check/spec_mixi_check/">技術仕様 &lt;&lt; mixi Developer Center (ミクシィ デベロッパーセンター)</a></dd>
</dl>
<h3><span>FacebookでOGPタグの簡単生成</span></h3>
<p>Facebookではサイト毎のOGPタグを簡単に生成できるフォームがあります。<br />
いいね！ボタンを生成するフォームと同一のページに存在するので、いいね！ボタンを設置する際には、こちらも一緒に設置してしまったほうが良いでしょう。</p>
<p>下記のURLにアクセスし【Step 2 &#8211; Get Open Graph Tags】という見出しの下にあるフォームが、OGPの生成フォームです。</p>
<ul>
<li><a href="http://developers.facebook.com/docs/reference/plugins/like/">Like Button &#8211; Facebook開発者</a></li>
</ul>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/06/facebook-like-ogp.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/06/facebook-like-ogp-300x288.png" alt="" title="facebook-like-ogp" width="300" height="288" class="alignnone size-medium wp-image-725" /></a>
</div>
<p>フォームにWebページのURLや説明などを入力することで、そのWebページ用のOGPタグを自動的に生成してくれます。</p>
<h3><span>WordPressでのOGP</span></h3>
<p><ins><a href="http://inspire-tech.jp/2011/07/wp_ogp_customized_plugin/">WP-OGPプラグインに設定画面を設けて、いろいろな機能追加を施したプラグインをリリースしました。</a>（2011-07-02）</ins></p>
<p>WordPressでは非常に簡単にOGPを導入できる仕組みとして、WP-OGPプラグインというものが存在します。</p>
<ul>
<li><a href="http://wordpress.org/extend/plugins/wp-ogp/">WordPress › WP-OGP « WordPress Plugins</a></li>
<li><a href="http://phpspot.org/blog/archives/2011/02/ogpupwordpressw.html">ブログを一瞬でOGP対応にしてソーシャルサイトでの集客力をUPさせられるWordPressプラグイン「WP-OGP」:phpspot開発日誌</a></li>
</ul>
<p>プラグインをダウンロードして有効にするだけで、各ブログ記事毎のOGPタグを自動的に埋め込んでくれます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/06/ogp/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
