ラベル CakePHP の投稿を表示しています。 すべての投稿を表示
ラベル CakePHP の投稿を表示しています。 すべての投稿を表示

2012年6月27日水曜日

CakePHP HTML Cache Plugin の2.x対応と追加機能とか

@mon_sat です。
CakePHP HTML Cache Plugin についてメモしておきます。

CakePHPにはキャッシュの機能がありますが、純粋な静的ファイルを書き出すもっと強力なキャッシュをおこなうためのプラグインがあります。
(symfonyでは sfSuperCache 、Fuel PHP ではfuel-pagecacheという同様のプラグイン等があるそうです)

仕組みは、mod_rewriteの機能を利用し、webroot/cache以下に、該当するhtmlやrss等のファイルがあれば、それを直接表示し、無ければ、CakePHPが通常の描画後、webroot/cache以下にページを書き出すというもの。

一度作成するとphpすら使われませんので当然速いわけです。

ただしそのファイルを消さないと永遠にCakePHPが再表示しませんので、以下のコマンドのようなことでファイルを消してあげる必要がありますが。

find /full/path/to/app/webroot/cache -mmin +360 | xargs rm -f

さてこのプラグイン、もともとはMatt Curry氏が作成したプラグインです。
その後CakePHP2.x系への対応がまだのようでしたので、forkして作成したのが、こちらです。

インストールと準備

ダウンロード後、APP/Plugin/HtmlCacheとなるように配置してください。
bootstrap.phpでPluginをloadします。

# APP/Config/bootstrap.php
CakePlugin::load('HtmlCache');

webroot/.htaccess を修正します。
(修正内容は extras/.htaccess のようにします)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^GET$
    RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
    RewriteRule ^(.*)$ /cache/$1/index.html [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

プラグインの使用

あとは、Controllerで $helpers = array('HtmlCache.HtmlCache'); のようにします。
ただ特定のactionだけ使用するというケースがほとんどでしょう。ですので。
viewファイル内で使用する場合は、次のようにします。

$this->Helpers->load('HtmlCache.HtmlCache');
$this->HtmlCache->options($options);    // 必要に応じて

オプションの指定

オプションは配列で指定します。
# view
$this->HtmlCache->options(array('cache_dir' => 'statics'));

オプション(デフォルト)
  • 'test_mode' => false,
    • trueにするとdebug level が1以上でもキャッシュファイルを書き出します
  • 'host' => null,
  • 'domain' => false,
    • trueにすると、複数ドメインで運用している場合にhostごとに書き出すことができます
    • $_SERVER['HTTP_HOST']もしくはhostオプションの値が使用されます
  • 'www_root' => APP . WEBROOT_DIR,
    • webルートのフォルダをフルパスで指定します
  • 'cache_dir' => 'cache',
    • デフォルトでは webroot/cache 以下にキャッシュファイルが作られます
    • ここを修正した場合は webroot/.htaccess も適宜修正しましょう
  • 'filename' => 'index.html',
    • 拡張子なしでCakePHPにアクセスしたときに書き出すファイル名です
    • index.htm や index.php を使用したいという場合はここを書き換えます
  • 'file_path' => null,
    • まったく別のURL(パス)で書き出したいという場合は、ここを編集します
    • 例) 'file_path' => $this->webroot . DS . $item['Item']['filename'],
というわけでRSS等の出力に絶大な効力を発揮する HtmlCache Plugin を紹介しました。

ぜひご活用ください

MontBlanc-Sucks/HtmlCache
ご意見・ご要望・ご質問は、 @mon_sat までお願いします。
このエントリーをはてなブックマークに追加

2012年6月26日火曜日

CakePHP OGP Plugin つくりました

@mon_sat です。

OGPタグというものがあります。
facebookとかでシェアしたときに、任意のタイトルやdescription、画像等を設定するmetaタグです。
このブログの場合は、次のようになります。

さて、このOGPタグと、titleタグ、metaタグの一部(description)等は、内容が重なります。

これらを、view等から簡単に設定できると良いですね。
というわけで @yando さんのアドバイスを受け、プラグインにしてみました。

CakePHP OGP Plugin

インストールと設定

プラグインをダウンロードし、 APP/Plugin/Ogp となるように設置します。

git で clone / submodule add する場合は、次のような感じで
cd your_app
git clone git://github.com/monsat/Ogp.git Plugin/Ogp

