Home > アーカイブ > 2006-12

2006-12

CakePHP Screencastまとめ

この記事の所要時間: 236

CakePHPを解説するScreencastをまとめてみました。

フレームワークを理解するのにソースやドキュメントを見て触るのが一番良いのは間違いないですが、動画や音声での解説はイメージを頭に作るのにとても役立ちます。

私も今はソースやファイル構成が(ざっくりですが)頭に入っていますが、Screencastを見るとより理解が深まるように感じます。

1. Admin Routing
Admin Routingの使用法です。(/adminでadminアクションを呼び出す方法)
bakeでMVCを生成して、adminアクションに対応させていきます。

2. Episode 1: Using Debug Messages
URLに対応するMVCが無い場合に表示されるエラーメッセージに従ってアプリケーションを構築していきます。
序盤はMVCをbake&エディッタで書いていきますが、途中からscaffoldを使用します。
phpnutによる音声解説付きです。

3. The Blog Tutorial
簡単なblog(というか単純なCRUD)をbake&scaffoldなしで構築していきます。
scaffoldで表示される画面をscaffoldを使わずに書いていくイメージです。

4. Using TortoiseSVN to Sync CakePHP applications
CakePHPの解説というよりsubversionの解説ですね。
開発用と本番用でブランチを切り、開発用の変更を本番用にマージしていくという内容です。
phpnutによる音声解説付きです。

5. Building the Bakery
bakeの解説です。
バージョンがかなり古い(1.1.2.2802)ので表示や生成される内容が現在と異なっています。(操作はほぼ同じなので問題は無いかと。)
複数テーブルの連携方法は参考になるかと思います。

6. cakephp basics screencast su Kuht.it Stage X
CakePHPのダウンロードから始まり、bake&scaffold無しでMVCを書いていきます。
CSSファイル・レイアウトファイルの作成、ビューヘルパの小技など画面デザインにフォーカスした内容です。
CRUDのうち、Rのみで、CUDについての解説はありません。

7. 10分で作るCakePHPアプリ for Windows – p4life
言わずと知れたp4lifeさんのScreencastです。
CakePHP+XAMPPのインストールから、scaffoldを使ったアプリケーション構築まで解説されています。

見る順番ですが、初心者の方はまず7.でざっくり雰囲気を見て、3./2./5.と進んでいけば良いと思います。(もちろんソースをダウンロードして、実際にソースを触りながら見るのがベターです。)

今後はさらにディープな内容のScreencastも出てくるのでしょうか。楽しみです。

CakePHP1.1.12.4205&1.2.0.4206_devリリース

この記事の所要時間: 038

CakePHP1.1.12.4205&1.2.0.4206_devがリリースされています。

CakeForge: CakePHP: Project Filelist

1.1.12.4205はバグフィックスリリースのようです。

注目はやはり1.2系初リリースの1.2.0.4206_devですね。開発版ながら今後のCakePHPの方向性を見る上でも楽しみなリリースです。

A gift for all to enjoy | The Bakery, Everything CakePHP : Articlesに新機能の概要が紹介されています。

# フォーラム – CakePHP Users in Japanで和訳が紹介されています。

Flash Lite1.1とPHPセッションの連携

  • 2006-12-23 (土)
  • PHP
この記事の所要時間: 048

Flash Lite1.1では起動時にSWFに値を渡す方法(URLパラメータやparamタグ)が使えないようなので、SWFにセッションIDを渡すことができません。
そのためloadVariable()等でサーバと通信できても、セッションが特定できないので、ユーザを識別するようなアプリケーション(ゲームや会員向けサイト等)には使えませんでした。

そこでSWFにセッションIDが渡せないならばと、URLにセッションIDを含める方法を考えました。

つまり

<a href="/path/to/hoge.swf?PHPSESSID=phpsessid">SWF</a>

<a href="/path/to/phpsessid/hoge.swf">SWF</a>

とするわけです。

ファイル構成

以下のようなファイル構成を想定しています。

[/path/to]
    + .htaccess
    + user.swf   < --- SWF
    + index.php  <--- セッション開始PHP
    + user.php   <--- ユーザデータ出力PHP

処理の流れ

おおまかな流れです。

  1. index.phpでセッション開始
    セッションIDを含めたURL[/path/to/phpsessid/user.swf]を生成
  2. [/path/to/phpsessid/user.swf]に来たリクエストをmod_rewriteで[/path/to/user.swf]に変換
  3. user.swfからloadVariable()でuser.phpを呼ぶ
  4. [/path/to/phpsessid/user.php]に来たリクエストをmod_rewriteで[/path/to/user.php?PHPSESSID=phpsessid]に変換
  5. user.phpでセッションデータを出力する

