에덴의 용 by 칼 세이건

아주 유명한 작가인 칼 세이건이 쓴 뇌과학 입문서이다. (라고 생각한다)

“지능”은 어떻게 만들어지는지, 뇌와 지능의 관계는 어떤지, 옛날책인데도 불구하고 지금 읽어도 충분할만큼 내용이 충실하다.

세명의 사기꾼 by스피노자의 정신

세명의 사기꾼

스피노자의 정신 지음

성귀수 옮김

“생각의 나무” 출판

ISBN 89-8498-507-4

감상은 길지 않다. 이 책은 내가 지금껏 종교에 대해 생각해 왔던 것들을 나 대신 정리해준 책이다. 신의 본질적 속성, 종교의 유래, 진실과 거짓 등에 대해서 간결하게, 그러나 명확하게 밝히고 있다. 만약, 이 책을 읽고도 자신의 신앙심이 전혀 줄어들지 않는다면 그는 종교적으로 진실된 사람일 것이다. 이 책을 읽고서 일방적인 분노나 신성모독을 느끼기만 할 뿐이라면, 그는 그 종교에 중독된 사람 외에 아무것도 아니다.

꼭 읽기를 바란다. 읽고 싶은데 돈이 없으면 몇권 정도는 선물해줄 수도 있다.

자기 참조 구조체

VIPS를 쏜다는 말에 혹해서, 친구의 C언어 프로그래밍 숙제를 해주다가, 재미난걸 알아버렸다.

변수를 이용할 때, 구조체 안에 있는 특정 변수의 값만 필요하다면 .연산자를 쓰면 된다는 건 알고 있다. 구조체 포인터에서 그 안에 있는게 필요하면 ->연산자를 쓰면 된다.

그런데, 구조체를 이용해서 배열을 이용하면, 배열 각각의 요소를 처리하는건 쉽지만 배열의 순서나 배열을 중간에 추가하는 작업같은건 아주 어려운 작업이 된다. 이 작업을 자기참조구조체라는 개념을 이용하면 쉽게 해결할 수 있다.

선언은 간단하다. 구조체를 하나 선언하는데, 다음과 같이 선언하면 된다

struct mania

{

int a;

struct mania *next;

}

그러고나면, next라는 포인터는 mania라는 구조를 구조체를 가리키게 된다. 그럼 next는 다시 그 안에 next를 갖고 있다. 물론 이 next와 앞의 next는 내부변수이므로 서로 구별되고, 다른 주소를 가리키게 되므로 아무 문제 없다. 문제는 가장 마지막 변수에서 생기는데, 마지막 변수는 next가 없으므로 에러가 난다. 따라서, 최초에 선언할 때 next를 NULL로 초기화를 해 두면 괜찮다.

우선, 제일 처음 구조체를 선언할 때 다음과 같이 해 준다.

struct mania dummy; //임시 시작점이다.

struct mania *start=&dummy; //시작점의 주소를 start라는 포인터에 넣는다. struct mania *sequence; //실제로 우리가 사용할 포인터이다.

struct mania *work; //작업용 포인터

그럼, 이제 첫 세팅을 해보자.

start=&dmy;

start->next=NULL;

처음엔 당연히 아무것도 없으므로 NULL이다.

여기에 뭘 넣기 전에, 일단 next에 해당하는 녀석의 메모리를 확보를 해 둘 필요가 있다. 메모리의 확보는 malloc, calloc같은 함수로 한다.



[각주:

1

]



sequence=(struct mania *)malloc(sizeof(struct mania));

이렇게 하면 sequence라는 이름의 mania구조를 가진 포인터에 sizeof(struct mania)만큼의 크기를 가진 메모리가 할당된다. 그런데, 이건 딱 한개만 확보하는 것이므로 체인의 고리를 만들어 나갈 때는 만들 때마다 메모리를 할당해야 한다. 이 점에 주의해서 문제를 잘 해결해 보기 바란다.

아무튼, 이걸 이용하는 개념은 다음과 같다.

제일 처음에 start포인터를 사용한다.



[각주:

2

]




start->next는 start포인터 뒤에 있는 녀석이다.

물론 start->next->next는 start포인터의 뒤에뒤에 있는 녀석이다.

sequence는 체인의 가장 끝에 있는 녀석이다.

이제, next의 포인터를 적당히 지정해주기만 하면 체인을 이리저리 연결할 수 있다.

가령, 두번째 체인을 세번째 체인과 바꾸고 싶다면?

적당한 mania구조를 가진 temp를 지정하고

