Slide 1

Slide 1 text

夢を⾒つける ⾃⼰分析アプリ My dog became 6 years today Mariko 1 Chapter One Kotlin LT #2 Feb 26th, 2025

Slide 2

Slide 2 text

2020 富山県立大学卒業 電子情報工学科 2020 (株)ソラマス・ソフトウェア・サービス  システムエンジニア ● 保険システムの改修・運用をしてました 2022 Qburst Technologies Japan プロジェクトマネージャー勤務 ●日本支社でバイリンガルPMとして インドオフショア メンバーの管理をしていました 2024 Hamigua株式会社 代表取締役 ● 業務委託で大手通信会社にて ITプロジェクトマネー ジャーとして案件を受けています 現在の取り組み : YouTube依存症に悩む人を対象に、視聴時間を可視化し、自己管 理能力や長期的な視点を育むことで、意識的な行動選択を支援す るプロジェクト「Chapter One」を立ち上げ、実行中 2 Tomoyo Hirai

Slide 3

Slide 3 text

前回のあらすじ

Slide 4

Slide 4 text

タイムライン #1 4 6/17 プランコンサルティング 開始 アプリ開発始める プログラミングスクール に通う LTやアクセラレーター に参加する 2/14 • クラウドワークスでチューターを探す (7回くらい受けて3萬円) • ChatGPTの方が正確なアドバイスをくれる事に気付く • Android StudioでFirebaseでGoogleログインを実装する • (Sha-1 Fingerprint追加) • UsageStatsManagerを使ってアプリのログを取得してみる • アプリ面の開発というよりかは、精神面やアクセラレータープログラム 時間の使い方やブレストとして利用していました • 宅建の勉強の向き合い方が一番勉強になりました • TechMentor隔週プランに1カ月だけ通う(月39,800円) • プログラミングのスキルはめっちゃついた • 次回は10万円の出費になりそうになりそう:   入会金5万円、隔週メンタリングプラン 月39,800 (税込43,780) • アウトプットしたい意欲が出てくる • システムエンジニアに助けてほしい(他力本願) • 一人でプログラミングするのが嫌になってくる 9/2 12/17 LT#1

Slide 5

Slide 5 text

私のプログラミング人生遍歴 学生の頃 ● Javaで無人uberを走らせたときのシミュレーションアプリを3人一組で作らされた ● Unityでシューティングゲームをサイトを見て作ってみる 基本的に作りたいものベースで、言語はそれに合ったのを覚えるベースでした 社会人 ● ノーコードBubbleと出会い、ウェブアプリを作りAndroidアプリをここで 初めてリリースしてみる ● React.js Node.jsを研修で触らされる まとめ なんだかんだ、脆弱エンジニア経験の中、Javaが一番長くやっていました プログラミングって一人ぼっちでの作業が強く外交的な私には向いていないと逃げて PMになる 5

Slide 6

Slide 6 text

ソースコード 6 4つのクラスでできている MainActivity (View: ユーザーインターフェースを提供 ) MainViewModel (ViewModel: 状態の管理・ビジネスロジック ) LogEventWorker (Worker: バックグラウンド処理 ) MyApp (Compose UI: 実際の画面描画 )

Slide 7

Slide 7 text

MVVM アーキテクチャ MVVM の流れ 1. ユーザー操作( View): ○ ユーザーがボタンをクリックやスイッチを操作すると、イベントが発生します。 2. イベント通知( View → ViewModel): ○ View は、操作の内容を ViewModel に伝えます。 ○ 例: 「サインインボタンを押した」というイベントを ViewModel に通知。 3. ビジネスロジック実行( ViewModel → Model): ○ ViewModel は、操作内容に応じたビジネスロジックを Model に実行させます。 ○ 例: Google サインインのリクエストを Model に依頼。 4. データ取得・状態更新( Model → ViewModel): ○ Model は、処理結果を ViewModel に返します。 ○ ViewModel は、この結果を UI 表示に適した形式に変換して保持します。 5. UI 更新(ViewModel → View): ○ ViewModel は、状態の変化を通知します。 ○ View は、その変化に応じて画面を更新します。 7

