SlideShare a Scribd company logo
1 of 31
Download to read offline
Real World PHP in pixiv
ぐるなびピクシブ 合同勉強会

2015年10月23日
お前誰よ
• うさみけんた / tadsan
• 2012年11月にピクシブ入社
• 入社前は自宅警備しながらRuby書いてた
• API/OAuth/PC版サービスなどのPHPもろもろ
• 最近では漫画・小説チームとして動いてる
• PHPカンファレンスのLT応募に落ちました
注意
• 時間配分は考慮してない
• 開発楽しい!とかじゃなく淡々と羅列するだけ
• ゆっくり話すので、「お前何言ってんんだ」と
感じたらつっこみを入れてください
• 資料はあとで公開します
アジェンダ
• 現状についてだらだら話す
• pixivのデプロイについて
• pixivの開発環境について
• pixivのPHPについて
• pixivのSQLについて
• そのほか
pixiv.git (クラスのお友達)
├ accounts.pixiv.net
├ admin.pixiv.net
├ api.pixiv.net
├ batch
├ embed.pixiv.net
├ m.pixiv.net
├ me.pixiv.net
├ oauth.pixiv.net
├ pixiv-lib
├ public-api.pixiv.net
├ rpc.pixiv.private
├ source.pixiv.net
├ spapi.pixiv.net
├ spotlight.pics
├ ssl.pixiv.net
├ touch.pixiv.net
├ util
├ vendor
├ web-test
└ www.pixiv.net
変遷
• 以前(2013年頃まで)は、サブディレクトリ
ごとに独立したGitリポジトリで、共通部分
をsubmoduleとして扱ってた
• 共通部分の抽象化もうまくなされて居らず、

重複・細部が異なるコードが分散してた
変遷
• submoduleは疎結合なモジュールに適する
• 結合度が高いモジュールのリポジトリを分
割すると、変更コストが極めて高い
• リポジトリを統合することで凝集度を高め
るリファクタリングも断行しやすくなった
• 細部が異なる重複コード問題も根絶
デプロイ
• 基本的にサーバー全台(xx台程度)にrsync
• 以前(2013年)はPHPファイルの増減を伴った
デプロイ時には(ページにもよるが)、

xxx件程度のエラーが発生してしまってた
• 現在はBlue-GreenDeploymentの確立で、
ファイルの追加/削除も怖いものではない
デプロイ (pploy)
• 汎用的なデプロイシステム
• /.deploy ディレクトリにファイルを配置
• bin/deploy スクリプトが実行される
• readme.html で画面カスタマイズ可能
• Gitに依存するので、特定のバージョンを
チェックアウトして反映することも容易
デプロイと変遷 (ブログ記事紹介)
• 開発・デプロイ環境の変遷 2014年春版
• 履歴を残したまま複数のgitリポジトリを統
合する
• pixivのデプロイを支えるpploy
• github: edvakf/pploy
• WEB+DB PRESS Vol. 84
pixivの開発環境
• DBなどの依存が多く、ローカルに環境を構
築することは容易ではない(不可能でもない)
• 共有の環境にSSHでログインして開発
• 端末のEmacsやVimで開発するひとも
• rsyncでローカルと同期してPhpStormなど
• @tadsanはTRAMPを利用してる
pixivの開発環境
• ApacheのVirtualHostを大胆に活用
• /home/www/にシンボリックリンクを作成
• 社内ネットワークでDNS名前解決できる
• www.tadsan.example.com のような形式
• pixiv関係なくても任意のPHPを動作可能
• OpenStackで同じ仕様のサーバー増やせる
pixiv-lib
• DBの操作を抽象化する層(DAO)
• データの入出力などをまとめて扱う層
• 社内では「Common層」と呼ばれる
• セッション・国際化などの基盤機能
• その他の共通処理いろいろ!
• むかしはextlibって呼ばれてた (懐古)
pixivのPHPコード
• PHP 5.5 + Apache
• URLを見ればわかる通り、ページ=PHP
• search.php, member_illust.php など…
• 一部のリクエストはHHVMで捌いてる
• ルーティングのためmod_rewriteに依存
pixivのPHPコード
• 既存のフレームワークに依存しない
• 独自フレームワークを運用してる部分もある
• 口にすると顔をしかめられがちだが、

用途に合せて設計ができるのは悪くない
• どちらにしろ自分たちでセキュリティを