CakePHP2.xではプラグインを明示的に読み出す必要があるので

# APP/Config/bootstrap.php
CakePlugin::load('Ogp');
とし、Controllerで、OgpHelperを読み出します。

# APP/Controller/AppController.php
public $helpers = array( 'Html', 'Form', 'Ogp.Ogp');
これで準備完了です。

次に、サイトの設定をします。
# APP/Config/bootstrap.php
Configure::write('Site', array(
  'site_name' => 'サイトのタイトル',
  'description' => 'サイトの説明',
  'image' => '/img/image.png',  // サイトの画像
  'type' => 'website',                 // サイトの種類(blog等)
  'separator' => ' - ',                 // ページタイトルとサイトタイトルの間の文字列
));
Configure::write('Ogp.settings', array(
  'base' => 'Site.',
  'autoKeys' => array('type', 'site_name', 'description', 'image'),   // viewで設定しなくても必ず書き出すOGPタグ
));

Configureで Ogp.settings.base で設定しているので、
Configure::read('Site.site_name') や Configure::read('Site.description') などが利用されます。

使い方

layoutファイルの次の記述の箇所に、他のmetaタグと一緒に書き出されます。

# layout
echo $this->fetch('meta');

viewファイルでは、以下のように使います。
# view
// <title>タグ($title_for_layout)も同時に設定されます。
$this->Ogp->title('ページのタイトル');
// フルURLで書き出されます。
$this->Ogp->image($post['Post']['author_image_url']);
// その他は、ogpタグのname(og:無し)とcontent
$this->Ogp->set(
  'description',
  "stripped \n and <b>tags</b>",
  // options
  array(
    'meta' => true,
  ),
);

contentに使用される文字列は、タブ・改行文字およびhtmlタグを除去します。
※ stripTagsオプションを false にすると、htmlタグの除去は行われません

metaオプションを true にすると、通常のmetaタグも同時に書き出されます。

この記事の例では、次のようなタグが出力されるでしょう。(順番は変えてあります)

<title>ページのタイトル - サイトのタイトル</title>
<meta property="og:title" content="ページのタイトル - サイトのタイトル" />
<meta property="og:site_name" content="サイトのタイトル" />';

<meta name="description" content="サイトの説明" />
<meta property="og:description" content="サイトの説明" />
<meta property="og:type" content="website" />

<meta property="og:image" content="http://example.com/img/author_image_example.png" />

という具合です。
$this->Ogp->title()を設定しなければ、Site.site_nameの値がtitleタグとog:titleに使用されます。

ぜひご活用ください

monsat/Ogp · GitHub
ご意見・ご要望・ご質問があれば、 @mon_sat までお願いいたします。
このエントリーをはてなブックマークに追加

2011年6月27日月曜日

CakePHP2.0勉強会で勉強した

@mon_sat です。
先週土曜に開催したCakePHP2.0勉強会のお話。


もともと今月の初旬に、以前から企図していたCakePHP2.0の勉強会をやろうという話を実現することを、いつものメンバーで決めました。
その後もうひとり手伝っていただくことになり、概ね4名で勉強会を開催することに。

この時点では日程だけ(決めうちで)決めたのみで、会場も、内容も決めていませんでした。
(聴講スタイルではなく、実際に手を動かしてもらうワークショップ形式にすることだけは何となく決まっていましたが)

人数もどれくらい集まるか読めず、こちらの想定では20人を超えるくらいだったので、まずは勉強会の参加者募集サイトATNDに、会場・内容未定のまま、30人定員で告知しました。

その後何人かから会場提供の申し出をいただき、最終的に今回の会場に決まりました。
勉強会で大変なのはやはり会場手配だなと再認識。
(トライコーンさん他、提供の申し出をいただいたみなさま、ありがとうございました)

会場が決まった辺りから申し込みが増えてきて、最終的にはキャンセル待ちの方をどんどん繰り上げていき47人まで増加。(当日キャンセルが出てるため最終40~45人程度)

勉強会の様子は別ブログに書くとして、この規模の勉強会を運営するのは初めてのことで、そこで勉強になったことを書きたいと思います。


勉強会の内容を決める


今回はワークショップの講師を務めた@hiromi2424と、司会をしてもらった@cakephperさん、そして@konsanの4人で運営。

まず弊社の事務所で打ち合わせをして勉強会の概要を決めました。(この時点では場所も決まっていませんでした)

