SlideShare une entreprise Scribd logo
1  sur  100
Télécharger pour lire hors ligne
Good Parts of PHP 
and 
The UNIX Philosophy 
@ PHP カンファレンス 2014 
フィードバックはこちら 
https://joind.in/talk/view/12040
自己紹介 
• Twitter: @yuya_takeyama 
• GitHub: yuya-takeyama 
• PHP / Ruby / Golang
Good Parts 
•Stream 
•Iterator 
•Generator
The UNIX Philosophy
これがUNIXの哲学である。 
一つのことを行い、またそれをうまくやるプログラムを書け。 
協調して動くプログラムを書け。 
標準入出力(テキスト・ストリーム)を扱うプログラムを書け。 
標準入出力は普遍的インターフェースなのだ。 
— M. D. マキルロイ、UNIXの四半世紀 
http://ja.wikipedia.org/wiki/UNIX哲学
ひとつのこと 
をうまくやれ
全てのプログラ 
ムをフィルタに
部分の総和は全 
体よりも大きい
対象者 
• ライブラリを書く人
効用 
• 再利用性の高いコード 
• 組み合わせられるコード 
• が書けるようになる
話さないこと 
• 並列・並行プログラミング
Stream
$fp = fopen($file, 'r');
Stream 
• データの流れ 
• データを読み込めるかも 
• データを書き込めるかも
<?php 
$source = fopen('./input.txt', 'r'); 
$dest = fopen('./output.txt', 'w'); 
if ($source && $dest) { 
while (($buf = fgets($source, 8192)) !== false) { 
if (fputs($dest, $buf) === false) { 
throw new RuntimeException('write error'); 
} 
} 
if (feof($source) === false) { 
throw new RuntimeException('read error'); 
} 
fclose($source); 
fclose($dest); 
} 
ファイルの読み書き
<?php 
$source = fopen('./input.txt', 'r'); 
$dest = fopen('./output.txt', 'w'); 
if ($source && $dest) { 
while (($buf = fgets($source, 8192)) !== false) { 
if (fputs($dest, $buf) === false) { 
throw new RuntimeException('write error'); 
} 
} 
if (feof($source) === false) { 
throw new RuntimeException('read error'); 
} 
fclose($source); 
fclose($dest); 
} 
ファイルの読み書きわりと 
むずい
何が便利?
Stream 
wrapper
Stream wrapper 
• あらゆるものをfopen()可能に! 
• 標準インターフェイスとしてのスト 
リーム (または URL)! 
• ユーザによる実装も可能
$fp = fopen($url);
file_get_contents($url);
Protocols 
•file://! 
•http(s)://! 
•ssh2.sftp://! 
•etc…
Formats 
•phar://! 
•zip://! 
•rar://! 
•etc…
Specials 
•php://stdin! 
•php://memory! 
•php://temp! 
•etc…
Stream wrapper 
を 
実装する 
http://php.net/manual/ja/class.streamwrapper.php
かなり 
だるい 
http://php.net/manual/ja/class.streamwrapper.php
実例
http://docs.aws.amazon.com/aws-sdk-php/guide/latest/feature-s3-stream-wrapper.html
標準インターフェイス
Stream wrapper 
x 
Symfony 
http://fabien.potencier.org/article/44/php-iterators-and-streams-are-awesome
http://fabien.potencier.org/article/44/php-iterators-and-streams-are-awesome
ひとつのこと 
をうまくやれ
全てのプログラ 
ムをフィルタに
部分の総和は全 
体よりも大きい
http://fabien.potencier.org/article/44/php-iterators-and-streams-are-awesome
Stream Wrapper を 
利用することで、あら 
ゆるプロトコル・フォー 
マットを抽象化して操 
作できる
Conclusion of Stream 
Stream をフィルタする! 
プログラムを作って! 
組み合わせよう
Iterator
Iterator (in General) 
• 要素の集合 
• 各要素に順番にアクセス 
• リストのような何か
Iterator (in PHP) 
•Traversable イン 
ターフェイス! 
•foreach できる何か
Iterator 
を 
実装する 
http://jp1.php.net/manual/ja/class.iterator.php
RangeIterator 
をつくる 
RangeIterator 
• 最初と最後の値を指定する! 
• その値の幅を表すイテレータ! 
• 各ステップごとの増加数も指定でき 
る
http://qiita.com/yuya_takeyama/items/51fb058ed20d3df8209e
$range = new RangeIterator(1, 10); 
foreach ($range as $n) { 
echo $n, PHP_EOL; 
} 
RangeIterator を使う
1 
! 
! 
! 
RangeIterator を使う
1 
2 
! 
! 
RangeIterator を使う
1 
2 
3 
! 
RangeIterator を使う
1 
2 
3 
4 
RangeIterator を使う
1 
2 
3 
4 
… 
RangeIterator を使う
Range 
といえば…. 
http://php.net/range
range() 
vs 
Rangeiterator
range() 
• 要素数文の array を予め生成! 
• その文メモリを消費
RangeIterator 
• 各ループ時に次の値を計算して生成! 
• 要素数が増えてもメモリ量は一定! 
• 無限リストの生成も可能
$range = new RangeIterator(1, INF); 
foreach ($range as $n) { 
echo $n, PHP_EOL; 
} 
無限リストを使う
無限リストを切り取って使う 
$range = new RangeIterator(1, INF); 
$range = new LimitIterator($range, 2, 100); 
foreach ($range as $n) { 
echo $n, PHP_EOL; 
}
無限リストを切り取って使う 
3 
! 
! 
!
無限リストを切り取って使う 
3 
4 
! 
!
無限リストを切り取って使う 
3 
4 
5 
!
無限リストを切り取って使う 
3 
4 
5 
…
イテレータは 
組み合わせられる
イテレータが 
別のイテレータを 
生成する
ひとつのこと 
をうまくやれ
全てのプログラ 
ムをフィルタに
部分の総和は全 
体よりも大きい
$dir = new RecursiveDirectoryIterator( 
'/Users/yuya/Music/iTunes/iTunes Media/Music/Aphex Twin' 
); 
$dir = new RecursiveIteratorIterator($dir); 
$dir = new CallbackFilterIterator($dir, function ($node) { 
return $node->isFile(); 
}); 
$dir = new CallbackFilterIterator($dir, function ($file) { 
return preg_match('/^01/', $file->getFilename()); 
}); 
! 
foreach ($dir as $file) { 
echo $file, PHP_EOL; 
} 
イテレータでファイル検索
01 Come To Daddy (Pappy Mix).mp3 
! 
! 
! 
イテレータでファイル検索
01 Come To Daddy (Pappy Mix).mp3 
01 4.m4a 
! 
! 
イテレータでファイル検索
イテレータでファイル検索 
01 Come To Daddy (Pappy Mix).mp3 
01 4.m4a 
01 minipops 67 [120.2] [source field mix].m4a 
!
イテレータでファイル検索 
01 Come To Daddy (Pappy Mix).mp3 
01 4.m4a 
01 minipops 67 [120.2] [source field mix].m4a 
01 Windowlicker (Original Demo).mp3
イテレータでファイル検索 
01 Come To Daddy (Pappy Mix).mp3 
01 4.m4a 
01 minipops 67 [120.2] [source field mix].m4a 
01 Windowlicker (Original Demo).mp3 
01 Windowlicker.mp3
イテレータは 
組み合わせられる
イテレータが 
別のイテレータを 
生成する
標準インターフェイス 
としての 
イテレータ
Generator
Generator 
• PHP5.5~ 
• Iterator の一種 
• ひとつの関数だけで作れる
$gen = function () { 
yield 1; 
yield 2; 
yield 3; 
}; 
! 
foreach ($gen() as $n) { 
echo $n, PHP_EOL; 
} 
ジェネレータを使ってみる
1 
! 
ジェネレータを使ってみる
ジェネレータを使ってみる 
1 
2
ジェネレータを使ってみる 
1 
2 
3
$range = function ($start, $end, $step = 1) { 
for ($i = 1; $i <= $end; $i += $step) { 
yield $i; 
} 
}; 
! 
foreach ($range(1, 100) as $n) { 
echo $n, PHP_EOL; 
} 
ジェネレータでrange
http://qiita.com/yuya_takeyama/items/51fb058ed20d3df8209e
$range = function ($start, $end, $step = 1) { 
for ($i = 1; $i <= $end; $i += $step) { 
yield $i; 
} 
}; 
! 
foreach ($range(1, 100) as $n) { 
echo $n, PHP_EOL; 
} 
ジェネレータでrange
$range = function ($start, $end, $step = 1) { 
for ($i = 1; $i <= $end; $i += $step) { 
yield $i; 
} 
}; 
! 
foreach ($range(1, 100) as $n) { 
echo $n, PHP_EOL; 
} 
ジェネレータでrange 圧倒的に 
簡潔
Functional 
Programming 
with 
Generator
nikic/iter 
• コレクション操作関数群 
• range/map/filter/reduce 
• イテレータを受けてジェネレー 
タを返す
ひとつのこと 
をうまくやれ
全てのプログラ 
ムをフィルタに
部分の総和は全 
体よりも大きい
まとめ 
•Stream と Iterator は PHP の標準インター 
フェイスである 
•これらをフィルタする関数を組み合わせる 
ことで、あらゆるロジックを表現すること 
ができる 
•ジェネレータにより柔軟にイテレータを 
生成できる
Thank you 
for 
Listening

