Chatdealerの高速開発を支えるLaravel
by
kyoshimoto
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
の高速開発を支える Laravel 株式会社ラクス 吉元和仁 ラクスミートアップ大阪
Slide 2
Slide 2 text
自己紹介 • 吉元 和仁 • 株式会社ラクス クラウド事業本部 開発統括部 第二開発部 • 経歴: – 2011 年 ラクス入社 – 2011 年 メールディーラー 開発 – 2017 年 チャットディーラー 開発 – 2018 年 配配メール 開発 1
Slide 3
Slide 3 text
• ノンフレームワークサービスの課題 • チャットディーラーとは • なぜ Laravel を選択したか? • Laravel で良かったこと • Laravel で困ったこと • まとめ 今日話すこと 2
Slide 4
Slide 4 text
ノンフレームワークサービスの課題 3
Slide 5
Slide 5 text
4 https://www.maildealer.jp/products/ メールディーラーとは
Slide 6
Slide 6 text
• 2001 年にサービス提供開始 • 4,000 社以上の導入実績 • メール共有・管理システム市場で 9 年連続 シェア No.1 5 メールディーラーとは
Slide 7
Slide 7 text
• 2001 年にサービス提供開始 • 4,000 社以上の導入実績 • メール共有・管理システム市場で 9 年連続 シェア No.1 • PHP でノンフレームワークで開発 6 メールディーラーとは
Slide 8
Slide 8 text
• 15年以上改修され続けてきたコード • 手続き型モジュール • ビューとロジックが分離されていない 7 ノンフレームワークサービスの課題
Slide 9
Slide 9 text
• グローバル変数が数千個以上 • 何を返すか分からない共通関数 – 値?配列?HTML?Exit?グローバル上書き? Etc.. 可読性・保守性が著しく低下 8 ノンフレームワークサービスの課題
Slide 10
Slide 10 text
• 課題への取り組み – テスト自動化(PHPUnit, Jenkins, Selenium) – 静的コード解析ツールで品質可視化 – PHPStorm導入 – 地道なリファクタリング 脱レガシーの道のりは険しい 9 ノンフレームワークサービスの課題
Slide 11
Slide 11 text
10 そんな課題感をもつ開発チームが 新サービス立ち上げにチャレンジ!
Slide 12
Slide 12 text
チャットディーラーとは 11
Slide 13
Slide 13 text
サービス概要 • Web ページに専用スクリプトを埋め込んで 利用する Web チャットシステム(SaaS) • 本文 12 https://www.chatdealer.jp/products/
Slide 14
Slide 14 text
サービス概要 • Web ページに専用スクリプトを埋め込んで 利用する Web チャットシステム(SaaS) • 本文 13 https://www.chatdealer.jp/products/
Slide 15
Slide 15 text
技術スタック • 言語、フレームワーク – PHP、Laravel – Node.js、Express、Socket.IO • 開発環境 – PhpStorm、Jenkins、Redmine、GitLab、 Mattermost • インフラ – 仮想基盤(オンプレ)、nginx、Apache、 PostgreSQL、Redis 14
Slide 16
Slide 16 text
開発チーム構成 • プロジェクトマネージャー • エンジニア – バックエンド (PHP):3名 – フロントエンド (Node.js):3名 15
Slide 17
Slide 17 text
開発スケジュール 16 2月 3月 4月 5月 6月 7月 要件定義 2017年 開発基盤整備 設計 実装・単体テスト システム テスト β版フィード バック改修 β版リリース 本番リリース
Slide 18
Slide 18 text
なぜ Laravel を選択したか? 17
Slide 19
Slide 19 text
新サービスの立ち上げに際しての課題 • 短納期(実装2ヶ月) • レガシーからの脱却 18
Slide 20
Slide 20 text
フレームワーク選定条件 • 長期サポート • 機能性 19
Slide 21
Slide 21 text
選定条件:長期サポート • シェア率が高い、人気がある • 活発なコミュニティ • LTS (Long-Term Support) を宣言している 20 青色が Laravel https://trends.google.co.jp/trends/explore?date=today%205- y&geo=JP&q=Laravel,CakePHP,Symphony,CodeIgniter,FuelPHP
Slide 22
Slide 22 text
選定条件:機能性 • Webの基本機能がすぐに使える状態 – ルーティング – テンプレートエンジン – バリデーター – マイグレーション – ページネーション Etc… 21
Slide 23
Slide 23 text
選定条件:機能性 • ミドルウェアやライブラリとの連携 – ミドルウェア – クライアントサイドのライブラリ – ユニットテストライブラリ 22
Slide 24
Slide 24 text
フレームワーク選定のまとめ • 長期サポート – LTS 対応 – 一番人気で、今なお人気上昇中 – コミュニティも活発 • 機能性 – フルスタックフレームワーク Laravel を採用することに決定 23
Slide 25
Slide 25 text
Laravel で良かったこと 24
Slide 26
Slide 26 text
Laravel で良かったこと • オールインワンでスピード開発に向いていた • 簡単設定でどんなものにも繋がる • 標準ライブラリが使いやすい • ドキュメントが充実していた 25
Slide 27
Slide 27 text
Laravel で良かったこと • オールインワンでスピード開発に向いていた • 簡単設定でどんなものにも繋がる • 標準ライブラリが使いやすい • ドキュメントが充実していた 26
Slide 28
Slide 28 text
オールインワンでスピード開発に向いていた • 準備コストが削減できたので、ロケットス タートを決めることができた – 標準機能が充実 ルーティング、Middleware、DI、バリデーション、 テンプレートエンジン (Blade)、バッチ処理 (Command)、 マイグレーション、デバッグ、クエリビルダ、ページネーション、 セッション – フロントエンド用ライブラリ標準バンドル Bootstrap、jQuery、Vue.js 27
Slide 29
Slide 29 text
Laravel で良かったこと • オールインワンでスピード開発に向いていた • 簡単設定でどんなものにも繋がる • 標準ライブラリが使いやすい • ドキュメントが充実していた 28
Slide 30
Slide 30 text
簡単設定でどんなものにも繋がる • チャットディーラーで利用しているミドル ウェアの一例 – PostgreSQL – Redis – Postfix いずれも、接続のための仕組みは準備されており、 簡単設定で繋がった 29
Slide 31
Slide 31 text
Laravel で良かったこと • オールインワンでスピード開発に向いていた • 簡単設定でどんなものにも繋がる • 標準ライブラリが使いやすい • ドキュメントが充実していた 30
Slide 32
Slide 32 text
標準ライブラリが使いやすい • ルーティング – URL とコントローラの紐づけが直観的に書けて わかりやすかった 31
Slide 33
Slide 33 text
標準ライブラリが使いやすい • Middleware – 事前・事後処理を追加したい ルーティング設定 をgroupメソッドで囲うだけ 32
Slide 34
Slide 34 text
標準ライブラリが使いやすい • DI – メソッドの引数に、クラス名をタイプヒントす るだけ 33
Slide 35
Slide 35 text
標準ライブラリが使いやすい • バリデーション – Request クラスに、バリデーションを追加する だけ 34
Slide 36
Slide 36 text
• バリデーション – バラエティ豊富なバリデーションルール 標準ライブラリが使いやすい 35 https://readouble.com/laravel/5.5/ja/validation.html
Slide 37
Slide 37 text
標準ライブラリが使いやすい 36 • テンプレートエンジン(Blade) – ノンフレームワークサービスの場合
Slide 38
Slide 38 text
• テンプレートエンジン(Blade) – Laravel の場合 標準ライブラリが使いやすい 画面ごとに切替えたいコンテンツを @yield ディレクティブで指定する 37 @section ディレクティブ内に 挿入するコンテンツを記述する
Slide 39
Slide 39 text
• バッチ処理(Command) – ノンフレームワークサービスの場合 標準ライブラリが使いやすい バージョンアップを重ねていく内に cron レコードが増えていく 38
Slide 40
Slide 40 text
• バッチ処理(Command) – Laravel の場合 • cron は 1 レコードのみ • 実行スケジュールを PHP で記述できる 標準ライブラリが使いやすい 39
Slide 41
Slide 41 text
• マイグレーション – ノンフレームワークサービスの場合 – Laravel の場合 アプリケーションのバージョンより、 新しいバージョンをファイル名に含 むパッチファイルを実行 コマンドを実行するだけで、マイグ レーションファイルの中から未実行 のファイルのみを自動実行 ロールバックも可能 40 標準ライブラリが使いやすい
Slide 42
Slide 42 text
標準ライブラリが使いやすい エラーメッセージ スーパーグローバル、 環境情報など スタックトレース エラー発生箇所 41 • デバッグ
Slide 43
Slide 43 text
Laravel で良かったこと • オールインワンでスピード開発に向いていた • 簡単設定でどんなものにも繋がる • 標準ライブラリが使いやすい • ドキュメントが充実していた 42
Slide 44
Slide 44 text
ドキュメントが充実していた • 必要な情報が公式ドキュメントとして準備さ れていた 43 http://laravel.jp/
Slide 45
Slide 45 text
ドキュメントが充実していた • 公式ドキュメントが日本語化されていた 44 https://readouble.com/laravel/5.5/ja/
Slide 46
Slide 46 text
Laravel で困ったこと 45
Slide 47
Slide 47 text
Laravel で困ったこと • Vue.js は思ったより難しかった • Blade (SSR) + Vue.js での脆弱性 46
Slide 48
Slide 48 text
Laravel で困ったこと • Vue.js は思ったより難しかった • Blade (SSR) + Vue.js での脆弱性 47
Slide 49
Slide 49 text
Vue.js は思ったより難しかった 48 • Vue.jsとは – クライアントJavaScript フレームワーク – Laravel にバンドルされている
Slide 50
Slide 50 text
Vue.js は思ったより難しかった 49 • Vue.js 導入を検討 – チームメンバーはみな jQuery に慣れ親しんで いる – Laravel との相性は良いはず。 – 「学習コストが低い」という前評判 – 公式のガイドを見てもそんな印象 – 確かに簡単そうだ(と思ってしまった)
Slide 51
Slide 51 text
Vue.js は思ったより難しかった • そして導入を決断! 50 クライアントサイドは すべてVue.jsで実装してね。 学習コストも低いし。
Slide 52
Slide 52 text
Vue.js は思ったより難しかった • 導入した結果 51 JSライブラリの入力値が取れないんだけど。 jQuery なら1行で書けるのに! XSS発生しました! jQuery じゃないので、間に合いません。 jQuery 使っていいですか?
Slide 53
Slide 53 text
Vue.js は思ったより難しかった 52 • 「学習コストが低い」とは言え、ちゃんと勉 強しないとダメだった • jQuery 脳からのパラダイムシフトが必要。 • 他のライブラリと併用するにはノウハウが必 要。(jQuery、Bootstrap、他)
Slide 54
Slide 54 text
Laravel で困ったこと • Vue.js は思ったより難しかった • Blade (SSR) + Vue.js での脆弱性 53
Slide 55
Slide 55 text
Laravel で困ったこと • Vue.js は思ったより難しかった • Blade (SSR) + Vue.js での脆弱性 54
Slide 56
Slide 56 text
Blade (SSR) + Vue.js での脆弱性 • ある日の後輩との会話 55 Blade+Vue.jsでXSSが簡 単に発生させれますよ! 忙しい時期に、重大バグを 見つけてくれてありがとう。
Slide 57
Slide 57 text
• SSR と Vue.js の組み合わせで起こる XSS サーバーでの処理 ブラウザでの処理 Blade (SSR) + Vue.js での脆弱性
{{ $name }}
sample.blade.php Blade で処理 $name = “{{ alert(‘XSS') }}”
{{ alert('XSS') }}
{{ alert(‘XSS’) }}
Vue.js が処理
56 {{ … }} の中の スクリプトが実行 される! 処理済みのHTMLデータ レスポンス送信 ブラウザが読込
Slide 58
Slide 58 text
• SSR と Vue.js の組み合わせで起こる XSS サーバーでの処理 ブラウザでの処理 Blade (SSR) + Vue.js での脆弱性
{{ $name }}
sample.blade.php Blade で処理 $name = “{{ alert(‘XSS') }}”
{{ alert('XSS') }}
{{ alert(‘XSS’) }}
Vue.js が処理
57 {{ … }} の中の スクリプトが実行 される! 処理済みのHTMLデータ レスポンス送信 ブラウザが読込
Slide 59
Slide 59 text
• SSR でユーザー入力値を Vue.js 管轄の領域 に埋め込むだけで、簡単にXSSを実装できて しまう • 開発チームでは “mustache injection” と呼 んでいる Blade (SSR) + Vue.js での脆弱性 58
Slide 60
Slide 60 text
Blade (SSR) + Vue.js での脆弱性 • “mustache injection” 対策 – Middleware で、すべてのリクエストパラメータ をエスケープ – “{{“ や “}}” の文字間に半角空白を挿入する – 入力値が変わってしまうが、やむなし。。 59
Slide 61
Slide 61 text
まとめ 60
Slide 62
Slide 62 text
まとめ • フレームワークがスピード開発に役立った – ミドルウェアとの連携 – MVCの考えに沿ったソース配置 – ビジネスロジックに集中できた! • とくに Laravel でよかったこと – 豊富な機能 – 日本語公式ドキュメント 61
Slide 63
Slide 63 text
まとめ • Vue.js の注意点 – SSRとの連携 – 仮想DOM と リアルDOM の連携 – アーキテクチャ・パターンの理解 – プロダクトで使うにはコンポーネント化が必須 – jQuery 熟練者への配慮 62
Slide 64
Slide 64 text
まとめ • フレームワーク経験がなくても、新サービス が開発できる。Laravel があれば。 63 おわり