SSH 터널링이란 - 특정한 포트로 들어오는 IP 패킷을 SSH 접속을 이용해 다른 컴퓨터로 중계해 주는 프로토콜을 가리킵니다. SSH 터널링을 이용하면 방화벽이나 사설망 안에 물려 있어 외부에서 접속이 불가능한 PC에 접속하는 것이 가능합니다.

다음과 같은 시나리오를 예로 들어 보겠습니다.

직장의 사설망 내부에 작업용으로 사용하는 리눅스 PC가 있습니다. 외부에 있는 윈도우 컴퓨터에서 putty로 작업용 PC에 접속하고 싶습니다. 이때 사설망 외부에 SSH 서버가 있다면 터널링을 이용해 작업용 리눅스에 접속할 수 있습니다.

세 대의 컴퓨터가 각각 다음과 같은 이름을 가졌다고 가정합시다.

office_linux_pc : 사설망 내부에서 사용하는 linux pc. 사설 IP는 192.168.0.101 이라고 합시다.
ssh_server : 사설망 외부의 SSH 서버. IP는 147.46.101.102 이고, 계정 이름은 kanie라고 합시다. (도메인 이름이 있다면 ip 대신 도메인 이름을 사용해도 됩니다.)
home_windows_pc : 외부에 있는 윈도우 컴퓨터. 인터넷에 접속만 가능하다면 IP는 무관합니다.

필요한 프로그램은 다음과 같습니다.
office_linux_pc : 이 컴퓨터에 SSH로 접속하고 싶은 것이니만큼 SSH 서버가 필요하겠죠. HTTP로 접속하고 싶다면 역시 HTTP 서버가 필요합니다. 서버가 설치되어 있다면 루트 권한이 필요하지는 않습니다.
ssh_server : SSH 서버가 필요합니다. root 권한을 가질 필요는 없습니다.
home_windows_pc : 윈도우용 SSH 클라이언트인 putty를 설치합시다. putty와 같이 따라오는 윈도우 커맨드라인용 ssh 클라이언트인 plink도 필요합니다.

office_linux_pc에서 ssh_server로 SSH 링크를 엽니다. 147.46.101.102 서버의 3030번 포트로 들어오는 모든 접속을 localhost(이 경우 office_linux_pc가 되겠죠)의 22번 포트로 우회시키는 명령입니다. 22번 대신 80번 포트를 넣으면 외부에서 http 서버에 접속할 수 있습니다.

ssh -R 3030:localhost:22 kanie@147.46.101.102

패스워드를 물어보면 입력하고 접속하면 됩니다.

이제 office_linux_pc를 켜놓고 집으로 갑시다.

home_windows_pc에서 cmd로 콘솔을 열어 다음과 같이 입력합시다. 이번엔 localhost(home_windows_pc)의 4040번 포트로 들어오는 모든 접속을 147.46.101.102 서버의 3030번 포트로 우회시키는 명령입니다.

plink -L 4040:localhost:3030 kanie@147.46.101.102

이제 putty로 localhost:4040 포트에 접속합시다.



office_linux_pc의 ID와 password를 입력하고 접속하면 됩니다.

애인님 이야...기?

from 로그/일기 2008/03/01 17:04
난 단것을 좋아한다. 특히 머리를 많이 써야 하는 일(코딩이라던가)을 할 때 단것을 많이 찾는 편이다.
반면 애인님은 단것을 많이 좋아하지는 않는다. 코딩을 해야 할 때나 공부를 해야 하는데 당장 머리가 잘 안 돌아갈 때 어쩔 수 없이 먹는 정도? 그래서인지 내가 단것을 좋아하는 습관을 못마땅하게 여긴다.

얼마 전에 애인님과 나눈 대화의 일부분 :

애인님 : 내가 단언하는데, 애인님 편두통은 그 단거 먹는 습관 때문이야.

나 : 그런 거 같아. 그래서 내가 요즘 단거 안 사먹잖아. 내가 요즘 단거 먹자고 하는 거 봤어?

...여기까지 말했던 시점에 불과 얼마 전에도 초콜릿을 사먹은 것이 기억남.

나 : ...그러니까 요 며칠간...은 안 먹었잖아!

...그리고 그날 "더는 초콜릿을 사먹지 않겠다"고 결심한 것이 기억남. 아무리 생각해도 작심삼일이다.

나 : ...작심삼일도 1주일에 한번만 하면 1년에 150일이야! (버럭)

여기까지 아무 말 없이 듣고 있던 애인님이 갑자기 미친듯이 폭소하기 시작했다 -_-;;;

ps. 이건 너무 내 무덤 파는 짓인 것 같아...


'로그 > 일기' 카테고리의 다른 글

애인님 이야...기?  (0) 2008/03/01
삽질중  (0) 2007/11/12
금과옥조  (2) 2007/11/11
기원  (0) 2006/05/30
사랑니  (8) 2006/04/17
봄봄봄  (0) 2006/04/04

요즘 재미있게 보고 있는 sonnet님의 블로그에 보수적 변화는 왜 우월한 진보전략인가라는 글이 올라왔습니다. 진화생물학의 관점을 통해 사회변화의 속도와 방향에 대해 설명하는 글이었는데요. 반론이라고 하기보다는 보론의 성격에서, 같은 문제를 좀 다르게 들여다보고 싶어서, 생각하는 바를 글로 정리해 보고자 합니다. 요즘 하고 있는 공부와도 약간은 관계가 되는 얘기라 좀 긴 포스팅이 될 것 같네요.

현미경의 비유

리처드 도킨스의 유명한 책 [눈먼 시계공]에는 진화과정을 현미경 초점을 맞추는 과정에 비유하는 다음과 같은 대목이 나옵니다.

이러한 도약론자의 진화 이론을 모두 폐기시킬 수 있는 분명한 이유가 있다. … 두 가지 이유 중 첫 번째는 앞 장에서 다른 주제로 등장했던 위대한 통계학자이자 생물학자인 R. A. 피셔가 지적한 것이다. 피셔는 도약설이 오늘날보다도 훨씬 유행하고 있던 시대에 모든 형태의 도약설에 대해 강한 신념으로 반론을 제기했다. 그는 다음과 같은 비유를 사용했다. 초점은 거의 맞지만 완전하지는 않은 현미경이 있다고 가정하자. 더군다나 현미경은 초점 조절 이외의 방법으로는 정확한 상(像)을 얻을 수 없다. 만약 이 현미경의 상태를 터무니없게 변화시켰을 때(이것은 돌연변이에 해당한다.) 초점이 맞아 올바른 상의 질이 전반적으로 향상될 수 있는 가능성은 어느 정도일까? 피셔는 그 질문에 대해 이렇게 답했다.

어떤 식으로든 큰 폭의 조정이 이루어질 경우에는 상(像)의 질이 향상될 가능성이 극히 작지만, 현미경 제작자나 사용자가 의도한 최소의 조정 폭보다 미세한 조정이 이루어질 경우 개선될 확률은 거의 정확하게 2분의 1임은 거의 확실하다.

