ホーム

1-byte.jp

Pythonista見習いから、少しだけステップアップするための9クエスチョン from Quora

Python question

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のイントロのコードって、ビートルズの謎の一つなんですよね。

新卒プログラマが押さえておくべきポイント – 長期か、短期か、それが問題だ

  • 2011年3月28日 10:00 AM
  • 雑記

The one point you shoud know before becoming programmer

まずは、個人的な話から。
会社を辞めて、ちょうど1年。Webサービスを作り始めて、4年以上経つでしょうか
学校でプログラムを習い、それを基礎にWebサービスを作り始めました。

私は高専で、情報工学を専攻していました
そのため、情報関連技術の基礎的なところは、ひと通り、学校で学んで来ました。

Webサービスを作り始めて、学校で学んだそれらの知識も役立っています。
しかし、確実に学校だけでは、学べないことがあります。

それが、今回のテーマである”長期か、短期か、それが問題だ“です。

ここからは、私が感じる、学生時代に学べなかった、これから学ぶべきことをまとめていきます。

長期的視点を持つこと

Long way

長期的視点、それは言い換えると、”運用を考える“ということです。
運用と一言に言っても、様々な運用があります。

  • インフラの運用
  • サービスの運用
  • コードの運用

インフラとサービスの運用はイメージが付きやすいでしょう。
インフラの運用は、サーバを含めたハードウェア周りを落とさずに運用すること
サービスの運用は、そのサービスがうまく回るように、様々なメンテナンスをしていくこと

恐らく、学校でプログラミング言語だけを習った人は、コードの運用が理解しにくいでしょう。
コードの運用、それはつまり、

未来を考えてコードを組むこと

です。
それが、オブジェクト指向設計や、言語自体の思想、そして良いコードとは何かと言う問いに繋がります。

コードは必ず、変化します

プログラマはある問題を解決するために、コードを組みます
そして、この問題を解決するコードが完成します。
完成したコードに対して、この後、必ず次のことが起こります。

  • 完成したコードでは問題を完全に解決できなかった
    • > いわゆる、バグ
  • 問題自体が変わってしまった
    • > 機能追加

会社に入ってコードを書くと、この二つのことに頻繁に悩まされます

学生時代にも、コードは書きます。
卒業研究のため、課題のため、自分の趣味のため…など。
しかし、これらのコードには重要な点が抜け落ちています。
これらのコードには、定期的なフィードバックがないのです

学生時代に組むコードの多くは、その場限りのコードです。
問題は変化しないし、長期的に運用することによるバグも発生しません。
そのため、機能追加もなく、人のコードを読む必要がありません。

会社で組むコードは、これの真逆です。
問題は変化し、長期的に運用することによるバグが発生します。
新規にコードを組むよりも、機能追加のほうが多いでしょう。
つまり、他の人が書いたドキュメントも存在しないコードを、読まねばなりません。

これが、新卒プログラマが初めに自覚すべき点だと、私は思います。

補足:
ただし、学生時代からオープンソースに貢献してきた学生は、その限りではないかと。
オープンソースほど、自分のコードが洗練される場はありません。
先ほど述べた全ての点が、詰まっていますからね。

それと、学生時代の話は、私の経験上です。
上記のようなコードばかりなのは、高専という特殊な場に居たせいかもしれません。
大学ではもっと違うコードを書くよ。という話があれば、コメントください。
参考になります。

長期か、短期か、見分けること

Long or short way

会社のために書くコードは、全てが長期的であるべきです。
それは、そのコードが自分が会社を辞めた後も、運用される可能性があるから。

しかし、自分のためのコードはどうでしょう。
これは、逆に短期的なコードをたくさん書くべきです。

ここで言う自分のためのコードとは、以下のようなコードです。

  • 複数のデータをまとめて処理するための、エクセルのマクロ
  • ソースコード内の変数名を置き換えるための、正規表現
  • フレームワークのソースを高速に編集するための、vimのスクリプト
  • 頻繁に行う処理を簡単にするための、Linuxコマンドのワンライナー

これらは全て、自分の作業をコンピュータに任せるためのコードです。

これは、コンピュータに任せられる!と閃いたら、すぐにコードにしましょう。
長期的なコードに必要な、テストも、抽象化も、全て不要です。
あまり考えずに、ざっくり作っちゃいましょう。
それらのコードは、自分で使っているうちに洗練されるはずです。

今、自分が書こうとしているコードは、長期的なのか、それとも短期的なのか、常に見極める必要があります。

言語を極めること

Which language

自分が使える言語を一つ以上、持ちましょう
プログラミング言語の母国語のようなものです。
その言語であれば、すぐにコードが思いつくレベルまで、言語を極めることが大事です

このような言語が一つあると、まず、コードを書くのが早くなります。
リファレンスも不要で、コードが書けます。
集中してコーディングでき、効率が上がります。

言語を一つ極めると、他の言語の習得も早くなります。
英語が話せるようになると、他の国の言葉も早く習得できるのにも、似ています。

基本的には、各言語で方言があるだけ
その方言の使い方を理解し、それが内部的に何をしているか、理解すること。

中途半端に、色々な言語をやるよりも、まず、一つの言語を極めたほうが良いでしょう
そうすれば、自然と他の言語も話せるようになるんです

私は、PHP > Python > Cの順で、コードが書けます。
(JavaやVBも書けますが、使いこなせるレベルじゃない)

Pythonを学んだときは、PHPの知識をベースに学びました。
今は、Object-Cの勉強をしていますが、CとPHPと比べながら、学んでます。

自分の得意な言語があると、それと新しい言語を比較しながら学習できます

言語を極めた基準の一つに、適切なテストコードが書ける、ということが挙げられます。

テストコードを書くには、かなりスキルが必要です。
正直、簡単なロジックを組むよりも、適切なテストコードを書くほうが難しい。
抽象化し、テストし易くするために、その言語の特性を利用していくためです。

逆に、テストコードほど、参考になるコードはありません。
他の人の書いた、テストコードを、そして、テスト対象のコードを読むことで、言語の理解が飛躍的に高まります