Contenu connexe

Tendances

最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)Rui Hirokawa
 
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011Rui Hirokawa
 
PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019Rui Hirokawa
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜Sotaro Omura
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )hiro345
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたKatsuhiro Miura
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)Rui Hirokawa
 
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料Junichi Ishida
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020Rui Hirokawa
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話y-uti
 
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Kei IWASAKI
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」Mr. Vengineer
 
php7's ast
php7's astphp7's ast
php7's astdo_aki
 

Tendances (20)

最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
 
PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみた
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
 
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
 
php7's ast
php7's astphp7's ast
php7's ast
 

En vedette

Log解析の基礎@phpcon2014
Log解析の基礎@phpcon2014Log解析の基礎@phpcon2014
Log解析の基礎@phpcon2014菊池 佑太
 
5分でわかる? 関数型 PHP の潮流
5分でわかる? 関数型 PHP の潮流5分でわかる? 関数型 PHP の潮流
5分でわかる? 関数型 PHP の潮流Yuya Takeyama
 
中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略Ryo Tomidokoro
 
恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男Tomoyuki Matsuura
 
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプトRichie Shellshoccar
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Darkmira Tour PHP 2016 - Automatizando Tarefas com Phing
Darkmira Tour PHP 2016 - Automatizando Tarefas com PhingDarkmira Tour PHP 2016 - Automatizando Tarefas com Phing
Darkmira Tour PHP 2016 - Automatizando Tarefas com PhingMatheus Marabesi
 
PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形K Kinzal
 
PHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにPHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにYuya Takeyama
 
scdevsumit 2016 - Become a jedi with php streams
scdevsumit 2016 - Become a jedi with php streamsscdevsumit 2016 - Become a jedi with php streams
scdevsumit 2016 - Become a jedi with php streamsMatheus Marabesi
 
Writing and using php streams and sockets
Writing and using php streams and socketsWriting and using php streams and sockets
Writing and using php streams and socketsElizabeth Smith
 
Socket programming with php
Socket programming with phpSocket programming with php
Socket programming with phpElizabeth Smith
 
サーバ攻撃されてみた
サーバ攻撃されてみたサーバ攻撃されてみた
サーバ攻撃されてみたKimie Furuya
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014Hiroshi Tokumaru
 

En vedette (16)

Log解析の基礎@phpcon2014
Log解析の基礎@phpcon2014Log解析の基礎@phpcon2014
Log解析の基礎@phpcon2014
 
5分でわかる? 関数型 PHP の潮流
5分でわかる? 関数型 PHP の潮流5分でわかる? 関数型 PHP の潮流
5分でわかる? 関数型 PHP の潮流
 
中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略
 
恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男
 
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Darkmira Tour PHP 2016 - Automatizando Tarefas com Phing
Darkmira Tour PHP 2016 - Automatizando Tarefas com PhingDarkmira Tour PHP 2016 - Automatizando Tarefas com Phing
Darkmira Tour PHP 2016 - Automatizando Tarefas com Phing
 
PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形
 
PHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにPHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くために
 
scdevsumit 2016 - Become a jedi with php streams
scdevsumit 2016 - Become a jedi with php streamsscdevsumit 2016 - Become a jedi with php streams
scdevsumit 2016 - Become a jedi with php streams
 
Writing and using php streams and sockets
Writing and using php streams and socketsWriting and using php streams and sockets
Writing and using php streams and sockets
 
Socket programming with php
Socket programming with phpSocket programming with php
Socket programming with php
 
サーバ攻撃されてみた
サーバ攻撃されてみたサーバ攻撃されてみた
サーバ攻撃されてみた
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014
 

Similaire à Good Parts of PHP and the UNIX Philosophy

FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateepocketberserker
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7Tetsuya Morimoto
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組みTakayuki Shimizukawa
 
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室Yusuke Ando
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったHironobu Saitoh
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をAtsuhiro Kubo
 
SPL fukuokaphp_1
SPL fukuokaphp_1SPL fukuokaphp_1
SPL fukuokaphp_1ichikaway
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半Tetsuya Morimoto
 
エンジニアという職業について
エンジニアという職業についてエンジニアという職業について
エンジニアという職業についてHisatoshi Kikumoto
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半Tetsuya Morimoto
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようYuya Takeyama
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjHisateru Tanaka
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室Yusuke Ando
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218Yoshi Sakai
 