Slide 8

Slide 8 text

アプリ構造 8

Slide 9

Slide 9 text

MainActivity(View /UI + ユーザー操作 ) このコードは、Android アプリケーションの主要な画面を定義する MainActivity の内容です。 1. Google サインイン/サインアウト管理 ○ Google アカウントを使用したサインイン /サインアウトの処理を行います。 ○ サインイン情報を取得し、アプリ内で使用できる状態に保持します。 2. トラッキング管理 ○ ユーザーの YouTube 使用状況を Google カレンダーに記録するタスクをスケジュールまたは停止します。 ○ トラッキングの有効/無効を切り替えるインターフェースを提供します。 3. アプリのライフサイクル管理 ○ アクティビティのライフサイクルに応じて、必要な初期化処理やリソースの解放を行います。 ● 責務: ○ アプリのライフサイクルを管理。 ○ UI を初期化して、MyApp.kt に必要なデータやイベントハンドラを渡す。 ○ ViewModel を監視し、状態が変わった際に UI を再描画。 ● 主な処理: ○ Google サインインの初期化 (setupGoogleSignIn)。 ○ サインイン/サインアウト操作 (signIn, signOut)。 ○ トラッキング状態の初期化と管理。 9

Slide 10

Slide 10 text

LogEventWorker(Model / データ処理 + API) Android の WorkManager を利用して、バックグラウンドで YouTube アプリの使用情報を取得し、 その使用時間を Google カレンダーに記録する処理を行います。 このコードの目的 1. YouTube 使用データの収集: ○ 過去15分間の YouTube 使用セッションを収集します。 2. Google カレンダーへの記録: ○ 収集した使用データを Google カレンダーに挿入し、ユーザーが確認できるようにします。 3. エラー処理と再試行: ○ カレンダーへの挿入に失敗した場合は、再試行をスケジュールします。 WorkManager を使って15分ごとに LogEventWorker を実行するように設定されています ※アプリが閉じている場合やデバイスが再起動した後でも、指定されたタスクを確実に実行 ● 責務: ○ バックグラウンドで YouTube 使用ログを記録。 ○ 使用状況データを取得して、 Google カレンダーに送信。 ● 主な処理: ○ UsageStatsManager を使って YouTube 使用セッションを取得。 ○ Google カレンダー API を使用して、イベントとして記録。 ○ 作業失敗時には再試行。 10

Slide 11

Slide 11 text

MyApp.kt(View/UI + ユーザー操作 ) MyApp.kt は、Jetpack Compose を使ってアプリの UI を定義する Kotlin ファイルです。 このファイルでは、 MyApp という関数型のコンポーネントが定義されています。 MyApp 関数は、アプリの特定の画面やその一部を構成する UI を記述したものです。 ● 責務: ○ UI を定義し、ユーザーとのインターフェースを提供。 ○ ViewModel から渡されたデータを表示し、ユーザー操作を ViewModel に通知。 ● 主な構成: ○ アカウント情報の表示(名前、メールアドレス)。 ○ ボタンやスイッチによる操作(サインイン/サインアウト、トラッキング切り替え)。 11

Slide 12

Slide 12 text

MainViewModel(ViewModel/状態管理 + ロジッ ク) このコードが提供する機能 ● 状態管理: ○ サインイン情報やトラッキング設定を保持し、 Compose UI と連動します。 ● 永続性: ○ SharedPreferences (トグル)を使って設定やアカウント情報を保存し、アプリの再起動後も状態を維持。 ● バックグラウンド処理 : ○ WorkManager を使って、YouTube の使用ログを Google カレンダーに記録するタスクを効率的にスケジュール 12

Slide 13

Slide 13 text

