열한번째 날: QR 코드 ♡ 터미널

저자

@keedi - Seoul.pm 리더, Perl덕후, 거침없이 배우는 펄의 공동 역자, keedi.k at gmail.com

시작하며

바코드(barcode)는 광학 기기가 판독할 수 있도록 고안된 굵기가 다른 흑백 막대로 조합시켜 만든 코드입니다. 전통적인 바코드는 서로 굵기가 다른 막대 모양의 이미지를 적절한 간격으로 배치해서 숫자나 문자를 표현합니다. 최근에는 QR 코드(QR code)처럼 단순한 막대 모양이 아닌 사각형의 배열의 점으로 자료를 표현하는 2차원 코드도 개발되어 많은 양의 정보를 담기도 합니다. QR 코드는 숫자나 영문자 뿐만 아니라 유니코드 문자를 담는데에 전혀 무리가 없기 때문에 활용도는 무궁무진합니다. 지금까지는 QR 코드를 이용하는 입장이었다면, 이번에는 반대로 전달하고 싶은 정보를 QR 코드로 제공한다면 어떨까요? 자신의 명령줄 프로그램에서 모바일 기기와 연동해서 정보를 전달해야 할 경우 해당 정보를 눈으로 보고 일일이 모바일 기기로 옮겨 적을 것이 아니라 QR 코드를 터미널에 짠!하고 뿌려준다면 손쉽게 정보를 보내줄 수 있겠죠?

준비물

필요한 모듈은 다음과 같습니다.

Term::QRCode 모듈은 내부적으로 CPAN의 Text::QRCode 모듈을 사용하고 있는데 이 의존 모듈은 libqrencode 라이브러리를 사용하는 XS 모듈이기 때문에 관련 패키지 설치가 필요합니다. 데비안 계열의 리눅스를 사용하고 있다면 다음 명령을 이용해서 패키지를 설치합니다.

$ sudo apt-get install libqrencode-dev

직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.

$ sudo cpan Term::QRCode

사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.

$ cpan Term::QRCode

터미널에 QR 코드라고?

네? 터미널에 QR 코드라구요? 음, 그러고 보니 QR 코드 자체는 옛날 흑백 TV의 노이즈 처럼 생겼습니다. 다행히 사선이라던가, 곡선과 같은 패턴 없이 흰 공백과 검은 네모로 이루어져있죠. 아! 그렇다면 혹시...?

네 맞습니다. 바로 ANSI 제어 문자를 이용하는 거죠! 간단한 문자열을 담고 있는 QR 코드를 생성해보죠.

#!/usr/bin/env perl

use utf8;
use strict;
use warnings;
use Term::QRCode;

print Term::QRCode->new->plot( '2015 Seoul.pm 펄 크리스마스 달력' ) . "\n";

실행 결과는 다음과 같습니다.

qrcode 그림 1. QR 코드 - 기본 (원본)

호오! 터미널인데도 불구하고 일반적으로 우리가 흔히 볼 수 있는 QR 코드와 동일한 모양의 이미지가 출력되는군요.

출력 색상 조정

QR 코드는 결국 0과 1의 정보를 흰 네모 또는 검은 네모로 표시하고 있습니다. 가장 끝 테두리는 quiet zone이며, 세 귀퉁이는 QR 코드가 회전하거나 비뚤어져 있어도 인식할 수 있도록 위치 정보를 가지고 있으며, 그 이외에 몇가지 버전 및 형식 정보를 제외한 대부분의 이미지는 데이터 영역이죠. 즉 꼭 QR 코드가 흰색과 검정색이어야만 하는 것은 아닙니다. QR 코드의 색상도 얼마든지 조정해도 인식에 문제가 없으며, 물론 터미널에서 색상을 조정하는 것도 어렵지 않습니다. 딱히 특별한 기능은 아니지만 모듈 공식 페이지에 해당 인자가 언급되어 있지 않아 모르고 넘어가는 경우가 많아 소개합니다.

#!/usr/bin/env perl

use utf8;
use strict;
use warnings;

use Term::QRCode;

my $qrcode = Term::QRCode->new(
    white => 'on_black',
    black => 'on_white',
);

print $qrcode->plot('2015 Seoul.pm 펄 크리스마스 달력') . "\n";

실행 결과는 다음과 같습니다.

qrcode-invert 그림 2. QR 코드 - 반전 (원본)

대충 보면 똑같아 보이지만, 눈이 아프더라도 자세히 살펴보면 이전과 달리 흰색과 검정색 부분이 반전 된 것을 알 수 있습니다.

기본 칼라 터미널이라도 ANSI 제어 문자가 허용하는 대부분의 색상을 이용할 수 있지만 여러분의 터미널이 256색상을 지원한다면(2015년 기준 당연히 지원하겠지만 특별히 지정하지 않았다면 기본으로는 16색상 지원입니다. :), 더욱 다양한 색상을 이용해서 QR 코드를 출력할 수 있습니다.

my $qrcode = Term::QRCode->new(
    white => 'on_rgb151',
    black => 'on_bright_blue',
);

qrcode-256 그림 2. QR 코드 - 256색 (원본)

이야, 터미널에 이렇게 영롱한 QR 코드가 출력되다니 감동이네요. :-)

정리하며

전통적인 바코드는 워낙 단순하기 때문에 인식 속도가 빠르며, 저렴한 가격에 리더기를 확보할 수 있는 것이 가장 큰 장점입니다. 그에 비해 QR 코드는 상대적으로 복잡하기 때문에 인식 속도가 느리며, 리더기 가격이 높다는 것이 단점이어 보급이 주춤했었죠. 하지만 최근 스마트폰의 폭발적인 보급 덕에 일상적으로 QR 코드를 사용하는데 지장이 없는 수준까지 1인 1 QR 코드리더기를 확보하게 된 셈이며, 고사양의 스마트폰 덕분에 인식 속도도 사용에 무리가 없을 정도로 빨라졌답니다. 즉, 여러분의 명령줄용 프로그램이 모바일 기기와 정보를 주고 받아야 할 일이 있을때 QR 코드를 사용하는데 있어 주저할 필요가 없다는 의미입니다.

Enjoy Your Perl! ;-)

EOT

blog comments powered by Disqus