드디어 저를 괴롭히던 가장 큰 문제가 해결 됐습니다. -0-
Weblocks 를 쓰면서 대체 이걸 어떻게 하는 걸까? 하고 고민 했던 것이 /pub/images 말고 딴곳에 있는 image 파일 access 하는 방법이였습니다.

예를 들면 /pub/images/photos/bassist.jpg 를 화면에 출력하고 싶을 때, 대체 어떻게 하는지 모르는 것이였습니다. 워낙 쉬운거라 Example 이나 Tutorial 에 없는 것이겠지요? 개발되어지고 있는 소스 자체를 뒤져서 알아냈습니다. 핵심은

make-webapp-public-file-uri 라는 이름의 함수였습니다.

(defun make-photo-page ()
  (make-widget
   (lambda ()
     (with-html
       (:p :id "index" "첫화면 이라능..")
       (:img :src (make-webapp-public-file-uri "images/photos/bassist.jpg") :alt "This site has valid XHTML 1.1.")))))


이런식으로 직접적으로 표현해 주는 방식이였습니다. 소스를 더 뒤져봐야 알겠지만 이런 간단한 내용을 찾기 위해서 한참을 고생한 것을 생각하면 ㅜ.ㅜ

암튼 해결해서 기쁘군요 ㅎㅎ


Weblocks 는 리습으로 된 프레임 워크 입니다. 멋지고 편리한 개념으로 무장하고 있지만 리습이라는 언어 자체가 가지는 비 인기성으로 널리 퍼지지는 않았습니다.

그래도 몇가지 편리한 기능들이 있어서 주목하고 있는데, 그중에 대표적인 기능이 Widget 개념입니다. 모든 웹 컴포넌트를 widget 으로 만들고 그 widget을 엮어서 웹 페이지를 만들게 하는 것이지요.

자세한 매뉴얼이나 공식적인 튜토리얼등 형식을 취하는 것이 몇개는 있지만, 전반적으로 문서가 많이 부족합니다. 게다가 lisp 자체에 대한 이해도가 필요합니다. (CLOS 같은 것에 대한 지식)

더구나 저는 Web 도 잘 모르는 판국이라 여러가지로 배우기가 힘들지만 한개씩 한개씩 정복해 나가는 재미가 있습니다.

설치하고 웹 프로젝트 만들고 이런 것들은 http://trac.common-lisp.net/cl-weblocks/wiki/UserManual 에 잘 나타나 있습니다. (물론 영어입니다.)

딱히 그런부분은 어렵지 않습니다. 그러면 그 와중에 제일 중요하다고 볼 수 있는 PAGE 끼리 연결 시키는 link 만드는 법에 대해서 알아보겠습니다.

링크를 클릭하면 보통 동작이 발생합니다. (페이지로 이동하거나 글을 포스팅 하거나 등등) 그런 모든 동작을 통칭해서 weblocks 에서는 action-link 라고 합니다. 그 action-link 에 관한 간단한 예를 보기로 하지요.

temp-cloud 라는 이름으로 project 를 생성했습니다. 생성하는 방법은 위에 링크되어 있는 UserManual 하단에 보면 "Creating a New Project" 에 잘 설명되어 있습니다.

만든상태에서 temp-cloud/src/init-session.lisp 파일을 열어 봅니다.

(defun init-user-session (comp)
  (setf (composite-widgets comp)
        (make-test-page)))

라는식으로 바꿔줍니다. 이상태에서 make-test-page 함수를 작성해 줍니다.

(defun make-test-page ()
  (make-instance 'composite
                 :widgets
                 (list (lambda ()
                         (with-html
                           (:p :id "message" "야호!")
                           (:p :id "message2" "호야!")
                           )))))


조금 설명을 하자면 init-user-session 함수는 root widget 을 설정해주는 일을 합니다. (weblocks 는 웹페이지에 보이는 모든것을 widget 으로 표현합니다. html 마크업 , 동작하는 함수, 상태를 담고 있는 변수들도 전부 widget 으로 표현합니다. 이런 widget 들은 tree 형태로 구성되어 있는데 그중 최상단 root widget 을 init-user-session 에서 설정해 주는 것입니다) root widget 으로 make-test-page 함수를 쓴다고 설정해 주는 것입니다.

