高橋 です

CakePHPとか勉強会とか

第一回CakeBeerTalk に参加してきた

こんばんは、高橋です。こんばんは。

寒空すらも色づいたと言われた 2/14 第一回CakeBeerTalkは開催されました。

会場はコエドという茅場町のコワーキングで、駅からすぐでした。 到着は19時半くらいだったけど、既に皆さんめっちゃ飲んでました。。。さすが。。。

ひろみさんの挨拶があって、さっそくLT開始!(LTリストは引用のため敬称略)

@hiromi2424:CakePHP2.3の新機能のうち一つ(仮)

トップバッターはひろみさんです。 Cake2.3での新機能や変更点についてザックリとお話頂きました。 けっこう細かい変更があったりするので抑えておきたいなぁという部分をザッと確認できて良かったです。 あと、超急ぎで喋ってたのに割りと時間余ってました。笑

@ cakephper:「CakePHP 1 to 2 Migration tips 100」

次はケイクペチペイパーこと市川さんの発表。なんとバージョン移行Tips100連発! さすがにLTで消化するのは無理だろう!と思っていました・・・が!なんと! いきなり好みのビールや自宅近辺の美しい風景写真を公開しはじめてやっぱり時間足りてませんでした! 発表資料の中にある __construct() はハマってしまいそうだなぁ。と思いました。

@takahashiyuya:「CakePHP2.3の新機能のうち一つ」

私の発表です! Cake2.3の新機能である onlyAllow() というメソッドに的を絞って解説しました。 結論を一言でいえば、「たった一行追加するだけで、不正やミスを防げるかも。」という事です。 詳しくはスライドをご覧ください。相変わらずページ少なくて申し訳ないですが

@kaz_29:「CakePHP2+BDD Plugin」

かなり面白かったです!BDD(振舞駆動開発)をサポートするプラグインのデモをしてくれました! 振る舞いを記述してテストを走らせるとブラウザが自動的に入力やらなんやらやってくれるんですね! ちなみに開発者の岸田さんがいらっしゃったので、後に裏LTがあったのもアツかったです!BDD Pluginすげぇ!

橋田 一秀:「CakePHPで簡単にABテスト」

ABテストという、テキストや画像・インターフェース等を変更して表示することで、どのケースのコンバーションがよかったかと統計を取るマーケティングの手法で、それをGoogleアナリティクスとの連携で簡単に導入できる方法の解説です。ビール買い出し行ってて聞けませんでした><なんてこったい

Yusaku Matsushita:「CakePHP+facebookAPIについて」

こちらもビール買い出し行ってて聞けませんでした><スライドないので内容も見逃しっぱなしでした。 ただ、安藤さんが補足的に裏LTをしてくださったおかげでFacebookアプリって意外と敷居低いかもと思いました!

LTの後の話

予定したLTの後にも飛び入り参加で発表がいくつかありました!!飛び入りって勇気いると思います!こういう積極的なアウトプットはみんな幸せにするはずなんで、私もやっていこうと思いました!

それからはピザ!ピザ!ビール!ビール!でした

CakeBeerTalk は月1でやっていく予定なので「ビール片手にCakeの話したいなー」とか「とりあえずCakeに興味あるけど、何すればいいんだろー」みたいな方は一度は参加してみてください!良い機会になると思います!特にハンズオンも予定してないのでパソコンを持ってなくても大丈夫ですよ!

それでは、ご参加頂いたみなさん、本当にありがとうございました!

PHP 配列のキーを振り直す方法

f:id:y_guriko:20130131211621p:plain

動的にフォームを生成してる場合などで役に立つ。

結論でいえば array_values() で出来ます。

しかしながら、名前からは想像しにくい結果となるので

function array_key_renumber($array = array()) {
    return array_values($array);
}

こんなラッパー関数を作ると良いですね。

↓ちなみに配列の添字(インデックス)を振り直すケースはこちら

