tag:crieit.net,2005:https://crieit.net/tags/Heroku/feed 「Heroku」の記事 - Crieit Crieitでタグ「Heroku」に投稿された最近の記事 2020-03-22T06:54:01+09:00 https://crieit.net/tags/Heroku/feed tag:crieit.net,2005:PublicArticle/15775 2020-03-20T13:51:56+09:00 2020-03-22T06:54:01+09:00 https://crieit.net/posts/Nuxt-5-Firebase-GAE-Netlify-Heroku Nuxtアプリを無料で公開するときに試した5つの環境まとめ(Firebase/GAE/Netlify/Heroku) <p>最近Nuxtでいろいろ作っているけど、無料で使える環境をいろいろ試してる。<br /> いろいろメリデメあるけど、SPAならNetlify/SSRならHerokuがよさそう。<br /> いままで試したものをまとめてみた。</p> <h3 id="ほしかったもの"><a href="#%E3%81%BB%E3%81%97%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">ほしかったもの</a></h3> <p>主に開発してるのが<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">CGM系のWebサービス</a>なので、</p> <ol> <li>動的なOGP画像などが設定できる(OGP芸)</li> <li>カスタムドメインが使える</li> <li>日次のランキング集計などの定期実行ができる</li> </ol> <p>が、無料でできて、なるべく実装が楽で、そこまで遅くないのがうれしい。</p> <h3 id="試した5つのパターン"><a href="#%E8%A9%A6%E3%81%97%E3%81%9F5%E3%81%A4%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">試した5つのパターン</a></h3> <p>試したのは以下の5パターン。試してみた順で記載。</p> <ol> <li>Nuxt(SSR) + Cloud Function<br /> 起動がかなり遅かった。。実装も大変なのでNG</li> <li>Nuxt(SPA) + Firebase Hosting<br /> 構築はかなり楽。ただ、OGP芸が大変でFunctionsが必要</li> <li>Nuxt(SPA) + Netlify<br /> プレレンダリングでOGP芸が楽。定期実行はFunctionsでできる</li> <li>Nuxt(SSR) + GAE(f1:256M)<br /> メモリの制限きつく、たまに落ちる。。定期実行はcron.yamlでできる</li> <li>Nuxt(SSR) + Heroku(free:512M) + Cloudflare<br /> メモリ多くてよい。SSLはないのでCloudflareを併用。定期実行はHeroku Scheduler</li> </ol> <p>SPAで十分であれば、「3.Nuxt(SPA) + Netlify」が構築も簡単で良かった。<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、現在この構成。</p> <p>SSRの場合、「5. Nuxt(SSR) + Heroku(free:512M) + CloudFlare」が良い感じ。<br /> <a target="_blank" rel="nofollow noopener" href="https://hen-ai.net/">へんあいマップ</a>がこの構成。</p> <h3 id="各パターンについて"><a href="#%E5%90%84%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">各パターンについて</a></h3> <h4 id="1. Nuxt(SSR) + Cloud Function"><a href="#1.+Nuxt%28SSR%29+%2B+Cloud+Function">1. Nuxt(SSR) + Cloud Function</a></h4> <p>一番はじめに<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>でやろうとした構成。</p> <p><img width="870" alt="スクリーンショット 2020-03-20 11.43.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/7fa5a956-cec1-9117-1d5d-f769eae53a32.png"></p> <p>細かいやり方は、以下の記事の「Firebase Cloud Functionsの設定してSSRできるようにする」あたりに。<br /> ・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/04/02/115149">Nuxt.jsではじめるときのやることリスト(SSRも国際化も自動デプロイも) - くらげになりたい。</a></p> <p>当時は動的ページのSEO対応するには、この方法が多く検索に出ていたので試したけど、<br /> Cloud Functionのコールドスタートがつらすぎてお蔵入り。。SPAでいくことに。。</p> <h4 id="2. Nuxt(SPA) + Firebase Hosting"><a href="#2.+Nuxt%28SPA%29+%2B+Firebase+Hosting">2. Nuxt(SPA) + Firebase Hosting</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>をリリースしたときの構成。</p> <p><img width="910" alt="スクリーンショット 2020-03-20 11.37.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/37459683-872a-5047-a383-71c33f0c640e.png"></p> <p>課題だった動的ページのSEOは、Cloud Functionsを経由して返す方法で対応。<br /> こちらも当時よく検索に出てたけど、実装が大変そうだったので2番手に。</p> <p>細かいやり方は、以下の記事に。(2020/03/22追記: OGP画像生成系の記事を追加)<br /> ・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/08/07/150000">Nuxt(SPA)+FirebaseでSEO!OGP!: 特定のパスだけheadだけ返すやつ - くらげになりたい。</a><br /> ・<a target="_blank" rel="nofollow noopener" href="https://qiita.com/kira_puka/items/8c1d1240c3aa200cbec0">Nuxt.js(SPA)+Firebaseで積読用の読書管理サービスを作ってみたときにハマったこと - Qiita</a><br /> ・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/06/26/194500">Cloud Functions + ImageMagickでOPG画像の動的生成してCloud Storageにアップロードする - くらげになりたい。</a><br /> ・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2020/02/19/150000">Cloud FunctionとSVGでOGP画像生成を試行錯誤したまとめ - くらげになりたい。</a></p> <p>カスタムドメインについては、Firebase HostingでSSLと合わせて無料で設定可能。</p> <p>定期実行は、Cloud Functionsでできるのでそれを利用した。<br /> ・<a target="_blank" rel="nofollow noopener" href="https://firebase.google.com/docs/functions/schedule-functions?hl=ja">関数のスケジュール設定  |  Firebase</a><br /> ・<a target="_blank" rel="nofollow noopener" href="https://qiita.com/kira_puka/items/1f164dd8d1a5a281d9c1">Cloud Functions for Firebaseのcronみたいな定期実行を試したら簡単だった - Qiita</a></p> <p>ただ、Cloud Functionsの定期実行は、<br /> 「<strong>Googleアカウントごとに3つのジョブ</strong>を無料で使用できる」<br /> なので、注意が必要。<strong>プロジェクトごとじゃない</strong>。。</p> <h4 id="3. Nuxt(SPA) + Netlify"><a href="#3.+Nuxt%28SPA%29+%2B+Netlify">3. Nuxt(SPA) + Netlify</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>の現在の構成。</p> <p><img width="775" alt="スクリーンショット 2020-03-20 11.47.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/5010c13a-98a9-c9e0-ae3b-767d18cd8006.png"></p> <p><a target="_blank" rel="nofollow noopener" href="https://docs.netlify.com/site-deploys/post-processing/prerendering/#set-up-prerendering">NetlifyのPrerendering</a>が無料化されて使えるようになり、よいという話を聞くように。。</p> <p>実装が複雑で、変更もしにくかったので、この方法に。<br /> Netlify自体がCDNも提供していているので、すこしはやくなった(気がする)</p> <p>カスタムドメインも、NetlifyのDNSを設定して無料で対応できる。</p> <p>定期実行は、2.と同じ感じで、Cloud Functionsのまま。</p> <p>コード量も減って変更もしやすくなったので、OGP画像の改善とかが楽にできるように。。(<em>´ω`</em>)</p> <h4 id="4. Nuxt(SSR) + GAE(f1:256M)"><a href="#4.+Nuxt%28SSR%29+%2B+GAE%28f1%3A256M%29">4. Nuxt(SSR) + GAE(f1:256M)</a></h4> <p>SPAの課題として、初期表示が遅いのでなんとかしたいなと、SSRの環境を模索しはじめ。。<br /> 公開していないけど、1つ作ってみた。</p> <p><img width="798" alt="スクリーンショット 2020-03-20 13.17.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/c24ce0b2-64b3-1ea4-9bd2-e2150ba13d14.png"></p> <p>試してみたところ、起動するだけでメモリ上限すれすれで、複数アクセスがあったりすると、落ちる場合も。。<br /> (ts-nodeで動かしているのも悪い気がしている。。)</p> <p><img width="561" alt="スクリーンショット 2020-03-20 12.22.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/e3940627-4141-4c17-3c82-b2ee13ca1e14.png"></p> <p>ただ、定期実行はcron.yamlを用意すればURLに送信でき、無料範囲も広い。<br /> 料金も「<a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/appengine/pricing?hl=ja#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9">その他のリソース</a>」をみるとcronは無料のよう。<br /> ・<a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/appengine/docs/flexible/nodejs/scheduling-jobs-with-cron-yaml?hl=ja">cron.yaml を使用したジョブのスケジューリング</a></p> <p>カスタムドメインやSSLも無料で利用できる感じ。(試してないので未確認)</p> <h4 id="5. Nuxt(SSR) + Heroku(free:512M) + Cloudflare"><a href="#5.+Nuxt%28SSR%29+%2B+Heroku%28free%3A512M%29+%2B+Cloudflare">5. Nuxt(SSR) + Heroku(free:512M) + Cloudflare</a></h4> <p>GAEでうまくいかなかったので、無料でメモリも多いHerokuを利用。<br /> <a target="_blank" rel="nofollow noopener" href="https://hen-ai.net/">へんあいマップ</a>がこの構成で稼働中。</p> <p><img width="885" alt="スクリーンショット 2020-03-20 13.24.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/60f2ab5c-3f4a-9b4b-ac45-341ed99c4667.png"></p> <p>定期実行は無料のアドオン(<a target="_blank" rel="nofollow noopener" href="https://elements.heroku.com/addons/scheduler">Heroku Scheduler</a>)が利用できる。<br /> Nuxt側で<a target="_blank" rel="nofollow noopener" href="https://ja.nuxtjs.org/api/configuration-servermiddleware/">serverMiddleware</a>を用意すればOK。</p> <p>ただ、メモリは多く定期実行もが、Herokuの無料枠だと制限も多い。</p> <ol> <li>SSLは非対応</li> <li>30分アクセスがないとスリープする</li> <li>クレジットカードの登録で1000時間/月xアカウント<br /> (未認証だと550時間/月xアカウント)</li> </ol> <h5 id="1. SSLは非対応"><a href="#1.+SSL%E3%81%AF%E9%9D%9E%E5%AF%BE%E5%BF%9C">1. SSLは非対応</a></h5> <p>単体だけだとSSLに対応していないので、<a target="_blank" rel="nofollow noopener" href="https://www.cloudflare.com/ja-jp/">Cloudflare</a>を併用。<br /> CloudflareがCDNも提供してくれるので良い感じに。</p> <h5 id="2. 30分アクセスがないとスリープする"><a href="#2.+30%E5%88%86%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A8%E3%82%B9%E3%83%AA%E3%83%BC%E3%83%97%E3%81%99%E3%82%8B">2. 30分アクセスがないとスリープする</a></h5> <p>これは、Heroku Schedulerを使えばOK。<br /> 任意のURLを叩けるため、15分毎などスリープしないようにしておく。</p> <h5 id="3. 無料枠は1000時間/月xアカウント"><a href="#3.+%E7%84%A1%E6%96%99%E6%9E%A0%E3%81%AF1000%E6%99%82%E9%96%93%2F%E6%9C%88x%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88">3. 無料枠は1000時間/月xアカウント</a></h5> <p>1000時間あれば、24時間x31日でも744時間なので、大丈夫な感じ。<br /> ただ、アカウント単位での無料枠なので、複数アプリを無料で稼働はできない。。</p> <h5 id="実際のやりかたとかは、"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%82%84%E3%82%8A%E3%81%8B%E3%81%9F%E3%81%A8%E3%81%8B%E3%81%AF%E3%80%81">実際のやりかたとかは、</a></h5> <p>以下の記事に。<br /> ・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2020/01/25/120000">Heroku+CloudflareなNuxtでSSRしてみる - くらげになりたい。</a></p> <h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3> <p>いろいろ試してみたけど、Nuxt.jsを無料で公開するときは、</p> <ul> <li>SPAならNetlify <ul> <li>prerenderingで動的ページのSEOも対応</li> <li>カスタムドメインやSSLもNetlifyでOK</li> <li>定期実行はCloud Functionsで。</li> <li>ただし、定期実行は1アカウントにつき、3ジョブまで</li> </ul></li> <li>SSRならHeroku <ul> <li>SSRで動的ページのSEOも対応</li> <li>定期実行はHeroku Schedulerで</li> <li>Cloudflareを併用し、SSL対応</li> <li>無料枠は1アカウントにつき、1アプリが限界かも</li> </ul></li> </ul> <p>SSRの方は他に<a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/run?hl=ja">Cloud Run</a>や<a target="_blank" rel="nofollow noopener" href="https://zeit.co/">ZEIT now</a>がある。<br /> Cloud Runは立ち上げがGAEより遅いときので後手だけど、<br /> ZEIT nowは気になってるので試してみたい(<em>´ω`</em>)</p> <p>以上!!</p> <h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2> <p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p> <p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p> <p>要望・感想・アドバイスなどあれば、<br /> 公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで!</p> <h3 id="へんあいマップもリリースしました!"><a href="#%E3%81%B8%E3%82%93%E3%81%82%E3%81%84%E3%83%9E%E3%83%83%E3%83%97%E3%82%82%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81">へんあいマップもリリースしました!</a></h3> <p>「偏愛マップ」を簡単に作れるWebアプリです!<br /> <a target="_blank" rel="nofollow noopener" href="https://hen-ai.net">へんあいマップ</a>も、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/63686f5c-390b-0b09-3f9a-0ce6676c3cce.png" width="600"/></p> <p>偏愛マップは人見知りや口下手な人にも優しいコミュニケーションツールで、<br /> 勉強会、懇親会、オフ会などの余興・アイスブレイクや自分のプロフィールにも!</p> <p>よかったら遊んでみてください(<em>´ω`</em>)</p> きらぷか@積読ハウマッチ/SSSAPIなど tag:crieit.net,2005:PublicArticle/15623 2019-12-19T00:04:29+09:00 2019-12-19T00:04:29+09:00 https://crieit.net/posts/heroku herokuでログを見る方法 <h1 id="herokuでログを出力する方法"><a href="#heroku%E3%81%A7%E3%83%AD%E3%82%B0%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95">herokuでログを出力する方法</a></h1> <ul> <li>ローカルマシンのherokuへpushしたリポジトリのあるディレクトリへ移動する。</li> <li><p>下記コマンドを実行してログを出力する。</p> <pre><code class="terminal">$ heroku logs </code></pre></li> </ul> miriwo: 19年7月7日からQiita毎日投稿中! tag:crieit.net,2005:PublicArticle/15520 2019-10-31T08:02:18+09:00 2020-02-06T11:44:52+09:00 https://crieit.net/posts/WEB-Heroku-Laravel-MySQL-SSL 全部無料でWebサービスを公開しよう!(Heroku + Laravel + MySQL + 独自ドメイン + SSL) <p><a href="https://crieit.net/posts/5-5d9c0ecabe849">サービスリリースしました(=゚-゚)ノ 週休5日のプログラマーは快適という話。</a><br /> 上記で紹介した、Webサービス、<a target="_blank" rel="nofollow noopener" href="https://www.myfavrecipe.ml/">My Favorite Recipe</a> の公開の手順を記事にしました。</p> <p>◼️はじめに (。・ω・。)</p> <p>私は初心者です。</p> <p>IT資格はわりと持っていますが、そんなの関係ありません。実務はほぼVBとVB.NETとVBAしかやってません。SQLもちょっとだけ。</p> <p>WEB系は設計書レビューした程度です。テスト設計ならもうイヤという程にはやりました。</p> <p>言い訳はこのくらいにして。</p> <p>◼️作ったサービスを(気軽に)公開できる場所</p> <p>LaravelでWEBサービスを作ってはみたものの、さてどこで公開するか?</p> <p>ということで、試しにHerokuというもの?を使ってみることにしました。</p> <p>私の事前知識は、Herokuって文字見たことあるけどなんて読むんだろう?まさかヘロクじゃないよね?程度です。(そのまさかの、"ヘロク"でした)</p> <p>◼️無料万歳 v(。・ω・。)v</p> <p>以下、すべて無料で揃いました。v(。・ω・。)v</p> <p>・Heroku + Laravel + MySQL</p> <p>・ドメイン取得は、Freenomを利用。</p> <p>・SSL(https)は、Cloudflare を利用。</p> <p>利用規約とか説明のための静的サイトは、Firebaseのhostingを使っています。</p> <p>html/cssテンプレートはf-tpl.comです。これらもすべて無料です。</p> <p>英語が読めなくても意味がわからなくても、無料ならとりあえず使ってみるの精神で挑戦しました。</p> <p>◼️事前に用意するもの</p> <p>・Laravel + MySQL で何か作る</p> <p>ちなみに「SQLite」もHerokuで使えます。</p> <p>◼️手順と参考にしたサイト</p> <p>検索したら、Heroku+Railsの記事が多かったです。<br /> Laravelでも(一部以外は)参考になるので活用しましょう。</p> <p>・Herokuにアカウント登録して、がんばる o(。・ω・。)o</p> <p><a target="_blank" rel="nofollow noopener" href="http://sizukutamago.hatenablog.com/entry/2016/10/21/heroku%E3%81%ABlaravel5%E3%81%A8Mysql%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B">herokuにlaravel5とMysqlの環境を整える</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tamappe/items/a175596e9aec725e1d2d">Laravelをherokuにデプロイする(データベースはMySQL)</a></p> <p>・独自ドメイン取得して、</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.freenom.com/ja/index.html">Freenom</a></p> <p>「Freenom 使い方」でGoogle検索すると使い方載ってるサイトが見つかると思います!</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/kenjikatooo/items/07c3d911210a4ca96781">初めてHerokuで独自ドメインを公開するあなたへ</a></p> <p>・httpsで接続できるようにがんばる o(。・ω・。)o</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/serinuntius/items/f7f08b2221f5ad068f5d">【完全無料】Herokuで独自ドメイン + HTTPSに対応する【Rails】</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ai_qiita/items/0e334606709fb9deae87">【無料】Cloudflareを使ってHerokuで独自ドメインで運用する方法</a></p> <p>・MySQLを直で使いたいとき(自分のPCのMySQLの入っている環境でコマンドを実行しましょう)</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/akiko-pusu/items/305e291465d6aac04bf3">HerokuのDBにローカルPCからアクセスしたいんだけど...</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tocomi/items/0c009d7299584df49378">MySQL Serverに外部から接続する</a></p> <p>・Herokuはアクセスしないと寝てしまうみたいなので対策</p> <p><a target="_blank" rel="nofollow noopener" href="https://casualdevelopers.com/tech-tips/how-to-prevent-idling-of-free-dyno-on-heroku/"> Herokuの無料dynoをスリープさせないで24時間稼働させる4つの方法</a></p> <p>・おまけ (。・ω・。)</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yacchi1123/items/963bdf12c9c4a7a8f67c">Firebaseを使って独自ドメインWebサイトを公開する方法</a></p> <p>◼️メモ書き程度の記録(役に立つかわかりませんが私のブログです)<br /> <a target="_blank" rel="nofollow noopener" href="http://marimoko3.hatenablog.com/">blog</a></p> <p>◼️ちなみに</p> <p>現在私は、MacでVagrant環境(CentOS)で開発しています。<br /> CyberduckでファイルをMacローカルにコピーして、それをGitHubに上げて、それをHerokuの管理画面でポチッとDeployしています。</p> <p>最初はコンソールからHeroku (Heroku Git) に上げていました(どっちでもいいのですが)。</p> <p>◼️よくわからないこと</p> <p>Vagrant環境でLaravelプロジェクトを作って、初回リリースは最初はLaravelプロジェクトを丸ごと載せてしまえばいいので問題ないのですが、<br /> 機能追加で、composer等で何か変更を加えた時に、何が変わったのかわからないと、本番環境に何を適用させたらいいのわからない、ということが起こります。</p> <p>composer、今何してるの?っていう(便利だけど何がどこに入ったのかわからない)。<br /> 新しいパッケージを入れて使うなどの場合も、本番環境への反映のさせ方がわかりません。<br /> プロジェクトフォルダを丸ごと更新するという技(?)で、ひとまず対応できますが・・・。</p> <p>◼️おわりに</p> <p>手順を全部書くと終わらないのでリンクで済ませてしまいましたが、何かあればココのコメントなどで聞いていただければ、だれかが答えてくれるかもしれません!? o(。・ω・。)o 応援してます!気が向いたらやってみてネ o(。・ω・。)o </p> Hata tag:crieit.net,2005:PublicArticle/15511 2019-10-27T21:29:52+09:00 2019-10-27T21:29:52+09:00 https://crieit.net/posts/AnnictAccess3 AnnictAccess3をリニューアルしました! <p>進捗的には<a href="https://crieit.net/boards/annict-access/b2e0256fcd24966cd3ace9d0e02910c1">この記事</a>の続きなのですが、大幅にリニューアルを敢行しました。</p> <h1 id="サービスURL"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9URL">サービスURL</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://annictaccessv3.netlify.com/">https://annictaccessv3.netlify.com/</a></p> <h1 id="動作イメージ"><a href="#%E5%8B%95%E4%BD%9C%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8">動作イメージ</a></h1> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/wtPe0MQl7t4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <h1 id="今回の機能改善点"><a href="#%E4%BB%8A%E5%9B%9E%E3%81%AE%E6%A9%9F%E8%83%BD%E6%94%B9%E5%96%84%E7%82%B9">今回の機能改善点</a></h1> <h2 id="「アニメ選択」画面の実装"><a href="#%E3%80%8C%E3%82%A2%E3%83%8B%E3%83%A1%E9%81%B8%E6%8A%9E%E3%80%8D%E7%94%BB%E9%9D%A2%E3%81%AE%E5%AE%9F%E8%A3%85">「アニメ選択」画面の実装</a></h2> <p><a href="https://crieit.now.sh/upload_images/f2fa429ca90221dc87d712c2a35832965db586d228738.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f2fa429ca90221dc87d712c2a35832965db586d228738.jpg?mw=700" alt="" /></a></p> <ul> <li>ランキングに追加中の番組の強調</li> <li>年を指定して番組一覧を表示</li> </ul> <p>以前のバージョンでは全体から上位30位までを固定で抜き出してそれをソートする形でした。</p> <h2 id="視聴者数の表示"><a href="#%E8%A6%96%E8%81%B4%E8%80%85%E6%95%B0%E3%81%AE%E8%A1%A8%E7%A4%BA">視聴者数の表示</a></h2> <p><a href="https://crieit.now.sh/upload_images/b9eb3a9f22cb008ad6a5a6a394a24e4b5db58362b83ba.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b9eb3a9f22cb008ad6a5a6a394a24e4b5db58362b83ba.jpg?mw=700" alt="" /></a></p> <h1 id="今回苦労したこと"><a href="#%E4%BB%8A%E5%9B%9E%E8%8B%A6%E5%8A%B4%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8">今回苦労したこと</a></h1> <h2 id="画像取得に制限がある問題"><a href="#%E7%94%BB%E5%83%8F%E5%8F%96%E5%BE%97%E3%81%AB%E5%88%B6%E9%99%90%E3%81%8C%E3%81%82%E3%82%8B%E5%95%8F%E9%A1%8C">画像取得に制限がある問題</a></h2> <ul> <li>取得数を制限する<br /> →外部APIを探す<br /> →herokuにキャッシュさせる処理を書く</li> </ul> <pre><code class="javascript"> if(isExistFile('./public/'+req.params.url +'.jpg')){ res.sendfile('./public/'+req.params.url +'.jpg'); } try { client.get('users/show',{screen_name: req.params.url}, async(error, tweets, response)=>{ if(error) return Promise.reject(error); console.log(response.statusCode) if(response.statusCode===200){ var json = JSON.parse(response.toJSON().body) let imageRes = await fetch(json.profile_image_url); downloadFile(json.profile_image_url,'./public/'+req.params.url+'.jpg') res.redirect(json.profile_image_url); } }) } catch (error) { console.error(error) } </code></pre> <h1 id="未実装の機能"><a href="#%E6%9C%AA%E5%AE%9F%E8%A3%85%E3%81%AE%E6%A9%9F%E8%83%BD">未実装の機能</a></h1> <ul> <li>映画版ランキングメーカー <ul> <li>the movie db APIからデータを取得する準備中です。</li> <li>日本語/英語両対応するかも?</li> </ul></li> <li>twitterシェア機能</li> </ul> <h1 id="既知の不具合"><a href="#%E6%97%A2%E7%9F%A5%E3%81%AE%E4%B8%8D%E5%85%B7%E5%90%88">既知の不具合</a></h1> <ul> <li>画像が読み込めなかった場合、クリックできる範囲が狭くなる</li> <li>画像取得の際にtwitterAPIの制限に引っ掛かる</li> </ul> <h1 id="今回使っている技術"><a href="#%E4%BB%8A%E5%9B%9E%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93">今回使っている技術</a></h1> <h2 id="ReactJS/Netlify"><a href="#ReactJS%2FNetlify">ReactJS/Netlify</a></h2> <p>ReactJS...フロントエンドの画面や通信を司るjavascriptの<code>フレームワーク</code><br /> Netlify...Reactアプリなどを簡単にデプロイできる<code>プラットフォームサービス</code></p> <h2 id="NodeJS/Heroku"><a href="#NodeJS%2FHeroku">NodeJS/Heroku</a></h2> <p>NodeJS...サーバサイドjavascript。<br /> Heroku...NodeJSやRailsなどサーバサイドアプリケーションをデプロイできる<code>プラットフォームサービス</code></p> <h2 id="graphQL"><a href="#graphQL">graphQL</a></h2> <p>サーバにデータを問い合わせる<code>クエリ言語</code>の一つ。<br /> REST APIの後継と言われている。</p> <pre><code class="javascript"> let query = gql`query { searchWorks(orderBy: {field: WATCHERS_COUNT, direction: DESC} seasons: ["${req.params.year}-spring","${req.params.year}-summer","${req.params.year}-autumn","${req.params.year}-winter"]) { edges { node { title seasonName seasonYear annictId twitterUsername watchersCount } } } }` </code></pre> ckoshien tag:crieit.net,2005:PublicArticle/15424 2019-09-25T09:50:26+09:00 2019-09-25T09:50:26+09:00 https://crieit.net/posts/Elixir-Phoenix-Heroku-Docker Elixir+PhoenixのサービスをHeroku+Dockerで動かす <p>Elixir & PhoenixのサービスをDockerイメージでHerokuにデプロイした時の備忘録です。</p> <p>背景として、元々GCE上で動作させていましたが、GCEのIPが有料になるかもという情報があったのでHerokuに移行することにしました。ただ、無料枠で運用している限りだとIPも有料にはならないかもということなので意味はなかったかもしれません。</p> <p>ただ、もう誰も使っていないサービスでデータも少ないですし、ElixirとかNodeのようなビルドがある言語のサービスは本番サーバーでビルドするとサーバーが止まってしまうため本来行うべきではないため、気分転換にDockerでのリリース形式への変更を試してみるのには良かったかなと思いました。</p> <p>ちなみにHerokuではよく使われているElixir用のBuildpackがあるため、本来はそちらを利用したほうが簡単だと思います。しかし、今回のサービスは結構バージョンが古く、ちらっと試したところ動かないようでした。何か設定がおかしかったのかもしれませんが、とにかく試行錯誤するよりは元々Linuxサーバー上で動いているものなのでDocker化してデプロイするようにした方が早くて確実そうだったのでそちらの形にしました。</p> <h2 id="環境"><a href="#%E7%92%B0%E5%A2%83">環境</a></h2> <ul> <li>Elixir 1.6.0</li> <li>Phoenix 1.3.0</li> </ul> <h2 id="Dockerfileをつくる"><a href="#Dockerfile%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B">Dockerfileをつくる</a></h2> <p>できたのがこんな感じです。</p> <pre><code class="dockerfile">FROM elixir:1.6.0-slim RUN apt-get update && \ apt-get install -y dbus git curl RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - RUN apt-get install -y nodejs inotify-tools RUN apt-get install -y --reinstall build-essential RUN apt-get clean && \ rm -rf /var/lib/apt/lists/* ENV MIX_HOME=/root/.mix MIX_ENV=prod COPY . /app WORKDIR /app RUN mix local.hex --force && \ mix local.rebar --force && \ mix deps.get && \ mix compile EXPOSE 4000 CMD mix phx.server </code></pre> <p>開発もDockerで行っており、本番もLinuxでデプロイ方法はメモしていたのでここは特に問題ありませんでした(余分な処理は混じっているかもしれませんが)。JavaScriptのビルドもありますがこれはローカルでビルドしてそのまま使っています。今回はもう更新しないサービスのDocker化のため処理を入れていませんが、必要であればここでビルドもしておくと良いかもしれません。</p> <p>細かい部分をメモがてら解説しておきます。</p> <h3 id="MIX_HOMEを指定"><a href="#MIX_HOME%E3%82%92%E6%8C%87%E5%AE%9A">MIX_HOMEを指定</a></h3> <p>環境変数としてMIX_HOMEを指定しています。</p> <pre><code class="dockerfile">ENV MIX_HOME=/root/.mix MIX_ENV=prod </code></pre> <p>HerokuのDockerデプロイではrootユーザーではなく、その場で適当なユーザーが作られそちらで起動などのコマンドが実行されます。そのため、Dockerイメージビルド時にhexやrebarを追加した時にrootのディレクトリにインストールされたものが認識されず、サーバー起動コマンド実行時にまたインストール&ビルドが行われてしまいます。すると時間が経ちすぎてデプロイに失敗します。そのためイメージビルド時に処理したものを正常に認識させるため、MIX_HOMEを指定しています。</p> <p>dockerfile内でユーザーの作成&指定も可能ですが、これは無効となります。</p> <h3 id="EXPOSEは不要"><a href="#EXPOSE%E3%81%AF%E4%B8%8D%E8%A6%81">EXPOSEは不要</a></h3> <p><code>EXPOSE 4000</code>を書いていますがこれは不要です。後述しますが、デプロイ時に<code>PORT</code>の環境変数が渡されるため、そちらでサーバーを起動するようにPhoenix側で設定する必要があります。</p> <h2 id="Phoenixの設定"><a href="#Phoenix%E3%81%AE%E8%A8%AD%E5%AE%9A">Phoenixの設定</a></h2> <p><code>config/prod.exs</code>を設定します。元々のサーバーの設定から変えたところはとりあえずこんな感じになりました。</p> <pre><code class="elixir">config :profile, ProfileWeb.Endpoint, load_from_system_env: false, url: [host: System.get_env("APP_HOST"), scheme: "https", port: 443], http: [port: System.get_env("PORT")], cache_static_manifest: "priv/static/cache_manifest.json" config :profile, Profile.Repo, adapter: Ecto.Adapters.MySQL, username: System.get_env("DB_USERNAME"), password: System.get_env("DB_PASSWORD"), database: System.get_env("DB_DATABASE"), hostname: System.get_env("DB_HOST"), charset: "utf8mb4", ssl: true, pool_size: 5 </code></pre> <h3 id="環境変数を使う形にする"><a href="#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86%E5%BD%A2%E3%81%AB%E3%81%99%E3%82%8B">環境変数を使う形にする</a></h3> <p>下記のように、可能な限り環境変数を使う形にします。</p> <pre><code class="elixir"> username: System.get_env("DB_USERNAME"), password: System.get_env("DB_PASSWORD"), database: System.get_env("DB_DATABASE"), hostname: System.get_env("DB_HOST"), </code></pre> <p>今はどうか知りませんが、Phoenixのプロジェクトを初期化すると<code>prod.secret.exs</code>を作ってそれがprod.exsから読み込まれることで本番の設定をする、という形になっていましたのでついついその形でやってしまいがちかもしれませんが、Herokuなどで利用することを考えると全部環境変数を利用する形にしておく必要がありますし、そもそも設定も環境毎で別にする必要もなくなるため環境変数を利用する方がシンプルだと思います。</p> <h3 id="DBのpool_sizeを減らす"><a href="#DB%E3%81%AEpool_size%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99">DBのpool_sizeを減らす</a></h3> <pre><code class="elixir"> pool_size: 5 </code></pre> <p>Herokuの無料DBはいくつか種類があります。今回はJawsDBを使っていますが、どれにしろ最大接続数が決まっていますので、それより低くpool_sizeを設定しておかないと接続エラーで起動できなくなります。各DBの仕様を見て最大数よりもちょっと少なめにしておきましょう。</p> <h3 id="ポートの設定"><a href="#%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A">ポートの設定</a></h3> <p>前述したとおり、ポート番号は環境変数で指定されるため、それでListenする必要があります。そのため下記のように指定します。</p> <pre><code class="elixir"> http: [port: System.get_env("PORT")], </code></pre> <h3 id="URLの設定"><a href="#URL%E3%81%AE%E8%A8%AD%E5%AE%9A">URLの設定</a></h3> <p>通常は不要かもしれませんがURLの設定もしています。</p> <pre><code class="elixir"> url: [host: System.get_env("APP_HOST"), scheme: "https", port: 443], </code></pre> <p>OGPを利用しているため、Routerのヘルパーで正しい完全なURLをテンプレート上に出力する必要がありました。正しく設定をしないと<code>http://localhost:11242</code>みたいなURLが出力されてしまうため、上記のような設定を追加しています。<code>port: 443</code>は不要かなと思いましたが、設定しておくとURLのポート表記を消すことができます。</p> <h2 id="デプロイ"><a href="#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">デプロイ</a></h2> <p>諸々の設定ができたらデプロイします。これはHerokuのダッシュボードのDeployページで全部確認できますので細かくは書きませんが、とりあえず</p> <pre><code class="sh">heroku container:push web </code></pre> <p>で手元のDockerfileのイメージがビルド&pushされ、</p> <pre><code class="sh">heroku container:release web </code></pre> <p>でpushしたイメージでリリースされます。あとは<code>heroku run</code>でマイグレーションを行ったり、<code>heroku logs</code>でログを確認しておかしなところを解決すれば動くと思います。下記は実際に動いているものです。(絵文字が文字化けしていますが他のところでは正常に表示されているので単にここの不具合のようです。もう修正はしませんが…)</p> <p><a target="_blank" rel="nofollow noopener" href="https://torima.appllis.net/users/dala00">https://torima.appllis.net/users/dala00</a></p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5d8ab79a0cbf3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5d8ab79a0cbf3.png?mw=700" alt="" /></a></p> <h2 id="独自ドメイン"><a href="#%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3">独自ドメイン</a></h2> <p>独自ドメインは解約したかったのでついでに適当なサブドメインにURLを変更しました。ただどちらにしろ独自ドメインの設定をHeroku側で行わなければなりません。ただ、どうもHerokuでの独自ドメインは有料プランでないとできないようでした。</p> <p>しかし、Cloudflare経由にして無理やりSSLにすることもできるようですので、今回はそのようにしました。~~.herokuapp.comをCNAMEとしてDNSレコードを追加すればよいようです。Herokuの画面で一緒に<code>DNS Target</code>というものも表示されますが、これはCloudflare経由の場合は関係ないようです。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>Buildpackがあればそれを使えば楽ですが、Dockerを使えば特殊なパッケージをインストールしたサービスも動かす事ができますので、必要に応じてHerokuのDockerデプロイを使ってみると良さそうです。CI上でビルド&pushすればGitHubにpushするだけでも可能そうです。</p> <p>容量が少ないですが言語問わず無料でRDBが使えて簡単にデプロイできるのはHerokuだけだと思いますので、ユーザーやアクセスの少ない初期のサービスなどはやっぱりここが良さげだなと感じました。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15064 2019-06-06T08:03:42+09:00 2021-03-02T16:05:22+09:00 https://crieit.net/posts/025d5322aa1f0e9d87109ded9b6254b3 短歌投稿サイト「ちるなり」の技術メモ <h2 id="この記事について"><a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">この記事について</a></h2> <p>「ちるなり|短歌の投稿サイト」の技術的な話のメモです。</p> <h2 id="functionの配列を受け取ってasync.parallelする"><a href="#function%E3%81%AE%E9%85%8D%E5%88%97%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%81%A3%E3%81%A6async.parallel%E3%81%99%E3%82%8B">functionの配列を受け取ってasync.parallelする</a></h2> <p>複雑な処理になると自分でasync/awaitやPromiseをごにょごにょして書くのがつらいことがあるので、よく<a target="_blank" rel="nofollow noopener" href="https://caolan.github.io/async/v3/index.html">caolan/async</a>を使います。このなかの<a target="_blank" rel="nofollow noopener" href="https://caolan.github.io/async/v3/docs.html#parallel">async/parallel</a>はfunctionの配列やオブジェクトを第一引数に、すべてのタスクのあとに実行するコールバックを第二引数に受け取ります。このとき、第一引数に渡されるfunctionはその第一引数としてコールバックをトリガーするfunctionを受け取るのでなければなりません。</p> <p>で、そのようなfunctionの配列を任意のオブジェクトをわたして生成してasync.parallelしたかったときの実装のサンプルです。<a target="_blank" rel="nofollow noopener" href="https://lodash.com/docs/4.17.11#curry">lodash/curry</a>とかを使っています。</p> <pre><code class="js">const express = require("express"); const async = require("async"); const _ = require("lodash"); const router = express.Router(); const admin = require("../admin/admin.js"); const refusers = admin.database.ref().child("users"); // firebaseのRealtimeDBの参照です router.patch("/hogehoge", (req, res) => { const closures = _.partial(function (callback, album) { return _.map(req.body.patches, (patch, key) => { return _.curry(function (callback) { /* 何かの処理 */ callback(null, null); })(callback); }); }); function execClosures (album) { async.parallel(closures(_, album), (err, result) => { res.status(200).end(); }); } refusers.child(req.body.uid).once("value", (snapshot) => { if (snapshot) { const album = snapshot.val(); execClosures(album); } else { res.status(500).send({ err: "No snapshot found" }); } }).catch(err => { res.status(403).send({ err: err }); }); }); </code></pre> <h2 id="HerokuにデプロイしたNuxt.jsのプロジェクトの静的ファイルをFirebase Hostingから配信する"><a href="#Heroku%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%97%E3%81%9FNuxt.js%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%9D%99%E7%9A%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92Firebase+Hosting%E3%81%8B%E3%82%89%E9%85%8D%E4%BF%A1%E3%81%99%E3%82%8B">HerokuにデプロイしたNuxt.jsのプロジェクトの静的ファイルをFirebase Hostingから配信する</a></h2> <p>静的ファイルだけvuepressで生成したページとあわせてHostingにあげます。package.jsonに以下のようなことを書きます。<code>YOUR_TOKEN</code>の部分はfirebase-toolsの<code>login:ci</code>というコマンドであらかじめ取得しておいたトークンに読み替えてください。</p> <pre><code class="json"> "scripts": { "dev": "cross-env NODE_ENV=\"development\" nodemon server/index.js --watch server", "build": "cross-env NODE_ENV=\"production\" nuxt build", "start": "cross-env NODE_ENV=\"production\" forever --killSignal=SIGTERM -c 'nodemon --exitcrash' server/index.js", "inspect": "cross-env NODE_ENV=\"development\" node --require dotenv/config --optimize_for_size --max_old_space_size=920 --gc_interval=100 --inspect server/index.js", "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs", "deploy:nuxt": "rimraf docs/.vuepress/dist/nuxt && mkdirp docs/.vuepress/dist/nuxt && cpy .nuxt/dist docs/.vuepress/dist/nuxt", "deploy:static": "rimraf docs/.vuepress/dist/static && mkdirp docs/.vuepress/dist/static && cpy static/contents docs/.vuepress/dist/static", "deploy:hosting": "firebase deploy --token 'YOUR_TOKEN' --except functions", "deploy:functions": "firebase deploy --only functions", "heroku-postbuild": "yarn build && yarn run docs:build && yarn run deploy:nuxt && yarn run deploy:static && yarn run deploy:hosting" }, "devDependencies": { "cpy-cli": "^2.0.0", "cross-env": "^5.2.0", "dotenv": "^7.0.0", "firebase-tools": "^6.5.3", "forever": "^1.0.0", "mkdirp": "^0.5.1", "nodemon": "^1.18.10", "rimraf": "^2.6.3", "vuepress": "^1.0.0-alpha.47" } </code></pre> <p>nuxt.config.jsでアセットをFirebase Hostingから取得するように設定します。ローカルで開発しているときには手元のファイルを参照したいので、production時のみにしましょう。</p> <pre><code class="js">const isdev = (process.env.NODE_ENV === "development") module.exports = { // buildのところだけ抜粋 build: { publicPath: isdev ? "/_nuxt/" : "https://your_project_name.firebaseapp.com/nuxt", } } </code></pre> <p>firebase.jsonのhostingの設定をします。ヘッダーを設定しないとクロスオリジン制約で配信できなくなるので、ここで必ず設定します。</p> <pre><code class="json"> "hosting": { "public": "docs/.vuepress/dist", "ignore": [ "firebase.json", ], "headers": [ { "source" : "**/assets/**", "headers" : [{ "key" : "Access-Control-Allow-Origin", "value" : "*" }] }, { "source" : "**/nuxt/**", "headers" : [{ "key" : "Access-Control-Allow-Origin", "value" : "*" }] }, { "source" : "**/static/**", "headers" : [{ "key" : "Access-Control-Allow-Origin", "value" : "*" }] }], "cleanUrls": true, "trailingSlash": false }, </code></pre> リリカルはなくそオーガスタ tag:crieit.net,2005:PublicArticle/14941 2019-04-21T22:51:18+09:00 2019-04-23T09:27:29+09:00 https://crieit.net/posts/JobLv-BLOG JobLvマネージャーをリリースした話 <h1 id="作ったサイトの紹介"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E7%B4%B9%E4%BB%8B">作ったサイトの紹介</a></h1> <p>今回作ったサイトは、こちら。<br />  「<a target="_blank" rel="nofollow noopener" href="https://joblv-manager.herokuapp.com/">JobLvマネージャー</a>」です。</p> <p>自分のJob(職業)を管理、LvUpをしながら、<br /> Twitterと連携(現時点では、名前変更)することが出来ます。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/24d49170-feba-5d5b-c900-aabce0268d16.png" alt="image" /></p> <h1 id="作ろうと思ったキッカケ"><a href="#%E4%BD%9C%E3%82%8D%E3%81%86%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%82%AD%E3%83%83%E3%82%AB%E3%82%B1">作ろうと思ったキッカケ</a></h1> <p>Twitterで繋がったユーザーさんが、名前の後ろに「〇〇Lv1」みたいなのをつけているのを見て思いつきました。<br /> いつの間にか、こっそりLvアップしていたり、新しいものに変わっていたり。<br /> そういう遊び心に興味が湧いて、この仕組みをもっと簡単に、管理や変更ができるようにしたサービスを作ってみたいと思ったのが始まりです。</p> <h1 id="ストックすることの大切さと、一歩踏み出す大切さ"><a href="#%E3%82%B9%E3%83%88%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AE%E5%A4%A7%E5%88%87%E3%81%95%E3%81%A8%E3%80%81%E4%B8%80%E6%AD%A9%E8%B8%8F%E3%81%BF%E5%87%BA%E3%81%99%E5%A4%A7%E5%88%87%E3%81%95">ストックすることの大切さと、一歩踏み出す大切さ</a></h1> <p>これをタイトルした理由は、本システム、3日(時間だと8時間)で作りました。<br /> 内容からして、これが早いのかわかりませんが、これだけの時間でサービスリリースまでいけたのは、</p> <ul> <li>Railsのおかげ</li> <li>素材サイト様のおかげ</li> <li>API(Twitter)のおかげ</li> <li>今まで色々プロダクトを作ったおかげ(機能のより集め(コピペ))</li> </ul> <p>Railsを使うと、簡単のWebシステムが作れます。<br /> いろんなGemが用意されています。<br /> 規約にそえば、簡単に作れます。</p> <p>素材サイト様、画像にアイコンにフォントまで、いろんなものが無料で使えます。<br /> いつもありがとうございます!</p> <p>API使えば、別のシステムの機能を自分のもののように使えます。どんどん使いましょう!</p> <p>新しいもの、面白そうなものがあったら、とりあえず触ってみましょう!<br /> 形にならなくても問題ありません。いつか使える時が来ます。ストックしておきましょう。<br /> 最新の技術だからと追いかけて、サービスリリースする必要も無いと思います。<br /> 触ってみてストックする事が大事。</p> にゅ〜ぶる tag:crieit.net,2005:PublicArticle/14909 2019-04-09T22:21:31+09:00 2019-04-19T09:16:52+09:00 https://crieit.net/posts/800-Twitter-Negomo 誰でも新卒年収800万宣言できる、Twitter就活サービス「Negomo(ネゴモ)」をリリースした。【個人開発】 <p>「Twitter就活の促進」をテーマにしたサービス「<a target="_blank" rel="nofollow noopener" href="https://negomo.me">Negomo(ネゴモ)</a>」をリリースしました!</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自分が欲しい報酬額をツイートしてTwitter就活できるサービス「Negomo(ネゴモ)」を作ってみました!下のような画像がツイートできます。Twitterアカウントで利用できるのでぜひ使ってみてください!<a target="_blank" rel="nofollow noopener" href="https://t.co/JRXFe8lHov">https://t.co/JRXFe8lHov</a><a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/Negomo?src=hash&ref_src=twsrc%5Etfw">#Negomo</a> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/RT%E6%8B%A1%E6%95%A3%E3%81%8A%E9%A1%98%E3%81%84%E3%81%97%E3%81%BE%E3%81%99?src=hash&ref_src=twsrc%5Etfw">#RT拡散お願いします</a></p>— TaKO8Ki (@takoyaki3160) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/takoyaki3160/status/1114776315847004160?ref_src=twsrc%5Etfw">April 7, 2019</a></blockquote> <p>Twitterアカウントで利用できるので、もしよかったら使ってみてください!</p> <h1 id="リリースしたサービス"><a href="#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">リリースしたサービス</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://negomo.me">Negomo(ネゴモ) - もっとTwitter就活しよう!</a></p> <h1 id="サービスの概要"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E6%A6%82%E8%A6%81">サービスの概要</a></h1> <p>「Negomo(リンク)」は、自分が欲しい報酬額をツイートしてTwitter就活できるサービスです。</p> <p>何か技術を身につけている人が、Twitterで欲しい報酬額(時給・年収)を積極的にアピールすることで、適切な報酬をもらえることを理想としています!<br /> もちろん、エンジニア以外の方も大歓迎です!</p> <p>こんな感じのツイートができます。</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">京都でWEB系のインターン探してます!! <a target="_blank" rel="nofollow noopener" href="https://t.co/JRXFe8lHov">https://t.co/JRXFe8lHov</a> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/Negomo?src=hash&ref_src=twsrc%5Etfw">#Negomo</a> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/Twitter%E5%B0%B1%E6%B4%BB?src=hash&ref_src=twsrc%5Etfw">#Twitter就活</a></p>— TaKO8Ki (@takoyaki3160) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/takoyaki3160/status/1114806623942262784?ref_src=twsrc%5Etfw">April 7, 2019</a></blockquote> <p>参考:<a target="_blank" rel="nofollow noopener" href="https://negomo.me/about">Negomo(ネゴモ)とは</a></p> <h2 id="追記"><a href="#%E8%BF%BD%E8%A8%98">追記</a></h2> <ul> <li><p>単位で「兆」を選ぶことができるようになりました!</p></li> <li><p>時給・月収・年収によって画像の色を変えたほうが見やすいというアドバイスをいただいたので、そのように仕様を変更しました!<br /> 既に画像を作成されている場合は、金額を変えて編集していただくと色が変わります。</p></li> </ul> <p><img width="995" alt="スクリーンショット 2019-04-09 15.46.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/285624/b2f41851-a590-3827-14ed-d74303dfe7e2.png"></p> <h1 id="デザイン"><a href="#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3">デザイン</a></h1> <p>デザインは<a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/">SpeakerDeck</a>を参考にしました!</p> <h3 id="トップページ"><a href="#%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8">トップページ</a></h3> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/285624/80f72c3a-d77b-d45f-1ff0-7f9b937d80a2.png" alt="image" /></p> <h3 id="画像作成ページ"><a href="#%E7%94%BB%E5%83%8F%E4%BD%9C%E6%88%90%E3%83%9A%E3%83%BC%E3%82%B8">画像作成ページ</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://gyazo.com/f5cbe5ee14262aa3025254bae37c6ef7"><img src="https://i.gyazo.com/f5cbe5ee14262aa3025254bae37c6ef7.gif" alt="Image from Gyazo" /></a></p> <p>アピールポイントのフォームの高さは可変的になっていて、コンパクトになるように心がけました。また、ポートフォリオなどのURLが入力された場合は、自動的にリンクに変換されるようになっています。</p> <h3 id="画像表示ページ"><a href="#%E7%94%BB%E5%83%8F%E8%A1%A8%E7%A4%BA%E3%83%9A%E3%83%BC%E3%82%B8">画像表示ページ</a></h3> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/285624/1079aace-eedc-0f02-2549-a342a3dca654.png" alt="image" /></p> <p>作成した画像をクリックすることでツイートできるようになっています。<br /> アピールポイントの欄では、どれがリンクでどれが普通の文字列なのか分かりやすくするようにしました。</p> <h1 id="使用した技術"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%8A%80%E8%A1%93">使用した技術</a></h1> <ul> <li><p>Ruby・Ruby on Rails</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/csquared/IMGKit">IMGKit</a>(HTMLから画像をレンダリングできるgem)</li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/bgarret/google-analytics-rails">google-analytics-rails</a>(google analyticsが簡単に導入できるgem)</li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/0sc/activestorage-cloudinary-service">activestorage-cloudinary-service</a>(Active StorageとCloudinaryを繋げるgem)</li> </ul></li> <li><p>JavaScript・jQuery</p></li> <li><a target="_blank" rel="nofollow noopener" href="https://cloudinary.com/">Cloudinary</a><br /> 画像を保存するストレージです。Herokuのアドオンとして利用できるので非常やりやすかったです。Active Storageと連携させて利用しています。</li> <li>Git・GitHub</li> <li>Postgresql</li> <li><a target="_blank" rel="nofollow noopener" href="https://jp.heroku.com/">Heroku</a><br /> 今の所Hobbyプランを利用しています。</li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/TaKO8Ki/wkhtmltopdf-buildpack">build pack</a><br /> 画像を作る部分の実装で利用しました。</li> <li>アイコン<br /> アイコンは、相変わらずフリー画像にお世話になってます。</li> </ul> <h1 id="苦労した点"><a href="#%E8%8B%A6%E5%8A%B4%E3%81%97%E3%81%9F%E7%82%B9">苦労した点</a></h1> <p>今回苦労したのは、画像生成の部分です。<br /> コードとしては下のような感じで、 HTMLから画像をレンダリングする<a target="_blank" rel="nofollow noopener" href="https://wkhtmltopdf.org/">wkhtmltoimage</a>をRailsで利用できるようになるgem、IMGKitを利用しています。<br /> ローカルでは比較的簡単に動かすことができましたが、Heroku上で動かすのに少し時間がかかりました。<br /> 最終的に、build packを使うのが一番良さそうだと分かったので、元からあったbuild packのレポジトリをforkして少し自分用にカスタマイズして使いました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/TaKO8Ki/wkhtmltopdf-buildpack">wkhtmltoimageをHerokuで使うためのbuild packカスタマイズ版</a></p> <p>画像作成部分のコード</p> <div> ```ruby def create_image Tempfile.create(["#{@profile.id}", '.png'], :encoding => 'ascii-8bit') do | file | file.write(IMGKit.new(get_html, quality: 20, width: 800).to_png) file.rewind @profile.image.attach(io: file, filename: "q_#{@profile.id}.png", content_type: "image/png") end end def get_html <<~HTML <!DOCTYPE html> <html> <head> <link href="http://fonts.googleapis.com/earlyaccess/notosansjp.css"> <meta charset="UTF-8"> <style> @charset "UTF-8"; html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { width: 800px; margin: 0; background: #eee; font-family: 'Noto Sans JP', sans-serif; } .q-frame { width: 100%; background-color: #fff; padding: 25px 25px 10px 25px; } .q-frame .q-body { vertical-align: middle; text-align: center; height: 220px; width: 750px; font-size: 2.6em; background-color: white; padding: 1.3em; border-radius: 3px; display: table-cell; vertical-align: middle; background-image: url(#{assets_image_url('negomo_background.png')}); background-size: 100% 100%; background-repeat: no-repeat; background-position: 50%; box-shadow: 0.5px 3.5px 10px 0px #ccc; } .q-frame .q-icon { font-size: 2.2em; padding: 5px 0px 0px 0px; margin: 0px; color: #333; border-radius: 5px; } .q-frame .q-icon img { width: 150px; margin-top: 7px; } span.word { font-size: 75px; font-weight: bold; color: #7d7458; } span.description { font-size: 30px; font-weight: 100; color: #545454; line-height: 45px; display: block; margin-top: 10px; font-weight: bold; width: 650px; overflow-wrap: break-word; word-wrap: break-word; margin: 0 auto; } </style> </head> <body> <div class="q-frame"> <div class="q-body"> <span class="word">#{@profile.adjust_money_style}</span><br> <span class="description">#{@profile.title}</span> </div> #{} <div class="q-icon"> #{assets_image_tag('negomo.png').html_safe} </div> </div> </body> </html> HTML end ``` </div> <h1 id="リリースする上で心がけたこと"><a href="#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%99%E3%82%8B%E4%B8%8A%E3%81%A7%E5%BF%83%E3%81%8C%E3%81%91%E3%81%9F%E3%81%93%E3%81%A8">リリースする上で心がけたこと</a></h1> <h3 id="アイデアを形にするスピード"><a href="#%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2%E3%82%92%E5%BD%A2%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89">アイデアを形にするスピード</a></h3> <p>少しずつWEBサービスを作ることにも慣れてきたので、自分が思いついたアイデアを形にするスピードを意識するようにしました。それでも、このサービスを作るのに1週間ほど費やしてしまったので、まだまだだなと感じます。</p> <h3 id="ユーザーにとって分かりやすいサービスかどうか"><a href="#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E3%81%A8%E3%81%A3%E3%81%A6%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B">ユーザーにとって分かりやすいサービスかどうか</a></h3> <p>今までも「ユーザーにとって分かりやすいサービス作り」を意識するようにはしてきましたが、イマイチ分かりやすさを追求できていないように感じていました。特に、非エンジニアの人に使ってもらうとなると非常に難しいと感じます。<br /> そのため、今回は、大まかに言えば「画像をツイートできるだけのサービス」というシンプルな設計にしました。</p> <h1 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h1> <p>タイトルに「誰でも新卒年収800万宣言できる」と書きましたが、最近、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/komi_edtr_1230?s=17">コミさん</a>という技術的に強い方が新卒年収800万円芸なるものを行なって、話題になっているのを1フォロワーとして眺めていました。エンジニアだけでなく、他の分野にもコミさんのように優れた人材はたくさん居られると思うので、その方達がTwitterなどを利用して、しっかりといい待遇を受けられるようになればいいなと思います。<br /> 僕もその方達に加われるように頑張っていきます!<br /> また、このサービスをきっかけに、もっとTwitter就活が当たり前になれば嬉しいです。</p> <p>ここまで読んでいただきありがとうございました!</p> <p><strong>もしよろしければ、いいねボタンを押していただけたら嬉しいです!</strong></p> <p>Negomo、ぜひ使ってみてください!!</p> <p><a target="_blank" rel="nofollow noopener" href="https://negomo.me">Negomo(ネゴモ) - もっとTwitter就活しよう!</a></p> <h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.takuchalle.dev/post/2018/12/06/rails_use_wkhtmltoimage/">Rails で質問箱っぽい画像を作るのに wkhtmltoimage を使った</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://razorjack.net/wkhtmltopdf-on-heroku-evaluating-different-installation-options/">wkhtmltopdf on Heroku: evaluating different installation options</a></li> </ul> TaKO8Ki tag:crieit.net,2005:PublicArticle/14699 2018-12-28T18:23:36+09:00 2019-04-24T12:20:09+09:00 https://crieit.net/posts/d3d77d9486d912d99dc82e71f0defa04 これまで作ったものまとめ <h1 id="開発継続中"><a href="#%E9%96%8B%E7%99%BA%E7%B6%99%E7%B6%9A%E4%B8%AD">開発継続中</a></h1> <h2 id="アニメ視聴遅れ管理サービス"><a href="#%E3%82%A2%E3%83%8B%E3%83%A1%E8%A6%96%E8%81%B4%E9%81%85%E3%82%8C%E7%AE%A1%E7%90%86%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">アニメ視聴遅れ管理サービス</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://annict-access.herokuapp.com">リンク</a><br /> <a href="https://crieit.now.sh/upload_images/e6703cda3f4a1b93dc92eeda163b0a1e5c25f199a6fce.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e6703cda3f4a1b93dc92eeda163b0a1e5c25f199a6fce.jpg?mw=700" alt="image" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://annict.jp/">アニメ視聴管理サービス「Annict」</a>が提供している外部APIを使ったWEBサービス。視聴状況の遅れなどを可視化したもの。</p> <ul> <li>開発・保守期間: 2016.11~ <ul> <li>サーバサイド:Java → NodeJS</li> <li>フロントエンド:AngularJS → ReactJS</li> <li>Heroku</li> <li>Netlify</li> <li>OAuth(twitter/annict API)</li> <li>DBなし</li> </ul></li> </ul> <h2 id="カラオケ機種間横断検索サービス"><a href="#%E3%82%AB%E3%83%A9%E3%82%AA%E3%82%B1%E6%A9%9F%E7%A8%AE%E9%96%93%E6%A8%AA%E6%96%AD%E6%A4%9C%E7%B4%A2%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">カラオケ機種間横断検索サービス</a></h2> <p><a href="https://crieit.now.sh/upload_images/b08b548caec5795ad40e35af9c85f4c95c8e36cc39239.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b08b548caec5795ad40e35af9c85f4c95c8e36cc39239.png?mw=700" alt="image" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://karaoke-db.herokuapp.com/">リンク</a></p> <ul> <li>開発・保守期間: 2018.11~</li> <li>言語 <ul> <li>ReactJS</li> <li>NodeJS</li> <li>SQLite3</li> <li>Heroku</li> </ul></li> </ul> <h2 id="野球リーグスコア管理システム ver 2"><a href="#%E9%87%8E%E7%90%83%E3%83%AA%E3%83%BC%E3%82%B0%E3%82%B9%E3%82%B3%E3%82%A2%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0+ver+2">野球リーグスコア管理システム ver 2</a></h2> <p><a href="https://crieit.now.sh/upload_images/b08b548caec5795ad40e35af9c85f4c95c2b275b54dce.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b08b548caec5795ad40e35af9c85f4c95c2b275b54dce.png?mw=700" alt="image" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://jcblscore-react.netlify.com/">リンク</a></p> <ul> <li>開発・保守期間: 2018.07~</li> <li>言語 <ul> <li>NodeJS</li> <li>ReactJS</li> <li>MySQL</li> <li>Netlify</li> </ul></li> </ul> <h2 id="カラオケ成績管理ツール"><a href="#%E3%82%AB%E3%83%A9%E3%82%AA%E3%82%B1%E6%88%90%E7%B8%BE%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB">カラオケ成績管理ツール</a></h2> <p><a href="https://crieit.now.sh/upload_images/d43b2b4ff3155c9ac692bd97af4bfaca5c25f1dbeacb7.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d43b2b4ff3155c9ac692bd97af4bfaca5c25f1dbeacb7.jpg?mw=700" alt="image" /></a></p> <ul> <li>開発・保守期間: 2018.07~</li> <li>言語 <ul> <li>ReactJS</li> <li>Chart.js</li> </ul></li> </ul> <h2 id="slack流量計 ver 2"><a href="#slack%E6%B5%81%E9%87%8F%E8%A8%88+ver+2">slack流量計 ver 2</a></h2> <p><a href="https://crieit.now.sh/upload_images/cde17b25ca69bea2456237d0a6533a4d5c27756aa0223.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cde17b25ca69bea2456237d0a6533a4d5c27756aa0223.jpg?mw=700" alt="image" /></a><br /> <a href="https://crieit.net/posts/slack">slack流量計をバージョンアップしました。</a></p> <ul> <li>開発・保守期間: 2018.11~</li> <li>言語 <ul> <li>NodeJS</li> <li>chart.js</li> <li>puppeteer</li> <li>MySQL</li> </ul></li> </ul> <h2 id="Amazon Alexaスキル"><a href="#Amazon+Alexa%E3%82%B9%E3%82%AD%E3%83%AB">Amazon Alexaスキル</a></h2> <ul> <li>開発・保守期間: 2018.12~</li> <li>言語 <ul> <li>NodeJS</li> <li>Heroku</li> </ul></li> </ul> <h1 id="開発終了"><a href="#%E9%96%8B%E7%99%BA%E7%B5%82%E4%BA%86">開発終了</a></h1> <h2 id="DAMランキングバトル・月別成績推移表出力ツール"><a href="#DAM%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%90%E3%83%88%E3%83%AB%E3%83%BB%E6%9C%88%E5%88%A5%E6%88%90%E7%B8%BE%E6%8E%A8%E7%A7%BB%E8%A1%A8%E5%87%BA%E5%8A%9B%E3%83%84%E3%83%BC%E3%83%AB">DAMランキングバトル・月別成績推移表出力ツール</a></h2> <p>DAMランキングバトル成績取得ツール「らんばと君」の一ヶ月ごとの出力データを元に得点・順位の推移をHTML化するプログラム。</p> <ul> <li>開発・保守期間: 2006.07~2013.07(開発終了) <ul> <li>バグ修正</li> <li>ユーザサポート</li> <li>機能追加</li> </ul></li> <li>言語: <ul> <li><a target="_blank" rel="nofollow noopener" href="http://hsp.tv/">Hot Soup Processor 3</a></li> <li>javascript</li> <li>HTML</li> </ul></li> </ul> <h2 id="DAM精密採点・成績集計ツール"><a href="#DAM%E7%B2%BE%E5%AF%86%E6%8E%A1%E7%82%B9%E3%83%BB%E6%88%90%E7%B8%BE%E9%9B%86%E8%A8%88%E3%83%84%E3%83%BC%E3%83%AB">DAM精密採点・成績集計ツール</a></h2> <p>精密採点の結果をHTML/XMLから取得してHTML化するプログラム。<br /> HSPではDOMやHTMLパーサーなどが使えなかったので文字列探索の力<br /> 技でテキスト解析を行っていた。<br /> 現在は代替となるWEBサービスが存在するので開発終了。</p> <ul> <li>開発・保守期間: 2006.09~2015.01(開発終了) <ul> <li>バグ修正</li> <li>ユーザサポート</li> <li>機能追加</li> </ul></li> <li>言語 <ul> <li><a target="_blank" rel="nofollow noopener" href="http://hsp.tv/">Hot Soup Processor 3</a></li> <li>javascript</li> <li>HTML</li> <li>Google Chart API</li> </ul></li> </ul> <h2 id="野球リーグスコア管理システム"><a href="#%E9%87%8E%E7%90%83%E3%83%AA%E3%83%BC%E3%82%B0%E3%82%B9%E3%82%B3%E3%82%A2%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0">野球リーグスコア管理システム</a></h2> <p>趣味で行っている野球のリーグスコア管理システムを製作。<br /> <a href="https://crieit.net/posts/0431d68ab5279f65797e41cfc18a0eb5">アドベントカレンダー</a>に記事を書いたのでそちらを参照のこと。</p> <ul> <li>開発・保守期間: 2015.06~2018.12(開発終了) <ul> <li>DB設計(改修後14テーブル)</li> <li>基本設計</li> <li>実装</li> <li>運用・改修</li> </ul></li> </ul> <h2 id="読書管理アプリデータ移行サービス"><a href="#%E8%AA%AD%E6%9B%B8%E7%AE%A1%E7%90%86%E3%82%A2%E3%83%97%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E7%A7%BB%E8%A1%8C%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">読書管理アプリデータ移行サービス</a></h2> <p>読書管理アプリから別の読書管理アプリにデータ(CSV)を抽出するWEBアプリ。</p> <ul> <li>開発・保守期間: 2016.12~2018.02(開発終了)</li> <li>言語 <ul> <li>Java</li> <li>Seasar2</li> <li>REST</li> <li>DBなし</li> </ul></li> </ul> <h2 id="カラオケ全国採点データ閲覧システム"><a href="#%E3%82%AB%E3%83%A9%E3%82%AA%E3%82%B1%E5%85%A8%E5%9B%BD%E6%8E%A1%E7%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E9%96%B2%E8%A6%A7%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0">カラオケ全国採点データ閲覧システム</a></h2> <ul> <li>開発・保守期間: 2017.02~2017.04(開発終了) <ul> <li>DB設計(4テーブル)</li> <li>基本設計</li> <li>実装(APサーバ/DBサーバ)</li> <li>DBチューニング</li> </ul></li> <li>言語 <ul> <li>Java</li> <li>Seasar2</li> <li>REST</li> <li>MySQL</li> </ul></li> </ul> <h2 id="画像判別アプリ"><a href="#%E7%94%BB%E5%83%8F%E5%88%A4%E5%88%A5%E3%82%A2%E3%83%97%E3%83%AA">画像判別アプリ</a></h2> <p>画像をTensorFlowを用いて機械学習で5つのクラスに分類し、twitterのリプライに添付された画像がどのクラスに分類されるかを判定するプログラム。</p> <ul> <li>開発・保守期間: 2017.05~2017.05(開発終了)</li> <li>言語 <ul> <li>Python 3.5</li> <li>tweepy</li> <li>OpenCV3</li> </ul></li> </ul> <h2 id="ランキングバトル集計ツール"><a href="#%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%90%E3%83%88%E3%83%AB%E9%9B%86%E8%A8%88%E3%83%84%E3%83%BC%E3%83%AB">ランキングバトル集計ツール</a></h2> <p><a href="https://crieit.now.sh/upload_images/89d3053539e0291cb8a8cd023efdb96f5c25f2744cc13.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/89d3053539e0291cb8a8cd023efdb96f5c25f2744cc13.jpg?mw=700" alt="image" /></a><br /> 2006年7月から提供しているDAMランキングバトル集計ツールのデータをWEB上で保存・閲覧できるサービス。</p> <ul> <li>開発・保守期間: 2018.02~2018.04(開発中止)</li> <li>言語 <ul> <li>Java</li> <li>Spring MVC</li> <li>MIrageSQL</li> <li>MySQL</li> <li>materializeCSS</li> <li>OAuth</li> </ul></li> </ul> <h2 id="「精密集計」複数アカウント統合ツール"><a href="#%E3%80%8C%E7%B2%BE%E5%AF%86%E9%9B%86%E8%A8%88%E3%80%8D%E8%A4%87%E6%95%B0%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E7%B5%B1%E5%90%88%E3%83%84%E3%83%BC%E3%83%AB">「精密集計」複数アカウント統合ツール</a></h2> <p>カラオケ成績集計サービス「精密集計」のデータをCSVでインポートし、<br /> JSONでエクスポートするWEBアプリ。</p> <ul> <li>開発・保守期間: 2017.09~</li> <li>言語 <ul> <li>Java</li> <li>Seasar2</li> <li>AngularJS</li> <li>MySQL</li> </ul></li> </ul> <h2 id="GoogleHomeにしゃべらせるアプリ"><a href="#GoogleHome%E3%81%AB%E3%81%97%E3%82%83%E3%81%B9%E3%82%89%E3%81%9B%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA">GoogleHomeにしゃべらせるアプリ</a></h2> <p>Google-Home-NotifierやTTS APIを使わない実装</p> <ul> <li>開発・保守期間: 2018.03</li> <li>言語 <ul> <li>NodeJS</li> </ul></li> </ul> <h2 id="slack流量計"><a href="#slack%E6%B5%81%E9%87%8F%E8%A8%88">slack流量計</a></h2> <ul> <li>開発・保守期間: 2018.04~2018.12</li> <li>言語 <ul> <li>Java</li> <li>Spring MVC</li> <li>MySQL</li> </ul></li> </ul> ckoshien tag:crieit.net,2005:PublicArticle/14616 2018-12-01T14:27:52+09:00 2018-12-01T14:27:52+09:00 https://crieit.net/posts/4 ニュースをランダムにガチャで読める「ガチャっとニュース」を4時間でリリースした話【個人開発】 <p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/jyouj__">じぇい</a>です!こんにちは。</p> <p>ニュースをガチャすることで、ニュースをランダムに読める「<a target="_blank" rel="nofollow noopener" href="https://gachat-news.herokuapp.com/">ガチャっとニュース</a>」をリリースしました!</p> <p><a target="_blank" rel="nofollow noopener" href="https://gachat-news.herokuapp.com/">https://gachat-news.herokuapp.com/</a></p> <blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">【拡散希望】ニュースをランダムにガチャして見れる「ガチャっとニュース」をリリースしました㊗️情報の偏りが問題になるこの世の中でランダムにニュースを見れたなら、偏りも減るのでは?と思って作りました楽しめるようにガチャ風にニュースが出るようになってます<a target="_blank" rel="nofollow noopener" href="https://t.co/95AlF0d9Tr">https://t.co/95AlF0d9Tr</a></p>— じぇい👨‍💻 (@jyouj__) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/jyouj__/status/1068155029582864384?ref_src=twsrc%5Etfw">November 29, 2018</a></blockquote> <p>ぜひいろんな人に触ってもらいたいのでリツイートしてもらえると泣いて喜びます:stuck_out_tongue_closed_eyes:</p> <h2 id="作った背景"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E8%83%8C%E6%99%AF">作った背景</a></h2> <p>上のツイートにも書いてあるように、情報の偏りを無くそうと思いました。ただランダムにニュースを閲覧できるようにしても面白くないので、ガチャというエンターテイメント性を入れました。</p> <p>ガチャしてニュースを読むという新たなアプローチ方法です!</p> <h2 id="製作期間"><a href="#%E8%A3%BD%E4%BD%9C%E6%9C%9F%E9%96%93">製作期間</a></h2> <p>水曜日3時間、木曜日1時間の計4時間で完成させました。</p> <p>水曜日にメインの機能であるNewsAPIでニュースをランダムで取得するコードや大まかなサイトのレイアウトを作成しました。</p> <p>木曜日はTwiiterでシェアされる画像の設定や細かいレイアウトを作成しました。</p> <h2 id="ガチャっとニュースってどんなサービス?"><a href="#%E3%82%AC%E3%83%81%E3%83%A3%E3%81%A3%E3%81%A8%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%81%A3%E3%81%A6%E3%81%A9%E3%82%93%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%EF%BC%9F">ガチャっとニュースってどんなサービス?</a></h2> <p>「ガチャっと」というボタンを押すとランダムでニュースが一つガチャされます。</p> <p><img width="1252" alt="スクリーンショット 2018-11-30 18.31.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/c6babb97-62cc-50e8-dd48-1f6e18aa3082.png"></p> <p><img width="1248" alt="スクリーンショット 2018-11-30 18.32.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/5706c062-30ca-867d-2faf-0a6ac3a1c63d.png"></p> <p>1ページで完結している、シンプルなサービスです。</p> <p>もちろんスマホ対応してます。</p> <p><img width="321" alt="スクリーンショット 2018-11-30 18.35.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/f01547b4-ae28-bfaf-c91f-d67a7aa9837f.png"></p> <p><img width="314" alt="スクリーンショット 2018-11-30 18.35.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/a44e31fc-26e5-b19d-116c-142d2f6c178e.png"></p> <h2 id="使ったもの"><a href="#%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">使ったもの</a></h2> <ul> <li><p>Django</p> <ul> <li>使い慣れているから、サクッとできる</li> <li>Flaskとかでもよかったかも</li> </ul></li> <li><p>Bulma</p> <ul> <li>1ページだけだけどレイアウトはそれなりには整えたかった</li> <li>サクッとCSS適用できて便利</li> <li>モーダルウィンドウやボタン、画像サイズの部分で活躍しました</li> </ul></li> <li><p>jQuery</p> <ul> <li>モーダルウィンドウの表示の部分で活用しました</li> <li>小さな機能ならjQueryで十分</li> </ul></li> <li><p>News API</p> <ul> <li>国別、カテゴリー別など様々なニュースを取得できるAPI</li> <li>newsapi-pythonというパッケージがあってよかった</li> <li>最新のニュースを常に取得できるのもいい!</li> </ul></li> </ul> <p>NewsAPIについては僕自身が使い方をブログに記事書いてます(笑)</p> <p><a target="_blank" rel="nofollow noopener" href="https://jyouj.hatenablog.com/entry/2018/11/26/222639">[Django]NewsAPIを使ってニュースサイトを作ってみる</a><br /> <a target="_blank" rel="nofollow noopener" href="https://jyouj.hatenablog.com/entry/2018/11/27/214832">[Django]NewsAPIを使って色々なニュースを取り出してみよう</a></p> <ul> <li><p>Github</p> <ul> <li>使わない選択肢がなかった</li> </ul></li> <li><p>Heroku</p> <ul> <li>とりあえず無料のを使った</li> <li>サーバーの知識なくてもOKなのありがたい</li> </ul></li> </ul> <h2 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h2> <p>今回で二つ目のサービスのリリースとなります。個人で色々開発する上のメリットは思い立ったらすぐ形にできたり、自分の気分の乗るときに作れるところだと思います。</p> <p>まだまだ開発するぞ!</p> <p>Qiitaにいいねくれたら舞って喜びます:sunglasses:</p> <p>お読みいただきありがとうございました!</p> じぇい👨‍💻Hundread運営&Punizm開発中 tag:crieit.net,2005:PublicArticle/14601 2018-11-14T03:32:24+09:00 2018-11-14T04:10:54+09:00 https://crieit.net/posts/Web-100 Web未経験から100日でリリース!「お笑いライブの検索サイト」をつくりました【個人開発】 <p>こんにちは、かしい(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/rubys8arks">@rubys8arks</a>)と申します。<br /> SIerで働いていましたが、WEB業界への転職を目指しプログラミングの勉強を始めました。<br /> データベースなどの知識は少しあったものの、Webアプリケーションの開発は今回が完全に初めてです!</p> <h1 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h1> <p>お笑いライブの検索サイトです。日付やキーワードで東京近郊のお笑いライブを横断検索できます。<br /> - <a target="_blank" rel="nofollow noopener" href="https://warally.info">ワラリー! - お笑いライブ検索(東京)</a></p> <blockquote class="twitter-tweet" data-lang="fr"><p lang="ja" dir="ltr">🎊Web系未経験の初心者が100日間で初めてのrailsサービスをリリース🎊👉<a target="_blank" rel="nofollow noopener" href="https://t.co/qL6fAtOi5i">https://t.co/qL6fAtOi5i</a>首都圏のお笑いライブを日付やキーワードで横断検索できるサービスです!・5秒で使えるTwitterログイン・わかりやすいUI・13サイトからデータを毎日スクレイピングよかったら見てください〜✨ <a target="_blank" rel="nofollow noopener" href="https://t.co/7js7F9Bs8p">pic.twitter.com/7js7F9Bs8p</a></p>— かしい@お笑いSNSつくった (@rubys8arks) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/rubys8arks/status/1061748089751515137?ref_src=twsrc%5Etfw">11 novembre 2018</a></blockquote> <p><img width="337" alt="スクリーンショット 2018-11-13 18.58.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/068ccb8d-ab67-c558-9e04-b279ddb801ce.png"><img width="337" alt="スクリーンショット 2018-11-13 19.01.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/e9b5e0c0-51d7-29ed-ff64-c8305d9fd755.png"></p> <p>データはプレイガイドや劇場のサイトから自動でスクレイピングするほか、誰でもライブ情報を登録できるようになっています。</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/238801/13926ae2-5133-570c-86ca-0901e79b055f.jpeg" alt="ワラリー!ビジネスモデル図.jpg" /><br /> * <a target="_blank" rel="nofollow noopener" href="https://note.mu/tck/n/n95812964bcbb?magazine_key=m91891e5390bc">ビジモ図鑑</a>で配布されているキットをお借りしました。</p> <h1 id="サービスを作ったきっかけ"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">サービスを作ったきっかけ</a></h1> <p>もともと「Walive!」というお笑いライブの検索サイトがあったのですが、そのサイトが2017年9月で突然閉鎖してしまったことがきっかけです。<br /> せっかくお笑いファンの間で愛されているサイトだったのにもったいないなと思い、同じ機能(+α)を持った新しいサイトを作ろうと考えました。<br /> <img width="600" alt="スクリーンショット 2018-11-13 19.23.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/756b7047-435e-a639-0421-e4f4a4395b07.png"></p> <h1 id="どういう技術で動いてるか"><a href="#%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%8A%80%E8%A1%93%E3%81%A7%E5%8B%95%E3%81%84%E3%81%A6%E3%82%8B%E3%81%8B">どういう技術で動いてるか</a></h1> <p>初心者なのであまり凝った技術は使っていません!</p> <h2 id="バックエンド"><a href="#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89">バックエンド</a></h2> <h3 id="Ruby on Rails"><a href="#Ruby+on+Rails">Ruby on Rails</a></h3> <p>webスクレイピング用に<a target="_blank" rel="nofollow noopener" href="https://github.com/sparklemotion/mechanize">Mechanize</a>のgemを使ってます。サービス層は悪!と言われてることもあるのですが、コントローラーやモデルが見やすくなるのでサービス層、ヘルパー層も使いました。</p> <h2 id="サーバー"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC">サーバー</a></h2> <h3 id="Heroku"><a href="#Heroku">Heroku</a></h3> <p>手軽にデプロイできるHerokuのサーバーを使っています。<br /> アクセスできない時間ができるのが嫌だったので、Herokuの有料プランにしています。<br /> - Hobby Dyno $7/月 (システムダウンタイムなし、独自ドメインのかんたん設定)<br /> - Heroku Postgres Premium $9/月(1000万行まで保存できる)</p> <p>Herokuの有料プランは使わずにもっと安くする方法もあるみたいなんですが、一旦は設定のしやすさを優先しています。</p> <h2 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></h2> <h3 id="JQuery"><a href="#JQuery">JQuery</a></h3> <p>さんざん「JQueryはオワコン」と言われていますが、ぐぐったときに出てくる情報が多いので一旦JQueryで実装しました。<br /> 日付の選択をカレンダ(<a target="_blank" rel="nofollow noopener" href="https://flatpickr.js.org/">flatpickr</a>)で行えるようにしたり、アンケート結果をアコーディオンでぬるっと表示させたりしています。<br /> <img width="339" alt="スクリーンショット 2018-11-13 19.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/a15b6af6-0ca5-398f-3a51-22a54bf96210.png"></p> <h3 id="fontawesome"><a href="#fontawesome">fontawesome</a></h3> <p>みんな大好き<a target="_blank" rel="nofollow noopener" href="https://fontawesome.com/">fontawesome</a>です。<br /> フォームのplaceholderにも使っています。</p> <h1 id="こだわったこと"><a href="#%E3%81%93%E3%81%A0%E3%82%8F%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">こだわったこと</a></h1> <h2 id="UIとデザイン"><a href="#UI%E3%81%A8%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3">UIとデザイン</a></h2> <p>「とにかく人に使ってほしい」という思いからUIとデザイン(特にライブの入力フォーム回り)にこだわりました。<br /> 実際にサービスへの反応も「デザインがいい!」というものが多く、ありがたい限りです。<br /> CSSのフレームワークは使わず、TumblrのEstenテーマ、Twitter、InstagramなどのSNSを参考にしました。<br /> <img width="312" alt="スクリーンショット 2018-11-13 20.32.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/a45d9e30-287d-a752-ee65-e7f4fbe33380.png"><img width="336" alt="スクリーンショット 2018-11-13 20.32.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/3385c57f-2855-7b5e-5b60-a95cf021cc56.png"></p> <ul> <li>URLを貼り付けたらogp情報を取ってライブの説明や出演者、画像などを自動入力できるように</li> <li>会場をセレクトボックスで選択できるようにしつつ、自由入力欄も作ったり</li> <li>フォーム数が多くなると入力したくなくなるので、重要でない項目はモーダルで分けたり</li> </ul> <p>自分にとってはだいぶ使いやすくなったのですが、フォームはまだまだ改善の余地があるなと思っています。</p> <h2 id="SNSログイン"><a href="#SNS%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3">SNSログイン</a></h2> <p>お笑いファンはだいたいTwitterで情報収集しているので、既にアカウントを持っているであろうTwitterアカウントで登録・ログインできるようにしました。<br /> 知らないサービスにいきなり「メールアドレスで登録できます!」と言われてもユーザー登録しないなと思ったので、SNS連携としました。</p> <h2 id="いいね機能"><a href="#%E3%81%84%E3%81%84%E3%81%AD%E6%A9%9F%E8%83%BD">いいね機能</a></h2> <p>旧サイト「Walive!」にはなかった機能として、ライブへのいいね機能を2種類実装しました。<br /> ライブに行く人あるあるとして、自分のスケジュールを把握できずに同じ日の同じ時間帯のライブ(いわゆる『被り』)のチケットを間違えて買っちゃったりします。<br /> そういうのを防止したいなと思い、すでにチケットを買った・予約したライブは『絶対いく』、まだ買ってないけど行けたら行きたいライブは『気になる』で管理できるようにしました。</p> <h1 id="Webサービスをつくってみた感想"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E6%84%9F%E6%83%B3">Webサービスをつくってみた感想</a></h1> <p>最初の1ヶ月はプログラミングスクールでhtml/cssとruby/Ruby on Railsを学んだのですが、スタッフの「1ヶ月ですぐ作れるよ!」という甘い声をうのみにして痛い目にあいました…。<br /> スクールを終えた知識で作ってみても「え、いいねボタン自動で切り替わらないの?(JQueryが必要)」、「孫モデルまでアソシエーションしてデータ取るのどうやるの?」などなどわからないことだらけ。<br /> 最初の頃、家で同じエラーに1週間くらいわんわん言ってた私に「macbookを買え、もくもく会に行け」と言いたいです。<br /> Twitter、Slack、もくもく会などでド初心者の質問に親切に答えてくださった皆さん、本当にありがとうございました!!</p> <p>エンジニアの方にはあまりお笑いライブに馴染みはないかもしれませんが、せっかく作ったのでちら見してもらえれば幸いです。<br /> 出演者ですぐ探せるので、「こないだテレビで見た芸人面白かったな」というときはぜひ使ってみてください!</p> <p><a target="_blank" rel="nofollow noopener" href="https://warally.info">ワラリー! - お笑いライブ検索(東京)</a></p> かしい@お笑いSNS作成中 tag:crieit.net,2005:PublicArticle/14592 2018-11-03T22:40:22+09:00 2018-11-16T16:49:04+09:00 https://crieit.net/posts/Hundread 【個人開発】リレー式小説投稿サービス"Hundread"をリリースしました! <p>じぇい(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/jyouj__">@jyouj__</a>)です!</p> <p>一週間ちょっとでリレー式小説投稿サービス"<a target="_blank" rel="nofollow noopener" href="https://hundread.fun/">Hundread</a>(ハンドレッド)"をリリースしました!</p> <p>このサービスはもともと6月に行われたStartup Weekend Okayamaにて発表し、優勝したものです。</p> <p>その後、別のサービスの開発で全然作れていなかったのですが、急に作りたくなってきてデザインを考え直し、急遽一週間ちょっとで作りリリースすることができました!</p> <blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">リレー式小説サービス"Hundread"をリリースしました!!Hundreadは自分が投稿した小説をツイッターにシェアして続きを他の人に書いてもらうことができます!もちろん、他の人の小説の続きを書くこともできちゃいます!ぜひ、使って拡散してください!<a target="_blank" rel="nofollow noopener" href="https://t.co/qEbytWUukM">https://t.co/qEbytWUukM</a></p>— じぇい👨‍💻Punizm作ってます (@jyouj__) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/jyouj__/status/1057652433797570562?ref_src=twsrc%5Etfw">October 31, 2018</a></blockquote> <p>個人開発ではあるものの、様々な方にDMでわからないことを教えていただき無事リリースしました。本当にありがとうございます。</p> <h1 id="どんなサービスなの?"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AA%E3%81%AE%EF%BC%9F">どんなサービスなの?</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://hundread.fun/">Hundread</a>は</p> <p>小説を投稿してツイッターで共有するとそのツイートを見た誰かがその続きを書いてくれる小説投稿サービスです。</p> <p>もちろん他のユーザーの小説や文章の続きも書くことができます。</p> <h3 id="ログイン画面"><a href="#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%94%BB%E9%9D%A2">ログイン画面</a></h3> <p><img width="1242" alt="スクリーンショット 2018-11-01 22.08.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/9767151f-d0d3-01b5-ca7c-cc9f06a3f242.png"><br /> <img width="1247" alt="スクリーンショット 2018-11-01 22.08.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/e9943f02-a63b-9b3d-c649-81a8a96391d8.png"></p> <h3 id="トップページ"><a href="#%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8">トップページ</a></h3> <p><img width="1247" alt="スクリーンショット 2018-11-01 22.09.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/825c32a8-da0c-5347-ecf7-c6485ce40879.png"></p> <p>このサービスは質問箱のようなサービスのようにツイッターでのコミュニケーションの方法の一つになればと思っています。</p> <p>次から次に小説をリレーで回すことでこの人はこんなことを書くのか!という新たな気づきを、新しいコミュニケーションの形を、楽しんでみてください!</p> <h3 id="モバイルにも対応"><a href="#%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%82%E5%AF%BE%E5%BF%9C">モバイルにも対応</a></h3> <p><img width="439" alt="スクリーンショット 2018-11-01 22.20.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/449d51fe-faca-8a28-c7ee-48a83e6f32f7.png"><br /> <img width="416" alt="スクリーンショット 2018-11-01 22.20.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/45860f71-248f-cdb3-7281-5600f84744ae.png"></p> <h1 id="使ったもの"><a href="#%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">使ったもの</a></h1> <p>・<a target="_blank" rel="nofollow noopener" href="https://www.djangoproject.com/">Django</a><br />  Pythonのフレームワーク。一番なれてる。</p> <p>・<a target="_blank" rel="nofollow noopener" href="https://bulma.io/">Bulma</a><br />  CSSのフレームワーク。モバイル対応も簡単でデザインもいい感じにできるので、これに頼りきりでした。</p> <p>・<a target="_blank" rel="nofollow noopener" href="https://developer.twitter.com/">Twitter API</a><br />  Twitterアカウントでログインできるようにしました。</p> <p>・<a target="_blank" rel="nofollow noopener" href="https://fontawesome.com/">fontawesome</a><br />  とにかく便利</p> <p>・Github<br />  使うよね:sunglasses:</p> <p>・Heroku<br />  インフラ関連の知識がないので助かりました。hobbyプランにすると独自ドメインでもSSLになるのでとにかくありがたい。ただ、staticfileの扱いでハマってしまった。。。</p> <h1 id="助けられた記事"><a href="#%E5%8A%A9%E3%81%91%E3%82%89%E3%82%8C%E3%81%9F%E8%A8%98%E4%BA%8B">助けられた記事</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://torina.top/detail/337/">https://torina.top/detail/337/</a><br />  DetailViewとCreateViewの組み合わせを参考にさせていただきました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/okoppe8/items/76cdb202eb15aab566d1">https://qiita.com/okoppe8/items/76cdb202eb15aab566d1</a><br />  Herokuでのデプロイの時に参考にさせていただきました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://blog.mktia.com/how-to-use-environment-variables-on-heroku/">https://blog.mktia.com/how-to-use-environment-variables-on-heroku/</a><br />  Herokuで環境変数の設定をする際に参考にさせていただきました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/kenjikatooo/items/07c3d911210a4ca96781">https://qiita.com/kenjikatooo/items/07c3d911210a4ca96781</a><br />  Herokuで独自ドメインを設定する際に参考にさせていただきました。</p> <p>また、困っているDjango関連の質問を<a target="_blank" rel="nofollow noopener" href="https://groups.google.com/forum/m/#!forum/django-ja">Django-ja</a>というグループにして、助けてもらいました。</p> <h1 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h1> <p>僕は新しい文化を創造することを常に追求してます。</p> <p>是非とも<a target="_blank" rel="nofollow noopener" href="https://hundread.fun/">Hundread</a>を遊んで、拡散してください!</p> <p>ちなみに......</p> <p>Hundreadというサービス名は</p> <p>手(Hund)で書き、読む(read)</p> <p>と</p> <p>100の英単語であるHundred</p> <p>をかけた造語です笑</p> <p>お読みいただきありがとうございます!</p> じぇい👨‍💻Hundread運営&Punizm開発中 tag:crieit.net,2005:PublicArticle/14565 2018-10-10T19:35:48+09:00 2018-10-26T08:28:47+09:00 https://crieit.net/posts/Wordpress-S3-SendGrid-Heroku-Composer Wordpressを無料でS3、SendGrid、Heroku、Composerでデプロイする <p><a href="https://crieit.now.sh/upload_images/3e0a99d4c9d3bf6999aa40837f8a26475bbdd5cd82288.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3e0a99d4c9d3bf6999aa40837f8a26475bbdd5cd82288.png?mw=700" alt="logo-composer-transparent5.png" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/PhilippHeuer/wordpress-heroku">https://github.com/PhilippHeuer/wordpress-heroku</a></p> <p>こちらのGithubにある「Deploy to heroku」ボタンをクリックすることでも構築できるのですが、画像やプラグインを永続的に維持するためにはローカルに構築してcomposer updateしてから差分をgit pushし、同じソースコードをherokuにデプロイする必要があるのでした。</p> <p>いろいろいじってやってみたところ、なんとかできたので、この後もいろいろ試したいと思う。</p> <p>一番苦労した点は、英語版Wordpressを日本語化する方法だった。</p> <p>ローカルでWP CLIを使って日本語化ファイルをダウンロードし、git pushしたらできた。</p> <p><code>wp core language install ja --activate</code></p> <p>参考URL<br /> <a target="_blank" rel="nofollow noopener" href="https://upd.world/wordpress-cloud9/">https://upd.world/wordpress-cloud9/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/miya0001/items/96a684e2f819f9d8b4a4">https://qiita.com/miya0001/items/96a684e2f819f9d8b4a4</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/fuwamaki/items/8684003bb47197336645">https://qiita.com/fuwamaki/items/8684003bb47197336645</a></p> fk2000