ホーム > タグ > 初心者
初心者
Pythonista見習いから、少しだけステップアップするための9クエスチョン from Quora
- 2011年4月14日 10:00 AM
- Python

Pythonistaとしてステップアップするには何が必要か。
それは、
Pythonの弱みと強みを知ること
でしょう。
これは他言語にも言えます。
Pythonを含め、プログラミング言語は道具です。
道具を使うためには、その道具の最適な使い道を知ってる必要があります。
ただ、このような情報は、なかなか手に入りません。
ブログの記事は、書いた人の好みのバイアスが掛かっているため、鵜呑みに出来ません。
道具を使いこなすには、自分自身で長時間、その道具に触れること。
そして、他の人がどのように使っているのか、知ることが必要です。
そうして、その道具の強みと弱みを見出していきます。
前者は、あなたがひたすらに、時間を費やすしかありません。
しかし、後者に関しては良い方法があります。
それが、Quoraです。
今日は、QuoraからPythonに関する質問をピックアップしていきます。
Pythonの弱みは、何か?
まずは、Pythonの弱みに関する質問です。
“Pythonを使っていて微妙に思う点“がまとまっています。
スコープに関する話、インデントに関する話、lambda式に関する話…。
一度見ておくと、Pythonの弱みが見えてきます。
なぜ、PythonはPHPより良いのか?
1-byte.jpで取り上げる、もう一つの言語といえばPHPです。
つまり、この質問は外せません。
“PHPとPythonの比較“がまとまっています。
PHPとPythonを両方使ったことがある人は、ここに書いてある内容に納得してしまいます。
確かに、Pythonではこんなことが出来て、PHPでは出来ないな…と。
どのプログラミング言語を始めるべきか、悩んでいる人も読んでおくと良いかと。
PHPにない、Pythonの便利な機能は?
こちらは、”PHPとPythonにおける機能面の比較“です。
先程の記事とは違い、コードベースでPHPとPythonが比較されています。
Pythonにはない、Rubyの良さは?
この質問を読むと、RubyとPythonがよく似た言語であることがわかります。
その中でも、”Pythonにはない、Rubyの使いやすい機能“がまとまっています。
これも、どの言語を始めるべきか、悩んでいる人にお勧めです。
ただし、Pythonistaがこれを読んでいると、Rubyも触りたくなるので、注意が必要です。
比較演算子を2回書かずに、値をn以上m以下で比較できる言語は?
私は、この観点で言語を比較したことがありませんでした。
確かに、
if (1 < $a and $a < 10) {
print 'True'
}
と書くのは野暮ったいですよね。
Pythonのデコレータの主な使い道は?
デコレータを理解すれば、Pythonistaとしての幅が広がるはずです。
簡単な例と共に、デコレータの使い方が紹介されています。
まだ、デコレータなんて使ったことがない、という人にもお勧めです。
皆が嫌いな言語は?
ブログでも良く、この手の話が議論されますね。
俺はこの言語が嫌いだ。俺はPHPが嫌いだ。PHPなんて…(ry
筆頭に上がるのはPHPでしょうが、それ以外の言語もたくさん解答されています。
言語の強みと弱みを知るために、読んでおくと良いかもしれません。
どんな企業がPythonを使ってる?
この質問は、Quoraの真骨頂です。
Quora上には、有名な企業に務めるエンジニアがたくさんいます。
そのため、こういった質問には多くの答えが返ってきます。
どんな企業が、Pythonを活用しているのか。
そして、自分たちがどの言語を使うべきなのか、見定めるのに参考になります。
なぜ、QuoraはPythonを選んだのか?
最後はQuoraに関する質問で閉めましょう。
Quoraは冒頭で述べたとおり、Pythonで出来ています。
この質問では、Quora創設者のAdamがPythonと他言語と比較しながら、Pythonの優位性を語っています。
Pythonの強みを知ることが出来ます。
いかがでしょうか。
ここに上げた質問はいずれも、ブログの記事として取り上げられません。
また、あったとしても、それはその人の意見です。
一度に、これほどたくさんの意見を得ることは出来ません。
また、QuoraがPythonで作られているせいなのか、たくさんのPythonistaがいます。
新たに質問を作っても、すぐに答えてくれます。
これは私が試しに投げた質問ですが、1時間で4つの解答が得られました。
ぜひ、Quoraを活用してください。
そして、一緒に、Pythonistaとしてステップアップしていきましょう。
おまけ
Pythonに限らず、こんな質問も上がってたり。
A Hard Days Nightのイントロのコードって、ビートルズの謎の一つなんですよね。
より良いPHPerになるための20Tips
- 2011年3月20日 10:00 AM
- PHP

去年の話ですが、海外でこんな記事が上がっていました。
記事の内容は、かなりレベルが低いです。
しかし、初心者のうちに知っておけば、より早く成長出来るでしょう。
初心者PHPerのために、この記事の翻訳を載せます。
2011年03月21日 追記
この記事の補足が、他の方によって書かれています。
この記事に対する自分の意見を、先に載せておくべきだったかも。
実は色々と痛い目を見ると、この下の記事の悪いところと、上記記事の良いところがわかります。
だけど、初めはわからないんですよね…。
20 Tips you need to learn to become a better PHP Programmer
PHPは、同じオブジェクトの扱い方でも複数の書き方を持っている、とても気まぐれなプログラミング言語だ。
詳しくは、私の書いた”The Art of Programming“を読むと良い。
これから書くTipsは、過去のプロジェクトから私が学んだコードの可読性、メンテナンス性を上げ、あなたを素晴らしい、より進んだPHPプログラマーにするものだ。
それじゃ、始めよう。
1. <?phpと?>を使え
スクリプトを書くにあたり、<?と?>を使うのを忘れること。
これらを使ったスクリプトがあなたのサーバで動いたとしても、他のサーバで動かないかもしれない。
同様に、変数をechoするときもショートタグを使うのを止めるんだ。
慣れた人がこれを使うのを止めるのは、正直、難しい。
けど、止めることで最終的にポータブルなコードが書けるんだ。
<? ... ?> // Incorrect <?php ... ?> // Correct
<?=$Var?> // Incorrect <?php echo $Var ?> // Correct
2. 設定ファイルを分離せよ
あなたのスクリプトファイルに設定値が追加すべきであるということは、言うまでもないよね。
あなたはいつでも、設定ファイルを分離して、スクリプトの頭でインクルードすべきだ。
こうしておけば、設定を書き換える必要が出てきても、設定ファイルの一部を書き換えるだけで良い。
ファイルのインクルードはとても簡単だ。
<?php
include("config.php");
// code goes here ...
3. コメントは君の友達
そう、あなたはこんな状況に遭遇したことがあるんじゃ?
私たちが少し前に書いたコードを理解出来なくなるのは、本当に驚くべきことだ。
コメントは、そのときに考えていたことを思い出させてくれる。
シンタックスはこう。
<?php // Line One Comment // Line Two Comment /** Paragraph Comment Paragraph Comment Paragraph Comment **/
簡単でしょ?
4. インデントとスペースを使え
まったく正しくインデントされていない、誰が書いたかわからないコードを変更することほど、最低なことはないね。
正しくインデントされたコードは、あなたがプログラマーだってことを示している。
理想的なコードは、ループがそこで終わりだか、終わりでないんだか、が一目で分かるんだ。
これは、不適切にインデントされたコードだ。
<?php
function dothisformula($a,$b) { $c = $b+$a;
$e=3;
while ($c < 20) {
$e = $e - 1; $c = $c + 1; }
return $e; }
そして、こっちが正しいコード。
<?php
function dothisformula($a, $b) {
$c = $b + $a;
$e = 3;
while ($c < 20) {
$e = $e - 1;
$c = $c + 1;
}
return $e;
}
スペースの重要性が分かった?
5. 変数名に意味を持たせよ
変数に意味を持たせることは、いつもあなたのためになる。
データの型まで分かると、更に良い。
例えば、integer型の変数には、変数名のプレフィックスとしてiをつける。
変数に型宣言しないPHPにおいて、これは特に重要だ。
変数名の頭文字を大文字にするかどうかは、あなた次第だ。
しかし、読み易さから言っても、単語の先頭は大文字にすることをお勧めする。
こんな感じだ。
<?php $iNumber = 10; // For Integers $sName = "Marc"; // For Strings $fPi = 3.14159265; // For Floats $aNames = array(); // For Arrays $oUser = new User(); // For Objects $bIsMember = false; // For Booleans
6. 変数を初期化せよ
PHPでは、変数に値を代入するたびに、自動で変数を定義してくれる。
しかし、変数を使う前に初期化するのは、良い癖だ。
これをすることで、コードが明確になるし、変数の内容があなたの思い通りの値になる。
<?php $aArray = array(); $iInteger = 0; $bBoolean = false; Boolean is False, unless True
7. 返り値は常にFalseに、Trueじゃない限りは
もし、あなたが特定の値であるか、どうかを判定するコードを書いたとする。
そのコード判定は望む値になった場合を除き、常にfalseを返すべきだ。
例えば、以下のようなコードは書かない方が良い。
<?php
function getStatus() {
$bReturn = true;
if ($i != 2) $bReturn = false;
return $bReturn;
}
この代わりに、あなたはこう書くべきだ。
<?php
function getStatus() {
$bReturn = false;
if ($i == 2) $bReturn = true;
return $bReturn;
}
二番目の例は、値をチェックする場合の理想的な方法だ。
なぜかって?あなたがデータベースから値を取り出すときを、想像してみて欲しい。
もし、何かしらの理由で、あなたの書いたif文が間違っていたら?
この書き方をしていれば、間違った値に対して、常にfalseが返る。
私たちが、PHPでsensitiveなデータを取り扱うなら、正しいデータが入力されるまでは、動かないコードを書くべきだ。
これは私の経験上、特にね。
最終的に、バリデーションとは、あなたのデータがあなたの思い描く通りであるか、それともそうでないかを判断するべきものだ。
8. 配列のキーにアクセスする場合はクオートで囲う
配列にアクセスする場合、以下のどちらのコードでもPHPでは動く。
<?php $sName = $aNames['marc']; $sName = $aNames[marc];
二つ目のコードは、PHPはまず始めに、marcと名付けられた定数を探しに行き、もし存在すればその値に置き換える。
そう、大抵の場合、これでも動く。
しかし、もし、同じ名前の定数が定義されていたら?
その場合、あなたのスクリプトは動作しなくなるんだ。
9. echoするときにはコンマを使え
もし、文字列を変数の値と一緒に出力するとき、PHPではドットの代わりにコンマを使うことが使える。
なぜ?ドットを使うよりも僅かに速いからね(以下のコードでテストした場合は)。
<?php echo "Hello, my name is ", $sName;
以下の代わりに上記のコードを使う。
<?php echo "Hello, my name is " . $sName;
10. 三項演算子を使え
もし、シンプルなif文を書きたいなら、三項演算子を使って、ワンラインで通常のif文を書くのと同じことが書ける。
<?php if ($a == 1) $b = 2; else $b = 3;
上記のコードは、以下の三項演算子を使ったのと同じことだ。
<?php $b = ($a == 1) ? 2 : 3;
簡単でしょ?三項演算子は、以下のようによく使われるね。
<?php $variable = (CONDITION) ? IFTRUE : IFFALSE; Use === for Boolean Checks
11. 真偽値のチェックには===を使え
もし、あなたが変数がtrueかfalseか、チェックしなければ行けない場合、==よりも===を使おう。
この三つ連なるイコールは、PHPに値のチェックと同時に、タイプのチェックまでさせる。
<?php
if ($bIsMember == true) { ... } // Incorrect
if ($bIsMember === true) { ... } // Correct
Use ++ and — Operators
12. ++と–の演算子を使え
整数を減少あるいは増加させる場合、インクリメントあるいはデクリメントの演算子が使える。
もし、あなたがこんなコードを書いているなら、
<?php $iNumber = $iNumber + 1; $iNumber2 = $iNumber2 - 1;
こう変換すべきだ。
<?php $iNumber++; $iNumber2--;
この演算子の優れているところは、他演算の実行中にも使えることだ(例えば、ifとかwhileのステートメントだ)。
++とか–の演算子は、変数の前に置くか、後に置くかで、動作が異なる。
前に置けば、その動作が完了する前に、後に置けば、その動作が完了した後にインクリメント、あるいはデクリメントが実行される。
以下の例は、あなたの、この演算子の理解を助けてくれるだろう。
<?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だ。
13. 代入演算子を使え
もし、あなたが2以上の数値をインクリメントあるいは、デクリメントしたいとする。
その場合、代入演算子が便利だ。
もし、こんなコードがあったとしたら、
<?php $a = $a + $b; $a = $a * 5; $a = $a - $d; $a = $a / 3;
代入演算子を使って、次のように書き直せる。
<?php $a += $b; $a *= 5; $a -= $d; $a /= 3;
これは、もちろん文字列にも使える。次の二行のコードは同じ意味だ。
<?php $sString = $sString . "hello"; $sString .= "hello";
14. 変数のdump関数を作れ
私たちは、テストをする上で変数の値を確認するためによく、print_rにはお世話になる。
これをさらに簡単にするために、次のような関数を作ろう。
<?php
function p($var) {
echo "<pre>";
print_r($var);
echo "</pre>";
}
これはあなたの変数dumpを常に、読みやすいようにpreタグで括る物だ。
ついでに、関数名を一文字にすることで、使いやすくもなる。
15. 定数を使え
もし、変更されない変数を使ってるんだとしたら、それは書き直せる必要はないよね。
よくアクセスする、例えばディレクトリパスやエラーメッセージなどは、定数化しよう。
定数名には、全て大文字を使うことをお勧めする。
こうすることで、コード中でそれが定数であることが、わかりやすくなる。
<?php
define ("DIRECTORY","/path/to/site/");
echo DIRECTORY;
16. $_GETと$_POSTを使え
$_REQUEST変数のことは忘れよう。
URLからGETパラメータが欲しいときは$_GETを、フォームからPOSTパラメータが欲しいときは、$_POSTを使おう。
<?php $sAction = $_GET['actions']; $sName = $_POST['name'];
こうすることで外部のユーザは、URLを操作することによって、フォームの値を変更出来なくなる。
17. 関数の代わりにオブジェクトを使え
もし、たくさんの引数と共に関数を使っていたのなら、それはオブジェクトに移行するときが来たのだ。
私は、メンテナンスのしにくい、とても複雑な関数が定義されているプロジェクトで働いていたこともある。
そう、引数が20個もある関数がいくつか定義されているのだ。
こんなとき、あなたは変数の呼び出し方法を変更する必要があるだろう、それも全ての関数において。
この関数では、
<?php
function getProducts($iParameter1, $iParameter2,
$iParameter3, $iParameter4, $iParameter5,
$iParameter6, $iParameter7, $iParameter8,
$iParameter9) { ... }
こう変更することが出来る。
<?php $oProducts->setParameter1(...); $oProducts->setParameter3(...); $oProducts->setParameter5(...); $oProducts->setParameter6(...); $oProducts->getProducts();
18. メソッドチェインを使え
もし、あなたが複数回オブジェクトのメソッドを呼び出し、変数にセットするなら、メソッドチェインを使うことで、コードをシンプルに出来る。
メソッドチェインの方法は簡単で、各メソッドに返り値に$thisをセットするだけだ。
次のコードは、
<?php
class User {
function setThis($iVar) {
....
return $this;
}
function setThis2($iVar2) {
....
return $this;
}
}
次のようにメソッドチェインに書き換えることが出来る。
<?php
$oUser = new User();
$oUser->setThis(...)
->setThis2();
これであなたのコードは、より短く、より素晴らしくなるよ。
19. コードの繰り返しを止めよ
どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。
それか、オブジェクトに変えてしまえ。この作業は面倒かもしれない。
しかし、アプリケーションが大きくなればなるほど、その対価を支払う価値がある。
簡単な例は以下だ。
<?php
$a = 1;
while ($a < 10) {
$b = $a * 10;
$c = $b * 2;
$d = $c * $b;
echo $d;
$a++;
}
これは、次のように書き換えれる。
<?php
function multiply($iVar, $iVar2) {
return ($iVar*$iVar2);
}
$a = 1;
while ($a < 10) {
$b = multiply($a, 10);
$c = multiply($b, 2);
$d = multiply($c, $b);
echo $d;
$a++;
}
もちろん、これはとても簡単な例だ。
この方法は、コードの繰り返し箇所が多くなればなるほど、より便利になる。
20. 結合度を減らし、独立性を保て
結合度は一つのコンポーネントを変えたときに、どれだけのコンポーネントに影響を与えるか、ってことだ。
言い方を変えると、もしあなたがある関数を変えたとして、他の関数を変える必要があるかどうか、ということ。
結合度を下げること、それはつまり、他に影響を与えないようにコンポーネントを変更することだ。
一方で、独立性はそれぞれを意味のあるユニットに分けることだ。
あなたのメイン関数は、全てのことを担ってる?
それとも、たくさんの特定の仕事をする関数から出来てる?
もし、そうなら、強い独立性を持っていることになる。強い独立性を持つと、その関数の責任が明確になり、その関数が自分に関係ない処理を行う場合に、他の関数を呼び出すようになる。
PHPプログラマの諸君は、コンポーネントを定義する場合、アプリケーションのメンテナンスを楽に、そして拡張性を高めるために、結合度を弱くし、独立性を強くするように気をつけるべきだ。
例え、関数を一つ作るだけであっても、このことは心に留めておくべきだ。
独立性の高いコードを常に正しく追加しよう。
そうすれば、あなたがシステムの一部を変更する場合に、他の部分を変更しなくても良くなるんだ。
こんなコードがあったとしよう(もちろん、これはシンプルな例だが)
<?php
// We want to add two numbers
// only if the first number is
// lower than 5
function add($iVar, $iVar2) {
if ($iVar < 5) return false;
else $iResult = $iVar+$iVar2;
echo "The Result is ", $iResult;
}
$iVar = 3;
$iVar2 = 2;
add($iVar, $iVar2);
この例は、バリデーションを関数内に含んでいることで、独立性が弱く、結合度が高くなってしまっている。
結果の出力を関数内に置くことは、それ自体大きな問題だ。
もし、この関数を複数箇所で使っていたとして、テキストを変更したい場合に、全ての箇所の変更を考慮しなければいけないのだから。
もっと良いのは次のコードだ。
<?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 "The Result is " . $sMessage;
}
$iVar = 3;
$iVar2 = 2;
if ($iVar < 5) {
echo result(add($iVar, $iVar2));
}
こうすることで、addとresultの関数をコードの至る所で使うことが出来る。
そして、他のコードを気にすることなく、各関数を変更することが出来るんだ。
最後に
このTipsは分かりやすく、短く、そしてよりまとまったコードを書くのを助けてくれる。
これらの例はとてもシンプルだが、それぞれのコンセプトを理解するのに役立つものだ。
もし、あなたがこれらの一つにでも同意出来ないなら、ブログにコメントを。
私たちはそこからさらに、学べる。
おまけ
もし、あなたがPHPプログラマなら、公式のPHPドキュメントはあなたのバイブルだ。
私は、それぞれのセクションを眺めて、各関数でどんなことが出来るのか確認することをお勧めする。
あなたは、PHPで用意された既製関数で多くのことが実現できることに、驚くはずだ。
この記事があなたの役に立つことを。
どんなコメントでも待ってます。
ありがとう!
個人的な感想
この記事に書かれている内容は、レベルがかなり低いです。
例えば、”4. インデントとスペースを使え”。
これはプログラマとしては、当たり前のことです。
しかし、ここに書かれている大半のことは、多くの初心者PHPerが迷うことでもあります。
記事の途中でもありますが、PHPは”多くの書き方が出来る気まぐれな言語“です。
だからこそ、これらのことを知らずに、何となくプログラムが書けるようになったとき、そこで満足してしまい、良いコードが書けなくなるのでしょう。
私自身、PHPを始めたときに、この記事を知っていればもっと早く良いコードが書けるようになったのでは、と思います。
初心者PHPerの皆さんは、この記事を足がかりに、コードを洗練させていってください。
(個人的なおまけ: より良いコードを書くには、より良い人のコードを読むことが大事ですよ!)
CakePHP開発者が知るべき10のこと
- 2011年3月9日 10:00 AM
- CakePHP

