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

emacs 에서 autohotkey 를 이용해서 IDE 에 빌드명령 내리기(키입력 보내기)

IDE 하고 컴파일러가 한몸이라 커맨드라인으론 실행하지 못하는 경우도 있네
그런경우를 위해서 emacs 에서 빌드할수 있도록 오토핫키를 이용한 간단한 스크립트를 만들어봤다.

덧붙여 나는 빌드시에 태깅 업데이트되는것을 좋아 하니 먼저 태그 업데이트 후에 이 오토핫키 스크립트를 실행하는 배치파일로 작성했다. 이걸로 emacs 에서 F7 하나로 빌드가 가능해졌다.


먼저 build.cmd

펼쳐두기..



그리고 build.ahk
별거없다. 그냥 타이틀을 이용해서 창을 찾아서 F7 보내주는게 전부

펼쳐두기..





2009년 8월 27일 목요일

wxHaskell 로 처음 만들어본 샘플 프로그램

우선 스샷 박아두고


소스부터 적어두고

펼쳐두기..


몇가지 느낀점들
  1. 레이아웃 잡기 짱난다. 그래도 ghci 로 바로 실행 가능하니 다행. 정말 복잡한 레이아웃 잡으려면 wxWidget 쪽 문서까지 뒤져봐야 할것 같다.
  2. 문서 읽기 어렵다. 어떤 컨트롤이 어떤 프라퍼티를 가졌는지 보려면 먼저 그 컨토롤이 어떤 클래스에 속하는지 보고 그 클래스의 도움말을 찾아보자. 예를들어 위에서 사용자입력을 받을때 쓴 위젯 (entry 로 만든) 은 Commanding 클래스의 멤버라는걸 문서에서 확인하고 엔터를 칠때 뭔가 하고싶으면 command 를 지정하면 되겠구나.. 해서 코딩해본것.
  3. property 라는 것 때문에 퓨어 펑셔널한 라이브러리 라곤 할수가 없을것 같네. OOP 에서 멤버를 바꾸듯이 쉽게 속성을 읽고 쓸수 있다. 뭐 이런 스타일이 더 익숙하지. 퓨어 펑셔널 GUI 가 가능하긴 한가?
  4. this 에 해당하는 뭐 그런걸 못찾아서 좀 어색하다. 예를들어 위 코드에서 i <- entry f [] 부분에서 command 속성을 지정하고 자기 자신을 포인팅 하는 방법을 몰라서(모른다기 보단 그런 방법은 없지).. 일단 i 를 만들고 아래쪽에서 set 으로 속성을 지정해줬다. 코드가 좀 복잡해지면 위젯들을 먼저 왕창 생성해두고 프라퍼티를 줄줄이 수정하는 식으로 짜야 할거 같군?
  5. 위젯에 위젯 올려서 그걸 쓰는 식으로 모듈화를 해야 하는데 예를들어 위 코드로 치면 i 와 b 를 묶어서 inputControls 뭐 이런식으로 묶어야 했는데 못했네. 이건 다음번에.




2009년 8월 26일 수요일

win32, haskell 에서 gui 는 wxHaskell 가 시작하기 좋군.

간단한 프로토콜 테스트 클라이언트를 haskell 로 짜보려고 준비중이다.
원래 콘솔로 만들까 했는데 트래픽이 좀 되니 콘솔로는 부족해서 GUI 를 붙여볼 생각.

처음에는 Gtk2Hs 를 고려해봤는데 이게 windows 에서는 설치가 매우 곤란했다. 지금 쓰는게 haskell platform 인데 이게 설치경로에 공백이 들어가있어서 gtk2hs 의 configure 가 에러를 뱉는다. haskell platform 만든애들이 이문제 때문에 설치경로를 바꿨다가 Gtk2Hs 쪽에서 해결하라고 다시 원복하는 바람에 이게 허공에 뜬 이슈가 됐다. Gtk2Hs 쪽 에도 이슈로 올라와있지만 조용하고...

뭐 저문제 말고도 여러문제가 있길래 설치하다 결국 꽥

반면에 wx haskell 쪽은 최신 버전에 맞는 바이너리 설치본을 제공해서(Gtk2Hs 쪽 바이너리 설치본은 ghc 구버전용) 설치가 깔끔하더라.

아.. qt 쪽도 haskell 바인딩 라이브러리가 있는데 그쪽은 시도도 안해봤다.


펑셔널 GUI 라니 어떻게 짜야 하는지 상상도 안되네.
어쨌건 wx window 를 배우기 위해서는 아래 링크들을 띄워두고 놀아보자.

http://haskell.org/haskellwiki/WxHaskell
http://en.wikibooks.org/wiki/Haskell/GUI
http://wxhaskell.sourceforge.net/doc/

추가.
으흠.. FAQ 에 의하면 멀티쓰레드지원이 아직 안된다는 말이 있네.. 헐..

2009년 8월 25일 화요일

C++ 에서 표준입출력을 이용한 간단한 프롬프트 입출력 코드

예전에 asio 통해서 tcp 위에서 콘솔 다루는 코드를 적은적이 있었는데
이번엔 표준입출력쪽에서 이런기능이 필요해서 따로 만들어두고 일단 여기 적어둔다.


console.hpp

펼쳐두기..


이건 예제

펼쳐두기..





2009년 8월 21일 금요일

haskell 확장 RecordWildCards

메뉴얼 참고
NamedFieldPuns 확장하고 같이 쓰면 타이핑 줄이는데 도움이 많이 되겠네   

쌩기초 문법만 알고 있는 상태에서 haskell 코드 구경하다 이런 문법을 만나면 정말 난감하다. lisp 이면 매크로를 따라갈수라도 있지. haskell 의 경우 좀 덩치큰 소스는 확장을 여러개 해서 LANGUAGE 프라그마가 여러개 나오는데 해당 소스의 신기한 문법이 도대체 어디서 나온건지 알수가 없다...

뭐 천천히 구경을 계속해보자.

{-# LANGUAGE RecordWildCards #-}

-- 많은 필드를 가진 레코드가 있을때
data C = C {
a :: Int,
b :: Int,
c :: Int,
d :: Int
} deriving (Show)


-- 원래대로라면 미칠듯한 타이핑을 해야한다.
f C{a=a, b=b, c=c, d=d} = a+b+c+d

-- .. 으로 모든 필드를 읽어올수있다.
g C{..} = a+b+c+d

-- 일부만 패턴을 주는것도 가능
h C{a=1,..} = b+c+d

-- 헐 이런짓도 가능.
i = C {a=1,..}
where b=2
c=3
d=4