<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-38239421</id><updated>2012-01-30T18:44:56.490+09:00</updated><category term='플래시'/><category term='정규식'/><category term='사전'/><category term='경영'/><category term='인공지능'/><category term='생활'/><category term='데이터베이스'/><category term='네이버'/><category term='웹'/><category term='오페라'/><category term='루비'/><category term='리눅스'/><category term='C언어'/><category term='분산컴퓨팅'/><category term='이맥스'/><category term='루비 온 레일스'/><category term='번역'/><category term='마르코프'/><category term='확률'/><category term='지메일'/><category term='알고리즘'/><category term='아마록'/><category term='웹브라우저'/><category term='스크립트'/><category term='프로젝트'/><category term='스킴'/><category term='정렬'/><title type='text'>Slow and Steady!!!</title><subtitle type='html'>끊임없이 새로운 것을 찾아서...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-38239421.post-144604168311907483</id><published>2011-08-31T13:37:00.004+09:00</published><updated>2011-08-31T15:03:43.344+09:00</updated><title type='text'>Codename Python</title><content type='html'>Today I found this old blog site of myself is so useful. Sorry I haven't written new posts for year(s). I'm going to write about Python and Erlang programming language more. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-144604168311907483?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/144604168311907483/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=144604168311907483&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/144604168311907483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/144604168311907483'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2011/08/codename-python.html' title='Codename Python'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-1401451413962051127</id><published>2010-05-19T07:57:00.008+09:00</published><updated>2011-08-31T14:07:46.352+09:00</updated><title type='text'>How to undefun a function in Emacs Lisp?</title><content type='html'>I was looking for how to make defined function void in Elisp. Now I have the answer!

&lt;blockquote&gt;(defun foo (x) x)&lt;br&gt;
        =&gt; foo&lt;br&gt;
(foo 1)&lt;br&gt;
        =&gt; 1&lt;br&gt;
