Project Euler를 F#으로 푸는 작업은 계속 틈나는 대로 하고 있는데..
 안그래도 구독자가 별로 없는 블로그에 계속 그것만 올리면..
 구독자들에게 짜증을 줄까봐 자제하고 있습니다.ㅋ


 아무튼 Neon군이 리플로 제안한 방식으로 구현해보았습니다.
 일단 기존 방식은 무식하게 세자리 숫자의 곱을 모두 계산 하는 방식이었는데
 새로운 방식은 세자리 숫자의 곱 중에서 큰 수 순서대로 숫자를 뽑습니다.
 그리고, (123 * 312) 과 (312 * 123)은 같은 값이기 때문에 한번만 계산 합니다.


set [ (999*999, 999, 999) ]

    |> Seq.unfold (fun pq ->

        let head = pq.MaximumElement

        let product, a, b = head

        let newElements =

            set [ ((a-1)*b, a-1, b); (a*(b-1), a, b-1) ]

                |> Set.filter (fun (_, a, b) -> a <= b)

        Some (product, ((pq.Remove head) + newElements)))

    |> Seq.filter is_parlindrome

    |> Seq.hd

    |> printfn "Problem #4 = %d"



Priority Queue 구현에서 일반적으로 사용되는 Heap를 사용하는 것이 가장 좋아 보이지만...
F#에서 쓰기 쉬운 Set (Binary Tree) 기반으로 구현 하였습니다.




'내 생산물' 카테고리의 다른 글

F#, Project Euler - Problem #4 (2)  (0) 2009/05/22
F#, Project Euler - Problem #12  (0) 2009/05/12
F#, Project Euler - Problem #20  (0) 2009/05/12
F#, Project Euler - Problem #5  (0) 2009/05/11
F#, Project Euler - Problem #4  (2) 2009/05/11
F#, Project Euler - Problem #3  (0) 2009/05/10
F#, Project Euler - Problem #1  (2) 2009/05/10
Posted by U_Seung

Problem #12. What is the value of the first triangle number to have over five hundred divisors?

번역: 500개가 넘는 (양의) 약수를 가진 첫번째 triangle number는 ?

먼저 triangle number의 수열은 아래와 같이 구할 수 있다.

Version1. 정의에 가까운 가장 직관적인 방식..

let triangle_numbers =

    let rec triangle_number =

        function 0 -> 1 | n -> (n + 1 + triangle_number (n-1))

    Seq.init_infinite triangle_number



Version 2. Recursive call을 제거..

let triangle_numbers = Seq.unfold (fun (n, i) -> Some(n, (n+i, i+1))) (1, 2)



Version 3. 최적화.

let triangle_numbers = Seq.init_infinite (fun n -> (n+2)*(n+1) / 2)



triangle number의 수열을 구했으니 답을 구하면..

let factorize n =

    let rec factorize_horse n factor count result =

        if (n <= 1) then

            count::result

        else

            match (n % factor) with

            | 0 -> (factorize_horse (n/factor) factor (count+1) result)

            | _ -> (factorize_horse n (factor+1) 0 (count::result))          

    factorize_horse n 2 0 []

        |> List.filter (fun x -> x<>0)

 

let factor_count n =

    factorize n

        |> List.map (fun x -> x+1 )

        |> List.fold_left (*) 1

 

triangle_numbers

    |> Seq.filter (fun x -> 500 < (factor_count x))

    |> Seq.hd

    |> printfn "Problem #12 = %d"



약수의 개수를 빨리 구하려고, 소인수 분해를 하였다.
약수 개수를 구하기 위해 모든 약수가 무엇인지 다 파악한다면..
얼마나 느릴지는 장담할 수 없음. ㅋ



'내 생산물' 카테고리의 다른 글

F#, Project Euler - Problem #4 (2)  (0) 2009/05/22
F#, Project Euler - Problem #12  (0) 2009/05/12
F#, Project Euler - Problem #20  (0) 2009/05/12
F#, Project Euler - Problem #5  (0) 2009/05/11
F#, Project Euler - Problem #4  (2) 2009/05/11
F#, Project Euler - Problem #3  (0) 2009/05/10
F#, Project Euler - Problem #1  (2) 2009/05/10
Posted by U_Seung

Problem #20. Find the sum of the digits in the number 100!

번역: 100! 값의 모든 자릿수의 합을 구하시오.


 여러가지 방법이 있을 수 있지만.
 가장 직관적인 방법은 계산해서 더하면 된다.


open Microsoft.FSharp.Math

 

(BigInt.Factorial (BigInt 100)).ToString()

    |> Seq.map (fun x -> (int x) - (int '0'))

    |> Seq.sum

    |> printfn "Problem #20 = %d"






'내 생산물' 카테고리의 다른 글

F#, Project Euler - Problem #4 (2)  (0) 2009/05/22
F#, Project Euler - Problem #12  (0) 2009/05/12
F#, Project Euler - Problem #20  (0) 2009/05/12
F#, Project Euler - Problem #5  (0) 2009/05/11
F#, Project Euler - Problem #4  (2) 2009/05/11
F#, Project Euler - Problem #3  (0) 2009/05/10
F#, Project Euler - Problem #1  (2) 2009/05/10
Posted by U_Seung

#Problem 5. What is the smallest number that is evenly divisible by all of the numbers from 1 to 20?

번역: 1부터 20까지 수로 모두 나누어 떨어지는 수 중 가장 작은 수는?


뭐 복잡하게 설명할 것 없이
최소공배수(LCM, Lowest Common Multiple)를 구하는 문제다.
Result = (lcm ...... (lcm (lcm 1 2) 3) 4) ... 20)


let lcm x y =

    let rec gcd x y =

        match y with

        | 0 -> x

        | _ -> (gcd y (x%y))

    x * (y / (gcd x y))

 

{1 .. 20}

    |> Seq.fold lcm 1

    |> printfn "Problem #5 = %d"




조금 어려운 문제로 번호를 넘겨야 할 듯...

'내 생산물' 카테고리의 다른 글

F#, Project Euler - Problem #4 (2)  (0) 2009/05/22
F#, Project Euler - Problem #12  (0) 2009/05/12
F#, Project Euler - Problem #20  (0) 2009/05/12
F#, Project Euler - Problem #5  (0) 2009/05/11
F#, Project Euler - Problem #4  (2) 2009/05/11
F#, Project Euler - Problem #3  (0) 2009/05/10
F#, Project Euler - Problem #1  (2) 2009/05/10
Posted by U_Seung