先日、こんな記事が上がっていました。
この記事でまとまっているのは、Android開発において必要な10の項目です。
インターフェースの設計から、データの取り扱いまで。
AndroidはモバイルデバイスのOSで、CakePHPは単なるWebフレームワーク。
しかし、予め用意されたルールやAPIを活用する点は同じです。
つまり、フレームワーク全般において、開発者が知るべきことをまとめることが出来るはずです。
ここでは、私が良く利用するCakePHPフレームワークについて、開発者が知るべき10のことをまとめます。
フォーラムにこの記事を書き込んだところ、shunさんがtipsを追記してくれています!
モデルに、配列を取り入れた経緯などを紹介してくれています。
こちらも併せてどうぞ。
1. CakePHPで良いのか

CakePHPを使う際に、知るべきことその1。
それは、あなたは本当にCakePHPを使うべきなのかということです。
現在、あらゆるフレームワークが溢れ返っています。
- Ruby
- Ruby On Rails
- Sinatra
- Python
- Django
- Pylons
- Juno
- Perl
- Catalyst
- CGI::Application
- PHP
- CakePHP
- Zend Framework
- Symforny
- Lemonade
- Java
- Stuts
- Slim3
これだけあるフレームワークの中で、なぜ、私はCakePHPを選ぶのか。
そもそも、その開発に使う言語は、本当にPHPで良いのか。
なぜ、PHPを使うのか。
例えば、Quoraを立ち上げた、Facebookの元CTOのAdam D’Angeloさんはこんなことを言っています。
PHP was out of the question. Facebook is stuck on that for legacy reasons, not because it’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.
Why did Quora choose Python for its development?より
少し、古い記事ですが、現在のウェブではこれが現実でしょう。
Google App Engine、Amazon AWS、あるいはその他のPaaS。
環境を用意するのは、昔ほど難しくありません。
そして、コストもさほど高くありません。
私は、”PHP/CakePHPを使うな“と言っているのではありません。
盲目的にならず、その開発がどんなものかを考えて、フレームワーク選ぶべきだと言っているのです。
これは、CakePHPに限ったことではありませんが。
2. CakePHPの癖を知る

