Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Chapter One Kotlin LT #2 Feb 26th, 2025

Tomoyo H.
February 25, 2025
1

Chapter One Kotlin LT #2 Feb 26th, 2025

Tomoyo H.

February 25, 2025
Tweet

Transcript

  1. 2020 富山県立大学卒業 電子情報工学科 2020 (株)ソラマス・ソフトウェア・サービス  システムエンジニア • 保険システムの改修・運用をしてました 2022 Qburst

    Technologies Japan プロジェクトマネージャー勤務 •日本支社でバイリンガルPMとして インドオフショア メンバーの管理をしていました 2024 Hamigua株式会社 代表取締役 • 業務委託で大手通信会社にて ITプロジェクトマネー ジャーとして案件を受けています 現在の取り組み : YouTube依存症に悩む人を対象に、視聴時間を可視化し、自己管 理能力や長期的な視点を育むことで、意識的な行動選択を支援す るプロジェクト「Chapter One」を立ち上げ、実行中 2 Tomoyo Hirai
  2. タイムライン #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
  3. 私のプログラミング人生遍歴 学生の頃 • Javaで無人uberを走らせたときのシミュレーションアプリを3人一組で作らされた • Unityでシューティングゲームをサイトを見て作ってみる 基本的に作りたいものベースで、言語はそれに合ったのを覚えるベースでした 社会人 • ノーコードBubbleと出会い、ウェブアプリを作りAndroidアプリをここで

    初めてリリースしてみる • React.js Node.jsを研修で触らされる まとめ なんだかんだ、脆弱エンジニア経験の中、Javaが一番長くやっていました プログラミングって一人ぼっちでの作業が強く外交的な私には向いていないと逃げて PMになる 5
  4. 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
  5. MainActivity(View /UI + ユーザー操作 ) このコードは、Android アプリケーションの主要な画面を定義する MainActivity の内容です。 1.

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

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

    UI と連動します。 • 永続性: ◦ SharedPreferences (トグル)を使って設定やアカウント情報を保存し、アプリの再起動後も状態を維持。 • バックグラウンド処理 : ◦ WorkManager を使って、YouTube の使用ログを Google カレンダーに記録するタスクを効率的にスケジュール 12
  9. プログラミングスクールに通う 【平井 知世さん】技術サポート・個別カリキュラム 疑問点 • Googleカレンダーでリアルタイムでシンクするか(ユーザースタンプ) →できないが、15分毎に共有するライブラリを利用する • PlayStoreで出せるかどうか(アプリ規約確認) →UIをしっかりしないと、審査通らなさそう

    出来るようになったこと • youtubeの時刻タイムスタンプは取得/入力できるようになった。 • Toggle Sharedpreference設定(toggleの設定保持) 問題点 • 二つ以上のyoutubeログがあった際に、一番最新のしか現状挿入できていない • 根本的なところは出来ているが、細々としたバグが残っている 13
  10. 報告フォーマット バグ報告 【行った操作】 【想定する挙動と実際の挙動の差異】 【そのとき出力されたデバッグログ】 進捗報告 日時: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
  11. 振り返り 反省点 • プログラミング出来ると自分を過信しすぎた且つケチな部分が出てしまった • ChatGPTの言われるままにコーディングして、 途中分からないままコードも理解しようとしないままやりすぎてしまっていた • 単純に舐めていた ->

    基本物事舐めプ人間なので反省 • 長期目標、プランを作らずにダラダラ開発してしまっていた 改善策 • 100日行動目標を作る(スケジュールがざっくりだと脳が動かない) • アプリ開発は集中して行う(何してったけを振り返る時間のほうが長い) まとめ メリハリの大事さに気づく Firebaseのユーザー認証など実際聞いていただけで実際に触る機会がなかったが知ることが出来た でもそれよりも辛いと思う時間の方が多かったな、、 kotlinがマイナー言語で相談相手/開発者が見当たらないので、メジャーな言語で開発した方が楽しい 15
  12. タイムライン #2 18 アプリ外注を決意 文系目線でアプリコンセプト /企画を頑張る 転職活動/案件探し 外交的になる自分 1/5 • 外注先を探すために、比較シートを作る

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