こんにちは。今回は個人開発をしてみた時のお話をしていこうかなと思います。
個人開発っていいですよね。スタックも時間もコストもUIもすべて思い通りにすることが出来てとても楽しいものです。
個人開発には夢がありますよね。エンジニアの方や志望の方なら誰もが1度は夢見る事。。
とはいえ、GitHub StarがどうこうDL数がどうこう、儲かるか云々というのが前で出がち(悪いこととはいってないです)
僕の夢は自分のプログラムの中に推し要素を入れる事だったので、その夢というか妄想を
叶える為に個人開発に手を出しました。
えーすこし自慢話のお時間ということで。。。
あとCVのには推しを起用していたりします。個人依頼OKの声優さんなので
このアプリの為に依頼しました!!!!!!
じゃあ、その声を最大限に活かしつつ、長い間使える&自分の為になる
のはなにかな?って考えた答えが今回の好きな声で応援してもらえる学習、タスク管理システムです。
すでに限界オタク化していますが
今回はオタク要素がかなり濃いです。
苦手な方はブラウザバックを推奨します。
ナニコレ?

Google Cloudをバックエンドに採用しており複数のデバイスで利用してもデータが同期されること。CVを搭載していること。の2点が特徴です。
どんな機能があるんすか?
先ほどの物と一部少し繰り返しになりますが。。。
- ポモドーロタイマー(CVでアナウンス)
- 経過時間をCVでアナウンス(n時間毎)
- スランプ脱出支援
- 作業時間をグラフ化、複数デバイス同期
- Google Todo,CalendarとAPI経由で同期
ポモドーロタイマー(CVでアナウンス)
ポモドーロタイマーとはなんぞや?ということですが
25分作業、5分作業を繰り返し行う事で学習効果を高める。というものです。
ピピピッ。よりも「一緒に25分頑張ろう!」とか「ふぅ、ここで一旦おしまい!ねぇ、ちょっと休憩しよー?」「5分終わり!また一緒に頑張ろうね!」とか言われた方が集中出来るし頑張れるよね。という限界オタクの思想です。
経過時間をCVでアナウンス(n時間毎)
こちらもタイマー機能の話と似たような内容ですが
1時間、2時間とn時間経過すると、、、
「2時間経過まだもうちょうっと頑張れるよね!」とか
「5時間経過!すごい! ほんとに頑張ってるね!」とか言われたら嬉しいよねってことで実装しました。
これに関してはON/OFFを切り替えられるようにしてあります。画面右下にあるトグルでOFFにできます。

Timer CVをONにするとこの時間経過のアナウンスがONになる感じですね。
スランプ脱出支援
勉強やら仕事やらどうしてもスランプといか調子出ないな、、とかバーンアウトという問題がありますよね。
先ほどのControl PanelのOVERCLOCKをONにすると有効になります。
機能としては機能1で紹介したタイマーのCVを優先的に以下のようなCVを優先して再生するようにします。
「やる気が出ないのは分かる。でも、一緒に少しだけ!」
「なんだかやる気が出ない? いいよ、今はちょっとのんびりしよ? でもね…ちょっとだけでも進めたら、きっと気持ちも変わるよ」
とか言われたら気持ちも再起動できるよねって事で実装しました。
私はクソ雑魚メンタルなので気持ちの波は大荒れなのですがこれに何度救われたことか()
作業時間をグラフ化、複数デバイス同期
ここからは少し技術的な話をしていこうかなと。
CVのデータを確実に保護したかったのでネット上のサーバーに載せたくない、、
でもデータはすべてのデバイスで同期したい。。。ということで
FireStoreでデータを同期することに。
何を同期するの?というと学習時間とその日の目標達成率をFireStoreに1分毎に書き込みます。
これにより家のPCで使った後に、学校のPCで使ってもデータは同期されますし
何らかの不具合により過去のデータを損失することはなくなりました。
また保存したデータは起動時にロードし過去30日分のデータを取得します。

グラフはシンプルに学習時間を表示と30日間で一番長い日は色を少し変えています。
となりの🐦️カレンダーは目標達成率を示します。目標時間は変更可能です。
Google Todo,CalendarとAPI経由で同期
そのままの意味ですね。TodoとCalendarとAPIで相互通信出来るようにして
アプリ上から追加、編集、削除を出来るようにしています。

Todoは期限の表示と誤ってDoneにした場合に備えて操作後15分以内なら戻せるように。
TodayはCalendarとの同期でタイトル、開始時間、場所を取得します。
またCVがコンセプトですのでこちらにもCVを実装と。
例えば、、、アプリ起動時にデータを取得してTodoが多いと、、
「今日の予定もTodoも…しっかり詰まってるじゃん!頑張れ!」とか
Todoに課題が含まれて締切が近いと、、
「締め切りが近い課題あるよ!早めにやろ!」とか
タスクを完了すると、、
「チラッ…チラッ…えへへ、ひとつ終わったの見てたよ!お疲れ様!」
「ふふ、やっと終わった? がんばったねぇ!」
とか言ってもらえます。
機能紹介おわり。
デモ動画は秘密です。権利的な問題もそうですが、声を独り占めしたいので←
工夫とか
CVがテーマなのでその部分のロジックには得に気を配りました。
タイマーのCVは50通り程でバリエーションはそこそこありますが、毎回シャッフルすると
少なからず「さっきも聴いたけど?」となる問題がありました。
少し端折り&実際のコードを簡略化しましたがこんな感じの問題が、、
function playCV() {
// 毎回ランダムに選択
const randomIndex = Math.floor(Math.random() * shuffledList.length);
const cv = shuffledList[randomIndex];
console.log(cv); // "1.wav" の次にまた "1.wav" が来てしまうことがある
}これをせっかくFireStoreを導入しているということでシャッフルの配列もそこで管理することに。
1.アプリ起動時にFireBaseに配列を問い合わせ
2-A.配列が空なら新たにシャッフルし配列を作成し書き込んでから再生
2-B.配列が存在していれば配列をその配列から順番に選んで再生
3.再生済みのCVを配列から削除
ということでアプリを閉じたり、別の端末から利用しても重ならないようにしてみました。
なんでこれを開発したのか
個人開発の最大の利点「自由」を最大限に行使したかったから。
あとはこれを思いついたときはシンプルに病んでいたと思います
そうでもないと多分思いつきません←
勘が鋭い方はすでにお気づきかもしれませんが、Control PanelのName ListをONにすると、
それぞれのアナウンスに自分の名前が追加されます←
例えば、、「5分終わり!***くん!また一緒に頑張ろうね!」
とかそういう()あれです、、、はい。。キモいとか言わないで←
この名前呼びは既存のアプリではまず実現不可能であることですが、個人開発なので実現できた!という訳ですね。(名前呼び歓迎!!みたいな感じだったのでお願いしました←)
ですのでもちろんリリースもしません(権利的な問題でそもできません)
どうしても儲けがどうこうとなりがちの個人開発ですがこういう夢を叶える個人開発もたまにはいいのかなと思います。
そして「私の声をアプリのために使ってくれて嬉しい!」とかお願いした声優さんから言われたらこっちも嬉しいわけですよ。。
開発者として誇れますし、すごく嬉しいじゃないですか、、
以上。個人開発をしました!という名の自慢話でした。
グダグダ、限界オタクの記事を最後までお読み頂けきありがとうございました。

コメント