OSX Snow Leopard 에서 Rails 개발하게 됐습니다. 환경 세팅이 되야 본격적으로 개발을 진행 할 테니 이 글은 개발 환경 세팅에 관한 글입니다. 

1. Emacs Client 는 OSX 에서 사용하는 Aquamacs 입니다. Ruby-mode 는 내장된 것을 사용함 
2. 색 배정은 Color Theme 를 사용합니다. 
3. Rails Helper 는 Rinari 를 사용합니다. 
4. snippet 기능은 yasnippets 를 사용합니다. 
5. ruby-mode 에서 complete 기능은 ri-emacs 기능을 사용합니다. 


Aquamacs 는 설치가 되어 있다고 가정합니다. 

1. ~/Library/Preferences/Aquamacs Emacs/http://github.com/zhannes/Aquamacs-Emacs 에서 받은 파일들을 복사해 넣습니다. 



2. ~/Library/Preferences/Aquamacs Emacs/Preferences.el 을 열어서 다음과 같이 수정해 줍니다. 



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load ruby-mode.el                 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;loads ruby-mode.el - activate with M-x ruby-mode
(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ruby-mode.el")

; loads ruby mode when a .rb file is opened.
(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))
(setq auto-mode-alist  (cons '(".rhtml$" . rhtml-mode) auto-mode-alist))

(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ruby-electric.el")


rhtml 확장자 파일이면 rhtml-mode 로 연결될 수 있도록 수정합니다.




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load emacs-code-browser           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;Allows syntax highlighting to work, among other things

;; ;These lines are required for ECB
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/eieio")
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/speedbar")
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/semantic")
;; (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 "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ecb")
;; (require 'ecb)

ECB 관련해서는 전부 comment 처리합니다. ECB 버젼이 낮아서 최신 버젼을 깔아주는 것이 좋겠더군요. 
 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load rails-mode.el                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; needed for rails mode
(require 'snippet)
(require 'find-recursive)
; The rails require needs to go after ECB
; otherwise it loads a new incompatible speedbar
; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/emacs-rails")

; blik.it's rhtml enhancements
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/rhtml/")
;;(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/emacs-rails/")
(require 'nxml-mode)
;; (require 'rhtml-mode)
;;(require 'rails)


기존에 포함된 emacs-rails 헬퍼부분을 comment 처리합니다. 이렇게 하는 이유는 Rinari 를 헬퍼로 사용하기 위해서 입니다. 

rhtml-mode 는 사용하는 모드인데 .emacs 에서 최신버젼으로 설정해 주기 위해서 기존 것을 로딩하는 부분을 comment 처리해 줍니다.

;(load "~/Library/Preferences/Aquamacs Emacs/nxhtml/autostart.el")

nxhtml-mode 는 검은색을 바탕으로 하는 색 테마에는 어울리지가 않더군요. comment 처리해 줍니다. 


(cua-mode t) -> (cua-mode nil) 

로 수정해 줍니다. 

3. ri-emacs 는 http://rubyforge.org/projects/ri-emacs/ 에서 다운 받아서 "~/.emacs.d/ri-emacs" 안에 내용을 풀어줍니다. 
.emacs 안에 


(add-to-list 'load-path "~/.emacs.d/ri-emacs")
(autoload 'ri "~/.emacs.d/ri-emacs/ri-ruby.el" nil t)
(setq ri-ruby-script (expand-file-name "~/.emacs.d/ri-emacs/ri-emacs.rb"))


와 같이 세팅해 줍니다. 

4.yasnippet 은 http://code.google.com/p/yasnippet/ 에서 다운 받을 수 있습니다. 오른쪽 중간쯤에 필요한 파일들이 나열되어 있는데요. yasnippet-bundle-0.6.1c.el.tgz 파일을 받아서 푸시고 "~/.emacs.d/plugins" 에 복사합니다. 그리고 .emacs 파일에 



(add-to-list 'load-path
             "~/.emacs.d/plugins")
(require 'yasnippet-bundle)

와 같이 지정해 주면 됩니다. 

5. rhtml-modehttp://github.com/eschulte/rhtml 에서 다운 받아서 "~/.emacs.d/rhtml" 에 압축을 풀어 줍니다. 그리고 .emacs 에 



(add-to-list 'load-path
             "~/.emacs.d/rhtml")
(require 'rhtml-mode)
(add-hook 'rhtml-mode-hook
          (lambda () (rinari-launch)))

와 같이 설정해 줍니다. 

6. yasnippet 모드에서 Rails 를 지원하기 위한 추가 팩입니다. http://github.com/eschulte/yasnippets-rails 에서 다운 받아서  "~/.emacs.d/plugins" 에 풀어줍니다
. 그리고 .emacs 에 


(load-file "~/.emacs.d/plugins/setup.el")
(add-hook 'rinari-minor-mode-hook
          #'(lambda ()
              (setq yas/mode-symbol 'rails-mode)))

와 같이 설정해 줍니다. 

7. ECB 파일을 따로 설치해 줍니다. 굳이 따로 설명을 드리지 않겠습니다. 다만 제 .emacs 파일에서는 



(add-to-list 'load-path "~/.emacs.d/cedet/common")
(add-to-list 'load-path "~/.emacs.d/cedet/contrib")
(require 'cedet)

(add-to-list 'load-path
                   "~/.emacs.d/ecb")
(require 'ecb)


이렇게 설정되어 있습니다. 

8. Rinari 모드를 설치해야 합니다. 이건 ELPA 방식으로 설치하는 것이 가장 편합니다. *scrach* 버퍼로 이동해서 모드를 lisp-interaction-mode 로 변경합니다. 그리고 다음 과 같은 내용을 버퍼에 삽입합니다. 



(let ((buffer (url-retrieve-synchronously
      "http://tromey.com/elpa/package-install.el")))
  (save-excursion
    (set-buffer buffer)
    (goto-char (point-min))
    (re-search-forward "^$" nil 'move)
    (eval-region (point) (point-max))
    (kill-buffer (current-buffer))))

내용 마지막에 커서를 위치시키고 C-xC-e 를 눌러서 버퍼를 실행시킵니다. 그리고 M-x package-list-packages 를 실행합니다. 


인스톨하고 싶은 패키치에 마우스나 커서를 위치시키고 (여기서는 Rinari) 'I' 키로 인스톨 대상을 확인 시키고 'X' 키로 인스톨을 실행합니다. 

9. html.erb 확장자 를 rhtml 모드로 동작시키기 위해서 .emacs 에 다음과 같은 내용을 채워 줍니다. 



(setq auto-mode-alist
      (cons '("\\.rhtml$" . rhtml-mode)
   auto-mode-alist))
(setq auto-mode-alist
      (cons '("\\.erb$" . rhtml-mode)
   auto-mode-alist))
(setq auto-mode-alist
      (cons '("\\.html\\.erb$" . rhtml-mode)
   auto-mode-alist))

10. ruby-mode 에서 yasnippets 확장을 쓰기 위해서 TAB 키에 바인딩된 함수 기능을 풀어줍니다. .emacs 에서 다음 과 같은 내용을 추가합니다. 


(add-hook 'ruby-mode-hook
          #'(lambda ()
              (define-key ruby-mode-map (kbd "TAB") nil)
              (define-key ruby-mode-map [(control return)]  'ri-ruby-complete-symbol)
              (define-key ruby-mode-map [(shift return)]  'ri-ruby-show-args)
              ))



여기까지 세팅을 하면 기본적으로 잘 동작이 될 것입니다. yasnippets 에 자주 쓰는 기능들을 등록시켜가면서 (추후에 몇개 공개하겠음) Rails 개발을 하면 Emacs 사용자로서 보람도 느끼고 상용 Rails 개발툴이 안 부러울 것입니다. (왜냐하면 우리는 이맥션 이기 때문이지요 캬오!!) 그런데 발생하는 중대한 문제가 있습니다. rhtml-mode 로 yasnippets 로 사용하다 보면 erb block 안에 { } <-- 이게 들어갈 때 문제가 발생하기 시작합니다. unclosed tag 에러가 발생하기 시작하는데 이거 수정이 매우 어렵습니다. 처음에 정규표현식을 바꿔서 수정해 볼까 하다가, 나중에는 포기하고 그냥 rhtml-mode 자체를 수정하기로 결심했습니다. 

rhtml-mode.el 파일을 열어줍니다. 제 경우에는 ~/.emacs.d/rhtml/rhtml-mode.el 에 있습니다. 


(define-derived-mode rhtml-mode
;  html-mode "RHTML"
  html-helper-mode "RHTML"
  "Embedded Ruby Mode (RHTML)"
  (interactive)
  (abbrev-mode)
  ;; disable if you don't want it...
  (rhtml-activate-fontification))

html-mode "RHTML" 을 
html-helper-mode  "RHTML" 로 수정

rhtml-mode 가 html-mode 에서 상속받은 형태의 mode 였는데 이것을 html-helper-mode 에서 상속받게 바꾸어 주기만 하면 됩니다. 에 게다가 바꾸는 김에 조금 더 바꿔줍니다. rhtml-mode 일때 erb-block 을 highlight 시키는데 이게 눈에 상당히 거슬립니다. 

rhtml-fonts.el 파일을 열어줍니다. 제 경우에는 ~/.emacs.d/rhtml/rhtml-fonts.el 에 있습니다. 



(defface erb-face
  '((((class color) (min-colors 88) (background dark))
;     :background "#383838")
    :background "black")
    (((class color) (min-colors 88) (background light))
     ;; :background "azure")
     :background "snow2")
    (((class color) (min-colors 16) (background dark))
     :background "blue3")
    (((class color) (min-colors 16) (background light))
     :background "azure")
    (((class color) (min-colors 8))
     :background "blue")
    (((type tty) (class mono))
     :inverse-video t)
    (t :background "gray"))
  "Default inherited face for ERB tag body"
  :group 'rhtml-faces)

이렇게 수정해 줍니다. 즉 

:background "#383838") 을 
:background "black") 으로 수정

자 이제 마지막으로 erb block 이 시작되는 델리미터까지 깔끔하게 수정해 주기로 합니다. rhtml-fonts.el 파일에서 



;; (defface erb-out-delim-face
;;   `((((background dark)) :foreground "#aaffff" :background "#383838")
;;     (t (:inherit erb-delim-face :weight bold :foreground "darkred")))
;;   "Basic face for Ruby embedded into HTML"
;;   :group 'rhtml-faces)

(defface erb-out-delim-face
  `((((background dark)) :foreground "#aaffff" :background "black")
    (t (:inherit erb-delim-face :weight bold :foreground "darkred")))
  "Basic face for Ruby embedded into HTML"
  :group 'rhtml-faces)


전체를 comment 처리한 것으로 보이지만 :background "#383838" 부분을 "black" 으로 바꿔주기만 한 것입니다. 

조금 길지만 충분히 따라할 만한 설정입니다. 즐겁게 Rails 코딩하세요 ~ 



공부할겸 이런 기능 저런 기능을 만들어 보고 있습니다. (플래시라는 툴 접한지 4일째임) 

ActionScript3.0 을 이용해서 동적으로 버튼을 생성해서 구동시켜보는 예제입니다. 

저번 포스팅에서 쓰였던 "초 간단 사진 갤러리" 소스를 이용해서 변경해 보기로 하겠습니다. 추가 할 내용은 사진이 바뀔 때 보여주는 이미지 전환 효과를 ActionScript 에서 하드코딩 되어 있는 부분을 동적으로 버튼을 만들어서 클릭할 때마다 전환 효과를 변하게 해주는 기능을 추가해 줍니다. 




1. Stage 에서 보이는 모습을 그림과 같이 바꾸어 줍니다. 맨 윗부분에 버튼을 추가 하기 위해서 그림을 전체적으로 내려줬습니다. 




2. "Window" -> "Component" 를 선택하고 "User Interface" 에서 Button 을 끌어다가 Library 로 가져다 둡니다. 

이제 ActionScript 만 바꾸어 주면 됩니다. 

3. 첫번째 프레임의 "Actions" 레이어에서 오른쪽 마우스 클릭후 "Actions" 선택해 줍니다. (Windows 라면 "F9" 키 클릭 , OSX 라면 "option"-"F9" 입니다. OSX 와 해피해킹 키보드를 쓰고 있는데 두키를 동시에 눌러주는게 은근히 짜증납니다.)

4. 시작할때 전환 효과를 "Blinds" 방식으로 시작하게 바꿔줍니다. 

var transitionType:String = "Blinds"; 

5. 전환 효과에 쓰이는 단어들을 버튼 레이블로 활용 가능하게 배열에다가 저장해 둡니다. 

var labels:Array = new Array( "Blinds", "Fade", "Fly", "Iris", "Photo", "PixelDissolve", "Rotate", "Squeeze", "Wipe", "Zoom", "Random");

추가합니다. 

6. 전에 눌러뒀던 버튼을 알아야지 새로 버튼을 누를때 강조효과를 없애줄 수가 있습니다. 

var oldSelectButton:Button ;

추가합니다.

7. 동적으로 버튼을 생성해 줍니다. (문법은 정확히 알고 한다기 보다는 대충 이럴것이다 라고 생각해서 써봤습니다. 안돌아가면 돌아가는 예제들을 조금 찾아봐서 고쳤습니다)

for(var i=0; i < labels.length ; i++){
    var myButton:Button = new Button();

    myButton.label = labels[i] ; // 
    myButton.width = 80;
    var posY = 10;
    var posX = i;
    
    if (i > 5)
{
        posX = i - 6;
        posY = 40;
}
    myButton.move(20 + posX * (myButton.width + 10), posY);
    myButton.addEventListener(MouseEvent.CLICK , onMyButtonClick);

    addChild(myButton);
if (i == 0) {
myButton.emphasized = true;
oldSelectButton = myButton;
}
 }

세부적으로 살펴보자면 

myButton.width = 80; 

버튼 폭을 80으로 정해줍니다. 

   if (i > 5)
   {
      posX = i - 6;
      posY = 40;
   }
버튼이 6개를 넘어가면 한 줄 내려서 그려줍니다. 

 myButton.move(20 + posX * (myButton.width + 10), posY);
버튼을 정해진 위치로 이동시켜주는 부분입니다. 

 myButton.addEventListener(MouseEvent.CLICK , onMyButtonClick);
버튼을 클릭할때 발생시키는 이벤트 핸들러를 등록시켜줍니다. 

addChild(myButton);
실제로 화면에 그려주는 부분입니다.

if (i == 0) {
   myButton.emphasized = true;
   oldSelectButton = myButton;
}

첫번째 버튼 (Blinds 라는 라벨이 붙은 버튼)을 강조시키고 그 버튼을 선택했다고 저장합니다. 

8. 동적으로 생성한 버튼을 클릭했을 때의 구동 되는 핸들러 함수를 정의해 줍니다. 

function onMyButtonClick(evt:MouseEvent):void
{
    oldSelectButton.emphasized = false;
    var selButton:Button = Button(evt.target) ;
    transitionType = selButton.label ;
    selButton.emphasized = true;
    oldSelectButton = selButton;
}

전체를 아우르면서 설명을 하자면 

전에 선택된 버튼의 강조 효과를 없애고 , 이벤트가 발생한 버튼이 무엇인지 알아내서, 그 버튼의 레이블에 쓰여져 있는 전환효과로 바꾸고 (transitionType 이 전환 효과 지정해주는 것입니다) 지금 선택된 버튼을 강조시킵니다. 그리고 나중에 다른 버튼이 클릭될 때를 가정하여 지금 선택된 버튼을 oldSelectButton 에 저장해 둡니다. 

9. 완성된 모습입니다. 


상단의 버튼을 이거 저거 눌러보시면서 전환 효과가 변경되는 것을 확인하세요. 

역시나 소스는 Flash CS4 형식으로 올려둡니다. 



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 를 클릭해서 다른 페이지로 이동하는 예제를 보실 수 있습니다.


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

'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 형식으로 편지 보내는 방법"에 관해서 입니다. 그건 나중에...

osx 를 사용할 때, svn 을 사용해서 소스나 레파지토리에서 파일을 check out 을 하게 되면 영문 파일들은 잘 내려받고 서버와 동기화도 잘 되는 반면 한글 파일명을 가진 파일들은 오동작을 일으킵니다. 쉽고도 간단하게 확인이 가능한데

svn st


라고 입력을 하면 분명히 방금 checkout 을 한 경우라도 같은 파일이 레파지토리에 추가가 안되어 있다고 나옵니다. 이 문제는 osx 에서 쓰이는 utf-8 방식이 svn 과 달라서 발생하는 문제라고 합니다. 계속해서 reporting 되고 있는 문제긴 하지만 subversion 측에서 적용을 안하고 있는 것 같습니다. 최초 발생과 패치를 일본 프로그래머가 내놓은 시점이 1.4.4 버젼이였는데 현 버젼인 1.6.5 까지 아무런 적용이 안되고 있는 것을 보면 쉽게 추측이 가능합니다.

그 발생한 문제에 대한 이슈는 원문보기 에서 잘 나타나 있습니다. 그 달려있는 내용중에 보면 힌트가 나와 있습니다. 그 내용을 조금 정리하자면
curl -O
 http://www.opensource.apple.com/darwinsource/tarballs/other/subversion-16.tar.gz
curl -O http://www.opensource.apple.com/darwinsource/tarballs/other/neon-8.tar.gz
curl -O
http://subversion.tigris.org/nonav/issues/showattachment.cgi/780/utf8precompose_macosx.path

tar xzf subversion-16.tar.gz
tar xzf neon-8.tar.gz
patch -p0 < utf8precompose_macosx.path
mv neon-8/neon subversion-16/subversion
cd subversion-16/subversion
./configure --with-ssl
make
sudo make install

# patched version of svn will be installed on /usr/local/bin,
# make sure you have /usr/local/bin in your PATH environment variable.

이렇게 하라고 되어 있는데 , 실제로 잘 구동하지가 않습니다. 그래서 curl 명령 뒤에 붙어 있는
링크들을 클릭해서 직접 파일을 받아서 패치를 적용해 보았는데 제대로 동작을 하지를 않더군요. 게다가
버젼이 1.4.4 라 너무 낮습니다. 그래서 이 내용을 참조해서 1.6.5 버젼용 패치를 만들어 보았습니다.
이 패치는 오로지 osx Leopard 를 기준으로 합니다.

subversion 1.6.5 를 여기 를 클릭해서 내려받습니다. 적절한 곳에다 옮겨주시고

tar xzf subversion-1.6.5.tar.gz

하시고 그리고 패치파일을 받습니다. 그리고 패치를 적용해 줍니다.

patch -p0 < utf8_mac.patch
cd subversion-1.6.5/subversion
./configure
make
sudo make install


이제 문제가 해결된 svn client 를 소유하게 되앴군요.




+ Recent posts