ピクシブ百科事典をモダンにしよう - PIXIV SUMMER BOOT CAMP 2020
by
Naoya Yamashita
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
ピクシブ百科事典を モダンにしよう PIXIV SUMMER BOOT CAMP 2020「技術基盤コース」 広島大学大学院 2020.09.18
Slide 2
Slide 2 text
2 ● 所属 ○ 広島大学大学院先進理工系科学研究科パターン認識 (栗田・宮尾)研究室 ディープラーニングを用いた単眼動画像からの深度 (depth)予測 ■ 応用: 一般的な単眼カメラで3Dモデル構築、ARのオクルージョン処理など ● 趣味 ○ 車輪の再開発 ■ HTML再考、use-package再考、IME(ddskk)再考。。。 ○ GitHubでのOSS公開、他プロジェクトへのコントリビューション ○ GNU Emacsへのコントリビューション ● PHPを本格的に触ったことない、HTML/CSSを触ったことがある、 タスクランナー知識はgulpで止まっている。。。からインターン開始 自己紹介 ※1 ※1: Zhengqi Li. et.al., Learning the Depths of Moving People by Watching Frozen People
Slide 3
Slide 3 text
sample page
sample
text sample
11 (html ((lang . "en")) (head nil (meta ((charset . "utf-8"))) (title nil "sample page") (link ((rel . "stylesheet") (href . "sample1.css")))) (body nil (h1 nil "sample") (p nil "text sample"))) https://github.com/conao3/seml-mode.el
Slide 4
Slide 4 text
ピクシブ百科事典 4
Slide 5
Slide 5 text
やったこと 5 導入 から へ移行
Slide 6
Slide 6 text
6 ● これまで: bundlerからruby-sass、またはdockerからsasscによりsass->css変換 ● これから: dart-sassをwebpackからキック、sass->css変換 ● インパクト: ○ docker, rubyの依存を削除できた ○ webpackを導入できた ○ ruby-sass, sasscからナウでヤングなdart-sassへ移行できた ○ ruby-sass, sasscで使えないsass文法(modules)が使えるようになった ● 大変だったこと: ○ gulpの時代で私の知識は止まっていたので、 webpack導入難しい。。 ○ 世の中の記事はsassをminifyして一枚のjsに埋め込むというフローで 書かれていたが、私はsassを「それぞれ」、cssとして書き出したかった やったこと 導入、 から へ移行
Slide 7
Slide 7 text
ピクシブ百科事典の中身 7
Slide 8
Slide 8 text
8 ● テストが書けない ● 関数はスーパーグローバル変数 ($_SERVER) への参照、DBへのアクセスなどがあり 出力が不定 ● 関数内でechoにより出力しており、戻り値がvoid ● 各クラスが膨張しておりメンテナンス性が低い ● コードの改善のために、まずオレオレフレームワークを理解する必要がある ● クラスが直接PHPファイルをincludeしている場所があり、1回しか通らないという暗黙の条 件が仮定されている ○ dispatcherがこれだったので、ランタイムに1回のテストしかできない。。 オレオレフレームワーク
Slide 9
Slide 9 text
9 null | ResponseInterface string url 生include commonHelper Router 302 redirect: http -> https en.dic -> en-dic Controller Dispatcher概要 動的に文字列で クラス名を作り、 new Dispatcher 前処理 コントローラ Nullチェック データの場合, 生echo こまごまとした処理 - cssのパス - jsのパス - 言語設定 - テンプレート展開... commonHelperは 複数回読むと エラーになる $_SERVER index.php
Slide 10
Slide 10 text
やったこと 10 ピクシブ百科事典のオレオレフレームワークからの脱却 クラスを に準拠させる
Slide 11
Slide 11 text
11 ● これまで: オレオレフレームワーク、責務の分割されていないなんでも Dispatcher ○ $_SERVERへアクセスするグローバル依存の牧歌的な PHP ○ テストのときは$_SERVERはセットされてないんだけど。。? ● これから: index.phpからPSR-7 (HTTP message interfaces) を渡し、 そのオブジェクトから情報を得る ● インパクト: ○ $_SERVERへの依存を削除し、PSR-7オブジェクトを使用するようになった ○ 適宜変更したPSR-7オブジェクトを渡し、様々な条件でテストできるように ○ PSR-15 (HTTP Server Request Handlers) ベースのDispatcherへ移行できた ● 大変だったこと: ○ PSR-7...? PSR-15...? 指示の要件が全く理解できない ○ $_SERVER便利すぎる。でも現代のPHPにするために甘えてはいけない。。 やったこと を に準拠させる
Slide 12
Slide 12 text
12 ResponseInterface ServerRequestInterface request 生include commonHelper Router 302 redirect: http -> https en.dic -> en-dic Controller Dispatcher概要 動的に文字列で クラス名を作り、 new Dispatcher 前処理 コントローラ Nullチェック データの場合, 生echo こまごまとした処理 - cssのパス - jsのパス - 言語設定 - テンプレート展開... index.php $_SERVER
Slide 13
Slide 13 text
事故 13
Slide 14
Slide 14 text
14 ● $_SERVER['REQUEST_URI']と$request->getUri()->getPath()は等価ではなかった。 ○ 後者はGETクエリが落ちていた ○ 検索できない 事故
Slide 15
Slide 15 text
15 ● $_SERVER['REQUEST_URI']と$request->getUri()->getPath()は等価ではなかった。 ○ 後者はGETクエリが落ちていた ○ 検索できない ○ 約10分で気付き、一つ前のデプロイに即リバート ○ 初デプロイでサービスを壊しました。。 ● 教訓 ○ デプロイ前及び実装中の手動テストは ja版/en版それぞれの記事閲覧のみで、記事 検索はテストしていなかった。 ○ デプロイ前のコードレビューは実装者の私、メンター、さらっとレビューしてもらった チームメンバー2人と、4人が関わっていたが防げなかった。。 ○ 人間のレビューは必要。しかし機械によるテストも絶対に必要。 事故
Slide 16
Slide 16 text
やったこと 16 ピクシブ百科事典のオレオレフレームワークからの脱却 コントローラクラスを に準拠させる
Slide 17
Slide 17 text
17 ● 文脈: DispatcherはPSR-15ベースになった。コントローラもPSR-15ベースへ ● これまで: ControllerBaseというクラスを拡張したコントローラ Dispatcherはそのコントローラの内容を生echoにより出力 ● これから: - ControllerBaseクラスの依存を削除し、 PSR-15ベースのシングルアクションコントローラへ。 - Dispatcherは本来の責務であるコントローラの起動のみを担当し、 生echoで出力しない。 - PHPUnitによるテストの追加 ! PSR-15ベースになったためテストが書けるようになった。 ● 大変だったこと ○ やはりPSR-7/PSR-15に慣れていなかった。。(インターン4日目) ○ Interfaceと実際のオブジェクトとの関係の把握 ○ {Stream, Response,,,}Factoryから{Stream, Response,,,}を作る概念が慣れなかった やったこと コントローラクラスを に準拠させる
Slide 18
Slide 18 text
18 ResponseInterface 生include commonHelper Router 302 redirect: http -> https en.dic -> en-dic RequestHandlerInterface \Dic\Ja\Http\Controller\Sitemap\IndexAction Dispatcher概要 Dispatcher 前処理 データの場合, 生echo こまごまとした処理 - cssのパス - jsのパス - 言語設定 - テンプレート展開... コントローラ Nullチェック 従来の Controller ServerRequestInterface request index.php RequestHandlerInterface の場合、早期リターン
Slide 19
Slide 19 text
やったこと 19 ピクシブ百科事典のオレオレフレームワークからの脱却 の前処理を のミドルウェアとして実装
Slide 20
Slide 20 text
20 ● 文脈: Dispatcher, コントローラはPSR-15ベースになった。 ルーティング前処理 (特定の条件に対して404を返す) もPSR-15ベースへ ● これまで: ルーティングする前にDispatcherが条件チェック ● これから: Dispatcherを呼ぶ前のPSR-15, Middlewareとして起動するように ● 大変だったこと / 気付き: ○ PSR-15 Middleware...? ○ しかし、ここらへんで理解が進み、 PSRベースの抽象化による設計のクリーンさ、標準イン ターフェースをそれぞれのクラスが実装しているという安心感に気付く ○ PHPStanによる静的解析が本来の力を出し始め、機械の助言を得ながら実装する という体験の良さを実感 やったこと の前処理を のミドルウェアとして実装
Slide 21
Slide 21 text
21 ResponseInterface Router 302 redirect: http -> https en.dic -> en-dic RequestHandlerInterface \Dic\Ja\Http\Controller\Sitemap\IndexAction Dispatcher概要 こまごまとした処理 - cssのパス - jsのパス - 言語設定 - テンプレート展開... コントローラ Nullチェック 従来の Controller ServerRequestInterface request index.php Dispatcher 前処理 commonHelper RequestHandlerInterface の場合、早期リターン データの場合, 生echo
Slide 22
Slide 22 text
まとめ 22
Slide 23
Slide 23 text
23 ● ピクシブ百科事典を (ほんの一部のクラスだが) 現代のPHPに近づけることができた ● これからの追加要件にも見通しやすく対応できるコードベースにできた ● オレオレフレームワークから現代の PHPにするという、 技術的なやりがいのある、とても良いテーマを実践できた ● index.phpとDispatcher.phpを変更したので、ピクシブ百科事典にアクセスすると 必ず私のコードが動く... ! という達成感 まとめ
Slide 24
Slide 24 text
24 ● チームメンバーとの交流/雑談はとても刺激になりました。 ありがとうございました ! ● メンターのtadsanさんには「PHP...? 触ったことないです...」という私に 現代のPHPの概念を分かりやすく解説して頂き、さらにペアプロにも長時間付き合って頂けまし た。 この8日間、充実したインターンにできたのは tadsanさんのおかげです。 本当にありがとうございました ! さいごに