R은 리습계열의 방언에서 출발했다는 이야기가 있습니다. 그래서 인지 정말 놀라울 정도로 이맥스(Emacs)와 잘붙습니다. 게다가 이맥스(Emacs) 와 잘 붙을 수 있게 해주는 모듈이 요즘 빅데이타 의 붐을 타고 계속해서 업데이트 되고 있습니다. 


ESS (Emacs Speaks Statistics) 는 참으로 멋진 줄임말이죠? 이 패키지 모듈을 쓰면 이맥스 상에서 완벽하게 R 과 함게 동작시킬 수가 있습니다. 다만 항상 이런것을 이용할 때의 문제점이 있습니다. 바로 인코딩 문제죠 한글을 입력하면 상태창에서 한글이 완벽하게 깨집니다. 방법은 간단합니다. 


.emacs 파일에 다음과 같은 부분을 추가해주면 됩니다. 




(add-hook 'ess-R-post-run-hook

          (lambda () (set-buffer-process-coding-system

                       'utf-8-unix 'utf-8-unix)))


그리고 이맥스를 재시작하면 깔끔하게 해결이 됩니다. 


추가로 library 명령을 써서 패키지를 로딩하고 나면 한글이 깨지는 경우가 발생합니다. 골치가 아프죠. -ㅅ- 저 같은 경우에는 


library(sqldf) 


를 쓰는 경우에 발생했습니다.  몇군데를 알아봤지만 이게 버그인건지 이맥스 자체의 문제인지는 알아보기 힘들더군요. 단지 interactive R 상에서 


Sys.setlocale ("LC_ALL", "ko_KR.UTF-8")


