PHPカンファレンス2010 2日目(テックデイ)にも参加してきたのでレポート!

PHPカンファレンス2010、2日目のテックデイにも参加してきました!
(前から2列目でUL20Aでカタカタ文章を入力していたキャイーン天野似が私です・・・)

きちんと清書したほうがいいとは思いますが、情報公開を早めにーという事でメモった内容を公開します。
「情報間違ってる」「資料ココにあるよ」「読みにくい」などありましたら@manji6にでもつぶやいて貰えると頑張って直します・・・!

参加出来なかった方や、いまいち分からなかった方どうぞー!

Contents(目次)

基調講演

  • 講演者:Rasmus Lerdorf
  • 講演資料:http://talks.php.net/show/phpjp10

□はじめに
・そもそもPHPはHTMLができたときにもっとDynamicなウェブページを作りたいという思いで作った
・PHP1.0は現在の作りと全く違う。
・PHP2.0から現在の作りに近くなった
・PHP3.0からクラス志向を導入

□PHP5.3.3
・かなりの高速化、機能改善をしている
・もうPHP4.xを動かす理由はない(今すぐに変えたほうがいい)
・今回のはPHPエンジンのスタック構造を変えている(5.3.3)
・gcc4を活用したのでサイズも小さくなってる
・Windows版PHPは40%の性能改善を行った(Microsoft社ご協力)
・md5()が最大15%高速化
・全体的に5%~10%高速化

□PHP5.3.3の新機能

・Closuresの実装
 →Rasmus氏お気に入り機能

・Namespaceの実装
 →Class定義時のコンストラクタ記法としてClass名のFunctionを書けば動いていたが、
  これはNamespace的におかしいので修正した。(影響範囲5.3.0-5.3.2)

・チェーンメソッド(LSB)
 →説明が難しい

・Garbage Collection(GC)
 →新機能。
 →長いプログラムを動かす場合に必要になる部分が発生したので、追加。
 →GC利用ON:gc_enable();
 →GC利用OFF:gc_disable();
 →デフォルトはON。ただし、クリティカルな処理時にOFFにするなどの利用方法がある。

・nowdoc
 →ヒアドキュメントのラベルをシングルクオーテーションで囲うと、その間の文字列は変数展開されない。

・GOTO
 →すごく毛嫌いする人もいるし、便利だと思う人もいる。
 →むやみに使っちゃ駄目よ
 →制限付きのGOTOであって、本来の利用方法としてはループからの脱出用。

・Ternary Shortcut
 →三項演算子のショートカット

・__DIR__
 →__FILE__ではなく、新しいマジックメソッドとして用意。

・callStatic
 →__callStatic()

・DateInterval/DatePeriod
 →日付や時間の操作を大幅に改善
 →複雑な日付計算をさせられる。(DateInterval())
 →date_create_from_format()を使うと、日付の文字列認識(strtotime())の読み込み形式を指定できる
 →日付の認識時に間違った日付指定をした場合のエラーハンドリングを強化

・SPL
 →いくつか新しい機能を追加
  →GlobIteratorが便利だよ。
  →SplMaxHeapは何らかの基準によって、セットした値の大きい順から値を返す?
  →SplPriorityQueueは何らかの優先順位を指定することによって、セットした値を返す

・FPM(FastCGI Process Manager)
 →これによって、INIファイルの設定も少し変えている

・各php.iniの値をディレクトリ単位で変えるのを今まではApache機能を利用して.htaccessに書いていたが、.user.iniでできるように(ファイル名も変更可能)
・TTL指定によってキャッシュ時間の変更可能

・OpenID(OpenSSL)への対応強化

□質疑応答
・PHP1.0のソースってあるの?
 →僕も持ってないね・・・。一応museum.php.netに置いてあるのが一番古いよ。懐古主義な人は見てみるといいかもね(笑)
・文字コード周りの問題をどうするのか?
 →PHP6によって、ユニコードを全面的に採用しようとしたが、とてもこれは大きな問題があった。
 →あまりにも大きな変化を迅速にやり過ぎた為、Developerが追いつかなかった(急ぎすぎた)
 →ちょっと小さなステップで進めていこうという話になった。最終的にはPHP6で立てた目標になるかと思うが、段階を持っていきたい
 →ということで、まだマルチバイト問題は待っててね。
・新しい日付メソッド周り。毎月の月末を出力することができるか?
 →ちょっとまててくださいね・・・(いきなりソースコードを書き始める(笑))
  →なんか動いたみたいですね!(笑) 書いていたコードは→ strtotime(“last day of the next month”);

フレームワークアップデート ライトニングトーク

Symfony

  • 発表資料:http://www.slideshare.net/fivestar/symfony-updates

