최근에 다시 clojurescript 를 이용해서 작업할 일이 생겼습니다. javascript 는 편리하긴 하지만 구현하는데 재미가 없다는 심각한 결점이 있기 때문입니다. 게다가 최근 lein-figwheel 이라는 편리한 툴이 나와서 정말 편하게 작업을 할 수가 있습니다. 다만 lein figwheel 을 하면 불편하게도 console 에서 작업을 해야 하기 때문에 emacs 의 편리한 기능을 못써서 안타깝습니다. 따라서 nRepl 을 이용해서 편리하게 작업하는 방법을 소개시켜드릴까 합니다.

  1. CIDER 와 clojure-mode 를 설치해야 한다.

    package-install 명령을 이용하면 쉽게 설치가 가능하다.

  2. leiningen plugins 를 설정해야 한다.
    ~.lein/profiles.clj
    

    를 열어서 다음과 같이 추가해 준다. (2015. 12. 29 현재 0.10.0 버젼이 최신)

    {:user {:plugins [[cider/cider-nrepl "0.10.0"]]}}
    
  3. 개별 project.clj 설정에
    :figwheel {:nrepl-port 7002}
    

    내용이 defproject 와 같은 레벨로 추가가 되어 있어야 한다.

  4. .emacs 파일에
    (add-hook 'cider-connected-hook '(lambda ()
                              (cider-interactive-eval
                               "(use 'figwheel-sidecar.repl-api)\n(cljs-repl)\n")))
    
    (defun figwheel-connect ()
    (interactive)
    (cider-connect "localhost" "7002"))
    
  5. figwheel-connect 명령을 실행 프로젝트 루트 디렉토리에서
    lein figwheel
    

    을 실행해서 띄우고 , M-x figwheel-connect 를 이용해서 접속한다.

저는 습관처럼 gradle 을 command line 에서 사용합니다. 다만 최근 무지하게 느려진 느낌입니다. 자성의 움직임이 있었는지 최근 gradle 도 daemon 모드를 말하는 군요. 세팅은 무지하게 쉽습니다. 


touch ~/.gradle/gradle.properties && echo "org.gradle.daemon=true" >> ~/.gradle/gradle.properties

이렇게만 하면 비약적으로 빌드 속도가 올라간다는데 저는 사실 잘 모르겠습니다. -ㅅ-  Android Studio 도 빨라지는지는 테스트 해봐야 할 듯합니다. 


  세월이 흘러감에 따라서 변하지 않는 것이 없거늘 어찌 Emacs 가 변하지 않으리라 생각했던가..

말 그대로 입니다. 세월이 흘러 흘러 Emacs 가 24.x 대가 나오기 시작한지도 꽤 여러해가 지났습니다. 그런데 저는 과거의 설정파일을 그대로 사용하고 있었더군요. 문제 없이 사용하고 있었던 이유는 최근 쓰고 있던 OSX 가 버젼업이 되면서 한글 '나눔고딕'이 기본으로 포함되서 별 의도하지 않게 사용하고 있었습니다.

최근 Clojure 에 관한 Online 책을 보다가 그 저자가 설정한 Emacs 설정파일을 제꺼에 포함시키는 과정에서 기본 폰트 크기를 변경시키는 로직이 있는데 제가 처음 보는 함수를 쓰고 있더군요. 찾아보니 제가 기존 설정파일에서 쓰고 있었던 폰트 설정 방법은 사라졌더군요.

예전의 폰트 설정 방법 의 내용이 현행화를 필요로 한다는 점입니다.

