2008년 12월 16일 화요일

cmake 에 sloc 타겟 추가

sloc 란
http://en.wikipedia.org/wiki/Source_lines_of_code

sloccount
http://www.dwheeler.com/sloccount/

cmake 에 타겟 추가
# sloc
find_program(sloccount NAMES sloccount)
if(sloccount)
add_custom_target(sloc ${sloccount} ${CMAKE_SOURCE_DIR})
endif(sloccount)



2008년 12월 9일 화요일

haskell 쓰레드간 동기화에 쓰이는 MVar

음 이게 결국 동기화 기능을 가진 임의 타입의 컨테이너 구먼.


아주 간단한 예제

펼쳐두기..



또다른 예제. () 를 넣어서 값 자체는 의미없이 이벤트처럼 써먹었다.

펼쳐두기..


음.. 그런데 채널 이니 세마포어니 하는 것들도 보이네. 채널은 아예 프로듀서-컨슈머 모델인거 같고. 뭐가 어떤 용도로 쓰이는지 더 공부해야 하겠군. 사실 요 MVar 를 어떻게 써야 잘 쓰는건지 잘 안그려진다...

다음번 haskell 공부는 언제가 될지 헐.

haskell IORef 를 이용한 두 쓰레드간의 공유 변수

{-
두개의 쓰레드가 하나의 변수를 공유하는 예제를 만들어봤다.

공유한다는것 자체가 값이 변한다는 의미이니 펑셔널한것과는 거리가
멀고 따라서 모나드를 써야 하더라. IORef 가.. 일종의 변수..다른
언어들 처럼 값을 가지는 자리.. place holder 를 만들어주는
개념같구만. 이걸로 IORef a 타입의 값을 만들면 이 값을 통해 값을
읽거나, 바꾸거나 할수 있다.

아직 동기화 부분은 공부를 안해서 아래 코드는 상당히 엉성한데 (동기화
없고, 자식 thread 종료를 기다리는데 sleep 사용) 쓰레드간의 변수
공유라는 원래 목적엔 충분한 예제라고 생각 되는구만.

아.. 애초에 이걸 공부하게 된 이유는 haskell 에서 시그널 핸들러를 달고
있는 도중에 SIGINT 를 잡아도 main loop 에 멈추라는 플래그를 어떻게
전달을 해야 하나 고민을 하다가 작성하게 된것이다.
-}


import Data.IORef
import Control.Concurrent

-- 쓰레드? 두개를 까야지.
-- 두 쓰레드는 변수? var 를 공유하고
-- 한 쓰레드는 줄창 찍어대고
-- 한 쓰레드는 절절히 값을 바꿔보자.
-- 동기화는 아직 몰라서 안걸었삼.
main = do
var <- newIORef 0
foo <- forkIO (threadFoo var)
bar <- forkIO (threadBar var)
threadDelay 100000000 -- 음 낄낄. join 방법을 아직 몰라서..

threadFoo var = do
v <- readIORef var
print v
threadDelay 100
threadFoo var


-- 음 atomicModifyIORef 가 아주 편리해 보이는데 MVar 를 아직 모르니
-- 일단 넘어간다.
threadBar var = do
modifyIORef var (+1)
threadDelay 200
threadBar var




흠. 추가로 적어둔다.
건 위 코드로 테스트 후 만들어본 SIGINT 처리 예제
음. 사실 이런건 전역변수가 더 어울린다고 생각하는데
아직 잘 모르니 뭐..

-- 바쁘게 돌아가며 플래그를 확인하는 메인루프가 있고
-- SIGINT 떨어지면 플래그 값 바꿔서 메인루프 종료시키는
-- 간단한 예제
import System.Posix.Signals
import Data.IORef
import Control.Concurrent

loop stop = do
s <- readIORef stop
putStrLn "busy"
if s then return ()
else loop stop

sigint stop = do
print "SIGNAL"
writeIORef stop True

main = do
stop <- newIORef False
old_handler <- installHandler sigINT
(Catch $ sigint stop)
(Just fullSignalSet)
loop stop



wubi 성능 저하


스샷은 타이밍이 안맞아서 mount.ntfs 가  CPU 를 얼마 안쓰는걸로 나왔는데 사실 저거 100 치고 그동안 시스템 먹통이다.


wubi 를 이용한지도 반년이 넘은것 같은데 지금 열라 후회중.
사무실에서는 윈도로 부팅하지 않고 지금까지 우분투로만 부팅해서 쓰고있는데 disk IO 가 너무 느려서 짜증난다. 좀 덩치큰 SDK 하나 압축 풀려면 먹통된 상태로 몇시간 걸리고 오늘은 600 메가 짜리 이미지 브라우저로 다운받다가 시스템이 먹통되고 접속이 끊어져 버리네.

다시 까는게 귀찮으니 걍 참고 썼는데 오늘은 너무 짱난다.
어째 갈수록 느려지는듯? 윈도로 들어가서 디프래그라도 돌려볼까.
이를 우얄꼬



추가.
음 윈도로 부팅해서 조각모음 돌려보니 우비 파티션 파일이 9000 조각 정도로 쪼개져있었네. 조각모음 돌리고 다시 리눅스로 들어가보니 쪼금은 나아진것 같기도.









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 를 잘 안쓰게 되는 원인.