開志専門職大学のアドベントカレンダーということで今年はこのお題でいこうかなと。
技術どうこうという話よりもどちらかと言うと思想のお話になったいたり限界オタクが意味わかんない事に手を出したみたいな内容なので、「そういうのは苦手だよ」って方はブラウザバックでお願いいたします。
俺専用APPを開発してみたよってお話です。
権利的な問題は当たり前ですが、一人占めしたいので動画やコードはありません。ゴメンナサイ
個人開発をやる意味って?
個人開発をやる意味やきっかけというのは、Starの数、収益..etcと多岐に渡ると思うのですが、個人的には市場に存在しない or 存在する訳がない物を作れのが良い点だなぁと思っています。
個人的な理由や事情、俺なりの正解というのを詰め込みまくったり、好きなスタックを使いまくっても誰にも文句を言われないというのは中々ないと思うので貴重な機会だなぁと。
個人開発した理由について
僕の一つの夢は自分のプログラムの中に推し要素を入れる事だったので、それを実現する為に個人開発をしてみました。この夢を叶える方法は個人開発くらいしか方法が無いと思います。
僕の推しは声優さんなのですが、個人依頼OKの方でして(奇跡的ですね!)
じゃあ、その声を最大限に活かしつつ、長い間使うにはどうしたらいいかな?って考えた答えが今回の好きな声で応援してもらえる学習、タスク管理システムです。
変なことをする人は居ないとは思いますが一応念のため。のお願いです
声優の方がどなたかは探らないで欲しいです。
声優さんに迷惑はかけたくないので。ご協力をお願いいたします。
作ったもの
先ほども書きましたが、学習・タスク管理の統合環境です。大雑把に言えばよくあるタスク管理の機能にボイスを追加しましたよ~っていうと話が早いかなと思います。
見た目は比較的シンプルではありますが、Google CloudやAPIをバックエンドに採用しており複数のデバイスで利用してもデータが同期されることが技術面での特徴です。
機能一覧
1.ポモドーロタイマー(CVでアナウンス)
2.経過時間をアナウンス(n時間毎)
3.スランプ脱出支援
4.作業時間をグラフ化、複数デバイス同期
5.Google Todo,CalendarとAPI経由で同期
1.ポモドーロタイマー
この説明は若干横着になるのですが、ポモドーロタイマーってなんぞやって話ですが、25分の作業と5分の休憩で効率を高めよう!という手法ですね。
普通ならピピピッ!みたいな電子音が普通だと思うのですがその開始、終了をボイスにしてみたよ。っていう感じですね。例えば、、、、
作業Timer開始「今からスタート! 時間は有限だよ! さぁ、どこまで進められるかな?」
作業Timer終了「ふぅ、ここで一旦おしまい!ねぇ、ちょっと休憩しよー?」
休憩Time終了「よーし、頭もスッキリしたね! さぁ、次のセット開始!」
とかを大好きな声で応援されたら頑張れない人いないよね?っていうことで実装。
2.n時間経過アナウンス
名前の通りなのですが、1,2...時間経過毎にボイスでお知らせしてくれる機能です。
例えば、、、
「2時間突破! この勢いであともう少しだけ頑張ろう!」
「3時間経過… すごーい! ほんとに頑張ってるね」とか言われたら頑張れますよね。っていう。
これは別に意図して設計をした訳じゃないのですが、「あー疲れたぁぁ」って思っても「あともう少し頑張ろう!」的な事を言われたら無限に頑張れる、、ということで予定よりも長く勉強している事が増えていたりという。
これですが、一応気分によって使い分ける事ができるようにON/OFFを切り替えられるようにしています。
Timer CVをONにするとこの時間経過のアナウンスがONになる感じですね。
3.スランプ脱出支援
勉強やら仕事やらどうしてもスランプといか調子出ないなっていう問題ありますよね。バーンアウトもしばしば問題点としてあげらますし。
これは先ほどのControl PanelのOVERCLOCKをONにすると有効になります。
機能としては機能1で紹介したタイマーのCVを優先的に以下のようなボイスを優先して再生するようにします。(重みをつけて配列を操作します)
「ここまで頑張ってきたのに… やめちゃうの? それ、ほんとにいいの?」
「ちょっと疲れちゃった? でもね、ここを乗り越えたら絶対成長できるよ!ファイト!」
とか言われたら気持ちもリセットできますよね。
私はクソ雑魚メンタルなので気持ちの波は大荒れなのですがこれに何度救われたことか()
4.作業時間をグラフ化、複数デバイス同期
限界オタク的な話をしまくってさすがにアレなのでここからは技術的な話をしようかなと。
繰り返し画像になってしまうのですがこのように過去のデータを視覚化できます。

