SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
PHPで時間旅行をする方法
                               塙 与志夫 (hnw)


              Symfony勉強会#6 2012/06/30 発表資料




12年6月30日土曜日
自己紹介
              • hnw
               • bugs.php.netでバグ報告18件




12年6月30日土曜日
自己紹介
              • hnw
               • bugs.php.netでバグ報告18件
               • 好きな物:バグ, カレー
               • 好きな境界値:2の53乗+1


12年6月30日土曜日
PHPで時間旅行…?
              • ついにPHPでネコ型ロボットが…




12年6月30日土曜日
PHPで時間旅行…?
              • ついにPHPでネコ型ロボットが…
               • 作れません




12年6月30日土曜日
問題意識
              • 時刻に関わるテストをどう実現する?
               • 例:年またぎテスト
              • dateなど標準関数を使われると痛い
               • 「時間旅行」がしたいなあ…


12年6月30日土曜日
それRubyならできるよ!

              • Rubygem Timecop
               • https://github.com/jtrupiano/timecop
              • Ruby組み込み実装をRubyで上書き!
               • Time, Date, DateTimeの3クラスを
                 自前実装でラップしている



12年6月30日土曜日
いわゆる動的言語の特徴

              • 組み込み関数やクラスも上書き可能
               • Ruby、Python、JavaScriptなど




12年6月30日土曜日
PHPだとできない…




12年6月30日土曜日
それPHP拡張でできるよ!

              • 拡張ならPHP関数を上書きできる
               • 関数テーブルを書き換える
               • 例: mbstringの関数オーバーロード
              • 組み込みクラスも書き換え可能


12年6月30日土曜日
作りました
              • php-timecop
               • https://github.com/hnw/php-timecop
              • Cで書かれたPHP拡張
              • 日付関数とDateTimeクラスを置き換え


12年6月30日土曜日
実装の詳細(1)
              • 時間を止めるPHP関数
               • 現在時刻が指定された時刻になる
              • 時間移動するPHP関数
               • 現在時刻が過去や未来になり、
                そこから時間が進みだす



12年6月30日土曜日
実装の詳細(2)
              • 自前実装で差し替え
               • time関数
              • 引数のデフォルト値を差し替え
               • date関数の第二引数など
               • DateTimeのコンストラクタ

12年6月30日土曜日
サンプルコード




12年6月30日土曜日
現状
              • アルファ版
              • CLI版でテストコードは動いてる
              • SAPI版は動くけど怪しい
              • コンパイルも1環境しか試してない
              →Pull Requestかレビュアー募集中

12年6月30日土曜日
利用シーン
              • 時刻に依存するような自動テスト
              • 時刻に依存するようなテンプレートの
               表示確認




12年6月30日土曜日
メリット
              • 既存コードや外部ライブラリなどに
               一律に適用できる

              • 機能が少ないのでrunkit拡張より
               安心感がある(ような気がする)




12年6月30日土曜日
まとめ

         • 他の言語がうらやましい
            • それPHP拡張でできるよ!
         • php-timecop作りました!
            • 安定したらテストで活躍するはず
            • 要望・アイデアなどお待ちしてます
12年6月30日土曜日
ご清聴
               ありがとう
              ございました

12年6月30日土曜日

Weitere ähnliche Inhalte

Ähnlich wie PHPで時間旅行をする方法

xUnitハンズオン第1回テキスト
xUnitハンズオン第1回テキストxUnitハンズオン第1回テキスト
xUnitハンズオン第1回テキストmizuky fujitani
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data scienceTakami Sato
 
xUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキストxUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキストmizuky fujitani
 
xUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキストxUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキストmizuky fujitani
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Developmentaktsk
 
Pug(Jade)を使って コンテンツ書き出しの 時短をしよう
Pug(Jade)を使って コンテンツ書き出しの 時短をしようPug(Jade)を使って コンテンツ書き出しの 時短をしよう
Pug(Jade)を使って コンテンツ書き出しの 時短をしようToshimichi Suekane
 
