2015年6月24日水曜日

Rubyで大量のQRバーコード画像を生成する

Rubyで簡単にQRコード画像を生成する方法

http://qiita.com/ryosy383/items/c753103c93fa177e4466

を参考に大量に画像ファイルを作成してみました

Windows7環境下でRubyを導入し、rqrcode をインストールする必要があります

Ruby2.2.2-x64 でgemのバージョンを最新に上げトライしました

gem のバージョンを調べるには、コマンドプロンプトで gem -v
gem をアップデートするには、コマンドプロンプトで gem update --system 

Ruby-2.1.1-x64 では gem のアップデートでSSL絡みのエラーが出て
上手くいきませんでした

この環境で rqrcode を導入します

$ gem install rqrcode_png

依存関係のあるライブラリ「rqrcode」と「chunky_png」もインストールされます

# -*- encoding: sjis -*-
require 'rqrcode'
require 'rqrcode_png'
require 'chunky_png'

file_name = ARGV[0]

File.open(file_name,'r') do |file|
   file.each_line do |line|
   line.chomp! 
field = line.split("\t")   

# sizeはQRのバージョン、level は誤り訂正レベル
qr = RQRCode::QRCode.new( field[1], :size => 1, :level => :h )
png = qr.to_img

#300, 300はリサイズのサイズ(ドット数)
png.resize(300, 300).save(field[2])

   end

end


今回、複数件のQRコードを生成させる為に、QR化した内容と保存ファイル名を
テキストファイルで用意してテストしました

テキストファイルの中身は

1 00001 c:\QR1\0001.png
2 00002 c:\QR1\0002.png
3 00003 c:\QR1\0003.png
4 00004 c:\QR1\0004.png
5 00005 c:\QR1\0005.png

生成させるドットサイズは印字するプリンターの解像度数を元に決定しました
QRコードの大きさは1セルを構成するドット数とバージョンで決まります


解像度 600dpi(1ドットで約0.0424ミリ)
バージョン 1(21セル × 21セル)
ドット数 12 (12ドットで0.5088ミリ=1セル)

の場合、Rubyのライブラリー rqrcode で作られる画像は余白が左右各2セル、2+21+2=25セル、12ドットでは25セル×12ドット=300ドット、生成された画像を600dpiで印字すると10.68ミリ四方のQRコードが生成される

セルの大きさ、最適サイズについては以下のサイトが詳しいです

http://www.qrcode.com/howto/cell.html

バッチで上記のスクリプトを動かし以下の様なQR画像が得られました



フォーマットはpngになってしまうので、必要であれば画像のフォーマットを変更する必要がある


































EPSON PX-1004 A3 インクジェットプリンター 「インク残量」が確認できない

先週、久し振りにEPSON PX-1004 A3 インクジェットプリンターをUSBを介してPCに接続したところ「インク残量」が表示されなくなってしまっていることに気付きました

OSはWindows7 professional 64bit
PCはHP Compaq 6000 Pro

「インク残量は」EPSON プリンタウインド !3というユーティリティーを通じて随時プリンターから情報が送られていて、そろそろインク切れ、どの色が無くなりそうなどが表示される仕組みになっています

逆に、このユーティリティーが正常に働かないと、インク切れになっても、どのインクが無くなったのかが分からなくなってしまう、無いと困る仕組みです

こんな表示がでるようになりました


なんだろう?

ドライバーの更新など一通りの対応を試みたが改善されず、、、、仕方なくEPSONのサポートに問い合わせたところ、次の様な指示がありました

・デバイスマネージャの「ユニバーサル シリアル バス コントローラー」の下に「USB 印刷サポート」が表示されているか?(USBを抜き差しすると表示も変化する)

・スタートメニューから「デバイスとプリンター」を選択、該当のプリンターのアイコンを右クリック、「プリンターのプロパティ」を開き「ポート」タブを開く。ポート名とプリンター名を確認。株の「双方向をサポート」のラジオボタンにクリックが入っているか?

・「デバイスとプリンター」でPX-1004のアイコンを右クリックして「デバイスを削除」、プリンタードライバーの入れ直し

・これで駄目なら、セキュリティソフトなどが邪魔している可能性があり、その状況は個別なのでサポートの対象にならない

という事でした
いずれにも該当せず、表示されないままです

問題を切り分ける為にいくつかのテストを試みました

・他のWindows7でテスト → 問題なし

・不調のWindows7上のXpモードでのテスト → 問題なし

プリンター自体は問題なし、不調のWindows7機もハードウエア的な問題はなさそう

こうなるとHP機のWindows7の不調が一番怪しいことになります
HPのサポートに症状を伝えると、不調が「インク残量」絡みだけという事であればドライバーのバージョンを変えてみるなどを試みた方が良いのでは?との見解を貰いました

念の為に、放電とCMOSクリアを実行しましたが変化なし

バックアップは数日前に取ったばかりですが、それより前の物は廃棄してしまったばかりで、前回PX-1004を接続した頃のイメージファイルはありません

こうなると、手間の掛かるリストアしかありません、、、、、



駄目元でsfcコマンドを実行してみました

コマンドプロンプトを管理者権限で開き

sfc /scannow

システムファイルのチェックと改善を図りました
いくつかのファイルの不具合があった模様

findstr /c:"[SR]" %windir%\Logs\CBS\CBS.log >"%userprofile%\Desktop\sfcdetails.txt"

とコマンドを打つとデスクトップにsfcdetails.txtが生成されます

このリストから bidispl.dll が怪しそうと分かり、正常そうなものと入れ替えてみました
システムファイルの入れ替えは少々の手間が必要になります

takeown /f C:\Windows\System32\bidispl.dll

icacls C:\Windows\System32\bidispl.dll /grant administrators:F

copy F:\temp\bidispl.dll C:\windows\system32\bidispl.dll

こんな様な感じで行いました

最初の2行は管理権限を設定する為のコマンドです


この時は結果は改善されませんでした!(と思われました)


諦めてリストアの準備を始めました

それでも、現在のディスクでのリストアは避けたかったので、予備のHDDに換装してリストアを開始

ここで一つ気になる事が、、、

SATAのコネクターが緩い、、!


交換も考えましたが、とりあえずしっかり嵌めて予備HDDへWindows7をリストアしてみる
リストアできたところで、PX-1004を繋いでみる、何の問題もなし、、、

やっぱりWindows7を入れ直してシステムの再構築しかない!
と結論付け、それは後日時間があるときにとして、とりあえずは元のHDDに戻しました

戻したところ、、、「インク残量」表示が復活しました!

いきなり!!





なんででしょう(笑)
関係のあるアクションは2つしかありません

・sfc の結果を受けて bidispi.dll を入れ替えたから?

・SATAケーブルの接触を改善したから?

2つの内のどちらかしかありません
dll を入れ替えた時には効果は見受けられませんでした
プリンターと通信させて、もう少し待っても良かったのかなとは思いますが影響はなかったと思います

そうなるとSATAしかありません!

ただ、、、不調な時でも、Xpモードでは繋がったのが疑問ではあります
仮想ディスク上でのエミュレーションなので、システム内での処理の仕方が違うのかも知れません、今のところ再現できなくなってしまいこれ以上は追えない状況になってしまいました。

SATAケーブルの不調は、1度起動時に突然落ちた事があったので、可能性は感じていますが、PCとプリンターの通信に影響がでるものなのか?

再発した時の為の忘備録としてまとめた次第です