tag:crieit.net,2005:https://crieit.net/tags/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/feed 「サービス」の記事 - Crieit Crieitでタグ「サービス」に投稿された最近の記事 2023-03-14T14:31:14+09:00 https://crieit.net/tags/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/feed tag:crieit.net,2005:PublicArticle/18370 2023-01-19T02:53:19+09:00 2023-03-14T14:31:14+09:00 https://crieit.net/posts/AI-Skeb AIイラストもOKの依頼サイトをつくってる <p>タイトルの通りAIイラストもOKのイラストお題箱サイトを開発しています。そろそろ1ヶ月が経ちますがまだ完成しません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://prompton.io">https://prompton.io</a></p> <p>↑ 既に投稿機能とリクエスト機能が使えるので遊びに来て!</p> <p><a href="https://crieit.now.sh/upload_images/4e09ec8c232bfbcd456874ece53299f063c832b434e31.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4e09ec8c232bfbcd456874ece53299f063c832b434e31.jpg?mw=700" alt="Screenshot 2023-01-19 at 2.55.17.jpg" /></a></p> <h1 id="AIイラストとは?"><a href="#AI%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF%EF%BC%9F">AIイラストとは?</a></h1> <p>ここ数ヶ月で、HolaraAIやMidjourney、NovelAIなど色々な学習モデルが登場しており、各モデルもバージョンを上げて日々進化しています。最近ではカメラで撮った写真のような画像も生成できます。</p> <p>例えばこれは海底をイメージした画像を生成しました。</p> <p><a href="https://crieit.now.sh/upload_images/636001b7aa16d83c22abfe50895e632e63c81a7ab2bb1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/636001b7aa16d83c22abfe50895e632e63c81a7ab2bb1.png?mw=700" alt="photograph_blur_dark_blue_seabed_pale_pink_slimes_dc526ba4-146f-4954-845f-ac0968dca5d1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/532e24d505d2690cd7fea048e5182c4063c817ccad28b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/532e24d505d2690cd7fea048e5182c4063c817ccad28b.png?mw=700" alt="photograph_blur_dark_blue_seabed_pale_pink_jellyfishes_3093a9f7-1937-472c-80fb-8e69ea76a4fe.png" /></a></p> <p>漫画のコマのようなイラストも生成できます。実際にAI漫画を公開したり売ってる人もいます。</p> <p><a href="https://crieit.now.sh/upload_images/a890b17611656bcf8d4b02c9a794e42263c82f9613498.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a890b17611656bcf8d4b02c9a794e42263c82f9613498.png?mw=700" alt="__female_cute_face_beautiful_lip_manga_monochrome_dress_shirts__3b602eb4-c68f-4027-b6a0-0f8ffb8a3142.png" /></a></p> <p>好みですが、少し画質の悪いアニメのような画像も。</p> <p><a href="https://crieit.now.sh/upload_images/c75f44e61472d5e83a8fc4b15b5b56fd63c83004c6b07.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c75f44e61472d5e83a8fc4b15b5b56fd63c83004c6b07.png?mw=700" alt="_1980s_anime_movie_still_pastel_color_scheme_1girl_blue_short_h_542ae44e-5d31-46b4-81e7-92c54be73ac5.png" /></a></p> <p>逆に落書きのような画像を生成することもできます。用途は不明です。</p> <p><a href="https://crieit.now.sh/upload_images/ef08554857ab4ca31afef639efb9145463b66d013ba28.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ef08554857ab4ca31afef639efb9145463b66d013ba28.png?mw=700" alt="unnamed.png" /></a></p> <h1 id="何に使える?"><a href="#%E4%BD%95%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B%EF%BC%9F">何に使える?</a></h1> <p>AIイラストを使えば、例えば、サイトや小説の挿絵がたくさん作れます。ポスターにも使えそうです。</p> <p><a href="https://crieit.now.sh/upload_images/e899008a67cd35384206b931a31acb8963b662db84f1c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e899008a67cd35384206b931a31acb8963b662db84f1c.png?mw=700" alt="watercolor_female__short_hair_5bc29367-1bbd-404e-a07e-00290f84ca36.png" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://prompton.io/about">https://prompton.io/about</a></p> <p>↑ このページの挿絵は全て「にじじゃーにー」で生成しています。</p> <h3 id="アイコンにも!"><a href="#%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%AB%E3%82%82%EF%BC%81">アイコンにも!</a></h3> <p>それからYouTubeやTwitterのアイコンも作れます。</p> <p><a href="https://crieit.now.sh/upload_images/ef08554857ab4ca31afef639efb9145463c81fba94cb1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ef08554857ab4ca31afef639efb9145463c81fba94cb1.png?mw=700" alt="unnamed.png" /></a></p> <p>もっとシンプルなアイコンも作れます。</p> <p><a href="https://crieit.now.sh/upload_images/36408ee4536380afb28f233d9a47504863c8205b5d4eb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/36408ee4536380afb28f233d9a47504863c8205b5d4eb.png?mw=700" alt="unnamed-2.png" /></a></p> <p>プロンプトに「selfie」を含めると自撮りみたいなアイコンも作れます。</p> <p><a href="https://crieit.now.sh/upload_images/5eb3a6e9c3cef8bf9ea2c8fbe407cd0d63c824bfe0ac2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5eb3a6e9c3cef8bf9ea2c8fbe407cd0d63c824bfe0ac2.png?mw=700" alt="_instagram_photography_selfie_Japanese_female_high-school_stude_cffb9606-82e3-4189-bde8-7054f9e2fd44.png" /></a></p> <h3 id="バッグや服も"><a href="#%E3%83%90%E3%83%83%E3%82%B0%E3%82%84%E6%9C%8D%E3%82%82">バッグや服も</a></h3> <p>デザインの知識がある人なら服やバッグのデザインもできるかもしれません。</p> <p>自分はミニバッグがよく分かってないのですが、これは適当に作ってみた画像です。</p> <p><a href="https://crieit.now.sh/upload_images/fd9929ee0da3d3317731dbc4a2cf2c1563c822413fcf0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fd9929ee0da3d3317731dbc4a2cf2c1563c822413fcf0.png?mw=700" alt="unnamed-3.png" /></a></p> <p>これは適当に作った中学生が着てそうな服です。</p> <p><a href="https://crieit.now.sh/upload_images/3611c6f13b87eb1ce0e8876ae1014b1763c82624803f2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3611c6f13b87eb1ce0e8876ae1014b1763c82624803f2.png?mw=700" alt="_oversized_regular_white_hoodie_concept_with_one_black_line_adi_dc43a2a4-70ee-458e-ba1b-3ad3d1ab4282.png" /></a></p> <h1 id="今後は?"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AF%EF%BC%9F">今後は?</a></h1> <p>こういったAIツールや学習モデルは、毎日のように新しいものが公開されています。これからアニメだったり3Dモデルだったりの生成も可能になってくると勝手に予想しています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://huggingface.co/gsdf/Counterfeit-V2.0">https://huggingface.co/gsdf/Counterfeit-V2.0</a></p> <p>↑ 最近だとこれ凄いアニメっぽい</p> <p>一眼レフからスマホカメラになってライトユーザが増えたように、絵本や漫画やアニメ、カードゲーム、ボードゲームといった創作がもっと身近になると感じてます。</p> <p>アイデアはあるけど時間がないって人はぜひAIイラストを触ってみてください。</p> <h1 id="リクエストして!"><a href="#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%97%E3%81%A6%EF%BC%81">リクエストして!</a></h1> <p>今のところ、AIイラストだけでも、GPUの購入、プロンプトの組み合わせ、学習モデルの選定、マージモデル、Pythonでのコーディングなど、そこそこ難易度はあがります。</p> <p>そこで商用利用が可能なイラストを1枚500円からリクエストできるサイトを開発しています。</p> <p>AIイラストは複雑な要望に向いていないのでココナラのような業務委託には向いていませんが、代わりに短期間で沢山つくって納品することができます。500円x4枚 = 2000円のようなリクエストもできます。</p> <p><a href="https://crieit.now.sh/upload_images/1bf9011d1068ab495f0bc6ad86ae3f5763c833247e187.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1bf9011d1068ab495f0bc6ad86ae3f5763c833247e187.jpg?mw=700" alt="Screenshot 2023-01-19 at 2.56.59.jpg" /></a></p> <p>無償リクエストの場合は、納品された画像は商用利用はできませんがアイコンなど好きに使えます。</p> <h3 id="そのほか"><a href="#%E3%81%9D%E3%81%AE%E3%81%BB%E3%81%8B">そのほか</a></h3> <p>こちらのユーザにもリクエストできるので、気になるからは見てみてください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://prompton.io/9Gjz1zJZS1M41ddmaU7aFU1HNqC2">https://prompton.io/9Gjz1zJZS1M41ddmaU7aFU1HNqC2</a></p> <p>↑ かわいいアイコンはこちらに</p> <p><a target="_blank" rel="nofollow noopener" href="https://prompton.io/OMO61PwlcBWx5CVlVepXGP5U0gT2">https://prompton.io/OMO61PwlcBWx5CVlVepXGP5U0gT2</a></p> <p>↑ ロゴみたいなイラストはこちらに</p> <p><a target="_blank" rel="nofollow noopener" href="https://prompton.io/5FlXKGvMsSNi9QiyNTqkG2tFEmF3">https://prompton.io/5FlXKGvMsSNi9QiyNTqkG2tFEmF3</a></p> <p>↑ 女性向けのかっこいいイラストはこちらに</p> <p><a target="_blank" rel="nofollow noopener" href="https://prompton.io/OltOK5T6sZOuhVNay323tZkD2J32">https://prompton.io/OltOK5T6sZOuhVNay323tZkD2J32</a></p> <p>↑ カードゲームのようなかっこいいイラストはこちらに</p> プロンプトン tag:crieit.net,2005:PublicArticle/16139 2020-10-18T18:32:30+09:00 2020-10-18T18:32:30+09:00 https://crieit.net/posts/51666379560ed175bbb7725cb5f01193 プログラムコードを販売できるサービスまとめ <p>今回はプログラムコードを販売できるサービスをまとめました。</p> <h2 id="code-sell"><a href="#code-sell">code-sell</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.code-sell.net/">code-sell</a><br /> <a href="https://crieit.now.sh/upload_images/58040fa19563696175b43776ee552c375f8c097ec198c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/58040fa19563696175b43776ee552c375f8c097ec198c.png?mw=700" alt="image" /></a><br /> 宣伝です...。僕が1週間くらい前に作ったサービスです。なるべく簡単に販売・購入できるようにしました。<br /> いま僕が今まで作ったwebアプリのコードをすべて無料で公開しています。</p> <h2 id="piecex"><a href="#piecex">piecex</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://piecex.com">piecex</a><br /> <a href="https://crieit.now.sh/upload_images/7ee158079f977ed09bd1f41679bf02bf5f8c09672c2d1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7ee158079f977ed09bd1f41679bf02bf5f8c09672c2d1.png?mw=700" alt="image" /></a><br /> おそらく一番メジャーで人気のあるサービスです。<br /> AIを搭載していて最適な価格がわかるそうです。</p> <h2 id="osadasoft"><a href="#osadasoft">osadasoft</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.osadasoft.com/support/source/">osadasoft</a><br /> コード一つ一つが高額です</p> <h3 id="補足"><a href="#%E8%A3%9C%E8%B6%B3">補足</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://www.source-gene.com/sg/top.do">sourcegene</a><br /> は登録ができませんでした。最新のコードも2018年なのでおそらくサービス終了しているんだと思います。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回はプログラムコードを販売できるサービスをまとめてみました。とりあえずいえるのは<br /> <a target="_blank" rel="nofollow noopener" href="https://www.code-sell.net/">code-sell</a>使ってください。</p> 山田悠 tag:crieit.net,2005:PublicArticle/15889 2020-05-08T23:49:22+09:00 2020-05-08T23:49:22+09:00 https://crieit.net/posts/212b84fe6cfd7529a1604bcfec6999b7 副業求人の横断検索サービスで利用した技術について <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>こんにちは。かつおです。個人開発が趣味でがんばってます。</p> <p>この記事では先日リリースしたWebサービス「<a target="_blank" rel="nofollow noopener" href="https://xn--vckya7no28j49x.jp/">副業サーチ</a>」の利用技術やシステム構成を書いてみました。<br /> * <a target="_blank" rel="nofollow noopener" href="https://note.com/katsuo_s7/n/n85853d44b718">開発者の想い的なNoteはこちら</a></p> <h2><a target="_blank" rel="nofollow noopener" href="https://xn--vckya7no28j49x.jp/">副業サーチ</a>とは?</h2> <p><a href="https://crieit.now.sh/upload_images/3ba929ef7bd8759cb67daaa2acc6b84c5eb570cfee9bd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3ba929ef7bd8759cb67daaa2acc6b84c5eb570cfee9bd.png?mw=700" alt="image" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://xn--vckya7no28j49x.jp/">副業サーチのサービスのURLはこちら</a></p> <p>色々なWebサイトに掲載されている副業求人、副業案件を収集し、まとめて検索できるWebサービスです。<br /> いわゆる横断検索サイトで、副業特化の「Indeed」のようなサービスです。</p> <p>副業サーチは以下の階層で構成されてます。<br /> * トップページ<br /> * 副業の検索ページ<br /> * お役立ち記事一覧ページ<br /> * お役立ち記事詳細ページ</p> <h2 id="システム構成・利用技術"><a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E6%88%90%E3%83%BB%E5%88%A9%E7%94%A8%E6%8A%80%E8%A1%93">システム構成・利用技術</a></h2> <p><a href="https://crieit.now.sh/upload_images/265917458e031608c7e731dadbb52e7f5eb56e152400d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/265917458e031608c7e731dadbb52e7f5eb56e152400d.png?mw=700" alt="image" /></a></p> <h3 id="副業求人検索"><a href="#%E5%89%AF%E6%A5%AD%E6%B1%82%E4%BA%BA%E6%A4%9C%E7%B4%A2">副業求人検索</a></h3> <ol> <li>Webサイトをクローリングして副業案件データを収集。</li> <li>PythonのScrapyを使ってスクレイピング</li> <li>収集したデータをちょっと加工(タギング、データの正規化)</li> <li>全文検索エンジン(Elastic Search)へインデックス</li> </ol> <p>あとはフロントから検索APIを叩いて結果を表示している感じです。<br /> 直接ブラウザから呼ばずにFirebase Functions経由で読んでいます。</p> <h3 id="記事コンテンツ"><a href="#%E8%A8%98%E4%BA%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84">記事コンテンツ</a></h3> <ol> <li>ヘッダレスCMSのContentfulで記事編集</li> <li>Gridsomeでビルドする際にデータを全部取ってきて、静的ページとしてビルド</li> </ol> <h2 id="使っている技術・選定理由・感想"><a href="#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93%E3%83%BB%E9%81%B8%E5%AE%9A%E7%90%86%E7%94%B1%E3%83%BB%E6%84%9F%E6%83%B3">使っている技術・選定理由・感想</a></h2> <h3 id="スクレイピング ⇒ Scrapy"><a href="#%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0+%E2%87%92+Scrapy">スクレイピング ⇒ Scrapy</a></h3> <p>スクレイピングしたデータを加工する際に、自然文処理みたいなことに手を出す可能性を考えて、Python製のものを使いたいなと考えました。使ってみて、かなり使い勝手が良かったので採用しました。</p> <p>Scrapyはスクレイピング処理を構築するフレームワークで、かなり便利でした。<br /> スクレイピングやるのにフレームワーク使ったのは初めてです。<br /> 個人的に便利だと感じたポイントです。<br /> * クロールしたデータをローカルにキャッシュし、再クロール時はキャッシュを参照してくれる<br /> * 開発時に何度もサイトにアクセスすることを防げます。<br /> * もちろん保存期間は設定ファイルで自由に設定可能<br /> * CSSセレクタでデータを取ってきて、データ加工して、保存するみたいな流れがFWで定義されていて、処理の共通化や追加が楽<br /> * 個人的にPythonで書いたコードは読みやすい(対js比)</p> <h3 id="データのタギング"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%BF%E3%82%AE%E3%83%B3%E3%82%B0">データのタギング</a></h3> <p>スクレイピングで取得したテキストデータからタグを抽出したいというものなのですが、ちょっと試行錯誤しました。</p> <h4 id="実験して没にしたもの"><a href="#%E5%AE%9F%E9%A8%93%E3%81%97%E3%81%A6%E6%B2%A1%E3%81%AB%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE">実験して没にしたもの</a></h4> <p>NTTコミュニケーションズ製のCOTOHAのキーワード抽出API</p> <p>取得結果が私のほしいものに合わなかったので見送りました。</p> <p>例:「 【リモート可】アパレル業界から医療関係まで、お客様の「強み」を最大限に生かすシステムの受託開発をするバックエンドエンジニアを募集!」</p> <p>取得したいタグ:<br /> * エンジニア(または、バックエンドエンジニア)</p> <p>COTOHA APIだと↓<br /> 1. 募集<br /> 2. 強み<br /> ・・・</p> <p>まあ、文章的には何かを募集する文章だから、「募集」が1番強いキーワードだよな、なるほどと思いました。用途が違う使い方のようです。</p> <h4 id="採用したやり方"><a href="#%E6%8E%A1%E7%94%A8%E3%81%97%E3%81%9F%E3%82%84%E3%82%8A%E6%96%B9">採用したやり方</a></h4> <ul> <li>スクレイピングしたテキストデータをmecab(neologd辞書利用)で形態素解析</li> <li>形態素解析した結果の語をもとに2gramで語抽出</li> <li>人力で用意した辞書(キーワードと付与するタグの一覧)のキーワードに、上記で抽出した語が完全一致でヒットした場合に、タグ付与</li> </ul> <p>泥臭いやり方になってしまってますが、こんな感じで頑張ってみました。辞書は日々メンテナンスしています。</p> <p>今思うと...、neologdは単語には強い一方で細かく分割されない特徴があります。今回は分割した語に対して、さらに2gramでくっつける処理を入れているので、形態素の段階では細かく分割された方がいいような気がしました。neologdやめたほうがいいかもな。</p> <h3 id="全文検索 ⇒ Elastic Search(Elastic Cloud)"><a href="#%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2+%E2%87%92+Elastic+Search%EF%BC%88Elastic+Cloud%EF%BC%89">全文検索 ⇒ Elastic Search(Elastic Cloud)</a></h3> <p>私はケチなので、サービスの運用は無料にこだわっているのですが、ElasticCloudを採用しました。ElasticCloudに無料枠はありません。最低16ドル/月で利用できて、<a target="_blank" rel="nofollow noopener" href="https://xn--vckya7no28j49x.jp/">副業サーチ</a>の構成だと19ドル/月です。と言いますか、ElasticCloudはインスタンスを立てるリージョンを選択する必要があり、東京リージョンの最安構成が19ドル/月です。</p> <h3 id="Elastic Cloudを採用するまで"><a href="#Elastic+Cloud%E3%82%92%E6%8E%A1%E7%94%A8%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7">Elastic Cloudを採用するまで</a></h3> <p>ケチなので、サービスのアイディアが浮かんだときからElasticCloud使ったろと考えたわけではありません。</p> <h4 id="firestoreで実現できないか試した"><a href="#firestore%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%8B%E8%A9%A6%E3%81%97%E3%81%9F">firestoreで実現できないか試した</a></h4> <p>まずは、いつも使っているfirestoreでできないか考え、データを突っ込んで検索処理を動かして画面で確認するところまで実装してました。<br /> Firestoreで全文検索を実装する方法は、<a target="_blank" rel="nofollow noopener" href="https://qiita.com/oukayuka/items/d3cee72501a55e8be44a">こちらのQiita記事</a>の方法を使ってます、</p> <div class="table-responsive"><table> <thead> <tr> <th>実現したいこと</th> <th>実現可否</th> <th>備考</th> </tr> </thead> <tbody> <tr> <td>全文検索</td> <td>○</td> <td>Qiitaの方法で実現可能</td> </tr> <tr> <td>全文検索 + タグ絞り込み(and)</td> <td>○</td> <td>Qiitaの方法で実現可能</td> </tr> <tr> <td>全文検索 + タグ絞り込み(or)</td> <td>×</td> <td>無理(or検索の仕組みがない)</td> </tr> <tr> <td>全文検索 + ソート</td> <td>×</td> <td>無理(全組み合わせの複合インデックスが必要)</td> </tr> <tr> <td>全文検索 + 関連タグ取得</td> <td>×</td> <td>悩んだがいい案思いつかない</td> </tr> </tbody> </table></div> <h4 id="実現したいことは以下"><a href="#%E5%AE%9F%E7%8F%BE%E3%81%97%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8%E3%81%AF%E4%BB%A5%E4%B8%8B">実現したいことは以下</a></h4> <ul> <li><p>全文検索 + ソート</p> <ul> <li>検索結果を新しい順(案件の公開日順)で表示したい</li> </ul></li> <li><p>全文検索 + 関連タグ取得</p> <ul> <li>検索ヒットしているデータについているタグを取得したい</li> <li>できれば、タグに紐づくデータの多い順で取得したい</li> </ul></li> </ul> <p>実際にやりたいことを検証してみて、できないこと多かったので、厳しいなぁと感じました。</p> <h4 id="代替のサービスを探す"><a href="#%E4%BB%A3%E6%9B%BF%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%8E%A2%E3%81%99">代替のサービスを探す</a></h4> <p>私は技術力が高くないので、自分でサーバを立てて、全文検索エンジンをインストールしてみたいなのは無理だと考え、最初から除外しました。サーバーレスでやれるサービスがないか検討しました。</p> <p>そうなると、候補は以下2つしかない?のかなと<br /> * Elastic Cloud<br /> * Algolia</p> <p>Algoliaは別サービスでも使った実績があったのですが、今回はElasticCloudにしました。理由は「料金が安い」と思ったからです。Algoliaは無料枠はあるのですが、無料枠使いきると従量課金で、レートがかなり高い..私のサービスでAlgolia使ってるものもありますが、検索がメインのサービスではなく補助機能で使っている程度なので、無料枠に収まってました。</p> <p>しかし、今回のサービスは検索が命のサービス。無料枠に収まらなくなったら地獄だと考え、月19ドルを払う決心(と妻への説明)をしてElasticCloudを採用しました。ElasticCloudは14日間の無料体験ができるので、それを利用して、実現したいことが実際にできるか動かして試し、全部できるじゃん!と確認できたので採用となったわけです。</p> <h3 id="フロント(検索UI・記事) ⇒ Gridsome"><a href="#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%EF%BC%88%E6%A4%9C%E7%B4%A2UI%E3%83%BB%E8%A8%98%E4%BA%8B%EF%BC%89+%E2%87%92+Gridsome">フロント(検索UI・記事) ⇒ Gridsome</a></h3> <p>あまり使ってる人を聞かないのですが、Vue.js製の静的サイトジェネレータ「Gridsome」を使ってみました。React製静的サイトジェネレータで人気のGatsbyのVue.js版のようなフレームワークです。</p> <p>Gridsomeを見つけたきっかけは、運営者ギルドの方がGatsbyを紹介してくれてたことでした。Gatsbyによって静的サイトジェネレータの存在を知り、これは便利そうだなと調べてたところ、自分が普段使っているVue.js製のGridsomeを見つけたという流れです。</p> <h4 id="採用した理由"><a href="#%E6%8E%A1%E7%94%A8%E3%81%97%E3%81%9F%E7%90%86%E7%94%B1">採用した理由</a></h4> <p>今までいくつかサービスをリリースしてきましたが、どれもVue.js製でSSRなしで構築していました。Nuxt.jsも使った経験なし!</p> <p>サービスを運用して毎回課題に感じるのが、SEOで弱いことです。</p> <p>もちろんGoogleのクローラーはJavascriptの実行結果を評価しているというのを知っていますし、信じているのですが、事実としてSEO弱いと感じてます。(フレームワークの問題ではなく、私のサイトのコンテンツの問題な気もしますが)</p> <p>この不安を今回は無くしたいと考え、静的サイトジェネレータ「Gridsome」に手を出しました。</p> <h4 id="といっても、検索部分は静的サイトじゃない。トップページと記事系のみ!"><a href="#%E3%81%A8%E3%81%84%E3%81%A3%E3%81%A6%E3%82%82%E3%80%81%E6%A4%9C%E7%B4%A2%E9%83%A8%E5%88%86%E3%81%AF%E9%9D%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%88%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%80%82%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%A8%E8%A8%98%E4%BA%8B%E7%B3%BB%E3%81%AE%E3%81%BF%EF%BC%81">といっても、検索部分は静的サイトじゃない。トップページと記事系のみ!</a></h4> <p>検索ページ以外が静的サイトになりました。<br /> 中途半端です。<br /> しかし、記事系だけは完全に静的サイトになったので、ページの表示も速く満足しています。<br /> トップページも静的サイトになっています。<br /> SEOを意識した記事を追加していけば、なんとかなるはずだ。(記事が書ければ...)</p> <p>記事系のページの表示は爆速になったので、ぜひ表示してみてくださいね!</p> <p>でも、横断検索サービスのSEOって検索ページで狙うべきじゃね?って思うようになってきて、微妙な対応だったかなと思ったりしています。</p> <h4 id="記事のCMSはContentful"><a href="#%E8%A8%98%E4%BA%8B%E3%81%AECMS%E3%81%AFContentful">記事のCMSはContentful</a></h4> <p>ヘッダレスCMSのContentfulを使ってマークダウンで書いてます。個人開発なら無料枠で大丈夫そうです。無料枠だと1アカウントしか作れないので、チームで運営する場合は問題になりそうです。<br /> Contentfulの記事をGridsomeに連携する構築については、<a target="_blank" rel="nofollow noopener" href="https://qiita.com/tk07Sky/items/1e42656b50349efb0378">Qiitaのこちらの記事</a>を参考にしました。</p> <h4 id="Gridsomeにしてどうだったか?"><a href="#Gridsome%E3%81%AB%E3%81%97%E3%81%A6%E3%81%A9%E3%81%86%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%8B%EF%BC%9F">Gridsomeにしてどうだったか?</a></h4> <p>SEO効果は分かりませんが、ページの表示は速いので満足しています。</p> <p>ただ、ビルドすると思った通りに動かないことがありました(ビルド前は問題ないのに!)。ビルドした後のテストがけっこう重要で、うまく動作しないパターンに慣れるまではそこが面倒かもなと思っています。</p> <h2 id="さいごに"><a href="#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB">さいごに</a></h2> <p>色々と調べつつ利用する技術を選定して構築しました。今回は新しい技術けっこう使った気がするなぁ。<br /> ElasticCloudとGridsomeはかなりいい選択だったのではないかと思ってます。運用してみて見えてくる点もあると思いますので、なにかあれば記事にしたいと思います。</p> <p>それでは<a target="_blank" rel="nofollow noopener" href="https://xn--vckya7no28j49x.jp/">副業サーチ</a>をよろしくお願いします!</p> かつお tag:crieit.net,2005:PublicArticle/15496 2019-10-21T09:22:17+09:00 2019-10-21T09:22:17+09:00 https://crieit.net/posts/4b0c9a1ddc05a0cc0ff61db75530b9b0 ドラフト風画像作成サービス「ドラフトなう!」を作りました <p><a href="https://crieit.now.sh/upload_images/c92cd6ef54296b6dfb31726f0b708d715dacf6b4b06a6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c92cd6ef54296b6dfb31726f0b708d715dacf6b4b06a6.png?mw=700" alt="EHAEyHXU0AA3c5Q.png" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://draft-now.netlify.com/">ドラフト風画像作成サービス「ドラフトなう!」</a></p> <h1 id="「ドラフトなう」とは"><a href="#%E3%80%8C%E3%83%89%E3%83%A9%E3%83%95%E3%83%88%E3%81%AA%E3%81%86%E3%80%8D%E3%81%A8%E3%81%AF">「ドラフトなう」とは</a></h1> <p><strong>ド ラ フ ト 会 議 が 終 わ っ て し ま い ま し た が、</strong><br /> フォームに必要な項目を埋めるとドラフト会議風の画面が作れます。<br /> 本家リポビタンDのサイトは12球団からしか選べないのでオリジナル球団から選べるといいなと思って作りました。</p> <p>今回はキャンバスを使って画像化までは時間がなくて実装できなかったので、<br /> 現状スクリーンショットを撮って楽しんでいただければ幸いです。</p> <h1 id="製作に関して"><a href="#%E8%A3%BD%E4%BD%9C%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6">製作に関して</a></h1> <h2 id="使った技術"><a href="#%E4%BD%BF%E3%81%A3%E3%81%9F%E6%8A%80%E8%A1%93">使った技術</a></h2> <ul> <li>ReactJS</li> <li>CreateReactApp</li> </ul> <h2 id="製作期間"><a href="#%E8%A3%BD%E4%BD%9C%E6%9C%9F%E9%96%93">製作期間</a></h2> <ul> <li>2019/10/16(ドラフト会議前日) <ul> <li>仮リリース</li> </ul></li> <li>2019/10/17(ドラフト会議終了後) <ul> <li>レスポンシブ対応</li> </ul></li> </ul> <h2 id="苦労した点"><a href="#%E8%8B%A6%E5%8A%B4%E3%81%97%E3%81%9F%E7%82%B9">苦労した点</a></h2> <ul> <li>仮リリースの段階では背景に作った画像を使っていたが、レスポンシブで意図した通りに拡大縮小できなかったため、スタイルで全て書き直した。</li> <li>レスポンシブの実装をメディアクエリを使って行なったが、境界部分でUI崩れがなかなか解消できずに苦労した。</li> <li>ブランドロゴはなかなかうまくできたと思ったが、これもレスポンシブ対応が厳しく、最終的に画像化した。</li> </ul> <h1 id="教訓"><a href="#%E6%95%99%E8%A8%93">教訓</a></h1> <p>季節系のイベントサービスを作る時は事前にきちんと計画を立てましょう。<br /> <strong>前日の朝にこれ作りたいなと思って案の定間に合いませんでした。</strong></p> <p>レスポンシブ対応がドラフト会議終了後の実装になってしまったため、<br /> モバイルユーザがUI崩れでサイトを離れてしまった可能性がありました。</p> <h2 id="今回間に合わなかった機能"><a href="#%E4%BB%8A%E5%9B%9E%E9%96%93%E3%81%AB%E5%90%88%E3%82%8F%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E6%A9%9F%E8%83%BD">今回間に合わなかった機能</a></h2> <ul> <li>OGP芸 <ul> <li>バックエンドサーバを用意していないので、技術的に難しいかも。</li> </ul></li> <li>画像化(Canvas描画)</li> <li>SNSシェア機能</li> </ul> ckoshien tag:crieit.net,2005:PublicArticle/15189 2019-07-02T14:44:18+09:00 2019-07-02T14:45:08+09:00 https://crieit.net/posts/10 サービス10個作ったら、1個くらい一瞬バズると思って開発してる。 <p>最近Twitterをちょこちょこ利用するようになって、僕が想像していた以上に多くの人が自分のサービスを作っていることを知りました。</p> <p>勉強がてら作った小さいサービスから、ハイクオリティで大きなサービスまで、<strong>本当に多種多様なサービスが公開されていました。</strong>ただ、自分が作ったサービスでお金を稼ごうと考えている人はそんなに多くないと感じました。<br />  </p> <p>自分でプログラムが書ける人の最大のメリットは、<strong>0円で自分のサービスを作ることができるということだと僕は思っています。</strong>だから独学で僕はプログラミングを勉強したし、インターネット上にこれだけ多くのサービスが溢れているんだと思います。<br />  </p> <p>僕は2年ほど前にHTMLすら知らない状態で漫画投稿サイトを運営してみたいと思い、web系の受託会社に見積もりを出したことがありますが、その時はざっくりと<strong>500万円</strong>くらいとの回答が返ってきました。また、搭載する機能は制限されますが、既存のオウンドメディア構築ツールをカスタマイズして簡単な漫画サイトを作ったとしても<strong>130万円</strong>ほどかかると言われました。</p> <p>130万円であれば何とか払えない額ではありませんでしたが、<strong>HTMLも知らなかったため</strong>、運営している中で小さなデザインの変更でも業者に頼むことになることを考えると、<strong>プログラマーを雇うお金がない自分には無理と考え諦めました。</strong><br />  </p> <p>そこから、雇うことはできないけれど、無給で僕が作りたい漫画のサービスに共感し、手伝ってくれるプログラマーはいないものかと、様々なイベントに参加して探してみました。でも<strong>無給で一緒に手伝ってくれる人はいませんでした。</strong>みんなその場では「<strong>良いね!</strong>」と言ってはくれましたが、<strong>実際手伝ってくれるかというとみんな言葉を濁して去って行きました。</strong></p> <p>それでも自分の考えているサービスを作りたかったので悩んだ結果、「<strong>お金はないし作ってくれる仲間もいない、さてどうするか....」→「自分で作るしかない!」</strong>となり、自分でプログラミングの勉強を始め、サービスを作り始めました。</p> <p> </p> <p><strong>ここで自分でサービスを作る決断をしたことは今考えて本当によかったと思っています。</strong> プログラミングを覚えて自分でサービスを作ることができれば、<strong>必要なのは自分の時間だけです</strong>(Time is moneyではありますが...)。ほぼ0円で自分の考えたサービスを形にできるため、<strong>何回でも失敗することができます。</strong></p> <p> </p> <p>サービスが当たる確率なんてものすごい<strong>低い</strong>です。自分が考えた1つめのサービスで当てるなんて神業だと思います。<strong>でも10個サービスを作ったら、1つくらい当たるとは思いませんが、一瞬バズったりすることはあるんじゃないかと思っています。</strong></p> <p>もちろん最初から失敗すると思いながら開発をしているわけではありませんが、失敗しても大丈夫なよう、<strong>リスク回避</strong>をすることは大事だと思います。今後もしばらくは広告費は最小限に抑え(ってかお金が単純にない)、コツコツサービスを作って、宣伝して、壊してを繰り返していこうと思っています。<br />  </p> <p>また、今まで一人でサービスを開発してきましたが、<strong>やっぱり誰かと一緒に共同で開発するのもしてみたいです。</strong>個人開発は自分の好きなようにできる反面、モチベーションの維持が難しいですし、複数人での開発の方が新しいアイデアが生まれやすいです。誰か一緒に面白いサービスを作りたいという人がいましたらぜひ連絡ください。</p> <p> </p> <p>それにしても、本当にTwitterをみてるといろんな個人開発のサービスがありますね。ただ、大部分のサービスが勉強の一環としてだったり、就職、転職のポートフォリオのために作ったサービスだったりして、<strong>作って終わりというパターンがとても多い気がします。</strong></p> <p><strong>作るだけ作ってそのまま放置するようになる気持ちはめちゃめちゃわかります。</strong>自分もサービスを作るだけ作って、そこで満足してしまって放置してしまうことばかりやっています。</p> <p><strong>特にto C向け</strong>サービスはユーザーを集めるのが難しいと痛いほど感じています。宣伝にかける予算が豊富にあれば、まだユーザーの獲得はそこまで難しくないですが、予算がない、かつ、影響力もない個人にとってto C向けサービスの宣伝はこの上なく難しいです。</p> <p> <br /> ただ、なんかどうしても<strong>もったいないな</strong>と思ってしまいます。作ったサービスを誰かが使ってくれたらそれだけでみんなめちゃくちゃ嬉しいはずです。でも現実は誰も使ってくれないから絶望して、宣伝をやめて放置することになっていく。<strong>「開発→宣伝→ユーザー集まらず絶望→放置」のループを出来るだけ抑えるように何とかできないものですかね。</strong></p> <p>開発会議のような個人開発を盛り上げるプラットフォームはありますが、まだまだそのようなプラットフォームの数が少ないように感じます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://devtalk.jp/">開発会議</a></p> <p>今後も個人開発で生まれたサービスはどんどん出てくると思うので、それらを積極的に宣伝してくれる場所がたくさん出てくれば嬉しいです。開発会議みたいなサービスがどんどん盛り上がり、個人開発がプログラマー界隈だけでなく、<strong>一般的にもっと認知度が広まれば良いなぁ!</strong></p> <p> </p> Naoki Mizutani tag:crieit.net,2005:PublicArticle/14959 2019-04-30T22:10:22+09:00 2019-05-14T12:04:33+09:00 https://crieit.net/posts/229dd2a4998f6e5d954cde89cd854759 セールサーチというサービスをリリースしました <p><a href="https://crieit.now.sh/upload_images/4407b803fcd53e3cce66c4c15abc19925cc84176b7dcc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4407b803fcd53e3cce66c4c15abc19925cc84176b7dcc.png?mw=700" alt="ogp.png" /></a><br /> 2019年4月30日。今日は平成最後の日です。そんな日に新しいWebサービスをリリースしました。<br /> 「<a target="_blank" rel="nofollow noopener" href="https://sale-search.site/">セールサーチ</a>」というサービスです。</p> <h2 id="セールサーチってどんなサービス?"><a href="#%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%81%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>楽天やAmazonなどのネットショップのセール情報を横断検索できるサービスです。カレンダー形式にも表示することができます。<br /> 「<strong>いつものお買い物をちょっと賢く</strong>」をテーマに、複雑なネットショッピングのセール情報を少しでも分かりやすくユーザーに提供できればなと思い開発しました。</p> <h2 id="実は本業で使えるなと思って作ったという理由もあります"><a href="#%E5%AE%9F%E3%81%AF%E6%9C%AC%E6%A5%AD%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%AA%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%A6%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%84%E3%81%86%E7%90%86%E7%94%B1%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99">実は本業で使えるなと思って作ったという理由もあります</a></h2> <p>わたしはEC関連のWebサービスベンチャーで企画を担当しています。セールサーチは本業でもあったら便利だなと思って作ったという側面もあります。</p> <p>一般ユーザーはお買い物をする前にお得なセールやっているショップを探すという使い方を想定していますが、実は私は真逆の使い方をしたいなと思ってます。私の場合は、自社サイトのトラフィックの動きと他社ECのセール状況というのを関連付けて分析とかするシーンが割とあるので、その際に使いたいなと思ってます。つまり、事後に何があったかをパッと見で分かるというのがやりたいなと。それだけでなく、色々なECサイトがあの手この手で魅力的なセールを企画してきますので、その調査にもなるなと。そんな感じです。ただ、本業で使えるようにするには情報の蓄積が重要なので頑張って開発とか運営とかやっていきたいと思います。</p> <h2 id="今度こそグロースしたい"><a href="#%E4%BB%8A%E5%BA%A6%E3%81%93%E3%81%9D%E3%82%B0%E3%83%AD%E3%83%BC%E3%82%B9%E3%81%97%E3%81%9F%E3%81%84">今度こそグロースしたい</a></h2> <p>1月末くらいに平成年表というサービスをリリースしたのですが、残念ながらグロースさせることができず、平成も本日終わりを迎えてしまいました。やれることはいっぱいあったんだろうなと思うのですが、そこまでリソースを割くことをしなかった。ちょっと後悔です。<br /> 今回のセールサーチはグロースのために最低でも半年間は改善をやっていきたいと思っています。<br /> 平成年表は投稿型のサイトだったので、人気や注目を集める必要がありましたが、今回のセールサーチは検索サイトなのでデータと見せ方がすべてだと思っています。<strong>ユーザーが必要な情報をいかに集めて、ユーザーにどう見せるか</strong>。これを半年間突き詰めていきたいと思っています。そのためには掲載ショップを増やす、掲載情報の鮮度を新しくする、セール情報の分析や独自の評価やランキングを見せるなどやれることは大量にあると思っています。</p> <h2 id="現段階のセールサーチは完成形の1%程度でしかない"><a href="#%E7%8F%BE%E6%AE%B5%E9%9A%8E%E3%81%AE%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%81%E3%81%AF%E5%AE%8C%E6%88%90%E5%BD%A2%E3%81%AE1%25%E7%A8%8B%E5%BA%A6%E3%81%A7%E3%81%97%E3%81%8B%E3%81%AA%E3%81%84">現段階のセールサーチは完成形の1%程度でしかない</a></h2> <p>本気でそう思っています。だから現段階ではサービスの宣伝は普段お世話になっているCrieitと開発会議とTwitterだけにします。<br /> まだ大規模に宣伝するフェーズではない。本当にそう思っています。<br /> そもそも開発着手したのって、4月27日(土)です笑。最近お世話になっている<a target="_blank" rel="nofollow noopener" href="https://shincyokudoudesuka.connpass.com/">3monthsService</a>の集いの中で開発着手しました。GW暇だったのでガッツリ開発時間を確保することができ、リリースに至りました。今回もfirebase+Vue.jsなので前のソースの流用ができるってのも大きかった。</p> <h2 id="それでもリリースしたのはなぜか?"><a href="#%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%9F%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%8B%EF%BC%9F">それでもリリースしたのはなぜか?</a></h2> <ul> <li>ドメインの力をつけたい(Google検索のため)</li> <li>自分のケツを叩きたい<br /> 理由としてはこれくらいです。現段階ではそこまで使われる状態にはないと思っています。このサービスは口コミというよりは検索で上位をとれないとグロースは難しいサービスだと思っています。コミュニティ形成ではなく、いかに多くの人の目に触れるかが重要なサービス。だから早めにリリースしてちょっとでもGoogleの評価を上げていくことが重要なはず。そう思ってリリースを急ぎました。</li> </ul> <h2 id="さいごに"><a href="#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB">さいごに</a></h2> <p>今度こそ頑張ります!</p> かつお 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 tag:crieit.net,2005:PublicArticle/14648 2018-12-11T17:57:33+09:00 2019-02-22T21:04:03+09:00 https://crieit.net/posts/Android-iOS-100 Android, iOSアプリを100本くらいリリースしたのでいろいろ振り返ってみる <p>こちらはCrieitの<a href="https://crieit.net/advent-calendars/2018/technology">個人開発サービスに用いられている技術 Advent Calendar 2018</a>の12日目の記事です。<br /> 前日は<a href="https://crieit.net/users/rubys8arks">かしい@お笑いSNS作成中</a>さんの<a href="https://crieit.net/posts/SNS-Tumblr">ブログSNS『Tumblr』を無理やりユーザー投稿型メディアとして運営した話</a>についてでした!</p> <h2 id="あんた誰?"><a href="#%E3%81%82%E3%82%93%E3%81%9F%E8%AA%B0%EF%BC%9F">あんた誰?</a></h2> <p>どうもこんにちは<a target="_blank" rel="nofollow noopener" href="https://twitter.com/tecco_master">Tecco</a>です。<br /> 主に <strong>Android, iOSアプリ</strong> を作っています。</p> <p>会社でもいっぱい作ったんですが、元々は個人開発でアプリを作っていました。<br /> リリースした本数が100本(※)を超えたので、数えるのをやめました\(^o^)/</p> <p>Android -> <a target="_blank" rel="nofollow noopener" href="https://play.google.com/store/apps/developer?id=Tecco%27s+Project">https://play.google.com/store/apps/developer?id=Tecco's+Project</a><br /> iOS -> <a target="_blank" rel="nofollow noopener" href="https://itunes.apple.com/jp/developer/makoto-nishimoto/id896702438">https://itunes.apple.com/jp/developer/makoto-nishimoto/id896702438</a></p> <p>せっかくの機会なので <strong>どのような技術を今まで使ってきたか</strong> を振り返ってみます。</p> <p>※公開を停止したもの含めます。</p> <h2 id="使ってきた技術一覧"><a href="#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%E6%8A%80%E8%A1%93%E4%B8%80%E8%A6%A7">使ってきた技術一覧</a></h2> <p>集計してみます。 ※Android, iOS同名アプリは別アプリとして集計</p> <p>フロントエンド</p> <div class="table-responsive"><table> <thead> <tr> <th>技術</th> <th>本数</th> </tr> </thead> <tbody> <tr> <td>ネイティブ</td> <td>約100本</td> </tr> <tr> <td>Cordova</td> <td>1本</td> </tr> <tr> <td>Cocos2dx</td> <td>1本</td> </tr> <tr> <td>Unity</td> <td>2本</td> </tr> </tbody> </table></div> <p>バックエンド</p> <div class="table-responsive"><table> <thead> <tr> <th>技術</th> <th>本数</th> </tr> </thead> <tbody> <tr> <td>なし</td> <td>約90本</td> </tr> <tr> <td>自前API</td> <td>2本</td> </tr> <tr> <td>他社API</td> <td>8本</td> </tr> <tr> <td>Firebase</td> <td>7本</td> </tr> </tbody> </table></div> <p>かなりテキトーな仕分けですがこんな感じです。<br /> 数だけあっていろんな分布を期待した方ごめんなさい。</p> <p>見てもらったらわかるように基本的には <strong>ネイティブ × なし</strong> が圧倒的な数を占めます。</p> <h2 id="技術の選定"><a href="#%E6%8A%80%E8%A1%93%E3%81%AE%E9%81%B8%E5%AE%9A">技術の選定</a></h2> <p>基本的に個人開発で心がけていることは <strong>以下の5つ</strong> です。</p> <ol> <li>シンプルイズザベスト</li> <li>3日以内を制限時間とする</li> <li>運用に負担がかかるものはやらない</li> <li>アプリ一本にこだわりすぎない</li> <li>デフォルトを愛する</li> </ol> <p>詳しくは人生でたった一本だけ書いた僕のQiitaに書いてあるので興味があればどうぞ。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/Tecco/items/518094205784c7e855ee">個人で30本スマホアプリをリリースしたときのコツ5つを紹介してみるよ</a></p> <p>やっぱり開発者として、 <strong>メルカリみたいな、SHOWROOMみたいな、LINEみたいな、アプリが作りたい!!</strong> っていうのはわかるんですが、自分は一人なのを最前提で考えなければいけません。</p> <p>もし、自分一人でLINEの機能を全部実装して完成した10年後には<br /> <strong>「スマホアプリとか化石かよ!ポケベルのがまだ風情があるわ!」</strong> とか言われる日がくるかもしれません←ぇ</p> <h2 id="個人開発スタイル(アイディア編)"><a href="#%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%28%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A3%E3%82%A2%E7%B7%A8%29">個人開発スタイル(アイディア編)</a></h2> <p>普段から生活してる際に、何か不満をおもったら、 <strong>アプリで解決できないか?</strong> って考えるのがクセになってます。</p> <p>例)<br /> <strong>事象</strong>: 北海道出身のTeccoさんは駅の土地勘が全く無く、電車が停止しましたが、混雑していて電光掲示板が見えません。さらにヘビーロックを爆音で聞いているのでアナウンスも聞こえません。降りれば良いのか数秒で判断できなくて人生つらい。</p> <p><strong>要求</strong>: 一秒でも早く自分が今いる駅を知りたい。</p> <p><strong>結論</strong>: アプリでワンタップで現在地から一番近い駅を取得したい。</p> <p>その時1時間くらいで作ったアプリがこちらです。(公開は停止中<br /> <a href="https://crieit.now.sh/upload_images/04f15e71d74c3f4090bdd7d954b2f3aa5c0f74691a117.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/04f15e71d74c3f4090bdd7d954b2f3aa5c0f74691a117.png?mw=700" alt="unnamed3.png" /></a></p> <p>こんな感じで普段の生活からアイディアを抽出することは可能です。</p> <h2 id="個人開発スタイル(実装編)"><a href="#%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%28%E5%AE%9F%E8%A3%85%E7%B7%A8%29">個人開発スタイル(実装編)</a></h2> <p>アプリとしては現在地をGoogle Places APIにぶん投げて、リストの一番目を取得してるだけです。<br /> まぁ、お察しの通りクソアプリなので<strong>DLは200いかないくらい</strong>です。</p> <p>たとえばこのアプリもリッチに考えればいろいろできて</p> <ul> <li>複数の駅表示に対応</li> <li>道案内機能を実装</li> <li>駅までの方向を実装</li> </ul> <p>いっぱい考えられると思うのですが、そんなの「Google Mapに任せとけよ」って話なので、個人開発でもう一つ気をつけなければならないのは、 <strong>リッチにすると先駆者がそれ以上のものを作っている可能性が高い</strong> という点です。</p> <p>これは普通のプロダクト開発でも言えることですが、機能が増えるほど <strong>メイン機能を阻害する機能が増えて、ユーザーが何をすれば良いのかわからなくなるという現象</strong> が起きがちです。</p> <p>これは心がけていても、自分でもよくやってしまう失敗なのでやっかいではあります。</p> <h2 id="個人的におもう個人開発のメリット"><a href="#%E5%80%8B%E4%BA%BA%E7%9A%84%E3%81%AB%E3%81%8A%E3%82%82%E3%81%86%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">個人的におもう個人開発のメリット</a></h2> <p>僕が個人開発でできるメリットは <strong>単機能でリリースできること</strong> だと思っています。<br /> どうしても会社規模の売上やユーザー規模を獲得するには、アプリに滞在させたり、巡回させる方法を考えなければなりません。(初期の<a target="_blank" rel="nofollow noopener" href="https://play.google.com/store/apps/details?id=com.justyo">Yo</a>みたいな例外はあると思いますが</p> <p>僕は自分のアプリを紹介するときに、 <strong>○○するだけのアプリです</strong> 、って紹介を良くします。</p> <p>たとえばこちらが、Amazonのディスカウント率で検索する<strong>だけ</strong>のアプリです。<br /> <a target="_blank" rel="nofollow noopener" href="https://tecc0.com/amazondiscount_lp.html">Amazon割引ショッピングアプリ</a></p> <p>こちらも初回リリースは3日で行っていますが、<strong>合計50万DL</strong>ほどされています。</p> <p>これは本家Amazonにももちろんある機能ですが、本家は機能が多い分埋もれてしまっています。<br /> なので <strong>大手のサブ機能をメイン機能に持ってくるだけ</strong> で、これくらいの需要があるってこともあります。<br /> (ちなみにこちらのアプリはAmazonさんからも了承いただいております</p> <p>そろそろ書くのが疲れてきたので orz 質問ベースでの回答をいくつかしておきます。</p> <h2 id="よく聞かれる質問"><a href="#%E3%82%88%E3%81%8F%E8%81%9E%E3%81%8B%E3%82%8C%E3%82%8B%E8%B3%AA%E5%95%8F">よく聞かれる質問</a></h2> <p>Q. そんなに出してて管理めんどくさくないの?<br /> A. 他社のAPIのバージョンアップがたまーにと、Androidのバージョンアップで動かなくなったものの対応以外はメンテなしでいけるようにしてるので、<strong>半年に一回くらい1,2日メンテくらい</strong>で済んでます。</p> <p>Q. 両OS出すの面倒くさくない?<br /> A. どっちもある程度わかってくると<strong>頭の中で仕様はコンバートできる</strong>ので、片方のOS作ってしまえばもう片方がほぼ何も考えなくてもできます。</p> <p>Q. クロスプラットフォーム系のやつどう思う?<br /> A. ネイティブでどちらも書いているので、個人的にはあまりメリットは感じられないし、学習コストが高い・本家OSバージョンについていけてない気がする。しかし、<strong>ゲームを作るならUnityの恩恵はでかすぎる</strong>のでUnityで良いと思う。(あくまで個人のスキルセットに依存するので違うケースも多々あると思います</p> <p>Q. 正直個人開発って儲かるの?<br /> A. アプリの量と質は間違いなく上がっているし、大企業が本気だしてきてるのでアプリを認知させるのが難しくなっているので<strong>ユーザー数の獲得</strong>は難しい。しかし、<strong>ユーザー1人あたりの広告単価や課金量</strong>は上がっているので認知されればお小遣いくらいなら割と可能。</p> <p>Q. コストはどれくらいかかるの?<br /> A. ライセンス費はAndroidは25ドルで永久、iOSは年に100ドルくらい。アプリ自体に使ってるサーバもすべて無料枠なのでタダ。ただし、宣伝用のWebページなどのサーバは持ってるので月1000円くらい。月換算で2000~3000円くらいなので、<strong>月1回の飲み会を断れば余裕で賄えるかな</strong>、と。</p> <p>Q. AndroidとiOSどちらから始めればいいの?<br /> A. コスト面では年に100ドル払いたくないならAndroid一択。市場面では海外(特にヨーロッパ)狙いたいならAndroid, 日本のJKとかビジョンが日本マーケット狙いたいならiOS。<strong>KotlinもSwiftもとっても書きやすい</strong>ので、その点ではどちらもおすすめ。個人的にはKotlinが超大好きだし、最終的には好み。</p> <h2 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h2> <p>久しぶりにブログを書きました(゚Д゚)<br /> こんな機会を与えてくれたアドベントカレンダーと開発者の<a href="https://crieit.net/users/dala00">だら</a>さんには感謝(`・ω・´)/</p> <p>良かったらTwitterでもフォローしてください -> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/tecco_master">@tecco_master</a><br /> 直近リリースしたアプリはこちら -> <a target="_blank" rel="nofollow noopener" href="https://mimicha.me">匿名チャットアプリ mimicha</a></p> <p>さて、明日は<a href="https://crieit.net/users/nabettu">nabettu</a>さんです!<br /> 実はいろいろインターネット上でお世話になっていいるので期待(゚Д゚)</p> Tecco XIII tag:crieit.net,2005:PublicArticle/14619 2018-12-02T08:57:46+09:00 2018-12-03T08:12:55+09:00 https://crieit.net/posts/Nyaaan Nyaaanを支える技術 <p>こちらは<a href="https://crieit.net">Crieit</a>の<a href="https://crieit.net/advent-calendars/2018/technology">個人開発サービスに用いられている技術 Advent Calendar 2018</a>の2日目の記事です。<br /> 前日は<a target="_blank" rel="nofollow noopener" href="https://twitter.com/nabettu">なべ</a>さんの<a href="https://crieit.net/posts/9a531cc77a86bfec6a0ad932dac69b56">日本語のフリーフォントを一度に試せる「ためしがき」に用いられている技術について</a>でした!</p> <hr /> <p>11/5に<a target="_blank" rel="nofollow noopener" href="https://nyaaan.haramishio.xyz/">Nyaaan</a>というWebサービスをリリースしました。</p> <p>そこで</p> <ul> <li>どのような技術を使ってるのか</li> <li>どういう知見が得られたのか</li> </ul> <p>を書いていこうと思います!</p> <p>どういうサービスかは以下の記事を読んでいただけたらと思います!</p> <p><a target="_blank" rel="nofollow noopener" href="https://blog.haramishio.xyz/entry/service-nyaaan">https://blog.haramishio.xyz/entry/service-nyaaan</a></p> <h2 id="使用している技術"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93">使用している技術</a></h2> <p>ざっくりな構成でいうと</p> <ul> <li>フロントエンド <ul> <li>Nuxt.js</li> </ul></li> <li>Webホスティング <ul> <li>Netlify</li> </ul></li> <li>バックエンド <ul> <li>Firebase</li> </ul></li> </ul> <p>です。</p> <h3 id="Nuxt.js"><a href="#Nuxt.js">Nuxt.js</a></h3> <p>Nuxt.jsはVue.jsアプリケーションを作るためのフレームワークです。<br /> ちょっと大きめのVue.jsアプリを作る際に必要なVuexやVue Routerなどが入ってるのでNuxtをインストールすればすぐにWebアプリが作れます。<br /> 今回はSSR(サーバーサイドレンダリング)を行わないため、<strong>SPAモード</strong>で利用しています。</p> <h3 id="Netlify"><a href="#Netlify">Netlify</a></h3> <p>Webホスティングはさまざまな種類がありますが、今回はNetlifyを選択しました。<br /> 選択した理由としては・・・</p> <ul> <li>ビルドを勝手にやってくれる(<code>npm run build</code> がビルドコマンドよ!ってNetlifyに登録しとくだけでいい)</li> <li>ビルドしたらデプロイもやってくれる</li> <li>他のホスティングサービスと比較して無料枠の制限が少ない</li> </ul> <h3 id="Firebase"><a href="#Firebase">Firebase</a></h3> <p>APIやDBが必要になったのですが、すべてFirebaseで行いました。<br /> 主要なFirebaseサービスはHostingとML Kit以外使いました。</p> <p>それぞれの用途としては・・・</p> <ul> <li>Authentication <ul> <li>Twitter認証のため利用</li> </ul></li> <li>Firestore <ul> <li>ユーザ投稿データやユーザデータを保存</li> </ul></li> <li>Functions <ul> <li>Twitter APIに問い合わせる処理やユーザ削除機能で利用</li> </ul></li> <li>Storage <ul> <li>ユーザのアイコンの保存で利用</li> </ul></li> </ul> <h2 id="得られた知見"><a href="#%E5%BE%97%E3%82%89%E3%82%8C%E3%81%9F%E7%9F%A5%E8%A6%8B">得られた知見</a></h2> <h3 id="Firestoreのクエリーのクセ"><a href="#Firestore%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%BC%E3%81%AE%E3%82%AF%E3%82%BB">Firestoreのクエリーのクセ</a></h3> <p>FirestoreはNoSQLです。RDBのような柔軟なクエリーを書くことは出来ません。<br /> その制限にひっかかってちょっと苦しんだ事例があるので共有します。</p> <p>Nyaaanでは「有効期限」という機能があり<br /> これを設定すると1時間または1日経つと、鳴き声(つぶやきみたいなもの)が見れなくなるというものです。</p> <p>その鳴き声テーブルはこんな感じになってます(本当はもっとカラムあります)</p> <div class="table-responsive"><table> <thead> <tr> <th>カラム</th> <th>型</th> </tr> </thead> <tbody> <tr> <td>ID</td> <td>string</td> </tr> <tr> <td>鳴き声</td> <td>string</td> </tr> <tr> <td>本音</td> <td>string</td> </tr> <tr> <td>有効期限</td> <td>timestamp</td> </tr> <tr> <td>作成時間</td> <td>timestamp</td> </tr> </tbody> </table></div> <p>Nyaaanにはタイムラインがあり、鳴き声は作成時間の降順でソートしたいです。<br /> なので・・・</p> <pre><code class="javascript">// カラム名はわかりやすく日本語にしてます mewRef.where("有効期限", ">", now).orderBy("作成時間", "desc").limit(10).get() </code></pre> <p>としたかったのですがこれはNG。<br /> 範囲フィルタ(>や>=)を使う場合は、orderByの最初の要素はその範囲フィルタで使用したカラムしか指定できません。<br /> <a target="_blank" rel="nofollow noopener" href="https://firebase.google.com/docs/firestore/query-data/order-limit-data?hl=ja">Cloud Firestore でのデータの並べ替えと制限</a></p> <p>RDBならこういうのは普通にできますが、NoSQLはこういう制限があるのかと勉強になりました。</p> <p>結局どうしたかというと、後述するバッチ的なもので有効期限をチェックして削除してます。</p> <h3 id="FirebaseでCron的なことをしたいとき"><a href="#Firebase%E3%81%A7Cron%E7%9A%84%E3%81%AA%E3%81%93%E3%81%A8%E3%82%92%E3%81%97%E3%81%9F%E3%81%84%E3%81%A8%E3%81%8D">FirebaseでCron的なことをしたいとき</a></h3> <p>上述したバッチ的なものの話です。</p> <p>サービスを作っていくとバッチが必要になる場面があるとおもいます。<br /> なにかしらの処理を定期的に動かすとなるとCronを使ったりJenkinsを使ったり色々あると思います。<br /> これらはサーバーが必要になりますよね。<br /> すでに持ってる人はそれを使えば良いんですが、僕はお金をかけたくないのでどうにかしてサーバーレスにしたいです。</p> <p>さて、FirebaseのFunctionsはHTTPSフックで起動することが出来ます。<br /> つまりcronでcurlを定期実行すればバッチみたいなことができるわけです!</p> <p>そして世の中には外形監視のために定期的に指定したURLを叩いてくれるサービスがあります。<br /> <a target="_blank" rel="nofollow noopener" href="https://cron-job.org/en/">cron-job.org</a>や<a target="_blank" rel="nofollow noopener" href="https://uptimerobot.com/">Uptime Robot</a>がそれです。</p> <p>これを利用してFunctionsを定期的にトリガーするようにしてバッチ処理をサーバーレスで実現しました。</p> <p>懸念点として、Functionsの実行を外部からできるようにしてしまっているのでセキュリティ的に問題ないのか?という点ですが<br /> 今回の場合はリクエスト時にGETパラメーターでアクセストークンを渡しており、そのアクセストークンじゃないとアクセス拒否するようにコーディングしています。<br /> それでも攻撃されて突破されるリスクもなくはないので、センシティブなことをしたい場合はやめたほうがいいと思います。</p> <h3 id="Functionsの様々なトリガー"><a href="#Functions%E3%81%AE%E6%A7%98%E3%80%85%E3%81%AA%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC">Functionsの様々なトリガー</a></h3> <p>Fucntionsのトリガーは色々あります。</p> <div class="table-responsive"><table> <thead> <tr> <th>トリガー</th> <th>内容</th> </tr> </thead> <tbody> <tr> <td>HTTPS</td> <td>URLを叩くだけ</td> </tr> <tr> <td>onCall</td> <td>クライアントから直接呼び出し</td> </tr> <tr> <td>Authentication</td> <td>ユーザの登録/削除で呼び出し</td> </tr> <tr> <td>Firestore</td> <td>ドキュメントの登録/更新/削除で呼び出し</td> </tr> <tr> <td>Storage</td> <td>オブジェクトの登録/更新/削除で呼び出し</td> </tr> <tr> <td>Pub/Sub</td> <td>Cloud Pub/SubのPublishで呼び出し</td> </tr> </tbody> </table></div> <p>NyaaanではHTTPSとAuthenticationのトリガーを使用してます。<br /> 特にAuthenticationトリガーは便利で、以下のようにFunctionsに書くだけで簡単に書くことが出来ます。</p> <pre><code class="javascript">// ユーザが削除されたら実行されるFunction exports.removeUser = functions.region('asia-northeast1').auth.user().onDelete(function(user, context) { ~~~ }); </code></pre> <p>Nyaaanではユーザ削除されると今までの鳴き声が消えるようになってます。<br /> クライアントでそこまでやると重いので、クライアントではAuthenticationのユーザだけ削除してレスポンスをすぐ返し、<br /> FunctionsのAuthenticationトリガーで非同期で削除処理を走らせてます。</p> <h3 id="Netlifyのリダイレクト設定"><a href="#Netlify%E3%81%AE%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E8%A8%AD%E5%AE%9A">Netlifyのリダイレクト設定</a></h3> <p>Nuxt.jsのSPAモードを使用していて、Netlifyでホスティングしていたのですが<br /> ルートパス以外を直接呼び出すと404エラーになってしまいます。(例: https://nyaaan.haramishio.xyz/top)</p> <p>SPAではルートパス以外でアクセスされたらindex.htmlへリダイレクト処理をする必要があります。</p> <p>Netlifyはリダイレクトの機能があり、デプロイするディレクトリのトップに <code>_redirects</code> を配置しそこにリダイレクト設定を記述するとリダイレクトしてくれます。</p> <pre><code>/* /index.html 200 </code></pre> <p>この話をもうちょいちゃんと説明したのがこちらの記事になります。<br /> <a href="https://crieit.net/posts/Netlify-404">Netlifyを使ってたらルートパス以外が404になった話とその解決方法</a></p> <h2 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h2> <p>ということでNyaaanの使用技術とそこから得た知見を書きました!<br /> この記事でみなさんの開発のヒントになれれば幸いです!</p> <p>さて、明日はこのアドベントカレンダーが開催されている<a href="https://crieit.net">Crieit</a>の運営者の<a target="_blank" rel="nofollow noopener" href="https://twitter.com/dala00">だら</a>さんです!</p> Morix💪😼✨