Slime 이 무엇인지 Emacs 를 사용하시는 분들은 대충 아시리라 봅니다. REPL (Read Eval Print Loop)형태를 지원하는 언어에 대한 최적의 개발 환경이라고 보시면 됩니다. (물론 부정하는 분들도 많습니다) 

저는 Common Lisp , Clojure 등을 Slime 을 이용해서 개발환경을 구축해 두었습니다. 이번에 프로젝트를 Node.js 로 진행하게 되어서 (Node.js 또한 REPL 을 지원합니다) Emacs + Slime 으로 환경을 구축할려고 알아보았습니다. 

역시나 괜찮은 솔루션이 하나 등장하더군요. https://github.com/swank-js/swank-js

Slime 은 Swank 라는 방식으로 각기 언어별로 소켓 접속이 가능한 방식으로 서버를 띄우면 Emacs 에서 slime-connect 를 이용하여 서버에 붙어서 정보를 가져오고 전달하는 방식으로 구동됩니다. 이러한 점 때문에 원격에 swank 서버를 띄워도 마치 local 에 붙는 것처럼 붙어서 동작할 수가 있습니다. 

설치하는 방법 (OSX - Mountain Lion 기준 입니다)

1. Node.JS 와 npm 을 설치합니다. (Ubuntu 설치는 예전 포스트 참조 )

     

 $ sudo port install nodejs 
 $ sudo port install npm 


2. swank-js 설치 합니다. 
       

 $ sudo npm install -g swank-js 


swank-js 는 node.js 로 만들어진 swank 모듈입니다. 위에서 잠깐 언급한 slime 이 접속할 수 있는 서버를 띄워주는 모듈입니다. npm install 시에 -g 옵션을 주면 전역으로 설치하라는  명령입니다. 이제 어디서나 swank-js 명령으로 swank 서버를 띄워줄 수가 있습니다. 

3. SLIME 을 설치해야 할 시간입니다.

$ cd ~/.emacs.d/
$ cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime


위와 같은 방식으로 다운 받는 것이 속도가 가장 빠르더군요. git 사이트는 생각보다 많이 느립니다. 


4. js2-mode 를 받아야 합니다. 

http://code.google.com/p/js2-mode/ 에서 js2-20090723b.el 을 다운 받아서 js2-mode.el 로 이름 변경해서 적당한 곳 (저는  ~/.emacs.d/ 밑에다 가져다 뒀습니다) 에 옮겨두고 byte-compile-file 을 해줍니다. 

Emacs 를 실행하고 
       

M-x byte-compile-file 


로 js2-mode.el 을 지정하면 됩니다. 이때 꼭 명심해야 할 사항은 절대 js2-mode.el 을 버퍼에 올려둔 상태로 컴파일 진행하면 안된다는 것입니다. (올려둔 상태로 컴파일 하면 에러가 발생함)

.emacs 파일을 열고 다음과 같은 내용을 추가해 줍니다. 

       (autoload 'js2-mode "js2-mode" nil t)
       (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))



5. 적당한 곳에 swank-js 프로젝트를 다운 받습니다. 
       
     

 $ cd ~/work
 $ git clone git://github.com/swank-js/swank-js.git



6. slime-js.el 의 심볼릭-링크 를 만들어 줍니다. 

$ cd ~/.emacs.d/slime/contrib
$ ln -s ~/work/swank-js/slime-js.el slime-js.el
$ cd ~/.emacs.d/
$ ln -s ~/work/swank-js/slime-js.el slime-js.el