make-test-page 는 composite widget 을 만드는 방법이 들어 있는 함수입니다. 'composite 이라는 객체를 만들고 그안에 속해있는 widget 으로 list 함수를 이용해서 widget 들을 엮어서 지정해 줍니다. lambda 함수 뒤에 나열된 기능들이 html 을 실제로 보여주는 부분입니다.

단순히 여기까지 하고 (C-cC-c : 함수 단위 컴파일, C-cC-k: 파일 단위 컴파일) 컴파일을 해주고 화면에 보이는 부분에서 Reset Sessions 링크를 클릭하면 바뀐 부분으로 바껴서 웹페이지가 출력됩니다.

서론이 길었습니다. 이제 바로 Action-link 를 연결하는 부분을 보기로 하지요. 함수 한개를 추가해 줍니다.

(defun make-anim-page ()
  (make-instance 'composite
                 :widgets
                 (list (lambda ()
                         (with-html
                           (:p :id "message" "이런")))
                       (lambda ()
                         (render-link (lambda (&rest args)
                                        (declare (ignore args))
                                        (do-page (make-test-page)))
                                      "Modify")))))


make-anim-page (이름은 아무 의미 없습니다) 는 html 으로 p 태그 내용 하나와 "Modify" 라는 이름으로 링크를 거는 render-link 함수를 호출하고 있습니다. "Modify" 를 클릭하면 Lambda 함수가 실행이 됩니다. 즉 (do-page(make-test-page)) 가 실행이 되는 것이지요. render-link 사용법을 눈여겨 보시기 바랍니다.

(defun init-user-session (comp)
  (setf (composite-widgets comp)
        (make-anim-page)))

이렇게 init-user-session 함수를 바꾸어 주면 깔끔하게 첫페이지에서 link 를 클릭해서 다른 페이지로 이동하는 예제를 보실 수 있습니다.


요즘 javascript 공부를 하고 있습니다. 인터넷 뜬지가 언제인데.. 지금 와서 웹 공부를 하는지 저도 잘 모르겠지만 이 공부 덕분에 쌓여 있는 책을 제대로 못보고 있는 안타까움이 존재합니다. -0-

문제는 javascript 공부를 할 때 DOM 명령어들을 오타를 내서 자꾸 javascript 가 틀리는 문제가 발생하더군요. 제가 쓰는 Emacs 는 이런일을 아주 깔끔하게 처리할 수 있게 잠깐만 코딩해 주면 되는 것이지요.

즉 Javascript-mode 에 DOM 명령어들을 Keyword 로 등록해 주면 오타가 발생하는지 알아볼 수 있습니다.
추가하는 과정을 살펴보기로 합니다.

.emacs 에 다음과 같은 부분을 추가합니다.