(&lt;span style="font-weight:bold;"&gt;fmakunbound&lt;/span&gt; 'foo)&lt;br&gt;
        =&gt; foo&lt;br&gt;
(foo 1)&lt;br&gt;
error--&gt; Symbol's function definition is void: foo&lt;/blockquote&gt;

You can use &lt;span style="font-weight:bold;"&gt;makubound&lt;/span&gt; function for variables, instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-1401451413962051127?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/1401451413962051127/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=1401451413962051127&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/1401451413962051127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/1401451413962051127'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2010/05/how-to-undefun-function-in-emacs-lisp.html' title='How to undefun a function in Emacs Lisp?'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-564378327194798693</id><published>2008-10-21T22:06:00.003+09:00</published><updated>2011-08-31T13:31:57.271+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='이맥스'/><title type='text'>이맥스 프레임 빨리 바꾸기</title><content type='html'>&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;div id="text-1"&gt;

&lt;p&gt;빠른 답변: other-frame 함수가 C-x 5 o로 바인딩되어 있습니다만,
그것에 대하여 얘기하고자 하는 것은 아닙니다.&lt;/p&gt;

&lt;p&gt;저는 코드 작성할 때 키보드에서 다른 곳으로 집중을 빼앗기는 것을
싫어합니다. 전, 키보드와 마우스를 넘나들면서도 남들보다 빨리 코딩할
자신이 없습니다.
&lt;/p&gt;
&lt;p&gt;
그래서 될 수 있으면 마우스를 안 쓰려고 하는데, 그건 쥐들이 싫어서
그런 것이 아니라 키보드로 코드 쓰는 것이 제일 편하기
때문입니다. 키보드 없이 코딩하는 것을 좋아하시는 분이 있을지도
모르겠습니다. (그치만, 음성 인식 시스템으로 펄 코딩하는 비디오 보셨나요?)
&lt;/p&gt;
&lt;p&gt;
어쨌든 저는 그놈 작업 공간 하나에 이맥스 프레임을 6개 올려 놓고
사용합니다. 이맥스 프레임이라는 것이 X 상에서는 창이지요. 그리고 알트
탭 신공으로는 창 바꾸기가 너무 힘듭니다. 전 알트 탭 신공에 능하지
않아서 알트를 누르고 있으면서 탭을 몇 번 눌러야 제가 원하는 창으로 갈
수 있는지를 모릅니다. 어떤 분은 한번에 10개 이상 창을 띄워 놓고
작업하시더라구요.
&lt;/p&gt;
&lt;p&gt;
웹에 찾아보니까 &lt;a href="http://www.jperla.com/blog/2008/09/18/switch-windows-quickly/"&gt;Joseph Perla라는 분의 방법&lt;/a&gt;을 이용할 수
있겠더라구요. 아주 재미있는 방법인데, 제가 창을 옮길 때마다 코드를
수정하고 싶지는 않더라구요.
&lt;/p&gt;
&lt;p&gt;
특정 방향에 있는 프레임으로 옮기면 정말 좋을 것 같다고 생각했죠. X
윈도 시스템을 좀 더 파 볼까 생각했지만, 어차피 화면에 놓여 있는
창들은 모두 이맥스 프레임인데, ELisp으로 짜는 것이 더 낫고, 더
재미있겠다고 생각했습니다.
&lt;/p&gt;
&lt;p&gt;
그걸 하기 위한 이맥스 코드를 작성했습니다. 슈퍼키+왼쪽 화살표로
왼쪽에 있는 가장 가까운 이맥스 프레임(창)으로 이동합니다. 다른
화살표도 마찬가지.
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-1.1" class="outline-3"&gt;
&lt;h2 id="sec-1.1"&gt;ELisp 코드&lt;/h2&gt;
&lt;div id="text-1.1"&gt;

&lt;p&gt;아래 코드를 복사해서 붙인 다음 ELisp 코드를 두는 곳에 저장하세요.
&lt;/p&gt;
&lt;p&gt;
&lt;pre class="example"&gt;
;; directed-switch-to-frame.el -- Switching to frames with direction.

;; Keywords: frame, direction

;; Move 4 direction to switch emacs frames.

(defun cartesian-to-polar (cartesian)
  "Convert cartesian coordinate to polar coordinate."
  (let ((x (float (car cartesian))) (y (float (cdr cartesian))))
    (cons
     (sqrt (+ (* x x) (* y y)))
     (cond ((and (= x 0) (&amp;gt; y 0)) (* pi 0.5))
           ((and (= x 0) (&amp;lt; y 0)) (* pi 1.5))
           ((&amp;lt; x 0) (+ (atan (/ y x)) pi))
           ((and (&amp;gt; x 0) (&amp;lt; y 0)) (+ (atan (/ y x)) (* pi 2)))
           ((&amp;gt; x 0) (atan (/ y x)))
           (t nil)))))

(defun switch-to-frame-with-direction (dir-in-deg var-in-deg next)
  "Switch to frame with direction with variation."
  (let ((f (sort (delq nil
                       (let ((list-of-frames (mapcar (lambda (each-frame)
                                                       (cons each-frame
                                                             (cons (+ (frame-parameter each-frame 'left)
                                                                      (/ (frame-pixel-width each-frame) 2))
                                                                   (+ (frame-parameter each-frame 'top)
                                                                      (/ (frame-pixel-height each-frame) 2)))))
                                                     (cons (selected-frame) 
                                                           (delete-if (lambda (item)
                                                                        (or (eq (selected-frame) item)
                                                                            (eq nil (frame-parameter item 'window-id))))
                                                                        (visible-frame-list)))))
                             (dir-in-rad (degrees-to-radians (mod dir-in-deg 360)))
                             (var-in-rad (degrees-to-radians (mod var-in-deg 360))))
                         (mapcar
                          (lambda (each-frame)
                            (let ((polar (cartesian-to-polar (cons (- (cadr each-frame) (cadr (car list-of-frames)))
                                                                   (- (cddr each-frame) (cddr (car list-of-frames)))))))
                              (when (or (not (numberp (cdr polar)))
                                        (&amp;lt; (- (* 2 pi) (abs (- (cdr polar) dir-in-rad))) var-in-rad)
                                        (&amp;lt; (abs (- (cdr polar) dir-in-rad)) var-in-rad))
                                (cons (car each-frame) polar))))
                          (cdr list-of-frames))))
                 (lambda (a b)
                   (or (not (numberp (cddr b)))
                       (and (numberp (cddr a))
                            (&amp;lt; (cadr a) (cadr b))))))))
    (cond ((not f) nil)
          ((cddar f) (x-focus-frame (caar f)))
          (t (while (not (memq (selected-frame) (mapcar 'car f)))
               (other-frame next))))))

(defun switch-to-right-frame ()
  (interactive)
  (switch-to-frame-with-direction 0 60 -1))

(defun switch-to-down-frame ()
  (interactive)
  (switch-to-frame-with-direction 90 60 -1))

(defun switch-to-left-frame ()
  (interactive)
  (switch-to-frame-with-direction 180 60 1))

(defun switch-to-up-frame ()
  (interactive)
  (switch-to-frame-with-direction 270 60 1))

(provide 'directed-switch-to-frame)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
죄송합니다만, 아직 ELisp 코드를 잘 짜는 것은 아닙니다.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-1.2" class="outline-3"&gt;
&lt;h2 id="sec-1.2"&gt;키 바인딩&lt;/h2&gt;
&lt;div id="text-1.2"&gt;

&lt;p&gt;다음 코드를 이맥스 설정 파일인 .emacs에 넣습니다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre class="example"&gt;
;; Moving between frames
(when (load "directed-switch-to-frame")
  (global-set-key [s-left] 'switch-to-left-frame)
  (global-set-key [s-right] 'switch-to-right-frame)
  (global-set-key [s-up] 'switch-to-up-frame)
  (global-set-key [s-down] 'switch-to-down-frame))
&lt;/pre&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-1.3" class="outline-3"&gt;
&lt;h2 id="sec-1.3"&gt;되는지 해 볼까요?&lt;/h2&gt;
&lt;div id="text-1.3"&gt;

&lt;p&gt;이맥스를 새로 시작하고 C-x 5 2를 눌러서 프레임을 여러 개
만듭니다. 보통 슈퍼키는 윈도키로 바인딩 되어 있으므로 윈도키를 누른
상태에서 방향키를 눌러보세요. 잘 되나요?
&lt;/p&gt;
&lt;p&gt;
이맥스 창으로만 움직일 수 있습니다. 그리고 다른 이맥스 인스턴스의
프레임으로는 이동할 수 없습니다.
&lt;/p&gt;
&lt;p&gt;
만약에 프레임의 중심 좌표가 정확하게 겹친 상태에서 프레임이 없는
방향으로 이동하라고 한다면 겹쳐진 창을 순환시킬 수 있습니다. 전체
화면 프레임들을 여러 개 겹쳐 놓고 작업하는 상황에서 유용하게 쓸 수
있습니다. 알트 탭을 누르는 것보다 더 빨리 움직일 수 있습니다. 반대쪽
방향을 누르면 반대로 순환합니다.
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-564378327194798693?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/564378327194798693/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=564378327194798693&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/564378327194798693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/564378327194798693'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2008/10/blog-post.html' title='이맥스 프레임 빨리 바꾸기'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-4940190355145957409</id><published>2008-10-21T22:03:00.010+09:00</published><updated>2011-08-31T15:02:25.329+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='이맥스'/><title type='text'>Switch Emacs Frames Quickly</title><content type='html'>&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;div id="text-1"&gt;

&lt;p&gt;Quick answer: Function other-frame is bound to C-x 5 o. But I'm not
talking about it.&lt;/p&gt;

&lt;p&gt;I don't like to lose focus on my keyboard when I write code. I'm not
effective enough to work well while switching between keyboard and
mouse.
&lt;/p&gt;
&lt;p&gt;
So I try not to use mouse if possible, not because I hate mice but I
can write code easier with keyboard only. Someone may prefer to write code
without keyboard though. (But has anybody here watched the video about
writing perl code with voice recognition system?)
&lt;/p&gt;
&lt;p&gt;
Anyway, I open about 6 emacs frames&amp;ndash;which are windows of X&amp;ndash; in a
single GNOME workspace. And it's very hard to switch between frames
with Alt-Tabs. I don't
know how many Tabs with Alt key pressed I need for switching to my
desired frame. I saw someone open more than 10 frames at a time.
&lt;/p&gt;
&lt;p&gt;
I searched and found &lt;a href="http://www.jperla.com/blog/2008/09/18/switch-windows-quickly/"&gt;Joseph Perla's solution&lt;/a&gt;. His
solution was very interesting, but I'd rather not change source code
whenever I move window positions.
&lt;/p&gt;
&lt;p&gt;
I thought it would be great if I could switch to the frame on some
direction. I could research X Window system more, but I chose ELisp
for that, because every window on the screen was Emacs frame and
I enjoyed learning ELisp.
&lt;/p&gt;
&lt;p&gt;
Well, this is ELisp code to make it possible. I bound super-left key to
switch to the nearest frame on the left side of the current frame, and so on.
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-1.1" class="outline-3"&gt;
&lt;h2 id="sec-1.1"&gt;ELisp Code&lt;/h2&gt;
&lt;div id="text-1.1"&gt;

&lt;p&gt;You can copy and paste the following code and save it to your ELisp
place.
&lt;/p&gt;
&lt;p&gt;
&lt;pre class="example"&gt;
;; directed-switch-to-frame.el -- Switching to frames with direction.

;; Keywords: frame, direction

;; Move 4 direction to switch emacs frames.

(defun cartesian-to-polar (cartesian)
  "Convert cartesian coordinate to polar coordinate."
  (let ((x (float (car cartesian))) (y (float (cdr cartesian))))
    (cons
     (sqrt (+ (* x x) (* y y)))
     (cond ((and (= x 0) (&amp;gt; y 0)) (* pi 0.5))
           ((and (= x 0) (&amp;lt; y 0)) (* pi 1.5))
           ((&amp;lt; x 0) (+ (atan (/ y x)) pi))
           ((and (&amp;gt; x 0) (&amp;lt; y 0)) (+ (atan (/ y x)) (* pi 2)))
           ((&amp;gt; x 0) (atan (/ y x)))
           (t nil)))))

(defun switch-to-frame-with-direction (dir-in-deg var-in-deg next)
  "Switch to frame with direction with variation."
  (let ((f (sort (delq nil
                       (let ((list-of-frames (mapcar (lambda (each-frame)
                                                       (cons each-frame
                                                             (cons (+ (frame-parameter each-frame 'left)
                                                                      (/ (frame-pixel-width each-frame) 2))
                                                                   (+ (frame-parameter each-frame 'top)
                                                                      (/ (frame-pixel-height each-frame) 2)))))
                                                     (cons (selected-frame) 
                                                           (delete-if (lambda (item)
                                                                        (or (eq (selected-frame) item)
                                                                            (eq nil (frame-parameter item 'window-id))))
                                                                        (visible-frame-list)))))
                             (dir-in-rad (degrees-to-radians (mod dir-in-deg 360)))
                             (var-in-rad (degrees-to-radians (mod var-in-deg 360))))
                         (mapcar
                          (lambda (each-frame)
                            (let ((polar (cartesian-to-polar (cons (- (cadr each-frame) (cadr (car list-of-frames)))
                                                                   (- (cddr each-frame) (cddr (car list-of-frames)))))))
                              (when (or (not (numberp (cdr polar)))
                                        (&amp;lt; (- (* 2 pi) (abs (- (cdr polar) dir-in-rad))) var-in-rad)
                                        (&amp;lt; (abs (- (cdr polar) dir-in-rad)) var-in-rad))
                                (cons (car each-frame) polar))))
                          (cdr list-of-frames))))
                 (lambda (a b)
                   (or (not (numberp (cddr b)))
                       (and (numberp (cddr a))
                            (&amp;lt; (cadr a) (cadr b))))))))
    (cond ((not f) nil)
          ((cddar f) (x-focus-frame (caar f)))
          (t (while (not (memq (selected-frame) (mapcar 'car f)))
               (other-frame next))))))

(defun switch-to-right-frame ()
  (interactive)
  (switch-to-frame-with-direction 0 60 -1))

(defun switch-to-down-frame ()
  (interactive)
  (switch-to-frame-with-direction 90 60 -1))

(defun switch-to-left-frame ()
  (interactive)
  (switch-to-frame-with-direction 180 60 1))

(defun switch-to-up-frame ()
  (interactive)
  (switch-to-frame-with-direction 270 60 1))

(provide 'directed-switch-to-frame)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Sorry, I'm not good at writing ELisp code yet.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-1.2" class="outline-3"&gt;
&lt;h2 id="sec-1.2"&gt;Key binding&lt;/h2&gt;
&lt;div id="text-1.2"&gt;

&lt;p&gt;I put the following code to my .emacs file.
&lt;/p&gt;
&lt;p&gt;
&lt;pre class="example"&gt;
;; Moving between frames
(when (load "directed-switch-to-frame")
  (global-set-key [s-left] 'switch-to-left-frame)
  (global-set-key [s-right] 'switch-to-right-frame)
  (global-set-key [s-up] 'switch-to-up-frame)
  (global-set-key [s-down] 'switch-to-down-frame))
&lt;/pre&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-1.3" class="outline-3"&gt;
&lt;h2 id="sec-1.3"&gt;Enjoy&lt;/h2&gt;
&lt;div id="text-1.3"&gt;

&lt;p&gt;Restart your emacs and open multiple frames with C-x 5 2. Usually the super
key is bound to the Windows key. So try Win-Left, Win-Up,
Win-Right, Win-Down to switch frames. Does it work?
&lt;/p&gt;
&lt;p&gt;
It doesn't move to windows other than Emacs frames. And it doesn't move to
Emacs frames of other emacs instances.
&lt;/p&gt;
&lt;p&gt;
If center coords of frames are same, the focus cycles if there are
no other frames on that direction. This is useful if you opened
multiple full screen frames. You can switch more quickly than
Alt-Tab. Opposite direction will cycle the opposite way. Isn't that cool? :)
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-4940190355145957409?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/4940190355145957409/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=4940190355145957409&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/4940190355145957409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/4940190355145957409'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2008/10/switch-emacs-frames-quickly.html' title='Switch Emacs Frames Quickly'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-3539032698863097257</id><published>2008-05-14T10:31:00.006+09:00</published><updated>2008-10-04T07:58:55.078+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='이맥스'/><category scheme='http://www.blogger.com/atom/ns#' term='사전'/><title type='text'>이맥스 사전 패키지 dictionary</title><content type='html'>&lt;p&gt;!! 저는 이 사전 패키지보다 구글 사전과 이맥스를 붙인 것을 더 자주
사용합니다. 제 블로그에서 찾아주세요. !!&lt;/p&gt;

&lt;h3&gt;소개&lt;/h3&gt;

&lt;p&gt;이맥스에서 메일을 읽거나 웹을 돌아다니다 보면, 사전을 찾아야 할 때가
종종 있다. 그럴 때마다 종이 사전을 뒤적거리거나, 전자 사전을
뒤적거리거나, 혹은 다른 사전 응용 프로그램이나 웹 사전을 이용해 본 
경험이 있을 것이다. 이맥스를 사용하는 도중에 가급적이면 이맥스 밖으로
눈을 돌리는 행동을 삼가야 한다. 따라서 이맥스에서 나가지 않고, 사전을
뒤적거릴 수 있는 사전 패키지인 &lt;a href="http://www.myrkr.in-berlin.de/dictionary/"&gt;dictionary&lt;/a&gt;를 소개하고자 한다.
&lt;/p&gt;

&lt;h3&gt;설치&lt;/h3&gt;


&lt;p&gt;
dictionary 패키지는 &lt;a href="http://www.dict.org/rfc2229.txt"&gt;RFC 2229&lt;/a&gt;에 따라 동작하는 사전 서버와 통신이
필요하므로 사전 서버와의 네트워크 연결이 필요하다. 기본으로 지정된
사전 서버도 잘 동작하므로, 인터넷에 연결되어 있는 PC면 충분하다.
&lt;/p&gt;
&lt;p&gt;
필자는 젠투 리눅스를 이용하므로 다음과 같이 설치를 수행하였다.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;
# emerge app-emacs/dictionary
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
데비안을 이용한다면 다음과 같이 패키지 설치를 할 수 있다.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;
# apt-get install dictionary-el
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
직접 설치하려면 홈페이지에서 다운로드 한 뒤 적당한 디렉토리에 넣고,
필요하다면 컴파일을 하면 된다. 다른 패키지들의 설치 방법과
동일하다.
&lt;/p&gt;

&lt;h3&gt;사용&lt;/h3&gt;


&lt;p&gt;
다음과 같은 키바인딩을 이용하면 편리하다. 젠투의 경우에는 패키지를
설치하면 기본적으로 다음과 같은 키바인딩이 된다.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;
;; key bindings
(global-set-key "\C-cs" 'dictionary-search)
(global-set-key "\C-cm" 'dictionary-match-words)
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
이제 C-c s를 누르고 찾고자 하는 단어를 찾으면 사전 검색 결과가
화면에 나타난다.
&lt;/p&gt;

&lt;h3&gt;커스터마이징&lt;/h3&gt;


&lt;p&gt;
M-x customize-group RET dictionary RET을 하면 커스터마이징 페이지를
볼 수 있다. 여기서 사전 서버를 변경한다거나 다른 세팅들을 할 수
있다.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-3539032698863097257?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.myrkr.in-berlin.de/dictionary/' title='이맥스 사전 패키지 dictionary'/><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/3539032698863097257/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=3539032698863097257&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/3539032698863097257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/3539032698863097257'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2008/05/dictionary.html' title='이맥스 사전 패키지 dictionary'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-759162528999909376</id><published>2008-03-06T16:07:00.011+09:00</published><updated>2008-03-07T01:11:11.364+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='마르코프'/><category scheme='http://www.blogger.com/atom/ns#' term='확률'/><category scheme='http://www.blogger.com/atom/ns#' term='인공지능'/><title type='text'>마르코프 연쇄</title><content type='html'>&lt;p&gt;
  마르코프 연쇄에 대해서 알아볼 일이 생겨서 위키백과를 참조하는데, 좀
  어렵게 설명이 되어 있더군요. 나중에 시간이 생기면 정리를 좀 해 보고
  싶습니다. 일단 간략하게 (관리 안 되고 방치되어 있는) 블로그에 알기
  쉽게 써 보려고 합니다. 비전공자도 이해할 수 있는 언어로 말이죠.
&lt;/p&gt;
&lt;p&gt;
  고전 영화 터미네이터를 보면 미래에 일어나는 일를 막으려고 누군가가
  미래에서 찾아오죠. 근데 미래에서 막으면 되지 왜 과거로 오는 것일까요? 그건
  미래에 일어나는 일이 과거와 관련이 있기 때문입니다. 과거에 뭔가가
  일어났기 때문에 미래에 어떤 일이 일어나는 거죠.
&lt;/p&gt;
&lt;p&gt;
  그러면 과거의 어떤 일 때문에 그 일이 일어나는 걸까요? 내가 오늘
  지각한 이유는 아침에 늦게 일어났기 때문이지만, 그건 그 전날에 술을
  먹었기 때문이고, 술을 먹은 이유는 3년 전에, 소주 회사에서 술의 도수를
  낮췄기 때문이다.  이렇게 핑계를 대 볼 수 있습니다. 즉, 오늘 어떤 일이
  일어난 이유는 과거에 있었던 무한히 많은 일들이 모두 연관되어 있다는 겁니다.
&lt;/p&gt;
&lt;p&gt;
  그런데 너무 복잡합니다. 맞습니다. 너무 복잡합니다. 그런데 이공계의
  많은 지식들은 이런 복잡한 문제를 단순하게 보기 시작하면서 문제를 풀어
  나갑니다. "세상에 난 수학/과학을 볼 때마다 너무 복잡해서 이해할 수가
  없던데, 이걸 간단하다고 하다니..." 라고 생각하시는 분들이 계시겠지만
  천만에... 그런 학문들이 없었으면 같은 현상을 이해하기는 훨씬 더
  어려울 겁니다. 핫하, 과학은 세상을 더 쉽고 편리하게 만들어
  준다니깐요.
&lt;/p&gt;
&lt;p&gt;
  잠깐 삼천포로 빠졌습니다. 그러면 어떻게 간단히 해 볼까요? 과거의
  무한히 많은 일들 때문에 오늘 이런 일이 일어났다고 생각하지 말고,
  과거의 유한(!)한 몇몇 일 때문에 오늘의 일이 일어났다고 생각해 보는
  겁니다. 이것이 마르코프의 가정(가설)입니다. 이 가정에 따르는 일련의
  과정을 마르코프 과정 혹은 마르코프 연쇄라고 합니다.
&lt;/p&gt;
&lt;p&gt;
  그러면 내친김에 아주 간단하게 해 봅시다. 오늘 어떤 일이 일어나는
  이유는 바로 전날에 일어난 일 때문이다. 어떤 사건은 그 일이 일어나기
  바로 전에 있었던 일과 관련이 있고, 그 둘 사이의 확률로 나타내어 보는
  것입니다. 즉, "어제 그녀가 나에게 미소를 지어 주었으니 오늘 그녀가
  마찬가지로 나에게 미소를 지어줄 확률이 70 퍼센트는 되겠군." 혹은
  "어제 그녀가 화가 났는데 오늘 화가 안 풀렸을 확률이 70 퍼센트 정도는
  되겠군." 이런 것이 됩니다. (후... 저랑 별로 관련없는 것으로 예를
  들려니 힘들군요. 제발 관련 좀 있게 해 주세요.)
&lt;/p&gt;
&lt;p&gt;
  다시 말하자면 방금 설명한 제 마음 속의 여인은 그날의 기분은 바로
  전날의 기분에 따라서만(!) 좌우됩니다. 바꾸어 말하면 오늘의 기분에서
  일정한 확률로 계산되어 내일의 기분이 결정되는 겁니다. (헉-_-
  로보트인가.) 이것이 1차 마르코프 연쇄입니다.
&lt;/p&gt;
&lt;p&gt;
  이틀 전의 일까지 오늘의 기분에 직접적으로 영향을 끼치는 조금 더
  복잡한 그녀는 2차 마르코프 연쇄를 따르시는 분이 됩니다. 즉, "그녀의
  어제의 기분은 어땠고, 이틀전의 기분은 어땠기 때문에 오늘의 기분이
  이럴 확률은 몇 퍼센트이군." 이렇게 그녀의 기분을 계산(-_-) 할 수
  있다는 겁니다. 대신에, 2년 전에, 어느 날에 기분이 나빴기 때문에 오늘
  기분이 나쁘다고 하지는 않습니다. 정확히 말해서, 직접적으로 영향을
  받지는 않습니다.
&lt;/p&gt;
&lt;p&gt;
  1차 마르코프 연쇄를 따르는 그녀는 바로 전날의 기분에 따라서 오늘의
  기분이 좌우되는 이상적인(-_-) 분이시지만, 바로 전날의 기분은 그
  전날의 기분에 따라 좌우되기 때문에, 결국 연쇄적으로 따진다면 오늘
  그녀의 기분은 태어날 때의 기분과도 관련이 있다는 겁니다. 사슬처럼
  연결이 되어 있죠. 그치만, 오늘 그녀의 기분을 예상하는데에는 바로
  전날의 기분만 알고 있으면 땡이죠! 수학은 이래서 삶에 도움이 되는
  겁니다. 헛헛허... (과연...)
&lt;/p&gt;
&lt;p&gt;
  좀 다른 문제를 생각해 보죠. 가위 바위 보를 해서 계단을 올라가는
  놀이는 예전에 해 보셨겠죠. 좀 더 높은 확률로 이기려면 바로 전에
  상대가 무엇을 냈고 그 다음에 무엇을 내는지를 통계를 낸다면, 골고루
  분포되어 있지는 않을 겁니다. 이걸 이용하면 좀 더 많이 이길 수 있을
  겁니다. 음악 작곡을 하는데 어떤 음이 나온 뒤에 어떤 음이 나올지에
  대한 확률을 구하여 기계 작곡에 도움을 얻을 수도 있을 겁니다. 물론
  바로 전에 것 뿐만이 아니라, 그 전에 있는 것까지 볼 수도 있겠지요.
  (앞에 몇 개까지냐에 따라서 1차, 2차, 3차 ... 가 됩니다.)
&lt;/p&gt;
&lt;p&gt;
  자연과학적 개념들을 일단 이게 뭔지 이해를 하고 나면 똑같은 책을
  보는데도 훨씬 쉬워집니다. 즉, 같은 마법사의 책(알 수 없는 고대의
  언어로 씌여진 이공계 서적)을 본다고 해도 대충 개념이 잡혀 있는
  상태에서 보는 경우와 그렇지 않은 상태에서 보는 경우에 개념을
  이해하는데 소모되는 칼로리의 양과 쌓이는 스트레스의 강도는 급격히
  달라지게 됩니다. 저는 책들이 개념 설명을 좀 쉽게 해 줬으면
  좋겠습니다. 각 장의 첫 번째 절에서 쉽게 개념을 잡아주고, 뭔놈의
  법칙, 뭔놈의 법칙을 알려줬으면 하는데, 처음부터 외계어로 설명하면
  상당히 괴롭습니다. 물론 좋은 책들은 앞 부분에서 개념을 잡아주어
  안드로메다로 가는 것을 막아줍니다.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-759162528999909376?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/759162528999909376/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=759162528999909376&amp;isPopup=true' title='4개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/759162528999909376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/759162528999909376'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2008/03/blog-post.html' title='마르코프 연쇄'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-2698300310625103281</id><published>2007-12-09T22:21:00.000+09:00</published><updated>2007-12-10T22:56:13.245+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='오페라'/><category scheme='http://www.blogger.com/atom/ns#' term='웹브라우저'/><title type='text'>보안은 오페라가 최고</title><content type='html'>&lt;p&gt;가끔 웹 브라우저의 보안 결함을 비교하고 있는데 시큐니아( http://secunia.com ) 라는 사이트에 가면 각 소프트웨어의 알려진 보안 결함이 나타납니다.&lt;/p&gt;

&lt;p&gt;각 브라우저의 최신버전의 보안 결함의 수를 매번 비교해 보고 있는데, 검색할 때마다 오페라는 0입니다.&lt;/p&gt;

&lt;p&gt;지금 글을 쓰는 현재, IE7은 7개, 파이어폭스는 6개, 사파리는 3개, 컹커러는 2개의 보안 결함이 있네요. 오페라는 0입니다.&lt;/p&gt;

&lt;p&gt;이것은 결함이 생겼어도 이미 고쳐졌다는 겁니다. 다른 브라우저들은 최신 버전으로 업데이트해도 여전히 알려진 결함이 있다는 의미이구요. 오페라는 보안 결함이 발생해도 빠른 시간 내로 수정 업데이트가 되더군요. 잘 발생하지도 않구요. 오페라 보안 취약점이 발견되었다는 기사들을 보면 해결 방법은 최신 버전으로 업데이트하는 것이라고 나오는 경우가 대부분입니다. 이것은 최신 버전에서는 결함이 수정되었다는 의미로써, 최신 버전으로 유지가 필요합니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-2698300310625103281?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/2698300310625103281/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=2698300310625103281&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/2698300310625103281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/2698300310625103281'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/12/blog-post.html' title='보안은 오페라가 최고'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-8873390335303294263</id><published>2007-07-15T11:47:00.000+09:00</published><updated>2007-07-15T11:56:12.102+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='이맥스'/><category scheme='http://www.blogger.com/atom/ns#' term='지메일'/><title type='text'>이맥스에서 지메일의 SMTP 이용하기</title><content type='html'>&lt;p&gt;
나는 &lt;a href="http://www.opera.com/"&gt;오페라&lt;/a&gt; 웹 브라우저의 메일 클라이언트인 &lt;a href="http://www.opera.com/products/desktop/m2/"&gt;M2&lt;/a&gt;와 &lt;a href="http://www.gnu.org/software/emacs/"&gt;이맥스&lt;/a&gt;를 메일
클라이언트로 이용한다. 이맥스를 메일 클라이언트로 활용할 때 &lt;a href="http://www.gmail.com/"&gt;지메일&lt;/a&gt;의
SMTP를 이용하여 메일을 보낼 수 있는데 이 방법을 소개하고자 한다.
&lt;/p&gt;
&lt;p&gt;
지메일의 받고 보내는 서버는 다음과 같다.
&lt;/p&gt;
&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;COL align="left"&gt;&lt;COL align="left"&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;서버 종류&lt;/th&gt;&lt;th&gt;설정&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;받는 메일 서버 (POP3)&lt;/td&gt;&lt;td&gt;pop.gmail.com&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;SSL: 사용함&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;포트: 995&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;보내는 메일 서버 (SMTP)&lt;/td&gt;&lt;td&gt;smtp.gmail.com (인증 사용)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;STARTTLS: 사용함&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;포트: 465와 587&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;
이것은 지메일에서 POP 신청을 한 후에 이용 가능하다. 만약 이미 지메일을
다른 메일 클라이언트에서 이용하고 있다면 이미 신청을 한 것이다. 그렇지
않다면 지메일 설정에 가서 POP 신청을 하면 된다. 신청을 하면 POP3 뿐만
아니라 SMTP까지 이용할 수 있다.
&lt;/p&gt;
&lt;p&gt;
그렇다면 지메일의 SMTP를 이용하는 방법을 알아보자. 시작 스크립트에
등록하는 방법을 이용할 수도 있고, Customize를 이용하는 방법이 있는데,
Customize를 이용하는 방법을 알아보자.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
M-x customize-group RET mail RET을 한다.
&lt;/li&gt;
&lt;li&gt;
사용자 이름 등 필요한 설정을 하고 C-x C-s를 하여 설정을 저장한다.
&lt;/li&gt;
&lt;li&gt;
M-x customize-variable RET send-mail-function RET을 한 뒤
smtpmail-send-it으로 설정한다. 이것을 하지 않으면 sendmail
프로그램을 통하여 메일이 전송된다. C-x C-s로 저장한다.
&lt;/li&gt;
&lt;li&gt;
M-x custoimze-variable RET message-send-mail-function RET을 한 뒤
message-smtpmail-send-it을 설정한다. C-x C-s로 저장한다.
&lt;/li&gt;
&lt;li&gt;
~/.signature 파일에 자신의 메일 서명을 쓰고 저장한다.
&lt;/li&gt;
&lt;li&gt;
M-x customize-group RET smtpmail RET를 한다.
&lt;/li&gt;
&lt;li&gt;
smtpmail-default-smtp-server와 smtpmail-smtp-server를
smtp.gmail.com 으로 설정한다.
&lt;/li&gt;
&lt;li&gt;
smtpmail-smtp-service를 587로 설정한다.
&lt;/li&gt;
&lt;li&gt;
smtpmail-starttls-credentials에서 State를 누르고 :키를 눌러 LISP
형태로 나타나게 한다. 이렇게 하는 이유는 nil을 입력할 수 있는
방법이 없게 되어 있는 문제점이 있기 때문이다.
&lt;/li&gt;
&lt;li&gt;
빈 칸에 '(("smtp.gmail.com" 587 nil nil))를 입력한다.
&lt;/li&gt;
&lt;li&gt;
smtpmail-auth-credentials에 Value Menu를 누르고 Repeat를 선택한다.
&lt;/li&gt;
&lt;li&gt;
INS 버튼을 누른 다음에 필요한 내용을 집어 넣는다. 여기서 사용자
이름에는 반드시 @gmail.com까지 포함시켜 완전한 이메일 주소를
넣어야 한다.
&lt;/li&gt;
&lt;li&gt;
패스워드는 넣지 않으면 보낼 때마다 물어본다.
&lt;/li&gt;
&lt;li&gt;
C-x C-s를 눌러 설정 파일을 저장한다.

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;만일 패스워드를 매번 입력하는 것이 귀찮지만 이맥스 설정 파일에
패스워드를 집어넣는 것이 마음 편하지 않다면 따로 netrc 형태의 파일을
만들고 거기에 집어넣고 permission을 변경하는 방법이 있다.
&lt;/p&gt;
&lt;p&gt;
임의의 파일을 하나 생성하여 퍼미션을 600으로 준 뒤 다음과 같이 입력하고
저장하고 M-x customize-variable RET smtp-auth-credentials RET를 하고
Value Menu를 눌러 파일 형태를 선택하고 그 파일 이름을 입력하면 된다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
machine smtp.gmail.com login username@gmail.com password PASSWORD
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
이제 C-x m을 눌러 메일을 작성한 뒤 C-c C-c를 눌러서 메일을 전송하면
된다. 먼저 자기 자신에게 테스트 메일을 보내본다. 언어 설정 등이 제대로
되어 있다면 한글로 보낸 경우에도 깨지지 않고 메일이 잘 전송될 것이다.
&lt;/p&gt;
&lt;p&gt;
VM을 이용하는 사람들은 &lt;a href=":href=http://bc.tech.coop/blog/061023.html"&gt;Bill Clementson's Blog: VM and Gmail Setup for
Dummies&lt;/a&gt;를 참고한다.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-8873390335303294263?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/8873390335303294263/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=8873390335303294263&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/8873390335303294263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/8873390335303294263'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/07/smtp.html' title='이맥스에서 지메일의 SMTP 이용하기'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-1674808992799924923</id><published>2007-07-08T01:29:00.000+09:00</published><updated>2007-07-08T01:32:57.534+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='데이터베이스'/><category scheme='http://www.blogger.com/atom/ns#' term='웹'/><title type='text'>웹 기반 미디어 관리 시스템 Jinzora</title><content type='html'>&lt;h2&gt;소개&lt;/h2&gt;


&lt;p&gt;
웹기반 미디어 관리 시스템인 &lt;a href="http://www.jinzora.org/"&gt;Jinzora&lt;/a&gt;를 소개한다.
&lt;/p&gt;
&lt;p&gt;
가지고 있는 음악이나 동영상과 같은 미디어 파일들을 웹을 통하여
쉽게 관리할 수 있고, 스트리밍으로 여러 재생기로 재생할 수 있다.
&lt;/p&gt;

&lt;h3&gt;요구 사항&lt;/h3&gt;


&lt;p&gt;
요구 사항 역시 간단하다.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
PHP 4.2.0 이상 (4.3.0 이상을 권장)
&lt;/li&gt;
&lt;li&gt;
MySQL 3.23.32 이상 (SQLite, PostgreSQL 등 다른 DB도 이용가능)
&lt;/li&gt;
&lt;li&gt;
아파치나 IIS (다른 웹서버도 가능하지만 지원하지 않음)

&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;설치&lt;/h3&gt;


&lt;p&gt;
설치 역시 어렵지 않다. STANDALONE과 CMS 설치가 있는데 STANDALONE
설치에 대해서만 써 본다.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
웹 서버 경로에 압축된 파일을 푼다.
&lt;/li&gt;
&lt;li&gt;
압축을 풀고 &lt;code&gt;sh configure.sh&lt;/code&gt; 를 실행한다. 이것은 퍼미션을
설정하는 역할을 하는데, 윈도 사용자는 하지 않아도 된다.
&lt;/li&gt;
&lt;li&gt;
브라우저를 이용하여 페이지에 접근한다. 즉, index.php에 접근하면
된다.
&lt;/li&gt;
&lt;li&gt;
브라우저에 나타난 설치 페이지에 필요한 정보를 입력하면 설치가
완료된다.
&lt;/li&gt;
&lt;li&gt;
설치가 끝나면 설정에 대한 정보를 Jinzora 측에 제공할 수 있는데
정보는 익명으로 전송되며, Jinzora의 개선을 위하여 이용된다.

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;인코딩 관련&lt;/h3&gt;


&lt;p&gt;
인코딩 관련하여 문제가 있을 수도 있다. Jinzora는 ID3v2를 지원하므로
utf-8로 인코딩 된 태그를 제대로 읽을 수 있다.
&lt;/p&gt;
&lt;p&gt;
설치하기 전에 소스 코드의 일부를 수정하여야 한다. utf-8은 가능하지만
eucKR의 경우 php의 &lt;code&gt;htmlentities()&lt;/code&gt; 함수가 eucKR을 지원하지 않으므로
불가능하다. 직접 eucKR용 &lt;code&gt;htmlentities()&lt;/code&gt; 함수를 작성할 수 있다면
이것이 가능해진다.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;jinzora2/services/services/tagdata/getid3/getid3.php&lt;/code&gt; 파일을
수정한다. ID3v2 태그를 변환하는 인코딩이다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
var $encoding = 'UTF-8';    // CASE SENSITIVE! - i.e. (must be supported by iconv())
                            // Examples:  ISO-8859-1  UTF-8  UTF-16  UTF-16BE
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
만약 코딩 시스템이 eucKR이라면 이것을 EUC-KR로 바꾸어야 한다. 그리고
ID3v1의 인코딩이 eucKR이라면 그 아래쪽에 다음과 같이 해 준다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
  var $encoding_id3v1           = 'EUC-KR';         // Should always be 'ISO-8859-1', but some tags may be written
                                                    // in other encodings such as 'EUC-CN'
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
EUC-KR을 이용했다면 인코딩 변환시 지원하지 않는 인코딩이라고 오류가
날 것이다. 실제로 iconv() 모듈이 지원하는 것이기 때문에
&lt;code&gt;jinzora2/services/services/tagdata/getid3/getid3.lib.php&lt;/code&gt; 파일을
수정하면 된다. 1100번째 줄 근처에 보면 인코딩 목록이 나오는데 여기에
EUC-KR을 추가하여 준다. 그리고 &lt;code&gt;htmlentities()&lt;/code&gt; 를 대신할 수 있는
루틴을 작성해 주어야 한다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
  case 'EUCJP':
      $HTMLstring = htmlentities($string, ENT_COMPAT, $charset);
      break;
  case 'EUC-KR':
  case 'EUCKR':
      // 여기에 eucKR용 htmlentities를 작성하여 결과를 $HTMLstring에 넣어준다.
      break;
  case 'UTF-8':
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
이제 &lt;code&gt;jinzora2/jukebox/jukeboxes/mpd.php&lt;/code&gt; 파일을 수정한다. 이것은
파일 이름이 utf-8로 되어 있을 경우에 필요하다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
/* PLAdd()
 *
 * Adds the file &amp;lt;file&amp;gt; to the end of the playlist. &amp;lt;file&amp;gt; must be a track in the MPD database.
 */
function PLAdd($fileName) {
  if ( $this-&amp;gt;debugging ) echo "mpd-&amp;gt;PLAdd()\n";
  if ( ! is_null($resp = $this-&amp;gt;SendCommand(MPD_CMD_PLADD,utf8_decode($fileName)))) $this-&amp;gt;RefreshInfo();
#  if ( ! is_null($resp = $this-&amp;gt;SendCommand(MPD_CMD_PLADD,$fileName))) $this-&amp;gt;RefreshInfo();
  if ( $this-&amp;gt;debugging ) echo "mpd-&amp;gt;PLAdd() / return\n";
  return $resp;
}
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;jinzora2/frontend/display.php&lt;/code&gt; 파일을 수정한다. 이것은 웹 페이지의
인코딩을 변경한다. 페이지를 eucKR로 하고 싶다면 euc-kr을 넣어주면
된다. 여기에 들어가는 것은 &lt;code&gt;htmlentities()&lt;/code&gt; 의 지원여부와는
상관없다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
#  echo '&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&amp;gt;'.  "\n";
  echo '&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&amp;gt;'.  "\n";
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;그 외 설정&lt;/h3&gt;


&lt;p&gt;
선택하는 인터페이스에 따라서 기능이 달라지기도 한다.
&lt;/p&gt;
&lt;p&gt;
음악 플레이를 m3u 등의 파일을 내려받을 수 있게 하는 식으로 할 수도
있고 웹 브라우저에 윈도 미디어 플레이어를 내장시키거나 플래시 미디어
재생기들을 내장시킬 수도 있다. 이것 모두 웹 페이지의 설정
인터페이스를 통하여 가능하다.
&lt;/p&gt;
&lt;p&gt;
앨범 표지나 태그 관리 등의 설정을 할 수 있다.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-1674808992799924923?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/1674808992799924923/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=1674808992799924923&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/1674808992799924923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/1674808992799924923'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/07/jinzora.html' title='웹 기반 미디어 관리 시스템 Jinzora'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-6738456819533993835</id><published>2007-03-31T16:20:00.000+09:00</published><updated>2007-07-07T23:46:11.783+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='이맥스'/><category scheme='http://www.blogger.com/atom/ns#' term='루비 온 레일스'/><title type='text'>쓸만한 이맥스 rhtml 모드</title><content type='html'>&lt;p&gt;
&lt;a href="http://www.rubyonrails.org/"&gt;루비 온 레일스&lt;/a&gt; 프로젝트를 할 때 &lt;a href="http://www.gnu.org/software/emacs/"&gt;이맥스&lt;/a&gt;로 rhtml 파일을 편집해야 할 일이
많다. 그러나 기본 설정의 이맥스는 rhtml을 편집할 경우에는 자동으로
모드를 전환해주지 않는다. &lt;a href="http://dima-exe.ru/rails-on-emacs"&gt;rails.el&lt;/a&gt;을 사용하는 경우에는 html 모드를
주모드로 하게 되는데 내장된 루비 코드가 인식이 되지 않기 때문에 별로
좋지 않다. 게다가 &lt;a href="http://www.thaiopensource.com/nxml-mode/"&gt;nxml-mode&lt;/a&gt;같이 html을 다루기 더 좋은 모드도 있는데
html 모드를 쓰고 싶지 않을 것이다. 이것에 대하여 꽤 괜찮은 글이 있어서
포스팅 해 본다.
&lt;/p&gt;

&lt;p&gt;
문제는 여러 모드 중에서 하나를 선택하여야 한다는 것이고 하나를 선택하면
다른 것의 특징은 잃어버리게 된다는 것이다. 이 글에서 트랙백하고 있는
페이지의 저자는 &lt;a href="http://rubyforge.org/projects/rinari/"&gt;Rinari&lt;/a&gt;라고 하는 패키지가 꽤 좋은 특징이 있는데 다른
특징이 빈약하다고 한다.
&lt;/p&gt;
&lt;p&gt;
리스프의 강력함 덕분에 해결책은 간단하다. 다음과 같은 방법으로 nxml
모드 + 지능적 루비 코드 다루기를 할 수 있다. 원문에서 조금의
추가/수정을 가하였다.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Rinari 패키지에서 rhtml 부분을 내려받는다.
&lt;pre&gt;
svn checkout svn://pstickne@rubyforge.org/var/svn/rinari/trunk/rhtml
&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
nxml-mode를 설치하지 않았다면 설치한다. 젠투 리눅스를 사용하는
경우라면 다음 명령을 입력한다.
&lt;pre&gt;
emerge nxml-mode
&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rails.el&lt;/code&gt; 이 깔려 있지 않다면 설치한다.

&lt;/li&gt;
&lt;li&gt;
ruby-electric이 깔려 있지 않다면 설치한다.

&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$HOME/.emacs&lt;/code&gt; 파일에 다음을 추가한다.
&lt;pre&gt;
(add-to-list 'load-path "~/.emacs.d/rhtml/")
(add-to-list 'load-path "~/.emacs.d/emacs-rails/")
(require 'nxml-mode)
(require 'rhtml-mode)
(require 'rails)
(add-hook 'nxml-mode-hook
   (lambda ()
     (define-key nxml-mode-map "r" 'newline-and-indent)
     (setq indent-tabs-mode nil)
     (setq local-abbrev-table nxml-mode-abbrev-table)
     (message "My nxml-mode customizations loaded")))
&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rhtml/rhtml-mode.el&lt;/code&gt; 파일을 편집하여 &lt;code&gt;(define-derived-mode     rhtml-mode html-mode “RHTML”&lt;/code&gt; 부분에서 &lt;code&gt;html-mode&lt;/code&gt; 를 &lt;code&gt;nxml-mode&lt;/code&gt;
로 바꾼다.

&lt;/li&gt;
&lt;li&gt;
rails.el 파일을 열어서 &lt;code&gt;(setq auto-mode-alist (cons '("\.rhtml$"     . html-mode) ...)...)&lt;/code&gt; 부분을 찾아서 html-code를 rhtml-code로
바꾸어 준다.

&lt;/li&gt;
&lt;li&gt;
이제 rhtml 파일을 열때마다 꽤 괜찮은 화면이 나온다.

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;이렇게 하니까 삽입된 루비 코드가 제대로 하이라이팅이 되어 나오지
않았다. 따라서 6번 항목을 원래대로 돌리고 사용하고 있는데, 결국 html
대신에 nxml-mode로 사용하는 것은 실패한 셈이다.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://platypope.org/blog/2006/9/1/more-valid-than-you"&gt;여기&lt;/a&gt;에는 rhtml을 validation 할 때 발생하는 오류를 제거하기 위한
nxml-mode의 패치가 있다. 단, 이 패치로 모든 문제점이 해결되지는
않는다.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-6738456819533993835?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.blik.it/2007/03/22/better-rhtml-mode-for-emacs/trackback/' title='쓸만한 이맥스 rhtml 모드'/><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/6738456819533993835/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=6738456819533993835&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/6738456819533993835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/6738456819533993835'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/03/rhtml.html' title='쓸만한 이맥스 rhtml 모드'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-230941690528851152</id><published>2007-02-23T14:48:00.000+09:00</published><updated>2007-07-07T23:47:41.350+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='정규식'/><category scheme='http://www.blogger.com/atom/ns#' term='스크립트'/><category scheme='http://www.blogger.com/atom/ns#' term='루비'/><category scheme='http://www.blogger.com/atom/ns#' term='네이버'/><category scheme='http://www.blogger.com/atom/ns#' term='프로젝트'/><category scheme='http://www.blogger.com/atom/ns#' term='리눅스'/><category scheme='http://www.blogger.com/atom/ns#' term='아마록'/><title type='text'>아마록 스크립트 프로젝트</title><content type='html'>&lt;p&gt;
심각하게 좋은 음악 플레이어 &lt;a href="http://amarok.kde.org/"&gt;아마록&lt;/a&gt;. 저는 아마록을 음악 플레이어로 쓰고
있습니다. DB까지 연동하여 체계적으로 음악을 관리할 수 있기
때문이죠. 게다가 음악 플레이어 자체의 디자인도 마음에 듭니다. 그러나
한국 가요의 가사와 앨범 표지를 자동으로 가져오지는 못합니다.
&lt;/p&gt;

&lt;p&gt;
리눅스를 쓰면서 항상 불편한 것들은 내가 한국에서 생활하기 때문이라는
것을 느낍니다. 아마록에서도 조금 마음에 안 드는 점은 국내 가요들은
아마존에 앨범 표지가 없고, lyrc에 가사가 없는 것인데, 결국 이런 것은
사용자가 만들어 가는 것이라는 생각을 해 봤습니다. 사용자가 만들어야
편리해지는 것이죠. 제가 꼭 한국에서 생활하기 때문에 불편하다고 생각하기
보다는 그만큼 노력과 투자를 하지 않았기 때문일 것이라는 거죠.
&lt;/p&gt;
&lt;p&gt;
그래서 만들어 보았습니다! lyrics_naver는 네이버 뮤직에서 가사를
받아오는 아마록용 루비 스크립트입니다. 이제 많은 수의 국내 가요들과
소수의 외국 가요들의 가사를 이 스크립트를 통하여 자동으로 내려받기 하실
수 있습니다. 지금 프로젝트 페이지로 가셔서 다운로드 받으실 수
있습니다. 현재 0.0.3-r1 버전이 릴리즈 되어 있습니다. 설치 방법은 문서
탭에 있는 매뉴얼을 꼭 읽어주세요. 이후에 몇몇 분들의 제안을 받아서 &lt;a href="http://www.cix.co.kr/"&gt;Cix Lyrics&lt;/a&gt; 라는 가사 사이트에서 가사를 검색하는 스크립트인 lyrics_cix도
만들었습니다. 만일 잘 안 되시는 분이 계시다면 글 남겨 주시면
감사하겠습니다.
&lt;/p&gt;
&lt;p&gt;
가사만으로는 무언가 부족하다는 생각이 들어서 만든 것이 covers_melon
스크립트입니다. 이것은 멜론에서 음반 표지를 받아오는 아마록용 루비
스크립트입니다. lyrics_naver 만큼 높은 확률로 음반 표지를 받아오지는
않지만 이것을 돌려놓고 음악을 듣고 있노라면 모르는 사이에 꽤 많은 앨범
표지가 받아져 있는 것을 알 수 있습니다. 앨범 표지 검색률을 높이기
위하여 아직 손을 좀 봐야 합니다. 좀 더 보완이 되면 더욱 쓸만해 질
것이라고 생각합니다. 아마록에서 아마존 이외에 last.fm에서 앨범 표지를
받는 기능이 추가되었다고는 하지만, 외부 스크립트로 앨범 표지 받아오는
것을 만드는 방법은 찾아봐도 잘 없어서 가끔씩 플레이 중인 노래를
검사해서 표지가 없으면 노래가 있는 디렉토리에 앨범 표지를 다운로드
하도록 하였습니다. 이런 방식으로 동작하기 때문에 자동으로 앨범이
내려받아지는 느낌은 들지 않습니다만 음악을 계속해서 듣다 보면 앨범
표지가 적용되어 있는 것을 발견하실 수 있습니다.
&lt;/p&gt;
&lt;p&gt;
가사 검색은 지금 거의 만족할 만한 수준이지만 표지 검색은 검색 확률이
매우 떨어지기 때문에 개선이 필요합니다. 저는 주로 앨범 이름을 "5집 -
Pianissimo"와 같은 형식으로 써 놓기 때문에 스크립트가 앨범 표지 검색을
"서문탁 5집 - Pianissimo"로 하게 되는데, 멜론에서는 그냥 "서문탁
Pianissimo"로 검색해야 제대로 된 결과가 나오더군요. 이런 부분은
스크립트가 알아서 할 수 있도록 차차 고쳐가는 중입니다. 아울러 구글
이미지 검색을 이용하는 스크립트도 작성 중인데, 구글 이미지 검색은 거의
항상 검색이 되기 때문에 앨범명이 이상하게 되어 있으면 이상한 이미지가
다운로드 되어 버리는 문제점이 있습니다. 고민 중입니다.
&lt;/p&gt;
&lt;p&gt;
제가 현재 UTF-8 인코딩을 쓰고 있어서 이것을 기준으로 하였습니다만, 다른
인코딩을 쓰시는 분이 계시면 다른 인코딩에서도 동작할 수 있도록 코드를
수정해 보겠습니다. 아마록 쓰시는 분들은 꼭 한 번 써 보시고 잘 되는지
확인 해 주셨으면 감사하겠습니다.
&lt;/p&gt;
&lt;p&gt;
프로젝트 페이지: &lt;a href="http://kldp.net/projects/amarok-script/"&gt;http://kldp.net/projects/amarok-script/&lt;/a&gt;&lt;br/&gt;
KLDP 블로그: &lt;a href="http://kldp.org/node/78350/"&gt;http://kldp.org/node/78350/&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-230941690528851152?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/230941690528851152/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=230941690528851152&amp;isPopup=true' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/230941690528851152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/230941690528851152'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/02/blog-post_23.html' title='아마록 스크립트 프로젝트'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-6789914775672954068</id><published>2007-02-07T11:26:00.000+09:00</published><updated>2007-07-07T22:20:39.344+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='번역'/><category scheme='http://www.blogger.com/atom/ns#' term='데이터베이스'/><title type='text'>PostgreSQL 가이드 번역 완료</title><content type='html'>&lt;p&gt;PostgreSQL을 젠투에서 설치하고 간단히 사용해 보기 위한 가이드를 번역하는 것을 완료하였습니다. 젠투 문서에 등록되어 있는 것이고 문서 번역은 &lt;a href="http://wiki.kldp.org"&gt;kldp wiki&lt;/a&gt;를 이용하였습니다.&lt;/p&gt;

&lt;p&gt;번역된 문서는 &lt;a href="http://wiki.kldp.org/wiki.php/PostgreSQLOnGentoo"&gt;[이곳]&lt;/a&gt;에서 보실 수 있습니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-6789914775672954068?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/6789914775672954068/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=6789914775672954068&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/6789914775672954068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/6789914775672954068'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/02/postgresql.html' title='PostgreSQL 가이드 번역 완료'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-6372129397349030054</id><published>2007-02-06T11:50:00.000+09:00</published><updated>2007-07-07T23:48:09.644+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='번역'/><category scheme='http://www.blogger.com/atom/ns#' term='루비'/><category scheme='http://www.blogger.com/atom/ns#' term='프로젝트'/><title type='text'>루비 서적 번역 프로젝트</title><content type='html'>&lt;p&gt;
Jeremy McAnally라는 분께서 루비 언어에 대한 새로운 책을 쓰셨는데
&lt;a href="http://www.humblelittlerubybook.com/book/"&gt;온라인으로 html과 pdf 형식으로 배포&lt;/a&gt;를 하고 계십니다.
&lt;/p&gt;

&lt;p&gt;
이런 자료 하나하나가 참 귀중한 정보가 됩니다. 분량은 그리 많지 않지만
광범위한 내용들을 압축해서 잘 다루고 있습니다. 유머감각이 참 뛰어나신
분입니다. 읽기에도 편하고 재미도 있습니다.
&lt;/p&gt;
&lt;p&gt;
홈페이지에 보니까 이 분께서 호스팅 비용이 부족하다고
하시는군요. 사람들이 하루에 몇 기가 정도의 트래픽을 내면서 다운로드를
해 가는데, 트래픽만큼 호스팅 비용이 필요하겠지요. 그래서 가능하면
인쇄본을 구입해달라고 하시는군요. 국내에서는 한글로 된 문서를 찾으시는
분이 많기 때문에 좋은 책 보는데 대한 감사의 표시로 한국어로 책을
번역하고 기부를 받아서 원저작자에게 넘겨주는 방법을 쓰는 것이 어떠냐고
jachin(조성재)님께서 KLDP.org에서 제안하셨습니다. 그래서 현재 번역
프로젝트가 진행중입니다. 번역본이 나온 후에 읽어보셔도 되겠지만, 번역에
관심 있으신 분은 &lt;a href="http://wiki.kldp.org/wiki.php/HumbleLittleRubyBook"&gt;프로젝트 페이지&lt;/a&gt;로 오셔서 참여하실 수 있습니다.
&lt;/p&gt;
&lt;p&gt;
현재 Humble Little Ruby Book은 거의 다 번역된 것 같습니다. 제가 번역한
부분은 2장과 6장입니다. 약간 진행이 더디어지고 있긴 하지만 5장을
제외하고는 번역이 완료되거나 진행 중입니다.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-6372129397349030054?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/6372129397349030054/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=6372129397349030054&amp;isPopup=true' title='3개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/6372129397349030054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/6372129397349030054'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/02/blog-post_06.html' title='루비 서적 번역 프로젝트'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-117057505857773751</id><published>2007-02-04T16:14:00.000+09:00</published><updated>2007-07-07T22:26:48.924+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='정규식'/><category scheme='http://www.blogger.com/atom/ns#' term='스크립트'/><category scheme='http://www.blogger.com/atom/ns#' term='루비'/><category scheme='http://www.blogger.com/atom/ns#' term='네이버'/><category scheme='http://www.blogger.com/atom/ns#' term='리눅스'/><category scheme='http://www.blogger.com/atom/ns#' term='아마록'/><title type='text'>네이버 뮤직에서 가사 긁어오는 루비 스크립트</title><content type='html'>&lt;p&gt;&lt;a href="http://music.naver.com"&gt;네이버 뮤직&lt;/a&gt;에서 노래 가사를 긁어오는 루비 스크립트를 작성해 보았습니다. 아마록 음악 프로그램에서 한국 가요 가사를 긁어오는데 사용하고 있습니다. 웹에서 동작을 확인해 볼 수 있게 하기도 해 보았습니다.&lt;/p&gt;

&lt;p&gt;따로 네이버의 API 등을 이용한 것은 아니고, 그저 HTTP Get을 한 결과를 바탕으로 정규식을 이용하여 가사를 추출해 해는 방식입니다. 처음부터 songid를 알 수 없기 때문에 검색 페이지에서 맨 위에 있는 노래의 songid를 알아내서 이 노래의 가사를 찾아내는 방식으로 동작합니다.&lt;/p&gt;

&lt;p&gt;상당히 간단합니다. 다음에 나오는 lyric_naver.rb 파일에는 검색 결과를 간단히 html 형식으로 출력할 수 있는 함수도 제공합니다. 아마록에서 쓰는 스크립트는 이것을 이용하고, 추가로 아마록과 연결되는 처리, XML 쓰기 처리 등을 해 줍니다. 웹에서 쓰기 위해서는 간단히 getLyricHtml을 호출하기만 하여 뿌려주기만 하면 됩니다.&lt;/p&gt;

&lt;p&gt;물론 스크립트에는 흠이 많습니다. 이상적으로는 국내가요와 외국 가요를 구분하여 각기 다른 곳에서 가사를 받아오면 좋겠지만, 일단은 이정도로만 해 둡니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-117057505857773751?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/117057505857773751/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=117057505857773751&amp;isPopup=true' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/117057505857773751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/117057505857773751'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/02/blog-post.html' title='네이버 뮤직에서 가사 긁어오는 루비 스크립트'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116961068909316149</id><published>2007-01-24T12:51:00.000+09:00</published><updated>2007-07-07T23:49:18.319+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='스킴'/><category scheme='http://www.blogger.com/atom/ns#' term='스크립트'/><category scheme='http://www.blogger.com/atom/ns#' term='루비'/><title type='text'>나의 스크립트 언어 이야기</title><content type='html'>&lt;p&gt;
친구와 스크립트 언어에 대한 얘기들을 나눴는데, 느낌이 와 닿아서,
충동적으로 글을 쓰게 되었습니다. 스크립트 언어라는 것에 대해서
소개합니다. 그리고 제 자신의 스크립트 언어에 대한 비하인드 스토리를
공개합니다.
&lt;/p&gt;

&lt;p&gt;
예전에는 언어는 두 가지로 나누어져 있었습니다. 컴파일 언어와 인터프리터
언어로 말이죠. 컴파일 언어는 대부분 시스템을 건드릴 수 있는 저수준까지
내려갈 수 있고, 인터프리터 언어는 그렇지 않고 속도도 훨씬 느리죠.
&lt;/p&gt;
&lt;p&gt;
그러나 이런 구분이 이제는 조금 모호해졌습니다. 스크립트 언어로도
얼마든지 운영체제에서 제공하는 수준에 접근할 수가 있게 되었죠. bash와
펄이 대표적으로 그런 언어였습니다. 점점 다른 언어들과의 교환 메커니즘이
발달하게 되고 이제는 스크립트 언어들이 풀언어(서로 다른 언어로 개발된
프로그램들을 이어 붙여주는 프로그램)로써 자주 활용되기도 합니다.
&lt;/p&gt;
&lt;p&gt;
제가 본격적으로 스크립트 언어를 다루게 된 발단은 학부 2학년 때로 거슬러
올라갑니다. 그 당시 저는 수동으로 html을 대충 쳐서 만든 홈페이지를
만들었고, 여기에 제가 해야 될 일들의 목록을 적어 놓았습니다. 물론
홈페이지 내에서 쉽게 이것을 추가하거나 삭제할 수 있는 것이 아닌
바보같은 홈페이지였죠. 제가 그 당시 한 일은 이 html에서 grep 명령을
이용하여 할일 목록의 내용만을 추출한 것이었습니다. 그래서 학교 리눅스
시스템을 터미널로 접속하면 시작하자마자 날짜별로 해야 될 일의 목록이
터미널에 출력되고 저에게 압박을 가하는 일이었습니다.
&lt;/p&gt;
&lt;p&gt;
그 이후에 나라의 부름을 받고 업무를 보게 되었는데, 저는 마음대로
컴파일러를 설치할 수 없었습니다. 물론 업무 내용상 관리자 권한이
주어지는 행운아였지만, 감시가 심한 상사는 컴퓨터들을
모니터링합니다. cmd.exe만 실행하여 검은 화면만 떠도 해킹으로 의심을
하는 상황이니까요.(결국 커맨드 창 배경화면을 흰색으로 바꾸니까
메모장처럼 보여서 의심을 안 받더군요.) 결국 일과 시간이 끝나고 나면,
메모장에 적힌 소스를 보면서 두뇌로 컴파일 하는 수 밖에 없었는데 할 수
있는 좋은 일을 찾은 것입니다.
&lt;/p&gt;
&lt;p&gt;
그 당시 하는 업무는 매우 비효율적이었습니다. 손님이 오시면 MS 워드
문서에 있는 계약서 양식에 손님의 수많은 개인정보를 적습니다. 개인 정보
종류가 꽤나 많습니다. 그리고 나서, 다른 소프트웨어를 이용하여 서비스
요청 문서를 만듭니다. 똑같은 정보를 한번 더 입력합니다. 그리고 나서
인쇄해서 문서를 파일에 넣고, 이것을 전산환경으로 찾아볼 수 있게 하기
위하여 MS Access 데이터베이스에 똑같은 내용의 정보를 다시 다 입력해
넣습니다. 그 뒤에, 종이로 만들어진 일지 표에 똑같은 내용의 정보를
손으로 다 써 넣습니다. 개인정보 항목이 적으면 문제가 없겠지만 상당히
많습니다. 경우에 따라서는 한 두 곳에는 정보가 들어가지 않아서 데이터의
일관성을 해치기도 했습니다.
&lt;/p&gt;
&lt;p&gt;
네, 그렇습니다. MS 오피스 제품군은 VB 스크립트라는 언어로 제어할 수
있습니다. MS Access는 덤으로 SQL을 이용할 수 있습니다. 저는 작업에
들어갔습니다. MS 오피스가 떠 있을 뿐이었으므로, 이것은 하얀 배경
화면이기 때문에 아무 문제가 없었습니다. MS Access에 자료를 한번만
입력하고 Report 기능 등을 이용하면 필요한 다양한 양식의 문서를 동일한
정보로 인쇄할 수 있었습니다. 게다가 날짜 계산 같은 것도 자동으로 줍고,
일을 넘겨받는 부서에서 필요한 정보를 요약해서 볼 수 있는 문서도 인쇄가
됩니다. 덕분에 많은 시간과 인력을 절감할 수 있었습니다. 한 손님이
서비스를 받고 나가는데 걸리는 시간은 기존의 1/4 수준으로 떨어졌고,
만족도도 올라갔습니다. 저는 이것 이외에도 업무가 있었기 때문에 다른
업무에 좀 더 집중할 수 있는 시간도 생겼습니다. 직속 상관은 이것이
무엇인지 전혀 이해하지 못했고 슈퍼바이저도 마찬가지였지만, 어느 순간
슈퍼바이저 얘기가 고객에게서 서비스에 대한 피드백이 훨씬 좋아지고
왠지는 모르지만 만족도가 높아졌다는 이유로 여러번 칭찬을
받았습니다. 조금 이상한 이유로 포상도 받았습니다.
&lt;/p&gt;
&lt;p&gt;
아쉽게도 이제 제 머리속의 VBScript는 잊혀졌습니다. 이제 제가 주로
스크립트 언어를 제 시스템에서 사용하는 용도는 시스템 관리입니다. bash와
파이썬, 루비, 펄 등으로 하나하나 만들어두면 나중에는 꽤
쓸만해집니다. 작은 코드조각이지만 유용하게 됩니다. 이럴 때에는 C나 C++
등으로 작성된 프로그램들을 바깥에서 감싸는 랩언어(이런 용어가 있는지는
모르겠습니다)가 되겠군요.
&lt;/p&gt;
&lt;p&gt;
음악 듣는 프로그램인 아마록에서도 파이썬 스크립트를 많이
사용합니다. 이것으로 듣고 있는 음악의 가사를 긁어오거나, 앨범 커버
그림을 다운받아 올 수 있습니다. 가수에 대한 정보를 보여주기도
합니다. 예를 들어서 아마록에서 앨범 커버를 가져오는 곳은
아마존입니다. 그런데 국내 음악이라던지 이런 것들은 앨범 커버가 나오지
않죠. 웹에서 다운 받은 것들이라서 그런게 아니라, CD에서 추출한 경우에도
가사가 들어있지도 않습니다. 제가 국내 가요들을 재생할 때 옆에 가사가
표시되게 하려면 어떻게 해야 할까요? 아마록 소스 코드를 수정해서 긴긴
시간 다시 컴파일을 해야 할까요?
&lt;/p&gt;
&lt;p&gt;
절대 그럴 필요가 없답니다. 파이썬 등으로 스크립트만 하나 작성해서
아마록에 끼워 주면 됩니다. 노래 제목이나 가수 이름으로 검색해서 얻은
텍스트 데이터에서 정규식 등을 이용해서 필요한 그림의 URL이나 가사의
위치를 알 수 있게 됩니다.
&lt;/p&gt;
&lt;p&gt;
예전에 이맥스 시스템에서 elisp의 역할에 놀랐었는데, 이제 굳이 elisp이
아니더라도 이런 일을 충분히 할 수 있게 되었습니다. emacs와 같이
커스터마이징 가능한 소프트웨어를 만들기가 무척 쉬워졌다는
것이지요. 그것도 lisp보다 좀 더 쉽게 와 닿을 수 있는 형태의 언어로
말입니다.
&lt;/p&gt;
&lt;p&gt;
물론 스크립트 언어로 모든 것을 할 수는 없습니다. 그러나 스크립트 언어로
할 수 있는 일이 점점 더 많아지고 있습니다. 예전에는 스크립트 언어로
한다고 하면 절대 안 될 것이라고 말했던 것들이 이제는 되고 있거든요.
&lt;/p&gt;
&lt;p&gt;
삶의 묘미를 찾고 계신 분들은 스크립트 언어 하나쯤 배워 놓는 것은
어떠신가요? 배워서 지금 당장 웹 영어 사전에서 내용을 긁어오는
스크립트를 작성하셔서 편리하게 사용하셔도 좋습니다. 정말 컴퓨터에 내가
귀찮은 일들을 명령을 내리면 충실히 수행해주는 느낌. 어릴 때 누구나
꿈꾸어 왔던 로봇과 같은 모습이 아닐까요.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116961068909316149?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116961068909316149/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116961068909316149&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116961068909316149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116961068909316149'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/01/blog-post_116961068909316149.html' title='나의 스크립트 언어 이야기'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116901772819491862</id><published>2007-01-17T16:00:00.000+09:00</published><updated>2007-07-07T22:30:54.810+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='생활'/><title type='text'>스케일링</title><content type='html'>&lt;p&gt;치과에서 스케일링이라는 것을 받았습니다. 10살때쯤에 이 뽑으러 치과에 간 이후로 치료 받으러 간 것은 처음입니다. 원래 병원 가는 것을 무척이나 귀찮아합니다. 그래서 오랫동안 치료를 하지 않았는데, 좀 일찍 왔으면 좋았을 걸 그랬습니다. 검사할 때마다 항상 아무 이상 없다고 했으니 치료 받지 않았던 것이지요.&lt;/p&gt;

&lt;p&gt;스케일링 하는 기분은 꽤 좋았습니다. 스케일링 하시는 분이 잘 하셔서 그런 것인지 몰라도 아프지도 않고 받고 나니 상쾌한 느낌입니다. 자꾸 받으면 중독될지도 모르겠습니다. 스케일링한 결과 아랫쪽 이 사이가 좀 벌어지게 되었습니다. 벌어졌다기 보다는 원래 치석이 있던 자리가 비어서 그렇게 되었지요.&lt;/p&gt;

&lt;p&gt;치위생사 선생님께 치솔 사용법과 치실 사용법을 배웠습니다. 정말 상세하게 잘 가르쳐 주시더라구요. 한번 해 보려고 치실을 구입해서 해 보는데, 이게 너무너무 어렵습니다. 그러지 않아도 삼차원 공간 감각이 떨어지는 것 같은데 전혀 감이 안 잡히더라구요. 어디가 안쪽이고 어디가 바깥쪽인지 손가락 둘의 삼차원 좌표를 움직이는 것조차 너무나 어려운 작업이었습니다. 1주일 정도 하면 능숙해진다고 하셨으니 열심히 해 봐야겠습니다. 치실 쓰는 것이 이맥스 에디터 처음 쓸 때보다는 훨씬 어려운 느낌입니다.&lt;/p&gt;

&lt;p&gt;스케일링 후에 얼음물을 마셔도 이가 시리다거나 하지는 않는군요. 사람마다 다른가 봅니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116901772819491862?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116901772819491862/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116901772819491862&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116901772819491862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116901772819491862'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/01/blog-post_17.html' title='스케일링'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116814989153923344</id><published>2007-01-07T14:55:00.000+09:00</published><updated>2007-07-07T23:51:03.519+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='플래시'/><category scheme='http://www.blogger.com/atom/ns#' term='리눅스'/><title type='text'>Gnash 플래시 플레이어</title><content type='html'>&lt;p&gt;
&lt;a href="http://www.gnu.org/software/gnash/"&gt;Gnash&lt;/a&gt;는 GNU 플래시 무비 플레이어입니다.
&lt;/p&gt;

&lt;p&gt;
웹서핑을 하다가 우연히 Gnash를 발견하고 호기심에 설치해 보았습니다. 큰
문제없이 잘 동작하네요. 저는 젠투 리눅스를 64비트 아키텍쳐로 쓰고
있습니다. 주로 쓰는 브라우저는 오페라이고 오페라는 2007년 1월 현재
32비트만 지원하는 브라우저이기 때문에 플래시를 쓰는데에는 아무 문제가
없었습니다. 그러나 가끔씩 64비트를 목표로 컴파일 된 파이어폭스를 쓸
경우에는 플래시를 설치하지 않았기 때문에 플래시를 볼 수 없었습니다. 그
이유는 64비트 어도비 플래시 플레이어가 출시되는 것이 자꾸 지연되고 있기
때문인데 Gnash를 설치하니 잘 동작했습니다.
&lt;/p&gt;
&lt;p&gt;
젠투 리눅스 기준으로
&lt;pre&gt;
emerge gnash
&lt;/pre&gt;
를 해 주면 gnash가 설치됩니다. 이후에는 firefox, seamonkey, epiphany
등의 브라우저에서 큰 문제없이 플래시를 쓸 수 있네요.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116814989153923344?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116814989153923344/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116814989153923344&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116814989153923344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116814989153923344'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/01/gnash.html' title='Gnash 플래시 플레이어'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116773474454726351</id><published>2007-01-02T19:37:00.001+09:00</published><updated>2011-08-31T13:33:56.048+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='스킴'/><category scheme='http://www.blogger.com/atom/ns#' term='스크립트'/><title type='text'>팩토리얼을 구하는 스킴 스크립트</title><content type='html'>&lt;p&gt;
&lt;a href="http://ko.wikipedia.org/wiki/스킴_프로그래밍_언어"&gt;스킴&lt;/a&gt;(Scheme)이라는 프로그래밍 언어를 심심풀이로 배우고 있습니다. 상당히
깔끔한 언어라는 생각이 듭니다. 특히 &lt;a href="http://ko.wikipedia.org/wiki/ALGOL"&gt;알골&lt;/a&gt; 계열의 언어에만 길들었다면
처음 코딩할 때의 기분이 상당히 새롭습니다.
&lt;/p&gt;
&lt;p&gt;
새로운 언어를 배우면 무언가 만들어 봐야 하기 때문에 &lt;a href="http://ko.wikipedia.org/wiki/차례곱"&gt;차례곱&lt;/a&gt;을 구하는
프로그램을 작성하여 보았습니다. 실제로 차례곱을 구하는 부분은 5줄이지만
다른 부분이 대부분을 차지하고 있네요. &lt;a href="http://www.plt-scheme.org/software/mzscheme/"&gt;MzScheme&lt;/a&gt;의 구현을 사용하여
스크립트 파일을 만들어 보았습니다. 맨처음으로 작성한 프로그램이라서
깔끔하지 못합니다. 여러 개의 숫자를 인자로 받거나 표준 입력으로부터
받아서 그 차례곱을 표준 출력으로 출력합니다. 이 프로그램을
/usr/local/bin에 넣어 두었습니다. 이제 차례곱을 쉽고 편리하게 구할 수
있겠습니다.
&lt;/p&gt;
&lt;p&gt;
연습삼아 작성한 것이어서 재귀, letrec, do를 모두 한 번씩 사용해
보았습니다. 이번에는 가장 핵심적인 차례곱을 구하는 부분은 다음과 같이
재귀적으로 되어 있습니다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
(define fact
  (lambda (x)
    (if (= x 0)
        1
        (* x (fact (- x 1))))))
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
스킴을 처음 보시는 분도 위의 코드는 이해하실 수 있으리라고 생각합니다. 다음은 전체 프로그램의 소스 코드입니다.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;
#!/usr/bin/mzscheme -r
;;; Prints out factorial of given numbers.
;;; Date: 2nd of January, 2007

;; Returns factorial of given parameter.
(define fact
  (lambda (x)
    (if (= x 0)
        1
        (* x (fact (- x 1))))))

;; Prints out help message
(define help
  (lambda ()
    (display "Usage: fact [--help | [NUMBER]...]")
    (newline)
    (display "Calculate factorial of given numbers.")
    (newline)
    (display "If no numbers are given, it reads numbers from standard ")
    (display "input until EOF and prints each factorials of them.")
    (newline)
    (newline)
    (display "--help   display this message")
    (newline)
    (exit)))

;; Main procedure.
(define main
  (lambda ()
    (let ((number-of-args 
          (vector-length (current-command-line-arguments))))
      (if (and (= number-of-args 1)
               (equal? "--help" 
                 (vector-ref (current-command-line-arguments) 0)))
        (help))
      (if (= number-of-args 0)
        (begin
          (do ((number (read) (read)))
            ((eof-object? number))
            (display (fact number))
            (newline)))
        (letrec ((iter
                  (lambda (counter)
                    (if (&amp;lt; counter number-of-args)

            (begin
              (display (fact
                        (string-&amp;gt;number
                          (vector-ref
                            (current-command-line-arguments)
                            counter))))
              (display #\space)
              (iter (+ counter 1)))))))
      (iter 0))))
    (newline)))

(main)
&lt;/pre&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116773474454726351?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116773474454726351/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116773474454726351&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116773474454726351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116773474454726351'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2007/01/blog-post.html' title='팩토리얼을 구하는 스킴 스크립트'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116669050563421455</id><published>2006-12-21T17:18:00.001+09:00</published><updated>2011-08-31T13:34:29.045+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C언어'/><category scheme='http://www.blogger.com/atom/ns#' term='정렬'/><category scheme='http://www.blogger.com/atom/ns#' term='분산컴퓨팅'/><category scheme='http://www.blogger.com/atom/ns#' term='알고리즘'/><title type='text'>고른 표본 추출을 통한 빠른 정렬</title><content type='html'>&lt;p&gt;
&lt;a href="http://ko.wikipedia.org/wiki/고른_표본_추출을_통한_병렬_정렬"&gt;고른 표본 추출을 통한 병렬 정렬&lt;/a&gt;(Parallel Sorting by Regular Sampling: PSRS)은 n개의 프로세스에서 골고루 표본을 추출하여 이것을 주축으로 하여 값들을 정렬하는 병렬 정렬 알고리즘의 일종입니다. 균형이 잘 잡히고, 프로세스의 수가 2의 n제곱 꼴이 되지 않아도 된다는 등의 장점이 있습니다.
&lt;/p&gt;

&lt;p&gt;
MPI를 배우면서 이것을 한번 C+MPI로 구현해 보았습니다. p개의 노드에서 n/p개만큼의 [0..1) 범위의 float형 난수를 발생한 다음에 정렬을 하는 과정입니다. 잘 작성된 코드는 아니지만, 참고할 수 있는 코드일 수도 있어서 실어 봅니다.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
&lt;font color="#a52a2a"&gt;  1 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  2 &lt;/font&gt;&lt;font color="#0000ff"&gt; * PSRS implementation using MPI.&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  3 &lt;/font&gt;&lt;font color="#0000ff"&gt; *&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  4 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Date: 5th of December, 2006&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  5 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Author: Jay&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  6 &lt;/font&gt;&lt;font color="#0000ff"&gt; *&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  7 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Compile options:&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  8 &lt;/font&gt;&lt;font color="#0000ff"&gt; *     PRINT_MSG: print some messages to stdout.&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  9 &lt;/font&gt;&lt;font color="#0000ff"&gt; *     OUTPUT_FILE: write 'glist_nn.txt', and 'slist_nn.txt'.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 10 &lt;/font&gt;&lt;font color="#0000ff"&gt; *                  'glist_nn' contains sorted generated numbers&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 11 &lt;/font&gt;&lt;font color="#0000ff"&gt; *                  of each node. 'slist_nn' is final result&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 12 &lt;/font&gt;&lt;font color="#0000ff"&gt; *                  of each node.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 13 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 14 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 15 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 16 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;mpi.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 17 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;limits.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 18 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;time.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 19 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stddef.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 20 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 21 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 22 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Upper bound of generated floating point &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 23 &lt;/font&gt;&lt;font color="#a020f0"&gt;#define UPPER_BOUND &lt;/font&gt;&lt;font color="#ff00ff"&gt;1.0&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 24 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 25 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; float comparision function &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 26 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; float_comp(&lt;font color="#2e8b57"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;* aa, &lt;font color="#2e8b57"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;* bb)
&lt;font color="#a52a2a"&gt; 27 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 28 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* a = aa;
&lt;font color="#a52a2a"&gt; 29 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* b = bb;
&lt;font color="#a52a2a"&gt; 30 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (*a == *b) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 31 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (*a &amp;lt; *b) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; -&lt;font color="#ff00ff"&gt;1&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 32 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;1&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 33 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 34 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 35 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Generates random sequence into array A with size &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 36 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; generate_random_sequence(&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* A, &lt;font color="#2e8b57"&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; size)
&lt;font color="#a52a2a"&gt; 37 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 38 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; i;
&lt;font color="#a52a2a"&gt; 39 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;size; i++)
&lt;font color="#a52a2a"&gt; 40 &lt;/font&gt;        A[i] = (&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;)rand()/&lt;font color="#ff00ff"&gt;RAND_MAX&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 41 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 42 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 43 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Returns pointer to the lower_bound,&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 44 &lt;/font&gt;&lt;font color="#0000ff"&gt; * which means the lowest position&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 45 &lt;/font&gt;&lt;font color="#0000ff"&gt; * that the element can be inserted&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 46 &lt;/font&gt;&lt;font color="#0000ff"&gt; * with sorted order. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 47 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* lower_bound(&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* first, &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* last, &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; val)
&lt;font color="#a52a2a"&gt; 48 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 49 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;ptrdiff_t&lt;/b&gt;&lt;/font&gt; len = last - first;
&lt;font color="#a52a2a"&gt; 50 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt; (len &amp;gt; &lt;font color="#ff00ff"&gt;0&lt;/font&gt;)
&lt;font color="#a52a2a"&gt; 51 &lt;/font&gt;    {
&lt;font color="#a52a2a"&gt; 52 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;ptrdiff_t&lt;/b&gt;&lt;/font&gt; half = len / &lt;font color="#ff00ff"&gt;2&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 53 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* middle = first + half;
&lt;font color="#a52a2a"&gt; 54 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (*middle &amp;lt; val)
&lt;font color="#a52a2a"&gt; 55 &lt;/font&gt;        {
&lt;font color="#a52a2a"&gt; 56 &lt;/font&gt;            first = middle + &lt;font color="#ff00ff"&gt;1&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 57 &lt;/font&gt;            len = len - half - &lt;font color="#ff00ff"&gt;1&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 58 &lt;/font&gt;        }
&lt;font color="#a52a2a"&gt; 59 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 60 &lt;/font&gt;            len = half;
&lt;font color="#a52a2a"&gt; 61 &lt;/font&gt;    }
&lt;font color="#a52a2a"&gt; 62 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; first;
&lt;font color="#a52a2a"&gt; 63 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 64 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 65 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Writes each elements in float array to the file &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 66 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; output(&lt;font color="#2e8b57"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;* filename, &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* A, &lt;font color="#2e8b57"&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; size)
&lt;font color="#a52a2a"&gt; 67 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 68 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;FILE&lt;/b&gt;&lt;/font&gt;* f = fopen(filename, &lt;font color="#ff00ff"&gt;&amp;quot;w&amp;quot;&lt;/font&gt;);
&lt;font color="#a52a2a"&gt; 69 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i;
&lt;font color="#a52a2a"&gt; 70 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;size; i++)
&lt;font color="#a52a2a"&gt; 71 &lt;/font&gt;    {
&lt;font color="#a52a2a"&gt; 72 &lt;/font&gt;        fprintf(f, &lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;%1.5f&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;, A[i]);
&lt;font color="#a52a2a"&gt; 73 &lt;/font&gt;    }
&lt;font color="#a52a2a"&gt; 74 &lt;/font&gt;    fclose(f);
&lt;font color="#a52a2a"&gt; 75 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 76 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 77 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 78 &lt;/font&gt;&lt;font color="#0000ff"&gt; * First command-line argument: n&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 79 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 80 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; main(&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; argc, &lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;* argv[])
&lt;font color="#a52a2a"&gt; 81 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 82 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; n_number = &lt;font color="#ff00ff"&gt;1000000&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 83 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (argc &amp;gt; &lt;font color="#ff00ff"&gt;1&lt;/font&gt;) n_number = atoi(argv[&lt;font color="#ff00ff"&gt;1&lt;/font&gt;]);
&lt;font color="#a52a2a"&gt; 84 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; id, p;
&lt;font color="#a52a2a"&gt; 85 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 86 &lt;/font&gt;    MPI_Init(&amp;amp;argc, &amp;amp;argv);
&lt;font color="#a52a2a"&gt; 87 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 88 &lt;/font&gt;    MPI_Barrier(MPI_COMM_WORLD);
&lt;font color="#a52a2a"&gt; 89 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;double&lt;/b&gt;&lt;/font&gt; elapsed_time = -MPI_Wtime();
&lt;font color="#a52a2a"&gt; 90 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 91 &lt;/font&gt;    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;id);
&lt;font color="#a52a2a"&gt; 92 &lt;/font&gt;    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;p);
&lt;font color="#a52a2a"&gt; 93 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 94 &lt;/font&gt;    &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Some nodes should control 1 more&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 95 &lt;/font&gt;&lt;font color="#0000ff"&gt;     * element if n % p != 0. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 96 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; A[(n_number+(p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;))/p];
&lt;font color="#a52a2a"&gt; 97 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;* single_list = A;
&lt;font color="#a52a2a"&gt; 98 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; n_control = n_number/p;
&lt;font color="#a52a2a"&gt; 99 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; n_sorted = n_control;
&lt;font color="#a52a2a"&gt;100 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (n_number%p &amp;gt; id) n_control++;
&lt;font color="#a52a2a"&gt;101 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i;
&lt;font color="#a52a2a"&gt;102 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;103 &lt;/font&gt;&lt;font color="#a020f0"&gt;#ifdef PRINT_MSG    &lt;/font&gt;
&lt;font color="#a52a2a"&gt;104 &lt;/font&gt;    fprintf(&lt;font color="#ff00ff"&gt;stdout&lt;/font&gt;, &lt;font color="#ff00ff"&gt;&amp;quot;Process &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; generates &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; of &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; elements.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;,
&lt;font color="#a52a2a"&gt;105 &lt;/font&gt;            id, n_control, n_number);
&lt;font color="#a52a2a"&gt;106 &lt;/font&gt;    fflush(&lt;font color="#ff00ff"&gt;stdout&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;107 &lt;/font&gt;&lt;font color="#a020f0"&gt;#endif&lt;/font&gt;
&lt;font color="#a52a2a"&gt;108 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;109 &lt;/font&gt;    &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; For unique random number, add (id*1000) &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;110 &lt;/font&gt;    srand( time(&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;) + id * &lt;font color="#ff00ff"&gt;1000&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;111 &lt;/font&gt;    generate_random_sequence(A, n_control);
&lt;font color="#a52a2a"&gt;112 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;113 &lt;/font&gt;    &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Phase 1 &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;114 &lt;/font&gt;    &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Each process quicksort their own list and each one picks samples &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;115 &lt;/font&gt;    qsort(A, n_control, &lt;font color="#a52a2a"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;), float_comp);
&lt;font color="#a52a2a"&gt;116 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;117 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p &amp;gt; &lt;font color="#ff00ff"&gt;1&lt;/font&gt;)
&lt;font color="#a52a2a"&gt;118 &lt;/font&gt;    {
&lt;font color="#a52a2a"&gt;119 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;120 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; samples[p];
&lt;font color="#a52a2a"&gt;121 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;p; i++)
&lt;font color="#a52a2a"&gt;122 &lt;/font&gt;            samples[i] = A[i*n_control/p];
&lt;font color="#a52a2a"&gt;123 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;124 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Phase 2 &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;125 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Node 0 gathers samples, sorts them, and picks pivots. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;126 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; all_samples[p*p];
&lt;font color="#a52a2a"&gt;127 &lt;/font&gt;        MPI_Gather(samples, p, MPI_FLOAT, all_samples, p,
&lt;font color="#a52a2a"&gt;128 &lt;/font&gt;                MPI_FLOAT, &lt;font color="#ff00ff"&gt;0&lt;/font&gt;, MPI_COMM_WORLD);
&lt;font color="#a52a2a"&gt;129 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; pivots[p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;130 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!id)
&lt;font color="#a52a2a"&gt;131 &lt;/font&gt;        {
&lt;font color="#a52a2a"&gt;132 &lt;/font&gt;            qsort(all_samples, p*p, &lt;font color="#a52a2a"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;), float_comp);
&lt;font color="#a52a2a"&gt;133 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;134 &lt;/font&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;; i++)
&lt;font color="#a52a2a"&gt;135 &lt;/font&gt;                pivots[i] = all_samples[(i+&lt;font color="#ff00ff"&gt;1&lt;/font&gt;)*p+p/&lt;font color="#ff00ff"&gt;2&lt;/font&gt;-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;136 &lt;/font&gt;        }
&lt;font color="#a52a2a"&gt;137 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Node 0 broadcasts pivots and each process &lt;/font&gt;
&lt;font color="#a52a2a"&gt;138 &lt;/font&gt;&lt;font color="#0000ff"&gt;         * partitions its own list. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;139 &lt;/font&gt;        MPI_Bcast(pivots, p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;, MPI_FLOAT, &lt;font color="#ff00ff"&gt;0&lt;/font&gt;, MPI_COMM_WORLD);
&lt;font color="#a52a2a"&gt;140 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; send_cnts[p], send_disp[p];
&lt;font color="#a52a2a"&gt;141 &lt;/font&gt;        send_disp[&lt;font color="#ff00ff"&gt;0&lt;/font&gt;] = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;142 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;1&lt;/font&gt;; i&amp;lt;p; i++)
&lt;font color="#a52a2a"&gt;143 &lt;/font&gt;        {
&lt;font color="#a52a2a"&gt;144 &lt;/font&gt;            send_disp[i] =
&lt;font color="#a52a2a"&gt;145 &lt;/font&gt;                (&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;*)(lower_bound(A, A+n_control, pivots[i-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;]))-A;
&lt;font color="#a52a2a"&gt;146 &lt;/font&gt;            send_cnts[i-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;] = send_disp[i] - send_disp[i-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;147 &lt;/font&gt;        }
&lt;font color="#a52a2a"&gt;148 &lt;/font&gt;        send_cnts[p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;] = n_control - send_disp[p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;149 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;150 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Phase 3 &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;151 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; First, exchanges the number of elements that &lt;/font&gt;
&lt;font color="#a52a2a"&gt;152 &lt;/font&gt;&lt;font color="#0000ff"&gt;         * each one is going to exchange. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;153 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; recv_cnts[p], recv_disp[p+&lt;font color="#ff00ff"&gt;1&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;154 &lt;/font&gt;        MPI_Alltoall(send_cnts, &lt;font color="#ff00ff"&gt;1&lt;/font&gt;, MPI_FLOAT, recv_cnts, &lt;font color="#ff00ff"&gt;1&lt;/font&gt;,
&lt;font color="#a52a2a"&gt;155 &lt;/font&gt;                MPI_FLOAT, MPI_COMM_WORLD);
&lt;font color="#a52a2a"&gt;156 &lt;/font&gt;        recv_disp[&lt;font color="#ff00ff"&gt;0&lt;/font&gt;] = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;157 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;1&lt;/font&gt;; i&amp;lt;p; i++)
&lt;font color="#a52a2a"&gt;158 &lt;/font&gt;            recv_disp[i] = recv_disp[i-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;] + recv_cnts[i-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;159 &lt;/font&gt;        recv_disp[p] = recv_disp[p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;]+recv_cnts[p-&lt;font color="#ff00ff"&gt;1&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;160 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; partitions[recv_disp[p]];
&lt;font color="#a52a2a"&gt;161 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Exchanges elements to appropriate nodes. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;162 &lt;/font&gt;        MPI_Alltoallv(A, send_cnts, send_disp, MPI_FLOAT, partitions,
&lt;font color="#a52a2a"&gt;163 &lt;/font&gt;                recv_cnts, recv_disp, MPI_FLOAT, MPI_COMM_WORLD);
&lt;font color="#a52a2a"&gt;164 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;165 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Phase 4 &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;166 &lt;/font&gt;        &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Each node merges its own partitions into a single list. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;167 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; j;
&lt;font color="#a52a2a"&gt;168 &lt;/font&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; merge_disp[p];
&lt;font color="#a52a2a"&gt;169 &lt;/font&gt;        n_sorted = recv_disp[p];
&lt;font color="#a52a2a"&gt;170 &lt;/font&gt;        single_list = malloc(n_sorted*&lt;font color="#a52a2a"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(&lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;));
&lt;font color="#a52a2a"&gt;171 &lt;/font&gt;        memcpy(merge_disp, recv_disp, p*&lt;font color="#a52a2a"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;));
&lt;font color="#a52a2a"&gt;172 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;n_sorted; i++)
&lt;font color="#a52a2a"&gt;173 &lt;/font&gt;        {
&lt;font color="#a52a2a"&gt;174 &lt;/font&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; min = UPPER_BOUND;
&lt;font color="#a52a2a"&gt;175 &lt;/font&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; min_pos = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;176 &lt;/font&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (j=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; j&amp;lt;p; j++)
&lt;font color="#a52a2a"&gt;177 &lt;/font&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (merge_disp[j] &amp;lt; recv_disp[j+&lt;font color="#ff00ff"&gt;1&lt;/font&gt;]
&lt;font color="#a52a2a"&gt;178 &lt;/font&gt;                        &amp;amp;&amp;amp; min &amp;gt; partitions[merge_disp[j]])
&lt;font color="#a52a2a"&gt;179 &lt;/font&gt;                {
&lt;font color="#a52a2a"&gt;180 &lt;/font&gt;                    min = partitions[merge_disp[j]];
&lt;font color="#a52a2a"&gt;181 &lt;/font&gt;                    min_pos = j;
&lt;font color="#a52a2a"&gt;182 &lt;/font&gt;                }
&lt;font color="#a52a2a"&gt;183 &lt;/font&gt;            single_list[i] = min;
&lt;font color="#a52a2a"&gt;184 &lt;/font&gt;            merge_disp[min_pos]++;
&lt;font color="#a52a2a"&gt;185 &lt;/font&gt;        }
&lt;font color="#a52a2a"&gt;186 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;187 &lt;/font&gt;    }
&lt;font color="#a52a2a"&gt;188 &lt;/font&gt;    &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Synchronizes for checking maximum elapsed time among nodes. &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;189 &lt;/font&gt;    MPI_Barrier(MPI_COMM_WORLD);
&lt;font color="#a52a2a"&gt;190 &lt;/font&gt;    elapsed_time += MPI_Wtime();
&lt;font color="#a52a2a"&gt;191 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;192 &lt;/font&gt;&lt;font color="#a020f0"&gt;#ifdef PRINT_MSG    &lt;/font&gt;
&lt;font color="#a52a2a"&gt;193 &lt;/font&gt;    fprintf(&lt;font color="#ff00ff"&gt;stdout&lt;/font&gt;, &lt;font color="#ff00ff"&gt;&amp;quot;Process &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; now has sorted the list that contains &lt;/font&gt;&lt;font color="#6a5acd"&gt;\&lt;/font&gt;
&lt;font color="#a52a2a"&gt;194 &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; of &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; elements.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;, id, n_sorted, n_number);
&lt;font color="#a52a2a"&gt;195 &lt;/font&gt;    fflush(&lt;font color="#ff00ff"&gt;stdout&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;196 &lt;/font&gt;&lt;font color="#a020f0"&gt;#endif&lt;/font&gt;
&lt;font color="#a52a2a"&gt;197 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;198 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!id)
&lt;font color="#a52a2a"&gt;199 &lt;/font&gt;        printf(&lt;font color="#ff00ff"&gt;&amp;quot;Elapsed Time with &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; processes: &lt;/font&gt;&lt;font color="#6a5acd"&gt;%10.6f&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;,
&lt;font color="#a52a2a"&gt;200 &lt;/font&gt;                p, elapsed_time);
&lt;font color="#a52a2a"&gt;201 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;202 &lt;/font&gt;    &lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; Output (elapsed_time doesn't count for file output!) &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;203 &lt;/font&gt;&lt;font color="#a020f0"&gt;#ifdef OUTPUT_FILE      &lt;/font&gt;
&lt;font color="#a52a2a"&gt;204 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; filename[&lt;font color="#ff00ff"&gt;100&lt;/font&gt;];
&lt;font color="#a52a2a"&gt;205 &lt;/font&gt;    strcpy(filename, &lt;font color="#ff00ff"&gt;&amp;quot;glistxx.txt&amp;quot;&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;206 &lt;/font&gt;    filename[&lt;font color="#ff00ff"&gt;5&lt;/font&gt;] = &lt;font color="#ff00ff"&gt;'0'&lt;/font&gt; + id / &lt;font color="#ff00ff"&gt;10&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;207 &lt;/font&gt;    filename[&lt;font color="#ff00ff"&gt;6&lt;/font&gt;] = &lt;font color="#ff00ff"&gt;'0'&lt;/font&gt; + id % &lt;font color="#ff00ff"&gt;10&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;208 &lt;/font&gt;    output(filename, A, n_control);
&lt;font color="#a52a2a"&gt;209 &lt;/font&gt;    filename[&lt;font color="#ff00ff"&gt;0&lt;/font&gt;] = &lt;font color="#ff00ff"&gt;'s'&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;210 &lt;/font&gt;    output(filename, single_list, n_sorted);
&lt;font color="#a52a2a"&gt;211 &lt;/font&gt;&lt;font color="#a020f0"&gt;#endif&lt;/font&gt;
&lt;font color="#a52a2a"&gt;212 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (single_list != A) free(single_list);
&lt;font color="#a52a2a"&gt;213 &lt;/font&gt;    MPI_Finalize();
&lt;font color="#a52a2a"&gt;214 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;215 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;216 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt;217 &lt;/font&gt;
&lt;/pre&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116669050563421455?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116669050563421455/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116669050563421455&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116669050563421455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116669050563421455'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2006/12/blog-post_116669050563421455.html' title='고른 표본 추출을 통한 빠른 정렬'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116668746513709482</id><published>2006-12-21T16:50:00.000+09:00</published><updated>2007-07-07T23:56:59.305+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='경영'/><title type='text'>홍정상인 호설암의 인간경영</title><content type='html'>&lt;p&gt;
홍정상인 호설암의 인간경영이라는 책을 읽어볼 기회가 생겼습니다. 그래서 이전부터 조금씩 관심을 가지고 있었던 호설암이라는 인물에 대해서 좀 더 알 수 있는 기회가 되었습니다. 이 책을 통하여 사업을 할 때 어떻게 협력자를 만들고 또 협력을 통하여 부를 창출하는지에 대해 알 수 있습니다.
&lt;/p&gt;

&lt;p&gt;
호설암은 청대의 뛰어난 상인으로써, 맨손으로 일어나 최고의 부자 자리까지 오른 사람입니다. 그는 상대방이 진정으로 어려울 때 돕고, 눈앞의 작은 이익에 연연하지 않고 더 큰 이익을 위하며, 상대방의 체면을 세워주고, 상대방의 입장을 생각하고 다가섭니다. 그가 어떻게 많은 협력자를 얻었는지 알 수 있습니다. 또한 그는 다른 사람을 돕는데 그의 재물을 쓰는데 인색하지 않았습니다. 그렇기 때문에 진정으로 다른 사람을 감동시켜서 기꺼이 그를 돕게 할 수 있었던 것입니다.
&lt;/p&gt;

&lt;p&gt;
만일 고고한 선비께서 이 책을 읽으신다면 1장~3장에서의 호설암의 행위에 대하여 마음이 편치 않으실 것입니다. 그가 단지 정경유착과 뇌물, 아첨 등으로 돈을 버는 소인배라고 생각할 것이기 때문입니다. 여기까지만 읽고 선입견을 가지면 곤란합니다. 계속 읽어나가다보면 이것이 그의 전부가 아니라는 것을 아실 수 있으실 것입니다.
&lt;/p&gt;

&lt;p&gt;
관리자로서 호설암의 인간 경영의 면모를 보자면, 그는 인재의 장점만을 보고 그를 기용하려 했습니다. 이는 삼국지의 제갈량이 너무 완벽한 사람만을 보고자 하여 인재를 가렸기 때문에 결국 촉한의 인재가 부족해 진 것과 대조적입니다. 물론 이런 그의 성격 때문에 소인배를 제대로 가리지 못하는 문제점이 있었지만, 요즘 들어서 저는 호설암의 인간 경영 방법이 상당 부분 옳다고 생각합니다. 세상에 단점 없는 사람은 없습니다. 도덕적으로 큰 문제가 있는 일부를 제외하고는 각자의 장점을 잘 활용하는 것은 정말 중요한 능력입니다. 완벽한 사람을 가려서 부리는 것과 평범한 사람을 최대한 활용하는 능력 두 가지 모두 필요한데 완벽한 사람만을 찾는 것은 쉽지 않을 것 같다는 생각을 해 봅니다.
&lt;/p&gt;

&lt;p&gt;
그가 살았던 시기는 청나라 때이므로 현대 사회에는 통하지 않는 점들이 있고 그에게도 단점이 있습니다. 소인배들에게 너무 관대했던 탓에 결국 사업은 망해버렸습니다. 그의 부인들도 그의 사업이 망하자 각자의 몫을 챙겨서 하나 둘 떠나고 맙니다. 이익으로 맺어진 많은 협력자 가운데 완전히 몰락한 후에도 끝까지 도와줄 수 있는 사람은 그다지 많지 않을 것입니다. 이것으로 보아 그의 인간 경영은 실패가 아닐까 생각할 수도 있겠습니다. 하지만, 보통 사람들보다 훨씬 많은 수의 평생 협력자들이 호설암에게는 있었다고 생각합니다. 과연 크게 파산한 사람을 끝까지 도와 줄 사람이 몇이나 있을지 생각해 봅니다. 다만 호설암은 그들에게 빚을 지고 싶지 않았기 때문에 도움을 받지 않았을 겁니다. 제가 생각하는 호설암의 단점은 소인배들에게 관대함과 배우자들을 선택하는데 너무 관대했던 것입니다.
&lt;/p&gt;

&lt;p&gt;
원수를 자신의 편으로 만드는 데는 호설암을 따를 자가 없겠습니다. 그는 원수지는 일이 없게 하려고 많은 노력을 했습니다. 하지만 원수는 종종 생깁니다. 이런 사람들까지 자신의 편으로 만드는 호설암의 탁월한 모습에서 많은 것을 배울 수 있습니다.
&lt;/p&gt;

&lt;p&gt;
읽어볼 만한 좋은 책이라고 생각합니다.
&lt;/p&gt;

&lt;p&gt;
참고 도서: &lt;br /&gt;
홍정상인 호설암의 인간경영/ 호설암 원전/ 구양일비 해석/ 이선영 옮김/ 태웅출판사
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116668746513709482?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116668746513709482/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116668746513709482&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116668746513709482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116668746513709482'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2006/12/blog-post_21.html' title='홍정상인 호설암의 인간경영'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116658408571548181</id><published>2006-12-20T11:24:00.001+09:00</published><updated>2011-08-31T13:35:01.225+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C언어'/><category scheme='http://www.blogger.com/atom/ns#' term='알고리즘'/><title type='text'>기사의 여행</title><content type='html'>&lt;p&gt;
&lt;a href="http://ko.wikipedia.org/wiki/기사의_여행"&gt;기사의 여행&lt;/a&gt;은 체스판 위의 임의의 위치에서 기사가 출발하여 각 위치를 오직 한 번만 방문하면서 모든 위치를 방문하는 순서를 구하는 문제입니다. 오일러 등의 많은 수학자들이 이 문제를 다루었으며, 다양한 해법과 변형된 문제들이 있습니다. 가장 일반적인 해법은 되추적을 이용한 방법입니다.
&lt;/p&gt;

&lt;p&gt;
19세기의 H. C. Warnsdorff는 기사의 여행 문제를 푸는 실용적인 방법을 제시하였습니다. 기사가 움직이면서 어느 곳으로도 움직일 수 없는 막다른 곳에 다다르지 않게 하는 것이 목적입니다. 막다른 곳에 다다르지 않게 하기 위하여 Warnsdorff가 제시한 규칙은 현재 기사가 한 번에 갈 수 있는 곳 중에서 다음 번 수에 갈 수 있는 곳이 가장 적은 곳으로 간다는 규칙입니다. 이 방법은 휴리스틱한 방법입니다만, 8 x 8의 체스판 공간에서 기사의 여행 문제를 잘 풀어 줍니다. 체스판의 공간이 넓어지면 제대로 풀리지 않는 경우가 생길 수 있습니다.
&lt;/p&gt;

&lt;p&gt;
Warnsdorff의 규칙을 이용하여 기사의 여행 문제를 푸는 간단한 프로그램을 작성해 보았습니다. C언어로 작성되어 있고 시작행과 시작열의 위치를 기본 입력에서 읽어서 기본 출력으로 해를 출력해 줍니다.
&lt;/p&gt;

&lt;p&gt;
&lt;pre class="code"&gt;
&lt;font color="#a52a2a"&gt;  1 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  2 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Knight's Tour.&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  3 &lt;/font&gt;&lt;font color="#0000ff"&gt; *&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  4 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Author: Jay&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  5 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Date: 20th of December, 2006&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  6 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  7 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;
&lt;font color="#a52a2a"&gt;  8 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;  9 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt; definitions &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 10 &lt;/font&gt;&lt;font color="#a020f0"&gt;#define ROW_SIZE &lt;/font&gt;&lt;font color="#ff00ff"&gt;8&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 11 &lt;/font&gt;&lt;font color="#a020f0"&gt;#define COL_SIZE &lt;/font&gt;&lt;font color="#ff00ff"&gt;8&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 12 &lt;/font&gt;&lt;font color="#a020f0"&gt;#define NUM_WAYS &lt;/font&gt;&lt;font color="#ff00ff"&gt;8&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 13 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;typedef&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; board_t[ROW_SIZE][COL_SIZE];
&lt;font color="#a52a2a"&gt; 14 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; dr[NUM_WAYS] = {-&lt;font color="#ff00ff"&gt;2&lt;/font&gt;, -&lt;font color="#ff00ff"&gt;1&lt;/font&gt;, &lt;font color="#ff00ff"&gt;1&lt;/font&gt;, &lt;font color="#ff00ff"&gt;2&lt;/font&gt;, &lt;font color="#ff00ff"&gt;2&lt;/font&gt;, &lt;font color="#ff00ff"&gt;1&lt;/font&gt;, -&lt;font color="#ff00ff"&gt;1&lt;/font&gt;, -&lt;font color="#ff00ff"&gt;2&lt;/font&gt;};
&lt;font color="#a52a2a"&gt; 15 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; dc[NUM_WAYS] = {&lt;font color="#ff00ff"&gt;1&lt;/font&gt;, &lt;font color="#ff00ff"&gt;2&lt;/font&gt;, &lt;font color="#ff00ff"&gt;2&lt;/font&gt;, &lt;font color="#ff00ff"&gt;1&lt;/font&gt;, -&lt;font color="#ff00ff"&gt;1&lt;/font&gt;, -&lt;font color="#ff00ff"&gt;2&lt;/font&gt;, -&lt;font color="#ff00ff"&gt;2&lt;/font&gt;, -&lt;font color="#ff00ff"&gt;1&lt;/font&gt;};
&lt;font color="#a52a2a"&gt; 16 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 17 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 18 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Set every element to -1&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 19 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 20 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; initialize_board(board_t board)
&lt;font color="#a52a2a"&gt; 21 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 22 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i, j;
&lt;font color="#a52a2a"&gt; 23 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;ROW_SIZE; i++)
&lt;font color="#a52a2a"&gt; 24 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (j=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; j&amp;lt;COL_SIZE; j++)
&lt;font color="#a52a2a"&gt; 25 &lt;/font&gt;            board[i][j] = -&lt;font color="#ff00ff"&gt;1&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 26 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 27 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 28 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 29 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Print the board out.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 30 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 31 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; print_board(board_t board)
&lt;font color="#a52a2a"&gt; 32 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 33 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i, j;
&lt;font color="#a52a2a"&gt; 34 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;ROW_SIZE; i++)
&lt;font color="#a52a2a"&gt; 35 &lt;/font&gt;    {
&lt;font color="#a52a2a"&gt; 36 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (j=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; j&amp;lt;COL_SIZE; j++)
&lt;font color="#a52a2a"&gt; 37 &lt;/font&gt;            printf(&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#6a5acd"&gt;\t&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;, board[i][j]);
&lt;font color="#a52a2a"&gt; 38 &lt;/font&gt;        printf(&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);
&lt;font color="#a52a2a"&gt; 39 &lt;/font&gt;    }
&lt;font color="#a52a2a"&gt; 40 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 41 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 42 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 43 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Check if (r,c) is inside board.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 44 &lt;/font&gt;&lt;font color="#0000ff"&gt; * @return true if (r,c) is inside board, false otherwise.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 45 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 46 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; is_inside_board(&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; r, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; c)
&lt;font color="#a52a2a"&gt; 47 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 48 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; r &amp;gt;= &lt;font color="#ff00ff"&gt;0&lt;/font&gt; &amp;amp;&amp;amp; r &amp;lt; ROW_SIZE &amp;amp;&amp;amp; c &amp;gt;= &lt;font color="#ff00ff"&gt;0&lt;/font&gt; &amp;amp;&amp;amp; c &amp;lt; COL_SIZE;
&lt;font color="#a52a2a"&gt; 49 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 50 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 51 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 52 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Check if (r,c) is available in board.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 53 &lt;/font&gt;&lt;font color="#0000ff"&gt; * @return true if (r,c) is available, that is has value -1,&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 54 &lt;/font&gt;&lt;font color="#0000ff"&gt; *         false otherwise.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 55 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 56 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; is_available(board_t board, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; r, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; c)
&lt;font color="#a52a2a"&gt; 57 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 58 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; is_inside_board(r, c) &amp;amp;&amp;amp; board[r][c] == -&lt;font color="#ff00ff"&gt;1&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 59 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 60 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 61 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 62 &lt;/font&gt;&lt;font color="#0000ff"&gt; * @return number of next moves of (r,c) in board.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 63 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 64 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; num_next_moves(board_t board, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; r, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; c)
&lt;font color="#a52a2a"&gt; 65 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 66 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i, result=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 67 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;NUM_WAYS; i++)
&lt;font color="#a52a2a"&gt; 68 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (is_available(board, r+dr[i], c+dc[i]))
&lt;font color="#a52a2a"&gt; 69 &lt;/font&gt;            result++;
&lt;font color="#a52a2a"&gt; 70 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; result;
&lt;font color="#a52a2a"&gt; 71 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 72 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 73 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 74 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Get next way id from (r,c) in board.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 75 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Next way is the way whose destination has minimal number of next moves.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 76 &lt;/font&gt;&lt;font color="#0000ff"&gt; * @return next way id, which is in [0, NUM_WAYS).&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 77 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 78 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; next_way_of(board_t board, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; r, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; c)
&lt;font color="#a52a2a"&gt; 79 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 80 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i, min = NUM_WAYS, result=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt; 81 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i&amp;lt;NUM_WAYS; i++)
&lt;font color="#a52a2a"&gt; 82 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (is_available(board, r+dr[i], c+dc[i])
&lt;font color="#a52a2a"&gt; 83 &lt;/font&gt;                &amp;amp;&amp;amp; num_next_moves(board, r+dr[i], c+dc[i]) &amp;lt; min)
&lt;font color="#a52a2a"&gt; 84 &lt;/font&gt;        {
&lt;font color="#a52a2a"&gt; 85 &lt;/font&gt;            min = num_next_moves(board, r+dr[i], c+dc[i]);
&lt;font color="#a52a2a"&gt; 86 &lt;/font&gt;            result = i;
&lt;font color="#a52a2a"&gt; 87 &lt;/font&gt;        }
&lt;font color="#a52a2a"&gt; 88 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; result;
&lt;font color="#a52a2a"&gt; 89 &lt;/font&gt;}
&lt;font color="#a52a2a"&gt; 90 &lt;/font&gt;
&lt;font color="#a52a2a"&gt; 91 &lt;/font&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;font color="#0000ff"&gt;*&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 92 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Get r, c from user and solve knight tour problem.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 93 &lt;/font&gt;&lt;font color="#0000ff"&gt; * Print result out.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 94 &lt;/font&gt;&lt;font color="#0000ff"&gt; * @return 0 for successful moves, 1 otherwise.&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 95 &lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;*/&lt;/font&gt;
&lt;font color="#a52a2a"&gt; 96 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; main()
&lt;font color="#a52a2a"&gt; 97 &lt;/font&gt;{
&lt;font color="#a52a2a"&gt; 98 &lt;/font&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; r, c, move, next_way;
&lt;font color="#a52a2a"&gt; 99 &lt;/font&gt;    board_t board;
&lt;font color="#a52a2a"&gt;100 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;101 &lt;/font&gt;    initialize_board(board);
&lt;font color="#a52a2a"&gt;102 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt; (&lt;font color="#ff00ff"&gt;1&lt;/font&gt;)
&lt;font color="#a52a2a"&gt;103 &lt;/font&gt;    {
&lt;font color="#a52a2a"&gt;104 &lt;/font&gt;        printf(&lt;font color="#ff00ff"&gt;&amp;quot;Input start position r c: &amp;quot;&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;105 &lt;/font&gt;        scanf(&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#6a5acd"&gt;%d&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;, &amp;amp;r, &amp;amp;c);
&lt;font color="#a52a2a"&gt;106 &lt;/font&gt;        fflush(&lt;font color="#ff00ff"&gt;stdin&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;107 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (is_inside_board(r, c)) &lt;font color="#a52a2a"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;108 &lt;/font&gt;        printf(&lt;font color="#ff00ff"&gt;&amp;quot;Please put them again.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;109 &lt;/font&gt;    }
&lt;font color="#a52a2a"&gt;110 &lt;/font&gt;    board[r][c] = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;111 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;112 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (move=&lt;font color="#ff00ff"&gt;1&lt;/font&gt;; move&amp;lt;ROW_SIZE*COL_SIZE; move++)
&lt;font color="#a52a2a"&gt;113 &lt;/font&gt;    {
&lt;font color="#a52a2a"&gt;114 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (num_next_moves(board, r, c) == &lt;font color="#ff00ff"&gt;0&lt;/font&gt;)
&lt;font color="#a52a2a"&gt;115 &lt;/font&gt;        {
&lt;font color="#a52a2a"&gt;116 &lt;/font&gt;            printf(&lt;font color="#ff00ff"&gt;&amp;quot;Failed.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);
&lt;font color="#a52a2a"&gt;117 &lt;/font&gt;            print_board(board);
&lt;font color="#a52a2a"&gt;118 &lt;/font&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;1&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;119 &lt;/font&gt;        }
&lt;font color="#a52a2a"&gt;120 &lt;/font&gt;        next_way = next_way_of(board, r, c);
&lt;font color="#a52a2a"&gt;121 &lt;/font&gt;        r = r + dr[next_way];
&lt;font color="#a52a2a"&gt;122 &lt;/font&gt;        c = c + dc[next_way];
&lt;font color="#a52a2a"&gt;123 &lt;/font&gt;        board[r][c] = move;
&lt;font color="#a52a2a"&gt;124 &lt;/font&gt;    }
&lt;font color="#a52a2a"&gt;125 &lt;/font&gt;    print_board(board);
&lt;font color="#a52a2a"&gt;126 &lt;/font&gt;
&lt;font color="#a52a2a"&gt;127 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;
&lt;font color="#a52a2a"&gt;128 &lt;/font&gt;}
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
참고할 수 있는 URL: &lt;br /&gt;
&lt;a href="http://web.telia.com/~u85905224/knight/eWarnsd.htm"&gt;Warnsdorff's rule&lt;/a&gt; - 영문 페이지
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116658408571548181?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116658408571548181/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116658408571548181&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116658408571548181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116658408571548181'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2006/12/blog-post_20.html' title='기사의 여행'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38239421.post-116658043899983291</id><published>2006-12-20T10:52:00.001+09:00</published><updated>2008-03-07T10:11:11.412+09:00</updated><title type='text'>블로그를 개설했습니다.</title><content type='html'>&lt;p&gt;
저는 대학교에서 컴퓨터공학을 공부하고 있는 학부생입니다. 이제 글을 좀 써 볼까하고 블로그를 개설하였습니다. 시작은 작지만 보잘 것 없는 글이라고 하나 하나 계속해서 모이게 되면 어느 사이에 저만치 나가 있지 않을까 생각해 봅니다.
&lt;/p&gt;

&lt;p&gt;
현재 2006년 2학기 종강을 하고, 조금 여유로워졌기 때문에 글쓰기를 시작할 마음이 생겼습니다. 주제는 전산학을 비롯하여 개인적인 글 등 여러 가지를 해 볼 생각입니다. 시간이 날 때마다 작은 코드 하나 하나라도 작성해 보려고 합니다.
&lt;/p&gt;

&lt;p&gt;
이런 작은 것 하나하나가 모이는 것이 생각했던 것보다 훨씬 중요한 것 같습니다. 더 늦기 전에 시작하려고 합니다. 글을 읽으시는 분들은 공유하고 싶은 생각이 있으시면 주저말고 코멘트나 메일 등을 통하여 생각을 나눠주셨으면 합니다.
&lt;/p&gt;

&lt;p&gt;
2008년 초, 현재 추가: -_- 저만치 나가 있기는 커녕 발전이 없습니다. 이건 뭐...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38239421-116658043899983291?l=turtleforward.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turtleforward.blogspot.com/feeds/116658043899983291/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38239421&amp;postID=116658043899983291&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116658043899983291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38239421/posts/default/116658043899983291'/><link rel='alternate' type='text/html' href='http://turtleforward.blogspot.com/2006/12/blog-post.html' title='블로그를 개설했습니다.'/><author><name>Jay Yeom</name><uri>http://www.blogger.com/profile/01000235000078696615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