プログラミングスクールに通う 【平井 知世さん】技術サポート・個別カリキュラム 疑問点 ● Googleカレンダーでリアルタイムでシンクするか(ユーザースタンプ) →できないが、15分毎に共有するライブラリを利用する ● PlayStoreで出せるかどうか(アプリ規約確認) →UIをしっかりしないと、審査通らなさそう 出来るようになったこと ● youtubeの時刻タイムスタンプは取得/入力できるようになった。 ● Toggle Sharedpreference設定(toggleの設定保持) 問題点 ● 二つ以上のyoutubeログがあった際に、一番最新のしか現状挿入できていない ● 根本的なところは出来ているが、細々としたバグが残っている 13

Slide 14

Slide 14 text

報告フォーマット バグ報告 【行った操作】 【想定する挙動と実際の挙動の差異】 【そのとき出力されたデバッグログ】 進捗報告 日時:8月30日 作業時間:3.5h 作業時間帯:17:30 - 21:30(休憩0.5h) 作業内容: ・[0%→100%] Toggle Sharedpreference設定(toggleの設定保持)(0.2h) ・[0%→20%] WorkManager実装15分ごとに稼働できていっぽいが、ログおかしい(1.3h)   spreadsheetのURLなど 14

Slide 15

Slide 15 text

振り返り 反省点 ● プログラミング出来ると自分を過信しすぎた且つケチな部分が出てしまった ● ChatGPTの言われるままにコーディングして、 途中分からないままコードも理解しようとしないままやりすぎてしまっていた ● 単純に舐めていた -> 基本物事舐めプ人間なので反省 ● 長期目標、プランを作らずにダラダラ開発してしまっていた 改善策 ● 100日行動目標を作る(スケジュールがざっくりだと脳が動かない) ● アプリ開発は集中して行う(何してったけを振り返る時間のほうが長い) まとめ メリハリの大事さに気づく Firebaseのユーザー認証など実際聞いていただけで実際に触る機会がなかったが知ることが出来た でもそれよりも辛いと思う時間の方が多かったな、、 kotlinがマイナー言語で相談相手/開発者が見当たらないので、メジャーな言語で開発した方が楽しい 15

Slide 16

Slide 16 text

今後の展望 #1 もうKotlinプログラミングはコリゴリ 自分では無理!(心の声) アプリは何としてでも完成させたいので恐らく外注するでしょう もしくは、三日間Kotlinアプリ開発合宿的なのがあれば、死ぬほど嬉しい 付きっ切りで、合間合間でやる アプリ外注/Kotlin詳しい方お助けください! また、アウトプットの機会を増やしていきたい 成仏させてあげたい 16

Slide 17

Slide 17 text

Kotlin LT #2 ~自分を好きになりたい~

Slide 18

Slide 18 text

タイムライン #2 18 アプリ外注を決意 文系目線でアプリコンセプト /企画を頑張る 転職活動/案件探し 外交的になる自分 1/5 • 外注先を探すために、比較シートを作る ※ココナラ、クラウドワークス、Lancersの中で選びました 値段:69,630円 • やはり行間を読んでくれる日本人で頼むことの安心感は大事 • 外注しても、結局自分である程度 KTやコードレビューはやらないといけないことは 変わらない ○ そのKTの時間や、外部調整が嫌なら自分でやった方が良い    単発でやると、それは何回も行うことになるので、       長期的に付き合う事を入れて人選びをしたほうが楽ではある        単価がどうだろうか遠慮はよくない • 理系目線で現実的にどうしていきたいのかを語っていたが、 コンセプトを伝えるところが出来ていなかった • 資料作り、コンセプト作りに注力するようになっていく ○ 自主的にイベントを企画し、思いを伝える • アウトプットしたい意欲が出てくる • 現状の仕事だとプロジェクト企画・計画に関われない もっと素敵な環境と魅力的な人に出会えることを願う。 明けない夜はないですから。 1/24, 2/15 2/25

Slide 19

Slide 19 text