長々と書いてしまいましたが、まずは得意な言語を持ちましょう。
どんな言語であれ、一つでも得意な言語があれば、色々とメリットがあるよ。ということが、言いたいのです。

正直、この記事には、まったく意味がないのかもしれません。
なぜなら、これらのことに気付けない学生は、こんな記事を読んでいないだろうし。
(そう、私自身そうでした。ま、こうやって自分を一般化するのは良くないんですけどね。)
逆に、この記事にたどり着いた学生は、これらのことに少なからず気づいているはずです。

これを読んで、少しでも、楽しくプログラムを組める人が増えることを望みます。
それに、私も更にステップアップして、次のレベルの記事が書ければ良いな。

より良いPHPerになるための20Tips

Write clearly php code

去年の話ですが、海外でこんな記事が上がっていました。

記事の内容は、かなりレベルが低いです。
しかし、初心者のうちに知っておけば、より早く成長出来るでしょう

初心者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のこと

10 things you must know about cakephp

先日、こんな記事が上がっていました。

この記事でまとまっているのは、Android開発において必要な10の項目です。
インターフェースの設計から、データの取り扱いまで。

AndroidはモバイルデバイスのOSで、CakePHPは単なるWebフレームワーク。
しかし、予め用意されたルールやAPIを活用する点は同じです。
つまり、フレームワーク全般において、開発者が知るべきことをまとめることが出来るはずです。

ここでは、私が良く利用するCakePHPフレームワークについて、開発者が知るべき10のことをまとめます。


フォーラムにこの記事を書き込んだところ、shunさんがtipsを追記してくれています!
モデルに、配列を取り入れた経緯などを紹介してくれています。
こちらも併せてどうぞ。

1. CakePHPで良いのか

Cakephp logo

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 EngineAmazon AWS、あるいはその他のPaaS
環境を用意するのは、昔ほど難しくありません。
そして、コストもさほど高くありません。

私は、”PHP/CakePHPを使うな“と言っているのではありません。
盲目的にならず、その開発がどんなものかを考えて、フレームワーク選ぶべきだと言っているのです。

これは、CakePHPに限ったことではありませんが

2. CakePHPの癖を知る

Cakephps model

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>]

はじめての Django アプリ作成、その1より

>> 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. 高速開発手法を知る

Cakephps develop

せっかく、フレームワークを使うのだから、その資産を利用しましょう。
フレームワークの資産、それはプラグインです。

例えば、あなたがtwitter連携機能を開発しているとします。
必要なのは、あなたの書いたコードでなく、これらのプラグインです。

Facebook連携機能をエンハンスするとします。

さらに、携帯サイトに対応するとします。

これらのプラグインを作り、公開してくれる人はだいたい決まっています。
その人たちを把握しておきましょう。

順不同、敬称略です。
複数のCakePHPプラグインを公開している方をまとめました。
全てgithubへのリンクとなっているので、フォローしておくと良いでしょう。

4. 学習方法を知る

Cakephps study

CakePHPを学ぶ方法を知ることは、あなたのためにも、そしてあなたの周りに居る人のためにもなります。

あなたの作ったウェブサイトを、後輩に引き継ぐかもしれない
あるいは、新たなCakePHP開発者を追加するかもしれない

こうした場合に、CakePHPの良い学習方法を知っていると役に立ちます。

対象者が、フレームワーク、それどころかPHPの初心者である場合、CakePHPの公式マニュアルが役に立ちます。

これは簡単なブログ作成のチュートリアルで、初心者でも手軽に始めることが出来ます。

しかし、このチュートリアルには弱点があります。
それは、MVCモデルを活用しきれていないこと
もし、このチュートリアルだけでCakePHPを学習すると、ひどい目に遭います。

次に、学習すべきはこれです。

モデル側にロジックをまとめることを覚えましょう。
あるいは、hiromi2424さんのエントリも大変参考になります。

CakePHPを利用したウェブサイト開発を一通り学習したいのであれば、この本がお勧めです。

CakePHPによる実践Webアプリケーション開発 CakePHPによる実践Webアプリケーション開発

  • 著者: 安藤 祐介, 岸田 健一郎, 新原 雅司
  • 出版社: 毎日コミュニケーションズ
  • 発売日: 2009/04/08

CakePHP v1.2を対象に書かれているため、少し情報が古い可能性があります。
しかし、その点を除いても、大変参考になります。
業務アプリケーションを対象とした開発手順は、とても実践的です

最後に、話題のTDDをCakePHPでも取り入れましょう

Webアプリケーションテスト手法 Webアプリケーションテスト手法

  • 著者: 水野 貴明, 石井 勇一, 新藤 愛大, 岸田 健一郎, 荻野 淳也, 安井 力, 田中 慎司
  • 出版社: 毎日コミュニケーションズ
  • 発売日: 2008/07/25

CakePHP 1.3で標準テスティングフレームワークSimpleTestの使い方が、わかりやすくまとまっています。

5. サイトを高速化する

Cakephps speedup

サイトのアクセス負荷が増えてきたときのために、その負荷対策もCakePHP開発者は知るべきでしょう
まず、簡単なところから。

CakePHP 2.0でも標準で取り入れられたプラグインです。
モデルの読み込みをマジックメソッドに寄せることで、プログラムのロードを高速化します。

一般的なウェブサイトであれば、全てのページが動的である必要はありません
まずは、デフォルトのキャッシュシステムを利用しましょう。

しかし、このキャッシュシステムは完璧ではありません。
プログラムのロードが少なくなるだけで、少なからずCakePHPが呼ばれます。

そこで、静的ページには次のプラグインを利用します

このプラグインを利用すると、HTMLの静的ファイルをwebroot以下に吐き出してくれます
CakePHPにアクセスしないのだから、爆速ですよね。

モデル側のキャッシュは、デフォルトで用意されているキャッシュ機構を利用します。

これを有効化すると、クエリ毎に結果をキャッシュしてくれます
ただし、1リクエスト毎のメモリキャッシュである点と、データ更新後の挙動には注意が必要です。

最後に、独自のキャッシュ機構を用意する場合
Cacheクラスを利用します。

自動でシリアライズをしてくれたり、キャッシュの有効期限を決めれたりと、便利なクラスです。

6. デプロイを自動化する

