살군의 보조기억 장치

Another memory device…

Archive for the ‘Lecture’ Category

python3 을 기본 “python” 명령으로 실행시키기

leave a comment »

아직까지는 많은 linux 배포판의 파이썬 기본 탑재버전은 2.x 대를 사용 중이다. 고로, python 을 실행하면 2.x 버전이 실행되나 파이썬의 최신버전은 3.x 이며 이를 사용하기 위해서는 아래와 같이 셋팅하면 된다.

A simple safety way would be to use an alias, by placing:

alias python=python3

into ~/.bashrc or ~/.bash_aliases file.

물론 소소한 문제는 있을 것 같다.

참고

Written by gomiski

2015/02/13 at 12:45 am

매번 햇갈리는 UML 정의

leave a comment »

매번 햇갈리는 UML 정의가 있다. 바로 Aggregation과 Composition의 차이 이다.

  • Aggregation: 전체와 부분의 연관 관계를 맺지만, 그러나 동일한 생명 주기를 갖지는 않는다.
  • Composition: 전체와 부분이 강력한 연관 관계를 맺으며, 전체와 부분이 같은 생명 주기를 갖는다.

Aggregation 의 예로는, Person-Address 관계가 있을 수 있다. 역사과목-학생의 관계 또한 aggregation 이라고 볼 수 있다. Composition 의 예로는 Car-Engine 관계가 있다. House-Room 도 가능하다. 이젠 햇갈리지 말자

참고

Written by gomiski

2014/11/05 at 6:14 am

Posted in General, Lecture, Life, study

Tagged with , ,

Trac 설치 방법

leave a comment »

예전에 Trac 을 설치해서 사용했던 적이 있었는데, 한동안 안쓰다가 다시 쓰려니 하나하나 다시 찾아봐야 되서 정리를 하기로 마음먹었다. Trac 은 파이썬 기반이므로 일단 파이썬을 설치해야 한다.

  1. 파이썬 ≥ 2.5 and < 3.0 설치
  2. 파이썬 홈페이지에 가서 설치를 하면 되는데, 주의할 점은 파이썬은 3.x 버전부터 문법이 달라져서 2.x 대 버전과 호환성이 없어져버렸다. 근데 Trac 은 2.x 기반으로 만들어졌으므로 3.x 버전을 설치하면 안된다. 파이썬 홈페이지에 가도 2.x 와 3.x 를 따로 다운 받을 수 있도록 해놨으니, 2.x 버전의 최신판으로 다운 받아서 설치하면 된다.

  3. setup_tools ≥ 0.6 설치
  4. 좀 전까지 설치한게 이건데… 애매하지만 간단하게 설명하면, setup_tools 다운로드 페이지에 가서 아래로 내리면 “Windows (simplified)” 항목에서 시키는 대로 “ez_setup.py” 파일을 다운 받아서 파이썬으로 실행시키면 된다. 파이썬으로 파일을 실행하는 방법은,

    python ez_setup.py

    라고 하면 된다. 그럼 알아서 다운 받고 설치도 된다.

  5. Genshi ≥ 0.6 설치
  6. 나머지 Mendetory 패키지인 Genshi 는 setup_tools 에서 지원하는 easy_install 을 이용해서 쉽게 설치할 수 있다. 위의 2.를 제대로 설치했다면, 파이썬 디렉토리 안에 Scripts 라는 디렉토리가 생겼을 것이다. 여기 들어가면 easy_install.exe 파일이 보인다. 이걸로 아래와 같이 실행하면 끝.

    easy_install Genshi

  7. 파이썬 DB 바인딩 설치
  8. 홈페이지에서 권고하는데로 PySqlite 를 다운 받을려고 보니, 파이썬 2.5 버전 이상에서는 PySqlite 2가 sqlite3 모듈로 기본 DB 바인딩으로 들어가 있다고 한다. 굳이 다운 안받아도 되겠다.

  9. Trac 설치
  10. 자! 이제 준비가 다 되었으니 Trac 을 설치해보자. 설치 방법은 간단하다. easy_install 이 있는 파이썬 디렉토리 내의 Scripts 디렉토리에 들어가서,

    easy_install Trac==1.0

    을 실행하면 된다. 그러면 Scripts 디렉토리 내부에 trac 과 관련된 파일이 생성된 것을 볼 수 있다.

  11. 프로젝트 생성
  12. 나는 아파치 서버를 따로 안 쓸 예정이므로, 그냥 trac 에 내장된 tracd 를 돌려서 사용한다. 일단 여기까지 하면 trac 이 실행되는 환경까지 왔다. 처음 설치한 파이썬의 하위에 있는 Scripts 디렉토리에 보면 trac 과 관련된 파일들이 생성되어 있을 것이다. 이제 프로젝트를 한번 등록해보자. Scripts 디렉토리에서

    trac-admin /path/to/myproject initenv

    을 실행하면, /path/to/myproject 라는 디렉토리가 생성되고 trac 이 초기화 되었다. 이제 tracd 를 이용해서 실제 trac 을 돌려보자.

    tracd –port 8000 /path/to/myproject

    이제 웹브라우저에서 http://localhost:8080 으로 접속하면 trac 페이지가 보이고 프로젝트로 갈 수 있을 것이다.

  13. 관리자 계정 등록
  14. 첨에 들어가면 아무것도 할 수 없다. 그냥 trac 이 잘 돌아간다는 것만 확인할 수 있다. 이제 관리자 계정을 부여받자. 일단 tracd 를 멈추고 난 후,

    trac-admin /path/to/myproject permission add admin TRAC_ADMIN

    명령어를 입력하고 난 후, 다시 tracd 를 실행해서 웹브라우저로 들어가보면 우측 상단에 “Admin” 혹은 한글로 “관리” 라는 탭이 생겼을 것이다. 이제 관리자 계정으로 접속이 가능하다. 로긴도 없이 말이지…ㅋ

  15. 계정관리 플러그인 설치
  16. 이것저것 복잡하게 계정관리하는 뭔가가 나오는데… 복잡하다. 그렇다고 계정관리를 안할 수는 없으니, 편하게 관리해주는 툴을 찾아보자. 바로 Account Manager Plugin 이다. svn 이 설치되어 있다면 easy_install 로 간단하게 설치가 가능하다.

    easy_install https://trac-hacks.org/svn/accountmanagerplugin/tags/acct_mgr-0.4.4

    그러나 나는 아직 svn 이 설치되어 있지 않으니 일단 소스를 다운 받아서 압축을 푼 다음 acct_mgr-0.4.4 디렉토리에 들어가서 (들어가면 setup.py 파일이 보일거다),

    python setup.py bdist_egg
    cd dist
    easy_install TracAccountManager-0.4.4-py2.7.egg

    를 실행하면 된다. 단, 이때 tracd 를 종료한 상태에서 실행해야 한다. 당연한 이야기다.이제 다시 tracd 를 실행해서 “Admin” 탭에 Plugins 에 들어가보면 trac account manager 가 설치되어 있을 것이다. 이걸 열어서 모두 enable 채크! 그럼 왼쪽에 Account 관리기능이 생긴다. 대단히 대단하다!