struct mania temp;

temp=start->next->next;

start->next->next=start->next;

start->next=temp;

이런식으로 하면 두번째와 세번째가 바뀐다.

자, 나머지는 잔머리다! (무책임 -_-;)

  1. 난 말록, 콜록, 뭐 이렇게 읽는다. calloc은 “씨-얼록”으로 읽는게 맞다는데, 뭐 알아들으면 되지 않겠는가.

    [본문으로]
  2. start, sequence, next등은 그냥 임의로 붙인 이름일 뿐이다!

    [본문으로]

함수

C언어는 함수형 언어이다. 모든것이 함수로 이루어져 있다는 뜻이다. 자세히 알아보자.

함수는 수학적으로는 집합A와 집합B가 정해져 있을 때, 다음과 같이 정의한다.

A의 원소에 B의 원소를 짝지어서 (a,b)로 쓴다. 이 경우, 모든 (a,b)의 집합의 어떤 부분집합 f는 함수이다.

만약, B의 임의의 원소 b에 대해서 (a,b)가 존재하면 f는 전사함수(surjective function, surjection)라고 부른다. 만약, B의 원소 b가 결정되었을 때, (x,b)를 만족하는 x를 모아둔 A의 부분집합의 원소가 1개뿐이면 f는 단사함수(injective function, injection)이다. 그리고 전사함수이면서 단사함수이면 전단사 함수(bijection)라고 부른다. 이건 고등학교때 배우는 쉬운 내용이므로 넘어가자.

수학적으로는 그런데, 좀 어렵다. 따라서, 좀 쉽게 정해보자. 위와 똑같은 얘기를 아래와 같이 쉽게도 할 수 있다.

a는 A의 원소이고 b는 B의 원소라고 하자. 만약 a를 결정했을 때 그와 관련된 b를 알 수 있으면, 그런 규칙은 함수라고 부른다.

만약 모든 B의 원소가 A에 있는 적어도 한 원소와 관련되는 함수는 전사함수이다. 만약 B의 어떤 한 원소로 오는 A의 원소가 유일하게 결정된다면, 그런 함수는 단사함수이다. 둘 다 되면 전단사 함수이다.

여전히 어려운가? 상관없다. C언어의 함수를 배우는데는 아무런 문제가 되지 않는다. C언어에서의 함수는 아주 간단하다.

type 함수이름(변수1, 변수2…){

함수가 할 일

return 되돌려줄 변수;

}

이런식으로 함수를 만든다. type은 int, float, double, char, void 등이 있으니 맘대로 골라쓰자. void는 return할게 없을 경우에 사용한다. 물론 입력받을게 없는 함수도 만들 수 있다. 변수에 아무것도 쓰지 말고 void만 써주면, void는 “아무것도 없다”는 걸 알게 해준다. 이런식으로 기능을 함수로 쪼개는 것은 상당히 재미있다.

내가 이 얘기를 하는 이유는, 함수라고 부르는 대상이 상당히 재미있는 일을 해주기 때문이다. 가령, 숫자 두개를 받아서 더하여 출력하는 함수가 있다고 해 보자. 그럼 함수는 변수 2개를 입력받고, 내부적으로 적당히 처리해서, 출력을 해주면 된다. 이 사실을 알려주는 것을 선언이라고 한다. 선언은 함수의 정의와는 다른데, 정의는 함수가 무슨 일을 하는지 정확히 다 알려주는 것이지만, 선언은 그냥 변수를 무엇을 받고 결과를 어떻게 내보내는지만 말해준다. 그리고, 선언과 정의를 동시에 할 수도 있다. 중요한 것은, 함수의 정의는 어디에 있어도 상관 없지만, 선언은 그 함수가 최초로 쓰이기 전에 반드시 존재해야 한다는 점이다.

이것은 솔직히 말하면 귀찮은 작업이긴 하다. 하지만 귀찮은 것을 신경쓰지 않는다면, 재미난 것을 해볼 수가 있다.

double add(double,double);

이런 식으로 선언을 했다고 하자. add라는 함수는 실수 두개를 받아서 실수를 출력하는 함수가 된다. 그럼 정의는?

double add(double a, double b){

double c=a+b;

return c;

}

이런식으로 쓸 수가 있다. 중요한건, return해주는 변수 c는 처음에 add를 정의할때 사용한 double과 같은 타입을 갖고 있어야 한다는 점이다. 이것만 주의하면 된다. 만약 add를 좀 다른 방법으로 계산하고 싶다면, 다르게 정의하면 된다.