피셔가 “쉽게 알 수 있다.”라고 생각한 것이 일반 과학자로서는 획득하기 어려운 지력을 요구한다는 점에 대해서는 이미 설명했지만, 위의 인용문에서 피셔가 “거의 확실하다.”라고 말한 데에도 마찬가지 사실이 적용될 수 있다. 그럼에도 불구하고 곰곰이 생각해 보면 언제나 그가 옳았다는 것을 알 수 있으며, 이 경우에는 그다지 힘들이지 않고도 만족스럽게 그 사실을 증명할 수 있다. 조정을 가하기 전의 현미경이 초점이 거의 맞추어져 있는 상태라는 가정에 대해 잘 생각해 보자. 렌즈가 완전히 초점이 맞는 위치보다 조금 낮은 위치, 가령 10분의 1센티미터 정도 슬라이드 글라스에 가까운 위치에 있다고 하자. 그런데 아주 미세하게, 가령 100분의 1센티미터 정도 임의적으로 렌즈를 움직인다면 초점이 앞의 경우보다 나아졌을 것이다. 렌즈를 움직이는 방향은 임의적이므로 이러한 두 가지 경우 중 어느 한쪽이 일어날 확률은 2분의 1이다. 조정을 위한 렌즈의 움직임이 최초의 오차에 비해 작으면 작을수록 초점이 향상될 확률은 2분의 1에 가까워질 것이다. 이러한 사실로부터 피셔의 명제의 후반부는 완전히 입증된다.

그러나 현미경의 경통을 대돌연변이에 비견될 만큼 큰 폭으로, 더욱이 임의의 방향으로 움직여 보자. 가령 1센티미터를 움직였다고 하자. 그러면 상하 어느 쪽 방향으로 움직이든 관계없이 초점은 이전보다 훨씬 더 어긋나게 될 것이다. 가령 경통을 아래쪽으로 움직였다면, 이상적인 위치에서 1.1센티미터 떨어지게 될 것이다.(이렇게 되면 실제로는 렌즈가 슬라이드 글라스에 부딪쳐 부서지고 말 것이다.) 위쪽으로 움직인 경우에는 이상적인 위치에서 0.9센티미터 떨어져 있을 것이다. 경통을 움직이기 전에는 기껏해야 정확한 초점에서 0.1센티미터밖에 떨어져 있지 않았지만 어느 쪽으로든 ‘대돌연변이’적 큰 움직임이 일어나면 사태를 더욱 악화시 키게 된다. 지금까지 우리는, 극히 큰 움직임(대돌연변이)과 극히 작은 움직임(미소돌연변이)을 계산해보았다. 물론 중간적인 크기의 움직임에 대해서도 같은 계산을 적용할 수 있지만, 거기에는 아무런 의미도 없다. 이제 움직임이 작으면 작을수록 향상이 이루어질 확률이 2분의 1이 되는 한편의 극단에 가까워지고, 움직임이 크면 클수록 향상이 이루어질 확률이 0이 되는 또 한편의 극단적인 경우에 가까워진다는 사실이 명확해졌을 것이다.

독자들은 지금까지의 논의가 현미경에 임의의 조정을 가하기 이전에 이미 초점이 거의 정확하게 맞추어져 있었다는 최초의 가정에 의존하고 있다는 사실을 알아차렸을 것이다. 만약 현미경의 초점이 2센티미터 벗어나 있었다면 비록 1센티미터를 임의로 변화시켜도, 100분의 1센티미터를 임의로 변화시켰을 때와 마찬가지로 향상될 확률은 50퍼센트이다. 이 경우에 ‘대돌연변이’는 훨씬 빨리 현미경의 초점을 맞출 수 있다는 이점을 가질 것이다. 그렇게 된다면 물론 피셔의 논의는 임의의 방향으로 6센티미터 움직인 ‘거대돌연변이’에 적용될 것이다.

그러면 피셔는 왜 현미경의 초점이 처음부터 거의 맞추어져 있었다는 가정에서 출발했을까? 이 가정은 현미경이 비유에서 맡은 역할에서 비롯된다. 임의의 조정을 거친 후의 현미경은 돌연변이를 일으킨 동물을 나타낸다. 또한 임의의 조정을 거치기 전의 현미경은 돌연변이를 일으킨 동물의 돌연변이를 일으키지 않은 정상적인 부모를 나타낸다. 부모의 경우에는 분명 번식할 수 있을 정도로 오래 살았을 테고 따라서 분명 훌륭한 조정 과정을 거쳤을 것이 다. 같은 이유로 임의적인 상하 움직임을 거친 앞의 현미경의 초점이 전혀 맞지 않는 경우란 상상할 수 없고 비유로 표현되고 있는 동물이 완전히 생존할 수 없는 경우도 불가능하다. 이것은 비유에 불과하기 때문에 ‘전혀 맞지 않은’ 크기가 1센티미터든 10분의 1센티미터든 또는 100분의 1센티미터든, 우리의 논의에서는 하등 중요치 않다. 중요한 것은 우리가 점차 그 정도가 커지는 돌연변이를 생각하고 있다면 돌연변이가 커짐에 따라 점점 이익이 적어지는 점에 도달하며, 반대로 계속 그 크기가 감소하는 돌연변이를 생각하고 있다면 점차 돌연변이가 유리해질 수 있는 확률이 50퍼센트가 되는 점에 도달할 것이라는 사실이다.

이러한 의미에서, 예를 들면 촉각지와 같은 대돌연변이가 유리할 것인지(최소한 유해한 결과는 피할 수 있는지), 즉 그것들이 진화적 변화의 토대가 될 것인지에 대한 논의는 지금 생각하고 있는 돌연변이가 ‘어느 정도’ ‘큰’가에 대한 논의임을 분명히 알 수 있다. 돌연변이가 ‘크면’ 클수록 유해하고 그에 따라 어느 종의 진화에 결합될 가능성은 줄어든다. 실제로 유전학 연구실에서 연구되는 거의 모든 돌연변이는(그 돌연변이가 크지 않으면 유전학자가 알아차릴 수 없으므로) 상당히 크다고 말할 수 있지만 그 돌연변이를 일으킨 동물의 입장에서는 유해하다.(역설적이게도 나는 이 사실을 다윈주의에 대한 ‘반증’이라고 생각하는 사람들을 만난 적이 있다.) 따라서 피셔의 현미경 이야기는 최소한 극단적인 형태의 ‘도약’ 진화설에 대해 회의를 품게 만드는 한 가지 근거를 제공해 준다.

Dawkins, Richard, The Blind Watchmaker: Why the Evidence of Evolution Reveals a Universe Without Design, W. W. Norton, 1986
(이용철 역, 『눈먼 시계공』, 사이언스 북스, 2004, p.376-380)

sonnet 님의 [보수적 변화는 왜 우월한 진보전략인가]에서 재인용.

리처드 도킨스는 훌륭한 진화생물학자이며, 그의 학문적 업적이 생물학에 많은 변화를 가져왔다는 점은 부정할 수 없습니다. 그러나, 그와 별개로 그의 완고한 점진주의는 모든 진화생물학자들이 공유하는 관점이라고 하기는 어렵습니다.

진화생물학자들 사이에 벌어진 유명한 논쟁으로 점진론 대 단속평형(인용문에서 도킨스가 "도약론자"라 칭하는) 논쟁이 있습니다. 점진론은 다윈이 처음 진화론을 제창했을 때부터 내려온 해석으로, "생물종의 진화는 작은 돌연변이가 일정한 속도로 조금씩 쌓여 큰 변화를 이루는 과정"이라는 시각이고, 반면 단속평형설은 "생물종의 진화 경로에는 변화가 거의 없는 (수백만 년 단위의) 긴 안정 단계와 빠른 속도로 큰 변화가 일어나는 (수만년 단위의) 단계가 반복해서 나타난다"는 시각입니다.

도킨스는 이 책에서 점진론을 옹호하는 증거로 현미경 비유를 들고 나오는데요, 사실 이 비유는 점진론을 옹호하기보다는, 점진주의를 극단으로 밀고 나갔을 때 생기는 약점을 잘 드러내는 비유입니다.

