Programmer/Programming
-
현상을 분석하여 문제의 원인을 찾아내라Programmer/Programming 2013. 11. 12. 17:46
현상을 재현하고 로그를 세심하게 살펴보고 필요하면 다른 도구(디버거, 성능 분석 도구 등)를 사용해서 분석한 후에 문제의 원인을 밝혀야 한다. 대충 추론하고 수정하여 적용한 뒤에 결과를 보는 방법은 생각보다 효과적이지 못하다. 소스를 공개하지 않은 상용 소프트웨어의 파일 읽기 플러그인을 개발하였다. 지금까지 탈없이 잘 쓰고 있었는데, 최근에 시스템에 문제가 생기면 플러그인과 상관없는 부분에서 행(hang)이 걸리는 문제가 발생하었다. 처음에는 문제의 원인을 추측하고 수정하고 검증하는 것을 반복하는 방법으로 접근하였다. 문제는 직감에 기반한 추론은 확율이 떨어졌다. 검증할때마다 여전히 문제가 발생하여, 수정과 검증의 과정을 여러번 반복해야 했다. 검증 과정을 준비하고 결과를 분석하는데도 상당한 시간이 들었..
-
간결하고 효율적인 프로그래밍Programmer/Programming 2013. 7. 22. 15:24
예전에 인터넷에서 중국 격투가의 동영상이 화제가 된 적이 있었다. 정확히 기억이 나지는 않지만 1900년대 중반에 촬영된 것으로 중국의 고수 2명 링에서 실전 격투를 벌이는 영상이었다. 나는 중국의 무술 영화의 한장면을 기대하며 시청했는데, 막상 그들은 무술을 전혀 배우지 않은 사람들처럼 마구잡이 난타전이 벌였다. 눈을 돌려서 최근에 이종 격투기를 살펴보자. 이들의 기술은 단순하고 효율적이다. 실전 격투에서는 화려하기 보다는 간결하고 파괴적인 동작, 이론으로만 존재하는 것이 아니라 실전에서 검증된 기술이 살아남는다. 현대의 이종 격투기와 같이, 중국 무예의 창시자는 대부분 실전 무술가로써 명성을 얻는 경우가 많다. 후대에서는 이 창시자가 어떤 생각을 가지고 무예의 동작과 훈련을 만들었는지는 무시되고, 스..
-
strspn/strcspnProgrammer/Programming 2013. 7. 9. 09:37
ffmpeg 코드를 보던 중에 못 보던 함수를 만났다. C 언어의 스트링 관련 함수는 거의 다 안다고 생각했는데, 학부까지 포함하면 20년만에 새로운 함수를 발견했다. #include size_t strspn(const char *s, const char *accept); size_t strcspn(const char *s, const char *reject); 메뉴얼 페이지에 의하면, strspn() 함수는 accept에 있는 문자들로 이루어져있는 s의 부분 문자열의 처음의 개수를 구한다. 즉, s 문자열의 앞에서 읽기 시작하여 accept에 포함되지 않은 문자가 나타나면 그 지점에서 멈추고 개수를 반환한다. 반대로, strcspn() 함수는 전체적으로 reject에 없는 문자들로 이루어져있는 s의 부..
-
치환 모델 (Substitution Model)Programmer/Programming 2013. 4. 10. 17:41
예제에 사용할 함수 (defun square (x) (* x x)) (defun sum-of-squares (x y) (+ (square x) (square y)) normal-order: 전체를 확장한 후에 다시 줄여나간다. (sum-of-squares (+ 5 1) (* 5 2)) 확장한다. (+ (square (+ 5 1)) (square (* 5 2))) (+ (* (+ 5 1) (+ 5 1)) (* (* 5 2) (* 5 2))) 줄인다. (+ (* 6 6) (* 10 10)) (+ 36 100) 136 applicative-order: 인자를 평가하고 적용한다. sum-of-squares의 인자를 평가하고 적용한다. (sum-of-squares (+ 5 1) (* 5 2)) (sum-of-sq..
-
DEFPARAMETER와 DEFVAR의 차이Programmer/Programming 2013. 1. 17. 16:23
Lisp에서 전역 변수(global variable)를 정의하는 방법은 DEFPARAMETER와 DEFVAR를 사용하는 두가지가 있다. 이 둘의 차이는 재정의(redefine) 이후 변수의 값이 정의대로 갱신되는지 여부이다. DEFPARAMETER는 재정의 할 때마다 새로운 값으로 갱신되는 반면, DEFVAR는 변수의 값이 계속 유지가 된다. 다시 말하면, DEFVAR는 바인딩 되지 않았을 때(unbound), 초기값으로 설정이 된다. > (defparameter *foo* 5) *FOO* > *foo* 5 > (defparameter *foo* 6) *FOO* > *foo* 6 > (defvar *bar* 5) *BAR* > *bar* 5 > (defvar *bar* 6) *BAR* > *bar* 5 ..