Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アマチュアプログラマがWebサービスを作ってみた /Amateur_Programer_Web...
Search
Masaki Murase
February 03, 2019
Programming
0
93
アマチュアプログラマがWebサービスを作ってみた /Amateur_Programer_Web_Service
非ITエンジニアがYoutubeを使用したタイピングゲーム生成サービスを作成しました。
Masaki Murase
February 03, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
Inside of Swift Export
giginet
PRO
1
250
Vue 3.6 時代のリアクティビティ最前線 〜Vapor/alien-signals の実践とパフォーマンス最適化〜
hiranuma
2
330
GitHub Copilotを使いこなせ!/mastering_github_copilot!
kotakageyama
1
220
理論と実務のギャップを超える
eycjur
0
210
三者三様 宣言的UI
kkagurazaka
0
320
Introduce Hono CLI
yusukebe
6
3.3k
Register is more than clipboard
satorunooshie
1
180
ビルドプロセスをデバッグしよう!
yt8492
0
170
EMこそClaude Codeでコード調査しよう
shibayu36
0
520
AI時代に必須!状況言語化スキル / ai-context-verbalization
minodriven
2
250
ボトムアップの生成AI活用を推進する社内AIエージェント開発
aku11i
0
1.4k
エンジニアインターン「Treasure」とHonoの2年、そして未来へ / Our Journey with Hono Two Years at Treasure and Beyond
carta_engineering
0
470
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
How to train your dragon (web standard)
notwaldorf
97
6.3k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Thoughts on Productivity
jonyablonski
71
4.9k
Being A Developer After 40
akosma
91
590k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Docker and Python
trallard
46
3.6k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
630
Designing Experiences People Love
moore
142
24k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
10
900
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
Transcript
アマチュアプログラマがWebサービス を作ってみた 1 「Youtube Typing Game Generator」 Youtubeの動画URL入力でタイピングゲーム自動生成
自己紹介 プロフィール 村瀬 正樹(むらせ まさき) 平成4年生まれ
愛知県出身 経歴 情報系大学卒業・大学院修了 地図データを使った研究を行った システムはJava, Javascriptで実装 愛知県内の自動車部品メーカー就職 非IT系業務、入社3年目 2
目次 1. Webサービス作成背景 2. 基本機能紹介 3. 使用技術 4. 機能詳細 5.
開発環境 3
1. Webサービス作成背景 「Youtube Typing Game Generator」 Youtubeの動画URL入力でタイピングゲーム自動生成 4
タイピングゲーム タイピングゲームとは 画面に表示されたテキストをキーボードで入力をするゲーム タイピングゲームの目的 タイピング能力向上
タイピング速度の表示や間違えて入力したキーを表示 練習して早く打てるようになるとうれしい 娯楽 文字入力が楽しい キーボードの打鍵音が心地良い ランキング上位に入ると嬉しい 5
タイピングゲームの種類 シンプルなタイピング練習 シンプルにタイピングをする ex. e-typing、美佳タイプ、タイプウェル ゲーム感覚
ゲーム感覚で楽しい ex.ゾンビ打、寿司打 音楽に合わせて 音楽に合わせて歌詞をタイピングできて楽しい ex.歌謡タイピング劇場、火曜タイピング激情、 Typing Tube 6 インターネットでタイピング練習 e-typing (https://www.e-typing.ne.jp/member/) ゾンビ打 THE TYPING OF THE DEAD (https://ameblo.jp/tetchiri/entry-10021182575.html) 歌謡タイピング劇場 (http://casual.hangame.co.jp/typing/)
音楽に合わせたタイピングゲームの例 歌謡タイピング劇場(http://casual.hangame.co.jp/typing/) 運営が用意した音楽を使用してタイピングゲームができる 複数人で協力プレイもできる 火曜タイピング激情(http://mekas.web.fc2.com/ ダウンロード先はリンク切れ)
好きな音楽を使ってタイピングゲームを作ったり遊ぶことができる ローカル環境のみで動作 Typing Tube(https://typing-tube.net/) Youtubeの動画を使ってタイピングゲームを作ったり遊ぶことができる Webベースでユーザーが作成した多くのデータがあり、それらで遊ぶ ことができる 7 欠点:自分の好きな音楽を使ってタイピングができない 欠点:自分で作成するのがめんどくさい 欠点:ユーザーが作ったものがなければ自分で作成する → めんどくさい
Webサービス作成の目的 目的 好きな音楽を使って簡単にタイピングゲームを作成したい 実現可能かどうか 音楽はYoutubeが使える
タイピングテキストもYoutubeの字幕を使えそう Youtube動画のURLを入力して自動でタイピングゲームができ そう 8 Youtube Typing Game Generatorの作成
2. 基本機能紹介 「Youtube Typing Game Generator」 Youtubeの動画URL入力でタイピングゲーム自動生成 9
動画自動生成 動画URLを入力して生成ボタンを押すと自動でタイピン グゲームを生成する 10
登録動画一覧 登録された動画一覧を見ることができる 11
タイピングゲーム スタートボタンを押すと動画が再生され、タイピングす るテキストが表示される 12
テキスト編集 必要に応じでテキストを編集できる 13
ブックマーク機能 お気に入りの動画をブックマークしたり、 フィルターできる(ログイン時のみ) 14
アカウント機能 アカウントを作成し、ログインするとお気に入り動画を 登録できる 15
2. 使用技術 「Youtube Typing Game Generator」 Youtubeの動画URL入力でタイピングゲーム自動生成 16
プログラミング言語 使ったことがある言語 C, Java, PHP, Ruby, Python, Javascript,
Node.js フロントエンドはJavascript 型付きのTypescriptも気になったが・・・ サーバサイドはPHP 文法がC, Javaライクで馴染みがある LAMPのPでありWebで広く使われていて、簡単に始められる 17
PHPフレームワーク PHPフレームワーク Laravel, Symfony, CakePHP, CodeIgniter, FuelPHP, Zend
Framework, Slim Framework,… 最近のトレンドはLaravelらしいが、 フルスタックフレームワークなので初心者には難しい・・・ Slim Frameworkはシンプルなフレームワークなので 扱いやすそう Slim Framework a micro framework for PHP ルーティング ミドルウェア DI PSR-7(HTTP Request, Response) Webサービスを作成するのに必要最低限の機能はある 18 PHPのWAF 多すぎ問題 採用
Javascriptフレームワーク Javascriptフレームワーク、ライブラリ jQuery・・・広く使われており実績はあるが、 最近はどうなんでしょうか? Vue.js・・・最近流行っている、学習コスト低め React,
AngularJS・・・敷居が高そう Vue.js 単一コンポーネントで部品化できる 双方向バインディングがいい感じ VueCLIを使えばコマンド1つでトランスパイル、ビルド可能 19 採用
開発環境 IDE、テキストエディタ 秀丸エディタ・・・テキストエディタでは辛い VScode・・・無料ではあるがIDE並に高機能 拡張機能を自分で入れたり設定がめんどう PhpStorm・・・有料だが、一通りの機能が揃っている
コード補完やジャンプ機能が優秀 開発環境インフラ Vagrant・・・仮想マシンをコマンドで作成できる 簡単に使える Docker・・・少し前から流行っているが、 学習コストを考えて今回はやめる 20 採用 採用
その他使用ツール バージョン管理システム関係 Git, GitHub, SourceTree 21
Webサービス構成要素 OS オープンソースで有名所はUbuntuとCentOS 今回はUbuntuを採用 Database
馴染みのあるPostgreSQLを採用 Web Server, AP Server 馴染みのあるApache(mod_php)を採用 インフラ 自由度が高いIaaS型クラウドのAWSを採用 22
4. 機能詳細 「Youtube Typing Game Generator」 Youtubeの動画URL入力でタイピングゲーム自動生成 23
おおまかな処理の流れ 1. クライアント(Webブラウザ)からRequest受け取る 2. ルーティング処理をし、Controllerに渡す 3. 必要に応じてModel でDB処理や外部API通信、 ロジック処理をし、結果をControllerに返す 4.
Controllerは必要なデータをViewに渡す 5. Controllerから受け取ったデータとテンプレートを紐づけて クライアントに返す 25 ① ② ③ ④ ⑤
データベース構造 accountテーブル アカウントデータ typing_gameテーブル タイピングゲームに 必要なデータ
type_textは1つ動画の タイピングテキストと表示の タイミング時間をあわせた データ(json型) bookmarkテーブル ブックマークに必要な データ 26
動画自動生成 Slim(サーバサイド)実装 1. URLをバリデーションチェック 動画がYoutubeのURLか すでに登録されていないか
字幕データがあるのか 2. 字幕取得サイトで字幕データ取得(Webスクレイピング) 3. 字幕テキストからタイピング用にひらがなに変換(外部APIを利用) 不要な記号はここで削除 4. DB保存(タイピングに必要なデータはjson形式で保存) 表示テキスト、入力文字(ひらがな or 英数字)、 テキスト表示の開始・終了のタイミング 28
登録動画一覧 フロントはTwigテンプレートで実装 動的な処理はないのでJavascript使用せず 表示するデータの条件にリクエストパラメータを使用 例 :
/typingGame/list?page=3& isFilterBookmark=true 3ページ目&ブックマーク済みの動画を表示 DBからリクエストパラメータに基づいて必要な情報を取得して Viewに渡す(サーバサイド実装) 29
タイピングゲーム Vue.js実装 主なクライアント処理 再生時間に応じたテキストの表示 ひらがな ->
ローマ字候補変換 キー入力判定 入力文字画面表示(ローマ字・ひらがな) 30
テキスト編集 Vue.js実装 テキストフィールドを編集すると内部の変数も変化する (双方向データバインディング) 保存ボタンを押すと現在の状態をjsonに変換してサーバーへ送る →DBに保存される 31
ブックマーク機能 Vue.js実装 ブックマークアイコンをクリックをするとajaxで ブックマーク情報がDBに登録・削除される 32
アカウント機能 Slim(サーバサイド)実装 登録 入力文字列のバリデーションチェック slim-validationをMiddlewareとして登録
アカウント情報をDB保存 パスワードは暗号化して保存 認証 DBにあるデータと一致するか 一致すれば認証情報をセッションに登録 CookieにセッションIDを記録してログイン状態を保持する 33
セキュリティー対策 XSS対策 出力にエスケープ処理が必要 →テンプレートエンジンにTwigを使用 CSRF対策
ワンタイムトークンを使用してリクエスト元が正しいか確認 → slim-csrfを使用 SQLインジェクション対策 SQLにエスケープ処理が必要 → PDOのプリペアードメソッドを使用 その他 GitHubにAPI keyやPasswordを入れないようにセンシティブな データは環境変数に格納 34
5. 開発環境 「Youtube Typing Game Generator」 Youtubeの動画URL入力でタイピングゲーム自動生成 35
開発の流れ コーディング・デバッグ 開発用サーバはVagrant上の仮想マシン コーディングはホスト側のPhpStorm ホスト側のブラウザで動作確認
テストコード作成、動作確認 PHPUnit, Selenium Commit, Push その日の終わりor区切りのいいところでCommitする MasterブランチにPushすると、GitHubのWebhookで本番環境のサーバ内の スクリプトを実行し、GitHubからPullする。 37
バージョン管理システム運用 使用するブランチ Masterブランチ:本番環境用 Developブランチ:開発環境用 Topic#??ブランチ:機能追加用
運用方法 1. GitHubでISSUE#??を発行 2. Topic#??ブランチ作成してISSUEに対するコードを書く 3. 終わったらDevelopブランチにPull Request 問題なければDevelopブランチにマージする 4. MasterブランチにDevelopブランチをマージする GitHubにPush→自動デプロイで本番環境反映 38
テスト 単体テスト PHPUnitで作成 ロジックのみに切り出せているクラスのみ (ModelでDBアクセスがないもの) E2Eテスト
Selenium, facebook/php-webdriverで実装 大部分がテストできていないのE2Eテストで動作を保証する 39 テストは勉強不足です
終わりに 反省点 とにかく目的のものを作ることが優先されてイマイチなところが多い 勉強不足なところが多い テスト方法、設計、インフラ周り、デザインパターン
コーディングルールを決めてから始めればよかった キャメルケース、スネークケース、ケバブケースが混ざっているとこがある 苦労したこと トラブルを一人で解決しないといけないこと 工夫したこと シェルスクリプトでサーバ設定を半自動化したこと 学んだこと 初めて使用した Slim, Vue.js, Selenium PhpStorm便利 コードフォーマット、ジャンプ、リファクタリング 感想 初めてWebサービス公開までできたのが楽しかった 完璧なものを目指さなければモチベーションは維持できる とにかく技術不足、Webサービスを作るのにやることがたくさんある 40