현미경 비유의 약점

현미경의 비유를 간단한 그래프로 나타내 봅시다.

현미경 그래프

허섭한 그림판 실력은 눈감아 주셨으면 합니다.

위 그림에서는, 상이 가장 선명하게 나타나는 손잡이 위치를 몰라도 현미경의 초점을 맞출 수 있습니다. 조금씩 조금씩 현미경의 손잡이를 돌리다 보면 더 잘 보이는 방향과 잘 안 보이는 방향을 알 수 있고, 잘 보이는 방향으로 나아가다 보면 가장 선명한 지점에 언젠가 도달하게 됩니다.

그러나 현미경의 초점을 맞추는 것과 같은 간단한 문제는 사실 현실세계에 잘 존재하지 않습니다. 쉽게 풀리는 문제는 더 이상 문제가 아니니까요. 현실세계에서 중요한 문제는 오히려 다음과 같은 상황일 경우가 많죠.

사용자 삽입 이미지

이 사례에서, 가장 좋은 해답은 분명 존재하지만, 현미경 예제에서와 같은 점진적인 진행으로는 원하는 해답을 얻을 수 있는 확률은 대단히 낮습니다.

위 그래프가 명백히 보여주는 것처럼, 점진론적인 진행만으로는 복잡한 문제를 해결하는 것은 불가능합니다.

최적화 이론

컴퓨터가 주어진 문제를 해결하는 과정을 "최적의 해답을 찾아나가는 과정"으로 보고 그 과정을 연구하는 학문을 최적화 이론이라고 합니다. (수학자들의 용어로 하면, 비선형 문제공간에서 최적해 또는 근사 최적해를 찾아내는 알고리즘을 연구하는 학문입니다.) 최적화 이론에서는 이런 상황을 등산으로 산봉우리에 올라가는 과정으로 비유하곤 하는데요. 위의 현미경 비유는 말하자면 가장 높은 하나의 큰 봉우리가 존재하는 상황입니다. 이 상황에서는 가장 높은 봉우리가 어딘지 몰라도 높은 곳을 향해서 조금씩 나아가기만 하면 언젠가는 가장 높은 봉우리에 반드시 도달합니다. 그러나 복잡한 그래프에서 똑같은 점진적 전략을 취하면 낮은 산봉우리 가운데 하나에 안주하여, 가장 높은 봉우리에는 결코 도달할 수 없습니다.

그러면 아래와 같은 복잡한 문제에서, 최적화 이론을 연구하는 사람들이 취한 전략은 무엇일까요? 그들은 단속평형설이 주장하는 바와 같은 전략을 취합니다. 점진적인 진행을 계속하되, 하나의 산봉우리에 막히면 그 산봉우리의 위치를 기억해 놓고 무작위적인 큰 변화를 가합니다. 그 다음 거기서부터 다시 점진적인 진행으로 탐사를 재개하는 거죠. 이런 전략에는 다양한 변주들이 존재합니다만, 최적화 이론에서 취하는 다양한 전략들이 갖는 공통점은, "무작위적인 변화" 입니다.

사용자 삽입 이미지

무작위적인 변화 전략이 최적의 해답을 향해 나아가는 과정

위 그래프는 점진적 변화(푸른 선)에 무작위적인 변화(붉은 선)를 더한 전략이 최적의 해답을 향해 나아가는 과정입니다. 여기서 주의깊게 봐야 할 것은, 무작위적인 큰 변화(붉은 선)는 더 내려가는 방향, 즉 해답의 가치를 더 저하시키는 방향으로 움직이는 경우가 많다는 점입니다. 점진적인 변화(푸른 선)를 통해 나아간 곳은 최고봉보다는 낮더라도 주변의 다른 곳보다는 어쨌든 높은 곳이기 때문에, 무작위적인 큰 변화를 가할 경우 해답의 가치는 높아지는 경우보다 낮아지는 경우가 더 많습니다. 그렇더라도 최종적인 결과는 점진적인 변화만으로 나아간 것보다는 더 높은 곳에 도달하게 됩니다.

유전 알고리즘

최적화 전략의 여러가지 예 가운데 하나로 유전 알고리즘이라는 것이 있습니다. 이 전략은 기존의 점진적인 방법으로 풀기 어려운, 가장 복잡한 문제를 푸는 데 주로 사용되는 전략으로, 엄청나게 방대해진 현대의 CPU 설계를 도와주는 시스템이나, 신약 개발시 체내 특정 단백질의 반응을 예측하는 분자 시뮬레이션 등에 등장합니다.

유전 알고리즘은 그 이름에서 유추할 수 있는 것처럼, 생물의 진화 전략을 모사하여 최적해를 찾는 과정입니다. 유전 알고리즘은 하나의 후보로부터 시작하지 않고, 해답이 될 후보를 여러 개 두고 시작합니다.(큰 유전자 풀) 이 가운데 무작위로 몇 개의 품질이 우수한 후보를 두 개 골라, 두 유전자를 무작위로 섞는 방식으로 자손을 만드는데,(유성생식) 그것을 다시 무작위로 약간만 변형시킵니다.(돌연변이) 그리고 품질이 좋지 않은 해를 몇개 골라 역시 무작위로 제거합니다.(자연선택) 이 과정을 반복하여 점점 나은 최적해를 향해 나아가는 전략입니다.

이 전략에서 중요한 것은 "무작위"의 정도와 방법을 조절하는 부분입니다. 후보들을 결합해 자손을 만드는 과정에서 가장 우수한 두 후보를 고르는 전략을 취하면, 모든 후보들이 서로 비슷한 경로를 따라가 하나의 낮은 산봉우리에 모여 버립니다. 우수한 후보를 고르되 적당한 무작위를 가하는 것이 중요합니다. 마찬가지로 후보를 제거하는 과정에서도 가장 품질이 떨어지는 후보를 제거해 버리면 가장 높은 산봉우리를 찾아가는 것은 불가능합니다. 이것을 유전 알고리즘 연구자들 사이에서는 "유전자의 다양성을 유지한다"고 표현하는데요. 이 "유전자 다양성"의 유지는 유전 알고리즘이 효과적으로, 빠른 시간 안에 최적해를 찾는 데 핵심적인 역할을 합니다.

단속평형의 패턴

유전 알고리즘은 또한 최적해가 개선되는 과정에서 특징적인 그래프를 보여줍니다.

사용자 삽입 이미지

전형적인 순수 유전알고리즘의 평균 품질 개선 그래프.

(그래프는 이곳에서 가져왔습니다.)

위 그래프는 세대를 거듭함에 따라 후보들의 평균 품질이 개선되는 과정을 보여주는 그래프인데요, 잘 보면 어떤 정체 상태에 오래 머물러 있다가 아무런 계기도 없이 후보들의 품질이 급작스럽게 개선되고, 다시 오랜 정체상태를 반복하는 패턴이 보입니다. (이 논문에서는 낮은 값을 갖는 후보가 더 좋은 품질의 후보이기 때문에 세로축의 방향은 반대입니다만, 패턴은 같습니다.)

이런 패턴이 나타나는 이유는 복잡하지만 대단히 중요합니다.

