およそ総計1500人もの出店メンバーの体温を確認するために「体温確認チェッカー」を作成した話

<h1>きっかけ</h1>
<p>私の大学での学園祭では、大学側からの要請により、新型コロナウイルス感染症対策の観点から、模擬店の開催に際して行われる計５回のガイダンスの出席者と学園祭前日に全模擬店の出店メンバー全員に体温記録表を提出してもらい、問題がないかを確認する必要がありました。その対象者の総数は1500人以上を超え、手作業で確認するには、非現実的であり、さらには忙しいこの時期にこの体温記録表の確認に膨大な時間を割くのは、非合理的でした。そこで、自動で体温記録表を確認し、提出状況の記録と記録内容に問題がないかをチェックする「体温確認チェッカー」を作成しました。</p>

<h1>利用した技術</h1>

<h3>環境</h3>
<p>
・Java 17<br>
・Gradle 7.6<br>
・Apache POI ExcelAnt 5.2.2<br>
・JavaFX Plugin Version 0.0.13<br>
・JavaFX 18
</p>
<h3>各種APIについて</h3>
<h4>Apache POI</h4>

>Apacheソフトウェア財団のプロジェクトで、WordやExcelといったMicrosoft Office形式のファイルを読み書きできる100% Javaライブラリとして提供
>引用：https://ja.wikipedia.org/wiki/Apache_POI

<a href="https://poi.apache.org/">→https://poi.apache.org/</a>
<a href="https://mvnrepository.com/artifact/org.apache.poi/poi-excelant/5.2.2">→https://mvnrepository.com/artifact/org.apache.poi/poi-excelant/5.2.2</a>
<p>体温記録表のExcelファイルを読み取るためと、結果として出力するExcelファイルである「result.xlsx」を作成するために利用。

<h4>Java FX</h4>

>JavaFX is an open source, next generation client application platform for desktop, mobile and embedded systems built on Java. It is a collaborative effort by many individuals and companies with the goal of producing a modern, efficient, and fully featured toolkit for developing rich client applications.
>引用：https://openjfx.io/

<a href="https://poi.apache.org/">→https://openjfx.io/</a>
<a href="https://plugins.gradle.org/plugin/org.openjfx.javafxplugin">→https://plugins.gradle.org/plugin/org.openjfx.javafxplugin</a>
<p>UI作成のために利用。

<h4>Gradle Shadow Plugin</h4>

>Shadow is a Gradle plugin for combining a project's dependency classes and resources into a single output Jar. The combined Jar is often referred to a fat-jar or uber-jar. Shadow utilizes JarInputStream and JarOutputStream to efficiently process dependent libraries into the output jar without incurring the I/O overhead of expanding the jars to disk.
>引用：https://imperceptiblethoughts.com/shadow/introduction/#benefits-of-shadow

<a href="https://imperceptiblethoughts.com/shadow/">→https://imperceptiblethoughts.com/shadow/</a>
<p>APIをJARファイルに内包したFat Jarを作成するために利用。</p>

<h1>特徴</h1>
<h3>設計について</h3>
<p>このプログラムの開発にあたって、もっとも大変だったのが、プログラムの内部設計です。下のようにいろいろ考えていきながら、プログラムの開発を目指していきました。<br>当初は設計図を書かずに開発を進めていきました。しかし、体温記録表のファイルにおいて確認するべき内容が多く、かなり複雑になってしまったため、途中で厳しいと判断し、しっかりと設計を行うことにしていきました。</p>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/4d2c4ebf-13c6-09ca-8864-3d3c419e9998.jpeg" width=70%/>
<br>※あくまでも設計段階だったので、一部実装できない機能や異なる実装をした機能があります。
<h3>体温記録表のファイルについて</h3>
ここにアップロードしています。

https://github.com/TAKAYAMAN2180/CheckTemperature/blob/master/src/main/resources/template.xlsx

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/113c1d13-f357-1440-4778-4341208049a7.png" width=80%/>