インタフェースの実装パターン
インタフェースの実装パターンインタフェースの実装パターン
インタフェースの実装パターンTakuya Ueda
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法Rui Hirokawa
 

Similaire à Good Parts of PHP and the UNIX Philosophy (20)

FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIteratee
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
 
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
 
SPL fukuokaphp_1
SPL fukuokaphp_1SPL fukuokaphp_1
SPL fukuokaphp_1
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
エンジニアという職業について
エンジニアという職業についてエンジニアという職業について
エンジニアという職業について
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
 
Twitter4Jとテスト
Twitter4JとテストTwitter4Jとテスト
Twitter4Jとテスト
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218
 
インタフェースの実装パターン
インタフェースの実装パターンインタフェースの実装パターン
インタフェースの実装パターン
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
 

Plus de Yuya Takeyama

Reactor Pattern and React
Reactor Pattern and ReactReactor Pattern and React
Reactor Pattern and ReactYuya Takeyama
 
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)Yuya Takeyama
 
PHP と MySQL でカジュアルに MapReduce する (Short Version)
PHP と MySQL でカジュアルに MapReduce する (Short Version)PHP と MySQL でカジュアルに MapReduce する (Short Version)
PHP と MySQL でカジュアルに MapReduce する (Short Version)Yuya Takeyama
 
PHP と MySQL でカジュアルに MapReduce する
PHP と MySQL でカジュアルに MapReduce するPHP と MySQL でカジュアルに MapReduce する
PHP と MySQL でカジュアルに MapReduce するYuya Takeyama
 
MySQL 入門的なはなし
MySQL 入門的なはなしMySQL 入門的なはなし
MySQL 入門的なはなしYuya Takeyama
 
HashTable と HashDos
HashTable と HashDosHashTable と HashDos
HashTable と HashDosYuya Takeyama
 
Proposal for xSpep BDD Framework for PHP
Proposal for xSpep BDD Framework for PHPProposal for xSpep BDD Framework for PHP
Proposal for xSpep BDD Framework for PHPYuya Takeyama
 
Building Development Environment with php-build and phpenv
Building Development Environment with php-build and phpenvBuilding Development Environment with php-build and phpenv
Building Development Environment with php-build and phpenvYuya Takeyama
 
LIMIT 付きで UPDATE を行うと何故怒られるか
LIMIT 付きで UPDATE を行うと何故怒られるかLIMIT 付きで UPDATE を行うと何故怒られるか
LIMIT 付きで UPDATE を行うと何故怒られるかYuya Takeyama
 
Ruby 同好会宣言
Ruby 同好会宣言Ruby 同好会宣言
Ruby 同好会宣言Yuya Takeyama
 
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)Yuya Takeyama
 

Plus de Yuya Takeyama (13)

Reactor Pattern and React
Reactor Pattern and ReactReactor Pattern and React
Reactor Pattern and React
 
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
 
PHP と MySQL でカジュアルに MapReduce する (Short Version)
PHP と MySQL でカジュアルに MapReduce する (Short Version)PHP と MySQL でカジュアルに MapReduce する (Short Version)
PHP と MySQL でカジュアルに MapReduce する (Short Version)
 
PHP と MySQL でカジュアルに MapReduce する
PHP と MySQL でカジュアルに MapReduce するPHP と MySQL でカジュアルに MapReduce する
PHP と MySQL でカジュアルに MapReduce する
 
MySQL 入門的なはなし
MySQL 入門的なはなしMySQL 入門的なはなし
MySQL 入門的なはなし
 
HashTable と HashDos
HashTable と HashDosHashTable と HashDos
HashTable と HashDos
 
Proposal for xSpep BDD Framework for PHP
Proposal for xSpep BDD Framework for PHPProposal for xSpep BDD Framework for PHP
Proposal for xSpep BDD Framework for PHP
 
Building Development Environment with php-build and phpenv
Building Development Environment with php-build and phpenvBuilding Development Environment with php-build and phpenv
Building Development Environment with php-build and phpenv
 
Making DSL with []
Making DSL with []Making DSL with []
Making DSL with []
 
LIMIT 付きで UPDATE を行うと何故怒られるか
LIMIT 付きで UPDATE を行うと何故怒られるかLIMIT 付きで UPDATE を行うと何故怒られるか
LIMIT 付きで UPDATE を行うと何故怒られるか
 
GOOS #1
GOOS #1GOOS #1
GOOS #1
 
Ruby 同好会宣言
Ruby 同好会宣言Ruby 同好会宣言
Ruby 同好会宣言
 
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
 

Good Parts of PHP and the UNIX Philosophy