CakePHPを使うとして、次に知るべきことはCakePHPの癖です。
特にデータの取り扱い、つまりモデル周りには、癖があります。
>>> from mysite.polls.models import Poll, Choice # モデルクラスを import します。 # まだ Poll は一つもできていません。 >>> Poll.objects.all() [] # 新たな Poll を作成しましょう。 >>> import datetime >>> p = Poll(question="What's up?", pub_date=datetime.datetime.now()) # 出来たオブジェクトをデータベースに保存します。 save() は明示的に呼ば # ねばなりません。 >>> p.save() # これでオブジェクトに ID が割り当てられました。お使いのデータベースに # よっては、この値は "1" ではなく "1L" のときもあります。心配することは # ありません。単にデータベースバックエンドが Python 長整数型で値を返す # ようになっているだけのことです。 >>> p.id 1 # データベースの各カラムに Python の属性としてアクセスします。 >>> p.question "What's up?" >>> p.pub_date datetime.datetime(2007, 7, 15, 12, 00, 53) # 属性を変更して save() を呼び出すとカラムの値を変更します。 >>> p.pub_date = datetime.datetime(2007, 4, 1, 0, 0) >>> p.save() # objects.all() はデータベース上の全ての Poll を返します。 >>> Poll.objects.all() [<Poll: Poll object>]
>> p = Post.new(:content => "A new post")
=> #<Post id: nil, name: nil, title: nil,
content: "A new post", created_at: nil,
updated_at: nil>
>> p.save
=> false
>> p.errors
=> #<OrderedHash { :title=>["can't be blank",
"is too short (minimum is 5 characters)"],
:name=>["can't be blank"] }>
Ruby on Rails Guides: Getting Started with Rails: 6.6 Using the Consoleより
PythonやRubyは、あらゆるものをオブジェクトとして扱います。
そのため、データをインサートする際にも、まず、モデルのインスタンスを生成します。
その後、インサート用のメソッドを呼び出し、インサートを完了させます。
しかし、CakePHPではデータを配列で扱います。
データをインサートする際も、新しいインスタンスを作ったりしません。
function edit($id) {
//POST された form データがあるか?
if(!empty($this->data)) {
//form データが有効で保存できた場合...
if($this->Recipe->save($this->data)) {
//セッションにフラッシュメッセージをセットしリダイレクトする
$this->Session->setFlash("Recipe Saved!");
$this->redirect('/recipes');
}
}
//form データがない場合、編集する recipe を検索し
//ビューに渡す
$this->set('recipe', $this->Recipe->findById($id));
}
3 CakePHPによる開発: 3.7.4 データを保存するより
このことを知らなければ、あなたはforeachと配列の地獄に落ちるでしょう。
CakePHPでは、これをすっきりと記述するためにSetクラスが存在します。
Setクラスを活用し、配列地獄に落ちないように、気をつけましょう。
3. 高速開発手法を知る

