kintone と連携する図書管理システムを作ってみた

みなさんこんにちは。SRE チームの内田(@uchan_nos)です。

サイボウズでは去年の 11/30 から 12/02 にかけて、4 回目となる毎年恒例の社内ハッカソンが行われました。 業務時間で好きなものを作ってよいので、図書委員でもある私は Raspberry Pi 3 と NFC リーダー、バーコードリーダーを使った図書管理システムを作ることにしました。 (ちなみに、この図書管理システムはハッカソンの審査で大賞に輝きました。うれしい!)

年明け 1 月下旬、ついに図書管理システムが本格的に稼働しはじめましたのでご紹介します。 使用機材やソースコードも公開しますので、興味があれば試してみてください。

作ったもの

kintone 上の図書管理アプリの貸出・返却ステータスを、遠隔で変更する IoT システムです。 このシステムには社員証リーダーとバーコードリーダーが接続されていて、 誰がどの本を借りようとしているか(または返そうとしているか)を識別し、図書管理アプリのステータスを更新します。

f:id:cybozuinsideout:20170126005548p:plain

kintone とはウェブ上にデータベースのようなものを構築できる弊社サービスで、 弊社内の開発系書籍はその kintone 上に構築したアプリ(データベース)で管理しています。 このアプリには、書籍名、ISBN、貸出ステータス(本棚にある・貸出中・紛失中)、棚番号などが記録されています。

今回作ったシステムでは、今までウェブブラウザ経由で貸出ステータスを変更していたものを、 社員証のタッチとバーコードの読み取りでできるようにします。 いちいちアプリを呼び出してきたり書籍名を入力する手間がなく、また、システムを本棚に常設することで、 「借りたい」「返したい」と思ったときに 直感的 に使うことができるようになりました。 認知心理学の言葉を借りれば「アフォーダンスが劇的に向上した」といえます。

ハードウェア構成

簡単に買えるものだけで構成しています。

  • Raspberry Pi 3 Model B
  • バーコードリーダー BUSICOM BC-BR900L-W
  • NFC リーダー PaSoRi RC-S380
  • WiFi アダプタ WN-G300UA (本運用時のみ)
  • Raspberry Pi 7" Touch Screen LCD (本運用時のみ)
  • スピーカー

f:id:cybozuinsideout:20161201170534j:plain

Raspberry Pi 3 本体は裏にあるので見えませんが、ちゃんと動いています。 Raspberry Pi 3 には USB 端子が 4 つ付いており、バーコードリーダーと NFC リーダーに加え、 開発時にキーボードとマウスも接続できます。すごいですね。

WiFi アダプタは本運用時に追加で買ったものです。 本棚にシステムを設置してみたところ Raspberry Pi 3 本体に内蔵されている WiFi アンテナでは電波の飛びが悪く、ネットワークが不安定になりました。 WN-G300UA のおかげで 電波強度が向上 し、安定して運用できるようになりました。

実はこの WiFi アダプタ、USB コネクタ部が太く、上下の USB 端子で干渉してしまうことが分かりました。 アダプタを片方の USB 端子に挿すと、もう片方には何も挿せなくなるのです。 本運用のために調達しておいた Raspberry Pi 7" Touch Screen LCD は当初、タッチ機能 を使わないつもりでしたが、 アダプタ干渉のためマウスを接続するポートが足りなくなり、この機能が図らずも役に立ちました。 危なかったです(^^;)

ソフトウェア構成

メインの制御プログラムは Python 2.7 で作りました。 この制御プログラムが無限ループにより動作し続け、社員証の読み取り、バーコードの読み取り、kintone アプリのレコードの更新を行います。

本を借りたい・返したい人はこんな感じで操作します。

  1. 社員証をタッチ
  2. 書籍の ISBN バーコードをスキャン

このシステムは音声案内が流れるようになっています。 社員証をタッチすると「97 で始まるバーコードをスキャンしてください」と言われます。 スキャンすると、その書籍をまだ借りてないなら借り、すでに借りている場合は返します。

