2010년 5월 29일 토요일

Emacs에서 Twitter 사용하기

Emacs에서 사용할 수 있는 Twitter client는 몇 가지가 있습니다. 그 중에서도 twittering-mode가 가장 잘 구현되었다고 생각되는데, Windows 환경에서 제대로 설정하고 사용하기까지 약간의 문제가 있었던 지라 글로 남겨 봅니다.

1. twittering-mode 소스 내려받기
먼저, 소스를 받아옵니다. git를 사용할 수 있다면 아래와 같이 repository로부터 직접 clone 하는 것이 가장 좋습니다.
git clone git://github.com/hayamiz/twittering-mode.git
그렇지 않다면, github 사이트에서 최신 소스를 내려 받은 후 압축을 풉니다.
Linkhttp://github.com/hayamiz/twittering-mode/archives/master

2. twittering-mode 설치하기
.emacs와 같은 설정 파일에 아래 내용을 추가하면 바로 사용할 수 있다고 알려져(?) 있습니다. (그러나, Windows 환경에서는 조금 더 손을 봐야 합니다.)
(load "~/.emacs.d/twittering-mode/twittering-mode.el") ;; twittering-mode 소스 경로
(require 'twittering-mode)
(setq twittering-username "사용자ID") ;; Twitter ID
(setq twittering-password nil) ;; 패스워드를 설정하지 않으면 prompt를 통해 물어보기 때문에 설정하지 않아도 상관 없음
그리고, Emacs 22 이상 버전을 사용하는 경우에는 소스 경로에서 아래의 두 폴더를 삭제해주는 것이 좋습니다. (twittering-mode 소스를 site-lisp처럼 sub-directory를 자동으로 검색하는 곳에 넣으면 emacs 원래 소스와 충돌을 일으킵니다.)
emacs21
url-emacs21

3. OAuth 인증 방식 적용하기
twittering-mode는 기본적으로 basic authentication 방식을 사용합니다. 그러나, Twitter API에서 2010년 6월부터 더 이상 이 방식을 제공하지 않기로 했기 때문에 OAuth 방식을 사용하도록 설정해줄 필요가 있습니다.
2010년 6월 5일자로 twittering-mode 1.0 버전이 릴리즈 되면서 OAuth 방식이 기본으로 사용되기 시작했습니다. 그리고, 개발자가 Twitter OAuth client에 등록한 twmode의 Consumer Key/Secret 또한 포함하고 있기 때문에 별도로 OAuth client를 등록할 필요가 없어졌습니다. 그러므로, 아래 내용 중 1) 번 내용은 더 이상 필요하지 않습니다. 바로 2) 번으로 진행하면 됩니다. (2010.06.07)

1) Twitter에 OAuth client 등록하기 (1.0 버전 이후 불필요)
아래 그림과 같이 OAuth client 등록 페이지로 가서 나만의 twittering-mode client를 등록합니다. Application NameOrganization에는 원하는 이름 아무 것이나 사용해도 되지만, 'twitter'라는 단어가 들어갈 수 없다고 나오더군요. 그리고, Application Name은 이미 다른 사람이 등록한 것과 동일할 수 없기 때문에 이미 등록된 것이라고 나올 경우 적절히 재조정이 필요합니다.

[새로운 OAuth client 등록 화면]

등록이 완료되면 아래 그림과 같이 등록된 client에 대한 정보를 보여주는데, 여기서 Consumer keyConsumer Secret 값을 복사해둡니다.
[등록된 twittering-mode client 정보 확인]

