狠狠撸

狠狠撸Share a Scribd company logo
2016/12/11
第七回闇笔贬笔勉强会
do_aki
1
updated 2016-12-13
このスライドは
? PHPカンファレンス2016で発表した
「PHP AST 徹底解説」 において説明し
きれなかった部分を補足した際に用いた
もの
? AST に関する部分については、元のスラ
イドにマージ済みなので
http://www.slideshare.net/do_aki/p
hp-ast を参照してください
@do_aki
@do_aki
http://do-aki.net/
PHPカンファレンス2016で
話したこと
PHP
Compiler in PHP
PHP Script
Opcode
Request
Output
Compiler
Lexing
Parsing
Compilation
VM
Execution
INCLUDE_OR_EVAL
php5 (1 pass / 151構文(5.6))
字句解析 + 構文解析 + Opcode生成
php7 (2 pass / 127構文(7.0))
字句解析+構文解析 Opcode生成
最適化の余地
PHP の
抽象構文木
<?php
1/(2+3);
種別
付属情報
子ノード
子ノード
PHP AST 徹底解説(補遺)
token_get_all の話
token_get_all 関数
? PHP スクリプトを トークン分解して配列
にする関数
? nikic/PHP-Parser で利用されてる
? tokenizer 拡張 (デフォルトで有効)
7.0 からの変更
? 7.0 から第2引数に TOKEN_PARSE を指定で
きるようになった
– 指定なし: 字句解析のみ / 5.6 まで同様
– 指定あり: 構文解析もする / ast は破棄
? TOKEN_PARSE 指定でも Opcode 生成は省略
– zendparse を呼ぶが、
zend_compile_top_stmt は呼ばない
– Syntax Error (例外) は発生するがCompile
Error (Fatal) は発生しない
– const A = f(); のようなコードも受け入れる
7.0.12 での実行例
token_name(319) => T_STRING
コンパイル と
token_get_all の関係
字句解析 構文解析 Opcode生成
狭義のコンパイルAST を生成トークンに分解
従来からの
token_get_all
TOKEN_PARSE 付きの
token_get_all
文字列結合 Opcode の話
ソースコード(php スクリプト)
<?php
function hello ( $name ) {
echo “HELLO $name“ ;
}
hello ( “php“ ) ;
Opcode (vld)
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > EXT_NOP
1 RECV !0
3 2 EXT_STMT
3 NOP
4 FAST_CONCAT ~1 'Hello+', !0
5 ECHO ~1
4 6 EXT_STMT
7 > RETURN null
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > EXT_STMT
1 NOP
6 2 EXT_STMT
3 INIT_FCALL 'hello'
4 EXT_FCALL_BEGIN
5 SEND_VAL 'php'
6 DO_FCALL 0
7 EXT_FCALL_END
8 > RETURN 1
function
hello()
call
hello()
Opcode (vld without xdebug)
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > RECV !0
3 1 NOP
2 FAST_CONCAT ~1 'HELLO+', !0
3 ECHO ~1
4 4 > RETURN null
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > NOP
6 1 INIT_FCALL 'hello'
2 SEND_VAL 'php'
3 DO_FCALL 0
4 > RETURN 1
function
hello()
call
hello()
FAST_CONCAT
? encaps_list (変数を含む文字列) において、
要素が2つの時(変数の前後どちらかに文字列を加える時)
に FAST_CONCAT になる
(at zend_compile_encaps_list)
? 5.6 までは ADD_VAR + ADD_STRING
? ちなみに 3要素以上ならば ROPE_INIT,
ROPE_ADD, [ROPE_ADD,] ROPE_END
"{$a} lines"
5.6
7.0
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > ADD_VAR ~0 !0
1 ADD_STRING ~0 ~0, '+lines'
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > NOP
1 FAST_CONCAT ~1 !0, '+lines'
"{$a} / {$b} lines"
5.6
7.0
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > ADD_VAR ~0 !0
1 ADD_STRING ~0 ~0, '+%2F+'
2 ADD_VAR ~0 ~0, !1
3 ADD_STRING ~0 ~0, '+lines'
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > ROPE_INIT 4 ~3 !0
1 ROPE_ADD 1 ~3 ~3, '+%2F+'
2 ROPE_ADD 2 ~3 ~3, !1
3 ROPE_END 3 ~2 ~3, '+lines'
parse しつつ opcode 生成し
ていた時に、これを導入するの
は困難だったはず
AST により、容易に導入できる
ようになった例かなと
strlen 静的展開の話
静的関数展開(定数化)
? 関数呼び出しコストの削減
? 定数畳み込みとの組み合わせも有効
ex: strlen(A::HOGE) + 1 -> 5
strlen(’hoge’) -> 4
ord(’A’) -> 65 / 7.1~
chr(65) -> ‘A‘ / 7.1~
mbstring.func_overload
? strlen コールが mb_strlen に置き換わ
る
? EG(function_table) を操作して、上書
き
? コンパイル時に strlen が定数になって
しまうと機能しないのでは? という疑問
静的関数展開の無効化
? CG(compiler_options) に
ZEND_COMPILE_NO_BUILTINS ビットをセッ
トすることで静的関数展開を無効にできる
? CG(compiler_options) に
ZEND_COMPILE_NO_BUILTIN_STRLENビット
をセットすることで strlen の展開のみを
無効にできる
? 拡張ならば、 CG(compiler_options) を制
御可能
問題なかった
? mbstring 拡張の初期化(RINIT)時
func_overload が有効ならば
ZEND_COMPILE_NO_BUILTIN_STRLEN を
指定している
? func_overload は問題なく機能する
? func_overload が有効だと、 strlen
展開による恩恵を受けられない
同じコードから異なるOpcodeが
生成される話
定数の畳み込み
$sec_in_day = 60 * 60 * 24;
$sec_in_day = 86400;
※実は OpCache でも行われている
class A { const HOGE = ‘hoge‘; }
echo A::HOGE;
echo ‘hoge‘;
コンパイル時点で定義済みの定数に対してのみ有効
(autoload より pre include のほうが効きやすい)
コンパイルタイミングによって
Opcode が変化する例
class A { const X = 1; }
a.php
require_once 'a.php';
echo A::X;
echo.php
require_once 'a.php';
require_once 'echo.php';
require.php
> php echo.php
echo.php をコンパイルする時点
では a.php はコンパイルされて
いない
> php require.php
echo.php をコンパイルする時点
で a.php はコンパイル済み
line #* E I O op fetch ext return operands
-----------------------------------------------------------
2 0 E > INCLUDE_OR_EVAL 'a.php', REQUIRE_ONCE
3 1 FETCH_CONSTANT ~1 'A', 'X'
2 ECHO ~1
3 > RETURN 1
line #* E I O op fetch ext return operands
-----------------------------------------------------------
0 E > INCLUDE_OR_EVAL 'a.php', REQUIRE_ONCE
3 1 ECHO 1
2 > RETURN 1
> php echo.php
> php require.php (の時の echo.php)
HHVM の話
HHVM におけるコンパイル
? 2つのLexer (yylex)
Compiler5lex/Compiler7lex
? 2つのParser (yyparse)
HPHP::Compiler::Parser::parseImpl5
HPHP::Compiler::Parser::parseImpl7
? どちらも AST を生成する
HHVM における AST
? AST ノードの基底クラスである
HPHP::Construct があり、Statement
と Expression に分かれる
? HPHP::Compiler::Parser::parseImpl
が、parseImpl7 あるいは parseImpl5
を呼び出し、
HPHP::Compiler::Parser::m_tree に
StatementList が作られる
HPHP::Statement
? 構造を表すノードの
基本クラス
? HPHP::StatementList が
ZEND_STATEMENT_LIST に
相当
HPHP::Expression
? 評価式や値を表す
ノードの基本クラス
? AwaitExpression
あたりは hhvm なら
では
ast 操作拡張の話
php-ast
? https://github.com/nikic/php-ast
? astparse_file あるいは
astparse_code で AST 構築
? astNode をベースクラスとした astDecl
? リスト型のノード は Node に統合
? Zval型のノードは Node の exprプロパティ
? STMT_LIST(A) の子要素に STMT_LIST(B) が含
まれる場合は、B の子を A の子として併合
astkit
? https://github.com/sgolemon/astkit
? AstKit::parseString あるいは
AstKit::parseFile で AST構築
? AstKit をベースクラスとした AstKitList,
AstKitDecl, AstKitZval にマッピングさ
れる
? $AstKit->export でコードに変換
astparse_code('<?php 1 + 2;')
全ノードをphp スクリプトで扱える構造に変換 (CG(ast) は破棄)
C言語 (CG(ast))
array
astnode
kind: 520
flags: 1
lineno: 1
left: 1
right: 2
astNode
kind: 133
flags:0
lineno: 0
children:
AST_ZVAL
1
AST_ZVAL
2
AST_BINA
RY_OP +
AST_STMT
_LIST
ast_to_zval
php スクリプト (zval)
Astkit::parseString('1+2;')
先頭のノードのみ生成。操作により子の AstKit が生成される
C language (CG(ast) =
astkit_tree->tree)
AstKitList
AST_ZVAL
1
AST_ZVAL
2
AST_BINA
RY_OP +
AST_STMT
_LIST
php script (zval)
AstKit
AstKitZval
getChild(0) で生成
getChild(0,false) で生成
getChild(0) ならば int(1)
それぞれの特徴
? php-ast
– php スクリプトから扱いやすい
– 初期のコストが大きめ
– 異なるバージョンでの変換処理を拡張側で頑張っ
てる部分もある
? astkit
– C の ast そのままのメモリを操作
– 利用する箇所が部分的ならば低コストか
– ast 構造の変化によって php 側での操作が大き
く変わる
おしまい
(blank)