師弟登壇・新米サムライの集い 2013
師弟登壇・新米サムライの集い 2013 師弟登壇・新米サムライの集い 2013
師弟登壇・新米サムライの集い 2013 hiboma
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情Junichi Ishida
 
gRPCをちょこっと調べた話
gRPCをちょこっと調べた話gRPCをちょこっと調べた話
gRPCをちょこっと調べた話Shuzo Kashihara
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクトMoriyoshi Koizumi
 
第1回Hadoop関西勉強会参加レポート
第1回Hadoop関西勉強会参加レポート第1回Hadoop関西勉強会参加レポート
第1回Hadoop関西勉強会参加レポートYou&I
 
CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話memememomo
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺Shogo Kawahara
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識Katsuhiro Morishita
 
Fuel phpをcomposerに本気で対応させた時の話
Fuel phpをcomposerに本気で対応させた時の話Fuel phpをcomposerに本気で対応させた時の話
Fuel phpをcomposerに本気で対応させた時の話Keishi Hosoba
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1Nishida Kansuke
 
Cloudn PaaSチームのChatOps実践
Cloudn PaaSチームのChatOps実践Cloudn PaaSチームのChatOps実践
Cloudn PaaSチームのChatOps実践Kazuto Kusama
 
PowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまでPowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまでKazuhiro Matsushima
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームmarsee101
 

Ähnlich wie PHPで時間旅行をする方法 (20)

xUnitハンズオン第1回テキスト
xUnitハンズオン第1回テキストxUnitハンズオン第1回テキスト
xUnitハンズオン第1回テキスト
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data science
 
xUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキストxUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキスト
 
xUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキストxUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキスト
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Development
 
Pug(Jade)を使って コンテンツ書き出しの 時短をしよう
Pug(Jade)を使って コンテンツ書き出しの 時短をしようPug(Jade)を使って コンテンツ書き出しの 時短をしよう
Pug(Jade)を使って コンテンツ書き出しの 時短をしよう
 
師弟登壇・新米サムライの集い 2013
師弟登壇・新米サムライの集い 2013 師弟登壇・新米サムライの集い 2013
師弟登壇・新米サムライの集い 2013
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
 
gRPCをちょこっと調べた話
gRPCをちょこっと調べた話gRPCをちょこっと調べた話
gRPCをちょこっと調べた話
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクト
 
第1回Hadoop関西勉強会参加レポート
第1回Hadoop関西勉強会参加レポート第1回Hadoop関西勉強会参加レポート
第1回Hadoop関西勉強会参加レポート
 
CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
 
Fuel phpをcomposerに本気で対応させた時の話
Fuel phpをcomposerに本気で対応させた時の話Fuel phpをcomposerに本気で対応させた時の話
Fuel phpをcomposerに本気で対応させた時の話
 
Hadoop事始め
Hadoop事始めHadoop事始め
Hadoop事始め
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1
 
Cloudn PaaSチームのChatOps実践
Cloudn PaaSチームのChatOps実践Cloudn PaaSチームのChatOps実践
Cloudn PaaSチームのChatOps実践
 
PowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまでPowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまで
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
 

Mehr von Yoshio Hanawa

自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみたYoshio Hanawa
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装Yoshio Hanawa
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装Yoshio Hanawa
 
ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込Yoshio Hanawa
 
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」Yoshio Hanawa
 
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話Yoshio Hanawa
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことYoshio Hanawa
 
GitHubからお金をもらった話
GitHubからお金をもらった話GitHubからお金をもらった話
GitHubからお金をもらった話Yoshio Hanawa
 
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べたiOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べたYoshio Hanawa
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係Yoshio Hanawa
 
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそうYoshio Hanawa
 
Laungage Update PHP編
Laungage Update PHP編Laungage Update PHP編
Laungage Update PHP編Yoshio Hanawa
 
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作るPHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作るYoshio Hanawa
 
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話Yoshio Hanawa
 
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説するphp-buildがいかに便利かを力説する
php-buildがいかに便利かを力説するYoshio Hanawa
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情PHP7の拡張モジュール事情
PHP7の拡張モジュール事情Yoshio Hanawa
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックYoshio Hanawa
 