정체 단계에서, 대부분의 후보들은 작은 산봉우리에 수렴하여 잘 움직이지 않습니다. 이곳에서 몇몇 후보들은 무작위적인 변화를 통해 다른 산봉우리를 향해 점프하기도 하지만, 대부분 품질이 좋지 않기 때문에 무작위적인 제거의 대상이 됩니다. 그러나 무작위적인 제거 과정에서 살아남은 몇몇 후보들은 다시 점진적인 작은 돌연변이를 통해 새로운 산봉우리를 향해 올라갑니다. 이렇게 새로운 산봉우리를 올라가던 후보가 어느 순간 다른 대부분의 후보들보다 더 품질이 좋아지는 순간이 오면 전체 후보군들 사이에 갑작스러운 전이가 일어납니다. 작은 산봉우리에 안주하고 있던 대부분의 후보군들이 멸종하고, 더 높은 산봉우리를 올라가는데 성공한 후보의 자손들이 유전자 풀의 대부분을 점령하는 극적인 세대교체가 일어납니다. 그래프에서 보이는 계단 모양 패턴은 그런 과정의 결과물입니다.

여기서 이야기는 다시 점진론과 단속평형론의 논쟁으로 돌아옵니다.

생물 진화의 화석 증거가 보여주는 패턴은, 점진론의 주장보다는 단속평형론의 주장에 더 가깝습니다. 대부분의 화석은 수십만년에서 수백만년까지에 이르는 긴 시간동안 별다른 진화의 흔적 없이 거의 같은 유전자를 유지합니다. 그러다가 수만년 단위의 짧은 시간동안 폭발적으로 변화하여 새로운 종을 형성합니다.

여기서 유추할 수 있는 것은, 생물 진화의 역사가 단속적인 평형과 빠른 진화적 변화 사이를 오가는 이유는, 유전 알고리즘이 긴 정체상태와 빠른 변화과정을 오가는 이유와 같다는 것입니다. 점진적인 작은 변화만으로는 진화에 일정한 한계가 존재합니다. 그러나 "유전자의 다양성"을 유지하고 있다면, 어느 순간 빠른 변화가 시작됩니다. 그 변화는 언젠가 또다른 한 점에 수렴하지만, 그것은 이전에 정체되어 있던 점과는 다른 새로운 지점입니다.

주목해야 할 것은, 하나의 수렴 지점과 다른 수렴 지점 사이의 빠른 변화를 추동하는 것은 "점진적인 변화"라는 것입니다. 이 지점에 있어서는 도킨스의 말이 옳습니다. 무작위적인 큰 변화를 무턱대고 반복하는 것은 결코 정교하고 작은 변화를 축적하는 것만큼 빠르게 변화를 만들어낼 수 없습니다.

때문에, 좀더 큰 견지에서 점진론과 단속평형은 서로에 대한 반론이 아니라 보론이 될 수 있습니다. 대진화의 견지에서 진화를 추동하는 힘은, 결과적으로는 점진적인 변화입니다. 누가 뭐라고 해도 인류를 비롯한 현생 생물들은 오랜 세월동안 아주 작은 변화가 쌓여 이루어진 결과물입니다. 그러나 점진적인 변화만으로는 영원히 변화를 지속할 수는 없습니다. 변화를 계속하기 위해서는, 지금까지의 틀을 깨버리는 큰 변혁이 어떤 시점에서는 필요합니다.

맺음

솔직히 말해서, 저는 사회학이나 기술사학에 있어서는 문외한입니다. 저같은 사람이 다른 분야의 과학적 통찰을 사회에 그대로 갖다대는 것은 대단히 위험한 일일 것입니다. 그러나, 생물학의 시각에서 들여다본 사회의 모습에 어떤 새로운 풍경을 더할 수는 있다는 입장에서, 과감히 논의를 연장해 보고자 합니다.

어떤 위대한 선구자의 큰 발걸음과, 무명 기술자들의 상대적으로 작은 발걸음으로 기술 발전을 나누어 볼 때, 양쪽은 둘 다 똑같이 중요합니다. 선구자의 큰 발걸음 그 자체가 기술을 발전시키는 것은 아닙니다. 그러나 그 발걸음은 지금까지 우리가 눈앞의 작은 봉우리에만 눈이 팔려 보지 못했던 새로운 경지를 제시합니다. 그 방향으로 실제로 나아가는 것은 무명 기술자들의 한걸음 한걸음이지만, 그것을 근거로 방향을 제시한 사람의 업적을 평가절하하는 것은 온당치 않습니다.

또한, 어떤 변화가 점진적이냐 아니면 커다란 도약이냐 하는 것은 문제를 바라보는 시각의 규모에 따라 달라집니다. 전체 지구의 역사라는 커다란 시각에서 보면, 생명의 진화는 끊임없는 점진적 발걸음입니다. 그러나 한 생물종의 진화의 역사라는 보다 작은 시각에서 보면 진화를 규정하는 것은 일시적인 커다란 변화와, 변화가 없는 오랜 시기의 불규칙한 반복입니다. 그보다 또 한번 작은 시각에서, 한 종에서 다른 종으로 변화하는 역사를 살펴보면, 그것은 끊임없는 작은 돌연변이의 축적입니다. 문제를 어떤 시각에서 보는가에 따라 점진주의는 맞기도 하고 틀리기도 합니다. 인간 사회의 발전, 혹은 기술의 발전에 있어서도 이것은 마찬가지일진대, 그 가운데 점진주의라는 하나의 시각만을 가져와 사회를 보는 창으로 쓰는 일은 역시 온당치 않습니다.

저의 전공인 컴퓨터공학의 기술 발전을 들여다 봅시다. 집적회로 기술이 발명된 이후로, 하나의 칩에 사용되는 트랜지스터의 개수는 무어의 법칙(3년에 4배씩)에 따라 거의 완전히 예측가능한 추세로, 지극히 점진적인 발전과정을 따라 발전하고 있습니다. (CPU 설계기법도 사람이 연구하는 것일진대, 이렇게 완벽히 예측가능한 곡선을 그린다는 것은 사실 불가사의한 일입니다.) 그러나, 진공관, 혹은 트랜지스터로 CPU를 만들던 시절에도 그 추세가 지금과 같았을까요? 앞으로도 이 추세가 계속 유지될까요?

재미있는 것은, 트랜지스터의 개수 면에서는 얘기가 조금 다르지만, CPU의 속도를 나타내는 기준 가운데 하나인 GHz의 숫자는 그 성장세가 빠르게 줄어들고 있습니다. 여기에는 여러가지 이유가 있는데, 한마디로 하면 CPU 하나의 초당 연산속도를 늘리는 데는 이제 반도체기술 자체의 한계에 다다랐기 때문입니다. 일종의 단속평형 상태입니다. 그러나 CPU 업계는 이제 다른 분야에서 경쟁을 시작했습니다. 하나의 칩에 여러 개의 코어를 집어넣기 시작한 것입니다. 불과 몇년 전에 돌풍을 일으키며 등장한 듀얼 코어는 요즘은 웬만한 데스크탑 컴퓨터에는 다 들어가는 CPU가 되었습니다. 요즘 하이엔드 데스크탑에는 쿼드 코어가 들어가는 모양이더군요. 애플에서 발매한 맥 프로 컴퓨터의 최고급 사양에는 무려 8-코어가 들어가기도 합니다. 전혀 다른 형태의 새로운 경쟁이, 또다시 점진적인 형태로 시작된거죠. 한편 보다 큰 반도체기술의 시각에서 보면 여전히 집적회로 기반 CPU의 전체적 성능은 코어 개수의 지속적인 증가와 함께 지극히 점진적으로 증가하고 있습니다.

진화생물학은 변화를 이야기하는 학문입니다. 그 변화의 양상은 단순하지도 않고, 아직 우리는 그 변화에 대해 다 알지도 못합니다. 진화생물학의 틀로 세상을 들여다보는 시각은 분명 큰 도움이 되지만, 그 시각이 좀 넓어졌으면 하는 바람에서 적어 봅니다.

