flake8 [2.5.4] 를 OSX El Capitan (10.11.3) 에 pip 이용해서 설치시 flake8 실행파일이 설치 안되는 문제가 있다.

https://pypi.python.org/pypi/flake8#downloads

에서 수동으로 다운로드 받고 압축 풀린 디렉토리로 이동후에

$ python setup.py install

해주면 pyenv 관련 실행 파일 디렉토리에 저장된다.

$ ln -s /Users/crazia/.pyenv/versions/3.4.3/bin/flake8 /usr/local/bin/flake8

해주면 제대로 동작하기 시작한다.

먼저 이건 철저하게 배포용을 위해서 만든 기술이 아니라 개인 소장용이라는 점을 명백하게 말하겠다.

어떤 사이트를 가 봤는데 맘에 드는 사진이나 그림들이 연달아 나열된 경우가 많다. 로딩도 해야하고 일일이 클릭도 하는게 귀찮아서 그 사진들을 다 다운받아서 만화책 보는 프로그램으로 쭉 보고 싶을때가 있다.

그렇다! 귀찮은 것이다. 귀찮으면 DRY (Don't Repeat Yourself:같은 일을 반복하지 말고 반복하는 일은 전부 컴퓨터에게 맡겨라) 원칙에 따라서 개발자 본능이 꿈틀거린다.

개발자의 종특중 하나는 일일이 눌러서 다운받는게 3시간 걸리는 작업이라도, 개발로 편하게 스크립트 짜는게 6시간이 걸려도 후자를 택하는 종족이기 때문이다. (다만 한번 한 작업은 다음에 할 때 무지하게 빨라진다는 장점이 있다)

이제 부터는 철저하게 시나리오다. 내가 이런다는 것이 절대 아니다.

어느 사이트에 갔더니 만화가 올려져 있다. '엇! 이런 횡재를!!' 게다가 사이트를 보니 소스를 볼 수가 있는 것이다. 1화를 누르고 소스보기를 통해서 그 소스를 happy01.html 로 저장했다. 이제 이걸

$ get-picture.sh happy01.html 1

하면 내가 원하는 그림 파일들이 01-01.png 나 01-01.jpg 이런 형식으로 쭈욱 저장된다. 앞에 01, 02 이런식으로 저장하는건 나중에 만화책 뷰어가 파일 순서를 헷갈리기 때문에 저런 형식으로 저장해줘야 한다.

개별 설명을 하자면 먼저 스크립트다.

#!/bin/bash argc=$# HTML=$1 PART=$2 NUM="1" FILENAME="" if [ $argc -eq 2 ] then cat "${HTML}" | sed -E -f newline.sed | grep -E 'https://www.avsnoop' | \ awk '{print $1}' |while read url ; \ do FILENAME=$(printf "%02d-%02d.%s" "$PART" "$NUM" "`echo "${url}" | sed -E 's/^.*(png|jpg)/\1/'`");\ echo "downloading.. ${url}" ; curl -o "${FILENAME}" "${url}" ;NUM=$[$NUM +1] ;done else echo "Usage: get-picture.sh [HTML name] [Part Number]" fi

위 내용을 긁어서 쓸때는 \개행문자 콤보를 지우고 한줄로 만들어서 쓰는게 좋다. (보기 안좋아서 이리 처리함)

매개변수가 2개가 안되면 사용법을 출력하고 종료하고 매개 변수가 첫번째 html 파일 이름 과 몇 화로 저장할것인지를 지정해주면 동작한다.

cat "${HTML}" 을 통해서 HTML 의 내용을 가지고 오고 그 내용을 sed 에게 넘겨줍니다.

sed 는 스트림 에디터 라고 하는데 보통 넘겨 받은 데이타에서 특정 패턴을 찾아서 지운다던가 패턴을 치환하는 용도로 많이 쓰인다. -E 옵션은 정규표현식을 처리한다는 것이고 -f 는 파일을 읽어서 처리한다는 뜻이다. 보통은 파일 처리를 안하지만 's/A/B/g' 와 같이 치환한다는 가정을 할 때 B 에 개행문자를 포함시켜서 치환이 command line 에서는 적용이 안된다.

newline.sed 를 보면

s/(https:\/\/www\.avsnoop\.com\/files\/2015\/09\/04\/[^/]*\.)(png|jpg)/\
\1\2\
/g

와 같은 식으로 특정 패턴을 찾으면 그 패턴 앞뒤로 \n 개행문자를 넣어주는 치환을 가한다. 이렇게 하는 이유는 sed 명령어 다음에 이어지는 grep 명령이 라인단위로 동작하기 때문에 정해진 패턴을 줄단위로 출력하게 만들기 위해서다.

다만 위의 내용대로 하다가 안받아져서 확인해 봤더니 /2015/09/05 날짜로 바뀐게 발견되었다. 그렇다면 그 부분까지 정규표현식으로 바꿔주면 된다.

s/(https:\/\/www\.avsnoop\.com\/files\/2015\/09\/[0-9]+\/[^/]*\.)(png|jpg)/\
\1\2\
/g

awk 명령어는 굳이 안써도 될꺼 같은데 습관처럼 썼다. white space 을 구별지어서 조작하는 명령을 줄 수있다. '{print $1}' 이면 첫번째 컬럼을 출력하라는 구문이다.

while 문은 전에 구별된 (여기 예제에서는 www.avsnoop 으로 구분된 이미지 주소) 를 url 로 받아온다. 그리고 printf 문을 이용해서 저장될 파일이름을 FILENAME 에 저장시키고 sed 문을 또 이용해서 확장자를 지정해준다.

downloading.. ${url} 로 현재 어떤 이미지를 다운 받는지 알려주고 정해진 파일 이름으로 curl 을 이용해서 다운받는다.

curl 을 사용하는 이유는 wget 으로 안받아지는 것들이 받아지기 때문이다. 즉 curl 이 wget 의 상위 호환이라고 보면됨. 최근 curl 을 사용하는게 이유가 있어서 이다. 이제 wget 을 보낼때가 됐다.


SQLite 관련 라이브러리가 컴파일이 안된다. 찾아봐도 자료가 쉽게 안나오는 걸 보면 El Capitan 의 문제로 생각된다.

컴파일을 방해하는 가장 큰 요소는 루트리스(Rootless) 라고 생각이 된다. 일단 그 기능을 끈다. 솔직히 개발자에게는 필요 없는 옵션이라고 생각된다. 저번에도 언급했지만 끄는 방법은

재부팅시에 Command + R 을 눌러서 복구모드로 들어가서 , Terminal 을 실행해서 다음과 같이 입력한다.

$ csrutil disable

그리고 다시 재 부팅 하고 나서 Terminal 을 실행하고 Xcode 가 설치되어 있다면 (안되어 있다면 설치하고)

$ xcode-select --install

하면 설치하라고 팝업창이 뜨고 설치해준다 하면 완성입니다. 여기까지 하고 나면 Python3.4 에서 sqlite3 가 포함되서 컴파일 됨

Homebrew 는 설치가 되어 있다는 가정하에 시작합니다. 그리고 OSX 10.11 El Capitan 에서 Homebrew 를 쓸 수 있다는 것은 이미 SIP (System Integrity Protection) 을 꺼둔 상태라는 것을 의미합니다.

혹시 몰라서 SIP 를 끄는 방법은 처음 부팅될 때 '사과 마크'가 나오기 전에 'Command + R' 을 누르고 있으면 Recovery Mode (복구 모드)에 들어갑니다. 거기에서 Terminal 을 실행시키고

$ csrutil disable

을 하고 다시 재부팅하면 됩니다. 이제 준비가 끝났으면 차례로 시작하면 됩니다.

1 osxfuse 인스톨

$ brew install Caskroom/cask/osxfuse

2 ntfs-3g 인스톨

$ brew install homebrew/fuse/ntfs-3g

3 mount_ntfs 버젼을 새로 받은 파일로 교체해줌

기존에 존재하는 mount_ntfs 파일을 백업하고

$ sudo mv /sbin/mount_ntfs /sbin/mount_ntfs.orig

새로운 파일을 링크 걸어줍니다.

$ sudo ln -s /usr/local/Cellar/ntfs-3g/2015.3.14/sbin/mount_ntfs /sbin/mount_ntfs



그리고 외장형 드라이브를 뽑았다가 다시 꼽으면 쓸 수 있게 바뀝니다. 단 자동으로 마운트가 안될 수도 있으니 그 때는 DiskUtility 를 실행시키고 파티션에서 오른쪽 마우스 클릭으로 'Finder에서 보기..'를 실행시켜서 사용하면 됩니다.


최근에 다시 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 도 빨라지는지는 테스트 해봐야 할 듯합니다. 


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 으로 실행이 되는 것을 확인할 수가 있습니다.

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