職員室で先生を代わりに呼んでくれるソフトを作った話

## はじめに
### 自己紹介
　大阪のとある高校に通っている人です。Linuxをさわったり、Pythonでアプリ開発したりしています。

### この記事の内容
　高校の部活で開発して実用化までしたアプリの制作過程について、まとめて振り返ってみました。

:::note warn
Pythonの超初心者がアプリ開発した話です。最近のイケてるフレームワークなどは一切使っていませんし、「引数」とは何かというレベルからスタートしているような内容です。
:::

## どんなソフトか紹介します！
　簡単に言えば、「職員室で先生を代わりに呼んでくれるアプリ」です。ただの甘えかもしれませんが、世の中には、大きな声を出せない人や出したくない人がいますよね。そんな人たちの悩みを解決するために制作しました。

### リポジトリ
　GitHubで配布しています！

https://github.com/cyber-yuito723/TeaChimer

### 使い方
1\. 呼びたい先生の名前のボタンを選びます。（スクショは全く先生の名前が入っていないですが。）
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/a08254db-f238-366d-77e3-acba6c8ad5f2.png)

2\. 確認画面が表示されます。（「～を呼びますか？」の前に先生の名前が入ります。）
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/f3522808-3d99-6312-9835-17c3ee8acb4f.png)

3\. 「はい」を選ぶと音声が流れ、「いいえ」を選ぶとキャンセルされます。また、音声が流れている間は、操作できないようにしています。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/3a2c4833-97b7-e9a3-37ab-8e321166c720.png)

という感じの単純なソフトです。

### ソフトの名前
　「TeaChimer(ティーチャイマー)」と名付けました。「teacher」と「chime」を掛け合わせた造語に～する人を表す接尾辞の「er」を付けたことから来ています。左上に写っているロゴもGIMPで自作してみました。

## 開発から実用化へ
### きっかけ
　私がコンピューター部に入部したときに、「職員室で先生を代わりに呼んでくれるソフトを作ってくれないか」とすすめられたのがきっかけです。

### え、どーやって作るんですか
　そう思いました。HTMLとかでウェブサイト制作はしたことはありました。でもプログラミングしてアプリを作ったことはありませんでした。
　だからといって、やらないのは性分に合わなかったので、一から勉強して作ることにしました。

### とりあえずChatGPT先生に聞いてみよう！
　ネットで「Pythonは簡単！」みたいな記事を見かけたので、言語はPythonで作ることにしました。それで、初心者でもゴリ押しで読めるんじゃないかとも思いました。なので、以下の流れで作り始めました。

1\. ChatGPTにコードを生成してもらう
2\. 生成してもらったコードをコピペして動かしてみる
3\. ちゃんと動いたらそのコードでどんな処理が行われているのかを解読し、頭の中で把握する
4\. 理想の形に近づけるための改善点を考え、ChatGPTにその旨を伝えて再生成してもらう

　初めのうちは、１～４の流れを繰り返していました。

:::note info
この頃はまだ、学生は無料で使えるGitHub Copilot（神）の存在を知りませんでした。（笑）学生の皆さんはGitHub Copilotを使いましょう！
:::

### 自分だけで書けるようになりてー
　ChatGPTばっかりに頼っていると、なんか情けなくなってきたんですよね。なので、とりあえずyoutubeで「Python 入門」と調べて２～３時間くらいする解説動画を見漁りました。そうすることで、引数の使い方とかクラスの使い方が段々と分かってきました。