2) twittering-mode에서 OAuth 방식 사용하도록 설정하기
설정 파일에 아래 내용을 더 추가합니다. 이것으로 기본적인 사용이 가능하게 됩니다. 그러나, 매번 twittering-mode 실행할 때마다 새로 인증 과정을 거치기 때문에 조금 불편합니다.
twittering-mode 1.0 버전 이후부터는 별도로 Consumer Key와 Secret을 지정해줄 필요가 없으므로 twittering-oauth-invoke-browser 정도만 설정해주면 됩니다. (2010.06.07)
(setq twittering-auth-method 'oauth)
(setq twittering-oauth-use-ssl t)
(setq twittering-oauth-invoke-browser t)
(setq twittering-oauth-consumer-key "Consumer key 입력")
(setq twittering-oauth-consumer-secret "Consumer secret 입력")
어쨌거나 여기까지 추가하고 M-x twit 이라고 실행하면 아래와 같이 access token 발급을 위한 승인 및 PIN 확인 절차를 거치게 되는데, 브라우저에 나타난 PIN 정보를 Emacs에 입력해주면 최종적으로 Timeline 내용이 보이게 됩니다. 혹시 브라우저가 자동으로 뜨지 않을 경우 수동으로 브라우저를 실행하고 Emacs 화면에 나온 주소를 입력해주면 됩니다.
[M-x twit 실행]
[승인]
[PIN 발급]
[Timeline이 뜬다!]

3) 한번 발급된 access token 계속 사용하기
Twitter 정책 상 한번 발급된 access token은 사용자가 명시적으로 Twitter 홈페이지 Settings -> Connections 페이지에서 revoke 처리하기 전까지는 계속 저장된 채로 유지됩니다. 그리고, 매번 로그인할 때마다 PIN 입력하고 새로운 access token을 발급받는 것은 꽤 번거로운 일이지요. 그래서, 한번 발급된 access token을 계속 사용하도록 설정을 해두면 여러 모로 편리합니다.
[Access token 발급 후 Connections 페이지에 등록된 모습]
일단, access token이 성공적으로 발급되면 twittering-oauth-access-token-alist 변수에 그 내용이 저장됩니다. 그리고, twittering-account-authorization 변수값이 'authorized 로 변경됩니다. 그러니까, *scratch* 버퍼나 ielm 상에서 twittering-oauth-access-token-alist 변수값을 가져온 후 아래와 같이 그대로 설정 파일에 추가해주면 됩니다.
(setq twittering-oauth-access-token-alist '(PIN 입력 후 생성된 access token 값 입력))
(setq twittering-account-authorization 'authorized)
[ielm 상에서 twittering-oauth-access-token-alist 변수값 확인]
그러면 이제부터 더 이상 PIN 입력하는 과정 없이 바로 Timeline이 뜨게 됩니다.

4) 기타 설정
지금까지 추가한 설정 내용 외에 편의를 위해 추가해주면 좋은 내용들이 조금 더 있습니다.
(setq twittering-use-native-retweet t) ;; Twitter에서 제공하는 Retweet 방식 사용
(twittering-icon-mode t) ;; 기본으로 트윗 항목 앞에 프로필 이미지를 표시
(setq twittering-timer-interval 180) ;; 각 timeline을 새로 고치는 주기(단위는 초)

4. Windows 환경에서 sha1sum 관련 문제
Emacs lisp의 sha1 함수는 내부적으로 처리할 수 있는 문자열의 길이에 제한(500 자)을 두고 있습니다. 그리고, 그 길이 제한을 넘게 되면 외부의 sha1sum 프로그램을 사용해 hash 값을 구해오는 방식으로 동작합니다. 그런데, Windows 환경에서는 sha1sum 같은 유틸리티가 기본으로 제공되지 않습니다. 그래서, 한글이 포함된 글을 posting 시도할 경우 url encoding을 거치면서 hash 처리해야 할 문자열 길이가 몇 배로 길어지기 때문에 에러를 만나게 될 수도 있습니다.
이 문제를 해결하기 위해서는 Windows 용으로 빌드된 sha1sum.exe 파일이 필요한데, Cygwin이나 MinGW32가 설치되어 있다면 그 안에 포함된 것을 사용하면 되고, 그렇지 않다면 다음 주소에서 받아서 사용하면 됩니다.
Downloadhttp://www.nfllab.com/sums/sums611.zip
출처: http://blog.nfllab.com/archives/152-Win32-native-md5sum,-sha1sum,-sha256sum-etc..html
제 경우, Cygwin이 설치되어 있기 때문에 Cygwin에 포함된 파일로 경로를 설정했습니다.
(setq sha1-program "c:/cygwin/bin/sha1sum.exe") ;; sha1sum.exe 파일의 절대 경로를 지정

5. 단축키
이제 설정도 다 끝나고 잘 사용하는 일만 남았네요. 잘 사용하려면 단축키를 알아야겠죠. 주로 사용하게 되는 단축키는 아래와 같습니다.
C-c C-r   replies timeline 보기
C-c C-u   user timeline 보기
C-c C-d   direct messages timeline 보기
L         list timeline 보기
C-c C-q   Twitter의 search 결과 보기
g         현재 timeline 내용을 새로 고침
C-c C-s   트윗 작성
u         트윗 작성
C-c D     트윗 삭제
C-c C-m   retweet
d         direct message 작성
C-m       상황에 따라 적절한 행동(링크 열기, reply 작성하기 등)
<enter>   상황에 따라 적절한 행동(링크 열기, reply 작성하기 등)
j         다음 트윗 항목으로 이동
k         이전 트윗 항목으로 이동
q         현재 timeline 닫기
i         트윗 항목 앞에 프로필 이미지 보이기 모드 토글
더 상세한 내용은 다음과 같습니다만, 한번 쯤 눌러보면 대강 짐작할 수 있는 것들이라 번역은 생략합니다. ;)
C-c C-f      friends timeline
C-c C-r      replies timeline
C-c C-g      public timeline
C-c C-u      user timeline
C-c C-d      direct messages timeline
C-c C-s      update status interactive
C-c C-e      erase old statuses
C-c C-m      retweet
C-c C-h      set-current-hashtag
C-m          reply or open link
C-c C-l      update lambda
<mouse-1>    click
C-c C-v      view user page
C-c D        delete status
a            toggle activate buffer
g            refresh current timeline
u            update status interactive
d            direct message
v            other user timeline
V            visit timeline
L            other user list interactive
f            switch to next timeline
b            switch to previous timeline
j            goto next status
k            goto previous status
l            forward char
h            backward char
0            beginning of line
^            beginning of line text
$            end of line
n            goto next status of user
p            goto previous status of user
C-i          goto next thing
M-C-i        goto previous thing
<backtab>    goto previous thing
<backspace>  scroll down
M-v          scroll down
SPC          scroll up
C-v          scroll up
G            end of buffer
H            goto first status
i            icon mode
r            toggle show replied statuses
s            scroll mode
t            toggle proxy
C-c C-p      toggle proxy
q            kill buffer
C-c C-q      search