를 실행해주니 다시 돌아오더군요. 


  너무 거창한 이야기라고 생각합니다. 하지만 16여년 가까이 CS (Computer Science) 쪽에 있었고 또 그런 환경하에서 보고 듣고 생각한 것을 기반으로 해서 조금이라도 후배들에게 도움이 되는 방향으로 설명하고자 합니다. 더구나 이제 어떤 걸 공부해 볼 지 방향을 못잡으실 때 도움이 되실꺼라고 생각합니다. 

  '어떤 프로그래밍 언어를 공부해야 하는가?' 라는 질문은 '어떤 프로그래밍 언어가 좋은 것인가?' 라는 질문과 일맥상통하는 바가 있습니다. 그러나 '좋은' 이라는 중의적인 표현 때문에 참으로 결정하기 어렵습니다. 

  세상에 널리 퍼져서 취직하기 좋은 언어가 '좋은' 것인가? 아는 사람이 거의 없어서 특수한 목적에 꼭 필요한 언어가 '좋은' 것인가? 내가 익숙하게 쓰니까 '좋은' 것인가? 즉 자바나 C/C++ 이 과연 '좋은' 것인가? 하는 것에 관한 물음 입니다. 

  더구나 프로그래밍 언어 (Programming Language) 라는 것은 개발자들에게 있어서는 '종교'와도 같은 것이라서 함부로 이 언어가 저 언어보다 좋다고 단정적으로 말하기가 힘듭니다. 위에서도 언급 했듯이 '중의적인' 표현인 '좋음' 이라는 것이 여러가지 의미를 포함하기 때문입니다. 단적으로 단지 텍스트 에디터일 뿐인 이맥스 와 vim 사용자들의 그간 계속되어 온 전쟁(?)을 보더라도 단순한 논쟁을 넘어서 종교적인 영역과도 맞물려 있습니다. 

  그럼에도 불구하고 이렇게 글을 남기는 것은 비단 나만의 의견이 아니기 때문입니다. 비록 유명한 사람 (지금 그 분이 누군지는 잊어먹었지만..)의 뒤에 숨어서 그 분의 의견이 마치 제 의견인 양 남기는 것은 용기 없는 태도이긴 하지만 저 또한 그 분의 의견에 동감하기 때문에 이렇게 글을 남깁니다. 

  CS (Computer Science) 을 공부하고 앞으로 그 분야를 공부하거나 일을 하게될 사람이라면 적어도 5가지 종류의 언어를 익힐 필요가 있다고 합니다. 

  1. C 언어 
     C 언어는 어셈블리(Assembly) 언어가 잘 안쓰이게 됨에 따라서 가장 기계어에 가까운 시스템 언어입니다. 아시다 시피 C 언어는 온갖 유닉스의 커널을 만든 언어 이기도 합니다. 요즘 환경하에서는 컴퓨터 OS 의 기본을 이루는 근본 언어 이기 때문에 익혀야 합니다. 

  2. C++ 언어 
     C++ 언어는 C 에 가장 가까운 언어이면서 (심지어 라이브러리도 호환되게 쓸 수가 있습니다) OOP (Object Oriented Programming) 언어 입니다. 즉 쉽게 말해서 OOP (Object Oriented Programming) 언어이면서 시스템 관련된 프로그래밍을 할 수가 있는 언어입니다. 참고로 구글에서 많이 쓰는 언어기 때문에 구글에 도전하려는 분들은 익혀두셔야 할 것입니다. 

  3. Java 언어
     Java 언어는 세상에서 가장 많이 쓰이는 언어중에 하나입니다. 사실 그 이유만으로도 공부해야만 하는 가치를 지니고 있습니다. IT 에서는 가장 많이 쓰이는 (범용성이 가장 높은) 것들이 문제가 발생하더라도 해결하기 편합니다. 실례로 현존하는 거의 모든 라이브러리의 자바 버젼은 존재한다고 볼 수가 있습니다. 뭔가 만들고 싶은게 있으면 Java 쪽에서 찾아보면 이미 존재해 있을 가능성이 높습니다. 

  4. Script 언어 
     1-3 번이 알골(Algol) 계열의 언어였다면 이제부터는 그 영역에서 조금 다른 언어를 공부해야 합니다. 스크립트 언어를 공부해야 하는 이유는 어찌 보면 당연합니다. 그 놀라운 생산성은 겪어본 사람만 알 수 있습니다. 아이디어를 가지고 구체화 하는데 이보다 더 탁월한 수단이 없습니다. 너무나 많은 스크립트 언어가 있겠지만 Javascript, Python , Ruby 등을 추천합니다. 특히 파이썬은 구글쪽에 도전하시려면 익혀두시는 게 좋을 것입니다. 

  5. Functional 언어 
     예전에 OOP(Object Oriented Programming) 개념이 처음 나왔을 때 개발자들은 왜 OOP 를 공부해야 하는지 모르겠다는 이야기를 했습니다. C 만으로 모든것이 충분했는데 말이죠. 하지만 GUI 가 나오고 OOP 가 기본인 세상이 됐습니다. 그리고 Java 가 세상을 지배했습니다. 왜 Functional 언어를 공부해야 하는지 모르겠다는 분들이 많습니다. 이해합니다!! 그러나 이제 CPU 만 보더라도 코어 클락수가 수직적으로 상승하던 시대는 잠깐 주춤대고 있으며 이제 병렬적으로 양이 늘어나는 시대가 다가오고 있습니다. 이런 환경하에서 병렬 시스템 설계에 최적의 언어가 함수형(Functional) 언어인건 확실합니다. 그래서 Java 에도 이러한 개념이 추가되고 있습니다. 이러한 언어를 공부하실려면 단연코 저의 의견으로는 리습(LISP) 입니다. 리습(Lisp)이 가장 함수형 (Functional) 언어의 전형을 보여주며 가장 공부할 만한 가치가 있습니다. 최근 JVM 위에 올라가는 언어들이 인기라 클로져(Clojure) 를 공부하신다면 두마리 토끼를 잡으실 수가 있습니다. 

  이상이 공부해 볼만한 5가지 언어 또는 계열입니다. CS (Computer Science) 출신이라면 단순 개발을 잘하는 것 이상의 신기술에 대한 적합도도 중요할 것입니다. 이런 공부 기반을 바탕으로 한다면 적어도 언어 분야에서는 새로운 개념이라 어렵다는 말은 잘 안나올 것입니다.이런 목적을 위해서라도 공부해 볼것을 추천합니다. 