double add(double a, double b){

double c=a+2*b+3.0;

return c;

}

이렇게 하면 우리가 원하는대로 add라는 함수가 정의된다. 아무 상관 없다.

C언어에서 알고리즘은 그래서 함수가 어떤 기능을 하는지, 그리고 그 함수를 이용해서 또다른 함수를 어떻게 만들지 고민하는 과정이라고 보면 되겠다. 그런점에서 C언어는 상당히 수학적으로 구성할 수 있는 언어라고 생각한다.

수학은 최초에 무정의 용어와 그 무정의 용어의 사용법에 대한 공리Axiom가 있어야 한다. 그리고 그 공리와 무정의 용어를 이용해서 다른 정리들을 증명해 간다. C언어는 함수가 사용되기 전에 선언되지 않으면 사용할 수 없다. 그리고 선언되기만 하고 정의되지 않으면 사용할 수 없다. 수학에서도 알려지지 않은 정리는 사용할 수 없으며, 추측으로 그럴듯해 보이더라도 기존의 정리들로부터 증명되지 않으면 사용할 수 없다. C언어에서 무정의 용어와 공리계에 해당하는 것은 standard C의 문법 체계와 기본적인 라이브러리에 해당할 것이다.

이산화탄소는 줄어들 것이다

최근 일어나고 있는 심각한 기상이변들 중에 아주 많은 부분은 지구 온난화로부터 그 원인을 찾을 수 있다. 그리고 지구 온난화의 원인은 온실효과이며, 온실효과를 일으키는 기체중에서 인간의 영향을 가장 많이 받은 기체는 이산화탄소이다. 그리고 이산화탄소를 가장 많이 배출한 연료는 단연 화석연료이다.

반면에, 화석연료는 석유가 수십년, 석탄이 수백년 사용할 분량밖에 남지 않았다고 알려져 있다. 수억년만에 만든걸 수백년만에 써버리니, 인간이 엄청나게 많이 사용한다는 느낌이 들긴 한다. 아무튼, 중요한건 500년쯤 뒤에는 더이상 태울 연료가 없다는 점이다. 따라서 그때는 화석 연료 사용이 확실하게 중단된다. 그 결과로 이산화탄소 배출량은 강제로 줄어들 것이고, 온실효과는 원래 지구 수준으로 돌아가게 된다. 이것은 인류가 산업혁명을 일으킨지 1000년만에 정상으로 돌아가는 것이라고 할 수 있다. 1000년은 지구가 살아온 45억년과 비교하면 겨우 0.001%조차 되지 않는 짧은 시간이며, 인간이 살아온 100만년과 비교하면 0.1%정도 되는, 여전히 짧은 시간에 불과하다.

따라서, 지구에는 별다른 영향 없이 지구 온난화 문제는 저절로 해결된다.

아, 그럼 내 의견은 지구 온난화 대비를 안해도 된다는 주장이냐고? 그럴리가 있나.

지구 온난화 문제가 저절로 해결되는건 지구 전체의 관점이고, 그때까지 우리 인류가 멸종하지 않으려면 열심히 노력해서 인간의 맘에 들지 않는 날씨들, 전문용어로는 “기상 이변”이라 부르는 기상 현상들을 없애지 않으면 안 될 것이다.

마치 “나 없으면 지구는 누가 지키지?”라는 생각과 마찬가지로, 기상 이변이나 지진 같은게 일어나면 지구 최후의 날이라는 그럴듯한 제목을 붙이는 사람들이 있는데, 전부 헛소리다. 기상이변이나 지진같은게 일어나도 지구는 끄떡 없다. 그런다고 지구가 자전을 멈추지도 않으며 공전을 ‘m추지도 않을 것이며 심지어 사라지지도 않을 것이다. 별일 아닌 것이다. 인류가 완전히 멸종해도, 그것은 수억년전 지구에 아주 많은 개체가 살았던 공룡이 없어진 것과 마찬가지로, 수억년 뒤의 어떤 생명체에게는 그냥 수억년전에 살았던 어떤 아주 많은 개체를 가진 종이 갑자기 사라진 것으로 보일 것이다. 그리고 그들도 생각이 있다면 온난화를 대비하겠지.

참고로, 종의 멸종은 자연계에서 굉장히 흔히 일어나는 일이라는 점을 알아 두자.

이젠 자동 8단 변속기인가…

오늘도 이상한 기사를 하나 읽었다.