끝으로… trac 을 설치하고 프로젝트를 생성하고 나면 안에 여러 디렉토리가 있다. 이 가운데,

    site/ – htdocs/ 의 복사본. 고로 메시지 로그상에 site/ 에 파일이 없다고 나온다면 htdocs/ 에 넣어주면 된다.
    common/ – trac 에서 관리하는 static resource
    <plugin>/ – 플러그인 별로 하나씩 생기는 디렉토리로 플러그인 환경설정에서 관리하는 디렉토리 들이다.

2014-10-21 추가

  1. mscgen 플러그인 설치
  2. mscgen 은 sequence diagram 을 그려주는 것이다. websequencediagram 플러그인을 써 보려고 했는데 Genshi 에서 UnicodeError 라면서 안되길래 그냥 포기하고 예전에 써봤던 경험이 있는 mscgen 으로 바꿨다. 설치방법은 다른 것들과 동일하다. 파이썬으로 빌드해서 egg 파일을 trac/plugin 디렉토리에 집어넣으면 trac 에서 자동으로 인식한다. 다만… 빌드할 때, 주의할 사항으로 mscgen 의 위치와 mscgen 으로 생성되는 이미지 캐시들이 저장될 위치를 하드코딩해넣어야 한다. 소스의 mscgen.py 파일을 살펴보면,

    	def __init__(self):
    		self.cache_dir = "%s\mscgen_cache" % (self.env.path)
    		self.proc_path = "D:\PATH_TO_MSCGEN\mscgen.exe"
    		self.proc_opts = ""
    		self.log.info('version: %s - id: %s' % (__version__, str(__id__)))
    

    하일라이트 된 줄을 내 환경설정에 맞게 하드코딩 해 넣어야 한다. 여기서 %s 는 현재 trac 이 설치된 디렉토리를 말한다. 나는 윈도우 기반으로 간단하게 설치한 것이라 mscgen.exe 파일을 사용하는 것을 볼 수 있다. 42번 라인인 캐시 디렉토리의 경우, 상대경로로 지정이 가능한데, mscgen 실행파일이 저장된 디렉토리는 절대경로로 지정해야 한다. 나는 D 드라이브에 실행파일이 있으므로 D:\PATH_TO_MSCGEN\mscgen.exe 로 지정했다. 완료되면 trac 안에서 아름다운 sequence diagram 을 쉽게 만들고 편집할 수 있다 🙂