せっかく、フレームワークを使うのだから、その資産を利用しましょう。
フレームワークの資産、それはプラグインです。
例えば、あなたがtwitter連携機能を開発しているとします。
必要なのは、あなたの書いたコードでなく、これらのプラグインです。
Facebook連携機能をエンハンスするとします。
さらに、携帯サイトに対応するとします。
これらのプラグインを作り、公開してくれる人はだいたい決まっています。
その人たちを把握しておきましょう。
- 国内
- 海外
順不同、敬称略です。
複数のCakePHPプラグインを公開している方をまとめました。
全てgithubへのリンクとなっているので、フォローしておくと良いでしょう。
4. 学習方法を知る

CakePHPを学ぶ方法を知ることは、あなたのためにも、そしてあなたの周りに居る人のためにもなります。
あなたの作ったウェブサイトを、後輩に引き継ぐかもしれない。
あるいは、新たなCakePHP開発者を追加するかもしれない。
こうした場合に、CakePHPの良い学習方法を知っていると役に立ちます。
対象者が、フレームワーク、それどころかPHPの初心者である場合、CakePHPの公式マニュアルが役に立ちます。
これは簡単なブログ作成のチュートリアルで、初心者でも手軽に始めることが出来ます。
しかし、このチュートリアルには弱点があります。
それは、MVCモデルを活用しきれていないこと。
もし、このチュートリアルだけでCakePHPを学習すると、ひどい目に遭います。
次に、学習すべきはこれです。
モデル側にロジックをまとめることを覚えましょう。
あるいは、hiromi2424さんのエントリも大変参考になります。
CakePHPを利用したウェブサイト開発を一通り学習したいのであれば、この本がお勧めです。
|
CakePHPによる実践Webアプリケーション開発
|
CakePHP v1.2を対象に書かれているため、少し情報が古い可能性があります。
しかし、その点を除いても、大変参考になります。
業務アプリケーションを対象とした開発手順は、とても実践的です。
最後に、話題のTDDをCakePHPでも取り入れましょう。
|
Webアプリケーションテスト手法
|
CakePHP 1.3で標準テスティングフレームワークSimpleTestの使い方が、わかりやすくまとまっています。
5. サイトを高速化する