1. セッション開始・user.swfへのリンク生成[index.php]

セッションを開始するPHPファイルです。セッションに初期値をセットしておきます。(会員向けアプリケーションならここでログイン処理などを行います。)

あとuser.swfへのリンクを表示します。このリンクにはURLにセッションIDを含めるようにしておきます。

< ?php
session_start();
$_SESSION&#91;'count'&#93; = 1;

$url = sprintf("./%s/user.swf", session_id());
?>
<a herf="<?php echo $url ?>">SWF</a>

2. user.swfを出力 [.htaccess]

1.のリンクをクリックすると[/path/to/phpsessid/user.swf]にリクエストが来ます。当然そのようなURLは無いのでmod_rewriteでURLを[/path/to/user.swf]に書き換えます。

RewriteEngine On
RewriteRule ^[0-9A-Za-z]+/user\.swf user.swf

3. user.swfからuser.phpを呼ぶ [user.swf]

user.swfからセッションのデータを取得するためにuser.phpにリクエストを投げます。ここでURLを相対パスで書くのがポイントです。

loadVariable('user.php');

4. user.phpを呼び出す [.htaccess]

3.から[/path/to/phpsessid/user.php]にリクエストが来ます。これをmod_rewriteでURLを[/path/to/user.php?PHPSESSID=phpsessid]に書き換えます。

これすればセッションIDがuser.phpに渡され、セッションを取得することができます。

RewriteEngine On
RewriteRule ^[0-9A-Za-z]+/user\.swf user.swf
# ↓を追加
RewriteRule ^([0-9A-Za-z]+)/user\.php user.php?PHPSESSID=$1

5. user.phpからセッションデータを出力 [user.php]

4.でセッションIDが渡されているので、あとは通常とおりセッション処理を記述すればokです。

