<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2japanesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>SPaiS</title>
	
	<link>http://spais.jp</link>
	<description>PHPの事ばっかり考えているよ。</description>
	<lastBuildDate>Mon, 10 Aug 2009 09:02:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<feedburner:info uri="spais" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://spais.jp" /><feedburner:feedFlare href="http://www.bloglines.com/sub/http://spais.jp" src="http://www.bloglines.com/images/sub_modern11.gif">Bloglines???</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fspais.jp" src="http://buttons.googlesyndication.com/fusion/add.gif">Google???</feedburner:feedFlare><feedburner:feedFlare href="http://r.hatena.ne.jp/append/http://spais.jp" src="http://r.hatena.ne.jp/images/addto_w.gif">???RSS???</feedburner:feedFlare><feedburner:feedFlare href="http://reader.livedoor.com/subscribe/http://spais.jp" src="http://image.reader.livedoor.com/img/banner/91_17_1.gif">Livedoor???????</feedburner:feedFlare><item>
		<title>書評「PHP逆引きレシピ」</title>
		<link>http://feedproxy.google.com/~r/spais/~3/sTZIffb2T9o/2009-08-10</link>
		<comments>http://spais.jp/php/%e6%9b%b8%e8%a9%95%e3%80%8cphp%e9%80%86%e5%bc%95%e3%81%8d%e3%83%ac%e3%82%b7%e3%83%94%e3%80%8d/2009-08-10#comments</comments>
		<pubDate>Mon, 10 Aug 2009 09:02:37 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=274</guid>
		<description><![CDATA[				お久しぶりです。
				もうすっかり夏ですね。僕といえばバリ島で結婚式を挙げてきました。楽しかったです。
				これのおかげで割りとハードな毎日を送っているためブログの更新などは余りできませんが、忘れないであ [...]]]></description>
			<content:encoded><![CDATA[				<p>お久しぶりです。<br />
				もうすっかり夏ですね。僕といえば<a href="http://www.flickr.com/photos/8405748@N06/sets/72157621468040321/">バリ島で結婚式を挙げてきました</a>。楽しかったです。<br />
				これのおかげで割りとハードな毎日を送っているためブログの更新などは余りできませんが、忘れないであげて下さい。</p>
				<p>さて、著者の鈴木憲治様より<a href="http://php-recipe.com/">PHP逆引きレシピ</a>をご献本頂きました。ありがとうございます。</p>
				<p>以下書評。</p>
				<p>「直接的な関数の組み合わせでプログラムを”組み立てる”」という PHP のスタンスにおいて最も重要なのは「目的に応じた答えを知る事」であると言えます。そのような視点から見ると本書はこれ以上ないほどに”実践的”です。<br />
				目的に対する方法を引く事ができ、その方法に関連する他の方法に対してもインデクシングされているばかりか、PHP バージョンごとの差異やメジャーなレンタルサーバに依存する問題なども詳解されているため、本書とパソコンと「ウェブアプリを作りたい」という目的意識さえあれば作れてしまう程です。</p>
				<p>それだけに留まらずセキュリティに関しての広範な対策方法や、PHP で書かれたオープンソースソフトウェアの基本的な利用法も解説されており、さらには PDF、画像、グラフなどの生成方法といった「PHP をベースとしたシステムの利用」についても言及されているため、これはもう「答えのフルコース」だと言えるでしょう。</p>
				<p>しかしながら残念な点もいくつかあります。<br />
				@ によるエラー抑制に始まり、参照渡しを「混乱しやすいから」という乱暴な理由で推奨していなかったり === ではなく == での評価がほとんどだったりと、初心者向けだからこそ肌感覚で培って欲しい「PHP のだめなところ」に関する言及がとても少なく、本書だけで学べてしまうが故に、本書だけを参照してコーディングしていると早い段階で「あれ？なんでこうなるの？」と戸惑う場面に出くわすでしょう。<br />
				特に、セオリーとされている mb_strlen() や htmlspecialchars() に文字コードを渡す事が書かれていない点は大きな穴です。</p>
				<p>しかし本書は数多く出版されている PHP 本の中でも「決定版」と言えるほど完成しており、PHP での開発を生業とする企業ならば新入社員用の教科書として必携の一冊であると言えるでしょう。 </p>
				<p>と、まとめるとこんな感じです。<br />
				折角なので残念なところの補足をいくつか。</p>
				<h3>@によるエラー抑制</h3>
				<p>これは大変まずい事です。自己満足的なプログラムならば良いとしても、割と実践的な事が書かれているだけにビジネス用途で作ったようなプログラムでこれを使ってはいけません。<br />
				@でエラー抑制すると遅くなるとか、そんな事はどうでもいいんです。エラー抑制する代わりにハンドリングすれば似たような負荷がかかる事が多いですから。それよりも「@でエラー抑制をしているとエラーが表示されなくなる」というところにこそ問題があります。殴られても痛くないみたいな。出さないのがいいものはエラーであってエラーメッセージではないんです。</p>
				<p>もし@で抑制している箇所に起因するバグがあった場合、追いかけるのは結構面倒くさいです。<br />
				「いくつかあたりをつけて探してみたけどそれっぽいところはない。じゃあちょっと@消してみようか」みたいなのはバッチリ二度手間です。<br />
				そんな事するくらいなら最初から@で抑制するんじゃなくて条件式なりなんなりでエラーのハンドリングをするべきです。</p>
				<h3>=== じゃなくて == を多用している</h3>
				<p>これもよくありません。基本的に == を使うべきではありません。== で評価するくらいなら型キャストしてしまって if( (int) $a === 5 ) というように書いた方がマシです。これと同じ理由で if( $a ) と言うような評価もよくありません。== を使わないよう癖つけるくらいでちょうどいいと思います。<br />
				評価する変数の型によって結果が違う評価式なんてのは気難しい人に様子を伺うようなものです。逆に == でしか評価できないような実装はそもそも設計に問題があります。</p>
				<h3>mb_strlen() や htmlspecialchars() に文字コードを渡す事</h3>
				<p>よく「PHP の mbstring の設定はこうした方がいい」なんつって mbstring.internal_encoding = utf-8 みたいな事を書いているような人がいますが、これも合理的じゃありません。そもそもプログラムごとに文字コードが違うし、リクエストに含まれる文字の文字コードだってバラバラです。それなのに PHP の設定としてサーバソフトウェア側で文字コードを制御するのは考慮しなければいけない点を増やすだけで全く持って非効率的です。そもそも文字コードを扱うレイヤーじゃないです。<br />
				大体 web アプリを作るときにはアプリで扱う文字コードを決めて、その文字コード以外の文字コードで送られてきたリクエストははじくのが前提ですから、そのアプリで解釈すべき文字コードは(原則的には)1種類です。<br />
				htmlspecialchars() のシノニムで h() を作るのも今ではセオリーで本書にも書かれていますが、第二引数だけではなく第三引数まで書かないと意味がありません。</p>
				<div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-reserved">define</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">SITE_ENCODE</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">utf-8</span><span class="hl-quotes">'</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-identifier">h</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-var">$var</span><span class="hl-code"> </span><span class="hl-brackets">){</span><span class="hl-code">
  </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">htmlspecialchars</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-var">$var</span><span class="hl-code">, </span><span class="hl-identifier">ENT_QUOTES</span><span class="hl-code">, </span><span class="hl-identifier">SITE_ENCODE</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-inlinetags">?&gt;</span></pre></div>
				<p>みたいな。</p>
				<p>大体 utf-8 な文字を mb_strlen() 辺りで図ろうとしても文字コード指定してるか mbstring.internal_encoding で utf-8 が指定されていないと正しい結果を返しません。mbstring.internal_encoding は前述の通り文字コードを制御するようなレイヤーにある設定ではないので、消去法的に考えるとマルチバイト系の文字列関数にはきちんと文字コードも渡してあげるのがモアベターです。</p>
				<p>でも結局は全部 PHP の設計に起因する問題なんですよね。<br />
				これらのつかみにくい設計に関するノウハウまで求めるのは酷かもしれませんが、web デザイナーが css ハックを必要とするようにこういった情報も必要なんじゃないんでしょうか。</p>
				<p>ここらへんの情報が無い以外は本当に素晴らしい書籍です。<br />
				僕みたいに受託で開発やってるような人間はクライアントから「社内でエンジニアを育てたい」的なお話をよく聞きますが、本書はそこらへんのニーズをバッチシ抑えてます。<br />
				逆引きリファレンスですが関数依存の構成ではなくユースケースに依存しているため、明確な目的意識が無くてもノウハウの蓄積に役立つとも思います。</p>
				<p>以上。</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/php/%e6%9b%b8%e8%a9%95%e3%80%8cphp%e9%80%86%e5%bc%95%e3%81%8d%e3%83%ac%e3%82%b7%e3%83%94%e3%80%8d/2009-08-10" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=sTZIffb2T9o:QdS4H8_wIMg:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=sTZIffb2T9o:QdS4H8_wIMg:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/sTZIffb2T9o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/php/%e6%9b%b8%e8%a9%95%e3%80%8cphp%e9%80%86%e5%bc%95%e3%81%8d%e3%83%ac%e3%82%b7%e3%83%94%e3%80%8d/2009-08-10/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/php/%e6%9b%b8%e8%a9%95%e3%80%8cphp%e9%80%86%e5%bc%95%e3%81%8d%e3%83%ac%e3%82%b7%e3%83%94%e3%80%8d/2009-08-10</feedburner:origLink></item>
		<item>
		<title>ググレカス勉強法</title>
		<link>http://feedproxy.google.com/~r/spais/~3/gvXpIUwY4G0/2009-04-28</link>
		<comments>http://spais.jp/note/%e3%82%b0%e3%82%b0%e3%83%ac%e3%82%ab%e3%82%b9%e5%8b%89%e5%bc%b7%e6%b3%95/2009-04-28#comments</comments>
		<pubDate>Tue, 28 Apr 2009 03:43:01 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Note]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=269</guid>
		<description><![CDATA[				僕はウェブ制作に関する技術や知識の学習をほぼ全て独自の方法で行ってきました。
				それ故他人にその方法をレクチャーし実践してみろとは中々言えませんが、その中でも「大体どんな人にも役に立つであろう学習法」と言う [...]]]></description>
			<content:encoded><![CDATA[				<p>僕はウェブ制作に関する技術や知識の学習をほぼ全て独自の方法で行ってきました。<br />
				それ故他人にその方法をレクチャーし実践してみろとは中々言えませんが、その中でも「大体どんな人にも役に立つであろう学習法」と言うものがありますので、今日はその方法について僭越ながら書きたいと思います。</p>
				<p>まず僕がなんの前知識も持たず、それこそ「HTML はウェブページを構成する言語」と言う程度の知識レベルでもってウェブサービスの受託開発を始め、対価を支払ってもらえるクオリティの作品を提供できるまでになった過程において最も重要な事はもちろん「どうやって効率よく問題を解決するか」と言う能力でした。</p>
				<h3>フェーズ1</h3>
				<p>「どれだけの事を知っているか」と言う質問は、ことインターネットの世界で仕事をしている身としてはナンセンスであると言わざるを得ません。<br />
				僕が知っている必要は無いんです。答えられない疑問にぶち当たったとき「どこをどう探せば答えが見つかるか」というノウハウと「得られた答えの信憑性」を適切に評価できる最低限の知識さえあればいいんです。ググレカスってのはこの事だったわけです。</p>
				<p>とは言え多くの初学者はまず「どこをどう探せば答えが見つかるか」と言うノウハウが無いわけですから、自分の中に答えがない時点で「分からない」となってしまいます。質問系サービスで質問している人たちですね。<br />
				実生活に関わるような事であれば短絡的に人に聞くことは間違いではないと思いますが、これが技術的な内容であった場合には話が別です。<br />
				このように技術的な内容を質問してしまうような状態をとりあえずフェーズ1とします。別に意味はないんですけどね。</p>
				<h3>フェーズ2</h3>
				<p>このフェーズ1の人たちは言うなれば「手に漢字辞書を持ちつつ人に漢字の読みをたずねる」と言うような事をやっています。そもそも”手に漢字辞書を持っている”という認識がありません。まずは手に漢字辞書を持っている、要するに欲しい回答を手に握っていると言う前提を理解する必要があります。<br />
				これは最終的に肌感覚にまで高める必要があります。「自分の知らない事は探せる」のがほとんどの場合に適合する事実です。今の時点ではそうじゃないかもしれませんが、この感覚を常に持つ事によって次のフェーズに進む事が出来ます。</p>
				<p>次のフェーズは「探し方が分からない」状態にある人です。「インターネットで検索すれば見つかるんだろうけど、どうやって探せばいいの？」というような感覚です。<br />
				ここまでくれば後もう少し。答えは簡単「問題を解決した気になったとき、それをアウトプットするにはどういった単語を使うか」と言う事を考えれば良いのです。<br />
				”問題の答え”が存在する前提に”問題”自体の存在が不可欠なわけですから、”問題の答え”を知りたければ”問題”自体をキーにして探せば良いのです。<br />
				つまり、今起きている問題に由来する普段見かけないエラーメッセージであるとか、状況を言葉にして検索してみましょう。</p>
				<p>なんとなく「今起きている問題の原因」がつかめてきたのではないかと思います。つかめていない人は探り方が浅いだけだと思います。<br />
				「今自分が思いついたアイデアは既に誰かが思いついている」のと同じくらい「今自分が困っている状況は既に誰かが困っていた」のです。<br />
				その困った経験を先駆者が残していない可能性はありますが、日本語だけではなく英語圏にまで検索の手を伸ばすと大体見つかるはずです。<br />
				もしかするとフェーズ1の人が誰かに質問したページが見つかるかもしれません。諦めずにとことんまで探してみるときっと見つかるはずです。<br />
				仮に答えが見つからなかったとしても、答えをつかむための糸口は見つかるでしょう。</p>
				<h3>フェーズ3</h3>
				<p>さて、ここまでがフェーズ2なわけなのですが、ここからが本題。<br />
				「探せば答えか、答えに繋がる糸口が見つかる」と言う点について理解できたなら、今度はその検索性能を向上させましょう。<br />
				いくらインターネットで検索すれば見つかるからといって、できるならば手間を惜しみたいですし、何よりも問題の法則性から答えを探す作業自体を簡略化させないと実務的ではありません。自分が組んでいるプログラムにエラーがでたからといってそうそう1日も2日も答えを探す時間は無いはずです。<br />
				とは言え ML なんかに「教えて下さい」じゃ本来自分でハンドリングしなければならない開発時間の一部を善意の第三者に依存する事になりますので、ご自身のマネージメント自体も不安定なものとなってしまいます。これじゃ本末転倒ですね。</p>
				<p>という事で僕がお勧めしたいのが「質問に答える側に立つ練習」です。問題とその解決手段という事象に関係しているのは”質問者”と”回答者”という単純な二者です。<br />
				「人の立場になって良く考えてみろ」とはよく言ったものですが、これがまさにそう。「質問に対して回答する立場を以って回答する力を身につける」即ち「問題を解決する能力を身に着ける」練習です。<br />
				あなたにとって ML で質問している人は自己の能力を向上させるための機会提供者です。僕自身 PHP という言語を通してウェブアプリケーションの開発や、ウェブサービスの運用をゼロから学んできました。その最初期にとった行動が「PHP-users の ML で質問に答える」と言うものです。PHP どころか所謂プログラム言語そのものにそれほど触れてこなかった人間が、いかに実務的とは言えその実務的な理解が全くない状況でウェブサービスを作らなければならないような状況においては背に腹はかえられません。とにかく「答える方が分かってる」と言う自明の理を頼りにひたすら質問に答えてました。<br />
				プログラムが動かないと言うのであれば同じ環境を作って再現して解決策を考えてみたり、モジュールが動かないという質問があれば PHP をソースからビルドしてみたり。こういったプロセスは「質問に答える」というモチベーションが根底にありますので、僕みたいに一人でやっている人間にとってはとても張りのある勉強法でもありました。</p>
				<p>効果はてきめん。質問に対して答えを返す立場に立つ事で「問題を解決するアプローチの確立」どころか「問題を解決するために予め知っておかなければならない知識」や「問題の根本にあるインターネットの文化的、歴史的な構造と、その構造が影響するその他の問題」と言った”一つの事象に紐づく様々な要因”についての知識と、それらを関連付ける技術的なインデックスが皮膚感覚で培われていきました。<br />
				これが大体フェーズ3．次のフェーズ4が僕のいる位置なので、それ以降のフェーズはどんなもんなのかわかりませんが、とりあえずフェーズ4は「抽象的な表現や思想を技術的なアプローチで具体的にする」と言うものです。</p>
				<h3>フェーズ4</h3>
				<p>僕がフリーランスの時代から使っていた屋号は「SPaiS」といって Spice(スパイス)をもじったものです。クライアントが持ち込む様々なアイデアやビジネスプランに対して技術的な視点で「どのように実現していくか」をスパイスとして味付けしていく事が僕が自分に課した命題でした。<br />
				おかげさまで様々なクライアントとお話をさせて頂き、様々なビジネスプランやアイデアをウェブの世界に技術的なアプローチで昇華させることができ、昨年起業しました。<br />
				まあそんなことはどうでも良いのですが、問題に対する解決策を提供する力を高める事によって、本質的には問題でない「こういうアイデアをウェブでお金にするためにはどうしたらいい？」だとか「こういうビジネスプランがあるんだけどウェブで成功させるためにはどういった手順を踏めばいい？」と言うような質問に対して独創的な発想を邪魔する事のない広い知見と”物事を調べる力”で回答できるようになります。</p>
				<p>これが出来れば世の中にたくさんいる「あんまりお金は出せないけどウェブサービスを運用してみたい」と言う企業とお話が出来るようになります。<br />
				もしくはあなたがこっそり考えているすばらしい企画やアイデアを実現できる力にもなります。<br />
				結局のところ一人でやればウェブサービスにかかるコストはあなた一人の人件費だけです。つまりほとんどが純益になるわけです。<br />
				そう考えると「自分ひとりでウェブサービスが開発できるならばそれだけで食っていける」とは思えませんか？ググレカスを究極的に昇華していくとこうなるのだと僕は思いますし、実際に今の僕がそういう状況です。</p>
				<p>結果を知っている必要は無いんです。道具の使い方と先駆者の知識を手にする方法さえ理解していれば、それだけであなたの力は何倍にもなります。<br />
				「探したけど無かった」のではなく、見つけるのを諦めただけです。つまり「ググレカス」はあなたにとってのチャンスなのです。</p>
				<p>さあググレカス！</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/note/%e3%82%b0%e3%82%b0%e3%83%ac%e3%82%ab%e3%82%b9%e5%8b%89%e5%bc%b7%e6%b3%95/2009-04-28" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=gvXpIUwY4G0:K-nJguPl0GU:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=gvXpIUwY4G0:K-nJguPl0GU:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/gvXpIUwY4G0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/note/%e3%82%b0%e3%82%b0%e3%83%ac%e3%82%ab%e3%82%b9%e5%8b%89%e5%bc%b7%e6%b3%95/2009-04-28/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://spais.jp/note/%e3%82%b0%e3%82%b0%e3%83%ac%e3%82%ab%e3%82%b9%e5%8b%89%e5%bc%b7%e6%b3%95/2009-04-28</feedburner:origLink></item>
		<item>
		<title>PHP 勉強会にいってきました</title>
		<link>http://feedproxy.google.com/~r/spais/~3/Cj4r7FaP-8o/2009-04-27</link>
		<comments>http://spais.jp/php/php-%e5%8b%89%e5%bc%b7%e4%bc%9a%e3%81%ab%e3%81%84%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97%e3%81%9f/2009-04-27#comments</comments>
		<pubDate>Mon, 27 Apr 2009 03:20:21 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Study]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=263</guid>
		<description><![CDATA[				僕は昨年起業し、基本的に今までお世話になったクライアントからのご紹介を経て新たなクライアントと出会っているわけなのですが、いかんせん組織に属してウェブに関する仕事をこなしてきた訳ではないのでバックボーンが薄っぺら [...]]]></description>
			<content:encoded><![CDATA[				<p>僕は昨年起業し、基本的に今までお世話になったクライアントからのご紹介を経て新たなクライアントと出会っているわけなのですが、いかんせん組織に属してウェブに関する仕事をこなしてきた訳ではないのでバックボーンが薄っぺらいのが弱点だと自分では理解しています。つまり、IT ビジネスにおけるスタンダードな論理的思考が培われてこなかった点にコンプレックスを抱えているわけです。<br />
				そんなコンプレックスを”客観視”を通じてクリアにしていこうと言う気持ちと、ビジネス的な意味でコネクションを張れたらいいなと言う浅ましい気持ちを薄っぺらなかばんに詰めて昨日は <a href="http://events.php.gr.jp/events/show/75">PHP 勉強会</a>に行ってきました。</p>
				<p>会場に着くと自己紹介が始まったばかりで、もう大分席も埋まっていました。会社名だしてやってる事を話してしまうとそれだけでライトニングトークになってしまいそうだったのでここのブログのドメインと個人で受託開発してますと軽く挨拶をしました。懇親会ではどうかわかりませんが勉強会内で参加者同士の対話が無いのに自己紹介する合理的な理由が見つかりませんでした。他の参加者の方々の自己紹介はどちらかと言うと「所属企業＋業務内容＋興味のある事柄＋個人的に出力している事柄」と言ったような内容。若干セミナーっぽい雰囲気ですね。</p>
				<p>僕の心構えが所謂”勉強会”対するものであったがためにこの辺りから違和感を感じてしまっていたのですが、PHP 勉強会は即ち”小さなセミナー”であると同時に、勉強会そのもののベクトルも聴衆ではなく発表者に対してのものであると結論付けるとこの違和感は消えました。<br />
				「40人を超える参加者が一つにテーマに対して同じレイヤーで議論するなんてめちゃくちゃだな」と参加前には期待ageだったわけですが、良くあるカンファレンスと規模だけの差だと理解したわけです。</p>
				<p>さて、そんな違和感を覚えたとは言え、発表する方は発表する方なりの論理的思考に基づく判断と、その判断に対して得られる結果と支払う対価が存在しており、プログラムと言うものはすべからく「コストとメリット」のトレードオフだと僕は常々感じています。<br />
				プログラムを組んだ事がある人と、組んだ事がない人において一線を画すのもこの辺りの論理的判断力に由来していると考えています。<br />
				それだけにまるっきり一人で全部やってきた僕としては、そろそろ自分の論理的判断の客観的な評価が欲しくなるわけです。汚い話ですが他の人の思考プロセスとの対比で自分を見つめなおしたいと言う浅ましい気持ちなわけです。</p>
				<h3>gusagi さんの発表</h3>
				<p>そんな風に軽くがっついた状態で始まった勉強会、トップバッターは司会進行も勤められた gusagi さん。<br />
				真面目で真摯そうな方です。技術系の集まりであるはずですが、そこそこ大きなカンファレンスの司会進行よりもずっとスムーズでした。</p>
				<p>テーマは「XOOPS CubeにCakePHPアプリを組み込んでみた」<br />
				gusagi さんはしきりに「グダグダですいません」と申し訳なさそうにされていましたが、これはご自身のプレッシャーを聴衆に対するバイアスに変換しているだけなので余り感心しませんでした。<br />
				映画本編を見る前に「余り面白くないかもしれませんが」と前置きされると観客への映り方も違うはずです。</p>
				<p>発表の内容は XOOPS Cube という CMS のプラグインとして CakePHP で作ったプログラムを動作させる、と言う目的に対するアプローチ解説だったわけですが・・・<br />
				そもそもからして XOOPS Cube 上で CakePHP を動作させるための合理的理由と言う前提が説明されていない状況ですので「Windows で Mac のソフトを動かすためには」と言うような解説を受けているのと感覚的に大差ありませんでした。結局のところ「CakePHP のブートストラップを XOOPS Cube に依存させるんだよ」と言うのが話の大筋でしたが、フレームワークにしろ CMS にしろブートストラップ型のプラットフォームを混在させるには当たり前の話です。<br />
				逆に「なぜ XOOPS Cube と CakePHP を混在させる上で発生する管理コストの増大を加味しても混在させるというアプローチを取るにいたったか」と言う思考プロセスから紐解いていったほうが「なぜフレームワークを選ぶのか」を合理的に理解できる糸口になって、発表者と参加者の思考を議論させる良いカンフル剤になったのでは、と思いました。</p>
				<p>結局のところプラグインであったりモジュールであったりするものは、先駆者が作ったものを後発者が利用するのが現実です。結局のところ「車輪の再発明の仕方」なだけであって、そこにユニークな設計思想があるならば別ですが、10人いれば10人が同じアプローチを取るであろうケースにおいて「こうやります」と言うのは若干ナンセンスに感じました。</p>
				<h3>kunit さんの発表</h3>
				<p>次は kunit さんによる「Propel をあきらめるまえに」という発表。僕と同じでノウハウがぎっしり詰まったビジュアルをされている方です。<br />
				こういう人が上司にいると部下は安心して仕事が出来そう、そんな雰囲気です。<br />
				発表の内容は「symfony で採用されている OR マッパである Propel を使う事で想定される問題に対する解決アプローチ」だったわけなのですが、微妙にマッチングの難しいテーマであると感じました。こういった問題にぶちあたって”あきらめてしまう”というレイヤーに属している方にとって、Propel という OR マッパはユースケースとしては理解しにくいレベルだったのではないでしょうか。<br />
				むしろ PEAR::MDB2 (の Extended モジュール)くらいが妥当な気がしました。まあそれでは「フレームワーク」というテーマにかすりもしなくなってしまうので仕方がないといえばそうなのかもしれませんが・・・<br />
				逆に Propel の実装を理解できている人にとってはむしろ”当たり前”の思考プロセスであり「問題にぶち当たったけどまだ解決の途中」と言うような人にのみ有益な発表であったように思えます。<br />
				実務的な発表だったので自分の作業を見つめなおす良い機会にはなりましたが、この発表内容はむしろこれが出発点であり、この発表で扱われたアプローチをどれだけプログラム自体に反映させるか、つまり設計的にどう解釈すべきであるかこそが僕にとって興味のあるテーマでした。<br />
				「SQL インジェクションに自分で対応しなければならないのか」と言うテーマに対しては僕が漠然とフレームワークに感じている不安が同調しました。<br />
				つまり OR マッパに依存しないで自分でクエリを書いた場合のセキュリティかかるコストはどうする、と言うような話です。そもそも OR マッパから入っていなければ自明な論理なのですが、フレームワークを使っての開発が出発地点のような人にとってはこのような事が検討事案になってしまうんだと言う事実は、紛れも無く「フレームワークを使う弊害」だと感じました。<br />
				まあ答えとしては「データベースが提供するエスケープ機能を使う」であり平たく言うなら「プリペアドステートメントを使う」と言うことなのですが。<br />
				世の中が便利になればなるほど人間は肉体的に退化していくという進化論的な話と同じく、プログラムの原理的な部分に対する理解が薄まるほど設計も退化してしまうのではないかと考えるとおそろしくすらなります。<br />
				また、僕の被害妄想かもしれませんが「Eclipse を使ってる非 Java 開発者はスイーツ」みたいな風潮が蔓延している(ように感じられる)昨今において、Eclipse の有用性を説いて頂けた事は非常に素晴らしく感じました。</p>
				<h3>wozozo の発表</h3>
				<p>日ごろ #team-one でくだらない事や性的な事しか話しておらず、たまにちょこっと技術的な会話が、本当にたまにある程度だったのでどのような感性を持った人間なのか判断しかねてはいましたが・・・<br />
				テーマは「rhaco2 について」<br />
				最新情報的なニュアンスの発表でしたが、PHP 勉強会近辺のクラスタに属していないと全く理解できない所謂”身内ネタ”だったので割愛します。<br />
				ただ、rhaco2 の実装が面白そうに感じたのでちょっとソースを読もうという気にはなりました。<br />
				プレゼンに大きく顔文字だけ表示して「これが」「はーい」「こうで」「はーい」という発表スタイルはエンタの神様を見ているような不思議な感覚でした。</p>
				<h3>BoBpp さんの発表</h3>
				<p>ある意味一番論理的な発表だったと思います。<br />
				Perl の携帯端末向けサービス開発に特化したフレームワーク「MobaSiF」についてです。<br />
				MobaSiF の設計思想に始まり、規模の大きな企業やサービス内での実際の開発・運用スタイルについての言及。<br />
				唯一とも言える「高速」と言う設計思想は極めて実務的であり合理的です。その高速という思想をサービスの運用だけではなく、開発スピードにまで持っていく辺りに”成功したウェブサービスを維持し続ける事の大変さ”が滲んでいるとも感じました。<br />
				現実問題フレームワークを基準とすることに限界を感じるであろうタイミングは「開発スピードに起因する」と僕自身漠然と感じていました。開発スピードに起因するとは、ウェブサービスが違うという事は文化が違う事であり、文化が違うという事はその空間の制御速度が違う、と言う点に帰結します。日本とインドでは「時間が違う」と感じる事に近い話です。<br />
				その制御速度を以ってして開発に当たるわけですから、それぞれのウェブサービスに対して同じフレームワークを採用しているのにフレームワークの実装そのものがウェブサービスごとに固有の物となっていくのは、自然言語における方言に近いものなのかもしれません。<br />
				そう考えると「方言を使う事のメリットやデメリット」という視点そのものがナンセンスであるとも考えられます。<br />
				ウェブサービスの性質や文化を反映した結果、そのウェブサービスを形作るフレームワークが変化していくと言う思想は、技術者にとっては客観的に不自然な事かも知れませんが、その現場に生きる主観的な立場からすると「そうなる事が自然」である事の反映なのでしょうから「そのウェブサービスに特化し続けた結果」であるとも言えるはずです。<br />
				いつかは飯食って糞するだけで金が入ってくるような生活を送ってみたいと考えるに僕にとってかなり勉強になる発表でした。</p>
				<h3>sotarok さんの発表</h3>
				<p>GREE 発の国産フレームワーク Ethna の特色や開発スタイルについての発表です。<br />
				「Ethna のここが凄い」と言うアプローチでいくつかの特色が解説されましたが、若干分かりにくかったです。<br />
				僕の理解力に起因する事なので決して sotarok さんの発表が分かりにくかったのではない、とは思いますが、いかんせん思考プロセスに準じていないフラットな解説だったので、状況を頭に浮かべながら解説の通りに状況をトレースしていきましたがイマイチ強さを伝えきれていないように感じました。<br />
				アクションをいくつかのレイヤーに分けることで再利用性を高めるというアプローチは凄く良く思えましたが、そこをフレームワークが担当する合理的理由が明示されなかったのが残念でした。<br />
				解説自体もフレームワークを利用するプログラムの設計でフォロー出来そうなケースを用いてだったので、実感として有用性がそこまで感じられなかったのは僕が天邪鬼だったからという点に大きく依存しますが、やはり kunit さんの発表のように「問題ありき」で有用性を実証していない、即ち「この機能以外では解決できないと言う問題ではなかった」と言う点に起因すると感じました。<br />
				開発スタイルはとても参考になりました。歴史のある配布物ならではの苦労や”だからこその恩恵”、若干自嘲的にフレームワークごとの利用統計を発表して頂いたのもとても有益でした。</p>
				<h3>flyfront さんの発表</h3>
				<p>「TCPDFでお手軽PDF生成」というテーマでした。要するに配布されているライブラリの使い方ですね。<br />
				大変申し訳ないのですが普段”聞くだけ”と言うスタイルに慣れていないせいか、この辺りから猛烈な眠気に襲われて余り覚えていません。<br />
				OSS で尚且つ日本語が扱える PDF 生成ライブラリは数少なく、あったとしても動かすのは大変なんですよ、という話だったと記憶しています。<br />
				ユースケースではないので漠然と操作方法的な話が続いていたのが印象的でした。たぶん自分で使ってみればトレースできる内容だったと思います。<br />
				PDF という極めて実務的な表現方法に対して漠然とした操作説明だけを発表されるのは逆に難しいんじゃないかとも思いましたが、どちらにしても主体性のない内容だったので flyfront さん自身の思想が反映されているとは感じられず、それがひいては「内容のなさ」に感じられてしまいました。</p>
				<h3>k-kishida さんの発表</h3>
				<p>前日行われた CakePHP 開発合宿の模様を発表されていました。<br />
				アラフォーだとか湯けむり事件簿だとか、わりとバズワードが好きな方なんだなと感じました。<br />
				僕は解釈のショートカットが余り好きではないのでこの辺りの表現には食傷気味でしたが、内容はわりと面白そうでした。<br />
				「面白そうでした」となってしまっているのは発表のほとんどが「合宿楽しかったよ！みんなも行こうよ！」と言う感想で占められてしまっていたため、合宿に行くことでこれだけの成果が得られたと言う客観的な事実に基づいていなかったためです。僕の想像における話ですが、CandyCane が凄い興味深かったので早くソースを読んでみたいと思いました。</p>
				<h3>すずきさんの発表</h3>
				<p>最後は勉強会の会場を用意して下さったすずきさんです。<br />
				k-kishida さんと同じく先日の合宿に関する報告でしたが、が、その模様を撮影した写真をスライドショーで流しつつ、それぞれの写真にあわせて一言話されていただけでした。<br />
				要するに人力 flickr ですね。<br />
				「ブログで感想を書くまでが勉強会だ」と仰られていたのが印象的でした。</p>
				<h3>総評</h3>
				<p>総評とか書くと上から目線に見えますね。良くも悪くもとても勉強になりました。<br />
				やはり勉強会はおでこがくっつくくらいの少人数が限界なんだろうなと強く感じました。人数が多ければ多いほど一つの思想はマイノリティになっていくわけで、距離感が遠くなればなるほど議論の旨みも出しにくいものであり、僕が勉強会に期待するのはその旨みなわけです。<br />
				それぞれの方の発表を聞く前には「どんな事を話してくれるんだろう、どんな事を質問しよう」とかなり期待していましたが、操作方法などでは質問も糸瓜もなく「今回の発表にいたった経緯を教えて下さい」とか「今回のアプローチを選んだ論理的根拠はなんですか」なんて事を聞ける空気ではない(と感じた)ため大人しくしていました。<br />
				今回参加させていただいた PHP 勉強会はむしろ”小さいカンファレンス”であり、”小さなセミナー”であると感じました。<br />
				僕はあくまでも勉強会は対流が基本だと感じている人間なので、今回のように「発表者から聴衆へ」と言う一方向の流れに対して論理的根拠に乏しい発表が含まれていると「大味だな」と感じてしまいます。それが正しいのかどうかはさておき。</p>
				<p>4月18日に参加させてもらった CMS 勉強会は、IT に関する知識で言えば明らかに今回よりも劣っていると言わざるを得ませんでしたが、参加者がそれぞれに抱える問題や、その問題に対する解決アプローチを議論しあう事で素晴らしい意見や知識の共有が果たせたと感じられるとても意義のある勉強会でした。<br />
				勉強会のフィールドが言語に向けられているため、発表者ごとに大きな差が生まれるのは仕方がないと思いましたが、発表する内容がないのであればテーマに対する解決アプローチを議論する方がよっぽど効果的なのではないでしょうか。</p>
				<p>「発表する側と聞く側」の物理的なコスト差があるのは事実ですが、僕みたいにワイフから「月に100万は献上」などとシビアなハードルが課せられている人間からすると「死ぬ気で作った空き時間に知らない人が笑ってる写真集見せてもらった」と言うところに価値を見出す事は難しかったです。<br />
				これは明らかに僕の認識不足だったのでむしろ僕が申し訳ないと謝るべき事ですね。すいません。</p>
				<p>批判的な内容ばかりですが、発表して下さった、またこのような勉強会に参加させて頂いたという事に対する僕なりのお礼です。<br />
				僕は基本的に S ですが褒められて得られる性的な興奮に比べ、批判される事で得られる新たな知見の方が万倍有益であると考えたための感想です。</p>
				<p>どうもありがとうございました。</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/php/php-%e5%8b%89%e5%bc%b7%e4%bc%9a%e3%81%ab%e3%81%84%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97%e3%81%9f/2009-04-27" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=Cj4r7FaP-8o:39KrDl-gkVU:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=Cj4r7FaP-8o:39KrDl-gkVU:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/Cj4r7FaP-8o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/php/php-%e5%8b%89%e5%bc%b7%e4%bc%9a%e3%81%ab%e3%81%84%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97%e3%81%9f/2009-04-27/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://spais.jp/php/php-%e5%8b%89%e5%bc%b7%e4%bc%9a%e3%81%ab%e3%81%84%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97%e3%81%9f/2009-04-27</feedburner:origLink></item>
		<item>
		<title>Wordpress プラグイン開発に役立つ小さなテクニックと気をつけるべき点</title>
		<link>http://feedproxy.google.com/~r/spais/~3/lKO8lHMYWY8/2009-03-31</link>
		<comments>http://spais.jp/note/wordpress-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e9%96%8b%e7%99%ba%e3%81%ab%e5%bd%b9%e7%ab%8b%e3%81%a4%e5%b0%8f%e3%81%95%e3%81%aa%e3%83%86%e3%82%af/2009-03-31#comments</comments>
		<pubDate>Tue, 31 Mar 2009 09:25:35 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=241</guid>
		<description><![CDATA[				間違ってたらご指摘頂けると助かります。
				
				wp_enqueue_script() でバージョン指定するときに mktime() と書くと毎回ちゃんと更新されててよろしい。wp_enqueue_st [...]]]></description>
			<content:encoded><![CDATA[				<p>間違ってたらご指摘頂けると助かります。</p>
				<ol>
				<li>wp_enqueue_script() でバージョン指定するときに mktime() と書くと毎回ちゃんと更新されててよろしい。wp_enqueue_style() も然り。</li>
				<li>プラグインファイルで直接メソッドや関数を呼び出さず、アクションにフックした方がいい。</li>
				<li>plugin_loaded アクションが最初に呼び出される。URI の解析なんかよりも前に呼ばれる。</li>
				<li>Wordpress コアの前処理が終わった後に実行されるのは init アクション。通常はこっちを使う。</li>
				<li>admin_notices アクションで echo すると「投稿を保存しました。」みたいなメッセージ表示が出来る。div.error で括ればエラー表示が出来る。</li>
				<li>Wordpress コアに標準搭載されてる jQuery よりも新しい jQuery が使いたいときは init アクションとかにフックして wp_deregister_script( &#8216;jquery&#8217; ); をしてから wp_enqueue_script() で登録しなおす。</li>
				<li>管理画面のサイドバーに表示されてるメニューのサブメニューに項目追加したい場合は add_submenu_page() を使う。init アクションとかに無名関数をフックしてそこから呼び出すと無駄がない。</li>
				<li>$wpdb->prepare() は sprintf() のラッパー。エスケープは addslashes() だけど UTF-8 だから問題ないと思う。</li>
				<li>$wpdb->prepare() は %s と %d を拾って自動的にクォートしてくれる。%1$s とかじゃ駄目</li>
				<li>MySQL 4.0.27 未満だと UTF-8 での LIKE 句の処理にバグがあるので 4.0.27 未満の MySQL で運用する Wordpress の日本語検索は正しい結果が返ってこない。</li>
				<li>テスト環境とか似たような環境をいくつも用意する場合は mysqldump でデータベースコピーした方が早い。</li>
				<li>管理画面用の admin-ajax.php に POST リクエストするときに独自アクションを追加するなら &#8216;wp_ajax_&#8217;.$_POST['action'] にフックする。</li>
				<li>admin-ajax.php を使うと最後に 0 が出力されるので、それがいやならばその前にスクリプトを停止させる。</li>
				</ol>
				<p>たまったらまた書きます。</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/note/wordpress-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e9%96%8b%e7%99%ba%e3%81%ab%e5%bd%b9%e7%ab%8b%e3%81%a4%e5%b0%8f%e3%81%95%e3%81%aa%e3%83%86%e3%82%af/2009-03-31" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=lKO8lHMYWY8:NJC16UD72uE:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=lKO8lHMYWY8:NJC16UD72uE:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/lKO8lHMYWY8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/note/wordpress-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e9%96%8b%e7%99%ba%e3%81%ab%e5%bd%b9%e7%ab%8b%e3%81%a4%e5%b0%8f%e3%81%95%e3%81%aa%e3%83%86%e3%82%af/2009-03-31/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/note/wordpress-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e9%96%8b%e7%99%ba%e3%81%ab%e5%bd%b9%e7%ab%8b%e3%81%a4%e5%b0%8f%e3%81%95%e3%81%aa%e3%83%86%e3%82%af/2009-03-31</feedburner:origLink></item>
		<item>
		<title>Wordpress に独自のテンプレートを追加する</title>
		<link>http://feedproxy.google.com/~r/spais/~3/wAfNlB7KTik/2009-03-26</link>
		<comments>http://spais.jp/note/wordpress-%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b/2009-03-26#comments</comments>
		<pubDate>Thu, 26 Mar 2009 10:45:11 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=249</guid>
		<description><![CDATA[				自作のプラグインで生成するページが既存のテンプレートにマッチしなかったり、ページの種類によってテンプレートを変えたいなーなんて事、ありますよね。
				page.php などの中でさらに分岐させても良いのですが [...]]]></description>
			<content:encoded><![CDATA[				<p>自作のプラグインで生成するページが既存のテンプレートにマッチしなかったり、ページの種類によってテンプレートを変えたいなーなんて事、ありますよね。<br />
				page.php などの中でさらに分岐させても良いのですが、それではロジックとビューが混在してしまうためロジックがプラグインだったりするとテーマとプラグインに依存関係が生まれて使い勝手が悪くなってしまってイマイチです。</p>
				<p>そんなときはフィルタ関数で呼び出すテンプレートファイルを変えてしまいましょう。<br />
				大体こんな感じ。</p>
				<div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">pageSnacher</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-var">$template</span><span class="hl-code"> </span><span class="hl-brackets">){</span><span class="hl-code">
    </span><span class="hl-reserved">if</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-identifier">preg_match</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">/^\/hoge$/</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-identifier">getenv</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">REQUEST_URI</span><span class="hl-quotes">'</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code">
        </span><span class="hl-var">$template</span><span class="hl-code"> = </span><span class="hl-identifier">TEMPLATEPATH</span><span class="hl-code"> . </span><span class="hl-quotes">'</span><span class="hl-string">/hoge.php</span><span class="hl-quotes">'</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-var">$template</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-identifier">add_filter</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">page_template</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">pageSnatcher</span><span class="hl-quotes">'</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-inlinetags">?&gt;</span></pre></div>
				<p>URI が /hoge だった場合にテーマのディレクトリにある hoge.php がテンプレートファイルとして読み込まれます。<br />
				page_template は wp-includes/template-loader.php で is_page() が true を返したときに呼び出されるフックです。<br />
				よって、init フックとかで add_filter() しても意味がなかったりしますので気をつけてください。<br />
				それぞれのテンプレートで呼び出されるフックは wp-includes/theme.php 辺りを読めば大体わかると思います。</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/note/wordpress-%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b/2009-03-26" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=wAfNlB7KTik:vL9E1WDIAi8:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=wAfNlB7KTik:vL9E1WDIAi8:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/wAfNlB7KTik" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/note/wordpress-%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b/2009-03-26/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/note/wordpress-%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b/2009-03-26</feedburner:origLink></item>
		<item>
		<title>デバッグ用 jQuery プラグイン</title>
		<link>http://feedproxy.google.com/~r/spais/~3/9roIjnxtbMQ/2009-03-24</link>
		<comments>http://spais.jp/javascript/%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e7%94%a8-jquery-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-03-24#comments</comments>
		<pubDate>Tue, 24 Mar 2009 02:38:21 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=246</guid>
		<description><![CDATA[				たくさん console.log 書くのが面倒なのでこんな風にしてます。
				(function($){$.extend($.prototype,{
op: function(s){
    s = $.ex [...]]]></description>
			<content:encoded><![CDATA[				<p>たくさん console.log 書くのが面倒なのでこんな風にしてます。</p>
				<div class="hl-main"><pre><span class="hl-brackets">(</span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-code">$</span><span class="hl-brackets">){</span><span class="hl-code">$.</span><span class="hl-identifier">extend</span><span class="hl-brackets">(</span><span class="hl-code">$.</span><span class="hl-identifier">prototype</span><span class="hl-code">,</span><span class="hl-brackets">{</span><span class="hl-code">
</span><span class="hl-identifier">op</span><span class="hl-code">: </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-identifier">s</span><span class="hl-brackets">){</span><span class="hl-code">
    </span><span class="hl-identifier">s</span><span class="hl-code"> = $.</span><span class="hl-identifier">extend</span><span class="hl-brackets">({</span><span class="hl-identifier">o</span><span class="hl-code">: </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-code">, </span><span class="hl-identifier">n</span><span class="hl-code">: </span><span class="hl-identifier">toString</span><span class="hl-brackets">}</span><span class="hl-code">, </span><span class="hl-identifier">s</span><span class="hl-brackets">)</span><span class="hl-code">;
    $</span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">each</span><span class="hl-brackets">(</span><span class="hl-reserved">function</span><span class="hl-brackets">(){</span><span class="hl-code">
        </span><span class="hl-identifier">s</span><span class="hl-code">.</span><span class="hl-identifier">o</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">{width: </span><span class="hl-quotes">'</span><span class="hl-code">+$</span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">width</span><span class="hl-brackets">()</span><span class="hl-code">+</span><span class="hl-quotes">'</span><span class="hl-string">, height: </span><span class="hl-quotes">'</span><span class="hl-code">+$</span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">height</span><span class="hl-brackets">()</span><span class="hl-code">+</span><span class="hl-quotes">'</span><span class="hl-string">, scrollLeft: </span><span class="hl-quotes">'</span><span class="hl-code">+$</span><span class="hl-brackets">(</span><span class="hl-builtin">window</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">scrollLeft</span><span class="hl-brackets">()</span><span class="hl-code">+</span><span class="hl-quotes">'</span><span class="hl-string">, scrollTop: </span><span class="hl-quotes">'</span><span class="hl-code">+$</span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">scrollTop</span><span class="hl-brackets">()</span><span class="hl-code">+</span><span class="hl-quotes">'</span><span class="hl-string">} as </span><span class="hl-quotes">'</span><span class="hl-code">+</span><span class="hl-identifier">s</span><span class="hl-code">.</span><span class="hl-identifier">n</span><span class="hl-code">.</span><span class="hl-identifier">call</span><span class="hl-brackets">(</span><span class="hl-code">$</span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-brackets">)[</span><span class="hl-number">0</span><span class="hl-brackets">]))</span><span class="hl-code">;
    </span><span class="hl-brackets">})</span><span class="hl-code">;
</span><span class="hl-brackets">}})})(</span><span class="hl-identifier">jQuery</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre></div>
				<p>プラグインと言うほどの物ではありませんね。<br />
				$(selector).op(); で console.log に {width: nnn, height: nnn, scrollLeft: nnn, scrollTop: nnn} as [object name] が表示されるだけ。<br />
				jquery ui の resize() メソッドにつなげて確認、みたいな。<br />
				$(selector).op({o:$(&#8217;#log&#8217;).html}); とかでもいけるけど追記するような処理加えないと複数要素が駄目。</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/javascript/%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e7%94%a8-jquery-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-03-24" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=9roIjnxtbMQ:XWabUHAj5Fc:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=9roIjnxtbMQ:XWabUHAj5Fc:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/9roIjnxtbMQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/javascript/%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e7%94%a8-jquery-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-03-24/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/javascript/%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e7%94%a8-jquery-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-03-24</feedburner:origLink></item>
		<item>
		<title>Wordpress におけるメタボックスの構造解説</title>
		<link>http://feedproxy.google.com/~r/spais/~3/dTnTsGJ2I8U/2009-03-17</link>
		<comments>http://spais.jp/php/wordpress-%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%a7%8b%e9%80%a0%e8%a7%a3%e8%aa%ac/2009-03-17#comments</comments>
		<pubDate>Tue, 17 Mar 2009 04:07:48 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=230</guid>
		<description><![CDATA[				Wordpress 2.5 辺りから整備されてきたメタボックス。2.7 にもなるとかなりシステマチックな構造となってきました。
				このメタボックスの構造があるおかげで 2.7 からはユーザーごとに「表示オプ [...]]]></description>
			<content:encoded><![CDATA[				<p>Wordpress 2.5 辺りから整備されてきたメタボックス。2.7 にもなるとかなりシステマチックな構造となってきました。<br />
				このメタボックスの構造があるおかげで 2.7 からはユーザーごとに「表示オプション」という形でそれぞれのページでのメタボックスをコントロールできています。</p>
				<p>さて、このメタボックス。プラグインでも存分にその機能を利用できます。設定項目が多岐に渡るようなプラグインの場合、設定画面の UI が煩雑になりがちです。<br />
				そんなときにこのメタボックスを利用する事で、すっきりとシステマチックな UI を設定画面に提供する事が出来ます。</p>
				<p>使い方はいたって簡単。</p>
				<ol>
				<li><a href="#register">メタボックスの登録</a></li>
				<li><a href="#output">メタボックスの出力</a></li>
				<li><a href="#saveandload">メタボックス状態の保存と復元</a></li>
				</ol>
				<p>これだけです。</p>
				<h3><a name="register">メタボックスの登録</a></h3>
				<div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-identifier">add_meta_box</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">メタボックスの識別名</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">メタボックスのラベル</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">コールバック関数</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">ページ名</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">コンテキスト</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">優先度</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-inlinetags">?&gt;</span></pre></div>
				<p>これがメタボックスを登録する関数です。<br />
				まず、第一引数にメタボックスの識別名を指定します。これは最終的にメタボックスを HTML として出力する際、一番外側の div 要素の id 属性として利用されますので、制限的には id 属性のそれに準じます。PHP 側ではハッシュのキーとして使われます。<br />
				同一のページ内で使うメタボックス同士で重複してはいけませんし、そもそも id 属性として利用されるので HTML 内で重複してもいけません。ユニーク性を強調するならば &#8216;プラグイン名_メタボックス識別名&#8217; という様な構造がお手軽です。</p>
				<p>次に第二引数。これはそのままメタボックスの上部に表示されるラベルです。それ以外に利用される事はありません。<br />
				また、この引数はそのまま HTML に出力されるので、タグを利用してメタボックスの表現に変化をもたせることが可能です。しかし、ラベルは span 要素で括られているためボックス要素を利用する事は出来ません。せいぜい &lt;span class=&#8221;extra&#8221;>ラベル&lt;/span> とする程度にとどめた方がよいでしょう。</p>
				<p>第三引数はコールバック関数です。後述する do_meta_boxes() でメタボックスの HTML が出力される際に呼び出されます。<br />
				つまりメタボックス内部の HTML を出力するための関数やメソッドを指定します。<br />
				例えば、コールバック関数に display_meta_box() を指定した場合 display_meta_box() では以下のようなコードを書きます。</p>
				<div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">display_meta_box</span><span class="hl-brackets">(){</span><span class="hl-code">
</span><span class="hl-inlinetags">?&gt;</span><span class="hl-default">
&lt;label&gt;今朝食べたもの&lt;input type=&quot;text&quot; name=&quot;breakfast&quot; value=&quot;スパンコール丼&quot; /&gt;&lt;/label&gt;
</span><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-brackets">}</span></pre></div>
				<p>call_user_func() で呼び出されますので、メソッドの場合は配列で指定します。</p>
				<p>第四引数は &#8216;ページ名&#8217; となっていますが、これはプラグインの URI には依存していません。自由です。<br />
				ページ名というよりはページの識別名と考えた方がよいかもしれません。後述する JavaScript 側でのコントロールにおいて重要な役割を持ちます。<br />
				プラグイン名を利用するのがベターでしょう。</p>
				<p>第五引数のコンテキストは、要するに同一ページ内に複数列のレイアウトを組むような場合の識別名として利用します。<br />
				例えば以下のような HTML があったとします。</p>
				<div class="hl-main"><pre>&lt;div class=&quot;sidebar&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;body&quot;&gt;&lt;/div&gt;</pre></div>
				<p>sidebar と body にはそれぞれ別のメタボックスを出力したい、という様な場合にこのコンテキストで分類し、後述する do_meta_boxes() で区別して呼び出します。<br />
				指定しない場合は &#8216;advanced&#8217; として扱われます。</p>
				<p>最後の第六引数は優先度です。優先度は高い順に &#8216;high&#8217;, &#8217;sorted&#8217;, &#8216;core&#8217;, &#8216;default&#8217;, &#8216;low&#8217; となっており、これ以外の優先度を指定してしまうとメタボックスが出力されなくなってしまいますので気をつけてください。優先度が適用されるのは「メタボックスが呼び出される順番」です。プラグインの構造上出力したい順番にメタボックスの登録が出来ない場合などに力を発揮します。<br />
				指定しない場合は &#8216;default&#8217; として扱われ、優先度が重複するメタボックス同士は登録された順に出力されていきます。</p>
				<p>以上がメタボックスの登録関数について。</p>
				<h3><a name="output">メタボックスの出力</a></h3>
				<p>次に登録したメタボックスを出力する関数である do_meta_boxes() についてです。</p>
				<div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-identifier">do_meta_boxes</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">ページ名</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">コンテキスト</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">コールバック関数に渡したい変数</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-inlinetags">?&gt;</span></pre></div>
				<p>第一引数と第二引数はそれぞれ add_meta_box() で指定したものと相関関係にあります。<br />
				呼び出した居場所で適時呼び出して下さい。</p>
				<div class="hl-main"><pre>&lt;div class=&quot;sidebar&quot;&gt;&lt;?php do_meta_boxes( 'pluginName', 'sidebar' )?&gt;&lt;/div&gt;
&lt;div class=&quot;body&quot;&gt;&lt;?php do_meta_boxes( 'pluginName', 'body' )?&gt;&lt;/div&gt;</pre></div>
				<p>という様な具合です。<br />
				第三引数にはコールバック関数に渡したい変数を指定することが出来ます。<br />
				コールバック関数には二つの引数が渡されます。</p>
				<p>function callbackFn( &#8216;do_meta_boxesから渡された変数&#8217;, &#8216;このコールバック関数を呼び出しているメタボックスの設定&#8217; ) となっておりますので、例えば1種類のコールバック関数で複数のメタボックスを出力したい場合などには、第二引数で呼び出し元のメタボックスを評価し第一引数にある変数を使ってメタボックスを構成する、という様な利用方法が挙げられます。</p>
				<h3><a name="saveandload">メタボックス状態の保存と復元</a></h3>
				<p>ここまでは PHP のお話でしたが、このメタボックスは JavaScript によって折りたためたり、ドラッグして移動する事ができます。<br />
				これらの直感的な操作は wp-admin/js/postbox.js にそのスクリプトが書かれていますので、とりあえずこれを呼び出します。<br />
				postbox.js は規定のスクリプトとして登録されているので、呼び出しは wp_enqueue_script( &#8216;postbox&#8217; ); で OK です。</p>
				<p>呼び出そうと思っている本体のスクリプトの呼び出し名を知りたい場合は以下の URI を参照して下さい。<br />
				<a href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">Function Reference/wp enqueue script &laquo; WordPress Codex</a></p>
				<p>次におまじないを2行、JavaScript として追加します。</p>
				<div class="hl-main"><pre><span class="hl-identifier">postboxes</span><span class="hl-code">.</span><span class="hl-identifier">add_postbox_toggles</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">ページ名</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-identifier">jQuery</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">.if-js-closed</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">removeClass</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">if-js-closed</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">addClass</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">closed</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre></div>
				<p>1行目はメタボックスのイベント登録をします。<br />
				また、メタボックスの状態を保存する際にどのページで出力されたメタボックスの情報であるかを識別するページ名を引数に渡します。<br />
				このページ名は前述の add_meta_box() で指定したページ名と同一のものを利用します。<br />
				これによって PHP 側で生成したメタボックスと、JavaScript 側で制御している表現の状態を結び付けます。<br />
				2行目はメタボックスが閉じられたものであると指定された場合に、そのメタボックスを予め閉じるための指示です。<br />
				PHP で生成されたメタボックスが閉じられる予定のものであった場合、class 属性に if-js-closed が指定されていますので、そのクラス名を closed に変えています。<br />
				これにより closed のスタイルが適用される事になります。</p>
				<p>JavaScript によってメタボックスを閉じたり、移動した情報はその度にサーバにリクエストされます。<br />
				その際 nonce_field が無いと状態を保存してくれません。<br />
				ページ内のどこでもよいので nonce_field を出力しておきましょう。</p>
				<div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-identifier">wp_nonce_field</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">closedpostboxes</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">closedpostboxesnonce</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-reserved">false</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-identifier">wp_nonce_field</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">meta-box-order</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">meta-box-order-nonce</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-reserved">false</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-inlinetags">?&gt;</span></pre></div>
				<p>これで OK です。<br />
				nonce_field の説明は長くなってしまうので機会があれば別エントリで言及しますが、これは簡単に言えばユーザーの権限評価も含めたワンタイムチケットです。</p>
				<p>メタボックスが表示され、状態が保存されていれば全てはうまくいったという事です。<br />
				さほど複雑な構造ではないので是非利用してみて下さい。</p>
				<h3>参考</h3>
				<ul>
				<li><a href="http://andrewferguson.net/2008/09/26/using-add_meta_box/">Using add_meta_box() | Andrew Ferguson dot NET</a></li>
				<li><a href="http://codex.wordpress.org/Function_Reference/add_meta_box">Function Reference/add meta box « WordPress Codex</a></li>
				<li><a href="http://codex.wordpress.org/Function_Reference/wp_nonce_field">Function Reference/wp nonce field « WordPress Codex</a></li>
				<li><a href="http://codex.wordpress.org/Creating_Options_Pages">Creating Options Pages « WordPress Codex</a></li>
				</ul>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/php/wordpress-%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%a7%8b%e9%80%a0%e8%a7%a3%e8%aa%ac/2009-03-17" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=dTnTsGJ2I8U:bloSn1TDet4:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=dTnTsGJ2I8U:bloSn1TDet4:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/dTnTsGJ2I8U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/php/wordpress-%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%a7%8b%e9%80%a0%e8%a7%a3%e8%aa%ac/2009-03-17/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/php/wordpress-%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%a7%8b%e9%80%a0%e8%a7%a3%e8%aa%ac/2009-03-17</feedburner:origLink></item>
		<item>
		<title>[Wordpress] 管理画面のメタボックス表示･非表示を切り替えるプラグイン</title>
		<link>http://feedproxy.google.com/~r/spais/~3/k9rNErTs_oY/2009-02-19</link>
		<comments>http://spais.jp/wordpress/wordpress-%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e8%a1%a8%e7%a4%ba%ef%bd%a5%e9%9d%9e%e8%a1%a8%e7%a4%ba%e3%82%92%e5%88%87%e3%82%8a/2009-02-19#comments</comments>
		<pubDate>Thu, 19 Feb 2009 09:19:48 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=220</guid>
		<description><![CDATA[				と言うプラグインを公開しました。
				詳しくは管理画面のメタボックス表示･非表示を切り替えるプラグインへどうぞ。
				
]]></description>
			<content:encoded><![CDATA[				<p>と言うプラグインを公開しました。<br />
				詳しくは<a href="http://spais.jp/wordpress-plugins/meta_box_editor">管理画面のメタボックス表示･非表示を切り替えるプラグイン</a>へどうぞ。</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/wordpress/wordpress-%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e8%a1%a8%e7%a4%ba%ef%bd%a5%e9%9d%9e%e8%a1%a8%e7%a4%ba%e3%82%92%e5%88%87%e3%82%8a/2009-02-19" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=k9rNErTs_oY:jShGhPzqgno:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=k9rNErTs_oY:jShGhPzqgno:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/k9rNErTs_oY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/wordpress/wordpress-%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e8%a1%a8%e7%a4%ba%ef%bd%a5%e9%9d%9e%e8%a1%a8%e7%a4%ba%e3%82%92%e5%88%87%e3%82%8a/2009-02-19/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/wordpress/wordpress-%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e3%83%a1%e3%82%bf%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e8%a1%a8%e7%a4%ba%ef%bd%a5%e9%9d%9e%e8%a1%a8%e7%a4%ba%e3%82%92%e5%88%87%e3%82%8a/2009-02-19</feedburner:origLink></item>
		<item>
		<title>Windows XP の VMware Player に Windows7 beta をインストール</title>
		<link>http://feedproxy.google.com/~r/spais/~3/VJKRMF9s_Ag/2009-01-22</link>
		<comments>http://spais.jp/install/windows-xp-%e3%81%ae-vmware-player-%e3%81%ab-windows7-beta-%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/2009-01-22#comments</comments>
		<pubDate>Thu, 22 Jan 2009 01:17:25 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[VMware]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[install]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=210</guid>
		<description><![CDATA[				Windows7 beta の iso イメージをダウンロードして DVD に焼こうと思ったら光学メディアが調子悪くて3日くらいかけても全く焼ける気配がなかったので VMware で Windows7 beta  [...]]]></description>
			<content:encoded><![CDATA[				<p>Windows7 beta の iso イメージをダウンロードして DVD に焼こうと思ったら光学メディアが調子悪くて3日くらいかけても全く焼ける気配がなかったので VMware で Windows7 beta がインストールされている仮想イメージを見つけて uTorrent で落としたら圧縮ファイルが壊れててカッとなったのでディスクイメージ作って Windows7 beta インストールしました。</p>
				<p>手順は以下の通り。</p>
				<ol>
				<li><a href="http://www.h7.dion.ne.jp/~qemu-win/index-ja.html">QEMU on Windows</a> から qemu-x.x.x-windows.zip をダウンロード</li>
				<li>コマンドプロンプトを起動して以下を実行
				<div class="hl-main"><pre>F:\qemu-0.9.0-windows&gt; qemu-img create -f vmdk f:\windows7.vmdk 20G</pre></div>
				</li>
				<li>以下の内容で windows7.vmx を作成
				<pre>
config.version = "8"
scsi0.present = "TRUE"
memsize = "1024"
ide0:0.present = "TRUE"
ide0:0.fileName = "windows7.vmdk"
ide1:0.present = "true"
# iso イメージのあるパスを指定
ide1:0.fileName = "f:\7000.0.081212-1400_client_ja-jp_Ultimate-GB1CULFRE_JA_DVD.iso"
ide1:0.deviceType = "cdrom-image"
floppy0.fileName = "A:"
ethernet0.present = "true"
guestOS = "winxppro"
extendedConfigFile = "Windows7.vmxf"
displayName = "Windows7 beta"
virtualHW.version = "7"
virtualHW.productCompatibility = "hosted"
tools.upgrade.policy = "manual"
</pre>
				</li>
				</ol>
				<p>結構ぬるぬる動きますね。</p>
				<ul>
				<li><a href="http://www.microsoft.com/japan/windows/windows-7/beta-download.mspx">Windows7: ベータ版ダウンロード</a></li>
				<li><a href="http://www.vmware.com/jp/download/player/">VMware Playerのダウンロード、無償版のVMware &#8211; VMware</a></li>
				</ul>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/install/windows-xp-%e3%81%ae-vmware-player-%e3%81%ab-windows7-beta-%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/2009-01-22" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=VJKRMF9s_Ag:wAYuGAb6d-Y:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=VJKRMF9s_Ag:wAYuGAb6d-Y:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/VJKRMF9s_Ag" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/install/windows-xp-%e3%81%ae-vmware-player-%e3%81%ab-windows7-beta-%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/2009-01-22/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/install/windows-xp-%e3%81%ae-vmware-player-%e3%81%ab-windows7-beta-%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/2009-01-22</feedburner:origLink></item>
		<item>
		<title>Wordpress に web API インターフェースを追加するプラグイン</title>
		<link>http://feedproxy.google.com/~r/spais/~3/Sgz0Nk7jPiM/2009-01-16</link>
		<comments>http://spais.jp/wordpress/wordpress-%e3%81%ab-web-api-%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%bc%e3%83%95%e3%82%a7%e3%83%bc%e3%82%b9%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-01-16#comments</comments>
		<pubDate>Fri, 16 Jan 2009 08:55:26 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://spais.jp/?p=207</guid>
		<description><![CDATA[				と言うプラグインを公開しました。
				詳しくはWordpress に web API インターフェースを追加するプラグインへどうぞ。
				
]]></description>
			<content:encoded><![CDATA[				<p>と言うプラグインを公開しました。<br />
				詳しくは<a title="Wordpress に web API インターフェースを追加するプラグイン" href="http://spais.jp/wordpress-plugins/apiInterface">Wordpress に web API インターフェースを追加するプラグイン</a>へどうぞ。</p>
				<script src="http://feeds.feedburner.com/~s/spais?i=http://spais.jp/wordpress/wordpress-%e3%81%ab-web-api-%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%bc%e3%83%95%e3%82%a7%e3%83%bc%e3%82%b9%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-01-16" type="text/javascript" charset="utf-8"></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/spais?a=Sgz0Nk7jPiM:bZCqddW3NTY:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/spais?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/spais?a=Sgz0Nk7jPiM:bZCqddW3NTY:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/spais?d=spdCosxkSQE" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/spais/~4/Sgz0Nk7jPiM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spais.jp/wordpress/wordpress-%e3%81%ab-web-api-%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%bc%e3%83%95%e3%82%a7%e3%83%bc%e3%82%b9%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-01-16/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spais.jp/wordpress/wordpress-%e3%81%ab-web-api-%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%bc%e3%83%95%e3%82%a7%e3%83%bc%e3%82%b9%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/2009-01-16</feedburner:origLink></item>
	</channel>
</rss>
