「イカランプタイマー」を開発しました
指定したセリフをVOICEVOXが一定間隔で読み上げるAndroidアプリ「イカランプタイマー」を開発しました
指定したセリフをVOICEVOXが一定間隔で読み上げるインターバルタイマーを、ポートフォリオ用に開発しました。
個人的な話ではありますが、現在「スプラトゥーン」というゲームにハマっています。このゲームがもっと上手くなりたくて、「ずんだもん」や「四国めたん」をはじめとするVOICEVOXのキャラクターたちに、試合中につい忘れてしまうことを繰り返し喋ってほしいなあと思い、自分用に開発しました。
https://github.com/ctsetera/Ikaranpu
技術的な話としては、業務で触れる機会のなかったJetpack Composeに入門しつつ、これまた業務では意識したことのなかったClean Architectureを意識して設計しました。
VOICEVOX APIとの通信はRetrofitを、ローカルキャッシュへの保存はRoomを使用しました。
また、リファクタリングについてはCodexに支援してもらいました。
ポートフォリオとしての側面が強かったため、「最初はとにかくシンプルな構成で」を意識して実装していきました。故に、これを執筆している現段階では使いにくさも目立つアプリではありますが、「アプリとしてちゃんと使える」状態まで持っていけたのは良かったですね。社会人になってからプライベートでここまでプロジェクトを作り込むようなことってなかったですし。
また、月並みな感想にはなりますが、業務で触れる機会のなかった設計手法やライブラリに触れることができて、良い勉強になりました。
Jetpack Composeを初めて使用したのですが、XMLとにらめっこしなくてもサクサク画面ができあがっていく感触・リストの作りやすさ・多機能なプレビュー表示・リアクティブなUIなど、、、どれも感動モノでした。
Clean Architectureは、そのまま採用したというわけではなく、これをベースにAndroidアプリプロジェクトに最適化した「Modern App Architecture」を自分なりに解釈して実践しました。
https://developer.android.com/topic/architecture?hl=ja
domain層はアプリの中核、data層はデータのやり取り、ui層は画面表示という具合に分けています。責務が分離されているのが気持ち良いですね。
単純な責務の分離以外にも、Repositoryのインターフェースを domain層に置き、その実装をdata層に置く手法を取り入れています。(依存関係逆転の原則:DIP、と言うらしい。)
これにより、domain層が data層に依存しない「内側を向いた依存関係」が実現し、必然的にdomain層がアプリの中核になります。
この設計手法はどんなアプリケーションでも有効だなと思います。仕事でも取り入れていきたいですね。
イカランプを確認する癖を付けたいと考えている初心者~中級者は自分以外にもいると思います。
その証拠に、YouTubeには、ずんだもんによる「イカランプタイマー」が既に公開されており、この記事を執筆している時点で3万回以上再生されています。
※ この動画からインスピレーションを得てアプリを作成しました。動画制作者様、ありがとうございます!
自分用に作ったこのアプリですが、それなりに需要があるかもしれないと思い、完成したらPlayストアで公開しようと考えていたのですが、、、Playストアでアプリを公開すると、開発者の情報として本名・住所・電話番号などが公開されてしまうようで、なくなく諦めました。。。
Playストアで公開することはできませんでしたが、GitHubからこのアプリのAPKファイルをダウンロードできるようにはしているので、興味のある方は覗いてみてください。