PHPの正規表現と最長一致
PHPの正規表現と最長一致PHPの正規表現と最長一致
PHPの正規表現と最長一致Yoshio Hanawa
 
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントPHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントYoshio Hanawa
 

Mehr von Yoshio Hanawa (20)

自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装
 
ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込
 
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」
 
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
 
GitHubからお金をもらった話
GitHubからお金をもらった話GitHubからお金をもらった話
GitHubからお金をもらった話
 
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べたiOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
 
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう
 
Laungage Update PHP編
Laungage Update PHP編Laungage Update PHP編
Laungage Update PHP編
 
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作るPHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
 
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
 
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説するphp-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
 
PHPの正規表現と最長一致
PHPの正規表現と最長一致PHPの正規表現と最長一致
PHPの正規表現と最長一致
 
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントPHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
 

PHPで時間旅行をする方法

  • 1. PHPで時間旅行をする方法 塙 与志夫 (hnw) Symfony勉強会#6 2012/06/30 発表資料 12年6月30日土曜日
  • 2. 自己紹介 • hnw • bugs.php.netでバグ報告18件 12年6月30日土曜日
  • 3. 自己紹介 • hnw • bugs.php.netでバグ報告18件 • 好きな物:バグ, カレー • 好きな境界値:2の53乗+1 12年6月30日土曜日
  • 4. PHPで時間旅行…? • ついにPHPでネコ型ロボットが… 12年6月30日土曜日
  • 5. PHPで時間旅行…? • ついにPHPでネコ型ロボットが… • 作れません 12年6月30日土曜日
  • 6. 問題意識 • 時刻に関わるテストをどう実現する? • 例:年またぎテスト • dateなど標準関数を使われると痛い • 「時間旅行」がしたいなあ… 12年6月30日土曜日
  • 7. それRubyならできるよ! • Rubygem Timecop • https://github.com/jtrupiano/timecop • Ruby組み込み実装をRubyで上書き! • Time, Date, DateTimeの3クラスを 自前実装でラップしている 12年6月30日土曜日
  • 8. いわゆる動的言語の特徴 • 組み込み関数やクラスも上書き可能 • Ruby、Python、JavaScriptなど 12年6月30日土曜日
  • 10. それPHP拡張でできるよ! • 拡張ならPHP関数を上書きできる • 関数テーブルを書き換える • 例: mbstringの関数オーバーロード • 組み込みクラスも書き換え可能 12年6月30日土曜日
  • 11. 作りました • php-timecop • https://github.com/hnw/php-timecop • Cで書かれたPHP拡張 • 日付関数とDateTimeクラスを置き換え 12年6月30日土曜日
  • 12. 実装の詳細(1) • 時間を止めるPHP関数 • 現在時刻が指定された時刻になる • 時間移動するPHP関数 • 現在時刻が過去や未来になり、 そこから時間が進みだす 12年6月30日土曜日
  • 13. 実装の詳細(2) • 自前実装で差し替え • time関数 • 引数のデフォルト値を差し替え • date関数の第二引数など • DateTimeのコンストラクタ 12年6月30日土曜日
  • 15. 現状 • アルファ版 • CLI版でテストコードは動いてる • SAPI版は動くけど怪しい • コンパイルも1環境しか試してない →Pull Requestかレビュアー募集中 12年6月30日土曜日
  • 16. 利用シーン • 時刻に依存するような自動テスト • 時刻に依存するようなテンプレートの 表示確認 12年6月30日土曜日
  • 17. メリット • 既存コードや外部ライブラリなどに 一律に適用できる • 機能が少ないのでrunkit拡張より 安心感がある(ような気がする) 12年6月30日土曜日
  • 18. まとめ • 他の言語がうらやましい • それPHP拡張でできるよ! • php-timecop作りました! • 安定したらテストで活躍するはず • 要望・アイデアなどお待ちしてます 12年6月30日土曜日
  • 19. ご清聴 ありがとう ございました 12年6月30日土曜日