[카테고리:] 컴퓨터

  • Tremulous

    요즘 Tremulous게임을 다시 하고 있다. 이 게임은 1인칭 총싸움 게임(FPS)이다.

    아래 주소에서 다운로드 받을 수 있다.


    http://www.tremulous.net/

    이 게임은 퀘이크3엔진에 기반한 완전한 오픈소스 게임이며, 누구나 개발할 수 있고 누구나 참여할 수 있다. 회원가입이 필요 없이 설치후 서버에 접속하여 바로 전투를 시작할 수 있다. 다른 온라인게임과는 다르게, “계정”이나 “ID”라는 개념이 없이 오직 닉네임만으로 서로를 알아본다. 물론 원한다면 계속해서 다른 닉네임으로 교체할 수 있다.

    인간팀과 에일리언팀으로 나뉘어져 싸우는데, 인간팀은 주로 총을 들고 원거리 사격으로 싸우고 에일리언팀은 직접 접근해서 적을 물어뜯어야 한다. 인간이 더 유리하다고 생각할 수도 있겠지만, 대체로 에일리언이 더 잘하는 것 같다. 에일리언은 매우 빠른 속도로 움직일 수 있고 인간팀은 느리다.

    양 팀 모두 기지를 구축해야 하는데, 새로 태어나게 되는 지점인 Telenode/Egg를 만들고 동력과 생명의 원천인 Reactor/Overmind를 잘 지켜야 한다. 승패는 점수나 킬 수가 아니라 오직 적의 전멸에 의해 갈린다. 즉, Telenode/Egg를 모두 없애고 동시에 적군을 모두 없애야 승리하게 된다. 어떤 경우에는, 인간팀 Telenode를 모두 없애는데 성공했음에도 불구하고 단 1명의 인간팀 괴수 플레이어때문에 에일리언팀이 패배한 경우도 있다.

    특징으로 투표 제도가 있다. 이에 관해서는 다음 글에 좀 더 자세히 설명되어 있다.


    http://snowall.tistory.com/637


    메인 운영자가 없는 대신 투표를 통해서 문제있는 플레이어들을 내보내고 게임 관리를 하게 된다.(물론 문제있는? 플레이어들이 더 많은 경우에는 그들이 정상이고 내가 이상한 플레이어이므로 다른 서버로 가자. 중이 싫으면 절이 떠나는 법이다.)

    맵도 흥미로운 맵이 많다. 우주선이 배경인 맵이 대부분이지만, 고대의 사원, 슈퍼마리오월드같은 테마로 만들어진 맵도 있다.

    그리고 “출발! 드림팀” 같은 맵도 있다.

    아무튼 신나고 부담없는 FPS를 원한다면 Tremulous를 해보자.

    컴퓨터 사양은 낮은편인데, 대체로 5년전에 쓰던 컴퓨터에서도 부드럽게 잘 돌아가니 걱정없다.

  • 16비트 TIFF

    16비트 TIFF를 처리하기 위해 삽질을 하고 있다. 일단 파이썬에서 기본적으로 못 불러온다.

    PIL을 써 보니 파일 형식을 이해 못하겠다고 작업 중단.

    http://code.google.com/p/pylibtiff/

    Pylibtiff라는 프로젝트가 있어서 설치해보려고 했더니 파이썬 2.6 전용. 설치조차 못한다.

    난 지금 2.7에서 작업중이다.

    검색해보니 tiffimageplugin.py라는 모듈을 쓰면 된다는데 그 모듈은 PIL 1.1.7에서 도입되었다고 한다.

    PIL 1.1.7은 알파버전 상태인데, 어쨌든 갖다 설치하고 싶었는데

    2.7 버전용 PIL 1.1.7a2 패키지를 설치했는데 안된다.

    구글 검색해보면 해결했다는 사람은 몇몇 있는데 왜 난 안되지…-_-

    —-

    해결했다.


    http://www.lfd.uci.edu/~gohlke/code/tifffile.py.html


    일단 위의 프로그램을 import하고

    import tifffile

    def fileloader(filename):

    tif = tifffile.TIFFfile(filename)

    images = tif.asarray()

    return images

    이렇게 하면 16비트 TIFF파일을 numpy배열로 불러올 수 있다.

    나날이 삽질만 느는구나…

  • 나를 당황케 하다니

    이건 파이썬이라서 발생한 문제는 아니겠지만 어쨌든 코드를 파이썬으로 하다가 만난 문제다.

    지금 만든 프로그램은 f(x)의 평균값을 구해야 한다. 간단하게 x*f(x)를 x에 대해 다 더하고, f(x)를 x에 대해 다 더한 후 둘을 나눠주면 된다.

    for m in range(wbegin,wend):

    for n in range(hbegin, hend):

    x=x+m*array[n][m]

    y=y+n*array[n][m]

    total=total+array[n][m]

    x = x/total

    y = y/total

    return x, y

    문제는 x*f(x)를 다 더했더니 overflow가 나 버린다는 것. f(x)중에 음수가 하나도 없고 x도 음수가 하나도
    없는데 음수가 나오길래 왜그런가 했더니 x*f(x)를 다 더하다 보니 정수의 한계를 넘어가서 음수부터 다시 시작한 것 같다.
    (양수를 계속 더했는데 음수가 나오는 경우는 수학적으로는 불가능하니까.)

    그래서 이 문제를 해결하기 위해 f(0)부터 시작해서 재귀적으로 계산하여 f(x)까지의 평균을 알 때 f(x+1)까지의 평균을 계산하는 방법으로, 점화식으로 문제를 해결하려고 했다. 이러면 계속해서 나눠주기 때문에 int의 최대값을 넘어가지는 않을 거라고 생각했다. 그러나… 그것은 순진한 생각이었다.

    이번엔 f(0)=0에서 시작하는 경우가 문제가 된다. 초항이 0이라 0으로 나누는 오류 발생.

    for m in range(wbegin,wend):

    for n in range(hbegin, hend):

    x=(x*total+m*array[n][m])/(total+array[n][m])

    y=(y*total+n*array[n][m])/(total+array[n][m])

    total=total+array[n][m]

    return x, y

    아… 뭐 이래 -_-;

    아무튼, 그래서 total = 1로 줬더니 계산은 되는데 오차가 커진다. total = 0.000000000000000001로 주는 무리수를 둬야 하나…

  • Beam pointing stability checker

    실험을 하다보면 레이저 빔이 오락가락 한다. 얘들을 찍어다가 모아보면 대략 다음과 같은 자료가 된다.

    물론 이건 실제 데이터는 아니고 GIMP로 만든 가짜 데이터다. 진짜 데이터는 실험실에 놓고 왔기 때문에 테스트 해볼 수 없었다. 내일 해봐야지.

    1. 가장 밝은 위치를 찾아서

    2. 그 점의 적당한 주변에서 밝기에 대한 위치의 가중평균값을 빔의 위치로 정하고

    3. 각 자료가 갖는 빔의 위치에 대한 평균과

    4. 표준편차를 이용하여

    5. 각 자료의 위치와, 표준편차에 대해 1sigma, 2sigma, 3sigma에 대해 얼마나 떨어져 있는지 표시하는 프로그램

    알려진 버그

    1. 정수와 실수 사이의 캐스팅 문제로 1000픽셀 규모의 데이터에 대해 1%정도의 오차가 발생한다.

    (무시하기로 했음.)

    2. 원본 자료에 핫픽셀이 있을 때 핫픽셀 주변으로 데이터가 쏠려버린다.

    (이건 그냥 사람이 눈으로 보고 맞춰줘야 할 듯.)

    추가할 기능

    1. 그림 자체에 평균, 표준편차 정보를 직접 그리는 기능

    2. 1sigma, 2sigma, 3sigma를 표시한 타원에 라벨 붙여주기

    내가 만들었지만 (복잡하거나 어려운 소스도 아니지만) 소스코드는 왠지 공개하면 연구소에서 싫어할 것 같고, 바이너리로 공개하고 싶은데 python 2.7.1용 py2exe는 VS2008의 DLL을 필요로 한다. (내게는 VS2005가 있다.)

    소스 공개해도 된다고 하면 GPL로 공개해야겠다.

  • 파이썬에서 range 함수

    어떤 언어든지간에 어떤 변수를 정해진 범위 내에서 한번씩 적용시켜가면서 반복 실행하는 구문은 필요하다. 파이썬에서는 for 구문으로 구현하고 정해진 범위를 리스트로 주도록 되어 있다.

    예를 들어, C언어에서 for(i=0;i<10;i++)으로 주어진 반복문이라면 파이썬에서는 for i in range(0, 10) 으로 쓸 수 있다. 이때 주의해야 할 점은 range가 함수라는 부분이다. range(a, b, c)는 a부터 b까지 c칸씩 달리는 리스트를 되돌려 준다. c=1은 기본 사항이다.


    [각주:

    1

    ]





    http://docs.python.org/release/1.5.1p1/tut/range.html

    그러나, 나에게 필요한 것은 for(i=0.0;i<1.0;i+=0.1)과 같은 구문이었고 파이썬에서 for i in range(0.0, 1.0, 0.1)은 나에게 좌절을 안겨주었다. range는 int에서만 잘 작동하는 함수였기 때문이다. 그래서 일단은 다음과 같은 코드를 작성해서 썼다.

    x = 0.0

    for i in range(0, 10):

    x=x+0.1

    function(x)

    급한대로 이렇게 쓰긴 했는데, 이건 for구문이지만 while같다. 이럴거면 그냥 while을 쓰는게 낫지 싶은 느낌? 그래서 다른 방법들을 찾아보았다. 기본적으로는, 파이썬의 for문은 주어진 리스트 안의 변수들을 하나씩 순서대로 적용한다. 그럼 내가 원하는 대로 0.1씩 증가하는 리스트를 만들어서 주면 된다. 예를 들어

    for i in [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]:

    function(x)

    이렇게 쓰는 것은 의도한 대로 작동하는 구문이다. 물론 이건 10개니까 손으로 썼지만 100만개쯤 되면 손으로 쓰는건 컴퓨터 편하자고 사람이 고생하는 비극을 초래하므로 좀 더 멋진 방법을 찾아야 한다.


    http://stackoverflow.com/questions/477486/python-decimal-range-step-value



    http://code.activestate.com/recipes/66472/


    몇가지 방법을 찾았는데, numpy에서 제공하는 arange 함수를 쓰는 방법이 있고, frange함수를 새로 정의하는 방법이 있다. 어떻든, 위에 쓴 0.0부터 1.0까지의 리스트를 제공하기만 하면 되고, 여러 사람들이 이 문제를 해결하고 있다.

    그러다 보니, 문득 range함수를 오버로딩하면 안되는건가? 하는 생각이 들어서 검색해 보았다. 물론 이런 생각을 나만 하는건 아니었다.


    http://ironboundsoftware.com/blog/2007/05/29/a-shortfall-of-python-no-function-overloading/



    http://www.artima.com/weblogs/viewpost.jsp?thread=155514


    귀도 반 로썸도 그런 생각을 했고, 2006년에 대충 구현을 해봤다고 하니 파이썬3에서는 잘 되지 않을까 싶었다. 그러나 그렇게 되지 않은 것 같다.





    http://openlook.org:625/blog/2008/12/04/python3/



    http://kldp.org/node/123275#comment-555572






    아무튼, 일단 range 대신에 새로운 다른 함수로 정의해서 사용해야 한다는 점을 알게 되었다.


    1. 좀 더 정확히 쓰자면, for i in range(0, 10)이랑 같은 C언어 구문은 for(i=0;i<=10;i++)이다.
      [본문으로]

  • matplotlib

    삽질하던 CCD화면의 처리 문제를 matplotlib으로 한번에 처리해버렸다. 16비트 Grayscale 자료를 알아서 Pseudocolor로 바꿔주다니, 똑똑한 녀석이다. 물론 20초 걸리던 루틴도 1.5초만에 처리하는 멋진 서비스를 해 주었다.


    http://matplotlib.sourceforge.net/

    Matlab을 쓰던 사람들이 만들었다고 한다. 그래프 그리는데 필요한 루틴은 거의 다 들어가 있는듯 싶다. 물론, 나보고 그래프 그리라고 하면 gnuplot으로 그릴 것 같지만. Matlab쓰던 사람들한테는 매우 유용한 라이브러리인듯 싶다. (난 Matlab을 만져본적이 전혀 없어서 어차피 배워야 하는 입장이지만.)

  • 파이썬에서의 = 연산자

    프로그램을 만들다 보면 “=”기호를 많이 사용하게 된다. VB에서 =는 2가지 작용을 하는데, 한가지는 양 변에 있는 두 존재를 비교하여 같은지 다른지 판단한 후 참/거짓을 알려준다. 다른 하나는 오른쪽에 있는 존재의 값을 왼쪽에 있는 존재에게 넣어준다.

    C언어에서 =는 1가지 작용을 한다. 오른쪽에 있는 존재의 값을 왼쪽에 있는 존재에게 넣어준다. C언어에서 양 변에 있는 두 존재가 같은지 비교하는 연산자는 ==이다.

    파이썬에서도 =기호는 두가지 작용을 한다. 오른쪽에 있는 존재의 값을 왼쪽에 있는 존재에게 넣어주거나, 오른쪽에 있는 존재를 왼쪽에 있는 존재와 같은 놈으로 만들어 준다. 파이썬에서도 양 변에 있는 두 존재가 같은지 비교하는 연산자는 ==이다.

    예를들어

    a = 1

    b = a

    a = 11

    print(a)

    print(b)

    이런 프로그램을 실행시키면 파이썬의 출력은

    11

    1

    이 된다. 즉, 이 경우에는 변수 a의 값이 변수 b로 복사되고, a와 b는 아무 관련 없는 모르는 사이가 되었다. a를 바꾸더라도 b는 변하지 않는다.

    그런데

    a = [10,20]

    b = a

    a[1]=11

    print(a)

    print(b)

    위와 같은 프로그램을 실행시키면 출력은

    [10, 11]

    [10, 11]

    이 된다. 이 경우에는, a와 b가 완전히 같은 존재가 되어 a를 바꾸면 b도 바뀌게 된다. 만약 a를 b로 복사해서 넣고 싶다면 copy 모듈을 불러와야 한다.

    import copy

    a = [10,20]

    b = copy.copy(a)

    a[1]=11

    print(a)

    print(b)

    이렇게 하면 b는 a의 내용을 복사해서 받은 존재가 되어 a가 변해도 b는 변하지 않는다. (반대도 마찬가지) 따라서 이 프로그램의 출력은 다음과 같다.

    [10, 11]

    [10, 20]

    아무튼. 직관적인 내용이므로 알면 편한데 문서 대충 읽고 개발하는 내게는 충격적이었다. 이게 왜 바뀌지? 싶은거…

    물론 이런식으로 존재 자체에 대한 =연산자는 VB나 C/C++에는 없다. 별다른 생각 없이 직관적으로 =연산자를 사용해서 존재에 존재를 연관시키는 것이 장점이긴 한데, 존재의 종류에 따라 작동이 달라지는 것은 일관적이지는 않은 행동인것 같다. (물론, +연산자도 문자열 변수와 수치형 변수에 대해 다르게 작동하며 이것도 일관적인 행동은 아니다. 다만 직관적인 행동이다.)

  • 문제는 해결

    해결을 하긴 했다.

    self.wxImg = wx.EmptyImage(pilImg.size[0], pilImg.size[1])

    for i in range(1024):

    for j in range(1024):

    x = int(f.getData()[0][j][i]/256)

    self.wxImg.SetRGB(i, j, x, x, x)

    이제 문제는, 너무 느리다는거…-_-;

  • 파이썬의 단점

    아… 막막함이여.

    이제 파이썬 프로그램을 다른 컴퓨터에 설치해서 실행시켜야 하는데 문제가 있다. 사용하는 라이브러리들을 전부 복사해서 넣어줘야 한다는 것이다.

    이게 왜 문제냐면, 그 컴퓨터는 인터넷에 연결이 되지 않기 때문이다.

    dll파일 몇개로 해결될 수준이 아닌거임.

    일단은, 내 컴퓨터에 설치된 파이썬의 디렉토리를 통째로 복사해서 넣으면 될 것 같긴 하다. 다행히 200MB밖에 안되네.

    컴파일되지 않으니 항상 인터프리터가 있어야 하고, 다른 라이브러리를 썼으면 그것도 같이 줘야 한다. 프로그램 자체는 200줄밖에 안되는데 딸려가는 놈이 더 많은 괴이한 경우. (VB.net도 그렇지만, 그건 닷넷 프레임워크 하나만 설치하면 되는데, 파이썬은 파이썬 인터프리터와 사용된 라이브러리 전부를 다 설치해야 한다.)

  • 결과물

    어찌어찌 삽질을 했는데

    이것은 무엇이란 말인가…

    1. 원본이 이상하다

    2. 프로그램이 이상하다

    현재는 1번을 강하게 의심중. 근데 원본을 만든 그 프로그램이 내 컴퓨터에 설치되어 있지 않아서 실험실에 가서 봐야 한다. 내일 출근해야하나…-_-