< ?php
session_start();
if (isset($_SESSION&#91;'count'&#93;)) {
  printf("count=%d", $_SESSION&#91;'count'&#93;);
  $_SESSION&#91;'count'&#93;++;
} else {
  print("count=-1");
}
?>

今回はPHPのセッションIDを使ったのですが、ようはユーザ(セッション)を識別できれば良いので一意なものであればトークンでも何でも良いです。

分かってしまえば簡単なのですが、思いつくまではかなり悩みました。。。

Lite 1.1上の開発は色々と大変なので誰かのお役に立てれば嬉しいです、はい。

Java風なメソッド呼び出し

  • 2006-12-21 (木)
  • PHP
この記事の所要時間: 244

via MikeNaberezny.com » Fluent Interfaces in PHP

PHP5で採用された記述方法です。そう言えばすっかり忘れていました。

$obj->foo()->bar();

ってやつです。

使えるシーンは色々あると思いますが、同じデータに繰り返し操作を行う文字列の変換を例に書いてみました。

< ?php
$str = ' Hello world!! ';
echo str_replace('ELL', '123', strtoupper(trim($str))) . PHP_EOL;
?>

というのを

< ?php
// 独自文字列クラス
class StringClass {
  private $str = "";

  public function __construct($str) {
    $this->str = $str;
  }

  public function toUpper() {
    $this->str = strtoupper($this->str);
    return $this;
  }

  public function toLower() {
    $this->str = strtolower($this->str);
    return $this;
  }


  public function strTrim() {
    $this->str = trim($this->str);
    return $this;
  }

  public function strReplace($search, $replace) {
    $this->str = str_replace($search, $replace, $this->str);
    return $this;
  }

  public function toString() {
    echo $this->str . PHP_EOL;
  }
}

$obj = new StringClass(" Hello world!! ");
$obj->strTrim()
    ->toUpper()
    ->strReplace('ELL', '123')
    ->toString();

?>

のように書けます。(文字列クラスが標準であれば良いのですが。。。)

ポイントは単にメソッドで$thisを返すだけです。

可読性も良いですし、メソッドの呼び出し順を入れ替えるのも容易です。美しいですしね;-)

ちなみに配列関数のように参照を返す関数でも同じような記述ができます。

< ?php
$array = array(new DateTime('2006/12/21'));
echo current($array)->format('Y/m/d') . PHP_EOL;
?>

ORDB.org is shutting down

この記事の所要時間: 116

メールの不正中継ホストのデータベースであるORDBが活動を停止するようです。

We regret to inform you that ORDB.org, at the ripe age of five and a
half, is shutting down. It’s been a case of a long goodbye as very
little work has gone into maintaining ORDB for a while.

Open Relay Database –

現状ではSPAM対策としての効果が疑問視されているようですし、IPベースでの制限による問題が指摘されてきました。(詳しくはspamhaus.orgをはじめとするIPアドレスベースのブラックリスト(RBL)を使ってはいけない

ORDBの停止により同様のサービスを行っているサイトにも影響が出るのでしょうか。

We encourage system owners to remove ORDB checks from their mailers
immediately and start investigating alternative methods of spam
filtering.

Open Relay Database –

との事なのでSMTPやSPAMフィルタで参照されている方は設定を変更しておきましょう。

Win版PHPのコンパイラ

  • 2006-12-18 (月)
  • PHP
この記事の所要時間: 127

Win版PHPバイナリはVC++6.0でビルドされているのですね。

The official PHP binaries for Windows are built using a very old version of Microsoft Visiual Studio C++. We are still using version 6.0 that was released back in 1998.

Compiler upgrade for PHP Widows distro – Edin Kadribašić

これまでVC++6.0を使っていた理由は「単にライセンスを持っているのがVC++6.0だった」だそうです。

普段ダウンロードして使うだけですが、考えてみれば誰かがビルドを行っていて、しかもそのツールは誰かがライセンスを購入しているのですね。有り難いことです。(こういうのはコミュニティで購入して、支給するとかできれば良いように思います。それはそれで管理が難しいかな。)

あとエントリではZendがWindows向けの最適化を行うのに合わせて、今後はVC++2005等のコンパイラに変更するかもしれないと書かれています。まずはPHP5.2.1RC1で試してみるそうです。

コンパイラによってバイナリの性能が変わる事はままあるので成果に期待したいですね。

[2006/12/21追記]
早速ベンチマークが出ています。Benchmarks – Edin Kadribašić – Mozilla Firefox
ざっと見る限りはそれほど目立った効果は出ていないようですね。。。
今後に期待ということで。

地図マッシュアップサイト

この記事の所要時間: 058

Google MapsやYahoo! Mapsなどの地図サービスをマッシュアップしたサイトです。

Flash Earth …satellite and aerial imagery of the Earth in Flash

Flashで出来ています。メニューのサービスを切り替えることにより、表示しているポイントの地図が切り替わります。

地図を表示したままサービスを切り替えられるので、地図の違いを手軽に確認できます。地方を拡大表示したい場合などは地図が表示されないサービスもあるので、表示してくれるサービスを探すのに使えそうですね。

なかなか気持ち良く動作します。マッシュアップするのにFlashを使うのは案外相性が良いかもしれません。

サポートされている地図サイトは以下です。

  • Google Maps
  • Microsoft VE(aerial)
  • Microsoft VE(labels)
  • Yahoo! Maps
  • Ask.com(aerial)
  • Ask.com(physical)
  • OpenLayers
  • NASA Terra(daily)

Binary 2.0カンファレンス2006

この記事の所要時間: 227

Binary 2.0カンファレンス2006にストリーミングとIRCで参加しました。

いちおう一時期プチバイナリアン(Z80ですが)だった時期もあったので興味津々で見ていました。

Hello, binary world

GCC拡張自体も面白かったのですが、それ以外も色々勉強になりました。

  • mail関数はプロセス全体で見るとただの一関数
  • 変数での関数でもただのシンボル
  • mainに数値を入れておくとマシン語として動作する

何となくは知っていたのですが、普段Cを書かないのでこうして聞くとあらためて「なるほど」と思いました。(「読んで」「書いて」さらに「聞く」とより理解が深まります。)

X日で作る仮想マシンモニタ(に向けて)

  • シミュレータ上で開発すればメモリの状態なんかも確認しやすい。

開発カレンダーを見るとあっという間にモノができあがっていくのが凄かったり。

getcontextの怪

  • 本当に根本の問題。
  • これからIA-64化が進めばPHPなんかにも出てくるかもしれない。
  • setjmpやgetcontext、レジスタスタックが勉強になった。

問題の対処法も勉強になりました。

マルチコア時代の並列プログラミング:ロックとメモリオーダリング

lock-free synchronizationのアルゴリズムが分かりやすかったです。あと高いスキルがある方でも「KISS(keep it simple)」が大事なんだと実感しました。

# 高度なお話しを分かりやすく、かみ砕いて説明して頂けたのはとても好感を持てました。

Web2.0時代のAjax Binary Hacks

GIF画像にJSONデータを埋め込むのは面白かったです。時間の都合ではしょられたのですが、できれば最後まで利きたかったです。

# ネタも最高でした。「ふたりはバイナリアン」w

携帯 Flash でバイナリ処理

以前Flash Lite1.1で開発した事があります。ほんと大変(面倒)です。特にFlash5以上で開発経験があるとあまりの違いに戸惑います。それだけに単純に「よくやるな~」という印象でした。さすがバイナリアン。;-)

できれば作成されたソースを見てみたいですね。

tty hacks for PS3 Linux

Wiiリモコンと効果音の大事さw

GNU on Binary 10.0

telで見逃してしまった。。。

ASCII 1.0

MSXが動作しているのに感動しました。いやほんと。1chip MSX買おうかな。

やはりバイナリ系の話は楽しいです。プレゼンの主題ももちろんですがそれに付随するお話しもとても勉強になりました。低レベルで何か作ってみたくなりますね。;-)

