Home > アーカイブ > 2010-01

2010-01

PHP基礎文法最速マスター

  • 2010-01-27 (水)
  • PHP
この記事の所要時間: 059

PerlとRubyの文法一覧がとても良くまとまっていたので、便乗してPHPでもやってみました。

他の言語をある程度知っている人はこれを読めばPHPの文法を何となく理解できると思います。

間違い、不足等々あれば教えて下さいm(_ _)m

バージョン

PHP5.3系がリリースされていますが、ここではPHP5.2系を対象としています。

1.基礎

コードブロック

PHPコードは「<?php」という開始タグから始まります。終了タグは「?>」です。HTMLにPHPコードを埋める際は終了タグを使いますが、ライブラリのようにPHPコードのみを記述する際は終了タグを省くことが慣例となっています。

終了タグを省く理由について id:Kiske さんに解説頂いています。ありがとうございます。
PHP基礎文法最速マスターの補足 – Absolute Playing!

<?php hoge(); ?>
<?php
$i = 1;
hoge($i);
?>
<?php
hoge();
&#91;/php&#93;

<h4>print文</h4>
<p>print/echoを使います。</p>

<?php
print "Hello World!";
echo "Hello World!";
&#91;/php&#93;
<p>デバッグにはvar_dump()をよく使います。var_dump()では変数の内容が出力されます。</p>

<?php
$array = array(1,2,3);
var_dump($array);