メインであるワークショップの講師は良いとして、その他に、セッション・LT(ライトニングトーク)・事例紹介等を行うことを決定。話をしてもらえる人を募集することに。
最悪集まらなければ自分たちでやることにしたら、結局セッションの発表者が集まらなくて自分たちでやりましたけど(笑)

スケジュールは余裕を持って作成。結局、時間は30分程度押しましたが、質疑応答を無くしたことでオンスケで完了。
手配の行き違いでビール到着が、少しだけ遅れたことが悔やまれます。

当日予期せぬことが起こりがちなので、余裕を持ったスケジュールにしておいて、時間が余った時のネタを決めておくというのが良さそうですね。



懇親会の準備


実は懇親会がメインという位置づけの勉強会でした。ハッシュタグも飲み会用の #cake_beer だし。

以下の理由により、事前払い料金制ということにしました。

  • 酒類・食事類の発注量が読めない(今回は勉強会場で懇親会も実施する)
  • 万が一にも会計がマイナスになることは避けたい(当日の発注追加等で)
  • ATND Payment というPaypalを利用した素敵な事前料金徴収システムがある
ということで、事前料金と当日料金を定め、なるべく事前に申し込めるように設定。
したのですが。
当初勉強会参加者のわりに、なかなか懇親会参加者が集まらなくて冷や冷やしました。

結局事前受付締め切り時点で5割程度。
最終的には75%程度の方が懇親会参加ということで、余裕を持って運営することができました。

ATND Payment は非常にお勧めです。

また、当日申し込みもある程度予想できる場合は、やや多めに発注しておいて、当日現金で申し込んでいただいた分で追加発注をかけるというのが安全ですね。
今回は意外と食事のすすみが遅く、足りないかな?という量でちょうどでした。

そのため追加発注として残しておいた分を二次会費用の足しとして寄付することができました。


コミュニティの雰囲気は運営者ではなく参加者で決まる

今回もっとも勉強になったのはここでした。

もともと運営をした我々はCakePHPのコミュニティで知り合った仲間です。
そして各自が、口にこそ出さないものの「この素晴らしいコミュニティの輪を広げる」ことを願っているのです。

だから「勉強になる」のはもちろんのこと「楽しかった」と言ってもらえるようなそういう勉強会にしたいと、わたしは思っていました。

その結果。
盛況の懇親会に、運営としてではなく、いち参加者として参加しながら思ったことは、「やっぱりCakePHPのコミュニティは素敵だ」ということです。
初めての方が割と多めだったにもかかわらず、最初から和気あいあいとした雰囲気でスタート。
それともみんなお酒が目当てだったのでしょうか(笑)

いやいや。
やはり参加者の方々を含め、言葉には表しにくい、良き雰囲気がありました。
(もちろんなかには雰囲気をつかみづらかった方もいたとは思いますが)

わたし自身が、このコミュニティに参加したことで、多くのことを得られました。
少しでもその恩返しができたなら、この勉強会をやって正解だったと思います。


参加者から発表者・運営者へ

勉強会で勉強ができるのは、運営者の方が多かった。

実際ワークショップは自分でも参加者としてやろうとしたのですが、結果的にそれは敵わず、それどころか後半は講師と一緒に解説をするということになりました。

それでも、自分自身がもっとも勉強になったのは。
やはり自分が発表者としても準備をしたことで、より積極的な姿勢で勉強会に臨めたことにあると思います。

自分で経験したから言えますが、いち参加者よりは、発表者として参加するほうが、段違いに得られるものが大きいです。
LTや事例紹介は、当日何人かの方に、急遽お願いしました。(にもかかわらず、皆が聞きたいようなネタが集まり、驚きましたが)
おそらく発表していただいた方々も感じたと思います。
今回発表されなかった方は、次回ぜひ!

そして、発表者から運営者へ。
Ustream配信をしていただいた @suzuki さんをはじめ多くの方に助けてもらいながら勉強会は幕を閉じました。
もしもっと勉強したいということであれば、運営をしてみるというのも一興ですよ。

というわけで一番得をしたわたしからは以上です。
このエントリーをはてなブックマークに追加

2010年10月7日木曜日

ハッカソンで作った「愛の告白」がCakePHP部門の次点を受賞した!

mon_sat です。
(This is an account as a developer.)

