Emacs 에 Yasnippet 을 설치하면 기본적으로 Text-mode snippet 중에 time 이라는 단축어가 있습니다. 
Text-Mode 상에서 time 을 입력하고 TAB 키를 누르시면

Thu Mar 21 18:36:06 2013

위와 같은 내용이 출력됩니다. 일단 영어이기도 하고 , 제가 필요하 것은 오늘 날짜와 뭐 더 필요하다면 요일정도? 출력이 되면 좋겠다고 생각이 들어서 간단한 함수를 제작했습니다.

(defun current-day-string ()
  (let ((datetime (decode-time))
        (dow '(일 월 화 수 목 금 토)))
    (format "%s-%s-%s %s요일" 
            (nth 5 datetime) 
            (nth 4 datetime) 
            (nth 3 datetime) 
            (nth (nth 6 datetime) dow))))


이제 이 함수를 .emacs 에 넣어둡니다. (전 다른 방법을 쓰지만 쉽게 쉽게 설명합니다 ㅎㅎ) 

그리고 Snippet 을 만들어줄 차례입니다. 

yasnippet 이 설치된 디렉토리로 이동합니다. (제 경우에는  ~/.emacs.d/plugins/yasnippet 에 저장이 되어 있습니다) 

$ cd snippets
$ cd text-mode



(만약 이 디렉토리들이 존재하지 않는다면, 예전 제 포스트 를 참조하셔야 합니다. yasnippet 부분만 따라하시면 됩니다. ) 
 

$ emacs day



(day 라는 이름의 snippet 을 만들어 주라는 것입니다)

# name: (current day)

# key: day
# --
`(current-day-string)`



자 이제 모든 준비가 끝났습니다. text-mode 상태에서 day 라고 누르고 TAB 키를 눌러주면

2013-3-21 목요일

라고 출력되는 것을 확인하실 수 있습니다.  
 
어쩌다 보니 이메일 보내는 기능을 구현하게 됐습니다. 요즘 서비스 하나 만들려고 보면 이메일 보내기 기능은 거의 기본적인 기능이라 필수적으로 알아야 하는 부분이라고 볼 수 있습니다. 

이 포스트는 두 부분으로 되어 있습니다.

1. SMTP 서버 설정하는 부분
2. Node.js 에서 이메일 보내는 부분



사실 2번은 무지 쉬웠습니다. nodemailer 라는 훌륭한 패키지가 존재하기 때문이지요. 1번은 너무나 쉽고도 오래된 이야기인지 오히려 관련 문구를 찾기가 어려웠습니다. 

개발환경은 역시나 서버 사이드 이기 때문에 Ubuntu 12.10 버젼에서 테스트 했습니다.

1. Sendmail 을 설치해줍니다.

 $ sudo apt-get install sendmail



Postfix 를 요즘 많이 쓴다고 하는데, 귀찮아서 걍 편한 sendmail 을 설치해줬습니다. 처음 설치된 sendmail 은 오로지 Localhost Only 입니다. 사실 이게 편하긴 합니다만, 제 주요 개발 환경은 OSX 이고, 원격에 서버가 설치되어 있는 관계로 sendmail 을 원격에서 접속해서 메일을 보낼 수 있게 설정해 줄 필요가 있습니다.

2. 원격에서 접속할 수 있게 sendmail.mc 를 바꾸어 줍니다.
/etc/mail/sendmail.mc 를 열고 다음줄을 찾아서 바꾸어줍니다.

DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl 


인 부분을

DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=0.0.0.0')dnl


로 바꾸어 줍니다.

아무데서나 접속가능하게 바꾸어 준것입니다. 자 이제 설정파일을 생성해줍니다.

$ sudo bash -c "cd /etc/bash && m4 sendmail.mc > sendmail.cf" 
$ sudo /etc/init.d/sendmail restart



3. 접속 테스트 시작 
원격에서 접속하는 것을 가정으로 하고 sendmail 이 설치된 서버는 편의상 'crazia.super.com' 이라고 하지요. 

$ telnet crazia.super.com 25 

Connected to crazia.super.com
Escape character is '^]'.
220 teemo ESMTP Sendmail 8.14.4/8.14.4/Debian-2ubuntu2; Mon, 18 Mar 2013 11:54:40 +0900; (No UCE/UBE) logging access from: [10.10.10.10](FAIL)-[10.10.10.10]
HELO teemo
250 teemo Hello [10.10.10.10], pleased to meet you
MAIL FROM: crazia@super.com
250 2.1.0 crazia@super.com... Sender ok
RCPT crazia@gmail.com
501 5.5.2 Syntax error in parameters scanning "crazia@gmail.com"
RCPT to: crazia@gmail.com
550 5.7.1 crazia@gmail.com... Relaying denied. IP name lookup failed [10.10.10.10]



붉은색 부분은 제가 실제로 입력해 주는 부분입니다. 

헛 이런 낭패할 때가 !! Relay 가 안된다는 것이군요. 

4. access 에 개발 머신의 아이피를 써주기
/etc/mail/access 파일을 열어서 적당한 곳에

Connect:10.10.10.10                        RELAY



라고 추가해 줍니다. 그리고 3번 테스트를 다시 진행하고  

$ telnet crazia.super.com 25 

Connected to crazia.super.com
Escape character is '^]'.
220 teemo ESMTP Sendmail 8.14.4/8.14.4/Debian-2ubuntu2; Mon, 18 Mar 2013 11:54:40 +0900; (No UCE/UBE) logging access from: [10.10.10.10](FAIL)-[10.10.10.10]
HELO teemo
250 teemo Hello [10.10.10.10], pleased to meet you
MAIL FROM: crazia@super.com
250 2.1.0 crazia@super.com... Sender ok
RCPT TO: crazia@gmail.com
250 2.1.5 crazia@gmail.com... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: Main from me
It's me !!
.
250 2.0.0 r2I3MdYY028635 Message accepted for delivery
^C
quit

 
이제 정상적으로 메일이 보내지는 것 까지 테스트 되었습니다. 이제 node.js 로 이메일 보내는 방법에 대해서 알아보겠습니다. 

1. nodemailer package 설치하기 
먼저 테스트를 만들 디렉토리를 한개 만들어 주는 것이 좋겠습니다. 

$ mkdir mail-test
$ cd mail-test



그리고 npm 으로 가볍게 인스톨 해줍니다. 

$ npm install nodemailer



2. 실제로 보내는 테스트 코드 작성하기


위 내용을 자신의 상황에 맞게 변경하고 접속 host , 이메일 아이디 (제 아이디 쓰시면 아니되옵니다 ㅎㅎ) 저장합니다. 

3. 실행해보기

$ node mail-test.js



어떻습니까? 참 쉽죠? 

 
node.js 프로그래밍을 할 때, exception 이 발생하면 , 쉴새 없이 Ctrl+C , 화살표 위 (이러면 전에 실행했던 명령줄이 표시됩니다)를 반복적으로 누르는 것을 막아주기 위해서 설치하는 프로그램인 nodemon 이 Ubuntu 계열에서 오동작을 합니다. (하위 디렉토리에서 변경된 것을 잡아채지 못하더군요) 

소스를 뒤져보니 파일의 변경유무를 알아보던 fs.watch 를 이제 안쓰기 때문이라고 하는데요. 그래서 소스 변경 유무를 다음과 같은 명령 형식으로 알아봅니다. (사실 다음 소스는 동작하는 여부인지 골라내는데 사용하는 코드입니다) 

find -L /dev/null -type f -mtime -1s -print

위 명령이  데비안 계열하고 BSD 계열이 다르게 동작하는데 실은 저 명령은 BSD 계열을 기본으로 해서 만들어 진 것입니다. (개발자가 맥빠였던 것입니다!!) 

그래서 우분투에서 개발하시는 분들은 귀찮으시더라도 패치되기 전까지 supervisor 를 사용하시면 됩니다. 사용법은 비슷합니다.  

$ npm install supervisor -g
$ supervisor app.js



편리한 node.js 코딩 되세요. 
 


    - 초간단 요약 -
    기존의 자바 서비스하고 있던 부분의 일부를 node.js 로 포팅해서 두개를 벤치마크 해 봄. 자바는 멀티코어 환경에서 테스트하고 node.js 는 cluster 를 안쓰고 단일 코어에서 (아무것도 안하면 단일코어에서 도니 ㅎㅎ) 동작시켜봄 결과는 아래와 같음 



    씨피유와 메모리는 적게 쓰지만 (훨씬 적게..) 성능은 그리 낫지 않음. 이거저거 바꿔가며 테스트를 하던중 ORM 을 지원하는 Sequelizer 가 느리다는 것을 알아냄, node-mysql 로 바꾸고 나니 바뀐 내용입니다.



단일 코어를 씀에도 불구하고 자바와 비슷하게 성능이 나오고 있습니다. 같은 하드웨어라 가정하면 node.js 에 클러스터 (cluster)를 적용한다고 한다면 자바의 거의 5배에 해당하는 효율을 보일 것으로 예상됩니다. 

   글쓴이가 올린 다음 글을 보면 , node.js 는 성능이 워낙 뛰어나고, 여러사람들이 참여하기 때문에 무섭게 성장하는 개발환경이 될것이기 때문에 주의깊게 보고 있기는 하나, 기업용으로 쓰기에는 아직 치명적인 약점이 있다고 합니다. 바로 node.js 자체의 개발 주기가 너무 짧기 때문에 오랜 기간을 개발해야 하는 기업용 환경에서는 좋지 않다는 것입니다. (개발 하는 중간에 메인 언어가 업데이트 된다고 생각해 보세요 ㅎㅎ) 그렇기 때문에 1.xx 대로 올라가서 안정화가 된다면 그 때부터 기업용으로 쓰기에 무리 없지 않을까 라고 본답니다. 물론 저자는 아주 만족한 거 같다고 하더군요. 

  저도 글쓴이의 의견에 어느정도 동의합니다. 다만 지금 버젼으로도 정말 기업용 커다란 사이트가 아닌, 간단한 기능을 제공하는 사이트를 제작하는 데에는 (특히나 App 서버로) 최고의 효율을 보이지 않을까 싶습니다. 

Express (Node.js의 웹 프레임 워크) 에서의 Middleware 개념은 쉽게 설명하자면 Java 에서의 Filter 와 비슷한 개념입니다. 자주 쓰이고 통념적으로 쓰이는 행위들을 미리 걸러주는 역할을 한다고 볼 수 있습니다.  

예로 들면 express 가 내부적으로 쓰고 있는 formidable 은 HTTP의 request 를 정리하는데 탁월합니다. 그러나 개발자가 매번 formidable 을 불러서 정리하는 것이 번거로울 수가 있기 때문에 이를 middleware 로 만들어서 

   app.use(express.bodyParser());


이런식으로 선언만 해두면 사용이 되는 것입니다. (내부적으로 formidable 이 쓰이고 있음. ) 

이런 미들웨어를 만드는 법이 찾아보진 않았지만 예제가 많지는 않습니다. (너무 쉬워서 그럴 수도..)


다행히 위 링크에 가면 fineuploader 가 올리는 xhr 방식의 asynchronous 데이타 전송을 잡아채서 req.files 에 정리하는 부분을 미들웨어로 구현한 소스가 있습니다. 비록 옛날 소스이긴 하지만 (요즘 express 가 너무 많이 발전을 한 관계로..) 어떻게 미들웨어를 만드는지 참조하시면 좋을 듯합니다. 



글을 퍼올 수가 없어서 어쩔 수 없이 제 gist 에 올렸습니다. 원문은 위에 링크되어 있는 주소로 가면 나옵니다. (동작하는지에 대한 보장은 해 드릴 수 없습니다) 

(req, res, next) 로 이루어진 전형적인 미들웨어형 함수 선언이 보입니다. 위 사이트를 가면 어떻게 npm 패키지를 만드는 지에 관한 방법도 감을 잡으실 수가 있을 것입니다. 
OSX 에서 GNU Emacs 를 사용중입니다. 귀찮고도 짜증나는 것중의 한가지가 왠만한 것들에 PATH 가 전혀 안 잡혀 있다는 것입니다. 심지어 $HOME/.bash_profile 에 내용을 넣어준다고 해도 Emacs 는 그 Path 의 영향을 받지 않더군요. 현재 Emacs 가 가지고 있는 PATH 정보를 확인하고자 한다면 

M-x shell 


로 들어가서 Prompt 가 뜨면 

bash-3.2$ env | grep PATH
EMACSPATH=/Applications/Emacs.app/Contents/MacOS/bin
PATH=/usr/bin:/bin:/usr/sbin:/sbin


이렇게 빈약하게 걸려 있는 것 뿐입니다. 귀찮더라도 추가해 주고 싶은 PATH 가 있다면 .emacs 파일에 

(setenv "PATH"
  (concat
   "/usr/local/bin" ":"
   "/opt/local/bin" ":"
   (getenv "PATH")
  )
)


이렇게 추가해 주면 완성입니다. 더 추가해 주고 싶은 PATH 를 쭈욱 써주시면 됩니다. 


이거 웹 디자인 하시는 분이라는데.. 왠만한 개발자 보다 수준이 훨씬 높으신 듯 ㅎㅎ 
원래는 다른 의미로 쓰는 용어인데, 요즘은 이 한가지를 의미하는 말로 바뀐거 같습니다. 
프로그래머가 웹 프로그래밍을 할 때 제일 싫어하는 게 무엇인지 물어보면 10중 7은 서슴치 않고 대답을 할 것입니다. 망할 CSS ..

전문 프로그래머에 가까우면 가까울 수록 이쁜 웹 디자인하고는 거리가 멀리 멀리 떨어지게 마련입니다. 혹 유려한 디자인과 훌륭한 개발 실력을 동시에 갖춘 개발자 아닌 돌연변이가 있기는 하지만 그런 사람 찾기가 하늘의 별 따기입니다.

그래서 혹시나 특출난 아이디어를 기반으로 하여 웹 서비스를 개발한다고 하더라도 그 못생긴 UI 에 실망하며 아 못생겼으니 이용도 하기 싫구나!! 를 연발하기 마련입니다.

그런 개발자분들을 위한 트위터 형식의 UI 형식을 갖춰줄 수 있게 해주는 훌륭한 개발 패키지 입니다.

http://twitter.github.com/bootstrap/

일단 직접 찾아가서 살펴 보시면 됩니다. 소개 부분에 있는 'by Nerds, for Nerds' 라는 말이 인상 깊군요 ㅎㅎ. 만들어진 예제 사이트를 보시면 어디선가 본듯한 형상이실 것입니다. 맞습니다!! 게으른 개발자들이 바로 이걸 이용해서 만든 것이지요!! 

EDITED: 2013-01-22

 
저도 이정도의 화면 작업이 가능해진답니다 ㅋㅋㅋ  

'계획-구현'(plan-and-implement) 방법론은 댐을 건설한다던가 국가를 침공하는데에는 훌륭한 방법이 될 수 있지만, 경험상 프로그래밍을 하는데는 좋은 방법론 같지는 않다. 

어째서? 

아마도 컴퓨터가 너무나 엄격하기 때문일 듯 싶다. 각각의 프로그램들간의 차이가 댐들이나 침공들 끼리의 차이보다 더 심하기 때문일 듯 싶다. 또는 아마도 여분을 남기는 것과 같은 오래된 행태는 소프트웨어 개발에서는 없기 때문에 옛날 방법론은 먹히지 않는다: 댐 건설시 30% 의 콘크리트를 더 가지고 있는 것은 실수에 대비한 방법이지만, 프로그램에서 30% 더 일을 한다는 것은 명백한 실수다. 

왜 오래된 방법론들이 실패했는지 말하기는 어려울 수도 있다. 하지만 그 방법론들은 명백히 실패했다. 누구나 실패한 것을 보지 않았는가? 언제 소프트웨어가 제때 개발되었는가? 경험 많은 프로그래머들은 아무리 조심스럽게 프로그램을 계획한다고 해도 막상 프로그램을 만들 때 계획은 예기치 못한 방향으로 바꿔버린다는 것을 알고 있다. 더구나 때때로 계획이란 것은 말도 안되게 잘못되어 버린다. 그러나 '계획-구현'(plan-and-implement) 방법론의 희생자중 극소수만이 기본적인 적합성에 의문을 가진다. 대신에 대부분의 사람들은 사람의 실수를 비난한다: 만약 계획이 더 많은 예측을 바탕으로 만들어 졌다면 이런 모든 문제들은 다 피해갈 수 있었을텐데.. 아무리 최고의 프로그래머라 할 지라도 '구현'단계로 접어들면 문제에 봉착한다. 아마도 사람들에게 그 이상으로 더 예측을 하라는 것은 너무 많은 기대를 가지는 것일 지도 모른다. '계획-구현'(plan-and-implement) 방법론은 우리의 한계에 더 잘 맞는 방법론으로 바꿔야 할지 모른다. 


폴 그레이엄의 Onlisp 책에서 언급되는 내용입니다. 이 책이 쓰여질 당시에 저는 졸업도 하기 전이였는데도 '계획-구현' 방법론을 옛날 방법론으로 치부하고 있습니다. 그 뒤로 애자일이니 래피드니 수많은 방법론들이 나왔지만 현실속에서 적용하기가 얼마나 쉬웠습니까? 석학들이 해외에서 95년도 쯤에도 이미 워터폴이니 뭐니 하는 소프트웨어 공학의 방법론들이 건설회사 방식에서 차용됐기 때문에 소프트웨어 개발에는 알맞지 않다고 이야기 해왔지만 습관이 참으로 무섭다는 생각이 듭니다. (10여년간 옛날 방식으로 꾸준히 개발되어 왔다는 이야기..) 

지금도 국내 굴지의 대기업과 개발을 진행하고 있는데, 개발 방향을 정하는 회의가 잡혔습니다. 이제 거기서 개발 진행이 결정되면 변경사항이 있을 수도 있을 것입니다. 그러나 이미 개발은 완료를 향해 나아가고 있습니다. 얼마나 세세한 계획을 요구하는지는 대기업 SI 회사들과 일해 보신 분들이라면 누구나 공감하실 것입니다. 하지만 그 시간에 개발에 총 집중을 한다면 또한 얼마만큼 빠르게 개발을 진행할 수 있는지도 잘 아실 것입니다. 

이제 진정한 소프트웨어 개발 방법론이 필요할 때라 생각합니다. 폴 그레이엄이 평소에도 계속 주장하듯이 'Bottom-Up' 방식도 또 하나의 대안이 될 수 있으며, 이 새로운 방법론에 대한 가능성은 소프트웨어를 개발하는 방법의 수만큼 많으리라 봅니다. 

무엇이든 지 간에 실제로 짜보기 전에는 공부가 됐다고 말할 수가 없을 것입니다. 그런 의미로 조금 복잡한 프로그램을 만들어 본다면, 거의 할 수 있는 최고의 공부가 될 것입니다. 거기다가 처음부터 차근 차근 만들어 볼 수 있다면? 

그런 의미에서 Nethack 이라는 게임을 클로져로 만들어 보는 것이 정말 괜찮은 공부가 될 수 있을 것입니다.  
저도 우연히 발견한 사이트 인데 정말 많은 공부가 되고 있습니다. 실전 Clojure 공부라고 볼 수 있습니다.

http://stevelosh.com/blog/  

1 부터 차례로 따라하시면 됩니다. 

+ Recent posts