VMware와 Parallels trial 버전을 각각 깔아서 시험해본 결과를 적어봅니다.
외장하드를 연결했을 때 Parallels 같은 경우에는 윈도우에도, 맥에도 양쪽 다 제대로 마운트가 안 되는데 비해, VMware에서는 잘 됩니다.
저는 맥에서 네스팟을 쓰는데 Parallels로 윈도우를 시동시키면 인터넷이 안 되네요.
VMware에는 Ubuntu 7.10이 깔리는데 비해 Parallels에는 안 깔립니다. VMware 문서에 보면 Ubuntu 6.10까지만 지원한다고 되어 있어서 7.10이 깔릴지 반신반의 했었는데 깔리더군요. 주의할 점 몇 가지만 적어보면,
Ubuntu 설치할 때 인터넷이 연결된 상태로 하는 게 좋습니다. 그래야 한글 설정 같은 것이 자동으로 잡힙니다. 제가 가진 라이브시디가 초기 버전이라 그런지도 모르지만..
설치가 끝나고 정상적으로 리붓이 되질 않고 멈춰버리는데, VMware에서 강제적으로 리붓시키면 됩니다.
리붓 후 VMware 툴을 설치해야 합니다. Virtual Machine -> Install VMware Tools 를 선택하면 cd-rom 아래에 tar.gz 파일이 보입니다. 아무데로나 복사해서 압축을 풀고(tar -xvzf 파일이름) doc 아래의 Install 문서대로 따라하면 됩니다. 설치는 수퍼유저로 해야 한다고 나와 있는데, Ubuntu를 처음 깔면 root user 패스워드는 설정이 안 되어 있기 때문에 su가 안 먹힙니다. 그 때는 sudo passwd root 로 root user 패스워드를 설정해 주면 됩니다.
처음엔 네이티브에 비해 엄청 느려서 쓸 수가 없다고 생각했는데, VMware 툴을 설치한 후 리붓하니 그래도 적당한 속도가 나오는 것 같습니다. 쓸만하네요.
둘 중 하나를 구입할 생각이었는데 지금으로서는 VMware쪽으로 마음이 기우는 듯 합니다.
2008년 2월 10일 일요일
2008년 1월 4일 금요일
맥에서 SBCL이 thread를 지원하도록 만들기
SBCL은 맥에서 experimental threading을 지원한다고 되어있지만, 그런 식으로 발표된지가 1년이 훨씬 넘었기 때문에 더 이상 experimental한 것이 아니라고 보는 사람들이 많다. 어쨋건, 맥에서 SBCL로 웹 프로그래밍을 해보려면 threading support는 필수적이기 때문에 SBCL을 어떤 식으로 인스톨해야 스레드를 지원하도록 만들 수 있는지 알아보도록 하겠다. 요점은 특정한 설정을 주고 소스를 직접 컴파일해야 되는데, 컴파일하려면 리습 구현이 필요하기 때문에 일단 바이너리 버전의 SBCL을 설치한 다음, 소스코드를 컴파일해서 바이너리를 만들고 그 바이너리로 인스톨하면 된다. 구체적인 설치 과정은 다음과 같다.
1. 바이너리 버전의 SBCL을 다운받아 인스톨한다.
바이너리 파일을 다운받아 압축을 푼 폴더에서 sudo sh install.sh
2. SBCL의 소스 코드를 내려받아 압축을 푼다.
예를 들어 압축을 푼 폴더가 /Users/chanwoo/Downloads/sbcl-1.0.13 라고 하자.
3. 내려받은 소스 코드 디렉토리의 최상단(/Users/chanwoo/Downloads/sbcl-1.0.13 폴더)에 customize-target-features.lisp 파일을 다음과 같은 내용으로 만들어 저장한다.
4. 소스를 컴파일한다.
sudo sh make.sh
5. 기존에 설치된 SBCL을 지운다.
/usr/local/bin/sbcl 과 /usr/local/lib/sbcl 을 삭제
6. 소스 디렉토리(/Users/chanwoo/Downloads/sbcl-1.0.13)에서 바이너리 파일을 인스톨하듯이 인스톨하면 된다.
sudo sh install.sh
Hunchentoot를 돌려보면 스레드를 지원하는 것을 볼 수 있다! :)
1. 바이너리 버전의 SBCL을 다운받아 인스톨한다.
바이너리 파일을 다운받아 압축을 푼 폴더에서 sudo sh install.sh
2. SBCL의 소스 코드를 내려받아 압축을 푼다.
예를 들어 압축을 푼 폴더가 /Users/chanwoo/Downloads/sbcl-1.0.13 라고 하자.
3. 내려받은 소스 코드 디렉토리의 최상단(/Users/chanwoo/Downloads/sbcl-1.0.13 폴더)에 customize-target-features.lisp 파일을 다음과 같은 내용으로 만들어 저장한다.
(lambda (features)
(flet ((enable (x)
(pushnew x features))
(disable (x)
(setf features (remove x features))))
;; Threading support, available only on x86/x86-64 Linux, x86 Solaris
;; and x86 Mac OS X (experimental).
(enable :sb-thread)))
4. 소스를 컴파일한다.
sudo sh make.sh
5. 기존에 설치된 SBCL을 지운다.
/usr/local/bin/sbcl 과 /usr/local/lib/sbcl 을 삭제
6. 소스 디렉토리(/Users/chanwoo/Downloads/sbcl-1.0.13)에서 바이너리 파일을 인스톨하듯이 인스톨하면 된다.
sudo sh install.sh
Hunchentoot를 돌려보면 스레드를 지원하는 것을 볼 수 있다! :)
2008년 1월 2일 수요일
ASDF (Another System Definition Facility)
커먼 리습 프로그래밍을 하다보면 홈 폴더가 아닌 다른 폴더에 저장된 .lisp 파일을 로드해 올 수는 없을까 하는 의문이 생기게 된다. load가 파일을 읽어들여오는 path 설정은 도대체 어디서 하는거지? 라고 고민할 수 있다. 결론적으로 말하면 load는 파일을 로드하기 위해서 복수의 디렉토리를 살펴볼 능력이 없다. 하지만 방법이 없는 것은 아니다. asdf를 사용하면 원하는 일을 할 수 있다. SBCL이나 OpenMCL 같은 경우에는 asdf가 기본적으로 포함되어 있기 때문에 별도의 설치가 필요 없다. asdf를 사용할 때 다음과 같이 해주기만 하면 된다.
(require 'asdf)
asdf는 사실 프로그램이 복수의 파일들로 나뉘어서 짜여질 때 파일들 사이의 의존관계를 지켜가며 컴파일하도록 도와주는 C의 make와 비슷한 것이라 보면 된다. 이러한 의존관계는 .asd 파일로 만들어진다. 다음 cow.asd 파일의 예를 보면 tail.lisp 파일은 legs.lisp 파일에 의존적이다.
cow.asd 및 tail.lisp, legs.lisp 등의 파일이 ~/work/cow 폴더에 저장되어 있다고 하자. 그러면 이 시스템을 사용하기 위해서는 자신이 사용하는 리습의 스타트업 파일(홈폴더 아래에 만들면 되며 SBCL은 .sbclrc OpenMCL은 openmcl-init.lisp)에 다음과 같이 추가하면 된다.
(require 'asdf)
(push #p"~/work/cow" asdf:*central-registry*)
이렇게 추가한 뒤에는 SBCL에서는 그저 (require 'cow)라고 하는 것만으로 파일들이 차례대로 로드된다. 다른 리습 구현에서는 (asdf:operate 'asdf:load-op 'cow)라고 해야 하지만.
따라서 asdf를 이용하게 되면 홈 폴더가 아닌 곳에 리습 파일을 놓고 로드할 수가 있다. 리습 파일을 원하는 폴더에 위치시키고 그 폴더를 asdf:*central-registry*에 등록시킨 다음, 폴더 안에 있는 .lisp 파일들을 어떤 식으로 로드할 것인지를 .asd 파일로 만들어 역시 같은 폴더 안에 위치시키면 된다. 만일 로드하고자 하는 리습 파일이 lisp-unit.lisp파일 하나뿐이라면 lisp-unit.asd 파일은 다음과 같은 것으로 충분할 것이다.
아무튼, 여기서 다 설명할 수는 없지만, asdf는 현재 Common Lisp에서 시스템을 구성하는 일반적인 방법이다. 그리고 asdf-install은 Common Lisp 라이브러리를 설치하는데 가장 널리 사용되는 도구다. 둘 다 Common Lisp의 교과서들을 끝내고 실제 세상으로 나갈 때 반드시 사용하게 되는 도구라고 할 수 있다.
(require 'asdf)
asdf는 사실 프로그램이 복수의 파일들로 나뉘어서 짜여질 때 파일들 사이의 의존관계를 지켜가며 컴파일하도록 도와주는 C의 make와 비슷한 것이라 보면 된다. 이러한 의존관계는 .asd 파일로 만들어진다. 다음 cow.asd 파일의 예를 보면 tail.lisp 파일은 legs.lisp 파일에 의존적이다.
;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
(defpackage #:cow-asd
(:use :cl :asdf))
(in-package :cow-asd)
(defsystem cow
:name "cow"
:version "0.0.0"
:maintainer "T. God"
:author "Desmon Table"
:licence "BSD sans advertising clause (see file COPYING for details)"
:description "Cow"
:long-description "Lisp implementation of our favorite ruminant"
:components ((:file "tail"
:depends-on ("package" "legs"))
(:file "legs"
:depends-on ("package"))
(:file "head"
:depends-on ("package"))
(:file "package")))
cow.asd 및 tail.lisp, legs.lisp 등의 파일이 ~/work/cow 폴더에 저장되어 있다고 하자. 그러면 이 시스템을 사용하기 위해서는 자신이 사용하는 리습의 스타트업 파일(홈폴더 아래에 만들면 되며 SBCL은 .sbclrc OpenMCL은 openmcl-init.lisp)에 다음과 같이 추가하면 된다.
(require 'asdf)
(push #p"~/work/cow" asdf:*central-registry*)
이렇게 추가한 뒤에는 SBCL에서는 그저 (require 'cow)라고 하는 것만으로 파일들이 차례대로 로드된다. 다른 리습 구현에서는 (asdf:operate 'asdf:load-op 'cow)라고 해야 하지만.
따라서 asdf를 이용하게 되면 홈 폴더가 아닌 곳에 리습 파일을 놓고 로드할 수가 있다. 리습 파일을 원하는 폴더에 위치시키고 그 폴더를 asdf:*central-registry*에 등록시킨 다음, 폴더 안에 있는 .lisp 파일들을 어떤 식으로 로드할 것인지를 .asd 파일로 만들어 역시 같은 폴더 안에 위치시키면 된다. 만일 로드하고자 하는 리습 파일이 lisp-unit.lisp파일 하나뿐이라면 lisp-unit.asd 파일은 다음과 같은 것으로 충분할 것이다.
(defpackage #:lisp-unit-asd
(:use :cl :asdf))
(in-package :lisp-unit-asd)
(defsystem lisp-unit
:name "lisp-unit"
:components ((:file "lisp-unit")))
아무튼, 여기서 다 설명할 수는 없지만, asdf는 현재 Common Lisp에서 시스템을 구성하는 일반적인 방법이다. 그리고 asdf-install은 Common Lisp 라이브러리를 설치하는데 가장 널리 사용되는 도구다. 둘 다 Common Lisp의 교과서들을 끝내고 실제 세상으로 나갈 때 반드시 사용하게 되는 도구라고 할 수 있다.
2008년 1월 1일 화요일
Common Lisp Testing Framework
어떤 프로그래밍 언어를 사용해서 프로그램을 하든 테스팅 프레임워크와 프로파일러는 필요하다. 커먼 리습의 테스팅 프레임워크들을 잘 정리해놓은 글이 있어 링크해본다. Common Lisp Testing Framework
lisp-unit은 사용법이 아주 간단할 뿐더러 문서화도 잘 되어 있다. 하지만 테스트를 조직화 할 수 있는 방법이 마땅치 않아서 간단한 테스트만을 필요로 할 때 적합하다고 한다. FiveAM과 Stefil은 좀 더 스케일이 크고 조직화된 테스트에 적합하다고 한다.
1. lisp-unit 설치
lisp-unit은 원래 파일 하나로 배포되었지만, 2007년 1월 11일자로 asdf-install 가능하게 바뀌었다. 설치하려면 슬라임에서 다음과 같이 한다.
(require 'asdf-install)
(asdf-install:install 'lisp-unit)
2. FiveAM과 Stefil 설치
FiveAM과 Stefil을 설치하기 전에 해야 할 것이 두 가지 있다.
1. 다음과 같이 최신의 slime을 받아서 사용하는 것이 좋다.
cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime
slime-2.0을 사용하면 컴파일이 제대로 되지 않는다.
2. slime이 위치한 디렉토리를 asdf:*central-registry*에 추가한다.
추가하지 않고 컴파일하면, FiveAM과 Stefil 둘 다 swank라는 것을 요구하는 것을 볼 수 있다. swank는 slime의 다른 이름이다. 리습구현의 스타트업 파일에(SBCL의 경우에는 홈 폴더의 .sbclrc 파일) 다음과 같이 slime이 위치한 디렉토리를 추가해주면 된다.
(push #p"/Users/chanwoo/cl-library/slime/" asdf:*central-registry*)
이제 준비가 되었으면 두 테스팅 프레임워크를 설치해보자.
1. FiveAM 설치
FiveAM은 asdf로 설치 가능하다. 다음과 같이 하면 설치 끝.
(require 'asdf-install) ;GPG체크 때문에 디버거로 떨어지면 0번을 눌러서 진행하면 된다.
(asdf:install-install 'fiveam)
2. Stefil 설치
먼저 iterate, alexandria, defclass-star를 설치해야 한다.
(require 'asdf-install)
(asdf-install:install 'iterate)
(asdf-install:install 'alexandria)
defclass-star는 다음과 같이 darcs로 내려받은 후,
darcs get http://common-lisp.net/project/defclass-star/darcs/defclass-star
폴더를 asdf:*central-registry*에 추가하면 설치 끝이다.
세 가지를 다 설치했다면, 이제 Stefil을 다음과 같이 내려받은 후,
darcs get http://common-lisp.net/project/stefil/darcs/stefil
해당 디렉토리를 asdf:*central-registry*에 추가하면 설치 끝.
설치가 끝나고 FiveAM이나 Stefil을 사용하려면 SBCL에서는 단순히,
(require 'fiveam) 또는 (require 'stefil) 로 충분하다.
SBCL외의 다른 구현을 사용한다면,
(asdf:operate 'asdf:load-op 'fiveam) 또는 (asdf:operate 'asdf:load-op 'stefil) 라고 하면 된다.
lisp-unit은 사용법이 아주 간단할 뿐더러 문서화도 잘 되어 있다. 하지만 테스트를 조직화 할 수 있는 방법이 마땅치 않아서 간단한 테스트만을 필요로 할 때 적합하다고 한다. FiveAM과 Stefil은 좀 더 스케일이 크고 조직화된 테스트에 적합하다고 한다.
1. lisp-unit 설치
lisp-unit은 원래 파일 하나로 배포되었지만, 2007년 1월 11일자로 asdf-install 가능하게 바뀌었다. 설치하려면 슬라임에서 다음과 같이 한다.
(require 'asdf-install)
(asdf-install:install 'lisp-unit)
2. FiveAM과 Stefil 설치
FiveAM과 Stefil을 설치하기 전에 해야 할 것이 두 가지 있다.
1. 다음과 같이 최신의 slime을 받아서 사용하는 것이 좋다.
cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime
slime-2.0을 사용하면 컴파일이 제대로 되지 않는다.
2. slime이 위치한 디렉토리를 asdf:*central-registry*에 추가한다.
추가하지 않고 컴파일하면, FiveAM과 Stefil 둘 다 swank라는 것을 요구하는 것을 볼 수 있다. swank는 slime의 다른 이름이다. 리습구현의 스타트업 파일에(SBCL의 경우에는 홈 폴더의 .sbclrc 파일) 다음과 같이 slime이 위치한 디렉토리를 추가해주면 된다.
(push #p"/Users/chanwoo/cl-library/slime/" asdf:*central-registry*)
이제 준비가 되었으면 두 테스팅 프레임워크를 설치해보자.
1. FiveAM 설치
FiveAM은 asdf로 설치 가능하다. 다음과 같이 하면 설치 끝.
(require 'asdf-install) ;GPG체크 때문에 디버거로 떨어지면 0번을 눌러서 진행하면 된다.
(asdf:install-install 'fiveam)
2. Stefil 설치
먼저 iterate, alexandria, defclass-star를 설치해야 한다.
(require 'asdf-install)
(asdf-install:install 'iterate)
(asdf-install:install 'alexandria)
defclass-star는 다음과 같이 darcs로 내려받은 후,
darcs get http://common-lisp.net/project/defclass-star/darcs/defclass-star
폴더를 asdf:*central-registry*에 추가하면 설치 끝이다.
세 가지를 다 설치했다면, 이제 Stefil을 다음과 같이 내려받은 후,
darcs get http://common-lisp.net/project/stefil/darcs/stefil
해당 디렉토리를 asdf:*central-registry*에 추가하면 설치 끝.
설치가 끝나고 FiveAM이나 Stefil을 사용하려면 SBCL에서는 단순히,
(require 'fiveam) 또는 (require 'stefil) 로 충분하다.
SBCL외의 다른 구현을 사용한다면,
(asdf:operate 'asdf:load-op 'fiveam) 또는 (asdf:operate 'asdf:load-op 'stefil) 라고 하면 된다.
2007년 12월 30일 일요일
Ready Lisp
Common Lisp을 처음 시작하는 사람에게는 적절한 리습 구현을 골라 설치하고, 이맥스와 슬라임을 연동하고 하는 작업이 꽤나 번거롭게 느껴질 수 있다. 하지만 맥 유저라면 아주 쉬운 길이 있다. 바로 Ready Lisp이다. 보기에도 예쁜 Aquaemacs와 리습 구현 중에서 실행 속도가 가장 빠른 편에 속하는 SBCL, 슬라임을 한꺼번에 묶어놓은 패키지다. 더구나 SBCL은 맥에서는 'experimental multi-thread'만을 지원하는데, 멀티스레드를 지원하게 만들려면, SBCL의 소스 파일을 받아서 직접 컴파일하는 수고를 들여야 한다. 하지만 Ready Lisp은 SBCL이 멀티스레드를 지원하도록 컴파일되어 배포된다. hunchentoot와 weblocks를 돌려본 결과, 멀티스레드가 지원되는 것을 볼 수 있었다.
설치는 그저 dmg 파일을 다운 받아서 더블 클릭한 후 아이콘을 어플리케이션 폴더로 끌어다 놓으면 끝. 단지 종료할 때 ctrl+x ctrl+c로 종료하는 것이 좋다. Aquaemacs는 종료 메뉴를 클릭해서는 잘 종료가 안 되기 때문이다.
그리고 Ready Lisp에는 Common Lisp Hyperspec과 SBCL의 소스 코드가 포함되어 있어서 매우 편리하다. 명령어는 다음과 같다.
ctrl+h f
리습 코드에서 커서가 심볼 위에 있을 때 누르면 해당 심볼에 해당하는 Hyperspec 페이지를 보여준다.
meta(alt)+. 정의
해당 정의의 SBCL 구현 코드를 보여준다.
ctrl+h i
포함되어 있는 여러 가지 문서의 인덱스를 보여준다.
설치는 그저 dmg 파일을 다운 받아서 더블 클릭한 후 아이콘을 어플리케이션 폴더로 끌어다 놓으면 끝. 단지 종료할 때 ctrl+x ctrl+c로 종료하는 것이 좋다. Aquaemacs는 종료 메뉴를 클릭해서는 잘 종료가 안 되기 때문이다.
그리고 Ready Lisp에는 Common Lisp Hyperspec과 SBCL의 소스 코드가 포함되어 있어서 매우 편리하다. 명령어는 다음과 같다.
ctrl+h f
리습 코드에서 커서가 심볼 위에 있을 때 누르면 해당 심볼에 해당하는 Hyperspec 페이지를 보여준다.
meta(alt)+. 정의
해당 정의의 SBCL 구현 코드를 보여준다.
ctrl+h i
포함되어 있는 여러 가지 문서의 인덱스를 보여준다.
Mysql 설치 및 실행
환경: 인텔 맥, 레오파드
다운 받는 곳
http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg
package format을 받은 후 더블 클릭하여 설치하면 /usr/local/mysql-VERSION 에 설치가 되고 symbolic link로 /usr/local/mysql 에도 폴더가 생긴다. 처음에는 똑같은 파일이 두 곳에 있는 것을 보고 이미 기존에 설치되어 있었는데 또 설치한 건가 하는 생각을 했다.
mysql을 start up 시키려면 다음과 같이 한다.
shell> cd /usr/local/mysql
shell> sudo ./bin/mysqld_safe
잠시 실행을 중단하려면
control + z
실행을 재개하려면
shell> bg
shell에서 로그아웃하려면
control + d 또는 exit를 친다
맥에서는 새 버전의 mysql을 설치하면 기존 설치된 mysql이 업그레이드 되는 것이 아니라 기존 버전은 그대로 둔 채 새로 설치를 해버린다고 한다. 따라서 새로운 버전을 설치했을 경우 기존 버전의 파일들을 지워야 한다. 또한 다음 파일도 지워야 한다고 한다.
/Library/Receipts/mysql-VERSION.pkg
다운 받는 곳
http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg
package format을 받은 후 더블 클릭하여 설치하면 /usr/local/mysql-VERSION 에 설치가 되고 symbolic link로 /usr/local/mysql 에도 폴더가 생긴다. 처음에는 똑같은 파일이 두 곳에 있는 것을 보고 이미 기존에 설치되어 있었는데 또 설치한 건가 하는 생각을 했다.
mysql을 start up 시키려면 다음과 같이 한다.
shell> cd /usr/local/mysql
shell> sudo ./bin/mysqld_safe
잠시 실행을 중단하려면
control + z
실행을 재개하려면
shell> bg
shell에서 로그아웃하려면
control + d 또는 exit를 친다
맥에서는 새 버전의 mysql을 설치하면 기존 설치된 mysql이 업그레이드 되는 것이 아니라 기존 버전은 그대로 둔 채 새로 설치를 해버린다고 한다. 따라서 새로운 버전을 설치했을 경우 기존 버전의 파일들을 지워야 한다. 또한 다음 파일도 지워야 한다고 한다.
/Library/Receipts/mysql-VERSION.pkg
2007년 12월 18일 화요일
Installing Weblocks 2
환경: Intel Macbook, Ubuntu
결국 Weblocks 하나를 위해 우분투를 깔게 되었다. 맥북에 우분투를 설치하는 것은 다음을 참조.
https://help.ubuntu.com/community/MacBook_Santa_Rosa
emacs 설치는 다음과 같이 하면 최신 버전의 emacs가 설치된다.
sudo apt-get install emacs-snapshot
SLIME 과 SBCL 설치는 맥에서 했던 것과 똑같이 하면 되고(웹에서 파일 내려받는 것은 wget 웹주소, tar.gz 파일 압축 푸는 것은 tar zxvf 파일이름), Weblocks 설치 과정도 Installing Weblocks에 적었던 것과 똑같이 하면 된다.
darcs 설치는 sudo apt-get install darcs
라이브러리들의 설치를 시도하면 libssl.so 파일이 없다면서 에러가 나는 것을 볼 수 있다. 찾아보니 cl+ssl 라이브러리가 /usr/lib 디렉토리의 libssl.so 파일을 필요로 하는데, 시스템마다 libssl 버전에 따라 이름이 다를 수 있다고 한다. 예를 들면 libssl3.so.0d와 같은 식으로 되어 있을 수 있는데 cl+ssl은 무조건 libssl.so만 찾아서 문제가 생긴다는 것이다. 따라서 파일 이름의 symlink를 만들면 문제가 해결된다고 하는데 내 경우에는 그냥 libssl3.so.0d 파일을 하나 복사해서 libssl.so라고 이름을 바꾼 다음 /usr/lib 디렉토리에 복사해 넣었더니 에러 메시지가 출력되지 않는다.
그리고 cffi library가 libtest라는 것을 요구하면서 디버거로 떨어지는 일이 생기는데, 구글 그룹에 질문했지만 원인을 찾지 못했다. 일단 무조건 continue를 눌러 진행해도 weblocks 실행에 문제는 없어보인다.
후.. 드디어 Weblocks가 돌아간다.
결국 Weblocks 하나를 위해 우분투를 깔게 되었다. 맥북에 우분투를 설치하는 것은 다음을 참조.
https://help.ubuntu.com/community/MacBook_Santa_Rosa
emacs 설치는 다음과 같이 하면 최신 버전의 emacs가 설치된다.
sudo apt-get install emacs-snapshot
SLIME 과 SBCL 설치는 맥에서 했던 것과 똑같이 하면 되고(웹에서 파일 내려받는 것은 wget 웹주소, tar.gz 파일 압축 푸는 것은 tar zxvf 파일이름), Weblocks 설치 과정도 Installing Weblocks에 적었던 것과 똑같이 하면 된다.
darcs 설치는 sudo apt-get install darcs
라이브러리들의 설치를 시도하면 libssl.so 파일이 없다면서 에러가 나는 것을 볼 수 있다. 찾아보니 cl+ssl 라이브러리가 /usr/lib 디렉토리의 libssl.so 파일을 필요로 하는데, 시스템마다 libssl 버전에 따라 이름이 다를 수 있다고 한다. 예를 들면 libssl3.so.0d와 같은 식으로 되어 있을 수 있는데 cl+ssl은 무조건 libssl.so만 찾아서 문제가 생긴다는 것이다. 따라서 파일 이름의 symlink를 만들면 문제가 해결된다고 하는데 내 경우에는 그냥 libssl3.so.0d 파일을 하나 복사해서 libssl.so라고 이름을 바꾼 다음 /usr/lib 디렉토리에 복사해 넣었더니 에러 메시지가 출력되지 않는다.
그리고 cffi library가 libtest라는 것을 요구하면서 디버거로 떨어지는 일이 생기는데, 구글 그룹에 질문했지만 원인을 찾지 못했다. 일단 무조건 continue를 눌러 진행해도 weblocks 실행에 문제는 없어보인다.
후.. 드디어 Weblocks가 돌아간다.
Installing Weblocks
환경: Intel Macbook, Leopard
Weblocks는 continuation, widget 기반의 Common Lisp 웹 프레임워크다. 매뉴얼을 읽어보면 아이디어나 구조가 꽤나 깔끔해 보이기 때문에 흥미가 간다.
http://trac.common-lisp.net/cl-weblocks/wiki/ObtainingAndInstalling
위 사이트를 참조해서 설치했다. 먼저 소스코드를 내려받기 위해서 darcs를 깔아야 한다. 맥용 설치 파일은 여기에 있다. 내려받아서 압축 풀고 더블 클릭해서 설치하면 된다.
그런 다음 터미널에서
darcs get http://common-lisp.net/project/cl-weblocks/darcs/cl-weblocks
를 입력하면 소스 코드 트리를 내려받는다.
이제 Weblocks가 필요로 하는 다른 파일들을 다운받아야 하는데 asdf (rubygem같이 리습 라이브러리들을 온라인으로 쉽게 내려받아 설치하게 해주는 도구. SBCL에는 기본으로 깔려 있다)를 이용해서 받으면 된다. SLIME(또는 REPL)에서 다음과 같이 입력한다.
(require 'asdf-install)
(loop for i in '(:closer-mop :metatilities :hunchentoot :cl-who :cl-ppcre :cl-json :puri :rt :tinaa :md5 :cl-fad :fare-matcher :cl-cont :cl-prevalence) do (asdf-install:install i))
그러면 하나 하나 설치할 때마다 시스템에 설치할 것인지 로컬에 설치할 것인지 물어보는데, 내 경우에는 2번을 선택해서 로컬에 설치하였다. GnuPG가 깔려 있어서 디버거로 떨어지면 무조건 0번을 선택해서 검사를 패스한다. 그리고 설치하다가 권한 문제로 설치가 안 되는 경우는 su로 권한을 얻으려고 하면 맥에서는 기본적으로 su가 막혀있기 때문에('su 사용자이름'은 먹는다. 이렇게 해도 될 것 같긴 한데..) 아예 emacs를 실행시킬 때 sudo emacs로 실행을 해서 SLIME을 띄우면 설치에 문제가 없는 듯 하다.
그리고 Lisp implementation startup file에 다음 코드를 추가하라고 한다.
(push #p"/path/to/cl-weblocks/" asdf:*central-registry*)
나는 SBCL을 사용하기 때문에 .sbclrc 파일을 홈 폴더에 만들어서 다음과 같이 추가하였다 (물론 "/path/to/"자리에는 자신의 cl-weblocks 폴더가 있는 경로를 적어야 한다). SLIME이 실행될 때 .sbclrc 파일은 자동으로 로드된다(사실 그냥 리습 파일을 하나 만들어서 필요할 때마다 로드해도 된다; .sbclrc 파일을 만들어서 좋은 점은 자동으로 로드된다는 것 뿐인 것 같다;).
(require 'asdf)
(push #p"/Users/chanwoo/work/cl-weblocks/" asdf:*central-registry*)
그리고 SLIME에서 다음과 같이 입력하면,
(asdf:operate 'asdf:load-op 'weblocks)
드디어 Weblocks를 사용할 수 있다!
그럼 사이트에 나온 Hello 예제를 해보자. SLIME에서 (weblocks:start-weblocks) 를 입력하고 브라우저 주소 창에 http://localhost:8080/ 을 치면, 초기 화면이 뜨는 것을 볼 수 있다.
다음 코드를 입력한 후 브라우저를 새로 고침 하면 Hello가 보인다.
하지만 weblocks를 start 시킨 이후에 CL-USER> 프롬프트가 금방 나타나지 않고, 엔터를 몇 번 치면 나타나지만 입력을 제대로 먹질 않고 다음과 같은 메시지만 뜬다.
pipelined request... (swank:listener-eval ~~~
도대체 왜 이런지를 알 수가 없어서 구글 Weblocks 그룹에 질문했는데, SBCL이 맥에서는 스레드를 지원하지 않기 때문이란다; 맥에서 스레드를 지원하는 구현을 찾아 새로 까는 수 밖에 없다; 그래서 OpenMCL(Clozure CL - CCL)을 깔아봤지만 CCL은 asdf-install과 관련된 문제가 너무 많이 발생한다. SBCL에서는 멀쩡히 깔리던 라이브러리들이 CCL에서는 온갖 에러를 발생시킨다; 후.. 결국 개발에 제일 편한 것은 리눅스였던 것이다. 결국 맥에 부트캠프로 우분투를 깔게 되었다.
Weblocks는 continuation, widget 기반의 Common Lisp 웹 프레임워크다. 매뉴얼을 읽어보면 아이디어나 구조가 꽤나 깔끔해 보이기 때문에 흥미가 간다.
http://trac.common-lisp.net/cl-weblocks/wiki/ObtainingAndInstalling
위 사이트를 참조해서 설치했다. 먼저 소스코드를 내려받기 위해서 darcs를 깔아야 한다. 맥용 설치 파일은 여기에 있다. 내려받아서 압축 풀고 더블 클릭해서 설치하면 된다.
그런 다음 터미널에서
darcs get http://common-lisp.net/project/cl-weblocks/darcs/cl-weblocks
를 입력하면 소스 코드 트리를 내려받는다.
이제 Weblocks가 필요로 하는 다른 파일들을 다운받아야 하는데 asdf (rubygem같이 리습 라이브러리들을 온라인으로 쉽게 내려받아 설치하게 해주는 도구. SBCL에는 기본으로 깔려 있다)를 이용해서 받으면 된다. SLIME(또는 REPL)에서 다음과 같이 입력한다.
(require 'asdf-install)
(loop for i in '(:closer-mop :metatilities :hunchentoot :cl-who :cl-ppcre :cl-json :puri :rt :tinaa :md5 :cl-fad :fare-matcher :cl-cont :cl-prevalence) do (asdf-install:install i))
그러면 하나 하나 설치할 때마다 시스템에 설치할 것인지 로컬에 설치할 것인지 물어보는데, 내 경우에는 2번을 선택해서 로컬에 설치하였다. GnuPG가 깔려 있어서 디버거로 떨어지면 무조건 0번을 선택해서 검사를 패스한다. 그리고 설치하다가 권한 문제로 설치가 안 되는 경우는 su로 권한을 얻으려고 하면 맥에서는 기본적으로 su가 막혀있기 때문에('su 사용자이름'은 먹는다. 이렇게 해도 될 것 같긴 한데..) 아예 emacs를 실행시킬 때 sudo emacs로 실행을 해서 SLIME을 띄우면 설치에 문제가 없는 듯 하다.
그리고 Lisp implementation startup file에 다음 코드를 추가하라고 한다.
(push #p"/path/to/cl-weblocks/" asdf:*central-registry*)
나는 SBCL을 사용하기 때문에 .sbclrc 파일을 홈 폴더에 만들어서 다음과 같이 추가하였다 (물론 "/path/to/"자리에는 자신의 cl-weblocks 폴더가 있는 경로를 적어야 한다). SLIME이 실행될 때 .sbclrc 파일은 자동으로 로드된다(사실 그냥 리습 파일을 하나 만들어서 필요할 때마다 로드해도 된다; .sbclrc 파일을 만들어서 좋은 점은 자동으로 로드된다는 것 뿐인 것 같다;).
(require 'asdf)
(push #p"/Users/chanwoo/work/cl-weblocks/" asdf:*central-registry*)
그리고 SLIME에서 다음과 같이 입력하면,
(asdf:operate 'asdf:load-op 'weblocks)
드디어 Weblocks를 사용할 수 있다!
그럼 사이트에 나온 Hello 예제를 해보자. SLIME에서 (weblocks:start-weblocks) 를 입력하고 브라우저 주소 창에 http://localhost:8080/ 을 치면, 초기 화면이 뜨는 것을 볼 수 있다.
다음 코드를 입력한 후 브라우저를 새로 고침 하면 Hello가 보인다.
(weblocks:defwebapp 'our-application)
(defun init-user-session (comp)
(setf (weblocks:composite-widgets comp)
(list "Hello!")))
(weblocks:reset-sessions)
하지만 weblocks를 start 시킨 이후에 CL-USER> 프롬프트가 금방 나타나지 않고, 엔터를 몇 번 치면 나타나지만 입력을 제대로 먹질 않고 다음과 같은 메시지만 뜬다.
pipelined request... (swank:listener-eval ~~~
도대체 왜 이런지를 알 수가 없어서 구글 Weblocks 그룹에 질문했는데, SBCL이 맥에서는 스레드를 지원하지 않기 때문이란다; 맥에서 스레드를 지원하는 구현을 찾아 새로 까는 수 밖에 없다; 그래서 OpenMCL(Clozure CL - CCL)을 깔아봤지만 CCL은 asdf-install과 관련된 문제가 너무 많이 발생한다. SBCL에서는 멀쩡히 깔리던 라이브러리들이 CCL에서는 온갖 에러를 발생시킨다; 후.. 결국 개발에 제일 편한 것은 리눅스였던 것이다. 결국 맥에 부트캠프로 우분투를 깔게 되었다.
2007년 12월 14일 금요일
Installing Common Lisp - OpenMCL (Clozure CL)
후.. 맥에서는 SBCL이 멀티 스레드를 지원하지 않는다고 해서 OpenMCL을 깔게 되었다.
환경: Intel Macbook, Leopard
일단 OpenMCL 홈페이지는 여기: http://trac.clozure.com/openmcl
다음 ftp 주소 - ftp://clozure.com/pub/testing/ - 로 가면 파일들이 주욱~ 보인다. 설치할 수 있는 것은 다음 두 가지다. SLIME에서 프로그래밍하려면 2번만 깔면 되지 않나 싶다.
1. ClozureCL2007-12-03.dmg
이건 SLIME에서 불러올리는 리습 구현이 아니라 응용 프로그램에서 단독으로 REPL을 실행하게 해주는 파일이다. 다운받아서 더블 클릭한 다음, 마운트 되면 생기는 Clozure CL 아이콘을 응용 프로그램 폴더에 끌어다 놓으면 설치가 된다.
2. openmcl-darwinx8664-snapshot-070722.tar.gz
다운받아 압축을 풀면 ccl 폴더가 생기는데 아무데나 위치해도 상관 없다. 단, 다음과 같은 설정을 해주면 된다.
다운로드 받은 소스 파일은 2007년 7월의 스냅샷으로, 그 이후에도 많은 변경이 있기 때문에 업데이트와 리빌드가 필요하다. 방법은 다음 링크를 참조: http://trac.clozure.com/openmcl/wiki/UpdatingFromSource
(2008년 1월 16일 시점으로 리빌드 후 정상적으로 슬라임이 시동되지 않는 것 같다. 그래서 업데이트 하지 않은 스냅샷을 그대로 사용중이다.)
ccl/scripts/ 폴더 안에 openmcl64 파일이 있는데 이 파일을 열면CCL_DEFAULT_DIRECTORY=/usr/local/src/ccl 과 같이 되어 있는 것을 볼 수 있다. 이 부분을 CCL_DEFAULT_DIRECTORY= "ccl 폴더가 있는 위치" 로 변경하고 저장한다.내 경우에는 귀찮아서 그냥 ccl 폴더를 /usr/local/src/ccl 에 위치시켰다.
(인스톨 방법은 다음 링크를 참조하였다: http://openmcl.clozure.com/Doc/index.html)
그리고 홈폴더(~)의 .emacs 파일(없으면 새로 만들면 된다)에 다음과 같이 추가한다.
(add-to-list 'load-path "SLIME이 있는 경로")
(setq inferior-lisp-program "ccl폴더가 위치한 경로/scripts/openmcl64")
(require 'slime)
(slime-setup)
내 경우에는 다음과 같다.
(add-to-list 'load-path "/usr/local/bin/slime-2.1")
(setq inferior-lisp-program "/usr/local/src/ccl/scripts/openmcl64")
(require 'slime)
(slime-setup)
그리고 이맥스를 실행시키고 meta+x slime 을 치면 openmcl REPL이 등장하는 것을 볼 수 있다(meta 키는 터미널에서는 alt/option 키이다. 먹히지 않으면 메뉴의 "터미널 -> 환경설정 -> 키보드 -> 'option을 메타키로 사용'에 체크").
그리고 openMCL은 asdf(리습 라이브러리를 손쉽게 설치하게 도와주는 도구)를 포함하고 있지만, asdf-install을 사용하기 위해서 약간의 설정이 필요하다. 홈폴더에 openmcl-init.lisp 파일을 만들어서 다음 코드를 추가한다(openmcl-init.lisp 파일은 SLIME이 실행될 때 자동으로 로드되게 된다).
환경: Intel Macbook, Leopard
일단 OpenMCL 홈페이지는 여기: http://trac.clozure.com/openmcl
다음 ftp 주소 - ftp://clozure.com/pub/testing/ - 로 가면 파일들이 주욱~ 보인다. 설치할 수 있는 것은 다음 두 가지다. SLIME에서 프로그래밍하려면 2번만 깔면 되지 않나 싶다.
1. ClozureCL2007-12-03.dmg
이건 SLIME에서 불러올리는 리습 구현이 아니라 응용 프로그램에서 단독으로 REPL을 실행하게 해주는 파일이다. 다운받아서 더블 클릭한 다음, 마운트 되면 생기는 Clozure CL 아이콘을 응용 프로그램 폴더에 끌어다 놓으면 설치가 된다.
2. openmcl-darwinx8664-snapshot-070722.tar.gz
다운받아 압축을 풀면 ccl 폴더가 생기는데 아무데나 위치해도 상관 없다. 단, 다음과 같은 설정을 해주면 된다.
다운로드 받은 소스 파일은 2007년 7월의 스냅샷으로, 그 이후에도 많은 변경이 있기 때문에 업데이트와 리빌드가 필요하다. 방법은 다음 링크를 참조: http://trac.clozure.com/openmcl/wiki/UpdatingFromSource
(2008년 1월 16일 시점으로 리빌드 후 정상적으로 슬라임이 시동되지 않는 것 같다. 그래서 업데이트 하지 않은 스냅샷을 그대로 사용중이다.)
ccl/scripts/ 폴더 안에 openmcl64 파일이 있는데 이 파일을 열면CCL_DEFAULT_DIRECTORY=/usr/local/src/ccl 과 같이 되어 있는 것을 볼 수 있다. 이 부분을 CCL_DEFAULT_DIRECTORY= "ccl 폴더가 있는 위치" 로 변경하고 저장한다.내 경우에는 귀찮아서 그냥 ccl 폴더를 /usr/local/src/ccl 에 위치시켰다.
(인스톨 방법은 다음 링크를 참조하였다: http://openmcl.clozure.com/Doc/index.html)
그리고 홈폴더(~)의 .emacs 파일(없으면 새로 만들면 된다)에 다음과 같이 추가한다.
(add-to-list 'load-path "SLIME이 있는 경로")
(setq inferior-lisp-program "ccl폴더가 위치한 경로/scripts/openmcl64")
(require 'slime)
(slime-setup)
내 경우에는 다음과 같다.
(add-to-list 'load-path "/usr/local/bin/slime-2.1")
(setq inferior-lisp-program "/usr/local/src/ccl/scripts/openmcl64")
(require 'slime)
(slime-setup)
그리고 이맥스를 실행시키고 meta+x slime 을 치면 openmcl REPL이 등장하는 것을 볼 수 있다(meta 키는 터미널에서는 alt/option 키이다. 먹히지 않으면 메뉴의 "터미널 -> 환경설정 -> 키보드 -> 'option을 메타키로 사용'에 체크").
그리고 openMCL은 asdf(리습 라이브러리를 손쉽게 설치하게 도와주는 도구)를 포함하고 있지만, asdf-install을 사용하기 위해서 약간의 설정이 필요하다. 홈폴더에 openmcl-init.lisp 파일을 만들어서 다음 코드를 추가한다(openmcl-init.lisp 파일은 SLIME이 실행될 때 자동으로 로드되게 된다).
(require 'asdf)
(pushnew "ccl:tools;asdf-install;"
asdf:*central-registry* :test #'string-equal)
(asdf:operate 'asdf:load-op 'asdf-install)
2007년 12월 12일 수요일
Common Lisp Web Development
Common Lisp으로 웹 프로그래밍을 해보려고 웹 개발 프레임워크를 찾아보았다.
눈에 띄는 것은 다음 세 가지 정도다.
1. UnCommon Web
제일 이름이 눈에 많이 띄는 웹 프레임워크. TBNL이라는 것을 전신으로 만들어진 듯. continuation(간단히 말하면, computation의 특정 순간을 저장하는 일급 객체 - 자료구조에 저장되거나 함수의 인자나 리턴값으로 사용될 수 있는 - 라고 할 수 있을 듯. Scheme에서 continuation을 일급 객체로 지원하고 Common Lisp에서는 클로저와 매크로를 사용해서 continuation을 흉내낼 수 있다. Ruby에서도 지원하는 듯. 아무 상태나 저장하는 게 가능하기 때문에 session이나 cookie보다 강력한 상태 저장 수단으로서 웹 개발에서 쓰이는 듯하다. 확실친 않지만 웹 어플리케이션을 그저 함수의 연속으로 바라볼 수 있게 만드는 강력한 추상화 수단일수도..)을 기반으로 웹 어플리케이션의 control flow를 제어하는 듯. 문서도 어느 정도 있는 듯 하지만, out of date된 것이 좀 있는 것 같고, 결정적으로 간단 설치 버전이 뭔가 잘 작동하지 않는다. 이게 안 되면 일일이 다 설치해 주어야 하는데, 후.. 추후에 다시 시도해봐야 할 듯하다.
2. WebBlocks
최근에 만들어지고 있는 프레임워크인 듯. 역시 continuation을 기반으로 control flow를 제어한다. 아무래도 새로 만들어지고 있는 프레임워크인만큼 문서가 많지는 않은 듯 하다. 하지만 구글에 토론 그룹이 있고, 문서가 부족하면 코드를 보자라는 생각으로 코드를 들여다보고 있다. 꽤나 흥미로워 보이는 프로젝트다.
2008.3.19 시점: Weblocks를 주로 보고 있다. 아이디어가 매우 훌륭한 것 같고, 여러 가지를 배울 수 있는 프레임워크라고 생각한다. 커뮤니티도 활발히 살아있는 편이다.
3. Hunchentoot
프레임워크라기 보다는 가벼운 웹 서버 겸 개발 도구인 것 같다. 일단 설치에 성공했기 때문에 적어보려 한다. 리습 구현으로 SBCL을 사용하면 asdf(인터넷으로 Common Lisp 라이브러리들을 받아서 설치해 주는 도구)가 기본적으로 깔려 있기 때문에 slime에서 그저 다음과 같이 치면 된다. (설치 매뉴얼을 살펴보면 GnuPG를 먼저 깔라고 하는데, asdf를 사용해서 라이브러리를 인스톨할 때 악성 코드인지를 검사하는 도구인 것 같다. 근데 깔면 설치시에 일일이 디버거로 떨어져서 검사할 거냐고 물어보기 때문에 귀찮은 것 같다. 그냥 안 까는 게 나은 듯; 만일 깔아서 설치 도중 자꾸 디버거로 떨어진다면 0을 눌러서 GnuPG 검사를 건너뛰면 된다. 계속 눌러줘야 된다는 게 짜증나지만;)
(require 'asdf-install)
(asdf-install:install 'hunchentoot)
그럼 시스템에 깔 것인지 개인 사용자 폴더에 깔 것인지 물어보는데 시스템에 깐다고 하면 뭔가 꼬여서 그냥 2번을 선택했다.
설치가 완료되었다. LispCast(Hunchentoot를 사용해서 Reddit이라는 웹 사이트의 간단 버전을 만드는 동영상들이 올라와 있다)에서 받은 첫 번째 동영상대로 따라 해 보니 Server가 시작된다.
하지만 Server가 시작되고나서 슬라임의 프롬프트가 바로 돌아오지 않고 명령을 먹어버리는 현상이 발생하는데 이는 SBCL이 맥에서 스레드를 지원하지 않기 때문이란다. 정확하게 말하자면 스레드를 지원하지 않는 것이 아니라 experimental 스레드를 지원한다고 한다. 그래서 스레드를 enable시키는 방법을 찾아봤는데, 그 방법이란 게 SBCL 인스톨 문서의 2.2 부분에 간단히 적혀 있는 것이다. 그 방법대로 해 보았지만 역시 제대로 동작하는 것 같지가 않다. 그리고 ReadyLisp이라고 해서 Emacs와 SLIME, SBCL을 하나로 묶고 인텔 맥에서 멀티 스레드를 지원하도록 해서 쉽게 설치할 수 있게 배포하는 사이트(http://www.newartisans.com/software/readylisp.html)가 있는데, 그냥 창을 닫거나 메뉴에서 종료를 선택하면 제대로 종료되지가 않고 ctrl+x ctrl+c 로 종료해야 정상적으로 종료되는 것 같다. 멀티 스레드가 되는지는 아직 시험해 보지 못했다.
눈에 띄는 것은 다음 세 가지 정도다.
1. UnCommon Web
제일 이름이 눈에 많이 띄는 웹 프레임워크. TBNL이라는 것을 전신으로 만들어진 듯. continuation(간단히 말하면, computation의 특정 순간을 저장하는 일급 객체 - 자료구조에 저장되거나 함수의 인자나 리턴값으로 사용될 수 있는 - 라고 할 수 있을 듯. Scheme에서 continuation을 일급 객체로 지원하고 Common Lisp에서는 클로저와 매크로를 사용해서 continuation을 흉내낼 수 있다. Ruby에서도 지원하는 듯. 아무 상태나 저장하는 게 가능하기 때문에 session이나 cookie보다 강력한 상태 저장 수단으로서 웹 개발에서 쓰이는 듯하다. 확실친 않지만 웹 어플리케이션을 그저 함수의 연속으로 바라볼 수 있게 만드는 강력한 추상화 수단일수도..)을 기반으로 웹 어플리케이션의 control flow를 제어하는 듯. 문서도 어느 정도 있는 듯 하지만, out of date된 것이 좀 있는 것 같고, 결정적으로 간단 설치 버전이 뭔가 잘 작동하지 않는다. 이게 안 되면 일일이 다 설치해 주어야 하는데, 후.. 추후에 다시 시도해봐야 할 듯하다.
2. WebBlocks
최근에 만들어지고 있는 프레임워크인 듯. 역시 continuation을 기반으로 control flow를 제어한다. 아무래도 새로 만들어지고 있는 프레임워크인만큼 문서가 많지는 않은 듯 하다. 하지만 구글에 토론 그룹이 있고, 문서가 부족하면 코드를 보자라는 생각으로 코드를 들여다보고 있다. 꽤나 흥미로워 보이는 프로젝트다.
2008.3.19 시점: Weblocks를 주로 보고 있다. 아이디어가 매우 훌륭한 것 같고, 여러 가지를 배울 수 있는 프레임워크라고 생각한다. 커뮤니티도 활발히 살아있는 편이다.
3. Hunchentoot
프레임워크라기 보다는 가벼운 웹 서버 겸 개발 도구인 것 같다. 일단 설치에 성공했기 때문에 적어보려 한다. 리습 구현으로 SBCL을 사용하면 asdf(인터넷으로 Common Lisp 라이브러리들을 받아서 설치해 주는 도구)가 기본적으로 깔려 있기 때문에 slime에서 그저 다음과 같이 치면 된다. (설치 매뉴얼을 살펴보면 GnuPG를 먼저 깔라고 하는데, asdf를 사용해서 라이브러리를 인스톨할 때 악성 코드인지를 검사하는 도구인 것 같다. 근데 깔면 설치시에 일일이 디버거로 떨어져서 검사할 거냐고 물어보기 때문에 귀찮은 것 같다. 그냥 안 까는 게 나은 듯; 만일 깔아서 설치 도중 자꾸 디버거로 떨어진다면 0을 눌러서 GnuPG 검사를 건너뛰면 된다. 계속 눌러줘야 된다는 게 짜증나지만;)
(require 'asdf-install)
(asdf-install:install 'hunchentoot)
그럼 시스템에 깔 것인지 개인 사용자 폴더에 깔 것인지 물어보는데 시스템에 깐다고 하면 뭔가 꼬여서 그냥 2번을 선택했다.
설치가 완료되었다. LispCast(Hunchentoot를 사용해서 Reddit이라는 웹 사이트의 간단 버전을 만드는 동영상들이 올라와 있다)에서 받은 첫 번째 동영상대로 따라 해 보니 Server가 시작된다.
하지만 Server가 시작되고나서 슬라임의 프롬프트가 바로 돌아오지 않고 명령을 먹어버리는 현상이 발생하는데 이는 SBCL이 맥에서 스레드를 지원하지 않기 때문이란다. 정확하게 말하자면 스레드를 지원하지 않는 것이 아니라 experimental 스레드를 지원한다고 한다. 그래서 스레드를 enable시키는 방법을 찾아봤는데, 그 방법이란 게 SBCL 인스톨 문서의 2.2 부분에 간단히 적혀 있는 것이다. 그 방법대로 해 보았지만 역시 제대로 동작하는 것 같지가 않다. 그리고 ReadyLisp이라고 해서 Emacs와 SLIME, SBCL을 하나로 묶고 인텔 맥에서 멀티 스레드를 지원하도록 해서 쉽게 설치할 수 있게 배포하는 사이트(http://www.newartisans.com/software/readylisp.html)가 있는데, 그냥 창을 닫거나 메뉴에서 종료를 선택하면 제대로 종료되지가 않고 ctrl+x ctrl+c 로 종료해야 정상적으로 종료되는 것 같다. 멀티 스레드가 되는지는 아직 시험해 보지 못했다.
Emacs에서 Rails 코딩하기
환경: 맥북, 레오파드
레오파드에는 Emacs가 /usr/share/emacs에 기본적으로 깔려있다.
루비와 레일즈 관련 파일들을 위치시켜야 하는 emacs 폴더:
~/emacs.d/ 또는 /usr/share/emacs/site-lisp
둘 중 어느 곳에 위치시키든, 또는 전혀 다른 곳에 위치시키든 상관 없는 것 같다. 뒤에 작성할 .emacs 파일에 파일들이 위치한 경로를 적어주면 된다.
위에서 정한 경로 내에 넣어야 하는 파일:
1. emacs-rails 파일들
http://rubyforge.org/projects/emacs-rails
다음 명령으로도 다운받을 수 있다.
svn co svn://rubyforge.org/var/svn/emacs-rails/trunk emacs-rails
2. snippet.el 파일
http://www.kazmier.com/computer/snippet.el
find-recursive.el 파일
http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt 에서 find-recursive.txt 파일을 받아서 확장자를 el로 변경
inf-ruby.el 파일
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/inf-ruby.el?view=co
그런데 이 파일은 '3. ruby 관련 파일'에서 다운 받으면 그 안에 들어있기 때문에 여기서 다운받을 필요는 없을 것 같다.
3. ruby 관련 파일
위의 파일들만 받으면 ruby-mode와 관련해서 에러가 나기 때문에 ruby 관련 el 파일들도 받아야 하는 것 같다.
http://svn.ruby-lang.org/repos/ruby/trunk/misc/ 이 곳에서 다운 받거나 다음 명령으로도 다운받을 수 있다.
svn export http://svn.ruby-lang.org/repos/ruby/trunk/misc ruby
위와 같은 파일들을 다운 받았으면 rails를 로드하는 .emacs 파일을 작성하여 홈 폴더(~)에 저장해야 한다. site-lisp 디렉토리나 루트(/)에 놓아서는 emacs에 의해 로드되지 않는 것 같았다. .emacs파일의 내용은 다음과 같다.
(setq load-path (cons "파일들이 위치한 경로명" load-path))
(require 'rails)
또는 다음과 같이 작성해도 된다.
(add-to-list 'load-path "파일들이 위치한 경로명")
(require 'rails)
하지만 계속해서 나는 다음과 같은 에러.
Symbol's value as variable is void: dirname
온갖 방법을 다 동원해 봤지만 원인을 알 수가 없었다. 에러에도 불구하고 emacs에서 Meta+X - ruby-mode를 쳐서 ruby-mode로의 전환은 가능했다. 하지만 emacs 시작시에 나는 저 에러는 그냥 넘어가기엔 너무 찜찜하다.
계속해서 실패하다가, 드디어 원인을 알아냈다. snippet.el 파일과 find-recursive.el 파일을 해당 링크로 가서 내용을 복사한 다음 emacs에 붙여넣어 두 파일을 만들었었는데, 붙여넣는 과정에서 잘못이 생긴 듯 싶다. 두 파일을 다시 '링크를 다른 이름으로 저장'하는 식으로 다운받아서 해 보니 모든 것이 순조롭게 돌아간다.
그리고 http://sodonnell.wordpress.com/the-emacs-newbie-guide-for-rails/ 가 가장 설명이 잘 되어 있는 것 같다. 다운 받아야 하는 각 부분이 어떤 역할을 하는지를 잘 설명해 주고 있다. 이 사이트에서는 ruby-mode와 ruby-electric, snippet, find-recursive를 명시적으로 require 하는 식으로 .emacs 파일을 작성했다. 하지만 다른 사이트에서는 .emacs의 내용이 로드할 디렉토리를 지정한 다음 (require 'rails)만 적어주면 된다고 하는 것 같다. 후자처럼 해도 def를 치면 end가 자동으로 생기는 것과 같은 ruby-electric의 기능도 제대로 동작하는 것 같고.. 차이를 잘 모르겠다.
그리고 이 사이트에서는 ECB(emacs code browser)에 대해서도 얘기하고 있는데, ECB를 사용하면 Emacs에서 파일을 열 때 폴더구조와 파일명이 보이기 때문에 편하다. 그런데 이 사이트가 ECB 명령어를 좀 이상하게 적어놓고 있어서 한참 삽질을 하게 만든다; 삽질끝에 알아낸 명령어는 다음과 같다.
ECB 활성화: meta+x ecb-activate
ECB 비활성화: meta+x ecb-deactivate
Jump to the directory window: ctrl+c .gd
Jump to the history window: ctrl+c .gh
Jump to the last window you were in: ctrl+c .gl
Jump to the first editor window ctrl+c .g1
그리고 테스트로 rhtml 파일을 생성해서 편집해 보았는데 html 태그의 indentation이 전혀 제대로 되지 않는다. 어쩔 수 없이 emacs에 원래 있는 html-mode로 전환해서 편집해야 한다.
핫 그런데 방금 rails 프로젝트의 view 디렉토리 내에서 rthml 파일을 생성하니 HTML view RoR이라고 모드가 제대로 뜬다.
References
Emacs for Rails << Software bits and pieces
http://sodonnell.wordpress.com/the-emacs-newbie-guide-for-rails/
rubyforge
http://rubyforge.org/projects/emacs-rails
rails on emacs
http://dima-exe.ru/rails-on-emacs
ruby: installing emacs extensions
http://www.rubygarden.org/Ruby/page/show/InstallingEmacsExtensions
How to use emacs with rails
http://wiki.rubyonrails.org/rails/pages/HowToUseEmacsWithRails
emacs에서 rails를 다루자
http://cafe.naver.com/amagramer.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=488
나의 .emacs 코드
레오파드에는 Emacs가 /usr/share/emacs에 기본적으로 깔려있다.
루비와 레일즈 관련 파일들을 위치시켜야 하는 emacs 폴더:
~/emacs.d/ 또는 /usr/share/emacs/site-lisp
둘 중 어느 곳에 위치시키든, 또는 전혀 다른 곳에 위치시키든 상관 없는 것 같다. 뒤에 작성할 .emacs 파일에 파일들이 위치한 경로를 적어주면 된다.
위에서 정한 경로 내에 넣어야 하는 파일:
1. emacs-rails 파일들
http://rubyforge.org/projects/emacs-rails
다음 명령으로도 다운받을 수 있다.
svn co svn://rubyforge.org/var/svn/emacs-rails/trunk emacs-rails
2. snippet.el 파일
http://www.kazmier.com/computer/snippet.el
find-recursive.el 파일
http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt 에서 find-recursive.txt 파일을 받아서 확장자를 el로 변경
inf-ruby.el 파일
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/inf-ruby.el?view=co
그런데 이 파일은 '3. ruby 관련 파일'에서 다운 받으면 그 안에 들어있기 때문에 여기서 다운받을 필요는 없을 것 같다.
3. ruby 관련 파일
위의 파일들만 받으면 ruby-mode와 관련해서 에러가 나기 때문에 ruby 관련 el 파일들도 받아야 하는 것 같다.
http://svn.ruby-lang.org/repos/ruby/trunk/misc/ 이 곳에서 다운 받거나 다음 명령으로도 다운받을 수 있다.
svn export http://svn.ruby-lang.org/repos/ruby/trunk/misc ruby
위와 같은 파일들을 다운 받았으면 rails를 로드하는 .emacs 파일을 작성하여 홈 폴더(~)에 저장해야 한다. site-lisp 디렉토리나 루트(/)에 놓아서는 emacs에 의해 로드되지 않는 것 같았다. .emacs파일의 내용은 다음과 같다.
(setq load-path (cons "파일들이 위치한 경로명" load-path))
(require 'rails)
또는 다음과 같이 작성해도 된다.
(add-to-list 'load-path "파일들이 위치한 경로명")
(require 'rails)
하지만 계속해서 나는 다음과 같은 에러.
Symbol's value as variable is void: dirname
온갖 방법을 다 동원해 봤지만 원인을 알 수가 없었다. 에러에도 불구하고 emacs에서 Meta+X - ruby-mode를 쳐서 ruby-mode로의 전환은 가능했다. 하지만 emacs 시작시에 나는 저 에러는 그냥 넘어가기엔 너무 찜찜하다.
계속해서 실패하다가, 드디어 원인을 알아냈다. snippet.el 파일과 find-recursive.el 파일을 해당 링크로 가서 내용을 복사한 다음 emacs에 붙여넣어 두 파일을 만들었었는데, 붙여넣는 과정에서 잘못이 생긴 듯 싶다. 두 파일을 다시 '링크를 다른 이름으로 저장'하는 식으로 다운받아서 해 보니 모든 것이 순조롭게 돌아간다.
그리고 http://sodonnell.wordpress.com/the-emacs-newbie-guide-for-rails/ 가 가장 설명이 잘 되어 있는 것 같다. 다운 받아야 하는 각 부분이 어떤 역할을 하는지를 잘 설명해 주고 있다. 이 사이트에서는 ruby-mode와 ruby-electric, snippet, find-recursive를 명시적으로 require 하는 식으로 .emacs 파일을 작성했다. 하지만 다른 사이트에서는 .emacs의 내용이 로드할 디렉토리를 지정한 다음 (require 'rails)만 적어주면 된다고 하는 것 같다. 후자처럼 해도 def를 치면 end가 자동으로 생기는 것과 같은 ruby-electric의 기능도 제대로 동작하는 것 같고.. 차이를 잘 모르겠다.
그리고 이 사이트에서는 ECB(emacs code browser)에 대해서도 얘기하고 있는데, ECB를 사용하면 Emacs에서 파일을 열 때 폴더구조와 파일명이 보이기 때문에 편하다. 그런데 이 사이트가 ECB 명령어를 좀 이상하게 적어놓고 있어서 한참 삽질을 하게 만든다; 삽질끝에 알아낸 명령어는 다음과 같다.
ECB 활성화: meta+x ecb-activate
ECB 비활성화: meta+x ecb-deactivate
Jump to the directory window: ctrl+c .gd
Jump to the history window: ctrl+c .gh
Jump to the last window you were in: ctrl+c .gl
Jump to the first editor window ctrl+c .g1
그리고 테스트로 rhtml 파일을 생성해서 편집해 보았는데 html 태그의 indentation이 전혀 제대로 되지 않는다. 어쩔 수 없이 emacs에 원래 있는 html-mode로 전환해서 편집해야 한다.
핫 그런데 방금 rails 프로젝트의 view 디렉토리 내에서 rthml 파일을 생성하니 HTML view RoR이라고 모드가 제대로 뜬다.
References
Emacs for Rails << Software bits and pieces
http://sodonnell.wordpress.com/the-emacs-newbie-guide-for-rails/
rubyforge
http://rubyforge.org/projects/emacs-rails
rails on emacs
http://dima-exe.ru/rails-on-emacs
ruby: installing emacs extensions
http://www.rubygarden.org/Ruby/page/show/InstallingEmacsExtensions
How to use emacs with rails
http://wiki.rubyonrails.org/rails/pages/HowToUseEmacsWithRails
emacs에서 rails를 다루자
http://cafe.naver.com/amagramer.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=488
나의 .emacs 코드
;;Rails with Emacs
;Allows syntax highlighting to work, among other things
(global-font-lock-mode 1)
; loads ruby mode when a .rb file is opened.
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/ruby")
(autoload 'ruby-mode "ruby-mode" "Major mode for editing ruby scripts." t)
(setq auto-mode-alist (cons '(".rb$" . ruby-mode) auto-mode-alist))
(setq auto-mode-alist (cons '(".rhtml$" . html-mode) auto-mode-alist))
; adding ruby electric
(add-hook 'ruby-mode-hook
(lambda()
(add-hook 'local-write-file-hooks
'(lambda()
(save-excursion
(untabify (point-min) (point-max))
(delete-trailing-whitespace)
)))
(set (make-local-variable 'indent-tabs-mode) 'nil)
(set (make-local-variable 'tab-width) 2)
(imenu-add-to-menubar "IMENU")
(define-key ruby-mode-map "\C-m" 'newline-and-indent) ;Not sure if this line is 100% right but it works!
(require 'ruby-electric)
(ruby-electric-mode t)
))
;These lines are required for ECB
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/eieio-0.17")
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/speedbar-0.14beta4")
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/semantic-1.4.4")
(setq semantic-load-turn-everything-on t)
(require 'semantic-load)
; This installs ecb - it is activated with M-x ecb-activate
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/ecb-snap")
(require 'ecb-autoloads)
(setq ecb-gzip-setup (quote cons))
(setq ecb-layout-name "left14")
(setq ecb-layout-window-sizes (quote (("left14" (0.2564102564102564 . 0.6949152542372882) (0.2564102564102564 . 0.23728813559322035)))))
(setq ecb-source-path (quote ("~/work")))
; needed for rails mode
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/snippet")
(require 'snippet)
(require 'find-recursive)
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/emacs-rails")
(require 'rails)
Installing Common Lisp - SBCL
환경: 맥북, 레오파드
레오파드에는 Emacs가 /usr/share/emacs에 기본적으로 깔려 있다. 리습 구현(implementation)과 SLIME(The Superior Lisp Interaction Mode for Emacs, 루비의 irb 같은 것이다. 물론 이런 방식의 프로그래밍 환경을 제공한 것은 리습이 제일 처음인 것으로 알고 있다.)만 설치하고 Emacs와 연결시키면 된다.
리습은 다른 언어와 달리 구현이 여러 개다. 각 구현마다 지원하는 바가 조금씩 다르고.. 따라서 자신의 취향에 맞는 구현을 선택하면 된다. 구현에는 Clisp, Allegro Common Lisp, SBCL, OpenMCL, Lispworks 등등이 있는데 Lispworks같은 경우에는 IDE 형태로 지원이 되고 깔끔하지만 상용이다. 상용 리습 구현들은 그 값을 하기 위해서 리습으로 짠 코드를 데스크탑 어플리케이션으로 딜리버리 하는 것을 쉽게 해 준다거나, 기술적 지원들을 해준다고 하지만, 당장 나와는 관계가 없다. 개인 버전은 무료라지만 여러 가지 제약이 많기 때문에 그냥 Emacs에 다른 리습 구현을 연결해 사용하는 게 나을 것 같다. Clisp을 받으려고 했다가 맥용이 어떤 것인지가 확실치 않아서, 맥 플랫폼 버전이 명시되어 있는 SBCL을 다운받았다.
다운받고 압축을 푼 후 해당 디렉토리로 가서
sudo sh install.sh
을 쳤는데, 'GNU Make not found'라고 나오면서 설치가 안된다. 패스의 문제인가 하고 set을 쳐 봤는데 PATH에 /usr/bin은 추가가 되어 있다. /usr/bin을 살펴보니 make가 있어야 하는데 make가 없다. Xcode 설치를 안 하면 이렇다.
Xcode를 설치하려면 레오파드 설치 시디를 넣은 후 Optional Installs를 선택하고 Xcode Tools를 선택해서 XcodeTools.mpkg 를 더블클릭하면 된다. 그러면 make나 gcc등이 다 설치가 된다.
다시 SBCL 압축을 푼 폴더로 이동해서 sudo sh install.sh를 치니 /usr/local/bin에 정상적으로 설치가 된다. 이제 SLIME을 다운받자. SLIME은 다운받고 압축을 풀기만 하면 되고 별도의 설치가 필요없다. 내 경우는 /usr/local/bin/slime-2.1로 복사해 놓았다. (다운받은 디렉토리에서 'sudo cp -r slime-2.1 /usr/local/bin' 과 같이 하면 /usr/local/bin으로 복사된다. 복사 후 원본 디렉토리를 지우려면 'rm -rf 디렉토리명'을 치면 된다.)
이제 .emacs 파일에 구현과 SLIME을 부르는 부분만 추가하면 된다. .emacs 파일은 홀 폴더(~) 안에 있다.('ls -a'로 검색하면 .로 시작하는 파일도 다 보인다.) 없다면 새로 만들면 된다.('emacs .emacs') .emacs 파일 안에 다음 내용을 추가한다.(다운받은 SLIME 폴더의 README 파일에 어떻게 해야 되는지 나와 있다.)
(add-to-list 'load-path "/usr/local/bin/slime-2.1") ;your SLIME directory
(setq inferior-lisp-program "/usr/local/bin/sbcl") ;your Lisp system
(require 'slime)
(slime-setup)
물론 ';' 뒤의 주석은 칠 필요 없고, 디렉토리 명은 자신의 SLIME과 리습 구현이 있는 디렉토리를 적어야 한다.
Emacs 를 시작한 뒤, Meta+x slime 을 치면 SLIME이 시작되면서 우아하게 CL-USER>가 등장한다. 만일 터미널에서 Emacs를 실행했을 때 메타 키가 먹지 않는다면 터미널 -> 환경 설정 -> 키보드 -> 'option을 메타 키로 사용'에 체크한다.
레오파드에는 Emacs가 /usr/share/emacs에 기본적으로 깔려 있다. 리습 구현(implementation)과 SLIME(The Superior Lisp Interaction Mode for Emacs, 루비의 irb 같은 것이다. 물론 이런 방식의 프로그래밍 환경을 제공한 것은 리습이 제일 처음인 것으로 알고 있다.)만 설치하고 Emacs와 연결시키면 된다.
리습은 다른 언어와 달리 구현이 여러 개다. 각 구현마다 지원하는 바가 조금씩 다르고.. 따라서 자신의 취향에 맞는 구현을 선택하면 된다. 구현에는 Clisp, Allegro Common Lisp, SBCL, OpenMCL, Lispworks 등등이 있는데 Lispworks같은 경우에는 IDE 형태로 지원이 되고 깔끔하지만 상용이다. 상용 리습 구현들은 그 값을 하기 위해서 리습으로 짠 코드를 데스크탑 어플리케이션으로 딜리버리 하는 것을 쉽게 해 준다거나, 기술적 지원들을 해준다고 하지만, 당장 나와는 관계가 없다. 개인 버전은 무료라지만 여러 가지 제약이 많기 때문에 그냥 Emacs에 다른 리습 구현을 연결해 사용하는 게 나을 것 같다. Clisp을 받으려고 했다가 맥용이 어떤 것인지가 확실치 않아서, 맥 플랫폼 버전이 명시되어 있는 SBCL을 다운받았다.
다운받고 압축을 푼 후 해당 디렉토리로 가서
sudo sh install.sh
을 쳤는데, 'GNU Make not found'라고 나오면서 설치가 안된다. 패스의 문제인가 하고 set을 쳐 봤는데 PATH에 /usr/bin은 추가가 되어 있다. /usr/bin을 살펴보니 make가 있어야 하는데 make가 없다. Xcode 설치를 안 하면 이렇다.
Xcode를 설치하려면 레오파드 설치 시디를 넣은 후 Optional Installs를 선택하고 Xcode Tools를 선택해서 XcodeTools.mpkg 를 더블클릭하면 된다. 그러면 make나 gcc등이 다 설치가 된다.
다시 SBCL 압축을 푼 폴더로 이동해서 sudo sh install.sh를 치니 /usr/local/bin에 정상적으로 설치가 된다. 이제 SLIME을 다운받자. SLIME은 다운받고 압축을 풀기만 하면 되고 별도의 설치가 필요없다. 내 경우는 /usr/local/bin/slime-2.1로 복사해 놓았다. (다운받은 디렉토리에서 'sudo cp -r slime-2.1 /usr/local/bin' 과 같이 하면 /usr/local/bin으로 복사된다. 복사 후 원본 디렉토리를 지우려면 'rm -rf 디렉토리명'을 치면 된다.)
이제 .emacs 파일에 구현과 SLIME을 부르는 부분만 추가하면 된다. .emacs 파일은 홀 폴더(~) 안에 있다.('ls -a'로 검색하면 .로 시작하는 파일도 다 보인다.) 없다면 새로 만들면 된다.('emacs .emacs') .emacs 파일 안에 다음 내용을 추가한다.(다운받은 SLIME 폴더의 README 파일에 어떻게 해야 되는지 나와 있다.)
(add-to-list 'load-path "/usr/local/bin/slime-2.1") ;your SLIME directory
(setq inferior-lisp-program "/usr/local/bin/sbcl") ;your Lisp system
(require 'slime)
(slime-setup)
물론 ';' 뒤의 주석은 칠 필요 없고, 디렉토리 명은 자신의 SLIME과 리습 구현이 있는 디렉토리를 적어야 한다.
Emacs 를 시작한 뒤, Meta+x slime 을 치면 SLIME이 시작되면서 우아하게 CL-USER>가 등장한다. 만일 터미널에서 Emacs를 실행했을 때 메타 키가 먹지 않는다면 터미널 -> 환경 설정 -> 키보드 -> 'option을 메타 키로 사용'에 체크한다.
피드 구독하기:
글 (Atom)