サイトのアクセス負荷が増えてきたときのために、その負荷対策もCakePHP開発者は知るべきでしょう。
まず、簡単なところから。
CakePHP 2.0でも標準で取り入れられたプラグインです。
モデルの読み込みをマジックメソッドに寄せることで、プログラムのロードを高速化します。
一般的なウェブサイトであれば、全てのページが動的である必要はありません。
まずは、デフォルトのキャッシュシステムを利用しましょう。
しかし、このキャッシュシステムは完璧ではありません。
プログラムのロードが少なくなるだけで、少なからずCakePHPが呼ばれます。
そこで、静的ページには次のプラグインを利用します。
このプラグインを利用すると、HTMLの静的ファイルをwebroot以下に吐き出してくれます。
CakePHPにアクセスしないのだから、爆速ですよね。
モデル側のキャッシュは、デフォルトで用意されているキャッシュ機構を利用します。
これを有効化すると、クエリ毎に結果をキャッシュしてくれます。
ただし、1リクエスト毎のメモリキャッシュである点と、データ更新後の挙動には注意が必要です。
最後に、独自のキャッシュ機構を用意する場合。
Cacheクラスを利用します。
自動でシリアライズをしてくれたり、キャッシュの有効期限を決めれたりと、便利なクラスです。
6. デプロイを自動化する

