「ひとかじりのりんご」

へっぽこエンジニアの備忘録

QR Code Generatorで「code length overflow.」が頻発するので調べてみた。

前回の記事で、QR Code Generatorを使って、JavaからQRコードを出してみました。
しかし、変換する文字列が長すぎる場合、下のような例外が発生してしまいます(´・ω・`)

Exception in thread "main" java.lang.IllegalArgumentException: code length overflow. (340>72)
	at com.d_project.qrcode.QRCode.createData(QRCode.java:423)
	at com.d_project.qrcode.QRCode.make(QRCode.java:209)
	at com.d_project.qrcode.QRCode.getBestMaskPattern(QRCode.java:171)
	at com.d_project.qrcode.QRCode.make(QRCode.java:161)
	at jp.sbkro.qr.QRTeset.main(QRTeset.java:24)

それで、原因を調査してみたのですが、QRCodeクラスに与えるパラメータによって、表示できる文字数が異なることが分かりました。

以下、デンソーウェーブさんによるQRコード仕様の説明です。

QRコードのバージョン(種類)は、1から40まで設定されており、
それぞれのバージョン毎にセル構成(セル数)が決められています。
(セルとは、QRコードを構成している四角い黒白の点のことです。)

「セル構成」とは、コード中のセルの数です。
バージョン1(21セル×21セル)から始まり、
縦横それぞれ4セルずつ増えていき、
バージョン40(177セル×177セルまで設定されています。

QRコードの各バージョンは、データ量・文字種、また誤り訂正レベルに
対応した最大入力文字数が設定されています。つまりデータ量が増えると、
QRコードを構成するセルがたくさん必要になり、QRコードが大きくなっていきます。

上記の「バージョン」は、QR Code Generatorにおける「型番」に相当します。
つまり、QRCodeクラスの以下のメソッドで設定した値によって、最大表示数が変動します。

  • setTypeNumber(int typeNumber) ... バージョン
  • setErrorCorrectLevel(int errorCorrectLevel) ... 誤り訂正レベル
  • addData(String data, int mode) ... 文字種

最大表示数ですが、以下のページにまとめられています。

ソースを見たところ、QR Code Generatorは、バージョン10までの対応なので、最小4文字・最大652文字の出力が可能であり、出力する文字列に合わせて、適宜設定を変更する必要があるみたいでした。

まとめ

  • QRコードのバージョンや訂正レベルによって、表示できる文字数が異なる。
  • QRコードに変換したい文字数によって、適切なパラメータ(型番、訂正レベル、文字の種類)をQRCodeクラスへ設定する必要がある。
  • 特に、QRCodeクラスをコンストラクタからインスタンス化したとき、型番が1になるので注意すること。

JavaでQRコードを出してみた。

ちょっと気になったので調べてみた。

今回は、Kazuhiro Araseさんの「QR Code Generator 」というライブラリを使ってみました。MITライセンスなので、商用利用もオッケーだと思います。

実行環境

サンプルコード

package jp.sbkro.qr;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.d_project.qrcode.ErrorCorrectLevel;
import com.d_project.qrcode.Mode;
import com.d_project.qrcode.QRCode;

public class QRTest {
	public static void main (String[] args) {
		QRCode qrCode = new QRCode();
		qrCode.addData("qr code sample by sbkro", Mode.MODE_8BIT_BYTE);
		qrCode.setErrorCorrectLevel(ErrorCorrectLevel.H);
		qrCode.setTypeNumber(10);
		qrCode.make();
		try {
			BufferedImage image = qrCode.createImage(10, 0);
			ImageIO.write(image, "jpeg", new File("/Users/sbkro/test.jpg"));
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

		System.out.println("Complete...");
	}
}

実行結果

f:id:sbkro:20120401210649j:image:w360

まとめ

すんなりとJavaからQRコードが出力されました(*´∀`)
JavaDocもしっかり整備してあり、使い易いライブラリだと思います。

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本


前から気になっていた「デザインパターン」というものを勉強してみました。

それぞれのパターンの実装は非常に単純でした。しかし、「利用元のプログラムを変更せずに動作を変える」等、柔軟な動作が出来ることを、この本を通じて学びました。

この本では、GoF (Gang of Four)のデザインパターン23種類の中から、利用シーンが多いもの13種類について解説されています。また、Head Firstシリーズ特有の「章立てのストーリー&演習」で、実際に手を動かしながら読み進めるので、理解も深まったのではないかと思います。特に、ストーリーが良く出来ていて「パターン=ストーリー」と結びつけることが出来たのが、この本を選んで一番良かった点かと思います。

例えば...

  • Strategy Pattern
    • 振る舞いを動的に変更させる。
    • → 飛ばないアヒルの模型にロケットを積んで飛ばせる。
  • Observer Pattern
    • 状態の変更を通知する。
    • → 新聞の定期購読
  • Decorator Pattern
    • オブジェクトを装飾する。(元クラスを変更せずに、機能を追加する。)
    • → コーヒーのトッピング。トッピング後の価格を算出する。
  • Factory Method Pattern
    • オブジェクト生成を疎結合化させる。
    • → ピザ屋のフランチャイズ。店の場所によって、ピザの材料を変える。
  • Singleton Pattern
    • 唯一のオブジェクトを生成する。
    • →チョコレート工場のボイラー
  • Command Pattern
  • Adapter Pattern, Facade Pattern
    • インターフェースを変換し、連携可能にする。
    • → コンセントの電圧変換コネクタ
  • Template Method Pattern
    • アルゴリズムをカプセル化する。
    • → コーヒーと紅茶のレシピ。
  • Iterator Pattern, Composite Pattern
    • オブジェクトのコレクション管理を抽象化する。
    • → パンケーキ屋と食堂の合併。それぞれのお店のメニュー管理方法の差異を吸収する。
  • State Pattern
    • 状態によって、振る舞いを変化させる。
    • → ガムボールマシン。お金・残りガム数によって、動作を変更させる。
  • Compound Pattern
    • パターンをパターン化する。
    • MVCモデル

という感じです。

これだけ見ても多分、分からないですよね★
気になった方は、一度この本を手にとって見てください。デザインパターン初心者にはおすすめです。