2010년 7월 14일 수요일

블로그에 QR Code 달기

근래에 스마트폰에 대한 관심이 증가하면서 홈페이지에 한 귀퉁이에 QR Code가 달려 있는 것을 심심찮게 볼 수 있는데, Android Phone이나 iPhone 같은 스마트폰에는 QR Code Scanner 애플리케이션이 기본으로 갖추어져 있어서 이 QR Code를 읽기만 하면 어렵게 손으로 입력할 필요 없이 자동으로 해당 URL로 이동할 수 있게 됩니다.

물론, QR Code가 URL 정보만 담을 수 있는 것은 아닙니다. 연락처, E-mail 주소, 전화번호, 위치정보, 일반 문자열 등 매우 다양한 정보를 담을 수 있기 때문에 스마트폰에서 QR Code의 주요한 목적은 한번의 스캔으로 간편하고 빠르게 정보를 가져오는 것입니다.

그래서, 비록 Blogger가 아직 공식적인 모바일용 템플릿을 지원하고 있지는 않지만(요즘 스마트폰들 Full-Browsing 잘 지원하니까 괜찮아요. ㅡㅡ^), QR Code만이라도 달아보고자 이리저리 검색을 해보고 다녔습니다.

처음에 goo.gl의 단축 URL에 '.qr'만 붙이면 QR Code가 나온다는 정보를 입수하고 그것을 어떻게 활용할 방법이 없을까 고민하면서 이리저리 테스트했는데, 생각보다 쉽지 않더군요. goo.gl에서 생성된 QR Code URL을 JSON 형식으로 돌려주는 Google App Engine 용 애플리케이션을 만들고, 다시 그것을 Javascript를 활용해 동적으로 페이지에 IMG 태그 형태로 삽입하는 그런 것... 이 모든 것이 다 부질 없는 짓이었습니다. 조금 더 검색해보니 더 확실하고 더 간단한 방법이 있더군요.

그것은 바로 Google의 Chart API를 사용해서 QR Code 이미지를 얻는 방법입니다. 이 방법은 Blogger뿐만 아니라 다른 블로그, 또는 일반 웹사이트까지 다양하게 적용할 수 있습니다. 먼저 아래 사이트를 방문해서 내용을 한번 읽어본 다음 나머지 글을 보면 더 이해가 쉽습니다.

LINK: How To Add QR Code In Blogger Or BlogSpot?

위 사이트에서 알려주는 방법은 Google의 Chart API를 사용해서 고정된 URL에 대한 QR Code 이미지를 받는 것인데, 조금만 응용하면 매 블로그 글마다 고유한 QR Code를 붙일 수 있습니다. QR Code를 삽입하고 싶은 적절한 위치에다 아래 HTML+Javascript 코드를 붙여주기만 하면 됩니다. 경우에 따라서 location.href 부분을 다른 것으로 대체해야 할 수도 있지만, 대부분의 경우 그냥 써먹을 수 있습니다. QR Code 이미지의 크기는 chs=150x150 부분을 수정하면 조정할 수 있습니다. (가로x세로)

Blogger에서는 HTML/Javascript 가젯을 하나 추가하고 그 내용으로 아래 코드를 입력하면 잘 동작합니다.
<div id="QRCodeDiv"></div>
<script type="text/javascript">
var eurl = encodeURIComponent(location.href);
document.getElementById("QRCodeDiv").innerHTML = "<img src=\"http://chart.apis.google.com/chart?cht=qr&chs=150x150&chl=" + eurl + "\" alt=\"QR Code\"/>";
</script>
이제 QR Code 달아보세요.

2010년 7월 12일 월요일

Emacs 나눔로또 API & Module

아래 내용은 초기 버전에 대한 것으로 업데이트된 최신 내용은 프로젝트 위키 페이지에서 확인하실 수 있습니다. -- 2011-04-19
LINK: lotto-check-el/wiki/EmacsLottoApi



로또 이야기가 계속 이어지네요. 이 정도 정성이면 로또 1 등 내려주실 법도 한데, 5 등 한번 당첨되기도 쉽지 않으니 하늘이 무심(?)하십니다.

이번에는 Emacs에서 사용할 수 있는, 나눔로또 정보 및 당첨 여부 확인 모듈을 만들었습니다. Emacs Lisp 공부도 좀 하고 앞서 만들었던 로또 당첨 정보 Web API도 써먹어 볼 겸 만들어 본 것입니다. 그리고, 이번에 만든 것은 무려 소스까지도 공개합니다. 부끄러운 소스지만, 어쨌거나 GPL version 3를 채택해서 공개해봅니다.

공개된 소스의 저장소 URL은 다음과 같습니다.
LINK: http://bitbucket.org/kaisyu/lotto-check/
LINK: https://code.google.com/p/lotto-check-el/
LINK: https://github.com/kaisyu/lotto-check
LINK: https://gitlab.com/kaisyu/lotto-check

1. 소개 및 특징

로또 당첨 번호와 내가 구매한 로또의 당첨 여부를 Emacs에서 간편하게 확인할 수 있는 모듈입니다. 이 모듈은 다음과 같은 특징을 가지고 있습니다.

1) 인터넷을 통해 로또 정보를 수집하는 방법을 하나 이상 지원합니다.
로또 당첨 번호 정보는 인터넷을 통해 수집하게 되는데, 기본으로 @Lotto_K 계정에 게시되는 것과 동일한 정보를 사용하는 lotto.kaisyu.com 사이트의 Web API를 사용합니다. 그리고, 혹시라도 이 사이트에 문제가 생겼을 경우를 대비해 네이버, 다음, 나눔로또 공식 홈페이지 등의 대체 방법도 제공합니다.

