SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
PHP と JavaScript の噺
@ooharabucyou
第76回 PHP勉強会
わたしについて
● PHP歴 = 7年, エンジニア歴 = 6年
● Rakuten, inc. なんと新卒4年目になる
● 最近のお仕事
○ node.js でバックエンドなシステムづくり
■ BaaS Team, Web Sevice Platform Group
○ Java & Groovy でバックエンドなシステムづくり
○ http://webservice.rakuten.co.jp 楽天API 運用・開発・
宣伝何でもやる課
○ PHPはちょっと見るくらい
■ 一番最近やったPHP仕事は Symfony2.0 から 2.3
へのバージョンアップ
最近
● サーバサイドでも JavaScript 書く人になった
今日のテーマ
JavaScript
X
PHP
JavaScript X PHP にまつわる噺 3本
1. JavaScript 上で PHP(的)な関数を走らせたい
2. JavaScript 上で PHP(っぽいもの) を走らせた
い
3. PHP 上で JavaScript を走らせたい
まってくれ
そんなにバカ話じゃない
● その1 は実用的ですよ
その1: JavaScript で PHP(的)な関数を
使いたい
● PHPer のみなさん! こんな経験ありませんか?
○ ようし! クライアントサイド/サーバサイド な JavaScript
書くぞーー
○ あれ、PHPで便利にできるアレ、JavaScript でどうやる
んだ???
○ strtotime(), array_*(), rawurlencode(),
htmlspecialchars() もなしにワシはどう開発すればいい
んじゃ。
array_merge() っぽいことを
js でやるには
var merge = function(obj1, obj2) {
obj2 = obj2 || {};
for (var name in obj2) {
obj1[name] = obj2;
}
};
// なんか関数をつくらなきゃいけない
// PHP のように渡した値が変更されないようにするには、オブ
ジェクトのclone を実装する必要がある
strtotime() っぽいことを
js でやるには
var strtotime = function(str) {
var date = new Date(str);
return Math.round(date.getTime() / 1000);
};
// これは超適当実装です。一部ブラウザは対応し
ないかも
// ほかにも +2days とか実装したいとか思ったらよ
り至難の業
もちろん便利なライブラリはあるけど
● 例えば
○ jQuery な機能を駆使
○ underscore.js (配列のマージとか、フィルタなど便利な
機能を提供)
○ Moment.js (時間関連の処理を強力にサポート)
慣れ親しんだ
PHPの関数を使いたい
そこで便利なのが php.js
● http://phpjs.org/
● PHPのあの関数や、例の関数をJavaScriptの
世界で再現!
● node.js 使いは npm install phpjs で、使えるよ!
● ブラウザでも動くよ。
ブラウザ上での使い方
● https://github.com/kvz/phpjs から clone
● functions/ 下に関数ごとに js が入っているので <script> で
ロードする
● あとは、そのまま使える
<script src=”
phpjs/functions/array/array_merge.js”
></script>
<script>
array_merge([“Hello”], [“World”]); //
[“Hello”, “World”]
</script>
node.js 上での使い方
● npm install phpjs でインストール
● あとは以下のように使える。
var php = require(‘phpjs’);
php.array_merge([“Hello”],
[“World”]); // [“Hello”, “World”]
例の array_merge() も
● 元のオブジェクト非破壊
● 第3引数以上も指定可能
var php = require('phpjs')
, obj = { foo: ‘bar’ };
php.array_merge(obj, {
hoge: ‘fuga’
}); // { foo: ‘bar’, hoge: ‘fuga’}
あの strtotime() が!
● 便利だけど再現性はまだまだ?
● 元祖 strtotime() すごいよ!
// strtotime & date
var t = php.strtotime('+7 days');
php.date('Y-m-d', t); // 今日から7日後の日付
t = php.strtotime('2014-01-01 10:00:00');
php.date('Y-m-d H:i:s', t); // 2014-01-01 10:00:00
t = php.strtotime(‘2014-01-01 10:00:00 +7 days’);
php.date(‘Y-m-d’, t); // 今から7日後の日付 (本家は 2014-01-08を示す)
いるのか? echo()
● いるのか? と思ったけど、環境ごとの出力の仕
方などを担っている模様。
● 結構、重厚たるコード量
○ http://phpjs.org/functions/echo/
● node.js なら console.log() 、ブラウザなら
DOM要素追加
● 出力のある、もろもろの関数は、この関数に依
存している。
var_dump() だって!!
● 型も表示してくれるぞ!
● (ブラウザの場合 echo.js のロード必須)
● なんだ。。 PHP はやっぱり JSON でできていた
んじゃないか? そうに違いない。(PHP勉強会72
回 中野さんの JSON Schema の説明参照
http://www.slideshare.net/hinakano/json-
schema)
var_dump() さん ひょっとして console.log() さ
んより便利なんじゃないか
● 使いどころ間違えなきゃ便利なんじゃないか。
● 関数の中身も toString() しておっぴろげてくれ
るぞ!!
○ なお、本家PHPで同じようなことやると Closure#1 の
ようにしか表示されない
● なお、 node.js の util.inspect() は、そ
のままだと [Function] としか出してくれない模
様。
urlencode() だってPHP基準?
● 闇PHP勉強会 の @co3k さんの資料参照
(http://www.slideshare.net/ebihara/php-
32340906)
● php.js の urlencode() は空白は + に置き換
え、~ はエンコードしない模様。
● rawurlencode() もあるよ。
file_get_contents() はデフォルトで
“同期処理” でコンテンツ取得
● file_get_contents(“test”); とやると、
XHR (XmlHttpRequest) でのコンテンツ取得を
行う。
● デフォルトでは同期処理。
○ つまり、これ使うと一旦処理がとまるよ!
● 非同期処理を 第3引数 context で行うことがで
きる。
○ 本家は、header 周りとかの制御につかったりする。
なお非同期 file_get_contentns()
file_get_contents('data', false, {
stream_params: {
'phpjs.async': true,
notification: function(code, severity, msg, st, bt) {
if (code >= 8) {
var_dump(this.responseText);
}
}
}
});
// こんなの PHP じゃないわ!!!!
// file_get_contents() がついた JavaScript よ!!!!
// だったら(コールバック関数を) 呼べばいいだろ!!
(注意?) implode() は歴史的事情知らず
● さすがに例の順序逆も受け付ける仕様はは
いってなかった。
● 実装面倒だもんね。しょうがないよね。
php.implode(',', [‘Hello’, 'world']); // Hello,world
php.implode([‘Hello’, ‘world’], ‘,’); // ,
それでも物足りないあなた
● php.js は 325 の関数に対応
○ 本家には 3,000 以上あるってよ。へー。
● でも、そもそも JavaScript なんて書きたくな
い! とにかくPHP が書きたいんだ! という人
(中毒者?) もいるかもしれない。
● そこで、また別の php.js を紹介
その2: php.js - PHP VM with
JavaScript
● そもそも JavaScript 上で PHP を実行してしま
えばいいんじゃないかという発想のモノ
● ブラウザで動くぞ!!!
● class も magic method もちゃんと動くぞ!!
● 関数も一部はサポートしている模様。
● http://phpjs.hertzen.com/
○ (ブラウザでデモができます)
ブラウザで php.js VM を動かす
<script src="PHP.js"></script>
<script src="adapters/filesystem/xhr.js"></script>
<!-- PHP.js と filesystem 用の adapter をロード -->
<script>
var opts = {};
opts.filesystem = new PHP.Adapters.XHRFileSystem();
var path = window.location.pathname;
opts.SERVER = {
SCRIPT_FILENAME: path.substring(0, path.length)
};
var engine = new PHP(‘<?php echo “Hello”;’, opts);
console.log(engine);
console.log(engine.vm.OUTPUT_BUFFER);
</script>
node.js 上で php.js VM を動かす
var fs = require('fs')
,content = fs.readFileSync('php.js', 'utf8') ;
eval(content);
var opts = {
filesystem: fs,
SERVER: {
SCRIPT_FILENAME: 'file’
}
};
var engine = new PHP('<?php echo "sample";', opts);
console.log(engine.vm.OUTPUT_BUFFER);
php.js VM の不思議
● php_logo_guid() が実装されている
○ ロゴの guid を取得できるよ!
■ で、だからどうした。。
■ ちなみに、隠し関数(?)の
php_egg_logo_guid() もあるよ!
○ 【悲報】なお、本家側では、この関数は PHP5.5 で削除
された模様
その3: PHP上でJavaScript を走らせる
● 逆に PHP上で V8 JavaScript Engine を利用し
て JavaScript を実行することもできる。
● http://www.php.net/manual/ja/book.v8js.php
● 使い道思いつかない!
インストール方法 (Ubuntu)
sudo apt-get install libv8js-dev
# まだbeta なのだよ
pecl install v8js-0.1.5
# アレ登録
sudo echo “extension=v8js.so” >
/etc/php5/conf.d/v8js.ini
コード
<?php
$v8 = new V8Js();
$JS = <<<JS
var hello = function() {
return "Hello!";
};
hello();
JS;
try {
var_dump($v8->executeString($JS, 'basic.js'));
} catch (V8JsException $e) {
var_dump($e);
}
まとめ
● あのPHPの関数が JavaScript でほしい / どう
実装するのか知りたい
○ php.js (http://phpjs.org/)
● そもそもPHPの構文をクライアントサイド上で動
かしたい
○ php.js VM (http://phpjs.hertzen.com/)
● JavaScript をPHP上で動かしたい (!?)
○ v8js module
○ だれか、これだ!っていう使い道を教えてくれ

Contenu connexe

Tendances

今日から始めるLaravel
今日から始めるLaravel今日から始めるLaravel
今日から始めるLaravel
Masaru Matsuo
 
Cake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテストCake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテスト
慶信 若松
 
TravisCI Nightに行ってきたので情報展開
TravisCI Nightに行ってきたので情報展開TravisCI Nightに行ってきたので情報展開
TravisCI Nightに行ってきたので情報展開
Makoto Abe
 

Tendances (20)

Php非同期の技法
Php非同期の技法Php非同期の技法
Php非同期の技法
 
Laravel 5.1 LTSでサービスを作る
Laravel 5.1 LTSでサービスを作るLaravel 5.1 LTSでサービスを作る
Laravel 5.1 LTSでサービスを作る
 
今日から始めるLaravel
今日から始めるLaravel今日から始めるLaravel
今日から始めるLaravel
 
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事情
 
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
 
php開発で使うタスクランナー gulp
php開発で使うタスクランナー gulpphp開発で使うタスクランナー gulp
php開発で使うタスクランナー gulp
 
Cake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテストCake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテスト
 
Behat Driven Development
Behat Driven DevelopmentBehat Driven Development
Behat Driven Development
 
なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇
 
apachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったapachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin Serverっぽいやつをつくった
 
フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩
 
5分でわかる静的解析入門
5分でわかる静的解析入門5分でわかる静的解析入門
5分でわかる静的解析入門
 
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
 
Laravel_オープンソースカンファレンスhokkaido_JP_2014
Laravel_オープンソースカンファレンスhokkaido_JP_2014Laravel_オープンソースカンファレンスhokkaido_JP_2014
Laravel_オープンソースカンファレンスhokkaido_JP_2014
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
 
はじめてLaravelさわった 第86回php勉強会
はじめてLaravelさわった 第86回php勉強会はじめてLaravelさわった 第86回php勉強会
はじめてLaravelさわった 第86回php勉強会
 
TravisCI Nightに行ってきたので情報展開
TravisCI Nightに行ってきたので情報展開TravisCI Nightに行ってきたので情報展開
TravisCI Nightに行ってきたので情報展開
 
Jenkins tips 20161014
Jenkins tips 20161014Jenkins tips 20161014
Jenkins tips 20161014
 

Similaire à PHPとJavaScriptの噺

次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
shoma h
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
sasezaki
 
php-timecopを実戦投入してみた
php-timecopを実戦投入してみたphp-timecopを実戦投入してみた
php-timecopを実戦投入してみた
Yoshio Hanawa
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
kimukou_26 Kimukou
 
PHPエクステンションの開発tips
PHPエクステンションの開発tipsPHPエクステンションの開発tips
PHPエクステンションの開発tips
Yoshio Hanawa
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクト
Moriyoshi Koizumi
 
PHPカンファレンス北海道 php技術者認定上級試験を受けてみた
PHPカンファレンス北海道 php技術者認定上級試験を受けてみたPHPカンファレンス北海道 php技術者認定上級試験を受けてみた
PHPカンファレンス北海道 php技術者認定上級試験を受けてみた
Fumito Mizuno
 

Similaire à PHPとJavaScriptの噺 (20)

PHP AV BINDING
PHP AV BINDINGPHP AV BINDING
PHP AV BINDING
 
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
 
php-timecopを実戦投入してみた
php-timecopを実戦投入してみたphp-timecopを実戦投入してみた
php-timecopを実戦投入してみた
 
Phpのレガシーコードをrubyで焼き変えてみた
Phpのレガシーコードをrubyで焼き変えてみたPhpのレガシーコードをrubyで焼き変えてみた
Phpのレガシーコードをrubyで焼き変えてみた
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 
PHPエクステンションの開発tips
PHPエクステンションの開発tipsPHPエクステンションの開発tips
PHPエクステンションの開発tips
 
20090801phpstudy Sanemat
20090801phpstudy Sanemat20090801phpstudy Sanemat
20090801phpstudy Sanemat
 
Arduino を PHP で制御する
Arduino を PHP で制御するArduino を PHP で制御する
Arduino を PHP で制御する
 
Webサーバ、HTML
Webサーバ、HTMLWebサーバ、HTML
Webサーバ、HTML
 
あなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CIあなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CI
 
PyPy 紹介
PyPy 紹介PyPy 紹介
PyPy 紹介
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクト
 
20090704rubyist九州
20090704rubyist九州20090704rubyist九州
20090704rubyist九州
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試した
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
 
PHPカンファレンス北海道 php技術者認定上級試験を受けてみた
PHPカンファレンス北海道 php技術者認定上級試験を受けてみたPHPカンファレンス北海道 php技術者認定上級試験を受けてみた
PHPカンファレンス北海道 php技術者認定上級試験を受けてみた
 
PSGIへの誘い
PSGIへの誘いPSGIへの誘い
PSGIへの誘い
 

Plus de Shogo Kawahara

Plus de Shogo Kawahara (7)

東京から仙台まで歩く方法
東京から仙台まで歩く方法東京から仙台まで歩く方法
東京から仙台まで歩く方法
 
Phpmatsuri2013
Phpmatsuri2013Phpmatsuri2013
Phpmatsuri2013
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
 
Composer
 Composer Composer
Composer
 
Sismoをいじくる
SismoをいじくるSismoをいじくる
Sismoをいじくる
 
PHPの普段使わない関数を使う
PHPの普段使わない関数を使うPHPの普段使わない関数を使う
PHPの普段使わない関数を使う
 
OAuth with OpenPNE3
OAuth with OpenPNE3OAuth with OpenPNE3
OAuth with OpenPNE3
 

Dernier

Dernier (12)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 

PHPとJavaScriptの噺

  • 1. PHP と JavaScript の噺 @ooharabucyou 第76回 PHP勉強会
  • 2. わたしについて ● PHP歴 = 7年, エンジニア歴 = 6年 ● Rakuten, inc. なんと新卒4年目になる ● 最近のお仕事 ○ node.js でバックエンドなシステムづくり ■ BaaS Team, Web Sevice Platform Group ○ Java & Groovy でバックエンドなシステムづくり ○ http://webservice.rakuten.co.jp 楽天API 運用・開発・ 宣伝何でもやる課 ○ PHPはちょっと見るくらい ■ 一番最近やったPHP仕事は Symfony2.0 から 2.3 へのバージョンアップ
  • 5. JavaScript X PHP にまつわる噺 3本 1. JavaScript 上で PHP(的)な関数を走らせたい 2. JavaScript 上で PHP(っぽいもの) を走らせた い 3. PHP 上で JavaScript を走らせたい
  • 6.
  • 8. その1: JavaScript で PHP(的)な関数を 使いたい ● PHPer のみなさん! こんな経験ありませんか? ○ ようし! クライアントサイド/サーバサイド な JavaScript 書くぞーー ○ あれ、PHPで便利にできるアレ、JavaScript でどうやる んだ??? ○ strtotime(), array_*(), rawurlencode(), htmlspecialchars() もなしにワシはどう開発すればいい んじゃ。
  • 9. array_merge() っぽいことを js でやるには var merge = function(obj1, obj2) { obj2 = obj2 || {}; for (var name in obj2) { obj1[name] = obj2; } }; // なんか関数をつくらなきゃいけない // PHP のように渡した値が変更されないようにするには、オブ ジェクトのclone を実装する必要がある
  • 10. strtotime() っぽいことを js でやるには var strtotime = function(str) { var date = new Date(str); return Math.round(date.getTime() / 1000); }; // これは超適当実装です。一部ブラウザは対応し ないかも // ほかにも +2days とか実装したいとか思ったらよ り至難の業
  • 11.
  • 12. もちろん便利なライブラリはあるけど ● 例えば ○ jQuery な機能を駆使 ○ underscore.js (配列のマージとか、フィルタなど便利な 機能を提供) ○ Moment.js (時間関連の処理を強力にサポート)
  • 14. そこで便利なのが php.js ● http://phpjs.org/ ● PHPのあの関数や、例の関数をJavaScriptの 世界で再現! ● node.js 使いは npm install phpjs で、使えるよ! ● ブラウザでも動くよ。
  • 15. ブラウザ上での使い方 ● https://github.com/kvz/phpjs から clone ● functions/ 下に関数ごとに js が入っているので <script> で ロードする ● あとは、そのまま使える <script src=” phpjs/functions/array/array_merge.js” ></script> <script> array_merge([“Hello”], [“World”]); // [“Hello”, “World”] </script>
  • 16. node.js 上での使い方 ● npm install phpjs でインストール ● あとは以下のように使える。 var php = require(‘phpjs’); php.array_merge([“Hello”], [“World”]); // [“Hello”, “World”]
  • 17. 例の array_merge() も ● 元のオブジェクト非破壊 ● 第3引数以上も指定可能 var php = require('phpjs') , obj = { foo: ‘bar’ }; php.array_merge(obj, { hoge: ‘fuga’ }); // { foo: ‘bar’, hoge: ‘fuga’}
  • 18. あの strtotime() が! ● 便利だけど再現性はまだまだ? ● 元祖 strtotime() すごいよ! // strtotime & date var t = php.strtotime('+7 days'); php.date('Y-m-d', t); // 今日から7日後の日付 t = php.strtotime('2014-01-01 10:00:00'); php.date('Y-m-d H:i:s', t); // 2014-01-01 10:00:00 t = php.strtotime(‘2014-01-01 10:00:00 +7 days’); php.date(‘Y-m-d’, t); // 今から7日後の日付 (本家は 2014-01-08を示す)
  • 19. いるのか? echo() ● いるのか? と思ったけど、環境ごとの出力の仕 方などを担っている模様。 ● 結構、重厚たるコード量 ○ http://phpjs.org/functions/echo/ ● node.js なら console.log() 、ブラウザなら DOM要素追加 ● 出力のある、もろもろの関数は、この関数に依 存している。
  • 20. var_dump() だって!! ● 型も表示してくれるぞ! ● (ブラウザの場合 echo.js のロード必須) ● なんだ。。 PHP はやっぱり JSON でできていた んじゃないか? そうに違いない。(PHP勉強会72 回 中野さんの JSON Schema の説明参照 http://www.slideshare.net/hinakano/json- schema)
  • 21. var_dump() さん ひょっとして console.log() さ んより便利なんじゃないか ● 使いどころ間違えなきゃ便利なんじゃないか。 ● 関数の中身も toString() しておっぴろげてくれ るぞ!! ○ なお、本家PHPで同じようなことやると Closure#1 の ようにしか表示されない ● なお、 node.js の util.inspect() は、そ のままだと [Function] としか出してくれない模 様。
  • 22. urlencode() だってPHP基準? ● 闇PHP勉強会 の @co3k さんの資料参照 (http://www.slideshare.net/ebihara/php- 32340906) ● php.js の urlencode() は空白は + に置き換 え、~ はエンコードしない模様。 ● rawurlencode() もあるよ。
  • 23. file_get_contents() はデフォルトで “同期処理” でコンテンツ取得 ● file_get_contents(“test”); とやると、 XHR (XmlHttpRequest) でのコンテンツ取得を 行う。 ● デフォルトでは同期処理。 ○ つまり、これ使うと一旦処理がとまるよ! ● 非同期処理を 第3引数 context で行うことがで きる。 ○ 本家は、header 周りとかの制御につかったりする。
  • 24. なお非同期 file_get_contentns() file_get_contents('data', false, { stream_params: { 'phpjs.async': true, notification: function(code, severity, msg, st, bt) { if (code >= 8) { var_dump(this.responseText); } } } }); // こんなの PHP じゃないわ!!!! // file_get_contents() がついた JavaScript よ!!!! // だったら(コールバック関数を) 呼べばいいだろ!!
  • 25. (注意?) implode() は歴史的事情知らず ● さすがに例の順序逆も受け付ける仕様はは いってなかった。 ● 実装面倒だもんね。しょうがないよね。 php.implode(',', [‘Hello’, 'world']); // Hello,world php.implode([‘Hello’, ‘world’], ‘,’); // ,
  • 26. それでも物足りないあなた ● php.js は 325 の関数に対応 ○ 本家には 3,000 以上あるってよ。へー。 ● でも、そもそも JavaScript なんて書きたくな い! とにかくPHP が書きたいんだ! という人 (中毒者?) もいるかもしれない。 ● そこで、また別の php.js を紹介
  • 27. その2: php.js - PHP VM with JavaScript ● そもそも JavaScript 上で PHP を実行してしま えばいいんじゃないかという発想のモノ ● ブラウザで動くぞ!!! ● class も magic method もちゃんと動くぞ!! ● 関数も一部はサポートしている模様。 ● http://phpjs.hertzen.com/ ○ (ブラウザでデモができます)
  • 28. ブラウザで php.js VM を動かす <script src="PHP.js"></script> <script src="adapters/filesystem/xhr.js"></script> <!-- PHP.js と filesystem 用の adapter をロード --> <script> var opts = {}; opts.filesystem = new PHP.Adapters.XHRFileSystem(); var path = window.location.pathname; opts.SERVER = { SCRIPT_FILENAME: path.substring(0, path.length) }; var engine = new PHP(‘<?php echo “Hello”;’, opts); console.log(engine); console.log(engine.vm.OUTPUT_BUFFER); </script>
  • 29. node.js 上で php.js VM を動かす var fs = require('fs') ,content = fs.readFileSync('php.js', 'utf8') ; eval(content); var opts = { filesystem: fs, SERVER: { SCRIPT_FILENAME: 'file’ } }; var engine = new PHP('<?php echo "sample";', opts); console.log(engine.vm.OUTPUT_BUFFER);
  • 30. php.js VM の不思議 ● php_logo_guid() が実装されている ○ ロゴの guid を取得できるよ! ■ で、だからどうした。。 ■ ちなみに、隠し関数(?)の php_egg_logo_guid() もあるよ! ○ 【悲報】なお、本家側では、この関数は PHP5.5 で削除 された模様
  • 31. その3: PHP上でJavaScript を走らせる ● 逆に PHP上で V8 JavaScript Engine を利用し て JavaScript を実行することもできる。 ● http://www.php.net/manual/ja/book.v8js.php ● 使い道思いつかない!
  • 32. インストール方法 (Ubuntu) sudo apt-get install libv8js-dev # まだbeta なのだよ pecl install v8js-0.1.5 # アレ登録 sudo echo “extension=v8js.so” > /etc/php5/conf.d/v8js.ini
  • 33. コード <?php $v8 = new V8Js(); $JS = <<<JS var hello = function() { return "Hello!"; }; hello(); JS; try { var_dump($v8->executeString($JS, 'basic.js')); } catch (V8JsException $e) { var_dump($e); }
  • 34. まとめ ● あのPHPの関数が JavaScript でほしい / どう 実装するのか知りたい ○ php.js (http://phpjs.org/) ● そもそもPHPの構文をクライアントサイド上で動 かしたい ○ php.js VM (http://phpjs.hertzen.com/) ● JavaScript をPHP上で動かしたい (!?) ○ v8js module ○ だれか、これだ!っていう使い道を教えてくれ