2008년 11월 24일 월요일

emacs 에서 현재 버퍼를 기억해뒀다가 키 하나로 스위칭 하기

svn 을 쓸때는 f12 에 psvn 버퍼를 찾거나/새로만들어서스위칭 하는 코드를 붙여서 썼었는데 요즘엔 머큐리얼을 쓰면서 psvn 상태보다 dired 모드를 중심으로 코딩하는 경우가 더 많아졌네.  dired 켜두고 몇몇 중요 서브디렉토리만 i 로 추가해서 쓰면 psvn 쓸때처럼 편리하게 쓸수 있어 좋드라.

그래서 C-u f12 를 누르면 현재 버퍼 기억하고 다시 f12 를 누르면 기억했던 버퍼로 스위칭 하는 함수를 만들어봤다.

(defun quick-switch-buffer ()
"f12 에 매핑을 했다면 C-u f12 를 눌러서 현재 버퍼를 기억해두고
f12 를 누르면 그 버퍼로 뿅"

(interactive)
(if current-prefix-arg
(setq *quick-switch-buffer* (current-buffer))
(switch-to-buffer *quick-switch-buffer*)))
(global-set-key [(f12)] 'quick-switch-buffer)


좀더 다듬자면 에러처리(버퍼가 사라졌거나등등) 또는 여러개의 버퍼를 리스트로 가지고 있다가 f12 누를때마다 순환.. 등등 의 기능을 붙여도 좋겠는데.. 아직은 필요성이 느껴지질 않네.

우분투 8.04 에서 8.10 으로 업그레이드

오래전 삽질
http://oldpie.yoonkn.com/cgi-bin/moin.cgi/UbuntuDesktop
wubi 를 이용한 우분투 설치기

경험상 우분투 업그레이드가 한번에 완벽히 끝난적이 지금껏 단 한번도 없었으니 문제 생길때마다 정리해둔다.

  1. 8.04 는 LTS 라서 8.10 으로 업글이 뜨지 않으니 http://www.ubuntu.com/getubuntu/upgrading 참고해서 업글했다.
  2. 가장먼저 emacs 를 띄워봤는데 역시나 폰트가 엉망이네 좀 뒤져보니 이맥스쪽 문제라는데.. 어쨌건 https://bugs.launchpad.net/ubuntu/+source/emacs-snapshot/+bug/291399 를 참고해서 아래 코드를 추가해줬다.
    (set-frame-parameter nil 'font-backend '(xft x))
  3. 스피커 비프음 제거. 예전에 블랙리스트에 올려뒀는데 업데이트 하면서 덮어써서 다시 해줬다. /etc/modprobe.d/blacklistblacklist pcspkr 추가. 바로 적용하려면 sudo modprobe -r pcspkr
  4. 플래시 플러그인이 설치되었는데도 파이어폭스가 못찾는 문제. https://bugs.launchpad.net/ubuntu/+source/flashplugin-nonfree/+bug/281958 보고 심볼릭 링크 몇개 추가해서 해결. 헐 시바 이문제는 정말 짱나는군. 이문제를 만나는 사람이 몇명 없는 걸로 봐선 내가 플래시 플러그인을 몇개 바꿔가면서 설치해본게 문제였나보다?!
  5. usb 사운드카드를 이제 쓰질 않아서.. 이번엔 쉽게 지나갔다. 허허.
  6. emacs 에서 htmlize 가 안먹는 문제. invalid face 에러가 난다. 음 이건 htmlize.el 을 새버전으로 바꾸고 해결.
  7. 사운드 디바이스 문제. alsa 쪽 문제 인것 같은데 어제 퇴근후 오늘 와보니 사운드쪽이 먹통이네. 여러 플레이어들마다 서로 다른 에러를 뽑아줘서 검색하는데도 좀 난감했다. 아래 명령으로 리붓없이 해결.
    sudo alsa force-reload




2008년 11월 18일 화요일

html 을 누트로 보기위해서 lynx 를 이용 txt 로 덤프해봤다.

html 도 지원안하는 반쪽짜리 기기를 위해서 삽질을 좀 해봤다. 종종 이짓을 할께 뻔하니 적어둬야지.

  1. 구성이 깔끔하게 잘 되어있는 practical common lisp 를 긁어봤다.
  2. 먼저 인덱스 페이지를 덤프해서 링크만 뽑아냈다.
    lynx -dump -listonly http://www.gigamonkeys.com/book/ > list
  3. list 를 적당히 편집.. 내가 원하는 링크들만 남겨두고 나머지 삭제했다.

    이런식으로..

  4. 각 페이지별로 덤프! -nomargins 를 주면 왼쪽오른쪽 여백주던게 사라지면서 crlf 없이 한문단이 한줄로 나오니 이북리더에 잘 어울리는 출력이 나온다. 전에는 컬럼을 늘려주는 식으로 했었는데 노마진이 좀더 깔끔하군. 링크들을 cat 통해서 stdin 에서 받도록 - 로 마무리.
    cat list | lynx -nomargins -dump -nolist -dont_wrap_pre - >> output.txt
  5. 떨어진 output.txt 를 누트에 넣고 보니 음.. 그럴듯하게 보인다.


아 돌려본 환경은 win32 에서 lynx 2.8.6dev.17TH 버전 사용.
누트에서 대강 둘러본거라 원하는 모양이 아닐수도 있겠는데.. 누트상에서 이리저리 페이지 옮기는게 힘들어서 끝까지 확인하지 못했다.

이북리더 누트 구입

http://www.nuutbook.com/
http://ebookinside.com/
http://cafe.naver.com/ebook.cafe

환율도 오르고 마침 누트가 약간 할인해주는 행사를 하길래 질러버렸네.
이돈이면 아이팟 터치도 살수있는 돈인데.. 뭘로봐도 터치보다 나은게 하나도 없지만
오직 액정하나 보고 질러봤다. 방금 배달받고 대강 둘러보니 가독성은 그런대로 괜찮네.

누트에 커버2개 해서 247500 원.
후럴...


2008년 11월 12일 수요일

GDB 텍스트 유저 인터페이스 gdbtui




http://sourceware.org/gdb/current/onlinedocs/gdb_24.html

보통 디버깅시 emacs 상에서 gud 물려서 하지만 간단한 디버깅을 할때는 그냥 콘솔에서 gdb 를 띄우는데 이때 list 로 소스보는건 짜증나는 일이니 gdbtui 를 좀더 활용해보자...

  • gdb 때리는 버릇때문에 -tui 옵션을 주거나 gdbtui 로 띄울일은 없고.. 그냥 gdb 로 띄우고 적당히 디버깅하다가 소스뷰가 필요하면 C-X a 로 tui 모드로 전환하자. 필요없을경우 다시 C-X a 로 원래 모드로 돌아갈수도 있다.
  • 음 사실 내가 쓰는건 이게 전부.. 내가 어셈코드나 레지스터를 볼 이유도 없고..  소스뷰 하나 보이는 레이아웃이면 충분하다.
  • 혹시나 다른 레이아웃을 쓴다면 이맥스 단축키와 유사하니 외울것도 없고..
  • 손가락에 단축키 외울 용량이 남으면 싱글키 모드는 한번 써보고 싶은데 이거 쓰느니 그냥 emacs 에서 gud 띄우자. 정 필요하면 단축키 바꾸는 방법을 찾아보고..
  • 한글지원(주석에 한글등이 포함된 경우)이 어색하고.. 이것때문인지(?) 가끔 화면이 깨진다. 상당히 짜증나서 gdbtui 를 잘 안쓰게 되는 원인.

2008년 11월 11일 화요일

폴아웃 1 스토리 요약 - youtube

http://kr.youtube.com/watch?v=u_srLsECzGY
http://kr.youtube.com/watch?v=hLSsiqjvruo


UPNP 로 공유기 찾고 포트매핑 추가하기. lisp(SBCL 전용) 예제

아 시바 정말 귀찮네.
이넘들이 망할 soap 을 쓰는 바람에 C 로 짜긴 귀찮은 존재구나.
libupnp 까지 붙이고 싶지는 않고.. 내가 지금 하려는거에 굳이 soap 결과를 파싱까지 하고 싶지는 않고.. 그래서 간단히 upnp 기능만 돌려보는 테스트 스크립트를 만들어봤다. slime 상에서 여러가지 경우로 테스트 해보기 위해서 lisp 으로 만들었고 lisp 으로 udp 쏘는건 처음이라 소스를 적어둔다.

아래 소스 로딩하고 (discover-gateway) 부르면 같은 망 내의 공유기를 찾아서(하나라고 가정) control url 을 *control-url* 에 담기게 되고, 그상태에서 (test/blahblah) 함수들을 적절히 불러가면서 공유기가 무슨짓을 하는지 보면 된다.

그런데 포트매핑을 추가한상태에서 또 추가한다거나, 다른 어플리케이션이 이미 포트 뚫어논 상태에서 내가 같은 포트로 뚫으려고 한다거나.. 내 어플이 뒤지고 다시 깨서 이미 뚫린걸 다시 뚫으려고 한다거나.. 내가 뚫어논걸 다른 색히가 가로챈다거나.. 음.. 테스트할 경우의수가 좀 많구나... 아무래도 문서를 읽어봐야 할거 같군. 걍 미리 만들어둔 xml 뿅 쏘고 넘길려고 했는데 그리 쉽게는 안되겠네?? 지금 아래 구현체는 upnp 하나도 모르고 그냥 빗토런트의 upnp 구현체를 보고 따라친거 뿐인데 이정도 테스트 만으로 넘어가긴 좀 그렇구나.

문서좀 읽고 libupnp 를 검토해봐야겠구나.. 후랄.

아 그리고 당연한 말이지만 아래 코드는 테스트용으로 만든거라 여러 가정을 깔고 있고 환경이 바뀌면 안돌아갈수 있다.. 나중에 기억못할테니 적어두자면.. 로컬 IP 가 *local-ip-address* 에 상수로 박혀있고 udp 쏘고 소켓 읽는 부분이 블러킹으로 리딩하기 때문에 만약 같은 망 내에 공유기가 없으면 마냥 블러킹 되고.. find-location-blahblah 함수내의 정규식 패턴에 ^M 이 \r 제어문자 라는거.. 이맥스에서는 C-Q C-M 으로 입력이 가능한데 다른 에디터는 모르겠다. 나중에 다시 필요하면 여기서 긁어붙일텐데 이때 ^M 주의하자.



소스보기..





2008년 11월 5일 수요일

upnp 로 공유기 디스커버리 하는 예제 python

전에도 잠깐 해본적 있는데 다시 읽어보니 병신같이 적어뒀네...

# -*- coding: utf-8 -*-
#
# 헐 사무실에 공유기가 안보여서 집에 원격접속해서 간단히 upnp 테스트
# 코드를 돌려봤다. 걍 버리긴 그렇고 해서 적어둔다.
#
from socket import socket,AF_INET,SOCK_DGRAM

s = socket(AF_INET, SOCK_DGRAM)
discovery = "M-SEARCH * HTTP/1.1\r\n" + \
"Host:239.255.255.250:1900\r\n" + \
"ST:urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n" + \
"Man:\"ssdp:discover\"\r\n" + \
"MX:3\r\n" + \
"\r\n"
if s.sendto(discovery, ("239.255.255.250", 1900)) != len(discovery):
print "send error"
else:
print "send done"

print "try recvfrom"
(data,addr) = s.recvfrom(8192)
s.close()

print addr
print data

디스크립션을 보려면 위의 응답으로 떨어지는 location 에 그냥 브라우저 열고 GET 때려보면 된다.
SOAP 으로 제어하는건... 이전 위키에 있으니 생략.. 음 혹시나 테스트코드를 또 만들게되면 적어두자.




2008년 11월 3일 월요일

Virtual Machine-Based Replay Debugging 가상머신을 통해 프로그램실행을 녹화하고 재생해가며 디버깅하는 데모

http://kr.youtube.com/watch?v=RvMlihjqlhY


  • google techtalks 에 잼나는게 보이길래 구경해봤다. 끝까지 본건 아니고 대략 40분정도만 시청. 뭐 별내용은 없으니. 거기에 양키말 듣는척하는건 정말 스트레스.
  • 간단히 정리하면 프로그램이 돌아가는 꼴을 vmware 가 죄다 recording 을 하고(물론 모든 이벤트/상태들을 기록하는 무식한 방법이 아니고 input 이나 인터럽트 등 쌩뚱맞은 것들만 기록) 이 기록을 replay 해가면서 디버깅을 한다는것. 데모가 포함된 영상이니 꽤나 볼만하다. 만약 다시 봐야 한다면 대략 21:00 부터 보자.
  • 버그가 일어난 상황을 개발자가 만들어내는게 아니고 테스터가 만들어내서 그 상황을 개발자에게 패스해주는게 아주 맘에 드네. 뭐 그다지 새로운 아이디어라곤 생각되지 않지만 구현되서 돌아가는건 처음보는것 같다. 물론 아직은 이렇게 활용할 단계는 아니고 더 잘만들어진다면 정말 이런식으로 테스터들을 굴리는게 가능해질날이 올듯.
  • 뭐 굳이 테스터가 상황을 만드는게 아니더라도.. 개발자가 이짓을 하더라도 의미가 있지. 어떤 프로그램이 여러개의 다른 리모트 머신이나 프로세스와 상호작용을 할때 디버깅 환경을 맟추려면 혼자선 힘든 경우가 있는데(최악의경우 관련자 여려명이 한명 디버깅을 돕기위해서 시간을 버리는 경우도 있고) 이때 근사하게 하나 레코딩해서 디버거로 혼자 곱씹을수 있다면 정말 좋겠지.
  • 거꾸로 실행을 해볼수도 있다. reverse continue 라고 표현을 하면서 브레이크걸고 거꾸로 돌리는걸 데모에서 보여주는데 잘쓰면 편리할듯.

  • 나에게있어서의 실용성은 좀 의문이 드는데.. 적어도 몇년안에 내가 이걸 다시 관심가질 일은 없어보인다. 회사를 옮기지 않는한.
  • gdb 메인테이너가 참여해서 듣고있던데 gdb 가 이기능을 지원해줄지 모르겠네. visual studio 쪽에서만 지원하면 나한테는 일단 비호감.