공부할겸 이런 기능 저런 기능을 만들어 보고 있습니다. (플래시라는 툴 접한지 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 형식으로 올려둡니다. 



너무 간단해서 글 쓰기가 무색하지만 남겨보도록 하겠습니다. 클릭 몇번과 글만 수정해주면 되는 것입니다.

1. "File" -> "New" 를 눌러줍니다.





2. 그림과 같이 "Templates" 를 클릭하고 "Media Playback" 에서 "Advanced Photo Album" 을 선택해서 "OK" 를 클릭하면 Template 이 만들어 집니다. 만들어 졌으면 fla 파일로 한번 저장해줍니다. "File" -> "Save" 로 적당한 위치에 ("~/workspace/flash/PhotoAlbum/PhotoAlbum.fla" 저는 이 위치에 저장해줬음) 저장합니다.

3. 갤러리에 쓸 그림을 4장을 적당하게 구해줍니다. ( 2or0.jpg , conan.jpg , Girls_gene.jpg , mystery.jpg 가 제가 구한 이미지 파일입니다. 인터넷에서 대충 1024*768 로 검색해서 다운 받았음)
그림을 fla 가 위치한 곳에 가져다 둡니다. ("~/workspace/flash/PhotoAlbum/" 저는 당연히 여기 입니다.)






4. 이제 "Actions" 레이어의 1번 프레임에서 마우스 오른쪽 클릭후 "Actions" 를 선택합니다. 그러면 ActionScript 를 편집할 수 있는 창이 나옵니다. 그중에서
var hardcodedXML:String 부분을 다음과 같이 바꿔 줍니다.

var hardcodedXML:String="<photos><image title='2or0'>2or0.jpg</image><image title='conan'>conan.jpg</image><image title='Girls_gene'>Girls_gene.jpg</image><image title='Mystery'>mystery.jpg</image></photos>";

자 이제 모든 준비가 끝났습니다. ActionScript 를 저정하고 "File" -> "Publish Preview" -> "Flash" 를 선택합니다.



외형은 제가 조금 손대긴 했지만 거의 그대로 입니다.

사진이 바뀔 때 효과를 주고 싶다면 ActionScript (4번 앞부분과 동일하게 들어갈 수 있음) 에서
var transitionType:String
부분을 다음과 같이 바꿔 줍니다. (다른 효과들이 주석으로 쓰여져 있으니 적당한 것을 카피해서 넣으면 됩니다)

var transitionType:String = "PixelDissolve";


상용소스 찾으러 돌아다니지 마시고 그냥 플래시 안에 들어 있는 것을 활용하세요.

Flash CS4 버젼으로 저장한 소스 예제 입니다. 그림만 뺀 상태이니 제 포스트를 참조해서 XML 부분만 고쳐주시면 될 것입니다. CS4 에서는 이렇게 예제 만드는 것이 안보이더군요.





잠시 아이폰 (제가 쓰는 것은 아이팟 터치 1세대) 에서 개발을 해서 프로토 타입을 만들 일이 다시 생겨서 Xcode 를 다시 손대게 되었습니다.

예전 포스팅 에서 탈옥한 상태의 아이폰(아이팟 터치)에서 개발이 가능하게 만들어 줬었습니다. 그 당시 아이폰 OS 3.1.2 였었습니다. 문제 없이 개발을 잘 하고 프로토 타입 개발이 끝났었는데, 최근에 보니 iPhone SDK 가 4.0 으로 업그레이드가 되어 있더군요. 그래서 iPhone SDK 4.0 을 설치하고 개발을 할려고 하니 탈옥한 제 아이팟 터치에 프로그램이 인스톨이 안되는 문제가 생겼습니다. 아이팟 터치 1세대는 아이폰 OS 4.0 지원도 안해주더니 개발까지 속을 썩이더군요.

"Version 3.2.3 이 되버리면서 안되더군요"


예전 포스팅 과 동일하게 탈옥을 해주고 있는 상태니 XCode 설정만 바꾸어 줍니다.

  
   3-1. /Developer/Platforms/iPhoneOS.platform/Info.plist 파일을 열어서
   3-2. 52 번째 줄에서 XCiPhoneOSCodeSignContext 를 XCCodeSignContext 로 바꾸어 줍니다.
   3-3. 87 번째 줄에서 XCiPhoneOSCodeSignContext 를 XCCodeSignContext 로 바꾸어 줍니다.
   3-4. 파일 저장합니다.
   3-5. XCode 를 재시작합니다.

과거에 파일에서 바꿔준 부분을 다시 찾아서 바꾸어 줍니다.  라인수만 바뀌었다고 보시면 됩니다. 자 이렇게 까지 해 줬으니 제가 가지고 있는 Device (iPod touch 1G - 3.1.3)에 어플리케이션이 인스톨 되어야 하지만 안되더군요. 그래서 친구 iPod touce 2G 를 빌려서 인스톨 해보니 잘 되는 것 까지 확인해 봤습니다.

XCode 3.2.3 에서 개발해서 예전 iOS 버젼에서 돌려줄려고 하면 (특히 이번 경우에는 3.1.3 버젼) '빌드'는 상관이 없고 Deployment System 쪽만 수정해 주면 됩니다.

XCode - File - Get Info

순으로 메뉴에서 찾아서 눌러주시면



"Build" 탭에서 아래로 쭈욱 내려주다 보면 "iPhone OS Deployment Target" 에서 자신의 Device 에 설치되어 있는 OS 버젼을 선택해 주시면 됩니다.

돈은 없으신데 가지고 있는 디바이스에서 프로토타입을 개발하시고 싶은 분들에게 추천하고 싶은 방법입니다. 생각보다 힘들지도 않고요.




아이폰 개발을 Emacs 로 하시는 분들은 Object-c 의 그 살인적인 키워드 길이 (예를 들면 scheduledTimerWithTimeInterval 이런것) 에 당황하실 때가 있으리라고 생각합니다. XCode 내장된 에디터를 사용하시면 물론 편합니다. 하지만 Emacs 로 개발하시려면 여간 성가신게 아닌데요. Emacs 에 내장된 objc-mode 가 나쁘지는 않습니다. 괜찮게 쓰고 있는 편이긴 하지만 역시 부족한건 부족한 것입니다.

예컨대 scheduledTimerWithTimeInterval  이런 함수를 외워서 쓸려면 여간 부담되는 게 아닙니다. 자동 완성을 구현하고 싶기는 한데, 아직 귀찮아서 그쪽까지 공부할 여력은 안되더군요. 대신 제대로 쳤는지 확인하기 위해서라도 키워드의 색을 다르게 해 주고 싶더군요.

예전에 포스팅 했던 "Major 모드에 Keyword 추가하기" 의 변형입니다.

일단 결론입니다. 설정하면 다음과 같이 보입니다.

"누르면 커져요"


인디안레드 색으로 보이는게 추가한 키워드 입니다. 뭐 지금 당장 완벽한 것은 아니고요. 차차 알게되는 키워드를 추가할려고 생각중입니다. 남의 object-c 라이브러리를 얻어다 쓰는 처지라 어떤 것이 Object-c 원래 키워드인지 알아내는 과정도 필요해서 시간이 좀 걸릴 것 같습니다. (배경색으로는 칠판색을 선택해서 쓰고 있습니다. 그렇게 보기 싫어하던 칠판을 이 나이가 되서 텍스트 에디터에서 매번 보고 있습니다.)

실제로 키워드 추가하는 방법입니다.

1. 건드리는 프로그래밍 언어가 알게 모르게 많기 때문에 font-lock 을 전문적으로 하기 위해서 ~/.emacs.d/ 안에 관련 폴더를 한개 만들어 줬습니다. "~/.emacs.d/lang-font-lock" 으로 정해줬습니다.

2. 파일 한개를 생성합니다. 저는 "obj-c-add-font-lock.el" 로 만들어 줬습니다.

3. 그 내용입니다. (obj-c-add-font-lock.el)

(make-face 'cr-obj-c-keywords-face)

;; M-x list-color-display
(set-face-foreground 'cr-obj-c-keywords-face "IndianRed")

(font-lock-add-keywords 'objc-mode '(("\\<loadNibNamed\\|setNeedsDisplay\\|mainBundle\\|scheduledTimerWithTimeInterval\\>" . 'cr-obj-c-keywords-face)))
(font-lock-add-keywords 'objc-mode '(("\\<addSubview\\>" . 'cr-obj-c-keywords-face)))

(provide 'obj-c-add-font-lock)


윗 부분은 전에 올렸던 내용과 비슷합니다. loaddNibNamed 와  setNeedsDisplay , mainBundle, scheduledTimerWithTimeInterval 그리고 addSubview 를 우선 키워드로 등록해줬습니다. 마지막에 (provide 'obj-c-add-font-lock) 은 .emacs 에서 require 문을 쓰기 쉽게 해주려고 추가해줬습니다.

4. .emacs 에 다음과 같이 추가해서 로딩때 불러주기로 합니다.
(add-to-list 'load-path "~/.emacs.d/lang-font-lock")
(require 'obj-c-add-font-lock)

이제 키워드를 알아갈 때마다 obj-c-add-font-lock.el 파일에 추가해주시면 됩니다.





XCode 는 강력한 통합 IDE 입니다. 자체 에디터도 쓰기 편리하고 아이폰이나 맥 어플리케이션 개발에 최적화 되어 있습니다. 하지만 이맥스 유저들은 텍스트 에디팅 자체를 다른 툴에서 하라고 하면 몸에 두드러기가 발생하나 봅니다. (아 저만 그런가여? ㅎㅎ) 그래서 에디팅 자체를 Emacs 에서 할 수 있는 방법이 있습니다.


Preferences 에서 "text" 라고 되어 있는 부분을 외장 에디터로 설정할 수가 있습니다. 저 같은 경우에는 Aquamacs 로 지정해 줬습니다.

그리고 .emacs

(setq ns-pop-up-frames 'nil)


와 같이 추가해주면 소스 파일을 클릭했을 때 새 Frame 에서 창이 열리는 것을 막아줍니다.


드디어 올것이 오고 말았군요.
clojure 를 emacs 에서 slime 과 연결시키는 방법에 관한 것입니다. 물론 제가 쓰고 있는 osx snow leopard 에서 말이죠. 기존에 제가 쓰고 있던 환경은 emacs 에 slime 을 clbuild 버젼으로 연결시켜서 쓰고 있었습니다. 나름 편해서 애용하고 있었는데 이번에 clojure 를 연결 시켜야 해서 살짝 골치가 아프군요.

참고로 clbuild 를 쓰게 되면 slime 관련 설정 부분입니다. (.emacs 에 있음)

(setq load-path (cons "/Users/crazia/work/clbuild/source/slime" load-path))
(setq load-path (cons "/Users/crazia/work/clbuild/source/slime/contrib" load-path))
(setq slime-backend "/Users/crazia/work/clbuild/.swank-loader.lisp")
(setq inhibit-splash-screen t)
(load "/Users/crazia/work/clbuild/source/slime/slime")
(setq inferior-lisp-program "/Users/crazia/work/clbuild/clbuild lisp")
(setq slime-use-autodoc-mode nil)
(slime-setup '(slime-fancy slime-tramp slime-asdf))
(slime-require :swank-listener-hooks)

복잡하지요? 그래서 자동화 방법을 애용하기로 하겠습니다.

ELPA 라는 것이 있습니다. Emacs Lisp Package Archive 의 약자입니다. 말 그대로 Emacs 에서 쓰기 편하게
여러가지들을 제공하는 패키지 시스템이라고 할 수 있습니다.

http://tromey.com/elpa/install.html  여기에서 제공하는 방식으로 하면 인터페이스 버퍼가 뜹니다.

 
(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))))


이 내용을 *scratch* 버퍼에 가져다 두고 C-j 를 입력하면 된다고 쓰여져 있는데, AquaEmacs 의
경우에는 *scratch* 버퍼가 lisp-interaction-mode 로 설정되어 있지 않습니다.  따라서

M-x lisp-interaction-mode


바꾸시고 위의 내용을 복사해서 넣고 C-j 를 입력하세요. 반응이 만약 없다면 C-xC-e 로도 되는것 같더군요. 어찌 됐건 위의 코드를 실행하면 명령을 하나 쓸수가 있습니다.
M-x package-list-packages


를 입력하면 조금 시간이 걸리지만 설치할 수 있는 목록 리스트가 주르륵 나옵니다. 그중에서 swank-clojure 를 찾아서 'i' 를 눌러서 체크를 하시고 'x' 를 눌러서 설치가 됩니다.
그러면 .emacs 파일 아래쪽에 다음과 같은 코드가 자동으로 추가됩니다.

 (when
     (load
      (expand-file-name "~/.emacs.d/elpa/package.el"))
   (package-initialize))


package-initialize 가 실행된다면 기존에 설정되어 있는 slime 설정하고 충돌이 일어납니다. 멋지게 해결할 수 있는 방법이 없으니.. 귀찮지만 clbuild 로 웹 개발할 때와 클로져 공부 할 때를 구분시키는 방법으로 잠시동안 머물러야 겠습니다. 위에 있는 코드를 삭제하고 맨 위에 있는 clbuild 용 slime 설정 코드도 삭제해 줍니다.

(defun select-lisp-program (n)
  (interactive "n1:clbuild 2:clojure : (enter number)  ")
  (cond ((= n 1) (progn
                   (setq load-path (cons "/Users/crazia/work/clbuild/source/slime" load-path))
                   (setq load-path (cons "/Users/crazia/work/clbuild/source/slime/contrib" load-path))
                   (setq slime-backend "/Users/crazia/work/clbuild/.swank-loader.lisp")
                   (setq inhibit-splash-screen t)
                   (load "/Users/crazia/work/clbuild/source/slime/slime")
                   (setq inferior-lisp-program "/Users/crazia/work/clbuild/clbuild lisp")
                   ;;(setq inferior-lisp-program "clj")
                   (setq slime-use-autodoc-mode nil)
                   (slime-setup '(slime-fancy slime-tramp slime-asdf))
                   (slime-require :swank-listener-hooks)
                   (add-hook 'lisp-mode-hook (lambda () (slime-mode t)))
                   (add-hook 'slime-repl-mode-hook (lambda () (slime-mode t)))
                   (add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))

                   (define-key slime-mode-map (kbd "C-,") 'forward-sexp)
                   (define-key slime-mode-map (kbd "C-.") 'backward-sexp)
                   (define-key slime-mode-map (kbd "TAB") 'slime-indent-and-complete-symbol)
                   (define-key slime-mode-map (kbd "RET") 'paredit-newline)
                   (define-key slime-mode-map (kbd "<return>") 'paredit-newline)

                   (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
                   ))
        ((= n 2)
         (when
             (load (expand-file-name "~/.emacs.d/elpa/package.el"))
           (package-initialize))))
  )


그리고 두가지를 한 함수로 합쳐서 제공합니다. 위의 내용을 .emacs 에 추가하시면 다음 emacs 를 실행시키고 상황에 따라서

M-x select-lisp-program


명령으로 1 (clbuild) 나 2 (clojure) 로 개발 모드를 바꿔가면서 사용하실 수 있습니다. 물론 이렇게 귀찮게 안하고 lisp 을 clbuild 가 아닌 독자적으로 설치해서 적용하면 되지만 귀찮은걸 어쩌겠습니까 -0- clbuild 가 너무 편한걸..




새로운 것을 좋아하는 후배가 책까지 사주면서 보라고 해서 결국 Clojure를 설치하기로 했습니다.

Mac port 이용해서 Clojure 설치 하기

가장 쉬운 방법으로는 mac port 를 이용하는 방법이 있습니다.

sudo port install clojure


하면 너무나 손쉽게 설치됩니다. 하나 이러한 방법을 쓰면 나중에 Emacs 나 Slime 과 연동 설치할 때 귀찮아 지기 때문에 수동 설치를 하려고 마음을 먹었습니다.

Clojure 수동 설치 하기

참조 사이트: http://riddell.us/ClojureOnUbuntu.html

위에 링크한 사이트는 제가 여러모로 도움을 받는 사이트 입니다. 역시나 클로져도 우분투에 편하게 설치하는 방법이 잘 정리되어 있더군요. "그냥 사이트 보세요" 만큼 형편없는 도움말은 없겠지요. 그래서 거기 나와 있는 내용을 조금 제 형편에 맞게 정리해 볼까 합니다.

기본적으로 osx 는 자바가 설치되어 있습니다. 따로 설치해줄 필요 없으니 자바는 생략하고요. git 역시 설치되어 있다고 가정하지요. 제가 어떻게 설치했는지 기억이 안나는 군요..Maven 은 설치해준 기억이 없는데 설치되어 있는것을 보니 어영 부영 설치되어 있는 것 같습니다.

Ant 설치
 Ant 는 아마 기본으로 설치가 안되어 있을 것입니다.

~$ sudo port install ant


Clojure 설치

최신 버젼을 받아서 컴파일 해서 설치해 주면 됩니다.

~$ mkdir ~/work

~$ cd ~/work

~$ git clone git://github.com/richhickey/clojure.git

~$ cd clojure

~$ ant

~$ mkdir ~/.clojure

~$ cp clojure.jar ~/.clojure


저는 기본적으로 코드 관련 소스들은 work 밑에 저장하기 때문에 work 를 썼습니다. 코드 관련 폴더를 하나씩 만들어서 쓰시는 것을 추천합니다.

Clojure 테스트 하기

~$ cd ~/.clojure

~$ java -cp clojure.jar clojure.lang.Repl

user=> (+ 1 41)

42


Ctrl-d 를 누르면 REPL 을 빠져 나갑니다.

clojure-contrib 설치 하기

clojure-contrib 은 공식적인 클로져 확장 라이브러리 모음집 같은 것입니다.

~$ cd ~/work

~$ git clone git://github.com/richhickey/clojure-contrib.git

~$ cd clojure-contrib

~$ mvn package

~$ cp target/clojure-contrib*.jar ~/.clojure/clojure-contrib.jar


자 이제는 편하게 REPL 로 들어가는 스크립트를 만드는 순서 입니다.

~/.bash_profile 아래쪽에 다음과 같은 내용을 채워 넣습니다.

export CLOJURE_EXT=~/.clojure

PATH=$PATH:~/work/clojure-contrib/launchers/bash

alias clj=clj-env-dir


저장하고 Terminal 창을 종료했다가 다시 열어서 테스트를 해 줍니다.

~$ clj
Clojure 1.2.0-master-SNAPSHOT
user=> (System/getProperty "java.class.path")
"/Users/crazia/.clojure/clojure-contrib.jar:/Users/crazia/.clojure/clojure.jar"
user=>


위처럼 clojure.jar 와 clojure-contrib.jar 의 위치가 표시되면 만사 OK 입니다.

Clojure 와 clojure-contrib 의 업데이트는 굳이 설명할 필요가 없을 듯 하여 생략합니다.

Flex 로 개발할 일이 회사내에서 생길꺼 같아서 OSX 에서 개발환경 세팅을 하는 중이였습니다.
Flex SDK 에서 받을 수 있으며 적당한 곳에 옮겨주고

.bash_profile 에다가

export PATH=$ANDROID_SDK_ROOT/tools:/Users/crazia/work/flex_sdk_4/bin:/usr/local/bin:$PATH


로 추가해 주면 됩니다. 색이 진한 부분이 "/Users/crazia/work/flex_sdk_4" 가 flex sdk 를 복사해준 부분입니다. 여기까지만 하면 개발환경은 세팅 완료 입니다. (또 지루한 emacs 설정이 있지만 그건 나중에 다루기로 하겠습니다)

그런데 문제가 생겼습니다. Terminal 창을 열고

mxmlc


라고 입력하니 메시지들이 전부 깨지는 것입니다. encoding 문제라고 바로 직감적으로 알았으나 2시간의 걸친 구글링 동안 아무것도 나오지 않는 것입니다. 결국 어찌 어찌 뒤지다 보니 "flex_sdk_4/lib/" 밑에 mxmlc.jar 파일과 mxmlc_ko.jar 파일이 존재하더군요.

OSX 세팅중에서 "언어&텍스트" 에서 선호하는 언어 순서를 "English"로 바꾸니 메시지가 제대로 출력되는 것을 보고 시스템에서 정하고 있는 언어 순서대로 찾을것 같다고 가정을 하고 다시 원래대로 "한국어" 위주로 바꾸고 (영어로 출력되는게 싫습니다. -0-)

mxmlc_ko.jar 를 혹시 몰라서 mxmlc_ko.jar.bak 으로 변경해줬습니다.

역시나 한국 로케일 관련 jar 파일을 찾지 못하니 영문 로케일인 기본으로 출력이 되는 것을 확인하실 수 있습니다. 이 간단한 설정을 찾느라 안타까운 내 시간이 화살과도 같이 흘러갔습니다.





Weblocks 로 Web Programming 을 하다보면 자동으로 생성되는 Tag 들이 보기 싫을 때가 있습니다.

자동으로 만들어 주면서 관련된 javascript, stylesheet 를 연결해서 최소한도로 손을 안대도 코딩이 되게 할려는 목적으로 만들어서  편하기는 한데, 공부를 하는 차원에서는 이 태그 저 태그 붙어서 정신 없는 것보다 깔끔하게 내가 원하는 만큼의 HTML을 생성하는 것이 여러모로 편리할 때가 많습니다. 이러한 방법을 알아보기로 하지요.

http://uint32t.blogspot.com/2008/01/weblocks-starting-with-blank-slate.html 조금 예전 자료긴 하지만 충분히 참조할 만합니다.

자동으로 붙어 나오는 tag 는 page-wrapper , page-extra-top , page-extra-bottom 등 3개씩 붙어 나와서 보기 흉합니다. 이렇게 붙어 나오는 이유는

weblocks/src/page-template.lisp 안에 있는 render-page-body 함수 때문입니다.

(defmethod render-page-body ((app weblocks-webapp) body-string)
  "Default page-body rendering method"
  (with-html
    (:div :class "page-wrapper"
      (render-extra-tags "page-extra-top-" 3)
      (htm (str body-string))
      (render-extra-tags "page-extra-bottom-" 3))))

보시면 weblocks-webapp 객체의 method 인 render-page-body 입니다. 태그를 붙이는 코드의 내용이 확인됩니다. 그렇다면 이 부분을 수정해서 재컴파일 하면 되는 것이냐.. 하는 것인데. 절대 그럴 필요 없습니다. lisp 의 막강한 기능인 함수 오버라이딩을 바로 해줄 수 있습니다.

weblocks 으로 만들어준 temp-cloud 라는 프로젝트에서 temp-cloud/src/init-session.lisp 파일을 열어줍니다. 최 상단에 있는 (in-package :temp-cloud) 구문 아래에 바로 오버라이딩 함수를 추가해줍니다.

(in-package :temp-cloud)


(defmethod render-page-body ((app weblocks-webapp) body-string)
  "Default page-body rendering method"
  (with-html
          (cl-who:htm (str body-string))))


단지 이렇게 해준 것만으로 깔끔하게 태그가 사라진 결과물을 볼 수 있습니다.

Android 를 개발하기에 제일 좋은 환경은 Eclipse 입니다.  android-sdk 에서 따로 plug-in 을 제공하고 공식문서에서 기본으로 설명하는 것이기 때문에 가장 좋은 환경이라고 할 수 있습니다. 이클립스는 기본적으로 진화된 Emacs 라고 불릴정도로 많은 기능과 다양한 플러그-인 쉬운 UI 인터페이스등 정말 좋은 IDE라고 할 수 있습니다.

그럼에도 불구하고 나는 독하게 Emacs 를 쓰시겠다고 하는 분들만 아래에 쓰여질 내용을 보시면 됩니다.

1.  Emacs 를 Android 개발 환경으로 쓸려고 하면 android-mode 를 설치해야 합니다. git 가 설치되어 있다고 가정하고

git clone git://github.com/remvee/android-mode.git


과 같이 입력합니다. 그러면 android-mode 라는 디렉토리가 생깁니다. 제 경우에는 그 디렉토리를 "~/.emacs.d/android-mode" 로 복사해줬습니다.

2. 그리고  저번 포스팅인 "[Android] Snow Leopard 에 SDK 설치하기" 에서 설치됐던 Android SDK 가 위치한 곳 (제 경우에는 저번 포스트에서 "~/work/android" 였습니다.) "PATH_ANDROID_SDK/tools/lib"밀에 있는 android.el 을 "~/.emacs.d/android-mode" 밑에 같이 복사해 줍니다.

3. 그리고  .emacs 파일에 다음과 같이 추가해 줍니다.

(add-to-list 'load-path "~/.emacs.d/android-mode")
(require 'android-mode)
(require 'android)
(setq android-mode-sdk-dir "~/work/android")

이렇게 하면 android-mode 의 기능과 android 에서 자체적으로 지원하는 android 기능을 두가지 다 쓸 수가 있습니다.

이제 실제로 프로젝트를 만들어 보기로 하지요. http://developer.android.com/guide/developing/other-ide.html 이클립스를 쓰지 않고 다른 IDE 를 쓸 경우에 참조해야 하는 곳입니다. 그중에서 프로젝트 만드는 것을 참조하기로 하겠습니다.

android create project \
--target <target_ID> \
--name <your_project_name> \
--path path/to/your/project \
--activity <your_activity_name> \
--package <your_package_namespace>
라는 식으로 만들게 되어 있습니다. 다 일반적인 내용이고 실제로 몇번 만들어 보시면 어떤식으로 돌아가는지 아실 수 있습니다. 참조한 사이트에서 설명도 충분하고요. 다만 target 을 실제로 어떤것을 써야 할지 감이 안오실 수 있을 실텐데요. Terminal 창을 한개 여시고

android list targets.

라고 입력하시면 target 에 대한 설명이 자세히 나옵니다. 저번 포스팅 "[Android] Snow Leopard 에 SDK 설치하기" 에서 만들어본 testMachine 이라고 하는 AVD 는 타겟이 "10" 입니다.

이렇게 만들어진 프로젝트에서 "path/to/your/project/<your_project_name>/src/<your_package_namespace 를 갈라서 디렉토리로표현>/<your_activity_name>.java" 파일을 열어서

M-x

android-ant-install

라고 입력하시면 프로젝트가 컴파일이 되고 알아서 인스톨이 됩니다.

android-mode 에서 쓸만한 단축키를 보여드리겠습니다.

"\C-c \C-c" 를 입력한 상태에서

   
    ("d" . android-start-ddms)
    ("e" . android-start-emulator)
    ("l" . android-logcat)
    ("c" . android-ant-compile)
    ("i" . android-ant-install)
    ("r" . android-ant-reinstall)
    ("u" . android-ant-uninstall)

단축키에 따라서 실행되는 명령들 입니다.

여기까지는 쉽게 따라할 수 있는 부분입니다. 이제부터가 어려운데 특히나 Snow Leopard 에 설치하는 것이라 더 힘들었던것 같습니다.

위에 나와 있는 내용대로 포스팅을 하면 그냥 노트패드 같은 에디터에서 개발하는 것과 별 차이가 없습니다. 기본적으로 code generation 이나 code auto-completion 등이 되지 않으면 쓰기에 많이 불편합니다. 그래서 JDEE (Java Development Environment for Emacs) 를 설치해서 사용하게 됩니다.

Emacs + JDEE 가 딱 자바용 Eclipse 라고 보시면 됩니다. 다시금 Eclipse 를 설치해서 개발하면 편하다는 것을 말씀드리고 싶습니다.

1. JDEE 를 다운 받습니다. http://sourceforge.net/projects/jdee/files/ 에서 받으시고. 2.4.0.1 버젼을 받으시면 됩니다. 압축을 푸시고 "~/.emacs.d/jdee-2.4.0.1/" 로 복사해 두시면 됩니다.

2. ELIB 이 필요합니다. JDEE 를 받은곳에 포함되어 있습니다. http://sourceforge.net/projects/jdee/files/ 에서 받으시고 버젼은 1.0 입니다. elib-1.0.zip 을 받으시고 압축풀고 "~/.emacs.d/elib-1.0/" 으로 복사해 두시면 됩니다.

3. CEDET (Collection of Emacs Development Environment Tools) 이 필요합니다. http://cedet.sourceforge.net/ 에서 다운이 가능합니다. http://sourceforge.net/projects/cedet/files/ 에서 cedet-1.0pre7.tar.gz 을 다운 받으시고 압축을 푸신 다음에 "~/.emacs.d/cedet/" 으로 복사합니다.

4. USER_HOME 에 (제 경우에는 /Users/crazia ) 에 있는 .bash_profile 파일을 열고 다음과 같은 내용을 추가합니다.

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
export JAVAC=$JAVA_HOME/bin/java

저장하고 Terminal 창을 한개 열고

source .bash_profile


이라고 바로 효과가 나타나게 해 줍니다.

5. 이제 .emacs 파일에 다음과 같은 내용을 추가해 줍니다.  (추가 설명을 해 가면서 붙이기 하겠습니다)

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

JDEE 는 기본적으로 CEDET 을 필요로 합니다. CEDET 을 설정하는 부분입니다.

(add-to-list 'load-path "~/.emacs.d/elib-1.0")
(add-to-list 'load-path "~/.emacs.d/jdee-2.4.0.1/lisp")
(require 'jde)

elib 과 jdee 의 path 를 추가해 주는 부분입니다. 그리고 jde 를 불러줍니다.

(setq jde-run-mode-hook t)

이상하게 jde-mode-hook 이 안불려지는 버그가 있더군요. 그래서 추가해 줍니다. 강제적으로 mode-hook 을 불러서 실행해줍니다.

(setq
 jde-sourcepath '( "/Users/crazia/work/android/project" )
 jde-db-option-connect-socket '(nil "28380")
 jde-jdk-registry (quote (
              ("1.5" . "/System/Library/Frameworks/JavaVM.framework/Versions/1.5/")
              ("1.6" . "/System/Library/Frameworks/JavaVM.framework/Versions/1.6/")
              )
             )
 jde-jdk `("1.6")
)

jdk 버젼을 조정할 수 있게 구현해 주는 부분입니다. OSX 다 보니 java 가 깔려 있는 곳의 디렉토리가 일반적인 unix 와는 조금 다릅니다.

;; cua-mode 끄기
(cua-mode nil)

\C-RET 은 정말 편하게 쓸 수 있는 단축키 인데 cua-mode 가 항상 점유하고 있으면서 바꿔지지도 않습니다. 아예 cua-mode 를 꺼버리면 편하게 쓸 수 있습니다.

(add-hook 'jde-mode-hook
          (lambda()
            (define-key jde-mode-map [(control return)] 'jde-complete)
        (define-key jde-mode-map [(meta return)] 'jde-complete-minibuf)
        (define-key jde-mode-map [(shift return)] 'jde-complete-in-line)))

자동 완성 단축키를 지정합니다. 제일 많이 쓰는 것이 "\C-RET" 다 보니 그 단축키를 jde-complete 함수에 묶었습니다.

이제부터 Emacs 에서 Android 개발이 쉬워지게 세팅을 끝냈습니다.


+ Recent posts