해석: 두 개의 세자리 숫자를 곱해서 만들 수 있는 가장 큰 palindrome을 만드시오.


 직관적으로..
 - 모든 세자리 숫자의 조합을 만들어서 이를 곱한다.
 - 이 값이 Palindrome 이지 검사한다.
 - Palindrome 중 가장 큰 숫자를 추출한다.

#light

 

let is_parlindrome x =

    let rec reverse y result =

        match y with

        | 0 -> result

        | _ -> (reverse (y/10) (result*10 + y%10))

    (reverse x 0) = x

 

[ for i in [100 .. 999] do

        for j in [100 .. 999] do

            yield i*j ]

    |> List.filter is_parlindrome

    |> Seq.max

    |> printfn "Problem #4 = %d"





'내 생산물' 카테고리의 다른 글

F#, Project Euler - Problem #12  (0) 2009/05/12
F#, Project Euler - Problem #20  (0) 2009/05/12
F#, Project Euler - Problem #5  (0) 2009/05/11
F#, Project Euler - Problem #4  (2) 2009/05/11
F#, Project Euler - Problem #3  (0) 2009/05/10
F#, Project Euler - Problem #1  (2) 2009/05/10
F#, Project Euler - Problem #2  (0) 2009/05/10
Posted by U_Seung
Problem3. What is the largest prime factor of the number 600851475143 ?

번역: 600851475143 를 나누었을 때, 나누어 떨어지는 수 중 가장 큰 소수(Prime number)는 ?


 직관적으로 풀면...
 해당 숫자의 제곱근 부터 차례로 1씩 감소 하면서..
 해당 숫자를 나눌 수 있는지..
 소수인지 확인하면 됩니다.


 주어진 숫자가 좀 커서 int 범위로 포함진 않습니다.
 다행이 제곱근은 int 범위에 있습니다.

#light

 

let target_number = 600851475143UL;

let max_candidate = (int (sqrt (float target_number)))

 

let is_prime i =

    [2 .. i-1]

    |> Seq.exists (fun x -> i%x = 0)

    |> not

 

let is_factor_of x =

    target_number%(uint64 x) = 0UL

 

[max_candidate .. -1 .. 2]

    |> Seq.filter is_factor_of

    |> Seq.filter is_prime

    |> Seq.hd

    |> printfn "Problem #3 = %d"



가장 큰 수부터 검사하기 때문에 head를 찍으면 됩니다.

참고로... is_factor_of 와 is_prime 의 줄을 바꾸면
Performance 는 끔찍해집니다.

-----------------

좀 비 직관적이지만...

let rec find_last_prime_factor (n: uint64) (i: uint64) (result: uint64) =

    if (n <= 1UL) then

        result

    else

        if (n % i = 0UL) then

            (find_last_prime_factor (n/i) i i)

        else

            (find_last_prime_factor n (i+1UL) result)

 

find_last_prime_factor target_number 2UL 0UL

    |> printfn "Problem #3 = %d"



이렇게 풀 수도 있습니다.


Posted by U_Seung
참조: Project Euler


 요즘 지루함을 달래기 위해서 함수형 언어인 F#을 공부해보고 있습니다.
 특별한 목표가 없으면 잘 안되기 때문에..
 Project Euler(오일러)의 문제들도 같이 풀어 보고 있습니다.


Problem #1. Add all the natural numbers below one thousand that are multiples of 3 or 5.

매우 간단한 문제라서...
설명하는게 무의미 할 것 같습니다.

세 가지 버전을 만들어 보았습니다.

#light

 

let p1_1 = (Seq.sum (Seq.filter (fun x -> (x%3) * (x%5) = 0) [1 .. 999]))

printfn "Problem #1 = %d" p1_1

 

let p1_2 = [1 .. 999] |> Seq.filter (fun x -> (x%3) * (x%5) = 0) |> Seq.sum

printfn "Problem #1 = %d" p1_2

 

let p1_3 = (Seq.sum [for i in 1..999 do if (i%3 * i%5) = 0 then yield i])

printfn "Problem #1 = %d" p1_3


개인적으로는 두번째 스타일을 가장 좋아 합니다.






Posted by U_Seung

변역: 피보나치 수열 중 4000만이 넘지 않은 짝수의 합을 구하시오.


 문제를 보는 순간 헉...
 예전에 다른 언어 열심히 풀어본 문제랑 너무 비슷하다는거...



 일단 답을 빨리 구해보려고, 이전 python소스를 약간 고쳐서 만들었다.

from itertools import *

def fibs():
    yield 1;
    yield 1;
    h, t = tee(fibs())
    t.next()
    for i in imap(lambda (a,b):a+b, izip(h, t)):
            yield i

print sum(takewhile(lambda x: x<=4000000, ifilter(lambda x: x%2==0, fibs())))

결과가 매우 잘 나왔다.
개인적으로 이런 스타일이 좋아서 ...
이와 비슷한 fibs() 코드를 F#으로 만들 방법을 찾았다.


let rec fibs = seq { yield! [1; 1]; for (x, y) in Seq.zip fibs (Seq.skip 1 fibs) -> x + y}

 

printfn "Problem #2 = %d" (fibs

    |> Seq.take_while (fun x -> x <= 4000000)

    |> Seq.filter (fun x -> x%2 = 0)

    |> Seq.sum) ;;


위 Python 코드와 크게 다를게 없는 코드다.
문제는 답은 나올 거 같은데 1000만년이 걸릴 것 같다는 ;;;;



어쩔 수 없이 fibs 함수를 수정할 수 밖에 없었다.

let fibs = (1,1) |> Seq.unfold (fun (a, b) -> Some(a, (b, a+b)))

 

printfn "Problem #2 = %d" (fibs

    |> Seq.take_while (fun x -> x <= 4000000)

    |> Seq.filter (fun x -> x%2 = 0)

    |> Seq.sum) ;;





뭐.. 속편하게 만드는 방법은... 
아래와 같이 Iterative하게 만드는 방법도 있다.

let rec even_fibs_sum a b sum =

    if (a <= 4000000) then

        (even_fibs_sum b (a+b) (sum+a-(a%2)*a))

    else

        sum

 

printfn "Problem #2 = %d" (even_fibs_sum 1 1 0)





