0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「お薬、何日分まで残ってますか?」「正直わからん」……とならないためのコードをM365Copilotに作ってもらった

0
Posted at

image.png

何これ?

これが知りたかったのー!ありがとうM365Copilot君!

何の記事?

今手元にある薬が何日まで持つかを病院で答えられなくて悲しくなったので、代わりに計算してくれるコードを、M365Copilot君に作ってもらった話を書きました。

誰向け? どんな役にたつ?

  • M365Copilotがどの程度のコードを書いてくれるのか気になる人
  • 個人的に使う小さなコードを代わりに書いてもらえると楽だが、コーディングに強い生成AIは使っていない人
  • iPhoneでPythonを実行して動かしたい人

作ったものとやったこと

M365Copilot君に「『今あるお薬、何日分まで残ってますか?』って聞かれた時に個数を入力したら計算してくれるコード書いて!」を投げて、出来上がったコードを、iPhoneアプリのiVimで動かして、即答できるようになりました!
やったー! 暗算ができなくてもテクノロジーで生きていける!

詳しいあらすじ

今現在、定期的に通院をしています。
で、毎日飲むお薬ももらっているので、朝晩と2回ずつ飲んでいくのですが、
診察が終わって次の通院日を決める際、必ず聞かれるのが

「今あるお薬、何日分まで残ってますか?」

……みんなこれって暗算して即答できるんですか??? 私は無理だょ……。
一応、スタッフさんも「あと何シート残ってますか?」とかヒントをくれます。
ただほら、シート+端数があるじゃないですか。
あと、残り数から日付を計算するって工程もあるじゃないですか。
その日付計算が絡む暗算がほんとに、できなくてですね……。

そこに加えて、私は下記のお薬カレンダーを使っています。

飲み忘れ防止兼、朝飲み忘れてたらすぐに気づいて追加を飲めるように対策です。
で、その曜日の分を飲み終わったら後ろに回す。半分位が空になったらケースに2錠ずつ補充する。
この、補充はいつでもOKにしつつ、空にはならない程度に補充を気に掛けるペースが自分には合っていました。
それをするようになって、その日のうちに飲み忘れに気づけたり、奇妙な個数のお薬が余ることがなくなったので、おそらく対策は成功しているはずです。
……い、一応言い訳をしておくと、飲み忘れに気づいたら気づいた時に飲んでいいよとは言ってもらえています(きいたんか)

ただそうすると、このお薬カレンダー+残りシート数……を足し算しなくてはいけないので、いよいよ残数がわからなくなってきます。
大体は1シートと少し……の状態で通院日になるので、本当に暗算力の問題だとは思うのですが……。

また、このお薬カレンダーに1錠ずつ薬をいれるために、シートを真ん中でハサミを入れる必要があります。
私は補充も毎日しっかり続けるのは苦手なズボラーなので、毎回ハサミを入れるのももちろん面倒くさいです。
その為、補充用に1錠ずつに切った薬を、更にお薬ケースに入れています。
こうすると、「そろそろ補充かー」……と気づいた時にパチパチと1錠ずつ詰めるだけの比較的楽しい(?)作業だけで済むのでなんとかやれています。
ハサミで切り分けるのも、お薬ケースが少なくなってきたり、たくさん切ってストックしておきたい──などの、気が向いた時にやるタスクとしているので、なんとかなっています。

──というわけで、私が「今あるお薬、何日分まで残ってますか?」に答えるためには、

  • お薬カレンダー内の数量
  • お薬ケース内の数量
  • 残ってるシート数x錠剤数

……を足し算して、2で割って、今日から指折りカレンダーを数えていくと出るわけです。無理!!!

計算をややこしくしているのは自分ではあるのですが、しかしこの方法でないと飲み忘れが平気で起こる上に、飲み忘れたか飲んでないかの判断もつかないことがままあるので、この方法は変えられないのです……。

