HaskellでQRコードを生成するライブラリが欲しかったので探したところ、
が見つかった。両方とも試してみたので、その感想を書いておく。
QRコードの概要
QRコードを作るためには、QRコード自体について知っておかないといけない。
規格
JIS X 0510としてJIS規格になっていて、このへんで参照できる。ISO規格にもなっている。
QRコードの種類
コードする文字の種類:
- Numeric
- 数字
- Alphanumeric
- 数字、大文字アルファベットと一部の記号(URLを表現できる)
- Binary
- 8ビット文字
- 小文字アルファベットを表現できる
- UTF-8とかを使えばUnicode文字も表現できる(たぶん)
- Kanji
- JISコード
データ訂正レベル:
- L / M / Q / H
バージョン(QRコードの大きさ):
- 1から40
- 大きい方がより多くの情報を載せられる。
qrcode
Hackage: http://hackage.haskell.org/package/qrcode
GitHub: https://github.com/kizzx2/haskell-qrcode
特徴
- 全てHaskellで書かれている。
- 現在のところNumeric, Alphanumericのエンコードのみ(8ビットは非対応)。
- バージョンを明示的に指定しないといけない。
コード例
標準入力から1行読み取って、out.png
に出力する。PNG画像の生成にはJuicyPixelsライブラリを使っている。
感想
- Alphanumericがスラッシュを受け付けないという問題があったが、修正してPRを送って反映された。
- 8ビットモードは未実装とはいえ、Numeric, Alphanumericの実装とQRコードの規格を参照すればちょちょいと実装できた。
- 生成されたQRコードが読み取れない場合がある。しかし、デバッグできるほど自分にはQRコードへの造詣はなかった。
- あまり使われていないのか、バグが目立つ。
haskell-qrencode
Hackage: https://hackage.haskell.org/package/haskell-qrencode
GitHub: https://github.com/jamessanders/haskell-qrencode
特徴
- libqrencodeという、Cで書かれたライブラリへのバインディング。
- FFIを使っている関係か、エンコードする関数がIOアクションになっている。
- 枯れている(?)ライブラリへのバインディングのため、変なバグは少ないと期待される。
- バージョンを自動的に判断してくれる。
コード例
感想
- 枯れたライブラリサイコーや!「ちゃんと動く」ことこそ正義!
結局
今回の用途ではHaskellプログラムで動的にQRコードを生成する必要はないかなあと思ったので、libqrencodeに付属するqrencode
コマンドを使ってお茶を濁した。(おい)