More Related Content

What's hot (20)

php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
?
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
do_aki
?
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
y-uti
?
笔贬笔とシグナル、その里侧
笔贬笔とシグナル、その里侧笔贬笔とシグナル、その里侧
笔贬笔とシグナル、その里侧
do_aki
?
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
y-uti
?
Php in ruby
Php in rubyPhp in ruby
Php in ruby
do_aki
?
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
y-uti
?
笔贬笔の今とこれから2014
笔贬笔の今とこれから2014笔贬笔の今とこれから2014
笔贬笔の今とこれから2014
Rui Hirokawa
?
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
akirahiguchi
?
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
?
笔贬笔の今とこれから2016
笔贬笔の今とこれから2016笔贬笔の今とこれから2016
笔贬笔の今とこれから2016
Rui Hirokawa
?
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
shinjiigarashi
?
PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013
Rui Hirokawa
?
PHP-FPM の子フ?ロセス制御方法と設定をおさらいしよう
PHP-FPM の子フ?ロセス制御方法と設定をおさらいしようPHP-FPM の子フ?ロセス制御方法と設定をおさらいしよう
PHP-FPM の子フ?ロセス制御方法と設定をおさらいしよう
Shohei Okada
?
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
?
贰尝贵の动的リンク
贰尝贵の动的リンク贰尝贵の动的リンク
贰尝贵の动的リンク
7shi
?
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
y-uti
?
笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料
笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料
笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料
Junichi Ishida
?
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso
?
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
?
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
do_aki
?
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
y-uti
?
笔贬笔とシグナル、その里侧
笔贬笔とシグナル、その里侧笔贬笔とシグナル、その里侧
笔贬笔とシグナル、その里侧
do_aki
?
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
y-uti
?
Php in ruby
Php in rubyPhp in ruby
Php in ruby
do_aki
?
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
y-uti
?
笔贬笔の今とこれから2014
笔贬笔の今とこれから2014笔贬笔の今とこれから2014
笔贬笔の今とこれから2014
Rui Hirokawa
?
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
akirahiguchi
?
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
?
笔贬笔の今とこれから2016
笔贬笔の今とこれから2016笔贬笔の今とこれから2016
笔贬笔の今とこれから2016
Rui Hirokawa
?
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
shinjiigarashi
?
PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013
Rui Hirokawa
?
PHP-FPM の子フ?ロセス制御方法と設定をおさらいしよう
PHP-FPM の子フ?ロセス制御方法と設定をおさらいしようPHP-FPM の子フ?ロセス制御方法と設定をおさらいしよう
PHP-FPM の子フ?ロセス制御方法と設定をおさらいしよう
Shohei Okada
?
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
?
贰尝贵の动的リンク
贰尝贵の动的リンク贰尝贵の动的リンク
贰尝贵の动的リンク
7shi
?
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
y-uti
?
笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料
笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料
笔贬笔カンファレンス2014の恳亲会飞び込み尝罢资料
Junichi Ishida
?
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso
?