そんなわけで、やりかたは変えられないが、困りごとは解決したい。
……という解決策を、M365Copilot君というテクノロジーに解決してもらうことにしました。

解決策を考えるフェーズ

  • Pythonを勉強中なので、Pythonで計算コードを書けばカレンダーとか計算を学ぶのにいい練習になるのではないか
  • スマホでサッと計算できて、計算結果がスクショで保存できると困らずに済む
  • シンプルに入出力ができればいいので、スマホでCLIに入力して実行位にしたい
  • そういえばiVimのターミナル機能でいけるじゃんPython
  • もはや世は生成AI時代なら、生成AIに動くコード書いてもらって、できたものから勉強すればいんでね?
  • でも、コーディング専門の生成AIとはお付き合いがないな……
  • けど、M365Copilot君もコードについても答えてくれるし、頼ってみようかな……

……という具合に、最初は自分の手を動かして……と考えていたものの、
「そんな暇はない!俺はコードの勉強じゃなくアドカレを今月はやりたいんだ!」……となったので、
もうM365Copilot君に投げることにしました。

使ったもの

M365Copilot コードを指示して書いてもらうものなので、生成AIなら多分なんでもよい
iPhone iVimを動かすのに必要
iVim iPhoneでCLIでPythonを動かす要員として。アンドロイドとアンドロイド内でPythonが動かせるものがあればそれでもよい

具体的な手順 ~私が暗算しなくてもいいようになるまで~

1. M365Copilot君になるべく具体的に指示を出す

最初に投げたのは下記テキスト。

Pythonで簡単な計算アプリを作りたいので、手伝ってほしい。
下記の仕様で動くアプリの要件というか、こんな感じなら使えそう……という仕様を提案してもらえないかな。

<アプリ仕様>
CLIでPythonファイルを実行して、回答を得るタイプのシンプルで、ファイル1つだけで済むもの。

<何を達成するアプリか>
今手元にある薬の数を入力すると「何月何日何曜日まで足ります」と返答してくれるアプリ。

<薬の増減条件や管理条件>
- 薬は1日に2回飲む。
- 1回に飲む量は1錠
- 薬の残り数の計算方法は、残りシートと、お薬ケース、お薬カレンダーに入れている数を合計する
- 1シートの錠剤の個数は14個
- お薬ケースの個数は端数なので数える式
- お薬カレンダー内の個数は1週間分なので14個

2. 書いてもらったコードを動かしてみて、フィードバックを行う

いい感じにやりたいことが伝わってそうだなー……という返事。
image.png

でも、最後のif文内が空というシンタックスエラーが出るやつを提出してくる。
ドジっ子か。linter使いなさい。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from datetime import date, timedelta

~~中略~~

if __name__ == "__main__":

なので、フィードバックをふわっと投げる。
image.png

すると、今度はメイン関数が入ってて動きそうなやつが返ってきた。linter入れたんかな。

if __name__ == "__main__":
    main()

実行すると下記表示に。
入出力できてる。よっしよし。

=== 薬の残数から最終服用日を計算(最小仕様) ===
残っているシート数(枚): 1
お薬ケース内の錠剤(個): 0
お薬カレンダー内の錠剤(個): 14

--- 計算結果 ---
合計残数:28錠
1日あたりの消費:2錠
計算開始日:2025-12-18 木
結果:2025-12-31 水 まで足ります。(最終服用日を含む)

……ただ、今日聞いてる時点で、明日の分から計算開始してほしいなーと思ったので、再度フィードバック。
image.png

要望通り修正してくれたけど、またメイン関数がいないやつを送ってくる。linter壊れた?
image.png

なので、シンプルに動かないよーと返す。
image.png

ほんとかなー……。
image.png

多分動かないぞまた。
image.png

エラー文と、Python3じゃなくてPythonで動かしてると送る。
image.png

メイン関数がいるやつが来ました。最終行はこっちで消したけども。
image.png

