2008년 12월 26일 금요일

clojure 나 봐야지

haskell 은 너무 난해해서 일단 포기.
그리고 빌드후 바이너리가 생각처럼 작게 나오질 않으니 써먹을데가 없네
win32 에서 opengl 간단한 예제가 빌드후 바이너리가 2메가 였던가..
어차피 배포 쉽게 못하면 lisp 쪽이 훨 좋지.

그래서
자바도 공부해볼겸 해서 clojure 를 잠깐 돌려봤다.
slime 이 지원되서 코딩은 아주 쾌적한편.
디버깅은 아직 안해봐서 모르겠지만 그닥 편하지 않을듯.


간단히 자바 튜터리얼들을 읽어보면서 나오는 코드들을 clojure 로 따라쳐보고있는데 java 를 모르니 좀 난감한 면이 있네.


;;; http://java.sun.com/docs/books/tutorial/networking/urls/readingURL.html
(import '(java.net URL)
'(java.io InputStreamReader
BufferedReader))
(defn url-read [addr]
(let [url (URL. addr)
is (.openStream url)
isr (InputStreamReader. is)
br (BufferedReader. isr)]
(loop [line (.readLine br)]
(when line
(println line)
(recur (.readLine br))))
(.close br)))



2008년 12월 20일 토요일

eshell 에서 ls -l 을 했을때 win32 인 경우 줄이 안맞는 문제.



format-time-string 의 문제인것 같은데 linux 에서는 eshell 상에서 ls -al 의 포매팅이 줄이 잘 맞지만 win32 에서는 줄이 흩어져서 보기가 흉하다.

오늘까지 걍 참고 썼는데 갑자기 눈에 거슬리길래 그냥 소스를 수정했다.

em-ls.el 의 eshell-ls-file 함수 코드중에 format-time-string 를 부르는 부분이 있는데 이중 "%b %e " 를 적절히 수정하면 된다. 나는 "%2b-%d " 로 사용중.

음 스샷에 찍힌것은 "%2b %d " 를 사용한것이군..


2009/06/09 추가. 그냥 수정한 함수 올려둔다. 별의미는 없다만 가까운 시일내에 또 삽질하게 되면 그냥 가져다 붙여야지

펼쳐두기..




2008년 12월 19일 금요일

emacs 디렉토리별 설정 적용 Per-Directory Local Variables

프로젝트마다 다른 변수를 쓰고 싶을때(특히 빌드시) 이런 기능이 필요해서 dirvars.el 을 가져다 쓰고있었는데 오늘 이맥스위키를 구경하다 보니 유사기능이 정식으로 지원되고 있었네.


info 에서 관련 페이지 따서 적어둔다.

펼쳐두기..



대강 테스트 해봤는데 위 제시된 방법중 첫번째는 잘 안먹네.. dirvars.el 하고 충돌인가. 흠...
뭐 어차피 두번째 방법이 더 맘에 드니 별 문제는 없다.
당장 아래 코드 집어넣고 돌려보니 잘 먹는다.
(define-project-bindings 'mao
  '((nil . ((yoonkn-build-option . (:wc "/tmp/libbrpc" :cmd "make "))))))
(set-directory-project "~/scratch/libbrpc" 'mao)
음 좀더 써보고 dirvars.el 을 아예 빼버리자..
지금 크게 남은게 yoonkn-build 함수를 좀더 정리하는 거하고 anything-mode 에서 이 프로젝트들을 띄워주는거... 음 또 뭐 있을까?


locate-dominating-file 함수도 편해보이던데 솔루션 파일을 찾거나 할때 쓰면 빌드가 좀더 편해지겠구만.






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 조각 정도로 쪼개져있었네. 조각모음 돌리고 다시 리눅스로 들어가보니 쪼금은 나아진것 같기도.