Similar to PHP AST 徹底解説(補遺) (20)

Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
?
奥别产础笔滨ではじめる辫丑辫入门
奥别产础笔滨ではじめる辫丑辫入门奥别产础笔滨ではじめる辫丑辫入门
奥别产础笔滨ではじめる辫丑辫入门
Hiroaki Murayama
?
System4 comment h
System4 comment hSystem4 comment h
System4 comment h
Jun Chiba
?
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
?
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
jamadam
?
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180
?
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
Rui Hirokawa
?
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
Nobutada Matsubara
?
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
Akio Ishida
?
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014 FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
Mika Kane
?
やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介
やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介
やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介
fukuoka.ex
?
PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12
Ryuji Yamashita
?
フラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへ フラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへ
VOYAGE GROUP
?
フラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへフラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへ
Masao Maeda
?
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API DragonJOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
Naoto Gohko
?
颁笔础狈の依存モジュールをもう少し正しく検出したい
颁笔础狈の依存モジュールをもう少し正しく検出したい颁笔础狈の依存モジュールをもう少し正しく検出したい
颁笔础狈の依存モジュールをもう少し正しく検出したい
charsbar
?
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
?
奥别产础笔滨ではじめる辫丑辫入门
奥别产础笔滨ではじめる辫丑辫入门奥别产础笔滨ではじめる辫丑辫入门
奥别产础笔滨ではじめる辫丑辫入门
Hiroaki Murayama
?
System4 comment h
System4 comment hSystem4 comment h
System4 comment h
Jun Chiba
?
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
?
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
jamadam
?
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180
?
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
Rui Hirokawa
?
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014 FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
Mika Kane
?
やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介
やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介
やや関数型を意识した风贰濒颈虫颈谤/笔丑辞别苍颈虫ご绍介
fukuoka.ex
?
PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレカ?シーマイク?レーション実例 #jjug_ccc #ccc_r12
Ryuji Yamashita
?
フラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへ フラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへ
VOYAGE GROUP
?
フラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへフラットな笔贬笔からフレームワークへ
フラットな笔贬笔からフレームワークへ
Masao Maeda
?
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API DragonJOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
Naoto Gohko
?
颁笔础狈の依存モジュールをもう少し正しく検出したい
颁笔础狈の依存モジュールをもう少し正しく検出したい颁笔础狈の依存モジュールをもう少し正しく検出したい
颁笔础狈の依存モジュールをもう少し正しく検出したい
charsbar
?

