Home > PHP > CakePHP

CakePHP Archive

CakePHPとnginx+memcachedで手軽にキャッシュを活用する

この記事の所要時間: 439

nginx+memcachedがめちゃ気になったので試してみました。

元ネタは下記です。

A 53,900% speedup: Nginx, Drupal, and Memcache bring concurrency up and page load time way down | TechnoSophos

nginxをリバースプロキシに利用した構成で、バックエンドの出力をmemcachedにキャッシュしておけば、次回リクエストではnginxがそのキャッシュを読み取ってそのまま出力してくれます。

つまりバックエンドにリクエストを経由させずにnginxから即出力するのでかなりの高速化が見込めるという優れものです。

リンク先ではバックエンドにDrupalを利用していたのですが、ここではCakePHPを利用してみます。

1. 全体構成

リバースプロキシにnginx(Port: 80)を使い、バックエンドにはapache+mod_php(Port: 8080)を使います。

nginxはリクエストが来るとURLをキーとしたキャッシュがmemcachedにあるかを調べます。キャッシュがあればそれをレスポンスとしてそのまま返します。

キャッシュが無い場合はバックエンドにリクエストが飛びます。バックエンドではページ生成処理を行い、出力内容をmemachedURLにキャッシュします。

これにより次回リクエストからはこのキャッシュがnginxから出力されます。

試したバージョンは以下。

  • nginx 0.7.65
  • memcahed 1.2.8
  • apache 2.2.14
  • PHP 5.2.10
  • CakePHP 1.2.6

2. nginx+memcached設定

nginxのmemcached連携を行うためにNginxHttpMemcachedModuleを利用します。NginxHttpMemcachedModuleはnginxをデフォルトでインストールすれば含まれています。

nginx.confを以下のように設定します。

# バックエンド
upstream backends {
    server 127.0.0.1:8080;
}

http {
    #(snip)

    server {
        #(snip)

        location / { 
            # POSTはそのままバックエンドへ
            if ($request_method = POST) {
                proxy_pass http://backend;
                break;
            }

            # memcachedにキャッシュがあればキャッシュを
            # 無ければバックエンドへ
            set $memcached_key $uri;
            memcached_pass     127.0.0.1:11211;
            default_type       text/html;
            error_page         404 502 = @fallback;
        }

        location @fallback {
            proxy_pass         http://backend;
        }
    }
} 

ここで注意が必要なのが「error_page 404 502 = @fallback;」の箇所。

memcachedにキャッシュが無い場合はバックエンドへリクエストを投げるのですが、この箇所を[=]抜きにすると404(キャッシュが無い)や502(memcachedが繋がらない)がステータスコードとして出力されてしまいます。

つまりキャッシュが無い場合だとページ自体はバックエンドが生成した内容が出力されるのですが、ステータスコードが404となってしまいます。

[=] を付けるとバックエンドで出力されたステータスコードがそのままレスポンスとして出力されるので、[=]を忘れないようにしましょう。(はまりました。。。)

3. バックエンドでキャッシュ処理

次にバックエンドで生成した内容をmemcachedにキャッシュします。

まずPHPからMemcacheにアクセスするために、pecl::memcacheをインストールします。

$ sudo pecl install memcache

ここではCakePHPでの処理を想定しており、MemcacheViewHelperというヘルパを作成してキャッシュを行います。

MemcacheViewHelperはafterLayoutメソッドでビューからの出力全体をmemcachedにキャッシュします。

ちなみにHelper#afterLayout()はフレームワークから呼ばれるフックメソッドで、下記のように出力全体に対して処理を行うことが出来ます。例えば文字エンコーディングを変換する時などなかなか便利なメソッドです。

[app/views/helpers/memcache_view.php]

<?php
class MemcacheViewHelper extends AppHelper {
  public function afterLayout() {
    if (!empty($this->params['memcache_view']['is_cache'])) {
      $view = ClassRegistry::getObject('view');

      $memcache = new Memcache();
      $memcache->addServer('localhost', 11211);
      $memcache->set(Router::url(), $view->output, false, 3600);
    }   
  }
}

コントローラでMemcacheViewHelperを読み込みます。キャッシュを有効にするアクションでは$this->params[‘memcache_view’][‘is_cache’]にtrueをセットします。

下のUsersControllerの場合、indexアクションはキャッシュされますが、viewアクションはキャッシュされません。

[app/controllers/users_controller.php]

<?php
class UsersController extends AppController {
  public $name = 'Users';
  public $helpers = array('MemcacheView');

  public function index() {
    $this->User->recursive = 0;
    $this->set('users', $this->paginate());
    // キャッシュする
    $this->params['memcache_view']['is_cache'] = true;
  }

  public function view($id = null) {
    if (!$id) {
      $this->Session->setFlash(__('Invalid User', true));
      $this->redirect(array('action' => 'index'));
    }   
    $this->set('user', $this->User->read(null, $id));
  }
}

