qrcode is not a mark but

ネタの源はテレビ。

たぶん COVID-19 関連、おそらくそれのワクチン関係の話を、ニュースバラエティかワイドショーかどっちかでやってたとき、だと思うんだよね。たぶん2週間くらい前だったと思う。

「OS: Operating System」を「基本ソフト」とする説明はこれは、コンピュータリテラシーの低い人々に対してわかりやすくイメージしてもらうために発明された「インチキ語」なわけね。きっと誰かが主導して言い始めて、統一的に報道が使うようになった言葉ということだけれど、当然これは、ものごとの本質をずばり言い当ててる言葉ではないわけね。どうしてもわからない人に伝えたいなら、たとえばワタシなら「縁の下の力持ち」とかそういうニュアンスが込められた言葉で説明したい。「基本」ではあまりにも何も伝えてないし、そもそも「ソフトウェア」の方の読み替えはしなくていいんかい、て思う。

かくも「わからない人向けの言葉」というのは難しいものだとは思うんだけれど、その「ニュースかなにか」でさ、QR コードを、記憶おぼろげだけど「インターネット上の場所を表すマーク」みたいな説明をしてたんだよね。

「インターネット上の場所」というプレフィクスを付けてたかどうかが記憶として怪しくて、これは違ったかもしれんけど、もしもこう説明していたなら、QR コードの説明として、30点減点である。そして、こちらは間違いなく「マーク」(か「記号」かどっちか)と説明したが、なのでこれで 70点減点。つまり説明として零点。「基本ソフト」はまぁ30点くらいはあげてもいいかと思うけれど、さすがにこの QR コードの説明はダメ、全然ダメ。

ということを、そのテレビをみながら感じてた、てことだけど、まぁ例によって、モールス符号ネタと同じく、やっぱり「python でやるとしたら」を調べておきたくなった、てことね。

こういうのはやっぱり WEB 系のエンジニアなら日常なんだろうけど、ワタシはそうじゃないもんでね、必要としたことは一度しかないわけね、しかもそれは android ネタだったので、今回は Windows でも使えるものを、てことで。

ジェネレータはかなりたくさん見つかる。何も考えずに pypi 検索して見つかるものは、どうやらほぼジェネレータ。とりあえず qrcode で良さそうね。

この手のはなんでもそうだけど、「write only」がどれだけ簡単でも、読み出しは難しいことは多い。その仕組み上、QR コードが激烈に技術的課題が多くて難しい…わけはなくて、設計が良く考えられてるので「簡単」なわけなんだけれど、探そうとするとやっぱりジェネレータよりは少なくて、qrcode のスキャナーとして見つかるメジャーなものは、「zbar」を使うやつ。

ただ、「zbar 本家」はダメだね。これの python バインディングも python 2.5・2.6 のサポートまでで完全に止まってるし。なので、この本家 zbar を使う qrtools もダメ。

どうしたもんかしらねと思ってたが、やっぱり StackOverflow に答えが書かれててpyzbar に辿り着いた。pure python だったらありがたかったところだけど、残念ながらこれはそうではなくて、zbar そのものを頑張って python 3.x 対応 + windows 対応をしたものみたい。windows でもバイナリ形式での配布なので、インストールは簡単。(3.6+ ならね。)

そんなわけで、qrcode で2つ生成してみた:
hhspringshhsprings2
左の方が「QRコードを「インターネット上の場所」として説明するのは誤りである」の例になっている。スマフォやタブレットのリーダで左の QRコードを読み込んでみたとて「どこにも行けない」。url じゃないからね。これは実際どんな文字列を QR コードにしたのか? pyzbar で読み込んでみると…:

1 >>> from PIL import Image
2 >>> from pyzbar import pyzbar
3 >>> 
4 >>> print(pyzbar.decode(Image.open('hhsprings.png'))[0].data)
5 b'hhsprings'
6 >>> 
7 >>> print(pyzbar.decode(Image.open('hhsprings2.png'))[0].data)
8 b'http://hhsprings.pinoko.jp/site-hhs/2021/06/%e3%80%8cgnuplot-%e3%81%a7%e3%82%b0%e3%83%a9%e3%83%95%e4%b8%80%e4%be%8b%e3%80%8d%e5%86%85%e3%81%ab%e8%bf%bd%e8%a8%98%e3%81%a7%e6%9b%b8%e3%81%84%e3%81%a6%e3%81%9f%e3%80%8cr-%e3%81%a7%e3%82%b0/'
9 >>> 