ストリーミングとIRCのおかげで大阪からセミナーに参加する事ができました。皆さんありがとうございました。

CakePHPでCSRF対策

この記事の所要時間: 33

CakePHPでCSRF対策を行う方法です。

フレームワークに含まれているSecurityコンポーネントを使います。

Security#requestAuth()にアクションを記述しておくと、アクション実行前に正規リクエストかどうかをチェックします。チェックの方法はCSRF対策で一般的なワンタイムトークン方式です。

まずController#beforeFilter()にてチェックを行うアクションを指定します。

[app/controller/test_controller.php]

< ?php
class TestController extends AppController {
  var $name = 'Test';
  var $components = array('Security');

  function beforeFilter() {
    $this->Security->requireAuth('add', 'edit');
  }

  function add() {
   //
  }

  function edit() {
   //
  }
}
?>

あとはビューファイルにトークンを埋め込みます。ポイントはformタグをHTMLで書かずにHtmlHelper#formTag()で記述するという事です。そうしておけばフレームワークがトークンをhiddenで埋め込んでくれます。(もとからformTag()で記述されている場合はそのままで良いです。)

[app/views/test/add.thtml]

< ?php echo $html->formTag() ?>

実行時のHTMLソースは以下のような感じになります。(トークンの値は表示毎に変化します。)

<form action="/test/add/" method="post">
<input type="hidden" name="data&#91;_Token&#93;&#91;key&#93;" value="cfa714174ecc102178c6c540b04fa94dc0d5bd5d" id="_TokenKey" /> 
</form>

トークンが一致しないリクエストが発生した場合は[HTTP/1.0 404 Not Found]が出力されます。(この動作は変更できます。)

上記は一つのコントローラでチェックを行っていますが、全てのフォームで同様のチェックを行うならSecurity#requestAuth()をAppController#beforeFileter()に書いておけばokです。

[app/app_controller.php]

< ?php
class AppController extends Controller {
  var $components = array('Security');

  function beforeFilter() {
    $this->Security->requireAuth('add', 'edit');
  }
}
?>

こうしておけば全てのControllerでadd/editアクションを実行する前にチェックがかかります。

 

ワンタイムトークン方式ではコントローラ/モデル側とビュー側の双方に記述が必要なのですが、フレームワーク側で考慮されているので手軽に使用できます。

ただ残念ながらbakeで生成したビューファイルはformタグがHTMLで書かれており、いちいち上記のように書き換える必要があります。HtmlHelperはデフォルトで読み込まれるのでformTag()で書いておいてくれれば楽なのですが。

# 気が向いたらTicket投げておきます。

mail関数のログを取る

  • 2006-12-15 (金)
  • PHP
この記事の所要時間: 042

mail() logging for PHP – iBlog – Ilia Alshanetskyでmail()関数のログを取るパッチが公開されています。

共有サーバでは様々なユーザが同居しているので、あるユーザが多数のSPAMを送ると、サーバ自体の動作が重くなる、RBLに含まれるなど他のユーザにも影響が及びます。

そこでmail関数を使用した場合は強制的にログを取るようにして監視しようという目的のようです。

実際に運用する際は、mail関数の他にfsockopenなども監視する必要が出てくると思いますが、関数の使用をログに吐いて監視するというのは面白い発想ですね。これは他にも転用できそうな気がします。

# mail関数だけでなく、ログ対象の関数を指定できるすると幅が広がりそうです。

Home > アーカイブ > 2006-12

検索
フィード
メタ情報

Return to page top