Gsong's Blog


SICP 연습문제 풀이 2.58


a. Infix notation
 
b. multiple operand 를 infix 로 지원하는 건 만들기가 쉽지 않다. 차라리 infix notation 을 만들어 prefix 바꿔주는 converter 를 만드는 것이 훨씬 효율적이고 쉬운 일이 될 것이다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2009/01/12 00:02 2009/01/12 00:02
top

 

SICP 2008/10 정기모임


SICP 정기모임을 갔다 왔습니다. 참석자는 지아님, 컴키드님, 디군님, 솔리드원님, 꼬니님 그리고 저까지해서 총 6명. 체크인하면서 지난 시간 동안 어떤 일들이 있었는지 이런 저런 얘기들을 하고, 곧 이어 컴키드님이 유닛테스팅에 대한 발표를 해주셔서 그에 대한 토론이 오갔습니다. 그렇잖아도 유닛테스팅을 좀 배워서 써먹어 볼까 하는 때에 아주 큰 도움이 되는 세션이었습니다.

발표가 끝난 후 자연스레 유닛테스팅과 TDD 에 대한 토론으로 이뤄졌는데, 저는 둘 다 시도해보지 않았던 터라 질문만 했습니다. 회사 내부에서 쓰는 유닛 테스팅 프레임웍이 있을 것 같은데 한번 찾아봐야 될 것 같더군요.

그렇게 해서 어쩌다 보니 2시간이 후딱 지나가버렸네요. 시작하기 전에 한 15 분 정도를 그냥 보내고 해서 그런가 싶기도 했구요. 던킨도넛으로 자리를 옮겨서 얘기하는 시간을 가졌지만, 흐름이 끊겨서 토론의 주제가 이어지지는 않았습니다. 그래서 다음번엔 주제 토론을 압축적으로 할 수 있는 방법들 찾아서 얘기해보면 좋겠다 싶기도 했습니다.

아래는 오늘 세션중에 언급됐던 책들입니다.


실용주의 프로그래머를 위한 단위 테스트 with JUnit
데이비드 토머스 외 지음, 이용원 외 옮김/인사이트


테스트 주도 개발
켄트 벡 지음, 김창준 외 옮김/인사이트


레거시 코드 활용 전략
마이클 C. 페더스 지음, 이우영.고재한 옮김/에이콘출판

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/10/28 11:38 2008/10/28 11:38
top

 

SICP 연습문제 풀이 2.57


(define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) ((sum? exp) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) ((product? exp) (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var)) (make-product (deriv (multiplier exp) var) (multiplicand exp)))) ((exponentiation? exp) (make-product (exponent exp) (make-product (deriv (base exp) var) (make-exponentiation (base exp) (- (exponent exp) 1))))) (else ((error "unknown expression type -- DERIV" exp))))) (define (variable? x) (symbol? x)) (define (same-variable? v1 v2) (and (variable? v1) (variable? v2) (eq? v1 v2))) (define (make-sum a1 a2) (cond ((=number? a1 0) a2) ((=number? a2 0) a1) ((and (number? a1) (number? a2)) (+ a1 a2)) (else (list '+ a1 a2)))) (define (make-product m1 m2) (cond ((or (=number? m1 0) (=number? m2 0)) 0) ((=number? m1 1) m2) ((=number? m2 1) m1) ((and (number? m1) (number? m2)) (* m1 m2)) (else (list '* m1 m2)))) (define (sum? x) (and (pair? x) (eq? (car x) '+))) (define (addend s) (cadr s)) (define (product? x) (and (pair? x) (eq? (car x) '*))) (define (multiplier p) (cadr p)) (define (=number? exp num) (and (number? exp) (= exp num))) (define (exponentiation? x) (and (pair? x) (eq? (car x) '**))) (define (base x) (cadr x)) (define (exponent x) (caddr x)) (define (make-exponentiation base exponent) (cond ((=number? exponent 0) 1) ((=number? exponent 1) base) ((and (number? exponent) (number? base)) (fast-exp base exponent)) (else (list '** base exponent)))) (define (fast-expt b n) (cond ((= n 0) 1) ((even? n) (square (fast-expt b (/ n 2)))) (else (* b (fast-expt b (- n 1)))))) (define (square x) (* x x)) ;Solution 2.57 (define (augend s) (if (null? (cdddr s)) (caddr s) (cons '+ (cddr s)))) (define (multiplicand p) (if (null? (cdddr p)) (caddr p) (cons '* (cddr p))))
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/10/12 18:03 2008/10/12 18:03
top

 