요즘 (2000년대 후반) 나오는 리눅스 배포판들은 패키지 관리를 깔끔하게 해주기 때문에 원하는 프로그램을 마우스 클릭 한두번으로 설치하고 사용할 수 있지만, 그게 여의치 않은 경우가 있죠. 예를 들면 원하는 프로그램이 패키지 목록에 없을 때라던가, 아니면 관리자 권한이 없어 프로그램을 마음대로 설치할 수 없는 경우요. 그럴 때는 소스를 직접 다운받아서 설치하고, 제거해야 합니다.

리눅스 사용자들은 아마 다 알고 계시겠지만, 그래도 저같은 리눅스 초보에게는 tar.gz로 묶인 소스코드 뭉치를 던져주고 알아서 설치를 하라고 하면 머리가 아파오지요. 우리 모르는 사람들끼리 서로서로 설치/제거법을 알아보아요.


설치 준비하기

예를 들어 설명해봅시다. 저는 요즘 하는 일 때문에 ImageMagick이라는 라이브러리가 필요합니다. 학교에서 사용하는 서버는 우분투 리눅스 5.10인데, 우분투의 친절한 패키지 관리자를 통해 ImageMagick 을 설치할 수는 있긴 하지만... 버전이 6.2.xx 네요. 제게 필요한 버전은 6.3 이상이므로, 6.3 버전 소스 코드를 다운받아 직접 설치하기로 했습니다.

만약 우분투를 쓰고 계시다면, 그리고 소스 코드 컴파일을 한번도 해본 적이 없다면, (혹은 컴파일이란 게 뭔지 모르신다면) 컴파일과 설치를 위한 기본 도구들을 먼저 설치해야 합니다. 설치는 간단합니다. 시냅틱 패키지 관리자나, sudo aptitude를 이용해서 build-essential 패키지를 설치하세요.

대부분의 다른 리눅스 배포판들은 gcc / make / ld 등의 도구들이 다 깔려 있습니다. 다음으로 진행합시다.


소스 코드 다운받기

구글로 검색해서 ImageMagick의 홈페이지를 찾았습니다. 다운로드 페이지를 잘 읽어보고 원하는 소스 코드를 다운받습니다. 저의 경우 주소는 ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz 이렇게 되네요.

웹 브라우저로 검색해서 다운받는다면 다운받는 것은 쉽습니다. 그러나 리눅스 GUI에 직접 접근할 수 없고, 커맨드라인만 사용할 수 있는 환경이라면, wget을 사용하면 됩니다. wget은 대부분의 리눅스 배포판에 기본으로 깔려 있으므로, wget [웹 주소] 이렇게만 치면 됩니다.

wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz

소스 코드를 다운받았습니다. 압축파일 이름은 ImageMagick.tar.gz 네요. 이제 다운받은 압축파일을 풀어봅시다.

리눅스 환경에서 대부분의 압축 파일은 확장자가 tar.gz로 되어 있습니다. 만약 GUI를 사용할 수 있는 환경이라면 그냥 압축파일 관리자를 이용해 새 디렉토리에 압축을 푸시고, 아니라면 tar를 이용해 압축을 풀어 봅시다. tar -xzvf [파일 이름] 이라고 치면 됩니다.

tar -xzvf ImageMagick.tar.gz


설치 문서 읽기

여기서부터가 까다롭습니다. 소스 패키지 설치는 GUI로는 진행할 수 없기 때문에, 먼저 리눅스 터미널을 열어야 합니다. 열었으면, 압축을 푼 디렉토리로 가봅시다. ImageMagick-6.3.9 라는 디렉토리가 생겼네요.

cd ImageMagick-6.3.9

일반적으로 소스 패키지 설치는 configure / make / make install 의 3단계로 이루어집니다. configure는 설치 전에 여러가지 옵션을 지정해주고 컴파일 환경을 검사하는 단계입니다. configure 옵션은 프로그램마다 조금씩 다르므로, 설치 전에 먼저 README나 INSTALL 같은 설치문서를 읽어보는 것을 추천합니다. (문서가 주로 영어로 되어 있다는 것은 참 슬픈 일입니다.) 여기서 설치 옵션 부분을 읽어보고 나에게 필요한 옵션이 있다면 적어둡니다.


configure

configure는 내게 필요한 도구가 다 있는지, 라이브러리는 다 있는지 같은 것들을 체크해주고 빌드 환경을 만들어주는 스크립트입니다.

설치할 때 옵션을 주지 않으면 기본으로 /usr/local/bin 이나 /usr/local/lib 밑에 설치하는데, 이 디렉토리들은 관리자 권한이 없이는 접근할 수 없습니다. 이 경우에는 --prefix 옵션을 주어 설치 디렉토리를 바꿔야 합니다. 저는 저의 홈 디렉토리 밑에 imagemagick이라는 디렉토리를 만들어 그 곳에 설치하기로 했습니다. (이 경우 홈 디렉토리를 ~ 기호로 축약하는 것은 보통 에러를 일으킵니다. 루트 디렉토리부터 절대경로를 다 써주어야 합니다.)

./configure --prefix=/home/kanie/imagemagick

그 외 다른 옵션들도 넣어 보았습니다.

./configure --prefix=/home/kanie/imagemagick --disable-static --with-modules --without-perl --with-x=no

이렇게 하면 이제 컴파일 준비가 완료됩니다.

configure 단계에서 에러를 내며 멈출 경우

보통은 빌더 환경이 잘 갖추어져 있지 않다는 것을 의미합니다. 필요한 프로그램이나 라이브러리가 없는 경우가 대부분이므로, 빌드 문서를 잘 읽어보시고 필요한 프로그램이나 라이브러리를 설치해 주세요.

configure 옵션을 잘못 주어서 다시 시작하고 싶다면

make distclean이라고 치면 configure 설정을 모두 제거해줍니다. 그리고 configure 부터 다시 시작하시면 됩니다.

make distclean


make / make install

make는 미리 정해진 스크립트를 따라 소스 코드를 컴파일해주는 도구입니다. configure를 마쳤다면 make를 쳐서 컴파일합니다.

make

make가 실패하는 경우는 보통 컴파일 에러입니다. 이때는 컴파일 에러를 해결한 후 처음부터 다시 컴파일하는 것을 추천합니다. make clean 하면 컴파일이 취소되고, make를 치면 다시 컴파일할 수 있습니다.

make clean

컴파일이 완료되면 make install 을 치면 설치가 완료됩니다.

make install

설치한 후에 압축파일을 풀었던 디렉토리는 지우지 않는 것을 추천합니다. 나중에 설치 제거할 때 필요하니까요.


설치 제거하기

설치 제거를 하려면 make를 했던 디렉토리로 돌아와 다음과 같이 치면 됩니다.

make uninstall

언제나처럼, 스스로를 이해시켜서 나중에 써먹기 위해 쓴 글입니다. (기계과나 전기과에서 배우는 내용인 듯 한데... 논문 읽다보면 종종 튀어나와서...) 사용된 근거의 정확성이나 이론적 무결성은 보장하지 않습니다. 이 분야에 대해 정말 써먹을 수 있는 지식이 필요하신 분은 신뢰할만한 textbook을 참고하세요.

제어이론이 뭔가요?

제어이론은, 굉장히 여러가지 요소를 가진 예측하기 힘든 시스템을(미쿡말로는 dynamic system이라고 합니다.) 1. 의도한 대로, 2. 안정적으로 움직이게 하기 위한 공학이론입니다.