NDK (Native Development Kit Environment) 입니다. 구글은 Java 환경의 SDK 만 가지고 모든 것이 가능할 것이라고 주장했었으나, 몇 버젼 지나지 않아 자신들의 주장을 철회하고 Native C/C++ 프로그램이 가능한 NDK 를 공개했습니다. 

 왜 NDK 를 사용하는가에 관해서는 몇가지 이유가 있겠지만 

 - 빠른 연산을 위해서 (아무래도 C/C++ 이 자바 보다 속도가 빠른것은 주지의 사실입니다) 
 - 수많은 Open Source 들이 아직도 C/C++ 로 되어 있기 때문에


일단 이 두개를 크게 들 수가 있겠습니다. 그렇다고 해서 윈도우 다루는 부분까지 전부 NDK 로 하는 것을 추천하지는 않습니다. 속도가 필요한 부분이나 위에서 언급된 오픈 소스로 만들어진 라이브러리를 응용하는 부분에 사용할 것을 추천합니다. 

 NDK 를 컴파일 하기 위해서 알아야 할 구글에서 만들어둔 Makefile 입니다. Makefile 의 문법을 쓰고 있지만 세세하게 다 작성할 필요 없이 형태에만 맞춰주면 나머지는 빌드스크립트가 알아서 처리를 해 줍니다. 물론 이 방법 말고 OpenSource 를 컴파일하기 위해서는 방법이 따로 필요하지만 그 건 다른 포스트에서 다루기로 하겠습니다. 

 실제로 예제를 따라 만들어 보면 쉽게 이해가 될 것 같습니다. 
 

 NDK 를 개발하기 위한 준비 과정입니다. SDK 와 NDK 를 받아서 적당한 곳에 풀고 SDK 에 관련된 명령을 어디서든 실행할 수 있게 PATH 에 걸어주고, NDK 또한 어디서건 실행이 가능하게 PATH 에 걸어줍니다. 

안드로이드 프로젝트를 만들어줍니다. Eclipse (ADT) 에서도 만들어 줄 수 있지만 저는 기본적으로 Command Line 을 선호하므로 Terminal 에서 만들어 줍니다. 

필수로 입력해야할 내용들입니다. -n 은 프로젝트의 이름 (위에서는 HelloNDK) -t 은 현재 자신의 개발 머신에 설치되어 있는 SDK 버젼의 id 입니다. -k 는 패키지 명입니다. (위에서는 com.comjuck) -a 는 Activity 의 이름입니다. 

 디자인 부분을 손봐줍니다. 그냥 간단하게 TextView 하나 생성해 줍니다. 

 MainActivity 에서 Layout 에서 만들어준 TextView 에 NativeCode 에서 리턴한 문자열을 출력하는 예제를 만들 예정입니다. 따라서 위와 같이 작성해주면 됩니다. 

 실제로 Android 프로젝트를 빌드하는 과정입니다. 그냥 위 명령 그대로 입력하면 컴파일 될 것입니다. 

EDIT: ubuntu 에서 javah 사용시 classpath 를 명시해 줘야 하더군요. 

javah -classpath <android-sdk-path>/platforms/android-20/android.jar:$PROJECT_PATH/bin/classes com.comjuck.MainActivity 


Android 부분이 에러 없이 컴파일 된다고 해도 실제로 Native Code 부분이 없기 때문에 실행하면 에러가 발생합니다. 따라서 Native 부분을 작성해 주는 과정입니다.  javah 명령을 이용해서 header 를 자동으로 생성해 주기로 합니다. javah 는 native 키워드가 붙은 부분에 대해서 자동으로 선언을 만들어 줍니다. (JNI 가 기본으로 제공해 주는 기능입니다) 

그래서 생성된 파일(이름에 주목하면 package 명 + Class 명이 합쳐진 형태)을 $PROJECT_PATH/jni 디렉토리로 복사해줍니다. 

Native 코드들이 위치하는 곳은 $PROJECT_PATH/jni 입니다. 

 Native Code 가 위치해야 하는 $PROJECT_ROOT/jni 에 javah 를 이용해서 생성해준 com_comjuck_MainActivity.h 에 대응하는 Body 를 만들어줍니다. 여기서는 HelloNDK.c 로 만들어 주고 위와 같은 코드를 채워줍니다. 

AndroidManifest.xml 파일을 열어서 이제부터 NDK 를 사용할 것이라는 것을 지정해줘야 합니다. 딱히 해줄것은 없고 minSDKVersion 정보를 최소 14로 맞춰주는 것입니다. 