Cakephps deploy

CakePHPはデプロイが簡単です。
作成したアプリケーションを、ウェブサーバが参照出来る場所に置くだけです。

しかし、長期で運用する場合、色々と問題が生じます。
例えば、一時ファイルの問題です。

CakePHPはデフォルトでも、アプリケーションに支障が出ない範囲で様々なファイルをキャッシュし、一時ファイルに格納します。
そのため、新たなコードやファイルを追加した場合に、この一時ファイルが悪さをすることがあります
予期せぬエラーが発生する場合、この一時ファイルが悪さをしていることが多いのです。

デプロイの度、一時ファイルを手動で消しても良いのですが、それは面倒です。
そして、ミスも増えます。

デプロイの簡単なCakePHPですが、その処理も自動化しておくと、多くのメリットが得られます

CakePHPもCapistranoを利用し、デプロイを自動化できます。
もし、CLIに慣れないエンジニア、あるいはデザイナーが周りに居る場合は、Webistranoも良いでしょう

Capistranoを使えば、簡単にデプロイを自動化できます。
しかし、データベースのマイグレーションが課題として残ります
CakePHPのスキーマシェルは、とても貧弱です
デフォルトのアップデート機能では、自動デプロイに耐えることが出来ません。
そこで、CakeDCが公開しているMigrationsPluginを利用します。

このプラグインを利用することで、Ruby On Railsのようなマイグレーションシェルを得ることが出来ます。
マイグレーションアップ、マイグレーションダウンも自由自在です。

7. 継続的インテグレーションを取り入れる

Cakephps ci

4. 学習方法を知る“の中で、テストの話に簡単に触れました。
もし、あなたがテストケースを運用し始めたなら、継続的インテグレーションを取り入れましょう。

CakePHPでも、Hudsonを利用することで継続的インテグレーションすることが出来ます
Ryuzeeさんの記事を見れば、数時間で環境を整えられるでしょう。

8. バリデーションを活用する

Cakephps validate

CakePHPを利用するのに欠かせない機能。
それはバリデーションです。

マニュアルの例は、とてもシンプルです。
バリデーションには、この他にも様々な使い道があります

4. 学習方法を知る“でも紹介しましたが、hiromi2424さんの記事を参考にしてください。

さらに、バリデーションを使うにあたって以下のことを踏まえておきましょう。

  • バリデーションは必ずしも、テーブルのフィールドと1対1でなくても良い。つまり、テーブルに存在しないフィールドに対しても、バリデーションを定義出来る。
  • 独自バリデーションメソッドの中から、保存予定の全てのデータにアクセス出来る。つまり、Model::$dataプロパティを利用し、複雑なバリデーションも書ける。
  • Model::beforeValidate()コールバックを利用することで、オプションによってバリデーションを切り替えることが出来る

バリデーションメソッドは、様々な可能性を秘めています。

9. エディタを活用する

Cakephps editor

CakePHPを利用出来るエディタを把握しましょう。
PHPを書くことが出来るエディタであれば、開発に支障はありません。
しかし、専用のプラグインがあるエディタを利用すれば、開発速度が上がります。

個人的に残念なのは、有用なvimプラグインがないことです。
そのうち、個人的に開発したいと思っているので、vimmerの方はしばしお待ちを。

10. 最新の情報を得る

Cakephps info

最後に、CakePHPのトレンドを把握するために、必要な情報源を押さえましょう。

全てRSSリーダーに登録しておけば、ばっちりですね。
もし、CakePHPネタをたくさん書いてるのに、載っていない!っていう人が居たら教えてください。
掲載させて頂きます。

