タイムスケジュール管理ツールの作成(その1)

# 背景
日常生活では、家事や勉強、就職活動などやることが多いです。
私も大学1~3年生のころ、大学の課題やアルバイトによって本当にやりたいこと(資格勉強やAtcoderなど)や優先順位の変動が起きましした。現在は就職活動の時間とやりたいことの時間を確保することを心がけています。今回作成するツールはあくまでも<b>自分専用です</b>。
そこで、タスク管理と25分作業して5分休憩するポモドーロテクニックを組み合わせたツールを作成しました。

# 使用技術
使用技術は以下の通りです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/7788645d-6bf8-0f5f-1c1e-31859c3578ef.png"   width="500">

1. React上でタスクを書き込む
1. Flaskにタスクを送り、Geminiに送る
1. Geminiでタスクの並び替えと日時設定
1. タスク内容を書き込む
1. React上でタスクを表示
1. Google Calendarにタスクを登録

# 製作段階
1. プロンプトエンジニアリング ← ここ
1. 文字列処理
1. スプレッドシート書き込み
1. Google カレンダー登録
1. フロントエンド構築
    1. Flaskに送信
    1. 入力欄追加
1. バックエンド構築
    1. 1~4のプログラムの書き込み
    1. ポモドーロテクニックの適用
    1. フィードバック機能の追加


現在はフロントエンド構築を行っています。4. まではGoogle Colabを使用しています。

# 1. プロンプトエンジニアリング
まず、Chat-GPTとGeminiで思い通りの返答を取得する必要があります。そこで、プロンプトエンジニアリングといわれる、生成AIに文字で指示して目的の出力を生成させる手法を使用します。

## Geminiを使用したスケジュール管理
現時点では、タスクの日時指定を行っています。Geminiで並び替えがうまくいかない場合、データを作成して、ランダムフォレストで優先順位を決めます。


最初は以下のように入力しました。
```
#要求
スケジュール調整をしてください
#日付
#決まった時間

・朝ごはん→8:00~8:15
・朝の支度→7:30~8:00
・昼ごはん→12:30~13:00
・入浴→21:30~22:00
・晩御飯→20:30~21:00
・就寝時間→23:00~翌日6:00
・会議→14:00~15:00
・会議→16:00~17:00
・プロジェクト会議→18:45~20:00

#1日でやる内容
・Flutter勉強 1時間
・筋トレ 30分
・ゲーム 30分
・ピッチ資料作成 30分
特に「#1日でやる内容」の時間調整を箇条書きで提案してください
```

そうすると、以下のように出力されました。
```
時間調整提案
1. 朝の時間を活用する

朝ごはんを15分短縮して、7:45から8:00までにする。
朝の支度時間を10分短縮して、7:20から7:30までにする。
2. 昼ごはんの時間を短縮する

昼ごはんを30分短縮して、12:00から12:30までにする。
3. 夜の時間を調整する

入浴時間を15分短縮して、21:15から21:30までにする。
晩御飯を15分短縮して、20:15から20:30までにする。
就寝時間を15分早めて、22:45から23:00までにする。
4. 空いた時間にタスクを割り当てる

上記の調整により、合計1時間30分の空き時間ができます。

空き時間を使って、以下のタスクを割り当ててみましょう。

Flutter勉強：30分
筋トレ：30分
ゲーム：30分
ピッチ資料作成：30分
5. その他

会議2つをまとめて、1時間30分にする。
プロジェクト会議を15分短縮する。
上記はあくまでも一例です。

ご自身の状況に合わせて、調整してください。

参考情報

時間管理術大全: [無効な URL を削除しました]
時間術大全: [無効な URL を削除しました]
その他、何かご質問があればお気軽にお聞きください。
```

上記の結果では、しっかりと日程調整できていませんね。

次は以下のように変更して書き込みます。
・「#要求　スケジュール調整をしてください」を消す
・備考で「例えば・筋トレ→13:30~14:00、という感じでお願いします」を追加

前回は答えが曖昧だったため、最後に答えを入れました。
入力はこのようになりました。
```
#日付
#決まった時間

・朝ごはん→8:00~8:15
・朝の支度→7:30~8:00
・昼ごはん→12:30~13:00
・入浴→21:30~22:00
・晩御飯→20:30~21:00
・就寝時間→23:00~翌日6:00
・ノーコードコミュニティの会議→14:00~15:00
・ノーコードコミュニティの会議→16:00~17:00
・IMAKOHのプロジェクト会議→18:45~20:00

#1日でやる内容
・Flutter勉強 1時間
・筋トレ 30分
・ゲーム 30分
・ピッチ資料作成 30分
「#1日でやる内容」を行う時間帯をを箇条書きで割り当ててください
例えば・筋トレ→13:30~14:00、という感じでお願いします
```