/*
(array)$request => (
    (int)0 => ''
    (int)1 => ''
    (int)2 => '入ってる'
    (int)3 => ''
    (int)4 => 'ここも入ってる'
    (int)5 => ''
)

*/
foreach($request as $index => $value) {
    if (empty($value)) unset($request[$index]);
}
$data = array_key_renumber($request);
/*
(array)$data => (
    (int)0 => '入ってる'
    (int)1 => 'ここも入ってる'
)

*/

これなら虫食いのリクエストがきても、安心して対処が出来ます。

CakePHP h()メソッドから PHP を学ぶ


Cake使いなら誰もが体験するというh()メソッド


Cakephp Advent Calendar 2012/24 担当の高橋(@)です!
Cakeはソースコードも楽しいですよ!という記事です。


この記事の内容はフレームワーク入門者レベルです。
そんでもって、↓このあたりがサクッと学習できます。

三項演算子
・staticキーワード
再帰呼び出し
・マジックメソッド(__toString()メソッド)

超変態マニアック変態プログラマーはリツイートをお願いします。


オープンソースのコードって何かキッカケがないと読む機会がないんですよね。
Cakeはドキュメントが充実してるので必ずしも読む必要があるという訳ではないですが、読んでみると面白いもんなのでぜひこれを機会にOSSを体験してください。


というわけで、CakePHPの h()メソッド を解説していきます。
ちなみに h()メソッドは、サニタイズの役割を持つエスケープ関数です。


まずは私が過去に作ったh()メソッドがこちら(赤面)

function h($string, $flags = ENT_QUOTES, $encoding = 'UTF-8') {
    return htmlspecialchars($string, $flags, $encoding);
}

あー、なるほどー。という感じですね。

これほど単純なメソッドでもCakeだと・・・

function h($text, $double = true, $charset = null) {
    if (is_array($text)) {
        $texts = array();
        foreach ($text as $k => $t) {
            $texts[$k] = h($t, $double, $charset);
        }
        return $texts;
    } elseif (is_object($text)) {
        if (method_exists($text, '__toString')) {
            $text = (string) $text;
        } else {
            $text = '(object)' . get_class($text);
        }
    } elseif (is_bool($text)) {
        return $text;
    }

    static $defaultCharset = false;
    if ($defaultCharset === false) {
        $defaultCharset = Configure::read('App.encoding');
        if ($defaultCharset === null) {
            $defaultCharset = 'UTF-8';
        }
    }
    if (is_string($double)) {
        $charset = $double;
    }
    return htmlspecialchars($text, ENT_QUOTES, ($charset) ? $charset : $defaultCharset, $double);
}

となります。


「あーなんか難しそう。無理無理」
と思われた方もいるかもしれませんが、ご安心を。
実はとても分かりやすいコードです。


また冒頭でも述べたように

三項演算子
・staticキーワード
再帰呼び出し
・マジックメソッド(__toString()メソッド)

このあたりの技術を得ることも出来ます!
興味のある方はこのまま読み進めてください!

※Cakeのhメソッドはlib/Cake/basic.phpの165行目付近にあります


まず最後を読んでみる

    return htmlspecialchars($text, ENT_QUOTES, ($charset) ? $charset : $defaultCharset, $double);

最後に「htmlspecialchars()メソッド」が使われています。
つまり道中はさておき、エスケープ処理で終わるという事が分かりました。

第二引数に見慣れないコードがありますが、これは「三項演算子」といいます。
三項演算子とは、一言でいえばif文を省略する書き方です。
よって↓の2つは同じです。

//三項演算子
return ($charset) ? $charset : $defaultCharset

//if 文
if ($charset) {
    return $charset;
} else {
    return $defaultCharset;
}

三項演算子を使うと1行に収まるのでスマートですね。
ただし、ロジックは書かないように気をつけましょう。

ところで $charset と $defaultCharset はどこから来たのでしょうか。
直前のソースコードを読みます。

    static $defaultCharset = false;
    if ($defaultCharset === false) {
        $defaultCharset = Configure::read('App.encoding');
        if ($defaultCharset === null) {
            $defaultCharset = 'UTF-8';
        }
    }
    if (is_string($double)) {
        $charset = $double;
    }

$defaultCharset

static $defaultCharset = false
静的変数として定義されていました。