2010년 5월 13일 목요일

나눔로또 유감

얼마 전에 나눔로또 공식 홈페이지에서 로또 당첨 번호 정보를 가져오는 방법에 대해 글을 쓴 적이 있습니다. Google App Engine (Python)을 사용해서 간단한 데모 사이트도 만들었는데, 요 며칠 사이에 데모 사이트가 제대로 동작하지 않는 겁니다. 무슨 일일까 궁금해 에러 로그를 살펴보고 몇 가지 간단한 테스트를 해본 결과, 나눔 로또 공식 홈페이지에서 Google App Engine 사이트로부터 오는 트래픽을 차단했다는 사실을 알게 됐습니다. (다른 곳도 차단했는지 어떤지는 잘 모르겠지만, 제가 확인해본 범위 내에서는 아직 없습니다.)

흠... 뭐랄까요, 기분이 좀 묘합니다.

설마 제가 쓴 글 때문에 Google App Engine으로부터 엄청난 트래픽이 발생한 걸까요? 아마 그렇지는 않을 겁니다. 제 블로그는 변방에 있는 잘 알려지지 않은 곳이고, 최근 트래픽 분석 로그를 확인해봐도 제가 쓴 글에 대한 조회수가 얼마 되지 않습니다. 결국 그냥 자기네 사이트의 정보를 활용하는 것이 아니꼬왔기 때문이 아닐까요? (저는 오히려 나눔로또 공식 홈페이지 운영팀에서 제가 쓴 글을 어떻게 알고 찾아와서 봤을까 하는 점이 더 궁금합니다.) 차라리, Google App Engine에서 오는 트래픽을 차단한 이유가 실제로는 전혀 다른 데에 있고 우연히 제가 글을 쓴 시점과 비슷하게 겹친 것을 오해하고 있는 것이라면 정말 다행일 겁니다. 만약 그렇다면 이렇게 말한 것에 대해 제가 나눔로또 공식 홈페이지 운영팀에 사과해야겠지요.

로또 당첨 번호 정보는 비밀 정보가 아닙니다. 로또를 구매하는 고객 입장에서는 당연히 제공 받을 권리가 있는 정보입니다. 로또를 구매하지 않는 사람이라면 이런 정보에는 관심조차 없겠죠. 그렇기 때문에 고객이 더 쉽게 정보를 이용할 수 있도록 노력하는 것이 운영팀의 의무 중 하나가 아닐까 생각합니다. 제가 데모 사이트를 만든 것도 좀더 간편하게 로또 당첨 번호를 확인하고자 하는 필요 때문이었습니다. 그런데, 나눔로또 공식 홈페이지에서는 직접 홈페이지를 방문해서 확인하는 경우를 제외하고는 유료 SMS 알림 서비스라든가 위젯 프로그램 형태로만 제공하고 있더군요. 그러나, 저를 포함해서, 유료 SMS 서비스나 위젯 프로그램 같은 건 사용하고 싶지 않은 사람들이 많을 겁니다. 이미 언급한 적이 있지만, RSS feed 형태로 제공한다든가 Twitter 같은 서비스를 활용해서 공지한다든가 혹은 더 편리하고 고객 친화적인 방법을 고민하는 적극적인 모습이 무척이나 아쉽습니다.

RSS feed를 추가함으로 인해 발생할 트래픽이 두려운 것이라면, private RSS feed 하나 만들고 FeedBurner 같은 서비스로 배포해서 트래픽을 그 쪽으로 전가하면 됩니다. 얼마나 많은 사람이 구독하는지 통계도 볼 수 있으니 오히려 더욱 효과적일 수도 있습니다. Twitter에 게시하는 것은 더 말할 필요도 없겠지요.

Google App Engine으로부터 오는 트래픽을 차단했다고 로또 당첨 번호 정보를 얻어가는 것이 불가능한 게 아니라는 것은 나눔로또 공식 홈페이지 운영팀에서 더 잘 알고 있을 겁니다. 세상도 변하고 IT 환경도 하루가 다르게 변하고 있습니다. 당장의 상황에 대해 눈가리고 아웅 하는 식의 '차단'이라는 소심한 대응 대신 개방적이고 능동적으로 변화하는 모습을 보여줄 수는 없는지요. 저도 분명 로또를 구매하는 고객입니다. 고객의 목소리에 귀를 기울여 주세요.

나눔로또 공식 홈페이지 운영팀의 답변을 기대해봅니다.