想定読者
- 大学などでゆるい図書館システムを作りたいと考えていて概要を知りたい学生
概要
当時学科のラウンジの自由に持って行ってよい本置き場があった。この本を誰が借りたかを把握するために作成した。
- デスクトップアプリとして作成し、本棚の近くにあるデスクトップパソコン(windows10)で稼働
- pcのBIOSをいじり、22時に自動シャットダウン、10:30に自動起動&batファイルで図書館システムを起動
本を借りる際にどのように使うか
- 学生が借りたい本を選んだ後PCに接続されているICカードリーダーに学生証をかざし、システムにログインする。
- PC上のボタンを押し、本を借りる画面に移行する
- 借りる本のバーコードをすべてバーコードリーダーでスキャンし、完了ボタンを押す
- 履歴テーブルに履歴が保存され、ICカードリーダーで読み取った学籍番号を使いslackで借りた本の名前と返却日の一覧を送信
システムを作る際に意識したこと
- 運用保守を行わない、またはメンテナンスをあまりせずとも動くこと
- 5年以上の期間動くこと
[なぜ意識した?]
自分たちが卒業した後でも運用されると想定されたから
使用した技術など
- 言語
- Python3.1.0(Microsoft Store)
- Microsoftストアから入手した
- 当初はC#やExcel+VBAという案もあった
- 私の学科の研究室の学生や教授に使える人が多いため、運用保守が可能だと思った
- Python3.1.0(Microsoft Store)
- GUI
- tkinter
- 習得が簡単
- 枯れた技術なので長期間運用しても大丈夫
- tkinter
- DB
- sqlite3
- 私の学科の研究室の学生や教授に使える人が多いため、運用保守が可能だと思った
- sqlite3
- 周辺機器
- バーコードリーダー
- pcに接続されている
- 本のバーコードの読み取りで使用
- 読み取る際にプログラムは不要
- ICカードリーダー(PaSoRi RC-S380)
- pcに接続されている
- 学生証の読み取りで使用
- 読み取るためにはプログラムが必要
- バーコードリーダー
- その他API
- google books api
- DBへの本の登録で使用(後述)
- slack api
- システムを利用した際の通知で使用(後述)
- google books api
- その他ソフト
- zadig-2.7
- windowsでICカードリーダーを使用するために使用
- zadig-2.7
データベース
- bookテーブル
- 本のテーブル
- book_idは本のISBNを使用
- borrowing_historyテーブル
- 本の買い出し記録のテーブル
学生のテーブルは
- 学生証から学籍番号が読み取れる
- 学籍番号だけで学生と教員が区別できる
- 学籍番号から大学のメールアドレスが生成できる
- テーブルとして定義すると、ユーザーが自身で登録しないといけないor年度ごとに管理者がデータを追加しないといけない...など人がメンテナンスしないといけない
- 学生名や住所は必要ない
等の理由で定義しませんでした。
またメンテナンスの機会を減らすために、貸出記録はその本を返却すると削除するようにしています。
実装した機能
- 学生証を読み取り、対象の学生、対象の教員(管理者権限)、対象外を区別し、学生と教員のみログインできる機能
- nfcpyを使い実装
- 読み取った学籍番号の値からこれらを識別した(別途DBを参照しているわけではない)
- 本を借りる機能
- 本を返す機能
- 本をDBから削除する機能
- ログインすると現在借りている本の一覧と返却日を表示する機能
- 本を借りる、返却した際にslackで通知を送る機能
- 管理者でログインした際に、DB上の本を削除する機能
- 管理者でログインした際に、本のバーコードを読み取ることで、本をDB上に登録する機能
- 運用コストを考えて、独自に生成したバーコードで本を管理するのではなく、本に元々ついているバーコードで管理する
- 同じ本が2冊あった場合や、ユーザーが本棚にあるのと同じ本を本棚においてしまう場合など懸念点はあるが、なんとなく借りている人を把握したい、返却期限を過ぎても罰則がないなどゆるい要件で作成されたため、問題ないと考えた
- 返却の2日前にslackで通知
実装を諦めた機能
- 本をDB上で検索し、その本が棚のどこにあるかを表示する機能
- 必ず必要な機能ではないし、本の数も2,300冊とシステムがなくても探せる規模だから
- 本が決まった本棚にあるか確認する作業や、新たに本を登録した際にどの棚、カテゴリに登録するかなど、運用が大変だから
- 時間がなく、使えるシステムを完成させるのが最優先だったため