Posted by U_Seung
사용자 삽입 이미지


 Tistory에 테터 데스크 플러그인이 올라와서 설치했습니다.
 설치한지는 꽤 되었는데 포스팅은 이제서야 하네요.

 위에는 Tistory 최근 글을 보여주고, 아래는 Me2day 최근글을 보여주도록 했습니다.

 Tistory 최근글은 중복된 글 지우는 것만 넣고, 테터데스크에 있는 것을 그대로 썼고요,
 Me2day 최근글은 약간 복잡한데..
 디자인은 미투데이에서 가져오고,
 글을 가져오는 부분은 미투데이 RSS에서 글을 받아와서
 거친마루님의 Pipe로 글을 조각 내고,
 taemy님의 미투데이 플러그인을 변형하여 사용하였습니다.

 완전 짬봉이죠. ㅋㅋ

 아.. 해당 내용은 첫 페이지에서 보실 수 있습니다.

Posted by U_Seung


5일전에 Popfly초대장이 왔었는데 이제서야 확인했습니다.
요즘 바빠서 메일 확인도 제대로 못하고 살았더니.. ㅠㅠ

사용자 삽입 이미지

암튼 위와 같이 생긴 Mashup을 맹글어 봤습니다. 직접보기
학교 축제에 가보고 싶었는데 근무하느라 못갔네요. 하하;;; 가봤자 놀아줄 사람도 없겠지만.
예전에 아라에 축제 자료집(팜플렛)이 올라온 적이 있는데.. 이것을 이미지로 바꿔준다음에 이걸 ImageScraper로 연결시키고, 여기에 PageTurn을 연결시켜주니 간단한 책이 되었습니다. 너무 쉽게 만들어지니 약간은 허무하네요 :)


암튼 Popfly..같은 것들이 널리 퍼지면..
저 같이 취미로 Toy를 만드는 사람들은 설 자리를 잃어 버리는거 아닌지 모르겠네요 ㅋㅋ
아래는 위의 자료집을 만든 Popfly Editing 모드 그림 입니다.


사용자 삽입 이미지

Posted by U_Seung
사용자 삽입 이미지

Silverlight 구현 예제보기

여기에서는....
XPS기술을 사용하여 Silverlight에서 한글을 쉽고, 저용량으로 쓰는 방법을 설명한다.



Silverlight가 1.0 Beta가 Release되면서 부터 한글을 그나마 지원하기 시작했다.
WPF/e Dec. CTP 버전에서는 사용이 거의 불가능에 가까웠는데 그에 비하면 많이 진보했다. ^^

Silverlight에서도 한글을 대충써도 잘 나오면 좋겠지만 아쉽게도 현재 버전에서는 그렇지 않다. 그래서 사용할 수 있는 방법으로는 Glyph로 처리하는 방법TextBlock으로 처리하는 방법이 있다. 여기서 소개하는 방법도 큰 맥락에서보면 Glyph로 처리하는 방법과 다르지 않지만 엄청나게 큰 폰트의 용량을 줄이는 방법과 편집을 쉽게 할 수 있는 방법이다.



먼저 예제를 만든 과정을 Step별로 정리 해보면..
----

#1. Microsoft Office를 열고 원하는 한글을 자유롭게 입력한다.
     (저는 Powerpoint을 열고, 아래와 같이 한글, 두글 시리즈를 적었습니다. )

사용자 삽입 이미지


#2. 만들어진 문서를 XPS로 저장한다. (아래 그림참조)
사용자 삽입 이미지


#3. 저장된 XPS파일의 압축을 푼다. ( XPS파일은 Zip Archive 파일이다. )
     압축이 풀린 파일에서 생성된 \Resources\*odttf파일을 Silverlight 프로젝트에 추가한다.
     압축이 풀린 파일에서 \Documents\1\Pages\1.fpage 파일을 연다.
사용자 삽입 이미지

파일에서 해당되는 부분을 Copy한 후 Silverlight Project에 한글을 출력할 부분에 적당히 Paste한다.

#4. 붙여진 <Glyphs>에서 BidiLevel 속성을 제거하고, FontUri를 프로젝트에 맞게 수정한다.

#5. 잘 나오는지 Test 해본다. 끝.

-------------------------------------------

설명이 조금 필요한데....
XPS 문서 포맷은 Adobe의 PDF처럼 Microsoft에서 인쇄/출판용 포맷으로 제작된 스펙이다.
XPS 스펙을 보면 알 수 있겠지만 XPS에서 문서의 구성은 WPF에서 사용하는 XAML의 Subset으로 구성되어 있다. Silverlight에서도 XAML을 사용하기 때문에 XPS의 결과물인 XAML을 사용할 수 있게 되는 것이다. 하지만 아쉽게도 이 두XAML이 완벽하게 Compatibility를 가지진 않아서 XPS 결과물을 직접 쓰긴 그렇고 약간 가공해서 쓰다보니 위와 같은 번거러운(?) 절차가 필요하게 되었다.

odttf인 것도 생소할 수도 있는데 XPS로 문서를 출력하면 문서에 사용되는 폰트를 뽑아서 XPS에 저장한다. 이때 만들어 주는 임시 폰트 파일이 odttf파일이다. 따라서 일반 ttf보다 용량이 훨씬 작게 되는 것이다.



예제 소스 다운로드:
Posted by U_Seung

사용자 삽입 이미지

SpringNote를 Vim 에서 Markdown 문법으로 사용하는 플러그인 입니다.
위의 참조에 링크된 데모 동영상을 보시면 개략적인 사용법과 내용을 아실 수 있습니다.

데모를 보고 감을 잡으신 분들도 있겠지만 위 프로그램은 다음과 같이 동작합니다.
1. Snote를 시작(:Snote)하면 SpringNote API를 이용하여서 글 목록을 받아온 후 이를 새창에 표시 합니다.
2. 원하는 글을 선택(Enter)하면 해당 글을 SpringNote API를 통해 받아 옵니다.
3. 받아온 글(XHTML)을 Markdown 형식의 포맷으로 변환 합니다.
4. 변환된 파일을 Vim으로 편집합니다.
5. 편집한 파일을 저장(:w)하면 이를 다시 XHTML로 변환합니다.
7. 변환한 파일을 SpringNote API를 이용하여 전송합니다.

제가 만든 부분은 여기에 껍데기를 붙인 Vim Plugin과 3번 XHTML에서 Markdown으로의 Converting부분 입니다. 원래는 다른 방식의 Converting을 썼었는데 속도도 그렇고 품질도 영 마음에 안들어서 직접 만들고야 말았습니다. (왜 그런 삽질을 ㅠ)