Native Code를 컴파일 하기 위해서 필요한 Android 용 Makefile 입니다. 현재 지금 있는 것을 컴파일 하기 위해서는 단지 위와 같이 작성해주면 됩니다. 

Android.mk 의 예제입니다. 

LOCAL_PATH 는 ndk-build 가 실행될 때의 위치에 따라서 정보가 다르게 저장되긴 하지만 기본적으로 $PROJECT_ROOT/jni 을 지정하게 되어 있습니다. 

include $(CLEAR_VARS) 는 LOCAL_PATH 를 제외한 모든 LOCAL_ 로 시작되는 변수들이 초기화 됩니다. 왜 필요한가 의문을 가질 수 있지만 여러개의 프로젝트를 컴파일할 때 꼭 필요한 명령입니다. 

LOCAL_CFLAGS 는 추가해줄 컴파일 옵션에 관한 세팅입니다. 

LOCAL_MODULE 은 만들고자 하는 모듈의 이름입니다. 

LOCAL_LDLIBS 는 연결하고자 하는 링크옵션입니다. 

LOCAL_SRC_FILES 는 컴파일 될 대상인 소스파일들의 리스트입니다. 여기에 나열만 해주는 것으로 알아서 처리가 됩니다. 

include $(BUILD_SHARED_LIBRARY) 는 shared object (so 파일) 을 생성하기 위한 명령입니다. BUILD_STATIC_LIBRARY 는 static object (a 파일)을 만들어주기 위한 명령입니다. 

$PROJECT_ROOT 나 jni 디렉토리에서 ndk-build 만 입력하면 컴파일 됩니다. 그리고 다시 $PROJECT_ROOT 에 가서 ant -e debug 를 입력하셔서 다시 컴파일 해주시면 됩니다. 

여러가지 방법이 있겠지만 Command Line 을 이용하자면 

$ ant -e installd


를 이용하면 Device 에 인스톨 됩니다. 
 



저는 컴퓨터 관련 서적 자체를 잘 추천 안하는 편입니다. 요즘 같이 급박하게 기술이 바뀌는 세상에서는 사실상 공식 페이지가 최고의 레퍼런스가 되는 것이 현실이다 보니, 주변에서 기술 관련 서적을 산다고 하면 적극적으로 말리는 편입니다.

