2010년 2월 24일 수요일

인수인계를 위해 남겨둔 최소한의 .emacs 파일

퇴사전 PC 정리중인데 인수인계가 늦어져서 간단히 코드와 문서를 보여줄수있을 정도의 .emacs 를 만들었다. emacs 안에 워낙 잡스러운것들을 들고있다보니 이런 작업도 하게 됐네

내가 필요했던것은
  1. 소스브라우징을 위한  gtags, cscope
  2. 잡스런 파일을 숨긴 dired
  3. ido
  4. F5 로 커맨드창 실행
  5. alt-F5 로 탐색기 실행
  6. 문서를 org 로 썼기 때문에 org

그래서 ~/.emacs.d 에 gtags.el xcscope.el 만 넣어두고 .emacs 에 아래 코드만 남기고 나머진 모두 삭제했다.

;;; 최소한의 el 들은 이곳에 넣어둔다.
(add-to-list 'load-path "~/.emacs.d")


;;; cscope 설정
(require 'xcscope)

;;; gtags 설정, gtags.el 이 필요
(load "gtags")
(add-hook 'c-mode-common-hook (lambda () (gtags-mode 1)))
(global-set-key "\C-c\M-." 'gtags-find-rtag)
(defun yoonkn%search-project-by-gtags ()
  (interactive)
  (if current-prefix-arg
      (yoonkn-grep-project)
    (gtags-find-pattern)))
(add-hook 'gtags-mode-hook
          '(lambda ()
             (local-set-key (kbd "C-S-f")
                            'yoonkn%search-project-by-gtags)))

;;; dired 쪽 설정은 가지고있는게 좋겠군.
(require 'dired-x)
(defun add-to-dired-omit-files (pattern)
  (setq dired-omit-files
        (concat dired-omit-files
                "\\|"
                pattern)))
(mapc #'add-to-dired-omit-files
      '("\\`\\."
        "\\`semantic.cache\\'"
        "\\.elc\\'"
        "\\`tags\\'"
        "\\`TAGS\\'"
        "\\`GPATH\\'"
        "\\`GRTAGS\\'"
        "\\`GSYMS\\'"
        "\\`GTAGS\\'"
        "\\`cscope.out\\'"
        "\\`cscope.files\\'"
        "\\`cscope.index\\'"))
(add-hook 'dired-mode-hook '(lambda () (dired-omit-mode 1)))
(when (eq system-type 'windows-nt)
  (setq ls-lisp-verbosity (delq 'uid ls-lisp-verbosity))
  (setq ls-lisp-verbosity (delq 'gid ls-lisp-verbosity)))


;;; ido 도 필요하겠다
(require 'ido)
(ido-mode t)
(ido-everywhere 1)
(setq ido-use-filename-at-point 'guess
      ido-use-url-at-point t)


;;; F5 로 터미널
(when (eq system-type 'windows-nt)
  (global-set-key [(f5)]
                  '(lambda ()
                     (interactive)
                     (w32-shell-execute "OPEN"
                                        "cmd"
                                        "/K echo hello"))))
;;; alt-F5 로 탐색기
(when (eq system-type 'windows-nt)
  (global-set-key [(meta f5)]
                  '(lambda ()
                     (interactive)
                     (w32-shell-execute "OPEN" default-directory))))


;;; 문서를 org 모드로 주로 남기기 때문에 이 모드도 필요하겠다
(require 'org)
(setq org-hide-leading-stars t)

2010년 2월 23일 화요일

msvc 에서 빌드 빠르게 하는 방법은 없나

소스레벨에서의 노력이나 하드웨어적인 노력(램드라이브등)말고 ccache 나 make -j 같은녀석.
PCH 는 몇가지 제약때문에 내가 싫어하고..
인크레디빌드는 상용이라 제외고..

여기저기 둘러봤는데 적절한 대안이 안보이네.

일단 ccache 대용은.. msvc 용 ccache 가 만들어진적은 있는것 같은데 유지보수가 안되는거 같고

make -j 옵션 대용은 http://msdn.microsoft.com/en-us/library/bb385193.aspx 에 /MP 란 옵션이 있는데 이게 다른 여러 옵션들이랑 쫑나네. 당장 내가 가진 솔루션에 적용해보면 /Gm 이랑 쫑난다.
이거말고 프로젝트별 병렬빌드도 있는데 그건 너무 병신같군.


음..
일단 여기까지만 하고 접어두지만
후에 다시 찾아봐야 할거같다.

추가.
http://yoonkn.textcube.com/252 확인해보자. JOM!!!!!!

트리맵

지금 블로그에 이미지가 안올라가네 나중에 추가하고..


callgrind 의 출력을 보면서 유용하겠구나 느꼈었는데 이걸 트리맵이라고 하는군.
기억해두자.


http://en.wikipedia.org/wiki/Treemap
http://www.cs.umd.edu/hcil/treemap-history/
http://windirstat.info/
reddit 에서 보게된김에 찾아본거.


PLT scheme slideshow 에서 한글 출력시 첫 단어 이후 글씨들이 높낮이가 다른점

그냥 폰트지정하면 된다.
괜히 궁금해져서 문서 뒤져봤네.

예제코드.
폰트지정하는 코드가 핵심.



#lang slideshow

(current-main-font "malgun")

(slide
#:title "안녕"
(t (number->string (current-font-size)))
(t "폰트 높낮이가 왜 다르냐")
(t "정말 눈에 거슬린다")
'next
(t "폰트를 지정해주니 해결됐엉"))



2010년 2월 22일 월요일

음 사직서..

2003년, 실제론 2002년 12월경 부터 다니던 회사에 사표를 내고 나니 기분이 묘하구나.

이제 게임개발자가 되어야 한다는 사실도 놀랍고
별다른 서포트 없이 삽질로 게임을 빨리 만들어야 한다는게 정말 우울하다.

생각해보면 나도 어릴적 FC-150 만질때부터 게임프로그래밍에 관심이 있어서 프로그래머를 하겠다고 마음먹은 놈이긴 한데 이제와서 새시작을 해야 한다니 두렵군.

한동안 고생을 하게 될거 같은데
내몸이 견뎌줬으면 좋겠네.

2010년 2월 21일 일요일

ogre3d 창모드일때 마우스 처리에 대해서 조금 적어둔다

OIS 를 non exclusive 모드로 돌리는것은 아래 링크대로 코드 추가
http://www.ogre3d.org/wiki/index.php/Using_OIS#Non-exclusive_input

[code cpp]
    paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" )));
    paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
    paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));
    paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));
[/code]

그리고 기존 MouseMoved 에서 상대좌표로 마우스무브 인젝션 하던것을 절대좌표로 포지션 인젝션. 흠. 애초에 왜 상대좌표 썼는지는 원코드 쓴이에게 물어봐야 겠는데 분위기 보니 오우거 샘플이 원래 저걸 쓴모양인듯.

[code cpp]
OgreFramework::getSingletonPtr()->m_pGUISystem->injectMousePosition(evt.state.X.abs, evt.state.Y.abs);
[/code]

아 그리고 시스템 마우스 커서가 남아있으니 숨기는 코드도 필요. 적당히 ShowCursor 불러주면 끝. 이거 그다기 깔끔한 처리는 아닌데 다른 방법을 찾지 못했다.
[code cpp]
::ShowCursor(FALSE);
[/code]



2010년 2월 17일 수요일

드랍박스 잘나가네

http://blog.dropbox.com/?p=339

mac 유저가 20% 나 된다는게 놀라움
그리고 안습의 리눅스.
글로벌 서비스와는 거리가 먼 우리나라.




2010년 2월 16일 화요일

mzscheme 아주 간단히 임베딩 해서 빌드만 해봤다.

s7 을 ogre 에 대강 붙여보니 잘 돌더라.
뭐 이정도만 되도 내가 쓰기엔 문제 없는데 괜히 오버해서 mzscheme 을 구경해봤다.

scheme. common lisp 을 모두 쳐도 PLT scheme 만큼 유지보수가 잘되고 윈도까지 지원하는게 드물어서 그냥 붙여본건데.. 흠 용량도 크고 붙이기도 쉽지 않고 그다지 끌리질 않네. 차라리 ecl 쪽이 좀더 끌리는듯.


문서는
http://docs.plt-scheme.org/inside/index.html
를참고했고

빌드에 쓴 CMakeLists.txt 는

cmake_minimum_required(VERSION 2.8)

if(WIN32)
# PLT 경로
set(PLTDIR "C:/Program Files/PLT" CACHE PATH "PLT scheme dir")
# -I, CFAGS, LDFLAGS 등 기본설정
include_directories("${PLTDIR}/include")
link_directories("${PLTDIR}/lib/msvc")
link_libraries(libmzsch3m_6ncc9s)
# 빌드후 테스팅을 편하게 하려고 dll 복사해줬다
configure_file("${PLTDIR}/lib/libmzsch3m_6ncc9s.dll" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY)
else()
# 지금은 윈도우 사용중이라.
endif()

# 필수
add_definitions(/DMZ_PRECISE_GC=1)
# base.i 가 소스리스트에 포함되어있고
add_executable(a a.cpp base.i)
# base.i 는 요 커맨드에 의해서 생성.
# PLT 문서는 .c 를 쓰는데 그럴경우 cmake 에서 좀 피곤하게 돌기때문에 .i 로 바꿨다.
add_custom_command(
OUTPUT base.i
COMMAND ${PLTDIR}/mzc --c-mods base.i ++lib scheme/base
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)



그리고 테스트로작성한 a.cpp 는 ( 위 문서의 코드를 그냥 베낀 정도의 코드 )
[code cpp]
#include "scheme.h"
#include "base.i" // mzc 가 생성한놈 원 문서는 .c 를 쓰지만 난 빌드편하게 하려다 보니 .i 썼다

static int run(Scheme_Env* e, int argc, char* argv[]);


int main(int argc, char* argv[])
{
// main 을 후킹해서 돌아가는 스타일
return scheme_main_setup(1, run, argc, argv);
}


// 아.. 드럽다. s7 이나 tiny_scheme 같은 경우는 대강 문서 보고 헤더
// 구경하면서 쓰는게 가능한데 이놈은 그렇질 못하다. 가비지콜렉션
// 때문인데... 흠. 문서를 좀더 읽기 전에 달려들었다간 낭패보기 쉽겠다.
static int run(Scheme_Env* e, int argc, char* argv[])
{
Scheme_Object* v;

MZ_GC_DECL_REG(2);
MZ_GC_VAR_IN_REG(0, e);
MZ_GC_VAR_IN_REG(1, v);
MZ_GC_REG();

declare_modules(e); // base.i 에서 나온거

v = scheme_intern_symbol("scheme/base");
scheme_namespace_require(v);

v = scheme_eval_string("(+ 1 2 3)", e);
if(SCHEME_INTP(v))
printf("result: %d\n", SCHEME_INT_VAL(v));

MZ_GC_UNREG();
return 0;
}
[/code]

참고로 이렇게 떨어진 a.exe 는 Release 빌드시 대략 556KB, 저 따라다녀야 하는 dll 은 2.5 MB

2010년 2월 13일 토요일

clozure common lisp 세팅

그냥 몇가지 적어둔다.

  1. 뜰때 읽는 파일이 ccl-init.lisp 인데 내가 환경변수 HOME 을 잡아둔 곳에서 읽지 않고 내문서 그쪽에서 읽는다. $HOME 읽는 프로그램들 중(*nix 쪽에서 나온 놈들)에 이렇게 돌아가는건 처음보네. 아.. 허긴 이놈은 mac 출신이구나. 어쨌건 ccl 띄운후 (user-homedir-pathname) 를 확인해보면 알수있다.
  2. 위 경로에 ccl-init.lisp 을 만들고 아래 코드로 c:/opt/lisp 아래의 asdf 패키지들을 찾도록 했다. 아래 코드는 http://paste.lisp.org/display/83926 에서 가져온것
    (require 'asdf)
    (defun setup-registry (directory-path)
    (format t "; adding components under ~A to asdf registry~%" directory-path)
    (mapc (lambda (asd-pathname)
    (pushnew (make-pathname :name nil
    :type nil
    :version nil
    :defaults asd-pathname)
    asdf:*central-registry*
    :test #'equal))
    (directory (merge-pathnames #p"**/*.asd" directory-path))))
    (setup-registry #p"c:/opt/lisp/")
  3. asdf-install 이 지원되는 모양인데.. 난 수작업을 하는편.
  4. http://read-eval-print.blogspot.com/2009/06/clozure-cl-windows.html 를 보면 인코딩 세팅하는 코드도 나와있다. 지금은 그냥 돌려본거라 이건 테스트 안해봤는데 한글윈도에서 코딩하려면 반드시 필요하겠지. 파일인코딩은 euc-kr, 그외는 utf-8 식으로..
    (setf ccl:*default-external-format*
    (ccl:make-external-format :character-encoding :utf-8
    :line-termination :dos)
    ccl:*default-file-character-encoding* :utf-8
    ccl:*default-socket-character-encoding* :utf-8)

패키지 몰아서 받는건 아래 링크 통해서 하고있다. libcl 자체가 패키지관리기능을 가지고 있지만 난 그냥 저거 압축만 풀어서 쓰고있는 상태.
http://libcl.com/