More from do_aki (20)

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
do_aki
?
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
do_aki
?
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
do_aki
?
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
do_aki
?
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
do_aki
?
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
?
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razor
do_aki
?
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnd
do_aki
?
php in ruby
php in rubyphp in ruby
php in ruby
do_aki
?
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
?
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
?
Php radomize
Php radomizePhp radomize
Php radomize
do_aki
?
セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤
セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤
セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤
do_aki
?
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
?
Excel is image viewer
Excel is image viewerExcel is image viewer
Excel is image viewer
do_aki
?
A bridge between php and ruby
A bridge between php and ruby A bridge between php and ruby
A bridge between php and ruby
do_aki
?
Ruby and comparison_and...php
Ruby and comparison_and...phpRuby and comparison_and...php
Ruby and comparison_and...php
do_aki
?
Sore php
Sore phpSore php
Sore php
do_aki
?
Ruby enumerable source code reading
Ruby enumerable source code readingRuby enumerable source code reading
Ruby enumerable source code reading
do_aki
?
Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
do_aki
?
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
do_aki
?
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
do_aki
?
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
do_aki
?
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
do_aki
?
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
?
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razor
do_aki
?
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnd
do_aki
?
php in ruby
php in rubyphp in ruby
php in ruby
do_aki
?
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
?
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
?
Php radomize
Php radomizePhp radomize
Php radomize
do_aki
?
セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤
セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤
セキュアそうでセキュアじゃない少しセキュアな気分になれる尘测蝉辩濒冲肠辞苍蹿颈驳冲别诲颈迟辞谤
do_aki
?
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
?
Excel is image viewer
Excel is image viewerExcel is image viewer
Excel is image viewer
do_aki
?
A bridge between php and ruby
A bridge between php and ruby A bridge between php and ruby
A bridge between php and ruby
do_aki
?
Ruby and comparison_and...php
Ruby and comparison_and...phpRuby and comparison_and...php
Ruby and comparison_and...php
do_aki
?
Ruby enumerable source code reading
Ruby enumerable source code readingRuby enumerable source code reading
Ruby enumerable source code reading
do_aki
?

Recently uploaded (11)

ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
?
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
?
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
Matsushita Laboratory
?
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
Matsushita Laboratory
?
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
sugiuralab
?
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
sugiuralab
?
LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3
LFDT Tokyo Meetup
?
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
CRI Japan, Inc.
?
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
harmonylab
?
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
harmonylab
?
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
Matsushita Laboratory
?
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
?
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
?
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
Matsushita Laboratory
?
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
Matsushita Laboratory
?
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
sugiuralab
?
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
sugiuralab
?
LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3
LFDT Tokyo Meetup
?
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
CRI Japan, Inc.
?
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
harmonylab
?
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
harmonylab
?
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
Matsushita Laboratory
?

PHP AST 徹底解説(補遺)

Editor's Notes

  • #4: 闻いて明日仕事に活かせるような话ではない