・Symfony日本ユーザー会を作りました。(www.symfony.gr.jp)

・1.3は互換性を残したVer
・1.4は互換性を切り捨てたVer

・Symfony2!
 →次世代PHPフレームワークのリーダー
 →名前空間利用(PHP5.3.2以上で動作)
 →HttpKernel
  →HTTP通信の流れを構成
  →流れを作るだけなので、この上に別FWを載せることも可能

・HTTP Accelerator
 →httpKernelをラッピングするCacheクラス
 →レスポンス自体をキャッシュするので80%くらい高速化できる
 →DI Containerを搭載
  →クラスの依存性回避
 →Profiler(
  →webデバッグツールバーをより拡張
   →履歴なども保存し追うことが可能
 →TwigやDoctrine、ZFなどの他FWとの親和性が高いよ
 →まだプレビュー3なので、無い機能など多いよ。使うときは気をつけて!

CakePHP

・PHP5専用になる
・PHPUnitの導入

Zend Framework

  • 発表資料:http://www.slideshare.net/sasezaki/zf-update2010

□CodeIgniter

  • 発表資料:http://codeigniter.jp/archives/196

・世界第2位のフレームワーク(Google Trend)
 →乗るしかない、このビッグウェーブに

・seezooがCodeIgnitorベースのCMS

・特徴
 →軽い・早い
 →習得が簡単
  →規約少ない
 →拡張が簡単
  →コア部分でも書き換えちゃってOK

・現在は2.0を開発中
 →完成したらリリースというスタンスなのでリリース日未定
 →Driverクラスを追加
 →PHP4廃止

Agavi

・Mojaviからの発展形
・Symfonyの兄貴(笑)
・テンプレートエンジンやORMを選ばない
・最新版は・・・
 →IISやSQLServerへのサポートをしている
 →XSLTレンダラサポート
 →例外処理の連結ができる

・次のメジャーアップデートは・・・
 →認証レイヤー追加
 →HipHop-PHPのサポート
 →ストレージサブシステム(KVSの統一インタフェイス)

Ethna

・2.5をもってPHP4やPHP5.2を切ることに
・3.0はNamespaceも使った本格的なFWへ

rhaco

・rhacoまではPHP4対応で、Webからインストールできた・・・。
 →rhaco2からはもうできない。
・Object.phpが特徴的

Lithium

・PHP5.3以降専用のFWとして1年前から制作。
・アスペクト指向を取り入れている

HiPHoP for PHP

  • 講演者:Facebook, Inc. Scott MacVicar

Facebookで何をしている?(Facebookの紹介)

・毎日80億分の時間をユーザーがFacebookに費やしている
・毎週50億のコンテンツを共有
・毎月30億の写真がアップロード
・100万のデベロッパーがコンテンツプラットホームにアクセス
 →これがスケーリング問題へ

・従来のアプリケーションは、1ユーザーに対して1データ領域を確保すればよい
・Facebookの場合、従来型の作り方をするとユーザー分の領域を用意擦る必要がある
 →ただし、それは相互関係が存在するので(ユーザー同士の)複雑なリンク構造になり、簡単にデータを保存できない
  (また、高速に取り出せるようにする必要がある)

PHPのスケーリング問題

問題1:CPU利用
 ・PHPは最もCPUを利用する言語である

問題2:メモリ使用率
 ・PHPはメモリを多く利用する

問題3:PHPコードの再利用

問題4:PHPのExtensionを書くのが大変

→Facebookもこの問題はかなり重要なもので解決すべき問題である

HipHop for php

・スケーリング問題を解決するひとつの解

・HipHop-PHPとは
 →PHPのコードをC++コードに自動変換し、それをコンパイルする技術

・仕組み
 →コードのC++変換
  →かなりのコード最適化をここで行うことができる
  →静的な解析(ファイル位置の把握)
  →型推定(すべての変数型の判定)
  →コード生成(PHPのソースコードを変換したC++コードがここで生成される)
 →ランタイム
  →PHP自身のFunctionやClassが含まれているもの(いわゆるC++で書かれたPHPライブラリ)

(注釈:C++変換部分)
・PHPファイルのパース
 →静的解析
  →Pre-Optimizer(前コード解析)
   →変数型判定
    →Post-Optimizer(後コード解析)
     →Code Generator
      →g++

・HipHop-PHPの対応に関して
 →PHPのほとんどの関数はOK
 →eval()やcreate_function()は非対応
 →preg_replaceで/eを使うものも非対応
 →Functionの定義順番に依存するようなコードも非対応

・HPHPi
 →HipHop-PHPのインタプリタ
 →これはeval()も対応

・Webアプリケーションサーバーは既に用意してあるので、Apacheを使う必要は無い
 →ひとつのプロセスとして実行される

・オープンソースとして2010年2月に公開した
・オープンソース版のHipHop-PHPは多くのPHPエクステンションに対応

・fb_parallel_query()などのFacebook独自のExtensionも対応してるよ
 →fb_parallel_query()はMySQLのクエリを非同期に同時に実行する

・実際にハンズオンしてみた・・・
 →コンパイルには確かに時間がかかるが、実行速度は4倍程度高速化!
  →ただし、実際にはDBアクセス等の部分があるので、2倍程度になる。

質疑応答

・どうしてHipHopという名前なの?
 →最初はHPHPという名前だったが、読み方を考えると(ヒップホップ)になるので
・どうしてC++にしたの?
 →言語の安定性を考慮して
・90%のトラフィックをHipHopでさばいてるとの事ですがを適用させるために、既存のコードへどんな書き換えをした?
 →開発者にhiphopの利用を強制しました(笑)
・Webサーバーの高速化ができるとの事ですが、サーバー数の削減や効率化にも寄与できる?
 →勿論その効果が期待できるよ。
・OSサポート部分について。FedoraとCentのサポートがされているが、最新の状況は?
 →GentooとCent、FreeBSDの64bit版までサポートしているよ
・HipHopを使うにあたり、PHPソースコード自体もムダのない綺麗なコードにする必要はある?
 →勿論そのとおり。HipHop-PHPを作った背景として、PHPコードを極限まで綺麗にした結果なので・・・
 →でも一般的に使うなら問題ないと思うよ。[Writer追記:C++最適化されるからかな?]
・Closuresにも未対応?
 →Closuresはコンパイル時に展開できるので、サポートできてるよ。

Microsoft loves PHP – 2nd stage – WebMatrix登場

  • 講演者:マイクロソフト株式会社 エヴァンジェリスト 奥主 洋さん、物江 修さん
  • 資料:http://blogs.technet.com/b/hirookun/archive/2010/09/25/3357761.aspx

WebMatrix

 →WebPI+Webサイト作成支援
 →簡易Webサーバー+テキストエディタ+DBのGUIクライアントツール+SEOレポートツール
 →[私感:エディタは微妙ですが、DB閲覧ツールはかなり良く出来ている!]

・SEOレポートツール
 →H1が無いなどの詳しい解析結果を返す。基礎的なSEOレポートだけかなー。文字数とか文字位置まではなさそうだ。

文字コードに起因する脆弱性とその対策

  • 講演者:徳丸 浩さん

・文字コードに起因する脆弱性とは
 →正しいセキュリティ対策をしているかに見える文字コードに置いて、文字コードの取り扱いが原因となる脆弱性のこと

□文字コード超入門

・文字コードとは何か?
 →文字集合+文字エンコーディング
  →文字集合:文字に符号を付けたもの
   →ASCII、ISO-8859-1、JIS X 0201/0208、Unicodeなど
  →文字エンコーディング:文字集合を使って文字をバイト列として表現する方式
   →Shift-JIS、EUC-JP、UTF-8など

・文字集合の変更
 →文字集合を変えると1対1の関係ではない文字の場合、文字化けの原因となる。
  →UnicodeからMS標準キャラクタに変える等

・0x5Cと0xA5
 →文字集合によって、\とバックスラッシュに違いがでる

・Shift-JIS
 →1バイトと2バイト混在した文字コード。
 →1バイト目が特定値の場合、2バイトになる(→これによって、2バイト文字の2バイト目だけ取り出すと変な文字になる)

・UTF-8
 →1~4バイトを使って1文字を表現。
 →バイトの重なりは全く無いので、文字コード問題は発生しない。

・EUC-JP
 →(聞き取れず・・・)

【問題1:半端な先行バイトによるXSS】
 →2バイト文字の1バイトだけ先に行ってしまうと、文字を誤認識する(SJIS、EUC-JPで発生)
  →PHP5.3.1以降では問題ない。
  →htmlspacialcharacters()の第3引数を使う

【問題2:5C問題によるSQLインジェクション】
Shift-JIS2バイト目のバイトが\に見えてしまうのを利用。さらにPDO処理がかかった結果、
文字コードチェック等をしていても回避してSQLインジェクションができる。

例:「ソ」などを利用

対応:Shift-JISを使わない。

【問題3:EUCJP問題】
EUCJPと書いてしまうと、IEは判断できず渡された文字情報を元に文字コードを特定してしまう。
 →EUC-JPと書けばOK!(typo注意)

まとめ(以下のようなパターンでXSSは発生する)
 →文字エンコーディングとして不正な場合
 →文字エンコーディングとして不正ではないがマルチバイト対応が不十分
 →文字集合の変更が原因の場合

・文字エンコーディングの妥当性を必ずチェックする!
・最新のPHPを使う
・文字エンコーディングの指定はサボらない!

・とりあえずmb_convert_encoding($str,”utf-8″,”utf-8″)しておけばある程度安全だよ・・・

・HTTPレスポンスにはブラウザが認識出来るエンコーディングを入れる(Shift_JIS、EUC-JP、UTF-8と書くこと!コレ以外は不明になります。)
・最も確実なのは、入り口→内部→出口すべてのエンコードを統一し、「文字集合を変更しない」事!

PHPストリーム解説

  • hnwさん

ストリームとは?
 →外部データに対するI/Oを透過的に扱える
  →ローカルファイル、圧縮ファイル、リモートファイル、標準入出力、メモリ

□ワード解説

「ストリーム」
→標準入出力のようなもの

「ストリームラッパー」
→UNIXコマンドのようなもの
ファイルによってコマンドが違うけど、結果は同じように(処理のラッピングをしている)
例:file://、compress.bzip2://など

「ストリームコンテキスト」
コマンドラインオプション的なもの。ファイルによって色々コンテキスト変わるよ

「ストリームフィルタ」
→UNIXコマンドラインで言うと、pipe & filter
受け取ったファイルを元に別の処理を実行させたりする

□ストリームラッパー
・fopen関数の第1引数にURLが書ける
 →URLのスキーム部でファイルの形式を指定できる
  →file://やcompress.bzip2://など
・全ファイル関数で使える
・よみっき両方できるとは限らない(ファイルなら両方可能だが、HTTPだと書けないなど)

→すべてfopen()で統一が可能!

□ストリームコンテキスト
・ストリームラッパーに対するオプション指定
 →stream_context_create()で作成 or fopen()の第4引数で指定
・HTTPコンテキストオプション例
 →method(get or post)
 →header(リクエストヘッダの指定)
 →proxy(proxyサーバ指定)
 などなど

→cURLなしでも色々できるよ!

□ストリームフィルタ
・ストリームのデータを加工できる
・入力出力の両方または一方
・stream_filter_append(ストリーム,フィルタ名)を利用
・組み込みフィルタ例
 →convert.base64-decode
 →string.strip_tags
 →ユーザー定義も可能

→関数に渡す前にストリームのデータを加工できる!

□Stream_Filter_Mbsting

・ストリームで受け取ったデータをFilter処理で文字エンコード処理できる

新潟アクセス修飾子のご提案

  • 講演者:rtiさん
  • 講演資料:http://prezi.com/2r6wmrriyeqb/niigata/

・niigataアクセス修飾子=読めるけど書けない=新潟!
説明があまりにも複雑なので(ただし楽しい)資料を参照!

発表時に使われたツールなど

個人的に知らなかったツールだったり、便利なものが出てきたので、まとめてみたいと思います。

ZoomIt

  • URL:http://technet.microsoft.com/ja-jp/sysinternals/bb897434.aspx
  • 対応OS:Win(WindowsXP以上)

プレゼン中に一気に拡大したり注釈ができるツール。
これはソースコード関連のプレゼン時にかなり便利。

Prezi

  • URL:
  • 日本語説明:http://prezi.com/bh2ik-rgdzsp/prezi/

Web上でぐりぐり動かしながらプレゼンできるツール。パワポに飽きたらこれでも。
ただ、日本語にちょこっと弱いのと、つくるのに癖があるのでそれに注意。
(新潟アクセス修飾子のご提案で利用されています)

参加した感想

実はPHPカンファレンスは参加初めてで、2日通して聞いた感想としては「エンジニアでよかった!」と思えるぐらい楽しい内容でした。
発表者のようなスキルは全然無いので、羨ましいなぁと思いつつ自分ができることとしてこの記事をアップさせてもらいます。

運営の方々の苦労も大変だったと思います。(特に外国の方をお招きしていたり、会場設営に運営はてんやわんやだと・・・)
来年も参加しますよー!(運営側とかもやってみたいとは思いますが・・・)


Comments

“PHPカンファレンス2010 2日目(テックデイ)にも参加してきたのでレポート!” への3件のフィードバック

  1. 分かりやすくまとめていただいて、大変参考になりました ;-)

  2. >satoruyoshidaさん
    いえいえ、聞いていた内容走り書きのままアップしてしまったので誤字とか多いはず・・・(汗
    参考になってよかったです!

  3. […] « PHPカンファレンス2010 2日目(テックデイ)にも参加してきたのでレポート!    おすすめwordpressテーマ・プラグイン » […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です