array(3) {
  &#91;0&#93;=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

コメント

一行コメント

// コメント
# コメント

複数行コメント

/*
コメント
コメント
*/

変数の宣言

変数の宣言です。

$a = 'string';
$i = 1;

スクリプトの実行

コマンドラインでPHPファイルを実行します。

$ php hoge.php

PHPコードを直接記述することもできます。<?php ?>は不要です。

$ php -r "var_dump('a');" 

出力結果をファイルに書き出すにはリダイレクトを使います。

$ php hoge.php > out

スクリプトの文法チェック

phpコマンドで文法がチェックできます。

$ php -l hoge.php

2. 数値

数値の表現

数値には整数、浮動小数点があります。

<?php
$int = 100;
$float = 100.123;
&#91;/php&#93;
<h4>四則演算</h4>

<?php
$i = 1 + 1;
$i = 1 - 1;
$i = 1 * 1;
$i = 1 / 2;
&#91;/php&#93;
<p>余りと商。商を求めるには普通の除算を行った後にintval関数で整数部を取り出します。</p>

<?php
$div = intval(3 / 2); // 商
$mod = 3 % 2; // 余り
&#91;/php&#93;

<h4>インクリメントとデクリメント</h4>

<?php
$i++;  // インクリメント
$i--;   // デクリメント
&#91;/php&#93;

<h3>3. 文字列</h3>
<h4>文字列表現</h4>
<p>文字列はシングルクォートかダブルクォートで囲みます。ダブルクォートの中では\t(タブ)や\n(改行)などの特殊文字を利用することができます。またダブルクォートで囲まれた文字列の中では変数展開することができます。</p>

<?php
$str1 = "abc\tcde"; // abc  cde(\tがタブ&#91;0x09&#93;)
$str2 = 'abc\tcde'; // abc\tcde(\tが文字列)

$str3 = "$str1 100"  // abc  cde 100 //$str1が展開される
$str4 = "{$str1}100"  // 変数名に文字列が繋がる時は{}で囲む
&#91;/php&#93;

<h4>文字列操作</h4>

<?php
// 結合
$join1 = 'aaa' . 'bbb';
$join2 = implode(',', array('aaa', 'bbb', 'ccc'));

// 分割
$split = explode(',', 'aaa,bbb,ccc');

// 長さ
$length = strlen('abcdef');
// 長さ(マルチバイト)
// 内部エンコーディングの設定が必要
// mb_internal_encoding('UTF-8');  
$mb_length = mb_strlen('あいうえお');

// 切り出し
$substr = substr('abcd', 0, 2); // ab

// 検索
$index = strpos('abcd', 'bc'); // 見つかったらその位置(先頭が0)、見つからなかったらfalseが返る
&#91;/php&#93;

<h3>4. 配列、連想配列</h3>
<p>PHPには連想配列しかありません。配列はキーが数値の連想配列として表現されます。また順序を持っています。</p>

<?php
$array1 = array(1, 2, 3); // 配列(キーが0から始まる連想配列)
$array2 = array('a' => 1,  'b' => 2, 'c' => 3); // 連想配列
$array3 = array(1, 'a' => 1, 2); // 混在もok

要素の参照と代入

<?php
$i = $array1&#91;0&#93;;
$s = $array2&#91;'a'&#93;;
&#91;/php&#93;
&#91;php&#93;
<?php
$array1&#91;3&#93; = 1;
$array2&#91;'z'&#93; = 'zzz';
&#91;/php&#93;

<p>要素の個数</p>

<?php
$len = count($array1);
&#91;/php&#93;

<h4>配列の操作</h4>

<?php
$array = array(1, 2, 3);
// 先頭を取り出す
$first = array_shift($array); // $first = 1 / $arrayは、(2, 3)
// 先頭に追加
array_unshift($array, 5); // $arrayは、(5, 2, 3)
// 末尾を取り出す
$last = array_pop($array); // $last = 3 / $arrayは、(5, 2)
// 末尾に追加
array_push($array, 9); // $arrayは、(5, 2, 9)
&#91;/php&#93;

<h4>連想配列に関する関数</h4>

<?php
// キーの取得
$keys = array_keys($array);
// 値の取得
$values = array_values($array);
// キーの存在確認
$boolean = array_key_exists('key', $array);
// キーの削除
unset($array&#91;'key'&#93;);
&#91;/php&#93;

<h3>6. 制御文</h3>
<h4>if文</h4>

<?php
if (条件) {
}
&#91;/php&#93;
<p>HTML内で記載する際は以下のような記法も用いられます。</p>

<?php if (条件): ?>
  <span>hoge</span>
<?php endif; ?>

if 〜 else文

<?php
if (条件) {
} else {
}
&#91;/php&#93;
<p>HTML内で記載する際は以下のような記法も用いられます。</p>

<?php if (条件): ?>
  <span>hoge</span>
<?php else: ?>
  <span>foo</span>
<?php endif; ?>

if 〜 else if 文

elseif or else ifが可。

<?php
if (条件) {
} else if {
}
&#91;/php&#93;
<p>HTML内で記載する際は以下のような記法も用いられます。</p>

<?php if (条件): ?>
  <span>hoge</span>
<?php elseif (条件): ?>
  <span>foo</span>
<?php endif; ?>

while文

<?php
$i = 0;
while ($i < 5) {
  // 処理
  $i++;
}
&#91;/php&#93;
<p>HTML内で記載する際は以下のような記法も用いられます。</p>

<?php while ($i < 5): ?>
  <span><?php echo htmlspecialchars($i); ?></span>
  <?php $i++; ?>
<?php endwhile; ?>

for文

<?php
for ($i = 0 ; $i < 5 ;$i++) {
}
&#91;/php&#93;
<p>HTML内で記載する際は以下のような記法も用いられます。</p>

<?php for ($i = 0 ; $i < 5 ; $i++): ?>
  <span><?php echo htmlspecialchars($i); ?></span>
<?php endfor; ?>

foreach文

連想配列の各要素を処理できます。

<?php
foreach ($array as $v) {
  // $v が要素の値
}
foreach ($array as $k => $v) {
  // $k が要素のキー、$v が要素の値
}

HTML内で記載する際は以下のような記法も用いられます。

<?php foreach ($array as $v): ?>
  <span><?php echo htmlspecialchars($v); ?></span>
<?php endforeach; ?>

7. サブルーチン(関数)

PHPには関数があります。戻り値を返却するにはreturnを使用します。

<?php
function sum($v1, $v2) {
  return $v1 + $v2;
}
$total = sum(1, 2); // $total = 3

// 配列で多値を返すこともできます
function get_multi($v1, $v2) {
  $v1 += 100;
  $v2 += 200;
  return array($v1, $v2);
}

list($ret1, $ret2) = get_multi(1, 2); // $ret1 = 101 / $ret2 = 202
&#91;/php&#93;

<h3>8. ファイル入出力</h3>
<p>ファイル入出力にはいくつかの方法があります。</p>
<h4>fopen関数</h4>
<p>ファイルポインタを使ってファイルの入出力を行います。</p>

<?php
// 読み込み
$fp = fopen("/path/to/file", "r");
if (!is_resource($fp)) {
  die("can't open file");
}

while (!feof($fp)) {
  $line = fgets($fp, 4096);
  // 何か処理
}
fclose($fp);

// 書き込み
$fp = fopen("/path/to/file", "w");
if (!is_resource($fp)) {
  die("can't open file");
}

fputs($fp, $buff);
fclose($fp);

&#91;/php&#93;
<h4>file関数</h4>
<p>ファイル全体を読み込んで配列に格納します。</p>

<?php
$list = file("/path/to/file"); // ファイルの各行を連想配列で取得
&#91;/php&#93;
<h4>file_get_contents関数 / file_put_contents関数</h4>
<p>file_get_contents関数はファイル全体を読み込んで文字列として格納します。file_put_contents関数は変数の値を全てファイルに書き込みます。</p>

<?php
// 読み込み
$contents = file_get_contents("/path/to/file"); // ファイルの内容を取得

// 書き込み
file_put_contents("/path/to/file", $buff); // ファイルに $buff の内容を書き込み
&#91;/php&#93;

<h3>知っておいた方が良い文法</h3>
<h4>真偽値</h4>
<p>PHPでは以下の場合、偽と判断されます。</p>
<ul>
<li>boolean の FALSE</li>
<li>integer の 0 (ゼロ)</li>
<li>float の 0.0 (ゼロ)</li>
<li>空の文字列、 および文字列の "0"</li>
<li>要素の数がゼロである 配列</li>
<li>メンバ変数の数がゼロである オブジェクト (PHP 4のみ)</li>
<li>特別な値 NULL (値がセットされていない変数を含む)</li>
<li>空のタグから作成された SimpleXML オブジェクト</li>
</ul>
<h4>==と===</h4>
<p>==/!=といった比較演算子では、数値・文字列の自動変換が行われます。よって意図しない結果をもたらす場合があります。</p>

<?php
var_dump(1 == 1); // true
var_dump(1 == '1'); // true
var_dump(0 == 'a'); // true
var_dump(100 == '100a'); // true
var_dump('+1' == '1.0'); // true
&#91;/php&#93;
<p>こういった場合、===/!==を使うと変数の型も厳密に比較することができます。</p>

<?php
var_dump(1 === 1); // true
var_dump(1 === '1'); // false
var_dump(0 === '0'); // false
var_dump(100 === '100a'); // false
var_dump('+1' === '1.0'); // false
&#91;/php&#93;
<h4>変数が定義されているかどうか</h4>
<p>変数が定義されているかどうかを調べるにはisset関数を使用します。定義されている場合はtrueが返ります。ただしisset関数では変数の値がNULLの場合もfalseが返ります。</p>

<?php
isset($a);
&#91;/php&#93;
<h4>コマンドライン引数</h4>
<p>コマンドライン引数を受け取るには$argv変数を使用します。</p>

<?php
var_dump($argv);
&#91;/php&#93;
<h4>array_map</h4>
<p>array_map関数を使うと、連想配列の各要素に処理をして新たな連想配列として受け取ることができます。</p>

<?php
$array = array(1,2,3);
$mapped = array_map(create_function('$v', 'return $v *= 10;'), $array); 
&#91;/php&#93;
<h4>array_filter</h4>
<p>array_filter関数を使うと、条件に一致した要素のみを新たな連想配列として受け取ることができます。</p>

<?php
$array = array(1,2,3,4);
$filtered = array_filter($array, create_function('$v', 'return ($v > 2);'); 

複数の変数への代入

<?php
list($v1, $v2, $v3) = array(1, 2, 3);
&#91;/php&#93;
<h4>php.ini</h4>
<p>PHPには設定ファイルがあります。設定に応じて挙動が変わるので注意が必要です。この設定はphp.iniという設定ファイルの他に、httpd.conf、.htaccess、そしてソースコードにて設定が可能です。</p>
<p>設定方法は、項目に応じて変わりますが、ソースコードで設定を行う際はini_set()を使うことが多いです。</p>

<?php
ini_set('include_path', '.:/path/to/libs'); // include_pathに'.:/path/to/libs'を設定する
&#91;/php&#93;
<p>現在の設定は、phpinfo関数もしくはphpコマンドで確認できます。</p>

<?php
phpinfo();
&#91;/php&#93;
<pre class="code">
# 全ての設定値を出力
$ php -i
# grep で絞る
$ php -i | grep include_path
</pre>
<h4>クラス定義</h4>
<p>classでクラスを定義できます。</p>

class User {
  protected $name = null;
  
  public function __construct($name) {
    $this->name = $name;
  }

  public function hello() {
    printf("%s: Hello!\n", $this->name);
  }
}

$user = new User('Mike');
$user->hello();

継承もできます。単一継承のみ可能です。

class MyUser extends User {
}

例外

throwで例外を投げることができます。try/catchで例外をキャッチします。他の言語にあるfinallyに相当するものはありません。

function foo() {
  throw new Exception();
}

try {
  foo();
} catch (Exception $e) {
  echo $e->getTraceAsString();
}

PHP参考資料

公式マニュアル

PHPに関する書籍は多く出版されていますが、やはり一番参考になるのは公式マニュアルです。

PHP: PHP マニュアル – Manual

公式マニュアルを使う際にちょっとしたTIpsを。

ブラウザで公式マニュアルを開く際は、http://php.net/の後ろに調べた関数名を入力すると直接そのページが開きます。合致するものがなければ類似するキーワードが一番表示され、候補の中から選択することもできます。

http://php.net/array

コーディング規約

コーディング規約にはいくつか流派があるのですが、Zend Frameworkのコーディング規約が参考になるでしょう。

Zend Framework PHP 標準コーディング規約 – Zend Framework Manual

モダンPHP

PHPにはオブジェクト指向言語としても機能があります。以下の資料が参考になります。

モダンPHP勉強会を開催しました & 資料 – 肉とご飯と甘いもの @ sotarok

フレームワーク

PHPを使ったWebシステム開発ではフレームワークを用いることがメジャーになりつつあります。

多くのオープンソースフレームワークがありますが、主要なものは以下です。

appengine ja night #4とPython Hack-a-thon #3に参加してきました&LT資料

この記事の所要時間: 319

週末にappengine ja night #4Python Hack-a-thon #3 に参加してきました。


2010年、初勉強会です。

どちらもこれまで参加することの無かったイベントなのですが、こうした場所に参加したくなるのも Google App Engine(GAE)をやり出して興味が広がった効果ですね。

appengine ja night #4ではBT(Beer Talk)もやってきました。

他の方の発表も参加される方の雰囲気も事前には良く分からない状況だったのですが、ほぼ全員の方がはじめましての状況だったので自己紹介も兼ねて話してきました。

いざやってみると、とても良い雰囲気で、突っ込みあり、笑いありですごく話しやすかったです。ありがとうございました。

資料を見てもあまり役に立たない気もしますが、いちおうアップしました。

以下、雑感を。

appengine ja night #4

  • 会場はリクルートメディアテクノロジーラボさん。会場もキレイだし、スクリーンマルチだし、無線LANもあるしで、至れり尽くせり:-D
    => ありがとうございました。
  • 発表を聞くだけでなく、適時突っ込みを入れるスタイル。
    => 議論が深まって面白かったです。発表者は大変だと思いますけど:-D
  • 運営のみなさん、ありがとうございました。
  • 次回は来月開催だそうです。みんなやさしい人達だから、興味ある人は参加すると良いですよ。

Python Hack-a-thon #3

  • 会場はオラクルさん。マルチスクリーン、電源あり、無線LANあり、飲み物無料、キレイと、こちらも至れり尽くせり。
    => ありがとうございました。
  • 両日共にこんなに素晴らしい会場を無料で提供頂けるのは本当にありがたいことです。
  • hackathon初参加。
  • ワークショップはGAE+Facebookにちらっと参加して、あとはもくもく作ってました。
  • GAE+Facebookは連携して、友人一覧が出せたのでとりあえず満足:-D
  • その後はTwitterのOAuthを使った検証と新しいサービスの下調べを。
  • hackathonの時間はあっという間に終わっちゃいました。
  • PHPでも同じようなイベントをやっても良いかも。(関西でやろうかな。)
  • お昼やワークショップ、発表を通じて、普段あまり接することのない分野に触れられて刺激的でした。
  • 自主性をかなり求められるイベントなので、少し参加する人を選ぶイベントかも。オラクルさんの環境で作業したいがために参加する手もありますけどね:-D
  • 運営のみなさん、ありがとうございました。

興味が広がると

冒頭でも書きましたが、どちらも初参加のイベントだったので、初めてお会いする人ばかりでした。両イベントとも著名な方も多く参加されていたので、ミーハー気分な楽しみもありました:-D

新しいことをやりだすとRPGで新たな地図を手にしたように、これまで行けなかったところに行ける楽しみがあります。

また勉強会をやりたくなってきました。GAEの勉強会を関西でやってみましょうか。

自分がいなくなった後も動き続けるWeb

この記事の所要時間: 256

自分が死んだ後、Webには何が残るのだろう。

30代半ばになると、いやでも死というものを考える瞬間がある。日頃から常に考えているわけではないけれど、ふとした瞬間に考える。

ある日、何気なく考えた。

「もし、自分が死んだら、Webにある自分はどうなるんだろ。」

blog

まず、このblog。

サーバはレンタルなので、その期限がくれば停止して見られなくなる。

また、1×1.jpドメインも1年経って何も手続きをしなければ失効される。

おそらく死後1年数ヶ月で見ることはできなくなるだろう。

自作のWebサービス

follow okfindTwitterhot.hatebuといった自分で運営しているサービスたち。

レンタルサーバに置いているものは、blogと同じく契約が切れれば停止するだろう。

hot.hatebuは GAE(Google App Engine)に置いているので、Googleの気分が変わらなければ残り続ける可能性は高い。最近GAEを熱心にやっているのは、こういう理由もあったりする(別に死後を考えているわけではないけど)。

ただやっぱりドメインが切れると接続できなくなる。

残すことだけを考えるなら、独自ドメインではなく、「*.appspot.com」で公開した方が良い。

Twitter/Wassr/usream等のWebサービス

これはサービスさえ残れば、そのまま残り続けるだろう。

Twitterには思いついたことをすぐにpostしているから、結構生々しいというか、生きている感じがする。

以前、Twitter上で有名な方が亡くなられた。2007年頃からTwitterをやっている人なら知っている人も多いと思う。

最近、何かの拍子にその方を思い出し、その方のTwitterを見てみると、アカウントがそのまま残っていた。

残されたtweetは、ごく自然に発せられたもので、日付が2007年ということを除けば、まるで生きているようだった。

その方はustream配信もされていたので、録画したものがそのまま残されていた。

私はそれほど接点があったわけではないが、何となく気になる人だった。(当時はまだ日本のTwitterユーザ数も少なくて、わりとみんな仲良しな空気もあった。)

彼ほどの影響力は無いにせよ、サービスが残っている間は、何かしらの想いがWebに残り続ける。

問題はドメイン

blogとかは大手の無料サービスを使う、自分が作るサービスはGAEを使う、としておけば、しばらくは動き続ける。

問題はやっぱりドメインで、自動更新の仕組みが欲しいところ。こだわりを捨てられるのであれば、割り当てられたドメインで運営すれば良い。

何かを残したい

生きてきた何かを残したい、という想いにWebは向いている。誰でも発信できるし、多くはサービスが無くならない限りコンテンツが残る。

GAEで最初に作ったアプリケーションは、家族の誕生日にメッセージを送るというシンプルなものだった。

少しでもWeb開発をかじった人なら誰でも簡単に作れるものだし、公開するつもりも無いので操作画面も無い。

ただGAEなら数年単位の未来までは動き続けるだろうから、もし明日いなくなっても、しばらくは送り続けてくれるだろう。(無料で利用できるGAEには「何があっても動き続ける」という利点もある。)

いつも考えているわけではないけど、たまには。

はてブホットエントリーを見るWebサービス「hot.hatebu」を作りました

この記事の所要時間: 257

はてブホットエントリーを集計して見るWebサービス「hot.hatebu」を作りました。

はてブのホットエントリーを集計して一覧で見るサービスです。機能をざっくり挙げると以下です。

  • 「エントリ」「時間」「タグ」「ユーザ」の集計データを表示
  • 日付範囲を指定して、合算した集計データを表示
  • パネル機能

詳細については説明ページがありますので、こちらをどうぞ。
hot.hatebu | 説明ページ

ここでは作った経緯や使い方のポイントなどを。

週間はてブホットエントリーを見たい

そもそものきっかけは週間ホットエントリーを見たいというものでした。イベントやネットラジオなどで話す時のネタにホットエントリーを使うのですが、公式サイトでは一日単位で見る方法しかありません。

例えば、先週のホットエントリーをまとめて見る場合は1ページづつページを辿るしかありません。

そこで複数日のホットエントリーを合算して見られるサイトが欲しいと思いました。

あとちょうどGAEを試していたので、何か作ってみたいというのも理由の1つです。

平日は12時台、休日は23時台がピーク

実際にやってみて面白かったのが時間別のブックマーク数です。

平日と休日ではっきりと推移が異なります。

・平日(2009/12/07〜2009/12/11)
hot.hatebu | 2009/12/07〜2009/12/11の時間別

・休日(2009/12/12〜2009/12/13)
hot.hatebu | 2009/12/12〜2009/12/13の時間別

平日はオフィスで昼休みにRSS ReaderやTwitterからブックマーク、休日は家に帰って寝る前にWebを眺めてブックマーク、という使い方が多いのかもしれませんね。

パネル機能

あったら面白いなと思っておまけで付けた機能です。

勉強会やネットラジオをやる時、何となく話すネタが欲しい時ありませんか?そんな時にプロジェクタでこの画面を映して、表示されたエントリーについて話ができれば考えています。

イメージとしてはテレビのバラエティで見るパネルですね。

データは2009/12/01〜

データはまだ2009/12/01以降のものだけです。今後のデータは随時、追加していきます。

DataStoreで悩む

GAE+Pythonで作りました。

悩んだのはDataStore周りの実装ですね。どうしてもRDBMS感覚で作ってしまうので、パフォーマンスが出なかったり、30秒制限にひっかかったりで試行錯誤を繰り返しました。

TaskQueueを使う方法が分かってからは何とか形になりました。色々な制限があるGAEでは、TaskQueueをどう上手く使うかがキーですね。

無料のQuotaを超えて課金をはじめると分かりやすく「リソース浪費=コスト(金銭)の浪費」に繋がります。例えば、ロジックの組み方が悪くてCPUを無駄に使えばその分費用がかかります。これまで以上にチューニングや処理の分散化(ブラウザでできることはブラウザにやらせる)といったアプローチが重要になりそうです。

ホッテントリーは面白い

ホットエントリー、はてなブックマークのデータは題材として面白いですね。自分で作ってみても色々な見方ができて楽しいです。

ホッテエントリーのチェックに、話のネタ探しに、ブックマークの分析に使って頂ければ嬉しいです。

Google App Engineで独自ドメインを使う

この記事の所要時間: 425

Google App Engine(GAE)で独自ドメインを使う方法です。

GAEに設置したアプリケーションはデフォルトでは、[アプリケーションID + .appspot.com]というドメインでアクセスすることができます。

また、これとは別に独自ドメインをアプリケーションに割り当てることもできます。

独自ドメインを割り当てる方法は知っていないと嵌りやすいので手順を書いておきます。

仕組みと手順

まずは仕組みから。

GAEでの独自ドメイン割り当ては、独自ドメインのCNAMEでGAEサーバを指すことで実現します。よって独自ドメインのDNSが設定できる必要があります。

私はドメイン管理にムームードメインを使っているのですが、ムームードメインではコントロールパネル(Web管理画面)にてDNSの設定ができます。

次に手順。

前提として独自ドメインは既に取得済みとします。

  1. Google Appsを申し込む
  2. Google Appsでドメイン設定
  3. Google App Engineでドメインを割り当てる

1. / 2. ではGoogle Appsにて独自ドメインの設定を行います。Google App Engineではなく、Google Appsなのでご注意を。

1. Google Appsを申し込む

Google Appsにて申込みを行います。

Google Apps

Google Appsには幾つかエディションがあるのですが、ここでは無料で利用できる「Standard Edition」を申し込みます。

画面右メニューから「Standard Edition」を選択します。

次の画面の右メニューから「開始方法」を選択します。

設定するドメインを入力します。既にドメインは取得済みなので、「既存のドメイン名を使用する」タブにドメイン名を入力します。

次に申込者(アカウント管理者)情報入力と管理者アカウント登録を行います。

これでGoogle Appsの申込みは完了です。

Google Appsの管理画面(ダッシュボード)に遷移します。)

2. Google Appsでドメイン設定

Google Appsにてドメインが利用できるように設定します。

Google Appsを申し込んだ直後はまだドメインは利用できるようにはなっていません。(申込みだけで使えるようになってたら問題:-D)ドメインの所有権をGoogleが確認することにより利用が可能になります。

ドメイン所有権の確認を行うには、ダッシュボード画面上部にある「ドメインの所有権を確認」リンクに進みます。

ドメイン所有権の確認には「HTMLファイルをアップロード」する方法と「CNAMEレコードを変更」方法があります。今回、ドメインを取得したムームードメインでは管理画面からDNS設定ができるので、今回はプルダウンで「CNAMEレコードを変更」を選択します。

プルダウンを選択すると、所有権確認用のDNS設定が表示されます。この画面の説明どおりにDNSを設定して、「確認」をクリックすると所有権の確認をGoogleが行います。

たとえばムームードメインなら以下な感じです。

DNSでCNAMEを割り当てると、ブラウザでhttp://googlexxxxxxx.example.com/にアクセスするとgoogle.comが表示されるはずです。

所有権の確認を依頼するとダッシュボードに確認中を示すメッセージが表示されます。「48時間程度」と書いてありますが、私が試した時は数分で確認が完了しました。

3. Google App Engineでドメインを割り当てる

いよいよGAEで独自ドメインを割り当てます。

まずGAEの管理画面にアクセスします。左メニューにある「Application Settings」をクリックして、画面中央の「Domain Setup」にある「Add Domain…」ボタンをクリックします。

Add Domain画面にて割り当てるドメインを入力します。

次の画面の中央にある「新しいURLを追加」リンクをクリックします。

GAEアプリケーションに割り当てるホスト名を入力します。なおホスト名無しのドメイン(Naked Domain)は以前は設定できたようですが、現在は設定できないようです。

最後に入力したホスト名についてDNSの設定を行います。手順はドメイン所有権の確認で行ったのと同じようにホスト名のCNAMEに指示された内容を設定します。

ムームードメインでの設定例です。

最後に画面下の「指定された手順を完了しました」をクリックして設定は完了です。

ちょっと手間。。。

はじめて設定したときは行程に目がくらっとしたのですが、慣れると結構トントン拍子で設定できます。

この方法でドメイン設定を行うとGoogle Appsが独自ドメインで使えるのでそれはそれでメリットになります。例えば設定したドメインのメールアドレスをGoogle Apps上で作成することができます。(要設定)

GAEで独自ドメインを使う時はご参考にどうぞ。

Google App EngineでCPU Timeを使い切った

この記事の所要時間: 136

Google App Engine(GAE)でCPU Timeを使い切りました。

GAEは従量制のサービスで、あらかじめ設定した金額内で利用できるリソースが決まっています。これはQuotaと呼ばれていて、CPU、ネットワーク流量、保存データ、API呼び出し回数等々で制限があります。

よく言われる「GAE=無料」というのは、無料(課金しない)なら、そのQuotaが適用されるということです。

GAE+Pythonでとあるサイトの動作確認をやっていたところ、無料分のCPU Timeを使い切りました。

実際に使い切るとこんな感じになります。

サイト

ブラウザでアクセスすると、どのページを見ても503が返ってきて、Googleのエラー画面が表示されます。

HTTPレスポンスヘッダは以下。

HTTP/1.x 503 Service Unavailable
Date: Sat, 16 Jan 2010 06:21:24 GMT
Content-Type: text/html
Server: Google Frontend
Content-Length: 999
X-XSS-Protection: 0

Task Queue

ちょうどTask Queueにキューが入っていたのですが、CPU Timeを使い切ったあとは、タスクが実行されなくなりました。

45個のタスクが残っているのに実行されていません。

解放待ち

今回は24hに使えるCPU Timeをオーバーしたので、時間が経過すれば利用できるようになるはずです。

実際のサイトではサイト監視で503が出たら、Quotaを広げる(課金額を増やす)といった運用になるのでしょうね。

解放まであと1時間。。。

追記:1時間後に解放されました。

sendmail .forwardで起動するコマンドのパスを変えたら、smrshも変更する

  • 2010-01-13 (水)
  • unix
この記事の所要時間: 242

何回やってもハマるから書いとく。

.forwardやsmrshについての解説はここでは飛ばします。ようは受信メールをトリガーに何か処理をするためのものです。(携帯の空メール連携なんかは良くやりますね。)

大事なところはここ。

プログラム名の前にあるパス名は全て取り除かれるため、 “/usr/bin/vacation”, “/home/server/mydir/bin/vacation”, “vacation” などは全て “/usr/libexec/sm.bin/vacation” と解釈されます。

Manpage of SMRSH

.forwardで起動するコマンドのパスだけを書き換えてもファイル名しか見てないので意味がありません。

元の設定

例えば、これまで起動していたコマンドが[/path/to/old/command]とします。

.forwardは以下な感じ。

|/path/to/old/command

/etc/smrshにはシンボリックリンクが張られています。

# ln -s /path/to/old/command /etc/smrsh/command

起動コマンドパスの変更

何らかの事情でcommandコマンドのパスが変わって、[/path/to/new/command]になったとします。

当然ながら.forwardの起動コマンドパスを書き換えます。

|/path/to/new/command

これでokと思って、メールとの連携をするとなぜか[/path/to/old/command]が実行されます。

おかしいと思って/var/log/maillogを見ると、ちゃんと[/path/to/new/command]が実行されているログが残っています。

Jan 12 18:22:30 user sendmail[12152]: xxxxxxxxxxxxxxxxx: to=|/path/to/new/command ...

[/path/to/new/command]が実行されるはずで、ログにも記録されているのに、なぜか[/path/to/old/command]が実行される。なんで?なんで?となるわけです。

実はsmrshでは冒頭の引用のとおり.forwardに書いてある起動コマンドのパスなんか見ちゃあいないんですね。見ているのはファイル名だけで、結局は/etc/smrshにある同名のコマンドを実行するだけだと。

つまりこの場合は/etc/smrsh/にあるシンボリックリンクを書き換えないとダメなんですね。

# rm /etc/smrsh/command
# ln -s /path/to/new/command /etc/smrsh/command

これで[/path/to/new/command]が新たに起動するようになります。

あまり無いことなんで

はまります。たまにしかやらないので今回もはまりました。。。

ここに書いて次こそ忘れないように。

Google App Engineを使ったサイトを調べる方法

この記事の所要時間: 022

Google App Engine(GAE)が盛り上がってきてますね。

今後増えて行くであろうGAEを使ったサイトを判別する方法です。

そうは言っても何も特殊なことをするのでは無く、単にHTTPレスポンスヘッダを見るだけです。

GAEを使ったサイトは「Server: Google Frontend」が返ってくる、というの話でした。

2009年Twitterユーザに最も使われたプログラム言語は?

この記事の所要時間: 111

2009年に書いたプログラム言語を列挙する企画がTwitterで開催されています。

参加する

方法は簡単でハッシュタグ「#code2009」を付けて、2009年に書いたプログラム言語をカンマ区切り並べるだけです。

例えば私なら、こう。

集計を見る

postしたtweetはこちらのサイトで集計されます。
http://www.ioncannon.net/projects/code2009/

集計結果は4つのグラフでまとめられます。

例えばこんな感じ。

最も使われたのはJavaScript

2009年、Twitterユーザに一番使われている言語は「JavaScript」でした。(2010/01/02現在)

2位以下は「Ruby」「Java」「Python」「PHP」と続いています。

ちなみにプログラム言語のランキングとしておなじみのTIOBE Software(2009/12)では、一位が「Java」で、「C」「PHP」「C++」「VB」となっています。

Twitterユーザのランキングを見るとWebシステムで良く使われる言語が並んでいるので、やはりTwitterユーザにはWeb系の人が多いという当然の結果ですね。

まだpostしていない方は2009年のふりかえりに参加してみてはどうでしょう。

2009年ふりかえり&2010年もよろしくお願いします

この記事の所要時間: 424

あけましておめでとうございます。

2009年が終わり、2010年となりました。

旧年中は、このblogやTwitter、イベント等々でお世話になり、本当にありがとうございました。

過ぎ去った2009年に行った活動をざっくりとまとめたいと思います。

つくったもの

きちんとしたWebサービスらしいものはfollow okくらいですね。follow okは今も登録ユーザさんが増えていて、2009年末時点で2400人の方に登録頂いています。やっぱり作ったものを使って頂けるのは嬉しいことです。

執筆したもの

CakePHP関連の書籍を2冊、共著で執筆しました。

実践本はほんの一部しか関わっていないのですが、各所で良い評判を聞いていて有り難い限りです。ありがとうございます。

参加した勉強会、イベント

この中で印象に残っているのはPHPカンファレンスでの発表です。

今のように勉強会に関わる以前は、PHPカンファレンスでの発表は遠い世界のことのような気がしていました。今年はその壇上で発表ができ、また聞いて頂いた方に声をかけて頂き、本当にやってきて良かったなと思いました。

さらにCakeMatsuri、PostgreSQLカンファレンスでの発表と続くこの三ヶ月は自分の中では大きなもので、これまでのコミュニティ活動の集大成ともいえるものでした。10thPHPカンファレンスと10thPostgreSQLカンファレンスの両方で発表したのは自分くらいなので、それも密かに嬉しかったっりしてます:-D

他にも、ジュンク堂さんで行ったCakePHP Cafe LiveTalkや、ドキュメント勉強会、関西アンカンファレンスとこれまでやったことの無いイベントをできたのも収穫でしたね。

すっかり勉強会やイベントの魅力にとりつかれた一年でした。これは2010年も継続していきたいです。

2009年は

なんといっても2009年は「勉強会、イベントの年」でした。

これほど勉強会やイベントに関わる年は今までありませんでした。イベントに関われば関わるほど、さらにやりたいことが出てきて深く関わるという良い(?)循環になりましたね。

PostgreSQLカンファレンスが終わった11月は、さすがにイベントはもうしばらくいいか、と思っていたのですが、数日もするとイベントがやりたくなり、結局関西アンカンファレンスを開催することになりました。

みんなで楽しめるイベントは自分の性に合っているのかもしれません。OSS・IT業界への参加、還元の方法として、コードを書くということだけでなく、イベントを開催する・盛り上げる・発表するというのも1つの方法かなと考えたりもしています。

2010年は

2009年で加速したイベントへの関わりをさらに深くしていきたいと思います。

具体的にはこれまでどおり、イベント開催や発表、参加するのももちろんですが、イベント運営用のシステム開発を考えています。

現在もATNDをはじめ様々なイベント管理システム(サービス)が展開されています。しかし実際に開催する側からするとバッチリはまるサービスが無かったりもします。特に参加費の集金についてはシステムで対応しているサービスは国内では見かけません。

実際に使う人が嬉しいシステムを作りたいと考えているので、開発が動き出した際はご要望等々頂ければ嬉しいです。

ということで、今年も色々と活動していきたいと思うので、よろしくお願いします!

Home > アーカイブ > 2010-01

検索
フィード
メタ情報

Return to page top