4월 한 달 동안은 논산 훈련소에 다녀오느라 공부도, 포스팅도 전혀 하지 못했다. 덕분에 Weblocks 코드를 보면서 파악했던 것들도 많이 까먹은 것 같다. Weblocks는 현재 리습 유저로서 선택할 수 있는 거의 유일한 웹 프레임워크라고 생각된다. 함부로 말할 수는 없겠지만 아이디어도 깔끔하고 여러모로 Rails보다도 나은 면이 많은 것 같다. 다만 여타 오픈 소스 소프트웨어와 마찬가지로 처음 접하는 사람에게 도움을 줄 만한 문서가 부족하다. 도움이 될 만한 문서가 있다고 해도 토론 그룹에 흩어져 있는 경우가 많아서 찾기도 쉽지 않다. 직접 자세하게 가이드를 써 보면 좋겠지만 아직 그럴 내공도 안 되고, 그래서 Weblocks를 이해하는데 도움이 될 만한 글들을 한데 링크해보는 것으로 그치려고 한다.
공식 매뉴얼
view에 관한 introduction
언제나 그렇지만 뭔가를 익히기 위한 제일 좋은 방법은 예를 보는 것이다.
hello world example
A simple blog example
이외에도 다운받은 코드의 cl-weblocks/examples/ 디렉토리 아래에 있는 예들을 살펴보는 것도 꽤나 도움이 된다.
파일 업로드에 관한 스레드
Lisp for the Web - Weblocks와 직접 관련있는 글은 아니지만 Weblocks가 hunchentoot와 cl-who 라이브러리에 바탕을 두고 있기 때문에 저 둘에 관련된 아티클도 도움이 될 거라 생각한다.
Weblocks에서 새로운 타입을 정의하는 것에 관한 아티클
2008년 5월 6일 화요일
2008년 3월 27일 목요일
적응형 소프트웨어로서의 웹 어플리케이션
다양한 브라우저에서 "동일하게 보이고 동일하게 동작하는" 웹 어플리케이션을 만들기란 쉽지 않다. 브라우저라는 환경이 너무나 다양한 탓이다. 다양한 환경을 다루는 솔루션은 단일한 환경을 다루는 솔루션에 비해 복잡해지기 마련이다.
같은 이유로 적응형 소프트웨어를 만드는 것도 어려운 일이다. 사실, "다양한 환경에서 제대로 기능하는 것"이 적응형 소프트웨어의 목표라고 할 때, 웹 어플리케이션은 브라우저라는 다양한 환경에서 제대로 동작하려고 애쓰는 적응형 소프트웨어라고도 할 수 있다.
여러 개의 솔루션을 종합해서 하나로 만든 솔루션은 복잡하기 때문에 유지보수가 어렵다. 다음 예를 보자.
이 코드는 인터넷 익스플로러와 오페라, 기타 브라우저에서 모두 똑같은 모양의 웹 페이지를 보여주기 위한 CSS 코드이다. 인터넷 익스플로러가 너비 값을 해석하는 방식의 차이 때문에 인터넷 익스플로러를 위한 너비값을 먼저 지정한 후, voice-family 속성을 사용해 인터넷 익스플로러가 선언이 끝난 것처럼 인식하게 하고, 그 후에 다른 브라우저를 위한 너비 값을 선언한 것이다. 하지만 오페라 브라우저도 인터넷 익스플로러처럼 voice-family 속성을 만나면 해석을 멈추기 때문에 아래 쪽에 오페라 브라우저만을 위해 추가적인 선언을 해 주었다. 이 코드는 서로 다른 브라우저 환경에서 동일한 모양을 보여준다는 목표를 달성하기 위해 일종의 CSS 트릭을 이용하고 있다. 이런 방식은 코드를 복잡하게 만들 뿐 아니라 브라우저들의 버전이 바뀌어 CSS를 해석하는 규칙이 변한다면 더 이상 유효하지 않게 된다. 하지만 CSS 기법을 담고 있는 많은 책들이 서로 다른 브라우저 문제를 해결하기 위해 이와 비슷한 트릭들에 의존하고 있다.
위 코드를 주석 없이 본다면 사실상 어떤 부분이 인터넷 익스플로러를 위한 부분이고 어떤 부분이 나머지 브라우저를 위한 부분인지, 맨 아래 오페라를 위해 삽입한 코드는 왜 들어가 있는건지, 알기가 어렵다. 하지만 각각의 CSS 코드를 분리해서 상황에 맞게 로드할 수 있다면 다음과 같이 될 것이다.
이 편이 코드를 읽기는 훨씬 쉽다. 따라서 환경에 대응하는 각각의 솔루션을 분리하는 것이 복잡도를 줄이는 방법이다. 하지만 S라는 솔루션을 Sa, Sb, ... Sz 으로 분리했을 경우, 요구사항이 변하거나 다른 해결 방법을 사용하고자 하여 Sa가 Sa'으로 변경되면 Sb, ... Sz 도 같이 변경해 주어야 한다는 번거로움이 생긴다.
따라서 이상적인 방법은 Sa와 나머지 솔루션 사이의 차이를 Vab, Vac, ... Vaz로 정의한 다음, Sa만을 변경해 나가고 나머지 솔루션은 Sa에 Vab ... Vaz를 적용해 자동으로 생성하는 것이다.
이와 같은 생각을 웹 어플리케이션에 적용해보자. 하나의 브라우저에 대해서만 CSS나 자바스크립트 코드를 작성한 후 브라우저 사이의 차이를 정의한 룰을 적용해서 다른 브라우저들에 적합한 CSS와 자바스크립트 코드를 생성해내는 것이 가능할 것이다. 일단 각 브라우저에 적합한 코드들을 만들어 냈다면, 리퀘스트의 정보를 살펴보고 해당 브라우저에 맞는 코드를 로드하게 만드는 것은 쉬운 일이다.
솔루션 사이의 차이를 어떻게 기술할 수 있을까? 필요한 것은 코드에서 "관심의 대상이 되는 부분"을 정의하고 그 부분에 "규칙에 의한 변화"를 가해서 다른 솔루션을 만들어내는 것이다. AOP의 pointcut과 advice가 의도는 다를지언정 이와 비슷한 역할을 한다고 할 수 있다. 따라서 솔루션 사이의 variation을 정의하기 위해, pointcut과 advice 같은 형식을 이용할 수 있다.
이와 같은 생각을 variation-applier라는 도구로 구현해보았다. 이 도구는 CSS 파일을 대상으로 한다. 사용 방법은 기본 솔루션에 해당하는 디렉토리와, variation 룰들(IE.var opera.var 등등)이 들어 있는 디렉토리, 솔루션들이 생성될 디렉토리를 지정하고 apply를 누르면, variation 룰 당 하나씩 새로운 솔루션이 생성된다.