2014-11-04 추가

  1. PlantUML 플러그인 설치
  2. PlantUML 은 UML 제작툴이다. 위에 있는 mscgen 은 sequence diagram 만 제작해주는데, 이걸로는 다양한 표현이 어려워서 새로운 플러그인을 찾아보니 좋은게 있어서 설치했다. 의외로 잘 동작한다. 설명페이지에는 linux 기반의 설명밖에 없지만, PlantUML 이 java 기반으로 만들어져있어 윈도우 환경에서도 잘 동작한다. 자… 일단 메뉴얼에서 시키는데로 dependency 들을 설치한다. 여기서 주의할 점은 ​Graphviz의 환경변수를 등록하고 path를 지정하는 것이다. 일단 테스트를 위해서 윈도우 커맨드 창에서,

    set GRAPHVIZ_DOT=C:\path\to\dot.exe

    이렇게 등록을 하면 일단 테스트는 가능할 것이다. 그러나 매번 새로 부팅할 때마다 다시 설정해줘야하니 환경변수 설정에서 등록을 해놓으면 간단하게 해결할 수 있다. 그리고 끝으로 trac.ini 파일에서

    [plantuml]
    plantuml_jar = /path/to/plantuml.jar
    java_bin = /path/to/java_bin (optional, if Java binary is not on the search path)

    위의 설정을 추가해주면 된다. 완료되면 trac 안에서 mscgen 보다 더 아름다운 sequence diagram 을 쉽게 만들고 편집할 수 있다 🙂

참고

Written by gomiski

2014/10/07 at 7:27 am

Behavior Tree 에서 사용되는 Blackboard 는 무엇이냐?!

leave a comment »

아놔… 다 적어놨는데 왜 날아갔지?! 다시적기엔 너무 귀찮으니.
Blackboard 관련 자료 사이트. 현재 정리되지 않은 Blackboard 와 Behavior Tree 관련 문서를 미리 볼 수 있다.

참고

Written by gomiski

2014/09/29 at 2:47 pm

Posted in Unreal

Behavior Tree 노드 종류에 따른 역할

leave a comment »

언리얼에서 새로 생긴 기능 가운데, Behavior Tree 라는 기능이 있다. AI 관련 컴포넌트인데… 이게 애매하게 이것저것 엮여있는 것 같다.

일단 내가 참고한 부분은 언리얼 문서 Behavior Tree Quick Start Guide 이다. 빠짐없이 잘 따라가면 아래와 같은 결과를 볼 수 있다.
Behavior Tree Tutorial Result

자…
내가 관심을 가지고 보는 부분은, Behavior Tree 의 노드들이다. 각 노드들은 다음과 같은 타입으로 나눠진다.

  • Root node in Behavior TreeRoot – Behavior Tree의 시작점. 모든 Behavior Tree는 반드시 하나의 Root 노드를 가진다.
  • Composite(Selector) in Behavior TreeComposite – 분기점branch의 시작을 정의하고 분기점들이 어떻게 수행될 지에 대한 기본 룰을 정의하는 노드이다. Selector, Sequence, Simple Parallel이 있다.
  • Task(MoveTo) in Behavior TreeTask – 트리tree의 최하위 노드leaf로써, 어떤 일을 “수행”하는 노드이다. 여러종류가 있으며 보라색으로 표시된다.
  • Decorator(Blackboard) in Behavior TreeDecorator – 조건문conditional으로 알려져 있으며, 다른 노드에 추가되어 트리의 분기점을 수행할지 말지에 대해 관여한다. 분기가 없는 단일노드에서도 적용가능하며, 파란색으로 노드 상단에 표시된다. 여기서 노드란 Composite 형식의 노드를 말하는 듯하다
  • Service(SetDefault) in Behavior TreeService – Composite 노드에 붙는 것으로, 분기문이 수행되는 동안 정의된 주기frequency마다 수행된다. 주로 Blackboard 채크나 업데이트로 사용된다. 기존의 Behavior Tree 에서 사용되었던 Parallel node 를 대체하는 역할을 한다. 녹색으로 노드 하단에 표시된다.