* SpringNote가 곧 블로그 내보내기를 지원할 것 같은데..
  이제 Vim으로 블로그 포스팅을 하는 글을 작성하게 될지도 모르겠네요 :)
* 또, SpringNote가 슬라이드 보기를 지원한다고 하면
  이제 Vim으로 Presentation 자료를 만드는 세상이 온 겁니다. ㅎㅎ


문제점이 몇 가지 있는데..
#1. SpringNote 서비스가 불안정 하여서 제대로 데이터 교환이 이루어지지 않을 때도 있습니다.
#2. 에러/예외 처리를 별로 안해서 문제가 발생시 사용자가 원인을 파악하기 힘듭니다.
    ( 죄송합니다.. ㅠㅠ )


추가하고 싶은 기능이 있다면..
#1. 오프라인 기능, 하드 디스크와 싱크 맞추기
#2. 첨부 파일 기능?
#3. 유지보수 안하기기 기능 -_-;;


그럼 즐 편집 하세요 :)

Posted by U_Seung
사용자 삽입 이미지
왼쪽(혹은 오른쪽) 그림과 같이 블로그에 Silverlight를 기반으로 한 아날로그 시계를 추가하였다.

뭔가 Silverlight로 이름이 변경되어 정식 런칭을 눈 앞에 둔 시점에서 뭔가 재밌는 것을 만들려다가 여러가지 여건상의 문제로;; 그냥 예전에 만든 아날로그 시계를 블로그에 붙이기로 했다.

Silverlight가 깔리지 않은 사람은 아마 시계가 안보일 거에요.
Silverlight 2007 Feb CTP 버전은 여기에서 받으실 수 있으니 설치하셔서 멋진(?) 아날로그 시계를 감상 하세요. ^^ 다음에 시간이 되면 Vista Sidebar Gadget에서 다른 스킨도 추가시킬까 생각도 하고 있는데 시간이 나면 해보려고 합니다.

혹시 시계를 Tistory 블로그에 달고 싶으신 분이 계시면..

<s_sidebar_element>
<!-- Silverlight Clock -->
<div id="Wpfeclock">
<h3>Silverlight Clock</h3>
<iframe src="http://sparcs.org/~airlover/wpfe/Clock/" style='border:0px; width: 150px; height: 150px' frameborder='0'></iframe>
</div>
</s_sidebar_element>

관리자모드에서 스킨 편집 메뉴에 들어가셔서 위의 코드를 <s_sidebar_element> 사이에 끼워 넣으시고, 사이브바 관리 메뉴에서 원하시는 위치에 Drag&Drop 해주시면 됩니다.




Posted by U_Seung

예전에 강제로 RSS만드는 법에서도


 

두 가지 RSS를 공유한 적이 있었는데..

이번에도 하나 강제로 만든 RSS를 공유한다.



무료로 배포되는 컨텐츠이지만

삼성경제연구소에 감사한 마음을….


요즘 독서 로그를 본의 아니게 많이 못 올리는데

요약본 보는 것에 맛 들이다 보니 남의 리뷰를

Copy & Paste가 되는 것 같아서 올리기가 약간 꺼려진다.



Posted by U_Seung
   

 예전에 만든 네이버 사전 북마클릿을 업데이트한
 드래그 사전과 드래곤 사전을 만들었다. 좀더 퀄리티를 높이고 싶었으나
 나도 할일이 많은 직장인이라 더이상 작업하기 힘들어서 그냥 올린다.

 내가 주로 쓰는 것은 드래그 사전인데..
 필요한 부분을 Drag 한다음에 해당 Bookmarklet를 누르면 해당 단어를 검색해준다.
 소스를 보면 알겠지만 매우 간단한 원리다.

 드래그 사전이 가지는 치명적인 단점은 팝업을 사용한다는 것인데 이를 보완한 버전이 드래곤 사전이다. 드래곤 사전은 기본적으로 레이어 방식으로 띄우고, 레이어가 불가능한 곳은 팝업으로 띄운다. 여기에 해당하는 소스는 네이버 북마크의 북마클릿을 그대로 가져다 쓴 것이며, 이미지/디자인도 그대로 가져다 썼다. 네이버가 잘 만들었을 것 같아서 가져다 썼으나 잘 동작하지 않는 곳이 많은 것 같아서 아쉬움이 있다.


 암튼 나름 유용한(?) 사전을 공유하니 필요한 사람은 많이들 쓰세요.


------------------------


 그냥 심심해서라기 보다는...
 내가 필요해서 만들었다.
 야후미니를 보통 쓰는데, 컴터가 버벅거려서 하나라도 Process 수를 줄이고 싶었다.


 

Bookmarklet 사용법에 대해 간단한 설명을 덧 붙이면..
#1. 위의 회색 상자에 마우스를 가져간다.
#2. 마우스 오른쪽 버튼을 클릭한다.
#3. 즐겨찾기에 추가(F) 혹은 Bookmark This Link... 을 선택한다.
#4. 저장할 폴더를 연결 혹은 Bookmark Toolbar로 선택하여 저장한다.

이 Bookmarklet이 가지는 가장 큰 문제점은 팝업창이 뜨기 때문에
팝업창을 차단시킨는 프로그램이 설치되어 있을 경우에는 문제가 발생한다.
( 내 개인적인 용도라 어쩔 수 없다. )

Enjoy...





Posted by U_Seung
사용자 삽입 이미지

참조: http://sparcs.kaist.ac.kr/~airlover/wpfe/Clock/

Tistory라서 왼쪽 Sidebar에 넣지 못하는 것을 안타깝게 생각합니다.
맨 위는 그냥 이미지고, 위의 링크를 타고 들어가시면 보실 수 있습니다.

WPF/E가 설치되지 않으신 분은 2007 Feb CTP 버전으로 설치하셔야 합니다.



다양한 예제가 많지만 시계가 재미있는 이유는.. WPF/E 애니매이션을 멋지게 넣을 있어서 입니다.
시계 바늘이 움직이는 것을 만들려면 보통의 방식대로 한다면 .. n초에 한번씩 초침, 분침, 시침의 위치를 조금씩 움직이는 것을 계산하여서 화면에 다시 그리기를 해야합니다.