SICP 연습문제 풀이 2.56


(define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) ((sum? exp) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) ((product? exp) (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var)) (make-product (deriv (multiplier exp) var) (multiplicand exp)))) ((exponentiation? exp) (make-product (exponent exp) (make-product (deriv (base exp) var) (make-exponentiation (base exp) (- (exponent exp) 1))))) (else (error "unknown expression type -- DERIV" exp)))) (define (variable? x) (symbol? x)) (define (same-variable? v1 v2) (and (variable? v1) (variable? v2) (eq? v1 v2))) (define (make-sum a1 a2) (list '+ a1 a2)) (define (make-product m1 m2) (list '* m1 m2)) (define (sum? x) (and (pair? x) (eq? (car x) '+))) (define (addend s) (cadr s)) (define (augend s) (caddr s)) (define (product? x) (and (pair? x) (eq? (car x) '*))) (define (multiplier p) (cadr p)) (define (multiplicand p) (caddr p)) (define (=number? exp num) (and (number? exp) (= exp num))) ;Solution (define (exponentiation? x) (and (pair? x) (eq? (car x) '**))) (define (base x) (cadr x)) (define (exponent x) (caddr x)) (define (make-exponentiation base exponent) (cond ((=number? exponent 0) 1) ((=number? exponent 1) base) ((and (number? exponent) (number? base)) (fast-exp base exponent)) (else (list '** base exponent)))) (define (fast-expt b n) (cond ((= n 0) 1) ((even? n) (square (fast-expt b (/ n 2)))) (else (* b (fast-expt b (- n 1)))))) (define (square x) (* x x))
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/10/12 18:02 2008/10/12 18:02
top

 

SICP 연습문제풀이 2.42


;2.42 (define (queens board-size) (define (queen-cols k) (if (= k 0) (list empty-board) (filter (lambda (positions) (safe? k positions)) (flatmap (lambda (rest-of-queens) (map (lambda (new-row) (adjoin-position new-row k rest-of-queens)) (enumerate-interval 1 board-size))) (queen-cols (- k 1)))))) (queen-cols board-size)) (define (flatmap proc seq) (accumulate append nil (map proc seq))) (define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence))))) (define nil (list)) (define (filter predicate sequence) (cond ((null? sequence) nil) ((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr sequence)))) (else (filter predicate (cdr sequence))))) (define (enumerate-interval low high) (if (> low high) nil (cons low (enumerate-interval (+ low 1) high)))) ;Solution (define empty-board (list)) (define (adjoin-position new-row k rest-of-queens) (append rest-of-queens (list new-row))) (define (safe? k position) (define (iter col i) (cond ((= i k) #t) ((and (SafeCol? position (- k i) col) (SafeCol? position (- k i) (+ col i)) (SafeCol? position (- k i) (- col i))) (iter col (+ i 1))) (else #f))) (iter (colValue k position) 1)) (define (colValue k position) (if (= k 1) (car position) (colValue (- k 1) (cdr position)))) (define (SafeCol? position checkcol col) (not (= col (colValue checkcol position))))
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/10/04 13:58 2008/10/04 13:58
top

 

SICP 연습문제풀이 2.39


(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence))))) (define fold-right accumulate) (define (fold-left op initial sequence) (define (iter result rest) (if (null? rest) result (iter (op result (car rest)) (cdr rest)))) (iter initial sequence)) (define nil (list)) (define (reverse_ sequence) (fold-right solution nil sequence)) (define (reverse_2 sequence) (fold-left solution2 nil sequence)) (define solution (lambda (x y) (append y (list x)))) (define solution2 (lambda (x y) (cons y x))) 'test result > (reverse (list 1 2 3 4 5)) (5 4 3 2 1) > (reverse_ (list 1 2 3 4 5)) (5 4 3 2 1) > (reverse_2 (list 1 2 3 4 5)) (5 4 3 2 1) >
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/09/30 22:09 2008/09/30 22:09
top

 

SICP 연습문제 풀이 2.6


(define zero (lambda (f) (lambda (x) x))) (define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x))))) (define one (lambda (f) (lambda (x) (f x)))) (define (plus a b) (lambda (f) (lambda (x) ((b f) ((a f) x))))) (define (test n int) (equal? int ((n (lambda (x) (+ x 1))) 0))) ' test result > (test zero 0) #t > (test one 1) #t > (test (add-1 zero) 1) #t > (test (plus zero zero) 0) #t > (test (plus zero one) 1) #t > (test (plus one one) 2) #t > (test (plus one (plus one one)) 3) #t >
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/09/30 21:42 2008/09/30 21:42
top

 