참고

Written by gomiski

2014/09/29 at 7:23 am

Posted in Unreal

Navmesh 는 BSP 에서만 동작을 하는가?

leave a comment »

Written by gomiski

2014/09/26 at 1:39 pm

영상처리에서 미분과 convolution 의 관계

leave a comment »

보통 엣지edge를 찾거나 할 경우, 기본적으로 미분한 결과를 사용한다. 근데 왜 영상처리에서 미분이 convolution 이 되는 것일까? 갑자기 의문이 들었다. 물론 단순하게 “영상처리에서의 미분은 필터링filtering이고 필터링은 곧 convolution 이다”라고 생각하고 그냥 받아들이면 되지만 그냥 받아들이기엔 뭔가 찜찜하다. 이번 글에서는 왜 영상처리의 미분이 convolution 이 되었는지에 대해 수학적으로 한번 파고들어 보겠다.

편미분partial derivative 가능한 2차원 이미지 F(x,y)가 있을때, 이 함수의 편미분은 (1) 처럼 정리할 수 있다.

\dfrac{\partial F(x,y)}{\partial x} = \lim\limits_{\Delta x \rightarrow 0}^{} \dfrac{F(x + \Delta x, y) - F(x,y)}{\Delta x} (1)

물론 \Delta x는 미소변위이다. 디지털 영상처리의 영역에서 본다면 \Delta x = 1이 가능한 최소값이 된다. 이를 이용해서 (1) 을 좀 더 일반화 시키면,

\dfrac{\partial F(x,y)}{\partial x} \bigg\rvert_{x=i, y=j} \approx f(i+1, j) - f(i,j) (2)

(2) 를 코드로 바꿔보면 아래와 쓸 수 있다.

int g[2] = {1, -1};

for (i=istart; i<=iend; i++)
{
    h[i][j] = 0;
    for (a=0; a<=1; a++)
        h[i][j] += g[a]*f[i+a][j];
}

위 코드는 사소한 문제가 있다. 예를들어 f[iend +1][j] 같이 실제 이미지보다 더 큰 부분의 경우에 대한 프로그램적인 처리가 필요하지만, 이 부분은 이번 글에서의 요점이 아니기 때문에 생략하기로 한다. 이제 위의 코드를 좀 더 일반화 시켜서 g 가 임의의 필터가 되고 2차원 처리가 가능하도록 변경하면,

for (j=jstart; j<=jend; j++)
{
    for (i=istart; i<=iend; i++)
    {
        h[i][j] = 0;
        for (a=astart; a<=aend; a++)
            for (b=bstart; b<=bend; b++)
                h[i][j] = g[a][b]*f[i-a][j-b];
    }
}

위의 코드에서 +a 가 -a 로 바뀐 부분은 마스크mask인 g 와 이미지 f 와의 상관관계를 생각하면 쉽게 이해할 수 있다. 왜 이렇게 바꿨냐하면, 위의 코드를 다시 일반화된 수식으로 풀어쓰면 convolution 이 됨을 쉽게 확인할 수 있기 때문이다.

h(i,j) = \sum\limits_{a=a_{start}}^{a_{end}} \sum\limits_{b=b_{start}}^{b_{end}} g(a,b)f(i-a, j-b) (3)

자!!! 이렇게 해서 convolution 이 나왔다. 수식으로 풀면 (2) 에서 (3) 으로 바로 일반화 시킬 수도 있지만… 이러면 나도 이해가 안되기 때문에…;;;

정리하면, 미분과 convolution 의 문제가 아니라 2차원 영상처리에서 어떠한 필터를 적용하고자 한다면 2D convolution 을 하면 된다는 것을 수식으로 알 수 있다. 미분을 하고싶다면 필터 g 를 미분할 수 있는 coefficient 로 사용하면 되고 가우시안gaussian 필터링을 하고싶다면 g 에 가우시안 필터 계수를 넣으면 되는 것이다.

참고

Written by gomiski

2014/05/13 at 4:48 am