以前の記事で書いたWebアプリが、PHP Matsuri の発表会でCakePHP部門の次点を受賞したというのを書き忘れていました。

ウェブアプリは「愛の告白(Power of Love)」と言います。
http://love.tklabo.net/

このアプリは、Twitterを使用して「愛をつぶやく」という趣旨のアプリです。
愛のパワーの大きさ(1日とか1ヶ月とか)によって、その間、別の愛をつぶやけなくなるから、愛を込めてつぶやきましょう(笑)

例えばあなたが、 I Love my wife. とつぶやいた後、一定期間は、 I Love AKB48. などとつぶやこうとしても、その愛は届けられません(投稿できませんが、メッセージも工夫したので投稿してみると面白いかも?)

届いた方はアプリ名が「愛の告白」となっていることでニヤッとできるというおまけつきです。

ハッカソンということで16時間(+α)で作りました。
時間を区切って作ることなんて無いので、非常に良い経験となりました。

33名の発表者の中の5位入賞ということで、勇気を出して発表して良かったなあと思っています。

よろしければ、あなたの愛もつぶやいてみてください!

(できればInternet Explorer 以外のブラウザから使ってくださいね!)

それでは。
このエントリーをはてなブックマークに追加

2010年10月5日火曜日

英語は世界を広げ、そして自分の殻を破ってくれた

mon_sat です。
(This is my account as a developer.)

昨日の記事に書いたPHP Matsuri ですが、各所で英語が多用されました。
海外からのゲストスピーカーは通訳こそいるものの当然英語。
そして、それだけでなく、我々発表者も、プレゼン資料を英語で作ったり、なかには英語でプレゼンする人がいたりしました。

そのきっかけとなったのは基調講演をされたよしおかさんのスピーチ(記事後半)

昨年行われた前回のイベントでも、終了後の懇親会でゲストとの交流は当然英語ということになりました。
今回はそれに備え、ある程度「心構え」だけはしてたつもりで、そのため、今回のハッカソンのアプリも英語で作り、日本語対応するということをしました。

ゲストの方にもアプリの内容が伝わるようにしたかったのです。

しかし、上述の基調講演の隠しテーマとして「英語でコミュニケートすることの重要性」をうたっていて、他の参加者からもプレゼン資料を英語で作るという方が何人もでました。
(英語のドキュメントを読むのは慣れていますからね。ヒヤリングは慣れてなくても)

今回はスタッフとして一部お手伝いしたということもあり、イベント前日のスタッフ懇親会から参加しゲストとお話しする機会を得ました。
それからイベント終了後の「お疲れさま会」まで足掛け3日間、ゲストとは英語のトークを試み、最後は普通の会話をできるくらい変わりました。
何が?
「わたしの英語に対する姿勢」が、です。

最終日、夕食後お台場のデッキから東京の夜景を見つつ6人のゲストの方とお話ししました。
ゲストの方も心得たようで、私と話すときは、なるべく平易なワードを、分かりやすいアクセントで話してくれます(笑)
そういうこともあって。
「自由の女神があるんだっけ?」「(私)あそこですよ」「Nate!あれが自由の女神のレプリカだよ」「どれどれ?あ、あれか」
「(私)ガンダム知ってますか?」「知ってるよ」「(私)ガンダムのフルスケールの模型もあったんですよ」「本当?大きさはどれくらい?」「about 20 meters」「本当?」
「(私)でも今はないんです」「どうしたの?」「(私)移動しました。静岡へ」
なんて会話を。(もちろん意訳)
自分から話題をふるなんてこと、初日の夜には考えられませんでした。
要は気持ちですね。

英語は世界が広がります。
そして、自分の殻もやぶってくれました。

屋形船が説明できずにいたら「party boat ?」というらしい。Yes, Japanese party boat!
(今翻訳すると house boat とでてきましたが)

帰りはホテルまでタクシーで送ることに。
社内でもネイト夫妻といろいろお話ししました。
(驚いたことに運転手さんも普通に会話していました)
「京都へ行くんだ」「(運転手)京都へ行ったら豆腐を食べてください」「Tofu ? Tofu は知ってるけど、みそで食べるんでしょ?」「(私)ええ?いや、京都のは熱いお湯に入っていて・・・」
「お寿司はNYで食べられますか?」「食べられるけど美味しくないよ。日本のは美味しい」「(奥さん)刺身も好き」「本当ですか?築地は知ってますか?」「Tukiji ? Fish market ?」「日本中から魚が集まります。この道をまっすぐ行くとありますよ」
などなど。
10日近い休みははじめてだそうで、ふたりで旅行に行けなかったそうです。でも、ふたりとも日本を非常に気に入ってくれて、また来年も来るよと言ってくれました。(嬉しいですね)

