Mustache :{

use perl

AnyEvent 를 다시 보는 중

꽤 오래전부터 #perl-kr@freenode 채널에 hongbot(제가 운영하는 irc 봇)이 들어오지 않았습니다.

heroku 에서 Deprecated 된 Cedar-10 Stack? 을 사용했던게 문제였던 것 같습니다. 여차저차 문서보고 Cedar-16? 으로 마이그레이숀 했습니다.

아무튼 맨날 열린옷장 웹서비스만 하다가 오래간만에 irc bot 을 디버깅 하니까 재미가 있었습니다.

헌데, 모듈 의존성이 너무 많고 테스트가 어려운게 거슬려서

  • 의존성도 확 줄이고
  • 테스트코드를 추가(강화?)

해서 lightweight hongbot 으로 운영하고 싶어졌습니다. 요즘 들여다보면서 고치고 있습니다.

머릿속에서 AnyEvent 가 싹 잊혀져서, 문서를 다시 처음부터 보고 있습니다.(조따 괴로운 일입니다.)


아무튼 오늘은 4시간 동안 삽질했습니다.

뭐냐면, heroku 에서 idle 상태에 빠지지 않기 위해서 스스로 ping/pong 하는 기능의 테스트 코드를 작성하던 중에 제대로 동작하지 않아서 괴로웠습니다.

AnyEvent::HTTPD 에 등록된 콜백을 AnyEvent main loop 안에서 Blocking 연결로 요청하면 동작하지 아니합니다.

아래는 1초 뒤에 GET http://localhost:5000/ping 을 요청하는 간단한 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use utf8;
use strict;
use warnings;

use AnyEvent;
use AnyEvent::HTTPD;
use HTTP::Tiny;

my $httpd = AnyEvent::HTTPD->new( host => '0.0.0.0', port => 5000 );
$httpd->reg_cb(
    '/ping' => sub {
        my ( $httpd, $req ) = @_;
        $req->respond( { content => [ 'text/plain', "pong" ] } );
    }
);

my $wait = AnyEvent->condvar;
my $t    = AnyEvent->timer(
    after => 1,   # 1sec
    cb    => sub {
        my $http = HTTP::Tiny->new( timeout => 1 );
        my $url = 'http://localhost:5000/ping';
        print "GET $url\n";

        my $res = $http->get($url); # <- 여기서 멈춤
        print "$res->{status}: $res->{reason}\n";

        ## my $res = $http->get('https://www.google.com'); # 이거는 됨
        ##
        ## or
        ##
        ## AnyEvent::HTTP::ScopedClient->new($url)->get(
        ##     sub {
        ##         my ( $body, $hdr ) = @_;
        ##         print "$body\n"; # pong
        ##         $wait->send;
        ##     }
        ## );

        $wait->send;
    }
);

$wait->recv;
print "done\n";
  1. 비동기 요청을 하도록 바꾸거나,
  2. AnyEvent::HTTPD 의 문제를 해결해야겠지요.

뭐가 문제인지 들여다보고 싶은 맘은 없습니다. 쉬운 1번 으로 해결할 것 같습니다.

See also

Git 데이터 복구

오늘 실수로 고객의 한달간의 데이터를 잃어버렸습니다.

고객의 데이터를 git 으로 관리하는 프로젝트가 있는데, 지난 한달간의 unstaging 되어 있는 고객의 데이터를

$ git add .
$ git commit -m 'sync'
$ git push

이런식으로 저장했습니다. 이후에 우리 말썽꾸러기가 이상하게 작업해놓은 이력을 발견하고 업무 쓰로잉 욕구가 생겨서,

# 아 짱나넴 걍 원래대로 해놓고 알아서 하라고 해야겠다.
$ git reset --hard HEAD^
$ git push
$ git push -f origin <current-branch>

를 했습니다. 이때에 방금 커밋한 이력을 날렸습니다.

순간, 아아아아 받은 돈 토해내고 마포대교 가야겠다 라는 생각이 들었습니다.

하지만 곧 pointer 만 잃고 objects 는 그대로 있을 것 같아서 검색했습니다.

http://stackoverflow.com/questions/5788037/recover-from-git-reset-hard

$ git reflog show
d5d92ec HEAD@{0}: reset: moving to HEAD^
3adf160 HEAD@{1}: commit: sync
...

이런 이력이 있어서,

$ git show 3adf160

으로 커밋내용이랑 시간을 확인하고,

git reset --hard 3adf160

해서 복구 했습니다. 뒤지는 줄 알았습니다.

웃겼던 것은 저 위에 스택오버플로 코멘트였습니다.

This trick saved my life a couple of times.

saved me just now! :D

You saved me. Thanks a ton.

saved me too - perfect

See also

Firefox CSP Problem at Github

제가 쓰는 브라우저는 firefox 이고 주업무의 이슈트래킹은 github 에서 하고 있습니다. 거의 모든 편집은 emacs 에서 하고요.(지금도 emacs 에서 편집하고 있습니다.)

셋중 하나만 안되도 뭘 못합니다.

작년인가부터 Debian 에서 iceweasel 대신에 firefox 를 지원해주기 시작해서 데비안 패키지 firefox 를 사용하고 있습니다.(firefox ESR 45.9.0)

그런데 오늘(2017-05-09 투표날) github project 도 안보이고 assignee 도 지정할 수 없고 comment 에 사진도 업로드가 아니되는 것 입니다.

크롬이나 다른 브라우저 쓰면 되긴 하지만, 여러 플러그인 설정과

북마크등을 옮기려고 생각하면 아찔합니다.

괴롭다..

Tekken Premier League 2017

철권은 조빱이지만 철권 방송은 재밌게 보고 있습니다.

오랜만에 철권대회 입니다.

1등 상금이 60만원? 입니다.

나중에 1,000만원으로 오른다고 하는데 비인기 종목은 e스포츠에서도 서러운 것 같습니다.

오랜만의 철권대회라서 반갑긴한데 해설이 hols(나겜사장) 입니다. 철권의 ㅊ도 모르는 사람이 해설해서 많이 별로 입니다.

무릎 출전 안했으니까 지난번 오락실 매치처럼 인드라+무릎 시키면 좋을 것 같은데 역시 게임방송도 돈이 문제인 것 같습니다.

수영 2km

간만에 블로그 쓴다고 늦게 자서 늦게 인나고 늦게 출근했습니다. 도착하니 점심시간이었습니다.

보통은 민들레에서 백반 먹는데, 어제 중길씨가 국밥 좋아한다고 해서 둘이 고흥순대국 다녀왔습니다.

민들레는 제가 가장 좋아하는 식당입니다.

밥먹고 일했습니다. 요새는 딴짓도 잘 안하고 일만하는 것 같습니다. 하루종일 컴피터 앞에 앉아 있는데 하루종일 바쁜 것 같습니다. 담배도 안피니까 화장실 가는거 말고는 계속 컴피터 합니다.

집중을 오래하다보면 무기력해지곤 합니다. 딴짓을 섞어줘야 하는데 얹혀지내기 시작한 이후로는 벽을 바라보고 앉기 때문에 남들이 제 모니터를 볼까봐 딴짓을 못합니다.

열린옷장의 대여비를 %로 할인해주는 쿠폰시스템을 만드는 중 입니다. 한벌대여쿠폰, 10,000원 쿠폰 이런게 있었는데 이번에 요구가 있어서 합니다. 점점 복잡해져서 걱정입니다. “%할인 못한다” 라고 하고 시스템을 되도록 단순하게 유지하고 싶은데 결정은 제가 하는게 아닙니다.

하다가 피곤해져서 농땡이 좀 부리다가 수영장 갔습니다. 화장실에 휴지가 없었는데 모르는 사람의 도움으로 위기를 벗어났습니다.

4월의 마지막주 목요일이라서 자유수영하는 날 입니다. 이런 날은 아름사마(에이스)가 프로그램을 계획해서 옵니다.

요새 몸이 안좋은지 탕에서 나오거나 체조할때 어질어질합니다. 쉬엄쉬엄 하고 싶은데 같이 수영하시는 분들이 그렇게 못하게 합니다.(앞에 서라고 부추김)

오늘은 2km 수영했습니다.

요즘 하는 일

요즘이랄까 제작년부터 거의 열린옷장의 서비스를 만들고 있습니다.

어떤거냐면,

등을 만들고 있습니다.

제가 하는 작업의 이력은 opencloset/opencloset assignee:aanoaa is:open 에서 볼 수 있습니다.

열린옷장 직원은 아닙니다. 열린옷장 옆사무실에 SILEX 라는 소프트웨어 회사 댕기고 있는데(이번에 건물에서 쫓겨나서 옆사무실 아님) 초창기에 열린옷장 재고관리 라는 작은 프로젝트를 계기로 일하게 되었는데 어쩌다보니 이것만 하고 있습니다.


SILEX 에는 yongbin, keedi, aanoaa(나) 세명인데, 얼마전 건물에서 쫓겨나서 망한느낌이 물씬 납니다. 한명은 집에서 애보고 한명은 알바하고 저는 그냥 하던거 계속 하고 있습니다. 저는 열린옷장에 책상 한자리 부탁해서 얹혀 살고 있습니다.

모두들 고생하고 있는데 잘되면 좋겠습니다.

인상적인 블로그

요즘 재미있게 보는 블로그가 있습니다.

조광사진관 일기장

별거 없는 얘기인데 좋습니다. 저도 비슷한 컨셉으로 적당적당 있었던 일들이나 생각을 올려볼까 합니다. 귀찮아져서 금방 안하게 되겠지만..

한글이 되는가

octopress 에서는 한글 tags 와 한글제목을 지원하는가 궁금했습니다.

1
2
3
$ bundle exec rake new_post['한글이 되는가']
mkdir -p source/_posts
Creating new post: source/_posts/2017-04-26-hangeuli-doeneunga.markdown

이렇게 됩니다.

Yongbin-mode

외래어의 한글표기

보통 외래서를 한글로 적을때, e 로, a 또는 ae 로 적습니다.

그런데 @yongbin님은 바꿔씁니다. helper 를 한글로 적으면 보통은 헬퍼이지만 @yongbin 님은 핼퍼 입니다. 오래된 이야기입니다.

디랙토리, 핼퍼, 렌덤 등등..

생일셍일로 적고, 요새요세 적는걸 보면, 외래어만 그런 것 같진 않습니다.

*-mode

제 작은소원은 조국의 통일도 편경장의 팔모가지도 아닙니다. 제가 필요한 emacs의 mode 를 만드는 것입니다. elisp 관련 책도 읽다가 포기한 적도 많습니다.

그런데 몇일 전 github-comment 에서

핼퍼에 구현된 코드중에

라는 코멘트가 결정적인 계기가 되어서 yongbin-mode 를 만들어보자 라고 결심하게 되었습니다.

yongbin-mode

아이디어는 이랬습니다.

emacs 내에서 를 누르면 가 입력되고 를 누르면 가 입력되도록 하자.

pre-command-hook 에서 스슥 하면 될 것 같았는데, multibyte 입력은 이벤트가 발생되지 않았습니다.

(아직도 왜 그런지 모르겠고, 어디서 무얼 찾아야 하는지도 모르겠습니다. elisp 도사님 찾아가서 제자 하고 싶음)

여튼 꼼수를 써서 익숙한 perl 로 프로그램을 만들고 emacs 에서는 호출만 하자 싶었습니다.

해서 yb 라는 perl 스크립트를 만들어서 를 바꾸도록 하였습니다.

$ echo "안녕하세요" | yb
안녕하새요

그리고 yongbin-mode 라는 minor mode 를 만들어서 채팅할때 알아서 변환되게 하고 싶었습니다.(저는 irc 채팅을 emacs 에서 합니다)

아무것도 몰라서(지금도 모름) 구글링하고 문서읽고 다른 코드들을 참고하면서

  • yongbin-mode : 마이너 모드(yongbin-mode)를 켜고끈다
  • yongbinize-buffer : 현재버퍼의 텍스트를 용빈화시킨다
  • yongbinize-region(start, end) : 영역의 텍스트를 용빈화시킨다
  • yongbinize-line : 현재 라인을 용빈화 시킨다
  • erc-yongbinize : irc 의 입력을 용빈화 시킨다

기능을 맨들었습니다.

그걸 여차저차 해서 irc 에서

<aanoaa> '-']/ 안녕하세요<RET>

