tag:crieit.net,2005:https://crieit.net/users/shwld/feed shwldの投稿 - Crieit Crieitでユーザーshwldによる最近の投稿 2023-03-22T10:07:36+09:00 https://crieit.net/users/shwld/feed tag:crieit.net,2005:PublicArticle/18412 2023-03-22T10:07:36+09:00 2023-03-22T10:07:36+09:00 https://crieit.net/posts/fdf85d1f9aeb47981c9bf9a43303c3c8 エンジニアのアウトプット力を高めるメモ投稿サービスをリリースしました【個人開発】 <p>この記事は <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/shwld/articles/ca8a7972cd1f0c">Zennに投稿したもの</a>と同じ内容です</p> <p>こんにちは<a target="_blank" rel="nofollow noopener" href="https://www.mof-mof.co.jp/">mofmof</a>でエンジニアをしている<a target="_blank" rel="nofollow noopener" href="https://twitter.com/shwld">shwld</a>です。</p> <p>mofmofではエンジニアの成長にフォーカスして色々施策を思索して試作したりしていたりもします。<br /> 今回は、課題の一つである、「<strong>アウトプットを習慣づけたい</strong>」について、ソリューションとなるサービスを作ってみました。</p> <p>この記事では</p> <ul> <li>なぜサービスを作るに至ったのか</li> <li>どんなサービスなのか</li> </ul> <p>あたりを書いていきます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://revelup.dev/ja">https://revelup.dev/ja</a></p> <h1 id="なぜアウトプットを習慣づけたいのか"><a href="#%E3%81%AA%E3%81%9C%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%82%92%E7%BF%92%E6%85%A3%E3%81%A5%E3%81%91%E3%81%9F%E3%81%84%E3%81%AE%E3%81%8B">なぜアウトプットを習慣づけたいのか</a></h1> <p>アウトプットには様々なメリットがあります。</p> <ul> <li>インプット内容を自分のものにする <ul> <li>技術情報をインプットしただけではいざ仕入れた情報を使おうとした時に使える状態になっていないことがほとんどです。実際に手や頭を動かし、相手に教えられる状態になっていると、学習・定着効果が高まります。</li> </ul></li> <li>プレゼンスを高める <ul> <li>エンジニアの技術力を客観的に評価するにはアウトプットや経歴が重要です。極論ですが、アウトプットしていないと何もしていないと同義になってしまうのです。</li> </ul></li> </ul> <p>と、メリットはわかるのですが、実際自分がたくさんのアウトプットをできているわけではありません。自分が継続的アウトプットを改善した方法を元に今回サービスにしました。</p> <h1 id="解決したい課題"><a href="#%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%84%E8%AA%B2%E9%A1%8C">解決したい課題</a></h1> <p>アウトプットの際に以下のような課題があります。</p> <ul> <li>ひたすら開発してしまい、つまづいたところ、工夫したところを残してない <ul> <li>いざ記事を書こうとしても、記事を書くための調べ直しに多くの時間がかかる</li> </ul></li> <li>記事を公開するのにハードルがある。誤った情報を書いていないか、読めるものになっているか気になってしまう。</li> </ul> <p>ZennのScrap機能はこの課題への良い解決策で、Scrapの思想が好きです。<br /> ただ、今回自分はScrapよりもさらにハードルを下げたサービスが欲しいと思いました。</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%E3%81%8B">どんなサービスなのか</a></h1> <p>REVELUP.devはTwitterのような気軽さで技術アウトプットメモを投稿できるサービスです。<br /> フロー情報を前提としているため、正確性などを気にせず気軽に投稿しながら、本番アウトプットの練習ができる場を目指します。</p> <p>以下のような機能が備わっています。</p> <h2 id="気づいた時に即残せるデスクトップ用アプリケーション"><a href="#%E6%B0%97%E3%81%A5%E3%81%84%E3%81%9F%E6%99%82%E3%81%AB%E5%8D%B3%E6%AE%8B%E3%81%9B%E3%82%8B%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%94%A8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">気づいた時に即残せるデスクトップ用アプリケーション</a></h2> <p>開発の途中、何か工夫したり、つまづいたその瞬間に記録を残します。<br /> 任意のショートカットを登録することで、10秒で投稿できる体験を提供します<br /> <a href="https://crieit.now.sh/upload_images/238daf5d99d86c5f7aba8121fd533a99641a54920b8be.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/238daf5d99d86c5f7aba8121fd533a99641a54920b8be.gif?mw=700" alt="すぐ投稿" /></a></p> <h3 id="階層化可能なタグ付けによるノート整理を採用し、投稿速度と内容の整理を両立します"><a href="#%E9%9A%8E%E5%B1%A4%E5%8C%96%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%BF%E3%82%B0%E4%BB%98%E3%81%91%E3%81%AB%E3%82%88%E3%82%8B%E3%83%8E%E3%83%BC%E3%83%88%E6%95%B4%E7%90%86%E3%82%92%E6%8E%A1%E7%94%A8%E3%81%97%E3%80%81%E6%8A%95%E7%A8%BF%E9%80%9F%E5%BA%A6%E3%81%A8%E5%86%85%E5%AE%B9%E3%81%AE%E6%95%B4%E7%90%86%E3%82%92%E4%B8%A1%E7%AB%8B%E3%81%97%E3%81%BE%E3%81%99">階層化可能なタグ付けによるノート整理を採用し、投稿速度と内容の整理を両立します</a></h3> <p><a href="https://crieit.now.sh/upload_images/198bda9998ea53c0276f1b1902c752d8641a54ac5e3c5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/198bda9998ea53c0276f1b1902c752d8641a54ac5e3c5.png?mw=700" alt="階層化可能なタグ" /></a><br /> 階層化可能なタグ↑</p> <h2 id="心理的安全性を担保しつつ、公開練習できる"><a href="#%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E6%8B%85%E4%BF%9D%E3%81%97%E3%81%A4%E3%81%A4%E3%80%81%E5%85%AC%E9%96%8B%E7%B7%B4%E7%BF%92%E3%81%A7%E3%81%8D%E3%82%8B">心理的安全性を担保しつつ、公開練習できる</a></h2> <p>REVELUP.devへ投稿する内容は、承認した友達だけがみることができます。<br /> Twitterというよりは、技術投稿版facebookといった感じです。<br /> <a href="https://crieit.now.sh/upload_images/0e5b6ae2572719b6daf3806758f28bef641a54c60f023.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0e5b6ae2572719b6daf3806758f28bef641a54c60f023.png?mw=700" alt="友達にだけ見せられる" /></a></p> <p>気づいた時に投稿する性質上、業務中や驚くような時間であることもあると思いますが、友達からは投稿した時間はバレないようになっています。</p> <h2 id="実際にアウトプットする材料とする"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E6%9D%90%E6%96%99%E3%81%A8%E3%81%99%E3%82%8B">実際にアウトプットする材料とする</a></h2> <p>投稿した内容は、GraphQL APIで取得することができます。<br /> 投稿内容を好きに加工、バックアップしたり他のサービスに連携など、ご活用ください。</p> <p>ストックした情報を使って、AIで記事を生成するということができると、アウトプットのハードルが下がりそうだなーとかを考えています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://revelup.dev/ja">https://revelup.dev/ja</a></p> <p>このプロダクトは、株式会社mofmofの「水曜日の個人開発」にサポートされています。<br /> <a target="_blank" rel="nofollow noopener" href="https://indie-dev.mof-mof.co.jp">https://indie-dev.mof-mof.co.jp</a></p> shwld tag:crieit.net,2005:PublicArticle/15596 2019-12-11T07:00:07+09:00 2019-12-15T05:42:51+09:00 https://crieit.net/posts/g4 g4と個人開発と私 <p>@shwldです。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games">g4</a>というポモドーロ・テクニックした結果で自分(のアバター)が成長できるサービスを運営しています。</p> <p><a href="https://crieit.now.sh/upload_images/63dd450409788654f4d18c8b5cdeda425deea70ca55ba.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/63dd450409788654f4d18c8b5cdeda425deea70ca55ba.png?mw=700" alt="g4 ポモドーロストーリーズ" /></a></p> <p>年末ですし、このg4の開発開始から現在までを振り返ってみます。</p> <h2 id="前身となるみんなの成長をリリース"><a href="#%E5%89%8D%E8%BA%AB%E3%81%A8%E3%81%AA%E3%82%8B%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AE%E6%88%90%E9%95%B7%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9">前身となるみんなの成長をリリース</a></h2> <p>去年、<a target="_blank" rel="nofollow noopener" href="https://shwld.net/seicho-release/">みんなの成長</a> というアプリを制作しました。</p> <p>このアプリは、クロスプラットフォームにリリースしたい。<a target="_blank" rel="nofollow noopener" href="https://expo.io">Expo.io</a> を検証したい。という目的から制作しました。</p> <p>最初はTODOアプリになんか独自要素を追加するくらいのもので行こうと言うことから始まって、自分の子供の成長記録をつけられるアプリという方向性に落ち着いた結果です。</p> <p>子供の成長記録をつけていけるなら大人も行けそう。<br /> みんなの成長ではSNSの基礎的なところを実装して、ネタ帳であたためていたRPGみたいに自分のパラメータが上がっていくサービスにつなげよう。と想定をしながら開発をしてました。</p> <p>ここで想定してたがg4ですね。</p> <p>みんなの成長リリース後、当初はexpo.ioでみんなの成長とg4のバックエンドを一緒にして、子供が成長したら大人版へ移行するような並行運用を考えていました。<br /> しかしg4の機能を作るにつれて成長と違う仕様がたくさん出てきたので、今年のはじめくらいに別で作り始めました。</p> <h2 id="経験値稼ぎの1要素としてポモドーロ・テクニックを採用してリリースへ"><a href="#%E7%B5%8C%E9%A8%93%E5%80%A4%E7%A8%BC%E3%81%8E%E3%81%AE1%E8%A6%81%E7%B4%A0%E3%81%A8%E3%81%97%E3%81%A6%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%83%BB%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E6%8E%A1%E7%94%A8%E3%81%97%E3%81%A6%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%B8">経験値稼ぎの1要素としてポモドーロ・テクニックを採用してリリースへ</a></h2> <p>自分のパラメータをあげるにあたって、経験値をためてレベルアップするということが必要でした。<br /> ちゃんと時間をかけたという実績が有るとレベルに信憑性が出ると思い、ポモドーロ・テクニックできるタイマー機能を採用しました。</p> <p>はじめがexpo.ioの勉強目的だったためもあり割と目標もなくダラダラと開発してしまった感はありますが、そうして仕事しつつ子育てしつつスマブラしたり回り道しながら夏にリリースしました。</p> <h2 id="リリースからが本番だった"><a href="#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%81%8C%E6%9C%AC%E7%95%AA%E3%81%A0%E3%81%A3%E3%81%9F">リリースからが本番だった</a></h2> <p>リリースすることによって沢山の人に触っていただくことができました。これは自分の作ったものがある程度興味を引けたという達成感になりました。<br /> ただ、リリース後どういう風にしたいかというビジョンがまったくなかったため、ある程度使ってくれる人がいたこともありそのへんを考えていく必要性を強く感じました。</p> <p>今まで、作ってきたサービスやアプリもある程度周りの人が使ってくれたのですが、g4はそれに比べても反応が良いです。<br /> これが単にクオリティの違いなのか、アイデアや問題解決に繋がりそうな期待感からなのか、そのへんを観察しつつどういう風に育てていきたいのかというのを自問しながら考えていきました。</p> <h2 id="ポモドーロサービスにすることに"><a href="#%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AB%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB">ポモドーロサービスにすることに</a></h2> <p>ポモドーロ・テクニックというのはg4のいち要素でしか無いつもりでした。<br /> しかし、今使ってくれている人のこと。自分が実際使ってみて。また、サービスの目的をシンプルに。などいろんな事を考えた結果、まずはポモドーロ・テクニックをして成長するサービス。<br /> としてg4を作っていくことにしました。</p> <p>自分の中では結構大きなピボットでした。これから壮大な旅が始まるのだ...</p> <p>そういう意味で最初のリリースは、成長がどんな感じで使われるのかとか、レベルどのくらい上がるとか、やっぱりポモドーロ・テクニックなのかとかを検証するMVPとしては良かったなって気がしてきてます。</p> <h2 id="今後のリリースについて"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">今後のリリースについて</a></h2> <p>次のリリースではクエストを作成する事ができるようになります。<br /> ポモドーロ・テクニックのやること管理みたいなところに踏み込む形になります。</p> <p>レベルをあげる目的とポモドーロ・テクニックを融合させる第一歩です。<br /> ツールとしての使い勝手が結構変わるので、ユーザーの反応が気になるもので、そのへん見つつ今後も変化と検証を繰り返していきたい。</p> <p>そして、自分の中で本当のリリースにしたいっていうMVPが一応合って、来年どこかでそれを実施したい。と思っています。<br /> そのときには「これが真のリリースだ!」って言います。</p> <p>唐突になんかここからポエムが始まるのだ...</p> <h1 id="[ポエム] 何を目指して個人開発をするのか"><a href="#%5B%E3%83%9D%E3%82%A8%E3%83%A0%5D+%E4%BD%95%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%A6%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%92%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B">[ポエム] 何を目指して個人開発をするのか</a></h1> <p>コラムみたいな感じでポエムを記事に挟んでくスタイルを唐突に思いついたので誰か試してみてください。</p> <p>個人開発ってなんだろう。<br /> 自分がなぜ個人開発をするのか、その理由を上げてみると</p> <ul> <li>新しい技術のキャッチアップをする</li> <li>趣味。楽しいから</li> <li>達成感、賞賛を得るため</li> </ul> <p>自分が個人開発する動機はおもにこのへんです。<br /> 何かを新しい技術で作るのはそれだけで楽しいし、リリースするのを目標にすると身になりやすいと感じます。<br /> リリースすれば誰かしら褒めてくれます。</p> <p>これらが動機ですかね。目的でいうと</p> <ul> <li>ポートフォリオになるから</li> <li>収入を得るため</li> </ul> <p>あたりなのかなぁ</p> <h2 id="ポートフォリオになる"><a href="#%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%81%AB%E3%81%AA%E3%82%8B">ポートフォリオになる</a></h2> <p>ポートフォリオって言うとなんか違うかなぁ。自分というブランドのブランディングかなぁ。<br /> なんかそんな感じのことです。</p> <p>自分のプロフィールとなるものが欲しかったのですよね。<br /> 開発者として@shwldはこのくらいの技量があります。<br /> こんな風にサービスを作っています。<br /> こういうのが好きです。</p> <p>g4では割とありのままをさらけ出していて、そういう意味では吹っ切れたし一番うまくいっているプロダクトかなと思ってます。<br /> g4を見てのスカウトメッセージとかも来たりしてますし(全然返信とかはできてないですが)、これからもこのスタイルで続けていこうと思いました。<br /> (週3,4くらいで安定した収入があって、個人開発(趣味)を思いっきりできる環境ってのはかなり魅力的)</p> <p>個人開発って発信が自然とできるようになる気がする(自分はまだまだ全然できてないですが、入り口に立てた感)<br /> 自分が作ったサービスを使ってもらいたいという欲からいろんな発信を自然とするようになる利点があります。</p> <h2 id="お金を得るため"><a href="#%E3%81%8A%E9%87%91%E3%82%92%E5%BE%97%E3%82%8B%E3%81%9F%E3%82%81">お金を得るため</a></h2> <p>これは難易度が高くて見ないようにしてるとこあります。<br /> でもやっぱり突き詰めていくとここは潜在的な目的としてやっぱりある。</p> <p>g4は漠然とですが、収入につながるかもしれない検証をしています。</p> <p>自分が今まで作ってきたものは、行っても月数千円の収入でした。<br /> ただ、リリースからあんまり改善を継続できたものがないんですよね。<br /> どうしてもリリース前ほどモチベーションがのらない問題が合ったんです。</p> <ul> <li>リリースしてある程度満足してしまう</li> <li>リリース(動くもの)を優先した結果、メンテしたくないコードになっている</li> <li>他の技術や新しいアイデアを作りたくて浮気する</li> <li>苦手領域に踏み込めない</li> </ul> <p>このあたりの問題が。g4はこのあたりのカウンターとして作っています。<br /> (あくまで自分自身が「継続」できなかった問題に対する見解とトライでしかないです)</p> <h3 id="リリースしてある程度満足してしまう"><a href="#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%A6%E3%81%82%E3%82%8B%E7%A8%8B%E5%BA%A6%E6%BA%80%E8%B6%B3%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86">リリースしてある程度満足してしまう</a></h3> <p>自分の中にあるg4の完成イメージは結構に壮大で、まだ全然リリースできてないです。<br /> リリースはしたが全然リリースではない。まだ本リリースを数回控えています。<br /> そもそもサービスの方向性がやっと決まったぞくらいな感じ。</p> <p>そもそも現時点のg4はなんの体験もつながっていない...、成長できたね。だから何なの。みたいなとこある<br /> まだ全然満足していません。</p> <h3 id="リリース(動くもの)を優先した結果、メンテしたくないコードになっている"><a href="#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%EF%BC%88%E5%8B%95%E3%81%8F%E3%82%82%E3%81%AE%EF%BC%89%E3%82%92%E5%84%AA%E5%85%88%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C%E3%80%81%E3%83%A1%E3%83%B3%E3%83%86%E3%81%97%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B">リリース(動くもの)を優先した結果、メンテしたくないコードになっている</a></h3> <p>これはある程度運用していく中でそういうコードが増えていくことは必然なので難しいところですが、テストを書くということがやっぱ大事ですかね。<br /> あとはリファクタをある程度定期的にやろうかなとか考えたりはしています。</p> <p>つまるところ、仕事と同じようにちゃんと開発しろってことですね。</p> <h3 id="他の技術や新しいアイデアを作りたくて浮気する"><a href="#%E4%BB%96%E3%81%AE%E6%8A%80%E8%A1%93%E3%82%84%E6%96%B0%E3%81%97%E3%81%84%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%A6%E6%B5%AE%E6%B0%97%E3%81%99%E3%82%8B">他の技術や新しいアイデアを作りたくて浮気する</a></h3> <p>新しい技術やアイデアが出てきたときに、そのアイデアでg4を拡張することでこれを回避したい。<br /> g4の派生アプリとか関連アプリとして作ったり、本体に取り込む形で新機能を作れば解決するのでは。</p> <p>それによってg4がキメラになるかもしれませんが、g4は無限の拡張性がある神サービスなのでいける(何が</p> <h3 id="苦手領域に踏み込めない"><a href="#%E8%8B%A6%E6%89%8B%E9%A0%98%E5%9F%9F%E3%81%AB%E8%B8%8F%E3%81%BF%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84">苦手領域に踏み込めない</a></h3> <p>個人開発で、自分が日常で使えない題材で戦うのは得策じゃないと思う。<br /> 自分が作ったサービスを検証したり、その領域を継続してウォッチしたりするのに非日常が入ってくるわけなので、強い気持ちがなければ続けられない。</p> <p>まあこの辺は個々人の特性にも寄りそうだが、自分は意志が弱いし飽きっぽいので、そういうのは環境に助けてもらうのが良いなと思っている。<br /> ポモドーロ・タイマーは自分が仕事をしていく中でなくてはならない存在だし、競合っぽいのがあったらきっとすぐ飛びついてどういうところがいいのかを見ると思う。</p> <p>サービスを作るってすごく難しくて、その領域のことを常に考えてるくらいじゃないときっと勝てない。<br /> 個人開発のサイドプロジェクトなら日常・習慣化しているもの以外はあんまり考えないほうがいいと言うのが自分の考え。</p> <p>これは仕事でも言える。片手間でプロダクトオーナーはできないと思う。プロダクトオーナーってすごい大変。常にプロダクトのことを考えないといけない。だから専任か、習慣化しているものがいい。<br /> と思う。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p><code>なんでも</code> っていう題材に甘えてとりとめもなく書きなぐりました。</p> <p>とりとめないついでですが、Patreonもやってみています。<br /> パトロンがいるのにg4開発しないとかできないので、開発やめるならPatreonやめないといけない。これはかなり強い後押しです。</p> <p>今ならデスクトップアプリ版の先行配信がついてくる。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.patreon.com/bePatron?u=24806933" data-patreon-widget-type="become-patron-button">Become a Patron!</a></p> <p>ポモドーロ・テクニックで成長できる「g4」もよろしくおねがいします。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games">g4 ポモドーロストーリーズ</a></p> shwld tag:crieit.net,2005:PublicArticle/15487 2019-10-17T05:05:57+09:00 2019-10-17T05:05:57+09:00 https://crieit.net/posts/fly-io-SPA-OGP-package-json fly.ioでSPA&OGP芸を最速かつゼロ依存でやる(package.jsonすら不要) <p>個人開発界隈ではOGP芸というものが流行っているみたいですね。</p> <p>SNSにシェアする際に表示されるOGPの設定や画像をいい感じにするみたいなことのことですが、SPAではこれを生成するのが割と面倒だったりします。</p> <p>自分が作っている<a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games">g4</a>でもOGPを使ったシェアを実装していますが、SSRを使って配信していて、割と設定が面倒だったりしています。</p> <p>こんなの<br /> <a href="https://crieit.now.sh/upload_images/0f6a4a0608c5dc3550a5c44abd805d7e5da777f12f09e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0f6a4a0608c5dc3550a5c44abd805d7e5da777f12f09e.png?mw=700" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f35313430322f63356465616336612d333663642d366131342d646434302d3139333036306636353732612e706e67.png" /></a></p> <p>今回、なるべくSSRをしないでSPAのままやってみることはできないかというのをfly.ioで試してみました。</p> <h1 id="作ったものの概要"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE%E3%81%AE%E6%A6%82%E8%A6%81">作ったものの概要</a></h1> <ul> <li>実際にOGP画像として表示される画像は<code>/image.png?i=0</code>で配信する。</li> <li><code>/</code>に<code>?i=0</code>のようなパラメータをアクセスすると、入力した↑を含むOGPが反映されたhtmlを表示する</li> <li>fly.ioが日本語に対応してないので、titleに日本語は使えない</li> <li>せっかくfly.ioを使ってますが、今回はOGPだけにフォーカスしたいのでキャッシュ周りは実装してません</li> </ul> <h1 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://og-image-sample.edgeapp.net?i=0">https://og-image-sample.edgeapp.net?i=0</a></p> <p>or</p> <p><a target="_blank" rel="nofollow noopener" href="https://og-image-sample.edgeapp.net?i=1">https://og-image-sample.edgeapp.net?i=1</a></p> <p>これをtwitterやfacebookなどでシェアしてみてください。</p> <h1 id="作り方"><a href="#%E4%BD%9C%E3%82%8A%E6%96%B9">作り方</a></h1> <p>事前にflyのcliをPCにインストールしておく<br /> npmは必要ないです(あったほうが便利だけど最速なので)</p> <p>必要なファイルは4つだけ<br /> - index.js: なんか処理書くやつ<br /> - template.html: テンプレートです。ここに情報を流し込む<br /> - fly.yml: なんか設定書くやつ<br /> - sample.svg: OGP芸したい適当なsvg。今回はURLによって内容を書き換えるため雑に<span>{</span><span>{</span>title<span>}</span><span>}</span>みたいなやつをここに書いて、テキスト置換でそこに内容を埋め込んでます。</p> <p>``` html:template.html<br /> <!DOCTYPE html><br /> <html lang="ja"><br /> <head><br /> <meta charset="utf-8" /><br /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /><br /> <meta name="theme-color" content="#000000" /><br /> <title>fly.ioで最速ogp芸</title><br /> <meta name="description" content="by shwld" /><br /> <meta name="twitter:card" content="summary_large_image" /><br /> <meta name="twitter:creator" content="@shwld" /><br /> <meta property="og:type" content="website" /><br /> <meta property="og:url" content="https://www.g-g-g-g.games" /><br /> <meta property="og:title" content="shwld" /><br /> <meta property="og:description" content="shwld" /><br /> <meta property="og:image" content="https://www.g-g-g-g.games/assets/image.png" /><br /> <meta property="og:image:alt" content="shwld" /><br /> </head><br /> <body><br /> <h1 id="fly.ioでogp芸をする場合のサンプルだよ"><a href="#fly.io%E3%81%A7ogp%E8%8A%B8%E3%82%92%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A0%E3%82%88">fly.ioでogp芸をする場合のサンプルだよ</a></h1><br /> </body><br /> </html></p> <pre><code><br />templateはこんな感じになりました。 ogpのcontentは置き換えるので何でもいいです。とりあえずさり気なくg4のものを入れてアピールしておきます。 次に`index.js`です。こちらにすべての処理を書きます。 ``` js:index.js import { Image } from '@fly/image' import { mount } from "@fly/fetch/mount" // templateをテキストで取得するFunction async function getTemplate() { const resp = await fetch("file://src/template.html") return await resp.text() } // svgをテキストで取得しつつ中身ちょっと埋め込めるFunction async function getSvgText(title) { const resp = await fetch("file://src/sample.svg") const text = await resp.text() // g4(https://www.g-g-g-g.games)ではReactでテキスト化されたsvgを吐いてるが、とりあえず単純に置換する return text.replace('<span>{</span><span>{</span>content<span>}</span><span>}</span>', title) } // 画像形式のレスポンス作るFunction async function responseImage(svgText) { const svgResp = new Response(Buffer.from(svgText)) const buf = await svgResp.arrayBuffer() const png = new Image(buf).png() const result = await png.toBuffer() return new Response(result.data, { headers: { 'Content-Type': 'image/png', 'Content-Length': result.data.byteLength.toString(), } }) } // 出力データのパターン const TITLES = [ 'g4 is pomodoro rpg!', 'fly.io de OGP!!', ] // fly.ioのrouterみたいなやつ。ここに処理を書いてく。 const mounts = mount({ // このパスでogpの画像を生成する '/image.png': async (req, init) => { const url = new URL(req.url) // URLからQueryStringを取得 const index = url.searchParams.get('i') if (index !== '0' && index !== '1') { return new Response('not found', { status: 404 }) } // 対応したタイトルを取得 const title = TITLES[index] // タイトルをsvgに埋め込んだテキストを作る const svgText = await getSvgText(title) // svgからpng画像を生成する return responseImage(svgText) }, // このパスをシェアする '/': async (req, init) => { const url = new URL(req.url) // URLからQueryStringを取得 const index = url.searchParams.get('i') if (index !== '0' && index !== '1') { return new Response('not found', { status: 404 }) } // 対応したタイトルを取得 const title = TITLES[index] // テンプレートをparseして編集できるようにする const doc = Document.parse(await getTemplate()) // テンプレートにOGPを埋め込む doc.querySelector('meta[name="description"]').setAttribute('content', title) doc.querySelector('meta[property="og:url"]').setAttribute('content', url.href) doc.querySelector('meta[property="og:title"]').setAttribute('content', title) doc.querySelector('meta[property="og:description"]').setAttribute('content', title) doc.querySelector('meta[property="og:image"]').setAttribute('content', `${url.origin}/image.png?i=${index}`) doc.querySelector('meta[property="og:image:alt"]').setAttribute('content', title) // htmlを返す return new Response(doc.documentElement.outerHTML, { headers: { 'Content-Type': 'text/html' }, status: 200, }) }, }) // リクエストをmountsの定義を使って処理するように設定する fly.http.respondWith(mounts) </code></pre> <p>index.jsはこんな感じ。<br /> <code>/</code> は<code>template.html</code> のogpを書き換えて出すだけ。<br /> <code>/image</code> はsvgファイルを読み込んで文字列を置換したものをpngに変換して返してます。</p> <p>fly.ymlやsvgファイルは特に特別な設定はないのでドキュメントや最後にソースを貼るのでそちらを見ていただければ。</p> <p>あとは、fly.ioのコンソールでアプリを作って、<code>fly deploy</code> するだけ。</p> <p>再度になりますが、</p> <p><a target="_blank" rel="nofollow noopener" href="https://og-image-sample.edgeapp.net?i=0">https://og-image-sample.edgeapp.net?i=0</a></p> <p>or</p> <p><a target="_blank" rel="nofollow noopener" href="https://og-image-sample.edgeapp.net?i=1">https://og-image-sample.edgeapp.net?i=1</a></p> <p>これをtwitterやfacebookなどでシェアしてみてください。</p> <p>以上になります。ソースは<a target="_blank" rel="nofollow noopener" href="https://github.com/shwld/fly.io-og-image">こちら</a>にあります。</p> shwld tag:crieit.net,2005:PublicArticle/15427 2019-09-26T22:08:54+09:00 2019-09-26T22:08:54+09:00 https://crieit.net/posts/React-PWA-Rails-GraphQL-RPG React PWA + Rails GraphQLで作ったポモドーロRPGに使った技術やその選定理由を書いてみた <p>先日、『<a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games">g4</a>』というポモドーロ+RPGなサービスをリリースしました。</p> <p>そのサービスで使った技術について聞かれることがあったので残しておきます。</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%3F">どんなサービス?</a></h1> <p>ポモドーロ・タイマーを使い25分間集中すると経験値をもらえ、その経験値でレベルが上がる。<br /> って言う感じのやつです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games">https://www.g-g-g-g.games</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games"><a href="https://crieit.now.sh/upload_images/4857e38ac110f7f2ccb9a3a6c9851f425d8c46a290533.jpeg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4857e38ac110f7f2ccb9a3a6c9851f425d8c46a290533.jpeg?mw=700" alt="https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_51402_6c1fef60-9f24-2233-821b-1b4b16575e21.jpeg" /></a></a></p> <h2 id="こんな特徴があります。"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E7%89%B9%E5%BE%B4%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82">こんな特徴があります。</a></h2> <ul> <li>ポモドーロ・タイマーやRPG的なUIはリッチで動きがある</li> <li>現在のステータスをOGP画像にしてシェアできる</li> <li>上昇する能力値や覚えるスキルは登録した文章を解析して決まる</li> </ul> <h1 id="構成はこんな感じ"><a href="#%E6%A7%8B%E6%88%90%E3%81%AF%E3%81%93%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98">構成はこんな感じ</a></h1> <p><a href="https://crieit.now.sh/upload_images/a91960cfcbabfe4677662c7e3a35b9225d8c468610acb.jpeg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a91960cfcbabfe4677662c7e3a35b9225d8c468610acb.jpeg?mw=700" alt="https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_51402_1f7797cd-59e5-b556-2afe-b0a964acd0ac.jpeg" /></a></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%E3%81%AE%E9%81%B8%E5%AE%9A%E7%90%86%E7%94%B1">フロントエンドの選定理由</a></h2> <p>フロントエンドはSSRしたReactアプリをfly.ioにおいています</p> <h3 id="[React]"><a href="#%5BReact%5D">[React]</a></h3> <p>自分は過去に仕事でNuxt.jsや生Vue.jsを使ったことがあり、個人ではExpoやNext.jsでReactにも触っていました。</p> <p>今回Reactを選択した理由は以下です。</p> <ul> <li>型が欲しかった。Typescriptを使いたかった</li> <li>Reactのほうが書いていて楽しい(個人の感想です) <ul> <li>React Hooksめっちゃいい</li> </ul></li> <li>Apolloを使うならVueよりReactのほうが色々揃っている</li> </ul> <h3>[<a target="_blank" rel="nofollow noopener" href="https://fly.io">fly.io</a>]</h3> <p>SSRするためにNode.jsをホスティングするやつが欲しかったので選定。<br /> <a target="_blank" rel="nofollow noopener" href="https://mizchi.hatenablog.com/entry/2019/02/21/235403">mizchiさんのブログ</a>で知り、面白そうだなと思ったのがきっかけ。<br /> べつにfirebase hostingでもよかったですが、以下が決め手</p> <ul> <li>firebase hosting同様初期導入費用がほぼ0</li> <li>CDN</li> <li>キャッシュコントロール</li> <li>svgを使ったOGP画像の生成ができる</li> </ul> <p>特に、</p> <blockquote> <p>svgを使ったOGP画像の生成ができる</p> </blockquote> <p>に有用性を感じて選定したんですが、現時点ではカスタムフォントと日本語への対応が十分でなく、別途Cloud Runを使うことになってしまっています(後述)<br /> (サポートに聞いたらリポジトリ教えてもらったので(OSS)対応できるようなら自分で対応してなげたいなぁ)</p> <h5 id="キャッシュコントロールもよい"><a href="#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%82%E3%82%88%E3%81%84">キャッシュコントロールもよい</a></h5> <p>キャッシュの操作も面白くて、<br /> g4の公開用ページではAPIからもらった結果をキャッシュして、キャッシュがあればそれをそのまま返すということをしています。</p> <p>これによってAPIサーバーへの負荷はかなり低くなってると思います。<br /> APIサーバー側からは、データ更新時にfly.ioのキャッシュを削除する操作をしていて、データが更新されるまではfly.ioはキャッシュを使い続けてます。</p> <p>この辺のAPIが普通に使いやすくて簡単にかけるのでめっちゃ良きです。</p> <h5 id="fly.io良いよ"><a href="#fly.io%E8%89%AF%E3%81%84%E3%82%88">fly.io良いよ</a></h5> <p>fly.io自体ははデプロイも早いし、導入コストも安いので<a target="_blank" rel="nofollow noopener" href="https://zeit.co">now</a>とかと並べて、手軽にNode.jsをホスティングするための選択肢にしてもいいんじゃないかなって思います。</p> <h3 id="Next.jsを選ばなかった理由"><a href="#Next.js%E3%82%92%E9%81%B8%E3%81%B0%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E7%90%86%E7%94%B1">Next.jsを選ばなかった理由</a></h3> <p>SSRする予定ではありましたが、OGPだけ生成できればいいなというレベルだったので、通常のReactアプリで作りました。<br /> なるべく継続開発するため、アップデートの手間と依存を減らしたかったのも少しある</p> <h3 id="[PWA]を選定した理由"><a href="#%5BPWA%5D%E3%82%92%E9%81%B8%E5%AE%9A%E3%81%97%E3%81%9F%E7%90%86%E7%94%B1">[PWA]を選定した理由</a></h3> <p>最初は、<a target="_blank" rel="nofollow noopener" href="https://expo.io">Expo</a>で作ろうかと思っていました。</p> <p>もともとSPAでアプリっぽいUIを作る仕事を受けたときに、Nuxt.js + Firebaseで作り、マルチブラウザ対応が辛いと思った経験がありました。</p> <p>RNならその辺いい感じに作れるかもと思って<a target="_blank" rel="nofollow noopener" href="https://shwld.net/seicho-release/">みんなの成長</a> というアプリでExpoを試しみて、使い勝手が良い事までは確認してました。</p> <p>ただ今回はモバイルより、デスクトップアプリのほうが欲しいということに気づき、<br /> Electronで作りやすかったり、PWAならそのままインストールもできちゃうのでWebでいいかなって思いPWAにしました。</p> <p>なのでマルチブラウザ辛いは解決してないです。<br /> ここは個人開発なので修行と割り切って本業に生かしていきます。<br /> Safari対応が結構めんどいけど、ユーザー多くて無視できない...</p> <p>マルチブラウザと言っても、現状Chrome、Safari以外はほぼ無視してまっす。</p> <h3>[<a target="_blank" rel="nofollow noopener" href="https://www.apollographql.com">Apollo Client (react-apollo)</a>]</h3> <p>これもSPAでアプリっぽいUIを作る仕事で、Nuxt.js + Firebaseで作ったときに、Firebaseのデータベース(このときはrealtime database使ってた)をフロントに反映するのが辛くて、同じようにREST APIも辛いだろうなと思って、GraphQLに手をだしたのがきっかけでした。</p> <p>GraphQLだけでもすごく良いのですが、Apollo Clientがいいのはキャッシュコントールで、<br /> クエリ毎にキャッシュを優先するかサーバーを優先するかを選択できます。</p> <p>また、キャッシュがあれば再取得しないなどを簡単に書けたり、とにかくこれはSPAのベストプラクティスだなって感じの実装をシンプルに書けます。</p> <p>Mutationするとキャッシュが書き換わったりするのもめっちゃ良き</p> <p>正直この辺のこと考えながらSPA実装するのってかなり大変じゃない?ってか大変だった<br /> アプリライクなUIのSPAならApollo Client使おうぜ!</p> <p>こいつのおかげでこれまたAPIサーバーの負荷はまあまあ抑えられてそうです。</p> <h2 id="[Firebase Auth, Storage]について"><a href="#%5BFirebase+Auth%2C+Storage%5D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">[Firebase Auth, Storage]について</a></h2> <p>バックエンドはRailsですが、APIサーバー作るのに正直Deviseとか使いたくないです(完)</p> <p>Twitter連携やら諸々簡単なので選ばない理由がない。<br /> Auth0は選択肢に入るけど今回GCPなのでGoogleでまとめられるし、そこまで込み入った認証必要ないしでこれにしました。</p> <p>Storageは別に何でもよかったですが、Firebase Authの認証ユーザー単位での権限指定が楽なので使い勝手は良いです。</p> <h2 id="デザインについて"><a href="#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">デザインについて</a></h2> <p>g4のデザインはレスポンシブのヘルパーとして<a target="_blank" rel="nofollow noopener" href="https://github.com/twbs/bootstrap/blob/master/dist/css/bootstrap-grid.css">bootstrap-grid</a>だけ使わせてもらってます。<br /> めっちゃ便利なのでおすすめ。</p> <p>それ以外はcss全部自分で書いてます。</p> <p>コンポーネントファーストで作成しており、Atomic Designの粒度で、<a target="_blank" rel="nofollow noopener" href="https://storybook.js.org">Storybook</a>作ってコンポーネントを作ってる感じです。<br /> Storybookは割とぶっ壊れやすかったり、他のビルド設定と競合とか重複したり、辛みもありますが、<a target="_blank" rel="nofollow noopener" href="https://storybook.js.org/docs/testing/structural-testing/">storyshots</a>によるスナップショットの差分確認ができるのと、テストの安心感があるので、無いと無いで不安ではあります。</p> <h2 id="バックエンドの選定理由"><a href="#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E3%81%AE%E9%81%B8%E5%AE%9A%E7%90%86%E7%94%B1">バックエンドの選定理由</a></h2> <h3>[<a target="_blank" rel="nofollow noopener" href="https://graphql-ruby.org">graphql-ruby</a> & Ruby on Rails]</h3> <p>Apollo Clientの項で書きましたが、GraphQLを使うことは決まっていました。<br /> GraphQLをマネージドでホスティングしてくれるやつを探したりしたんですが、普段Railsエンジニアなので慣れてるからテストとかも書きやすいしRailsでいっかで、graphql-rubyにしました。</p> <p>Railsにするとランニングコストは割とかかるんですが、今回は個人開発のメインに据えて長く継続開発したいを目的にしてたので、<br /> 稼働してないものにお金払うみたいなことにならない想定(自分が使い続ける)で、コストかける覚悟はしました。</p> <p>graphql-rubyは仕事でも使ってるので、今後も押していきたい存在。</p> <h3 id="[GCP/App Engine]"><a href="#%5BGCP%2FApp+Engine%5D">[GCP/App Engine]</a></h3> <p>App Engineについては<a target="_blank" rel="nofollow noopener" href="https://qiita.com/shwld/items/e86ee3f642c7857dd56e">こちらの記事</a>で書きました。</p> <p>要約するとHerokuでも良かったけど、使ってみたかったのでGCPにした。です。</p> <h2 id="[GCP/Natural Language API]"><a href="#%5BGCP%2FNatural+Language+API%5D">[GCP/Natural Language API]</a></h2> <p>便利。Azureとかにもありますが、今回はGoogle統一で行きました。くらいの選定理由</p> <h2 id="[GCP/Cloud Run]について"><a href="#%5BGCP%2FCloud+Run%5D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">[GCP/Cloud Run]について</a></h2> <p>Cloud Runは今回使う予定は全くありませんでした。</p> <p>今利用している理由としては、</p> <ul> <li>fly.ioでOGPを生成できるとふんでいたができなかった。</li> <li>とりあえず手っ取り早くカスタムしたDockerimageでfry.ioをあまりお金をかけずに使えるとこはないか。</li> </ul> <p>からの、Cloud Run。</p> <p>中身は日本語とフォントをインストールした普通のNodeイメージに<br /> fly.ioのサーバーを単純に乗っけて起動しているだけです。(プレビルドして実行したいがやり方が分からずdevサーバー起動しているのでなんとかしたい。誰かやり方知りませんか。)</p> <p>なので、いずれはfly.ioだけでできるようして、Cloud Runをやめたいです。</p> <h4 id="Cloud Run超便利"><a href="#Cloud+Run%E8%B6%85%E4%BE%BF%E5%88%A9">Cloud Run超便利</a></h4> <p>そんな理由で使い始めましたが、驚くくらい簡単かつ手軽にカスタムDockerイメージが使えるので、Cloud Runめっちゃ便利です。<br /> 今後活用していきたい。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>割と構成的にはガチよりになりました。<br /> 自分の技術力総動員してる感じなのでテンション上がってめっちゃ楽しい!</p> <p>g4の運用を支える技術についても今後書いていきたいです。</p> <p>みんなでレベル上げしましょう!</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games">https://www.g-g-g-g.games</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games"><a href="https://crieit.now.sh/upload_images/4857e38ac110f7f2ccb9a3a6c9851f425d8c46a290533.jpeg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4857e38ac110f7f2ccb9a3a6c9851f425d8c46a290533.jpeg?mw=700" alt="https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_51402_6c1fef60-9f24-2233-821b-1b4b16575e21.jpeg" /></a></a></p> shwld tag:crieit.net,2005:PublicArticle/15392 2019-09-12T22:56:56+09:00 2019-09-12T23:11:28+09:00 https://crieit.net/posts/RPG-g4 RPGのレベル上げのように、ポモドーロした分だけ成長できるサービス『g4』をリリースしました!!! <p>あたためていた(開発に時間がかかっていた)サービスをついに先日リリースしました。</p> <p>RPGのようにステータスを上げるという体験をしたかった人の願いを叶える機能がついた、ゲームライクなポモドーロ・タイマーです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.g-g-g-g.games">https://www.g-g-g-g.games</a></p> <h2 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%E3%81%8B">どんなサービスなのか</a></h2> <p>現実の世界で経験したことや達成した成果をg4に登録すると、登録内容を解析して自分の分身となるキャラクターの能力値に反映します。</p> <p>継続して経験を登録することでだんだん自分のパラメータがわかってくる設計になっており、育ったキャラクターを使って交流したり、みんなで楽しく成長できるプラットフォームを目指しています。</p> <h2 id="g4の使い方を紹介"><a href="#g4%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%92%E7%B4%B9%E4%BB%8B">g4の使い方を紹介</a></h2> <h3 id="1. キャラクターを登録して"><a href="#1.+%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%A6">1. キャラクターを登録して</a></h3> <p><a href="https://crieit.now.sh/upload_images/6f6aab38124c543873665f220009246b5d7a4d0b7b128.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6f6aab38124c543873665f220009246b5d7a4d0b7b128.png?mw=700" alt="キャラクターを登録する" /></a></p> <h3 id="2. 経験を登録すると..."><a href="#2.+%E7%B5%8C%E9%A8%93%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E3%81%A8...">2. 経験を登録すると...</a></h3> <p><a href="https://crieit.now.sh/upload_images/7b5dbaf701fdba7bb70c7e4fc44466ed5d7a4d553c2cf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7b5dbaf701fdba7bb70c7e4fc44466ed5d7a4d553c2cf.png?mw=700" alt="経験を登録する" /></a></p> <p>経験値を獲得します<br /> <a href="https://crieit.now.sh/upload_images/0f87bb481d2012920b29cbc7d4eab5b65d7a4d7594f7e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0f87bb481d2012920b29cbc7d4eab5b65d7a4d7594f7e.png?mw=700" alt="経験値を獲得します" /></a></p> <p>HPが少し上がりました。もう何回か書くと文章力レベルが上がるかも</p> <h3 id="3. クエストをクリアして経験を登録するためのMPをゲットしよう"><a href="#3.+%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E3%82%AF%E3%83%AA%E3%82%A2%E3%81%97%E3%81%A6%E7%B5%8C%E9%A8%93%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEMP%E3%82%92%E3%82%B2%E3%83%83%E3%83%88%E3%81%97%E3%82%88%E3%81%86">3. クエストをクリアして経験を登録するためのMPをゲットしよう</a></h3> <p>経験を登録するためにはMP(Maturity point)が必要です。</p> <p>MPは最初2ポイント持っており、1日に2回まで経験を登録することができますが、それ以上経験を登録するためにはクエストをクリアしていく必要があります。</p> <p><a href="https://crieit.now.sh/upload_images/32c8820e07b41bc03da7cda33369c56c5d7a4e0fdda51.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/32c8820e07b41bc03da7cda33369c56c5d7a4e0fdda51.png?mw=700" alt="押せない" /></a><br /> ↑ MPがないと経験を登録するボタンが押せない</p> <h3 id="4. ポモドーロ・タイマーを使って経験値をためる(現実世界で作業する)"><a href="#4.+%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%B5%8C%E9%A8%93%E5%80%A4%E3%82%92%E3%81%9F%E3%82%81%E3%82%8B%EF%BC%88%E7%8F%BE%E5%AE%9F%E4%B8%96%E7%95%8C%E3%81%A7%E4%BD%9C%E6%A5%AD%E3%81%99%E3%82%8B%EF%BC%89">4. ポモドーロ・タイマーを使って経験値をためる(現実世界で作業する)</a></h3> <p><a href="https://crieit.now.sh/upload_images/757ffb3e7bfa42950539fe92b03a7ba75d7a4dab70800.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/757ffb3e7bfa42950539fe92b03a7ba75d7a4dab70800.png?mw=700" alt="クエストをする" /></a></p> <p>1ポモ(25分)が終わるとMPを獲得できます。</p> <p>ポモドーロ・テクニックを知らない方は<a target="_blank" rel="nofollow noopener" href="https://www.google.co.jp?q=ポモドーロ・テクニック">こちら</a></p> <p>MPを獲得したらどんどん経験を登録しましょう!</p> <h3 id="5. 次の日の9時に何かが起こる!?"><a href="#5.+%E6%AC%A1%E3%81%AE%E6%97%A5%E3%81%AE9%E6%99%82%E3%81%AB%E4%BD%95%E3%81%8B%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8B%21%3F">5. 次の日の9時に何かが起こる!?</a></h3> <p>ここだけの話ですが、実は朝9時になるとMPが全快します</p> <h2 id="なんでつくったのか"><a href="#%E3%81%AA%E3%82%93%E3%81%A7%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">なんでつくったのか</a></h2> <p>RPGレベル上げって楽しいですよね。現実のレベル上げも同じように楽しめないだろうか。いや楽しめるはず。からのg4です</p> <p>実際に自分で毎日使っていますが、すごく楽しいです!</p> <p>また、このg4自体も自分のレベルアップのためのサービスであり、継続開発をする、継続開発ができるサービスを作るという裏の(真の)目的があったりします。</p> <ul> <li>テンションが上がるテーマであること</li> <li>テンションが上がる技術であること</li> <li>自分自身使い続けられる内容</li> </ul> <p>作った結果、今めっちゃテンション上がってます😎</p> <h2 id="そもそもg4ってどういう意味?"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82g4%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%3F">そもそもg4ってどういう意味?</a></h2> <p>名前の由来はあるのですが秘密にしておきます。いつかサービス内で意味がわかる何かを提供したい</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>継続的に新機能の開発・検討中ですのでTwitter (@shwld) で開発状況などつぶやいていこうと思います。</p> <p>面白いアイデアや活用法、アドバイス、感想、要望なども受け付けてますのでお気軽にフォロー&メンションいただければと思います!</p> <p>g4のレベル上げ楽しいので、ポモドーロ・テクニックをを知らない方や普段やらない方でも、毎日回復するMPを使ってぜひ経験を登録してみて下さい</p> <p>※画面は開発中のものです(言いたかった)</p> <p>g4RPGのレベル上げのようにポモドーロした分だけ成長できるサービス『g4』www.g-g-g-g.games</p> shwld