재미로 만들어(만들었 다기 보다는 포팅- Porting) 본 스팸 필터 입니다. 

https://github.com/crazia/spam-filter

여기에 올려두었습니다. (''

 Practical Common Lisp 이라는 책에 보면 폴 그레이엄이 구상한 스팸 필터에 관한 간단한 예제가 있습니다.  그 알고리즘을 바탕으로 책에서는  CLisp 으로 구현한 예제가 있습니다. (Chapter 23 - Practical: A Spam Filter)

위 내용을 바탕으로 해서  Programming Clojure 라는 책을 쓴 Stuart Halloway 가 간단하게  PCL (Practical Common Lisp) 에 있는 예제들을 Clojure 로 옮긴 것들이 있습니다. (practical-cl-clojure)

그런데 몇몇의 내용을 살펴보면 Clojure 예전 버젼에 맞춰서 소스가 만들어져 있고 무엇보다도 클로져의 가장 중요한 기능인 병렬성에 맞게 코딩이 되어 있지 않더군요. 따라서 그 부분을 보강하고 Halloway 가 구현 하지 않고 끝을 낸 부분을 추가하는 중에 있습니다. (train 이나 score 같은 함수들) 

클로져를 따로 공부하시는 분들에게 도움이 될까 해서 github 에 공개를 해둡니다. 
폴 그레이엄은 리습에 관한 책 두권을 썼습니다. 한권은 Common Lisp 을 바닥부터 쉽게 배울 수 있는 책입니다. 그리고 또 한권이 "OnLisp" 입니다.

마스터 하기만 하면 초 상급 리습 프로그래머가 될 수 있는 지름길로도 알려졌지만 그 난이도가 장난이 아닙니다. 요즘 마스터를 시도하고 있는데 역시나 무지 어렵습니다.

너무나 어려워서인지 잘 팔리지도 않아서 폴 그레이엄 사이트에 가면 무료로 배포하고 있습니다. ㅎㅎ

여기 에서 받아가세요.

그나저나 Chapter 7 의 제목이 'Macros' 더군요. 왠지 머릿속에서 '두둥' 하는 효과음이 들리는 것 같은 느낌이였습니다. (매크로는 진정한 리습을 쓰는 이유라고 까지 불리웁니다)


"리습은 그것을 마침내 손에 넣게 되었을 때 경험하게 되는 심오한 깨달음을 위해서라도 배울 가치가 있다. 리습을 이용할 일이 그렇게 많지 않다고 할지라도 그 경험은 그 자체만으로도 당신을 훨씬 훌륭한 프로그래머로 만들어 줄 것이다." - 에릭 레이먼드 (Eric Raymond)


제가 아는 선배가 송재경 (바람의 나라, 리지니 만드신 분) 씨와 인터뷰를 할 일이 있었는 데 그 분이 하신 말씀 중에

"프로그램은 어떠한 언어로 짜는 것이 중요한 것이 아니다. 가장 중요한 것은 전산적인 마인드를 소유하는 것이다"

라는 이야기를 들었다고 합니다. 상당히 많은 시간이 지났지만 이 이야기가 가지고 있는 의미는 아직까지도 도움이 됩니다. 저 또한 후학들을 만나면 이와 같은 이야기를 많이 합니다.

왜 리습을 공부해야 하는가? 전산적인 마인드를 소유하는데 도움이 되는 연습을 가장 열심히 할 수 있는 언어였다고 자신할 수가 있습니다.

저는 예전에도 리습을 공부하였고, 지금도 공부중이고 앞으로도 공부할 것입니다. 조금만 떨어지면 멀어져 버리는 전산적인 마인드를 붙잡기 위해서 입니다. (요즘은 리습 방언인 클로져에 빠져 있습니다)


어디서 많이 본듯한 이미지..
하지만 더 놀라운 것은 이런 캐릭터들이 나와서 리습을 알려준다는 것이겠지요.

사이트가기

인구가 많아서 그런걸까요? 이런 문화의 다양성이 정말 부럽습니다.
제가 아는 영업쪽 담당하시는 분이 한분 계십니다. 영업하시는 분답게 계약 체결전에는 간이라도 빼주실 듯 하다가 막상 체결이 되면 안면을 싹 바꾸시는..

투 페이스 되겠습니다. 다른 사진들은 너무


그런 분이 계시는데 그분이 명절 때가 되면 잊지않고 mail 을 보내주십니다. 잊지 않으신것은 고맙지요 (요즘 안오는거 보니 잊어버리신듯..) 그러나 편지를 받고 보면 수많은 cc 들을 보면서 기가 질립니다. 같은 mail 이라도 저한테만 보낸것 처럼 되어 있으면 참 좋을 텐데.. 라는 생각이 들지요

그래서 시작하게 됐습니다. 대량으로 메일을 발송하되 cc 는 안보이고 단일 대상한테 보내는 것처럼 하기. 찾아보면 간단하게 해결하는 방법이 많겠지만 저는 공부하는 겸 해서 직접 작업해보기로 했습니다.


여기부터는 프로그래머의 영역입니다. 프로그래머가 아니신 분은 봐도 몬소린지 모를 가능성이 아주 농후합니다.



프로그램 세게에서는 학습곡선이 뭐 같아서 배우기 힘들지만, 배우기만 하면 정말 무궁무진한 능력을 주는 것이 세가지가 있다고 합니다. (제 말 아님..)

1. Emacs
2. Regular Expressions
3. Functional Language


배우기 힘들지만 진짜 쓸모가 있다는 이야깁니다. 그런데  Emacs 라는 에디터는 기본적으로 정규 표현식과 함수형 언어인 ELisp 이 포함되어 있기 때문에 Emacs 를 잘 다루려고 공부하다 보면 자연스럽게 2번 3번을 익히게 됩니다.

"지인들에게 기분 상하지 않게 단체 메일 보내기" 프로젝트는 기본적으로 Emacs 를 가지고 개발하는 것을 원칙으로 합니다.

먼저 Emacs 에서 Gmail 을 통해서 편지 보내기!!

왜 하필 Gmail 을 통해서 보내는 것이냐? 라고 하시겠지만, 개인이 아무 리눅스에서 sendmail 데몬 깔아서 메일을 보내면 왠만한 e-mail 서비스는 전부 spam 으로 인식해서 편지 전달이 안됩니다. 그래서 Gmail 로 편지를 보낼 수 있게 설정해야 합니다.

gmail 에서 POP 와 IMAP 사용이 가능하게 설정합니다. <-- 이것에 관한 설정은 Gmail 환경설정에서 도움말이 존재합니다.

정확히 POP 와 IMAP 설정을 해야 사용할 수 있는지는 잘 모르겠는데, 제가 그렇게 설정을 해놨습니다. 여기까지만 하시면 외부 설정은 끝입니다.

그러면 Emacs 가 설치되어 있는 로컬 컴퓨터 기준으로 설명을 진행하겠습니다. OSX 10.6 Snow Leopard 에서 진행을 하고 있습니다. 아마도 테스트는 안했지만 우분투에서는 당연히 될것으로 생각합니다. 

Emacs 는 당연히 설치가 되어 있는 상태구요. 만약 없다면 http://aquamacs.org/ 에서 받아서 설치하시면 됩니다. 구체적인 세팅방법 같은건 정말 열심히 공부하셔야 합니다.

gnutls 를 설치해야 합니다. gmail 이 이방식으로 보안처리를 합니다. 설치를 해줘야 하는데, port 가 깔려 있다면

sudo port install gnutls


이 명령만 쳐주시면 알아서 설치가 됩니다. port 가 설치되어 있지 않다면 http://www.macports.org/ 에서 설치하시면 됩니다.

구체적인 세팅이 끝났으면 $HOME/.emacs 파일을 열어줍니다. 없으면 만드시면 됩니다. osx 기준으로는 $HOME 은 /Users/my-id 입니다. my-id 는 자신의 아이디 입니다.

.emacs 내용
(setq send-mail-function 'smtpmail-send-it
   message-send-mail-function 'smtpmail-send-it
   smtpmail-starttls-credentials
   '(("smtp.gmail.com" 587 nil nil))
   smtpmail-auth-credentials
   (expand-file-name "~/.authinfo")
   smtpmail-default-smtp-server "smtp.gmail.com"
   smtpmail-smtp-server "smtp.gmail.com"
   smtpmail-smtp-service 587
   smtpmail-debug-info t
   starttls-extra-arguments nil
   smtpmail-warn-about-unknown-extensions t
   user-full-name "광이랑"
   starttls-use-gnutls t)

위의 내용을 그대로 .emacs 에 복사하시고 '광이랑' 이라는 부분만 자신의 이름으로 바꾸시면 됩니다. 만약 받은 편지에서 보낸 사람의 이름의 인코딩이 깨져서 보이면 emacs 의 환경이 utf-8이 아니라는 이야깁니다. 만약을 위해서

.emacs 에서

(set-language-environment "UTF-8")


을 추가해 줍니다.

그리고 중간에 보이는 ~/.authinfo 파일은 만들어 줍니다. 만들고 그 안의 내용을

machine smtp.gmail.com login my-id@gmail.com password my-pass


라고 채워줍니다. 딱 이 한줄만 있어야 하며, newline 문자(엔터!)도 들어가면 안됩니다. my-id 와 my-pass 는 구글에 로긴할때 쓰는 아이디와 패스워드 입니다.

자 이제 C-x m 을 입력하시면 mail-mode 로 바뀝니다.

To:
Subject:
--text follows this line--


이와 같은 내용이 나오고요, 부족한 부분을 채우신 다음에 C-c C-c 를 입력하시면 편지를 보내게 됩니다. 여기까지 Emacs 에서 gmail 을 통해서 메일 발송하기 였습니다. 다음은 이 방법을 이용해서 "web-mail 형식으로 편지 보내는 방법"에 관해서 입니다. 그건 나중에...

+ Recent posts