그러나 이 책은 정말 감히 추천할 만 합니다. 사실 저는 원서(Android NDK , Beginner's Guide)로 봤는데, 저자의 소스코드만 보더라도 상당한 내공이 느껴집니다. C++ 이나 Object Oriented Programming 에 상당한 조예가 느껴집니다. 팀원이 한글판으로 보고 있는데도 상당히 괜찮다고 하니 번역도 괜찮게 되어 있는 편인가 봅니다. 

안드로이드에서 가장 어려운 축에 드는 NDK(Native Development Kit) 부분을 '따라하기' 식으로 쉽게 풀어서 설명했을 뿐 아니라, 따라하기의 예로 든 것이 바로 '게임' 입니다. 더구나 철저하게 Bottom-up 식으로 설명을 하고 있기 때문에 아니 이게 이런 게임이 되는거야? 하는 신기함도 느끼실 수가 있습니다.

더구나 C 의 함수로 돌아가는 형태를 객체화를 시키는 능력을 보자면 코드를 만들어내는 사람의 내공을 느낄 수가 있는데 그런면에서 이 저자는 가히 탁월한 능력을 보여줍니다.

단 책이 몇 개의 심각한 오타를 가지고 있습니다. (국내판은 확인도 안하고 그대로 번역한 것 같은 느낌까지 준다고 하는군요. ) 따라하기 소스는 필히 원작자의 돌아가는 소스코드를 가지고 공부하시길 추천합니다. 

 
요즘 Android NDK 를 이용해서 개발을 진행중인데, 화가 나는(?) 일이 발생해서 포스팅을 남기게 되었습니다. $(NDK_HOME)/docs/PREBUILTS.html 에 보면 

A prebuilt module does not build anything. However, a copy of your prebuilt shared library will be copied into $PROJECT/obj/local, and another will be copied and stripped into $PROJECT/libs/<abi>.

 
이런 문구가 있습니다. 하지만 시키는 대로 하니 복사는 커녕 어떠한 동작도 발생하지 않는 것을 발견했습니다. 미치는 지 알았습니다. 한 두시간을 구글링 했어도 어디에서도 명확히 답을 주는 부분이 없었습니다. 보통 이정도라면 방법은 하나 입니다. 직접 빌드 시스템을 까보는 수밖에 없지요.  

$(NDK_HOME)/build/core/prebuilt-static-library.mk 

위의 파일이 prebuilt-static-library 에 관한 부분입니다. 그 안을 보면 다음과 같은 문구가 있습니다. 

# Prebuilt static libraries don't need to be copied to TARGET_OUT
# to facilitate debugging, so use the prebuilt version directly
# at link time.


즉 요약을 하자면, 매뉴얼에서는 복사를 한다고 써 있지만, 실제로 동작하는 코어 모듈에서는 직접 링크를 하라는 식으로 쓰여져 있더군요. 

결론은 prebuilt-static-library 를 사용할려면 실제로 매뉴얼에 있는대로 동작을 하지 않습니다. 직접 라이브러리 링크를 걸어주시기를 추천합니다. 
 
필요에 따라서 Eclipse 최신 버젼에 (Kepler) ADT 플러그인을 설치해서 사용중입니다. 이유는 간단합니다. 서버와 클라이언트를 동시에 개발할 일이 생겨서 그렇습니다. J2EE 와 ADT 를 따로 따로 설정해주는 방법도 있지만, 그 무겁고 귀찮은 Eclipse 를 두개나 깔아서 쓰라니요 절대 그럴 수는 없었습니다. 

최근 Eclipse 와 ADT 가 업그레이드 되면서 누락 된 부분이 있어서 수동으로 설치를 해줘야 한다고 합니다.

원문참조 : http://stackoverflow.com/questions/16608524/eclipse-giving-error-missing-r-java-file-after-recent-update?lq=1

원문 참조 이구요. "Android SDK Manager" 버튼를 클릭해서 창을 띄우고 

 
위 그림에서 체크된 항목을 설치해 주면 된다고 합니다.

 
 Emacs 와 JDEE 와 Maven 과의 결합의 마지막을 해결했습니다. 그 전의 세팅을 보시고 싶으시면 


    2 번까지 끝을 내고 나니 Emacs 내에서 maven 컴파일과 빌드를 하고 싶더군요. (당장은 mvn install 만 되게) 딱히 다른 사람들이 만든 것은 내 필요에 부합하지 않은 것 같기도 하고 지원도 더 이상 하지 않는 것 같기에 직접 만들게 됐습니다. jdee 프로젝트 안에 있는 jde-make 를 변경했습니다. 간단하게 되더군요. 적당한 곳 (~/.emacs.d 안에)에 jde-mvn.el 을 복사하시고 .emacs 안에서 

(require 'jde-mvn)


 을 해주시면 됩니다. 그리고 세부 설정을 위해서 


(custom-set-variables

 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(ecb-options-version "2.40")
 '(jde-build-function (quote jde-mvn))
 '(jde-global-classpath (quote 
     ("/Users//work/android/\
      sdk/platforms/android-17/android.jar" 
      "/Users//.emacs.d/\
      jdee/build/classes")))
 '(jde-mvn-enable-find t)
 '(js2-auto-indent-p t)
 '(js2-cleanup-whitespace t)
 '(js2-enter-indents-newline t)
 '(js2-global-externs (quote ("$" "Ext")))
 '(js2-mirror-mode nil)
 '(slime-complete-symbol-function 
   (quote slime-fuzzy-complete-symbol))
 '(tab-width 2))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )


 와 같이 jde 설정을 해주시면 완료입니다. 

 필요한 파일은 https://github.com/crazia/jdee-mvn 에 올려두었습니다.
일단 링크부터 

https://github.com/facebook/hiphop-php/wiki

입니다.  php 로 시작한 페이스북이 대용량 접속을 처리하기 위해서 php 모듈을 c++ 로 변환해주는 방식을 쓴다고 알려져 있었습니다. 그런데 요즘 페이스북이 베타버젼중인 Node.js 로 갈아탔다고 합니다. 그러더니 자신들이 사용하고 있던 그 라이브러리를 오픈소스화 시켰습니다. (사실 이때쯤 유명해지기 시작했다는 것이 더 사실에 가까울 것입니다) 예전 Scribe 때와 똑같은 현상입니다. 카산드라도 그랬던가? 이건 확실하지 않네요. 