WPF/E에서 애니메이션 기능을 쓰면 다음과 같이 구현할 수 있습니다.
시작 시각에 각 바늘의 위치를 지정해주고,
초침은 1분에 한 바퀴씩
분침은 1시간에 한바퀴씩
시침은 12시간에 한바퀴씩 돌도록 애니메이션을 구성하고,
Animation Start!를 하면 시계 제작이 끝납니다. 간단하죠?

<DoubleAnimation Storyboard.TargetName="Sec" Storyboard.TargetProperty="Angle"
 From="0" To="360" Duration="0:1:0" RepeatBehavior="Forever" />

<DoubleAnimation Storyboard.TargetName="Min" Storyboard.TargetProperty="Angle" From="0" To="360" Duration="1:0:0" RepeatBehavior="Forever" />

<DoubleAnimation Storyboard.TargetName="Hour" Storyboard.TargetProperty="Angle" From="0" To="360" Duration="12:0:0" RepeatBehavior="Forever"/>
- 위는 핵심 코드 중 일부


만약 Javascript로만으로 시계를 구현했다면 (지금 Vista Sidebar Gadget이 그렇게 하고 있음)
1초보다 빠른 시간에 한번씩 Event를 발생시켜서 초침을 움직여야 해서 코드가 엄청 지저분 해졌겠지요.

(위험요소가 다분한) Timer Event가 하나도 쓰지 않고 구현한 WPF/E 시계 ... 재밌지 않은 가요?
( 나만 재밌나 -_- )

Posted by U_Seung

PS Project 우승

내 생산물 2006/08/29 16:18


전산학과 2학년 과목에
문제해결 기법(PS)이라는 과목이 있다.
컴퓨터 알고리즘을 배우지 않는 상태에서 자신만의 창의적인 방법을 생각 해보는 과목이다.
물론 숙제가 매주나와서 로드가 엄청나고, 문제 한나하나가 쉽게 풀리지 않는 것도 많지만 문제를 풀고 났을 때의 뿌듯함은 이루 말할 수 없을 정도로 기쁘다 ^^;

또 ACM-ICPC 대회에 나가기를 교수님의 적극 권장하지만, 그 정도로 레벨이 되면 거의 생각을 하지 않고 공식 대입 정도가 되어야 하기에 난 시도하지 않았었다 :)

아래는 최종 기말 프로젝트로 했던 3차원 구슬 쌓기 게임 대회의 스크린샷이다.
말이 3차원이지 2층 높이밖에 그것도 교차점에 밖에 쌓지 못한다. ^^ ( 규칙은 너무 복잡하니 생략 )
실제로 바둑알로 해볼 수 있는데 이거 준비하느라 얼마나 많이 해봤는지 모른다. (나보다 팀원들이 더 많이 하긴 했다. )


오랜만에 컴터랑 한판 해봤다. 아쉽게도(?) 내가 이겼다. (물론 간신히.. )
화면의 아랫부분은 디버깅을 위해서 나오는 부분임.


- 아래는 과목 홈페이지에서 퍼온 것 ---------- http://tclab.kaist.ac.kr/moin/CS202/HallOfFame



명예의 전당



매년 CS202 문제해결기법 프로젝트에서 우승한 팀만이 이 곳 명예의 전당에 오르는 영광을 누리게 됩니다.



2003년, 3차원 구슬 쌓기 게임 우승팀 <Juniors>



Juniors 팀의 김군훈, 김성진, 정은호 http://jupiter.kaist.ac.kr/~cs202/images/2003project.jpg

Posted by U_Seung


2005년 카포전에 인공지능(AI) 대회가 새로운 종목으로 추가 되었다. 기존에 축구, 농구, 야구 등의 스포츠 보다는 과학적인 종목을 추가하자는 의미에서 시작된 종목이란다. 별로 참가할 의사가 많지 않았는데 PSP를 준다고 해서 친구 기곤이와 함께 "뽀셔뽀셔"팀을 결성해서 나가게 되었다. 결과는? 운좋게도 1등 !! 경기 내용과 동영상은 아래에...
그리고 최종 버젼인지는 확인할 방법이 없는 AI 알고리즘 DLL 파일도 첨부 하였습니다.


이때 후원사인 Nexon에서 하계 인턴쉽을 열어서 본선 진출팀인 4팀 8명에게 회사 근무 기회를 줬었는데 나만 안갔었다. ㅠㅠ
그땐 마음이 딴 곳에 있었더랬지..


출처 : http://nsp.nexon.com/m03program/sub.asp?pagecode=s04b

<예선전>







<본선>





<결승전>


<AI 동영상>

실제 대회 동영상도 원래는 있었는데.. 그때 다운 받아 놓지 않아서 ㅠㅠ
그냥 따로 만들어 본 동영상 입니다. 이기는 쪽이 제가 만든 AI 입니다. ^^;
http://blog.naver.com/airlover99/90007644394
http://blog.naver.com/airlover99/90007645854
http://blog.naver.com/airlover99/90007644394

인공지능 DLL 파일 :

'내 생산물' 카테고리의 다른 글

네이버 미니 사전 북마크릿(Bookmarklet)  (15) 2007/03/27
WPF/E로 만든 Clock Widget  (2) 2007/02/07
PS Project 우승  (0) 2006/08/29
제4회 카포전 AI(뿌요뿌요) 대회 1등 - Team 뽀셔뽀셔  (1) 2006/08/15
[TatterTools] 태그로 만드는 갤러리  (3) 2006/08/12
NGMap v0.6  (17) 2006/08/09
NGMap v0.5  (31) 2006/08/04
Posted by U_Seung


뭐 별건 아니고,,
위의 그림과 같이 이제 까지 읽은 책을 한눈에 보여주고 싶었다.
그러다 생각해보니 꼭 책에 국한할 필요가 없다고 생각이 들어서 tag별로 묶어서 보여준다.

(예제)
http://9eye.net/tt/imagetag/독서 , http://9eye.net/tt/imagetag/영화공연 , http://9eye.net/tt/imagetag/사진
다른 것도 되는데 내가 태그 붙이는 걸 귀찮아 하고, 글도 몇개 없어서 보이는게 없네.
나중에는 잘 보이겠지 :)

Posted by U_Seung

NGMap v0.6

내 생산물 2006/08/09 23:29

http://sparcs.org/~airlover/9eye.net/map/
에서 보시기바랍니다.

안타깝게도 호스팅 서비스에 문제가 생겨서
Tistory로 이전하면서 예전 글의 모습은 삭제 되었습ㄴ다.