そうすると、このように出力されました。
```
朝

朝ごはん：8:00~8:15
朝の支度：7:30~8:00
筋トレ：7:00~7:30
Flutter勉強：8:15~9:15
昼

昼ごはん：12:30~13:00
ゲーム：13:00~13:30
ピッチ資料作成：13:30~14:00
午後

ノーコードコミュニティの会議：14:00~15:00
ノーコードコミュニティの会議：16:00~17:00
IMAKOHのプロジェクト会議：18:45~20:00
夜

晩御飯：20:30~21:00
入浴：21:30~22:00
就寝時間：23:00~翌日6:00
その他

上記はあくまでも一例です。ご自身の状況に合わせて、調整してください。
空いた時間を使って、読書や趣味など、他の活動を行うこともできます。
参考情報

時間管理術大全: https://www.qidian.com/book/1028381749/
時間術大全: https://www.diamond.co.jp/book/9784478106112.html
その他、何かご質問があればお気軽にお聞きください。
```

上手く出力できました！次はGemini APIをたたいてGoogle Colabで日程調整してみます。

## Google Colab上でGeminiを使用
### APIキー発行
Open AI APIキーと同じように、GeminiでもAPIキーを発行できます。
まず、「google ai studio」にアクセスします。
URL: https://aistudio.google.com/app/prompts/new_chat?hl=ja

次に、サイドバーにある「Get API Key」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/3a29fc4a-d163-9f86-bab5-478ce49e303e.png)

「Create API key」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/05feb20e-d7ab-285c-cb0d-a9a53f8ed19f.png)

Google Cloudのプロジェクトを選択して、鍵を作ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/ddac3be1-35ca-082f-1c13-9e658452451c.png" width=50%>

APIキーをコピーしてメモしてください。

### プログラムの実行
最初に必要なライブラリをインポートします。
```Py
import pathlib
import google.generativeai as genai
from google.colab import userdata
import os
```
次に、使用したいディレクトリに移動します。
```Py
os.chdir('/content/drive/MyDrive/TimeManagement') #使いたいディレクトリに移動
print(os.getcwd()) #現在のディレクトリを表示
```

最後に、Geminiを使用します。以下のように記述すると実行できます。
```Py
genai.configure(api_key="発行されたAPIキー") #APIキーで生成AIを設定

# モデルを準備
def suggest_schedule():
  model = genai.GenerativeModel('gemini-pro') #AIモデルを選択

  prompt = """
  #日付#
  2024/3/22
  #決まった時間#
  ・起床時間→9:30
  ・朝の支度→9:30~10:00
  ・ノーコードミーティング→10:00~11:00
  ・昼ごはん→12:00~12:30
  ・晩御飯→19:00~19:30
  ・入浴→19:30~20:00
  ・就寝時間→23:30~翌日6:30

  #1日でやる内容#
  ・ブログ: 旅行 30分
  ・就活: 自己分析 30分
  ・開発: 日程調整作成 30分
  ・就活: インターン検索 30分
  「#1日でやる内容」を行う時間帯をを箇条書きで割り当ててください。
  例えば「- 筋トレ: リングフィット→13:30~14:00」、という感じでお願いします。

  #割り当てる時間帯#
  11:00以降

  """
  return model.generate_content(prompt).text #返答を出力

suggest_schedule()
```
プログラムを実行すると、以下のように出力されました。

```
- ブログ: 旅行 → 11:00~11:30\n- 就活: 自己分析 → 11:30~12:00\n- 開発: 日程調整作成 → 12:30~13:00\n- 就活: インターン検索 → 13:00~13:30
```
コンソール上で日程を出力することができました。次回は出力された文字を処理します。

# 感想とまとめ
今回、無事にやりたいこととやるべきことを日程調整できました。これだけでも日程調整できて満足しているが、Google Calendarの書き込みとバックエンド構築を行いたいです。なぜなら、Google Calendarでは、PC・スマホから予定を見ることができ、バックエンド・フレームワーク構築スキルを伸ばしたいからです。
日程調整まで生成AIが使え、Pythonで実行できたことがとてもうれしかったです。

# 参考サイト
・Gemini API URL:https://ai.google.dev/tutorials/ai-studio_quickstart?hl=ja
・Google AI Studio URL:https://aistudio.google.com/app/prompts/new_chat?hl=ja
・PythonでGeminiを使用「【Python】Geminiで遊んでみた！」 URL:https://qiita.com/masa1124/items/c008547c9e26f4820b8e