<br>予期せぬエラーの発生を防ぐためにも体温と個人情報を入力するところ以外は、編集できないようにロックしています。<br>パスワードは「password」なので、編集や関数の参照を希望するときはロックを解除してご覧ください。<br>また、学生証の入力ミスが毎年多く見受けられるため、学生証の入力欄には以下の３点の条件を満たしていない場合はエラーが発生するようにしました。<br><br>1. 入力された値が数字かどうか。<br>2. 11桁かどうか。<br>3. 学生証のチェックデジット計算式を満たすかどうか。<br><br>特に「3. 学生証のチェックデジット計算式を満たすかどうか。」の実装については、以下の記事を参考にし、チェックデジット計算式をExcelの関数で同じふるまいをするように実装し、間違った学生証番号を入力したときにはエラーが発生するようにしました。

https://cysec.ise.ritsumei.ac.jp/2022/06/03/%E7%AB%8B%E5%91%BD%E9%A4%A8%E3%81%AE%E5%AD%A6%E7%94%9F%E8%A8%BC%E7%95%AA%E5%8F%B7%E3%81%AE%E8%A9%B1/#:~:text=%EF%BC%9C%E5%AD%A6%E7%94%9F%E8%A8%BC%E7%95%AA%E5%8F%B7%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%EF%BC%9E&text=%E2%97%8B%E2%97%8B%EF%BC%9A%E5%AD%A6%E9%83%A8%E3%80%81%E2%97%8F%E2%97%8F,%E3%81%8B%E3%82%92%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

実装したExcel関数
```
=AND(TYPE(C3)=1,
     LEN(C3)=11,
     LET(A,11-MOD(   
               SUM(5*MID(C3,1,1)+4*MID(C3,2,1)+3*MID(C3,3,1)+2*MID(C3,4,1)+7*MID(C3,5,1)
               +6*MID(C3,6,1)+5*MID(C3,7,1)+4*MID(C3,8,1)+3*MID(C3,9,1)+2*MID(C3,10,1)),11),
         B,1*MID(C3,11,1),
         OR(A=B,AND(A>=10,B=0))))
```

<br>Excelの関数の文字制限があり、かなり実装に苦戦しました。そこで、LET関数を用いることにより、関数を短くし、実装することができました。

<h1>開発したプログラム</h1>
<h3>ソースコード</h3>

https://github.com/TAKAYAMAN2180/CheckTemperature

<h3>JARファイル</h3>
ソースコードから動かすことも可能ですが、下のJARファイルより実行することも可能です。なお、Java 17での動作を確認しています。

https://github.com/TAKAYAMAN2180/CheckTemperature/blob/master/build/libs/Check_Temperture-1.0-SNAPSHOT-all.jar

利用しているAPIをJARに内包したFat JARを作成するためにGradle Shadow Pluginによるビルドを行いました。

<h3>実際の動作について</h3>
<h4>スタート画面</h4>

「読み込みたいディレクトリを選択してください。」と「保存先を選択してください。」より、読み込みたいディレクトリと保存先のディレクトリを選択します。<br>そして、「期間を選択してください。」より、確かめたい期間を選択します。<br>これらの入力の完了後、「読込」のボタンを押すことで、読込をし、体温チェックの処理を開始することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/acfe9b39-313d-b56b-396c-ae8e5e4c5dc5.png" width=70%/>

<p>そして、ファイルの数にもよりますが、数秒待つと処理が完了し、「処理が完了しました」と表示され、保存先として選択したディレクトリへ結果が出力されます。</p>

![入力完了&処理終了時スタート画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/e78630d5-8fe4-e4f9-b563-a3f4f1df6899.png)

<h4>出力されるディレクトリについて</h4>
<p>処理が完了すると、保存先のディレクトリが次のようになります。</p>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/25fc222f-7422-7872-63e7-7698b8f882a9.png" width=70%/>