### デザインがダサい
　tkinterで標準のスタイルのままだとデザインがどうしてもダサくなってしまいますよね。しかも、タッチして使うアプリでタッチしたら凹むみたいな余計なアニメーションは必要ないと思いました。なので、「ttk.Style()」でスタイルを整えまくりました。
```python:一部抜粋
style = ttk.Style()
style.theme_use("clam")
style.configure("TFrame", background = "white")
style.configure("TLabel", font = ("Yu Gothic UI", 15), anchor = "center", background = "white")
style.configure("bold.TLabel", font = ("Yu Gothic UI", 25, "bold"), anchor = "center", background = "white")
style.configure("logo.TLabel", background = "white")
style.configure("TNotebook", background = "white")
style.configure("TNotebook.Tab", width = 300, font = ("Yu Gothic UI", 35, "bold"), anchor = "center", background = "whitesmoke")
style.configure("TButton", font = ("Yu Gothic UI", 25, "bold"), background = "whitesmoke")
style.configure("TSeparator", background = "white")
style.map("TNotebook.Tab", background = [("selected", "white")])
style.map("TButton", background = [("active", "whitesmoke"), ("disabled", "lightgray")])
```
こんな感じですね。

### __pycache__ってなんや？
　２回目以降の実行時にコンパイルを経ずに__pycache__の中のプログラムを実行するので、実行速度が速くなるらしいです。詳しくは、以下の記事で解説されています。

https://qiita.com/Kobayashi2019/items/03e31ee50b924f428e71

　でも、なんか、新しくファイルが勝手に生成されるのはキモいので、以下のコードをプログラムの一番初めに書いて、__pycache__が生成されないようにします。
```python
import sys
sys.dont_write_bytecode = True
```

### ログを残したい！
　どの先生がいつ呼ばれたのかをCSVファイルで出力できるようにしました。
```python:一部抜粋
import datetime
import csv

file_date = datetime.date.today().strftime("%Y%m%d")
year = datetime.datetime.now().strftime("%Y年")
month = datetime.datetime.now().strftime("%m月")
date = datetime.datetime.now().strftime("%d日")
time = datetime.datetime.now().strftime("%H時")
minutes = datetime.datetime.now().strftime("%M分")
seconds = datetime.datetime.now().strftime("%S秒")
with open(f"./log/{file_date}_log.csv", "a", newline="") as f:
    writer = csv.writer(f)
    writer.writerow([year, month, date, time, minutes, seconds, name])
```
　こんな感じの簡単なwith文でCSVファイルにログを追記していくようにしました。このとき、躓いたのが、文字コードを指定しないとShift_JISで保存されるということです。まあ、Excelで開いて見れたらよかったので、それでいいんですけどね。

### リリースするぞ！
　職員室の入ってすぐのところにタッチ対応のノートパソコン（180度回転できるやつ）を設置しました。音声は、VOICEVOXでずんだもんの声を使って作りました。しかし、ずんだもんみたいな子供っぽい声が先生に不評だったので四国めたんに変更しました。

## 工夫した点
1\. 音声が流れている間は、操作できないようにしたところ。（流れている音声が途切れる可能性があったため。）
2\. ログが残るようにしたところ。（機能変更が利用回数にどのような影響を与えるのかを調べるため。）
3\. 先生の名簿と音声のパスを別のPythonファイルに変数として設定し、それをメインのPythonファイルにインポートする形にしたところ。（SQLiteの学習をする暇がなかったため。）

## １０月と１１月の利用状況
![２０２３年１０月_page-0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/bbaec85a-45cc-52de-e2eb-88985d03411f.jpeg)
![２０２３年１１月_page-0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/a0235274-5f19-b9dc-6156-3d10c13fcfb2.jpeg)
　こんな感じですね。（生データです。ごめんなさい。学校向けにプログラムを改造しているので、用件別に利用回数が出ています。）１０月から１１月初旬にかけてはかなり不評で、平日なのに１日に５回しか使われない日もありました。１１月中旬からは期末テストがある関係で利用回数が増加していますね。

## 今後の課題と開発方針
1\. 先生の名簿の管理をSQLiteで行えるようにすること。
2\. Webアプリ化を視野に入れること。
3\. もしも、先生がいなかったときに、ボタンを押せなくするor「いないです」と返すような仕組みにする。
そんな感じですね。

## おわりに
　だらだらと書いてしまいましたが、これまでの開発過程を振り返ることができました。全くプログラミングしたことがなかった自分が、ここまでできるようになったのはChatGPTのおかげですね。今後は、Webアプリ開発やSQLiteの実装に挑戦したいと思います。