오오..
이건 예전에 졸라 잼나게 했던 Fate 스타일 게임.
너무나 닮은거 보니 뭔가 연관이 있는듯.
어쨌건 dll 들 보면 CEGUI 에 Ogre 등 오픈소스들이 쓰였네.
언제 구경이나 해보자
http://www.ogre3d.org/
http://www.cegui.org.uk/wiki/index.php/Main_Page
http://www.fmod.org/
추가.
페이트 개발자가 참여했다는군.
헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤
2009년 10월 28일 수요일
2009년 10월 16일 금요일
deque 를 이용한 간단한 버퍼
이런게 종종 필요하지.
급히 필요해서 테스트겸 만들어본 코드.
c++ 자주 안쓰게되서 레퍼런스 안보곤 못짜겠더군.
급히 필요해서 테스트겸 만들어본 코드.
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일 수요일
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
참고링크
헐 이미 잘 정리되어있었네 http://kr.sun.com/developers/solaris/techdocs/gnu_screen.html 를 참고하자.
http://kldp.org/node/18744 이것도 좋음
2009년 10월 1일 목요일
벨킨 공유기 UPnP AddPortMapping 문제
upnp 를 위해 덩치큰 라이브러리를 가져다 쓰지 않고 직접 짰는데 이게 테스트에 쓴 다른 공유기들(Intel UPnP SDK 기반) 에선 문제 없지만 벨킨 공유기에서는 문제가 생기더라.
결론만 적자면 내가 평소 http 프로토콜을 직접 짜야 할 경우 보통 1.0 기반으로 만드는 편인데 이번에도 역시 1.0 기반으로 리퀘스트를 했고 벨킨 공유기는 이걸 에러로 취급해준것.
SOAP 이 HTTP 1.1 위에서 돌아야만 했던가? 흠 지금껏 이런 문제는 본적이 없는데
나중에 이것좀 찾아보자.
어 참고로 지금 UPnP 로 포트매핑 하는거 대강 순서나 적어둘까
정석대로라면 먼저 뚫어보고 이미 뚫려있다고 응답해오면 상황판단을 해서 뚫은것 지우고 다시 뚫거나 등등의 처리를 해야 하겠지만 흠. 일단 걍 막무가내로 뚫어버렸다.
아..
문제가 생긴 공유기는 벨킨 F5D8236-4 v2 였다.
지금은 꺼놔서 펌웨어 버전은 못적겠군.
결론만 적자면 내가 평소 http 프로토콜을 직접 짜야 할 경우 보통 1.0 기반으로 만드는 편인데 이번에도 역시 1.0 기반으로 리퀘스트를 했고 벨킨 공유기는 이걸 에러로 취급해준것.
SOAP 이 HTTP 1.1 위에서 돌아야만 했던가? 흠 지금껏 이런 문제는 본적이 없는데
나중에 이것좀 찾아보자.
어 참고로 지금 UPnP 로 포트매핑 하는거 대강 순서나 적어둘까
- 디스커버리
- 찾았으면 디스크립션 읽어오고
- 그중에서 컨트롤 URL 을 파싱해서
- 먼저 DeletePortMapping 으로 이전 포트포워딩 정보가 있으면 지워주고
- AddPortMapping 으로 포트매핑 추가
정석대로라면 먼저 뚫어보고 이미 뚫려있다고 응답해오면 상황판단을 해서 뚫은것 지우고 다시 뚫거나 등등의 처리를 해야 하겠지만 흠. 일단 걍 막무가내로 뚫어버렸다.
아..
문제가 생긴 공유기는 벨킨 F5D8236-4 v2 였다.
지금은 꺼놔서 펌웨어 버전은 못적겠군.
2009년 9월 3일 목요일
python 에서 유니코드 스트링을 일반 스트링으로 바꾸기
제목이 좀 이상한데 어쨌건 필요한 상황은 이렇다.
그래서 이렇게 하면 된다.
음 시간이 없으니 그냥 코드로 대신
s = u"나나나나"
e = bencode(s.encode("utf-8"))
d = bdecode(e)
x = unicode(d, "utf-8")
print s == x
- 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월 29일 토요일
wxHaskell 로 쪼금 복잡한 코드
간단한 프로토콜 테스터를 짜는중인데 생긴건 챗 클라이언트 혹은 메신저 같이 생긴놈이다.위쪽 넓은 텍스트컨트롤에서는 서버가 보내오는 입력을 눈에 편한 형태로 보여주고 아래쪽 작은 텍스트에딧에 내가 적절히 보낼 패킷을 입력할수있다.
저 패킷 모양을 눈에 익숙하게 보여주기/입력하기 위해서 language-python 패키지 까지 가져다 썼지만 뭐 이건 중요한게 아니고..( 파서를 직접 짜는것 보다 Python 파서를 재활용하는게 더 편했다. )
어쨌건 위처럼 만들고 나니 반복되는 패킷입력을 매번 키보드로 하고 있는게 좀 한심해서 아래쪽에 버튼을 붙여야할 필요성도 생겼다. 그러니까 패킷1, 패킷2 ... 란 버튼들이 줄줄이 붙어있고 그걸 누르면 패킷이 바로 전송 되던가 아니면 입력창에 채워졌으면 편할거란 생각이 들었다.
게다가 이 버튼들은 상황따라 바뀌기 때문에(테스트할 대상에 따라 자주쓰는 패킷이 달라질테니) 코드안에 박기는 뭐하고 바이너리밖에 설정파일로 뽑아야만 했다.(동적으로 바뀐다는건 아니고 그냥 실행시 결정된다는 의미로 적었다. 나중에 동적으로 버튼을 제어할 일도 생기겠지. 그땐 흠 hslua 를 써볼까?)
뭐 필요한 사항은 대강 정리가 됐고..
이제 어떻게 했는지를 적자면
먼저 설정파일은.. 흠 맘에 드는 라이브러리를 못찾아서 (기존 라이브러리는 너무 덩치크거나, 쓰기가 좀 어색하거나..) 그냥 내가 단순히 짜버렸다. haskell 입문서 보면 나오는 간단한 수준으로 짠거라 아주 일부만 여기 적어둔다
펼쳐두기..
type Config = [(String, String)]
readConfig :: String -> Config
readConfig = map (split '=') . filter ('='`elem`) . lines'
readConfigFile :: FilePath -> IO Config
readConfigFile path = liftM readConfig $ readFile path
이제 wx 쪽 코드를 만져야 하는데.. 흠.. 다소 삽질한 끝에 아래같은 모양의 함수를 만들었다.
펼쳐두기..
makeButtonPanelFromConfigFile path parent input = do
config <- readConfigFile path
bp <- panel parent []
buttons <- forM config (\(k,v) -> button bp [text := k,
on command := set input [text := v]])
set bp [layout := row 3 (map widget buttons)]
return bp
음 이건 지금 코드를 정리해서 위의 내용을 담은 최소 실행 코드. 나중에 이걸 볼때 실행되는 코드가 없으면 난감하겠지.. 소켓쪽이나 등등 많이 덜어냈기 때문에 딱히 어디 쓸수있는 코드는 아니다.
펼쳐두기..
import Graphics.UI.WX
import Network.Socket
import Control.Monad
import System.IO
main = start gui
makeButtonPanelFromConfig config parent input = do
bp <- panel parent []
buttons <- forM config (\(k,v) -> button bp [text := k,
on command := set input [text := v]])
set bp [layout := row 3 (map widget buttons)]
return bp
config = [("헤헤", "헤헤가 눌렸어"),
("히히", "히히가 눌렸어"),
("멍멍", "멍멍멍멍")]
gui = do
f <- frame [text := "저수준 프로토콜 테스터를 짜기위한 첫걸음"]
output <- textCtrl f []
input <- entry f []
bp <- makeButtonPanelFromConfig config f input
set input [on command := appendText output =<< get input text]
set f [layout := fill $ column 5 [fill $ minsize (sz 400 300) $ widget output,
hfill $ widget input,
hfill $ widget bp]]
focusOn input
2009년 8월 28일 금요일
손소독제 Hand sanitizer
http://en.wikipedia.org/wiki/Hand_sanitizer
으흠. 비누보다 좋은것으로 묘사되어있네.
사실일까?
질러볼까?
링크추가
http://synapse.koreamed.org/Synapse/Data/PDFData/0006JKAN/jkan-38-39.pdf
으흠. 비누보다 좋은것으로 묘사되어있네.
사실일까?
질러볼까?
링크추가
http://synapse.koreamed.org/Synapse/Data/PDFData/0006JKAN/jkan-38-39.pdf
피드 구독하기:
글 (Atom)