(make-face 'dom-keywords-face)
face 한개를 설정해 줍니다. dom-keywords-face 라는 이름으로 설정해 줍니다.

;; M-x list-color-display
(set-face-foreground 'dom-keywords-face "IndianRed")
face 의 색은 IndianRed 로 해줍니다. 색이 아주 이쁘장합니다. list-color-display 를 실행시키면 emacs 에서 쓸 수 있는 색의 조합이 나타납니다. 명령을 자주 까먹어서 아예 주석으로 설명을 달아놨습니다.

(font-lock-add-keywords 'js-mode '(("\\<getElementById\\|createElement\\|document\\|appendChild\\>" . 'dom-keywords-face)))
(font-lock-add-keywords 'js-mode '(("\\<createTextNode\\>" . 'dom-keywords-face)))
키워드를 추가하는 부분입니다. \< \> 안에 들어 있어야 인식이 되는것 같습니다. (원리는 잘 모름..) 그리고 \\| 로 연속해서 써줄 수가 있습니다.  너무 많으면 차례로 늘어서 쓸 수가 있습니다.
js-mode 가 자바스크립트 파일을 읽어들이면 발동되는 javascript editor mode 입니다.



아주 쉽습니다. 키워드는 배우는 쪽쪽 추가해 주면 됩니다. 아직 배운 키워드가 몇개 없군요. ㅎㅎ



역시나 친절하게 상단 헬프에서 알려주는 것을 한참 찾았네요. -ㅅ- 이런건 구글신이 잘 안 알려주는것 같습니다.

'C-q' 입력하시고 ( 입력하시면 ( ) <-- 이렇게 쌍으로 생기지 않고 문자 그대로 ( 로만 입력됩니다. 동영상 보다가 생각이 안나서 한참을 찾았네요.


제가 아는 영업쪽 담당하시는 분이 한분 계십니다. 영업하시는 분답게 계약 체결전에는 간이라도 빼주실 듯 하다가 막상 체결이 되면 안면을 싹 바꾸시는..

투 페이스 되겠습니다. 다른 사진들은 너무


그런 분이 계시는데 그분이 명절 때가 되면 잊지않고 mail 을 보내주십니다. 잊지 않으신것은 고맙지요 (요즘 안오는거 보니 잊어버리신듯..) 그러나 편지를 받고 보면 수많은 cc 들을 보면서 기가 질립니다. 같은 mail 이라도 저한테만 보낸것 처럼 되어 있으면 참 좋을 텐데.. 라는 생각이 들지요

그래서 시작하게 됐습니다. 대량으로 메일을 발송하되 cc 는 안보이고 단일 대상한테 보내는 것처럼 하기. 찾아보면 간단하게 해결하는 방법이 많겠지만 저는 공부하는 겸 해서 직접 작업해보기로 했습니다.


여기부터는 프로그래머의 영역입니다. 프로그래머가 아니신 분은 봐도 몬소린지 모를 가능성이 아주 농후합니다.



프로그램 세게에서는 학습곡선이 뭐 같아서 배우기 힘들지만, 배우기만 하면 정말 무궁무진한 능력을 주는 것이 세가지가 있다고 합니다. (제 말 아님..)

1. Emacs
2. Regular Expressions
3. Functional Language


배우기 힘들지만 진짜 쓸모가 있다는 이야깁니다. 그런데  Emacs 라는 에디터는 기본적으로 정규 표현식과 함수형 언어인 ELisp 이 포함되어 있기 때문에 Emacs 를 잘 다루려고 공부하다 보면 자연스럽게 2번 3번을 익히게 됩니다.

"지인들에게 기분 상하지 않게 단체 메일 보내기" 프로젝트는 기본적으로 Emacs 를 가지고 개발하는 것을 원칙으로 합니다.

먼저 Emacs 에서 Gmail 을 통해서 편지 보내기!!

왜 하필 Gmail 을 통해서 보내는 것이냐? 라고 하시겠지만, 개인이 아무 리눅스에서 sendmail 데몬 깔아서 메일을 보내면 왠만한 e-mail 서비스는 전부 spam 으로 인식해서 편지 전달이 안됩니다. 그래서 Gmail 로 편지를 보낼 수 있게 설정해야 합니다.

gmail 에서 POP 와 IMAP 사용이 가능하게 설정합니다. <-- 이것에 관한 설정은 Gmail 환경설정에서 도움말이 존재합니다.

정확히 POP 와 IMAP 설정을 해야 사용할 수 있는지는 잘 모르겠는데, 제가 그렇게 설정을 해놨습니다. 여기까지만 하시면 외부 설정은 끝입니다.

그러면 Emacs 가 설치되어 있는 로컬 컴퓨터 기준으로 설명을 진행하겠습니다. OSX 10.6 Snow Leopard 에서 진행을 하고 있습니다. 아마도 테스트는 안했지만 우분투에서는 당연히 될것으로 생각합니다. 

Emacs 는 당연히 설치가 되어 있는 상태구요. 만약 없다면 http://aquamacs.org/ 에서 받아서 설치하시면 됩니다. 구체적인 세팅방법 같은건 정말 열심히 공부하셔야 합니다.

gnutls 를 설치해야 합니다. gmail 이 이방식으로 보안처리를 합니다. 설치를 해줘야 하는데, port 가 깔려 있다면

sudo port install gnutls


이 명령만 쳐주시면 알아서 설치가 됩니다. port 가 설치되어 있지 않다면 http://www.macports.org/ 에서 설치하시면 됩니다.

구체적인 세팅이 끝났으면 $HOME/.emacs 파일을 열어줍니다. 없으면 만드시면 됩니다. osx 기준으로는 $HOME 은 /Users/my-id 입니다. my-id 는 자신의 아이디 입니다.

.emacs 내용
(setq send-mail-function 'smtpmail-send-it
   message-send-mail-function 'smtpmail-send-it
   smtpmail-starttls-credentials
   '(("smtp.gmail.com" 587 nil nil))
   smtpmail-auth-credentials
   (expand-file-name "~/.authinfo")
   smtpmail-default-smtp-server "smtp.gmail.com"
   smtpmail-smtp-server "smtp.gmail.com"
   smtpmail-smtp-service 587
   smtpmail-debug-info t
   starttls-extra-arguments nil
   smtpmail-warn-about-unknown-extensions t
   user-full-name "광이랑"
   starttls-use-gnutls t)

위의 내용을 그대로 .emacs 에 복사하시고 '광이랑' 이라는 부분만 자신의 이름으로 바꾸시면 됩니다. 만약 받은 편지에서 보낸 사람의 이름의 인코딩이 깨져서 보이면 emacs 의 환경이 utf-8이 아니라는 이야깁니다. 만약을 위해서

.emacs 에서

(set-language-environment "UTF-8")


을 추가해 줍니다.

그리고 중간에 보이는 ~/.authinfo 파일은 만들어 줍니다. 만들고 그 안의 내용을

machine smtp.gmail.com login my-id@gmail.com password my-pass


라고 채워줍니다. 딱 이 한줄만 있어야 하며, newline 문자(엔터!)도 들어가면 안됩니다. my-id 와 my-pass 는 구글에 로긴할때 쓰는 아이디와 패스워드 입니다.

자 이제 C-x m 을 입력하시면 mail-mode 로 바뀝니다.

To:
Subject:
--text follows this line--


이와 같은 내용이 나오고요, 부족한 부분을 채우신 다음에 C-c C-c 를 입력하시면 편지를 보내게 됩니다. 여기까지 Emacs 에서 gmail 을 통해서 메일 발송하기 였습니다. 다음은 이 방법을 이용해서 "web-mail 형식으로 편지 보내는 방법"에 관해서 입니다. 그건 나중에...

연일 맥을 가지고 놀다 보니 발견하게 되는 개발 환경과 작업 환경 세팅시의 문제점들이 발견 되는 군요. 저는 Emacs 로 텍스트 파일들을 작성해서 svn repository 에 보관을 합니다. 그렇게 집 , 회사 , 노트북 세가지를 동기화 시켜왔는데 이제  osx 를 사용하다 보니 첨 쓰게 되는 환경에 당황하게 되는군요. 너무 쉽게 됐던 것들이 안되니 참으로 난감하기도 하고 -ㅅ-; 암튼 구글링 저헐라게 하다가 우연히 알게 되는 사실로 해결이 되는 군요.

.emacs 에서 한글을 쓰기 위해서 세팅하는 과정입니다.

(set-language-environment "Korean")

(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)


이렇게만 설정해 주면 기본적으로 osx 에서 emacs 사용시 별 문제 없이 utf-8 환경으로 작동하게 되는 군요.
여기에다가 svn 을 살짝 연결 시켜서 사용하게 되면 linux 나 window 와는 다르게 에러가 발생합니다. 이미 고쳐버려서 어떤 메시지 였는지 확실하지는 않지만

svn: Commit failed (details follow):
svn: Can't convert string from native encoding to 'UTF-8':


이러한 메시지 였습니다.
정말로 고쳐볼려고 별의 별 방법을 다 써봤습니다. 구글링도 얼마나 한지 모릅니다. 그러다가 우연히 발견한 팁을 적용시켰습니다. emacs + svn + utf-8 으로 검사하니까 절대로 안나오더군요..

.profile 에 다음과 같이 추가해 줍니다.

export LC_CTYPE=en_US.UTF-8
export LANG=en_US.UTF-8


왜 인지 모르지만 너무 잘 돌아갑니다. -ㅅ-;;
사전이 필요할때마다 dic.daum.net 에 가서 찾어서 하는게 귀찮아서 아예 emacs 에서
검색이 되면 참 좋겠다고 생각했더니 역시나 패키지가 있더군요.

요기에서 패키지 받기

여기에 가시면 download 메뉴에 가시면 최신 메뉴를 받으 실 수가 있습니다. 받아서
압축을 풀어주시고 적절한 곳에(대기 스타일!!) 복사해줍니다. 그리고 .emacs 파일에
설정을 잡아주시면 바로 사용이 가능합니다.

;; dictionary added
(add-to-list 'load-path
                   "~/.emacs.d/dictionary-1.8.7")


저는 .emacs.d 디렉토리 밑에다가 복사해줬습니다.

(load "dictionary-init")


이렇게 해주면 모든 사전 설정들을 세팅해줍니다.

;; dictionary key bindings
      (global-set-key "\C-cs" 'dictionary-search)
      (global-set-key "\C-cm" 'dictionary-match-words)


기본 사용에 관한 키 바인딩을 해 줍니다. 이러면 기본적으로 국제 사전을 찾아가서
'영-영 사전'을 기본으로 단어를 보여줍니다. '영-한 사전'을 찾아야 하는데 말이죠 -ㅅ-

M-x customize-group RET dictionary RET 를 입력해서 설정을 바꿔줄 수도 있습니다.

ECB (Emacs Code Browser ) 세팅하기

 - crazia 가 세팅하는 방식에 대한 기억 유지 차원 정리

1. ECB package 받아서 .emacs.d 디렉토리에 압축을 풀어서 정리합니다.
 - 설치한다고 바로 ECB 가 구동은  안될것입니다. 기본적으로 필요한
  몇가지 라이브러리가 있습니다.

 1.1 여러가지 라이브러리를 전부 찾아서 설치할 수도 있지만 간편하게
  CEDET 한방으로 해결하는 방법을 선호합니다. 단 CEDET 설치하게 되면
  emacs 구동시 현저하게 느려진 기분을 만끽하실 것입니다.

  1.1.1 CEDET 를 받아서 .emacs.d 디렉토리에 압축을 풀어서 정리합니다.
   - CEDET 은 ~/.emacs.d/cedet-1.0pre4 에 설치될 것입니다.
   - .emacs 파일에 (load-file  "~/.emacs.d/cedet-1.0pre4/common/cedet.el")
     를 추가해 줍니다. 이렇게 하면 CEDET 설정은 끝입니다.

2. (add-to-list 'load-path "~/.emacs.d/ecb-2.32") 라고 .emacs 파일에
 추가해주는데, 이는 ecb 패키지에 대한 패스 추가라고 볼 수 있습니다.
 역시 .emacs 파일에 (require 'ecb) 라고 추가해 주면 ecb 설정 완료 입니다.


emacs 를 사용하면서 사용 안 하다가 최근에 사용하게 된 모드가 '달력
모드' 입니다. Outlook 이라는 일정관리의 강자가 있지만 , 개발모드로
진입하게 되면 메일 관련 확인빈도가 떨어질뿐만 아니라 컴퓨터 리소스를
잡아먹는 괴물인 Outlook 을 항상 켜두지 않기 때문에 종종 간단한 일정
관리를 위해서 '달력 모드'를 씁니다.

M-x calendar 를 입력하면 구동되는데 , 간단한 사용은 이동이야 일반적인
Emacs 커서 이동과 같고 , 일정 입력은 %HOME% 디렉토리에 diary 파일을
만들어 두면 '달력모드'에 일정을 추가할 수가 있게 됩니다. (%HOME% 은
특별히 지정하지 않았을 시에는 Window 에서는 "C:\" 입니다.)

달력에서 이벤트가 있는 위치로 이동하셔서 i-d (i 키를 누르고 d 키를
바로 누름) 키를 누르면 그날에 필요한 일정을 기입할 수가 있습니다. 다
쓰고 다이어리 파일을 저장시켜주시면 (C-xC-s) 일정이 기록됩니다.

특정한날에 기입된 일정이 보고 싶으시면 날짜로 커서를 옮기고 'd' 를
누르시면 그날의 일정이 보입니다. 전체적인 다이어리 목록을 보고
싶으시면 's' 를 누르시면 전체적인 일정 목록이 나타납니다.

기간동안 일어나는 일정을 적어두고 싶으면 (예를 들면 휴가) C-S(space)
를 시작점을 잡고 날짜를 이동시킨후에 i-b 를 클릭하시면 구간에 관한
일정을 적어둘 수가 있습니다.

또한 Emacs 처음 구동시 (전 출근하자 마자 구동시킵니다) 일정을 보고
싶으면 .emacs 파일에 간단하게 (diary) 항목만 추가 시켜주면 일정이
보입니다.

역시 emacs !! 그 프로그램 근처를 떠날 수 없게 만드는 마력이 있습니다. ^^


전세계의 Emacs 동지들을 볼 수가 있습니다. 약간 느리긴 하지만 재밌습니다. 다만 불만이 각각의 사용자들 (저같은 한국 / 아시아 사용자) 들을 위해서 대표 화면이 한국을 만드는 방법이 있으면 좋겠는데 말이죠. - 대충 두들겨 봤지만 안되는군여 ㅜ.ㅜ

한국에 꽤 사용자가 계시는거 같지만 등록들은 안하셨군요.

+ Recent posts