どうもはじめまして、qiitaには初めて投稿するプログラミング初心者です。
今年の夏ごろからgolangの本を読んでいて、golangを学ぶ過程でgolangで何か作りたいなと考えてQRコードを生成するパッケージを自作してみました。
githubはこちら
※あくまでもgolangの学習目的で制作したものであり、完全な動作は保証しませんのでご注意下さい。
※QRコードのバージョン情報はバージョン7までしか記録していないので、素の状態だとバージョン7までのQRコードが生成できます。
使い方
package main
import (qrcode "github.com/taiga533/GO-QRMaker")
func main () {
//pngとしてQRコードを出力します。
//qrcode.SimplyEncode("QRコードにするデータ", "ファイルパス+ファイル名", 誤り訂正レベル[1~4], 画像サイズ[3倍なら3])
err := qrcode.SimplyEncode("テスト文字列", ."/output/qrcode", 4, 2)
}
という感じです。
作るうえで苦労したところ
- 誤り訂正符号の実装
JISの規格書(X 0510)を読めば分かる話なのですが、QRコードはBCH符号やRS符号といった誤り訂正符号を利用しQRコードの読み取り精度を上げています。
この誤り訂正符号が数学に弱い私にとっては曲者でITレストラン様やyamicha.com's Blog様を拝見しながら気合で実装しました。 - sliceを扱う
golangにおける可変長配列であるsliceの扱いでコピー先の値を変更したらコピー元の値も変更されているとかをたまに忘れしまったりして苦労しました。
作ってみてよかったと思うこと
- golangに対する理解が深まった
スターティングgo言語という本を読んだ後に作ったのですが、本を読むだけより良かったのかなと思います。 - QRコードにとても詳しくなった気がする
すごいどうでもいいことですが最近街中でQRコードを見かけると(このQRコードのバージョンいくつだ?)とか思うようになった。
後悔とこれから
今回はできる限り自分で考えることを優先して作成したので、2進数を文字列で処理しているのがダメなポイントだと思っています。後からgithubなんかでgolangのQRコード生成パッケージを見ていたらしっかり数値として扱っていたので参考にすべきでした。
なので今後なにか作ったりするときは他人のコードも参考にしていこうと思います。
それに関連してマスク処理における(1:1:3:1:1の暗:明:暗:明:暗)のパターンの減点を実装しておりませんのでご注意下さい。