動いたので、感謝を伝えつつ、この聞き方でよかった?……をきいてみる。
image.png

定量的に、明示的に言ってもらえると悩まずに済むよ!……ということらしい。まぁ、納得の答えではある。

以下、回答。
動いたようでよかった!こちらこそ丁寧にフィードバックをくれて助かりました 🙌  
「Copilotへの投げ方(依頼の仕方)」は、**ちょっとした工夫**でかなり書きやすく・ズレなくなります。今回のやり取りを踏まえて、**受け取りやすい質問の仕方**を具体例とテンプレ付きでまとめました。

***

## 1) まず「何を達成したいか」を一言で

*   **良い例**:
    > 「手元の薬の残量から **何月何日何曜日まで足りるか** をCLIで計算したい」
*   **悪い例**:
    > 「Pythonでなんか計算するやつ」

> 一言ゴールがあると、設計のブレが劇的に減ります。

***

## 2) 入出力は「具体的に・短く」

*   **良い例**:
    *   **入力**:
        1.  残っているシート数(整数)
        2.  お薬ケース内の錠剤数(整数)
        3.  お薬カレンダー内の錠剤数(整数)
    *   **出力**:
        *   合計残数
        *   今日の必要錠数(時刻で判定)
        *   **最終服用日(YYYY-MM-DD + 曜日)**
*   **悪い例**:
    *   「なんか色々聞いて、計算して、いい感じに出して」

> 入力の型(整数/文字列/真偽)や「表示フォーマット」をハッキリ書くと、実装とテストが楽になります。

***

## 3) 前提・制約は箇条書きで

*   **良い例**:
    *   1日2回、1回1錠(=1日2錠)
    *   1シート14錠
    *   カレンダーは7日分=14錠
    *   **時刻が** 7:00〜21:59 → 今日残り1錠、22:00以降 → 今日残り0錠、7:00未満 → 今日残り2錠
    *   不正入力なら即終了(追加入力や再試行は不要)
*   **悪い例**:
    *   「だいたいそんな感じで」

> 今回のような**時刻に紐づく仕様**は、境界(7:00/22:00)を明示してもらえると助かります。

***

## 4) 実行環境は先に伝える

*   OS/Pythonバージョン/起動コマンドの癖(`python`/`python3`/`py -3`)
*   **今回の例**:Windows、`python` コマンドで実行(Python 3を使う)

> f文字列や日時APIの挙動など、**バージョン依存**を避けやすくなります。

***

## 5) エラーハンドリングの方針は短く決める

*   **最小仕様**:不正入力→メッセージ表示して終了(再入力の対話はしない)
*   **拡張仕様**:再入力を促す、デフォルト値を使う、ログを残す…など

> 「最小でいい/再入力したい」だけでも書いてもらえると、無駄が減ります。

***

## 6) テキストで伝えるときのテンプレ(コピペ可)

    【目的】
    CLIで、薬の残量から「何月何日何曜日まで足りるか」を表示する。

    【入出力】
    - 入力(すべて整数、0以上。不正なら即終了):
      1) 残りシート数
      2) お薬ケース内の錠剤数
      3) お薬カレンダー内の錠剤数
    - 出力:
      - 合計残数
      - 今日これから必要な錠数(時刻による)
      - 最終服用日(YYYY-MM-DD + 曜日)

    【前提・計算ルール】
    - 1日2回、1回1錠 → 1日2錠消費
    - 1シート=14錠、カレンダー=14錠
    - 時刻判定:
      - 7:00未満 → 今日必要2錠
      - 7:00〜21:59 → 今日必要1錠
      - 22:00以降 → 今日必要0錠

    【環境】
    - Windows / Python 3.x
    - 実行コマンド:python filename.py

    【希望】
    - 単一ファイル
    - 依存パッケージなし(標準ライブラリのみ)
    - 日本語表示

***

## 7) 「修正依頼」を出す時のコツ

