15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ターミナルにQRコードを表示する

Last updated at Posted at 2015-03-10

RQRcodeColorizeを使う。

$ gem install rqrcode colorize

指定した文字列を扱える最小サイズのQRコードを作る。
空白の背景にColorizeで色をつけて表示する。

print_qr.rb
require 'rqrcode'
require 'colorize'

# 引数を受け取る (無ければ標準入力から受け取る)
str = ARGV[0] || $stdin.read

# QRコードを作成
qr = (1..40).each{|n| break RQRCode::QRCode.new(str, size:n) rescue next}
raise "文字列が大きすぎます。" unless qr.instance_of? RQRCode::QRCode

# QRコードを文字列にする
black = "  ".on_black
white = "  ".on_light_white

qr_s = qr.to_s true:black, false:white

# 白枠つける
hr = white * qr.module_count # 横幅
qr_s = [hr, qr_s, hr] * "\n"
qr_s.gsub! /^.*$/, "#{white}\\&#{white}"

# 表示
puts qr_s

qr.png

iPhoneアプリ(Workflow)で試したら普通に読めた。
使い道は不明。

あと日本語無理。


(追記: QRコードは白黒が反転してても大丈夫だったので、これでもいけた)

print_qr.rb
require 'rqrcode'
require 'colorize'

# 引数を受け取る (無ければ標準入力から受け取る)
str = ARGV[0] || $stdin.read

# QRコードを作成
qr = (1..40).each{|n| break RQRCode::QRCode.new(str, size:n) rescue next}
raise "文字列が大きすぎます。" unless qr.instance_of? RQRCode::QRCode

# 文字列にして表示
puts qr.to_s(true:"  ".swap, false:"  ")

メモ

RQRCodeについて

RQRCodeはドキュメント無い部分が多くて、ちゃんと使うならソースだいぶ読む必要がある。
Wikipediaで用語だけでも仕入れるとだいぶ分かる(気がする)。
特に「module」は点のことであって、Rubyのmoduleと全く関係ないので注意。

QRコード - Wikipedia #QRコードの用語

RQRCode::QRCode.newのsize(バージョンと呼ぶ)には1〜40を指定できる。
4ピクセルずつ大きくなる。情報量も増える。
省略した場合のデフォルト値は4。

文字列の大きさがそのバージョンで扱いきれなければRQRCode::QRCodeRunTimeErrorを吐く。

今回のコードは1〜40まで順番にエラーが出るか試すという頭の弱い方法。
明らかにもっといい方法ある。遊びだしめんどいからやらないけど。

QRコードには数字、英数、バイナリ、漢字のモードがある。
漢字のモードにすれば日本語も扱えるっぽい。
RQRCodeでもそのモードを切り替える設定あるっぽいんだけどやり方が分からなかったので諦めた。

(あと全然関係ないけど、レシートにQRコードで買い物のCSV乗っけてくれれば家計簿の記録捗るのにね)

Colorizeについて

String.color_samplesで、どんな色があるかを表示できる。
色を変えるにはその色のメソッドを使うか、String#colorizeにシンボルを渡す。

puts "文字を黄色に".yellow
# "文字を黄色に".colorize(:yellow) #同じ

puts "背景を黄色に".on_yellow
# "背景を黄色に".colorize(background: :yellow) #同じ

文字色・背景色を変える以外に、太字にしたり下線をつけたりもできる。

String.modes
# => [:default, :bold, :underline, :blink, :swap, :hide]

puts "太字にする".bold
puts "下線をつける".underline
puts "点滅させる".blink

puts "文字色と背景色を入れ替える".swap
puts "文字色を背景色と同じにする".hide

# puts "太字".colorize(mode: :bold) # シンボルで指定する場合はこう

(今回のコード、1文字ずつ色を変えてるのであんまり良くないけど気にしない)

参考

今回使ったgem

QRコードの知識

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?