variation rule은 pointcut과 advice의 개념을 사용했지만 최대한 CSS 문법과 비슷하게 기술하도록 하였다. 사용 예는 다음과 같다.
기본적으로 selector가 같을 때만 variation 규칙이 적용되지만 variation의 selector를 global로 선언한 경우에는 selector에 관계없이 모두 적용된다.
variation-applier는 Common Lisp으로 작성되었으며 weblocks 웹 프레임워크 위에서 실행된다. 실행을 위해서는 Common Lisp과 weblocks를 설치하고, 소스 코드의 build-and-test.lisp 파일을 SLIME으로 로드(ctrl+c ctrl+l)한 후, SLIME에서 (variation-applier:start-variation-applier)를 치면 된다. 브라우저의 주소창에 localhost:8080 을 쳐 넣으면 입력 화면이 나타나는 것을 볼 수 있다.
Blogger에는 파일을 첨부할 수가 없기에 티스토리 블로그에 소스 코드를 올려놓았다.
소스 코드 다운로드
같은 이유로 적응형 소프트웨어를 만드는 것도 어려운 일이다. 사실, "다양한 환경에서 제대로 기능하는 것"이 적응형 소프트웨어의 목표라고 할 때, 웹 어플리케이션은 브라우저라는 다양한 환경에서 제대로 동작하려고 애쓰는 적응형 소프트웨어라고도 할 수 있다.
여러 개의 솔루션을 종합해서 하나로 만든 솔루션은 복잡하기 때문에 유지보수가 어렵다. 다음 예를 보자.
#sidebar {
padding: 10px;
border: 5px solid black;
width: 230px; /* for Internet Explorer */
voice-family: “\“3\””;
voice-family: inherit;
width: 200px; /* real value */
}
html>body #sidebar {
width: 200px;
} /* for Opera */
이 코드는 인터넷 익스플로러와 오페라, 기타 브라우저에서 모두 똑같은 모양의 웹 페이지를 보여주기 위한 CSS 코드이다. 인터넷 익스플로러가 너비 값을 해석하는 방식의 차이 때문에 인터넷 익스플로러를 위한 너비값을 먼저 지정한 후, voice-family 속성을 사용해 인터넷 익스플로러가 선언이 끝난 것처럼 인식하게 하고, 그 후에 다른 브라우저를 위한 너비 값을 선언한 것이다. 하지만 오페라 브라우저도 인터넷 익스플로러처럼 voice-family 속성을 만나면 해석을 멈추기 때문에 아래 쪽에 오페라 브라우저만을 위해 추가적인 선언을 해 주었다. 이 코드는 서로 다른 브라우저 환경에서 동일한 모양을 보여준다는 목표를 달성하기 위해 일종의 CSS 트릭을 이용하고 있다. 이런 방식은 코드를 복잡하게 만들 뿐 아니라 브라우저들의 버전이 바뀌어 CSS를 해석하는 규칙이 변한다면 더 이상 유효하지 않게 된다. 하지만 CSS 기법을 담고 있는 많은 책들이 서로 다른 브라우저 문제를 해결하기 위해 이와 비슷한 트릭들에 의존하고 있다.
위 코드를 주석 없이 본다면 사실상 어떤 부분이 인터넷 익스플로러를 위한 부분이고 어떤 부분이 나머지 브라우저를 위한 부분인지, 맨 아래 오페라를 위해 삽입한 코드는 왜 들어가 있는건지, 알기가 어렵다. 하지만 각각의 CSS 코드를 분리해서 상황에 맞게 로드할 수 있다면 다음과 같이 될 것이다.
/* Internet Explorer */
#sidebar {
width: 230px;
padding: 10px;
border: 5px;
}
/* the others */
#sidebar {
width: 200px;
padding: 10px;
border: 5px;
}
이 편이 코드를 읽기는 훨씬 쉽다. 따라서 환경에 대응하는 각각의 솔루션을 분리하는 것이 복잡도를 줄이는 방법이다. 하지만 S라는 솔루션을 Sa, Sb, ... Sz 으로 분리했을 경우, 요구사항이 변하거나 다른 해결 방법을 사용하고자 하여 Sa가 Sa'으로 변경되면 Sb, ... Sz 도 같이 변경해 주어야 한다는 번거로움이 생긴다.
따라서 이상적인 방법은 Sa와 나머지 솔루션 사이의 차이를 Vab, Vac, ... Vaz로 정의한 다음, Sa만을 변경해 나가고 나머지 솔루션은 Sa에 Vab ... Vaz를 적용해 자동으로 생성하는 것이다.
이와 같은 생각을 웹 어플리케이션에 적용해보자. 하나의 브라우저에 대해서만 CSS나 자바스크립트 코드를 작성한 후 브라우저 사이의 차이를 정의한 룰을 적용해서 다른 브라우저들에 적합한 CSS와 자바스크립트 코드를 생성해내는 것이 가능할 것이다. 일단 각 브라우저에 적합한 코드들을 만들어 냈다면, 리퀘스트의 정보를 살펴보고 해당 브라우저에 맞는 코드를 로드하게 만드는 것은 쉬운 일이다.
솔루션 사이의 차이를 어떻게 기술할 수 있을까? 필요한 것은 코드에서 "관심의 대상이 되는 부분"을 정의하고 그 부분에 "규칙에 의한 변화"를 가해서 다른 솔루션을 만들어내는 것이다. AOP의 pointcut과 advice가 의도는 다를지언정 이와 비슷한 역할을 한다고 할 수 있다. 따라서 솔루션 사이의 variation을 정의하기 위해, pointcut과 advice 같은 형식을 이용할 수 있다.
이와 같은 생각을 variation-applier라는 도구로 구현해보았다. 이 도구는 CSS 파일을 대상으로 한다. 사용 방법은 기본 솔루션에 해당하는 디렉토리와, variation 룰들(IE.var opera.var 등등)이 들어 있는 디렉토리, 솔루션들이 생성될 디렉토리를 지정하고 apply를 누르면, variation 룰 당 하나씩 새로운 솔루션이 생성된다.