担保しなければいけないのはおんなじ!
pixivのPHPコード
• 動的な言語機能は必要ない限り利用しない
• クラスの静的メソッドを多用する
• 継承は排除する方向
• トレイトもあまり利用しない
• リファレンスは原則排除する
• PhpStormを使ってもつらいものはつらい
pixivのPHPコード
• include_onceってたくさん書いてる!!
• オートローダーの利用は限定的
• pixiv-libでは現状は利用不可 (鋭意改善中)
• リポジトリ内に混在する都合上、

Composerのautoloadは利用しにくい
• 一部ではphpabで生成してinclude
pixivのPHPコード
• コミットログやコード内コメントは、

英語または日本語で各人の得意な方で
• 意識高く「全部英語で」など拘らない
• 必要な文章は論理的に誤りがないように
• コミットのルールは厳格に定めない
• 各人のやりかたを尊重する
• 典型的な Github Flow で運用
loadset.php
• 各プロジェクトの初期化ファイル
• エラーハンドラーの設定
• 必要なライブラリのロード
• 定数(define)の定義
• loadsetのみrequire_onceで読み込む
• そのほかは全部 include_once で
pixivのSQL
• MySQL 5.5
• 文字列結合によるSQL組立つらすぎ…
• ORマッパー/自動クエリビルダーは利用せず
• 2015年の初旬からSQLに型をつけて安全に
書けるライブラリを社内で運用
• 脆弱性対策の文脈で生まれたが書きやすい
pixivのSQL
• Q: なぜ自動クエリビルダー利用しないの?
• いままでが文字列結合で組み立ててたから
• クエリが単純ではないパターンも多い
• 例: ブックマークなど
pixivのAPI
• いろんな試行錯誤をしてきた
• 一部で有名なCSVのAPI (最初期)
• ActiveResourceで利用するためのAPI
• スマートフォンアプリ向けREST API
• 社内向けのシンプルなAPI (RPC)
パッケージ管理
• Composerを利用
• composer.pharはpixiv.gitに同梱
• 社内ネットワーク内でSatisを運用
• Jenkinsで定期的に更新
• GitHubの障害があっても支障なし
• 手動で実行もできる
pixivのテスト
• 基本的にPHPUnitでテストを書く
• 2013年頃にテストを書く文化が定着した
• GitlabのMRにpushしたら自動テスト走る
• うっかりmasterにpushされたら即座に

idobataに通知される
pixivのレビュー体制
• 毎週pixiv.gitに携る各チームのレビュアーで

設計方針や最新の情報などを共有・相談
• レビュアーが各チームに持ち帰る
• 各自メンバーに説明したり、レビュー過程
で指摘することで全体のコード品質を保つ
• ガイドラインや推奨スタイルの確立
そのほか
• pixivのデプロイ回数は一日およそ20回
• ディレクターが文言変更をすることが多い
• Jenkinsをいっぱい使ってる
• cronの代替として
• スクリプトのWebUIとしても利用できる
• 各種エディタの勢力は均衡してる
ふろく (WEB+DB PHP連載)
• 特におもしろい記事
• Vol.81: テストしにくいコード対策
• Vol.83: 安全なコーディングスタイル
• Vol.84: デプロイ・Composer運用
• Vol.87: PHPDoc記法で型注釈
• Vol.88: HHVMの運用
続きはWebで
• https://github.com/pixiv
• http://inside.pixiv.net/
• GitHub (tadsan個人で公開してるもの)
• BaguettePHP/php-simple-routing
• BaguettePHP/http-accept-language

More Related Content

What's hot

Phpstormちょっといい話
Phpstormちょっといい話Phpstormちょっといい話
Phpstormちょっといい話
Hisateru Tanaka
 
Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)
Kazuhide Maruyama
 
それPhpStormで出来るよ #phpstudy
それPhpStormで出来るよ #phpstudyそれPhpStormで出来るよ #phpstudy
それPhpStormで出来るよ #phpstudy
晃 遠山
 

What's hot (20)

Phpstormちょっといい話
Phpstormちょっといい話Phpstormちょっといい話
Phpstormちょっといい話
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
 
がんばらない多言語化 @ FuelPHP&CodeIgniter ユーザの集い #7
がんばらない多言語化 @ FuelPHP&CodeIgniter ユーザの集い #7がんばらない多言語化 @ FuelPHP&CodeIgniter ユーザの集い #7
がんばらない多言語化 @ FuelPHP&CodeIgniter ユーザの集い #7
 
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
 
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
 
PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性
 
第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
 
Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)
 
TypeScriptはいいぞ
TypeScriptはいいぞTypeScriptはいいぞ
TypeScriptはいいぞ
 
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
 
それPhpStormで出来るよ #phpstudy
それPhpStormで出来るよ #phpstudyそれPhpStormで出来るよ #phpstudy
それPhpStormで出来るよ #phpstudy
 
