アヒル駆動のセキュリティ教育 SecDuck製作記録

## 概要

https://youtu.be/awhfE6o1NBM?feature=shared

https://qiita.com/acta/items/94fd92a73d39bac7adfd

https://qiita.com/acta/items/adf20443c893d984dd1b

## SecDuck構成要素

![architecture2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699597/e6d5a05b-4ca8-cfe7-dacf-9a04c5dd28c6.png)


### クライアント
![PXL_20240229_192926870.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699597/fce9608d-49c5-4310-2d5a-b0cb8da1e3a7.jpeg)

アヒル本体。パソコンの横において作業する。アヒルのにはマイクとスピーカーが搭載されていて、サーバーから送られてきた文章からOpen JTalkで音声を合成して再生したり、マイクから入力された音声データをサーバーに送るなどの処理を行う。

### サーバー
Google CloudのCloud Run上で動作しているFlaskサーバー。
クライアントやウェブアプリと通信してストレージやデータベースの内容を読んだり書いたりする。
送られてきた音声をSpeech-to-Text APIを使って文字起こしするのもここ。

### ウェブアプリ
Firebase Hostingで配信されているウェブアプリ。Flutter Webで書かれている。
アヒルとユーザーの会話履歴が見れたり、後述のセキュリティヒントの閲覧、編集ができる。

### ストレージ
Google Cloud Storage。ユーザーの発言した音声記録が保管されている。ファイルが追加されるとGoogle CloudのEventarcによって自動的に音声認識リクエストがサーバーに送られる。

### データベース
Firestore。ユーザーの最新のログイン日時、紐づいているアヒルのID、セキュリティヒントやプロンプトの情報、アヒルとの会話ログが保存されている。

# 機能① セキュリティヒントを教えてくれる
### 概要
毎日セキュリティヒントを一つランダムに選んでアヒルが教えてくれる。
セキュリティヒントはデフォルトでは[IPAの自己診断リスト](https://www.ipa.go.jp/security/guide/sme/5minutes.html)を元に作成した12項目が用意されている。
個人やチームに合わせてカスタマイズすることができる。

### ワークフロー
1. ユーザーがクライアントの電源をつける
1. クライアントはWiFi接続が確立されてすぐ、サーバーに「本日のセキュリティヒント」をリクエストする
1. サーバーはデータベースから以下の情報を取得する
    - セキュリティヒント一覧
    - 「本日のセキュリティヒント」
    - 「本日のセキュリティヒント」最終更新日時

1. サーバーは最終更新日時が今日でなければ新しく「本日のセキュリティヒント」をランダムに選び、更新内容をデータベースに反映させる
1. サーバーが「本日のセキュリティヒント」をクライアントに返す
1. クライアントは受け取った「本日のセキュリティヒント」を音声合成し、ローカルに音声ファイルを保存する
1. クライアントは「本日のセキュリティヒント」を再生する

# 機能② セキュリティレビューをしてくれる
#### 概要
一日の終りにアヒルと話して作業内容に情報セキュリティ上のリスクがなかったかチェックすることができる

#### ワークフロー
1. ユーザーがクライアントのPauseボタンを長押しする
1. クライアントが内部の音声ファイルを参照して今日の振り返りを促すプロンプトを再生する
    ex. 「振り返りを始めるよ！今日のセキュリティーヒントの「離席時にパソコン画面の覗き見や勝手な操作ができないようにしましょう。」は達成できた？その他にも気づいたことがあれば教えてね」
1. ユーザーがクライアントのRecordボタンを押しながら一日を振り返る
    ex. 「今日は急な呼び出しがあったときに一度だけ画面ロックせずに離席してしまったな。すぐ画面ロックできるようにショートカットを覚えておこう。」
1. ユーザーがRecordボタンを離し、録音が終わるとクライアントからサーバーに録音された音声データが送信される
1. サーバーはデータベースに新しくログを作成し、ログIDを取得する
1. サーバーは音声データをストレージにアップロードする
1. ストレージに音声ファイルが追加されたことをトリガーにサーバーに文字起こしリクエストが発行される
1. サーバーは文字起こしAPIによって得られたテキストをデータベースのログに書き込む
1. ユーザーがウェブアプリを表示する
1. ウェブアプリはサーバーにログの取得をリクエストする
1. サーバーはデータベースのログから文字起こしされたユーザーの発言内容や日時をウェブアプリに返す
1. ウェブアプリ上にログが表示される

# 機能③ 休憩時間を教えてくれる
#### 概要
25分作業したら5分休憩することで高い集中力を維持する方法にポモドーロテクニックというものがある。アヒルが休憩や作業の開始を促してくれることで、快適に作業できるようになるだけでなく、作業をこまめに振り返るきっかけになる。

#### ワークフロー
1. ユーザーがクライアントのFocusボタンを押す
1. クライアントは25分間経ったら「お疲れ様！休憩の時間だよ！」というプロンプトとともに5分間の休憩時間の計測を始める
1. ユーザーは作業を中断し、必要なら作業内容の振り返りをアヒルに話しかける
1. クライアントは5分間経ったら「作業を始めるよ！」というプロンプトとともに25分間の作業時間の計測を始める

また、タイマーによる作業と休憩の切り替えだけでなく、それぞれFocusボタン、Breakボタンを押すことで作業、休憩を好きなタイミングで始めることができる。タイマーを止めておきたい場合はPauseボタンを押し、タイマーを再開するときは再度Pauseボタンを押す。

# 更新ログ

#### Mark I
2023/11に大阪イベントで発表したバージョン。セキュリティヒントとレビュー機能を搭載している。
![PXL_20231114_130114270.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699597/b85dafa8-9fea-f17f-d12b-7b57df664c91.jpeg)


#### Mark II
2024/01に発表したバージョン。変更点は以下の通り
1. スピーカーの改良
    Mark Iで使用していた[スピーカー](https://akizukidenshi.com/catalog/g/gP-12587/)を変更しより大きな音量を出せるようになった
1. LED付きプッシュボタン
    Focusボタン、Breakボタン、Pauseボタン、電源ボタン、録音ボタンそれぞれをLED付きのプッシュボタンに変更し、電源がついているか、休憩時間中かどうかなどが一目でわかるようになった
1. 音量調整
    コントローラーにはボリュームがついており、つまみを左右に回すことで音量を調整することができる。アナログの入力信号をSPIという通信方式でデジタル信号に変換している
1. ポモドーロ機能
    機能③の追加

![PXL_20240119_071306676.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699597/2c47e49b-7a2b-7485-5a4c-878e99644815.jpeg)

#### Mark III
手作り要素を減らし、生産に向けた改良などを加えたモデル。
1. アヒルボディの3Dプリンティング
    これまでのモデルでは[既製品](https://www.amazon.co.jp/gp/product/B01MCZ2DIR)をカッターややすりで加工することで筐体を作っていたが、3Dプリンタを活用することでより生産しやすく無駄のない形を実現できる
1. ボタンのラベリング
    各ボタンに記号のシールが貼られ、迷わず操作できるようになった
1. プリント基盤
    予め配線されたプリント基板上に部品を配置することではんだ付けの手間が少なくなる

![PXL_20240229_192926870.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699597/3d61e4ec-6c33-d516-e2ef-59efb59e2398.jpeg)