tag:crieit.net,2005:https://crieit.net/users/naichilab/feed naichiの投稿 - Crieit Crieitでユーザーnaichiによる最近の投稿 2019-03-28T12:23:25+09:00 https://crieit.net/users/naichilab/feed tag:crieit.net,2005:PublicArticle/14859 2019-03-06T00:48:44+09:00 2019-03-28T12:23:25+09:00 https://crieit.net/posts/Slack-GAS SlackのファイルをGASで自動削除する <p>Unityゲーム開発者ギルドというコミュニティを運営しているんだけど、<br /> 無料版で使っているSlackのファイルストレージがギリギリになってた。</p> <p><a href="https://crieit.now.sh/upload_images/9ba5a50ad15a3c66d2ef0e24bb8b8c485c7e990fd0111.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9ba5a50ad15a3c66d2ef0e24bb8b8c485c7e990fd0111.png?mw=700" alt="スクリーンショット 2019-03-06 0.28.01.png" /></a></p> <blockquote> <p>Unityギルドについてはこちら -> https://twitter.com/naichilab/status/1061929632037892096</p> </blockquote> <p>このままじゃファイルアップロードできなくなっちゃうので、古いファイルは自動削除されるようにした。<br /> とりあえず30日以上経過したファイルは問答無用で消していこう。</p> <p>(Slackのメッセージも今のペースだと2週間たらずで消えちゃうから30日経過したら削除で十分だろうと判断)</p> <p>GASで下記スクリプトを作成。プロジェクトのプロパティでレガシートークンをセットして1時間トリガーを仕掛けた。</p> <blockquote> <p>1時間ごとに起動して、30日以上経過したファイルを10件検索&削除。</p> </blockquote> <p>削除後の反映は最大48時間かかるらしいので様子見〜。</p> <pre><code class="js">function deleteOldFiles() { var res = filesList(30, 10); if(res.files.length == 0){ Logger.log("削除対象ファイルは見つかりませんでした。"); return; } res.files.forEach(function(file){ Logger.log("削除します。 ID=" + file.id + ", Size=" + file.size); filesDelete(file.id) Utilities.sleep(50);//sleep 50msec }); } //ref. https://api.slack.com/methods/files.list function filesList(days, count){ var params = { token: PropertiesService.getScriptProperties().getProperty("SLACK_ACCESS_TOKEN"), ts_to: elapsedDaysToUnixTime(days), count: count } return execute('files.list', params); } //ref. https://api.slack.com/methods/files.delete function filesDelete(id){ var params = { token: PropertiesService.getScriptProperties().getProperty("SLACK_ACCESS_TOKEN"), file: id } return execute('files.delete', params); } function execute(apiName, params){ var options = { 'method': 'POST', 'payload': params } var res = UrlFetchApp.fetch('https://slack.com/api/' + apiName,options); return JSON.parse(res.getContentText()); } function elapsedDaysToUnixTime(days){ var date = new Date(); var now = Math.floor(date.getTime()/ 1000); // unixtime[sec] return now - 8.64e4 * days + '' // 8.64e4[sec] = 1[day] 文字列じゃないと動かないので型変換している } </code></pre> naichi tag:crieit.net,2005:PublicArticle/14673 2018-12-18T00:03:29+09:00 2018-12-28T19:15:32+09:00 https://crieit.net/posts/ea250a7a9a973687d32b329eebbc8132 長期化する個人サービス開発でモチベーションを維持する方法 〜unityroomができるまで〜 <p>こちらは<a href="https://crieit.net/">Crieit</a>で開催されている「<a href="https://crieit.net/advent-calendars/2018/crieit">アドベントカレンダー</a>」18日目の記事です。<br /> 何書いてもいいそうなんでちょっとポエミーな記事かきます。</p> <p>昨日は<a href="https://crieit.net/users/33hata33">Hata</a>さんの<a href="https://crieit.net/posts/40">今年スマホアプリを作ってプログラマーになった40代女性の話。</a>でした。<br /> ちょっと感動しました。何を始めるにも遅すぎるなんてことはないですね。</p> <h3 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h3> <p>まずはこちらの記事をご覧ください。<br /> 個人でサービスを作りきるために必要なことが分かりやすくまとめられています。とても有益〜。</p> <p><a target="_blank" rel="nofollow noopener" href="https://blog.nabettu.com/entry/single-develop" target="_blank" rel="noopener">個人開発のモチベーションが続かない、作り終わらない。原因と対策を考えてみた。 - フロントエンドの地獄</a></p> <p>さて、そこに書かれているような「小さめ」「短期間」「未経験技術は使わない」といったコツを思いっきり無視したらどうなるでしょうか?</p> <p>今振り返ると笑い話ですが、私の作ったゲーム投稿サイト「<a target="_blank" rel="nofollow noopener" href="https://unityroom.com">unityroom</a>」の開発がまさにそういうアンチパターンの塊でした。</p> <p>思い立ってから初期リリースまで1年半もかかりました。<br /> なぜそんなにかかったのか、どうやってモチベーションを維持したのか、そのあたりを思い出しながら書いてみたいと思います。</p> <blockquote> <p>今日の記事は初期リリースまでの思い出話です。初期リリースから2年経過した現在の構成について興味があれば下記記事もどうぞ。<br /> <a target="_blank" rel="nofollow noopener" href="https://blog.naichilab.com/entry/tech-of-unityroom" target="_blank" rel="noopener">ゲーム投稿サイト「unityroom」に使われている技術 - naichi&#39;s lab</a></p> </blockquote> <h3 id="実際どれくらいかかったのか"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%A9%E3%82%8C%E3%81%8F%E3%82%89%E3%81%84%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">実際どれくらいかかったのか</a></h3> <p>リポジトリや過去ブログを漁ってみました。</p> <ul> <li>2014年 <ul> <li>12月 Rails Tutorial開始した(Railsの勉強)</li> </ul></li> <li>2015年 <ul> <li>4月 ConoHa VPSにChefでRails環境構築を自動化した(サーバー構築自動化の勉強)</li> <li>6月 ConoHa ObjectStorageを使う方法調べる(ファイルアップロード方法の模索)</li> <li>8月 テスト認定技術者試験(JTSQB)合格(テスト手法に興味を持ち勉強)</li> <li>10月 SASS(CSS)ちょっと学んだ(Webデザインも覚えたくて勉強)</li> <li>11月 ActionMailerと格闘する(このころがたぶんRailsTutorial3周目)</li> <li>12月 Capistrano3でデプロイを自動化した(デプロイ自動化の練習)</li> </ul></li> <li>2016年 <ul> <li>1月 本格的にunityroomのプロダクトコードを書き始める(やっと開発)</li> <li>2月 RSpec勉強しながらテストコード書く(開発)</li> <li>4月 最低限の機能完成(開発)</li> <li>4月末 一般公開!</li> </ul></li> </ul> <p>日付が分かるものだけを書き出してみたらこんな感じでした。</p> <p>全部で16ヶ月も...かかっている...</p> <p>前半1年は勉強しかしてないし本腰入れたのはラスト4ヶ月みたいですね。</p> <h3 id="どうしてこんなことになってしまったのか..."><a href="#%E3%81%A9%E3%81%86%E3%81%97%E3%81%A6%E3%81%93%E3%82%93%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B...">どうしてこんなことになってしまったのか...</a></h3> <h4 id="やりたいことが多過ぎた!"><a href="#%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E5%A4%9A%E9%81%8E%E3%81%8E%E3%81%9F%EF%BC%81">やりたいことが多過ぎた!</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://blog.naichilab.com/entry/tech-of-unityroom">こちらの技術説明記事</a>にも書いたんですが、unityroomを作る前に似たようなサイトを運用していました。<br /> (アップロードするファイル形式が違うだけで、どちらも同じゲーム投稿サイトです)</p> <p>前身となるサイトがあったからこそ、ああしたい・こうしたいという夢が広がっていました。</p> <p>イケてるデザイン、超使いやすいアップローダ、ユーザー間の交流もしたい。<br /> ランキングもつけたいしスマホでも遊びたい、とか。</p> <p>運用面でも、FTPで更新するのもう嫌だからデプロイ自動化しよう。<br /> 開発者としてテストとか書けるようになりたいなやってみよう。とか出てくる出てくる。</p> <p>ここまで盛り込むとどう考えてもWeb開発初心者(PHPちょっとやっただけ、Rails未経験、CSSわからん)が1ヶ月で作れるボリュームではありません。</p> <p>まぁ初心者が作りたいって思ったらボリュームなんて気にしないですよねw</p> <h4 id="Rails舐めてた!"><a href="#Rails%E8%88%90%E3%82%81%E3%81%A6%E3%81%9F%EF%BC%81">Rails舐めてた!</a></h4> <p>Rails楽しそう!で勉強を始めましたが正直なめてました。<br /> Railsチュートリアル3周、入門書を2冊、Progateもやって、ブログ記事読み漁って...それぐらいしてやっと馴染んでくるレベル。</p> <p>Rubyいれるために <code>rbenv</code> ってのが出てきて、Rails入れるために <code>bundler</code> が出てきて、Rails自体にも <code>bundle exec rails xxx</code> とかってコマンドが無数にあります。</p> <p>さらにPHPと違って共用サーバーじゃ動かないからVPSが必要で、VPSはOSから入れないといけないからLinuxも勉強して、デプロイするために各種ツールが必要で...。(この辺りは後に全部捨ててHerokuに載せ換えることとなります)</p> <p>下記記事をみてもらうと分かるんですが、Railsにはとてもたくさんの技術・知識が使われています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/jnchito/items/063e332cbe3023f52f93" target="_blank" rel="noopener">あなたがマスターしたのはいくつ? Railsを習得するために必要な技術要素の一覧 #Rails - Qiita</a></p> <p>ほんとRails恐ろしい子!</p> <p>無計画にRailsをやり始め、「これ何だろう?」って立ち止まるたびにググっては横道にそれ、面白いと感じたら本を読む。<br /> それを繰り返していった結果、非常に多くの時間を費やしてしまいました。</p> <p>当然ですが、<code>Railsを使う</code> ために全て理解・習得する必要はないです。</p> <p>行き詰まってもググれば先駆者の記事が見つかりますし、コピペでもどうにかなることがほとんどです。</p> <p>私の場合は技術習得に比重を置いたため、学ぶ分野が増えてしまいました。</p> <h4 id="未経験技術に触れ過ぎた!"><a href="#%E6%9C%AA%E7%B5%8C%E9%A8%93%E6%8A%80%E8%A1%93%E3%81%AB%E8%A7%A6%E3%82%8C%E9%81%8E%E3%81%8E%E3%81%9F%EF%BC%81">未経験技術に触れ過ぎた!</a></h4> <p>Railsでアプリをリリースするだけであれば、CI/CD(自動テストや自動デプロイ等)まで手を出す必要はなかったのですが楽しそうなので寄り道してしまいました。</p> <p>開発中に触れた未経験な技術を並べてみます。(現在使ってないものも含む)</p> <ul> <li>Ruby / rbenv / bundler</li> <li>Rails / rake / unicorn / puma / gem各種</li> <li>Sass(CSS)</li> <li>RSpec</li> <li>Jenkins / CircleCI</li> <li>Capistrano3</li> <li>ConoHa / VPS / ObjectStorage</li> <li>CentOS / Linuxコマンド各種</li> <li>Ansible / Chef</li> <li>Heroku / Heroku Pipeline</li> <li>Rubymine</li> </ul> <p>書籍が出てるものは買って読んだし、チュートリアルは手を動かしたし、どう使えば開発運用が楽になるか模索していました。</p> <p>そりゃ時間かかりますよね。</p> <h3 id="どうして続けられたのか"><a href="#%E3%81%A9%E3%81%86%E3%81%97%E3%81%A6%E7%B6%9A%E3%81%91%E3%82%89%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%8B">どうして続けられたのか</a></h3> <p>ふらふらと寄り道しながらもリリースまで続けられた理由を考えてみます。</p> <h4 id="作りたい具体的なイメージを持ち続けた"><a href="#%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%84%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E6%8C%81%E3%81%A1%E7%B6%9A%E3%81%91%E3%81%9F">作りたい具体的なイメージを持ち続けた</a></h4> <p>前身サイトもゲーム投稿サイトだったので、公開したらどんな感じで使ってもらえるかある程度想像がついていました。</p> <p>自分もゲームを作っているので、作ったゲームが遊ばれることがどれほど嬉しいか知っています。<br /> 気軽にゲームを公開してもらいたい。<br /> 可能ならはじめて公開する場として使ってもらいたい。</p> <p>開発期間が長期化してもそのイメージがずっとあったので、目標を見失わずに続けられました。</p> <p>普段飽きやすい私が1年半も作り続けられたのは、やはり自分自身が使いたいものを作っていたからかなと思います。</p> <h4 id="コツコツ続けた"><a href="#%E3%82%B3%E3%83%84%E3%82%B3%E3%83%84%E7%B6%9A%E3%81%91%E3%81%9F">コツコツ続けた</a></h4> <p>ちょうど作っていた時期、不幸にも往復5時間かかる職場に通勤していました。<br /> (バス+電車+地下鉄+徒歩)まぁ自分で選んだんですけど...</p> <p>不幸中の幸い(?)、安定して片道1時間電車に座れたのでその時間を開発に当てていました。</p> <p>1時間っていう時間が「今日はこれをやろう!」と決めてから「ある程度進捗が出はじめる」のにちょうどいいんですよね。</p> <p>朝進捗があると夜エンジンかかるのも早いです。これが毎日なので少しずつですが着実に進みます。</p> <p>こんな生活を1年続けたので勤務日だけでも2h*220日=440時間...元気があれば帰宅後や休日もやってたので結構な時間やってますね。</p> <blockquote> <p>フルタイムの業務に加えて残業60時間+通勤100時間かかってました。なのに電車で寝ないで開発するとか今考えると頭おかしいですね</p> </blockquote> <h4 id="GitHubに草生やすのも楽しい"><a href="#GitHub%E3%81%AB%E8%8D%89%E7%94%9F%E3%82%84%E3%81%99%E3%81%AE%E3%82%82%E6%A5%BD%E3%81%97%E3%81%84">GitHubに草生やすのも楽しい</a></h4> <p><a href="https://crieit.now.sh/upload_images/4fd0088157f327fd58dbcceade1ef2e75c17ba02a3da5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4fd0088157f327fd58dbcceade1ef2e75c17ba02a3da5.png?mw=700" alt="20181217220022.png" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/naichilab">naichilab | GitHub</a> (これは2018年のグラフ)</p> <p>GitHubにはコミットをグラフ化する機能があります。</p> <p>よーし1コミットだけやるぞ!って机に向かったらめっちゃ捗ったりとかありません??</p> <h4 id="小さな達成感のコントロール"><a href="#%E5%B0%8F%E3%81%95%E3%81%AA%E9%81%94%E6%88%90%E6%84%9F%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB">小さな達成感のコントロール</a></h4> <p>多くの未経験技術に触れたと書きましたが、どれも楽しみながら学びました。</p> <p>わかりやすく書かれた入門書を読むことは、比較的安価に達成感を味わえるのでオススメです。</p> <ul> <li>達成感①:スラスラ読めるので数日で1冊読み終わる</li> <li>達成感②:知らない技術を分かった気になれる</li> <li>達成感③:上記①②から、着実に進んだと思いこめる</li> </ul> <p>まぁ本読んだだけでは使いこなせないです。それは問題ではなくて、少なからず知識が増えたことを喜ぶことが重要。</p> <p>メインの開発が行き詰まったとき、しんどい思いしながら続けると病んでしまいます。<br /> そういう時はストレス解消だと思って気軽に別の技術に触れています。</p> <p>ストレス解消できて成長も感じられていい感じ。</p> <h4 id="焦らない"><a href="#%E7%84%A6%E3%82%89%E3%81%AA%E3%81%84">焦らない</a></h4> <p>誰でも無料でサービス開発ができる時代になりました。日々数多くのサービスがリリースされています。</p> <p>素晴らしい品質のサービスもたくさんあり、自分のサービスと比較すると着眼点・技術力の差に目眩がします。</p> <p>それでも今の自分に出来ないことは出来ないので焦っても仕方がないです。</p> <p>1つ1つの開発を急ぐより、多少時間がかかっても着実にリリースすることを重視したいです。出し続けられることの方が大事。</p> <p>千里の道も一歩から。</p> <p>楽しく開発して長く続けましょう!!!</p> <h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://unityroom.com">unityroom</a>の開発が長期化した理由と、モチベーションを保ってリリースできた理由を思い出しながら書いてみました。</p> <p>人によってモチベーションのコントロール方法は違うと思います。<br /> どのような方法が合うのかもやってみないと分からないことが多いです。</p> <p>今日書いた内容が、1000人に1人でいいのでモチベーションが尽きかけてる人の一助になれば幸いです。</p> <p>一緒に開発を楽しみましょう〜!!</p> <p>明日は<a href="https://crieit.net/users/iju_miho">Porin</a>さんです!お楽しみに!</p> naichi tag:crieit.net,2005:PublicArticle/14656 2018-12-14T00:03:14+09:00 2018-12-15T22:38:15+09:00 https://crieit.net/posts/unityroom ゲーム投稿サイト「unityroom」に使われている技術 <p><a href="https://crieit.now.sh/upload_images/3b92415818f0516b976d35bdb85d6aca5c12684a50548.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3b92415818f0516b976d35bdb85d6aca5c12684a50548.png?mw=700" alt="20181210234000.png" /></a></p> <p>こちらは<a href="https://crieit.net/">Crieit</a>で開催されている「<a href="https://crieit.net/advent-calendars/2018/technology">個人開発サービスに用いられている技術 Advent Calendar 2018</a>」14日目の記事です。<br /> 昨日は<a href="https://crieit.net/users/nabettu">nabettu</a>さんの「<a href="https://crieit.net/posts/comets-Crieit">cometsを支える技術</a>」でした。cometsを使えば発表が楽しくなること間違い無しですね!</p> <h3 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h3> <p>こんにちは、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/naichilab">@naichilab</a>です。Unity製のゲームを投稿できるサイト、「<a target="_blank" rel="nofollow noopener" href="https://unityroom.com/">unityroom</a>」を開発・運用しています。</p> <p><a href="https://crieit.now.sh/upload_images/773e7dbf0527e0184a759a8f8a40b82a5c126830a7936.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/773e7dbf0527e0184a759a8f8a40b82a5c126830a7936.gif?mw=700" alt="20181211213716.gif" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://unityroom.com/">unityroom</a></p> <p>すべてのゲームが無料で、PCとWebブラウザさえあれば遊べます。<br /> 数多くのゲームが投稿されてますのでぜひ遊びに来てください。</p> <p>このサイトは2016年4月29日に公開しました。<br /> あれから約2年半、おかげさまで公開されたゲームは3000を超え、非公開や限定公開も含めると4500を超える作品が投稿されています。</p> <p>今日はアドベントカレンダーということで、このサービスにどのような技術が使われているかをご紹介したいと思います。</p> <h3 id="Ruby on Rails"><a href="#Ruby+on+Rails">Ruby on Rails</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://rubyonrails.org/">Ruby on Rails</a>は聞いたことある方も多いと思います。<br /> Ruby用のアプリケーションフレームワークです。<br /> 分類的にはフルスタックフレームワークと呼ぶんでしょうか?大小様々なアプリが作れます。</p> <p>unityroomもご多分に漏れず、大部分がRailsの標準機能で作られています。</p> <h4 id="なぜRails?"><a href="#%E3%81%AA%E3%81%9CRails%EF%BC%9F">なぜRails?</a></h4> <p>unityroomを作る前、前身として「うに部屋」(今はなきUnityWebPlayerの投稿サイト)を2年弱運用していました。<br /> そのサイトはPHPとCakePHPを使って作りました。<br /> CakePHPの入門書を手に取ってから二週間ぐらいでレンタルサーバーにデプロイできてしまい、あまりの手軽さに感動したのを今でも覚えています。</p> <p>ただ、最初から最後までPHPが心から楽しいと思えませんでした。<br /> 普段はC#ばかり使っていたので、PHPのゆるゆるな感じが馴染めなかったのかもしれません。<br /> (もちろん言語がダメというわけではなくなんとなく自分に合わなかっただけですよ!)</p> <p>色々調べていくうちにRubyという言語やRuby on Railsというフレームワークがあることを知り、興味が湧いて次に何か作るときにはRailsを使ってみようと決めました。そしてRailsを勉強しながら最初に作ったサービスがこのunityroomです。</p> <h3 id="フロントエンド"><a href="#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89">フロントエンド</a></h3> <p>フロント側を見てみましょう。</p> <p><a href="https://crieit.now.sh/upload_images/9a162a2d76237194da41d33e644c70925c1268bc1b94b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9a162a2d76237194da41d33e644c70925c1268bc1b94b.png?mw=700" alt="20181211182205.png" /></a></p> <h4 id="erb と slim"><a href="#erb+%E3%81%A8+slim">erb と slim</a></h4> <p>ビューテンプレートはRails標準のerbと、一部で<a target="_blank" rel="nofollow noopener" href="https://github.com/slim-template/slim">slim</a>を利用しています。<br /> 開発当初にslim良さそうじゃん〜と思って使い始めたものの、期間をあけて触ろうとすると構文調べることが多くて、結局シンプルなerbに戻そうとしていますw</p> <h4 id="CoffeeScript"><a href="#CoffeeScript">CoffeeScript</a></h4> <p>スクリプトはRails標準のCoffeeScriptで書いてます。<br /> CoffeeScriptで書いたものがRailsの機能でjsに変換されて出力されます。</p> <h4 id="Bootstrap4"><a href="#Bootstrap4">Bootstrap4</a></h4> <p>CSSはBootstrap4を使っており、部分的に上書きしたりして使っています。</p> <p>初期リリース時はBootstrap3 + 市販のテンプレート(買い切り$30)を使ってたんですが、市販テンプレートの機能が多すぎて素人の手には扱いきれませんでした。<br /> その後リニューアル時にすべて切り捨ててBoostrap4のみにしました。<br /> ゲームのサムネイルが並んでいるのも全てBootstrapの<a target="_blank" rel="nofollow noopener" href="https://getbootstrap.com/docs/4.0/components/card/#images">Cards</a>です。</p> <p>Bootstrapは非デザイナでもとりあえずWebサイトっぽくしてくれるので好きです。</p> <p>とはいえCSSゼロから書けるの憧れる〜〜〜。<br /> いずれはフルスクラッチでイケテルサイトを作ってみたいものです。</p> <h4 id="Vue.js"><a href="#Vue.js">Vue.js</a></h4> <p>誰でもタグ編集画面だけ<a target="_blank" rel="nofollow noopener" href="https://jp.vuejs.org/index.html">Vue.js</a>を使っています。</p> <p><a href="https://crieit.now.sh/upload_images/6983f0f8f900dd874384dca69b8d043f5c12690a07ac9.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6983f0f8f900dd874384dca69b8d043f5c12690a07ac9.gif?mw=700" alt="20181211212626.gif" /></a></p> <p>このページでは<a target="_blank" rel="nofollow noopener" href="https://github.com/matiastucci/vue-input-tag">vue-input-tag</a>というライブラリを活用しています。</p> <p>Vue自体とても分かりやすいですしもっと使いたいんですが、Railsとどう組み合わせていいか分からず横展開できてません。</p> <h4 id="Turbolinks(Railsの機能)はOFF"><a href="#Turbolinks%28Rails%E3%81%AE%E6%A9%9F%E8%83%BD%29%E3%81%AFOFF">Turbolinks(Railsの機能)はOFF</a></h4> <p>Rails標準機能にページ遷移を高速化するTurbolinksというものがあります。ページ遷移をフックすることで高速化する仕組みのようです。</p> <p>しかしUnityWebGLのBGMがページ移動しても鳴り続けたりとよく分からない挙動をしたので安易にOFFにしました。(雑対応!!</p> <h3 id="バックエンド"><a href="#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89">バックエンド</a></h3> <p><a href="https://crieit.now.sh/upload_images/1244d9aa1f4787f7badc4c1e1498b5a25c1269380455a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1244d9aa1f4787f7badc4c1e1498b5a25c1269380455a.png?mw=700" alt="20181211221152.png" /></a></p> <p>続いてバックエンドです。</p> <h4 id="Heroku"><a href="#Heroku">Heroku</a></h4> <p>ホスティングはHerokuを使っています。</p> <p>リリース当初は<a target="_blank" rel="nofollow noopener" href="https://www.conoha.jp/">ConoHa</a>のVPSにCentOSを入れて、Railsを入れて・・・ってやってたんですが、サーバー運用辛すぎてすぐに載せ換えました。多少出費はかさみますが時間を買ってると思えば安いもんです。</p> <p>普段は <code>Standard-1X dyno</code>($25/月) 2つで運用しています。</p> <blockquote> <p><a href="https://crieit.now.sh/upload_images/e3e546ba0894e0e2c38e3e55de314fb45c1269763f9fe.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e3e546ba0894e0e2c38e3e55de314fb45c1269763f9fe.gif?mw=700" alt="20181211221854.gif" /></a><br /> スケールアップ・アウトの冗長構成とか自分じゃ組めないし組みたくもないです。覚える時間があったらサービス作りたいですね。</p> </blockquote> <h4 id="Heroku Postgres"><a href="#Heroku+Postgres">Heroku Postgres</a></h4> <p>データベースはHerokuアドインの <code>Heroku Postgres</code> ($9/月)を使っています。</p> <p>これもちょっとお高いですがコマンド一行で定期バックアップの設定できたりと便利です。</p> <h4 id="Heroku Redis"><a href="#Heroku+Redis">Heroku Redis</a></h4> <p>Railsのキャッシュ保存先として、 <code>Heroku Redis</code> (無料)を使ってます。</p> <h4 id="Cloudflare"><a href="#Cloudflare">Cloudflare</a></h4> <p><code>unityroom.com</code> ドメインのDNSとして、またCDNとして<a target="_blank" rel="nofollow noopener" href="https://www.cloudflare.com/ja-jp/">Cloudflare</a>を使っています。</p> <p><a href="https://crieit.now.sh/upload_images/f487f98ee52bee3e102c943c7753b48a5c126998c7153.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f487f98ee52bee3e102c943c7753b48a5c126998c7153.png?mw=700" alt="20181213225238.png" /></a></p> <p>無料で使ってますが、性能に不満を感じたことはないです。<br /> 認証とかあってもデフォルト設定でよしなにキャッシュしてくれてすごいなと思いますw</p> <p>あとHerokuにホスティングすると標準ではネイキッドドメイン( <code>www.</code> のつかないドメイン)で公開できないんですが、Cloudflareの<a target="_blank" rel="nofollow noopener" href="https://support.cloudflare.com/hc/en-us/articles/200169056-CNAME-Flattening-RFC-compliant-support-for-CNAME-at-the-root">CNAME Flattening</a>という機能を使うことで <code>www.</code> なしを実現しています。</p> <h4 id="ConoHa オブジェクトストレージ"><a href="#ConoHa+%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8">ConoHa オブジェクトストレージ</a></h4> <p>日々増えていくゲームファイルの保存先として、<a target="_blank" rel="nofollow noopener" href="https://www.conoha.jp/objectstorage/">ConoHa オブジェクトストレージ</a>を使っています。</p> <p>クラウドストレージで一番有名なのはAWS S3だと思いますが、ゲームはファイルサイズが大きくなりやすく、データ転送量に課金されると財布が死んでしまいます。ConoHaのデータ転送量無料に惹かれて使い始めました。一年ぐらい前はアクセスが集中するとアップロードエラーが出たりしていたのですが、最近は大丈夫そう。サーバー補強されたのかな?</p> <p>S3と同じくOpenStackという仕様に準拠してるそうなので<a target="_blank" rel="nofollow noopener" href="https://github.com/fog/fog">fog</a>というライブラリを使ってAPIを呼び出しています。</p> <blockquote> <p>今日確認したら122GB使われてました!<br /> <a href="https://crieit.now.sh/upload_images/64f9fac0f58d6cb80c6aac4ea654f3f45c1269bb87e03.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/64f9fac0f58d6cb80c6aac4ea654f3f45c1269bb87e03.png?mw=700" alt="20181211233335.png" /></a></p> </blockquote> <h4 id="バッチ処理"><a href="#%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86">バッチ処理</a></h4> <p>定期的に実行する処理はRails内にRakeタスクを作成し、Herokuアドインの <a target="_blank" rel="nofollow noopener" href="https://devcenter.heroku.com/articles/scheduler">Heroku Scheduler</a>で定期実行しています。</p> <h3 id="ちょっとした工夫"><a href="#%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E5%B7%A5%E5%A4%AB">ちょっとした工夫</a></h3> <h4 id="ファイル転送"><a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%BB%A2%E9%80%81">ファイル転送</a></h4> <p>ファイルアップロードはデータ転送量が多いので、Railsを介さないような工夫をしています。</p> <ol> <li>サーバー側でオブジェクトストレージのAPIを叩いてPUT可能な一時URLを取得</li> <li>一時URLをクライアントに渡し、クライアントから直接オブジェクトストレージにアップロード</li> </ol> <p>こうすることでRailsに負荷をかけずにアップロードすることができます。</p> <p>前身の「うに部屋」ではPHPで作ったフォームでファイルをアップロードしていたので、ファイルサイズは100Mまで(Webサーバーの制限)、さらに数人が同時にアップロードするとタイムアウトするなど、ひどい作りでした。</p> <p>この辺りはどうしても解決したいと思い、unityroomの開発を始める前によく調べました。</p> <p>またダウンロードもiframeでオブジェクトストレージに公開したコンテンツを読み込んでるだけなので、データはRailsを経由していません。</p> <h4 id="ランキングロジック"><a href="#%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF">ランキングロジック</a></h4> <p><a href="https://crieit.now.sh/upload_images/0bb64a11c577617a382cf313cd5f944a5c1269de4ae57.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0bb64a11c577617a382cf313cd5f944a5c1269de4ae57.png?mw=700" alt="20181211224952.png" /></a></p> <p>人気ランキングのスコア計算式についてはこの辺を参考に実装しています。</p> <p>[https://itiskj.hatenablog.com/entry/2016/12/12/050000:title]</p> <p>PV、コメント数、評価数をベースに、時間で減衰するようにして入れ替わりやすくなるようにロジックを組み、定期的にスコアを再計算しています。</p> <h3 id="テストとか"><a href="#%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E3%81%8B">テストとか</a></h3> <p>テストはRSpecで書いています。とはいっても書き方よく分からず書ききれていないです。<br /> <code>投稿者以外からは見えないこと</code> とか <code>何時何分に公開されること</code> といった手動でテストしづらいものを重点的に書いています。</p> <h3 id="デプロイ方法とか"><a href="#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E6%96%B9%E6%B3%95%E3%81%A8%E3%81%8B">デプロイ方法とか</a></h3> <p>ソースコードはGitHubで管理しており、開発チケットはIssueで管理しています。</p> <p><a href="https://crieit.now.sh/upload_images/c91af9da90352187ea3c42bf59cf8b725c126a014af4b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c91af9da90352187ea3c42bf59cf8b725c126a014af4b.png?mw=700" alt="20181211225535.png" /></a></p> <p>基本的に<a target="_blank" rel="nofollow noopener" href="https://gist.github.com/Gab-km/3705015">Github Flow</a>と呼ばれるブランチ運用をしており、チケット単位で開発(かなり適当)し、プルリクエストを作成しています。</p> <p>プルリクエストが作成されると<a target="_blank" rel="nofollow noopener" href="https://devcenter.heroku.com/articles/github-integration-review-apps">Heroku Review Apps</a>という仕組みで検証環境が自動デプロイされます。(プルリクエストがマージされるか閉じられると自動で消えます)</p> <p><a href="https://crieit.now.sh/upload_images/d5c49ffa1394ebecd9d193bde5d56ccc5c126a1714877.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d5c49ffa1394ebecd9d193bde5d56ccc5c126a1714877.png?mw=700" alt="20181211230039.png" /></a></p> <p>それと同時に<a target="_blank" rel="nofollow noopener" href="https://circleci.com/">Circle CI</a>がテストを実行してくれます。</p> <p><a href="https://crieit.now.sh/upload_images/8a6c690452b803096541f28bde508da05c126a277698f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8a6c690452b803096541f28bde508da05c126a277698f.png?mw=700" alt="20181211230338.png" /></a></p> <p>ReviewAppを使うことでマージ前に実際の動作を確認できるのでレビュー作業がとっても楽です。</p> <p>プルリクエストがマージされ、masterブランチが更新されると、ステージング環境に自動デプロイされます。<br /> この環境は常に起動しており、実際のファイルアップロードとかもできるようにしてあります。</p> <p><a href="https://crieit.now.sh/upload_images/970d2da9a91522b12521cbf44b2dbb495c126a3b884ad.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/970d2da9a91522b12521cbf44b2dbb495c126a3b884ad.png?mw=700" alt="20181211231019.png" /></a></p> <p>ステージング環境で最終確認をしたのち、Heroku上でPromoteボタンを押すと、やっと本番リリースです!</p> <p>本番リリース時もHerokuがDynoを順繰りに更新してくれるので、ユーザーから見てダウンタイムはありません。(データベースマイグレーションが必要な場合は止めますが。)</p> <blockquote> <p>紹介したReviewApp、ステージング、プロダクションといったものはすべて<a target="_blank" rel="nofollow noopener" href="https://devcenter.heroku.com/articles/pipelines">Heroku Pipeline</a>の機能です。簡単な設定でめっちゃ便利になるのでみんなにオススメしたいです。</p> </blockquote> <h3 id="監視"><a href="#%E7%9B%A3%E8%A6%96">監視</a></h3> <h4 id="死活監視"><a href="#%E6%AD%BB%E6%B4%BB%E7%9B%A3%E8%A6%96">死活監視</a></h4> <p>死活監視は特にしてません。連絡受けたら自分で見に行きますw</p> <h4 id="パフォーマンス計測"><a href="#%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E8%A8%88%E6%B8%AC">パフォーマンス計測</a></h4> <p>管理者としてログインしている時だけ<a target="_blank" rel="nofollow noopener" href="https://github.com/MiniProfiler/rack-mini-profiler">rack-mini-profiler</a>を表示するようにしています。</p> <p>発行されたSQLの詳細とか、レンダリングにかかった時間とかが表示できます。</p> <p>無料ですし簡単に使えるので重宝しています。</p> <p><a href="https://crieit.now.sh/upload_images/93694000a4968c22c1be4babe45fae925c126a508a1fd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/93694000a4968c22c1be4babe45fae925c126a508a1fd.png?mw=700" alt="20181211232643.png" /></a></p> <h4 id="パフォーマンス計測その2"><a href="#%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E8%A8%88%E6%B8%AC%E3%81%9D%E3%81%AE%EF%BC%92">パフォーマンス計測その2</a></h4> <p>無料プランの<a target="_blank" rel="nofollow noopener" href="https://newrelic.com/">New Relic</a>も入れてあります。</p> <p><a href="https://crieit.now.sh/upload_images/711b66895d9026f8ea6c065d3c6135445c126a6007fc7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/711b66895d9026f8ea6c065d3c6135445c126a6007fc7.png?mw=700" alt="20181211232954.png" /></a></p> <p>エラー発生時にどこのメソッドでどういうエラーが出てたかとか遡って確認できます。</p> <p>無料だとスロークエリとか見れないのが難点ですが、そこは <code>rack-mini-profiler</code> で補ってます。</p> <h3 id="今後の目標"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AE%E7%9B%AE%E6%A8%99">今後の目標</a></h3> <p>今はまだ <code>開発者が使う投稿サイト</code> という感じなのでアクセス数も大したことありません。</p> <p>これだけ多くのゲームを投稿してくれた開発者の皆さんに恩返しするためにも、<br /> <code>ゲームが遊べるサイト</code> としてゲーム開発者以外のユーザーに使ってもらう必要があります!</p> <p>機能追加や使い勝手の改善、デザイン改修などやりたいことは山ほどあるんですが全然作業時間が取れていません。</p> <p>もしゲーム作りが好きでunityroomを一緒に開発したいぜ〜!みたいな人がいたらぜひお声がけください。<br /> 特にデザインできる人が手伝っていただけるとめっちゃ嬉しいです。(報酬は相談させてくださいね)</p> <p>もっとアクセス増やして稼いで皆さんにどんどん還元したい!</p> <h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3> <p>非常に長い記事になってしまいました。思い入れのあるサービスなのでまだまだ書けそうですがこの辺にしておきましょう。</p> <p>naichiさんって本業はWeb屋さんですか?って結構聞かれるんですが、全然違うんです。<br /> 残念ながらゲーム作りもWeb開発も趣味でやっているので、全然時間が足りません。</p> <p>とはいえ純粋に「楽しい!」を第一に考えて作れるのは趣味プログラミングのいいところですね。</p> <p>ゲーム開発もWeb開発もですが、ああしよう、こうしようと考えたり話し合ったりするのはとても好きです。<br /> なので意見・感想・要望などがあればドシドシお寄せください!!</p> <p>みんな楽しく開発しましょう〜〜〜!</p> <p>ここまでお読みいただきありがとうございました。それではまた!!</p> <p>明日は<a href="https://crieit.net/users/SugiKent">SugiKent</a>さんの記事です。お楽しみに〜</p> naichi