MacOSの作業状況記録アプリつくった【OSS】

## はじめに
こんにちは。現在ニート生活を満喫しているあちらて([@derorian41](https://x.com/derorian41))です。

## 開発ものがたり

ニートになってはや6ヶ月が経とうとしている
はじめは良しあれやるぞこれやるぞと息巻いていたが気づくとこんな季節に…

一体俺はなにを…！？
毎日寝て飯を食って、たまーーーにコードを書いて寝て飯を食って起きて、たまーーーにランニングして、気づけば6ヶ月が経とうとしている…
こんなはずでは・・・

### そうだ、作業時間を可視化しよう！

このままではいけない。まずは自分の行動を可視化して、どれだけサボっているのか（もとい、どれだけ頑張っているのか）を把握しようと思い立ちました。

そこで作ったのが「Active App Monitor」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66158/c4a09b13-1e22-5045-8879-604a951752e6.png)


## おや？
ちょっと待って
え！？全然クソじゃなくね？めちゃくちゃ役立てようとして作ってるやん！

って思ってませんか？
いやそうなんですよね。
でもちょっと待っていただきたい。わたし自身がニートなのでそのバランスを取るために作り出すアプリくらいはまあまあ役に立って良くないですか？うんこのそばにはだいたいトイレットペーパーがあるように、ニートの近くに役立つアプリがあってもいいじゃないですか。

というわけでやっちゃいます☆


## どんなアプリ？

- MacOSのメニューバーに常駐して、今開いているアプリを記録
- VSCodeやChromeなど、開発関連のアプリの使用時間を追跡
- Chromeの場合は、開いているURLも記録（GitHub見てるのか、YouTubeで時間を溶かしているのか分かる！）
- キーボードやマウスの操作も検知して、本当に作業してるのかサボってるのかも分かる！
- 日別で作業時間をレポート

## 技術的な特徴

- Flutter for Desktop で開発
- Swift で MacOS のネイティブ機能を呼び出し
- JSON でデータを保存
- Clean Architecture っぽい設計

## 主な機能

### メニューバーに常駐

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66158/37c30efa-aa58-4a14-96f1-b5761f985bc6.png)


メニューバーに常駐して、裏で黙々と記録を続けます。
アプリを閉じても記録は継続されます。

### 作業時間の可視化

- アプリごとの使用時間
- Chromeで見ていたサイトの内訳

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66158/46401d09-703b-5ab1-270f-cac1d6d4b4e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66158/bc259e84-df26-31fe-2eb8-c4f4fcfe6918.png)

### 監視対象アプリの設定

- 監視したいアプリを自由に追加可能
- Chromeの場合は、監視したいドメインも設定可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66158/ed3cf131-1ac7-553c-3ffc-d7ce78093867.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66158/8790bc7b-6219-08ff-81f7-79e37181a186.png)

## 開発で躓いたポイント

今回初めてMacOSアプリを開発しましたが、SwiftでMacOS系の機能を実装するのは最初は不安でした。
実際やってみると...ちょっと大変でした（笑）

特に大きな壁となったのが以下のポイント：

### ChromeのURL取得問題

アプリの機能の1つとして、Chromeで開いているURLを取得して記録する機能を実装しようとしました。
しかし、ここで思わぬ落とし穴が...

#### AppleScriptでの解決策

調査の結果、AppleScriptを使えば取得できることが分かりました：

```swift
let script = """
tell application "Google Chrome"
    if not (exists front window) then
        return "No active window"
    else
        return URL of active tab of front window
    end if
end tell
"""
```

### Sandbox問題との戦い

何度実行しても`AppleScript Error`が出続ける...

調べに調べた結果、MacOSのSandbox環境の制限に引っかかっていることが判明！

#### 解決方法

**重要**: Xcodeの設定変更
- Xcodeで`macos/Runner.xcworkspace`を開く
- 左側のナビゲーターから`Runner`を選択
- Signingの設定から`App Sandbox`を削除

これでようやく動くように！

## 使ってみての感想

このアプリを使い始めて分かったこと：

- 思ってたより全然コード書いてない！
- YouTubeとTikTokで無駄に時間を溶かしている...
- 午前中の作業効率が良い
- たまに深夜にやる気が出る

## オープンソースです！

このアプリはオープンソースで公開しています。
MacOSの方はダウンロードして利用可能なので、よかったら使ってみてください！

https://github.com/oh-yeah-sea-kit2/active_app_monitor/releases

## GitHubレポジトリ
スターをしてくださると泣いて喜びます

https://github.com/oh-yeah-sea-kit2/active_app_monitor

## KANSOU

このアプリを作って分かったこと：
- アプリ開発やっぱたのしー
- Flutter for Desktop の開発体験は結構良い
- Swift との連携は少し面倒だけど、できることは多い

まだまだ改善の余地はありますが、とりあえず自分の作業時間を把握するという目的は達成できました。
これを機に、もっと生産的な生活を送れるようになりたいと思います！

## 宣伝

ここまで読んでいただきありがとうございます。

わたしは「網膜色素変性症」という進行性の難病を抱えながらエンジニアをしています。この病気は、**視野が徐々に狭くなり、夜盲や視力が極端に低下する**のが特徴で、進行すると**視力を失う可能性**もあります。

現状ではなんとか開発を続けられていますが、数年後には満足にコードを書くことができなくなる恐れも…。

しかし、再生医療の進歩によって治療の可能性が見えてきました。現在、**iPS細胞による網膜再生医療の実用化**のクラウドファンディングが行われています。この取り組みが成功すれば、同じ病気で悩む多くの人にとって大きな希望となるはずです。

https://readyfor.jp/projects/kobe-eye-center-cf2024?sns_share_token=dde368a890bce7db5447&utm_source=pj_share_url&utm_medium=social

もし少しでもご興味を持っていただけて、見てもらえるとうれしいです🙏


## ここまで読んでくれた方へ

以上、ニートがMacOSアプリの作業状況記録アプリをつくった話でした。
ここまで読んでくださりありがとうございます。

いいねやコメント、Twitterでの共有などをしてくださるととてーもうれしいです。

良かったら、ツイッター ([derorian41](https://x.com/derorian41))フォローしてやってください。