<?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>ウェビンブログ &#187; PHP</title>
	<atom:link href="http://blog.webbingstudio.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.webbingstudio.com</link>
	<description>札幌のWebデザイナー・カスタマイズアドバイザー WebbingStudioのよしなし語り</description>
	<lastBuildDate>Fri, 30 Jul 2010 00:11:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>プログラミングのいろいろとわからないこと</title>
		<link>http://blog.webbingstudio.com/2010/07/programming.html</link>
		<comments>http://blog.webbingstudio.com/2010/07/programming.html#comments</comments>
		<pubDate>Fri, 30 Jul 2010 00:08:07 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1473</guid>
		<description><![CDATA[エンジニアさんは定年などと言われますが、
35歳ではじめてプログラミングのお仕事をしました。
PHP＋MySQLの簡単なアプリケーション作りです。
文字化けやエラーや条件分岐でうんうん悩んだりしながら、何とか形にできまし [...]]]></description>
			<content:encoded><![CDATA[<p>エンジニアさんは定年などと言われますが、<br />
35歳ではじめてプログラミングのお仕事をしました。<br />
PHP＋MySQLの簡単なアプリケーション作りです。</p>
<p>文字化けやエラーや条件分岐でうんうん悩んだりしながら、何とか形にできましたが、今度受注するときは、もっと早く作れるようにしないと全く元が取れません…</p>
<p>プログラミングについてはこれまで本格的な業務にもしていなかったし、ほぼ独学でやってきました。<br />
もちろん、基本的なセキュリティ対策はできるだけ勉強しているのですが、いわゆる「あまりサンプル集には載ってない細かいこと」がいろいろとわかりません。</p>
<p>開発オフに行くたびに聞くのを忘れてしまうので、めもめも&#8230;φ(。。</p>
<h3>変数の命名ってどうしたらいいのだろう</h3>
<p>今のところ、同じ関係のものは接頭辞を揃えて</p>
<pre><code>$hogeCnt / $hogeTitle</code></pre>
<p>のような感じで、二単語目以上になったらキャピタライズしたりしてます。<br />
でも処理が長くなると、どんどん命名がぐちゃぐちゃになってきてしまって…</p>
<pre><code>$fuga['cnt'] / $fuga['title']</code></pre>
<p>みたいに配列で管理すべき？</p>
<h3>データベースの接続と切断</h3>
<p>データベースを利用するときは、まずPDOなどで接続するのですが</p>
<pre><code>$piyo = new PDO('mysql:host=' . DB_HOST . '; dbname=' . DB_NAME . ', ' .  DB_USER . ', ' . DB_PASS);</code></pre>
<p>一定の処理が終わったら都度切断した方がいいのでしょうか。<br />
PHPスクリプトの先頭で接続、最後で切断…とかまずいでしょうか。</p>
<h3>一時変数</h3>
<p>複数の変数を組み立ててSQL文やURLを作るときは、一時的な計算のために変数を作ったりするのですが、万一のファイル改ざんが怖くて、処理が終わったらすぐunsetで消してます。</p>
<pre><code>unset($hoge, $fuga, $piyo);</code></pre>
<p>もちろん、クラス定義してプライベート変数にするのがいちばんだろうと思うのですが、PHPのサンプルやTIPSを見ても、一時変数はそのままになっています。<br />
ここまでする必要はないのでしょうか。むしろ処理の無駄？</p>
<pre><code>$hoge = NULL;</code></pre>
<p>それとも、ぬるぽにした方がいいのかな。</p>
<h3>三項演算子が嫌い</h3>
<pre><code>$hoge = ($fuga == 'abc') ? 'abcが入っています' : '別の値が入っています';</code></pre>
<p>だって一行にされるとなんか読みにくいし。</p>
<pre><code>if($fuga == 'abc')
  $hoge = 'abcが入っています';
else
  $hoge = '別の値が入っています';</code></pre>
<p>だと、プログラマさん的には冗長なんでしょうか。</p>
<h3>md5って大丈夫なのか</h3>
<p>PHPサンプルで、パスワードの暗号化などによくmd5が使われているのですが、みんなが使っているアルゴリズムを取り入れてしまって大丈夫なんでしょうか。<br />
他にもsha1とかいろいろあるらしいですが、md5が選ばれる理由って何？強固だから？</p>
<h3>ログイン認証にはセッションに何を渡したらいいんだ</h3>
<p>いやいやいや（°Д°三°Д°）<br />
どうしたかは書かないです書けないです。</p>
<p>ユーザー登録時にDBにパスワードとは別のランダムな認証キーを保管しておいて、ログインのときはそれを発行した方がいいのでしょうか。<br />
んー、この辺は簡単なCMSをいくつか自分で見て調べてみるかな。</p>
<h3>難読化って？</h3>
<p>ソースコードの著作権の話をしていたら、こいわさん(<a class="blank" href="http://twitter.com/koiwa">@koiwa</a>)が教えてくれました。</p>
<blockquote><p><a href="http://twitter.com/koiwa/status/19553921430"><img class="alignnone size-large wp-image-1475" title="100730-0001" src="http://blog.webbingstudio.com/uploads/2010/07/100730-0001-479x321.jpg" alt="んー　お客さんからお金もらって仕事する場合とかは、ソースコードの著作権どうする？　とかは、契約書に入ってますね。コピペ対策については、JavaScriptとかは難読化して対処するとかはあります。" width="479" height="321" /></a></p></blockquote>
<p>それって、プログラミングでもするのでしょうか。<br />
<a class="blank" href="http://www.a-blogcms.jp/">a-blog cms</a>は暗号化されていますね。でも読みにくくなった分、保守が大変そうです。</p>
<hr />
<p>考えはじめたらどんどん出てきそうですが、この辺でやめておきます…</p>
<p>PEARもCakePHPも何それおいしいの？な今は、まだまだ勉強が必要そうです。<br />
それでも、お仕事でプログラミングをすると「<strong>他の人が利用することを考える</strong>」分、確実にスキルアップできることはわかったので、これからも時間を見つけていろいろなことに挑戦してみようと思います。</p>

<a href="http://twitter.com/?status=RT+%40%3A+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E3%81%A8%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2F235l3a6&amp;in_reply_to_status_id=19866223831" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2010/07/programming.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressを一部のディレクトリのみ有効にする：完全版</title>
		<link>http://blog.webbingstudio.com/2010/06/wp_directories_2.html</link>
		<comments>http://blog.webbingstudio.com/2010/06/wp_directories_2.html#comments</comments>
		<pubDate>Fri, 11 Jun 2010 10:06:30 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[Customize]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1403</guid>
		<description><![CDATA[
先月書いた「WordPressを一部のディレクトリのみ有効にする」カスタマイズの完全版です。

前回の記事では

未保存の記事のプレビュー
ブログ内検索

ができませんでしたが、今回はそれも可能になっています。
ただし [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.webbingstudio.com/uploads/2010/06/wp_directories.jpg"><img src="http://blog.webbingstudio.com/uploads/2010/06/wp_directories-200x184.jpg" alt="" title="wp_directories" width="200" height="184" class="alignleft size-medium wp-image-1404" /></a></p>
<p>先月書いた「<a href="http://blog.webbingstudio.com/2010/05/wp_directories.html">WordPressを一部のディレクトリのみ有効にする</a>」カスタマイズの完全版です。</p>
<div class="clear"></div>
<p>前回の記事では</p>
<ul>
<li>未保存の記事のプレビュー</li>
<li>ブログ内検索</li>
</ul>
<p>ができませんでしたが、今回はそれも可能になっています。<br />
ただし、サイトのホーム（index.html）にも細工が必要で、手順も複雑になります。</p>
<p>詳しくは追記以下で。</p>
<p><span id="more-1403"></span></p>
<h3>1: WordPressの設定</h3>
<h4>WordPressを下層ディレクトリに置く</h4>
<p>WordPress本体はひとつ下層に設置します。<br />
この例では「wordpress」というディレクトリに設置したとして話を進めます。</p>
<p>※私はセキュリティ上の理由などで、ディレクトリ名＝CMS名にしないことが多いです</p>
<h4>「WP No Category Base」を追加する</h4>
<p>このカスタマイズをするには、プラグイン「WP No Category Base」が必要です。<br />
これはWordPressで出力されるカテゴリーアーカイブのURLから、最初に必ず付与される「category」を取り除きます。<br />
若干負荷が上がりますが、CMS的な構築をするには必須のプラグインです。</p>
<p>WordPress公式のプラグインディレクトリで入手できます。<br />
<a class="blank" href="http://wordpress.org/extend/plugins/wp-no-category-base/">http://wordpress.org/extend/plugins/wp-no-category-base/</a></p>
<p>特に設定は必要なく、アップロードして有効にするだけでOKです。</p>
<h4>一般設定／パーマリンク設定を変更する</h4>
<p>次に、WordPressの「設定→一般」と「設定→パーマリンク設定」を変更します。</p>
<h5>一般設定</h5>
<p>「ブログのアドレス」を「サイトルート」に設定します。<br />
最初の図の「www」のURLが「http://example.com/」だった場合はそれを入力して更新します。<br />
このとき、サイトルートに.htaccessが書き出されます。<br />
自作の.htaccessを置いていると上書きされてしまうので、前もって避難させるか、書き込み禁止にしてください。</p>
<h5>パーマリンク設定</h5>
<p>「カスタム構造」にチェックを入れて、以下のように記入します。</p>
<pre><code>/%category%/%post_id%/</code></pre>
<p>ブログのURLが「http://example.com/」だった場合、カテゴリーがc1、IDが6の記事のURLは<br />
<em>http://example.com/c1/6/</em><br />
となります。</p>
<p>ここまで作業したら、<strong>サイトルートに書き出されている.htaccessを削除してしまいます</strong>。</p>
<h3>2: .httaccessの設定</h3>
<p>以下のように記述した、.htaccessをサイトルートに新しく設置します。<br />
（既にある場合は追記します）</p>
<pre><code>AddType application/x-httpd-php .html

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^\?([a-z0-9]+)=([0-9]+) wordpress/?$1=$2 [L]
RewriteRule ^(date|tag|feed)/(.*) wordpress/index.php [L]

RewriteRule ^(c1|c2|c3|c4)/(.*) wordpress/index.php [L]
RewriteRule ^category/(c1|c2|c3|c4)/(.*) wordpress/index.php [L]
RewriteRule ^(c1|c2|c3|c4)/feed/(.*) wordpress/index.php [L]

</IfModule>
# END WordPress</code></pre>
<h4>AddType application</h4>
<p>HTMLファイルでPHPスクリプトを使用可能にします。<br />
ホームが「index.php」で構わない場合は必要ありません。</p>
<h4>RewriteBase</h4>
<p>「/」はサーバールートからの相対パスです。<br />
もしもサイトルートが「test」だと「/test/」となります。</p>
<h4>RewriteRule</h4>
<p>条件を満たした場合に、WordPressのindex.phpを呼び出す、という指定です。<br />
最初の二行は変更しないでください。</p>
<p>三行目以降の<strong>(c1|c2|c3|c4)</strong>に、WordPressを有効にしたいカテゴリー（ディレクトリ名）をパイプ区切りで指示します。<br />
「information」「blog」なら(information|blog)と書きます。<br />
「information/aaa」「blog/bbb/ccc」などの下層ディレクトリもWordPress配下となります。</p>
<p>アップロードしたら、<strong>.htaccessのパーミッションを444にしてください</strong>。<br />
書き込み可になっていると、WordPressの設定を変更したときに上書きされてしまいます。</p>
<h3>3: index.htmlの設定</h3>
<p>最後に、サイトのホームにあたるindex.htmlに細工をします。</p>
<h4>ファイル名を変更する</h4>
<p>index.htmlの内容はそのままで、ファイル名を任意に変更してください。<br />
ここでは「home.html」に変更したものとします。</p>
<p>このままだとhome.htmlでもアクセスできてしまうので、気になる場合は「include」などのディレクトリに入れ、アクセス制限をかけて対応してください。</p>
<h4>新規にindex.htmlを作成する</h4>
<p>index.htmlがなくなるので、以下のように記述したindex.htmlを新規に作成し、サーバーにアップします。</p>
<pre><code>&lt;?php
if(($_GET['s'])||($_GET['p'])) {
	//検索かプレビューのGET値があればWordPressとして処理
	define('WP_USE_THEMES', true);
	require('wordpress/wp-blog-header.php');
} else {
	//なければ静的コンテンツを呼び出す
	require('home.html');
}
?&gt;</code></pre>
<p>コメントで書いてある通りですが、検索かプレビューだとWordPressとして処理を開始し、それ以外であれば先程リネームしたHTMLをそのまま出力します。</p>
<hr />
<p>ここまでで作業は終わりです。<br />
正常に動作していれば、</p>
<ul>
<li>未保存のプレビューと検索結果</li>
<li>指定したカテゴリーと関連フィード</li>
<li>日別アーカイブ</li>
<li>タグサーチ</li>
</ul>
<p>のみWordPressが起動し、それ以外は静的コンテンツがあるサーバーと同じ挙動になります。<br />
（例えカテゴリーを作っていても表示されません）</p>
<h3>4: 注意点</h3>
<ol>
<li>一般的なサーバーで動作確認をしていますが、設置条件やサーバー状況によってはうまくいかないかもしれません。必ず検証してください。</li>
<li>WordPressの404ページは有効になりません。必要な場合は.htaccessにエラーページ指定を追記して自作してください。</li>
<li>HTML/PHP関係は、.htaccessの指定方法が上記と異なるサーバーも多いです。サーバー会社のマニュアルをチェックしたり「サーバー名 html php」などでグーグル先生にお尋ねしてください。</li>
</ol>

<a href="http://twitter.com/?status=RT+%40%3A+WordPress%E3%82%92%E4%B8%80%E9%83%A8%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E3%81%BF%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%EF%BC%9A%E5%AE%8C%E5%85%A8%E7%89%88+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2F2dgo625&amp;in_reply_to_status_id=15917908239" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2010/06/wp_directories_2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressをもっとカスタマイズするための、記事情報の解析方法</title>
		<link>http://blog.webbingstudio.com/2010/05/wordpress_posts.html</link>
		<comments>http://blog.webbingstudio.com/2010/05/wordpress_posts.html#comments</comments>
		<pubDate>Fri, 14 May 2010 17:16:12 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1346</guid>
		<description><![CDATA[
WordPressは素晴らしいフリーテーマがたくさんあるので、それをいじるだけでもカスタマイズは習得できます。
ですが、実務的なカスタマイズに必要となる「詳しい記事情報を解析する方法」は意外と紹介されていません。
簡単 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1347" title="posttest" src="http://blog.webbingstudio.com/uploads/2010/05/posttest.jpg" alt="" width="480" height="387" /></p>
<p>WordPressは素晴らしいフリーテーマがたくさんあるので、それをいじるだけでもカスタマイズは習得できます。<br />
ですが、実務的なカスタマイズに必要となる「<strong>詳しい記事情報を解析する方法</strong>」は意外と紹介されていません。</p>
<p>簡単に実験できるテーマもおまけにつけて、ざっくりまとめてみました。<br />
PHPのことはあまりよくわからない…という人たちは、これをとっかかりに学習してみてはいかがでしょうか。</p>
<p><span id="more-1346"></span></p>
<h3>０：記事情報解析用のテーマ「posttest」</h3>
<p>これは、記事情報を解析するための構文だけが書いてある、実験用のテーマファイルです。<br />
ブログ用のテーマではないので「index.php」しかありませんがw<br />
この先を読みながら、あなたのブログに反映して試してみてください。</p>
<p><a class="blank" href="http://webbingstudio.com/souvenir/theme_posttest.zip">記事情報解析用のテーマ「posttest」ダウンロード</a></p>
<h3>１：サーバー情報を得る</h3>
<p>サーバー情報を取得、出力します。<br />
これはWordPressの独自タグではなくPHP標準の関数です。<br />
<strong>※第三者が閲覧できるページで実行しないようにしてください。</strong></p>
<pre><code>&lt;?php
	print_r($_SERVER);
?&gt;
</code></pre>
<h3>２：カテゴリー情報を得る</h3>
<p>カテゴリー情報を取得、出力します。<br />
出力内容は「$posts[0]のカテゴリー情報」なので、複数カテゴリーが指定されている可能性もあります。<br />
また、<strong>出力結果の記事が一件もないと、この内容もNULLになってしまいます</strong>。出力結果がゼロの可能性があるけれどカテゴリーの情報を取得したい…という場合は、<del datetime="2010-05-14T17:16:16+00:00">ちゃんと引数にカテゴリーIDを明示するようにしてください。</del>【訂正】この関数は引数がありません。すいません。DBから直接取得した方が早いかもしれません（汗）</p>
<pre><code>&lt;?php
	$cat = get_the_category();
	print_r($cat);
?&gt;
</code></pre>
<h3>３：記事情報を解析</h3>
<p>query_posts関数を実行していない状態では、<br />
オブジェクト「$posts」にはそのページに沿った記事情報が入っています。<br />
単純な出力は「&lt;?php while ( have_posts() ) : the_post() ?&gt;～&lt;?php endwhile ?&gt;」でできますが、PHPのforeach関数でも取得することができます。</p>
<pre><code>&lt;?php while ( have_posts() ) : the_post() ?&gt;
&lt;?php print_r ($post) ?&gt;
&lt;?php endwhile ?&gt;
</code></pre>
<h3>４：抽出条件の上書き</h3>
<p>query_posts関数を使用すると、出力される記事の条件を変更することができます。<br />
グローバル変数「query_string」を上書きするのが確実です。<br />
※ID「5」の記事を抽出するようになっています。構文の「cat=5」のところを任意で書き換えてください</p>
<p>指定できるクエリについては<a class="blank" href="http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts">WordPress Codex内「query posts」の解説</a>を参照してください。</p>
<pre><code>&lt;?php
	$Q = "&amp;category_name=&amp;cat=5";
	global $query_string;
	query_posts($query_string . $Q);
?&gt;
</code></pre>
<h3>５：the_postを再実行後記事情報を解析</h3>
<p>query_posts関数を使用後、もう一度<br />
「&lt;?php while ( have_posts() ) : the_post() ?&gt;～&lt;?php endwhile ?&gt;」を実行すると、記事情報が新しく定義したものに変更されます。<br />
（３の後に４→５と実行して内容を比較してみてください）</p>
<pre><code>&lt;?php
	while ( have_posts() ){
		the_post();
		print_r ($post);
	}
?&gt;
</code></pre>
<h3>６：オブジェクト内容の取得</h3>
<p>記事タイトルだけ必要な場合は、「-&gt;」でキーを指定することで、文字列で習得できます。<br />
配列のように見えますが、<strong>$post['post_title']では取得できない</strong>ことに注意してください。</p>
<pre><code>&lt;?php
	while ( have_posts() ){
		the_post();
		echo $post-&gt;post_title . '&lt;br /&gt;';
	}
?&gt;
</code></pre>
<h3>７：補足</h3>
<p>WordPressのpostに入っている値は、全てPHPエンコード処理がされています。<br />
このため、クォーテーションやバックスラッシュが含まれる記事を関数に投入しても問題は起きません。<br />
ただし、<strong>HTMLはエンコードされていない</strong>ので、HTMLタグが反映されると危ない状況で使用する場合は<br />
strip_tags関数やhtmlspecialchars関数を通すようにしましょう。</p>
<pre><code>&lt;?php
	while ( have_posts() ){
		the_post();
		echo strip_tags($post-&gt;post_content) . '&lt;hr /&gt;';
	}
?&gt;
</code></pre>
<hr />
<p>WordPressはPHPの知識があれば、簡単にカスタマイズできるのが魅力です。<br />
ですが、他のCMSと違ってプログラムを直に扱うため、テーマファイルの見通しが利きにくく、予想外の不具合やセキュリティホールが発生する可能性が高い側面があります。<br />
趣味レベルなら問題ないですが、実務でWordPressを構築する場合は仕様やリスクを考慮して正しく利用したいものです。</p>

<a href="http://twitter.com/?status=RT+%40%3A+WordPress%E3%82%92%E3%82%82%E3%81%A3%E3%81%A8%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%80%81%E8%A8%98%E4%BA%8B%E6%83%85%E5%A0%B1%E3%81%AE%E8%A7%A3%E6%9E%90%E6%96%B9%E6%B3%95+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2F27yz45b&amp;in_reply_to_status_id=13987172930" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2010/05/wordpress_posts.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>a-blog cmsではてなブックマークの新着を出すモジュール</title>
		<link>http://blog.webbingstudio.com/2009/11/ablogcms_twitter_hatenab.html</link>
		<comments>http://blog.webbingstudio.com/2009/11/ablogcms_twitter_hatenab.html#comments</comments>
		<pubDate>Mon, 09 Nov 2009 17:49:30 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[Customize]]></category>
		<category><![CDATA[a-blog cms]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[おみやげ]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1180</guid>
		<description><![CDATA[
私の本サイトでは、トップページ下部にTwitterとはてなブックマークの新着を掲載していました。
a-blog cmsに移行する新サイトでも引き継ぐ予定です。
a-blog cmsはテーマファイル内にPHPスクリプトを [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.webbingstudio.com/uploads/2009/11/acmsmodule.jpg"><img src="http://blog.webbingstudio.com/uploads/2009/11/acmsmodule-480x246.jpg" alt="acmsmodule" title="acmsmodule" width="480" height="246" class="alignnone size-large wp-image-1181" /></a></p>
<p>私の本サイトでは、トップページ下部に<a href="http://twitter.com/webbingstudio">Twitter</a>と<a href="http://b.hatena.ne.jp/webbingstudio/">はてなブックマーク</a>の新着を掲載していました。<br />
<a href="http://www.a-blogcms.jp/" class="blank">a-blog cms</a>に移行する新サイトでも引き継ぐ予定です。</p>
<p>a-blog cmsはテーマファイル内にPHPスクリプトを直接書くことはできませんが、外部のRSSを整形して表示できる「<a href="http://www.a-blogcms.jp/support/reference/build_in.html" class="blank">Feed_ExList</a>」モジュールがあります。<br />
これを使えばすぐ移行できる…と思ったのですが、うまく表示できません。</p>
<p><del datetime="2009-11-10T03:51:41+00:00">TwitterのRSSは本文が全てURLエンコードされているため、デコードされずそのまま出力されてしまいます。</del><br />
はてなブックマークはRSS1.0(rdf)形式なので、Feed_ExListモジュールのサポート外です。</p>
<blockquote><p>2009.11.10追記：<br />
開発元様に、[urldecode]という校正オプションを教えていただきました！<br />
Twitterに関しては、<strong>{description}[urldecode]</strong> と記述すればFeed_ExListモジュールが使用できます。<br />
<a href="http://www.a-blogcms.jp/support/reference/proofreading.html">リファレンスに追加されています</a>ので、こちらも参考にしてください。</p></blockquote>
<p>もしかしたら解決方法があるかもしれませんが、今回のところはビルトインモジュールを使うのを断念し、これまで使っていたPHPスクリプトをそのまま自作モジュールに変換する方法を取りました。</p>
<p>追記以降で配布しますので、とりあえず<del datetime="2009-11-10T03:51:41+00:00">Twitterや</del>はてブの新着を掲載したい方、モジュール作成について勉強したい方はご利用ください。</p>
<p><span id="more-1180"></span></p>
<h3>Getdataモジュールについて</h3>
<p>このセットは、下記の外部コンテンツをリストアップするモジュールを追加します。</p>
<ol>
<li>【Contents】　任意URLのファイル内容全て</li>
<li>【Twitter】　任意IDのTwitter新着</li>
<li>【HatenaB】　任意IDのはてなブックマーク新着（コメントを含む）</li>
</ol>
<p>「Getdata」モジュールは、こちらからダウンロードできます。<br />
<strong><a href="http://webbingstudio.com/souvenir/acms_module/Getdata.zip">http://webbingstudio.com/souvenir/acms_module/Getdata.zip</a></strong></p>
<p>モジュールの作成方法は、開発元のコンテンツを参考にしました。</p>
<ul>
<li><a href="http://www.a-blogcms.jp/support/tutorial/develop/acms_module.html" class="blank">a-blog cmsのモジュール | 拡張機能の開発 | a-blog cms</a></li>
<li><a href="http://kazumich.com/index.php?ID=4898" class="blank">a-blog cmsのモジュールの書き方 その1 － kazumich.log</a></li>
</ul>
<h3>使用方法</h3>
<p>解凍直後の状態では動作しません。<br />
フォルダを、<strong>php > ACMS > GET > Getdata</strong>　と開いていき、最下層に入っている 「Contents.php」「Twitter.php」「HatenaB.php」の必要な箇所を編集してください。</p>
<ol>
<li>Contents.php・・・読み込み先のURLを指定</li>
<li>Twitter.php・・・TwitterIDを書き換える（注意：二ヶ所あります）</li>
<li>HatenaB.php・・・はてなIDを書き換える</li>
</ol>
<p>編集したら「php」フォルダごと、a-blog cmsを設置したディレクトリに転送してください。</p>
<h3>テーマファイルへの記述</h3>
<p>下記のように記述するだけで動作します。<br />
Contentsは読み込み元がそのまま、Twitter・HatenaBはリンク付きのul要素で出力されます。</p>
<pre><code>&lt;!-- BEGIN_MODULE Getdata_Contents -->
&lt;!-- END_MODULE Getdata_Contents --></code></pre>
<pre><code>&lt;!-- BEGIN_MODULE Getdata_Twitter -->
&lt;!-- END_MODULE Getdata_Twitter --></code></pre>
<pre><code>&lt;!-- BEGIN_MODULE Getdata_HatenaB -->
&lt;!-- END_MODULE Getdata_HatenaB --></code></pre>
<h3>注意</h3>
<p>※下記の関数が有効になっているサーバーでなければ動作しません。<br />
Contents・・・file_get_contents関数<br />
Twitter / HatenaB・・・file_get_contents関数・SimpleXML関数</p>
<p>※Getdata_Contentsモジュールは、対象のHTMLファイルの内容全てを「<strong>そのまま</strong>」出力します。エンコード・サニタイズも一切行いません。対象URLの内容を確認のうえ、慎重にご利用ください。</p>
<p>※このモジュールは試作品です。今後のa-blog cmsのバージョンアップで、不要となる可能性があります。<br />
商用・非商用を問わず、自由にご利用ください。</p>
<hr />
<p>注意に書いてある通り、PHPのfile_get_contents関数は便利ですが、有効にする際は慎重に取り扱わなければいけません。<br />
もしも悪意ある第三者にPHPファイルを改ざんされてしまった場合、サーバー内の重要データを持っていかれてしまう可能性もあるからです。</p>
<p>ですが、a-blog cmsは一般に公開されているコンテンツにPHPスクリプトを記述せず、深い階層で一括管理を行うので、WordPress等のテーマに直接PHPを書けるCMSよりもやや学習コストがかかる分、安全と言えます。</p>
<p>開発元のブログや私のモジュールを見ればわかりますが、単に出力するだけならとても簡単に作れます。<br />
（テキストをランダムに出力するとか）<br />
皆さんも挑戦してみてください。</p>

<a href="http://twitter.com/?status=RT+%40%3A+a-blog+cms%E3%81%A7%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AE%E6%96%B0%E7%9D%80%E3%82%92%E5%87%BA%E3%81%99%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2Fybjdomq" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2009/11/ablogcms_twitter_hatenab.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>エックスサーバーにSOY CMSをインストールする：1.2.6版</title>
		<link>http://blog.webbingstudio.com/2009/10/xserver_soycms126.html</link>
		<comments>http://blog.webbingstudio.com/2009/10/xserver_soycms126.html#comments</comments>
		<pubDate>Thu, 22 Oct 2009 06:26:04 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[SOYCMS]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1159</guid>
		<description><![CDATA[
「WebSite expert」26号でも巻頭特集が組まれ、
イメージキャラ「まめ蔵」も舌好調（夜はツンデレ属性に変化する）のSOY CMSですが、私が本サイトを置いているエックスサーバーは動作環境を満たしていませんで [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.webbingstudio.com/uploads/2009/10/soycms_xserver.jpg" alt="X SERVERのみなさま！SOY CMSがエックスサーバーでも使えるようになったソイ！" width="480" height="120" class="alignnone size-full wp-image-1160" /></p>
<p>「WebSite expert」26号でも巻頭特集が組まれ、<br />
イメージキャラ「<a href="http://twitter.com/SOY_CMS" class="blank">まめ蔵</a>」も舌好調（夜はツンデレ属性に変化する）の<a href="http://www.soycms.net/" class="blank">SOY CMS</a>ですが、私が本サイトを置いている<a href="http://www.xserver.ne.jp/" class="blank">エックスサーバー</a>は動作環境を満たしていませんでした。</p>
<p>会社に要望を出しても、個別対応は承っておりません、のつれない返事。<br />
それなら無理やり設置してやる！と<br />
「<a href="http://blog.webbingstudio.com/2009/03/%E3%82%A8%E3%83%83%E3%82%AF%E3%82%B9%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABsoycms%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B.html" class="blank">エックスサーバーにSOY CMSをインストールする</a>」という検証記事を書いたのが数か月前。<br />
インストールまでは成功したのですが、管理画面の不具合が直らず断念していました。</p>
<p>そんなSOY CMSが、先月の1.2.6へのバージョンアップで、ついにエックスサーバーでも正常に動作するようになりました！<br />
インストーラーなし・SQLite版で基本的な動作を確認しています。<br />
開発の皆様、ありがとうございます。</p>
<p><span id="more-1159"></span><br />
設置手順は以前書いた記事と変わりませんが、不具合を回避する作業がひとつ増えます。<br />
SOY CMSフォーラムのスレッドを更新していますので、詳細はこちらをご参照ください。</p>
<p><a href="http://www.soycms.org/viewtopic.php?f=6&#038;t=144#p430" class="blank">エックスサーバー(X20)にインストールする方法について</a></p>
<p>また、正常に動くようになったとはいえ「動作環境を満たしていないサーバーに強引に設置している」という状況は変わりません。<br />
設置する場合は、使用予定の機能・プラグインをチェックしなおしてくださいね。</p>

<a href="http://twitter.com/?status=RT+%40%3A+%E3%82%A8%E3%83%83%E3%82%AF%E3%82%B9%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABSOY+CMS%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%EF%BC%9A1.2.6%E7%89%88+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2Fykagqgv" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2009/10/xserver_soycms126.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressの「Gravatar」をコメント名から表示する</title>
		<link>http://blog.webbingstudio.com/2009/10/gravatar_to_id.html</link>
		<comments>http://blog.webbingstudio.com/2009/10/gravatar_to_id.html#comments</comments>
		<pubDate>Sat, 17 Oct 2009 05:46:04 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[Customize]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1150</guid>
		<description><![CDATA[

このブログにコメントすると、ランダムな幾何学模様が表示されます。
「Gravatar」というアバター登録サービスから自動生成をしてもらっています。

これはWordPressの内部機能で実装されていて、「設 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.webbingstudio.com/uploads/2009/10/gravatar.jpg"><img src="http://blog.webbingstudio.com/uploads/2009/10/gravatar-200x196.jpg" alt="gravatar" title="gravatar" width="200" height="196" class="alignright size-medium wp-image-1151" /></a></p>

<p>このブログにコメントすると、ランダムな幾何学模様が表示されます。<br />
「<a href="http://ja.gravatar.com/" class="blank">Gravatar</a>」というアバター登録サービスから自動生成をしてもらっています。</p>

<p>これはWordPressの内部機能で実装されていて、「設定」メニューでアイコンのタイプを選ぶことができます。</p>

<img src="http://blog.webbingstudio.com/uploads/2009/10/gravatar2-480x242.jpg" alt="gravatar2" title="gravatar2" width="480" height="242" class="alignnone size-large wp-image-1152" />

<p>…が、この機能、全然役に立ちません。</p>

<p>まずGravatarに登録している人がほとんどいません。登録されていなかった場合「メールアドレス」を元にアイコンを生成しますが、スパムを警戒してコメント欄にメアドを書かない日本のブログでは、いつも同じアイコンしか出ません。</p>

<p>「名前がtwitterIDと合致したらtwitterアイコンを出す」というプラグインも試したことがあるのですが、だいたいの人はコメント名とtwitterIDは違っているようで、あまり効果はありません。</p>

<p>なので、私はこれを改良して<br />
「<strong>コメント欄に記入した名前</strong>」からGravatarを生成させています。<br />
流石にコメントごとに違う名前を名乗る人は少ないので、コメントをくれた人ごとに同じ幾何学模様が出てくれています。</p>

<p>やり方は追記以降で。コメント欄を少しでもカラフルにしたい人はお試しを。</p>

<span id="more-1150"></span>

<h3>修正の手順</h3>

<p>今使っているテーマファイルの「functions.php」に以下の関数を追加してください。<br />
なければ追加して最初の行に「<strong>&lt;?php</strong>」、最終行に「<strong>?&gt;</strong>」を書き込んでください。</p>

<textarea readonly="readonly" cols="60" rows="10">function gravatarToID($id="名無しさん", $size=64, $type="identicon") {
  $hashid = md5(md5($id));
  if ($size > 512) { $size = 512; }

  $img = "<img src=\"";
  $img .= "http://www.gravatar.com/avatar/";
  $img .= $hashid;
  $img .= "?d=";
  $img .= $type;
  $img .= "&amp;?s=";
  $img .= $size;
  $img .= "\" width=\"";
  $img .= $size;
  $img .= "\" height=\"";
  $img .= $size;
  $img .= "\" alt=\"";
  $img .= $id;
  $img .= "\" title=\"";
  $img .= $id;
  $img .= "\" class=\"comment-avatar\" />";
  echo $img;
}
</textarea>

<p>保存したら、テーマファイルの「コメント」を表示しているテンプレートの中から</p>

<textarea readonly="readonly" cols="60" rows="2">
<?php echo get_avatar( $comment, 32 ); ?></textarea>

<p>というようなコードを探して、以下のコードと差し替えてください。</p>

<textarea readonly="readonly" cols="60" rows="2"><?php gravatarToID($comment->comment_author, 32, 'identicon'); ?>
</textarea>

<h3>カスタマイズ</h3>

<p>関数「gravatarToID」には三つの引数があり、左から「コメント名」「縦横サイズ」「アイコン種別」となります。カンマで区切って指定します。</p>

<dl>

<dt>コメント名</dt>

<dd>WordPressの場合「$comment->comment_author」となります。</dd>

<dt>縦横サイズ</dt>

<dd>ピクセルサイズです。最大512ピクセルまで指定できるようです。</dd>

<dt>アイコン種別</dt>
<dd>
<ul>

<li>identicon ・・・ 幾何学模様</li>

<li>wavatar ・・・ ばいきんみたいなキャラ</li>

<li>monsterid ・・・ モンスター風</li>

</ul>
</dd>
</dl>

<p>引数を何も付けないと「名無しさん」の幾何学模様が64ピクセルで表示されます。</p>

<textarea readonly="readonly" cols="60" rows="2"><?php gravatarToID(); ?>
</textarea>

<p>下記のようにすると、ばいきんみたいなアイコンが縦横48ピクセルで表示されます。</p>

<textarea readonly="readonly" cols="60" rows="2"><?php gravatarToID($comment->comment_author, 48, 'wavatar'); ?>
</textarea>

<h3>関数の解説</h3>

<p>Gravatarは、以下のURLでランダムアイコンを書き出しています。</p>

<p>http://www.gravatar.com/avatar/[生成元の半角英数字]?d=[種別]&amp;?s=[幅]</p>

<p>なので、コメントの名前をmd5を複数通したランダムな英数字に暗号化して、上のURLに渡すようにしています。</p>

<p>Gravatarに怒られるかもしれませんが、PHPコードが書ければ、WordPress以外のブログにも実装できそうな気がします。<br />
もうちょっと他にもランダムパターンがあればいいんですけどね。</p>

<h3>補足</h3>

<p>書き忘れ。実際のGravatarはもっと濃い色で表示されます。<br />
私はCSSで透明度を調整することで、自分のブログに色合いを合わせています。</p>
<a href="http://twitter.com/?status=RT+%40%3A+WordPress%E3%81%AE%E3%80%8CGravatar%E3%80%8D%E3%82%92%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E5%90%8D%E3%81%8B%E3%82%89%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2Fyfgwdwr" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2009/10/gravatar_to_id.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>なかなか覚えられないPHPのclassについて考えてみた</title>
		<link>http://blog.webbingstudio.com/2009/09/php_class.html</link>
		<comments>http://blog.webbingstudio.com/2009/09/php_class.html#comments</comments>
		<pubDate>Thu, 10 Sep 2009 05:34:00 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[food]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1097</guid>
		<description><![CDATA[空いている時間にPHPの学習をはじめてずいぶん経つのですが、「クラス」の概念がなかなか理解できませんでした。
どう書けばどう動くまでは把握しているのですが、「なぜこんな風に書くのか」がつかめない。

コンストラクタ [...]]]></description>
			<content:encoded><![CDATA[<p>空いている時間にPHPの学習をはじめてずいぶん経つのですが、「クラス」の概念がなかなか理解できませんでした。<br />
どう書けばどう動くまでは把握しているのですが、「なぜこんな風に書くのか」がつかめない。</p>

<p>コンストラクタとかメンバ変数なんて難しい言葉使うなよー＞＜</p>

<p>でも、昨日の晩ふと「<strong>夕飯のメニュー</strong>」に例えて考えてみたら、ちょっと理解できたかもです。<br />
メモしておこう。</p>

<p>関連：<a href="http://blog.webbingstudio.com/2009/03/%E3%81%B2%E3%81%A8%E3%82%8A%E6%9A%AE%E3%82%89%E3%81%97%E3%81%AE%E3%81%97%E3%81%82%E3%82%8F%E3%81%9B%E3%83%98%E3%83%93%E3%83%AD%E3%83%86%E9%A3%9F%E6%9D%90.html">ひとり暮らしのしあわせヘビロテ食材</a><br />
何故こんな記事を書いてるんだ…笑</p>

<span id="more-1097"></span>

<h3>スーパーで食材を買ってくる</h3>

<p>夕飯のメニューは大体、スーパーに行ってから考えたりします。<br />
思いつかないことも多いので、「使い回しのきく食材」を選びます。</p>
<p>この食材を「メンバ変数」と考えると</p>

<textarea readonly="readonly" cols="60" rows="7">class banGohan {
  var $niku;  //にく
  var $ninjin;  //にんじん
  var $tamanegi;  //たまねぎ
  var $naganegi;  //ながねぎ
  var $kyabetsu;  //きゃべつ
  var $shimeji;  //しめじ
}</textarea>

<p>となります（たぶん）</p>

<h3>食材からレシピをイメージする</h3>

<p>使い回すレシピを考えるために、食材をイメージします。<br />
これを「コンストラクタ」と考えると</p>

<textarea readonly="readonly" cols="60" rows="10">class banGohan {
//前の続き

//コンストラクタ
function banGohan($niku, $ninjin, $tamanegi, $naganegi, $kyabetsu, $shimeji) {
  $this->niku = $niku;  //にく
  $this->ninjin = $ninjin;  //にんじん
  $this->tamanegi = $tamanegi;  //たまねぎ
  $this->naganegi = $naganegi;  //ながねぎ
  $this->kyabetsu = $kyabetsu;  //きゃべつ
  $this->shimeji = $shimeji;  //しめじ
}

}</textarea>

<p>です。<br />
実際には冷蔵庫には既に調味料（しょうゆやみそ）も入っているので、継承されたクラスと考えてもいいのかもです。</p>

<h3>定番レシピをセットしておく</h3>

<p>上の食材があると、定番レシピがいくつかできます。<br />
これを「メンバ関数」と考えてみると</p>

<textarea readonly="readonly" cols="60" rows="10">class banGohan {
//前の続き

function banGohanTonjiru(){  //とんじる
  $nabe = $this->niku . $this->ninjin . $this->naganegi . $this->tamanegi;
  $nabe *= "miso" . "dashi" . "shouga";
  return $nabe;
}

function banGohanCurry(){  //カレー
  $nabe = $this->niku . $this->ninjin . $this->tamanegi . $this->shimeji;
  $nabe *= "curryroux" . "hachimitsu" . "yoghourt";
  return $nabe;
}

function banGohanYakisoba(){  //やきそば
  $huraipan = $this->niku . $this->ninjin . $this->naganegi . $this->kyabetsu;
  $huraipan *= "mushimen" . "sauce";
  return $huraipan;
}

・・・
}</textarea>

<p>メンバ関数に入る値は、基本的に「肉」「にんじん」「きゃべつ」でなければならないですが、<br />
肉が「100g88円の切り落とし」でも、「100g300円の無菌豚」でもいいわけです。にんじんもブランド品だろうがキズものだろうがバラものだろうがなんでもいいわけです。<br />
レシピさえ確定していれば。</p>

<h3>さて作るか</h3>

<p>で、レシピに添って食材を実際に買ってきて作ります。</p>

<textarea readonly="readonly" cols="60" rows="10">//今週の場合
$konsyu = new banGohan("こまぎれ", "道内産三本袋", "バラ売り新玉ねぎ", "1本ものネギ", "1/4玉", "ホ○トのしめじ");
$kyo = $konsyu->banGohanTonjiru();
$asu = $konsyu->banGohanCurry();
$asatte = $konsyu->banGohanYakisoba();

//来週の場合
$raisyu = new banGohan("バラ肉", "バラ売りキズもの", "玉ねぎ三袋パック", "半分カット", "1/2玉", "地元農家のしめじ");
$kyo = $raisyu->banGohanCurry();
$asu = $raisyu->banGohanYakisoba();
$asatte = $raisyu->banGohanTonjiru();</textarea>

<p>レシピが確定しているので、いちいち本を読むこともなく、材料を買ってきては粛々と実行していきます。</p>

<hr />

<p>と、ここまで妄想してみたのですが、なんか違う気がしてきました…；；<br />
とりあえずclassの流れと使いどころは理解したので、今日のところはこれで良しとしよう…</p>

<p>追記：shuji_w6eさんが説明してくれました＾＾参考にどうぞ。<br />
<a href="http://d.hatena.ne.jp/shuji_w6e/20090910/1252574711" class="blank">クラスとは変数をまとめて使う事のできるテンプレート</a></p>
<a href="http://twitter.com/?status=RT+%40%3A+%E3%81%AA%E3%81%8B%E3%81%AA%E3%81%8B%E8%A6%9A%E3%81%88%E3%82%89%E3%82%8C%E3%81%AA%E3%81%84PHP%E3%81%AEclass%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%80%83%E3%81%88%E3%81%A6%E3%81%BF%E3%81%9F+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2Fmyr67o" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2009/09/php_class.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SOY CMSのカスタムフィールドを使った条件分岐(1)</title>
		<link>http://blog.webbingstudio.com/2009/09/soycms_customfield_1.html</link>
		<comments>http://blog.webbingstudio.com/2009/09/soycms_customfield_1.html#comments</comments>
		<pubDate>Sat, 05 Sep 2009 05:40:53 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[Customize]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SOYCMS]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[カスタムフィールド]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=1078</guid>
		<description><![CDATA[SOY CMSは、静的コンテンツの動的化に適したシステムですが、サイトの新着情報には下の画像のように「特定の記事にだけアイコンを付ける」というものがよくあります。



これをSOY CMSで構築するには、カスタ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.soycms.net/" class="blank">SOY CMS</a>は、静的コンテンツの動的化に適したシステムですが、サイトの新着情報には下の画像のように「特定の記事にだけアイコンを付ける」というものがよくあります。</p>

<p><a href="http://blog.webbingstudio.com/uploads/2009/09/soycustom_1.jpg"><img src="http://blog.webbingstudio.com/uploads/2009/09/soycustom_1-479x366.jpg" alt="soycustom_1" title="soycustom_1" width="479" height="366" class="alignnone size-large wp-image-1079" /></a></p>

<p>これをSOY CMSで構築するには、カスタムフィールドとPHPのif文を利用します。<br />
アイコンまわりのカスタマイズは、SOY CMSの良さを残したまま割と簡単にできるので、試してみてください。</p>

<span id="more-1078"></span>

<p style="color: #E02;">※サンプルコードには、読みやすいように改行やインデントを入れています。実際に出力されるコードが冗長になるので、動作を確認したら改行を詰めるなどした方が良いと思います。</p>

<h3>元になるHTML</h3>
<p>下記のようなHTMLソースに、SOY CMSを組み込みます。<br />
&lt;h3&gt;要素内に更新日付と、「重要な記事」を知らせるアイコンが入っています。<br /></p>

<textarea readonly="readonly" cols="60" rows="4"><h3 class="article-title">
2009年8月20日
&nbsp;<img src="images/news/news_ico_01.png" width="41" height="15" alt="重要なニュース" />
</h3></textarea>

<h3>SOY CMS側の設定</h3>
<p>SOY CMSの管理画面に入り、「カスタムフィールドプラグイン」を有効にします。</p>
<p>記事を書いている時点（1.25a）以前のバージョンの場合は、「テンプレート内でPHPスクリプトを有効にする」ための環境ファイル書き換えも必要ですが、旧バージョンにはセキュリティホールがあるため、最新版にアップグレードしてください。</p>

<h3>カスタムフィールドの設定</h3>
<p>カスタムフィールドで「チェックボックス」を新規作成します。<br />
下の画面の通り、「高度な設定」の全ての項目を空にします。「ニュース」の記事を書くときだけ指定できるように、ラベルの関連付けもしておきます。</p>

<p><a href="http://blog.webbingstudio.com/uploads/2009/09/soycustom_2.jpg"><img src="http://blog.webbingstudio.com/uploads/2009/09/soycustom_2-480x205.jpg" alt="soycustom_2" title="soycustom_2" width="480" height="205" class="alignnone size-large wp-image-1080" /></a></p>

<p>設定が終わったら、記事を書いてみます。下の画像のようにチェックボックスが出てくればOKです。<br />
チェックを入れている記事と、入れていない記事を書いてください。</p>

<p><img src="http://blog.webbingstudio.com/uploads/2009/09/soycustom_3.jpg" alt="soycustom_3" title="soycustom_3" width="480" height="194" class="alignnone size-full wp-image-1081" /></p>

<h3>独自タグを書く</h3>
<p>記事部分をSOY CMSのブロックタグで囲み、日付を出すタグを書き込みます。<br />
ブロックタグ、エントリータグについては、<a href="http://www.soycms.net/man/use_list/index" class="blank">公式サイトのマニュアル「よく使う項目」</a>を参考にしてください。<br />
日付を出す「cms:id=&quot;create_date&quot;」は、アイコンも含めてまるっと囲みます。</p>

<textarea readonly="readonly" cols="60" rows="11"><!-- block:id="news" -->

<h3 class="article-title">
<!-- cms:id="create_date" cms:format="Y年m月d日" -->2009年8月20日&nbsp;<img src="images/news/news_ico_01.png" width="41" height="15" alt="重要なニュース" /><!-- /cms:id="create_date" cms:format="Y年m月d日" -->
</h3>

（記事本文がつづく）

<!-- /block:id="news" --></textarea>

<p>ここで注意が必要なのは、<strong>SOY CMSの標準である「属性値に書く方法」を利用しない</strong>ことです。<br />
例えば、下のような書き方も同じ意味を持ちますが、この書き方だと&lt;h3&gt;要素の中身をそっくり置き換える動作になるので、あとで&lt;h3&gt;の中にPHPを書いた時にエラーになってしまいます。</p>

<textarea readonly="readonly" cols="60" rows="11"><!-- block:id="news" -->

<h3 class="article-title" cms:id="create_date" cms:format="Y年m月d日">
2009年8月20日&nbsp;<img src="images/news/news_ico_01.png" width="41" height="15" alt="重要なニュース" />
</h3>

（記事本文がつづく）

<!-- /block:id="news" --></textarea>

<p>代替として用意されている、コメントで囲む方法を選んでください。</p>

<h3>PHPで記事情報を取得するには</h3>

<p>記事を表示する「block:id」「b_block:id」の内部では、「$[idに指定した名前]」という連想配列に、cms:idをキーとした全ての記事データが格納されています。<br />
以下のように書くと記事ごとに配列の内容がずららっと出てきます。</p>

<textarea readonly="readonly" cols="60" rows="4"><?php
  echo "<pre>";
  print_r($news);
  echo "</pre>";
?></textarea>

<p>なので、「block:id=&quot;news&quot;」内のカスタムフィールド「important」をPHPの変数$hogeに入れるには、以下のようにスクリプトを書きます。</p>

<textarea readonly="readonly" cols="60" rows="3"><?php
  $hoge = $news[important];
?></textarea>

<p>カスタムフィールドのチェックボックスの場合は、チェックを入れたときは「フィールド名」がそのまま入り、入れなかった場合は空になります。<br />
先程の例の場合だと、チェックを入れていれば$hogeは「重要なお知らせ」になるはずです。</p>

<h3>PHPの条件分岐を加える</h3>

<p>ここまでわかったところで、&lt;/h3&gt;の前に条件分岐を追加してみましょう。</p>

<textarea readonly="readonly" cols="60" rows="11"><h3 class="article-title">
<!-- cms:id="create_date" cms:format="Y年m月d日" -->2009年8月20日&nbsp;<img src="images/news/news_ico_01.png" width="41" height="15" alt="重要なニュース" /><!-- /cms:id="create_date" cms:format="Y年m月d日" -->
<?php
if(!empty($news[important])){
  echo '&nbsp;<img src="images/news/news_ico_01.png" width="41" height="15" alt="重要なニュース" />';
}
?>
</h3></textarea>

<p>「$news[important]」が空ではないことを条件に、echoでアイコンを出します。<br />
functionを使用するとエラーになるので、PHPの平文で書いてください。また、HTMLでダブルクォーテーションを使用している場合、echo文はシングルクォーテーションで囲んでください。</p>

<p>保存してページを確認すると、「重要なお知らせ」にチェックを入れた記事にだけアイコンが出るようになります。</p>

<hr />

<p>SOY CMSの利点は、「オーサリングツールで崩れず編集できる使いやすさ」です。このため、HTMLの表示に影響が出る条件分岐などは、PHPで対応することになります。</p>

<p>それを踏まえて、カスタマイズするときも本来のHTMLを生かす方向でできるだけシンプルにした方がいいし、条件分岐が予想される場合は納品後の改修作業も視野に入れた方が良いと思います。</p>

<p>今回のサンプルは、ローカル環境でのブラウザプレビューではアイコンの部分のコードが見えてしまいますが、PHP構文を解釈できるDreamweaverなら問題なく表示できます。<br />
ローカルで確認したいときは、&lt;?php ～ ?&gt;を一時的にコメントアウトしてください。</p>

<p>条件分岐を行う場所が、記事タイトルだったりすると、もう少し難しくなります。<br />
それについてはまた後日記事にします。</p>
<a href="http://twitter.com/?status=RT+%40%3A+SOY+CMS%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%281%29+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2Fyktufn4" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2009/09/soycms_customfield_1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>オンラインゲーム「トラビアン」をやってみた</title>
		<link>http://blog.webbingstudio.com/2009/08/travian.html</link>
		<comments>http://blog.webbingstudio.com/2009/08/travian.html#comments</comments>
		<pubDate>Tue, 11 Aug 2009 13:38:49 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=929</guid>
		<description><![CDATA[まわりでちらちら話を聞いてた「トラビアン」をはじめてみました。
テッテ的に調べて、興味が失せなければアカウントを取る習慣はいつものことです。
http://www.travian.jp/

「トラビアン」は国を発展させる [...]]]></description>
			<content:encoded><![CDATA[<p>まわりでちらちら話を聞いてた「トラビアン」をはじめてみました。<br />
テッテ的に調べて、興味が失せなければアカウントを取る習慣はいつものことです。</p>
<p><a href="http://www.travian.jp/" class="blank">http://www.travian.jp/</a></p>
<p><a href="http://blog.webbingstudio.com/uploads/2009/08/travian_1.jpg"><img src="http://blog.webbingstudio.com/uploads/2009/08/travian_1-480x360.jpg" alt="travian_1" title="travian_1" width="480" height="360" class="alignnone size-large wp-image-930" /></a></p>
<p>「トラビアン」は国を発展させるウォーシミュレーションなのですが、国の強化に必要な「資材」が溜まるスピードがリアルタイムになってます。<br />
なので、<strong>数時間ごとに5分くらいずつしか遊べません。</strong><br />
しかも、PHPとAjaxベースらしく、Flashや音声は一切使われていません。</p>
<p style="font-size: 150%;"><strong>WEB屋の休憩時間消化用に作られたゲームですね。わかります。</strong></p>
<p><span id="more-929"></span></p>
<p><img src="http://blog.webbingstudio.com/uploads/2009/08/travian_2.jpg" alt="travian_2" title="travian_2" width="135" height="200" class="alignleft size-full wp-image-931" /></p>
<p>最初に自分の種族を選びます。<br />
国の安定重視のローマン、農耕民族のガウル、攻撃的な蛮族のチュートン。</p>
<p>…ガウルを選ぶつもりが、間違ってチュートンを選択してしまった orz</p>
<div class="clear"></div>
<p>チュートンは環境に恵まれていないので、他の村から積極的に物資を奪わなければ飢え死にしてしまいます。モデルはゲルマン民族で、「攻撃的な蛮族」というのは舞台となっている古代ローマの一方的な視点のようです。<br />
まぁ、たまにはこんなサツバツとしたキャラもいいかもしれません。街の開発だけじゃつまらないし。</p>
<p>地図をみると、自分の周りの民族がガウルばかりなのに気付きました。<br />
サーバー全体の比率で見ても、ガウルと団結力があるローマンが多く、チュートンは15%くらいしかいません。</p>
<p>フォーラムを覗いてみると<br />
「自分の村がしょっちゅう襲われて困ります！」<br />
「いや、これそういう弱肉強食のゲームだから…何か対策してる？」<br />
というやりとりがあったり。</p>
<p>もちろん他のネトゲと同じように、弱いユーザーを無意味に潰すような行動は論外なんですけど、自分の領域に固執したり、ウォーシミュレーションとの付き合い方が下手だったりするのは、いわゆる「<strong>日本的なるもの</strong>」かなあ、などと思ったりしました。</p>
<p><img src="http://blog.webbingstudio.com/uploads/2009/08/travian_3.jpg" alt="travian_3" title="travian_3" width="240" height="224" class="alignleft size-full wp-image-932" /></p>
<p>このゲームでおもしろいと思ったのが、オンラインゲームでは珍しく「エンディング」があるところです。</p>
<p>サーバーがオープンして一年くらい経つと、大きな国では<strong>古代超文明の遺物</strong>を復活させられるんですが、これが最高レベルになると<strong>世界が崩壊してサーバー内の全データがリセットされる</strong>そうです。<br />
ムチャクチャです（笑）</p>
<p>ゲームって、終わりがあるから面白いじゃないですか。<br />
その瞬間に立ち会えたらラッキーなんですけどね。</p>
<p>「トラビアン」の欠点は、遅れて参入したユーザーは古参ユーザーに絶対に勝てないことです。<br />
もうちょっと、新人が有利になるようなシステムにしてほしいです。</p>
<p>5番サーバーは先月オープンしたばかりです。興味がある方はどうでしょう。</p>

<a href="http://twitter.com/?status=RT+%40%3A+%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0%E3%80%8C%E3%83%88%E3%83%A9%E3%83%93%E3%82%A2%E3%83%B3%E3%80%8D%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2Fosx8bm" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2009/08/travian.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>お問い合わせフォームを作りました</title>
		<link>http://blog.webbingstudio.com/2009/08/contact_form.html</link>
		<comments>http://blog.webbingstudio.com/2009/08/contact_form.html#comments</comments>
		<pubDate>Thu, 06 Aug 2009 21:01:15 +0000</pubDate>
		<dc:creator>WebbingStudio</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webbingstudio.com/?p=891</guid>
		<description><![CDATA[
「うぇびんぐさん、あのページ、もう一年くらい準備中ですよねw」
と、取引先の営業Tさんに言われていた「お問い合わせフォーム」が復活いたしました。
これまでは無料のフォームをカスタマイズしていましたが、勉強も兼ねて、自分 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.webbingstudio.com/uploads/2009/08/contact.jpg" alt="contact" title="contact" width="480" height="406" class="alignnone size-full wp-image-892" /></p>
<p>「うぇびんぐさん、あのページ、もう一年くらい準備中ですよねw」</p>
<p>と、取引先の営業Tさんに言われていた「お問い合わせフォーム」が復活いたしました。</p>
<p>これまでは無料のフォームをカスタマイズしていましたが、勉強も兼ねて、自分でいちからPHPを書きました。<br />
Ajax連動なんてできてないし、自動返信機能も付いてないのですが、やっとPHPで実用のアプリケーションを作ることができたので、ちょっとうれしいです。</p>
<p>で、何故ずっとメールフォームを作っていたのか、という話です。</p>
<p><span id="more-891"></span></p>
<h3>セキュリティの基礎をしっかりやる</h3>
<p>このフォーム、入力チェックをガチガチ入れています。<br />
メールアドレスをカンマ区切りでごっそり書かれた場合や、外国からのスパム、ボットの連続送信、確認画面の後で送信データを改ざんされた場合など、素人なりにできるだけの対策を講じてみました。<br />
そうでなければ怖くてお仕事で使えません。</p>
<p>メールフォームは、データの扱いが不特定の訪問者にゆだねられるので、慎重にならざるを得ません。<br />
実際、プログラミングの知識が浅い人が自作のフォームを配布して、プログラマにダメ出しされることはよくあります。<br />
こういうことを先にきちんとやっておけば、いつかプログラミングのお仕事をすることになったときに、お客様に迷惑をかけることはないだろうと思ったのです。</p>
<h3>複雑な分岐があるフォームがほしい</h3>
<p><img src="http://blog.webbingstudio.com/uploads/2009/08/contact1.jpg" alt="contact1" title="contact1" width="480" height="265" class="alignnone size-full wp-image-893" /></p>
<p>所属を「制作会社」か「一般法人」にすると、社名の入力が必須になります。<br />
これ以外の場合は空欄でも通ります。</p>
<p>ウェブサイト構築のお仕事でフォームを設置することは多いのですが、このような<br />
「○○の入力値が××だったときのみ、△△を入力必須にする」<br />
という処理はできないか、と尋ねられることが多いです。</p>
<p>このような機能は、一般的に手に入るフォームにはほとんどありません。<br />
100%完璧にできなくてもいい、という場合はjQueryで強引にフォームを書き換えることもあるのですが、そういったことはあまりしたくありません。</p>
<p>やっぱり、フォーム自体を自作できるようになるしかないかと思い、今回のお問い合わせフォームにがんばって入れてみました。</p>
<h3>フォームを搭載しているCMSも増えたけど</h3>
<p>最近のCMSは、ほとんどが高機能なフォームを備えています。<br />
WordPressの「<a href="http://ideasilo.wordpress.com/2007/10/22/contact-form-7-in-japanese/" class="blank">Contact Form 7</a>」にもずいぶんお世話になっています（リロードするとメールが再送されちゃいますが…笑）。</p>
<p>CMS連動のフォームはカスタマイズの手間なく設置ができて普段はとても良いのですが、SSLページへの設置を求められた場合は、フォーム自体をSSL領域に置かなければいけないので利用できません。<br />
先述したようなトリガー機能も流石にありません。<br />
やはり、小回りの利く単独のフォームも確保しておきたいのです。</p>
<h3>管理画面＋DB連動を視野に入れる</h3>
<p>このフォーム、入力項目の設定部分を連想配列で書いています。なので、今の時点では入力ページは普通の静的HTMLになっていますが、PHPで自動生成させることもできます。</p>
<p>本格的なメールフォームのように、ラベル名・inputの表示タイプ・順番・チェック項目などの要素を管理画面＋データベースで制御して、使い回しが効くようにしたいのです。<br />
きちんと規格化したアプリケーションを作っておけば、データベースやセッションなど、次のステップの勉強に進みやすいだろうともくろんでます。アンケートや掲示板への改造もしやすいですし。</p>
<p>私はお仕事でプログラミングをすることがほとんどないので、本に書いてある以外のことがなかなかつかめません。<br />
「わかりやすい」「論理的な」コーディングとはどう書けばいいのかとか、関数の再帰処理（関数をその関数自体の中でもう一度呼び出す処理）の辺りなどさっぱりわかりません。<br />
DevDoの人たちに、その辺のポイントなどアドバイスをもらおうと思います。</p>
<p>デザインやコーディングのお仕事があるのでなかなか時間が取れませんが、確実に前進していると自分をごまかしつつまた頑張ります。</p>

<a href="http://twitter.com/?status=RT+%40%3A+%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F+-+%E3%82%A6%E3%82%A7%E3%83%93%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0+%3E%3Ehttp%3A%2F%2Ftinyurl.com%2Flovg2f" class="tweet-this" ><br /><img src="http://blog.webbingstudio.com/admin/wp-content/plugins/simple-tweet/img/tweet.gif" alt="Twitter" />Twitterで記事を紹介して下さい（-人-）</a>]]></content:encoded>
			<wfw:commentRss>http://blog.webbingstudio.com/2009/08/contact_form.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