7. .emacs 에 slime-js.el 을 require 해주고, 몇가지 추가 설정을 더 해줍니다. 

       (require 'slime-js)
       
       (add-hook 'js2-mode-hook
          (lambda ()
            (slime-js-minor-mode 1)))
       
       (add-hook 'css-mode-hook
          (lambda ()
            (define-key css-mode-map "\M-\C-x" 'slime-js-refresh-css)
            (define-key css-mode-map "\C-c\C-r" 'slime-js-embed-css)))



8. Emacs 를 다시 띄우고 Terminal.app 를 실행하시고 node.js 프로젝트 만들려고 마음 먹은 곳 위치에서 

$ cd ~/work
$ mkdir node-projects
$ cd node-projects
$ swank-js


이렇게 해주면 swank-js 서버가 구동됩니다. swank-js 명령만 쳐도 되는 것은 'sudo npm install -g swank-js' 해 줬기 때문입니다. 

Emacs 에서 

M-x slime-connect


해 주고 기본적으로 127.0.0.1 과 4005 번 포트로 접속 하는 것을 선택해 주시면 됩니다. (Enter x 2 번)

추가로 어떤 기능이 되는지는 https://github.com/swank-js/swank-js 사이트 참조하시면 됩니다.  

아이디어 기획의 시작은 종이와 연필로 부터 , 프로그래밍 시작은 키보드로 부터 



아이디어 자체보다 실행이 중요하며, 프로그램은 머리로 짜는 것이 맞지만, 손 부터 움직이지 않으면 일 시작하기가 애매합니다. 빠른 개발론 (Rapid Development)을 실현화 할려면 무엇보다 시간을 많이 잡아먹는 변수를 없애야 합니다. 그 변수중 첫째는 기획 문서 만드는 것과 둘째는 프로그램 개발의 시작입니다.

이 두가지 변수를 없애는 방법은 '빠르게 시작하는 것' 일단 종이와 연필을 가지고 아이디어를 구상하고 구상 단계가 끝나면 잽싸게 키보드를 부여잡고 개발을 시작하는 것입니다.

진행하면서 생각하기!! 빠른 개발론의 시작입니다. 

 
CLisp 이나 C++ 에서는 쉽게 설정하는 함수 인자 기본 값 (Default) 설정하는 방법에 관한 예제입니다. 일단 쉽게 설정하는 방법이 없는 듯 합니다. 

1 user=> (defn bar
2          ([a b]   (bar a b 100))
3          ([a b c] (* a b c)))
4 #'user/bar
5 user=> (bar 5 6)
6 3000
7 user=> (bar 5 6 2)
8 60

이 와 같은 식으로 가장 인자 수가 많은 함수를 내부에서 호출하는 형식으로 꾸며줍니다. 그 외에 다른 방식으로는 :keyword 형식으로 호출하는 등등이 있으나 위에 쓰여지는 방법이 그나마 다른 언어(Language)에 익숙한 방법이라 사료됩니다. 

defn 설명 페이지 


친구랑 까마득한 옛날에 배웠던 전산학 개론에 관한 기억을 더듬다가 나온 이야기입니다. 

현대 컴퓨터의 모델이 대체 무엇이냐에 관한 논쟁을 하던중 "튜링 머신이다" 와 "폰 노이만 아키텍쳐" 다 로 의견이 갈려서 서로 강하게 대립했습니다.

결론부터 말하자면 두가지 다가 맞습니다. 그러나 형태는 조금 다르다고 보면 됩니다.

튜링 머신은 초 간단 설명을 하자면 '명령어가 나열 되어 있고 그것을 읽어서 실행하는 형태의 가상 기계' 입니다. 그리고 폰 노이만 아키텍쳐는 '컴퓨터 하드웨어를 이루는 CPU, RAM , 하드디스크 등등으로 구조에 관한 설명'입니다. 하나는(튜링 머신) 프로그램에 관한 설명이고 하나는(폰 노이만 아키텍쳐) 하드웨어 구조에 관한 설명입니다. S/W 와 H/W 둘중 하나라도 없으면 현대 컴퓨터에 대한 설명이 이루어지지 않겠지요. 두개 다 현대 컴퓨터를 구성하게 되는 근간입니다.  

이런일로 다툴 일이 없겠지만 혹시나 다투게 되실 때 참조하셨으면 합니다.  

Parallelism Versus Concurrency

Lest our discussion of concurrency and parallelism lead you to think they are the same thing, let’s disentangle the two notions.

Concurrency is the coordination of multiple, usually interleaved threads of execution that are accessing or modifying some shared state.

Parallelism involves state as well, but usually in the inverse. Being an optimization technique used to efficiently utilize all of the available resources (usually computational, but sometimes other resources, like bandwidth) to improve the performance of an operation, approaches to parallelization generally aim to maximize the window of exclusive access to state (or, often, chunks of state) so as to minimize coordination overhead. Rather than involving interleaved threads of execution, the multiple evaluations of a parallelized operation run simultaneously—sometimes on different CPU cores, other times on different physical machines entirely.

-- Clojure Programming 책 중에서 .. 


쉽게 설명하자면 

'동시성' 은 공유되는 자원에 대한 접근이나 변경을 주도하는 쓰레드들을 배치하는 작업에 관한 용어이고 

'병렬성' 은 공유될 수 있는 자원에 대한 최적화된 사용에 관한 용어입니다. 보통 쓰레드 배치나 이런 것은 당연히 적용하지만 잡-스케쥴링 (Job - scheduling) 을 통해서 다중 CPU 일 경우 각각의 CPU 나 코어 에서 작업을 분배시켜서 돌리게 하거나 또는 아예 다른 기계에서 작업을 돌리게 한다던지 와 같은 오히려 작업 분배에 관한 용어로 쓰일 때가 많습니다. 



 

재미로 만들어(만들었 다기 보다는 포팅- 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 에 공개를 해둡니다. 

 You think you know when you learn, are more sure when you can write, even more when you can teach, but certain when you can program

 - Alan Perlis (Yale University computer scientist)




배울때 알게되고 , 글로 쓸 때 더 분명해 지며, 가르칠 수 있을 때 더욱 더 분명해진다. 그러나 프로그램을 할 수 있다면 더욱 확실 해진다.  

 

모든 지식은 시스템 내에서 단일하고, 애매하지 않고, 정말로 믿을만한 표현 양식을 가져야 한다. 



DRY - 반복하지 마라 (Don't Repeat Yourself)

어떻게 중복이 생기는가? 

- 강요된 중복
  개발자들은 다른 선택이 없다고 느낀다. 환경이 중복을 요구 하는 것처럼 보인다. 

- 부주의한 중복

  개발자들은 자신들이 정보를 중복하고 있다는 것을 깨닫지 못한다.

- 참을성 없는 중복
  중복이 쉬워 보이기 때문에 개발자들이 게을러져서 중복을 하게 된다.

- 개발자간의 중복
  한 팀에 있는 (혹은 다른 팀에 있는) 여러 사람들이 동일한 정보를 중복한다.



위 내용은 예전에 읽었던 '실용주의 프로그래머' 라는 책에서 나와 있는 드라이 원칙 입니다. 소프트 웨어를 작성할 때 필히 반복되는 환경에 대해서 어떻게 피할 수 있는 가에 관한 언급이 있는 부분입니다.

이 책을 읽은지도 어언 몇년이 흘렀는지 모릅니다. 그 책을 읽고 느낀바가 있어서 여러가지 공부를 하게 됐으니 이 책은 나에게 새로운 길을 열게 도와준거나 다름 없습니다.

CS (Computer Science) 에 들어온지 어언 18년 , 직장으로서 프로그래밍을 한지는 15년 가까이 되가는 지금 예전에 스쳐지나갔던 내용들이 더욱 큰 의미를 가지고 다가오고 있습니다.  그래서 간만에 찾아본 소프트웨어 개발시 염두에 두어야 하는 드라이 (DRY) 원칙이였습니다. 


 
페르마의 작은 정리 

n 이 소수고 , a 가 n 보다는 작고 0 보다는 큰 정수라면 ,   a^n  (a 의 n 승) 은 a modulo n 으로 맞아 떨어진다. 


 
이러한 페르마 검사가 확실하게 소수를 판별하지는 못한다. 역이 성립이 안하기 때문이다.  즉 소수가 아닌데도 페르마의 작은 정리를 만족시키는 값이 존재하기 때문이다. 이러한 수를 카마이클 수 (Carmichael number)라고 하는데, 이 수는 아주 드물다는 점 밖에 알려진 성질이 없다.  1000,000,000 아래에는 25개가 있고 예를 들자면 (561, 1105, 1729, 2465, 2821, 6601) 사실 아주 큰 값을 마구잡이로 골라 그 수가 소수인지 알아볼 때, 페르마 검사가 틀릴 확률은 우주선 (우주에서 온 방사선 cosmic radiation )이 '올바른' 알고리즘을 돌아가는 컴퓨터를 고장나게 만들어 틀린 답을 내놓게 하는 확률보다 작다. 

처음에는 틀렸기 때문에 알맞지 않은 알고리즘이라고 했다가, 나중에는 쓸 만하다고 하였는데, 바로 이런 판단 기준의 차이가 수학(과학)과 공학(기술)의 차이를 말해주는 좋은 보기다. 

                                                                          - 컴퓨터 프로그램의 구조와 해석 중에서..

완벽하게 설명이 되어야 하는 학문의 영역과 , 완벽하지는 않지만 쓸만하군 (공학) 바로 그 차이가 요즘 물질 문명의 바탕이 된 게 아닌가 싶습니다. 적어도 이러한 페르마의 작은 정리와 소수를 생성하는 그 검사로 인해서 RSA 암호화 알고리즘이 시작됐다고 하니까 말입니다. 주변에서 찾아보면 이러한 과학과 공학의 차이를 느낄 수 있는 예들이 종종 있습니다. 즉 공학은 현실과의 타협입니다. 적당한 선에서 말이죠 
 
 

In programming, the best way to learn is often to begin experimenting as soon as possible. A full theoretical understanding can come later. - OnLisp 중에서 


프로그래밍을 배우는데 있어서 가장 좋은 방법은 가능한한 빠르게 실험을 해보는 것이다. (빠르게 예제를 짜보는 것) 전반적인 이해는 흔히 그 다음에 온다는 것이 폴 그레이엄이 말하는 방법입니다. 

종종 프로그래밍을 공부한다고 치면 매뉴얼 부터 세세히 읽어가기 시작하면 금새 꿈나라로 가는 경우가 다반사기 때문에 후다닥 목차정도만 훓고 빠르게 이거 저거 짜보는 게 확실히 빠른 이해가 됩니다.

나이키 광고가 가지는 뜻이 절실해 지는 군요 프로그래밍 에서도.

Just Do It

 

+ Recent posts