Programmer
-
간단한 데이타베이스를 TDD 로 개발하기 소스 코드Programmer/Programming 2014. 3. 19. 10:04
아래는 간단한 데이타베이스를 TDD로 개발하기의 최종 결과물이다. cd-db.lisp (defpackage :cd-db (:use :common-lisp) (:export #:dump-db #:drop-db #:make-record #:add-record #:save-db #:load-db #:where #:select #:update #:make-comparison-expr #:make-comparisons-list #:delete-records)) (in-package :cd-db) (defvar *db* nil) (defun dump-db () *db*) (defun drop-db () (setf *db* nil)) (defun make-record (title artist rating ripped..
-
간단한 데이타베이스를 TDD 로 개발하기 3회: add-recordProgrammer/Programming 2014. 3. 19. 10:02
이번 강의에서는 CD 레코드를 DB에 추가하는 함수 add-record를 개발한다. 이 함수는 인자로 CD 레코드를 받는다. 비어있는 DB에 add-record로 레코드를 추가하면, (add-record (make-cd "Home" "Dixie Chicks" 9 t)) dump-db는 다음과 같은 결과를 출력한다. '((:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t)) 1차 테스트의 구현과 통과는 쉽고 간단함으로 빠르게 진행하자. (define-test add-record-test (add-record (make-cd "Home" "Dixie Chicks" 9 t)) (assert-equal '((:title "Home" :artist "Dixie ..
-
간단한 데이타베이스를 TDD 로 개발하기 2회: make-cdProgrammer/Programming 2014. 3. 19. 09:57
이번에는 CD의 레코드를 만드는 함수를 만들어보자. 함수의 이름은 make-cd이며 인자로 제목, 아티스트, 순위, 리핑 여부를 전달한다. (make-cd "Home" "Dixie Chicks" 9 t) 반환값은 이전 강의에서 언급한 속성 리스트를 출력한다. (:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t) 우리가 예상하는 동작을 토대로 테스트를 작성하자. (define-test make-cd-test (assert-equal '(:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t) (make-cd "Home" "Dixie Chicks" 9 t))) 우선 가장 단순한 방법으로 위 테스트를 통과시키자...
-
간단한 데이타베이스를 TDD 로 개발하기 1회: dump-dbProgrammer/Programming 2014. 3. 19. 09:47
앞으로 몇번에 걸쳐서 연재할 내용은 Peter Seibel가 쓴 “Practical Common Lisp” 중에 3장 “A Simple Database”를 테스트 주도 개발(Test-Driven Development: TDD)로 재구성한 것이다. 책과 비교해서 프로그램의 작성 순서만 달리할 뿐 소스는 책의 것과 같다. 이번 연재에는 테스트 프레임워크로 lisp-unit을 이용한다 CD 데이타베이스인 cd-db 패키지와 테스트가 있는 cd-tests 패키지로 분리하여 개발을 시작한다. (defpackage :cd-db (:use :common-lisp) (:export #:dump-db)) (in-package :cd-db) (defpackage :cd-tests (:use :common-lisp :lis..
-
국내에서 IPv6 주소를 접하기 어려운 이유Programmer/Computer Science 2014. 3. 14. 15:51
IPv4의 주소 고갈 문제, IPv6의 전환, IPv6와 멀티미디어 데이타의 증가 등의 얘기가 나온지 꽤 오래되었다. 사실 이미 IANA(Internet Assigned Numbers Authority)에서의 할당은 더 이상 없는 상태다. 관련 종사자들은 이미 “왜?”라는 필요성에 대해서는 공감대의 형성은 지났고 지금은 “어떻게?”라는 IPv6로의 전환 방법에 대해서 연구하고 있다. 그런데, 인터넷 콘텐트 전송 서비스를 개발하고 서비스하는 사람으로써 IPv6을 전혀 체감하지 못하고 있다. 개똥이네 금송아지 얘기를 듣는 기분이다. 뭔가 굉장한 것이 있다고는 하는데, 한번도 본적이 없다. 그러면서 개똥이는 자기네 금송아지를 볼 준비를 하라한다. 즉, 실제 서비스 운영에서는 그것의 그림자도 본적이 없는데, 개..
-
현상을 분석하여 문제의 원인을 찾아내라Programmer/Programming 2013. 11. 12. 17:46
현상을 재현하고 로그를 세심하게 살펴보고 필요하면 다른 도구(디버거, 성능 분석 도구 등)를 사용해서 분석한 후에 문제의 원인을 밝혀야 한다. 대충 추론하고 수정하여 적용한 뒤에 결과를 보는 방법은 생각보다 효과적이지 못하다. 소스를 공개하지 않은 상용 소프트웨어의 파일 읽기 플러그인을 개발하였다. 지금까지 탈없이 잘 쓰고 있었는데, 최근에 시스템에 문제가 생기면 플러그인과 상관없는 부분에서 행(hang)이 걸리는 문제가 발생하었다. 처음에는 문제의 원인을 추측하고 수정하고 검증하는 것을 반복하는 방법으로 접근하였다. 문제는 직감에 기반한 추론은 확율이 떨어졌다. 검증할때마다 여전히 문제가 발생하여, 수정과 검증의 과정을 여러번 반복해야 했다. 검증 과정을 준비하고 결과를 분석하는데도 상당한 시간이 들었..
-
GLib의 GHashTable로 알아보는 해시 테이블의 충동 해결 방법Programmer/Computer Science 2013. 9. 17. 11:19
GLib에서 제공하는 해시 테이블(hash table)의 구현인 GHashTable의 충동을 해결하는 알고리즘을 살펴보자. GHashTable은 Open Addressing 방법 중에 Quadratic Probing 알고리즘을 사용하여 충동을 해결한다. 해시의 연산-삽입(Insert), 검색(Lookup), 삭제(Remove)-을 할 때는, 주어진 키에 해당하는 적절한 해시 테이블의 인덱스 번호를 먼저 구해야 한다. GHashTable에서는 g_hash_table_lookup_node() 함수가 이를 수행한다. 이 함수에서 해시키의 충동 해결 알고리즘이 구현되어 있다. static inline guint g_hash_table_lookup_node (GHashTable *hash_table, gconst..
-
GLib의 GTree로 알아보는 균형 이진 트리 알고리즘Programmer/Computer Science 2013. 8. 20. 17:31
GLib에서 제공하는 균형 이진 트리(balanced binary tree)의 구현인 GTree의 알고리즘을 살펴보자. GTree는 AVL tree (Adelson-Velskii and Landis' tree) 알고리즘을 사용하였다. 우선 균형 상태에 대한 정의부터 해야하겠다. 트리 A가 균형 상태라고 하면A의 하위 트리(subtree) A(L)과 A(R)이 균형 상태이고A(L)과 A(R)의 높이의 차이가 1 이하이다. abs(height(A(L)) - height(A(R))) balance left->balance left->balance > 0 LR node->balance > 1 node->right->balance >= 0 RR node->right->balance < 0 RL..