2009년 10월 28일 수요일

토치라이트 우왕ㅋ굳ㅋ

오오..
이건 예전에 졸라 잼나게 했던 Fate 스타일 게임.
너무나 닮은거 보니 뭔가 연관이 있는듯.

어쨌건 dll 들 보면 CEGUI 에 Ogre 등 오픈소스들이 쓰였네.
언제 구경이나 해보자
http://www.ogre3d.org/
http://www.cegui.org.uk/wiki/index.php/Main_Page
http://www.fmod.org/


추가.
페이트 개발자가 참여했다는군.


2009년 10월 16일 금요일

deque 를 이용한 간단한 버퍼

이런게 종종 필요하지.
급히 필요해서 테스트겸 만들어본 코드.
c++ 자주 안쓰게되서 레퍼런스 안보곤 못짜겠더군.

#include <deque>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;

int main()
{
char* p1 = "abcde";
char* p2 = "fghij";

typedef deque<char> buf_t;
buf_t buf;

// 먼저 p1 을 넣어보자
// 보통 네트웍에서 읽는 값은 이렇게 버퍼에 쌓아두고 본다.
copy(p1,
p1+strlen(p1),
back_insert_iterator<buf_t>(buf));

// 이제 버퍼에서 일부를 꺼내보자
// 이때는 원하는 모양만큼 가려서 꺼내면 된다.
// 만약 패킷완성이 덜됐다면 skip 하던가 하면 되겠지.
char tmp[3];
copy(buf.begin(),
buf.begin()+3,
tmp);
cout << tmp << endl;

// 버퍼에서 일부를 삭제해보자
// 패킷하나를 전부 읽었다면 버퍼에서 뽑아내야겠지.
buf.erase(buf.begin(),
buf.begin()+3);

// 남은 버퍼를 확인해보자
copy(buf.begin(),
buf.end(),
ostream_iterator<char>(cout, ""));
cout << endl;

// 음. 계속해서 패킷이 도착하겠지
copy(p2,
p2+strlen(p2),
back_insert_iterator<buf_t>(buf));

// 남은 버퍼 찍어보자
copy(buf.begin(),
buf.end(),
ostream_iterator<char>(cout, ""));
cout << endl;


// 끝
cout << "ok" << endl;
}



2009년 10월 14일 수요일

북두무쌍?!

http://koeitecmo.info/new/

YOUはSHOCK

아 시바
엑박사야하나

2009년 10월 9일 금요일

2009년 10월 2일 금요일

GNU screen 사용법 위키에서 백업

http://oldpie.yoonkn.com/cgi-bin/moin.cgi/GNU_screen

오래전에 적어둔것 옮겨둔다. 저쪽 계정이 얼마 안남았다..

screen

Xming 으로 Emacs 를 띄워서 원격작업하는 현재에는 별 필요가 없는 툴인데 대강만든 프로그램을 서버쪽에 띄워서 오래 돌려야 한다던가 하는 경우가 자주 있어서 이럴때를 위한 screen 사용방법 정리

원래는 좀더 간단한 attach(detach 던가??? 기억이...) 라는놈이 있는데 내 장비에 기본설치가 안되어있고 또 screen 이 더 유명한놈이라 이놈을 적어둔다.

screen 실행

screen

세션 detach

C-a C-d

세션 list

screen -ls

세션 resume

screen -r 어쩌구.저쩌구.모시기

그냥 프로세스 띄우는 정도면 위 네가지만 알면 충분. 더 상세한 기능은 man page 가 아주 잘되어있다.

가끔 로깅도 필요한 경우가 있는데 이때는

toggle logging

C-a H

참고로 요놈이랑 자주 쓰게될 스크립트

  • #! /bin/bash

    while [ 1 ]
    do
    echo "TICK!"
    python chviewmon.py
    sleep 5
    done

참고링크


2009년 10월 1일 목요일

벨킨 공유기 UPnP AddPortMapping 문제

upnp 를 위해 덩치큰 라이브러리를 가져다 쓰지 않고 직접 짰는데 이게 테스트에 쓴 다른 공유기들(Intel UPnP SDK  기반) 에선 문제 없지만 벨킨 공유기에서는 문제가 생기더라.

결론만 적자면 내가 평소 http 프로토콜을 직접 짜야 할 경우 보통 1.0 기반으로 만드는 편인데 이번에도 역시 1.0 기반으로 리퀘스트를 했고 벨킨 공유기는 이걸 에러로 취급해준것.

SOAP 이 HTTP 1.1 위에서 돌아야만 했던가? 흠 지금껏 이런 문제는 본적이 없는데
나중에 이것좀 찾아보자.


어 참고로 지금 UPnP 로 포트매핑 하는거 대강 순서나 적어둘까
  1. 디스커버리
  2. 찾았으면 디스크립션 읽어오고
  3. 그중에서 컨트롤 URL 을 파싱해서
  4. 먼저 DeletePortMapping 으로 이전 포트포워딩 정보가 있으면 지워주고
  5. AddPortMapping 으로 포트매핑 추가