if ($defaultCharset === false) {
必ず真となるためスコープへ入ります。

$defaultCharset = Configure::read('App.encoding');
これはCakeで設定されている文字コードを参照しています。(初期値は'UTF-8'です

if ($defaultCharset === null) {
$defaultCharset = 'UTF-8';
}
仮に設定が nullであった場合でも自動的に'UTF-8'が設定されるようになっています。

また defaultCharset は静的変数なのでスコープ外でもクリアされません。
したがって後述する再帰処理でも無駄な処理を実行しません。

http://php.net/manual/ja/language.variables.scope.php#language.variables.scope.static

$charset

    if (is_string($double)) {
        $charset = $double;
    }

$charset と $double はh()メソッドの引数でしたね。
お互いに'UTF-8'のような文字コードを期待しているようです。
どちらかに設定すれば文字コードを上書き出来るようです。

if ($charset) {
    return $charset;
} else {
    return $defaultCharset;
}

つまり、文字コードはh()メソッドの引数$charsetか$doubleの設定を優先するが
指定がない場合はCakeで設定した文字コードを使用する。という事ですね。

これで、returnで返される第二引数の正体が判明しましたね!


これで半分!
続けて始めの部分を読み解きましょう。

function h($text, $double = true, $charset = null) {
	if (is_array($text)) {
		$texts = array();
		foreach ($text as $k => $t) {
			$texts[$k] = h($t, $double, $charset);
		}
		return $texts;


ん、なぜ初っ端に is_array($text) なんだろう。
と思われた方・・・エクスタシー!!!!!

そう!最初の処理は、エスケープの対象が文字列でなく
配列だった場合の処理なんです!

もし、$textが配列だった場合、新たな変数$textsを空の配列とする。
そして $textは配列なので foreach でループして h()メソッドを実行する。
すると、また中身が配列だとしても2次元、3次元と全て処理する事が出来るのです。
これを「再帰呼び出し(recursive)」といいます!


if文はまだ続きます。

    } elseif (is_object($text)) {
        if (method_exists($text, '__toString')) {
            $text = (string) $text;
        } else {
            $text = '(object)' . get_class($text);
        }
    } elseif (is_bool($text)) {
        return $text;
    }

文字列でも配列でもなく、オブジェクトだった場合の処理もあります。
ここでは何をやっているかと言うと

        if (method_exists($text, '__toString')) {
            $text = (string) $text;
        } else {
            $text = '(object)' . get_class($text);
        }

オブジェクト(クラス)に __toStringメソッドが存在していた場合、そのまま文字列として返します。
__toStringメソッドがない場合はクラス名を返します。

__toString とはマジックメソッドでクラスオブジェクトが文字列として評価された時の値を設定します。
逆にクラスオブジェクトはそのまま文字列として評価すると深刻なエラーで処理が中断しますので注意してください。

マジックメソッドは他にもたくさんあるので、見てみてくださいね。

php.net/manual/ja/language.oop5.magic.php


残りは

    } elseif (is_bool($text)) {
        return $text;
    }

エスケープ対象が true か false だった場合はそのまま返すという処理です。

以上です!お疲れさまでした!
エスケープでここまでやるなんて、とても驚きました。そして美しい上にテクっているコードには感動を覚えてしまいます。


こんな感じで、Cakeに限らずフレームワークなどオープンソースのコードを読む事は
新しい発見やスキルアップにも繋がるエンジニアにとって重要な探求でもあると考えています。


みなさんが見つけた面白いコードがありましたら、ぜひ教えてください。

PHPMatsuri2012@福岡 に参加してきた


日本最大級のハッソンイベントPHPMatsuri(2012年11月3日)


PHP Matsuri 2012
 http://www.phpmatsuri.net/2012/


福岡県Ruby・コンテンツ産業振興センターにてPHPMatsuri2012が開催されました。
なんとPHPのイベントなのに会場がRuby!?ご提供頂きありがとうございました!
私は初参加で期待と不安の中、二日酔いでスタート。


感想としては、参加して本当に良かったです。
理由は貴重な体験、そしてキッカケを得ることが出来たからです。
本当に2日間なのか?というぐらい濃い体験だったため、出来事を抜粋して書いていきます。



まず、郡山さんの「PHP:Dis is it (2012)」

テーマはプログラミング言語(例えばPHP)のDisに対する考察です。
このセッションに対する、私個人の感想です。
例えば、PHPでいうと「それ、PHPのせいか?」というDisが蔓延している気がします。
それにユーザー数に応じてアン・リーダブルコードが比例して増えるは当然です。
また、DisはDisでも問題点を的確に指摘をした上で、さらにそこ終わるんじゃなく
お互いを高めたり引き上げたりする改善策を同時に提案することが大切なんだと感じました。
@(郡山さん)



次に、海外のゲストと交流です。ただ自分の英語力のなさに絶望。。。

ノリでカバー 写真は左がグレアムさん、とても優しい。Mr. Graham, He is so friendly!


今まで英語に対しては「ドキュメント読めればいいよね」くらいだったけど
この業界に身を置く以上は英会話は必須だと危機感と共に身を持って感じました。
最近はスカイプ英会話など、月に8,000円程度で英語環境が揃うようなのでやってみたいと思います。

英語を本格的に学ぶキッカケになった!
@(グレアムさん)、@ さん



それから空いた時間にCakePHPのドキュメント翻訳をやってみました。
あとで聞くことになるダスティンさんのセッションで確信しましたが、OSSコミュニティへの関わり方は人それぞれ。
影響力は少ないけど、こんな自分でも翻訳で貢献出来ることが分かり、嬉しかった。
翻訳はすぐに取り組みリクエストをしました。そしてマージのお願いをグレアムさんに直接(必死に)説明しました。
あの時はゆっくり対応してくれてとても助かった。しかしお願いする頃にはすでにホゼさんがマージしてくれていました。速い。笑
初めてOSSへpull requestをするキッカケになった!
@(グレアムさん)、@(ホゼさん)



その他、ハックタイムやOSS関連でアドバイスをくださった
@ さん、@ さん、@ さん
本当に(いつもいつも)ありがとうございます。


それからコンテストも参加しました。

が、アイデアも出ず寝落ちで完成せずに終わってしまいました・・・。
これは猛省です!!!次回はしっかりと準備して臨みたいと思います!!!!!


そんなこんなでぶっ飛んだ2日間でした!来年も参加したいです!



おまけ


博多といえばラーメン。どこのお店もおいしかったなぁ〜

PHPカンファレンス2012@東京 で発表してきた


なんと WordCamp Tokyo と共同開催


どうもでーす。高橋でーす。

まずは運営およびスタッフの皆さん、本当にお疲れ様でした。
イベントは朝から夕方まで休憩0のぶっ通し!見たセッションはどれもアツかった!



正装「LOVE ME TENGA」


私の発表テーマはWebデザイン。あえてPHPと直接関係ない内容。


↓ちなみに発表の様子はこんな感じ

意外にたくさんの人が集まりました。さすがぺちこん



なんか偉そう


私はWebエンジニア(PHPer)でもデザイン・UIを意識するべきだと考えています。
だから、ぺちこんでWebデザインというテーマをブツけてみました。


少なからず、この仮説に一理あると感じている方がいて嬉しかった。
同意を求めてるわけではないけど、ぶっちゃけWebデザインも楽しいんですよね。
もし需要があれば、より実践的なWebデザインの話をやりたいなーと考えています!


話が飛躍しますが、(PHPer == UIも考えている)の構図になれば
新たな競争でケミストリーが起こるんじゃないか、と面白い展開に期待していますw


あとは、ネタの一つで「ホワイトスペース(難解プログラミング言語)と勘違いしてる方ー?」
ってリスナーに振ったら一人だけ手が挙がりました!! 誰!?って思ったら @ さんでした(あざっすw


何はともあれ楽しかった。とても良い経験ができました。
PHPカンファレンスを通じてPHPがもっと好きになれました。


次は10月に大阪で開催する関西PHP勉強会、それから11月福岡のPHP Matsuri 2012
いずれも参加予定なので、PHPに興味がある方はぜひ会場でお会いしましょう!


ではでは〜