そう、左のコードのほうは「hhsprings」という文字列なので、スマフォをかざしたって、ワタシの住所を示してるわけじゃないから、あなたはワタシの胸に飛びこんでこれない。スマフォなどに搭載されてる QR コードリーダがどういう実装にしてるかはわかんないけど、たぶん「デコードした結果それが url ならば、そこへ飛ぶ」ということをしてるだけだと思う。

「code」「encode/decode」「symbology」「符号化」もしくは「mapping/projection」などなど、およそ似たような問題を扱う概念なのだけど、コンピュータを扱う場合にこれらがやたらに登場するもんだから、過度に難しいものだと把握され、そして報道はこういうのを「これらは誰も理解できない難解なものなので、バカな愚民ども向けにおこちゃま語を発明せねば」という使命感に駆られる、という構図なんじゃないかと疑っている。けどさぁ、こういうの、ちゃんと理解しようと努めればこれはそれほど難しいことではなく、だから「バカな愚民向け読み替え」なんかそんなに必要ないはずなんだよね。

喩え方は本当に色々あるのだけれど、「狼煙」とか、チームスポーツで使われるサインとか、あるいは、航空に詳しい人はライトガンを思い出すのもいいし、当然のことながらモールス符号もそうである。要するに、「情報伝達の経路などの都合」に応じて、情報のデータを変形する、ということを、とにかくありとあらゆる場面で使っていて、それがたまたまコンピュータ内で特に頻繁に使われている、というだけのこと、なんら特別なことはない。QR コードもまさにその一味。

QRコードを、だから、正しく「誰でもわかる言い方で説明する」なら、せいぜい「コンピュータの目で読むことが出来る言葉」。


2021-06-16:
まーたやらかしてるよぉ…、今朝の「ZIP!」。半導体を「人間でいえば脳」。ちげっての。脳になぞらえる説明は悪くないけれど、そのアナロジーで言う場合は、半導体は「脳神経」がせいぜい、むしろ「脳神経細胞のための蛋白質」。「人間でいえば脳」はたとえば CPU。この誤りは、たとえば鉄の説明をしたくて「人間で言えば心臓」と言っているようなもの、この間違いをしてる人間はたぶん鉄とエンジンを同列扱いもしくは「混同」している。半導体そのものは「金属」などと同じ、物質のカテゴライズ。


2022-02-11:
そもそもQRコードそのものを「扱わねばならぬ」という人がいるならばそれは普通はワタシのような「単に興味がある」以外なら、おそらくほとんどのニーズが「WEB サイト構築向け」に集中するんだと思う。ましてや「QR コードのスキャン」を「PC な日常生活で」必要とするなんかまぁまずないだろうな、と思ってたわけよ。だって「普通に html のアンカクリックすりゃいい」わけであって、PC を使ってるぶんには QR コードで誘導される意味がない。

それはまぁそうなんだけれど、「リンク先に飛ぶため」ではなくて、「なんのリンクだ?」と確認したいシチュエーションが少なからずあるんだなぁとちょっと思ったことがあって。具体的なサイトは「18禁なサイト」だったんでここで紹介するのは避けるが、要するにそのブログには QR コードが掲載されていたんである。普通はそんなもん、あったって飾りとしか認識しない、PC で読んでる立場なら。けどそのサイト、「連絡しちくれ」と言いつつ連絡先がまったく書かれてなくて、どうしたもんか、この QR コードがそのコンタクトページに誘導してくれたりせんか、確認出来んか、と思った、てハナシ。

これを上で書いた知識だけで済ませることはもちろん可能だけれど、「イメージファイル」を必要とするのが面倒だよな、と、「思ったとしたならば」:

1 # -*- coding: utf-8 -*-
2 from PIL import ImageGrab
3 from pyzbar import pyzbar
4 
5 img = ImageGrab.grabclipboard()
6 print(pyzbar.decode(img)[0].data)

これにより、たとえば Chrome で QR コード画像上で右クリックして「名前を付けて画像を保存」ではなく「画像をコピー」でイケちゃうぜ、てことね。百億倍楽だ、て話ではないけどさ、ダウンロードする画像置き場に困るとかダウンロードした画像を消し忘れてゴミがたまるとかがないので、1.34392倍くらいは気軽であろうとは思うよ。なお、戻りは bytes 列なので、Unicodeへのデコードとかは適宜やってくれ。