Posted by U_Seung

NGMap v0.5

내 생산물 2006/08/04 09:47

http://sparcs.org/~airlover/9eye.net/map/index_v0.5.html

에서 보시기바랍니다.

안타깝게도 호스팅 서비스에 문제가 생겨서
Tistory로 이전하면서 예전 글의 모습은 삭제 되었습ㄴ다.

Posted by U_Seung

2006년 마케팅 수업을 듣다가 5월 31일날 있었던 지방선거의 이야기를 비지니스 마케팅 관점에서 케이스 스터디를 만들어 보았다. 뭐 별건 아니지만 재미삼아 읽어 볼만 한 것 같다는 생각이 든다. 정치 쪽에 관심이 있다면 더욱 재미가 있을 듯..


요즘 같은 세상에서는 무엇을 하는 사람이든 간에 마케팅에 대한 기본적인 마인드는 가지고 있는 것이 필요하다. 사업을 하던 연구를 하던 정치를 하던 말이다. 사실 난 이러한 것을 뒤늦게 알았다. 너무나 뒤늦게 알아서 사실은 좀 안타깝다.



내용은 여기에..

Posted by U_Seung

내가 만든 프랙탈 모양 들이다.
RGB만 써서 색이 별로 안이쁘긴 하다 ^^;

프랙탈을 만드는 방법중에 IFS(Iterated function system)를 써서 만든 거다. 자세한 것은 Wikipedia나 Google를 참조하면 좋겠고,
IFS를 처음 접했을 때, 자연과 흡사한 모양이 나오는데 저런 모양이 단 몇개의 상수로 표현이 가능하다는 것에 놀라움을 금치 못했다. 참고로 나비 모양에 사용된 상수는


2
0.431 -0.844 0.4969 0.0169 3.978 2.803 0.3792
-0.7596 0.7183 0.03718 0.8845 -3.753 0.3577 0.6208


자연세계에서 2차원의 모양을 가지고 있는
나뭇잎, 삽엽충, 나비 등등은 대부분 표현이 가능하지 않을까?

3차원으로 확장한다면
자연세계의 나무 줄기, 물고기 등도 별로 어렵지 않게 표현할 수 있을 것이다.

Posted by U_Seung

전산학과 과목중에서 Computer Graphics라는 과목이 있다.
개인적으로 시각적인 것이 많아서 좋아했다.
네트워크 같은 것은 열심히 만들어봤자 시각적이지 못해서ㅠ 뭐 보여줄 것이 없는 것이 안타깝다.

이 과목에서는
중간고사까지는 어떻게 3-Dimension을 2-Dimension으로 바꾸는 과정을
Linear Algebra를 기반으로 하여 배운다. 주로 Matrix Multiplication이나 Transformation을 하다가 반학기가 지나간다.

나머지 반학기는 주로 OpenGL를 실습하는 데 시간을 쓴다.
여러가지 프로젝트가 있었는데...
Terrain에 나무를 심고, 그 그림자를 Terrain의 면에 따라서 출력한다던지
Fractal을 그린다던지 하는 재미있는 프로젝트 들이었다.

여기에서는 기말 최종 프로젝트(게임만들기)를 소개한다.

(일단 마우스 커서는 원래 게임에 없다. -_- 캡쳐 실수로 저것까지 나왔다.)
게임의 배경은 KAIST 오리 연못이다.
오리 연못에는 오리 있고, 까리용 벤치, 휴지통 등도 장식으로 있다.

게임의 목표는 오리연못을 깨끗하게 만드는 것이고 그리기 위해서 연못을 더럽히는 주범은 오리를 퇴치하는 것이다.
( 좀 잔인하고,  오리연못을 위해 오리를 죽이는 다소 모순적인 상황이지만 오리는 죽어도 다시 태어나니 걱정 안해도 된다.)



그림처럼 오리가 보이면 빨간색 선에 오리를 조준하여 맞추면 된다.
오리를 맞추면 점수가 쌓이게 되고, 점수가 많이 싸이면 오리 연못은 더 맑아 진다.
오리를 맞추지 못하면 물이 흔들리는 효과(특수효과)가 있다. ^^v


물에 총을 난사하면.. 위와 같이 된다.
사실 오리가 디게 느려서 맞추기가 쉽다 ^^;
그리고 화면에 점점이 보이는 것 들이 있는데 나비다.
나비 캡처를 제대로 해놓은 것이 있었는데 안보인다. 다시 하긴 귀찮고 ㅠㅠ



여긴 해바라기 동산..
저 멀리 지평선도 보인다.. ( 맵의 끝이라고 생각하면 된다. ㅠㅠ )


마지막으로 보너스 메뉴 ㅋ

Posted by U_Seung

웹아라 2G v0.5 메인 화면 http://ara.kaist.ac.kr



그랬다.
내 생각에는 그렇다..

웹아라는 정말 백만년전에 개발이 되었어야 하는 프로젝트다.
하지만.. 이제서야 정식으로 오픈하게 되었다.

이 지경에 되기까지야 ... 내 책임도 크다고 생각하여, 결국 내가 총대를 매었다. 아~ SPARCS여 ㅠㅠ


#.
개발은 한 1주~2주쯤 한 것 같다.
초 날림으로 해서 코드가 깔끔하지는 않다.

관심가지고 이어서 할 후배가 있다면 좋으련만....
혼자 북치고 장치고, 징까지 쳐댈려니 .. 재미없네;;


#.
사람들이 많이 들어오리라 기대하진 않는다.
그렇지만 조금씩 개선해가면서 차츰 차츰.. 많이 들어올 수 있도록 해야한다.


#.
추가적으로 개발해야 할 기능은 꽤 많다.
절대적인 시간은 별로 안 걸리겠지만...
별로 의욕이 생기지 않는다. 사람들이 많이 이용해주면.. 더 개발하는 것을 생각 해볼수도 있을 것 같다.
Posted by U_Seung

고등학교 시절(소시적)에 나도 멀티실 관리자는 직함을 가지고,
학교 컴퓨터실(멀티실)을 주름잡던 시절, 그리고 그 권력이 대단했던 시절이 있었다.

암튼, 고2때 면학시간에 공부하기 싫어서
도서관을 뛰쳐나와서 열심히 맹글었던 홈페이지다.
Redhat Linux에 Apache, MySQL, PHP로 맹글었고
보시다 시피 로그인, 카운터, 생일, 최근글, 이달의 행사, 사진 기능을 제공했다.