구글은 자신들이 계속 사용할 기술들을 오픈소스화 시키는 반면에 페이스북은 자신들이 더이상 사용하지 않을 기술들을 오픈소스화 시킨다는 느낌이 강합니다.



만약 제가 PHP 사이트를 운영중인 회사의 CTO 고, 그 사이트가 최근 대폭적인 사용자의 증가로 계속해서 하드웨어를 늘리면서 버티고 있는 상황에서 기술을 도입해야 할 고민에 쌓여있다면,  고민에 빠져들만도 합니다. 

hiphop-php 를 써야 하나?
그런데 저는 node.js 로 전 사이트를 리팩토링 하는 방법을 선택할것도 같습니다. 왜냐면 페이스북도 hiphop-php 대신 node.js 를 선택했기 때문이지요.

제가 그래서 공개시점이 항상 애매하다고 생각하는 것입니다. 물론 기술적으로는 문제가 없겠지만, 페이스북이 node.js 를 선택한 시점에서 기술 선택을 해야 한다면 node.js 쪽으로 기울지 않겠습니까? 

제가 이런 막되먹은 생각을 마구 하는 이유는 Scribe 가지고 테스트 하다가 현행화가 안되서 고생한 것 때문에 삐져서 이러는 거 아닙니다 쿨럭.. (그리고 공개는 몇년전에 되어 있더군요 최근 활성화 되기 시작한것이지) 
저번 포스트 에서 Emacs 버젼을 24 로 업그레이드 한 후에 가장 큰 문제가 생겼습니다. ClojureCommon Lisp 개발환경이 동시에 안되는 문제가 발생했습니다. 

몇번의 노력끝에 결국 Emacs 에서도 편하게 설치하는 쪽을 받아들이게 됐습니다. 기존에는 "이맥스 유저는 이래야 해!!" 라는 말도 안되는 자존심으로 수동으로 이거 저거 설치하는 쪽이였으나 이제 대세를 받아들이기로 했습니다. 

클로져 (Clojure) 개발 환경 설정 


예전 포스트 에서 쉽게 설치하는 방법을 소개한 적이 있었습니다.  그러나 swank-js 를 만들었던 당사자가 더 훌륭한 솔루션이 나왔다고 GG 를 쳐버렸습니다. -0- (당신을 믿고 포스팅을 했었다고!!! ㅜ.ㅜ ) 

nRepl 을 설치해줍니다.  

nrepl.el is an Emacs client for nREPL, the Clojure networked REPL server. It's a great alternative to the now deprecated combination of SLIME + swank-clojure.


설치법은 간단합니다. Emacs 24 버젼부터는 Package 관리가 기본으로 포함되어 버렸습니다. 대세는 게을러지기 아니겠습니까? 
.emacs 파일에 다음과 같은 내용을 추가합니다. 