<p>４種類のディレクトリと１種類のファイルが出力
<br>・ディレクトリ「○」<br>→何も問題がなかったファイルがあるディレクトリ
<br>・ディレクトリ「△」<br>→詳細が記入や体調不良の可能性などで確認が必要なファイルがあるディレクトリ
<br>・ディレクトリ「×」<br>→Excelファイルでないファイルや、破損しているファイル、違うテンプレートのExcelファイルを利用しているなどで処理することができなかったファイルがあるディレクトリ
<br>・読込ディレクトリと同じディレクトリ<br>→読み込んだディレクトリを複製したディレクトリ
<br>・ファイル「result.xlsx」<br>→処理結果が記載されたExcelファイル（詳しくは後述）

</p>


<h4>出力されるExcelファイルの結果について</h4>
<p>前述の「result.xlsx」は下のようになっています。A~F列にファイルの情報が記載され、G列に処理結果が表示されます。</p>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/5c8fb75e-ea7c-bd35-ccb6-67a906b0c0ed.png" width=85%/>

<h4>処理結果について</h4>
<h5>「○」のファイル</h5>
<p>完璧なときのみ「○」となります。</p>

<h5>「△」のファイル</h5>
詳細が記入や体調不良の可能性などで確認が必要なファイルがあるディレクトリ<br><br>
例１.<strong>「詳細の記入あり」(5行目)</strong><br>
条件：記録表のH列の詳細のどこかに何か記入されているとき
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/5534a57d-3a96-8c88-7589-3a103df8a18e.png" width=85%/>
<br>例２.<strong>「記録日程の誤り」(19行目)</strong><br>
条件：記録する日程に誤りがあるとき
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/8eba48e3-c08c-da74-a090-9279b4669c7e.png" width=85%/><br>例３.<strong>「入力値のフォーマットエラー」<br></strong>
条件：体温の入力欄に正しい数字が入力されていないとき<br>
※「36,5」つまり、「,(コンマ)」になってしまっており、「.(ピリオド)」ではないため、このエラーが発生してしまっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/53912e11-beb9-9339-4a86-6382f2b4917a.png" width=85%/>
<br><strong>他にも...</strong>
<br>他にも下記の場合は「△」として分類されます。
<br>・37.5℃以上の発熱あり
<br>・体温記録の未記入
<br>・35.0℃以下の低体温あり
<br>・体温記録の未記入
<br>・学生証番号の登録なし

<h5>「×」のファイル</h5>
<p>
「×」として分類されるファイルは次のようになっています。上から１～３個目はExcelファイルではないため、「データ拡張子の誤り」となり、「×」に分類されます。
</p>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/d5aef5f7-bd79-ec44-fe83-af4137d37e29.png" width=65%/>
<p>
また、上から４個目については、Excelファイルですが、開くと次のようになっており、規定のフォーマットとは異なるため、「Excelデータのフォーマットエラー」となり、「×」に分類されます。
</p>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699602/e7cfdcda-4857-7ce5-df7c-de3bdbca7b7d.png" width=65%/>
<p>
<strong>他にも...</strong>
<br>他にも下記の場合は「×」として分類されます。
<br>・予期せぬエラー
<br>・読込不可
<br>・ファイル名のエラー

<h1>発見した問題点</h1>
<p>実際に運用し、発見した問題点があります。それは、、、<br><br>""JISで割り当てられていない文字がファイル名に使われているとき、そのファイルを読み取ることができないこと""<br><br>です。おそらく原因としては、ファイル名を識別するのに実際のファイルのファイル名を用いており、Java側もしくはWindowsのコマンドプロンプトのどちらかがファイル名の文字をJISとして認識して動いていることだと考えています。<br>今後において修正を図っていきたいと思います。</p>

<h1>さいごに</h1>
<p>長くなりましたが、最後までご覧いただき、ありがとうございました。私が学園祭に際して作成したプログラムに関する記事は３件目となりました。今年度も、来場者そして他の学園祭実行委員会のメンバーや参画者に<strong>"技術で価値を提供"</strong>していきたいと思います！！</p>