これでブラウザからnginx(ex. http://localhost/users/index)にアクセスすると 1 回目はバックエンドにリクエストが飛びますが、2回目以降はmemcachedのキャッシュが出力されます。

4. パフォーマンス

キャッシュの効果を見るために、nginx+memachedを使ったパターンとバックエンドに直接接続した場合とでパフォーマンスを計測してみました。

計測はabで行っています。(-c 100 -n 1000)数値はRequests per secondで、5回行った平均値です。

参考にキャッシュをファイルに出力してnginxから出力するパターンも計測しました。

構成 Requests per second
apache+mod_php+CakePHP
(ダイレクト)
13.814 100%
nginx+memcached 2034.262 14726%
nginx+ファイル(参考) 5806.798 42037%

やはりapache+mod_php+CakePHPよりnginx+memcachedが圧倒的に早いですね:D ここまで大きな差があると使ってみたくなります。

5. memcached or ファイル

上記パフォーマンスを見るとmemcachedよりfileの方がより多くのリクエストを捌いています。

パフォーマンスだけを見るとファイルが有利ですが、memcachedの方はnginxサーバやWebサーバが複数台になった場合にキャッシュの取り扱いが簡単(複数台で共有しやすい)という利点があります。また、memcachedなら有効期限が簡単に付けられるというのもあります。

どちらを使うのが良いかはケースバイケースですが、キャッシュの取り扱いを考えると個人的にはmemcachedが良いバランスかなと思っています。更新頻度が少ないがアクセス数が多いページだけはファイルに出力してしまうという方法もあります。

いかに遅い箇所を経由させずにレスポンスを返すかという視点で見るとnginx+memcachedはまさに願ったり叶ったりの構成です。ここではバックエンドにCakePHPを使いましたが、他のフレームワークでも他のシステムでも他の言語でも何でも理屈は同じです。

多くの環境から操作できるmemcachedをキャッシュエンジンに使うということは、バックエンドを選ばずにキャッシュ機構が使えるということで、これはよく考えられていますね。

PostgreSQL Conference 2009 Japanで発表してきました。

この記事の所要時間: 437

JPUG10周年記念イベント「PostgreSQL Conference 2009 Japan」で発表してきました。

oregon

コアな内容や大規模向けな内容のセッションが多い中、明らかに場違い感満載な内容だったわけですが、とりあえず無事に発表できてホッとしています。

この場を借りて発表の機会を頂いたPostgreSQL Conference 2009 実行委員会の皆さんにお礼を言いたいと思います。ありがとうございました。

今回は自身では実に反省点の多い発表でして、発表のあとは一人へこんでいたのですが、そんな発表にも関わらず聞いて頂いた皆さんありがとうございました。

冒頭の写真は、発表の後にオレゴン州出身の方から頂いたシールです。ちょうどへこんでいたところだったので、とても勇気づけられました!ありがとうございます:-D
# www.heartinoregon.comのシールのようです。

以下、雑感をつらつらと。

雰囲気

普段参加しているLL系のイベントとは雰囲気が異なり、特に初日のビジネスDayは堅めでしたね。初日は仕事の関係で午後から参加したのですが、セッション中の堅めな雰囲気に翌日の自分の発表が不安になったりしました。

ただこの雰囲気はセッション後の懇親会では一変し、わいわいがやがやと良く知る賑やかな雰囲気となりました。これはかなり安心しました:-D

あと発表者、参加者ともに年齢層はWeb系に比べると若干高めだった気がします。

Twitter

公式ハッシュタグが用意されていたのですが、発言している人は少なめでしたね。スタッフの方を除くとポツポツという感じで、さらに発言されているのは海外の方の方が多かったように思います。

あと発表のスライドにTwitterのIDを書いている人がすごく少なかったです。これは個人での発表というより組織の代表者として発表している人が多かったのもあるかもしれません。

プレゼン

自分で発表するようになってから、他の人の発表を見ると、内容もさることながら、話し方やテンポ、仕草などを見るのが楽しいです。

今回は特に自分の発表でへこんだ後に聞いたDavid Wheelerさんの発表が素敵すぎました。英語はほとんど分かってないのですが、この発表では(他に比べると)理解することができました。スライド・言葉だけでなく、表情や仕草などで何かが伝わってくるこのプレゼンは良い勉強になりました。

他の方のプレゼンも色々と学ぶところがあり、そういったプレゼン手法を見ているだけでも楽しいイベントでした。

やはり上手い人のプレゼンにはおもてなしの心があるんだなーと感じましたね。

国際的なイベント

2日目のクロージングにてスタッフの方のお話に「国際的なイベント」という言葉がありましたが、まさにそういったイベントになっていたと思います。

海外のイベントには参加したことは無いので、ここまで海外の方の比率が多いイベントに参加したのは初でした。

印象的だったのは、発表の途中で突っ込みが入ったり(しかもその突っ込みにさらっと回答する)、質疑応答が白熱したりする光景でした。こういったものは日本と海外との違いということで語られていたり、動画などで見たりはしていたのですが、直に見るのは初めてだったので新鮮でした:-D

こういったプレゼンは是非自分たちでもやっていみたいです。

そういえば参加したセッションもほとんどが英語のセッションで、海外に行ったらこんな感じかなと想像しながら聞いてました。国内からの参加者でも英語を話す人が多かったです。やっぱり英語勉強したいです。

あと初日の同時通訳もすごかったです。よく国際会議とかで見てるイヤホンで聞いているアレですが、ホントに発表者が話して少しのタイムラグでどんどん訳が聞こえてきます。いやあすごい。

運営について

こういった素晴らしいイベントを運営されたスタッフの皆さんには頭が下がるばかりです。自分もつい先月にCakeMatsuriを運営していただけに、とにかくお疲れ様でしたという気持ちで一杯です。

素晴らしい運営の中で、気になった点を。

思うに発表者へのサポートがもう少しあると良かったように思います。PCとプロジェクタとの接続やピンマイクの使い方・調整など、手すきのスタッフの方が発表前に横についてサポートして上げれば、もっと安心して発表することができたと思います。

海外からの発表者についてはもちろんサポートされている方がおられたのですが、国内からの発表者はわりと放任主義な感じがしました。

自分が運営に関わるイベントでもできているわけではないので、自戒も込めて。

とにかく濃いイベント!

発表内容はどれも濃く興味深い内容が満載でした。特に監視を含めた「見える化」系の話やSE-PostgreSQLの考え方、破損データからレコードを取り出す方法などが面白かったです。

あとライトニングトークがどれも内容がしっかりしていて、5分で聞くにはもったい無い内容ばかりでした:-D

DBのイベントということで色々なバックエンドを持つ人が集まっていたため、色々な話を聞くことができたのが収穫でした。できればもっと色々な人とお話したかったです:-D

最後に、実行委員会の皆さん、参加された皆さん、お疲れ様でした&ありがとうございました!

  • コメント (Close): 0
  • トラックバック (Close): 0

携帯サービス「おでかけくん」をリリースしました

この記事の所要時間: 38

ちょっと便利な携帯サービス「おでかけくん」をリリースしました。

odkk

お出かけ先を登録することで、天気予報やグルメ情報、ニュースといった情報を携帯で見ることができます。またアラートメール機能を使うと設定した時間に帰宅時間を知らせるメールが送信されます。これでうっかり終電を逃すことも避けられますね:-D

サービスの内容はサイトを見て頂くのが早いと思うので、ここでは制作について。

女性向け

デザインを見て頂ければお分かりだと思うですが、女性を意識したサイトになっています。

Webサービスは数あるのですが、特に個人で作れるような小規模なものとなると、どちらかと言うと「Webに詳しい人のためのサービス」というのが多くて、もっと普通の人が使えるサービスを作りたいという想いがありました。

なかでも女性向けのWebサービスは少ないので、この企画を考えました。

技術志向のサービスはもちろん素晴らしいのですが、それだけではなく技術的にはありきたりのものでも、誰かの役に立つサービスがもっと増えれば良いですね。

Mashup Award 5

マッシュアップサイトのコンテストであるMashup Award 5に応募しています。

作品#220 おでかけくん

目標があった方が開発も進むだろうということで応募することを決めたのですが、開発開始から応募締め切りまであまり時間が無かったので、最後はバタバタでした。。。

賞は、、、どうなるか分かりませんが、このイベントのおかげで目標設定ができ、おでかけくんを構築することができました。

技術構成

構成は1×1では定番の PHP + CakePHP + PostgreSQL です。CakePHPには社内標準ライブラリをまとめたプラグインがあるのでそれを活用しています。

技術的にはそれほど特筆すべき点は無いのですが、マッシュアップサイトならではの苦労というか悩みがありました。

いくつかの外部WebAPIを利用させて頂いているのですが、目的は合致していても欲しい項目が足りなかったり、制限があったりで、WebAPIにコンテンツ内容を合わせざるを得ないところがありました。

チーム開発

これまで幾つか自社(自分)運営のWebサービスを作ってきたのですが、それらはどれも私が一人で構築していました。

「おでかけくん」はここがこれまでとの大きな違いで、今回は1×1としてチームで構築を行いました。私自身は意識的にコードは書かないようにして、企画やディレクションといった「口を出す側」に徹しました。

結果として無事にサービスをリリースすることができ、これはとても良い方向に向かったと感じています。

開発スキルとしては社内で十二分に構築できるのは分かっていたのですが、意識の面で主体的にアイデアを出して実装を考えて構築するというのが経験できたのが収穫でした。

また口うるさいクライアント(私)が近くにいるというのも一つの経験になったかと:-D

締め切り直前に

10月入った段階ではまだ真っ白な状態でそこから本業もやりつつの開発だったので、とにかく時間が足りませんでした。

とくに締め切り直前にCakeMatsuriがあって、さらに私が新型インフルエンザで床に伏すという事態になり、どうなるかと思ったのですが、前途したチーム開発のおかげで無事にリリースすることができました。

リリース時は、布団の中で携帯でサイトを見て、にやにやしていました:-D

しっかりとサービスを構築してくれたスタッフには感謝の気持ちで一杯です。ありがとう!

それほど派手な機能は無いですが、ちょっと便利なWebサービスになっています。登録も簡単なので是非使ってみて下さい。

おでかけくん

CakePHP日本語情報をつぶやくTwitter botを作りました

この記事の所要時間: 212

TwitterでCakePHP日本語情報をつぶやくbot「@cakephp_jp」を作りました。

cakephp_jp

なんとなく息抜きにTwitter botが作りたいなというのと、そういえばフォーラムへの投稿をTwitterで知りたいな、ということでさくっと作りました。

いまのところ以下のフィードを読んでpostしています。

良かったらfollowして下さい

@cakephp_jpをfollowする。

技術話

大したことは何もしてないのですが、参考に。

PHP

今回はCakePHPは使わずに素のPHPで作っています。後述するTokyoTyrant+TokyoCabinetを使ってますが、他のRDBMSは使ってません。

パパッと作れるのがPHPの利点ですね。

Yahoo! pipes

各フィードを寄せ集めるにはYahoo! pipesを使ってます。今後フィードを追加する際はここにガシガシ追加していくだけでokです。

出力をPHPのシリアライズデータで受け取れるので、unserialize()するだけですぐに連想配列として使えて便利です。

サンプル:$arrayにfeedが連想配列で入る

$data = file_get_contents('http://path/to/pipes');
if (!empty($data)) {
  $array = unserialize($data);
}

Pipes: CakePHP-jp

TokyoTyrant + TokyoCabinet + Net_TokyoTyrant

Twitterへのpostがこけた時のリトライ処理用にTokyoTyrant + TokyoCabinetを使ってます。この組み合わせを使った理由は単に使いたかっただけです:-D

PHPからの接続にはPEARライブラリのNet_TokyoTyrantを利用しています。

TokyoCabinet
TokyoTyrant
Net_TokyoTyrant – Openpear

bit.ly

リンク先のURL短縮にはbit.lyを使っています。

QUERY_STRINGで元URLを渡すとJSON or XMLで結果を返してくれるので楽チンです。

bitly-api – Project Hosting on Google Code

PostgreSQL Conference 2009 Japanで発表してきます

この記事の所要時間: 113

PostgreSQLのイベント「PostgreSQL Conference 2009 Japan」で発表してきます。

イベントは11/20,21の2日間開催されますが、2日目のCommunity Dayで話してきます。

発表時間が「12:05~12:45」という昼ど真ん中な時間帯で、どういうことなんだろ?と思っていたのですが、どうやらランチセッションということで会場内で昼食を取りながら発表を聞くスタイルのようです。

昼食中は食べることと周りにいる人と話すことに夢中で、発表なんか誰も聞いていない気もしたりするのですが、まあそれはそれでなかなか無い機会なので頑張ります:-D
(食べながら発表すれば良いのか!)

技術系の濃い話が多い中、わりと軽めの話なので、お昼を食べながら聞くにはちょうど良いかもしれませんね。

今回は、JPUG 10周年のイベントということで海外からも多くのスピーカーの方が集まっているようですし、国内からも興味深いセッションが目白押しです。長年PostgreSQLを使っていながら、イベントに参加するのは初めてなので、1参加者としてもとても楽しみにしています。

日曜日まで参加申し込みできるようなので、まだの方は下記公式サイトからどうぞ。

PostgreSQL Conference 2009 Japan – JPUG 10th Anniversary Conference –

CakeMatsuriが盛況のままに終了しました!

この記事の所要時間: 532

2009年国内最大のCakePHPイベント「CakeMatsuri」が盛況のままに終了しました。


photo by iogi

なにはともあれ無事に2日間のイベントが終了したのは、一重に参加してくださった皆さん、協賛頂いた企業様、スピーカーの皆さん、そして海外からお越し頂いたコアデベロッパーのお二人のおかげです。本当にありがとうございました。

そして幾多の困難を共に乗り切ったCakeMatsuri青年団のみんな、本当にお疲れ様でした!

開催から一週間が経ち、ようやく日常に戻ってきた今、運営側の一人として感じたことを5個のキーワードで振り返ってみたいと思います。

交流

今回のテーマは会場でも説明しましたが「交流」でした。これは単に参加者同士の交流だけにとどまらず、スピーカー、スタッフを含めた全員で交流しようということで色々な仕掛けを考えました。

例えば、ワークショップの班。同じテーブルに座った人同士はその日一日ずっと同じ班。だから席替えはナシ。これを発表したのは(そんなことを知らずに)全員が席に座った後のオリエンテーションでのことだったので、戸惑う人もいるかと心配しましたが、その直後の自己紹介からその一日わいわいと盛り上がって、とても良い雰囲気でした。

ワークショップ最後のグループワークでも「班があったから話しやすかった」「教えあえて良かった」といった意見が幾つもあって、これは本当にやってよかったと思います。朝一の見ず知らずの人同士がシーンとしている状況から、班であることを伝えたあとの自己紹介でわいわいとした雰囲気に変わった時は鳥肌が立ちました。素晴らしい:-D

カンファレンスでもランチの時に班にすれば?という意見も頂いたので、これは次回以降に生かしたいと思います。

ワークショップで勢いがついた人が多かったからなのか、カンファレンスランチ、懇親会では積極的に交流している人が目に付きましたね。あとコアデベロッパーのお二人にも色々な人が話をしていて、これも良かったです。

このテーマについては今回は成功と言えると思います。

準備

準備は、、、まあ大変でした:-D

青年団スタッフ全員ロケーションがバラバラだったので、日頃の連絡はMLとSkypeで行いました。リアルで会って相談ができないため、CakeMatsuri準備用にMLで流れていたメールは合計900通(!)となかなか壮絶な日々でした。

準備していて一番大変だったのがリソース不足でした。今回はとにかく色々なリソース(特に人と時間)が不足していたため、結果、参加した皆さんに無理を強いる場面がありました。中でもワークショップで良く聞かれた「環境構築をもっと事前に教えて貰えれば」というのは、全くもってそのとおりでこれは大いに反省すべき点だと痛感しています。

タスク担当は何となく得意というかやりたい箇所をやるという感じでゆるやかに決まっていき、自分はわりとプログラム構成とinfoのメール対応をやることが多かったです。ただ、なにせ人が足りていない状況だったので、気が付いた人がやる、アラートを出す、といった風にお互いに補完し合いながら進めて来ました。

スタッフには、PHPカンファレンスやRuby会議のような幾つもの大型イベントに関わっている者がいたのが大きかったですし、何よりお互いに気が知れているメンツだったので信頼して進めることが出来たのが、少ない人数でなんとか上手くイベントを回せた要因かなと感じています。

ただ次回も同じ規模のイベントを同じスタッフ人数でやると確実に誰か倒れそうなんで、誰か助けて下さい:-D

プログラム

色々な準備がありつつ、今回個人的に力を入れていたプログラム構成について。

まず、ワークショップ。

入門者コースは講師の二人にお任せで。実務者コースはアウトラインだけ考えて、あとは講師の人にお任せでした。入門者コースは一からCakePHPを使うための系統立った内容、実務者コースは実際に開発現場で使うであろう項目を盛り込んだバラエティに富んだ内容というと感じで上手く色分けが出来きました。

ワークショップは特に苦もなくスムーズにはまりました。

次は、カンファレンス。

こちらは色々と予想外な出来事があったりで結構二転三転しました。皆で相談しつつ、結果としては盛りだくさんな内容となりました。ただ午後に一回長めの休憩を入れるなど工夫の余地はまだありましたね。

各セッションの中で私が一押しだったのが、パネルディスカッションでした。実はパネルディスカッションをやるにしても他のテーマで、というアイデアもあったりしたのですが、私が(結構)強引に推して今回のテーマになりました。これはせっかく全国から(海外からも!)CakePHPユーザが集まるのですから、東京以外の地域にもユーザがいて、コミュニティがあるということを知って貰いたいということで企画しました。

登壇頂いたパネラーの皆さん、ありがとうございました。

あとLT希望者が前日、当日で一気に増えたのはとってもとっても嬉しい出来事でしたね!

祭の後

CakeMatsuri後は参加した皆が刺激を受け合ったとあって、Twitterやらguthubやらで賑わいをみせています。

私は、直後に新型インフルエンザにかかってしまい豪快にくじけましたが、回復してきた今、何かをやりたいとメラメラと燃えているところです:-D

さてそんな中でも既に行動されている方がいらっしゃるのでご報告を。

最近CakePHPユーザ界隈で話題の「Croogo」の日本語化に、パネルディスカッションで北海道代表として登壇頂いた@makiesさんが取りかかってらっしゃいます。

Croogoを簡単に説明すると、CakePHPで書かれたオープンソースCMSで、バングラディシュの@fahad19さんが作られているものです。ざっと画面を見ただけなのですが、WordPressに似た操作感で結構良くできています。これがCakePHPで出来ているということで中々興味深いシステムです。

そんな日本語化Croogoはmakiesさんのgithubにて公開されています。これは要チェックですね。

感謝!

最後はこれに尽きますね。

関わった全ての皆さんに感謝感謝です。本当にありがとうございました。

次回は、、、正直まだあまり考えられないのですが、私個人としてはそろそろ関西で何かやりたいなーと思ってます。また皆さんで楽しいイベントをやりましょう!

# blogを書いたので、これでようやく祭が終わりました:-D

ぼくとわたしのCakePHP

この記事の所要時間: 344

CakeMatsuri応援企画として展開しているリレーブログ「ぼくとわたしのCakePHP」。

きしださんからバトンを受け取ったので、つらつらと。

CakePHPとの出会い

出会いはたしか2006年頃。当時自作PHPフレームワークで開発をしていたのですが、メンテや教育を考えてオープンソースのフレームワークを探していました。

ちょうどRailsブームの頃でRailsライクなフレームワークがボコボコと登場した頃なのですが、当時はPHP4対応が必要だったのであれこれ考えて辿り着いたのがCakePHPでした。正直その頃はCakePHPがここまではやるとは思って無くて、もしCakePHPがダメになってもそのノウハウを持ってRailsに移れば良いかと、いう計算もありました:-D

CakePHPとblog

またタイミングを同じくして、このblogを書き出しました。当時はblogの記事も暗中模索で、日記風なものを書いたり、ニュースサイトネタに反応したり、会社のことを書いたりしてましたね。

そんな中ちょろちょろと反応が貰えるようになったのが、PHPやCakePHPの記事でした。反応が嬉しくてCakePHPを調べて記事を書くー>反応が貰えるー>さらに調べて書く。という循環でCakePHPにも詳しくなり、blogエントリも増えていきました。

その頃はCakePHP1.1.Xの頃で、日本語情報自体が少なかったですし、Cake自体もまだ未完成だったのでネタが書きやすかったのもありましたね。

CakePHPと人

パラパラとblogにアクセスが増えてきたおかげで多くの人と出会いがありました。特にPHP関連ではshimookaさん、そしてCakePHP関連では堂園さん安藤さんとの出会いは今振り返ってみてもとても大きなものでした。

人との縁がさらに多くの人の縁を生んで、さらに大きな縁になっていく。こういった経験は仕事外では初めて経験するもので、オープンソースコミュニティならではのものだなと感じています。こうしてあらためて振り返ると、とても不思議なそして温かい気持ちが湧いてきます。

CakePHPと本

こうした人との出会いは本の執筆という想像もしなかった経験をもたらします。それが「CakePHPガイドブック」です。堂園さん、安藤さんとこの書籍が出せたことは大きな自信になりましたし、同時にblogとは違う「執筆に対する責任」を生の感覚として感じることにもなりました。

その後、計3冊の執筆に携わるわけですが、これも読んで頂いた皆さんがいるおかげで、とても感謝しています。ありがとうございます。

CakePHPと勉強会

CakePHPガイドブックが登場後、CakePHP勉強会が開始します。ここからコミュニティ活動により深く関わっていきます。それまでは、勉強会に参加するだけで精一杯で、発表なんてとんでもないという状態だった自分が、発表をして、司会として、運営をしてとなっていくわけです。

今となれば、どれも一部の特別な人だけができるというものではなく、やる気さえあれば普通の人が普通にできることだと思っています(準備は大変ですけどね><)。ただ自分が関わっていない時の、あの別世界な人を見るような想いも覚えているので、当時の自分が数年後こうなっているというのは想像できなかったでしょうね。

CakeMatsuri

さてそんなわけで10/30、31にはCakeMatsuriが開催されます。

今年のテーマは一言で言うと「交流」です。誤解を恐れずに言うとワークショップもカンファレンスも全てここに繋がるための仕掛けだと考えています。

自分が経験したように人との出会いを通じて、何かが繋がっていく、何かを伝えられる、自己実現ができるというような事が、多くの人に起これば良いなと思い、日々準備を進めているところです。

10/30のワークショップは残念ながら受付終了となっていますが、10/31のカンファレンスは参加者募集中です。カンファレンスはこの「交流」をより意識した内容なので、まだの方は是非ご参加下さい。(ランチと懇親会がセットになっているのはこういった理由です。)

CakeMatsuriでの出会いによって、どのような変化が起こるか私自身も楽しみにしています。みんなで盛り上げていきましょう!

明日のリレーブログはcakephperさんです。お楽しみに:-D

matsurigreen

CakeMatsuriにまつわる7つの疑問

この記事の所要時間: 444

昨年のCakePHPカンファレンスに続いて今年もCakePHPの一大イベントが開催されます。

matsurigreen

国内では2回目のCakePHPカンファレンスとなるのですが、今年は装いを一新してイベント名が「CakeMatsuri」(Cake祭)となりました。

今年の特徴は何と言っても2日開催となったことでしょうか。

ハンズオン形式でCakePHPについて学ぶワークショップ(10/30)と昨年同様、従来型の発表を聞くカンファレンス(10/31)の2日開催です。両日共に濃い内容になるべくスタッフみんなで準備を進めているところです。

そんなCakeMatsuriなのですが、ちょっと変わった名前のせいか疑問を持たれる方も多いかと思います。そこで、私見ながらざっくりと疑問にお答えしましょう。

Q1. CakeMatsuriって何?

A. PHPフレームワークCakePHPのイベントだよ。

10/30,31の2日開催で、会場は東京だよ。詳細は公式サイトで確認してみてね。

ホイップクリームかき回すようなスイーツなイベントじゃないから注意してね:-D

Q2. 何をするの?

A. CakePHPをテーマにみんなで楽しむイベントだよ。

1日目はワークショップ。講義形式でCakePHPのスキルアップを目指す内容になってる。講師は、CakePHPをバリバリ実務でつかっていたり、blogを書いていたり、勉強会で発表していたり、本を書いてたりしてる面々。とにかくCakePHPが好きな人たちだから、きっとあなたの役に立つ内容になると思う。

コースも入門者用、実務者用、英語用と3コースがあるから、自分のレベルに合わせて参加するコースを選ぶことができるよ。

2日目はカンファレンス。PHPカンファレンスみたいな感じで色々なスピーカーからの発表を聞けるよ。目玉はやっぱりCakePHPコアデベロッパーからの発表!他にも豪華なスピーカーの方々からの発表はもちろん、事例紹介やパネルディスカッション、LTと盛りだくさんな内容になってる。

CakePHPに興味あるなら来るしかないでしょ:-D

Q3. なんで「祭」なの?

A. 祭みたいにみんなで盛り上がりたい!

海外で行われているCakePHPのイベントがCakeFestという名前だから、日本風にアレンジしたら「祭」かな、というのが出発点。

もともと開催側、発表者、参加者といった垣根を越えて、その場にいるみんなで盛り上がりたい、という想いを皆が持っていたから、「祭」はまさにピッタリなわけ。

だから運営する僕らも運営事務局じゃなくて「青年団」なんだよ。

祭だから皆で神輿担いで「わっしょい、わっしょい」だね。

Q4. なんで有料なの?

A. もっと良いイベントにしたいから!

参加費はワークショップが10,500円、カンファレンスが8,925円(二日通し券で19,425円)。実はこれほとんどが会場費や飲食費、機材等々の経費なんだよ。

カンファレンスの費用が分かりやすいと思うんだけど、8,925円にはランチ(1,000円相当)と懇親会費用(5,250円)が含まれていて、カンファレンス自体は実は2,625 円だけ。ここから会場費やら機材費、あと海外からのスピーカーがいるので通訳さんを手配したり等々となると実は結構ギリギリな感じで、準備してる僕らは中々スリリングな毎日なんだけど、それはまあ別の話で:-D

祭なのでカンファレンスを行った会場でそのままランチを食べて、懇親会もやりたい。ほら、祭の日って神輿担いだ後、みんなでお酒飲んだりご飯食べたりして盛り上がるじゃない。せっかくCakePHPをテーマにみんなが全国各地(海外からも)集まるんだから、あの雰囲気でみんなで楽しみたいなーと。

ワークショップもほとんどが経費。カンファレンスより高いのは単純に人数が少ないからだよ。(場所とか機材とかは人数関係無いので。。。)実は講師陣はみんな手弁当だったり。

と、あんまり内幕を書くと怒られそうだからこのへんで。とにかく参加費以上のものは持って帰られると思うから大丈夫:-D

Q5. 祭なんだったら僕(私)も話したい!

A. もちろん大歓迎!

カンファレンスではライトニングトークコーナーがあるよ。テーマはCakePHPに関するものなら何でもok。技術ネタはもちろん、事例紹介で良いし、デザインでもビジネスでもCakePHPが絡んでいれば問題無し!

CakeMatsuriサイトで募集中だから、どんどん申し込んでね。

Q6. 参加したいんだけど、どうすれば良いの?

A. CakeMatsuriサイトから申し込みしてね。

申し込む時はまずCakeMatsuriサイトでユーザ登録が必要だから注意してね。あと参加費用の支払いにはpaypalを使ってるから、paypalユーザの人はログイン情報を用意しておいてね。(paypalユーザじゃなくても支払いはokだよ)

もし申し込みで分からないことがあれば、ドンドン青年団に聞いてみてね。

Q7. どうやって聞けば良いの?

A. メールかTwitterでどうぞ。

もし何か聞きたいことがあれば、メールなら info [at] matsuri.cakephp.jp、Twitterなら#cakematsuriのハッシュタグを付けてつぶやいてみてね。

というわけで

青年団一同絶賛準備中で大わらわな感じですが、CakePHPユーザが一同に会するこの場がより良いものになるようにと頑張っているところです。ぜひ皆さんのご参加をお待ちしています。

10/30,31は、シダックスホールに集まりましょー。

CakePHP 1.2.5 はSimpleTestが同梱

この記事の所要時間: 151

先日リリースされたCakePHP1.2.5をざっと眺めて、気になった点を。

PHP5.3対応用設定

core.phpにPHP5.3用のタイムゾーン設定が追加されています。

[app/config/core.php]

/**
 * If you are on PHP 5.3 uncomment this line and correct your server timezone
 * to fix the date & time related errors.
 */
  //date_default_timezone_set('UTC');

SimpleTestが同梱

これまでは自分でインストールする必要があった SimpleTestがCakePHPパッケージに同梱されていました。

SimpleTestは[vendors/simpletest]にあります。

これによりすぐにユニットテストを行うことができます。これは楽チン。

# ただ現在のリポジトリを見ると[vendors/simpletest]は存在していませんので、もしかしたら今後もバージョンには含まれないかもしれません。

フレームワークのテストケースが同梱

SimpleTestに合わせてかフレームワークのテストケースも同梱されています。

実はフレームワークのテストケースは以前は含まれていたのですが、いつからか配布パッケージには含まれなくなり、入手するにはリポジトリから取得するしか方法がありませんでした。

フレームワークのテストケースは単なるテストというだけでなく、フレームワークの利用方法を知る上で実践的なドキュメントとなるので、これは嬉しい変更です。

ソースのリビジョンNoが展開されていない

ソースファイルに記載されていたリビジョンNoやバージョンが展開されないようになっています。

これまではソースをSubversionで管理していたので、Subversionが自動で展開していたのですが、gitに移ったのでキーワードがそのまま残っているようです。

$Id$ が展開されていない。

これを機にユニットテストを

1.2.5になってCakePHPパッケージのみですぐにユニットテストができるようになりました。

これまで敬遠していた方もとりあえず/test.phpにアクセスしてみてユニットテストを動かしてみましょう。

シンプルなTwitter検索「findTwitter」を作りました&ソース公開

この記事の所要時間: 326

AutoPagerize対応したシンプルなTwitter検索「findTwitter」を作りました。

findTwitter

Twitterのつぶやきを検索

機能はシンプルです。テキストボックスに検索したいキーワードを入力して、「検索する」ボタンをクリックするとキーワードに合致したつぶやきを表示します。

「shin1x1」で検索

find_twitter_screen

検索パターンとしては以下のような組み合わせが可能です。

  • 単語で検索。(ex. [CakePHP])
  • スペースで単語を連結してAND検索。(ex. [PHP カンファレンス])
  • 「OR」で単語を連結してOR検索。(ex. [shin1x1 OR msng])

仕組み

TwitterAPIを叩いているだけ

仕組みはごくごく単純でTwitterの検索APIを叩いてるだけです。

検索結果はAPIの挙動に依存しているので、検索漏れや古いつぶやきが検索対象にならないなど現象があります。

CakePHP

CakePHP1.2.4を利用しています。上記のようにAPIを叩いてるだけなのでDBは使っていません。

レンタルサーバで動作

ごく普通のレンタルサーバに置いているだけです。

ソースを公開

このサービスの本質はこちらです。

findTwitterのソースコードはgithubにて公開しています。

動作環境は、PHP5以上でCakePHPが動けば問題無いと思います。ライセンスはCakePHPに習ってMITライセンスにするので、ご自由にご利用下さい。

githubは分からない方にはZIPアーカイブも用意しています。下のリンクからもダウンロードして下さい。

CakePHPで動くサンプルを

CakePHPはフレームワークとしては多くの導入事例があるのですが、CakePHPを利用したオープンソースシステムが公開されている例は実はあまりありません。

最近では、私も(いちおう)参加しているPHP版Redmine「candycane」があるですが、これはRedmineという開発のプロが実務で利用しているシステムの移植ということで、これからCakePHPを使いたい人が参考するには大きいかな、という印象があります。

そこで全体は小さいものの、一つのシステムとして稼働するサンプルとしてfindTwitterを作りました。

WebサービスAPIを使ったシステムということで、手軽にサービスを作ってみたい人にはサンプルとして参考になるかと思います。

フレームワークを除いたソースは少しだけなので、特に難しいところは無いと思うのですが、いずれblogで解説を書くなり、発表するなりしたいと思います。findTwitterをベースにWebサービスを作る勉強会なんかも良いですね:-D

フレームワークだけで

こういった主旨なのでCakePHPの機能だけで作りました。

普段は自社で蓄えているプラグインやライブラリを活用しているのですが、今回は素のCakePHPだけで作っています。まあ、findTwitterは仕様も単純ですし、もともとCakeは機能が揃っているので特に困りませんでした。

また、どこでも動くようにということでfind-twitter.inはレンタルサーバ(チカッパ!)に設置しています。

レンタルサーバに設置するだけで動くCakePHPの良さを再認識しました:-D

楽しさを

Webサービスを作るのは大変なこともありますが、本当に楽しいものです。特にTwitterがある今ではユーザさんからリアルに反応を貰うことができます(もちろん非難もありますが><)。自分が作ったサービスで誰かがわくわくしているかもと思うと、ニヤニヤが止まりません:-D

findTwitterをきっかけに新たなWebサービスが生まれて、その楽しさを皆で享受できれば嬉しいです。

ホーム > PHP > CakePHP

検索
フィード
メタ情報

Return to page top