10月3日、
イベント開始前の最終確認するスタッフの皆さん。この後、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8338.jpg)
本日のイベントの模様は、
オープニング
実行委員長の前島有貴さんより、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8344.jpg)
その後、
お昼には、
- 12:00~12:30:
『Laravelエキスパート養成読本』 - 12:30~13:00
『PHPはどのように動くのか』 - 15:10~15:40
『実践ドメイン駆動設計』
なお、
廣川類さん「PHPの今とこれから2015」
オープニングの挨拶の後、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8350.jpg)
今年でPHPは、
PHP7は、
PHPという言語について次のように説明しました。
- 主にWebアプリケーションで使用されるスクリプト言語
- 1995年の誕生以来、
Webと共に成長、 進化
サーバサイドプログラミング言語では8割ほど使われていて、
使用されているPHPのバージョン分布を見るとバージョン5.
バージョン5.
なお、
そして、
- 大幅高速化
- 致命的エラーを例外補足可能
- 古いSAPI、
エクステンションの削除 - ヌル合体演算子
(??) - 結合比較演算子
(<=>) - 戻り値型宣言
- スカラー型宣言
- 匿名クラス
一番大きなポイントは高速化になります。ベンチマークによるとPHP5.
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8354.jpg)
それから、
それから、
PHP7の互換性に関する変更として、
- エクステンション削除:ereg, mysql, msspl
- SAPI削除:22種類から7種類
- ASP
(<%...%>)、 Script (<script language="php"></script>) の廃止 - newオブジェクトの参照代入廃止
- PHP4形式のコンストラクタ:E_
DEPRECATED - エクステンションは要変更:http://
gophp7. org/ gophp7-ext/
今後の開発は、
- PHP7.
1開発が開始 - PCO
(PHP Cryptography Objects) - JITコンパイラ
PHP7.
PHPの今とこれからが、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8355.jpg)
徳丸浩さん「今どきのSQLインジェクションの話題総まとめ」
2009年からPHPカンファレンスでトークをしている徳丸浩さんの発表です。SQLインジェクション対策漏れの責任を開発会社に問う判決の話と、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8359.jpg)
SQLインジェクション対策もれの責任を開発会社に当判決
2009年の資料で安全なアプリケーションの発注要件の話では、
ところが昨年判例が出ました。その判例が家具インテリアECサイト侵入事件です。家具インテリアのECサイトを運営するX社がECサイトをY社に発注してそのサイトから2011年にクレジットカードの情報が漏洩。X社はY社に損害賠償を起こし、
裁判の争点は次のとおりです。
- 特にセキュリティに指示はしてなかった。
- 当初はカード情報を扱っていなかったが、
X社の依頼でカード情報を保持するようになった。 - カード情報は持たないほうがいいとX社が問い合わせた。
- ログが他社から見れるようになっておりそのログにも個人情報が入っていた。
- 管理機能のID/
PASSがadmin/ passwordになっていた。
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8366.jpg)
判断はいろいろ考えられますが、
よって、
徳丸さんの感想は、
こういった判決が出たことで、
PHP入門書のSQLインジェクション脆弱性の状況
PHP入門書のセキュリティの批判をしていると、
そして、
* はじめてのPHPプログラミング
2008年に発行された
function dbescape($sql, array $params)
{
foreach ($params as $param) {
switch (getup($param)) {
case “inteher”:
case “double”:
$replasemment = $param;
break;
case “string”:
// 文字列の場合はエスケープ処理を行う
$replasemment = sprintf(“‘%s’”, sqlite_escape_string($param));
break;
default:
die(“パラメータの方が正しくありません");
}
// SQLを置換し、パラメータを埋め込む
$sql = substr_replace($sql, $replasemment, strpos($sql, “?”), 1);
}
return $sql;
}
しかしこの場合、
SELECT * FROM foo WHERE bar = ? AND base = ?
↑’?’に置き換え
SELECT * FROM foo WHERE bar = ’?’ AND base = ?
↑ ‘AAA’に置き換え
SELECT * FROM foo WHERE bar = ’‘AAA’’ AND base = ?
AAAがリテラル外にはみ出す↑
SQLインジェクション攻撃は次のようになると示しました。
SELECT * FROM foo WHERE bar = ? AND base = ?
↑’?’ぶ置き換え
SELECT * FROM foo WHERE bar = ’?’ AND base = ?
↑ ‘or 1 = 1--’に置き換え
SELECT * FROM foo WHERE bar = ’‘or 1 = 1--’’ AND base = ?
or 1 = 1--がリテラル外にはみ出す↑
ここから得られる教訓はプレースホルダの仕組みを安易に自作すると徳丸さんに怒られることです。十分に考慮して作りましょう。
* よくわかるPHPの教科書
『よくわかるPHPの教科書』
ここでSQLインジェクションを実演してDELETE文で意図しない書き込みの削除ができるところを示しました。エスケープは難しいところがあるため、
また、
他にも、
* 気がつけばプロ並みPHP
『気がつけばプロ並みPHP』
* その他の本はどうなの?
最近はPDOのプレースホルダを使うのが主流になっているため、
また、
- SQLインジェクション対策はPDOのプレースホルダで静的と動的があり静的を使うほうが安全。
- 文字エンコーディングの指定はPDOの5.
3.6以降で接続文字列に文字エンコーディングが指定できるようになったので、 これを使う。SET NAMES outfitはやめる。 - PDOの癖としてPDO::PRAM_
INTを指定しても文字列として扱われるため、 int型にキャストしたほうがいい。
O/RマッパやSQLジェネレータのSQLインジェクション
次に、
* Rails SQL Injection Examples
Rails SQL Injection Examplesというサイトで脆弱性について言及されています。Railsの話なので言語はRubyになりますが、
例題の実演をして、
また、
SELECT * FROM 成績 ORDER BY (算数+国語)
複雑なものも書けるそうで、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8383.jpg)
エラーメッセージから情報を取得できますが、
orderメソッドでUNION SELECTから情報漏洩はできるのか。
- ORDER BYのあとでUNIONは使えない
- 複文ではmissing attributeとエラーが出る
といった条件を考慮して列名に別名をつけると、
* Zend FrameworkのSQLインジェクション
Zend FrameworkのSQLインジェクションの説明では、
$select = $db->select()
->from(products)
->order(’name’); //列 nameでソート
orderメソッドで式を書くとそこで式も指定できます。これはまずいのでは?
if (pre_match(‘/\(.*\)/‘, $val)) { // (と)があれば
#val = new Zend_Db_Expr($val); // 式とみなす
}
その時の徳丸さんは、
CVE-2014-4914 (Zend Framework 1.
- orderの引数文字列に(と)がありさえすれば式とみなされエスケープ対象となる。
- 1;攻撃文字列 ?() とかでもOK。
- 公表されたPoCは次のとおり。
order(‘MDS(1); drop table products --')
↓生成されるSQL文
SELECT `products`.* FROM `products` ORDER BY MD5(1); drop table products --
Zend Framework 1.
//1.12.7
if (pre_match(‘/^[\w]*\(.*\)$/‘, $val)) {
#val = new Zend_Db_Expr($val);
}
// 英数字0文字以上に続けて(があり、末尾に)があれば式とみなす
という形になっていました。その時の徳丸さんは、
Zend Framework 1.
order(‘MDS(1); drop table products --')
↓生成されるSQL文
SELECT `products`.* FROM `products` ORDER BY 'MDS(1); drop table products ?' ASC
// order by以降が’で囲まれて識別子となる
新しいPoCでは次のようになります。
order(‘MDS(1); drop table products ?)')
↓生成されるSQL文
SELECT `products`.* FROM `products` ORDER BY MDS(1); drop table products ?) ASC
// 式とみなされる条件を満たし、「そのまま」SQL文に
そして、
//1.12.8
if (pre_match(‘/^[\w]*\([^\]*\)$/‘, $val)) {
#val = new Zend_Db_Expr($val);
}
// 英数字0文字以上に続けて(があり、途中は)以外が続き、
// 末尾に)があれば式とみなす
なんとなく攻撃は難しくなっているけど、
* JSON SQLインジェクション
SQL::makerというクエリビルダーがあります。プレースホルダを作ってバインド値も作ってくれて値をリストで渡すとIN演算子に勝手にしてくれたり便利なものですが、
もし演算子の部分がいじれてしまうと、
SQL::makerをPHP版に移植した人がいたので、
変数の値がyamadaの場合は次のようになります。
SQL文: SELECT * FROM `users` WHERE (`name` = ?)
また、
SQL文: SELECT * FROM `users` WHERE (`name` KEY ?)
PHPはGET/
http://example.jp/query.php?user_name[key]=value
となり、
PerlよりPHPのほうが簡単に攻撃ができてしまうので注意が必要です。対策としてはSQL::maker側はstaticモードを追加して、
* Drupageddon (CVE-2014-3704)
Drupageddon (CVE-2014-3704) は、
Drupalは3大CMSの一つで、
この脆弱性は10月15日に発表された直後に攻撃が開始され10月15日午後11時 (日本時間16日午前8時)
通常の要求は次のような形です。
name=admin&pass=xxxxxx
これは、
SELECT * FROM users WHERE name = ‘admin’ AND status = 1
このnameを配列で指定しています。
name[]=user1&name[]=user2&pass=xxxxxx
SELECT * FROM users WHERE name = ‘user1’, ‘user2' AND status = 1
この時点で問題があります。JSON SQLインジェクションにもあったように、
name[id1]=user1&name[id2]=user2
となり、
SELECT * FROM users WHERE name = :name_id1, :name_id2 AND status = 1
そして、
name[1 xxxx]==user1&name[2]=user2
となります。プレースホルダに空白が含まれてしまい、
SELECT * FROM users WHERE name = :name_1 xxxx, :name_2 AND status = 1
すでにSQLインジェクションは起こっていますが、
name[2 xxxx]=&name[2]=user2
SELECT * FROM users WHERE name = :name_2 xxxx, :name_2 AND status = 1
プレースホルダは:name_
このことを脆弱性のあるバージョンで実演しました。実演したのは次のような10秒待つSQLインジェクションです。
name[2 ;SELECT sleep(10) ? ]=&name[2]=user2
さらに、
* 問題点まとめ
一連の問題点をまとめると、
- Zend Frameworkは、
orderメソッドの仕様が明確でなかった。 - SQL::Makerは、
キーを外部から入力される想定をしていなかった。 - Drupalでは、
配列は想定していたが、 連想配列は想定していなかった (7. 36で配列を弾くようにバリテーションをするようになった)。
まとめ
最後に徳丸さんは、
- SQLインジェクション対策もれの責任を開発会社に当判決が出た。
- PHP入門書のSQLインジェクションは解消されつつありますが、
まだまだ他の脆弱性がある。 - SQLジェネレータの実装に起因するSQLジェネレータ脆弱性は仕様の考慮漏れやバリテーション不足。
- SQLジェネレータ利用者側の注意ライブラリのマニュアルをよく読みバリテーションは普通にやっておこう。
岸田健一郎さん「Composerではじめるアプリケーション開発」
岸田健一郎さんは、
現在PHPで開発するときに外部ライブラリをインストールするには基本的にComposerで行う方法が一般的です。Composerは2012年3月1日に誕生。1.
では今から3年前より前はどうなっていたかというと、
また、
『PHP: The Right Way』
Composerのインストール方法は、
curl -sS https://getcomposer.org/installer | php
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8374.jpg)
composer.
開発時のチップスとしては、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8376.jpg)
もしもコンフリクトした場合にはツールでのコンフリクト解除はできないため、
ここまでで時間が来てしまいましたが、
柏岡秀男さん「PHP初心者セッション」
有限会社アリウープの柏岡秀男さんによる発表です。2000年の頃から、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8369.jpg)
OS、
- LAMP:Linux, Apache, MySQL, PHP
- LAPP:Linux, Apache, PostgreSQL, PHP
- LEMP:Linux, Nginx, MySQL, PHP
では、
PHPとHTMLを組み合わせて、
PHP初心者がこれから学ぶ際に注意すべきまとめとして
PHP初心者にとってはステップアップに繋がる素晴らしい発表だったと思います。
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8368.jpg)
畠山大有さん@クラウドから地上まで。Azureがどうやって動いているのか、掘ってみよう」
もともとの発表予定者だった畠山さんに替わり、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8378.jpg)
はじめに
AzureはMicrosoftが運用しているクラウドサービスで、
PHPやりたいけどPHP以外でハマることって実は多い
今回の話は、
AzureのPHPなら…?
WebMatrixでは**PHPのバージョンの動的変更が可能**で、
タイトルにあったクラウドから地上までとは?
そして、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8380.jpg)
まとめ
発表では、
中村けん牛さん「超高速WordPress ~PHP7 vs HHVM vs PHP5.6」
プライム・
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8400.jpg)
中村さんは
最初にKUSANAGIのサイトを取り上げ、
なぜ高速化が必要なのか?
そして、
また、
- PV獲得の機会を失わない
- UXを向上
- 検索エンジンを最適化
- Webサイトの信頼性、
安定性を向上
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8398.jpg)
サーバサイドの高速化とは?
WordPressの高速化はサーバサイド
サーバサイドで高速化するためには、
ページのロード時間と1秒あたりのリクエスト数の関係
1コアでページのロード時間が500msだった場合、
また、
ページキャッシュを使わずにWordPressを高速化する
LAMP
このAPCは簡単に導入できるとし、
yum install -y php-pecl-apc
service httpd restart
PHPアクセラレータはPHP5.
この状態でさらにMySQLのクエリキャッシュを導入すると、
さらに翻訳キャッシュを導入することで、
ここで発表の時間切れとなりましたが、
寺田渉さん「PHPの基本クイズ ? この動き、あなたは知っていますか?」
プログラムと翻訳が趣味だという寺田渉さんの発表は、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8390.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8386.jpg)
クイズは、
- ==ではなく===の必要性。
- switchも==で比較していること。
- number_
format関数は、 引数にfloatを受け取るため、 大きい値を引数に渡すと丸められてしまうこと。 - empty関数に文字列の'0'を渡すとtrueを返すこと。
- if ($var)とif (!empty($var))の動作の違いについて。前者の書き方だと$varが未定義時にNoticeがでてしまうこと。
- PHPのみのファイルで、
?>の後ろに空白があるとhttpヘッダは出力済になるためリダイレクト等はできず、 代わりに真っ白の画面が表示されてしまうこと。 - 次のコードにおける、
配列の+とarray_ merge()の違い。
var_export($a + $b);
var_export(array_merge($a, $b));
- foreachで書き換えたら異変が起こること。書き換えならarray_
walkを使おうと説明。
$array1 = [1,2];
foreach ($array1 as &$val) {
$val = 0; //0で書き換え
}
$array2 = [3,4];
foreach ($array2 as $val) {
//何か
}
var_export($array1); // [0, 4] なぜ 4 ここに!?
var_export($array2); // [3, 4]
Rasmus Lerdorfさん「基調講演」
PHPの開発者Rasmus Lerdorfさんの基調講演は、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8443.jpg)
20周年は
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8457.jpg)
この文章は当時の問題のリストアップをしているタイムカプセルのようで、
今はPHP7でいろいろなものを織り込んだものを出せるようになりました。PHP7はセカンダリーのOpCacheを持てるようにしています。その結果、
他にも新機能はいろいろあります。
- スタティックアナライザの書き方。
- returnTypeで特定のタイプが返せるようになった。
- stritタイプを準備しているので、
型に問題があればエラーを返せるようになった。 - クロージャーも1回限りしか使えないような書き方ができるようにもなった。
- NullCoalesceOperatorが実装された。
- SpaceshipOperatorが実装された。
- スターウォーズのX1のようなオペレータ<==>が実装された。
- FatalになっていたエラーもExceptionとしてキャッチできるようになった。
- クロージャーコールを追加された。
- 特定メソッドの上でクロージャーをコールできるようになった。
- ereg等のPHP4の非推奨なメソッドを多く削除した。
- 新しい予約語も追加されているので注意。
- Uniform Variable Syntax。
- PHP7はすべて左から右に解釈するようになっているが、
PHP5の順序で解釈させるようにする方法も準備している。 - preg_
replaceをpreg_ replace_ callbackで実装する方法。
どのように2倍の速度が出せるようになったのか?
なお、
次に、
- Drupal8は、
レイテンシは半分に下がっている。HHVM3. 7よりも早い。 - WordPress4.
1.1は、 PHPは5. 6の時代から見ると3倍くらいの性能に。HHVM3. 7の速度に近づいている。でもHHVMに勝てなかったので、 gccの機能、 FDOを用いバイナリの最適化を図り、 ほぼほぼ同じ速度になったとのこと。 - phpBB3.
1.3は、 HHVM3. 7よりも早い。 - MediaWiki1.
24. 1は、 HHVM3. 7の速度に近づいている。MediaWikiについてもHHVMは最適化を図っている。特に最適化を測っていない言語については、 PHP7のほうが早い。 - Opencart2.
0.2. 0は、 あまり速度向上が認められなかった。これは、 ほとんどの時間がデータベースへのアクセスであるため。 - WardrobeCMS 1.
2.0は、 PHP5と比較して2倍の性能向上が見られる。LaravelやSymfonyのようなフレームワークを用いている人はこの2倍の効果を感じることができるはず。クリックすればわかるレベル。 - Geeklog2.
1.0は、 他と同じような結果。 - Magento1.
9.1. 1は、 そもそもリクエストできる数が少なく数十程度である。 - Traq3.
5.2は、 2倍くらいの差が出た。
また、
Rasmusさんは、
Vagrantのスクリプトも準備していると言います。この仮想マシンはDHCPで接続も可能です。開発環境のコピーも提供します。Vagrantのコンパイルで、
また、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8521.jpg)
質疑応答も活発に行われました。
- 仕事で7に移行するときに気をつけることは?
- すぐに使ってください
(笑) 本当はPHP7. 0をプロダクションで用いることは無いと思うが、 7. 1までは待たなくても良いくらいの信頼度があるのでそれくらいで使える。
- すぐに使ってください
- mb系のFunctionが通常のFunctionと一緒になることはあるか?
- mb系のFunctionが融合する可能性は今のところ無い。いつかするかもしれない。いまでも例えばユーザースペースを使う等で実施できる。7.
0は今までどおりのmbは別で実装されている。
- mb系のFunctionが融合する可能性は今のところ無い。いつかするかもしれない。いまでも例えばユーザースペースを使う等で実施できる。7.
- パフォーマンス向上の項目を教えてください。
- すべてパフォーマンスに関する要素を書き出すことはできない。言語自体もでも早くする仕組みを改善している。あまりにも多い。ファイルベースでのキャッシュによるリスタートの速さが挙げられる。
- PHPでは、
推奨するフレームワークがあるの? - それは結局はどのフレームワークがいいのかという質問でしょう?
(笑) 私にフレームワークを聞くのは間違っている。PHPの開発者ではなく、 Cの開発者だから。私のフレームワークに関する知識は 「なんでこんなに遅いんだろう」 と汗を掻くくらいしかない。しいて言えば、 モジュラー構成になっていて、 必要なものを選べるようなフレームワークがいいと思う。
- それは結局はどのフレームワークがいいのかという質問でしょう?
- PHPのPはパーソナルだという話があるが実際はどうか?
- PHPはPHPでPは……という話はしない
(笑) 背後になんの意味もないのか? という話をする人のために話すことはあるけど。PHPはPHPです。
- PHPはPHPでPは……という話はしない
- 古いエクステンションに合わせて後方互換を保ったものを準備するつもりはあるか?
(PECL等で作られているので) - C言語で書かれたモジュールを準備するつもりはない。ただし、
後方互換を実装した数百という例があるので、 やるべきことはパターンを見て、 自分で、 PHP5のコアに入っているものもあるので、 それをPHP7に実装していくこと。
- C言語で書かれたモジュールを準備するつもりはない。ただし、
yoku0825さん「MySQL 5.7にやられないために知っておいてほしいこと」
yoku0825さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8474.jpg)
MySQL 5.7 とは?
MySQLはバージョンが5.
これまでのMySQL
2015年8月に5.
- 2010/
12: MySQL5. 5 - 2013/
02: MySQL5. 6 - 2015/
xx: MySQL5. 7
MySQL5.7の新機能について
MySQL5.
- 最低限これは知って欲しい
- 16桁ハッシュのパスワード廃止
- default_
password_ lifetime - sql_
modeのデフォルト値変更
- 一応知っておいてほしい
- mysql.
user. passwordカラムの廃止 - 認証周りの構文の変更
- secure_
file_ priv
- mysql.
- これは知っているとちょっと得する
- sysスキーマ
- GTIDのオンライン有効化がサポート
- MySQLネイティブの全文検索が日本語対応
- 知っておいても損はない
- innodb_
buffer_ pool_ sizeのオンライン変更がサポート - sync_
binlogのデフォルト変更 - マルチソースレプリケーション
- innodb_
まとめ
新機能等の発見報告は、
30分の発表でスライドが172枚ととてもボリュームがあり、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8475.jpg)
大谷祐司さん「Hack言語に賭けたチームの話」
大谷祐司さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8478.jpg)
Hackとは?
HackはFacebookによって開発された言語です。PHPと互換性を持っていて、
Hackの特徴は、
ただ最近は、
- Hackは昨年話題になったけど、
とっくに下火で進化も止まっているのでは? - Hackは単純に
「パフォーマンスの高いPHP」 だよね? - PHPフレームワークやライブラリが使えず開発にコストがかかるだけでは?
大谷さんが某CTOに相談しに行った時には、
しかし結論はすべて誤解だったと話しました。
バージョンアップは早くて8週間に1回、
なお、
最近のリリースにおける進化
最近のHackでは並列処理のために、
例えば、
また、
追加されている機能
Hackに追加されている機能として、
- 引数・
戻り値の型指定できる。型の前に?をつけるとnullを許容するというサインになる。 - Genericsの実装。
- Hack独自の配列を実装していて、
厳密な型やタイプを指定できる。そのため、 格納する値に型の指定が可能だったり、 Getメソッドを利用することでissetなしで値を取り出せる。 - Enumの仕様が追加。
- async、
awaitという関数で並列処理ができる。 - hh_
clientを使うとコンパイラーエラーや戻り値のチェックなどの構文チェックが実行前に行える。
Hackは単純に
なお、
Hackを使ってサービスをリリースするまで
今回のサービスで採用している技術・
- OS: CentOS7
- Webサーバ: nginx1.
9 - DB: MariaDB10.
0 - インフラ管理: Ansible
- web開発言語: Hack (hhvm3.
7) - フレームワーク: FuelPHP1.
7 - バッチ開発言語: Go言語
なぜHackを使用したかについては、
Hackの採用は次のような覚悟を持って採用したそうです。
- 最悪ダメだったらPHPに戻す
- 前例がないからチャレンジしてみよう
- 英語ネイティブのメンバーがいるから大丈夫
- PHP7ではなくHACKが流行る未来を妄想
Hackの学習は、
しかし、
- HHVMが落ることがある。なぜか落ちるので監視して自動再起動をしている。
- peclが利用できないため、
golangでextension記述している。 - HackにはHack自体を拡張する機能を持っているが、
スピード重視で今回は使用していない。 - CentOS6サポートを急に停止したのでCentOS7へ急遽移行した。
- コードフォーマッターがきちんとは使えないため、
改造して使っている。 - Hackと検索してもゲームの.hackが出てきてしまい、
情報になかなかたどりつけない。情報もまだ少ない。
HHVMで動作するPHPのフレームワークの情報は公開されていて、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8484.jpg)
FuelPHPを採用して、
- DBアクセス部分に若干のコード追加をおこなっている。
- テンプレートエンジンはSmartyを使用した。問題はおきていない。
- index.
php → index. hhに名前を変更した。FuelPHPは.phpで動いているがプロジェクトで使っているものは.hhを使っている。 - プロジェクトで使用しているものは<?hhで開始するようにしている。
- FuelPHPのソースを全部Hackに書きなおさないといけないと思っていたが、
そんなことはなくFuelPHPのPHPの部分とプロジェクトのHackの部分はうまく共存して、 いい感じで安定している。
また、
- 定数はenumで作成。
- ArrayではなくVector/
Mapの積極的な利用。 - タイプヒンティングは必ずつける。
- hh_
clientでコミット前の構文チェック実行。
hh_
セキュリティについては、
今回Hackを採用して良かったこととして、
- PHP経験のあるメンバーが早期習得でき、
学習コストは掛からなかった。 - 「新しいチャレンジ」
しているのでメンバーは活き活きとしてコードを書いている。 - PHPだけを書いていたメンバーはいろいろな書き方を知ることでスキルの幅が広がり、
PHP以外の言語への興味が出てきた。
「PHPフレームワークやライブラリが使えず開発にコストがかかる」
まとめ
最後に、
秋山顕治さん「Electronからクロスプラットフォーム・アプリケーションの歴史を考える」
Electronといえば、
秋山顕治さんの発表では、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8491.jpg)
ElectronのWebエンジニアにとっての利点とは
Electornの利点は、
なぜ今までデスクトップアプリケーションを作ったことがなかったのか?と思い返す
今まではデスクトップアプリケーション開発といえば、
- 新たな言語を学習するコストが高い。
- 開発環境を用意するコストが高い。
- デベロッパー登録をしないとインストールできない。
- あるプラットフォームむけに構築されたソフトウェアは他のプラットフォーム上で動かない。
これが実際に秋山さんのモチベーションにどう関わってきたのかを振り返ります。ちなみに、
* 古代からの流れを一気に
これまで次のような時代の変遷がありました。
- OS登場以前
(1950年頃) : いろいろな実装が乱立していた。 - OSの確率: ある程度戦争に終止符が打たれ、
OSという概念が生まれてくる。 - ハードウェアおよびOSの乱立: HWやOSが乱立。
- 2000年代: OSがいっぱいあってもしかたないと、
収束してきた。
そして、
開発者の願いは、"一度書いたら、すべてのプラットフォームで動いて欲しい"
この流れから生まれてきたのがJavaです。またはQtや.NETも生まれてきました。これらは、
Web技術の採用の流れ
その後、
この頃からのブラウザアプリの流れ
その後2010年に、
- Webアプリケーションがオフラインで利用できる
- ブラウザを開かなくても利用できる
- 様々なブラウザの機能を利用できる
これらの特徴には魅力的に感じつつも、
* ここまでの秋山さんの要望
秋山さんの要望をまとめると、
- なるべく多くの環境で動作
- ライトな言語で開発したい
- 持っている技術の流用か、
後に仕事に流用できなそうな技術を採用したい - ランタイムのインストールとかしたくない
(させたくない)
そこで登場したのがElectron
そして登場したElectronは、
- HTML+CSSでUI構築
- Javascriptで動作を記述
- クロスプラットフォームのWebブラウザをランタイムとして同梱
AirやSilverlightはあらかじめランタイムをインストールする必要があったけれども、
* Electronはなぜ最初から登場しなかったのか?
Electronはなぜ最初から登場しなかったのか?
- オープンソースのクロスプラットフォームWebブラウザの登場
(chromium) - JSのサーバーサイド
(実質的にはブラウザ外) 実装の登場 (Node v8)
Webの技術が拡張されていった結果、
* 秋山さんの要望以上の利点
Electronのメリットとして、
- Node.
jsの機能利用 (19万以上のnpm)。 - 実質Web開発なのに対象環境をElectronおよびNode.
jsのみに絞ることができる。 - ブラウザの種類についてもバージョンについても気を使う必要がない
(ランタイム同梱だから、 開発者はほかのを意識する必要が全くない)。 - JSで開発できること。多くのWeb開発者はJSを触っている。
- Polymerなどはブラウザ互換が肝になっていたけれど、
ElectronはChromimに対応していればいいのでクロスブラウザは考えなくても良い。
また、
* Electronの欠点
デメリットととして、
具体的にどういったシーンで使えるのか?
そして、
- "最強のTwitterクライアントを作る"といった流れがあるので、
オレオレツールとかいいかも - 社内向けのクローズドなアプリケーション
- クロスプラットフォームなアプリケーション作り
(Macしか持ってないけどWindows向けアプリケーション作るなど)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8489.jpg)
まとめ
本発表は、
久保達彦さん「フリマアプリ「メルカリ」の急成長を支えるエンジニアリング」
久保達彦さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8506.jpg)
メルカリのインフラについて
メルカリのインフラは、
PHPで高速なAPIサーバを実現
各所で細かくチューニングしていて、
他にも、
- キャッシュを使ってなるべくサーバに仕事をさせない。
- New Relic によるモニタリングをし、
速度を監視し問題があれば修正。 - php-Parallel-Prefork というライブラリで非同期処理を行う。
- 2015年7月にPHP5.
6にアップグレードし、 レスポンスが改善。
nginx によるハイパフォーマンスネットワーキング
メルカリのアプリから、
検索結果のキャッシュ
検索処理はキャッシュを使わないとかなりサーバに負荷をかけてしまうため、
SlackでChatOps
デプロイや勤怠管理、
いろいろなサーバからSlackに通知する際、
- 各サーバ上のクライアントがIncomming WebhooksのURLを知っておく必要がある
- 各クライアントで利用している言語がバラバラ
・
通知処理を書くのが面倒
といった問題があり、
slackboard-cliを使うとechoの後に記述した内容をSlackへ通知することができます。
$ echo mercari | slackboard-cli -c tech-test -s slackboard-server:29800
slackboard-logを使うとコマンドが失敗したときにそのログをSlackへ通知することができます。
$ slackboard-log | -c tech-test -s slackboard-server:29800 -- ls hoge~
ゼロダウンタイムデプロイ
以前のデプロイではrsyncを複数回使っていたそうですが、
プッシュ通知基盤
基本的に外部のサーバと通信するのでとても重かったそうです。そこで、
ログ分析基盤
ログ容量は1日200GBあると言います。各サーバからfluentdに転送する前にDataTrackというライブラリを使っていたこと。また、
Pureeを使うことでアプリからfluentdにログを取得でき、
まとめ
いろいろ工夫して高速なAPIサーバを実現していることが紹介されましたが、
席は満席になり常にシャッター音が鳴り響いていて、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8498.jpg)
富所亮さん「Behat Driven Development」
富所亮さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8513.jpg)
最初に、
- 何度も同じ箇所でデグレ。
- でも、
自動テストを追加する工数が取れないと言われる。 - でも、
自動テストのやり方がわからないと言われる。 - RspecとかCapybaraはRubyのツールだから分からないと言われる。
- バグが起きた時の再発防止策で
「がんばる」 とか言われる。
このように自動テストがない状況だったため、
そこで、
自動テストには、
- デグレがよく起こる箇所の事前検査
- ビジネス的に重要な箇所の事前検査
- テスト手順が煩雑な箇所の検査
- 放置状態の機能の死活監視
富所さん自身が、
- リリースに自信がでる
(よく聞く) - リファクタリングに勇気がでる
(よく聞く) - 面接の時言える。
- 自動テストは、
意識高そう。
ただし、
次に、
* ケース1) テスト作れない
テストが作れないという問題。原因としては 「テスト自体をやったことがない」
* ケース2) 自動テストの遺跡
CIがないとテスト自体が、
また、
* ケース3) テストの放置
Jenkinsにテスト実行ログやグラフは出ているが、
リリースツールは、
以上は富所さんの体験談だそうですが、
BDDテストフレームワーク「Behat」
次に、
Behatは次のような形で使うことができると説明しました。
- デフォルト状態では何もない。
- テスト
(feature) , アサーション (step) は自分で作る。 - 一般的にはextensionを導入して使う。
そして、
自動テストの成功を阻む要因として次のような事柄が挙げられます。
- 1. テストツールの教育不足
- 2. 個人依存のテスト実行環境
- 3. 導入後の通知や運用ルールの不備
しかし、
- 1. テストツールの教育
- PHP製という強み。
- Qiitaや、
後述の参考資料の内容を1時間程度やれば、 十分把握できる。 - E2Eテスト前提であれば、
Mink拡張を利用するだけなので、 PHPのコードは一行も書かない。
- 2. 個人非依存のテスト実行環境
- Composerでinstall可能。
- 近代的なCIツールなら簡単に構築可能
(前述)。
- 3. 導入後の通知や運用ルール整備
- 最近のCIツールは通知拡張を備えている
(slackとか)。 - テスト失敗時にdeploy出来ないフローにする。
- PR開発によるコードレビューは相性が良い
- 最近のCIツールは通知拡張を備えている
近代で自動テストを回すために必要な構成要素はVCS
富所さん自身の自動テストへの取り組み体験をもとにした発表で、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8508.jpg)
新原雅司さん「いまどきのPHP開発現場 -2015年秋-」
新原雅司さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8524.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8530.jpg)
まずは、
- JetBrains社のIDE
(有償) - 動作が軽快、
静的解析、 オールインワン - Vimmerも納得のIdeaVIM
vimと比較した時に、
次にVagrantの紹介しました。特徴は次のとおりです。
- プロジェクト毎に独立した環境
- 自動構築
- チームで同じ環境を利用
- 運用環境と同じ環境
Vagrantの導入ポイントは次の点にあると指摘しました。
- PHP コードと一緒に管理
- とことん自動化
(vagrant upで完了) - プロビジョニングはVMの中で実行
- Shell Script -> Ansible が楽
また、
次にフレームワークを紹介しました。
- コンポーネント指向が主流
- Symfony / Zend Framework / Aura? CakePHP 3 / Laravel / BEAR.
Sunday - コンポーネントを分離して利用できる
- 他のフレームワークのコンポーネントを利用
最近のフレームワークはコンポーネント単位で、
次にTravis CIを紹介しました。特徴は次のとおりです。
- GitHub と連携
- git push/
PRを検知して実行 - .travis.
ymlに実行内容を指定 - sudoが実行できる
(何でもできる)
GitHubとしか連携できないため、
次に、
- コードフォーマットや静的解析のSaaS
- 指摘表示
- 有償ならテスト実行も可
- Travis CIなどと組み合わせる
次にHerokuを紹介しました。特徴は次のとおりで、
- PHP 5.
5 / 5. 6 / 7(RC4) / HHVM - PHP拡張やhttpdサーバ、
設定が可能 - 無料枠あり
(検証環境にも便利) - アドオンが豊富
まとめとして、
これから、
arimoさん「DMMのハイパーメディアオタサーの姫arimoが語るPhalcon」
PhalconはPHPフレームワークの中で最速と呼ばれるフレームワークです。内部実装でC言語を採用し、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8559.jpg)
arimoさんの自己紹介に30分中の10分を費やすという時間の使い方に冒頭で会場がざわつきつつのスタートです
Phalconを使おうと思ったきかっけ
DMMの案件では仕様変更が頻繁に起こるらしく、
「案件でやったことがある人いたのでまぁいけた」
FuelPHPからPhalconに書き換えた感想は、
Phalconはどんなフレームワークか
公式サイトのベンチマーク見てみると、
バージョンはどうなっているのか
バージョンによって内部実装が変わっているので中々互換性などは厳しい部分もあるとし、
Phalconの闇
Phalconの闇として次の事柄を挙げていました。
- ドキュメント英語問題: 公式マニュアルも中途半端日本語化されているという罠。
- ORMの使い勝手があまりよくない問題: いろいろと使えなく、
結局素のSQLを書くことも。 - メール機能事件: ここも使えなく、
結局PHP側に依存。 - Configのマージ事件: 設定項目がうまく反映されなく、
環境変数を使う。 - DIコンテナが一生変わらない問題: 書き方によってはそういうケースも。
- テーブルの中身消える事件: id指定をしてdeleteしているハズなのに全てのデータが消える事件が。
まとめ
Phalconのいいところは速さです。ドキュメントがまだまだ整備されていないし、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8546.jpg)
前田雅央さん「営業・運用を支える 気付ける 管理画面」
前田雅央さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8552.jpg)
アドネットワークとは、
アドネットワークの管理画面を作る上で、
- コミュニケーションの工夫
- 運用を楽にするため工夫
- 機能開発のデプロイの工夫
- データの変化に気づくための工夫
また、
このような管理画面を長期運用していくと、
- 使われているかわからない機能画面がある。
- 使いづらい画面でも利用者が使いこなしてしまう。
- 何度か作り直したくなる病が発症するが、
諦める。 - 裏機能がいつの間にかできる。
本発表では、
このよう観察力があれば、
運用を楽にするための工夫については、
更新履歴をシンプルに表示することについては、
- 営業:案件の単価がいつの間にか30円になってるんだけど?
- 開発者:え?
いつのまにか? - 営業:変更してないはず。
- 開発者:調べてみますね。
と言ったやり取りを防ぐためにも、
また、
Slackで通知するとまた見やすく便利です。そのために使うmonologが便利だとし、
機能開発のデプロイの工夫については、
管理画面からの通知をメールとSlackに連絡すると、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8547.jpg)
竹澤有貴さん「PHPデプロイツールの世界」
竹澤有貴さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8617.jpg)
デプロイする方法は、
デプロイツールの主なタスクと、そのための3つのツール
竹澤さんは、
- ライブラリのインストール
- フロントエンドタスク実行
- 複数のリモートサーバ
(Vagrant, dockerなど) へ接続 - ローカルタスクの実行
(rsyncなど)
これらをPHPに統一したい、
- Envoy: リモートサーバタスクツールで、
デプロイツールは実装されていない。Laravelの公式に載ってるが、 Laravelと親和性はない。 - Deployer: 完成度が高いリモートサーバタスクツール。
- Rocketeer: Capostranoスタイルで作られていて、
デプロイタスクツールになる。高機能多機能だが、 サービスロケータを多用していてソースコードを読むのは難しい。
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8585.jpg)
タスク実行のアプローチ
3つのツールをタスク実行の観点で紹介しました。
- Envoyでは、
Envoy. blade. phpに実行するタスクを書き、 コンパイルして通常のPHPコードに変換します。symfony/ processによる接続を行い、 タスクごとにリモートサーバに接続します。 - Deployerでは、
deploy. phpに実行するタスクを書き、 それを読み込みます。phpseclib/ phpseclibという使い勝手が良いライブラリを使って接続します。 - Rocketeerでは、
サービスをすべてコンテナに入れてからタスクを実行します。Task Queueは実際は配列になっているなど、 とても複雑になっています。
並列のアプローチ
次に、
- Envoyでは、
それぞれのプロセスがタスクを実行し、 リモートサーバ上にプロセスが立ち上がります。シンプルな並列処理です。 - Deployerは、
ReactPHPを利用した非同期処理です。proc_ openを利用し、 各プロセスがタスクを実行します。 - Rocketeerは、
pcntl_ forkによるプロセスのフォークを行います。各プロセスがタスクを実行します。
タスクのアプローチ
最後に、
- Envoyは記述したタスクのみ実行し、
タスクの前後に処理を行うなどの仕組みはありません。また、 ローカルタスクはタスクごとに記述します。 - Deployer、
Rocketeerは、 タスクの前後の処理は簡単に記述でき、 ローカルタスクについてはDeployerはリモートタスク内で、 Rocketeerはタスクごとに実行可能です。
まとめ
最後に、
各ツールの仕組みを理解しながらPHPのデプロイツールについて知ることができた発表でした。
蒋池東龍さん「PHPあるあるパフォーマンス対決」
蒋池東龍さんは2年前の
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8561.jpg)
数値に関しては、
本発表の目的として、
メソッドチェーン
最初のクイズは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8574.jpg)
結果は、
異次元配列の書き込み
次のクイズは、
結果は、
関数の引数
最後のクイズは、
結果は、
まとめ
最後に、
宣伝として、
河野匡貴さん「10年続いているwebサービスの画像サーバをノーメンテでftpサーバからS3互換のストレージサーバに移行している話」
ネットショップを作りたい人向けのWebサービスであるカラーミーショップが10週年を迎えます。河野匡貴さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8577.jpg)
カラーミーショップはPHPで、
今回移行しようとしているS3互換のストレージサーバとは、
最初に、
- 1. FTPサーバとやり取りしているロジックを1箇所に集約する。
- 2. ロジックを変更してS3互換サーバーに更新がかかるように。
そこで、
- PHP5.
3でテストを動かす - テストコードをPHP5.
3対応 - テストを実行
- ひたすら直す
具体的には、
これにより、
次に、
仕様として、
最後に、
河野さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8575.jpg)
仲裕介さん「WebRTC開発者向けプラットフォーム「SkyWay」の裏側」
NTTコミュニケーションズの仲裕介さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8582.jpg)
本発表では、
WebRTCとは何か
最初に、
SkyWayとは
SkyWayは、
WebRTCはネットワークからアプリケーションレイヤまで幅広い技術が必要となります。ネットワーク側はアプリケーションレイヤの人にはかなり難しく、
SkyWayの裏側: 開発の歴史
仲さんのチームはR&D的な側面も持っていて、
次のような進行で開発が行われたと紹介しました。
- ステップ1
- サーバーは自社クラウドCloudn
- 開発言語はErlang
- JS SDKは peerjsをフォークしてつくった
- Webサイトはgh-pagesで公開.ioのドメインでやったらかっこいいという理由(笑)
- ステップ2
- インフラ構築自動化
- モダン感が出てきた
- 管理画面側のバックエンドはFuelaPHP
- 同じくフロントエンドはSPAな構成に
- FuelでのサーバーサイドレンダリングとSAP側の住み分けを行った
- ステップ3、
4 - 自動化をさらに加速
- TRUNサーバーを追加
- iOS/
AndroidSDKの公開
- ステップ5
- システム冗長化
- Log収集と解析機能
- Golangの導入
最初はなかなかモダンな開発にできなかった開発体制も、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8584.jpg)
まとめ
WebRTCはかなり難しい技術が折り重なっていますが、
ライトニングトーク
恒例のライトニングトークが行われました。
深澤ひかりさん「PHPer女子が語る2015 こんなコードを書くヒトはモテない~コラボ編~」
スタジオ・
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8626.jpg)
岸田健一郎さん「ランダムデータをPHPで作る」
永和システムマネジメントの岸田健一郎さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8633.jpg)
マスクドPHPさん「PHPでRubyを攻略する」
マスクドPHPさんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8641.jpg)
村上俊介さん「良心的にまじめに開発するための心構え」
アライドアーキテクツの村上俊介さんの発表です。上司から
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8650.jpg)
大橋勇希さん「PHPでDIをする」
VOYAGE GROUPの大橋勇希さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8652.jpg)
石川将行さん「サンタクロースを支えるIT技術」
GREEの石川将行さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8656.jpg)
竹澤有貴さん「phpと夫婦生活」
竹澤有貴さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8665.jpg)
赤瀬剛さん「(あなたにもできるかもしれない)ローカルPHPカンファレンスの作り方」
赤瀬剛さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8671.jpg)
小川雄太さん「THE NEW "PERFECT PHP" WILL BE COMING SOON」
小川雄太さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8678.jpg)
筑城裕介さん「小説執筆の現場で活躍するPHP」
コードライフの筑城裕介さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8681.jpg)
青木啓剛さん「蚊に刺されないためのPHP」
青木啓剛さんの会社では休日に入口のドアが閉まっているため、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8693.jpg)
後藤健さん「ISUCON2015 PHPで予選を戦って俺の力量不足で惨敗してきた」
サイバードの後藤健さんは、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8700.jpg)
クロージング
実行委員長の前島有貴さんから閉会の挨拶がありました。今回の参加者数はこれまでにない規模だったため、
そして来年のPHPカンファレンスも開催すること
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8709.jpg)
ブース
スポンサーブースは1Fです。次はお昼時の様子ですが、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8423.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8429.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8432.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8437.jpg)
ジュンク堂書店出張所&サイン会
今回も、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8439.jpg)
書籍のサイン会が行われていました。
『Laravelエキスパート養成読本』
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8409.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8414.jpg)
『PHPはどのように動くのか』
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8419.jpg)
懇親会
同会場4Fにて、
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8716.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8728.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8730.jpg)
![画像](/assets/images/news/report/01/phpcon2015/0001/thumb/TH800_IMG_8743.jpg)
本イベントのレポートは以上になります。