解散時は皆さんとも。
「(ジョエル)君の発表は良かったよ」「本当ですか?ありがとうございます。嬉しいです」
お世辞でしょうが、本当に嬉しかったです。頑張ってアプリ作って、勇気出して発表して良かった。33人が連続でLT(短い発表。今回は4分)したのです。発表したことを覚えてくれてただけでも嬉しいのに。
「(クリス)帰るのは明日だよ」「(私)忙しいですね。来ていただいて感謝しています。」「(クリス)また来年来るよ」「(私)来年ぜひ会いましょう!」
「(グラハム)自転車で来てるの?ここからどれくらい?」「(私)2kmくらいです。」「(グラハム)そこも銀座エリアなの?」「(私)いや違いますねー」「(グラハム)何て呼ばれてる?」「(私)Fukagawa。江戸の頃ですが」「(グラハムのGF)I Know Edo 古い呼び方よね、東京の」
他にもいろいろお話しできました。
これは最後まで送り届けることができたからで、それも会場が家から近かったという偶然の産物。

尊敬する方々と、日本人は私一人。
こんなに恵まれた状況はありません。
機会を作ってくれた @yando さんに感謝です。

これをきっかけに自分の殻をもう1枚破って、世界を広げることにしようと決意しました。
このエントリーをはてなブックマークに追加

2010年10月4日月曜日

PHP Matsuri 終了

mon_sat です。
週末は PHP Matsuri というソフトウェア開発者向けのイベントに参加してきました。
(少しだけスタッフとしてもお手伝いしました)

詳細を、今週書いていこうと思っています。

まずは、一緒に参加したみなさん、ありがとうございました。
交流できた方々には重ねてお礼申し上げます。
残念ながら全員の方とはお話しできませんでしたが、次の機会でぜひ。

そして、何より、NYやカナダ・オーストラリアからいらっしゃった各フレームワークのコアデベロッパーの方々とは、たくさんお話しすることができて光栄です。
4名とも(そしてお連れの方とも)みなさん気さくで良い方々でした。
@predominant さんと、 @jperras さんとは、去年に続いて2回目。
そして、@kriswallsmith さんと、 @nateabele さんは初来日でした。
しかし、みなさん、来年もまた来たいと言っていました。

Tokyo は、(他の都市とは) different で interesting だと。
Little New York という表現もありました。

何名かは京都へも行く予定とのこと。
日本を気に入っていただいたようで嬉しいですね。

スタッフの方々には、あまりお手伝いできずに申し訳なく思っています。
この経験を生かし、次の機会ではもうちょっとお手伝いできるよう頑張ります!

それでは。
このエントリーをはてなブックマークに追加

2010年10月3日日曜日

CakePHPのコアデベロッパーにアプリを使ってもらう!

mon_sat です。
昨日、今日と、PHP Matsuri (祭り)というイベントに参加しています。
このイベントは、CakePHP・Lithium・Symfony のコアデベロッパーが海外からゲスト参加して行われる、カンファレンスとハッカソンが合体したイベントです。

私の常用するCakePHPのコアデベロッパーのひとり@predominantさんも、昨年に続いて今年も参加されています。

さて昨日。
概ね完成したハッカソン用のアプリを、その@predominantさんに使ってもらいました!

というわけでみなさん、今日も一日頑張りましょう。
このエントリーをはてなブックマークに追加

2010年10月2日土曜日

今日から晴海でPHP Matsuri

mon_sat です。
今日から晴海グランドホテルで、PHP Matsuri というイベントが開催されます。
これはPHPを使ってWebサイトを開発している方々のなかでも、CakePHP・Lithium・symfony等々のフレームワークを利用している方々が、それぞれのコアデベロッパーの話を聞きながら、何か開発しましょうというイベントです。

わたしも少しだけ、スタッフとしてお手伝いいたします。
100名近い人たちと、同じホテルで交流するということで、今から非常に楽しみです。

それでは、行って参ります。
このエントリーをはてなブックマークに追加

Facebookへの「いいね!」ありがとうございます