CakePHPはデプロイが簡単です。
作成したアプリケーションを、ウェブサーバが参照出来る場所に置くだけです。
しかし、長期で運用する場合、色々と問題が生じます。
例えば、一時ファイルの問題です。
CakePHPはデフォルトでも、アプリケーションに支障が出ない範囲で様々なファイルをキャッシュし、一時ファイルに格納します。
そのため、新たなコードやファイルを追加した場合に、この一時ファイルが悪さをすることがあります。
予期せぬエラーが発生する場合、この一時ファイルが悪さをしていることが多いのです。
デプロイの度、一時ファイルを手動で消しても良いのですが、それは面倒です。
そして、ミスも増えます。
デプロイの簡単なCakePHPですが、その処理も自動化しておくと、多くのメリットが得られます。
CakePHPもCapistranoを利用し、デプロイを自動化できます。
もし、CLIに慣れないエンジニア、あるいはデザイナーが周りに居る場合は、Webistranoも良いでしょう。
Capistranoを使えば、簡単にデプロイを自動化できます。
しかし、データベースのマイグレーションが課題として残ります。
CakePHPのスキーマシェルは、とても貧弱です。
デフォルトのアップデート機能では、自動デプロイに耐えることが出来ません。
そこで、CakeDCが公開しているMigrationsPluginを利用します。
このプラグインを利用することで、Ruby On Railsのようなマイグレーションシェルを得ることが出来ます。
マイグレーションアップ、マイグレーションダウンも自由自在です。
7. 継続的インテグレーションを取り入れる

“4. 学習方法を知る“の中で、テストの話に簡単に触れました。
もし、あなたがテストケースを運用し始めたなら、継続的インテグレーションを取り入れましょう。
CakePHPでも、Hudsonを利用することで継続的インテグレーションすることが出来ます。
Ryuzeeさんの記事を見れば、数時間で環境を整えられるでしょう。
8. バリデーションを活用する