음. 몇몇 공유기는 AddPortMapping 을 반복해서 불러도, 즉 기존에 뚫린거 또 뚫어 달라고 해도 별말없이 뚫어주는놈도 있고 어떤놈은 이미 뚫었다고 에러주는 경우도 있다. 따라서 뚫기전에 뚫은것 지워달라는 패킷을 추가한것.

정석대로라면 먼저 뚫어보고 이미 뚫려있다고 응답해오면 상황판단을 해서 뚫은것 지우고 다시 뚫거나 등등의 처리를 해야 하겠지만 흠. 일단 걍 막무가내로 뚫어버렸다.


아..
문제가 생긴 공유기는 벨킨 F5D8236-4 v2 였다.
지금은 꺼놔서 펌웨어 버전은 못적겠군.







2009년 9월 3일 목요일

python 에서 유니코드 스트링을 일반 스트링으로 바꾸기

제목이 좀 이상한데 어쨌건 필요한 상황은 이렇다.

  • bencode 사용중
  • bencode 의 string 타입은 의미상 바이너리 타입을 의미한다.
  • 그런데 파이썬2.6 의 문자열 타입은 string 하고 unicode
  • 파이썬 bencode 구현은 string 만 받게 되어있다. 이게 사실 당연한거.
  • u"aaa" 등 유니코드를 bencode 하려면 추가 삽질이 필요하다.

그래서 이렇게 하면 된다.
  • utf-8 타입의 문자열 x 를 x.encode("utf-8") 를 이용해서 string 타입으로
  • 다시 유니코드 타입으로 돌리려면 unicode(z, "utf-8") 로

음 시간이 없으니 그냥 코드로 대신
    s = u"나나나나"
    e = bencode(s.encode("utf-8"))
    d = bdecode(e)
    x = unicode(d, "utf-8")
    print s == x




2009년 8월 31일 월요일

2009년 8월 29일 토요일

wxHaskell 로 쪼금 복잡한 코드



간단한 프로토콜 테스터를 짜는중인데 생긴건 챗 클라이언트 혹은 메신저 같이 생긴놈이다.위쪽 넓은 텍스트컨트롤에서는 서버가 보내오는 입력을 눈에 편한 형태로 보여주고 아래쪽 작은 텍스트에딧에 내가 적절히 보낼 패킷을 입력할수있다.

저 패킷 모양을 눈에 익숙하게 보여주기/입력하기 위해서 language-python 패키지 까지 가져다 썼지만 뭐 이건 중요한게 아니고..( 파서를 직접 짜는것 보다 Python 파서를 재활용하는게 더 편했다. )

어쨌건 위처럼 만들고 나니 반복되는 패킷입력을 매번 키보드로 하고 있는게 좀 한심해서 아래쪽에 버튼을 붙여야할 필요성도 생겼다. 그러니까 패킷1, 패킷2 ... 란 버튼들이 줄줄이 붙어있고 그걸 누르면 패킷이 바로 전송 되던가 아니면 입력창에 채워졌으면 편할거란 생각이 들었다.

게다가 이 버튼들은 상황따라 바뀌기 때문에(테스트할 대상에 따라 자주쓰는 패킷이 달라질테니) 코드안에 박기는 뭐하고 바이너리밖에 설정파일로 뽑아야만 했다.(동적으로 바뀐다는건 아니고 그냥 실행시 결정된다는 의미로 적었다. 나중에 동적으로 버튼을 제어할 일도 생기겠지. 그땐 흠 hslua 를 써볼까?)

뭐 필요한 사항은 대강 정리가 됐고..
이제 어떻게 했는지를 적자면

먼저 설정파일은.. 흠 맘에 드는 라이브러리를 못찾아서 (기존 라이브러리는 너무 덩치크거나, 쓰기가 좀 어색하거나..) 그냥 내가 단순히 짜버렸다. haskell 입문서 보면 나오는 간단한 수준으로 짠거라 아주 일부만 여기 적어둔다

펼쳐두기..



이제 wx 쪽 코드를 만져야 하는데.. 흠.. 다소 삽질한 끝에 아래같은 모양의 함수를 만들었다.

펼쳐두기..

패널을 만들어서 패널에 버튼을 적절히 박아주고 패널을 리턴하는 함수. 흠. 저 프라퍼티가 어떻게 구현된건지 함 찾아봐야 겠네. 정말 묘하구먼.



음 이건 지금 코드를 정리해서 위의 내용을 담은 최소 실행 코드. 나중에 이걸 볼때 실행되는 코드가 없으면 난감하겠지.. 소켓쪽이나 등등 많이 덜어냈기 때문에 딱히 어디 쓸수있는 코드는 아니다.

펼쳐두기..












2009년 8월 28일 금요일

손소독제 Hand sanitizer

http://en.wikipedia.org/wiki/Hand_sanitizer

으흠. 비누보다 좋은것으로 묘사되어있네.
사실일까?
질러볼까?

링크추가
http://synapse.koreamed.org/Synapse/Data/PDFData/0006JKAN/jkan-38-39.pdf