SICP 2008/7 정기모임


SICP 월간 정기 모임에 다녀왔습니다. 체크인을 마치고 주제별 토론(?) 순서로 진행되었는데요. d군님의 Statement vs Expression 이야기 아주 유익하니 좋았고, 그 다음은 책 이야기를 했었네요.

각자 체크인은 지아님은 'Panic', 컴키드님은 '초심', 하야로비 '방황', gsong '성장통', soonoh '행운', D군 '우쭐우쭐' 로 했습니다.

월간회고에서는 다들 어떻게 한달을 보냈는지 이야기들을 많이 했고, 이 와중에 슬슬 수다에 불이 지펴진 듯 합니다.ㅎㅎ

주제별 토론 중 채택되지 못한 것 중에 흥미로운 것들을 몇개 메모해놨는데, 개발자의 대화 방법과 code review 다음에 기회가 되면 이런 거 얘기해보면 재밌을 것 같네요.

책 이야기에서는 많은 목록이 나왔는데

  • GoF 디자인 패턴
  • 드림버스터
  • 고추장, 책으로 ...
  • 달인, master mind
  • 마지막 강의
  • game coding complete
  • 30대 심리학
  • 타나토노트
  • 프로그래밍 수련법
  • 팡세

등이 있었네요.

컴키드님이 이번 모임에 대해 무형식의 형식이라는 표현을 쓰셨는데, 아주 적절하네요. 점점 수다 모임처럼 되고 있는데 이게 나쁜 건 아니라고 봅니다. 긍정적인 부분도 많고요. 다만 '컨텍스트안에 녹여내기' 를 하기 위해 대화의 주제를 적절히 계속 바꿔가면 좋을 것 같고, 지금처럼 이야기해보고 싶은 소재를 하나씩 꺼내놓는 방법이 계속 유효할 것 같네요.

새로오신 두 분도 반가웠구요. 하야로비님은 금새 적응하셨고, 자바로 게임개발하는 이야기들도 아주 흥미로웠습니다. soonoh 님도 다음에는 더 잘 적응된 모습을 보여주리라 믿습니다. ㅎㅎ

아무튼 그렇게 재밌게 또 정기모임을 마쳤네요. 다들 공부 열심히 하시고 다음에 뵙지요.

(모임에서 이것 저것 노트한 게 있었는 데 집에 있어서 저녁에 내용을 좀 더 추가할 예정입니다. 조금 추가했습니다. ^^)

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/07/29 01:09 2008/07/29 01:09
top

 

SICP 2008/6 정기모임 회고


SICP 정기모임이 있었습니다. 첫번째 모임에서 뵀던 반가운 분들과 이번에 새로 인사를 드리게 된 솔리드원 님과 함께 했습니다.

모임 순서나 어떤 이야기들이 오갔는지는 다른분들이 많이 하셨으니 그냥 넘어가도록 하고, 가장 많은 시간을 할애했던 주제는 '스터디모임을 어떻게 굴릴까?' 라는 주제였습니다.

많은 분들이 알게 모르게 비슷한 문제점들을 느끼고 계셨더군요. 모임 체크인 발언에서 솔리드원님이 해주신 "긍정적 태도로 공부할 수 있게 해보자" 는 말과도 일맥상통하는 이야기입니다. 그러니까 시나브로 우리는 Inner Game 에서 말하는 Self1 에 사로잡혀 있었던 거지요.

즐거운 토론 끝에 그룹의 대화를 늘리자는 데 모두 동의 했습니다. 대화 속에 문제 풀이나 공부 이야기를 섞어놓자는 거지요. 좋은 시도라고 봅니다.

자 이제 Self2 oriented study 를 해보자구요. 
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/06/17 14:53 2008/06/17 14:53
top

 

2008/03 2주째 SICP 스터디 회고


스터디계획

Fact

주중에 30분씩이라도 공부해보겠다는 게 무색할 정도로 하나도 하지 못했네요. 그나마 주말에 몰아서 밀린 연습문제를 풀긴 했지만 그마저도 목표치에 도달하지 못했습니다.

Feeling

연습문제만 풀고 넘어가다보니 챕터 1 을 통해 책에서 하고 싶었던 이야기가 뭔지 모르게 돼버렸습니다. 챕터를 관통하는 주제를 염두에 두고 공부를 해야겠습니다.

Finding