CakePHPを利用するのに欠かせない機能。
それはバリデーションです。
マニュアルの例は、とてもシンプルです。
バリデーションには、この他にも様々な使い道があります。
“4. 学習方法を知る“でも紹介しましたが、hiromi2424さんの記事を参考にしてください。
さらに、バリデーションを使うにあたって以下のことを踏まえておきましょう。
- バリデーションは必ずしも、テーブルのフィールドと1対1でなくても良い。つまり、テーブルに存在しないフィールドに対しても、バリデーションを定義出来る。
- 独自バリデーションメソッドの中から、保存予定の全てのデータにアクセス出来る。つまり、Model::$dataプロパティを利用し、複雑なバリデーションも書ける。
- Model::beforeValidate()コールバックを利用することで、オプションによってバリデーションを切り替えることが出来る。
バリデーションメソッドは、様々な可能性を秘めています。
9. エディタを活用する

CakePHPを利用出来るエディタを把握しましょう。
PHPを書くことが出来るエディタであれば、開発に支障はありません。
しかし、専用のプラグインがあるエディタを利用すれば、開発速度が上がります。
個人的に残念なのは、有用なvimプラグインがないことです。
そのうち、個人的に開発したいと思っているので、vimmerの方はしばしお待ちを。
10. 最新の情報を得る