2) Hashtable을 활용한 local cache를 유지합니다.
이로 인해 한번 가져온 로또 정보는 추가 인터넷 연결 없이 매우 빠르게 그 결과를 확인할 수 있습니다. 이 local cache는 lotto-check 모듈이 로드되거나 평가될 때 파일로부터 자동으로 읽혀져 초기화 되고, Emacs가 종료될 때 자동으로 파일에 저장됩니다.

3) 간단하게 즉시 사용할 수 있는 interactive 함수를 제공합니다.
M-x 함수명 형식으로 사용할 수 있는 함수들을 제공합니다. 로또 당첨 번호 정보를 보여주고, 사용자가 제공한 번호의 당첨 여부도 확인해주는 함수들로, 그 결과가 새로운 전용 buffer에 출력되거나 message 형태로 보여집니다. 자세한 것은 아래에 다시 소개하겠습니다.

4) 다른 모듈에서 간편하게 사용할 수 있는 API 함수를 제공합니다.
위에서 소개한 interactive 함수들과 동일한 역할을 하는 API 함수가 존재하는데, interactive 함수들과 다른 점은 반환값이 lisp object 형태로 되어 있어 재가공하거나 변환하여 사용하기 편리하다는 점입니다.


2. 설치 및 설정

1) 설치
다운로드한 소스를 load path에 추가해줍니다.
(add-to-list 'load-path "[lotto-check 모듈이 있는 경로]")
(require 'lotto-check)

2) 설정
Emacs의 Customize 기능(M-x customize)을 사용해서 Applications 그룹 아래의 Lotto 그룹으로 가면 간편하게 설정할 수 있는 UI가 제공되지만, 아래와 같이 직접 startup script 파일에 설정을 추가하는 것도 가능합니다.
;; 로또 당첨 정보를 인터넷으로부터 수집하는 함수를 지정합니다.
;; 기본값은 lotto-retrieve-numbers-from-lotto-k 함수이며,
;; 네이버, 다음, 나눔로또 공식 홈페이지, 사용자 정의 방법 등을 제공합니다.
;; 네이버: lotto-retrieve-numbers-from-naver
;; 다음: lotto-retrieve-numbers-from-daum
;; 나눔로또 공식 홈페이지: lotto-retrieve-numbers-from-645lotto
;; 사용자 정의 함수: lotto-info-retrieve-func-custom
;; * 사용자 정의 함수 방식을 사용할 경우 lotto-info-retrieve-func-custom 변수에
;;   사용자 정의 함수 이름을 지정합니다.
;;   예) (setq lotto-info-retrieve-func-custom 'my-retrieve-func-1)
(setq lotto-info-retrieve-func 'lotto-retrieve-numbers-from-lotto-k)
;; 로또 당첨 정보를 저장할 파일을 지정합니다.
(setq lotto-database-file "~/.lotto-database")
;; interactive function 실행 시 결과를 별도의 buffer에 보여주도록 설정합니다.
(setq lotto-use-buffer-for-message t)


3. 사용

1) interactive 함수 사용하기
  • M-x lotto-retrieve-numbers-i특정 회차의 당첨 번호 정보를 보여줍니다.
    실행하면 mini-buffer에 game no: 프롬프트가 뜨는데, 가져올 로또 회차 번호를 입력합니다.
    예) game no: 397
  • M-x lotto-check-numbers-list-i특정 회차에 사용자가 지정한 번호의 당첨 여부를 확인하여 결과를 보여줍니다.
    실행하면 minu-buffer에 game no: 프롬프트와 your numbers: 프롬프트가 뜨는데, 각각 비교할 로또 회차 번호와 확인할 번호 list를 입력합니다.
    확인할 번호 list 형식은 일반적인 lisp object와 동일합니다.
    예) your numbers: ((1 14 16 25 33 42) (2 10 17 26 34 43))
  • M-x lotto-save-db-to-file-ilocal cache에 저장된 로또 당첨 번호 정보를 파일에 저장합니다. 사용자가 수동으로 저장하지 않아도 Emacs 종료 시 자동으로 저장됩니다.
  • M-x lotto-load-db-to-file-i파일에 저장된 로또 당첨 번호 정보를 불러옵니다. 사용자가 수동으로 불러오지 않아도 lotto-check 모듈을 불러올 때 자동으로 local cache도 함께 불러옵니다.
[lotto-check 모듈 실행 결과]

2) API 함수 사용하기
(lotto-retrieve-numbers GNO)

로또 당첨 번호를 반환합니다.
GNO: 가져올 로또 회차 번호
반환값: ((당첨_번호_list) 보너스_번호)

예) (lotto-retrieve-numbers 395)
=> ((11 15 20 26 31 35) 7)
(lotto-check-numbers-list GNO MY-NUM-LIST)

주어진 번호의 당첨 여부를 반환합니다.
GNO: 비교할 로또 회차 번호
MY-NUM-LIST: 확인할 번호들의 list
반환값: ((등급 (일치한_번호_list)) ...)

예) (lotto-check-numbers-list 395 '((1 2 3 4 5 6) (11 15 20 28 32 36)))
=> ((0 nil) (5 (11 15 20)))