수식 입력 용으로 마이크로소프트 워드를 사용하고 있는데 아주 좋네요. 뒤쪽에 증명 문제도 있다고 하니 유용하게 쓸 수 있을 것 같습니다.

Future Action

지킬 수 있는 계획으로 수정해야 겠습니다. 지키지 못하는 계획은 심적인 부담만 주는 것 같아요.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/03/18 00:07 2008/03/18 00:07
top

 

2008/03 1주째 SICP 스터디 회고


스터디계획

Fact

책을 읽을 시간은 주말 밖에 없는데, 이번 주는 스키장을 다녀오느라 공부를 하지 못했습니다.

Feeling

문제 난이도가 점점 생기는 게 재밌기는 한 데 시간이 너무 많이 걸리네요.

Finding

1.12 에 대한 질문에 대한 답변을 보니 이런것도 가능하구나 했습니다.

Future Action

계획이 많이 늦어질려고 합니다. 주중에 자기전 40 분씩 시간을 내봐야겠어요. 일단 1.28 연습문제까지 금요일안으로 풀고 스터디 진도를 이어가겠습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/03/09 20:50 2008/03/09 20:50
top

 

2008/02 5주째 SICP 스터디 회고


스터디계획

Fact

주중에는 공부를 하지 못했습니다. 주말 시간을 이용해서 계획한 양만큼 책을 읽었고, 연습 문제는 주말에과 다음 주중을 이용하여 풀 생각입니다. 책 읽은 시간 : 2시간  문제풀이 시간:1시간  (진행중)

Feeling

아직 챕터1 인데도 문제 푸는 데 걸리는 시간이 점점 늘어나고 있네요. 생각할 꺼리를 많이 던져주는 것 같습니다. 스터디그룹의 다른 분들과 얘기를 많이 하면서 진행해야 발전이 있을 것 같습니다.

Finding

프로그래밍을 넘어 수학이나 알고리즘등 여러 생각할 꺼리들을 제공해주는 것 같아 좋네요.

Future Action

메일링리스트에서 문제 풀이와 관련된 토론에 열심히 참여해야겠습니다. 

Feedback 이 있으시면 답글을 달아주세요.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/03/02 01:16 2008/03/02 01:16
top

 

SICP 연습문제 풀이 1.39


[CODE]
(define (square x) (* x x))
(define (tan-cf x k)
  (define (d-tan i) (- (* 2 i) 1))
  (define (n-tan i)
    (if (= i 1)
        x
        (square x)))
  (cont-frac n-tan d-tan k))
[/CODE]
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 18:12 2008/01/31 18:12
top

 

SICP 연습문제 풀이 1.38


[CODE]
(define (n-e i) 1.0)
(define (d-e i)
  (if (= 2 (remainder i 3))
      1.0
      (* 2 (/ (+ i 1) 3))))

[/CODE]

> (+ 2 (cont-frac n-e d-e 10))
2.4813757546665216
>
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 18:05 2008/01/31 18:05
top

 

SICP 연습문제 풀이 1.37


a.

[CODE]
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (display v1)
    (newline)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))

(define tolerance 0.00001)

(define (average x y) (/ (+ x y) 2))

(define (cont-frac n d k)
  (define (cont-frac-iter i)
    (if (= i k) 0
        (/ (n i) (+ (d i) (cont-frac-iter (+ i 1))))))
  (cont-frac-iter 1))
[/CODE]

> (/ 1 (cont-frac (lambda (x) 1.0) (lambda (x) 1.0) 10))
1.6176470588235294

> (/ 1 (cont-frac (lambda (x) 1.0) (lambda (x) 1.0) 12))
1.6179775280898876
> (/ 1 (cont-frac (lambda (x) 1.0) (lambda (x) 1.0) 13))
1.6180555555555558

b.
[CODE]
(define (cont-frac n d k)
  (define (cont-frac-iter i result)
    (if (= i 0) result
        (cont-frac-iter (- i 1) (/ (n i) (+ (d i) result)))))
  (cont-frac-iter k 0))

[/CODE]
> (/ 1 (cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 13))
1.6180257510729614

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 17:37 2008/01/31 17:37
top

 

SICP 연습문제 풀이 1.36


[CODE]
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (display v1)
    (newline)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))

(define tolerance 0.00001)
[/CODE]