最後に、CakePHPのトレンドを把握するために、必要な情報源を押さえましょう。
- 国内
- CakePHPフォーラム
- 24時間CakePHP
- cakephperの日記
- Shin x blog
- Copy/Cut/Paste/Hatena
- ECWorks Blog
- kanonjiの日記
- 半年前の私への教科書
- 開発メモのようなもの
- トーハム紀行
- kaz_29@はてな
- php-tips.com
- kunitの日記
- akiyan.com
- CakePHP のおいしい食べ方
- candycane development blog
- 海外
全てRSSリーダーに登録しておけば、ばっちりですね。
もし、CakePHPネタをたくさん書いてるのに、載っていない!っていう人が居たら教えてください。
掲載させて頂きます。
かなりの長文になってしまいました。
(そして、最後はヘタってしまいました:(
恐らく、生粋のCakePHP Bakerの皆さんは全て押さえているでしょう。
初級、あるいは中級者の方の参考になれば、幸いです。
また、他のフレームワークでも、”知るべき10のこと“シリーズを書いてみませんか?
初心者がWordPressを運用する上での5つのコツ
- 2010年9月14日 1:30 AM
- Wordpress

WordPressは優れたブログ管理システムです。
インストールするだけで、すぐにブログを書き始めることが出来ます。
また、数多くのプラグインが公開されており、欲しい機能は自分でコードを書かなくとも、手に入れることが出来ます。
プラグインの管理も簡単。設定さえされていれば、検索してインストールボタンを押すだけです。
しかし、長期の運用となると話は別です。
それなりに管理しやすい環境を整える必要があります。
1-byte.jpも初めてまだ1ヶ月ですが、その間に貯めたWordPressの運用ノウハウを5つにまとめてみます。
1. 記事URLはアルファベットに
記事のURLはアルファベットをお勧めします。
WordPressではデフォルトでいくつかの形式を選ぶことが出来ます。
- デフォルト: http://1-byte.jp/?p=123
- 日付と投稿名: http://1-byte.jp/2010/09/13/sample-post/
- 月と投稿名: http://1-byte.jp/2010/09/sample-post/
- 数字ベース: http://1-byte.jp/archives/123
1-byte.jpでは”日付と投稿名“の形式を使っています。
しかし、このまま投稿するとタイトルの部分(sample-post)が日本語となってしまいます。
いくつかWeb上で情報を探しましたが、”日本語URLでも良い“という記事をいくつか見かけます。
それに従い、私も日本語URLでブログを始めたのですが、運営する上で欠点があることに気がつきました。
それはつまり、
URLがエンコードされて長くなってしまう
ということです。
今使っているURLと、昔使っていたURLです。
- 昔: http://1-byte.jp/2010/08/30/
gae%e3%81%a7python%e3%82%92%e5%a7%8b%e3%82%81%e3%82%8b%e3%81%a8
%e3%81%8d%e3%81%ab%e7%9f%a5%e3%82%8a%e3%81%9f%e3%81%844%e3%81
%a4%e3%81%ae%e3%81%be%e3%81%a8%e3%82%81/ - 今: http://1-byte.jp/2010/09/06/introduce_cakephp_plugins/
ブログの記事は紹介されてなんぼです。
良い記事であれば、Web上の誰かがリンクを張り、紹介してくれます。
そのときに”URLが長くてリンクを張りにくい“というのは致命的だと思いませんか?
中にはaタグでなく、リンクをそのままブログに貼付ける方もいます。
こういう方にとって、長いURLはさらに厄介です。
WordPressでは新規投稿画面からURLを変更出来ます。

新規投稿画面
2. 予約投稿を活用する
WordPressは予約投稿機能を備えています。
これを活用しない手はありません。
なぜ、わざわざ記事を予約投稿するのでしょう?
“中途半端な時間が表示されるのが気に入らない“という個人的な理由もあります。
しかし、それよりももっと大切な理由があります。
投稿ミスを後から修正出来る
これが重要です。
投稿するには様々な項目の入力が必要です。
記事本文はもちろん、ちょっと一言やメタタグのディスクリプション、カテゴリー、タグ、URL…今書き出しただけでもこれだけあります。
これを始めから完璧に入力出来れば良いのですが、そうもいきません。
入力し忘れはもちろんのこと、後から変えたくなることもよくあります。
そのために予約投稿を活用し、公開される時間に”間“を作っておきましょう。
これも新規投稿画面から設定出来ます。

新規投稿画面
3. プラグインの入れ過ぎ注意
プラグインは便利です。
プラグインさえあれば何でも出来る気がしてきます。
Twitter?facebook?SEO?
そんなもの全てプラグインで実現しちゃいましょう。
しかし、プラグインの入れ過ぎに注意が必要です。
理由は以下の2つです。
- 処理が増え、動作速度が遅くなる
- プラグイン同士の相性が問題となる
例えば、SEO All in One Packはかなり無理な処理を書いています。
Wordpressの途中処理に割り込み、正規表現でタグの書き換えをしていたりします。
こういった処理が多く重なると、ただでさえ重たいWordpressがさらに重たくなります。
もう一つのプラグイン同士の相性は、vicuna CMSで体験しました。
これもSEO All in One Pack絡みの問題なのですが、vicuna CMSと相性が悪く、機能が一部、うまく動作しませんでした。
このようにいくらプラグインと言えど、完璧な動作保証は出来ません。
必要な機能を絞り、最小限のプラグインを入れることをお勧めします。

このブログにインストール済みのプラグイン
4. テスト環境を用意する
XAMPPでもMAMPでも良いので、公開用とは別にWordPressを走らせる環境を用意しておきましょう。
これは”3. プラグインの入れ過ぎ注意“にも繋がります。
壊れても良い環境を用意しておくことで、ブログの改造の敷居が下がります。
新しいプラグインを入れたい場合は、このテスト環境にまずインストールします。
ここである程度、画面や機能をチェック、そしてプラグイン同士の相性もチェックします。
これで問題なければ本番環境に反映し、安定して動作させます。
1-byte.jpのテスト環境です。
色々テストした後なので、見た目はボロボロです(笑)
こんなレベルで良いのでテスト環境はあらかじめ用意しておきましょう。

1-byte.jpのテスト環境
5. 構成ファイルを把握する
WordPressにいくら優れたプラグインが揃っているとしても、多少の改造をすることになるでしょう。
そして、それがWordPressの理解と、安定した運用に繋がると思います。
例えば、1-byte.jpではZenbackというブログパーツとembed.lyという埋め込みAPIを使っています。
これらはプラグインを使うまでもなく、特定のファイルに数行のコードを埋め込むだけで済みます。
いずれ誰かがプラグインを作ってくれるでしょうが、こういったサービスにいち早く対応させるためにも、どのファイルがどこの部分を構成しているのかを把握しておきましょう。
WordPressを構成しているファイルは”外観 >> テーマ編集“から確認出来ます。

構成ファイル一覧
名前を見ればほとんどわかると思いますが、主要な構成ファイル一覧を載せておきます。
- ヘッダー(header.php)
- 全てのページの画面上部に表示される共通部分を記述したファイルです。SEOのメタタグもこの中に記述します。
- フッター(footer.php)
- 全てのページの画面下部に表示される共通部分を記述したファイルです。
- 単一記事の投稿(single.php)
- 各ページから記事リンクをクリックして表示される単一記事のページを記述したファイルです。単一記事ページにだけ入れたい記述は全てここに書きます。
普段、私がWordpressを運用する上で気をつけているのはこの5つです。
初めてWordpressを使ったときは、その機能の多さに圧倒され、運用をあきらめてしまいました。
最近、やっとWordpressを使いブログを運用出来るようになっています。
この記事が”これからWordpressでブログを始めよう“という方の助力になれば幸いです。
ホーム > タグ > 初心者
- エキスパートPythonプログラミング読書会 第二期 07の募集を開始しました! http://t.co/DuVQ32jM #expertpython 2 days ago
- 受付を撤収したので、遅れてくる方は @sanojimaru か、 @tfmagician まで声をかけてください。 #expertpython 3 days ago
- http://t.co/e4N59JH3 4章ですね、募集ページを修正しました。 #expertpython 3 days ago
- More updates...
- 無印良品の高度なFacebook連携がさすがだと思った件 « Looops 直人の備忘録
- Node.jsがどうして注目されているのか、もしくはどうして他のサーバサイドJavaScriptはスルーされているのか - id:anatooのブログ
- 0から始めるiPhoneからのWordPress更新術。第9回 終わりに。一連の流れ ...
- shell.vim 0.9.6 -- Improved integration between Vim and its environment (fullscreen, open URL, etc)
- Cakephp auth refresh websites and posts on cakephp auth refresh
- さよなら、iPhone。 日本でも訴訟されて発売されるGalaxyS2の凄さがわかる動画 alpha device
- フィードからの情報をデスクトップ通知してくれるChrome拡張機能「RSS Alert」
- PHPとアジャイル開発の勉強会を開催しました | 48JIGEN
- レノボ、Android 採用の ThinkPad タブレットを今夏発売へ。Windowsタブレットは年内
- 致命的すぎるバグがgithubで話題 « A-Listers