자동 8단 변속기가 등장했다는 기사인데, 기사 자체는 뭐 그렇다 쳐도, 오해의 소지가 있길래 적어둔다. 일단 원문 링크는 아래 있다.


http://news.chosun.com/site/data/html_dir/2007/02/13/2007021301012.html

그림을 보면, 4단 변속기를 가진 차가 8단 변속기를 가진 차보다 언덕을 못 올라가는 것처럼 묘사되어 있다. 그건 그냥 그림일 뿐이고, 본문을 다 읽어야 그림을 이해할 수 있다. 본문에는

따라서 같은 엔진을 장착한 자동차라도 단이 많은 변속기가 있으면 가속력과 연비가 더 좋다. 급경사를 올라갈 때 계단 수가 많으면 올라가기 쉬운 것과 비슷한 이치다.

라는 친절한 설명이 붙어 있다.

근데, 신기한건, 틀린 내용은 하나도 없는데 왜 굳이 오해가 생길 수 있는 삽화를 넣었는지 모르겠다. 아니면 내가 인용한 부분의 설명문을 삽화의 주석으로 달아두거나 했으면 좋았을텐데.

추가 : 일취님 트랙백 읽고 잠시 생각해본 결과, 급경사를 올라갈 때 계단수가 많으면 올라가기 쉬운건 맞다. 문제는, 계단수가 너무 많으면 효율이 떨어진다 -_-;; 1단이나 2단일때는 작은 기어가 큰 기어를 돌리게 되므로 힘이 좋고, 점점 단이 올라갈수록 큰 기어가 작은 기어를 돌리게 되는데, 만약 저속일때 높은 단을 사용하게 되면 엔진에는 엄청나게 큰 토크가 걸리게 되므로, 아마 한계 토크를 벗어나서 엔진이 고장나 버릴 것이다. 물론 자동 변속기니까 그럴일은 없겠지만.

가속력과 연비가 더 좋아지는건 어디까지나 “고속주행”인 경우라는 점이 포인트. 대략 100km/h를 넘어가면 5단을 넣고 달리라고 하는데, 8단까지 넣으려면 아무래도 100km/h이상 달려야 하지 않을까? 그럼 대한민국 도로의 특성상 그렇게 빨리 달리면 두가지 경우중의 한가지를 당할 확률이 대단히 커진다.



[각주:

1

]



  1. 과속으로 걸린다
  2. 다른차에 충돌한다

어느쪽이든 뼈아픈 손실이 될 테니 속도를 너무 높이는 것은 좋지 않은 일일 것이다. 그러므로, 우리나라에서는 8단 기어변속기가 들어와도 제대로 성능을 발휘하기란 쉽지 않은 일이다.

  1. 둘 중 어느 하나를 당할 확률 자체는 그다지 크지 않겠지만

    [본문으로]

gaim 2.0과 gimp2.2 같이 쓰기

나처럼 윈도우를 리눅스처럼 사용하는 사람에게는 gaim과 gimp는 둘 다 중요한 유틸리티이다. 하지만, 둘 다 윈도우에서 최신버전으로 설치하려들면 gtk버전이 충돌해서 둘 중 하나를 버려야만 하는 상황을 마주치게 된다.

자세히 살펴보면, gimp보다는 gaim의 gtk버전이 더 높은 것을 알 수 있다. 그럼 gimp를 먼저 깔고 gaim을 나중에 깔면 gtk가 저절로 업그레이드 될테니 해결되지 않나? 라는 의문이 들겠지만, 내 실험 결과, 해결 안된다 -_-;

그래서, 잘 살펴보면 gimp를 띄울 때

libexpat.dll을 내놔!

라고 얘기하는 걸 볼 수 있다. 그런 파일이 없다는 건가? 하지만 gimp를 설치하면 있는데? 음…

그래서 여기저기 뒤져본 결과, 원인을 알았다. libexpat.dll이 xmlparse.dll로 이름을 바꾼 것이다. 아마 리눅스에서는 symbolic link로 해결되었을 문제겠지만, 윈도우에서는 symbolic link가 아니라 “바로가기”이므로 그런게 될 리 없다. 따라서, 못찾는다 -_-;

해결 방법은 간단하다. 그냥 xmlparse.dll을 libexpat.dll으로 이름을 바꿔주면…

곤란한 일이 발생한다. 아마 gaim이 제대로 안 돌아갈 것이다. 그럼? 당연히 둘 다 있으면 되는 거다. xmlparse.dll을 libexpat.dll로 복사해두면, 아무튼 같은 역할을 하는 파일이 두개 있긴 하지만, 소스를 다시 컴파일해서 libexpat.dll이 아니라 xmlparse.dll을 찾으라고 gimp에게 알려줄 정도의 해커가 아닌 한 그냥 이게 가장 속 편한 방법이 될 것이다.