(require 'package)
(add-to-list 'package-archives
    '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)


그리고 재 시작후 , M-x list-packages 로 출력해서 nrepl 을 찾아서 설치해 주거나 , 설명 페이지에서 추천하는 대로 

M-x package-install [RET] nrepl [RET]



로 설치해주시면 됩니다. 추가로 편리하게 사용하기 위해서 세팅 몇가지만 해주시면 됩니다. 

(add-hook 'nrepl-mode-hook
     (defun clojure-mode-slime-font-lock ()
         (let (font-lock-mode)
             (clojure-mode-font-lock-setup))))


이제 클로져 관련 파일을 열고나서 M-x nrepl-jack-in  를 입력하시면 익숙한 REPL 버퍼가 보일 것입니다. (속도도 Swank-js 보다 빨라졌습니다)


Common Lisp 개발 환경 설정 (SLIME 설정)
 
이제 이것 설치도 쉽게 하는 방법이 있습니다. SBCL 은 이미 설치되어 있다고 가정합니다. (참조사이트 : http://www.mohiji.org/2011/01/modern-common-lisp-on-linux/

일단 quicklisp 파일을 다운 받아야 합니다. http://beta.quicklisp.org/quicklisp.lisp 에서 받아줍니다. 적당한 곳에 옮겨주시고요. 

$ sbcl


sbcl 을 실행시켜줍니다.

user> (load "/path/to/quicklisp.lisp")


sbcl 상에서 위와 같이 quicklisp 파일이 받아진 것을 읽어들입니다.  

user> (quicklisp-quickstart:install)
user> (ql:add-to-init-file)
user> (ql:quickload "quicklisp-slime-helper") 


그리고 위와 같이 연속으로 실행시켜줍니다.  이러면 자연스럽게 SLIME 까지 설치가 됩니다. 이제 Emacs 에게 위치를 알려주는 일만 해주면 됩니다. 

(setq inferior-lisp-program "sbcl")
(load (expand-file-name "~/quicklisp/slime-helper.el"))

이제 M-x slime 을 입력하면 자연스럽게 SLIME REPL 이 뜨게 됩니다.  

May The Source Be With You !!!
 
최근 업무 관계로 바빴습니다. (뭔 웹 사이트를 한달안에 5개를 만들라고 하시는지..) 

기존에 사용하고 있던 Emacs 버젼이 낮은 관계로 업그레이드를 하긴 해야지.. 하다가 지금 릴리즈 되어 있는 버젼이 Shift+SPC 가 안먹는다는 이야기를 접했습니다. 커미터가 서양분인 관계로 Shift+SPC 의 필요성을 모르셨나 봅니다. (이런!!!) 그러다 CJK 언어를 쓰는 동북아 삼국의 맹공 (주로 중국과 일본)을 받고 끝내, 왜 필요한지는 모르겠지만 이라는 사족을 단 채로 Shift+SPC 를 잡아채게 바꿨다고 합니다 ㅎㅎ

그래서 일단 Emacs 소스를 받아옵니다. 여러 레파지토리가 존재하지만 손에 익은 github.com 것을 가져오기로 합니다.

https://github.com/emacsmirror/emacs

적당한 곳에 가서

$ git clone git://github.com/emacsmirror/emacs.git 



합니다. 내려 받는데 시간이 좀 걸립니다. 소스 전체 크기가 무려 900메가가 넘기 때문입니다. (소스 자체 크기라기 보다는 변경내역들의 내용이 많을것이라 봅니다)

이대로 컴파일을 하면 라이브러리가 두개 없다고 나옵니다. libgif 와 libtiff 입니다. 따라서 이를 설치해 줘야 합니다.
애플에서 이런 오픈소스 라이브러리에 관련된 페이지가 있습니다.
http://www.apple.com/opensource/ 이 곳인데요. 이곳에서 gif 와 tiff 라이브러리를 찾아서 설치해 줍니다. 

http://sourceforge.net/projects/giflib/?source=dlp
이게 libgif 고 

http://www.remotesensing.org/libtiff/
이게 libtiff 입니다. 

두 소스 다 받아서 압축을 푸시고, 

 EDITED: 2015-04-06

brew 를 이용해서도 설치할 수가 있습니다. 

$ brew install libtiff

$ brew install giflib


$ configure 
$ make -j4 
$ sudo make install


 
해 주면 설치됩니다. make -j4 는 다들 알다시피 잡 갯수입니다. core 갯수 * 2 정도를 해주면 적당합니다. 이제 Emacs 를 컴파일 해줄 차례입니다. 

Emacs 에서 imagemagick 을 이용하면 org-mode 에서 이미지를 다룰 수가 있게 됩니다. imagemagick 을 연동해서 컴파일 설정을 해줍니다. 

$ cd ~/work/emacs

$ brew install pkgconfig

$ brew install imagemagick

$ ./autogen.sh

$ configure --with-ns
$ make -j4
$ make install



해주면 ~/work/emacs/nextstep 안에 컴파일된 Emacs.app 가 존재합니다. 이것을 /Applications 에 복사하시면 설치는 완료입니다. 뭔가 그래픽쪽이 강화가 됐는지 (libgif 와 libtiff 때문인가? ) 뽀샤시한 느낌이 나는게 아주 흡족합니다. 물론 Shift+SPC 도 잘 동작합니다.

 



+ Recent posts