단도직입적으로, 운전자가 직접 운전하지 않고 컴퓨터가 알아서 운전하는 자동차가 있다고 생각해 봅시다. 운전자는 직접 핸들을 잡고 엑셀을 밟아 자동차를 운전하는 것이 아니라, 사용자가 원하는 속도를 입력하면 그 속도를 유지하며 달리게 됩니다. 운전자가 자동차에게 "시속 60km로 달려라" 하고 명령을 내렸다고 합시다. 자동차의 속력에는 많은 요소가 작용하지만, 엔진의 스로틀(엔진에 연료를 분사하는 비율을 조절하는 밸브 정도로 이해하시면 됩니다)이 가장 큰 역할을 할 겁니다. 예를 들어 스로틀이 연료를 초당 50mg의 비율로 분사하면 자동차의 속도가 60km/h가 되는 걸로 실험실에서 대충 계산이 나왔다고 합시다.

그러면 자동차를 원하는 속도로 달리게 하고 싶을 때 생각할 수 있는 가장 간단한 방법은, 운전자가 원하는 속도 60km/h를 입력하면(외부입력) 사전에 계산된 어떤 방정식을 통해서(컨트롤러) 그에 맞는 스로틀의 비율인 초당 50mg으로 자동차를 제어(출력)하는 겁니다. 이렇게 외부입력만을 받는 가장 간단한 시스템을 feed-forward controller라고 합니다.

그러면 그냥 스로틀을 초당 50mg으로 고정시키면 자동차의 속력이 정확히 60km/h가 나오느냐... 그건 아닙니다. 오르막길에서는 엔진의 힘이 같더라도 속도가 느려질 것이고, 내리막길에서는 더 빨라질 거구요, 비포장도로에서는 또 느려질 거고, 고속도로에서는 좀더 빨라질 겁니다. 그 밖에도 공기저항이라든지, 도로가 비에 젖어서 마찰력이 적다던지 하는 수많은 상황이 발생할 수 있는데, feed-forward controller는 이런 종류의 외부 상황 변화에 대해 반응할 방법이 전혀 없다는 것이 단점이죠.

그러면 좀더 똘똘한 컨트롤러를 생각해봅시다. 사용자가 원하는 속도 60km/h를 입력하면, 스로틀을 초당 50mg으로 일단 맞춰놓고 달려봅니다. 그런데 오르막길에다 도로 상황도 별로 좋지 않아서 속도가 40km/h 정도밖에 안 나오네요. 그러면 스로틀을 조금씩 더 열어 더 빠른 속도를 냅니다. 그러면 점점 속도가 올라 60km/h가 되겠죠. 그러면 그 상태로 스로틀을 유지하는 거죠. 어 그런데 길이 내리막으로 바뀌었군요. 속도가 빨라집니다. 그러면 더 빨라진 속도를 입력으로 받은 컨트롤러는 다시 서서히 스로틀을 닫아 속도를 줄입니다. 그러면 다시 60km/h에서 속도가 안정되겠죠.

이렇게 자동차의 속도(출력)를 다시 컨트롤러(복잡한 톱니바퀴로 스로틀을 제어하는 기계일 수도 있고, 아니면 자동차에 탑재된 조그만 컴퓨터일 수도 있겠죠.)에게 입력으로 주어 (피드백, 우리말로는 되먹임) 컨트롤러가 스로틀(출력)을 더 늘리거나 줄일 수 있도록 한다면, 자동차의 속도를 외부 환경에 큰 영향을 받지 않도록 안정적으로 제어할 수 있습니다. 이런 간단한 되먹임 시스템을 피드백 컨트롤러라고 합니다.

피드백 컨트롤은 사실 모든 생물이 자기 자신을 제어할 때 사용하는 테크닉이기도 하고, 엔지니어들이 오래 전부터 사용해온 테크닉이기도 합니다. 그럼 제어이론(control theory)이라는 거창한 이름이 붙은 이유는 뭐냐... 이 피드백 시스템을 수학적으로 잘 모델링하려는 거죠. 피드백 시스템을 보다 안정적으로 유지하며, 갑작스런 외부 요인으로 시스템이 요동을 쳐도 다시 원래 상태를 회복할 수 있도록 (영어로는 robust하다고 합니다.) 하는 안전한 컨트롤러를 설계하는 것이 제어이론의 목표입니다.

PID 컨트롤러

피드백 시스템중에 (비교적) 이론적으로 간단하고 실제로 제일 많이 응용되는 것은 PID 컨트롤러라고 합니다. 이 PID 컨트롤러에 초점을 맞춰 설명을 해보죠.

PID 컨트롤러에게는 입력(자동차 예제로 설명하면 사용자가 원하는 속도 60km/h) r(t)이 주어집니다. 그냥 고정된 값 r이 아니라 r(t)인 이유는 이 값이 시간 t에 따라 변할 수 있기 때문이죠. 이 값을 입력으로 받은 컨트롤러는 시스템을 제어(이 경우 자동차 스로틀을 바꾸겠죠)하고, 거기에 따라서 시스템의 전체 출력(자동차의 속도) y(t)가 변할 겁니다. 이 시스템을 완벽하게 컨트롤한다면 r(t)와 y(t)는 같은 값이 되겠지만, 실제로 그렇지는 않을 거고 약간의 차이가 존재하겠죠. 이 차이를 e(t) = r(t) - y(t) 라고 합시다.

PID 컨트롤러는 이 e(t) 값에 어떤 상수를 곱하고(Proportional : 비율이라는 뜻이죠) 적분(Integral)을 하고 미분(Derivative)을 한 값을 컨트롤러에게 다시 되먹여서 시스템을 제어한다고 해서 PID 컨트롤러라 부릅니다. 만약에 여기서 적분값 I를 쓰지 않는다면 PD 컨트롤러, D를 쓰지 않는다면 PI 컨트롤러, 그냥 결과값에 상수만 곱해서 되먹인다면 P 컨트롤러가 됩니다.

수식으로 쓰면,
latexP.png
latexI.png
latexD.png
이런 식이 됩니다. 여기서 Kp, Ki, Kd는 각각 적당한 상수가 되겠죠.

이때 컨트롤러는 구동장치(actuator : 시스템을 실제로 작동시키는 장치. 우리의 예제에서는 스로틀이 되겠죠)를 u만큼 움직여서 시스템을 조절하는데, PID 컨트롤러의 경우 이 u 값이 u = P + I + D 가 되는 것이죠.

P, I, D의 계수 Kp와 Ki, Kd는 각각 시스템의 안정성에 일정한 영향을 미칩니다.

Change of response for varying Kp

Kp는 이 경우 시스템이 오차 e에 얼마나 빠른 속도로 반응하는가를 결정합니다. 자동차 예제에서, 극단적으로 Kp가 0이라면 컨트롤러는 전혀 시스템에 반응하지 않고, 따라서 자동차는 전진하지 않겠죠. 반대로 Kp가 매우 크다면? 정지상태에서 사용자가 60km/h라는 값을 입력했을 때 급가속하여 순식간에 60km/h에 가까워질 겁니다. 그러나 안정적으로 60km/h를 유지하지 못하고 상하로 요동이 심해집니다.

Change of response for varying Ki

Ki는 안정상태에 들어선 시스템이 미세한 오차를 얼마나 빨리 제거하는가를 결정합니다. Ki가 0인 시스템은 안정 상태에서도 정확히 입력값에 다가서지 않고 지속해서 요동칩니다. 그러나 반대로 Ki가 너무 크면 Kp의 경우와 마찬가지로 시스템이 불안정해지죠

Change of response for varying Kd