*   **変更点だけ**を短く列挙:「時刻で今日必要錠数を判定して」「不正入力は即終了に」「曜日は日本語で」
*   実行結果の**例を添える**(想定入力→想定出力):
        入力:
         シート=2、ケース=3、カレンダー=14
        現在時刻:08:30
        期待出力:
         今日必要錠数=1、最終服用日=2025-12-31 水

***

## 8) うまくいかない時の報告テンプレ

    【症状】IndentationError: expected an indented block...
    【環境】Windows / python コマンドで実行
    【ファイルの末尾】if __name__ == "__main__": の次に main() がありませんでした
    【お願い】インデント混在がないコードに修正を

> エラーメッセージの**最初の1〜2行**と**どの操作で起きたか**だけでも、原因特定が早まります。

***

## 9) 実例:「今回、特に助かった指示」

*   **「3つだけの入力を聞いて、その後計算して出力してほしい」**  
    → 入力フローが明確で、対話の挿入タイミングに迷わなかった
*   **「不正入力なら止める(以上の仕様はいらない)」**  
    → 最小仕様が確定して、過剰機能を避けられた
*   **「7時/22時の境界」**  
    → 時刻判定の曖昧さがなく、ロジックを即実装できた

***

## 10) まとめチェックリスト(依頼前に30秒で確認)

*   [ ] ゴールは1文で書いた(何を達成するか)
*   [ ] 入力と出力の項目・型・フォーマットが明記されている
*   [ ] 前提・境界条件が箇条書きで書かれている
*   [ ] 実行環境(OS/バージョン/コマンド)を書いた
*   [ ] エラーハンドリングの方針(最小か再入力か)を書いた
*   [ ] 単一ファイル・依存なしなどのファイル構成の希望がある
*   [ ] 変更依頼なら、変更点だけ短く列挙した

***

もしよければ、次回からこのテンプレを軽く埋めて投げてくれれば、**最小でズレないコード**をすぐ返せます。  
他にも「ログをCSVで残したい」「曜日を『日〜土』順にしたい」「日本の祝日を考慮したい」など、運用の好みがあれば教えてください。用途に合わせて微調整します!

3. ソースコードをなんらかの方法でiPhoneにもっていく

今回はPCからGoogleドライブにもっていって、GoogleドライブからiPhoneに移動させました。

4. iVimを起動し、ドキュメント内にファイルを設置する

iVimフォルダに置けば、iVimから動かせるやろ……と思ってファイルで探すも、最初は見つからず。
どうやらiVimアプリ内で何かしらのファイルが作成されないと、iVimフォルダが見えるようにならない模様。
とりあえずのファイルを一つ作ればiVimフォルダが見えるようになるので、そこにソースを移動。

5. iVimで実行してみる

:term # ターミナルモードに入って
python3 filename.py # Pythonを実行

trim.D7264E3A-2E62-4195-9601-4CE428671FE2.gif

できたー! やったー!
これがやりたかったのー!

作ってもらってみて

自分で手を動かしてー……をやってると、アドカレどころじゃなくなってたと思うので、時短になってよかったです。
ただ、フィードバックを何回かしないと動かないコードを出してくることはあるので、ポン出しで出てきたものをビジネスで使ったりは難しそうだなと思いました。でも、生成AIの出力するものって、一発100点ってものはそうそうないしね。
また、今回は「動けばOK」の「個人で使うもの」で「できてしまえばメンテ不要」ものではあったので、生成AIにコーディングを頼むちょうどいい教材にできました。

こういったパッとしたものであれば、コーディング専門の生成AIでなくてもなんとなしに頼んで、回答ややりとりを楽しみつつ、困りごとを解決できるのはいい時代だなーと思いました。

余談

iVimのターミナルモードが使えるって話、確かGeminiにきいてたっけなー[検索]
image.png

浮気現場を押さえられたかのような気まずさ。
や、ちゃうねん。前にアイツと話したことを確認するためで、今回の功労者は君やねん……。な?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?