かなりの長文になってしまいました。
(そして、最後はヘタってしまいました:(

恐らく、生粋のCakePHP Bakerの皆さんは全て押さえているでしょう。
初級、あるいは中級者の方の参考になれば、幸いです。

また、他のフレームワークでも、”知るべき10のこと“シリーズを書いてみませんか?

大人数の開発合宿に最適な、山木旅館に行ってきた

Atami yamaki

もし、あなたが1-byte.jpの読者であれば、先日、CakePHP温泉部が開催されたことを知っていると思います。

CakePHP温泉部とは何ぞや?という方は、上記の記事を見てください。
今年は、このCakePHP温泉部員一同、熱海に行ってきました。

部員の皆さんととても楽しい時間を過ごさせて頂いたのですが、それと同じぐらい素晴らしかったのがお世話になった旅館
恐らく、熱海で大人数の開発合宿をするとすれば、ここしかないでしょう

熱海温泉の山木旅館

今回、CakePHP温泉部の舞台となったのが、”山木旅館“です。

この旅館は熱海駅から、車で5分ほどの場所に位置します。

山木旅館の位置

周りは温泉街で、静かなところです。

山木旅館周辺の風景

素晴らしい館内

素晴らしい“の意味を、はき違えないでください。
最新のホテルやホテル旅館、ビジネスホテルと比べないでください。
素晴らしいのは、その温泉旅館らしさです。

山木旅館の個室

良いでしょう。
温泉に来た感覚をしっかり、味わえます。
こんな旅館なのだから、部屋が小さい?
そんなことはありません

山木旅館の大きな部屋

じゃあ、インターネットが繋がっていない?
いいえ、しっかりインターネット回線も完備されています

開発風景

CakePHP温泉部では、2階にある3部屋を全てお借りしました
準貸し切り状態です。
1部屋は開発部屋として、残り2部屋は寝室として利用させて頂きました。

おかげで皆さん、睡眠も開発も集中して行えたはずです(睡眠は少し怪しいですが)

3つの風呂

開発合宿で必要なのは温泉
これが一番、重要です。

山木旅館では、3つの風呂があり、時間帯によって、男性と女性風呂が入れ替わります
もう一つは、家族風呂で自由に使って良いそうです。

spa2

CakePHP温泉部では、皆さん、朝風呂もしっかり味わっていました

夕食と朝食

1泊2日の宿泊では、通常の旅館と同様に、夕食と朝食を用意してくれます

山木旅館の夕食

海鮮を中心とした、素晴らしいメニューでした。

このような素晴らしい旅館で、CakePHP温泉部の2日間を、楽しく過ごせました。
1泊2万円と、他の旅館から比べると、少し高いです。
しかし、その価値は十分にあります

今回、私がCakePHP温泉部で使用する旅館を調べたのですが、

  • 部屋でインターネットが使える
  • 10人以上入る大部屋がある

この2つの条件を満たす旅館は、ここしかありませんでした
10件以上、電話をして調べました。しかし、インターネット回線がフリースポットだったり、会議室でしかインターネットが使えなかったり、とこの条件に合う旅館はなかなか見つかりませんでした。

開発合宿でこの2つの要素は、とても重要でしょう。

せっかくの合宿なので、徹夜で開発がしたい。
せっかくの合宿なので、皆とワイワイしながら開発をしたい。

これらを叶えてくれるのが、山木旅館です。

熱海で開発合宿をするときは、是非、山木旅館へどうぞ。

CakePHP温泉部の参加報告は、@binbin4649さんが書いてくれています。
こちらも併せて、どうぞ。

gmailを、Pythonスクリプトでメールサーバとして使うtips

Gmail

久々の更新です。
現在、ブログのリニューアルのために、時間を割いています。
しかし、肝心の記事が書けていないっていうのはダメですね。
読者があってこそのブログです。

そんなこんなで、少し時間がありません。
今日はちょっとだけ(本当に少しだけ)、使えるtipsを紹介します。

gmailを、Pythonスクリプトを使ってメールサーバとして使ってみます。

5分で出来るインストールと送信テスト

インストールと初めの送信はとても簡単です。
Ubuntu 10.04 TLSでインストールする手順をまとめます。
インストール先は、”/usr/lib/gmail”とします。
必要に応じて、ルート権限で実行してください。

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

ここまで無事に実行できたら、以下のコマンドを実行して送信テストします。

gmail --subject 'Hello world.' --text --body 'Read me.' --config ./config.yaml [あなたのメールアドレス]

コマンドラインの応答には、1〜2秒掛かります。
応答が返ってきたら、[あなたのメールアドレス]で設定したメールの受信ボックスを確認してください。

  • 送信元 : config.yamlで設定したメールアドレス
  • タイトル: Hello world.
  • 本文: Read me.

このようなメールが受信出来れば、成功です。

何に使うか

正直なところ、”簡単な用途“にしか使えません。
例えば、以下の用途です。

  • ログの定期確認
  • logwatchのレポート確認
  • 自作スクリプトの動作確認

監視サーバのアラートなど、対応に緊急を要する用途には使えないと思います。
それは、gmailスクリプトがこんなに簡単なコードだからです。

#!/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):
    """
    Read configuration YAML file.

    account and password keys are required in the file.
    """

    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 "Could not read %s setting from configration file." % ", ".not_exist
      sys.exist(1)
    return config

def parse_options():
    """
    Parse options from arguments.
    """

    usage = "usage: %prog [-s subject] [-b body] to-addr..."
    ver = "%s %s" % ("%prog", VERSION)
    parser = optparse.OptionParser(usage, version=ver)
    parser.add_option("-s", "--subject", dest='subject',
                      default="",
                      metavar="STRING", help="Specify subject on command line")
    parser.add_option("-b", "--body", dest='body',
                      default="",
                      metavar="INPUT_FILE", help="Specify email body read from file")
    parser.add_option("-t", "--text", dest='text',
                      default=False,
                      action="store_true", help="--body argument as text not file")
    parser.add_option("-c", "--config", dest='config',
                      default="config.yaml",
                      metavar="INPUT_FILE", help="Setting file to use gmail server")
    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 "Could not read %s from %s." % (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'):
    """
    Create a mail body to send.
    """

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

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

    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():
    """
    Main function.
    """

    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()

エラー処理をしていません。
gmailが落ちていたり、ネットワークが落ちていても、再送しません
失敗したらそれっきりです

それでも、5分でインストール出来て、メールを送信できるのは魅力です
サーバからのメール送信用にMTAを自前で用意しても良いのですが、色々と設定が面倒です。
例えば、Postfixを使って、gmail経由でメールを送る例です。

色々と用意されているUbuntuでも、これだけ手間が掛かります
メールサーバの設定って面倒なんですよね。

用途によって使い分けると良いでしょう。

注意事項

gmailのSMTPサーバには、制限があります

  • 送信回数: 500回/日
  • 宛先数: 500宛先/メール
  • メール数: 2000メール/日

下記の記事が詳しく、参考になります

  • http://d.hatena.ne.jp/dacs/20080627/1214569620

このgmailスクリプトで関係あるのは、500回/日の送信回数制限ですね。
ただ、500回/日であれば問題ないでしょう。
この制限に掛かるようであれば、あなたは確実に用途を間違っています:(

Pythonスクリプトを書くための参考URL

ここまで、このスクリプトを自分で書いたように振舞ってきたのですが、実は以下の記事を参考にしています。

Pythonでメールを送信したい人のためのサンプル集“の記事を元に、”ログ解析ツールを作る“で紹介されたoptparseモジュールを使ってオプションを加え、YAMLファイルで設定を変えられるようにしました。
あとは、それをgithubに載せて、どこのサーバでも簡単に使えるように。

Pythonで簡単な管理スクリプトを書いて、gitリポジトリを作る。
そして、それをgithubに載せて、管理する。
こうしておけば、いつでもどこでも、設定不要でスクリプトが再利用できます
これがモダンな自作スクリプトの管理法でしょうか。

これもPythonの勉強がてらに書いたスクリプトですが、地味に使えます。
皆さんも使ってみてください。

月額1,980円以下の仮想専用サーバ、国内外10サービスまとめ

vps.jpg

前回の記事は読んでいただけましたか?

ガセビア共有サイトgasevistをリリース出来たのも、インフラが安くなったおかげです。

国内ではさくらサーバを初めとして、格安の仮想専用サーバがリリースされています
そこで、今日は格安の仮想専用サーバについてまとめます。

さくらのVPS

まずは国内から。
言わずと知れた、さくらインターネットが手がけるVPSです。

最低利用 950円
仮想化ソフトウェア KVM
メモリ 512M
選択可能OS CentOS 5.5 (初期インストール)
Ubuntu 10.04
FreeBSD 8.1
Debian 5.05
Fedora 13
参考リンク 【レビュー】月額980円、さくらのVPSは使えるか!?
さくらVPSで一日6万PVを処理するためにしたこと

やはり、私もここが一番気に入っています。
さくらインターネットだけあって、とても安定しています
管理機能が豊富ではありませんが、その分シンプルです。
小さなウェブ・サービスを立ち上げるのであれば、さくらのVPSで決まりでしょう。

ServersMan VPS

国内最安のVPSでしょうか。
フリービットの子会社DTIが手がけるVPSです。

最低利用 490円
仮想化ソフトウェア OpenVZ
メモリ 512M
選択可能OS CentOS 5.4
Ubuntu 10.04
Debian Lenny
参考リンク 月額490円で使える仮想サーバー「ServersMan@VPS」が実現できた訳
静的コンテンツ配るなら国内VPSも活用すべきたった一つの理由

価格は恐ろしく安いです。
さくらのレンタルサーバよりも安く、仮想専用サーバが手に入ります

難点は、その安定性と管理画面の使い勝手の悪さです。
以前はサーバを複数台用意するために、メールアドレスをその台数分用意する必要がありました。
(現在はわかりません。知っている方がいれば教えてください。)

ただし、機能追加は積極的に行われています
その点に関しては応援できるので、今後に期待でしょうか。

私は、本番環境にServersMan VPSは選べません。
自分専用のファイル共有サーバやブログ程度であれば、問題ないでしょう。

KAGOYA VPS

現在はベータ中で、誰でも自由に利用出来る訳ではありません
しかし、リリース後はさくらのVPSと同価格帯になる予定です。

最低利用 945円
仮想化ソフトウェア Open VZ
メモリ 512M
選択可能OS CentOS 5.5
Debian Lenny
Ubuntu 10.04
参考リンク KAGOYA VPSを試してみる

ここは使ったことがないので、コメント出来ません。
もし、4次ベータがある場合は、申し込んでみると良いでしょう。

ユニットホスティング

今まで紹介したのは全て、単なるVPSでした。
ユニットホスティングは少し毛色が違います
月額1,980円で利用できますが、プランの形態としてはAmazon EC2に近いです

最低利用 1980円
仮想化ソフトウェア Xen
メモリ 256M
選択可能OS CentOS 5
参考リンク UnitHostingの評判(良いのも悪いのも)
ユニットホスティングではじめるクラウド

ここも、私は使ったことがありません。
しかし、期待できるサービスの一つです。

何もしなければ、月額1,980円で利用できます。
アクセス増加に対応する場合は、

  • メモリ 256MB: 1.5円/h
  • CPU 1コア: 2円/h
  • HDD 1G: 0.1円/h

でサーバをスケールアップ可能です。
このように、従量課金で一定期間だけスケールアップできるのは、単なるVPSにない魅力です。

Linode

ここからが海外サーバです。まずは、有名なLinode
さくらのVPSが出る前は、ここをメインで使っていた方も多いはず

最低利用 19.95ドル
仮想化ソフトウェア Xen
メモリ 512M
選択可能OS Arch Linux 2010.05
CentOS 5.5
Debian 5.0
Fedora 14
Slackware 13.1
Ubuntu 10.04 LTS
Ubuntu 10.10
OpenSUSE 11.0
Gentoo 2008.0
Debian 4.0
Fedora 13
Slackware 12.2
Ubuntu 9.10
Ubuntu 8.04 LTS
Ubuntu 8.10
Ubuntu 9.04
参考リンク 海外VPSサーバ Linodeを借りてみた
【画像満載レビュー】 海外で人気のXenベースのVPS、『Linode』を使ってみたよ

さくらのVPSに比べると、安定性は少し劣ります
しかし、十分お勧め出来るサービスです。
簡単な監視機能や、インストール時に選択できるOSの数が魅力です。
また、さくらのVPSと違い、DNSが無料で使用できます

管理機能が充実しているのが良いですね。
海外で簡単なウェブ・サービスを立ち上げるとしたら、間違いなくLinodeでしょう。

Slicehost

Linodeと一緒に良く取り上げられるのが、Slicehostです。
ターゲットとしている客層がLinodeと近く、価格と機能も似通っています

最低利用 20ドル
仮想化ソフトウェア Xen
メモリ 256M
選択可能OS Ubuntu 10.10
Ubuntu 10.04 LTS
Ubuntu 9.10
Ubuntu 8.04.2 LTS
Debian 5.0
Gentoo 10.1
Centos 5.5
Centos 5.4
Fedora 14
Fedora 13
Fedora 12
Arch 2010.05
Red Hat EL 5.4
Red Hat EL 5.3
参考リンク Linode vs. Slicehost Review
ホスティングサービス Slicehost のドキュメントがすばらしい

ここも、私は使用したことがありません。
日本での実績がそこそこあるようで、検索すると情報が見つかります。
なかなか、安定もしていて、ドキュメントも充実しているようです。
ただ、Linodeと比べてちょっとだけコストパフォーマンスが悪いですね

Amazon EC2 Micro Instance

このプランが出るまで、Amazon EC2は月額7,000円程度でした。
従量課金制のため、一定額では利用できません。
しかし、月額1,300円程度で運用出来るようです

最低利用 16.4ドル (トラフィックの従量課金を除く)
仮想化ソフトウェア Xen
メモリ 613M
選択可能OS Red Hat Enterprise Linux
Windows Server 2003/2008
Oracle Enterprise Linux
OpenSolaris
openSUSE
Ubuntu
Fedora
Gentoo
Debian
など多数
参考リンク Amazonクラウドから「1円クラウド」(自称)登場。Amazonクラウドの値下げが続く
Amazon EC2の無料ティアを試す

言わずと知れたクラウドサービスの先駆けAmazon EC2です。
SLA(Service Label Agreement)で99.5%の稼働率を保証しているので、恐らく安定性は問題ないでしょう。

気になるのはトラフィックの重量課金でしょうか。
1GB当たり、$0.15掛かります
この従量課金と、インスタンスの性質だけ把握しておけば、サーバ選択の候補に入ります。

Rackspace

Amazon EC2と同じIaas型のサービスです。
Amazon EC2と違うのは、価格帯とその拡張性です。
先に紹介したSlicehostと同じ会社が運営しています。

最低利用 10.95ドル (トラフィックの従量課金を除く)
仮想化ソフトウェア Xen
メモリ 256M
選択可能OS Ubuntu
Debian
Gentoo
CentOS
Fedora
Arch
Red Hat Enterprise Linux
Windows Server 2008
Windows Server 2003
参考リンク Rackspace Cloud ServersがAmazon EC2よりも優れている点
Rackspace Cloud Servers versus Amazon EC2: Performance Analysis

Amazon EC2と比べて、Rackspaceはスケールアップが容易なようです
多少のダウンタイムだけで、ウェブ上の管理画面からスケールアップが出来るようです。
Amazon EC2と同じく、トラフィックが従量課金制です。

VPS.NET

Amazon EC2やRackspaceとVPSの中間のサービスです。
Node単位でVPSを借りることが出来ます
スペックを上げたい場合は、Daily Nodesを1日単位で買います。
こうして買ったDaily Nodesを運用しているVPS Nodesにセットして、再起動するとスペックが上がります。

最低利用 20ドル
仮想化ソフトウェア Xen
メモリ 376M
選択可能OS Ubuntu 8.04
Ubuntu 10.04
Debian 5.0
CentOS 5.4
CentOS 5.5
Gentoo 10.1
Windows Server 2008 Enterprise
Windows 2003 R2 Standard
参考リンク VPS.net 8 Month Review
VPS.net Review

ユニットホスティングと似たサービスですね。
異なるのは、リソースが細かく指定出来ない点でしょうか。
しかし、シンプルでわかりやすく、良いサービスだと思います。

いかがですか。
お気に入りの仮想専用サーバは見つかりましたか?

個人的には、さくらのVPSが一番コストパフォーマンスが良いかと。
ただし、拡張性管理機能を考えたときに、海外のサービスに軍配が上がります
例えば、Linodeは、管理用のiPhoneアプリがあります。
海外のサーバは基本的にAPI機能があり、サーバ管理も自動化できます。

日本の仮想専用サーバも管理機能を充実させて欲しいですね。
さくらのVPSは普通に使えますが、ServersManはちょっと…。

この他にも良い仮想専用サーバを知っていれば教えてください。

さくらのVPSで動いている、ガセビア共有サイトgasevistもよろしくお願いします。

gasevist_logo.png
『gasevist』ガセのトリビア・雑学の共有サイト

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

gasevist_logo.png

  • 【マカーの本当の意味】
    • 熱狂的なマクドナルドの信者のことを指す。
  • 【タイタニック2】
    • 今年夏公開される名作タイタニックの続編であるタイタニック2の主演女優はパリス・ヒルトン、主演男優はゾマホンである。
  • 【法改正により】
    • 本年度から法改正により豚の生姜焼きを食べるときには、その都度役所で申請手続きが必要となった。違反した場合には仮釈放なしの無期懲役となる。
  • 【アンパンマンのチーズ】
    • 実はチーズは血統書付きのスーパードッグ
  • 【gasevist VS trivist】
    • 実はトリビア共有サイト”trivist“よりもガセビア共有サイト”gasevist“のほうが100倍面白い

どうでしょう。
どれが本当のトリビアか、わかりましたか?

ま、全てガセなんですけどね。
最後のガセビアは、今後本当になるかもしれません。

こんなネタを共有できるガセビア共有サイトgasevist“を立ち上げました。

今日は、こんなくだらないgasevistが出来るまでを記事にします。

トリビア共有サイト”trivist”の記事がホッテントリ入りする

先日書いたこの記事がはてブのホッテントリ入りしました。

ちょっとだけ狙ってタイトルを付けたので、”はてブ100ぐらいはいくかな“と考えていました。
しかし、蓋を開けてみてびっくりしました。

  • はてブ: 455ブックマーク
  • 記事のページビュー: 8,271PV

前回の記事を見た方がいないかもしれませんが、ここでお礼を言っておきます。

いつも応援、ありがとうございます。

この記事とトリビア共有サイトtrivistを立ち上げたときは、まだ、ガセビア共有サイトgasevistのことは頭にありませんでした

トリビア共有サイト”trivist”にあるはてブがつく

トリビア共有サイトtrivist自体にあるコメント付きのはてブがつきます。

  • tktk3 うそくせぇボタンが欲しい
  • unkology がせぇボタンが欲しい

がせぇボタン?うそくせぇボタン?

確かに、Webからの投稿だと、それが嘘だか、本当だか、わかりません
中には嘘のトリビアもあるかもしれない。
そのようなトリビアを判断するボタンが欲しいという要望です。

しかし、ここであるアイディアが生まれます。

トリビアを集めるよりも、ガセビアを集めるほうが100倍面白いのでは?

ガセネタを投稿出来るサイトがあれば面白いと、コメント付きのはてブで気がついた訳です。

1日でガセビア共有サイト”gasevist”を作ってみた

この記事を書く前の記事のタイトルが、このサブタイトルです。
しかし、ガセビア共有サイトgasevistは、トリビア共有サイトtirivistをベースにほとんど変更していません。
設定を変更するためのプレフィックス定数を追加しただけ。
当たり前の記事になってしまうので、このタイトルは却下されました

しかし、実際にgasevistは、ソースコードの変更からサーバの設定まで1日で完成しました
これもある意味、前回の”ソースコードを書かない“方針の延長です。

開発の話を少し

特に目新しいことはしていないのですが、開発周りの話をしておきます。

gasevisttrivistはまったくソースコードが同じです。
サイトの判定には、アプリケーションのルートディレクトリの”GASEVIST”ファイルを使っています。
GASEVISTファイルがアプリケーションルートに存在すれば、gasevistになり、存在しなければ、trivistになります。

ソースコードに設定値を用意しても良いのですが、開発時に逐次書き換えるのが面倒なのでこうしています。
GASEVISTファイルをgitの管理下から取り除き、開発時は

touch GASEVIST

とか、

rm GASEVIST

なんてコマンドを打って切り替えてます。

デプロイはCapistranoで自動化されています。
今回は、Capistranoのレシピに設定値を1つだけ追加しました。
この設定値が存在した場合は、アプリケーションルートで”touch GASEVIST“が自動で実行されます。

さらにソースコードには、以下の行が追加されました。

if (file_exists(APP . 'GASEVIST')) {
    define('PREFIX', 'gasevist_');
}

あとは、切り替えるファイルや設定値の前にPREFIXを付けるだけです。
例えば、ロゴならこんな感じです。

<a href="/"><img src="/img/<?php echo PREFIX; ?>img_logo.gif" /></a>

今回、変更したのはビュー側のみです。
こういった切り分けがしっかり出来るのも、MVCフレームワークの強みでしょう。

これでソースコードの変更が終わったので、後はさくらサーバにVPS追加の申し込みを。
設定は前回、紹介したセットアップスクリプトを使います。

trivistと同じサーバに載せても良かったのですが、”月1000円ぐらい良いか“と新しくVPSを作りました。
Capistranoとセットアップスクリプトで、そんなに設定に時間が掛からないですしね。
それに、月1000円ならAdsenseで回収できます

これでガセビア共有サイトgasevistが完成です。

しかし、良い時代ですね。
アイディアもWebから、その実現もWebで出来ます

特にインフラ周りの進化がすごい。
一昔前に、Webサイトを一つ立ち上げようと思ったら、こんなに格安にしかも、こんなに速く作れなかったはず
自宅サーバでやるにしても、その管理が大変ですからね。
さくらサーバVPS、様様です。

次は、”VPSのまとめ“でも記事にしましょうか。

gasevistもよろしくお願いします。
trivistと違って、簡単に記事を投稿できるので、気軽にどうぞ。
クスっと笑えるガセビアをお待ちしております。

gasevist_logo.png
『gasevist』ガセのトリビア・雑学の共有サイト

1週間でトリビア共有サイト”trivist”を作ってみた

trivist_logo.png

ここのところ、ブログの更新ツイッターのつぶやきも完全にストップしていました。
集中力のない@tfmagicianにしては珍しいことです。

何をしていたか。
こんなウェブ・サービスを作っていましたよ。

実はこれ、作成期間1週間です。

シンプルなサイトなので、恐らく、開発に慣れた人なら1週間は余裕でしょう。
今日は、まだフレームワークを使った開発、あるいはウェブ・サービスの開発自体に慣れていない人に向けて、高速開発に関するtipsを紹介します。

高速開発とは何か考える

rapid_development.png

まず、高速開発を可能にする”最強最大の魔法“を考えましょう。
それはこれです。

コーディングしない

コーディングしないで、システムが出来ればなんと良いことか!
これはエンジニアにとって、当たり前のことです。
しかし、これを念頭に置くのと置かないのでは、まるで開発速度が違ってきます

できるだけ、怠慢を考えます。

面倒だから、俺はコーディングしたくないんだよ!

これで良いんです。

フレームワークを使う

cake-logo.png

trivistではフレームワークとして、CakePHPを採用しています。

フレームワークの効果は説明するまでもないでしょう。
様々な機能がパッケージングされており、高速開発を可能にします

また、フレームワークに乗ることで、複数プロジェクトで利用可能な共通資産が作成可能です。
それが次の”プラグインを使う“です。

プラグインを使う

development_with_plugin.png

大抵のフレームワークには、プラグインの機能が備わっています。
このプラグインを活用することで、高速開発が可能です。

例えば、検索エンジン用のサイトマップ
trivistのように自動でページが増えていくサイトは、自動でサイトマップを生成する必要があります
MVCのフレームワークを使ったことがある人は、この処理がすぐにイメージ出来ます。

  1. モデル: id一覧の取得
  2. コントローラ: id一覧からURLを生成する
  3. ビュー: サイトマップの吐き出し

こんなところでしょう。
プラグインを知らない人は、この処理をプロジェクト毎に毎回作成するか、コードを前のプロジェクトからコピーするかのいずれかです。
しかし、プラグインを知っていれば、これらの処理をどんなプロジェクトでも使えるように共通化することが出来ます。
共通化したコードは、pluginsディレクトリに放り込むだけ。
あとは、configディレクトリに設定ファイルを書いておしまいです。

これなら、ほとんどコードを書かなくて済みます。
さらに、プラグインがしっかりテストされていれば、アプリケーションにおけるこの部分のテストは、ほぼ省略出来ます

trivistでは、以下のプラグインを使っています。

この中で特に強力なのが、CakePHP-Twitter-API-PluginTagsPluginです。

CakePHP-Twitter-API-Pluginは、TwitterのOAuth認証が2行で書けます
(自身のユーザテーブルにデータを格納する処理は別途必要ですが)

TagsPluginは、簡単にタグ付けとそのタグクラウドを実装できます
タグ登録時の分割処理も自分で書く必要がありません。
いつもの感覚でデータを保存すると、勝手にタグ付けして、勝手にタグクラウドを作ってくれます。

UtilsPluginのCsvImportBehaviorも便利です。

と、話出したら止まらないので、ここまでにします。
よくある機能は自分で実装する前に、プラグインを探してみましょう

ブログパーツを使う

development_with_widgets.jpg

ブログパーツも活用しましょう。
最近のウェブ・サービスで必要となるのが、ソーシャルメディアのコメントを表示する機能検索機能です。
trivistでは、以下のブログパーツを活用しています。

ソーシャルメディアのコメントを取得するのって、結構面倒なんですよね。
対応するサービス分のコードを書く必要がある
また、データが膨大に増えていくのも気になります。

Zenbackは、各ページのソーシャルメディアのコメントを自動で表示してくれるブログパーツです。
jsのコードを貼り付けるだけのお手軽実装です。
これで、どれだけ工数が削減できることか。

検索機能は、全文検索に対応させる必要があります。
その上、検索結果のランク付けも必要です。

そこはもう、本業のGoogleさんに任せてしまいましょう。
Googleカスタム検索も導入は簡単。
これで、検索実装からも解放されます。

このように、ソースコードだけでなく、外部サービスも活用します
アクセスの少ない立ち上げ当初は、これで十分かと。

自動化する

auto_deploy.png

ここまで来たら、サーバも晒します

さくらサーバVPS標準のCentOSでなく、Ubuntuを使っていることにはいくつか理由があります。

  • 最新のパッケージや比較的マイナーなパッケージを、自分でビルドせずに使える
  • セットアップスクリプトをUbuntu 10.04用に書き溜めてある

特に大きいのは、2つ目です。
セットアップスクリプトを書き溜めることで、サーバのセットアップを効率化します

先程の構成を作るには、apache_phpスクリプトとmysqlスクリプトを実行して、設定ファイルを少し変更するだけです。

また、アプリケーション自体のデプロイは、Capistranoのレシピを使います。
CakePHP用のレシピを作ってあるので、それを適用するだけで、自動デプロイ環境が完成です。

サーバ関連の作業で重要なのは、一回こっきりの作業をしないことです。
大抵の作業は、必ずと言っていいほど再び行います。
それを見越して、予め準備しておきましょう

どうでしょうか。
1週間でウェブ・サービスを立ち上げられる気がしてきましたか。

とにかく、あるモノをとことん利用しましょう
あなたの欲しいモノは、恐らく世界の誰かがすでに作っています
せっかく、公開されているのに使わなければ損です。
それが自分の要求を満たさなくても、改造することで自分の要求を満たせないか、考えてみましょう。
自分で作るよりも、そっちのほうが絶対に早いです。

最後に、trivistの応援もお願いします!
うまく起動に乗れば、もっと機能を拡張したいと考えています。
もっと、共有機能を充実して、仲間内で楽しめるサイトになれば、と。
どんなトリビアでも良いので、投稿お願いします

trivist_logo.png
『trivist』おもしろいトリビア・雑学を紹介!

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

cakespa.jpg

かなり、告知が遅れてしまいましたが、スタッフとして宣伝記事を書いておきます
しかも、募集締め切りまであと4日しかない
本当はすぐに記事にしようと思っていたのですが、何かと忙しく。

何の話…?
そう、CakePHP温泉部のお誘いです。
温泉に入ってゆっくりしよう“という会です。

第1回CakePHP温泉部を振り返りながら、この会の内容を紹介してみます。

箱根と温泉

CakePHP温泉部は、今年が第2回目

去年が記念すべき第1回目です。
去年のCakePHP温泉部は写真の通り。

photo_mt_fuji.jpg

え、なんで富士山

photo_hotel.jpg

それに、CakePHP温泉部の看板を持った和気あいあいとした集合写真。

富士山は開催場所である箱根から帰る途中に撮ったモノ。
CakePHP温泉部の看板を持った集合写真は、旅館を後にするときにスタッフの方が撮ってくれたモノです。

第1回CakePHP温泉部は、これぐらいフリーでノープランな会でした。
ちょっとした発表もしましたが、勉強会より格段にゆるい形で行われました。
(そもそも、MASA-Pさん以外、発表資料をCakePHP温泉部のために用意していなかったし!)

CakePHP + My Development Story

これが私の去年の発表資料です。
レベルが低く、ちょっと恥ずかしいです。

この資料も、行きのMASA-Pさんの車の中で作りました。
あの時は渋滞で遅れて、スタバでこれを作ってたっけ。

スタッフ・ミーティングも1度しかしていないし、やることも大して決まっていないし
2日目なんて特にノープラン
あ、これ以上言うと逆に来る人が少なくなりそうですね。

とにかく、”CakePHP温泉部はとーってもゆるい会ですよ。“というのを知ってもらいたいのです。

小田原とかまぼこ

もはや、タイトルが意味不明です。
しかし、去年の参加者は思い出して、懐かしめる(笑える)はずです。

kamaboko.jpg
鈴廣かまぼこの里

帰りに、小田原のかまぼこの里に寄りました。

ちょうど時期的にはバレンタインデー。
バレンタインチョコならぬ、バレンタインかまぼこが売られていました。
写真がないのが残念ですが。

この企画も初めからあった訳でなく、@hidetoshingさんの提案で決まりました。

私は、参加者の半分以上と初対面でした。
恐らく、他の方々もそうだったはず。

それが何故だか、こんな(?)かまぼこ館に行くぐらい仲良くなっていまいました
これも温泉効果でしょう。

おまけのCakePHP

もう、CakePHPはある意味”おまけ“です。
とはいえ、ちゃんとCakePHPトークでも盛り上がりました。

第1回CakePHP温泉部では、主にCakePHPで作られたCMSを触って楽しんでいました。

特にBaserCMSは盛り上がりました。
皆でわいわいと協力しながら、BaserCMSの環境を準備したり。
XAMPじゃ駄目だ、MAMPを使え、いやいや仮想化でしょう。
なんて話をしたり。

最近はMacユーザが多いですが、CakePHP温泉部では半分ぐらいがWindowsユーザでした。
そのおかげか、BaserCMSの区切り文字定数DSに関するバグを発見出来ました。
ある意味、BaserCMSのテスト大会になっていましたね。

この話は@konsanさんの記事を読むとわかります。

これで、CakePHP温泉部の概要はわかったのではないでしょうか。
主催者MASA-Pさんの言う通り、

温泉に入って日頃の疲れを癒す

がこの会の目的なんです。
温泉に浸かりながら、ゆっくり、ゆったり、まったりとCakePHPトークでもしましょう。

こんなゆるい会で大丈夫か“と思った方もいるでしょう。
しかし、今回は前回の反省を踏まえてプランニングしています。
恐らく、前回よりは内容的に有意義になるはず。
前回のいいところを残しつつ、もうちょっと温泉部としての成果物を出せれば良いな“と考えています。

こんな会なので、誰でも大歓迎です!
CakePHPを触ったことがない人でも大丈夫です。
興味があれば参加してみてください。
色々と勉強になると思いますよ。

参加したい人はMASA-Pさんのブログからどうぞ。
締切りは10日まで、残り枠は4名程度です
応募はお早めに。

それでは、CakePHP温泉部で会いましょう!

ホーム

スポンサードリンク
書いている人
つぶやき
RSS 気になるニュース
過去の記事

ページの上部に戻る