(set-face-font 'default "Monaco-10")
(set-fontset-font "fontset-default" '(#x1100 . #xffdc)
                  '("NanumGothicOTF" . "iso10646-1"))
(set-fontset-font "fontset-default" '(#xe0bc . #xf66e)
                  '("NanumGothicOTF" . "iso10646-1"))
(set-fontset-font "fontset-default" 'kana
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
(set-fontset-font "fontset-default" 'han
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
(set-fontset-font "fontset-default" 'japanese-jisx0208
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
(set-fontset-font "fontset-default" 'katakana-jisx0201
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))

이 방법이 아주 틀린건 아니지만 살짝 달라졌습니다. 한자나 일본어 설정은 동일하게 동작하는 것 같습니다. 다만 기본 폰트 설정 방법이 변했습니다.

(when (eq system-type 'darwin)

  ;; default Latin font (e.g. Consolas)
  ;; but I use Monaco 
  (set-face-attribute 'default nil :family "Monaco")

  ;; default font size (point * 10)
  ;;
  ;; WARNING!  Depending on the default font,
  ;; if the size is not supported very well, the frame will be clipped
  ;; so that the beginning of the buffer may not be visible correctly. 
  (set-face-attribute 'default nil :height 130)

  ;; use specific font for Korean charset.
  ;; if you want to use different font size for specific charset,
  ;; add :size POINT-SIZE in the font-spec.
  (set-fontset-font t 'hangul (font-spec :name "NanumGothicCoding"))

  ;; you may want to add different for other charset in this way.
  )

이 소스는 KLDP 의 유명한 Emacs 고수이신 cinsk 님의 설정 내용입니다. 제가 좋아하는 폰트로 살짝 고쳤습니다. 다시 말씀드리지만 이건 Emacs 24.x 의 설정 방법입니다.

그리고 "NanumGothicCoding" 폰트는 OSX 에 기본으로 설치가 되어 있지 않습니다. 기본으로 설치 되어 있는 폰트는 "Nanum Gothic" 입니다. 일부러 한글 폰트를 "NanumGothicCoding" 으로 설정한 이유는 나중에 설명하기로 하고 일단 '나눔고딕코딩' 폰트를 다운 받아야 합니다.

나눔고딕코딩 폰트 받기

받아서 서체관리자를 이용해서 설치해 주시고 위의 설정을 .emacs 에 설정해 주면 영문:Monaco , 한글:나눔고딕코딩 으로 설정이 됩니다.

여기까지가 Emacs 24.x 에서 한글 폰트 설정하는 방법이였고. 이제 다른 목적인 Org Mode 에서 한글 테이블 만들 때 표 제대로 보이는 방법에 대해서 이야기 하겠습니다.

Org Mode 는 Ascii 형식의 테이블을 지원합니다. 이게 은근히 편해서 종종 쓰곤하는데 심각한 문제가 있습니다. 한글을 쓰면 테이블 표에 있는 셀(Cell) 크기가 맞질 않습니다. 그래서 궁여지책으로 영문으로 테이블 표를 작성해서 쓰곤 했는데. Emacs 24.x 에 한글을 설정하고 나서는 갑자기 한글로 된 표를 쓰고 싶어졌습니다.

온갖 삽질끝에 이유를 알아냈는데 (어떻게 보면 당연한 거지만)

기본적으로 테이블이 깨지는 이유는 한글 - 영문 폰트의 width 의 비율이 일치하지 않기 때문입니다. 즉 이상적으로는 영문 2자에 한글 1자의 폭이 일치해야 하지만 미묘하게 한글 1자의 폭이 작습니다.

따라서 폰트 크기를 재 설정해 주면 간단하게 해결 됩니다. (이 간단하게 라는 말을 쓰기 위해 고생한 걸 생각하면…)

높이 비율로 크기를 맞춰야 하는데 'Monaco' 크기가 (:height)가 130 일때 'Nanum Gothic' 은 size 가 17 , 'NanumGothicCoding' 은 size 가 16 이어야지 비율이 맞습니다. 실제로 적용은 face-font-rescale-alist 변수를 이용해서 적용해 줍니다.

(setq face-font-rescale-alist
      '((".*hiragino.*" . 1.2)
        ("NanumGothicCoding" . 1.2307692307692308)))

와 같이 .emacs 에 설정을 넣어주면 됩니다.


위와 같이 테이블이 깨지지 않고 보여집니다. 


https://www.gnu.org/software/emacs/manual/html_node/eintr/


에 관련된 내용이 잘 정리되어 있습니다. 프로그램을 잘 모른다고 하는 사람을 대상으로 쓰여졌다고 하는데, 제 생각에는 '글쎄요' 입니다. 물론 이 걸 보고 고수가 된 비전공자가 존재한다는 것이 놀라울 따름입니다. 필리핀 인가 싱가폴에서 사는 처자인데 Emacs 의 org-mode 에 반해서 Emacs 를 배우고 Emacs Lisp 프로그래밍까지 잘하게 된 전설적인 케이스가 있습니다. 제대로 Emacs 를 쓰기 위해서는 한번 읽어볼 만은 하지만.. '글쎄요...' 


http://ergoemacs.org/emacs/elisp.html


차라리 실용적으로 배우실려면 위의 링크를 추천드립니다. 온갖 간단한 실용적인 예제로 도배되어 있기 때문에 오히려 더 쉽게 접근이 가능합니다. 



maven 을 쓰고 있다면 간단한 명령으로 바로 tomcat 에 바로 디플로이 해서 테스트 해볼 수 있습니다.

mvn tomcat:run

만 하면 바로 실행할 수가 있습니다. 그런데 맘에 들지 않습니다. application root 때문입니다. http://localhost:8080/{war_name} 으로 실행이 되기 때문입니다. http://localhost:8080 으로 바꾸고 싶다면 간단하게 옵션을 줘서 바꿀 수가 있습니다.

mvn tomcat:run -Dmaven.tomcat.path=/

역시 간단하게 됩니다. 따로 옵션 주고 싶은 것도 추가해 주면 됩니다.

mvn tomcat:run -Dspring.profiles.active=local -Dmaven.tomcat.path=/

그런데 위와 같이 실행하면 tomcat version 6 으로 동작합니다. 최근에는 tomcat version 7 을 많이 쓰지요. tomcat 을 tomcat7 으로 바꿔서 명령을 날리면 동작하지 않습니다. 역시 간단하게 바꾸는 방법이 있습니다. 두가지 방법이 있지만 IDE 를 사용해서 개발하는 팀원하고 맞추기 위해서는 (저는 기본적으로 IDE 는 프로젝트 설정할 때만 사용합니다) pom.xml 을 바꾸는 것을 올바른 방법이 아니라고 생각해서 다른 방법을 택합니다.

OSX 기준으로 maven 을 brew 를 이용해서 깔았다면 /usr/local/Cellar/maven/3.3.1/libexec/conf/settings.xml 를 열어서

<pluginGroups>
  <!-- pluginGroup
   | Specifies a further group identifier to use for plugin lookup.
  <pluginGroup>com.your.plugins</pluginGroup>
  -->
  <pluginGroup>org.apache.tomcat.maven</pluginGroup>
</pluginGroups>

와 같은 식으로 <pluginGroup>org.apache.tomcat.maven</pluginGroup> 를 추가해 줍니다. 그리고 다시

mvn tomcat7:run

와 같이 실행하면 tomcat version 7 으로 실행이 되는 것을 확인할 수가 있습니다.

처음 스위프트 (Swift : 혹 수입푸드 라고 부르는 사람들도 있음 ㅋㅋ) 개념을 보았을 때, VM (Virtual Machine) 같은 개념으로 여겼습니다. '뭐 또 빠르게 개발은 될 지 모르겠으나 동작은 느린애가 되겠군' 라고 생각하며 안 보고 있다가. 최근에 보니 이게 컴파일러용 언어였더군요. 플레이그라운드(Playground) 개념은 잽싸게 컴파일 해서 그 결과를 보여줘서 interactive 하게 보일지 모르지만 실은 컴파일 언어였습니다. 


개념이 재미 있는데다가 컴파일된 바이너리가 기존의 Object-C 언어로 만들어진 것보다 속도가 2.8 배가 빠르다는 것을 보고 관심이 가더군요. 그래서 언어 개요를 가볍게 살펴봤습니다. 

iOS 기기를 가지고 있으면 iBooks 에서 공짜로 프로그래밍 언어에 대해서 설명한 책을 받아볼 수가 있습니다. 물론 그런것이 없는 분들을 위해서 사이트에서도 제공됩니다. 그리고 정말 훌륭하신 분들이 해석해서 사이트에 올려둔 곳도 존재하더군요. 


Swift 언어 가이드 


에서 참조하실 수 있습니다. 저는 프로그래밍 언어 자체에 노력을 많이 기울이는 편은 아닙니다. 애초에 Swift 가 필요한 이유는 iOS 나 Cocoa 용 앱을 빠르게 만들기 위함이 아니겠습니까? 그렇다면 실전에서 익히고 어렵거나 이해가 안가는 부분을 찾아서 공부하는 것이 조금 더 '실용적' 이라고 생각하기 때문입니다. (실은 예전에 프로그래밍 언어 그 자체만 공부하다가 지치거나 중간에 흥미가 떨어져서 응용해 보지도 못한 적이 여러번 있기 때문입니다. - 마치 영어를 공부해야 하는데 어떻게 하면 영어 공부를 잘하는 법을 공부하는 경우와 비슷하다고 하겠습니다) 


그래서 실전 튜토리얼을 찾아보다가 찾은 정말 훌륭한 동영상이 있더군요. 비록 한글이나 한국어로 된 것은 아니긴 하지만 기술 영어를 사용하고 있어서 쉽게 알아먹을 수가 있습니다. 영어도 공부하고 Swift 도 공부하고 1석 2조!! 


프로그래밍 경험 없는 사람이 쉽게 iOS 용 앱 (다 만들면 게임이 만들어 집니다) 만들기 


iOS 용 앱을 만들어 볼려고 했는데 엄두가 안 나신분 들에게 강력 추천합니다. 내용중에 보면 MVC 패턴과 XCode 툴에 관한 설명등 들어두면 좋은 내용들 다수가 들어 있습니다. 



안드로이드 개발하다 보면 별 문제는 없어보일지 모르지만 안드로이드가 네트워크 인터페이스를 여러개 가지기 때문에 발생하는 문제가 있습니다. 갤럭시 s3 의 경우에는 LTE, 3GS, WI-FI 등 세개의 인터페이스가 있습니다. 그런데 이런 인터페이스들이 사용을 안하면 비활성화 되어 있으면 사용하기 편할텐데 사용 안하더라도 활성화가 되어 있는 데다가 잘못된 (구동하지 않는) IP 주소를 가지고 있어서 문제가 됩니다.

무슨 문제가 있겠어? 라고 하지만 순수 자바 (Pure Java) 로 네트워크 레이어를 구현할 때, 만들어진 라이브러리를 안드로이드로 포팅시 발생하는 문제입니다. 이를 해결하기 위한 방법입니다.

인터넷에 연결이 되어 있고 (LTE,3GS,WI-FI 상관하지 않고) 접속되어 있는 상태에서의 가지고 있는 IP 주소를 가져오는 방법입니다.

Socket socket = new Socket("www.google.com", 80);
String localAddr = socket.getLocalAddress().getHostAddress();
Log.d(TAG, "local address is : " + localAddr);

생각보다 자주 부딛히는 문제라서 정리합니다.





Emacs 를 mac 에서 사용하다 보면 몇가지 불편한게 있습니다. 대표적으로 ClipBoard 와 연동문제가 있습니다. 그러다가 Emacs for OSX 라는 것이 있더군요.

https://github.com/railwaycat/emacs-mac-port

위 사이트에서 자세한 설명은 되어 있지만 언제 끝날지 모르는 프로젝트더군요. 설명은 저기서 참조하고 소스는 실제로 작업하는 일본 프로그래머의 사설 git 레파지토리에서 받아서 컴파일을 하면 됩니다.

http://www.math.s.chiba-u.ac.jp/~mituharu/emacs-mac.git

이게 그 사설 git 레파지토리 입니다. 이걸 받으셔서 제가 예전에 올렸던 OSX 에서 컴파일해서 사용하기 를 참조해서 컴파일 하시면 됩니다.

$ ./configure --with-mac

옵션을 줘야 mac용으로 컴파일 됩니다. 그리고 결과는 ./build 안에 있더군요. 아이콘이 멋지게 바껴있는 것을 확인하실 수가 있습니다. 다만 사용하시다 보면 한글 디렉토리명이 깨지는 경우가 있습니다. 이건 예전에 제가 Subversion 에서 한글 파일을 인식못하는 문제 에서 썼듯이 UTF8이 종류가 달라서 그러한 문제가 발생합니다. 이걸 해결 하기 위해서 원작자에게 메일로 문의했더니 답변을 주더군요. (감사 감사)


이렇게 파일 이름들이 깨지는 현상입니다.


.emacs 파일안에다가

(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)

와 같은 식으로 적어주면 문제가 해결이 됩니다.


게임을 만들어 보는 것은 컴퓨터 과학쪽에 공부하는 몇몇분들에게는 꼭 해보고 싶은 일일것입니다. 물론 저도 예외는 아니여서 학창시절에 이리 저리 궁리를 해가면서 게임을 만들어 본적이 있었습니다. 아 그리고 어떤 게임회사에서는 실제로 MMORPG 게임 서버를 실제로 만든적이 있습니다. 나중에 그 게임이 런칭 됐을 때 무척 기뻤습니다. 비록 그 회사를 나왔지만 말이죠.

최근에 다시 한번 게임을 만들고 싶어서 - 이런 욕망이 왜 정말 지옥같이 바쁠때 솟아 나는지 모르겠습니다만 - 여러가지 게임 엔진을 건드려 보았습니다.

1 Unity3D

유니티3D 는 아주 유명한 게임 엔진입니다. 실제로 2일에서 3일만 노력해도 게임을 만들 수 있는 툴로 아주 유명합니다. 그래서 저도 과연 그러한가? 싶어서 한번 설치를 해봤습니다. 공짜로 설치도 되지만 지인의 말을 빌자면 공짜 버젼으로 할 수 있는게 별로 없다는 것을 빠르게 알게 될 것이라고 하더군요. 그럼에도 불구하고 여기 저기 둘러보았는데 소싯적에 만졌던 3D 렌더링 툴들 (마야, 3D studio 등) 과 많이 비슷하더군요. 즉 개발자 측면보다는 기획이나 디자인쪽에 가까운 툴이라고 여겨지더군요.

2 Cocos2D

코코스2D 는 2D 기반의 게임을 가볍게 빠르게 만들 수 있는 엔진으로 유명합니다. 그런데 최근 업데이트 (그래봐야 1년도 넘었습니다) 되면서 3D 도 같이 지원하게 바뀌며, 3D 기반의 게임을 만들 수가 있습니다. 그 유명한 '세븐나이츠' 가 코코스2D 를 이용해서 구현 한것으로 유명합니다. 게다가 상당히 개발툴이 개발자스럽게 구현되어 있습니다. 즉 나중에 이미지 배치등은 편하게 해줄려면 결국 Cocos Sutdio 등을 이용해야 하지만 일단 가변운 게임은 코딩만으로도 개발할 수가 있습니다. 즉 개발자 친화적이라는 것입니다. 예전에 게임을 만들던 가락이 있는 분들은 이 엔진을 이용하시는 편이 훨씬 편하게 게임쪽에 접근이 가능합니다.

그래서 다시 한번 게임을 만들려고 Cocos2D 를 설치하고 나니 이게 참 마땅한 따라하기용 샘플이 없더군요. 열심히 찾다가 발견한 것이

http://horns.tistory.com/category/cocos2d-x

위 블로그 였습니다. 충격을 받았습니다. 정말 차분하게 처음부터 잘 정리하셨더군요. 열심히 따라하면서 공부를 잘 할 수 있었으며 어떻게 개발이 되는지 전부 알 수가 있었습니다. 다만 아쉬운 것이 예전 버젼의 cocos2d 로 만들어졌기 때문에 현행 API 와는 안맞는 부분이 많이 있었습니다. 따라서 제가 현행화를 했습니다. 블로그를 보니 자신의 블로그에 연재하신다는 분도 관대하게 허락해 주시는 분이니, 단지 현행화만 한 저는 굳이 허락을 받지 않아도 되겠다 싶어서 이렇게 현행화만 하고 저분의 블로그를 링크해서 공부를 할 수 있게 하는 것이 좋겠다 생각합니다.

 모든 자료와 모든 그림, 그리고 모든 소스는 저 위의 블로그에서 작성된 것을 기반으로 만들었기 때문에 소유권은 저 블로그 소유자가 가지는 것을 여기에 명시해 둡니다.

제 현행화된 자료는 (Cocos2D 3.4 버젼에 맞춘)

https://github.com/crazia/pyocopang

에 올라가 있으며 혹시나 외국 친구들이 볼까봐 안되는 영어로 간단하게 영문 소개를 달아두었습니다. (설치법 또한)

안드로이드 어플리케이션 개발시 strings.xml 에 html tag 를 삽입할려고 하다 보니 ADT안드로이드 스튜디오 와 호환성 문제가 발생하더군요.

1 현상

<string name="string_hello"><font color="#fffff">메모<![CDATA[<tt> </tt>]]> %1$s</font></string>

위와 같이 html tag 를 strings.xml 에서 사용할때 공백문자를 사용하기 위해서 CDATA 태그를 조금이라도 적게 사용할려고 공백 문자에만 사용할려고 하다가 발생했습니다.

2 원인

]]> 태그가 마지막에 오지 않으면 발생한다는 에러가 발생합니다. 혹은 리소스 머지(merge) 시에 에러가 발생한다던가 , 잘 쓰고 있던 컴퍼넌트 (component) 가 없다는 등 종잡을 수 없는 에러가 발생합니다.

3 해결

<string name="string_hello"><![CDATA[<font color="#fffff">메모 %1$s</font>]]></string>

위와 같이 변경해 주면 해결됩니다. 공백은 단순히 CDATA 안에서 space 한칸만 두면 됩니다.

+ Recent posts