하면,

<aanoaa> '-']/ 안녕하새요

로 됩니다.

https://github.com/aanoaa/yongbin-mode

느낀점

개발환경이 넘 구립니다. 코드 변경하고 M-x eval-buffer 해서 다시 컴파일 하고 어디어디 찾아가서 C-x C-e 해서 한줄만 실행하고 등등..

뭘 모르는데 뭘 어떻게 해야할지가 젤 어렵고, 또 어떻게 디버깅 해야 할지가 어렵습니다. 괄호가 넘 많고 if else 문에 대한 문서를 봐도 어케 쓰는지 모르겠능;; 한글처리에 관한 문서는??

등등 어려움이 넘 많습니다.

하지만 context 가 오묘하달까?

(with-current-buffer yongbinize-buffer-name
  (goto-char (point-min))
  (setq yongbinized-text (...)))

이런거?

point-min 이라는걸 buffer 마다 가지고 있는 모양인데, 그게 context 에 따라 선택된다는게 참 신통방통

perl 뉴비 시절에 perl-kr 커뮤니티에서 도움을 많이 받았던게 넘 좋았는데, elisp 는 한국사용자 커뮤니티가 없는 것 같습니다(?) 한글문서도 오래되었거나 거의 없는 것 같고.. closure 는 있는데 이건 elisp 가 아니고..

elisp 에 관심있는 emacs 사용자들에게서 뭔가 도움을 구해보고 싶습니다. 관련된 커뮤니티를 알고 계시면 알려주세요.

레알 결론

가 바뀐게 보이면 너무 꼴보기 싫었습니다. 이제 몇주동안 저도 똑같이 바꿔쓰면서 고통을 주도록 하겠습니다.

Redis Path and Db Number

redis://localhost:6397/1 흔한 redis-url 입니다. /1 의 역할은 뭘까요? 뭐냐면 Database number 입니다.

$ redis-cli --help
redis-cli 3.0.2

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  ...
  -n <db>            Database number.
  ...

/1 없이 연결하면 기본으로 0 번 database 를 사용합니다.

디버그 하면서 값을 확인하려고 제아무리 keys * 을 찍어도 암것도 안나와서 넘 답답했는데..

127.0.0.1:6379> keys *
(empty list or set)

select 명령으로 선택해주거나,

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "user:aanoaa"
2) "users"

redis-cli 에서 -n 옵션을 사용하거나

$ redis-cli -n 1
127.0.0.1:6379[1]> 

redis-url path 로 졸 검색했는데 암것도 안나옴.