技術めいた何か

1人の大学生によるIT系の記事群

学内用に学生証から学生IDを読み取って、統計情報を表示するソフトを作ってる話

先日、タイトルの通りのソフトのソースをGitHubに挙げたのは良いが、放置気味だった。大体はできているので実装について記事に残そうと思う。

ソースコード(GitHub)

ソフトについて 

概要:

通っている大学(東海大)の学生証から、学生IDを読み取って統計情報を表示したりして効果的な新入生勧誘を支援するWindowsアプリケーション

 作ろうと思ったきっかけ:

お金欲しい(切実)。大学に入学して1年が経過しようとしていたので、1年生の最後になにか作ろうと思った。

 使用想定ケース:

サークル、プロジェクト、部活等の勧誘時、
訪れた新入生や、在校生の統計情報を得る。
訪問回数が多い学生の学生IDの特定機能(ランキング表示)を使うことで興味を持ってくれた学生に積極的にアピールできる
統計情報に基づいた学生IDメールへの一斉送信機能(未実装)で効果的にお知らせを配信。

開発環境:

Visual Studio Community 2015

C++風のなにか(Cっぽくなっている…)、Win32Api

PaSoRi:RC-S330

 

と、ソフトの概要、使用想定ケースは上記のような感じ。

実装について

実装は大きく分けて以下の3つです。

  1. PaSoRi(felicaリーダー)経由で学生証から学生IDを読み取る
  2. 読み取った学生IDを管理(追加、検索、削除、保存、復元)するデータ構造の部分
  3. 読み取って得た統計結果をグラフやランキングに表示(つまり、UIまわり)

 

1.PaSoRi(felicaリーダー)経由で学生証から学生IDを読み取る

学生証からの学生IDの読み取りにはオープンソースfelica系のカードの読み書きができるライブラリである、felicalibを使いました。

ソニー公式のライブラリを使わなかった理由は、

  1. Lite(無料)版は商用利用が不可能だったこと。
  2. Lite版は試用版のようなスタンスであると感じたため。

ⅰに関して、最初はICTRATで使ってもらってプロモーションした後に他団体に売りつける使ってもらうという、つもりだったので商用利用できた方が後々いいよなぁと。
結局のところ、ICTRATは解散したので、オープンソースにしたわけですが。
オープンソースのライブラリを採用したおかげでオープンソース化も問題なくできました。めでたしめでたし。

ⅱ.不自由なく使いたかった。それだけ。

 

学生IDのあるアドレスを調べるのにはFeliCa Raw Viewerを使いました。
アドレスがわかったあとは、felicalib: felicalib.hや、先人の知恵を元に読み取り部分の実装をしました。あとは、win32apiのCreateThreadを用いて読み取り部分はUIスレッドと分離して処理させています。

 

2.読み取った学生IDを管理(追加、検索、削除、保存、復元)するデータ構造の部分

 学生IDをただ単に格納するだけであれば、ハッシュを使えば良いのですが、グラフを表示するにあたって、ワイルドカード検索を実装した方が良いと考えたので別の方法を模索することに。
考えた結果、オレオレ木構造(既存の木構造であれば名前を教えてください)を思いつき、学生証IDをキャンパスガイドの8ページ目の学生証の項の通りに学生IDを要素ごとに分解してそれぞれノードに格納(ラベル付け)するという形を取ることにしました。キャンパスガイドの学生ID"5BJI1199"を例にとると、
レベル0はrootノード(すべての親)、5がレベル1、Bがレベル2、JIがレベル3、1がレベル4、1がレベル5、99がレベル6といった具合です。
多分探索木であるが、B木とは異なり、枝の最大数は特に設けられていません(各レベルに新要素があれば動的に追加される)。実装のしやすさ重視でバランスの悪い木になりやすいです。。。
ですが、この木構造のおかげで"?"が指定されている要素の該当レベルの時はすべてのノードを参照という形をとることで、ワイルドカードの"?"の実装は比較的ラクにできました。

あと、データ処理まわりは再帰処理だらけになりました。(仕方ない)

 

3.検索等で得た統計結果をグラフやランキングに表示(つまり、UIまわり)

 正直、UIは苦手です。が、Win32apiというレガシーなものを使っていてもせめてグラフだけは、現代に近づけたいと思い、フラットデザイン(にしたつもり)のドーナツグラフを実装(Pie関数で円グラフに白い円を重ねているだけ)。ランキングに至っては表示できているだけで、UI/UXとしてはもの足りない感じ。あとはGDIでやっているのをGDI+で書きなおしてジャギーを無くしたい。

 

実装については以上。UI周りの進捗は7割くらい。本文にも書きましたが、メール送信部分はできてません。

最後に

どっかしらの団体でつかって欲しいなぁ。GitHubに挙げてるので各自修正したいところがあったら修正してもいいんだよという感じ。
プルリク送ってくれると生きながらえます(精神的に)。他大の人も各大学のフォーマットに合わせればいけるのではと思う次第です。