(ん??APPあんまり使ってないじゃん?といううのはスルーで。実習で時間がないのです、、、)
データはFireBaseに保存していますのでデバイスを跨いでもデータを同期できます。
またこのデータは1分毎に自動的に同期しますのでほぼリアルタイムです。デバイスがオフラインや何らかの原因で通信が出来ない場合はクライアント側で待機させ、復帰したら書き込みます。
この時更新の値が大きい場合は書き込みを中止するようにしてみました(記録が下がる事を防止するため)
これによりデバイスを跨いでもデータを同期できたり、過去30日分のデータを視覚化できるようにしています
5.Google Todo,CalendarとAPI経由で同期
そのままの意味ですね。任意のGoogle アカウント(起動時にログインを要求)のTodoとCalendarとAPIで相互通信出来るようにしてアプリ上から追加、編集、削除を出来るようにしました。
TodoはTodoからタイトル、締切を取得し表示します。TodayはCalendarと同期でタイトル、開始時間、場所を取得します。
こちらにもタスクやカレンダーの内容に応じてボイスの再生機能を実装しています。
機能紹介おわり。
デモ動画は秘密です。
権利的な問題は当たり前の話なのですが、声を独り占めしたいので←ゴメンナサイ
工夫とかの話
さすがにここまでだと限界オタクのどうしようもない話になってしまうので工夫点とかのお話です。
1.当たり前を考えてみる。
まずは大きな工夫点です。タスク管理Appは世の中に多く存在していますし多くのものは無料、そして高機能です。
ですがあれらのAppは効率とある種の強制力があると思います。全体として優しくユーザーの背中を押してくれるというのをコンセプトにしています。中々この手の思想のアプリは無いと思いますのでこの世界観はアプリの最大のこだわりと言っていいものだと思います。
2.確実に重複しないボイスの再生ロジック
ボイスがコアのAppですからこのロジックは結構こだわりです。正しい使い方かどうかはさておき。FireStoreでデバイス間をまたいで再生済みのボイスを管理、制御しています。
カテゴリーでFireStoreに問い合わせ、状態を取得
例[workTimerStart1.wav,workTimerStart2.wav,workTimerStart3.wav]
この配列からランダムに選び再生します
例:workTimerStart1.wavが選ばれ操作後の配列
[workTimerStart2.wav,workTimerStart3.wav]
配列が空になるまではこのようにランダムで取得していきます。
もし配列が空であれば、FireStoreの配列をリセットします。
こうすることでほぼ確実に連続で同じボイスが流れえることを制御しています。
jsonでの管理
ボイスデータのファイル情報はJSONで管理しています。
システムで認識させるcategory_id.wav
人間が見て分かるようにセリフ.wav 、カテゴリー情報ファイル配置を記載しています。
こんな感じ。
{
"workTimerStart": [
{ "file": "workTimerStart1.wav", "caption": "秘密です!", "dir": "/start/" },
{ "file": "workTimerStart2.wav", "caption": "秘密です!", "dir": "/start/" }
]
}
ハードコーディングしていませんので、ボイスデータを追加する際にはファイルを正しいフォルダに置き、Jsonを書き換えることで全体に適用します
(FireStoreも自動で更新されます)
APIの利用
これは工夫というかそうなったという事が大きいですがGoogle APIを組み込んでおりAppが孤島になりません。
アプリで独自のタスクなどを持たせると使わなくなってしまうかな?と思ったので大変でしたがAPIを選択してみました。
個人的によく使うGoogle TodoとCalendarを組み込むことでApp上でいつものデータにアクセスできます。
Doneを押すとタスクが完了になり褒めてもらえます←
ADDを押すとタスクを追加でき、締め切り順でソートされる感じですね
TodayはCalendarから今日の予定を持ってきます。
タイトル、開始時間、場所を表示する感じですね。
(これはまだ動作が怪しいのでBeta段階)
CSS
全体的にガラス&ダークテーマを意識したUIにしています。
CSSでここまで力を入れることはないので頑張りました←
これもCSS変数で管理していて機能を追加しても同じテーマを適用できるようにしています。
終わりに
んじゃ結局なにがいいたいんだい?といことですが
個人開発は自由だ。
これは商用では多分存在しないというか不可能な要素が1つあります。
それはですね、名前呼び機能。(あおいくん!がんばれ!....)とかを言ってもらえる感じですね、、、
おい。そこ。きもいとか言うな。
まぁ引かないで見て欲しいのですが、これが個人開発した理由です。
先述したように推しから頂いたボイスをどうしたら一番自分の為に使えるかな?って考えた結果がこれです。
ですのでスタックも妥協してませんし、APIも取りいれてあります。また拡張可能な設計にこだわりました。
憧れの方から吹き込んで頂いた宝物を動作させるプログラムが適当だったら顔がないですからね。
この手の開発を最後まで完走できたのは大きな誇りですし、情報やっていてよかったなと思えた開発でした。
あとね、声優さんから使ってくれて嬉しい!的なことも言われちゃいましたし、リアイベでも
「あっ!プログラマーの!」とかも言って頂いて技術者としても、ファンとしても特別な開発になりました。
てなわけておしまい。
最後までお読み頂きありがとうございました。