Kd는 시스템이 얼마나 빨리 안정상태에 들어서는가를 결정합니다. Kd가 큰 시스템은 금방 요동을 멈추고 안정 상태에 들어섭니다. 반면에 Kd가 너무 크면 입력값에 도달하는 속도가 느려지죠.

이런 시스템의 안정성에 대해 자세히 논하려면 라플라스 이론이라는 것을 알아야 하는데, 공학수학을 대충 배워서 -_- 라플라스 이론에 대해서는 자세히 모르는고로 이 부분은 스킵하겠습니다.

이게 어디에 도움이 되나요?

어려워 보이지만, 사실 PID 컨트롤러는 의외로 주변 곳곳에서 발견됩니다. 위에서 예로 든 자동차의 속도조절장치는 물론이고, 하드 디스크의 헤드 제어, 파워 서플라이의 전압 조절, 정교한 전자식 지진계 같은 곳에도 쓰입니다. 같은 이론을 스프링과 지렛대를 이용한 기계장치에까지 적용하면 포크레인 같은 대형 건설장비에 사용되는 제어 시스템도 일종의 PID 컨트롤러입니다.


ps. 재미는 없지만 지켜야 할 라이선스 문제 :

위 내용의 대부분은 영문 wikipedia를 적당히 편집한 결과입니다. 따라서 자동적으로 이 문서는 GFDL 라이선스를 따릅니다. 이 내용을 가져가서 재배포하실 때는 반드시 이 문서가 GFDL 라이선스를 따른다는 것을 명시하셔야 하며, 이 내용을 수정/변경하실 때는 그 결과물 또한 GFDL 라이선스를 따라야 합니다.

이 글은 스프링노트에서 작성되었습니다.

삽질중

from 로그/일기 2007/11/12 16:57
집에서는 잘만 컴파일되던 프로젝트를 그대로 압축해서 학교로 들고 왔다.
학교 환경은 가능한 삽질을 줄이기 위해 똑같은 컴파일러 (VC++ .net), 똑같은 GUI 라이브러리 (fltk 1.1.7), 똑같은 디렉토리 구조를 갖게 만들어 두었다.
그런데 이걸 학교로 들고와서 컴파일해보니 정말로 창의적인 링커 에러를 내며 뻗는다.
(나는 C++이라는 괴물의 수많은 링커 옵션들을 영원히 이해하지 못할 것 같다. g++은 그나마 나은데 이건 C++이라는 언어의 문제인가 아니면 Visual C++의 문제인가?)

이 에러 잡느라 오늘 하루는 또 날렸구나 하고 벌써 한숨이 나온다.

'로그 > 일기' 카테고리의 다른 글

애인님 이야...기?  (0) 2008/03/01
삽질중  (0) 2007/11/12
금과옥조  (2) 2007/11/11
기원  (0) 2006/05/30
사랑니  (8) 2006/04/17
봄봄봄  (0) 2006/04/04

금과옥조

from 로그/일기 2007/11/11 02:48
먼저 돌아가게 만들고, 그 다음 re-engineer할 것

코드를 짜다 보면 비효율이 보이고 반복이 보이고 패턴이 보인다.
그게 신경쓰이기 시작하면 일단 주석으로 표시를 해놓고 계속 넘어간다.
다 짜서 코드가 돌아가기 시작하면 추상화를 하고 refactoring을 하던 쌈을 싸먹던 한다.

물론 사람 마음이 그렇게 되지 않는다.
코드를 멋지게는 짜고 싶고 한번 짠 코드를 두번 열어보는 것은 귀찮아서 싫다.
그러니 주석은 달지 않고 코드는 최대한 추상화하고 효율적으로 할 수 있는 부분은 효율적으로 해 놓고
한번에 짠 하고 내놓고 싶다.

"premature optimization is the root of all evil" 이라는 말은 정말로 명언이다.
한마디 추가하면
"premature abstraction is the second root of all evil"

ps. 생각해보면 글쓰기도 마찬가지. 일단 써놓고 퇴고를 해야 하는데 글은 쓰고 싶고 퇴고는 하기 싫으면 이렇게 대충 쓴 티 팍팍 나는 글이 나온다.

pps. 그러나 오늘은 퇴고를 할 시간이 없다.

'로그 > 일기' 카테고리의 다른 글

애인님 이야...기?  (0) 2008/03/01
삽질중  (0) 2007/11/12
금과옥조  (2) 2007/11/11
기원  (0) 2006/05/30
사랑니  (8) 2006/04/17
봄봄봄  (0) 2006/04/04

인터넷을 돌아다니다 재미있는 기사를 발견했습니다. "이기적 유전자"의 원리에 의해 학질(말라리아)을 퍼뜨리는 모기를 없애는 방법에 대해 논하는 글이더군요. 이 논문에서 주장하는 아이디어는 대략 다음과 같습니다.

학질은 모기가 퍼뜨리는 전염성 열병이고, 사하라 이남 아프리카에서만 1년에 100만~300만명의 환자들이 이 병으로 죽는다고 합니다. 지금은 한국에서 학질로 사망하는 사람이 많지 않지만 조선시대에는 흔한 병이었고, 백신이 없기 때문에 지금도 여전히 무서운 병입니다. 백신 대신 예방약이 있기는 하지만, 백신과는 달리 예방약은 계속 먹지 않으면 예방효과가 사라지기 때문에 이 약을 지속적으로 구입할 돈이 없는 아프리카 사람들에게는 모기장과 모기약 외에는 학질에 걸리지 않을 방법이 없습니다.

학질은 사람들 사이에서 직접 퍼지지 않습니다. 학질 환자의 피를 빤 모기의 몸에 기생하고 있다가, 이 모기가 다른 사람의 피를 빨 때 그 피 속으로 퍼져들어가 전염됩니다. 다행히도, 유전공학자들은 몇년 전부터 학질에 면역이 된 모기를 만들어낼 수 있게 되었습니다. 모기가 학질에 걸리지 않게 하는 이 유전자를 M 유전자라고 합시다.

세상의 모든 모기가 M 유전자를 가져서 학질에 면역이 된다면 모기가 더 이상 학질을 사람들에게 퍼뜨리지 못할 것이고, (M 유전자를 가진 모기에게도 전염되는 변종 학질이 나타나지 않는 한) 그렇게 되면 더 이상 퍼질 곳을 잃게 된 학질은 빠른 속도로 멸종할 겁니다. 문제는, M 유전자를 심은 모기를 실험실에서 만들어낼 수는 있지만 세상의 모든 모기에게 M 유전자를 심을 수는 없다는 겁니다. 실험실에서 대량생산해서 퍼뜨린다고 해도, M 유전자가 모기의 생존이나 번식에 특별히 유리하지 않기 때문에 M 유전자가 없는 모기가 여전히 세상 모기의 대부분을 차지할 겁니다.

여기서 이 논문의 놀라운 아이디어가 등장합니다. M 유전자가 다른 유전자를 제치고 살아남을 확률이 높아지도록 유전자를 조작하는 겁니다.

이를 가능케 하기 위해서 두 개의 또다른 유전자를 소개합니다.

하나는 모기의 알을 배아 단계에서 죽이는 유전자인, 유전자 K 입니다. 어미 모기가 유전자 K를 갖고 있으면 그 어미의 알은 깨어나기도 전에 죽을 확률이 매우 높습니다. (주의할 점은 새끼가 유전자 K를 갖고 있는지 없는지는 관계없다는 것입니다. 어미의 유전자가 새끼의 사망 확률을 결정합니다.)
하나는 유전자 R입니다. 이것은 K 유전자에 배아가 저항하도록 해주는 유전자입니다. 이 경우, 새끼가 유전자 R을 갖고 있으면 어미가 유전자 K를 갖고 있어도 새끼가 살아남게 됩니다.