> (fixed-point (lambda (x) (/ (log 1000) (log x))) 3)
3
6.287709822868153
3.757079790200296
5.218748919675315
4.180797746063314
4.828902657081293
4.386936895811029
4.671722808746095
4.481109436117821
4.605567315585735
4.522955348093164
4.577201597629606
4.541325786357399
4.564940905198754
4.549347961475409
4.5596228442307565
4.552843114094703
4.55731263660315
4.554364381825887
4.556308401465587
4.555026226620339
4.55587174038325
4.555314115211184
4.555681847896976
4.555439330395129
4.555599264136406
4.555493789937456
4.555563347820309
4.555517475527901
4.555547727376273
4.555527776815261
4.555540933824255
4.555532257016376

With average damping
[CODE]
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (display v1)
    (newline)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))

(define tolerance 0.00001)

(define (average x y) (/ (+ x y) 2))

[/CODE]
> (fixed-point (lambda (x) (average x (/ (log 1000) (log x)))) 3)
3
4.643854911434076
4.571212264484558
4.558225323866829
4.555994244552759
4.555613793442989
4.5555490009596555
4.5555379689379265
4.55553609061889
>

Average damping 사용 시 근사 값을 훨씬 빨리 찾는 것을 알 수 있다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 17:27 2008/01/31 17:27
top

 

SICP 연습문제 풀이 1.35


f(x) = 1 + 1/x
일때 fixed point transformaiton 을 하면
f(x) = x
->  1 + 1/x = x 양변에 x 를 곱해서
x + 1 = x^2

golden ration phi 는 위 식을 만족시키는 값이다. 증명끝.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 16:10 2008/01/31 16:10
top

 

SICP 스터디 연습문제 풀이 1.34


> (f f)
. procedure application: expected procedure, given: 2; arguments were: 2
>

이런 에러가 난다.
(f f)
-> (f 2)
-> (2 2)

가 되어 위의 에러가 난다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 15:54 2008/01/31 15:54
top

 

SICP 연습문제 풀이 1.33


[CODE]
(define (filter-accumulate filter combiner null-value term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (combiner result
                                 (if (filter a)
                                     (term a)
                                     null-value)))))
  (iter a null-value))

[/CODE]

a.
앞의 연습문제에서 풀었던 prime 넘버 알아보는 프로시져를 가져오자.
[CODE]
(define (smallest-divisor n)     
  (find-divisor n 2))     
    
(define (find-divisor n test-divisor)     
  (cond ((> (square test-divisor) n) n)     
        ((divides? test-divisor n) test-divisor)     
        (else (find-divisor n (+ test-divisor 1)))))     
    
(define (divides? a b)     
  (= (remainder b a) 0))     
    
(define (prime? n)     
  (= n (smallest-divisor n)))     
    
(define (square x) (* x x))  
(define (timed-prime-test n)  
  (newline)  
  (display n)  
  (start-prime-test n (runtime)))  
(define (runtime) (current-milliseconds))  
(define (start-prime-test n start-time)  
  (if (prime? n)  
      (report-prime (- (runtime) start-time))))  
(define (report-prime elapsed-time)  
  (display " *** ")  
  (display elapsed-time))  
(define (search-for-primes rangestart)  
  (define (SFP-iter start-time n)  
    (newline)  
    (display n)  
    (if (prime? n) (report-prime (- (runtime) start-time))  
        (SFP-iter start-time (+ n 2))))  
  (if (even? rangestart) (SFP-iter (runtime) (+ rangestart 1))  
      (SFP-iter (runtime) rangestart)))  
[/CODE]

위에 정의된 prime? 를 이용하면
[CODE]
> (filter-accumulate prime?
                     (lambda (x y) (+ x y))
                     0
                     (lambda (x) (* x x))
                     1
                     (lambda (x) (+ x 1))
                     5)
39
[/CODE]

b.
[CODE]
(define (1_33 n)
  (filter-accumulate
   (lambda (x) (= 1 (gcd x n)))
   (lambda (x y) (* x y))
   1
   (lambda (x) x)
   1
   (lambda (x) (+ x 1))
   n))
[/CODE]

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 14:24 2008/01/31 14:24
top

 

SICP 연습문제 풀이 1.32


[CODE]
; Recursive
(define (accumulate combiner null-value term a next b)
  (if (> a b)
      null-value
      (combiner (term a) (accumulate combiner null-value term (next a) next b))))

; Iterative
(define (accumulate combiner null-value term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (combiner result (term a)))))
  (iter a null-value))

; Sum
> (accumulate (lambda (x y) (+ x y)) 0 term 1 next 5)
15
; Product
> (accumulate (lambda (x y) (* x y)) 1 term 1 next 4)
24
[/CODE]
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/01/31 13:57 2008/01/31 13:57
top