<?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>1-byte.jp</title>
	<atom:link href="http://1-byte.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://1-byte.jp</link>
	<description>if ( $blog == &#34; Webエンジニアのためのライフハック &#34; ) { print &#34; 1-byte.jp &#34;; }</description>
	<lastBuildDate>Wed, 15 Jun 2011 05:46:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Pythonista見習いから、少しだけステップアップするための9クエスチョン from Quora</title>
		<link>http://1-byte.jp/2011/04/14/9_questions_to_become_bit_better_pythonista_from_beginner_from_quora/</link>
		<comments>http://1-byte.jp/2011/04/14/9_questions_to_become_bit_better_pythonista_from_beginner_from_quora/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 01:00:32 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[サービス]]></category>
		<category><![CDATA[初心者]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=998</guid>
		<description><![CDATA[
Pythonistaとしてステップアップするには何が必要か。
それは、
Pythonの弱みと強みを知ること
でしょう。
これは他言語にも言えます。
Pythonを含め、プログラミング言語は道具です。
道具を使うためには [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/04/python_question.png" alt="Python question" title="python_question.png" border="0" width="600" height="170" /></p>
<p><em>Pythonistaとしてステップアップするには何が必要か</em>。<br />
それは、</p>
<p><strong>Pythonの弱みと強みを知ること</strong></p>
<p>でしょう。</p>
<p>これは他言語にも言えます。</p>
<p>Pythonを含め、<em>プログラミング言語は道具です</em>。<br />
道具を使うためには、その道具の<em>最適な使い道</em>を知ってる必要があります。</p>
<p>ただ、このような情報は、なかなか手に入りません。<br />
ブログの記事は、<em>書いた人の好みのバイアスが掛かっているため、鵜呑みに出来ません</em>。</p>
<p>道具を使いこなすには、<em>自分自身で長時間、その道具に触れること</em>。<br />
そして、<strong>他の人がどのように使っているのか、知ること</strong>が必要です。</p>
<p>そうして、<em>その道具の強みと弱み</em>を見出していきます。</p>
<p>前者は、あなたがひたすらに、時間を費やすしかありません。<br />
しかし、<em>後者に関しては良い方法があります</em>。</p>
<p>それが、<a href="http://www.quora.com/">Quora</a>です。</p>
<ul>
<li><a href="http://www.quora.com/What-is-Quora-1">What is Quora? &#8211; Quora</a></li>
</ul>
<p>今日は、QuoraからPythonに関する質問をピックアップしていきます。</p>
<h3>Pythonの弱みは、何か？</h3>
<ul>
<li><a href="http://www.quora.com/What-are-the-main-weaknesses-of-Python-as-a-programming-language">What are the main weaknesses of Python as a programming language?</a></li>
</ul>
<p>まずは、<em>Pythonの弱みに関する質問</em>です。<br />
&#8220;<strong>Pythonを使っていて微妙に思う点</strong>&#8220;がまとまっています。</p>
<p>スコープに関する話、インデントに関する話、lambda式に関する話&#8230;。<br />
一度見ておくと、Pythonの弱みが見えてきます。</p>
<h3>なぜ、PythonはPHPより良いのか？</h3>
<ul>
<li><a href="http://www.quora.com/Why-is-Python-better-than-PHP">Why is Python better than PHP?</a></li>
</ul>
<p><a href="http://1-byte.jp">1-byte.jp</a>で取り上げる、もう一つの言語といえば<em>PHP</em>です。<br />
つまり、この質問は外せません。</p>
<p>&#8220;<strong>PHPとPythonの比較</strong>&#8220;がまとまっています。</p>
<p>PHPとPythonを両方使ったことがある人は、ここに書いてある内容に納得してしまいます。<br />
<em>確かに、Pythonではこんなことが出来て、PHPでは出来ないな&#8230;</em>と。</p>
<p>どのプログラミング言語を始めるべきか、悩んでいる人も読んでおくと良いかと。</p>
<h3>PHPにない、Pythonの便利な機能は？</h3>
<ul>
<li><a href="http://www.quora.com/What-useful-features-of-Python-don-t-have-an-equivalent-in-PHP">What useful features of Python don&#8217;t have an equivalent in PHP?</a></li>
</ul>
<p>こちらは、&#8221;<strong>PHPとPythonにおける機能面の比較</strong>&#8220;です。<br />
先程の記事とは違い、コードベースでPHPとPythonが比較されています。</p>
<h3>Pythonにはない、Rubyの良さは？</h3>
<ul>
<li><a href="http://www.quora.com/What-are-the-advantages-of-Ruby-over-Python">What are the advantages of Ruby over Python?</a></li>
</ul>
<p>この質問を読むと、<em>RubyとPythonがよく似た言語</em>であることがわかります。<br />
その中でも、&#8221;<strong>Pythonにはない、Rubyの使いやすい機能</strong>&#8220;がまとまっています。</p>
<p>これも、どの言語を始めるべきか、悩んでいる人にお勧めです。</p>
<p>ただし、Pythonistaがこれを読んでいると、Rubyも触りたくなるので、注意が必要です。</p>
<h3>比較演算子を2回書かずに、値をn以上m以下で比較できる言語は？</h3>
<ul>
<li><a href="http://www.quora.com/What-programming-languages-support-comparison-of-a-value-between-two-numbers-without-making-two-comparisons">What programming languages support comparison of a value between two numbers without making two comparisons?</a></li>
</ul>
<p>私は、この観点で言語を比較したことがありませんでした。<br />
確かに、</p>
<pre class="brush: php;">
if (1 &lt; $a and $a &lt; 10) {
	print 'True'
}
</pre>
<p>と書くのは<em>野暮ったい</em>ですよね。</p>
<h3>Pythonのデコレータの主な使い道は？</h3>
<ul>
<li><a href="http://www.quora.com/What-are-common-uses-of-Python-decorators">What are common uses of Python decorators?</a></li>
</ul>
<p>デコレータを理解すれば、<em>Pythonistaとしての幅が広がる</em>はずです。<br />
<strong>簡単な例と共に、デコレータの使い方</strong>が紹介されています。</p>
<p>まだ、デコレータなんて使ったことがない、という人にもお勧めです。</p>
<h3>皆が嫌いな言語は？</h3>
<ul>
<li><a href="http://www.quora.com/What-programming-language-do-people-hate-the-most-and-Why">What programming language do people hate the most?</a></li>
</ul>
<p>ブログでも良く、<em>この手の話</em>が議論されますね。<br />
俺はこの言語が嫌いだ。俺はPHPが嫌いだ。PHPなんて&#8230;(ｒｙ</p>
<p>筆頭に上がるのはPHPでしょうが、<em>それ以外の言語も</em>たくさん解答されています。<br />
言語の強みと弱みを知るために、読んでおくと良いかもしれません。</p>
<h3>どんな企業がPythonを使ってる？</h3>
<ul>
<li><a href="http://www.quora.com/Which-Internet-companies-use-Python">Which Internet companies use Python?</a></li>
</ul>
<p>この質問は、<strong>Quoraの真骨頂</strong>です。<br />
Quora上には、<em>有名な企業に務めるエンジニアがたくさんいます</em>。<br />
そのため、こういった質問には多くの答えが返ってきます。</p>
<p>どんな企業が、Pythonを活用しているのか。<br />
そして、自分たちがどの言語を使うべきなのか、見定めるのに参考になります。</p>
<h3>なぜ、QuoraはPythonを選んだのか？</h3>
<ul>
<li><a href="http://www.quora.com/Why-did-Quora-choose-Python-for-its-development">Why did Quora choose Python for its development?</a></li>
</ul>
<p><em>最後はQuoraに関する質問</em>で閉めましょう。<br />
Quoraは冒頭で述べたとおり、Pythonで出来ています。</p>
<p>この質問では、Quora創設者のAdamが<strong>Pythonと他言語と比較しながら、Pythonの優位性</strong>を語っています。<br />
Pythonの強みを知ることが出来ます。</p>
<p>いかがでしょうか。</p>
<p>ここに上げた質問はいずれも、ブログの記事として取り上げられません。<br />
また、あったとしても、<em>それはその人の意見です</em>。<br />
<strong>一度に、これほどたくさんの意見を得ることは出来ません</strong>。</p>
<p>また、QuoraがPythonで作られているせいなのか、<em>たくさんのPythonistaがいます</em>。<br />
新たに質問を作っても、すぐに答えてくれます。</p>
<ul>
<li><a href="http://www.quora.com/Whats-the-easiest-way-to-make-a-datetime-object-from-a-string-formatting-as-time-in-Python">What&#8217;s the easiest way to make a datetime object from a string formatting as time in Python?</a></li>
</ul>
<p>これは私が試しに投げた質問ですが、<strong>1時間で4つの解答が得られました</strong>。</p>
<p>ぜひ、Quoraを活用してください。<br />
そして、一緒に、Pythonistaとしてステップアップしていきましょう。</p>
<h3>おまけ</h3>
<p>Pythonに限らず、こんな質問も上がってたり。</p>
<ul>
<li><a href="http://www.quora.com/How-do-you-play-the-opening-chord-from-A-Hard-Days-Night?q=hard+days+night">How do you play the opening chord from &#8216;A Hard Day&#8217;s Night&#8217;?</a></li>
</ul>
<p>A Hard Days Nightのイントロのコードって、ビートルズの謎の一つなんですよね。</p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/04/14/9_questions_to_become_bit_better_pythonista_from_beginner_from_quora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新卒プログラマが押さえておくべきポイント &#8211; 長期か、短期か、それが問題だ</title>
		<link>http://1-byte.jp/2011/03/28/the_one_point_you_shoud_know_before_becoming_programmer/</link>
		<comments>http://1-byte.jp/2011/03/28/the_one_point_you_shoud_know_before_becoming_programmer/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 01:00:34 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=992</guid>
		<description><![CDATA[
まずは、個人的な話から。
会社を辞めて、ちょうど1年。Webサービスを作り始めて、4年以上経つでしょうか。
学校でプログラムを習い、それを基礎にWebサービスを作り始めました。
私は高専で、情報工学を専攻していました。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/the_one_point_you_shoud_know_before_becoming_programmer.jpg" alt="The one point you shoud know before becoming programmer" title="the_one_point_you_shoud_know_before_becoming_programmer.jpg" border="0" width="600" height="450" /></p>
<p>まずは、個人的な話から。<br />
会社を辞めて、ちょうど1年。<strong>Webサービスを作り始めて、4年以上経つでしょうか</strong>。<br />
学校でプログラムを習い、それを基礎にWebサービスを作り始めました。</p>
<p>私は高専で、<em>情報工学を専攻していました</em>。<br />
そのため、情報関連技術の基礎的なところは、ひと通り、学校で学んで来ました。</p>
<p>Webサービスを作り始めて、学校で学んだそれらの知識も役立っています。<br />
しかし、確実に学校だけでは、学べないことがあります。</p>
<p>それが、今回のテーマである&#8221;<strong>長期か、短期か、それが問題だ</strong>&#8220;です。</p>
<p>ここからは、私が感じる、<em>学生時代に学べなかった、これから学ぶべきこと</em>をまとめていきます。</p>
<h2>長期的視点を持つこと</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/long_way.png" alt="Long way" title="long_way.png" border="0" width="128" height="128" /></p>
<p><em>長期的視点</em>、それは言い換えると、&#8221;<strong>運用を考える</strong>&#8220;ということです。<br />
運用と一言に言っても、様々な運用があります。</p>
<ul>
<li>インフラの運用</li>
<li>サービスの運用</li>
<li>コードの運用</li>
</ul>
<p>インフラとサービスの運用はイメージが付きやすいでしょう。<br />
インフラの運用は、<em>サーバを含めたハードウェア周りを落とさずに運用すること</em>。<br />
サービスの運用は、<em>そのサービスがうまく回るように、様々なメンテナンスをしていくこと</em>。</p>
<p>恐らく、学校で<strong>プログラミング言語だけ</strong>を習った人は、コードの運用が理解しにくいでしょう。<br />
<em>コードの運用</em>、それはつまり、</p>
<p><strong>未来を考えてコードを組むこと</strong></p>
<p>です。<br />
それが、<em>オブジェクト指向設計</em>や、<em>言語自体の思想</em>、そして<em>良いコードとは何かと言う問い</em>に繋がります。</p>
<p><em>コードは必ず、変化します</em>。</p>
<p>プログラマは<em>ある問題を解決するために、コードを組みます</em>。<br />
そして、この問題を解決するコードが完成します。<br />
完成したコードに対して、この後、必ず次のことが起こります。</p>
<ul>
<li>完成したコードでは問題を完全に解決できなかった</li>
<ul>
<li> > <em>いわゆる、バグ</em></li>
</ul>
<li>問題自体が変わってしまった</li>
<ul>
<li> > <em>機能追加</em></li>
</ul>
</ul>
<p>会社に入ってコードを書くと、<em>この二つのことに頻繁に悩まされます</em>。</p>
<p>学生時代にも、コードは書きます。<br />
卒業研究のため、課題のため、自分の趣味のため&#8230;など。<br />
しかし、これらのコードには重要な点が抜け落ちています。<br />
これらのコードには、<strong>定期的なフィードバックがないのです</strong>。</p>
<p>学生時代に組むコードの多くは、<em>その場限りのコード</em>です。<br />
問題は変化しないし、長期的に運用することによるバグも発生しません。<br />
そのため、機能追加もなく、人のコードを読む必要がありません。</p>
<p>会社で組むコードは、<em>これの真逆</em>です。<br />
問題は変化し、長期的に運用することによるバグが発生します。<br />
新規にコードを組むよりも、機能追加のほうが多いでしょう。<br />
つまり、他の人が書いたドキュメントも存在しないコードを、読まねばなりません。</p>
<p>これが、新卒プログラマが初めに自覚すべき点だと、私は思います。</p>
<p><em>補足:</em><br />
ただし、学生時代からオープンソースに貢献してきた学生は、その限りではないかと。<br />
オープンソースほど、自分のコードが洗練される場はありません。<br />
先ほど述べた全ての点が、詰まっていますからね。</p>
<p>それと、学生時代の話は、私の経験上です。<br />
上記のようなコードばかりなのは、高専という特殊な場に居たせいかもしれません。<br />
大学ではもっと違うコードを書くよ。という話があれば、コメントください。<br />
参考になります。</p>
<h2>長期か、短期か、見分けること</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/long_or_short_way.png" alt="Long or short way" title="long_or_short_way.png" border="0" width="128" height="128" /></p>
<p>会社のために書くコードは、<em>全てが長期的であるべき</em>です。<br />
それは、<strong>そのコードが自分が会社を辞めた後も、運用される可能性</strong>があるから。</p>
<p>しかし、自分のためのコードはどうでしょう。<br />
これは、<em>逆に短期的なコードをたくさん書くべき</em>です。</p>
<p>ここで言う自分のためのコードとは、以下のようなコードです。</p>
<ul>
<li>複数のデータをまとめて処理するための、<em>エクセルのマクロ</em></li>
<li>ソースコード内の変数名を置き換えるための、<em>正規表現</em></li>
<li>フレームワークのソースを高速に編集するための、<em>vimのスクリプト</em></li>
<li>頻繁に行う処理を簡単にするための、<em>Linuxコマンドのワンライナー</em></li>
</ul>
<p>これらは全て、<em>自分の作業をコンピュータに任せるためのコード</em>です。</p>
<p><em>これは、コンピュータに任せられる！</em>と閃いたら、すぐにコードにしましょう。<br />
長期的なコードに必要な、テストも、抽象化も、全て不要です。<br />
あまり考えずに、ざっくり作っちゃいましょう。<br />
それらのコードは、<strong>自分で使っているうちに洗練されるはず</strong>です。</p>
<p>今、自分が書こうとしているコードは、長期的なのか、それとも短期的なのか、常に見極める必要があります。</p>
<h2>言語を極めること</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/which_language.png" alt="Which language" title="which_language.png" border="0" width="128" height="128" /></p>
<p><em>自分が使える言語を一つ以上、持ちましょう</em>。<br />
プログラミング言語の母国語のようなものです。<br />
その言語であれば、<strong>すぐにコードが思いつくレベルまで、言語を極めることが大事です</strong>。</p>
<p>このような言語が一つあると、まず、コードを書くのが早くなります。<br />
リファレンスも不要で、コードが書けます。<br />
集中してコーディングでき、効率が上がります。</p>
<p>言語を一つ極めると、他の言語の習得も早くなります。<br />
英語が話せるようになると、他の国の言葉も早く習得できるのにも、似ています。</p>
<p>基本的には、<em>各言語で方言があるだけ</em>。<br />
その方言の使い方を理解し、<em>それが内部的に何をしているか</em>、理解すること。</p>
<p>中途半端に、色々な言語をやるよりも、まず、<strong>一つの言語を極めたほうが良いでしょう</strong>。<br />
そうすれば、<em>自然と他の言語も話せるようになるんです</em>。</p>
<p>私は、PHP > Python > Cの順で、コードが書けます。<br />
(JavaやVBも書けますが、使いこなせるレベルじゃない)</p>
<p>Pythonを学んだときは、PHPの知識をベースに学びました。<br />
今は、Object-Cの勉強をしていますが、CとPHPと比べながら、学んでます。</p>
<p>自分の得意な言語があると、<em>それと新しい言語を比較しながら学習できます</em>。</p>
<p>言語を極めた基準の一つに、<strong>適切なテストコードが書ける</strong>、ということが挙げられます。</p>
<p>テストコードを書くには、かなりスキルが必要です。<br />
正直、簡単なロジックを組むよりも、適切なテストコードを書くほうが難しい。<br />
<em>抽象化し、テストし易くするために、その言語の特性を利用していくため</em>です。</p>
<p>逆に、テストコードほど、参考になるコードはありません。<br />
他の人の書いた、テストコードを、そして、テスト対象のコードを読むことで、<em>言語の理解が飛躍的に高まります</em>。</p>
<p>長々と書いてしまいましたが、まずは得意な言語を持ちましょう。<br />
<strong>どんな言語であれ、一つでも得意な言語があれば、色々とメリットがあるよ</strong>。ということが、言いたいのです。</p>
<p>正直、この記事には、まったく意味がないのかもしれません。<br />
なぜなら、これらのことに気付けない学生は、こんな記事を読んでいないだろうし。<br />
(そう、私自身そうでした。ま、こうやって自分を一般化するのは良くないんですけどね。)<br />
逆に、この記事にたどり着いた学生は、これらのことに少なからず気づいているはずです。</p>
<p>これを読んで、少しでも、楽しくプログラムを組める人が増えることを望みます。<br />
それに、私も更にステップアップして、次のレベルの記事が書ければ良いな。</p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/03/28/the_one_point_you_shoud_know_before_becoming_programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>より良いPHPerになるための20Tips</title>
		<link>http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/</link>
		<comments>http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 01:00:26 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング言語]]></category>
		<category><![CDATA[初心者]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=976</guid>
		<description><![CDATA[
去年の話ですが、海外でこんな記事が上がっていました。

20 Tips you need to learn to become a better PHP Programmer

記事の内容は、かなりレベルが低いです。
 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/write_clearly_php_code.jpg" alt="Write clearly php code" title="write_clearly_php_code.jpg" border="0" width="481" height="319" /></p>
<p>去年の話ですが、海外でこんな記事が上がっていました。</p>
<ul>
<li><a href="http://www.webgeekly.com/tutorials/php/20-tips-you-need-to-learn-to-become-a-better-php-programmer/">20 Tips you need to learn to become a better PHP Programmer</a></li>
</ul>
<p>記事の内容は、かなりレベルが低いです。<br />
しかし、<strong>初心者のうちに知っておけば、より早く成長出来るでしょう</strong>。</p>
<p>初心者PHPerのために、この記事の翻訳を載せます。</p>
<p><em>2011年03月21日 追記</em><br />
<ins datetime="2011-03-21T03:33:17+00:00"></p>
<ul>
<li><a href="http://suin.asia/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer">もっとより良いPHPerになるためのTips</a></li>
<li><a href="http://anond.hatelabo.jp/20110320223445">より良いPHPerにならないための20Tips</a></li>
</ul>
<p>この記事の補足が、他の方によって書かれています。<br />
この記事に対する自分の意見を、先に載せておくべきだったかも。<br />
実は<strong>色々と痛い目を見ると、この下の記事の悪いところと、上記記事の良いところがわかります</strong>。<br />
だけど、初めはわからないんですよね&#8230;。<br />
</ins></p>
<h2>20 Tips you need to learn to become a better PHP Programmer</h2>
<p>PHPは、同じオブジェクトの扱い方でも複数の書き方を持っている、とても気まぐれなプログラミング言語だ。<br />
詳しくは、私の書いた&#8221;<a href="http://www.webgeekly.com/tutorials/php/the-art-of-programming/">The Art of Programming</a>&#8220;を読むと良い。<br />
これから書くTipsは、過去のプロジェクトから私が学んだコードの可読性、メンテナンス性を上げ、あなたを素晴らしい、より進んだPHPプログラマーにするものだ。</p>
<p>それじゃ、始めよう。</p>
<h3>1. &lt;?phpと?&gt;を使え</h3>
<p>スクリプトを書くにあたり、&lt;?と?&gt;を使うのを忘れること。<br />
これらを使ったスクリプトがあなたのサーバで動いたとしても、他のサーバで動かないかもしれない。</p>
<p>同様に、変数をechoするときもショートタグを使うのを止めるんだ。<br />
慣れた人がこれを使うのを止めるのは、正直、難しい。<br />
けど、止めることで最終的にポータブルなコードが書けるんだ。</p>
<pre class="brush: php;">
&lt;? ... ?&gt; // Incorrect
&lt;?php ... ?&gt; // Correct
</pre>
<pre class="brush: php;">
&lt;?=$Var?&gt; // Incorrect
&lt;?php echo $Var ?&gt; // Correct
</pre>
<h3>2. 設定ファイルを分離せよ</h3>
<p>あなたのスクリプトファイルに設定値が追加すべきであるということは、言うまでもないよね。<br />
あなたはいつでも、設定ファイルを分離して、スクリプトの頭でインクルードすべきだ。<br />
こうしておけば、設定を書き換える必要が出てきても、設定ファイルの一部を書き換えるだけで良い。<br />
ファイルのインクルードはとても簡単だ。</p>
<pre class="brush: php;">
&lt;?php
include(&quot;config.php&quot;);

// code goes here ...
</pre>
<h3>3. コメントは君の友達</h3>
<p>そう、あなたはこんな状況に遭遇したことがあるんじゃ？<br />
私たちが少し前に書いたコードを理解出来なくなるのは、本当に驚くべきことだ。<br />
コメントは、そのときに考えていたことを思い出させてくれる。<br />
シンタックスはこう。</p>
<pre class="brush: php;">
&lt;?php
// Line One Comment
// Line Two Comment

/** Paragraph Comment
Paragraph Comment
Paragraph Comment **/
</pre>
<p>簡単でしょ？</p>
<h3>4. インデントとスペースを使え</h3>
<p>まったく正しくインデントされていない、誰が書いたかわからないコードを変更することほど、最低なことはないね。<br />
正しくインデントされたコードは、あなたがプログラマーだってことを示している。<br />
理想的なコードは、ループがそこで終わりだか、終わりでないんだか、が一目で分かるんだ。<br />
これは、不適切にインデントされたコードだ。</p>
<pre class="brush: php;">
&lt;?php
function  dothisformula($a,$b) { $c = $b+$a;
     $e=3;
while ($c &lt; 20) {
$e = $e - 1; $c = $c + 1; }
     return $e; }
</pre>
<p>そして、こっちが正しいコード。</p>
<pre class="brush: php;">
&lt;?php
function dothisformula($a, $b) {
     $c = $b + $a;
     $e = 3;
     while ($c &lt; 20) {
          $e = $e - 1;
          $c = $c + 1;
     }
     return $e;
}
</pre>
<p>スペースの重要性が分かった？</p>
<h3>5. 変数名に意味を持たせよ</h3>
<p>変数に意味を持たせることは、いつもあなたのためになる。<br />
データの型まで分かると、更に良い。<br />
例えば、integer型の変数には、変数名のプレフィックスとしてiをつける。<br />
変数に型宣言しないPHPにおいて、これは特に重要だ。</p>
<p>変数名の頭文字を大文字にするかどうかは、あなた次第だ。<br />
しかし、読み易さから言っても、単語の先頭は大文字にすることをお勧めする。</p>
<p>こんな感じだ。</p>
<pre class="brush: php;">
&lt;?php
$iNumber = 10; // For Integers

$sName = &quot;Marc&quot;; // For Strings

$fPi = 3.14159265; // For Floats

$aNames = array(); // For Arrays

$oUser = new User(); // For Objects

$bIsMember = false; // For Booleans
</pre>
<h3>6. 変数を初期化せよ</h3>
<p>PHPでは、変数に値を代入するたびに、自動で変数を定義してくれる。<br />
しかし、変数を使う前に初期化するのは、良い癖だ。<br />
これをすることで、コードが明確になるし、変数の内容があなたの思い通りの値になる。</p>
<pre class="brush: php;">
&lt;?php
$aArray = array();
$iInteger = 0;
$bBoolean = false;
Boolean is False, unless True
</pre>
<h3>7. 返り値は常にFalseに、Trueじゃない限りは</h3>
<p>もし、あなたが特定の値であるか、どうかを判定するコードを書いたとする。<br />
そのコード判定は望む値になった場合を除き、常にfalseを返すべきだ。<br />
例えば、以下のようなコードは書かない方が良い。</p>
<pre class="brush: php;">
&lt;?php
function getStatus() {
    $bReturn = true;
    if ($i != 2) $bReturn = false;
    return $bReturn;
}
</pre>
<p>この代わりに、あなたはこう書くべきだ。</p>
<pre class="brush: php;">
&lt;?php
function getStatus() {
    $bReturn = false;
    if ($i == 2) $bReturn = true;
    return $bReturn;
}
</pre>
<p>二番目の例は、値をチェックする場合の理想的な方法だ。<br />
なぜかって？あなたがデータベースから値を取り出すときを、想像してみて欲しい。<br />
もし、何かしらの理由で、あなたの書いたif文が間違っていたら？<br />
この書き方をしていれば、間違った値に対して、常にfalseが返る。<br />
私たちが、PHPでsensitiveなデータを取り扱うなら、正しいデータが入力されるまでは、動かないコードを書くべきだ。<br />
これは私の経験上、特にね。</p>
<p>最終的に、バリデーションとは、あなたのデータがあなたの思い描く通りであるか、それともそうでないかを判断するべきものだ。</p>
<h3>8. 配列のキーにアクセスする場合はクオートで囲う</h3>
<p>配列にアクセスする場合、以下のどちらのコードでもPHPでは動く。</p>
<pre class="brush: php;">
&lt;?php
$sName = $aNames['marc'];
$sName = $aNames[marc];
</pre>
<p>二つ目のコードは、PHPはまず始めに、marcと名付けられた定数を探しに行き、もし存在すればその値に置き換える。<br />
そう、大抵の場合、これでも動く。<br />
しかし、もし、同じ名前の定数が定義されていたら？<br />
その場合、あなたのスクリプトは動作しなくなるんだ。</p>
<h3>9. echoするときにはコンマを使え</h3>
<p>もし、文字列を変数の値と一緒に出力するとき、PHPではドットの代わりにコンマを使うことが使える。<br />
なぜ？ドットを使うよりも僅かに速いからね(以下のコードでテストした場合は)。</p>
<pre class="brush: php;">
&lt;?php
echo &quot;Hello, my name is &quot;, $sName;
</pre>
<p>以下の代わりに上記のコードを使う。</p>
<pre class="brush: php;">
&lt;?php
echo &quot;Hello, my name is &quot; . $sName;
</pre>
<h3>10. 三項演算子を使え</h3>
<p>もし、シンプルなif文を書きたいなら、三項演算子を使って、ワンラインで通常のif文を書くのと同じことが書ける。</p>
<pre class="brush: php;">
&lt;?php
if ($a == 1) $b = 2;
else $b = 3;
</pre>
<p>上記のコードは、以下の三項演算子を使ったのと同じことだ。</p>
<pre class="brush: php;">
&lt;?php
$b = ($a == 1) ? 2 : 3;
</pre>
<p>簡単でしょ？三項演算子は、以下のようによく使われるね。</p>
<pre class="brush: php;">
&lt;?php
$variable = (CONDITION) ? IFTRUE : IFFALSE;
Use === for Boolean Checks
</pre>
<h3>11. 真偽値のチェックには===を使え</h3>
<p>もし、あなたが変数がtrueかfalseか、チェックしなければ行けない場合、==よりも===を使おう。<br />
この三つ連なるイコールは、PHPに値のチェックと同時に、タイプのチェックまでさせる。</p>
<pre class="brush: php;">
&lt;?php
if ($bIsMember == true) { ... } // Incorrect
if ($bIsMember === true) { ... } // Correct
Use ++ and — Operators
</pre>
<h3>12. ++と&#8211;の演算子を使え</h3>
<p>整数を減少あるいは増加させる場合、インクリメントあるいはデクリメントの演算子が使える。<br />
もし、あなたがこんなコードを書いているなら、</p>
<pre class="brush: php;">
&lt;?php
$iNumber = $iNumber  + 1;
$iNumber2 = $iNumber2 - 1;
</pre>
<p>こう変換すべきだ。</p>
<pre class="brush: php;">
&lt;?php
$iNumber++;
$iNumber2--;
</pre>
<p>この演算子の優れているところは、他演算の実行中にも使えることだ(例えば、ifとかwhileのステートメントだ)。<br />
++とか&#8211;の演算子は、変数の前に置くか、後に置くかで、動作が異なる。<br />
前に置けば、その動作が完了する前に、後に置けば、その動作が完了した後にインクリメント、あるいはデクリメントが実行される。<br />
以下の例は、あなたの、この演算子の理解を助けてくれるだろう。</p>
<pre class="brush: php;">
&lt;?php
$iNumber = 10;
while ($iNumber++ == 10) { ... }
// インクリメント演算子が、比較後に実行される。
//  つまり、このwhileの中は1度だけ実行される。

$iNumber = 10;
if (--$iNumber == 10) { ... }
// デクリメント演算子が、比較前に実行される。
// つまり、このwhileの中は1度も実行されない。 

$iNumber = 10;
$iTotal = $iNumber++;
// $iTotalは10だ。

$iNumber = 10;
$iTotal = --$iNumber;
// $iTotalは9だ。
</pre>
<h3>13. 代入演算子を使え</h3>
<p>もし、あなたが2以上の数値をインクリメントあるいは、デクリメントしたいとする。<br />
その場合、代入演算子が便利だ。<br />
もし、こんなコードがあったとしたら、</p>
<pre class="brush: php;">
&lt;?php
$a = $a + $b;
$a = $a * 5;
$a = $a - $d;
$a = $a / 3;
</pre>
<p>代入演算子を使って、次のように書き直せる。</p>
<pre class="brush: php;">
&lt;?php
$a += $b;
$a *= 5;
$a -= $d;
$a /= 3;
</pre>
<p>これは、もちろん文字列にも使える。次の二行のコードは同じ意味だ。</p>
<pre class="brush: php;">
&lt;?php
$sString = $sString . &quot;hello&quot;;
$sString .= &quot;hello&quot;;
</pre>
<h3>14. 変数のdump関数を作れ</h3>
<p>私たちは、テストをする上で変数の値を確認するためによく、print_rにはお世話になる。<br />
これをさらに簡単にするために、次のような関数を作ろう。</p>
<pre class="brush: php;">
&lt;?php
function p($var) {
    echo &quot;&lt;pre&gt;&quot;;
    print_r($var);
    echo &quot;&lt;/pre&gt;&quot;;
}
</pre>
<p>これはあなたの変数dumpを常に、読みやすいようにpreタグで括る物だ。<br />
ついでに、関数名を一文字にすることで、使いやすくもなる。</p>
<h3>15. 定数を使え</h3>
<p>もし、変更されない変数を使ってるんだとしたら、それは書き直せる必要はないよね。<br />
よくアクセスする、例えばディレクトリパスやエラーメッセージなどは、定数化しよう。<br />
定数名には、全て大文字を使うことをお勧めする。<br />
こうすることで、コード中でそれが定数であることが、わかりやすくなる。</p>
<pre class="brush: php;">
&lt;?php
define (&quot;DIRECTORY&quot;,&quot;/path/to/site/&quot;);

echo DIRECTORY;
</pre>
<h3>16. $_GETと$_POSTを使え</h3>
<p>$_REQUEST変数のことは忘れよう。<br />
URLからGETパラメータが欲しいときは$_GETを、フォームからPOSTパラメータが欲しいときは、$_POSTを使おう。</p>
<pre class="brush: php;">
&lt;?php
$sAction = $_GET['actions'];

$sName = $_POST['name'];
</pre>
<p>こうすることで外部のユーザは、URLを操作することによって、フォームの値を変更出来なくなる。</p>
<h3>17. 関数の代わりにオブジェクトを使え</h3>
<p>もし、たくさんの引数と共に関数を使っていたのなら、それはオブジェクトに移行するときが来たのだ。<br />
私は、メンテナンスのしにくい、とても複雑な関数が定義されているプロジェクトで働いていたこともある。<br />
そう、引数が20個もある関数がいくつか定義されているのだ。<br />
こんなとき、あなたは変数の呼び出し方法を変更する必要があるだろう、それも全ての関数において。<br />
この関数では、</p>
<pre class="brush: php;">
&lt;?php
function getProducts($iParameter1, $iParameter2,
$iParameter3, $iParameter4, $iParameter5,
$iParameter6, $iParameter7, $iParameter8,
 $iParameter9) { ... }
</pre>
<p>こう変更することが出来る。</p>
<pre class="brush: php;">
&lt;?php
$oProducts-&gt;setParameter1(...);
$oProducts-&gt;setParameter3(...);
$oProducts-&gt;setParameter5(...);
$oProducts-&gt;setParameter6(...);
$oProducts-&gt;getProducts();
</pre>
<h3>18. メソッドチェインを使え</h3>
<p>もし、あなたが複数回オブジェクトのメソッドを呼び出し、変数にセットするなら、メソッドチェインを使うことで、コードをシンプルに出来る。<br />
メソッドチェインの方法は簡単で、各メソッドに返り値に$thisをセットするだけだ。<br />
次のコードは、</p>
<pre class="brush: php;">
&lt;?php
class User {

    function setThis($iVar) {
        ....
        return $this;
    }

    function setThis2($iVar2) {
        ....
        return $this;
    }

}
</pre>
<p>次のようにメソッドチェインに書き換えることが出来る。</p>
<pre class="brush: php;">
&lt;?php
$oUser = new User();
$oUser-&gt;setThis(...)
      -&gt;setThis2();
</pre>
<p>これであなたのコードは、より短く、より素晴らしくなるよ。</p>
<h3>19. コードの繰り返しを止めよ</h3>
<p>どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。<br />
それか、オブジェクトに変えてしまえ。この作業は面倒かもしれない。<br />
しかし、アプリケーションが大きくなればなるほど、その対価を支払う価値がある。<br />
簡単な例は以下だ。</p>
<pre class="brush: php;">
&lt;?php
$a = 1;
while ($a &lt; 10) {
    $b = $a * 10;
    $c = $b * 2;
    $d = $c * $b;
    echo $d;
    $a++;
}
</pre>
<p>これは、次のように書き換えれる。</p>
<pre class="brush: php;">
&lt;?php
function multiply($iVar, $iVar2) {
     return ($iVar*$iVar2);
}

$a = 1;
while ($a &lt; 10) {
    $b = multiply($a, 10);
    $c = multiply($b, 2);
    $d = multiply($c, $b);
    echo $d;
    $a++;
}
</pre>
<p>もちろん、これはとても簡単な例だ。<br />
この方法は、コードの繰り返し箇所が多くなればなるほど、より便利になる。</p>
<h3>20. 結合度を減らし、独立性を保て</h3>
<p>結合度は一つのコンポーネントを変えたときに、どれだけのコンポーネントに影響を与えるか、ってことだ。<br />
言い方を変えると、もしあなたがある関数を変えたとして、他の関数を変える必要があるかどうか、ということ。<br />
結合度を下げること、それはつまり、他に影響を与えないようにコンポーネントを変更することだ。<br />
一方で、独立性はそれぞれを意味のあるユニットに分けることだ。<br />
あなたのメイン関数は、全てのことを担ってる？<br />
それとも、たくさんの特定の仕事をする関数から出来てる？<br />
もし、そうなら、強い独立性を持っていることになる。強い独立性を持つと、その関数の責任が明確になり、その関数が自分に関係ない処理を行う場合に、他の関数を呼び出すようになる。</p>
<p>PHPプログラマの諸君は、コンポーネントを定義する場合、アプリケーションのメンテナンスを楽に、そして拡張性を高めるために、結合度を弱くし、独立性を強くするように気をつけるべきだ。<br />
例え、関数を一つ作るだけであっても、このことは心に留めておくべきだ。<br />
独立性の高いコードを常に正しく追加しよう。<br />
そうすれば、あなたがシステムの一部を変更する場合に、他の部分を変更しなくても良くなるんだ。</p>
<p>こんなコードがあったとしよう(もちろん、これはシンプルな例だが)</p>
<pre class="brush: php;">
&lt;?php
// We want to add two numbers
// only if the first number is
// lower than 5

function add($iVar, $iVar2) {
    if ($iVar &lt; 5) return false;
    else $iResult = $iVar+$iVar2;
    echo &quot;The Result is &quot;, $iResult;
}

$iVar = 3;
$iVar2 = 2;
add($iVar, $iVar2);
</pre>
<p>この例は、バリデーションを関数内に含んでいることで、独立性が弱く、結合度が高くなってしまっている。<br />
結果の出力を関数内に置くことは、それ自体大きな問題だ。<br />
もし、この関数を複数箇所で使っていたとして、テキストを変更したい場合に、全ての箇所の変更を考慮しなければいけないのだから。</p>
<p>もっと良いのは次のコードだ。</p>
<pre class="brush: php;">
&lt;?php
// We want to add two numbers
// only if the first number is
// lower than 5

function addd($iVar, $iVar2) {
    return $iVar + $iVar2;
}

function result($sMessage) {
    return &quot;The Result is &quot; . $sMessage;
}

$iVar = 3;
$iVar2 = 2;

if ($iVar &lt; 5) {
    echo result(add($iVar, $iVar2));
}
</pre>
<p>こうすることで、addとresultの関数をコードの至る所で使うことが出来る。<br />
そして、他のコードを気にすることなく、各関数を変更することが出来るんだ。</p>
<h3>最後に</h3>
<p>このTipsは分かりやすく、短く、そしてよりまとまったコードを書くのを助けてくれる。<br />
これらの例はとてもシンプルだが、それぞれのコンセプトを理解するのに役立つものだ。<br />
もし、あなたがこれらの一つにでも同意出来ないなら、ブログにコメントを。<br />
私たちはそこからさらに、学べる。</p>
<h3>おまけ</h3>
<p>もし、あなたがPHPプログラマなら、<a href="http://php.net/manual/ja/index.php">公式のPHPドキュメント</a>はあなたのバイブルだ。<br />
私は、それぞれのセクションを眺めて、各関数でどんなことが出来るのか確認することをお勧めする。<br />
あなたは、PHPで用意された既製関数で多くのことが実現できることに、驚くはずだ。</p>
<p>この記事があなたの役に立つことを。<br />
どんなコメントでも待ってます。<br />
ありがとう！</p>
<h2>個人的な感想</h2>
<p>この記事に書かれている内容は、<em>レベルがかなり低い</em>です。<br />
例えば、&#8221;4. インデントとスペースを使え&#8221;。<br />
これはプログラマとしては、<em>当たり前のこと</em>です。</p>
<p>しかし、ここに書かれている大半のことは、多くの初心者PHPerが迷うことでもあります。<br />
記事の途中でもありますが、PHPは&#8221;<strong>多くの書き方が出来る気まぐれな言語</strong>&#8220;です。<br />
だからこそ、これらのことを知らずに、何となくプログラムが書けるようになったとき、<em>そこで満足してしまい、良いコードが書けなくなる</em>のでしょう。</p>
<p>私自身、PHPを始めたときに、この記事を知っていれば<em>もっと早く良いコードが書けるようになったのでは</em>、と思います。</p>
<p>初心者PHPerの皆さんは、この記事を足がかりに、<strong>コードを洗練させていってください</strong>。<br />
(<em>個人的なおまけ</em>: より良いコードを書くには、より良い人のコードを読むことが大事ですよ！)</p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP開発者が知るべき10のこと</title>
		<link>http://1-byte.jp/2011/03/09/10_things_you_must_know_about_cakephp/</link>
		<comments>http://1-byte.jp/2011/03/09/10_things_you_must_know_about_cakephp/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 01:00:21 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[まとめ]]></category>
		<category><![CDATA[テスト]]></category>
		<category><![CDATA[デプロイ]]></category>
		<category><![CDATA[プラグイン]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[学習]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=955</guid>
		<description><![CDATA[
先日、こんな記事が上がっていました。

Android開発者が知るべき10のこと

この記事でまとまっているのは、Android開発において必要な10の項目です。
インターフェースの設計から、データの取り扱いまで。
A [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/10_things_you_must_know_about_cakephp.png" alt="10 things you must know about cakephp" title="10_things_you_must_know_about_cakephp.png" border="0" width="600" height="250" /></p>
<p>先日、こんな記事が上がっていました。</p>
<ul>
<li><a href="http://techbooster.jpn.org/application/3505/">Android開発者が知るべき10のこと</a></li>
</ul>
<p>この記事でまとまっているのは、<em>Android開発において必要な10の項目</em>です。<br />
インターフェースの設計から、データの取り扱いまで。</p>
<p>AndroidはモバイルデバイスのOSで、CakePHPは単なるWebフレームワーク。<br />
しかし、<strong>予め用意されたルールやAPIを活用する点は同じ</strong>です。<br />
つまり、フレームワーク全般において、開発者が知るべきことをまとめることが出来るはずです。</p>
<p>ここでは、私が良く利用するCakePHPフレームワークについて、<em>開発者が知るべき10のこと</em>をまとめます。</p>
<p><ins datetime="2011-03-09T08:40:23+00:00"><br />
フォーラムにこの記事を書き込んだところ、shunさんがtipsを追記してくれています！<br />
モデルに、配列を取り入れた経緯などを紹介してくれています。<br />
こちらも併せてどうぞ。</p>
<ul>
<li><a href="http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2575&#038;forum=3&#038;post_id=6526#forumpost6526">CakePHP開発者が知るべき10のこと</a></li>
</ul>
<p></ins></p>
<h2>1. CakePHPで良いのか</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephp_logo.png" alt="Cakephp logo" title="cakephp_logo.png" border="0" width="125" height="125" /></p>
<p>CakePHPを使う際に、知るべきことその1。<br />
それは、<strong>あなたは本当にCakePHPを使うべきなのか</strong>ということです。</p>
<p>現在、あらゆるフレームワークが溢れ返っています。</p>
<ul>
<li><em>Ruby</em></li>
<ul>
<li>Ruby On Rails</li>
<li>Sinatra</li>
</ul>
<li><em>Python</em></li>
<ul>
<li>Django</li>
<li>Pylons</li>
<li>Juno</li>
</ul>
<li><em>Perl</em></li>
<ul>
<li>Catalyst</li>
<li>CGI::Application</li>
</ul>
<li><em>PHP</em></li>
<ul>
<li>CakePHP</li>
<li>Zend Framework</li>
<li>Symforny</li>
<li>Lemonade</li>
</ul>
<li><em>Java</em></li>
<ul>
<li>Stuts</li>
<li>Slim3</li>
</ul>
</ul>
<p>これだけあるフレームワークの中で、<em>なぜ、私はCakePHPを選ぶのか</em>。</p>
<p>そもそも、<strong>その開発に使う言語は、本当にPHPで良いのか</strong>。<br />
なぜ、PHPを使うのか。</p>
<p>例えば、Quoraを立ち上げた、Facebookの元CTOのAdam D&#8217;Angeloさんはこんなことを言っています。</p>
<blockquote><p>
PHP was out of the question. Facebook is stuck on that for legacy reasons, not because it&#8217;s the best choice right now. Our main takeaway from that experience is that programming language choice is very important and is extremely costly to change.
</p></blockquote>
<p><cite><a href="http://www.quora.com/Why-did-Quora-choose-Python-for-its-development">Why did Quora choose Python for its development?</a></cite>より</p>
<p>少し、古い記事ですが、現在のウェブではこれが現実でしょう。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/nowokay/20091019">PHPの価値が相対的に落ちてJavaの価値があがっていく</a></li>
</ul>
<p><em>Google App Engine</em>、<em>Amazon AWS</em>、あるいは<em>その他のPaaS</em>。<br />
環境を用意するのは、昔ほど難しくありません。<br />
そして、コストもさほど高くありません。</p>
<p>私は、&#8221;<em>PHP/CakePHPを使うな</em>&#8220;と言っているのではありません。<br />
盲目的にならず、その開発がどんなものかを考えて、フレームワーク選ぶべきだと言っているのです。</p>
<p>これは、<em>CakePHPに限ったことではありませんが</em>。</p>
<h2>2. CakePHPの癖を知る</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_model.png" alt="Cakephps model" title="cakephps_model.png" border="0" width="128" height="128" /></p>
<p>CakePHPを使うとして、次に知るべきことは<em>CakePHPの癖</em>です。<br />
<strong>特にデータの取り扱い、つまりモデル周りには、癖があります</strong>。</p>
<pre class="brush: python;">
&gt;&gt;&gt; from mysite.polls.models import Poll, Choice # モデルクラスを import します。 

# まだ Poll は一つもできていません。
&gt;&gt;&gt; Poll.objects.all()
[]

# 新たな Poll を作成しましょう。
&gt;&gt;&gt; import datetime
&gt;&gt;&gt; p = Poll(question=&quot;What's up?&quot;, pub_date=datetime.datetime.now())

# 出来たオブジェクトをデータベースに保存します。 save() は明示的に呼ば
# ねばなりません。
&gt;&gt;&gt; p.save() 

# これでオブジェクトに ID が割り当てられました。お使いのデータベースに
# よっては、この値は &quot;1&quot; ではなく &quot;1L&quot; のときもあります。心配することは
# ありません。単にデータベースバックエンドが Python 長整数型で値を返す
# ようになっているだけのことです。
&gt;&gt;&gt; p.id
1

# データベースの各カラムに Python の属性としてアクセスします。
&gt;&gt;&gt; p.question
&quot;What's up?&quot;
&gt;&gt;&gt; p.pub_date
datetime.datetime(2007, 7, 15, 12, 00, 53)

# 属性を変更して save() を呼び出すとカラムの値を変更します。
&gt;&gt;&gt; p.pub_date = datetime.datetime(2007, 4, 1, 0, 0)
&gt;&gt;&gt; p.save() 

# objects.all() はデータベース上の全ての Poll を返します。
&gt;&gt;&gt; Poll.objects.all()
[&lt;Poll: Poll object&gt;]
</pre>
<p><cite><a href="http://djangoproject.jp/doc/ja/1.0/intro/tutorial01.html#id5">はじめての Django アプリ作成、その1</a></cite>より</p>
<pre class="brush: ruby;">
&gt;&gt; p = Post.new(:content =&gt; &quot;A new post&quot;)
=&gt; #&lt;Post id: nil, name: nil, title: nil,
     content: &quot;A new post&quot;, created_at: nil,
     updated_at: nil&gt;
&gt;&gt; p.save
=&gt; false
&gt;&gt; p.errors
=&gt; #&lt;OrderedHash { :title=&gt;[&quot;can't be blank&quot;,
                           &quot;is too short (minimum is 5 characters)&quot;],
                   :name=&gt;[&quot;can't be blank&quot;] }&gt;
</pre>
<p><cite><a href="http://guides.rubyonrails.org/getting_started.html#the-model">Ruby on Rails Guides: Getting Started with Rails: 6.6 Using the Console</a></cite>より</p>
<p>PythonやRubyは、<em>あらゆるものをオブジェクトとして扱います</em>。<br />
そのため、データをインサートする際にも、まず、モデルのインスタンスを生成します。<br />
その後、インサート用のメソッドを呼び出し、インサートを完了させます。</p>
<p>しかし、CakePHPではデータを配列で扱います。<br />
データをインサートする際も、新しいインスタンスを作ったりしません。</p>
<pre class="brush: php;">
function edit($id) {
    //POST された form データがあるか？
    if(!empty($this-&gt;data)) {
        //form データが有効で保存できた場合...
        if($this-&gt;Recipe-&gt;save($this-&gt;data)) {
            //セッションにフラッシュメッセージをセットしリダイレクトする
            $this-&gt;Session-&gt;setFlash(&quot;Recipe Saved!&quot;);
            $this-&gt;redirect('/recipes');
        }
    }

    //form データがない場合、編集する recipe を検索し
    //ビューに渡す
    $this-&gt;set('recipe', $this-&gt;Recipe-&gt;findById($id));
}
</pre>
<p><cite><a href="http://book.cakephp.org/ja/view/1031/データを保存する">3 CakePHPによる開発: 3.7.4 データを保存する</a></cite>より</p>
<p>このことを知らなければ、あなたは<strong>foreachと配列の地獄に落ちるでしょう</strong>。<br />
CakePHPでは、これをすっきりと記述するためにSetクラスが存在します。</p>
<ul>
<li><a href="http://book.cakephp.org/ja/view/1487/Set">8 コアユーティリティライブラリ: 8.5 Set</a></li>
</ul>
<p>Setクラスを活用し、配列地獄に落ちないように、気をつけましょう。</p>
<h2>3. 高速開発手法を知る</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_develop.png" alt="Cakephps develop" title="cakephps_develop.png" border="0" width="128" height="128" /></p>
<p>せっかく、フレームワークを使うのだから、その資産を利用しましょう。<br />
フレームワークの資産、それは<strong>プラグイン</strong>です。</p>
<ul>
<li><a href="http://1-byte.jp/2010/09/06/introduce_cakephp_plugins/">CakePHPプラグインのまとめ – 総括編</a></li>
</ul>
<p>例えば、あなたが<em>twitter連携機能</em>を開発しているとします。<br />
必要なのは、あなたの書いたコードでなく、これらのプラグインです。</p>
<ul>
<li><a href="https://github.com/tfmagician/CakePHP-Twitter-API-Plugin">tfmagician / CakePHP-Twitter-API-Plugin</a></li>
<li><a href="https://github.com/hiromi2424/CakePHP-Bitly-Helper">hiromi2424 / CakePHP-Bitly-Helper</a></li>
</ul>
<p><em>Facebook連携機能</em>をエンハンスするとします。</p>
<ul>
<li><a href="https://github.com/webtechnick/CakePHP-Facebook-Plugin">webtechnick / CakePHP-Facebook-Plugin</a></li>
</ul>
<p>さらに、<em>携帯サイト</em>に対応するとします。</p>
<ul>
<li><a href="https://github.com/MASA-P/KtaiLibrary">MASA-P / KtaiLibrary</a></li>
</ul>
<p>これらのプラグインを作り、公開してくれる人はだいたい決まっています。<br />
その人たちを把握しておきましょう。</p>
<ul>
<li><em>国内</em></li>
<ul>
<li><a href="https://github.com/hiromi2424">hiromi2424</a></li>
<li><a href="https://github.com/ichikaway">ichikaway</a></li>
<li><a href="https://github.com/MASA-P">MASA-P</a></li>
<li><a href="https://github.com/k1LoW">k1LoW</a></li>
</ul>
<li><em>海外</em></li>
<ul>
<li><a href="https://github.com/CakeDC">CakeDC</a></li>
<li><a href="https://github.com/cakephp">CakePHP</a></li>
<li><a href="https://github.com/webtechnick">webtechnick</a></li>
<li><a href="https://github.com/josegonzalez">josegonzalez</a></li>
<li><a href="https://github.com/mcurry">mcurry</a></li>
<li><a href="https://github.com/markstory">markstory</a></li>
<li><a href="https://github.com/AD7six">AD7six</a></li>
<li><a href="https://github.com/predominant">predominant</a></li>
<li><a href="https://github.com/mariano">mariano</a></li>
<li><a href="https://github.com/neilcrookes">neilcrookes</a></li>
</ul>
</ul>
<p>順不同、敬称略です。<br />
<em>複数のCakePHPプラグイン</em>を公開している方をまとめました。<br />
全てgithubへのリンクとなっているので、フォローしておくと良いでしょう。</p>
<h2>4. 学習方法を知る</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_study.png" alt="Cakephps study" title="cakephps_study.png" border="0" width="128" height="128" /></p>
<p>CakePHPを学ぶ方法を知ることは、あなたのためにも、そしてあなたの周りに居る人のためにもなります。</p>
<p>あなたの作ったウェブサイトを、<em>後輩に引き継ぐかもしれない</em>。<br />
あるいは、<em>新たなCakePHP開発者を追加するかもしれない</em>。</p>
<p>こうした場合に、<strong>CakePHPの良い学習方法</strong>を知っていると役に立ちます。</p>
<p>対象者が、<em>フレームワーク、それどころかPHPの初心者である場合</em>、CakePHPの公式マニュアルが役に立ちます。</p>
<ul>
<li><a href="http://book.cakephp.org/ja/">The CakePHP 1.3 Book</a></li>
</ul>
<p>これは<em>簡単なブログ作成のチュートリアル</em>で、初心者でも手軽に始めることが出来ます。</p>
<p>しかし、このチュートリアルには弱点があります。<br />
それは、<strong>MVCモデルを活用しきれていないこと</strong>。<br />
もし、このチュートリアルだけでCakePHPを学習すると、ひどい目に遭います。</p>
<p>次に、学習すべきはこれです。</p>
<ul>
<li><a href="http://old-journal.sooey.com/2008/03/26/717/">CakePHPを使ったMVC設計のベストプラクティス</a></li>
</ul>
<p><strong>モデル側にロジックをまとめること</strong>を覚えましょう。<br />
あるいは、hiromi2424さんのエントリも大変参考になります。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/hiromi2424/20101122/1290379655">バリデーションのベストプラクティス</a></li>
</ul>
<p><em>CakePHPを利用したウェブサイト開発</em>を一通り学習したいのであれば、この本がお勧めです。</p>
<table width="600">
<tbody>
<tr>
<td width="200" align="center">
<a href="http://www.amazon.co.jp/CakePHP%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E5%AE%89%E8%97%A4-%E7%A5%90%E4%BB%8B/dp/4839930651%3FSubscriptionId%3DAKIAJEYEQNBOFC4DLQ7Q%26tag%3Dtfmagician-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4839930651" title="Amazon で商品の詳細を確認する"><img src="http://ecx.images-amazon.com/images/I/51bJ7x9fIJL._SL160_.jpg" alt="CakePHPによる実践Webアプリケーション開発" /></a>
</td>
<td><a href="http://www.amazon.co.jp/CakePHP%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E5%AE%89%E8%97%A4-%E7%A5%90%E4%BB%8B/dp/4839930651%3FSubscriptionId%3DAKIAJEYEQNBOFC4DLQ7Q%26tag%3Dtfmagician-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4839930651" title="Amazon で商品の詳細を確認する">CakePHPによる実践Webアプリケーション開発</a></p>
<ul>
<li>著者: 安藤 祐介, 岸田 健一郎, 新原 雅司</li>
<li>出版社: 毎日コミュニケーションズ</li>
<li>発売日: 2009/04/08</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>CakePHP v1.2を対象に書かれているため、<em>少し情報が古い可能性</em>があります。<br />
しかし、その点を除いても、大変参考になります。<br />
<em>業務アプリケーションを対象とした開発手順は、とても実践的です</em>。</p>
<p>最後に、<em>話題のTDDをCakePHPでも取り入れましょう</em>。</p>
<table width="600">
<tbody>
<tr>
<td width="200" align="center">
<a href="http://www.amazon.co.jp/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E6%89%8B%E6%B3%95-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4839924309%3FSubscriptionId%3DAKIAJEYEQNBOFC4DLQ7Q%26tag%3Dtfmagician-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4839924309" title="Amazon で商品の詳細を確認する"><img src="http://ecx.images-amazon.com/images/I/51WXAC9wVYL._SL160_.jpg" alt="Webアプリケーションテスト手法" /></a>
</td>
<td><a href="http://www.amazon.co.jp/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E6%89%8B%E6%B3%95-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4839924309%3FSubscriptionId%3DAKIAJEYEQNBOFC4DLQ7Q%26tag%3Dtfmagician-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4839924309" title="Amazon で商品の詳細を確認する">Webアプリケーションテスト手法</a></p>
<ul>
<li>著者: 水野 貴明, 石井 勇一, 新藤 愛大, 岸田 健一郎, 荻野 淳也, 安井 力, 田中 慎司</li>
<li>出版社: 毎日コミュニケーションズ</li>
<li>発売日: 2008/07/25</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>CakePHP 1.3で<em>標準テスティングフレームワークSimpleTest</em>の使い方が、わかりやすくまとまっています。</p>
<h2>5. サイトを高速化する</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_speedup.png" alt="Cakephps speedup" title="cakephps_speedup.png" border="0" width="128" height="128" /></p>
<p>サイトのアクセス負荷が増えてきたときのために、<strong>その負荷対策もCakePHP開発者は知るべきでしょう</strong>。<br />
まず、簡単なところから。</p>
<ul>
<li><a href="https://github.com/Phally/lazy_model">phally / lazy_model</a></li>
</ul>
<p>CakePHP 2.0でも<em>標準で取り入れられたプラグイン</em>です。<br />
モデルの読み込みをマジックメソッドに寄せることで、プログラムのロードを高速化します。</p>
<p>一般的なウェブサイトであれば、<em>全てのページが動的である必要はありません</em>。<br />
まずは、デフォルトのキャッシュシステムを利用しましょう。</p>
<ul>
<li><a href="http://book.cakephp.org/ja/view/1380/コントローラでキャッシュする">7 主要なヘルパー: 7.2.4 コントローラでキャッシュする</a></li>
</ul>
<p>しかし、このキャッシュシステムは完璧ではありません。<br />
プログラムのロードが少なくなるだけで、少なからずCakePHPが呼ばれます。</p>
<p>そこで、<em>静的ページには次のプラグインを利用します</em>。</p>
<ul>
<li><a href="https://github.com/mcurry/html_cache">mcurry / html_cache</a></li>
</ul>
<p>このプラグインを利用すると、<strong>HTMLの静的ファイルをwebroot以下に吐き出してくれます</strong>。<br />
CakePHPにアクセスしないのだから、爆速ですよね。</p>
<p>モデル側のキャッシュは、<em>デフォルトで用意されているキャッシュ機構</em>を利用します。</p>
<ul>
<li><a href="http://book.cakephp.org/ja/view/1069/cacheQueries">3 CakePHPによる開発: 3.7.8.13 cacheQueries</a></li>
</ul>
<p>これを有効化すると、<em>クエリ毎に結果をキャッシュしてくれます</em>。<br />
ただし、1リクエスト毎のメモリキャッシュである点と、データ更新後の挙動には注意が必要です。</p>
<p>最後に、<em>独自のキャッシュ機構を用意する場合</em>。<br />
Cacheクラスを利用します。</p>
<ul>
<li><a href="http://book.cakephp.org/ja/view/1511/Cache">8 コアユーティリティライブラリ: 8.7 Cache</a></li>
</ul>
<p>自動でシリアライズをしてくれたり、キャッシュの有効期限を決めれたりと、便利なクラスです。</p>
<h2>6. デプロイを自動化する</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_deploy.png" alt="Cakephps deploy" title="cakephps_deploy.png" border="0" width="128" height="128" /></p>
<p>CakePHPはデプロイが簡単です。<br />
作成したアプリケーションを、<em>ウェブサーバが参照出来る場所に置くだけ</em>です。</p>
<p>しかし、長期で運用する場合、色々と問題が生じます。<br />
例えば、<strong>一時ファイルの問題</strong>です。</p>
<p>CakePHPはデフォルトでも、アプリケーションに支障が出ない範囲で様々なファイルをキャッシュし、一時ファイルに格納します。<br />
そのため、<em>新たなコードやファイルを追加した場合に、この一時ファイルが悪さをすることがあります</em>。<br />
予期せぬエラーが発生する場合、この一時ファイルが悪さをしていることが多いのです。</p>
<p>デプロイの度、一時ファイルを手動で消しても良いのですが、それは面倒です。<br />
そして、ミスも増えます。</p>
<p>デプロイの簡単なCakePHPですが、<em>その処理も自動化しておくと、多くのメリットが得られます</em>。</p>
<ul>
<li><a href="http://bakery.cakephp.org/articles/j15e/2010/04/22/deploying-cakephp-with-capistrano">Deploying CakePHP with Capistrano</a></li>
</ul>
<p>CakePHPもCapistranoを利用し、デプロイを自動化できます。<br />
もし、<em>CLIに慣れないエンジニア、あるいはデザイナーが周りに居る場合は、Webistranoも良いでしょう</em>。</p>
<ul>
<li><a href="https://github.com/peritor/webistrano">peritor / webistrano</a></li>
</ul>
<p>Capistranoを使えば、簡単にデプロイを自動化できます。<br />
しかし、<strong>データベースのマイグレーションが課題として残ります</strong>。<br />
CakePHPのスキーマシェルは、<em>とても貧弱です</em>。<br />
デフォルトのアップデート機能では、自動デプロイに耐えることが出来ません。<br />
そこで、CakeDCが公開している<em>MigrationsPlugin</em>を利用します。</p>
<ul>
<li><a href="https://github.com/CakeDC/migrations">CakeDC / migrations</a></li>
</ul>
<p>このプラグインを利用することで、<strong>Ruby On Railsのようなマイグレーションシェル</strong>を得ることが出来ます。<br />
マイグレーションアップ、マイグレーションダウンも自由自在です。</p>
<h2>7. 継続的インテグレーションを取り入れる</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_ci.png" alt="Cakephps ci" title="cakephps_ci.png" border="0" width="128" height="128" /></p>
<p>&#8220;<em>4. 学習方法を知る</em>&#8220;の中で、テストの話に簡単に触れました。<br />
もし、あなたがテストケースを運用し始めたなら、<strong>継続的インテグレーション</strong>を取り入れましょう。</p>
<ul>
<li><a href="http://hudson-ci.org/">Hudson Continuours Integration</a></li>
</ul>
<p>CakePHPでも、<em>Hudsonを利用することで継続的インテグレーションすることが出来ます</em>。<br />
Ryuzeeさんの記事を見れば、数時間で環境を整えられるでしょう。</p>
<ul>
<li><a href="http://www.ryuzee.com/contents/blog/3473">CakePHPアプリをHudsonで継続的インテグレーションする方法</a></li>
<li><a href="http://www.ryuzee.com/contents/blog/3431">PHPでもHudson使うべし</a></li>
</ul>
<h2>8. バリデーションを活用する</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_validate.png" alt="Cakephps validate" title="cakephps_validate.png" border="0" width="128" height="128" /></p>
<p>CakePHPを利用するのに欠かせない機能。<br />
それは<strong>バリデーション</strong>です。</p>
<ul>
<li><a href="http://book.cakephp.org/ja/view/1143/データのバリデーション-Data-Validation">4 CakePHPによる作業の定石: 4.1 データのバリデーション(Data Validation)</a></li>
</ul>
<p>マニュアルの例は、とてもシンプルです。<br />
バリデーションには、<em>この他にも様々な使い道があります</em>。</p>
<p>&#8220;<em>4. 学習方法を知る</em>&#8220;でも紹介しましたが、hiromi2424さんの記事を参考にしてください。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/hiromi2424/20101122/1290379655">バリデーションのベストプラクティス</a></li>
</ul>
<p>さらに、バリデーションを使うにあたって以下のことを踏まえておきましょう。</p>
<ul>
<li>バリデーションは必ずしも、<em>テーブルのフィールドと1対1でなくても良い</em>。つまり、テーブルに存在しないフィールドに対しても、バリデーションを定義出来る。</li>
<li>独自バリデーションメソッドの中から、<em>保存予定の全てのデータにアクセス出来る</em>。つまり、Model::$dataプロパティを利用し、複雑なバリデーションも書ける。</li>
<li>Model::beforeValidate()コールバックを利用することで、<em>オプションによってバリデーションを切り替えることが出来る</em>。</li>
</ul>
<p>バリデーションメソッドは、様々な可能性を秘めています。</p>
<h2>9. エディタを活用する</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_editor.png" alt="Cakephps editor" title="cakephps_editor.png" border="0" width="128" height="128" /></p>
<p><em>CakePHPを利用出来るエディタ</em>を把握しましょう。<br />
PHPを書くことが出来るエディタであれば、開発に支障はありません。<br />
しかし、<strong>専用のプラグインがあるエディタ</strong>を利用すれば、開発速度が上がります。</p>
<ul>
<li><a href="https://github.com/cakephp/cakephp-tmbundle">cakephp / cakephp-tmbundle</a></li>
<li><a href="https://github.com/cakephp/cakephp-netbeans">cakephp / cakephp-netbeans</a></li>
<li><a href="https://github.com/k1LoW/emacs-cake/wiki">k1LoW / emacs-cake</a></li>
</ul>
<p>個人的に残念なのは、<em>有用なvimプラグインがないこと</em>です。<br />
そのうち、個人的に開発したいと思っているので、vimmerの方はしばしお待ちを。</p>
<h2>10. 最新の情報を得る</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/cakephps_info.png" alt="Cakephps info" title="cakephps_info.png" border="0" width="120" height="120" /></p>
<p>最後に、CakePHPのトレンドを把握するために、<em>必要な情報源</em>を押さえましょう。</p>
<ul>
<li><em>国内</em></li>
<ul>
<li><a href="http://cakephp.jp/modules/newbb/">CakePHPフォーラム</a></li>
<li><a href="http://d.hatena.ne.jp/hiromi2424/">24時間CakePHP</a></li>
<li><a href="http://d.hatena.ne.jp/cakephper/">cakephperの日記</a></li>
<li><a href="http://www.1x1.jp/blog/">Shin x blog</a></li>
<li><a href="http://d.hatena.ne.jp/k1LoW/">Copy/Cut/Paste/Hatena</a></li>
<li><a href="http://blog.ecworks.jp/">ECWorks Blog</a></li>
<li><a href="http://d.hatena.ne.jp/kanonji/">kanonjiの日記</a></li>
<li><a href="http://text.tklabo.net/blog">半年前の私への教科書</a></li>
<li><a href="http://dev.msng.info/">開発メモのようなもの</a></li>
<li><a href="http://torhamzedd.blogspot.com/">トーハム紀行</a></li>
<li><a href="http://d.hatena.ne.jp/kaz_29/">kaz_29@はてな</a></li>
<li><a href="http://php-tips.com/">php-tips.com</a></li>
<li><a href="http://d.hatena.ne.jp/kunit/">kunitの日記</a></li>
<li><a href="http://www.akiyan.com/">akiyan.com</a></li>
<li><a href="http://cakephp.seesaa.net/">CakePHP のおいしい食べ方</a></li>
<li><a href="http://blog.candycane.jp/">candycane development blog</a></li>
</ul>
<li><em>海外</em></li>
<ul>
<li><a href="http://groups.google.com/group/cake-php/topics">CakePHP Google Group</a></li>
<li><a href="http://bakery.cakephp.org/">The Bakery</a></li>
<li><a href="http://tv.cakephp.org/">CakePHP TV</a></li>
<li><a href="http://cakedc.com/articles">CakeDC</a></li>
<li><a href="http://grahamweldon.com/">Graham Weldon</a></li>
<li><a href="http://www.mcurry.net/">mcurry.net</a></li>
<li><a href="http://mark-story.com/">Mark Story</a></li>
<li><a href="http://fahad19.com/blog/">fahad19</a></li>
<li><a href="http://ad7six.com/">AD7six.com</a></li>
<li><a href="http://www.neilcrookes.com/">Neil Crookes</a></li>
<li><a href="http://nuts-and-bolts-of-cakephp.com/">nuts and bolts of cakephp</a></li>
</ul>
</ul>
<p>全てRSSリーダーに登録しておけば、ばっちりですね。<br />
もし、<em>CakePHPネタをたくさん書いてるのに、載っていない！</em>っていう人が居たら教えてください。<br />
掲載させて頂きます。</p>
<p>かなりの長文になってしまいました。<br />
(そして、最後はヘタってしまいました:(</p>
<p>恐らく、生粋のCakePHP Bakerの皆さんは全て押さえているでしょう。<br />
初級、あるいは中級者の方の参考になれば、幸いです。</p>
<p>また、他のフレームワークでも、&#8221;<em>知るべき10のこと</em>&#8220;シリーズを書いてみませんか？</p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/03/09/10_things_you_must_know_about_cakephp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>大人数の開発合宿に最適な、山木旅館に行ってきた</title>
		<link>http://1-byte.jp/2011/03/03/review_yamaki_in_atami/</link>
		<comments>http://1-byte.jp/2011/03/03/review_yamaki_in_atami/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 01:00:46 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[Event]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP温泉部]]></category>
		<category><![CDATA[cakespa]]></category>
		<category><![CDATA[開発合宿]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=946</guid>
		<description><![CDATA[
もし、あなたが1-byte.jpの読者であれば、先日、CakePHP温泉部が開催されたことを知っていると思います。

[イベント告知] この春はCakePHP温泉部でゆったりと

CakePHP温泉部とは何ぞや？という [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/atami_yamaki.png" alt="Atami yamaki" title="atami_yamaki.png" border="0" width="510" height="316" /></p>
<p>もし、あなたが<a href="http://1-byte.jp">1-byte.jp</a>の読者であれば、先日、<em>CakePHP温泉部</em>が開催されたことを知っていると思います。</p>
<ul>
<li><a href="http://1-byte.jp/2011/01/06/cakespa/">[イベント告知] この春はCakePHP温泉部でゆったりと</a></li>
</ul>
<p><em>CakePHP温泉部とは何ぞや？</em>という方は、上記の記事を見てください。<br />
今年は、このCakePHP温泉部員一同、<em>熱海</em>に行ってきました。</p>
<p>部員の皆さんととても楽しい時間を過ごさせて頂いたのですが、それと同じぐらい素晴らしかったのが<em>お世話になった旅館</em>。<br />
恐らく、<strong>熱海で大人数の開発合宿をするとすれば、ここしかないでしょう</strong>。</p>
<h2>熱海温泉の山木旅館</h2>
<p>今回、CakePHP温泉部の舞台となったのが、&#8221;<em>山木旅館</em>&#8220;です。</p>
<ul>
<li><a href="http://www.yamakiryokan.co.jp/index.html">山木旅館</a></li>
</ul>
<p>この旅館は熱海駅から、車で5分ほどの場所に位置します。</p>
<p><a href="http://maps.google.com/maps?q=%E5%B1%B1%E6%9C%A8%E6%97%85%E9%A4%A8&#038;ie=UTF8&#038;hq=%E5%B1%B1%E6%9C%A8%E6%97%85%E9%A4%A8&#038;hnear=&#038;ll=35.100073,139.077945&#038;spn=0.016537,0.049782&#038;z=15" class="replace">山木旅館の位置</a></p>
<p>周りは温泉街で、静かなところです。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/around_yamaki.jpg" alt="山木旅館周辺の風景" title="around_yamaki.jpg" border="0" width="600" height="337" /></p>
<h2>素晴らしい館内</h2>
<p>&#8220;<em>素晴らしい</em>&#8220;の意味を、はき違えないでください。<br />
最新のホテルやホテル旅館、ビジネスホテルと比べないでください。<br />
素晴らしいのは、その<strong>温泉旅館</strong>らしさです。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/room.jpg" alt="山木旅館の個室" title="room.jpg" border="0" width="600" height="450" /></p>
<p>良いでしょう。<br />
温泉に来た感覚をしっかり、味わえます。<br />
<em>こんな旅館なのだから、部屋が小さい？</em><br />
<strong>そんなことはありません</strong>。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/big_room.jpg" alt="山木旅館の大きな部屋" title="big_room.jpg" border="0" width="600" height="450" /></p>
<p><em>じゃあ、インターネットが繋がっていない？</em><br />
<strong>いいえ、しっかりインターネット回線も完備されています</strong>。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/development.jpg" alt="開発風景" title="development.jpg" border="0" width="600" height="450" /></p>
<p>CakePHP温泉部では、<em>2階にある3部屋を全てお借りしました</em>。<br />
準貸し切り状態です。<br />
1部屋は開発部屋として、残り2部屋は寝室として利用させて頂きました。</p>
<p>おかげで皆さん、<em>睡眠も開発も集中して行えたはずです</em>(睡眠は少し怪しいですが)</p>
<h2>3つの風呂</h2>
<p>開発合宿で必要なのは<strong>温泉</strong>。<br />
これが一番、重要です。</p>
<p>山木旅館では、<em>3つの風呂</em>があり、時間帯によって、<em>男性と女性風呂が入れ替わります</em>。<br />
もう一つは、家族風呂で自由に使って良いそうです。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/spa2.jpg" alt="spa2" title="spa2.jpg" border="0" width="600" height="450" /></p>
<p>CakePHP温泉部では、皆さん、<em>朝風呂もしっかり味わっていました</em>。</p>
<h2>夕食と朝食</h2>
<p>1泊2日の宿泊では、通常の旅館と同様に、<em>夕食と朝食を用意してくれます</em>。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/03/dinner.jpg" alt="山木旅館の夕食" title="dinner.jpg" border="0" width="600" height="450" /></p>
<p><em>海鮮を中心とした</em>、素晴らしいメニューでした。</p>
<p>このような素晴らしい旅館で、CakePHP温泉部の2日間を、楽しく過ごせました。<br />
1泊2万円と、他の旅館から比べると、少し高いです。<br />
しかし、<em>その価値は十分にあります</em>。</p>
<p>今回、私がCakePHP温泉部で使用する旅館を調べたのですが、</p>
<ul>
<li>部屋でインターネットが使える</li>
<li>10人以上入る大部屋がある</li>
</ul>
<p><strong>この2つの条件を満たす旅館は、ここしかありませんでした</strong>。<br />
10件以上、電話をして調べました。しかし、インターネット回線がフリースポットだったり、会議室でしかインターネットが使えなかったり、とこの条件に合う旅館はなかなか見つかりませんでした。</p>
<p>開発合宿でこの2つの要素は、とても重要でしょう。</p>
<p><em>せっかくの合宿なので、徹夜で開発がしたい。</em><br />
<em>せっかくの合宿なので、皆とワイワイしながら開発をしたい。</em></p>
<p>これらを叶えてくれるのが、<em>山木旅館</em>です。</p>
<p>熱海で開発合宿をするときは、是非、山木旅館へどうぞ。</p>
<ul>
<li><a href="http://www.yamakiryokan.co.jp/index.html">山木旅館</a></li>
</ul>
<p>CakePHP温泉部の参加報告は、<a href="http://twitter.com/binbin4649">@binbin4649</a>さんが書いてくれています。<br />
こちらも併せて、どうぞ。</p>
<ul>
<li><a href="http://hideichi.com/archives/318">第２回CakePHP温泉部に行ってきました。</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/03/03/review_yamaki_in_atami/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gmailを、Pythonスクリプトでメールサーバとして使うtips</title>
		<link>http://1-byte.jp/2011/02/12/gmail_using_as_your_mail_server/</link>
		<comments>http://1-byte.jp/2011/02/12/gmail_using_as_your_mail_server/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 01:00:23 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[メール]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=926</guid>
		<description><![CDATA[
久々の更新です。
現在、ブログのリニューアルのために、時間を割いています。
しかし、肝心の記事が書けていないっていうのはダメですね。
読者があってこそのブログです。
そんなこんなで、少し時間がありません。
今日はちょっ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/02/gmail.png" alt="Gmail" title="gmail.png" border="0" width="600" height="350" /></p>
<p>久々の更新です。<br />
現在、<em>ブログのリニューアル</em>のために、時間を割いています。<br />
しかし、肝心の記事が書けていないっていうのはダメですね。<br />
<em>読者があってこそのブログ</em>です。</p>
<p>そんなこんなで、少し時間がありません。<br />
今日はちょっとだけ(本当に少しだけ)、使えるtipsを紹介します。</p>
<p><strong>gmailを、Pythonスクリプトを使ってメールサーバ</strong>として使ってみます。</p>
<h2>5分で出来るインストールと送信テスト</h2>
<p>インストールと初めの送信は<em>とても簡単</em>です。<br />
<em>Ubuntu 10.04 TLSでインストールする手順</em>をまとめます。<br />
インストール先は、&#8221;/usr/lib/gmail&#8221;とします。<br />
必要に応じて、ルート権限で実行してください。</p>
<pre class="brush: bash;">
apt-get install -y libyaml-0-2 python-setuptools # easy_installとYAMLライブラリのインストール
easy_install PyYAML # PyYAMLのインストール
cd /usr/lib
git clone git://github.com/tfmagician/gmail.git # ソースのダウンロード
cd gmail/
cp config.yaml.example config.yaml
vi config.yaml # gmailアカウントの設定
ln -s /usr/lib/gmail/gmail.py /usr/bin/gmail
</pre>
<p>ここまで無事に実行できたら、以下のコマンドを実行して送信テストします。</p>
<pre class="brush: bash;">
gmail --subject 'Hello world.' --text --body 'Read me.' --config ./config.yaml [あなたのメールアドレス]
</pre>
<p>コマンドラインの応答には、<em>1〜2秒</em>掛かります。<br />
応答が返ってきたら、[あなたのメールアドレス]で設定したメールの受信ボックスを確認してください。</p>
<ul>
<li>送信元 : config.yamlで設定したメールアドレス</li>
<li>タイトル: Hello world.</li>
<li>本文: Read me.</li>
</ul>
<p>このようなメールが受信出来れば、成功です。</p>
<h2>何に使うか</h2>
<p>正直なところ、&#8221;<strong>簡単な用途</strong>&#8220;にしか使えません。<br />
例えば、以下の用途です。</p>
<ul>
<li>ログの定期確認</li>
<li>logwatchのレポート確認</li>
<li>自作スクリプトの動作確認</li>
</ul>
<p>監視サーバのアラートなど、<strong>対応に緊急を要する用途には使えない</strong>と思います。<br />
それは、gmailスクリプトがこんなに簡単なコードだからです。</p>
<pre class="brush: python;">
#!/usr/bin/python
# -*- coding: utf-8 -*-

# import
import sys
import os
import smtplib
import yaml
import optparse
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

# globals
VERSION = '0.10'

def read_config(config_file):
    &quot;&quot;&quot;
    Read configuration YAML file.

    account and password keys are required in the file.
    &quot;&quot;&quot;

    config = yaml.load(open(config_file).read())
    not_exist = [setting for setting in ('account', 'password') if not config.has_key(setting)]
    if not_exist:
      print &quot;Could not read %s setting from configration file.&quot; % &quot;, &quot;.not_exist
      sys.exist(1)
    return config

def parse_options():
    &quot;&quot;&quot;
    Parse options from arguments.
    &quot;&quot;&quot;

    usage = &quot;usage: %prog [-s subject] [-b body] to-addr...&quot;
    ver = &quot;%s %s&quot; % (&quot;%prog&quot;, VERSION)
    parser = optparse.OptionParser(usage, version=ver)
    parser.add_option(&quot;-s&quot;, &quot;--subject&quot;, dest='subject',
                      default=&quot;&quot;,
                      metavar=&quot;STRING&quot;, help=&quot;Specify subject on command line&quot;)
    parser.add_option(&quot;-b&quot;, &quot;--body&quot;, dest='body',
                      default=&quot;&quot;,
                      metavar=&quot;INPUT_FILE&quot;, help=&quot;Specify email body read from file&quot;)
    parser.add_option(&quot;-t&quot;, &quot;--text&quot;, dest='text',
                      default=False,
                      action=&quot;store_true&quot;, help=&quot;--body argument as text not file&quot;)
    parser.add_option(&quot;-c&quot;, &quot;--config&quot;, dest='config',
                      default=&quot;config.yaml&quot;,
                      metavar=&quot;INPUT_FILE&quot;, help=&quot;Setting file to use gmail server&quot;)
    opts, args = parser.parse_args()
    if args:
      files = ['config']
      if not opts.text: files.append('body')
      for file in files:
        if opts.__dict__[file] and not os.access(opts.__dict__[file], os.R_OK):
          print &quot;Could not read %s from %s.&quot; % (file, opts.__dict__[file])
          sys.exit(1)
      return opts, args
    else:
      parser.print_help()
      sys.exit(0)

def create_message(from_addr, to_addrs, subject='', body='', encoding='utf-8'):
    &quot;&quot;&quot;
    Create a mail body to send.
    &quot;&quot;&quot;

    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = &quot;,&quot;.join(to_addrs)
    msg['Date'] = formatdate()
    return msg

def send_via_gmail(account, passwd, to_addrs, msg):
    &quot;&quot;&quot;
    Send an email through SMTP server of Gmail.
    &quot;&quot;&quot;

    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(account, passwd)
    s.sendmail(account, to_addrs, msg.as_string())
    s.close()

def main():
    &quot;&quot;&quot;
    Main function.
    &quot;&quot;&quot;

    opts, to_addrs = parse_options()
    settings = read_config(opts.config)
    if opts.body and not opts.text:
      opts.body = open(opts.body).read()
    msg = create_message(settings['account'], to_addrs, opts.subject, opts.body)
    send_via_gmail(settings['account'], settings['password'], to_addrs, msg)

if __name__ == '__main__':
    main()
</pre>
<p>エラー処理をしていません。<br />
<em>gmailが落ちていたり、ネットワークが落ちていても、再送しません</em>。<br />
<strong>失敗したらそれっきりです</strong>。</p>
<p>それでも、<em>5分でインストール出来て、メールを送信できるのは魅力です</em>。<br />
サーバからのメール送信用にMTAを自前で用意しても良いのですが、色々と設定が面倒です。<br />
例えば、Postfixを使って、gmail経由でメールを送る例です。</p>
<ul>
<li><a href="http://www.marksanborn.net/linux/send-mail-postfix-through-gmails-smtp-on-a-ubuntu-lts-server/">Send Mail Postfix through Gmail’s SMTP on a Ubuntu LTS Server</a></li>
</ul>
<p>色々と用意されているUbuntuでも、<em>これだけ手間が掛かります</em>。<br />
メールサーバの設定って面倒なんですよね。</p>
<p>用途によって使い分けると良いでしょう。</p>
<h2>注意事項</h2>
<p>gmailのSMTPサーバには、<em>制限があります</em>。</p>
<ul>
<li>送信回数: 500回/日</li>
<li>宛先数: 500宛先/メール</li>
<li>メール数: 2000メール/日</li>
</ul>
<p>下記の記事が詳しく、参考になります</p>
<ul>
<li>http://d.hatena.ne.jp/dacs/20080627/1214569620</li>
</ul>
<p>このgmailスクリプトで関係あるのは、<em>500回/日の送信回数制限</em>ですね。<br />
ただ、500回/日であれば問題ないでしょう。<br />
<em>この制限に掛かるようであれば、あなたは確実に用途を間違っています</em>:(</p>
<h2>Pythonスクリプトを書くための参考URL</h2>
<p>ここまで、<em>このスクリプトを自分で書いたように振舞ってきた</em>のですが、実は以下の記事を参考にしています。</p>
<ul>
<li><a href="http://labs.unoh.net/2007/06/python_2.html">Pythonでメールを送信したい人のためのサンプル集</a></li>
<li><a href="http://d.hatena.ne.jp/t2y-1979/20101124/1290534464">ログ解析ツールを作る</a></li>
</ul>
<p>&#8220;<a href="http://labs.unoh.net/2007/06/python_2.html">Pythonでメールを送信したい人のためのサンプル集</a>&#8220;の記事を元に、&#8221;<a href="http://d.hatena.ne.jp/t2y-1979/20101124/1290534464">ログ解析ツールを作る</a>&#8220;で紹介された<em>optparseモジュール</em>を使ってオプションを加え、<em>YAMLファイル</em>で設定を変えられるようにしました。<br />
あとは、それをgithubに載せて、どこのサーバでも簡単に使えるように。</p>
<p>Pythonで簡単な管理スクリプトを書いて、gitリポジトリを作る。<br />
そして、それをgithubに載せて、管理する。<br />
こうしておけば、<strong>いつでもどこでも、設定不要でスクリプトが再利用できます</strong>。<br />
これが<em>モダンな自作スクリプトの管理法</em>でしょうか。</p>
<p>これもPythonの勉強がてらに書いたスクリプトですが、地味に使えます。<br />
皆さんも使ってみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/02/12/gmail_using_as_your_mail_server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>月額1,980円以下の仮想専用サーバ、国内外10サービスまとめ</title>
		<link>http://1-byte.jp/2011/01/28/cheap_virtual_servers/</link>
		<comments>http://1-byte.jp/2011/01/28/cheap_virtual_servers/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 01:00:10 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[gasevist]]></category>
		<category><![CDATA[KVM]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VPS]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[Xen]]></category>
		<category><![CDATA[サーバ]]></category>
		<category><![CDATA[サービス]]></category>
		<category><![CDATA[仮想専用サーバ]]></category>
		<category><![CDATA[運用]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=906</guid>
		<description><![CDATA[
前回の記事は読んでいただけましたか？

トリビア共有なんかよりも、100倍面白いガセビア共有gasevist

ガセビア共有サイトgasevistをリリース出来たのも、インフラが安くなったおかげです。
国内ではさくらサ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/vps.jpg" alt="vps.jpg" title="vps.jpg" border="0" width="600" height="450" /></p>
<p>前回の記事は読んでいただけましたか？</p>
<ul>
<li><a href="http://1-byte.jp/2011/01/27/open_gasevist/">トリビア共有なんかよりも、100倍面白いガセビア共有gasevist</a></li>
</ul>
<p>ガセビア共有サイト<a href="http://gasevist.com">gasevist</a>をリリース出来たのも、<strong>インフラが安くなったおかげ</strong>です。</p>
<p>国内ではさくらサーバを初めとして、<em>格安の仮想専用サーバがリリースされています</em>。<br />
そこで、今日は格安の仮想専用サーバについてまとめます。</p>
<h3>さくらのVPS</h3>
<p>まずは国内から。<br />
言わずと知れた、<em>さくらインターネットが手がけるVPS</em>です。</p>
<ul>
<li><a href="http://vps.sakura.ad.jp/">さくらのVPS</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>950円</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>KVM</td>
</tr>
<tr>
<td>メモリ</td>
<td>512M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			CentOS 5.5 (初期インストール)<br />
			Ubuntu 10.04<br />
			FreeBSD 8.1<br />
			Debian 5.05<br />
			Fedora 13
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://www.atmarkit.co.jp/ad/sakurainet/1009vpsreview/vpsreview.html">【レビュー】月額980円、さくらのVPSは使えるか!?</a><br />
			<a href="http://d.hatena.ne.jp/koujirou6218/20101129/1291014337">さくらVPSで一日6万PVを処理するためにしたこと</a>
		</td>
</tr>
</table>
<p>やはり、私もここが一番気に入っています。<br />
さくらインターネットだけあって、<strong>とても安定しています</strong>。<br />
管理機能が豊富ではありませんが、その分シンプルです。<br />
<em>小さなウェブ・サービスを立ち上げる</em>のであれば、さくらのVPSで決まりでしょう。</p>
<h3>ServersMan VPS</h3>
<p><em>国内最安のVPS</em>でしょうか。<br />
フリービットの子会社DTIが手がけるVPSです。</p>
<ul>
<li><a href="http://dream.jp/vps/">ServersMan VPS</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>490円</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>OpenVZ</td>
</tr>
<tr>
<td>メモリ</td>
<td>512M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			CentOS 5.4<br />
			Ubuntu 10.04<br />
			Debian Lenny
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://internet.watch.impress.co.jp/docs/special/20100405_358327.html">月額490円で使える仮想サーバー「ServersMan@VPS」が実現できた訳</a><br />
			<a href="http://blog.livedoor.jp/dankogai/archives/51555095.html">静的コンテンツ配るなら国内VPSも活用すべきたった一つの理由</a>
		</td>
</tr>
</table>
<p>価格は恐ろしく安いです。<br />
<strong>さくらのレンタルサーバよりも安く、仮想専用サーバが手に入ります</strong>。</p>
<p>難点は、<em>その安定性と管理画面の使い勝手の悪さ</em>です。<br />
以前はサーバを複数台用意するために、メールアドレスをその台数分用意する必要がありました。<br />
(現在はわかりません。知っている方がいれば教えてください。)</p>
<p>ただし、<em>機能追加は積極的に行われています</em>。<br />
その点に関しては応援できるので、今後に期待でしょうか。</p>
<p>私は、本番環境にServersMan VPSは選べません。<br />
自分専用のファイル共有サーバやブログ程度であれば、問題ないでしょう。</p>
<h3>KAGOYA VPS</h3>
<p>現在はベータ中で、<em>誰でも自由に利用出来る訳ではありません</em>。<br />
しかし、リリース後はさくらのVPSと同価格帯になる予定です。</p>
<ul>
<li><a href="http://www.kagoya.jp/cloud/vps/">KAGOYA VPS</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>945円</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>Open VZ</td>
</tr>
<tr>
<td>メモリ</td>
<td>512M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			CentOS 5.5<br />
			Debian Lenny<br />
			Ubuntu 10.04
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://blog.withsin.net/2010/11/19/kagoya-vpsを試してみる/">KAGOYA VPSを試してみる</a>
		</td>
</tr>
</table>
<p>ここは使ったことがないので、コメント出来ません。<br />
もし、<em>4次ベータ</em>がある場合は、申し込んでみると良いでしょう。</p>
<h3>ユニットホスティング</h3>
<p>今まで紹介したのは全て、<em>単なるVPS</em>でした。<br />
ユニットホスティングは<em>少し毛色が違います</em>。<br />
月額1,980円で利用できますが、<strong>プランの形態としてはAmazon EC2に近いです</strong>。</p>
<ul>
<li><a href="http://www.unit-hosting.com/">ユニットホスティング</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>1980円</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>Xen</td>
</tr>
<tr>
<td>メモリ</td>
<td>256M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			CentOS 5
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://togetter.com/li/18240">UnitHostingの評判（良いのも悪いのも)</a><br />
			<a href="http://www.slideshare.net/tumf/key-5338153">ユニットホスティングではじめるクラウド</a>
		</td>
</tr>
</table>
<p>ここも、私は使ったことがありません。<br />
しかし、<em>期待できるサービスの一つ</em>です。</p>
<p>何もしなければ、<em>月額1,980円</em>で利用できます。<br />
アクセス増加に対応する場合は、</p>
<ul>
<li>メモリ 256MB: 1.5円/h</li>
<li>CPU 1コア: 2円/h</li>
<li>HDD 1G: 0.1円/h</li>
</ul>
<p>でサーバをスケールアップ可能です。<br />
このように、<strong>従量課金で一定期間だけスケールアップできるのは、単なるVPSにない魅力</strong>です。</p>
<h3>Linode</h3>
<p>ここからが海外サーバです。まずは、有名な<em>Linode</em>。<br />
さくらのVPSが出る前は、<em>ここをメインで使っていた方も多いはず</em>。</p>
<ul>
<li><a href="http://www.linode.com/">Linode</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>19.95ドル</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>Xen</td>
</tr>
<tr>
<td>メモリ</td>
<td>512M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			Arch Linux 2010.05<br />
			CentOS 5.5<br />
			Debian 5.0<br />
			Fedora 14<br />
			Slackware 13.1<br />
			Ubuntu 10.04 LTS<br />
			Ubuntu 10.10<br />
			OpenSUSE 11.0<br />
			Gentoo 2008.0<br />
			Debian 4.0<br />
			Fedora 13<br />
			Slackware 12.2<br />
			Ubuntu 9.10<br />
			Ubuntu 8.04 LTS<br />
			Ubuntu 8.10<br />
			Ubuntu 9.04
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://creco.net/2009/03/15/rent_linode_vps_server/">海外VPSサーバ Linodeを借りてみた</a><br />
			<a href="http://www.ideaxidea.com/archives/2010/09/linode_review.html">【画像満載レビュー】 海外で人気のXenベースのVPS、『Linode』を使ってみたよ</a>
		</td>
</tr>
</table>
<p>さくらのVPSに比べると、<em>安定性は少し劣ります</em>。<br />
しかし、十分お勧め出来るサービスです。<br />
簡単な監視機能や、<strong>インストール時に選択できるOSの数</strong>が魅力です。<br />
また、さくらのVPSと違い、<em>DNSが無料で使用できます</em>。</p>
<p>管理機能が充実しているのが良いですね。<br />
<em>海外で簡単なウェブ・サービスを立ち上げる</em>としたら、間違いなくLinodeでしょう。</p>
<h3>Slicehost</h3>
<p>Linodeと一緒に良く取り上げられるのが、<em>Slicehost</em>です。<br />
ターゲットとしている客層がLinodeと近く、<em>価格と機能も似通っています</em>。</p>
<ul>
<li><a href="http://www.slicehost.com/">Slicehost</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>20ドル</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>Xen</td>
</tr>
<tr>
<td>メモリ</td>
<td>256M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			Ubuntu 10.10<br />
			Ubuntu 10.04 LTS<br />
			Ubuntu 9.10<br />
			Ubuntu 8.04.2 LTS<br />
			Debian 5.0<br />
			Gentoo 10.1<br />
			Centos 5.5<br />
			Centos 5.4<br />
			Fedora 14<br />
			Fedora 13<br />
			Fedora 12<br />
			Arch 2010.05<br />
			Red Hat EL 5.4<br />
			Red Hat EL 5.3
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://www.iexplain.org/linode-vs-slicehost-review/">Linode vs. Slicehost Review</a><br />
			<a href="http://blog.champierre.com/archives/627">ホスティングサービス Slicehost のドキュメントがすばらしい</a>
		</td>
</tr>
</table>
<p>ここも、私は使用したことがありません。<br />
日本での実績がそこそこあるようで、検索すると情報が見つかります。<br />
なかなか、安定もしていて、<strong>ドキュメントも充実している</strong>ようです。<br />
ただ、<em>Linodeと比べてちょっとだけコストパフォーマンスが悪いですね</em>。</p>
<h3>Amazon EC2 Micro Instance</h3>
<p>このプランが出るまで、Amazon EC2は<em>月額7,000円程度</em>でした。<br />
従量課金制のため、一定額では利用できません。<br />
しかし、<em>月額1,300円程度で運用出来るようです</em>。</p>
<ul>
<li><a href="http://aws.amazon.com/jp/ec2/">Amazon EC2 Micro Instance</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>16.4ドル (トラフィックの従量課金を除く)</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>Xen</td>
</tr>
<tr>
<td>メモリ</td>
<td>613M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			Red Hat Enterprise Linux<br />
			Windows Server 2003/2008<br />
			Oracle Enterprise Linux<br />
			OpenSolaris<br />
			openSUSE<br />
			Ubuntu<br />
			Fedora<br />
			Gentoo<br />
			Debian<br />
			など多数
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://www.publickey1.jp/blog/10/amazon1amazon.html">Amazonクラウドから「1円クラウド」（自称）登場。Amazonクラウドの値下げが続く</a><br />
			<a href="http://d.hatena.ne.jp/Gimite/20101106/1289010068">Amazon EC2の無料ティアを試す</a>
		</td>
</tr>
</table>
<p>言わずと知れた<em>クラウドサービスの先駆けAmazon EC2</em>です。<br />
SLA(Service Label Agreement)で<strong>99.5%の稼働率</strong>を保証しているので、恐らく安定性は問題ないでしょう。</p>
<p>気になるのはトラフィックの重量課金でしょうか。<br />
<em>1GB当たり、$0.15掛かります</em>。<br />
<em>この従量課金</em>と、<em>インスタンスの性質</em>だけ把握しておけば、サーバ選択の候補に入ります。</p>
<h3>Rackspace</h3>
<p>Amazon EC2と同じ<em>Iaas型のサービス</em>です。<br />
Amazon EC2と違うのは、<em>価格帯とその拡張性</em>です。<br />
先に紹介したSlicehostと同じ会社が運営しています。</p>
<ul>
<li><a href="http://www.rackspacecloud.com/index.php">Rackspace</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>10.95ドル (トラフィックの従量課金を除く)</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>Xen</td>
</tr>
<tr>
<td>メモリ</td>
<td>256M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			Ubuntu<br />
			Debian<br />
			Gentoo<br />
			CentOS<br />
			Fedora<br />
			Arch<br />
			Red Hat Enterprise Linux<br />
			Windows Server 2008<br />
			Windows Server 2003
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://cloudrop.jp/cloud/rackspace_vs_ec2">Rackspace Cloud ServersがAmazon EC2よりも優れている点</a><br />
			<a href="http://www.thebitsource.com/featured-posts/rackspace-cloud-servers-versus-amazon-ec2-performance-analysis/">Rackspace Cloud Servers versus Amazon EC2: Performance Analysis</a>
		</td>
</tr>
</table>
<p>Amazon EC2と比べて、<strong>Rackspaceはスケールアップが容易なようです</strong>。<br />
多少のダウンタイムだけで、ウェブ上の管理画面からスケールアップが出来るようです。<br />
Amazon EC2と同じく、<em>トラフィックが従量課金制</em>です。</p>
<h3>VPS.NET</h3>
<p>Amazon EC2やRackspaceとVPSの<em>中間のサービス</em>です。<br />
<em>Node単位でVPSを借りることが出来ます</em>。<br />
スペックを上げたい場合は、Daily Nodesを1日単位で買います。<br />
こうして買ったDaily Nodesを運用しているVPS Nodesにセットして、再起動するとスペックが上がります。</p>
<ul>
<li><a href="http://www.vps.net/">VPS.NET</a></li>
</ul>
<table>
<tr>
<td width=150>最低利用</td>
<td width=450>20ドル</td>
</tr>
<tr>
<td>仮想化ソフトウェア</td>
<td>Xen</td>
</tr>
<tr>
<td>メモリ</td>
<td>376M</td>
</tr>
<tr>
<td>選択可能OS</td>
<td>
			Ubuntu 8.04<br />
			Ubuntu 10.04<br />
			Debian 5.0<br />
			CentOS 5.4<br />
			CentOS 5.5<br />
			Gentoo 10.1<br />
			Windows Server 2008 Enterprise<br />
			Windows 2003 R2 Standard
		</td>
</tr>
<tr>
<td>参考リンク</td>
<td>
			<a href="http://www.pablumfication.co.uk/2010/02/12/vps-net-8-month-review/">VPS.net 8 Month Review</a><br />
			<a href="http://www.webmaster-source.com/2009/09/29/vps-net-review/">VPS.net Review</a>
		</td>
</tr>
</table>
<p><em>ユニットホスティングと似たサービス</em>ですね。<br />
異なるのは、<strong>リソースが細かく指定出来ない点</strong>でしょうか。<br />
しかし、シンプルでわかりやすく、良いサービスだと思います。</p>
<p>いかがですか。<br />
<em>お気に入りの仮想専用サーバ</em>は見つかりましたか？</p>
<p>個人的には、<strong>さくらのVPSが一番コストパフォーマンスが良いか</strong>と。<br />
ただし、<em>拡張性</em>や<em>管理機能</em>を考えたときに、<strong>海外のサービスに軍配が上がります</strong>。<br />
例えば、Linodeは、管理用のiPhoneアプリがあります。<br />
海外のサーバは基本的にAPI機能があり、サーバ管理も自動化できます。</p>
<p>日本の仮想専用サーバも管理機能を充実させて欲しいですね。<br />
さくらのVPSは普通に使えますが、ServersManはちょっと&#8230;。</p>
<p>この他にも良い仮想専用サーバを知っていれば教えてください。</p>
<p><em>さくらのVPS</em>で動いている、<em>ガセビア共有サイトgasevist</em>もよろしくお願いします。</p>
<p><a href="http://gasevist.com"><img src="http://1-byte.jp/wp-content/uploads/2011/01/gasevist_logo.png" alt="gasevist_logo.png" title="gasevist_logo.png" border="0" width="400" height="66" /></a><br />
<a href="http://gasevist.com">『gasevist』ガセのトリビア・雑学の共有サイト</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/01/28/cheap_virtual_servers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>トリビア共有なんかよりも、100倍面白いガセビア共有gasevist</title>
		<link>http://1-byte.jp/2011/01/27/open_gasevist/</link>
		<comments>http://1-byte.jp/2011/01/27/open_gasevist/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 03:00:29 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[開発環境]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[gasevist]]></category>
		<category><![CDATA[trivist]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=898</guid>
		<description><![CDATA[

【マカーの本当の意味】

熱狂的なマクドナルドの信者のことを指す。

【タイタニック2】

今年夏公開される名作タイタニックの続編であるタイタニック２の主演女優はパリス・ヒルトン、主演男優はゾマホンである。

【法改 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gasevist.com"><img src="http://1-byte.jp/wp-content/uploads/2011/01/gasevist_logo.png" alt="gasevist_logo.png" title="gasevist_logo.png" border="0" width="600" height="100" /></a></p>
<ul>
<li>【マカーの本当の意味】</li>
<ul>
<li><strong>熱狂的なマクドナルドの信者</strong>のことを指す。</li>
</ul>
<li>【タイタニック2】</li>
<ul>
<li>今年夏公開される名作タイタニックの続編であるタイタニック２の主演女優はパリス・ヒルトン、主演男優は<strong>ゾマホン</strong>である。</li>
</ul>
<li>【法改正により】</li>
<ul>
<li>本年度から法改正により豚の生姜焼きを食べるときには、その都度役所で申請手続きが必要となった。違反した場合には<strong>仮釈放なしの無期懲役</strong>となる。</li>
</ul>
<li>【アンパンマンのチーズ】</li>
<ul>
<li>実はチーズは<strong>血統書付きのスーパードッグ</strong>。</li>
</ul>
<li>【gasevist VS trivist】</li>
<ul>
<li>実はトリビア共有サイト&#8221;<a href="http://trivist.com">trivist</a>&#8220;よりもガセビア共有サイト&#8221;<a href="http://gasevist.com">gasevist</a>&#8220;のほうが<strong>100倍面白い</strong>。</li>
</ul>
</ul>
<p>どうでしょう。<br />
どれが<em>本当のトリビア</em>か、わかりましたか？</p>
<p>ま、全て<strong>ガセ</strong>なんですけどね。<br />
最後のガセビアは、今後本当になるかもしれません。</p>
<p>こんなネタを共有できる<em>ガセビア共有サイト</em>&#8220;<a href="http://gasevist.com">gasevist</a>&#8220;を立ち上げました。</p>
<ul>
<li><a href="http://gasevist.com">『gasevist』ガセのトリビア・雑学の共有サイト</a></li>
</ul>
<p>今日は、こんなくだらない<a href="http://gasevist.com">gasevist</a>が出来るまでを記事にします。</p>
<h2>トリビア共有サイト&#8221;trivist&#8221;の記事がホッテントリ入りする</h2>
<p>先日書いたこの記事が<em>はてブのホッテントリ入り</em>しました。</p>
<ul>
<li><a href="http://1-byte.jp/2011/01/06/open_trivist/">1週間でトリビア共有サイト”trivist”を作ってみた</a></li>
</ul>
<p>ちょっとだけ狙ってタイトルを付けたので、&#8221;<em>はてブ100ぐらいはいくかな</em>&#8220;と考えていました。<br />
しかし、蓋を開けてみてびっくりしました。</p>
<ul>
<li>はてブ: <strong>455ブックマーク</strong></li>
<li>記事のページビュー: <em>8,271PV</em></li>
</ul>
<p>前回の記事を見た方がいないかもしれませんが、ここでお礼を言っておきます。</p>
<p><strong>いつも応援、ありがとうございます。</strong></p>
<p>この記事とトリビア共有サイト<a href="http://trivist.com">trivist</a>を立ち上げたときは、まだ、ガセビア共有サイト<a href="http://gasevist.com">gasevist</a>のことは<em>頭にありませんでした</em>。</p>
<h2>トリビア共有サイト&#8221;trivist&#8221;にあるはてブがつく</h2>
<p>トリビア共有サイト<a href="http://trivist.com">trivist</a>自体にある<strong>コメント付きのはてブ</strong>がつきます。</p>
<ul>
<li><a href="http://b.hatena.ne.jp/tktk3/20110108#bookmark-27970593">tktk3</a> <em>うそくせぇボタン</em>が欲しい</li>
<li><a href="http://b.hatena.ne.jp/unkology/20110107#bookmark-27970593">unkology</a> <em>がせぇボタン</em>が欲しい</li>
</ul>
<p><em>がせぇボタン？うそくせぇボタン？</em></p>
<p>確かに、Webからの投稿だと、<em>それが嘘だか、本当だか、わかりません</em>。<br />
中には嘘のトリビアもあるかもしれない。<br />
そのようなトリビアを判断するボタンが欲しいという要望です。</p>
<p>しかし、ここで<em>あるアイディア</em>が生まれます。</p>
<p>トリビアを集めるよりも、<strong>ガセビアを集めるほうが100倍面白い</strong>のでは？</p>
<p><em>ガセネタを投稿出来るサイト</em>があれば面白いと、コメント付きのはてブで気がついた訳です。</p>
<h2>1日でガセビア共有サイト&#8221;gasevist&#8221;を作ってみた</h2>
<p>この記事を書く前の記事のタイトルが、このサブタイトルです。<br />
しかし、ガセビア共有サイト<a href="http://gasevist.com">gasevist</a>は、トリビア共有サイト<a href="http://trivist.com">tirivist</a>をベースにほとんど変更していません。<br />
設定を変更するためのプレフィックス定数を追加しただけ。<br />
当たり前の記事になってしまうので、<em>このタイトルは却下されました</em>。</p>
<p>しかし、実際にgasevistは、<strong>ソースコードの変更からサーバの設定まで1日で完成しました</strong>。<br />
これもある意味、前回の&#8221;<em>ソースコードを書かない</em>&#8220;方針の延長です。</p>
<h2>開発の話を少し</h2>
<p>特に目新しいことはしていないのですが、開発周りの話をしておきます。</p>
<p><a href="http://gasevist.com">gasevist</a>と<a href="http://trivist.com">trivist</a>はまったく<em>ソースコードが同じ</em>です。<br />
サイトの判定には、<em>アプリケーションのルートディレクトリの&#8221;GASEVIST&#8221;ファイル</em>を使っています。<br />
GASEVISTファイルがアプリケーションルートに存在すれば、<a href="http://gasevist.com">gasevist</a>になり、存在しなければ、<a href="http://trivist.com">trivist</a>になります。</p>
<p>ソースコードに設定値を用意しても良いのですが、<em>開発時に逐次書き換えるのが面倒</em>なのでこうしています。<br />
GASEVISTファイルをgitの管理下から取り除き、開発時は</p>
<pre class="brush: bash;">
touch GASEVIST
</pre>
<p>とか、</p>
<pre class="brush: bash;">
rm GASEVIST
</pre>
<p>なんてコマンドを打って切り替えてます。</p>
<p>デプロイは<a href="https://github.com/capistrano/capistrano">Capistrano</a>で自動化されています。<br />
今回は、Capistranoのレシピに設定値を1つだけ追加しました。<br />
この設定値が存在した場合は、アプリケーションルートで&#8221;<em>touch GASEVIST</em>&#8220;が自動で実行されます。</p>
<p>さらにソースコードには、以下の行が追加されました。</p>
<pre class="brush: php;">
if (file_exists(APP . 'GASEVIST')) {
    define('PREFIX', 'gasevist_');
}
</pre>
<p>あとは、切り替えるファイルや設定値の前に<em>PREFIX</em>を付けるだけです。<br />
例えば、ロゴならこんな感じです。</p>
<pre class="brush: php;">
&lt;a href=&quot;/&quot;&gt;&lt;img src=&quot;/img/&lt;?php echo PREFIX; ?&gt;img_logo.gif&quot; /&gt;&lt;/a&gt;
</pre>
<p>今回、<em>変更したのはビュー側のみ</em>です。<br />
こういった切り分けがしっかり出来るのも、<strong>MVCフレームワークの強み</strong>でしょう。</p>
<p>これでソースコードの変更が終わったので、後はさくらサーバにVPS追加の申し込みを。<br />
設定は前回、紹介したセットアップスクリプトを使います。</p>
<ul>
<li><a href="https://github.com/tfmagician/setup_scripts">tfmagician/setup_scripts &#8211; GitHub</a></li>
</ul>
<p>trivistと同じサーバに載せても良かったのですが、&#8221;<em>月1000円ぐらい良いか</em>&#8220;と新しくVPSを作りました。<br />
Capistranoとセットアップスクリプトで、そんなに設定に時間が掛からないですしね。<br />
それに、<em>月1000円ならAdsenseで回収できます</em>。</p>
<p>これでガセビア共有サイト<a href="http://gasevist.com">gasevist</a>が完成です。</p>
<p>しかし、良い時代ですね。<br />
<em>アイディアもWebから、その実現もWebで出来ます</em>。</p>
<p>特にインフラ周りの進化がすごい。<br />
一昔前に、Webサイトを一つ立ち上げようと思ったら、<strong>こんなに格安にしかも、こんなに速く作れなかったはず</strong>。<br />
自宅サーバでやるにしても、その管理が大変ですからね。<br />
さくらサーバVPS、様様です。</p>
<p>次は、&#8221;<em>VPSのまとめ</em>&#8220;でも記事にしましょうか。</p>
<p><a href="http://gasevist.com">gasevist</a>もよろしくお願いします。<br />
<a href="http://trivist.com">trivist</a>と違って、<em>簡単に記事を投稿できる</em>ので、気軽にどうぞ。<br />
クスっと笑えるガセビアをお待ちしております。</p>
<p><a href="http://gasevist.com"><img src="http://1-byte.jp/wp-content/uploads/2011/01/gasevist_logo.png" alt="gasevist_logo.png" title="gasevist_logo.png" border="0" width="400" height="66" /></a><br />
<a href="http://gasevist.com">『gasevist』ガセのトリビア・雑学の共有サイト</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/01/27/open_gasevist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1週間でトリビア共有サイト&#8221;trivist&#8221;を作ってみた</title>
		<link>http://1-byte.jp/2011/01/06/open_trivist/</link>
		<comments>http://1-byte.jp/2011/01/06/open_trivist/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 01:00:57 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[開発環境]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[trivist]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[プラグイン]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=889</guid>
		<description><![CDATA[
ここのところ、ブログの更新もツイッターのつぶやきも完全にストップしていました。
集中力のない@tfmagicianにしては珍しいことです。
何をしていたか。
こんなウェブ・サービスを作っていましたよ。

『trivis [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://trivist.com"><img src="http://1-byte.jp/wp-content/uploads/2011/01/trivist_logo.png" alt="trivist_logo.png" title="trivist_logo.png" border="0" width="600" height="100" /></a></p>
<p>ここのところ、<em>ブログの更新</em>も<em>ツイッターのつぶやき</em>も完全にストップしていました。<br />
集中力のない<a href="http://twitter.com/tfmagician">@tfmagician</a>にしては珍しいことです。</p>
<p>何をしていたか。<br />
こんな<em>ウェブ・サービス</em>を作っていましたよ。</p>
<ul>
<li><a href="http://trivist.com">『trivist』おもしろいトリビア・雑学を紹介！</a></li>
</ul>
<p>実はこれ、<strong>作成期間1週間</strong>です。</p>
<p>シンプルなサイトなので、恐らく、開発に慣れた人なら1週間は余裕でしょう。<br />
今日は、<em>まだフレームワークを使った開発</em>、あるいは<em>ウェブ・サービスの開発自体に慣れていない人</em>に向けて、<strong>高速開発に関するtips</strong>を紹介します。</p>
<h2>高速開発とは何か考える</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/rapid_development.png" alt="rapid_development.png" title="rapid_development.png" border="0" width="256" height="256" /></p>
<p>まず、高速開発を可能にする&#8221;<em>最強最大の魔法</em>&#8220;を考えましょう。<br />
それはこれです。</p>
<p><strong>コーディングしない</strong></p>
<p>コーディングしないで、システムが出来ればなんと良いことか！<br />
これはエンジニアにとって、当たり前のことです。<br />
しかし、<em>これを念頭に置くのと置かないのでは、まるで開発速度が違ってきます</em>。</p>
<p>できるだけ、怠慢を考えます。</p>
<p>&#8220;<em>面倒だから、俺はコーディングしたくないんだよ！</em>&#8221;</p>
<p>これで良いんです。</p>
<h2>フレームワークを使う</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/cake-logo.png" alt="cake-logo.png" title="cake-logo.png" border="0" width="128" height="128" /></p>
<p><a href="http://trivist.com">trivist</a>ではフレームワークとして、<a href="http://cakephp.org">CakePHP</a>を採用しています。</p>
<p>フレームワークの効果は説明するまでもないでしょう。<br />
<em>様々な機能がパッケージングされており、高速開発を可能にします</em>。</p>
<p>また、フレームワークに乗ることで、<strong>複数プロジェクトで利用可能な共通資産が作成可能</strong>です。<br />
それが次の&#8221;<em>プラグインを使う</em>&#8220;です。</p>
<h2>プラグインを使う</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/development_with_plugin.png" alt="development_with_plugin.png" title="development_with_plugin.png" border="0" width="128" height="128" /></p>
<p>大抵のフレームワークには、<em>プラグインの機能</em>が備わっています。<br />
このプラグインを活用することで、高速開発が可能です。</p>
<p>例えば、<em>検索エンジン用のサイトマップ</em>。<br />
<a href="http://trivist.com">trivist</a>のように自動でページが増えていくサイトは、<em>自動でサイトマップを生成する必要があります</em>。<br />
MVCのフレームワークを使ったことがある人は、この処理がすぐにイメージ出来ます。</p>
<ol>
<li>モデル: id一覧の取得</li>
<li>コントローラ: id一覧からURLを生成する</li>
<li>ビュー: サイトマップの吐き出し</li>
</ol>
<p>こんなところでしょう。<br />
プラグインを知らない人は、この処理を<em>プロジェクト毎に毎回作成する</em>か、<em>コードを前のプロジェクトからコピーするか</em>のいずれかです。<br />
しかし、プラグインを知っていれば、これらの処理を<strong>どんなプロジェクトでも使えるように共通化する</strong>ことが出来ます。<br />
共通化したコードは、pluginsディレクトリに放り込むだけ。<br />
あとは、configディレクトリに設定ファイルを書いておしまいです。</p>
<p>これなら、ほとんどコードを書かなくて済みます。<br />
さらに、プラグインがしっかりテストされていれば、<em>アプリケーションにおけるこの部分のテストは、ほぼ省略出来ます</em>。</p>
<p><a href="http://trivist.com">trivist</a>では、以下のプラグインを使っています。</p>
<ul>
<li><a href="https://github.com/tfmagician/CakePHP-Twitter-API-Plugin">CakePHP-Twitter-API-Plugin</a></li>
<li><a href="https://github.com/CakeDC/tags">TagsPlugin</a></li>
<li><a href="https://github.com/CakeDC/utils">UtilsPlugin</a></li>
<li><a href="https://github.com/tfmagician/SitemapPlugin">SitemapPlugin</a></li>
<li><a href="https://github.com/CakeDC/migrations">MigrationsPlugin</a></li>
<li><a href="https://github.com/cakephp/debug_kit">DebugKit</a></li>
<li><a href="https://github.com/hiromi2424/CakePHP-Bitly-Helper">CakePHP-Bitly-Helper</a></li>
</ul>
<p>この中で特に強力なのが、<em>CakePHP-Twitter-API-Plugin</em>と<em>TagsPlugin</em>です。</p>
<p>CakePHP-Twitter-API-Pluginは、<em>TwitterのOAuth認証が2行で書けます</em>。<br />
(自身のユーザテーブルにデータを格納する処理は別途必要ですが)</p>
<p>TagsPluginは、<em>簡単にタグ付けとそのタグクラウドを実装できます</em>。<br />
タグ登録時の分割処理も自分で書く必要がありません。<br />
いつもの感覚でデータを保存すると、勝手にタグ付けして、勝手にタグクラウドを作ってくれます。</p>
<p>UtilsPluginの<em>CsvImportBehavior</em>も便利です。</p>
<p>と、話出したら止まらないので、ここまでにします。<br />
<strong>よくある機能は自分で実装する前に、プラグインを探してみましょう</strong>。</p>
<h2>ブログパーツを使う</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/development_with_widgets.jpg" alt="development_with_widgets.jpg" title="development_with_widgets.jpg" border="0" width="128" height="128" /></p>
<p><em>ブログパーツ</em>も活用しましょう。<br />
最近のウェブ・サービスで必要となるのが、<strong>ソーシャルメディアのコメントを表示する機能</strong>と<strong>検索機能</strong>です。<br />
<a href="http://trivist.com">trivist</a>では、以下のブログパーツを活用しています。</p>
<ul>
<li><a href="http://zenback.jp/">Zenback</a></li>
<li><a href="http://www.google.com/cse/?hl=ja">Googleカスタム検索</a></li>
</ul>
<p>ソーシャルメディアのコメントを取得するのって、結構面倒なんですよね。<br />
<em>対応するサービス分のコードを書く必要がある</em>。<br />
また、データが膨大に増えていくのも気になります。</p>
<p><a href="http://zenback.jp/">Zenback</a>は、各ページのソーシャルメディアのコメントを自動で表示してくれるブログパーツです。<br />
<em>jsのコードを貼り付けるだけのお手軽実装</em>です。<br />
これで、どれだけ工数が削減できることか。</p>
<p>検索機能は、<em>全文検索</em>に対応させる必要があります。<br />
その上、<em>検索結果のランク付け</em>も必要です。</p>
<p>そこはもう、本業のGoogleさんに任せてしまいましょう。<br />
<a href="http://www.google.com/cse/?hl=ja">Googleカスタム検索</a>も導入は簡単。<br />
これで、検索実装からも解放されます。</p>
<p>このように、<strong>ソースコードだけでなく、外部サービスも活用します</strong>。<br />
アクセスの少ない立ち上げ当初は、これで十分かと。</p>
<h2>自動化する</h2>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/auto_deploy.png" alt="auto_deploy.png" title="auto_deploy.png" border="0" width="128" height="128" /></p>
<p>ここまで来たら、<em>サーバも晒します</em>。</p>
<ul>
<li><a href="http://vps.sakura.ad.jp/">さくらサーバVPS</a></li>
<ul>
<li>OS: Ubuntu 10.04</li>
<li>メモリ: 512M</li>
<li>構成: Apache2, MySQL5, PHP5</li>
</ul>
</ul>
<p><em>さくらサーバVPS標準のCentOS</em>でなく、<strong>Ubuntuを使っていること</strong>にはいくつか理由があります。</p>
<ul>
<li>最新のパッケージや比較的マイナーなパッケージを、自分でビルドせずに使える</li>
<li>セットアップスクリプトをUbuntu 10.04用に書き溜めてある</li>
</ul>
<p>特に大きいのは、2つ目です。<br />
セットアップスクリプトを書き溜めることで、<em>サーバのセットアップを効率化します</em>。</p>
<ul>
<li><a href="https://github.com/tfmagician/setup_scripts">tfmagician/setup_scripts &#8211; GitHub</a></li>
</ul>
<p>先程の構成を作るには、apache_phpスクリプトとmysqlスクリプトを実行して、設定ファイルを少し変更するだけです。</p>
<p>また、アプリケーション自体のデプロイは、Capistranoのレシピを使います。<br />
CakePHP用のレシピを作ってあるので、それを適用するだけで、自動デプロイ環境が完成です。</p>
<p>サーバ関連の作業で重要なのは、<strong>一回こっきりの作業をしないこと</strong>です。<br />
大抵の作業は、必ずと言っていいほど再び行います。<br />
<em>それを見越して、予め準備しておきましょう</em>。</p>
<p>どうでしょうか。<br />
<em>1週間でウェブ・サービスを立ち上げられる気</em>がしてきましたか。</p>
<p>とにかく、<em>あるモノをとことん利用しましょう</em>。<br />
あなたの欲しいモノは、<strong>恐らく世界の誰かがすでに作っています</strong>。<br />
せっかく、公開されているのに使わなければ損です。<br />
それが自分の要求を満たさなくても、改造することで自分の要求を満たせないか、考えてみましょう。<br />
自分で作るよりも、そっちのほうが絶対に早いです。</p>
<p><em>最後に、<a href="http://trivist.com">trivist</a>の応援もお願いします！</em><br />
うまく起動に乗れば、もっと機能を拡張したいと考えています。<br />
もっと、共有機能を充実して、仲間内で楽しめるサイトになれば、と。<br />
<strong>どんなトリビアでも良いので、投稿お願いします</strong>。</p>
<p><a href="http://trivist.com"><img src="http://1-byte.jp/wp-content/uploads/2011/01/trivist_logo1.png" alt="trivist_logo.png" title="trivist_logo.png" border="0" width="400" height="66" /></a><br />
<a href="http://trivist.com">『trivist』おもしろいトリビア・雑学を紹介！</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/01/06/open_trivist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[イベント告知] この春はCakePHP温泉部でゆったりと</title>
		<link>http://1-byte.jp/2011/01/06/cakespa/</link>
		<comments>http://1-byte.jp/2011/01/06/cakespa/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 23:00:35 +0000</pubDate>
		<dc:creator>tfmagician</dc:creator>
				<category><![CDATA[Event]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://1-byte.jp/?p=874</guid>
		<description><![CDATA[
かなり、告知が遅れてしまいましたが、スタッフとして宣伝記事を書いておきます。
しかも、募集締め切りまであと4日しかない。
本当はすぐに記事にしようと思っていたのですが、何かと忙しく。
何の話&#8230;？
そう、Ca [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/cakespa.jpg" alt="cakespa.jpg" title="cakespa.jpg" border="0" width="600" height="450" /></p>
<p>かなり、告知が遅れてしまいましたが、<em>スタッフとして宣伝記事を書いておきます</em>。<br />
しかも、募集締め切りまで<strong>あと4日しかない</strong>。<br />
本当はすぐに記事にしようと思っていたのですが、何かと忙しく。</p>
<p>何の話&#8230;？<br />
そう、<em>CakePHP温泉部</em>のお誘いです。<br />
&#8220;<em>温泉に入ってゆっくりしよう</em>&#8220;という会です。</p>
<ul>
<li><a href="http://blog.ecworks.jp/archives/1359">【CakePHP温泉部】第２回開催のご案内と受付開始！</a></li>
</ul>
<p>第1回CakePHP温泉部を振り返りながら、この会の内容を紹介してみます。</p>
<h2>箱根と温泉</h2>
<p>CakePHP温泉部は、今年が<strong>第2回目</strong>。</p>
<p>去年が<em>記念すべき第1回目</em>です。<br />
去年のCakePHP温泉部は写真の通り。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/photo_mt_fuji.jpg" alt="photo_mt_fuji.jpg" title="photo_mt_fuji.jpg" border="0" width="500" height="375" /></p>
<p>え、なんで<strong>富士山</strong>？</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/photo_hotel.jpg" alt="photo_hotel.jpg" title="photo_hotel.jpg" border="0" width="500" height="335" /></p>
<p>それに、<em>CakePHP温泉部の看板</em>を持った和気あいあいとした集合写真。</p>
<p>富士山は開催場所である箱根から帰る途中に撮ったモノ。<br />
CakePHP温泉部の看板を持った集合写真は、旅館を後にするときにスタッフの方が撮ってくれたモノです。</p>
<p>第1回CakePHP温泉部は、これぐらい<em>フリーでノープランな会</em>でした。<br />
ちょっとした発表もしましたが、<strong>勉強会より格段にゆるい形</strong>で行われました。<br />
(そもそも、<a href="http://twitter.com/ecworks_masap">MASA-P</a>さん以外、発表資料をCakePHP温泉部のために用意していなかったし！)</p>
<p><a href="http://www.slideshare.net/tfmagician/my-development-story" class="replace">CakePHP + My Development Story</a></p>
<p>これが私の去年の発表資料です。<br />
レベルが低く、ちょっと恥ずかしいです。</p>
<p>この資料も、<em>行きの<a href="http://twitter.com/ecworks_masap">MASA-P</a>さんの車の中</em>で作りました。<br />
あの時は渋滞で遅れて、スタバでこれを作ってたっけ。</p>
<p>スタッフ・ミーティングも<em>1度しかしていないし</em>、やることも<em>大して決まっていないし</em>。<br />
<em>2日目なんて特にノープラン</em>。<br />
あ、これ以上言うと逆に来る人が少なくなりそうですね。</p>
<p>とにかく、&#8221;<strong>CakePHP温泉部はとーってもゆるい会ですよ。</strong>&#8220;というのを知ってもらいたいのです。</p>
<h2>小田原とかまぼこ</h2>
<p>もはや、タイトルが<em>意味不明</em>です。<br />
しかし、去年の参加者は思い出して、<em>懐かしめる(笑える)</em>はずです。</p>
<p><img src="http://1-byte.jp/wp-content/uploads/2011/01/kamaboko.jpg" alt="kamaboko.jpg" title="kamaboko.jpg" border="0" width="335" height="223" /><br />
<cite><a href="http://www.kamaboko.com/sato/">鈴廣かまぼこの里</a></cite></p>
<p>帰りに、<em>小田原のかまぼこの里</em>に寄りました。</p>
<p>ちょうど時期的にはバレンタインデー。<br />
バレンタインチョコならぬ、<em>バレンタインかまぼこ</em>が売られていました。<br />
写真がないのが残念ですが。</p>
<p>この企画も初めからあった訳でなく、<a href="http://twitter.com/hidetoshing">@hidetoshing</a>さんの提案で決まりました。</p>
<p>私は、<em>参加者の半分以上と初対面</em>でした。<br />
恐らく、他の方々もそうだったはず。</p>
<p>それが何故だか、<strong>こんな(?)かまぼこ館に行くぐらい仲良くなっていまいました</strong>。<br />
これも温泉効果でしょう。</p>
<h2>おまけのCakePHP</h2>
<p>もう、CakePHPはある意味&#8221;<em>おまけ</em>&#8220;です。<br />
とはいえ、ちゃんとCakePHPトークでも盛り上がりました。</p>
<p>第1回CakePHP温泉部では、主に<em>CakePHPで作られたCMS</em>を触って楽しんでいました。</p>
<ul>
<li><a href="http://basercms.net/">BaserCMS</a></li>
<li><a href="http://croogo.org/">Croogo</a></li>
<li><a href="http://wf.klevo.sk/">Wildflower</a></li>
</ul>
<p>特に<strong>BaserCMS</strong>は盛り上がりました。<br />
皆でわいわいと協力しながら、BaserCMSの環境を準備したり。<br />
<em>XAMPじゃ駄目だ、MAMPを使え、いやいや仮想化でしょう。</em><br />
なんて話をしたり。</p>
<p>最近はMacユーザが多いですが、CakePHP温泉部では半分ぐらいがWindowsユーザでした。<br />
そのおかげか、<em>BaserCMSの区切り文字定数DSに関するバグ</em>を発見出来ました。<br />
ある意味、BaserCMSのテスト大会になっていましたね。</p>
<p>この話は<a href="http://twitter.com/konsan">@konsan</a>さんの記事を読むとわかります。</p>
<ul>
<li><a href="http://www.ban-systems.com/wordpress/?p=61">第１回cakePHP温泉部に参加した</a></li>
</ul>
<p>これで、<em>CakePHP温泉部の概要</em>はわかったのではないでしょうか。<br />
主催者<a href="http://twitter.com/ecworks_masap">MASA-P</a>さんの言う通り、</p>
<p><strong>温泉に入って日頃の疲れを癒す</strong></p>
<p>がこの会の目的なんです。<br />
温泉に浸かりながら、ゆっくり、ゆったり、まったりとCakePHPトークでもしましょう。</p>
<p>&#8220;<em>こんなゆるい会で大丈夫か</em>&#8220;と思った方もいるでしょう。<br />
しかし、今回は前回の反省を踏まえてプランニングしています。<br />
恐らく、前回よりは内容的に有意義になるはず。<br />
&#8220;<em>前回のいいところを残しつつ、もうちょっと温泉部としての成果物を出せれば良いな</em>&#8220;と考えています。</p>
<p>こんな会なので、誰でも大歓迎です！<br />
CakePHPを触ったことがない人でも大丈夫です。<br />
興味があれば参加してみてください。<br />
色々と勉強になると思いますよ。</p>
<p>参加したい人は<a href="http://twitter.com/ecworks_masap">MASA-P</a>さんのブログからどうぞ。<br />
<em>締切りは10日まで、残り枠は4名程度です</em>。<br />
応募はお早めに。</p>
<ul>
<li><a href="http://blog.ecworks.jp/archives/1359">【CakePHP温泉部】第２回開催のご案内と受付開始！</a></li>
</ul>
<p>それでは、CakePHP温泉部で会いましょう！</p>
]]></content:encoded>
			<wfw:commentRss>http://1-byte.jp/2011/01/06/cakespa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