여기서 생물 시간에 배운 멘델의 유전법칙을 잠시 떠올려 봅시다. 양성생식하는 모든 동물들은 유전자를 2쌍 갖고 태어나지요. M, K, R 유전자를 가진 암컷과 평범한 수컷이 교미한다고 하고, 평범한 수컷은 M, K, R에 각각 대응하는 유전자인 m, k, r을 갖고 있다고 가정합시다. M, K, R은 유전공학자들이 만든 유전자고, m, k, r은 각각에 대응하는 위치에 있는, 그냥 평범한 모기 유전자입니다.

현대의 우리는 멘델보다 더 많은 것을 알고 있지요. 우리는 유전자들이 염색체상에서 매우 가깝게 자리잡고 있으면 같이 선택될 확률이 훨씬 높아진다는 것을 알고 있습니다. (염색체 교차의 원리 때문입니다.) 따라서, 어미의 M, K, R 유전자를 매우 가깝게 위치시키면 새끼 모기는 MKR을 갖거나 mkr을 갖게 됩니다. Mkr이나 mkR과 같이 섞인 유전자를 갖는 새끼 모기는 거의 없습니다.

이제 실험실에서 조작된 MKR 암컷을 밖에 풀어놓고 mkr 수컷과 교미시켜봅시다.
MKR 유전자를 갖는 새끼는 아무 문제 없이 태어납니다. R 유전자를 갖고 있기 때문에 어미의 K 유전자에 저항하고 정상적으로 태어납니다.
그러나 mkr 유전자를 갖는 새끼는 R 유전자가 없어서 어미가 가진 K 유전자의 영향을 받고 대부분 배아 단계에서 죽어 버립니다.
결과적으로 이 어미에게서 태어나는 새끼는 반 정도는 죽어 버리고, 반 정도는 MKR 유전자를 갖게 되어 학질에 면역인 모기가 됩니다. 따라서 M 유전자를 모기들 사이에 퍼뜨리고 m 유전자를 효과적으로 멸종시키게 됩니다.

이 경우 새끼가 반 가량 죽는 것은 진화적으로 큰 문제가 못 됩니다. 모기는 하나의 웅덩이에 한번에 많은 알을 까는데 이 웅덩이에 100마리의 모기 새끼를 먹일 정도의 영양분밖에 없다면, 알을 1000개 까던 2000개 까던 태어나는 모기의 숫자는 100마리 정도가 됩니다.

논문 저자들은 비슷한 일을 하는 유전자를 가지고 초파리에게 실험을 했는데 10-12세대 안에 m 유전자를 가진 초파리가 멸종했다고 합니다. 이 실험결과를 바탕으로 계산할 때, 주기적으로 MKR 유전자를 가진 모기들을 풀어놓으면 길지 않은 시간 안에 학질을 퍼뜨리는 모기들이 사라질 거라고 생각한다는군요.

천재적인 아이디어입니다만, 이 방법은 여러가지 윤리적, 사회적 함의를 갖고 있습니다.

첫째로 생각할 수 있는 것은 인간이 신의 영역에 도전하여 불특정 다수의 모기의 멸종을 마음대로 조절할 수 있느냐 하는 것인데, 이 부분에 관해서는 제가 신경쓰지 않아도 신경써줄 사람들이 있을 것 같군요.

둘째, 모기는 우리 피를 직접적으로 빠는 곤충입니다. MKR 유전자가 인간에게 영향을 미칠 확률은 매우 적습니다만, 그래도 만에 하나 인간에게 나쁜 영향을 미치는 유전자라면, 그것을 확인할 방법이 있을까요? 모기에게서 인간에게 유전자가 전달될 일은 없겠지 하고 생각하실지도 모르지만 RNA 역전사바이러스는 한 동물의 DNA를 다른 동물의 DNA에 심을 수도 있습니다. 그리고 우리는 현존하는 바이러스 종의 10분의 1도 채 알지 못합니다.

셋째, 유전공학은 이제 실험실 안에서 개체들의 진화에 손대는 영역에서 벗어나, 전 세계의 개체들에 영향을 끼칠 수 있을 정도로 정교하고 강력해졌습니다. 이것은 잘못 다룰 경우 치명적인 문제를 일으킬 수 있는 힘입니다. 아인슈타인이 언젠가 "세상에서 꿀벌이 없어지면 4년 안에 인류는 멸종한다"고 주장했지요. 꿀벌이 없으면 식물들이 더 이상 수분을 할 수 없고, 식물들이 더 이상 수분을 할 수 없게 되면 1년생 식물들이 사라질 것이며, 1년생 식물을 먹는 초식동물(소, 돼지, 양, 닭 등을 포함해서)들이 멸종하면, 결국 사람도 사라질 것이라구요.
그런데, 만약 한 유전공학 실험실에서 일어난 실수로 전세계의 벌을 멸종시킬 수 있는 유전자가 퍼져나간다면? 물론 그런 실수가 일어날 확률도 몹시 낮고 그런 유전자가 실제로 만들어질 확률도 거의 없지만 (특정한 변종을 멸종시킬 수야 있겠지만 벌 전체를 멸종시키는 유전자가 존재하기는 힘듭니다) 우리는 그게 정말로 없다고 확신할 수 있을 정도로 유전자에 대해 잘 알지는 못합니다.

넷째, 지금까지 나열한 위험들은 위험이라기보다는 우리가 잘 알지 못하는 기술에 대한 이유없는 공포에 가깝습니다. 반면 학질은 지금 이 순간에도 아프리카의 아이들을 10초에 한명 꼴로 죽이고 있는 치명적인 질병입니다. 여러분이 이 한 문단을 읽는 동안 또 누군가가 학질에 걸려 죽어갔을 겁니다. 그 질병을 막을 수 있는 방법이 있다면, 알고서도 하지 않는 것은 큰 죄가 아닐까요?

저는 잘 모르겠습니다. 그저 인류가 새로이 손에 넣은 이 힘이 두려울 뿐입니다.

캠리브지 대학의 연결과구에 따르면, 단들어이 배되열어 있는 순서는 중하요지 않다고 한다.
첫째번와 마막지의 글자 위치가 정기확하만 하면, 나지머는 엉창망진이 되어도 문없제이 읽을 수 있다.
이것은 인간의 두뇌가 문자를 일일이 인하식지 않고 단어 전로체서 인하식기 때이문다.
이 문장은 정으상적로 적은 한어국를 파썬으이로 뒤어섞본 문이장다.

하나하나 읽으려고 하는 것보다 빨리 읽으면 왠지 스르륵 읽힌다...

파이썬 코드



p.s. 이건 실제로는 캠브리지 대학의 연구결과가 아니라고 합니다. 그래도 재미있는 코딩 연습이 되었군요. 결과물도 재미있고요.

기원

from 로그/일기 2006/05/30 14:49
지속되지 않을 것은 가치없다 단정지어 삶을 욕되게 하는 일이 없기를.

무엇이 나이고, 무엇이 내가 아닌지 말할 수 있게 되기를.

나 자신과 화해할 수 있게 되기를.

'로그 > 일기' 카테고리의 다른 글

삽질중  (0) 2007/11/12
금과옥조  (2) 2007/11/11
기원  (0) 2006/05/30
사랑니  (8) 2006/04/17
봄봄봄  (0) 2006/04/04
봄날  (0) 2006/03/30