弊社の社員証は NFC 規格にしたがっていて、nfcpy と PaSoRi リーダーで簡単に読み取ることができました。 社員証の中に社員番号が記録されているので、誰がシステムを操作したかを特定するのに使っています。

バーコードリーダーは USB キーボードとして認識され、スキャンに成功するたびに文字列として読み取った値を送ってきます(例えば 9781530445387\n)。 標準入力から読み込んで処理します。

制御プログラムと kintone とのやり取りには pykintone を使いました。 kintone を操作するライブラリはいくつかあるようですが、今回はレコードのステータスを API からいじる必要があるため、それに対応したものである必要があります。 ステータスをいじる API が搭載されたのは kintone の 2016 年 5 月版からですので、メンテされてないライブラリだと対応していない可能性があります。

音声案内は AquesTalk Pi を利用しています。 このソフトウェアは、コマンドライン引数で文字列(日本語対応)を与えると、標準出力に wav 形式の音声データを吐き出すという、非常に簡単に使える仕組みになっています。 当初は音声案内が無かったのですが、AquesTalk Pi を利用するようにしてから、システムの UX がとても高まりました。

図書管理アプリ

Raspberry Pi から操作する対象の図書管理アプリは kintone にて構成しました。 下図のように蔵書を管理しています。

f:id:cybozuinsideout:20170125105700p:plain

このアプリ自体は以前から使われており、既に 1500 冊を超える本が登録されています。

それぞれの書籍情報は下図ようなレコードになっています。 (同じ本が複数冊ある場合、複数のレコードが登録されています)

f:id:cybozuinsideout:20161202133959p:plain

図書管理システムの第一目標は、このフォームにある「ステータス:レンタル中」を、自席の PC に戻ることなく バーコードをピッとするだけ で操作することです。 kintone ではフィールド以外にも「ステータス」を API から操作できるので、このシステムを実装することができました。

社員番号 - ユーザ名変換アプリ

会社によってポリシーは違うと思いますが、弊社の図書管理では 誰が どの本を借りたかを管理しています。 図書管理では様々なトラブルが発生するので(例えば、借りたい人がいるのに本棚に無いとか、「本棚にある」というステータスなのに見つからないとか) 最後に誰が借りたかが分かるとトラブルが解決しやすくなります。

弊社の社員証には 6 桁の社員番号が記録されています。 社員番号さえあれば個人の識別ができるはずですから、これでシステムが作れます。やったー!

というのはちょっと早とちり。 kintone 上でユーザを指定するには社員番号ではなく、kintone のユーザ名 を得る必要があるのです。 そこで今回は、社員番号と kintone 上のユーザ名を記録した kintone アプリを作って対処しました。

このアプリは本質的なところではないので、詳しくは紹介しませんが、 社員番号とユーザ名の 2 つのフィールドがあるレコードが、社員の数だけ並んだ単純なアプリです。

リソース

今回作成したソースコードは https://github.com/uchan-nos/hondana で公開しています。 オープンソースライセンス(MIT ライセンス)で公開しておりますので、ご自由にお使いください。

さいごに

今後は運用しながら出たバグを修正したり、使い方を分かりやすく掲示するなど、図書管理システムを便利にする活動をしていきます。

今回のシステムでは社員証と ISBN という、2 つの情報を組み合わせて「誰が何を」借りたかを管理しました。 もうちょっと頑張って、同じ ISBN を持つ複数の書籍を区別できるよう、1 冊 1 冊固有の管理番号を振り、バーコードを印刷して貼り付けておけば、社員証のタッチをなくすことができます。 これは実際の図書館が使っている方法ですね。

また、このアイデア自体は書籍に限らず「物を管理する」こと全般に適用できます。 既に総務部からひきあいが来ていて、電源タップなどの備品の貸し出し管理に使えたら便利だよね、という話をしています。 仕出し弁当の管理に使うこともでき、社内に存在するいくつかの問題を解決できそうな気がしています。

社員証を読み取る技術を応用すれば、社内でイベントを開催したときの参加者の記録を取れます。 そのほかにも無限に可能性が広がる技術なので、応用先を見つけていきたいと思っています。