*gaim은 AOL과의 상표권 분쟁으로 pidgin으로 개명하였다. 공식 홈페이지는 pidgin.im 이며, 현재 2.0 정식버전이 공개된 상태이다.

태터툴즈 건의사항

태터툴즈에 건의사항이 생겼다.

태터센터에서, “글” 탭에 있는 “트랙백” 메뉴에서 내가 받은 트랙백 말고 보낸 트랙백도 보였으면 좋겠다. 상단-하단 구별이나 카테고리로 만들어서 구별할 수 있으면 편리할 것 같다.

그리고 트랙백은 왜 단방향인지 모르겠다. 누군가 트랙백을 받았을 때, 자동으로 트랙백을 쏘는 설정을 넣을 수는 없을까? 강제로 양방향 트랙백은 좀 너무하고, 자동으로 트랙백이 가도록 했으면 좋겠다. 그렇게 되면 스팸 트랙백 퇴치라는 부수적인 효과도 있다 -_-;;

정치와 종교, 난 둘 다 싫던데

도올 선생이 하신 말씀이 요새 파문을 부르고 있나보다. 그 참에 나도 낚시글 하나 써보자.

앞서의 내 글에서도 여러번 밝힌 바가 있지만, 난 기독교나 개신교쪽 계열 종교들을 별로 좋아하지 않는다.



[각주:

1

]



그런데 올블에 올라오는 글들을 쭉 보고 있으면, 종교가 정치에 개입하는게 맞느냐 틀리느냐에 집중이 되어 있다. 그건 내게 중요한 문제가 아니다. 내게 있어서 가장 중요한 문제는

정치가 종교를 강요하느냐 아니냐

이다. 성경에 쓰인 얘기대로 나라를 통치하건 말아먹건 그건 상관 없다.



[각주:

2

]



유교 사상이 지배하든 불교 사상이 지배하든 세상은 어차피 굴러간다. 하지만 개신교나 기독교의 경우에는 얘기가 다르다. 둘 사이에 뭔 차이가 있는지는 모르겠지만, 지독하게 내게 뭔가를 강요했다는 건 기억한다. 그런데 그 독실한 신자가 대통령이 된다면, 국민 전체에게 지독하게 뭔가를 강요할 거라는 생각이 든다. 아, 그럴리야 없겠지만, 이건 단순히 내 추측일 뿐이다.

난 특정 대권 후보를 지칭하려는 게 아니다. 설령, 모두가 예상하는 바로 그 사람이 아니라 전혀 다른 사람이 대선에서 당첨되더라도, 그가 내게 종교를 강요한다면 그는 정치권의 쓰레기다.

내게 필요한 것은 신의 사랑이 아니라 인간의 사랑이다.

  1. 난 그들이 사는 천국에 비굴하게 신에게 빌어서 가지는 않기로 결심했다.

    [본문으로]
  2. 한가지 예를들면, 미국의 대통령 G. Bush는 성경에 쓰인대로 통치해서 이라크도 공격하고 북한도 굶기고 나중엔 이란도 공격한댄다. 미친새끼

    [본문으로]

존재

데카르트가 그랬다. 끊임없는 회의 속에, 자신의 존재마저 불투명할 때, 자기는 생각하니까 존재한다고. 그것만은 결코 의심할 수 없는 진실이라고 했다.

나 역시 그건 사실이라고 생각하긴 한다. 그런데, 나를 생각하게 하도록 하는 “존재”는 내가 아닐 수도 있다는 회의가 드는 것은 피할 수가 없다. 그것은 정말로 나의 자유의지인 것일까?

이런 의문은, 내 마음이 실제로 내 마음대로 되는 것이 아니기 때문에 드는 생각이다. 나는 과연 “나”인가?

내 감정과 마음은 내가 원하는 대로 생각되지가 않고, 항상 다른 방향으로 생각하게 된다. 그리고 나와 가장 타협과 협상을 잘 하는 사람은 바로 나 자신이다. 내가 다른 사람과 타협할 때는 어떻게든 얻어내고 나한테 이익이 되도록 협상을 하는데, 나 자신과는 손해가 되더라도 결국 타협에 넘어가고 만다.

음…

어쩔 수 없다. 모두가 내 머릿속에서 일어나는 일이니까.

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