variation rule은 pointcut과 advice의 개념을 사용했지만 최대한 CSS 문법과 비슷하게 기술하도록 하였다. 사용 예는 다음과 같다.
/* base file */
#sidebar
{ width: 200px; margin: 0;}
case 1
/* var file */
#sidebar
{ width: ((calculate + 30px)); }
=>
/* result file */
#sidebar
{ width: 230px; margin: 0; }
case 2
/* var file */
#sidebar
{ width: ((before border 5px) (calculate * 1.1 + 10) (after padding 10px)); }
=>
/* result file */
#sidebar
{ border: 5px; width: 230px; padding: 10px; margin: 0;}
case 3
/* var file */
global
{ width: ((around border 0)) margin: ((delete)) }
=>
/* result file */
#sidebar
{ border: 0; }
기본적으로 selector가 같을 때만 variation 규칙이 적용되지만 variation의 selector를 global로 선언한 경우에는 selector에 관계없이 모두 적용된다.
variation-applier는 Common Lisp으로 작성되었으며 weblocks 웹 프레임워크 위에서 실행된다. 실행을 위해서는 Common Lisp과 weblocks를 설치하고, 소스 코드의 build-and-test.lisp 파일을 SLIME으로 로드(ctrl+c ctrl+l)한 후, SLIME에서 (variation-applier:start-variation-applier)를 치면 된다. 브라우저의 주소창에 localhost:8080 을 쳐 넣으면 입력 화면이 나타나는 것을 볼 수 있다.
Blogger에는 파일을 첨부할 수가 없기에 티스토리 블로그에 소스 코드를 올려놓았다.
소스 코드 다운로드
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월 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 로 종료해야 정상적으로 종료되는 것 같다. 멀티 스레드가 되는지는 아직 시험해 보지 못했다.
피드 구독하기:
덧글 (Atom)