여기서 재미있었던 것은 생일과 사진인데

생일이 얼마남지 않는 순서대로 정렬해주는 데 크나큰 의미가 있다.
생일은 DB에 DATE 포맷으로 들어 있는데(아마)
사람마다 연도가 달라서 그냥 소팅하면 안된다.
방법은..
1) 연도를 다 똑같이 하고 데이터를 다 모은다음 정렬한다.
2) 그냥 월별로 정렬한다음 일별로 정렬한다.
만들때, 2)번 방법을 썼던것 같은데, 월이 바뀌는 부분 년도가 바뀌는 부분 때문에 처리가 지저분해졌던 것 같다.
암튼 친구들의 생일을 실시간으로 볼 수 있어서 호응이 무척 좋았다.

사진은 랜덤으로 보이게 하고, 모든 페이지의 오른쪽에 표시하도록 했다.
당시에는 1024x768, 800x600이 공존하던 시기였었는데
800x600에서는 사진이 안보이고, 1024x768에서는 빈자리가 생기는 공간에 사진이 보이는 센스있는 홈페이지 였다.
또, 당시에 사진을 보이는 곳을 iframe로 처리했었는데 Netscape에서 iframe을 지원하지 않아서 얼마나 가슴이 아팠는지 모른다.ㅋ

암튼 홈페이지 옆에 사진을 붙인 것은 친구/후배들은 가끔씩 자기 얼굴이 메인 페이지에 뜨는 영광도 연출되어서 재미있었던 것 같다 ^^;



이제는 새로 바뀐 교장(?) 선생님이 업체에 위탁하여 새 홈페이지가 들어 서서 기억속 저 먼곳에서,, 생각만 할 수 있는 페이지지만
내가 만든 첫번째 서비스라는 점에서 나에게 가지는 의미가 매우 큰 것 같다.

위의 사진은
http://dir.naver.com/arch.php?sid=20706010&pg=1&ty=list&st=rdate 에서 퍼왔습니다.



Posted by U_Seung

사실 우리학교는 같은 과라고 해서 잘 알고 그런거 별로 없는 학교다. (뭐 다른 대학교라고 별거 있다는 이야기는 아니다.)
수업을 같이 들어도 매일 식당에서 마주치더라도 별로 대화할 기회라던지 함께 뭔가를 한다던지 하는 일이 없기 때문에
어쩌면 너무 아는 사람이 많은 것도 불편할 수 있다는 생각이 들기도 한다.
























암튼 축제를 맞이하여 이래저래 전산과 학우들의 단합을 (최대) 목적으로 이 행사는 기획 되었다.
다른 목적에는 학교 축제를 발전시키고, 지구 평화를 지키기 위한 목적도 있었다. :D

보시다 시피 판타지 게임을 패러디하고, 전자과의 나이키스트를 패러디 하였다.
심지어 스토리도 있는데 .. 여자1인 포함된 2인 or 3인이 마왕을 무찌르는 뭐 그런 이야기다.











- fantasy in kaist -



< Prolog >



....태울력 34년.....


마을 Fortran에 소년 폰과, 소년 노이만, 소녀 엘렌이 살고 있었다.


평소 검을 잘 다루던 폰,


마나의 흐름에 관심이 많던 노이만,


사람들을 따스한 마음으로 감싸안아 주는것을 즐기던 엘렌,


...이들이 Dijkstra에서 어떤 모습으로 성장해 나갈 것인가...



<day 1. 슬라임 사냥> - 물풍선 던지기


매일 매일이 무료하고 심심하던 폰과 엘렌과 노이만.


옆동네의 괴팍한 농장주가 슬라임들을 사육하고 있다는 사실을 알았다!


자기가 키운 슬라임이 얼마나 귀여운지 자랑하고 싶던 그는, 슬라임 사냥꾼들을 소집했다.


슬라임 사냥에 나선 폰, 엘렌, 노이만


슬라임 마스터의 지시대로 움직이는 슬라임들을 물풍선으로 실컷 쥐어패자!


<day 2. 시련의 시작> - 부르마블 게임


슬라임을 사냥하고 즐거운 마음으로 집에 돌아오던 셋.


그런데..마을의 분위기가 심상치 않다!


불타고 있는 집, 군데군데 무너져 내린 마을 울타리. 여기저기서 들려오는 비명.


마왕 C++과 그의 군대가 나타나 Fortran마을의 모든 사람을 죽이고 간 것이다.


정신없이 도망치던 세명.


옆의 Cobol 마을로 도망치기 위해서는 던전 Boolean을 지나야 한다.


Boolean던전은 온갖 함정이 이곳 저곳에 도사리고 있는 무시무시한 던전이다.


항상 여러분을 앞으로 나아가게 도와주는 DICE 여신,


언제나 여러분을 노리고 있는 대마왕의 부하 천지인,


때로는 도움을, 때로는 방해를 하는 장난꾸러기 요정 gold key.


이 셋과 때로는 싸우며, 때로는 도움을 받으며 이 던젼을 헤쳐나가야 한다.


<day 3. 치유의 힘> - 발수 줄이기 게임


드디어 Boolean 던젼을 빠져나온 셋.


그때, 엘렌이 어단가에서 강렬한 섬광이 비춰지는 것을 발견하였다.


그곳에 있는 것은 알수 없게 생긴 마법진 몇개.


마법진 옆에는 마법사 한명이 이런 글을 남기고 죽어있었다.


"내가 완성하지 못한 이 마법진을 완성한다면,


그대들은 치유의 힘을 가지게 될 것이다.- Dijkstra 3세"


<day 4. 훈련의 시간> - 테니스공 머리로 받기


마법진의 비밀을 풀어내어 치유 마법도 획득하고, 즐거운 마음으로 Cobol마을에 도착한 셋.


그들은 C++대마왕에게 복수하기로 결심하고, 훈련에 들어간다.


Cobol마을의 강력한 trainner 빌게이츠에게 강력한 훈련을 받는 그들.


그들은 테니스공을 이용해, 물풍선 마법을 정확하고 강력하게 사용하는 방법을 훈련해나간다.


<day 5. 마왕성을 향해>


훈련도 마쳤고, 휴식도 취했고. 이제 마왕성을 향해 돌격하는 일만 남았다!


마왕성을 가기 위해서는 수십년동안 그 마기에 눌려 아무도 접근하지 못했던