Lancersでの修正内容 Release note(2025年1月) 1.Google登録修正 現在利用しているAPIが2025年内廃棄され予定なので、( GoogleSignInOption)から 最新のGoogle側推薦API(Credential Manager)へ変更 ComplieSDK =34 -> 35に変更しないと変更できないので変更、またそれに付随するライブラリをインポートした。 アプリ上にToast messageを表示できるように変更 ※Sign inに失敗した時など getlastsignedinaccount -> credential managerと同じのメソッドがないため、それに不随する修正各々 ユーザーアカウント削除のところ、前はメモリ削除していたが現在は sharedpreferencesの情報を削除している 19

Slide 20

Slide 20 text

Lancersでの修正内容 #2 2.Youtube履歴重複問題の修正 この問題発生した原因はこれです: 「If a package has multiple activities, this event is reported for each activity that moves to foreground. This event is corresponding to Activity.onResume() of the activity's lifecycle.」 ※参考URL Activity (Youtube)側の画面遷移する時eventが呼ばれますので、 Youtubeを利用するとき「ACTIVITY_RESUMED(フォアグラウンド)」が数回呼ばれるのは当たり前です。 精確なYouTube利用履歴の取得は難しいよう (実現できるAPIが存在しない模様) ただ、その中で出来る変更として、 Activityのライフスタイル: Actuivity paused (バックグラウンド)-> Activity_stopped で取得するよう変更した。 20

Slide 21

Slide 21 text

SmarterTime 元々の発想は、 このようなアプリのgoogleカレンダー版を作りたい https://blog.smartertime.com/ アプリの問題として、ローカルアプリなのであまり使わない。 なので、日頃予定管理で使うgoogle calendarに Youtubeログを挿入する仕組みにしました 21 Ref: https://k-tai.watch.impress.co.jp/docs/column/teppan/1220993.html

Slide 22

Slide 22 text

SmarterTime #2 ただ、workmanagerではなく フォアグラウンド サービスを 使っている事に気付きました。 今後はフォアグラウンドサービスを使って実装してみたい。 アルゴリズムが謎! 22

Slide 23

Slide 23 text

外注したことでの今回の学び 外国人とのやりとりは、 PMとしてのコミュニケーションのとり方の勉強になりました ちゃんと定義しないと 聞かないで好き勝手理解され開発されることがある 日本人での空気を読むがないので、正確にコミュニケーションを取らないといけない 5秒以内に発生しているステータスを無視するようにした: Activity遷移により記入された eventがpairとして揃えるので(写真をご参考ください)一応 5sという時間を設定し、 5s以内の場合 重複eventを判定してsessionに記入しないで次のイベントを確認する仕様に変更 画面の要らない履歴☞ は削除されるようにした youtubeとtiktok ライフスタイルの処理が違う可能性があるので 判定条件は一概に判断できない 23

Slide 24

Slide 24 text

今まで使用した外注サイトの違い クラウドワークス: 一番好き ランサーズ: どちらかというと外注者(フリーランサー)に 優しい仕様になっていると感じた。 ココナラ: 敷居が低いので、初心者におすすめ カスタマイズにはあまり対応していない印象 自分から案件取りに行くという姿勢も低い 24

Slide 25

Slide 25 text

Kotlinアプリ開発ハッカソン アウトプットの場を増やしたいと思い アプリを知ってもらうかつ、開発を手伝ってもらうためにイベントを開催します。 Compassでイベントをするのは、初めてです。 25 Ref: https://hamigua.connpass.com/event/343647/

Slide 26

Slide 26 text

まとめ #2 人に依頼するときは、後でもめ事が大変なので最初にきちんと定義することは 当たり前だが大切  最初にやらないと、もっと面倒なことになるので、、 やはりプログラミング向きではないので、自分が咲ける場所で頑張りたい 駄目な自分を見せ続ける勇気が大事 何時まで経っても完璧にはならないので、あるタイミングで見せていった方が強い 英語学習も同じ 実際にアプリ開発前にアプリ開発専門家に色々聞いておけばよかったと反省。 また、アウトプットの機会を増やしていきたい 成仏させてあげたい 26

Slide 27

Slide 27 text

今後の展望 #2 アプリの精度は65%くらいになりました。 今後挙げていくため、また外注するかは若干迷う。 引き続きアウトプットを頑張ります。 27