Re: WebServer BenchMarking
Re: WebServer BenchMarkingRe: WebServer BenchMarking
Re: WebServer BenchMarking
 
Ruby on vim yokohama.vim発表資料
Ruby on vim yokohama.vim発表資料Ruby on vim yokohama.vim発表資料
Ruby on vim yokohama.vim発表資料
 
LaravelとMVCの先へ
LaravelとMVCの先へLaravelとMVCの先へ
LaravelとMVCの先へ
 
非同期系統の基礎
非同期系統の基礎非同期系統の基礎
非同期系統の基礎
 
〜laravel で学ぶ MVC
 〜laravel で学ぶ MVC 〜laravel で学ぶ MVC
〜laravel で学ぶ MVC
 
WebStormでできること
WebStormでできることWebStormでできること
WebStormでできること
 
IDEALIZE YOU
IDEALIZE YOUIDEALIZE YOU
IDEALIZE YOU
 
Infrastructure as codeのススメ
Infrastructure as codeのススメInfrastructure as codeのススメ
Infrastructure as codeのススメ
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 

Viewers also liked

отчёт Buybrand expo 2012
отчёт Buybrand expo 2012отчёт Buybrand expo 2012
отчёт Buybrand expo 2012
Victoria Kazakova
 

Viewers also liked (20)

リーダブルコード : このコード、読み易くなくなくない?
リーダブルコード : このコード、読み易くなくなくない?リーダブルコード : このコード、読み易くなくなくない?
リーダブルコード : このコード、読み易くなくなくない?
 
リファクタリング?
リファクタリング?リファクタリング?
リファクタリング?
 
JAWS-UG開催情報 20170125-8th初心者支部
JAWS-UG開催情報 20170125-8th初心者支部JAWS-UG開催情報 20170125-8th初心者支部
JAWS-UG開催情報 20170125-8th初心者支部
 
クラウドお遍路20161001LT_青木由佳
クラウドお遍路20161001LT_青木由佳クラウドお遍路20161001LT_青木由佳
クラウドお遍路20161001LT_青木由佳
 
отчёт Buybrand expo 2012
отчёт Buybrand expo 2012отчёт Buybrand expo 2012
отчёт Buybrand expo 2012
 
IT女子勉強会LT_どうしようもなくてもキャリアを創れ
IT女子勉強会LT_どうしようもなくてもキャリアを創れIT女子勉強会LT_どうしようもなくてもキャリアを創れ
IT女子勉強会LT_どうしようもなくてもキャリアを創れ
 
Glt vol48
Glt vol48Glt vol48
Glt vol48
 
Symfony meetup-7
Symfony meetup-7Symfony meetup-7
Symfony meetup-7
 
PHP framework Phalcon
PHP framework PhalconPHP framework Phalcon
PHP framework Phalcon
 
Glt vol49
Glt vol49Glt vol49
Glt vol49
 
AWSreinvent2016社内報告yuka_jyotei
AWSreinvent2016社内報告yuka_jyoteiAWSreinvent2016社内報告yuka_jyotei
AWSreinvent2016社内報告yuka_jyotei
 
型超ざっくり入門@ハンズラボ社内勉強会
型超ざっくり入門@ハンズラボ社内勉強会型超ざっくり入門@ハンズラボ社内勉強会
型超ざっくり入門@ハンズラボ社内勉強会
 
EC-CUBE3プラグイン仕様
EC-CUBE3プラグイン仕様EC-CUBE3プラグイン仕様
EC-CUBE3プラグイン仕様
 
継続的デリバリー全体像とハンズオン #yuru_gee #21cafe
継続的デリバリー全体像とハンズオン #yuru_gee #21cafe継続的デリバリー全体像とハンズオン #yuru_gee #21cafe
継続的デリバリー全体像とハンズオン #yuru_gee #21cafe
 
継続的デリバリーを支える開発環境
継続的デリバリーを支える開発環境継続的デリバリーを支える開発環境
継続的デリバリーを支える開発環境
 
サイボウズがWebアプリ自動テスト に活用しているossツールの紹介
サイボウズがWebアプリ自動テスト に活用しているossツールの紹介サイボウズがWebアプリ自動テスト に活用しているossツールの紹介
サイボウズがWebアプリ自動テスト に活用しているossツールの紹介
 
Phpstudy98
Phpstudy98Phpstudy98
Phpstudy98
 
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 
ハンズラボの考えるIoT Innovation EGG 第6回 『IoT 今と未来』
ハンズラボの考えるIoT Innovation EGG 第6回 『IoT 今と未来』ハンズラボの考えるIoT Innovation EGG 第6回 『IoT 今と未来』
ハンズラボの考えるIoT Innovation EGG 第6回 『IoT 今と未来』
 