'마성의 숲' 을 지나가야 한다.


마성의 숲의 입구 근처에서 마성의 살생진에 걸려 같은 장소를 20번이 넘게 해맨 그들.


다행이 폰과 엘렌의 합동 마법을 통해 살생진을 파괴하는데는 성공했지만,


부작용으로 폰과 엘렌의 몸이 붙어버렸다.


이때 갑작스럽게 나타난 오크 야매상인 ada.


경계하는 그들에게, ada가 말한다.


"경계하지 말게. 나는 자네들을 도와주기 위해 온 것이네."


몇가지 시련을 통해 그들에게 아이템을 건네준 ada는 말한다.


"자네 둘의 몸이 붙은 것은 마성의 숲의 저주를 억지로 풀으려 했기 때문이네.


이 마성의 숲의 저주는 출구 근처에 있는 하노이 탑에 담겨 있다네.


그 하노이 탑의 저주를 풀어서 마성의 숲을 원래대로 돌려놓지 않는한 자네들의


몸은 그대로 계속 붙어있을것이네."


복잡하게 얽혀있는 덩쿨(줄넘기)을 간신히 거쳐서 마성의 숲의 출구에 다다른 그들.


거기에는 마성의 숲의 저주를 담고 있는 하노이 탑이 있었다.


이 하노이 탑의 저주만 해제하면 앞으로 마성의 숲은 여러 동물들이 자유롭게


뛰놀고 햇살이 비치는 속에 아름다운 수풀이 우거진, 원래의 모습을 되찾게 될 것이다.


<day 6. warp zone> - 트위스터 게임


마성의 숲의 저주를 해제한 그들 앞에, 신전 하나가 홀연이 나타난다.


'튜링의 신전'. 앨런의 아버지인 튜링이 만들었던 신전이다.


마왕성을 가기 위한 유일한 방법은 튜링 신전의 워프 게이트를 여는 것이라고 한다.


하지만 워프 게이트를 열기 위해서는, 특별한 방법이 필요하다는데...


반드시 두명(또는 세명)이 필요하다는 방법. 과연 무엇일까?


<day 7. 마왕성을 향한 길목> - 평균대 게임


워프 게이트를 지나고 나니 그들 앞에 끝없이 이어져있는 골짜기 하나가 나타났다.


그동안 수많은 용자들의 목숨을 빼앗았다던 악명높은 array의 골짜기!


array의 골짜기를 중간 중간 지키고 있는 오크와 고블린을 잡으며


골짜기를 통과 하여, 마왕에게 도전하자!


그러나, 쉽지만은 않을것이다. 골짜기 양쪽에서 그들을 공격하는 수많은 비룡들.


어느덧 그들을 향해 뒤쪽에서 추격해오고 있는 기세 등등한 데스 나이트들.


하지만, 부모님을 죽인 원수가 눈앞에 있는 이상 여기서 쓰러질 수는 없다!


그동안 모아온 아이템을 총 활용하여 마지막 시련을 버티어내자!



<day 8. 중간 ending> - 폰과 엘렌의 사랑


그간 모험을 같이 하면서 점점 감정을 불태워 오던 폰과 엘렌.


마왕을 무찌르면서 공격받은 엘렌을 폰이 지켜주게 되고,


폰과 엘렌은 서로의 마음을 확인하게 된다.


그때! 엘렌에 대한 마음을 계속 키워오던 노이만이 옆에서 분노한다!


폰과 노이만의 최종 결투! 과연 엘렌을 차지하는 사람은 누가 될 것인가!


<day 9. 복수의 시간>


삼각관계(?)도 무난히 잘 해결 되고, 이제 평화로운 생활을 보내던 그들.


그들의 눈앞에, 갑자기 그동안 당신들을 지긋지긋하게 괴롭혀온 몬스터 하나가 등장한다.


이제 복수의 시간이다! 그동안 마음속에 쌓은 증오를 그놈에게 모두 터뜨려버려라!


<day 10. 마왕은 죽지 않았다?> - 셋째날의 최종 결전


세상에..이럴수가..


C++대마왕은 사실 죽은것이 아니었다!


C++대마왕이라고 생각하고 죽인것은 사실 마왕성의 문지기에 불과했던것.


왕 Dijkstra 24세는 이제 열려있는 마왕성에 잡입하여, 마왕을 잡을 용자들을 모집하였다.


그동안의 모험의 성과를 평가하여, 선택받은 10명의 용사만이 진짜로 마왕에게 도전할 수 있다.


과연, 어떤 용사가 마왕을 무찔러서 원수를 갚을수 있을까?


<final day> 추억의 시간들


드디어 진짜 마왕을 물리친 그들.


왕 Dijkstra 24세의 전속 궁정 요리사 outback이 운영하는 아웃백 PUB에서 고기를 뜯으며,


모험의 추억을 떠올리며, 즐거운 시간을 보내고 있던 도중..


야매상인 ada가 다시 나타난다.


"그동안 당신들의 모험, 기억하고 싶지 않은가?"


놀랍게도 그는 그들의 모험의 모습들을 전부 기록한 마법의 box를 가지고 있었다.


그동안..계속 우리를 스토킹 해왔더란 말인가.;


어찌 되었든 모험을 추억하는것은 즐거운 일. 마법의 box의 내용을 살펴보면서,


즐겁게 즐겁게 밤은 저물어 간다...





이 행사를 위해서..
전산과의 02학번의 핵심 인력 모두 동원 되어... 코딩 노가다가 아닌 육체 노가다를 했었다..

초기 투자비용도 꽤 들었고,
누가 올지, 오긴 할지, 날씨는 맑을지, 망하진 않을지 불확실성이 매우 큰 상황에서
약간은 무모한 도전이기도 했다.

하지만 결국..

행사는 해피엔드로 끝났다. ( 행사 사진은 꽤 많은데 초상권 문제로 더 올리진 못하겠음. )

내가 전반적인 관리를 맡으면서 재정, 자금을 담당 했었는데 적자는 확실한데
기획서를 들고 교수님들을 찾아다니면서 구걸(?)아닌 구걸을 하고,
자체적으로 1만원씩 모은 돈이 있어서 흑자아닌 흑자가 조금 났었다.



행사는 기대만큼 호응만큼 다음 해에 이어지진 못했지만
전산과 내부적인 단합에는 확실히 효과가 있었다. ^^;

Posted by U_Seung