Similar to Real World PHP in pixiv

せっかくだから俺はこの NPAPI の話をするぜ
せっかくだから俺はこの NPAPI の話をするぜせっかくだから俺はこの NPAPI の話をするぜ
せっかくだから俺はこの NPAPI の話をするぜ
Naruto TAKAHASHI
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
shoma h
 
LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45
civic Sasaki
 

Similar to Real World PHP in pixiv (20)

Php7 on Docker on tekitoh-memdhoi.info
Php7 on Docker on tekitoh-memdhoi.infoPhp7 on Docker on tekitoh-memdhoi.info
Php7 on Docker on tekitoh-memdhoi.info
 
括弧を使わないLispプログラミング
括弧を使わないLispプログラミング括弧を使わないLispプログラミング
括弧を使わないLispプログラミング
 
VPSやめてHerokuに移行したお話
VPSやめてHerokuに移行したお話VPSやめてHerokuに移行したお話
VPSやめてHerokuに移行したお話
 
WordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSWordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPS
 
Python & PyConJP 2014 Report
Python & PyConJP 2014 ReportPython & PyConJP 2014 Report
Python & PyConJP 2014 Report
 
AWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメするAWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメする
 
せっかくだから俺はこの NPAPI の話をするぜ
せっかくだから俺はこの NPAPI の話をするぜせっかくだから俺はこの NPAPI の話をするぜ
せっかくだから俺はこの NPAPI の話をするぜ
 
PyScriptの紹介
PyScriptの紹介PyScriptの紹介
PyScriptの紹介
 
Phpのはなし
PhpのはなしPhpのはなし
Phpのはなし
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
 
PyPy 紹介
PyPy 紹介PyPy 紹介
PyPy 紹介
 
Hannari python#27
Hannari python#27Hannari python#27
Hannari python#27
 
Hadoop Streamingを使って お好きな言語でMap☆Reduce!
Hadoop Streamingを使って お好きな言語でMap☆Reduce!Hadoop Streamingを使って お好きな言語でMap☆Reduce!
Hadoop Streamingを使って お好きな言語でMap☆Reduce!
 
PHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さPHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さ
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
 
xUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキストxUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキスト
 
211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解する211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解する
 
私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46
 
LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45
 
Cumiki - エンジニアのための、ちょっといい感じのドキュメント作成ツール
Cumiki - エンジニアのための、ちょっといい感じのドキュメント作成ツールCumiki - エンジニアのための、ちょっといい感じのドキュメント作成ツール
Cumiki - エンジニアのための、ちょっといい感じのドキュメント作成ツール
 

More from Kenta USAMI

Rubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミングRubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミング
Kenta USAMI
 
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったかDTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
Kenta USAMI
 
キャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化についてキャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化について
Kenta USAMI
 
After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)
Kenta USAMI
 

More from Kenta USAMI (20)

5分でわかる静的解析入門
5分でわかる静的解析入門5分でわかる静的解析入門
5分でわかる静的解析入門
 
なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇
 
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
 
pixivとl10n/i18n
pixivとl10n/i18npixivとl10n/i18n
pixivとl10n/i18n
 
Rubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミングRubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミング
 
Accept-language
Accept-languageAccept-language
Accept-language
 
php.js
php.jsphp.js
php.js
 
これからの名前の話をしよう
これからの名前の話をしようこれからの名前の話をしよう
これからの名前の話をしよう
 
近況の報告と自宅警備員が失職した話
近況の報告と自宅警備員が失職した話近況の報告と自宅警備員が失職した話
近況の報告と自宅警備員が失職した話
 
学ばないDSL
学ばないDSL学ばないDSL
学ばないDSL
 
札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか
 
tadsanとは誰か
tadsanとは誰かtadsanとは誰か
tadsanとは誰か
 
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったかDTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
 
PowerShell+Lisp = ? (第2回残パン会)
PowerShell+Lisp = ? (第2回残パン会)PowerShell+Lisp = ? (第2回残パン会)
PowerShell+Lisp = ? (第2回残パン会)
 
キャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化についてキャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化について
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)
 
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
 
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
 
セキュリティ&プログラミングキャンプに行こう!
セキュリティ&プログラミングキャンプに行こう!セキュリティ&プログラミングキャンプに行こう!
セキュリティ&プログラミングキャンプに行こう!
 

Real World PHP in pixiv