2005년 5월 31일 화요일

Local Network interface 얻기

man if_tcp
http://www.scit.wlv.ac.uk/cgi-bin/mansec?7P+if_tcp

소스코드
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>

#define inaddrr(x) (*(struct in_addr *) &ifr->x[sizeof sa.sin_port])
#define IFRSIZE ((int)(size * sizeof (struct ifreq)))

static int get_addr(int sock, char * ifname, struct sockaddr * ifaddr)
{
        struct ifreq *ifr;
        struct ifreq ifrr;
        struct sockaddr_in sa;

        ifr = &ifrr;

        ifrr.ifr_addr.sa_family = AF_INET;

        strncpy(ifrr.ifr_name, ifname, sizeof(ifrr.ifr_name));

        if (ioctl(sock, SIOCGIFADDR, ifr) < 0) {
                printf("No %s interface.\n", ifname);
                return -1;
        }

        *ifaddr = ifrr.ifr_addr;
        printf("Address for %s: %s\n", ifname, inet_ntoa(inaddrr(ifr_addr.sa_data)));
        return 0;
}

int main(void)
{
        unsigned char *u;
        int sockfd, size = 1;
        struct ifreq *ifr;
        struct ifconf ifc;
        struct sockaddr_in sa;


        if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) {
                fprintf(stderr, "Cannot open socket.\n");
                exit(EXIT_FAILURE);
        }

        ifc.ifc_len = IFRSIZE;
        ifc.ifc_req = NULL;

        do {
                ++size;
                /* realloc buffer size until no overflow occurs */
                if (NULL == (ifc.ifc_req = realloc(ifc.ifc_req, IFRSIZE))) {
                        fprintf(stderr, "Out of memory.\n");
                        exit(EXIT_FAILURE);
                }
                ifc.ifc_len = IFRSIZE;
                if (ioctl(sockfd, SIOCGIFCONF, &ifc)) {
                        perror("ioctl SIOCFIFCONF");
                        exit(EXIT_FAILURE);
                }
        } while (IFRSIZE <= ifc.ifc_len);

        /* this is an alternate way to get info... */
        {
                struct sockaddr ifa;
                get_addr(sockfd, "ppp0", &ifa);
        }

        ifr = ifc.ifc_req;
        for (;(char *) ifr < (char *) ifc.ifc_req + ifc.ifc_len; ++ifr) {

                if (ifr->ifr_addr.sa_data == (ifr+1)->ifr_addr.sa_data) {
                        continue; /* duplicate, skip it */
                }

                if (ioctl(sockfd, SIOCGIFFLAGS, ifr)) {
                        continue; /* failed to get flags, skip it */
                }

                printf("Interface: %s\n", ifr->ifr_name);
                printf("IP Address: %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));

                /*
                This won't work on HP-UX 10.20 as there's no SIOCGIFHWADDR ioctl. You'll
                need to use DLPI or the NETSTAT ioctl on /dev/lan0, etc (and you'll need
                to be root to use the NETSTAT ioctl. Also this is deprecated and doesn't
                work on 11.00).

                On Digital Unix you can use the SIOCRPHYSADDR ioctl according to an old
                utility I have. Also on SGI I think you need to use a raw socket, e.g. s
                = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP)

                Dave

                From: David Peter <dave.peter@eu.citrix.com>
                */

                if (0 == ioctl(sockfd, SIOCGIFHWADDR, ifr)) {

                        /* Select which hardware types to process.
                        *
                        * See list in system include file included from
                        * /usr/include/net/if_arp.h (For example, on
                        * Linux see file /usr/include/linux/if_arp.h to
                        * get the list.)
                        */
                        switch (ifr->ifr_hwaddr.sa_family) {
                                default:
                                printf("\n");
                                continue;
                                case ARPHRD_NETROM: case ARPHRD_ETHER: case ARPHRD_PPP:
                                case ARPHRD_EETHER: case ARPHRD_IEEE802: break;
                        }

                        u = (unsigned char *) &ifr->ifr_addr.sa_data;

                        if (u[0] + u[1] + u[2] + u[3] + u[4] + u[5]) {
                                printf("HW Address: %2.2x.%2.2x.%2.2x.%2.2x.%2.2x.%2.2x\n",
                                u[0], u[1], u[2], u[3], u[4], u[5]);
                        }
                }

                if (0 == ioctl(sockfd, SIOCGIFNETMASK, ifr) &&
                strcmp("255.255.255.255", inet_ntoa(inaddrr(ifr_addr.sa_data)))) {
                        printf("Netmask: %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));
                }

                if (ifr->ifr_flags & IFF_BROADCAST) {
                        if (0 == ioctl(sockfd, SIOCGIFBRDADDR, ifr) &&
                                strcmp("0.0.0.0", inet_ntoa(inaddrr(ifr_addr.sa_data)))) {
                                printf("Broadcast: %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));
                        }
                }

                if (0 == ioctl(sockfd, SIOCGIFMTU, ifr)) {
                        printf("MTU: %u\n", ifr->ifr_mtu);
                }

                if (0 == ioctl(sockfd, SIOCGIFMETRIC, ifr)) {
                        printf("Metric: %u\n", ifr->ifr_metric);
                }
                printf("\n");
        }

        close(sockfd);
        return EXIT_SUCCESS;
}

apache에서 자신의 계정 밑에 있는 파일들이 access 안될때.

에러 종류 : 403 Fobidden

해결책
. /etc/apache/httpd.conf 파일
. home(~) 디렉토리의 permission
. ~/public_html 디렉토리의 permission
. home을 symbolic link했다면 symbolic link의 permission
. /etc/passwd에서 자신의 홈이 symbolic link인지 정상적인 directory인지 확인
  symbolic link이면 symbolic link를 resolve한 디렉토리명 적기

cvs를 이용하는 툴들 - cvsweb, cvshistory

http://www.jamwt.com/CVSHistory/

http://www.freebsd.org/projects/cvsweb.html

BLOB - Binary Large Object

Oracle에서 쓰이는 data type

http://www.ibexpert.info/documentation/%20%203.%20Database%20Objects/%20%203.%20Field/%20%203.%20Data%20Type/%20%201.%20Blob%20-%20Binary%20Large%20OBject/388.html

ntohs, htonl, htons

convert values between host and network byte order
_NTOHS
_HTONL
_HTONS

http://www.bug-br.org.br/pipermail/bedevtalk/2004-August/001806.html

Lock이 잘 동작하는 지 test하는 방법

1. lock이 걸리는 변수와 걸리지 않는 변수를 같이 setting한다.
2. 많은 thread를 띄운다.
3. lock을 건다.
4. 두 개 모두 값을 임시 변수에 각각 넣는 다.
5. 시간을 끌거나 context switching을 여러번 시킨다.
    복잡한 loop를 돌거나, loop 중간에 sched_yield() 같은 함수를 넣는 다.
6. 임시 변수의 값을 증가시켜 대입한다.
7. lock을 푼다.
8. 값을 찍는 다.
9. 위의 과정을 반복한다.

C언어 문자열 대입(String assign)

char* str;
str = (char*)malloc(2 * sizeof(char));

1. str = "S"
2. str[0] = 'S';
    str[1] = '\0';
3. strcpy(str, "S");
4. strdup(str, "S");

1번은 "S"라는 literal이 가리키는 주소(statically allocated constant)를 str에 집어넣어버린다.
http://groups.google.co.kr/group/comp.lang.c/browse_thread/thread/66a16943b9cacc4/c7f6147134e6428f?q=c+string+assign&rnum=1&hl=ko#c7f6147134e6428f
따라서 위에서 이미 할당해 준 메모리에 대해 Memory leak이 발생한다.

2번은 새로운 주소를 넣지 않고 이미 할당받은 곳에 "S"라는 문자열을 집어넣는 것이다.

3번은 2번과 같은 결과를 가져온다.

4번은 새 메모리를 할당하고 "S"를 넣는 다. 1번처럼 memory leak이 발생한다.


char *str = "A";
str[0] = 'B';
str[1] = '\0';

segmentation fault를 낸다.
str이 가리키는 "A"가 들어있는 공간은 statically allocated constant가 들어있으므로 값을 변경할 수가 없다.

참고) statically allocated constant를 가리키고 있을 때 free를 부르면 behavior를 예상할 수 없다.
        (segmentation fault가 나기도 한다.)


string에 새로운 내용을 넣을 때는 function call시 pointer를 쓰고
string의 새로운 공간을 할당하기 위해서는 pointer of pointer를 쓴다.
http://groups.google.co.kr/group/comp.lang.c/browse_thread/thread/9c6dcd4f43190b20/6cdac8fc4afca9e1?q=c+string+assign&rnum=2&hl=ko#6cdac8fc4afca9e1

[기사]명동 상인들 “장사안돼 간판 바꾸기 바빠”

http://ucc.media.daum.net/uccmix/news/economic/industry/200505/30/seoul/v9213645.html?u_b1.valuecate=4&u_b1.svcid=02y&u_b1.objid1=16602&u_b1.targetcate=4&u_b1.targetkey1=17153&u_b1.targetkey2=9213645


불경기든 호경기든 간판 장사가 제일인 것 같다.
그럭저럭이 제일 안 좋다고나 할까..

[기사]"보라색 붉은색 빛나는 물고기 유전자조작 열대어 시판 논란"

http://ucc.media.daum.net/uccmix/news/economic/industry/200505/31/donga/v9215560.html?u_b1.valuecate=4&u_b1.svcid=02y&u_b1.objid1=16602&u_b1.targetcate=4&u_b1.targetkey1=17153&u_b1.targetkey2=9215560&_right_topic=R3


많이 잡아먹으면 사람도 형광색이 될까?
밤에 밝아서 좋겠다.
군대도 면제 받을 것 같고..

[기사]20-30대 직장인 34% `취업 반수생(半修生)&#039;

http://ucc.media.daum.net/uccmix/news/society/affair/200505/31/yonhap/v9215645.html?u_b1.valuecate=4&u_b1.svcid=02y&u_b1.objid1=16602&u_b1.targetcate=4&u_b1.targetkey1=16668&u_b1.targetkey2=9215645


나도 취업 반수생으로 분류해야 겠군.
(예비 실업자로 분류할까?)


 

2005년 5월 30일 월요일

[tech]signed char, unsigned char

문자열을 저장할 때 어떤 곳에서는 signed char를 쓰고
다른 곳을 unsigned char를 쓰는 데 이유를 모르겠다.


오늘의 두번째 삽질이다.
처음에는 그냥 casting하면 잘 되리라고 보고 그렇게 했는 데.
출력 결과가 안나와서 당황했다.
메모리가 꼬여서 값을 아예 안 넣는 줄 알았다.
사실은 제대로 값을 넣고 있었지만 casting이 잘못된 것이었다.


결국 소스의 모든 부문의 문자열을 signed char로 바꿨다.
(C언어에서는 주로 signed char*를 쓰는 것 같고, 어떤 snmp 모듈은 unsigned char*를 썼다.)


signed char* <-> unsigned char* casting은 어찌되는 지 궁금하군.

[tech]iterator

오늘은 iterator 때문에 삽질을 했다.
STL iterator는 increment를 하면 변수 내부값이 변하는 데,
우리팀의 library는 increment를 하면 변수 내부값도 증가하고
끝인지는 return값으로 확인해야 한다.


std::vector::iterator it;
while(it != 끝)
{
    이짓저짓
    it++;   
};


우리꺼::vector::iterator it;
it.open();
// iterator의 open, close도 필요하다.
ret = it.next(); // 시작할 때도 한 번 next해줘야 한다.
while(ret)
{
    it.이짓저짓
    ret = it.next();
};
it.close();


그것도 모르고 return값을 그냥 버렸더니, 무한 루프 돌다가
boundary를 넘어서 계속 core dump를 했다.

mantis - php/MySQL/web based bugtracking system

http://www.mantisbt.org/

apache + mysql + php 설치하기
mysql 계정, DB만들기

cd ~/public_html/ilashman
tar xzvf mantis-1.0.0a2.tar.gz
cd sql
mysql -u 계정 -p암호 디비명 < db_generate.sql
http://호스트명/~계정명/mantis-1.0.0a2/
Signup

e-mail을 받고 그 안에 적힌 url을 클릭하고 암호를 2번 입력하면 활성화 됨

http://호스트명/~계정명/mantis-1.0.0a2/admin/check.php 에서 상태확인

기본 계정 : administrator/root

다른 계정을 만들고 권한을 administrator로 만든 후
administrator계정은 disable하고 protected도 끔.

admin 디렉토리도 지움
$ rf -rf admin

관리 -> 프로젝트 관리 -> 새로운 프로젝트 생성

요약
날짜별로 1,2,3,7,30,60,90,180,365일 동안 올라온 것이 나옴.

뉴스 편집 -> 뉴스추가
헤드라인, 본문을 적으면 첫화면 공지사항으로 올라감.

[펌]미래를 만드는 사람, 앨런 케이

http://www.zdnet.co.kr/news/column/hotissue/0,39024748,39136712,00.htm


OOP도 만들고, Turing Award도 받았다.
Lisp, Simula에 감동받아서 Small Talk를 만들었다.


 


 

숨겨진 비용

세상에는 쉽게 알아 볼 수 있는 가격이 있는 반면에
알기 어려운 추가적 비용들이 많이 있을 때가 있다.


재산의 가치는 소유를 나타내지만
재산의 양과 특성에 따라 보유를 위해 비용 부담이 필요하다.
기업에서는 고정비용이라고 부르는 부분이 있다.
공장을 짓거나 사무실을 가지거나 무슨 물건을 가지고 있을 때,
그것들을 놓아둘 공간이 필요하다. 공간 = 부동산 = 돈이 필요


사실은 집에서도 마찬가지다.
누군가가 내게 100만원짜리 물건을 선물로 주었다고 치자.
그냥 줬다고 해도 그것은 공짜가 아니다.
그것이 부피가 매우 큰 물건이라서 100만원어치 이상의 공간을
차지한다고 치면 받지 않는 편이 낫다.
(서울 아파트는 1평에 500~1000만원이다.)


누가 내게 100억짜리 비행기를 줬다고 치자.
나는 그것을 가지고 있을 수가 없다.
내 연봉이나 재산보다 더 큰 비용이 비행기의 공간, 세금, 보험 등에
들어갈테니까.
소유권이 이전되는 즉시 팔던지, 비행기를 담보로 다시 돈을 빌리던지,
작은 비행기 업체를 차려서 운영해서 수입을 올려야 한다.


누가 내게 공짜 시사회 표를 줬을 때도 비슷하다.
그 표는 분명 7,000원짜리지만 거기에 가기 위해 1~2시간의 시간과
차비가 소요된다고 치면 10분거리에 있는 영화관에서 돈을 내고
보는 게 더 싸기도 하다.


아주 가끔 사람들은 상속과정 중에서 파산하기도 한다.
빚은 상속포기가 가능하지만 다른 예도 있다.
어떤 집을 물려 받기로 했는 데, 세금이 많이 나왔다.
상속 얼마 후 집 값이 폭락하면 원래 집 값에 대한 상속세보다 시가가
떨어져서 망할 수도 있다.


비슷한 예는 군사적으로도 많이 있다.
이론적으로는 수가 많은 군대가 이기낟.
하지만 너무 군사의 수가 많다면 비용 부담이 커져서
전투가 벌어지기 전에 굶어죽을 수도 있다.
고구려, 고려, 조선 등의 한반도 국가들의 전략을 보면
항상 중국의 군대가 대규모로 쳐들어왔을 때는
성에 숨어서 그들이 보급이 떨어질 때까지 버텨서 스스로 물러나게 했다.


오픈 소스도 마찬가지다. 소프트웨어가 공짜라고 해도
서비스, 설치, 관리, 교육 등의 비용을 여전히 부담해야 한다.
그래서 소프트웨어를 돈 받고 파는 MS같은 회사도 안 망한다.


TV 광고 시청도 비슷하다.
공중파는 공짜 같아 보이지만 우리는 많은 것을 지불하고 있다.
물건을 살 때마다 거기에는 마케팅 비용이 포함되어 있다.
또한 광고를 보느라 내가 원하는 것을 하지 못하게 된다.
(스팸메일은 더 극단적인 예다. 메일을 열고 지우는 데 시간이
 많이 소모된다.)

2005년 5월 29일 일요일

공무원, 경찰, 소방관 계급

공무원 계급

대통령
국무총리
장관,차관
차관보
1급공무원 관리관
2급공무원 이사관 : 국장급
3급공무원 부이사관, 부국장
4급공무원 서기관 : 과장급
5급공무원 사무관, 부서기관, 부과장
6급공무원 주사
7급공무원 주사보
8급공무원 서기
9급공무원 서기보

경찰관계급

치안총감(큰무궁화4개)

우리나라 경찰에서 제일 높으신 분이지요. 우리나라 전체 경찰조직을 대표해서 국민의 치안을 책임지고 계십니다. 현재(97년2월)는 황용하 경찰청장님이 이 계급에 해당하십니다.
 
치안정감(큰무궁화3개)

이 계급해 해당하시는 분은 총 4분이십니다. 경찰청차장, 서울경찰청장, 해양경찰청장, 경찰대학장
 
치안감(큰무궁화2개)

각 지방경찰청 다시말해서 경기경찰청과 같이 각 도에 있는 지방청의 장을 맡고 계신분입니다.
 
경무관(큰무궁화1개)

경무관이라는 말은 많이 들어보셨을 겁니다.
 
총경(무궁화4개)

경찰의 꽃이라고 하지요. 현재 경찰 조직의 최소 '행정관청'인 경찰서의 장을 맡고 계신분이십니다. 서울을 예로 들자면 매 구마다 있는 종로경찰서, 서초경찰서 등의 장을 맡고 계시지요.
 
경정(무궁화3개)

경찰서의 등급에 따라 다르긴 하지만 주로 일선서의 과장을 맡고 계신분이 여기에 속합니다. 경찰서에는 정보 ,수사, 교통, 보안, 경무등 몇가지 과로 나뉘는데 이의 장을 맡고 계신 분들이지요.
 
경감(무궁화2개)

일선 서의 과장이나 계장을 맡는 계급입니다(각 서의 급수마다 다름). 또 전경대나 기동대등, 경찰의 경비업무 등은 주로 중대단위(약 200명정도)로 구성되어 있는데 여기의 중대장을 맡고 있는 계급이지요.
 
경위(무궁화1개)

이 계급까지가 경찰간부라고 할 수 있겠습니다. 일선서의 주임이나 형사반장, 서에 따라서는 계장까지도 맡게 되는 계급이지요. 경찰대학을 졸업하거나, 일반간부 후보생 시험을 거쳐 경찰종합학교 교육을 마치면 이 계급에 임용이 되지요. 여러분이 익히 아시는 각 동마다의 파출소장이 이 계급에 속합니다. 강원도 어느 파출소는 경감이 파출소장하는 곳도 있다고도 합니다. 그리고 전경대 기동대의 소대장을 맡기도 하지요.
   
경사(봉오리4개)

이 계급부터가 비간부에 속합니다. 좀 전문적으로 들어가자면 수사경찰에는 "사법경찰관"과 "사법경찰관리"이라는게 있거든요? 사법경찰관은 경위에서 경무관까지라고 법상으로 규정되어 있지요(형사소송법) 사법경찰관리는 경사와 경장등 그 이하 계급입니다. 따라서 이계급부터가 사법경찰관리가 되는 거지요. 쉽게말해서 일단 사건이 일어났을 경우 사법경찰관은 [검사의 지휘를 받아서 수사하고, 사법경찰관리를 지휘하여] 수사를 하게 되는 구조를 취하지요. 여기에서 바로 여러분도 들어봄직했던 *수사권독립*이라는 문제가 생기게 됩니다. 파출소장을 보좌하여 국민과 가장 가까운 거리에서 여러분동네의 치안을 담당하고 있는 파출소 부소장에 해당하지요.
 
경장(봉오리3개)


순경(봉오리2개)

많이 들어보셨지요? 오해했음직한 순경=경찰 이 아니란걸 아시겠습니까? 순경은 경찰의 한 계급에 속합니다. 파출소에서 가장많은 인구?를 자랑하지요.
 
전의경(봉오리1개)

(의무경찰 , 전투경찰 줄여서) 의경,전경이란 군복무대신에 경찰에서 의무복무를 하는 대한민국의 든든한 사나이들을 말하지요. 소속에 있어 차이는 있긴 하지만 모두 같은 경찰 식구랍니다. 이 젊은이들이야말로 여러분의 안방을 굳게 지키고 있는 파수꾼이지요.

소방관계급
- 소방 총감 (消防總監)
- 지방 소방 정감 (地方消防正監)

- 소방 정감 (消防正監)
- 지방 소방감 (地方消防監)

- 소방감 (消防監)
- 지방 소방정 (地方消防正)

- 소방정 (消防正)
- 지방 소방령 (地方消防領)

- 소방령 (消防領)
- 지방 소방경 (地方消防警)

- 소방경 (消防警)
- 지방 소방위 (地方消防尉)

- 소방위 (消防尉)
- 지방 소방장 (地方消防長)

- 소방장 (消防長)
- 지방 소방교 (地方消防校)

- 소방교 (消防校)
- 지방 소방사 (地方消防士)

- 소방사 (消防士)

충정부대, 충정훈련

http://kin.naver.com/browse/db_detail.php?d1id=6&dir_id=607&docid=43570
공수부대를 중심으로 한 대도시 부근의 일반 부대.
전두환 신군부측의 폭동진압, 시위 진압용 부대.
5.18 광주에 투입됨.

농사

우리 부모님들은 농사꾼이다.
본업은 건설업, 주부 시지만 동네에 2평짜리 밭이 3개나 있다.;;
밭마다 상추, 무, 배추, 깻잎 등 야채들을 심지어 2~3개월마다 수확을 하고 있다.
사실 돈을 주고 산 땅은 아니고 우리 집 옆에 공원, 개발제한구역, 청소년 수련원,
초등학교 같은 것들이 있는 데
자투리 땅이 남아서 시청에서 몇 년간 밭으로 키워보라고 동네 사람들에게
준 것 같다.


가보니 생각보다 전문적이다.;
동네 아주머니들이 전형적인 시골 풍경으로 머릿수건을 쓰고 호미까지 들고 있다.
밭마다 경계도 노끈, 철망으로 둘러놨다. ("It's my territory")
경계선을 잘 치고 열심히 가꿔주면 자신의 것이 된다.
 
요즘 비가 안 온다고 15L짜리 물통을 2개나 가져가서 물을 줬는 데.
다 뿌렸을 때쯤 천둥과 함께 비가 왔다.
이 무슨 mother, nature의 장난인가.
 
아무튼 농사일은 구경만 해도 빡시다.
매일 물도 줘야하고 힘도 많이 써야 하고.
적절한 도구가 있다면 좀 편하게 할텐데,
도구를 새로 만들거나 체계적으로 관찰하는 것보다
성실함이 중요하다고 생각하는 사람이 더 많으니까.
내가 아버지께 곧 비가 올 것 같다고 말씀 드렸는 데도 아버지는 계속 물을 주셨다. 
 

2005년 5월 28일 토요일

[책]진중권의 미학 오디세이 1

괴델, 애셔, 바흐 라는 책을 대학 1학년 때 알게 되었다.
올해서야 읽게 되었는 데, 어려워서 얼마 읽지 못하고 덮어버렸다.
진중권의 미학 오디세이가 거의 비슷한 책이라길래 보니
훨씬 쉬운 것 같다.
진중권은 애셔 이야기만 한다.


미학 오딧세이 = GEB - 괴델 - 바흐 = GEB / 3


그리고 이번 유럽여행 때 박물관이나 유적지도 많이 볼 것 같아서
미리 공부하려고 서양 미술사 책을 샀었는 데,
서양 미술사 책보다 미학 오딧세이가 훨씬 읽기 쉬운 것 같다.

설명도 쉽고, 플라톤과의 대화 등.. 재미있는 부분이 많다.



2005년 5월 27일 금요일

은박지를 이용한 봉투 묶기

비닐 속에 많은 양의 물건이 들어가면 묶기가 힘들다.
은박지를 길게 접어서 비닐을 봉할 때 같이 감는 다.
은박지가 말리면서 비닐도 쉽게 봉해진다.

쓰레기 봉투에 많은 양을 넣을 때 유용하다.

디버그 옵션에 따른 C++ 프로그램의 크기

$ cat ./inc.cpp
#include <iostream>

int main()
{
    for (int i = 0 ; i < 1000000; i++)
    {

    }

    return 0;
}

$ g++ ./inc.cpp -g -Wall -S -o ./inc.g.s
$ g++ ./inc.cpp -O0 -Wall -S -o ./inc.s

$ g++ ./inc.cpp -g -Wall -o ./inc.g.out
$ g++ ./inc.cpp -O0 -Wall -o ./inc.out

$ wc inc.s
    208     392    3311 inc.s
$ wc inc.g.s
  31507   61063  455649 inc.g.s

$ ls ./inc.out -al
-rwxrwxr-x    1 ilashman ilashman    12735  5월 27 16:03 ./inc.out
$ ls ./inc.g.out -al
-rwxrwxr-x    1 ilashman ilashman   120275  5월 27 16:02 ./inc.g.out

아주 간단한 프로그램에서 debug옵션을 넣으면 assembly code 크기는 150배,
binary 크기는 10배 커졌다.

CxO의 종류

. CEO - Chief Executive Officer
. CTO - Chief Technolony Officer
. COO - Chief Operation Officer
. CFO - Chief Finance Officer
. CHO - Chief Human Resource Officer
. CIO - Chief Infomation Officer
. CMO - Chief Marketing Officer
. CSO - Chief Strategy Officer

[기사]한전 지방이전 결정

http://news.naver.com/news/read.php?mode=LSS2D&office_id=001&article_id=0001013243&section_id=100&section_id2=266&menu_id=100


울 회사 옆에 있어서 점심 먹고 한 번 들어가 봤는 데,
테니스장도 있고 상당히 넓다.
과연 옮길까 했는 데. 정말 이전하는 군.


요즘 다들 공기업, 대기업 좋아하지만 대부분 서울이 아닌 곳으로 발령나는 경우가 많아서
합격해 놓고도 다른 회사로 간다고 한다.
한전도 그렇게 되려나..
특히 기술직들은 원자력 발전소 같은 곳에 배치되면 외딴 동네, 시골, 섬으로 많이 간다.
교사 같은 직업도 섬으로 발령날 수도 있고.

행사들

울 회사 행사들은 나름대로 재미있는 것 같다.
대학 축제보다는 약간 덜하지만 그래도 동아리 작은 모임 같을 때는 있다.


1년 단위
창립기념일
체육대회
송년회


3~6개월 단위
본부 회식 - 대게 영화 보는 것들
워크샵
팀 MT


1개월 단위
팀 회식
가끔 공원 같은 곳으로 산책가서 도시락 까먹기

풍선

오늘은 회사 창립기념일 행사를 했다.
Gimme 5에서 이종격투기와는 전혀 상관없이
영화제 컨셉으로 준비했다는 군.


입장할 때 다들 포토라인에서 사진 1~2장씩 찍고
비디오 편집해서 만들 2시간짜리 영상이랑 시상식 좀 했다.
테이블마다 4명씩 앉았다.


하지만 역시 가장 재미있었던 건 풍선.
Gimme 5 천장에 오렌지색 풍선을 수백개 매달아 뒀는 데
끈이 달려서 사람들이 쉽게 끌어 내릴 수 있게 해놨다.


다들 행사 내내 테이블에 앉아서 가지고 놀다가
나갈 때 한 뭉큼씩 가지고 나왔다.


코엑스를 지나 아셈타워로 들어오니 참 장관이었다.
600명이 풍선 수백개를 들고 지나가니 사람들이 다들 신기하게 쳐다봤다.
지나가는 꼬마들도 몇 개 주고 옆 회사 사람들도 나눠줬다.


에스컬레이터를 탈때도 풍선이 줄줄이 올라가고
엘리베이터 안도 가득 찼다.


수십억짜리 마케팅보다 이런 실내 공간에서의 풍선 마케팅이 훨씬
효과가 큰 것 같다.

[영화]스타워즈 에피소드 3 - 시스의 복수

오늘 기술본부 회식으로 보여줬다.
(오후 3시부터 땡땡이 치고)


나야 SF 광팬은 아니지만 그래도 21세기를 사는 사람으로써
스타워즈 시리즈를 봐야하는 건 일종의 의무인 것 같다.
그래서 그냥 봤다.
(공짜에다가 회사에서 보여주는 건데 당연히 봐야지.)


칼 싸움 장면할 때 깼다가 스토리 진행할 때는 졸았다.
4~6편 볼 때도 그랬던 것 같다.
대단한 영화지만 그건 막 나왔을 때 얘기고
나 같은 세대 사람들은 스타워즈 아류작을 워낙 많이봐서
특이하지 않았다.;;


3편 스토리는 다들 2편, 4~6편과 연결이 잘 되게 예상되는 내용이
그대로 나온 것뿐이라 놀라운 것도 없었다.


 

2005년 5월 26일 목요일

금기(taboo)

나이가 들면서, 글을 하나씩 써가면서 금기가 하나씩 깨지는 것 같다.
"내가 이런 걸 어떻게 해."
"이런 이야기는 해도 될까?"


나이가 들면서 이런 것들 한 번쯤 해도 아무렇지도 않다는 것도 알게되고
경제적인 기회나 사회적인 기회도 늘고 있다.
매일 글을 써가면서 용기도 얻고 있다.
내가 뭐라고 쓰던지.
"너는 틀렸어.", "그렇게 살지마"라고 말하지는 않는 다.
아무튼 글은 인터넷의 보급이나 사회가 점차 열리면서
뭐든 가능하다.


나이 먹으니 낯짝도 두꺼워지고 있다.

Google Personalized Homepage

구글 초기화면을 로그인 유저에 대해서는
자신에게 알맞게 바꾸는 기능이다.


사실 로그인 기반이라는 점만 보면 daum, cyworld등과 다를 바가 없다.


컨텐츠를 마음대로 고를 수 있다는 점은 괜찮은 것 같다.
나도 이것과 비슷한 서비스를 생각해 본적이 있다.
스킨을 맘대로 바꾸면 좋겠다고 생각했었는 데.
과연 남에게 보여주는 것도 아니고 나 혼자 보는 건데
돈을 지불할 사람이 있을 지 모르겠지만..

[영화]역도산

'바람의 파이터'의 최배달과 많이 비교되는 인물이다.
최배달이 한 5~10년 정도 세대가 일러 보이기는 하지만
둘 다 일본으로 건너간 조선사람이다.


최배달이 우직하다고 하면 역도산은 양아치로 나온다.
프로레슬링 선수답게 쇼맨쉽이 있고 성공하는 방법을 안다.
야심가라서 자신이 조선인임을 숨기고 일본인으로 살아간다.
하지만 일본에 만족하지도 않는 다. 미국으로 건너간다.
성공을 위해서 칸노 회장을 만날 기회를 얻고
패전 후 일본에 사기를 북돋을 기회를 잡는 다.
경기의 승패와 상관없이도 일본의 영웅으로 추앙받는 다.
영화도 찍고, 방송에도 출현한다.


두 영화 모두 배우 캐스팅을 잘 한 것 같다.
젊은 양동근과 여자친구 히라야마 아야 라든지.
나이가 좀 있는 설경구와 나카타니 미키라든지.


양동근은 좀 무뚝뚝하고, 설경구는 무뚝뚝하면서도 양아치 같은 면이나
얍삽하지만 야심가다운 면, 쓴 웃음.
http://movie.naver.com/movie/bi/mi/detail.nhn?code=38510&mb=c#03

[영화]Kungfu Hustle

브로드웨이 뮤지컬처럼 만들었다.
멋진 검은 양복을 차려입고 수십명, 수백명이 춤을 추는 것도 멋지고
음악도 분위기에 맞다.
그리고 주성치다운 코믹, 액션, SF.
서유기에서 보여줬던 것처럼 불교적 마무리.
필살기도 여래신장이었다.
'여래'는 불교용어다.
(http://100.naver.com/100.php?id=111748)


 

2005년 5월 25일 수요일

팀웍

같은 팀이라고 모든 것을 같이 해야만 팀웍이 있다고 할 수만은 없다.
팀은 가족이나 애인, 동호회와는 다른 존재니까.


팀웍에도 여러가지 종류가 있는 법이니까.


취미가 비슷한 사람들끼리 모일 수도 있다.
다들 커피를 좋아한다든지, 술을 좋아한다든지, 미식가라든지.


기술적 수준이 비슷할 수도 있다.
의사, 변호사처럼 같은 인증시험을 치르는 경우.


기술적 관심사가 비슷할 수도 있다.
다들 같은 언어를 좋아한다는 지,
개발 환경이 같을 수도 있다.


태도가 비슷할 수도 있다.
자기 개발을 좋아한다든지, 대박 한 큐를 노린다든지.
야근 스타일이라든지, 웰빙 스타일이라든지, 아침형 인간들이라든지.


기술적으로 조화가 잘 될 수도 있다.
방어적인 코딩을 한다든지, 대충 만들고 나중에 배를 째든지.


여러가지 자유도의 측면을 볼 수도 있다.
출퇴근 시간에 관대할 수도 있고
모든 실수에 관대할 수도 있다.
실수는 허락하지만 코딩 컨벤션이나 QA 절차, BTS사용 준수 같은 것은 보수적일 수도 있다.


------------
나는 개인주의자라서 취미까지 같아지기를 바라지는 않는 다.
너무 다 같고 하루 18시간씩 함께해야하고 주말까지 함께하는 건 숨막히다.
술 먹일 때나 놀러가기 싫을 때는 빼줬으면 한다.
주 5일, 하루 8시간도 충분히 많다고 생각하니까.
대신 코딩 컨벤션이나 QA, BTS 사용, 기술적 관심사는 비슷했으면 좋겠다.
야근, 웰빙, 아침형이든 상관없다. 내 시간만 제어하려고 하지 않는 다면 말이다.
회사 일이 힘들거나 억울하다고 느낄 때는
다른 곳에 비빌 언덕을 마련하고 싶기 때문이다.


 

[기사]당돌한 KAIST 여학생 `후원자 찾았다&#039;

http://ucc.media.daum.net/uccmix/news/society/region/200505/25/yonhap/v9173510.html?u_b1.valuecate=4&u_b1.svcid=02y&u_b1.objid1=16602&u_b1.targetcate=4&u_b1.targetkey1=17130&u_b1.targetkey2=9173510


왜 당돌한 건지 모르겠다.
돈 없어도 공부하고 싶으면 이 정도는 할 수 있는 거지.
참 용기 있는 후배다.


우리나라가 얼마나 참다운 교육에 투자를 안하고
쓸데없는 과외나 시키니
직접 편지까지 보내서 개인이 다른 개인에게 이런 짓을 하겠나.


그리고 당당하게 필요한 것을 요구할 수 있어야 과학자도 발전할 수 있다.
배고프고 연구하고 싶은 데 돈 없어서 포기하는 것 보다는
좋은 후원자를 찾으면 후원자는 좋은 곳에 투자를 한 것이니까.


중세시대 위대한 예술작품도 대부분 메디치가 같은 곳에 후원을 받아서
후원자인 메디치 가문은 명예를 높히고 예술가는 예술을 하고
다른 사람들은 그들의 좋은 작품들을 후세까지 감상할 수 있게 됐다.


투자자가 투자할 때까지 기다리고 있는 건 바보 같은 짓이다.
과학의 가치를 잘 아는 사람은 과학자니까 자신들이 먼저 나서야 한다.

C++의 메모리 공간(heap, stack)에 따른 주소

$ uname -a
Linux ob.ds.neowiz.com 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux

$ cat /etc/redhat-release
Red Hat Linux release 9 (Shrike)

$ cat /proc/cpuinfo
Intel(R) Xeon(TM) CPU 2.40GHz x 2

$ cat ./addr.cpp
#include <iostream>

using namespace std;

int main()
{
    int a = 10;
    int *b = new int();
    *b = 20;

    cout << "a : " << a << endl;
    cout << "&a : " << &a << endl;
    cout << "b : " << b << endl;
    cout << "&b : " << &b << endl;
    cout << "*b : " << *b << endl;

    delete b;

    return 0;
}
[ilashman@ob cpp_test]$ ./addr
a : 10
&a : 0xbfffdac4
b : 0x8049ce0
&b : 0xbfffdac0
*b : 20

-------------------------
IA32, linux의 경우는 stack일 때 0xbf로 시작하고 heap일때 0x80 부터 allocation을 시작하는 것 같다.
각 환경의 특성을 알아두면 메모리 관련 문제에서 디버깅할 때 변수의 주소를 찍어봐서 디버깅 할 수 있다.
예를 들어 new로 할당해서 heap에 들어가 있을 것으로 가정했는 데,
주소가 stack이라면 중간에 임시 객체가 생겨서 casting, copy constructor, assign 등이 일어났음을
암시할 수 있다.
혹은 share하는 변수(or static 변수)가 정말로 같은 곳을 가리키고 값이나 lock을 공유하는 지 알 수 있다.

C++ reference와 pointer의 주소 차이

$ cat ./ref.cpp
#include <iostream>

using namespace std;

int main()
{
    int a = 10;
    int& b = a;
    int* c = &a;

    cout << "a : " << a << endl;
    cout << "&a : " << &a << endl;
    cout << "b : " << b << endl;
    cout << "&b : " << &b << endl;
    cout << "c : " << c << endl;
    cout << "&c : " << &c << endl;
    cout << "*c : " << *c << endl;

    return 0;
}
[ilashman@ob cpp_test]$ ./ref
a : 10
&a : 0xbfffecc4
b : 10
&b : 0xbfffecc4
c : 0xbfffecc4
&c : 0xbfffecbc
*c : 10

--------------------------------------
pointer는 indirect로 주소를 가리키는 것이지만
reference는 같은 주소를 가리키는 것이다.
따라서 변수 a와 변수 b는 주소가 0xbfffecc4로 같다.

해피 해킹 키보드

http://www.funshop.co.kr/vs/detail.aspx?no=0050856006


 


우영군이 쓴다는 그 키보드.
Unix 프로그래밍할 때는 편할 것 같다.
Windows쓸 때는 좀 귀찮을 듯.


각인, 비각인 - 글자 적힌 것, 없는 것 두 가지가 있다.
무슨 무반향실의 계란판 같이 생겼다.


가격은 대략 20~30만원.
나는 그냥 저렴하게 노트북 키보드 타입으로 되서 얇은 2만원짜리를 쓰고 있다.

나무들

회사에 나무들이 많이 심어지면서
매주 인테리어 업체에서 물을 주고 흙도 관리하고
여러가지 일을 한다.


문득 영화의 한 장면이 떠오른 게, 쉬리 같다.
영화 쉬리를 보면 도청을 위해서
OP센터의 사무실에 어항을 설치하고 물고기에게 도청장치를 단다.


혹시 나무에도..


@ 영화를 너무 많이 봤구나.


 

남산 회식

삼성동 -> 교대 -> 태극당 빵집 -> 동국대 -> 수표교 -> 장충단 공원 -> 신라호텔 -> 타워호텔 -> 국립 극장 -> 남산
(봉수대, 팔각정) -> 전망 좋은 집


삼성동 -> 동국대 : 2, 3호선 or 301번 버스
버스 : 압구정까지만 막히고 그 후는 버스 전용차선을 따라 한강을 건넘
       한강을 건너면 남산이라 금방임.


동국대 가기 전에 핫도그, 귤, 과자를 사가도 됨.
(장충동 오렌지파와 마주치다. 17개에 5,000원.)


밤 10시까지 동국대에서 남산까지 올라가는 마을 버스를 타도 됨.
운전기사 아저씨가 마치 무슨 관광버스처럼 이리저리 설명도 해줌.
(공기 좋고, 한산하고..)
일방통행이라 올라가는 것만 있음.
내려갈 때는 남산도서관 쪽으로 내려감.
자가용은 국립극장까지만 갈 수 있음. 5월부터 출입통제.
걸어 올라가도 되긴 함.
올라가는 건 조금 땀나고 내려오는 건 차분하게 걸어갈만 하다.


조깅하는 사람들 약간, 데이트 하는 사람들이 좀 있음.
한적하고 가끔 자전거로 내려가는 사람도 있음.
야생동물 주의라고 적혀있는 데, 풀도 많고 상쾌함.


전망 좋은 집이라는 가게 옥상에 가면 정말 서울이 한 눈에 보임.
해가 지면 야경이 더 멋짐.
(6시쯤 가면 좋은 자리에 앉을 것 같음.)
커피만 5,000원 정도에 마실 수도 있고, 식사도 1만원 가량.
남산 돈까스가 특산물이라고 함.
(일본식 돈까스 이전에 칼질해 먹던 돈까스)
동동주, 해물파전도 1.2만원씩.
약간 춥다고 생각되면 한 층 아래로 내려가면 창 밖으로 볼 수도 있음.
50~60대 아저씨들이 서빙도 하고 계산도 함.

C++ 상속과 생성자, 소멸자 호출

Base -> Derived로 상속했을 때.

Derived class를 만들면
생성자는 항상 Base(), Derived() 순으로 호출된다.

Derived class를 Derived pointer에 넣고 delete하면
소멸자는 ~Derived()가 호출되고 ~Base()가 호출된다.

Derived class를 Base pointer에 넣고 delete하면
소멸자는 ~Derived()가 호출되고 ~Base()가 virtual이면 호출되고 virtual이 아니면 Undefined이다.

@ class를 상속할 생각이라면 소멸자는 virtual로 만들자.

참고)
Effective C++, Item 14:  Make sure base classes have virtual destructors.

2005년 5월 24일 화요일

음악 릴레이

1. 내 컴퓨터에 있는 음악 파일의 크기
   7G - 대학 때 모았음. 요즘은 안 들음.
   (어쩌면 지워졌을 지도.. 무관심)


2. 최근에 산 CD
   tape은 고등학교 때 많이 샀었음.
   CD 나온 뒤로는 사본 것 거의 없음. (mp3로 바로 넘어가서.)
   룰라 2집이 처음이자 마지막


3. 지금 듣고 있는 노래
   신부에게 - 유리상자


4. 즐겨 듣는 노래 혹은 사연이 얽힌 노래 5곡
마법의 성 - The classic
사자왕 - 이승환
Radio heaven - 이승환
Your Song - 이완 맥그리거
오페라의 유령


 

프로그래밍 공부

수학 공리를 외웠다고 해서 수학 문제를 모두 잘 푸는 것은 아니다.
초~고등학교 때를 생각해보라.
공식 외운다고 수학시험 100점 안 나온다.
(여전히 종이는 하얗고 글자는 까맣다.)


C, C++ 문법을 암기했다고 코딩이 잘 될리는 없다.
많이 풀어보고 많이 만들어 봐야한다.


남이 쓴 것도 많이 봐야한다.
뭐 그렇다고 다 되는 것도 아니다.
정석 한 권 통째로 외운다고 100점 맞는 것도 역시 아니니까.
정석에 있는 문제만 시험에 나오는 건 아니니까.
세익스피어의 4대 비극을 다 외워도 세익스피어가 될 수는 없다.
그와는 다른 글을 써야 하니까.
박경리의 '토지' 한 권 다 읽는 다고 국어에 통달할 수도 없다.
애국가 1,000번 부른다고 작곡가가 될 수도 없다.


하지만 많이 읽고 쓰다보면 수준이 많이 높아지는 건 사실이다.
어느 정도 자신의 한계나 수준을 인식하고 열심히 하는 수 밖에.


 

STL custom allocator

STL에 기본 할당자 대신 자신이 만든 것 이용하기
Effective STL ch.10, 11

예)
// SharedMemory Allocator
#include <map>
#include <string>
#include <vector>
#include <sys/types.h>
#include <sys/wait.h>
#include "mm.h"

void *mallocShared(size_t bytes)
{
    return MM_malloc(bytes);
}

void freeShared(void *p)
{
    MM_free(p);
}

template<typename T>
class SharedMemoryAllocator
{
    public:
        typedef size_t size_type;
        typedef ptrdiff_t difference_type;
        typedef T* pointer;
        typedef const T * const_pointer;
        typedef T& reference;
        typedef const T * const_reference;
        typedef T value_type;

        template<typename U>
        struct rebind
        {
            typedef SharedMemoryAllocator<U> other;
        };

        SharedMemoryAllocator() throw() { }
        SharedMemoryAllocator(const SharedMemoryAllocator&) throw() { }

        template<typename U>
            SharedMemoryAllocator(const SharedMemoryAllocator<U>&) throw() { }

        ~SharedMemoryAllocator() throw() { }

        pointer address(reference __x) const { return &__x; }
        const_pointer address(const_reference __x) const { return &__x; }

        pointer allocate(size_type numObjects, const void *localityHint = 0)
        {
            return static_cast<pointer>(mallocShared(numObjects * sizeof(T)));
        }

        void deallocate(pointer ptrToMemory, size_type numObjects)
        {
            freeShared(ptrToMemory);
        }

        size_type max_size() const throw()
        {
            return size_t(-1) / sizeof(T);
        }

        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 402. wrong new expression in [some_] allocator::construct
        void construct(pointer __p, const T& __val)
        {
            new(__p) T(__val);  // placement new
        }

        void destroy(pointer __p)
        {
            __p->~T();
        }
};

template<typename T>
inline bool operator==(const SharedMemoryAllocator<T>&, const SharedMemoryAllocator<T>&)
{
    return true; // 왜 항상 true일까?
}

template<typename T>
inline bool operator!=(const SharedMemoryAllocator<T>&, const SharedMemoryAllocator<T>&)
{
    return false; // 왜 항상 false일까?
}

//! createOnShared로 만든 type은 꼭 destructor를 명시적으로 불러주어야 한다.
template<typename T>
T *createOnShared()
{
    void *chunk_p = mallocShared(sizeof(T)); // memory chunk
    if (chunk_p == NULL)
        return NULL;
    T *shm_p = new(chunk_p) T; // placement new(new가 실제로 메모리를 잡지는 않은)
    return shm_p;
}

template<typename T>
void releaseOnShared(T *shm_p)
{
    shm_p->~T();
    void *chunk_p = reinterpret_cast<void*>(shm_p);
    freeShared(chunk_p);
}

이용)
typedef std::vector<int, SharedMemoryAllocator<int> > SharedIntVector;
MM_create(100000000, "testtest");
SharedIntVector *plv = createOnShared<SharedIntVector>();
plv->push_back(1);
printf("MM_available : %d\n", MM_available());
releaseOnShared<SharedIntVector>(plv);

이용2)
// 참고
// /usr/include/c++/3.2.2/string
// /usr/include/c++/3.2.2/bits/stringfwd.h
    typedef std::basic_string<char, std::char_traits<char>, SharedMemoryAllocator<char> > SharedStr;

    typedef std::vector<SharedStr, SharedMemoryAllocator<SharedStr> > SharedStrVec;
// /usr/include/c++/3.2.2/map
// /usr/include/c++/3.2.2/bits/stl_map.h
    typedef std::map<SharedStr, SharedStr, less<SharedStr>, SharedMemoryAllocator<SharedStr> > SharedStrMap;

    void *pChunk1;
    pChunk1 = shAlloc1.malloc(sizeof(SharedStrVec));
    SharedStrVec *shVecStr1 = new(pChunk1) SharedStrVec;

    void *pChunk2;
    pChunk2 = shAlloc1.malloc(sizeof(SharedStrMap));
    SharedStrMap *map = new(pChunk2) SharedStrMap;
    shVecStr1->push_back("1");
    shVecStr1->push_back("2");
    shVecStr1->push_back("3");
    map->insert(SharedStrMap::value_type("1", "1"));
    map->insert(SharedStrMap::value_type("2", "2"));
    map->insert(SharedStrMap::value_type("3", "3"));

    pid_t p = fork();

    if (p == 0) {
        // child
        printf("child start\n");
        shVecStr1->push_back("4");
        shVecStr1->push_back("5");
        shVecStr1->push_back("6");
        map->insert(SharedStrMap::value_type("4", "4"));
        map->insert(SharedStrMap::value_type("5", "5"));
        map->insert(SharedStrMap::value_type("6", "6"));
        printf("child end\n");
        exit(0);
    } else if (p > 0) {
        // parent
        sleep(3);
        waitpid(p, NULL, 0);
        printf("parent start\n");
        shVecStr1->push_back("7");
        shVecStr1->push_back("8");
        shVecStr1->push_back("9");
        map->insert(SharedStrMap::value_type("7", "7"));
        map->insert(SharedStrMap::value_type("8", "8"));
        map->insert(SharedStrMap::value_type("9", "9"));

        SharedStrVec::iterator it;
        for (it = shVecStr1->begin(); it != shVecStr1->end(); it++) {
            printf("%s\n", it->c_str());
        }

        SharedStrMap::iterator it2;
        for (it2 = map->begin(); it2 != map->end(); it2++) {
            printf("%s -> %s \n", it2->first.c_str(), it2->second.c_str());
        }

        printf("parent end\n");
    } else {
        // error
        fprintf(stderr, "fork() failed.\n");
    }

    shVecStr1->~SharedStrVec();
    shAlloc1.free(pChunk1);
    map->~SharedStrMap();
    shAlloc1.free(pChunk2);

    return 0;
}

placement new

이미 메모리가 할당되어 있을 때,
그 메모리에 object를 넣고 생성자를 불러줌.
(일반적인 new와는 달리 메모리를 할당하는 일은 하지 않는 다.)

소멸자도 수동으로 불러줘야 하고
메모리 해제도 raw memory에 대해서 해줘야 한다.

참고)
More Effective C++, Item 4, 8
Linux에서 gcc 3.4를 설치한 후 /usr/include/c++/3.4/ext/new_allocator.h

웰삥

웰빙 : 잘 먹고 잘 사는 방법


웰삥 : 잘 삥 뜯어먹고 잘 우려먹는 방법

문서수발실

회사가 커지니까 이런 조직도 생기나보다.
사실 network infra가 잘 되어있어서 기업의 규모에 비해
이런 것들의 필요성이 적었다.
e-mail이나 messanger, wiki page 등이 대부분의 문서와 communication을
담당했으니까.


아무튼 그렇다고 off-line문서가 전혀없을 수는 없다.
외부와의 communication은 택배, 팩스, 편지를 쓰니까.


어제 처음 본 소감은 마치 병원 약창구, 은행 수납실,
롤러스케이트장 신발 대여소 같다고나 할까.


영화도 하나 떠올랐는 데,
'허드 서커의 대리인'이라는 영화를 보면
지하에 커다란 편지 배달 부서가 존재한다.
주인공이 처음 취직한 부서다.
거기서 CEO의 편지를 Qos(Quality of Service)에 따라
거의 숭배시 하면서 꼭대기 층까지 배달한다.


 

2005년 5월 23일 월요일

사회과학

사회학, 심리학, 언어학 등을 약간씩 공부하고 있다.


자연과학은 제시되는 문제들을 대부분 clear하게 해결하는 편이다.
최소의 가정과 최소의 operation으로 말이다.
(논리의 경제성)
그리고 사회과학만큼 관점이 다양하지는 않다.
전문화되어 있고 매우 튼튼하게 건설되어 있다.
항상 실험이 가능하다.
이런 특징들 때문에 명확하지 않은 문제, 재현 불가능한 문제,
해결되지 않은 문제들에 대한 언급은 꺼리는 편이다.
항상 해결책과 방법을 중시한다.
(Problem Solving)


반면에 사회과학은 문제제기 자체가 중요하다.
대부분 실험이 불가능하고 가정도 많다.
학자의 수, 학파의 수 만큼이나 다양한 관점이 존재한다.
전문화도 약간 부족한 편이다.(General하다.)
다른 분야로 쉽게 넘나들 수 있다.
대부분의 문제가 말끔하게 해결되지 않기 때문에
해결책보다는 문제 제기가 중요하다.
그것을 통해 우리가 어떤 문제가 존재한다는 것을 인식하게 된다.
생각할꺼리를 끊임없이 제공한다.
실용적으로 봤을 때,
그것이 문제 해결책으로 이용되었을 때의
부작용과 무효성, 한계를 이해하는 데 도움이 되니까.


--------------------------------------------------------
그래서 사람들은
자연과학자를 단순한(simple, reduced) 사람.
사회과학자를 복잡한(complex) 사람이라고 부른다.


 

[기사]10만원 노트북,한국도 상륙할까

10만원 노트북,한국도 상륙할까
http://news.naver.com/news/read.php?mode=LSS2D&office_id=117&article_id=0000011261&section_id=105&section_id2=230&menu_id=105


동영상을 제외한 교육용으로 충분히 좋은 사양인 것 같다.
이게 개도국에 보급된다면 선진국보다 오히려 정보화가 빨리 되지 않을 까?


모든 학교에서 채택해서
초등학교 때부터 노트 대신 노트북 컴퓨터를 가지고 다니는 세대는
그 이전 세대와는 엄청나게 다를 테니까.
국정 교과서 종이값을 이 쪽 예산으로 돌리면 되지 않을 까?


구시대적이고 컴맹인 교사와 교수, 출판업자가 엄청나게 반발할 것 같다.


 

섬유산업

섬유산업 종사자도 2가지 분류가 있다.


이태리, 프랑스 유학을 다녀온 명품 디자이너들.
패션산업이라고 부른다.


중, 고등학교 겨우 나와 지하실에서
하루 18시간씩 재봉틀 돌리는 공순이들.
경공업이라고 부른다.



IT업도 비슷하다.
Architecture Design을 이야기하는 architect와
주당 80~100시간씩 코딩만 하는 노가다 Coder들


 


--------------------------------------------------
유럽애들이 생산성이 높은 것도 다 이런 것들 때문이다.
공장에 쳐 넣고 재봉틀 20% 더 돌리고, 코딩 20% 더 시켜봤자.
생산성 5%도 안 올라간다.
머리 좀 더 굴려서 편하고 행복하게 자기 개발하는 게 생산성이 훨씬 많이 올라간다.

[펌]Control and Communication in the Animal and the Machine

http://www.conceptlab.com/control/
큰 바퀴벌레를 잡아다가 등짝에 벨크로 달아서 붙이고
트랙볼 위에 올린 다음에 기계차를 운전하게 함.


Cybernetics네.
다람쥐를 쳇바퀴에 넣고 돌게 만드는 것보다는 훨씬 재미있을 것 같다.


등에 본드칠도 쉽게 하고, 좀 건드려도 안 다치고, 트랙볼도 잘 굴릴 수 있게
큰 바퀴벌레를 골랐나보다.

[기사]2050년 컴퓨터에 인간정신 다운로드 시킨다

http://news.naver.com/news/read.php?mode=LSS2D&office_id=005&article_id=0000205739&section_id=105&section_id2=228&menu_id=105


공각기동대와 같은 생각이네. 전뇌화.


정신이 일종의 함수(function)처럼 기계적으로 반응하는 것이라고 보는
스키너 같은 행동주의자적인 입장인가 보다.


 

사회학과 심리학

경제학에 비유하여 말하자면
사회학은 거시경제학이고
심리학은 미시경제학이다.


사회학은 커다란 집단에 관심을 두고
심리학은 개인이나 작은 집단에 관심을 둔다.


사회학은 집단이 크기 때문에 실험이 불가능하여 조사나 관찰에 집중하고
심리학은 잡단이 작기 때문에 실험을 강조한다.


 

[기사]부모 직종따라 자녀 성별 결정

http://news.naver.com/news/read.php?mode=LSS2D&office_id=001&article_id=0001009211&section_id=103&section_id2=336&menu_id=103


나는 딸 낳았으면 좋겠는 데.
직업을 보모나 컨설턴트로 바꿀까보다.


 

[책]하룻밤의 지식여행, 노암 촘스키 편

촘스키 아저씨 말씀이


인간은 innate(태어나면서 부터)하게 언어를 습득할 수 있는 기관(언어기관)을 가지고 있을 것이란다.


아마도 뇌에 잘 embedding 되어 있을 그것.


그래서 학습량이 적은 것에 비해, 어린이들은 언어를 빨리 배운다고 한다.




세상 모든 언어의 공통적인 무언가를 Universal Grammar라고 한다.


Mind-brain(사고 속)의 언어를 I-language라고 하고


외부와 communication하는 언어를 E-language라고 한다.




이것들이 촘스키의 언어 모델인데


내 생각에는 상당히 직관적이다. 맘에 드는 모델이다.


나도 이런 비슷한 방식의 모델을 생각하고 있었으니까.


http://navershop.libro.co.kr/go.php?mn=%B8%AE%BA%EA%B7%CE&url=http%3A%2F%2Fwww.libro.co.kr%2Fjoins.asp%3Fid%3DNAVERSEARCH%26pagename%3D%2Fbooks%2Fauthor_file_1.asp%3Fmcode%3D%C0%CE%B9%AE%BB%E7%C8%B8%B0%FA%C7%D0%2526scode%3D%B1%B9%BF%DC%2526aname%3D%B3%EB%BE%CF%252b%C3%CE%BD%BA%C5%B0



[기사]이통사 국제로밍서비스 &#039;&#039;불꽃경쟁&#039;&#039;

http://news.naver.com/news/read.php?mode=LSS2D&office_id=022&article_id=0000098130&section_id=105&section_id2=227&menu_id=105


나도 유럽 여행 때 로밍서비스 쓸까 생각했는 데.
아직은 너무 비싼 것 같다.


여행 준비하면서 드는 생각인데.
무선인터넷, 휴대전화, 알맵만큼 정확한 지도, 신용카드,
작은 노트북, PDA 정도 있으면
유럽도 국내 여행이랑 비슷할 것 같다.
(차 없고 잘 모른다는 점에서 마찬가지다.)
5년 쯤 뒤에 갈 때는 다 가능하겠지?


 

[기사]이동전화 통화량 줄었다

http://news.naver.com/news/read.php?mode=LSS2D&office_id=028&article_id=0000112046&section_id=105&section_id2=227&menu_id=105


메신져나 e-mail, community, blog 때문은 아닐까?
특히 전화를 많이 쓰는 10대~20대층이
다른 communication 수단을 많이 확보하고 있으니 말이다.
솔직히 약속 장소에서 누구를 만날 때 빼고는
전화가 별 필요없는 것 같다.



 

통화(Currency)

우리가 생각하기에 통화라고 하면 한국은행에서 찍어내는 돈이 생각난다.
하지만 자세히 보면 집단마다 다른 많은 것들이 통화로 쓰인다.


KAIST 학부생들에게 통화는 밥이나 야식이다.
숙제를 도와줬을 때, 소개팅을 시켜줬을 때, 이벤트에 당첨되었을 때.
모두 먹을 껄 사준다.


다른 대학들은 식권이 통화인 경우도 있다.
(KAIST는 식당이 맛없어서 식권은 가치가 떨어진다.)


네오위즈에서는 커피가 통화다.
일을 도와주거나 고마울 때는 항상 커피를 사준다.


이 집단들 모두에서 현금은 부담이 있고 그런 것들을 선호한다.


일반적인 한국 사회에서는 술이라고 할 수 있다.
뭐든 일을 도와주면 현금을 주면 뇌물이 되지만 술을 사주면
100만원이 넘어도 쉽게 받는 다.


명절에는 떡이 통화가 된다.
옆 집에 떡을 돌리면 좋아한다.


학계의 경우는 논문 인용, 연예계는 까메오 출연, Dcinside는 답글.


 

5.18

얼마전 5.18일 지났으니 한 마디 적어봐야지
우리 집안에는 5.18 당시 피해자는 한 명도 없다.
'민주화의 열망'이 뭔지도 모르겠고, 5.18 행사 하든 말든 우리 집은 그런거 참석 안한다.
운동권 인사도 한 명도 없다.


우리 집안에서 일제 시대나 6.25나 5.18 때 죽은 사람은 없다.
(내가 알기로는 없다.)
외할아버지께서는 일제에 징병 당하셨는 데,
출국 직전에 해방이 되서 다행히 전투에 투입되지는 않으셨고
6.25 때도 그 때 그 때 안전한 곳으로 미리 출장을 가 있었거나
피난을 가서 모두 살았다.
5.18 때도 마찬가지다.
엄마, 아빠 모두 광주에 사셨지만 용케 집안에만 계셨나보다.


아무튼 내게는 다음 네 사람이 모두 똑같이 나쁜 사람이다.
'도요토미 히데요시', '이토 히로부미', '김일성', '전두환'
하마터면 이 사람들 때문에 내가 세상에 나오지 못할 뻔했으니까.


광주 사람 대부분이 마찬가지다.
일본이 싫고, 공산당이 싫은 만큼 전두환이 싫다.
60년이나 지났지만 일본과 축구할 때가 제일 흥분되고
50년이나 지났지만 북한과 대치하고 있는 것처럼
25년 지난 일도 잊어버리지 않고 있다.


군국주의 우익이 아니라도 일본 사람이면 왠지 싫고
총을 들지 않아도 북한 사투리를 쓰면 왠지 간첩 같아 보이는 것처럼
전두환의 세력을 정치적 뿌리로 하고 있는 한나라당이 싫다.


일본이 상임이사국이 되는 것을 반대하고
북한이 핵을 가지는 것이 싫은 만큼
한나라당이 정권을 잡거나 의석을 확보하는 게 싫다.
지역 감정이네, 뭐네 해도 다른 건 몰라도 그건 어쩔 수가 없다.
세계화 시대라도, 일본 애니를 좋아하더라도 일본은 왠지 싫고,
많이 친해졌다고 해도 북한이 국군의 주적인 것은 변함이 없다.


일본과 북한의 예를 봤을 때
적어도 30년 안에 한나라당이 그 동네에서 의석을 얻는 일은 없을 것 같다.
무서우니까.


살인자가 감옥에서 죄값을 치우고 나와도 무서운 건 어쩔 수가 없다.
법적으로는 용서됐지만 감정적으로는 용서 할 수 없다.
다시 사람 안 죽인다는 보장이 어디 있나?
허화평, 허삼수 이런 사람들은 12.12 쿠데타, 제 5공화국 핵심 세력인데,
아직도 보수집회하면 항상 나오는 사람들이다.

차이

부모님과의 세대 차이는 왜 발생할까?
우리는 50%의 유전자를 공유하고 있고
같은 밥을 먹고 같은 곳에서 잠을 잔다.


하지만 서로 다른 성장배경과 경험을 가지고 있다.
나는 어렸을 때부터 집에 TV, 가스렌지, 다리미, 믹서기 등이 있었다.
놀이터에서 BB탄 총을 쏘는 아이들이 있었다.
내게는 태초부터 세상에 존재하는 물건이었다.
(내 탄생일 이전에 양산되었으니까.)
밥이 없어서 굶어본 적이 없다.
독재 정권을 경험해 본 적이 없다.
컴퓨터를 10살 때 처음 써봤다.
99%의 친구가 고등학교에 진학하고
70%의 친구가 대학에 진학했다.
30%의 친구가 대학원에 갔다.
고교 평준화 됐다.
대학나와도 취직 안되는 사람이 많다.
서울대 나와도 대기업 시험 떨어진다.
대학원을 가면 오히려 취직이 안된다.
하향 지원해야 한다.
형제가 하나 밖에 없어서 관심을 많이 받았다.
대학원 갈지, 말지 고민인데, 부모가 안 가면 가만 안둔단다.
제일 싼 반찬이 계란이다.
제일 싼 간식이 우유다.
전쟁 끝난지 50년 됐다.


부모님은 어렸을 때 그런 도구가 하나도 없었다.
집에는 소, 닭, 개가 있었다.
들판에 나가서 놀았다. 꽃을 보고 자랐다.
보릿고개가 있었다.
30대까지 독재자의 국가에서 살았다.
'노동운동'은 완전히 금지된 단어였다.
전화를 10살때 처음 봤다.
40살에 컴퓨터를 써봤다.
명문 고등학교가 있었다.
70%가 고등학교에 진학했다.
10%만 대학에 갔다.
주변에 대학원에 간 사람은 아무도 없다.
대학 나오면 100% 취직이 됐다.
서울대를 나오면 모두 교수가 될 수 있었다.
대학원 나오면 당연히 교수가 되야 한다.
형제가 너무 많아서 부모가 일일히 돌볼 수 조차 없었다.
첫째가 막내를 돌보곤 했다.
대학에 가고 싶었는 데, 부모가 돈이 없어서 못 갔다.
제일 비싼 반찬이 계란이다.
제일 비싼 간식이 우유다.
전쟁 직후에 태어났다.


-------------------------------------------------------
이 정도면 20대 한국인과 20대 베트남인만큼 차이 난다고 할 수 있다.
세대 차를 엄청나게 느낄 수 밖에 없다.



 

2005년 5월 22일 일요일

[Tech]Indirection

http://burks.brighton.ac.uk/burks/foldoc/89/56.htm
전산학에서 아주 중요한 개념이다.
C언어로 치면 Pointer가 이에 해당한다.
Subroutine을 쉽게 작성할 수 있게 한다.


프랙탈 모형처럼 전산학의 모든 계층에서 이와 비슷한 것들이 존재한다.
Generic Programming 기법은 type을 추상화한다.
Unix는 모든 것을 파일로 다룬다.
Virtual memory는 Memory를 linear하게 다룬다.
File structure는 storage를 file로 추상화 한다.
Device 대신 handle을 이용한다.
(예 - 파일명 대신 file descriptor나 file pointer를 이용한다.)
Mac address 대신 IP를 사용하고 IP 대신 Domain Name을 쓴다.


이러한 mapping을 통해서 하부 layer에서 많은 것을 조작하고 최적화 할 수 있다.
상부 layer는 simple해서 조작을 쉽게 할 수 있다.


하부 Layer는 garbage collection, transparency, load balancing, redirection, duplication, ignore, intercept 등을 할 수 있다.


 

질문

세상에는 곤란한 질문들이 참 많다.
요즘 내가 듣는 곤란한 질문들은 다음과 같다.
"회사 언제까지 나와?"
"옮긴 팀은 재미있어?"


물론 화자에 따라 다르긴하다.
회사 사람이 내게 "회사 언제까지 나와"라고 물으면
"이제 좀 그만 나오지"와 비슷하게 해석될 수도 있지만
회사 외부 사람이 그렇게 물으면 그런 의미는 사라진다.
회사 내부 사람이라도 1~2번까지는 그냥 그런가보다 하는 데
같은 질문을 3번 이상하면 그만 나오라는 뜻이 점점 강화된다.
(무관심이 드러나거나 뭔가 속뜻이 있다는 걸 암시하게 된다.)


"옮긴 팀은 어때?"라는 질문도
현재 있는 팀 맴버나 지난 팀의 맴버가 물으면 곤란하다.
마치 "엄마가 좋아? 아빠가 좋아?" 처럼
그대로 대답했을 때, 엄마 혹은 아빠가 서운해 할 수가 있다.
순진하게 "옮긴 팀은 괜찮아요."라고 대답한 내 동료는
1초 후 지난 팀 맴버에 의해 반격을 당했다.
"그럼 옛날 팀은 안 좋았단 말이지?"


대략 이런 곤란한 질문들에 대해서는 방어적인 대답 밖에는 없다.
인사치레같은 질문들이니까 인사치레도 대답한다.


"좀 더 다녀요."
"아직 협의 중이예요."
"아직 정해지지 않았어요."


"뭐 그냥 비슷해요."
"열심히 적응 중 입니다."


 

[책]하룻밤의 지식 여행 - 김영사

매우 얇은 백과사전 같은 책 모음이다.
무슨무슨 총서처럼.
각 분야별로 나열식으로 지식이 모여있다.


1. 촘스키(언어)
6. 사회학
7. 심리학
을 샀다.


각 권당 180페이지 정도 되고 5,800원이다.
개론 수준의 지식을 쉽게 풀어쓴 것 같아서 보기 매우 쉽다.
학교 교과서들보다 이런 책들은 깊이가 약간 부족하고
설명이 자세하지는 않지만 그래도 나은 점이 있다.


대부분 교과서는 너무 어렵고 두껍다.
머릿말만 읽어도 머리가 깨질 것 같고 수업은 졸리다.
시험에 대한 두려움 때문에 암기할 뿐, 머릿 속에 들어오지는 않는 다.
너무 많은 내용을 아무 부연설명없이 이야기해서
기초 지식 없이 들으면 아무것도 이해할 수 없다.
하얀 종이 위의 까만 글자일뿐.


이 책은 머리 아픈 머릿말 따위는 없다.
각 페이지마다 그림이 하나씩 들어가 있고
매우 가벼워서 3권을 한 손에 들어도 무겁지 않다.
좀 더 알고 싶은 내용은 인터넷 백과사전과 함께 하면 좋을 것 같다.

아이템 베이

http://www.itembay.com/
온라인 계정, 아이템 거래 사이트


Auction과 같은 시스템으로 판단다.
1. 매물을 올린다.
2. 돈을 입금한다.
3. 매물을 거래자들끼리 선물한다.
4. 양쪽의 확인을 받으면 itembay가 대금을 지급한다.


거래방법 : 사기, 팔기, 경매
게임 : 선물이 되는 거의 모든 게임(한게임, 피망도..)
서버 : 같은 서버 간에만 선물을 주고 받을 수 있을 때


이거 불법 아닌가?
물론 게임사들과는 관계 없지만
현금 -> 아이템 흐름이 아닌
아이템 -> 현금 흐름을 만들기 때문에
아이템이 일종의 칩(chip)이 된다.


아무튼 상당히 major한 것 같다.
주식회사에다가 은행도 3군데랑 계약했고 규모도 크다.


증권거래소처럼 통계도 보여준다.


울 회사 요구르팅이 오픈했는 데,
어떤 사람들은 자기들이 만든 게임이 이런 음지 사이트에도 등록된 걸보니
어느 정도 시장에서 성공한 것으로 보기도 하는 군. 훗~

[기사]토목공학도들의 동전 쌓기 놀이 열풍

http://news.naver.com/news/read.php?mode=LSD&office_id=105&article_id=0000001884&section_id=104&menu_id=104
전공을 멋지게 살리는 재미있는 놀이군.

[기사]인터넷 화제, &#039;관점 놀이에 빠져 보실렵니까&#039;

http://news.naver.com/news/read.php?mode=LSS2D&office_id=117&article_id=0000011118&section_id=105&section_id2=226&menu_id=105
강아지의 관점에서 봤을 때, "멍멍"


 

[기사]나는 접속한다, 고로 존재한다

http://news.naver.com/news/read.php?mode=LSS2D&office_id=023&article_id=0000128221&section_id=105&section_id2=226&menu_id=105


국회 인턴들이라..
사실 조직의 윗부분에 있지 않더라도
실무진에 친구가 많으면 더 나은 수준의 정보를 수집할 수 있다.


사람들은 언제나 물어본 만큼 가르쳐 주기 마련이다.
비밀이라도 꾸준히 물어보고 이리저리 길을 찾으면 다 된다.
많이 질문하고 현명하게 질문하는 게 중요하다.
마치 이미 다 아는 척 질문하면 동료의식도 느끼고 해서
다 알려준다.


 

[기사]황교수팀 난자ㆍ체세포 기증동의서 분석

http://news.naver.com/hotissue/read.php?hotissue_id=554&hotissue_item_id=13244&office_id=001&article_id=0001008835&section_id=8


음. 생각해보니 사람들이 자기 세포를 기증해 줘야 하는 군.
의학, 생물학 발전에 기여한다는 뿌듯함도 있겠고
부작용에 대한 두려움이나 영화처럼 악용될까봐 걱정할 수도 있겠다.


 

[기사]정부 "황 교수 연구비 원하는 만큼 지원"

http://news.naver.com/hotissue/read.php?hotissue_id=554&hotissue_item_id=13226&office_id=001&article_id=0001008519&section_id=8


나눠먹기 예산이라고 보면 다른 사람들에게 가는 몫이 많이 줄겠다.
하지만 사적인 fund라고 봤을 때는 사람들이
과학 외 분야의 것을 가져 오겠지.
생물학과 경쟁률도 이번에 높아지겠군
의학대학원 목표로 하는 친구들이 안 그래도 많이 쓰고 있는 데.
사람들이 과학에 관심을 가져 준다는 것도 긍정적일 수 있겠다.
부시나 종교계처럼 반대하는 사람도 있겠지만
(http://news.naver.com/hotissue/read.php?hotissue_id=554&hotissue_item_id=13224&office_id=001&article_id=0001008445&section_id=8)
아무튼 funding이 많이 될테니.
생명 벤처들 주식도 많이 오르겠다.


 

[기사]황 교수, 국내언론 &#039;엠바고 파기&#039;로 결국 불이익

http://news.naver.com/hotissue/read.php?hotissue_id=554&hotissue_item_id=13243&office_id=001&article_id=0001008837&section_id=8


엠바고
http://100.naver.com/100.php?id=759646
http://100.naver.com/100.php?id=745304
학술지들은 자신들도 언론이기도 하고 권위를 위해서
독점, 우선 게재를 원하는 구나.


 

명분(Justice)

세상일들은 명분이 중요하다.
명분은 설득의 도구다. 논리만 가지고 되는 것은 아니다.
약간의 논리와 우김 그리고 멋진 포장.


동창회, 계모임, 동아리, 동호회 이런 것도 다 명분이다.
그냥 사람들을 만나려고 하면 뭔가 이상하니까, 이유를 만든다.
사실은 그냥 사람이 보고 싶어서다.


명분은 해도 그만이고 안 해도 그만인 것을 말한다.
안해도 되는 데, 꼭 하고 싶다면 명분으로 만든다.


생일 잔치, 100일 잔치, 돌잔치, 명절..
다 명분이다. 그냥 만나면 이상하니까 이런 저런 행사로 만든다.
"축하한다."라는 메세지는 전화 한 통으로 할 수도 있지만 직접 만난다.
생일인 사람뿐만 아니라 주변 사람들도 모여서 놀 수 있게 말이다.


회사 면접 때도 이런 질문을 한다.
"당신이 정말 이 회사에 필요하다고 생각합니까?"
완벽한 논리는 있을 수 없다. 다만 명분이다.
"저는 어려서부터 여기 꼭 들어가고 싶었습니다."
"이름부터 회사 이름이랑 비슷합니다."
"저만한 인재가 어디 흔합니까?" (거만하군..)


이성을 꼬셔야 겠다면 어떻게 하나.
고전적인 명분으로 가서 커피 쏟기, 부딪히기.
같은 동아리 들어가기 등이 있다.
피해보상, 조모임 같은 게 명분이 된다.


쿠데타도 명분이다.
강하고 나쁜 놈이 약하고 나쁜 놈을 응징한다고 주장하는 게 쿠데타의 명분이다.
누가 왕이 되고, 누가 대통령이 되고 그런 것들도 다 그렇다.
전두환의 참모총장 연행 사후재가라든지


누루하치가 중국의 무역증서를 얻을 때도
자신의 아버지의 죽음에 대한 슬픔을 담보로 보상을 받았다.
자신이 큰 아들이 아니라서 보상을 강력하게 주장할 필요가 없었는 데도
시위를 해서 얻은 것이다.


영업사원들이 물건을 팔기 위해 사람들 만날 때도 그렇다.

공연

음악 동아리 공연에 놀러갔다.


꽃(Flower)
생각해 보니 나는 꽃을 거의 사거나 받아본 적이 없다.
먹을 수도 없고 오래 남지도 않아서 그런가;
같이 간 분이 사길래 잠시 들고 있었는 데.
가만히 들고 있기만해도 기분이 좋았다. 그래서 꽃을 사나보다.
이것저것 꽃다발에 넣을 꽃 종류를 고르고
포장하는 데도 한다발에 10분이 넘게 걸렸다.
이리저리 묶고 자르고 종이, 비닐, 망사 세 겹이나 포장을 했다.
꽃을 주는 사람 입장에서는 그것을 만드는 과정을 보는 게
가장 가치 있는 것 같다. 일종의 performance같다.
그냥 다 만들어져서 선반에 올려진 꽃보다는
직접 고르고 만드는 걸 지켜보는 게 더 정성스러워 보인다.


회사 퇴근길에 가는 거라 약간 늦었는 데,
꽃도 세 다발이 필요해서 1부는 보지 못했다.


연세대 강당도 울 학교랑 거의 비슷했다.
우리 학교 강당이 1.5배쯤 크다고 생각했는 데, 대강당은 따로 있단다.
빨간색 의자에 부채꼴 모양의 공간, 그리고 아이보리색 무대.


음악 동아리라서 노래만 부를 꺼라고 생각했는 데
영상도 준비되있었다.
우리학교 VOK의 영상제 수준은 되는 것 같았다.
동아리 구성원들이 준비하는 장면장면 나오고
마치 CF나 평화로운 롤플레잉 게임처럼 구성됐다.


공연장에 들어갈 때 꽃을 맡겨 둘 수 있는 시스템도 특이했다.
100년 된 학교와 20년된 동아리라서 그런지 역시 노련했다.
번호표를 받고 꽃을 맡겨두면 공연이 끝나고 다시 찾은 후
사람들에게 전해줄 수 있다.
관람 중에 꽃을 들고있으면 불편하니, 좋은 생각인 것 같다.


합창 동아리라길래 우리학교 여섯줄 같은 분위기를 생각해서
청바지, 면티 같은 걸 입고 나올 줄 알았는 데.
다들 Black&white로 정장을 입고 나왔다.
졸릴 까봐 걱정했는 데, 재미있었다.
사실 어느 공연이든 악기만 연주하는 공연에 비해 사람 목소리는 졸리지 않다.
연세대도 크리스챤 학교니까 그런 풍의 노래가 많이 있었다.
그래도 발랄하게 불렀다.


종합대학이라서 예능 계열 사람들도 있어서 그런지 정말 노래를 잘 했다.
무용하는 사람도 나와서 발레 비슷한 춤 + 막춤도 췄다.
옆에서 동아리 OB분이 설명해 줘서 이해가 더 좋았다.
악보 없이 부르는 게 정말 연습을 많이 해야 된다고 그랬다.
악보를 바꿀 때마다 들어갔다가 다시 나왔다.
그리고 각 성부끼리 따로 서있다가 갑자기 자리를 바꿔서 좀 섞었는 데.
그렇게 하면 다른 성부의 음을 따라갈 위험이 커져서 더 어렵단다.
연습을 더 많이 해야 한다는 군.


민요도 많이 불렀는 데,
아까 그 무용하는 사람과 다른 남학생이 한복을 입고와서 더 재미있게 춤을 췄다.


마지막으로 동아리 전통에 따라 관객들 속에 섞여있던
동아리 OB들도 모두 무대위로 올라가서 합창을 했다.
동아리 노래를 작곡한게 있단다. 매번 부른다는 데 멋있었다.
우리 동아리는 동아리 전통이라고 할만한게 뭐가 있을 까?


우리학교 공연 동아리들은 강당에서 공연이 끝나면
항상 주변 학교 동아리들에서와서 케잌을 주고 받는 데,
그건 없었던 것 같다. 충청도에서만 하는 건가?;;


모처럼 문화생활을 해서 좋았다.
복학하면 금요일마다 공연은 꼭 챙겨봐야지.


 

2005년 5월 21일 토요일

Return(되돌아감)

과거로 많이 돌아가는 느낌이다.
팀 사람들도 1년 반 전 사람들이고
조직도 2년 전 그 조직이다.(연구소, 기술본부 같은..)


다음달이면 고향으로 돌아간다.
그리고 9월에는 학교로 돌아간다.
Home~, sweet home~.


요즘은 출퇴근 경로(path)도 2년 전 다니던 길(route)로 다니고 있다.
(약간 돌아가지만 조용하고 산책을 많이 할 수 있는 경로로)


Computer Engineering 분야에 대한 의욕도 되돌아오고 있다. (recovery)


2년 전에 내 고향은 광주와 KAIST. 두 개라고 말했는 데.
이제는 3개가 된 것 같다.
광주, KAIST, 서울


 

기술발전과 대중화


기술의 역할이 무엇인지 생각해 본다면
천재(과학자)의 생각을 바보(대중)도 이용할 수 있게 하는 것이다.


우연을 다룰 수 있는 것으로 만들고
어려운 것을 쉬운 것으로 만드는 것이다.


핵분열, 핵융합 같은 것은 60년 전만해도 세계 최고의 몇몇 물리학자들만이
알던 것이었지만 이제는 인류의 대부분이 핵발전에 의한 에너지로 이득을 얻고 있다.
태양 같은 곳에서 우연적으로 일어나는 현상을 지구상에서 다룰 수 있고
원하는 때 언제든 이용할 수 있게 만들었다.


30년 전만해도 인터넷은 전산을 전공한 네트웍 랩의 일부 사람들만
사용할 수 있었지만 이제는 동네 꼬마도 옆집 할아버지도 버튼만 누르면 된다.


2,000년 전 칼을 하나 만들려면 1년이 걸리고 귀족이 아니면 가질 수 없었지만
이제는 집집마다 식칼이 몇개씩이나 있고 매우 싸다.


기계공학을 몰라도 자동차를 몰 수 있게 만들고
항공공학을 몰라도 비행기를 탈 수 있다.
TCP/IP를 몰라도 인터넷을 할 수 있다.


300년 전 실물과 같은 그림을 그리려면 천재 화가가 필요했지만
지금은 1,000원만 있으면 사진을 찍을 수 있다.


최첨단 항공기를 한 대 만드는 데 100만 달러가 들었다면
하나 더 만들 대는 100만 달러보다 적게 들고 더 빨리 만들어야 한다.
1,000만대나 10억대를 만들 때 쯤에는 IQ 90의 평범한 사람도
조립해서 만들 수 있어야 한다.


뉴턴과 아인슈타인은 자신들의 이론을 정립하는 데 10년 이상의 시간이 필요했지만
우리가 그것을 배울 때는 10년이 걸리지 않는 다.
중, 고등학교 3~6년이면 다 알 수 있다.
그래야 다음 기간동안 그들의 어깨 위에서 다른 것을 배울 수 있다.


 

[tech]API 외부 공개

세상 성공한 IT기업들, 기술에 자신감이 있는 기업들은 API을 외부에 공개한다.
IBM도 자신들의 architecture를 공개해서 IBM-PC의 3rd party를 키웠고
MS도 API를 공개하여 개발자들을 도왔다.
Windows, MSDN, Visual Studio 등.. 수많은 툴도 제공했다.
Google도 검색 API를 공개했다.
Winamp나 Firefox같은 프로그램은 plug-in을 붙일 수 있게 되어있다.


국내의 성공한 기업들은 하나도 그런 일을 한 적이 없다.
NHN, 아래 한글 등..
아무리 기술이라고 우겨도 위의 기업들보다 한 수 아래 일 수 밖에 없다.
자신감이 없고 그만큼 체계적인 면이 없다는 것이다.
뭔가를 공개하고 외부에 연동되게 하려면 그렇지 않는 것보다
몇 배의 노력과 기술이 필요하다.
하지만 그것을 한 번 닦아 놓으면 자신들도 그것을 다음번에 이용할 수 있다.
남이 이용할 수 있게 만들어두면 당연히 자신들은 더 쉽게 이용가능하다.


경영으로 치자면 비공개기업이 상장하여 공개기업이 되는 것만큼 대단한 일이다.
기술적으로 숨김없이 검증되고 검토된다.


더 나아가서는 소스 코드 공개 같은 것이 된다.
주로 협력사에 먼저 공개하고 가끔 일반에게 공개하기도 한다.
허접한 기술을 가진 회사라면 부끄럽고 회사 이미지를 망치는 것이 되니까 공개할 수가 없다.


--------------
내가 Project Manager나 CTO가 된다면
언젠가는 성공한 제품을 만들고, 그것에 관한 책을 쓸 것이다.
그냥 개인적인 우화에 관한 자서전은 아니고 mythical man-month같은 서적이 될 것 같다.
혹은 거기서 얻은 새로운 기술을 바탕으로 한 어떤 기법이 될 수도 있다.
나중에는 consulting을 할 수도 있고, 기술을 나눠서 팔수도 있고, solution이나 service를 팔 수도 있다.
그리고 그 기술이나 architecture, design 혹은 API를 공개해서
3rd party를 늘리는 데 주력할 것이다. 3rd party가 많은 제품은 절대 사라질 수 없다.
그들의 팬들, 동료들(3rd party product)과 함께 살아 숨쉴 것이다.

KAIST - 무관심과 고립

우연히 기회가 되서 다른 학교 사람과 대화를 하게 되었다.
그래서 우리 학교의 몇가지 특징을 찾아보자면.


출석률이 낮다.
출석을 부르지 않는 일부 수업은 출석률이 20% 밖에 안되는 경우도 있었다.
다른 대학들은 그렇게 심하지는 않은 것 같다.
원인을 찾아보면 기숙사 생활이라 누구도 간섭하지 않고 편히 쉴 수 있어서 그런 것 같다.
집에서 다니는 학생이나 하숙집에서 다니면 학교에 가지 않으면
주위사람들(가족, 어른들)이 왜 학교에 가지 않는 지 물어보고 가게 하지만
기숙사에 다니면 그런걸 물어보는 사람이 없다.
그리고 수업료가 매우 싸서(초수강은 거의 무료) 수업을 안들어도
아깝다는 생각을 덜 하는 것 같다.
다른 대학교 학생들은 등록금이 비싸다는 얘기를 자주 한다.


술을 많이 마신다.
음주량은 아무래도 앉아있는 시간에 비례하기 마련이다.
다른 학교 학생들은 11시쯤 되면 다들 집으로 돌아간다.
그리고 술을 많이 마시면 가족들이 좋아하지 않는 다.
지하철이 12시에 끊어지기 때문에 일찍 가지 않으면 안된다.
반면에 KAIST는 몇 시까지 먹든 기숙사가 개방되어 있고
술집과 집 사이가 가까워서 걸어서 들어오면 된다.


늦게 자고 늦게 일어난다.
깨워주는 사람이 없으니 일찍 자고, 일어날리가 없다.
다른 학교처럼 학교 등, 하교가 필요없어서 최소한 1시간 30분은 더 늦게 일어난다.


결속력이 부족하다.
입시 제도의 승리자로써 대한민국 교육의 폐단 때문일 수도 있는 데,
다른 원인을 찾아보면 외부와의 접촉이 적어서 그런 것 같다.
원래 '우리'라는 것은 '다른 사람'이 있어야 정의될 수 있다.
다른 사람=외부인을 만날 기회가 적기 때문에
KAIST인이라고 규정되지 않는 다.
그보다는 xx과학고 출신으로 규정되는 경우가 더 많다.
주변 모두가 대학생이면 대학생이라고 규정될 수 없고
모두가 KAIST사람이면 KAIST인이라고 규정될 수 없다.
그래서 자신이 대학생이라는 사실이나 KAIST사람이라는 것을 자각하지 못한다.
과외를 하거나 명절 때 고향에 내려갔을 때나 인터넷 채팅을 할 때는
자각을 좀 할 수 있다.


다양성이 부족하다.
개인주의적이라서 개성이 많지만 이공계 사람들 밖에 없기 때문에
다양한 관점에서 문제를 바라보지 못한다.


그래서 항상 교내 신문이나 많은 에세이에서 '무관심'과 '고립'이라는 단어가
많이 등장 한다.


 

2005년 5월 20일 금요일

Unix ps명령에서 ID대신 UID가 뜨는 이유

ID가 9글자 이상이면 ps에서 ID 대신 UID를 보여준다.

소스 : http://procps.sourceforge.net/
FreeBSD에서 ps 소스 보기 : /usr/src/bin/ps/

이유 설명
http://procps.sourceforge.net/faq.html
Why do long usernames get printed as numbers?

The UNIX and POSIX standards require that user names and group names be printed as decimal integers when there is not enough room in the column. Truncating the names, besides being a violation of the standard, would lead to confusion between names like MichelleRichards and MichelleRichardson. The UNIX and POSIX way to change column width is to rename the column:

     ps -o pid,user=CumbersomeUserNames -o comm
The easy way is to directly specify the desired width:
     ps -o pid,user:19,comm

유스호스텔증 만들기

가입비 : 1년 - 18,000원 (수수료등 포함하여 20,600원)

가입
http://www.kyha.or.kr/
site 가입 후 정회원 신청을 하면 가입 메일이 오고 2~3일 뒤에 카드도 옴.

예약(Booking)
http://www.hihostels.com/
신용카드를 이용

접수시각 : 24시간가능
Check-in 시각 : 15:00~22:00
아침에 도착하는 경우 :
07:00~10:00시에 체크인, 숙박신청, 짐을 맡김.

식사 : 대부분 가능, 취사가 가능할 수도 있음
       계절에 따라 쉬기도 하니 문의.

연봉제(자유 계약)

오늘 100분 토론을 봤다.
예전 개그맨들은 공채 스타일이라서 방송사에 입사하면 평생 먹고
살 수가 있었다. 웃기든, 말든.
하지만 요즘 개그맨들은 management사에 의해 계약하고
웃기면 많이 받고, 못하면 짤리는 거라서 연봉제가 됐다.
경쟁을 통해서 contents의 질을 높여보자는 것이다.


시장 경제가 단지 경제가 아닌 사회, 문화, 철학적인 전반에 영향을 주었다.
이렇게 변해가고 있다.


그래서 개그맨 뿐만 아니라 나같은 scientist, engineer들도 비슷한 입장에 있다.
예전처럼 단지 가만히 앉아서 보상을 받을 수는 없는 상황이 되었다.
순수하지 못하다고 생각할 지는 모르겠지만
그렇게 하지 않으면 자본주의의 천박함에 모두가 말라 죽게 되고
오래 지속될 수가 없다.
자신의 권리도 적절히 주장해야 하고 스스로 시간을 내서 자기 개발도 해야 한다.
부당한 것이 있다면 알리고 이슈화하고 대화 테이블로 이끌어 내야 한다.


단기간의 경쟁에 과도하게 투자하면 안되고 장기적인 개발과 학습도 필요하다.
예전처럼 과도하게 일해도 정년이 되면 저절로 퇴직금을 두둑히 주지 않는 다.
퇴직 후에 쓸 돈도 스스로 모아야 하고 오래 남을 수 있게 자신을 보호해야 한다.
바보처럼 앉아서 모든 것을 고용주에게 의지해서는 안된다.


자신의 일이 소중해서 가치를 매길 수 없다고만 말해서는 안된다.
소중한 것은 사실이지만 계속 안 매기면 고용주가 부당한 평가를 해버리고
시장경제의 보이지 않는 손도 제대로 동작하지 않고
결국은 나 뿐만 아니라 산업 전반이 무너진다.
자신의 일의 가치를 단지 임금뿐만 아니라 여러가지 기회와 권리를 통해서
주장해야 한다.
건강보험, 의료보험, 고용보험, 상해보험 같은 것일 수도 있고
사업장 환경개선, 교육 기회 부여, 출퇴근 시간 보장, 자원활용권한,
적절한 휴가, 지위보장(승진, 대우), 권한과 책임, 투자에 대한 약속 등..


연봉 같은 단일 요소에만 집착하면 오래 버텨낼 수가 없다.
다양한 방면의 보상을 이용해야 자신의 존엄성이라든지,
하는 일에 대한 자부심도 보장 받을 수 있고
협상의 여지도 많아지고 더 건전한 자본주의에 도움이 된다.


--------------------------------------------
약간 다른 이야기지만 나는 이공계의 KAIST 출신들이나 능력 있는 사람들이
돈도 많이 벌고 그 외에 많은 보상들을 받아야 한다고 생각한다.
단지 다른 직업군들(의료계, 공직사회)과의 형평성의 문제라기보다는
그렇게 해야만 그보다 실력이 조금 부족한 사람들도 먹고 살 수가 있다.
뛰어난 사람들이
'나는 이 만큼이면 겨우 굶지 않고 살만하니까, 더 받지 않겠어.'
라고 해버리면
그 선이 인력시장의 상한선이 되어 버리기 때문에
그보다 실력이 조금이라도 부족한 사람들은 의식주를 해결할 만큼 벌 수가 없다.
뛰어난 사람들이 많이 받아야 그들도 어느정도 받을 목표치가 올라간다.


이런 것들 때문에 나는 돈을 많이 벌었으면 좋겠다.
그리고 그만큼 많이 썼으면 좋겠다.
내가 많이 벌면 그만큼 내가 관심있어야 하는 분야에 많은 투자를 다시 할테고
분야의 발전에 도움이 될테니까.
많이 벌어서 새로 나온 전자장비, 기계도 사보고
책도 많이 사고, 돈이 더 많다면 내가 좋아하는 분야에 기금을 낼 수도 있다.
내가 우주 여행을 좋아한다면 항공우주산업에 기부을 할 수도 있고,
생명 연장을 위해 의료, 생물 분야에 기부를 할 수도 있다.


돈이라는 건 결국 교환과 분배를 위한 수단이니까
과학을 모르는 경영자들이 많이 갖고 쓸데없는 곳에 돈을 날려버릴 바에는
과학을 잘 아는 내가 가지고 그걸 투자하는 편이 낫다.


 

2005년 5월 19일 목요일

글과 실습

나를 포함해서 많은 친구들이 대학에 올 때
"나는 글 읽기, 글쓰기가 싫어"라고 말했지만
내가 아는 뛰어난 프로그래머들은 전부 다 많이 읽고 많이 쓰는 것 같다.


공학이 실사구시적인 학문인 것은 사실이지만 글도 실습만큼 중요하다.


한 달에 책 한 권도 안 읽고, 글 한 편 안 쓰면서 뛰어나다고 주장하는 사람은 다 거짓이다.


글에는 두 가지 종류이 있는 데,
이론을 위한 글과 경험을 위한 글이 있다.
이론을 위한 글은 교과서, 이론적인 논문이다.
경험을 위한 글은 에세이(수필), 실험자료, Tutorial, Manual, 신문기사 같은 것들이다.


우리나라 학생들은 이론을 위한 글은 보지만 경험을 위한 글은 잘 보지 않는 다.
반대로 industry에 있는 사람들은 주로 실습이 위주이고
경험을 위한 글은 가끔보고, 이론을 위한 글은 정말 안 본다.


전문가가 되기 위해서는 두 가지 종류의 글을 골고루 읽어야 하고
그것에서 생겨난 의문이나 추가적인 내용들을 실습해야 한다.


이론없는 실습은 삽질이고, 실습없는 이론은 뜬구름이다.
경험없는 이론은 소꿉장난이고, 실습없는 경험은 불가능하다.
이론없는 경험은 시간낭비이고, 경험없는 실습은 애송이다.

[펌]The Klein Four Group

http://www.math.northwestern.edu/~matt/kleinfour/
http://www.math.northwestern.edu/~matt/kleinfour/media/finite.wmv


The path of love is never smooth
But mine's continuous for you
You're the upper bound in the chains of my heart
You're my Axiom of Choice, you know it's true


But lately our relation's not so well-defined
And I just can't function without you
I'll prove my proposition and I'm sure you'll find
We're a finite simple group of order two


I'm losing my identity
I'm getting tensor every day
And without loss of generality
I will assume that you feel the same way


Since every time I see you, you just quotient out
The faithful image that I map into
But when we're one-to-one you'll see what I'm about
'Cause we're a finite simple group of order two


Our equivalence was stable,
A principal love bundle sitting deep inside
But then you drove a wedge between our two-forms
Now everything is so complexified


When we first met, we simply connected
My heart was open but too dense
Our system was already directed
To have a finite limit, in some sense


I'm living in the kernel of a rank-one map
From my domain, its image looks so blue,
'Cause all I see are zeroes, it's a cruel trap
But we're a finite simple group of order two


I'm not the smoothest operator in my class,
But we're a mirror pair, me and you,
So let's apply forgetful functors to the past
And be a finite simple group, a finite simple group,
Let's be a finite simple group of order two
(Oughter: "Why not three?")


I've proved my proposition now, as you can see,
So let's both be associative and free
And by corollary, this shows you and I to be
Purely inseparable. Q. E. D.


-----------------------------------------------------------
가사도 웃긴데, 진지하게 학교 복도에서
수학자들이 즐겨 입는 다는 어두운 스웨터를 입고
동료들 지켜보는 데 부르는 아카펠라 참 웃기다.
아카펠라가 상당히 괜찮군.

[Tech]Python과 Prototyping

Python 애호가들이 하는 말이
일단 prototype을 python으로 짜고 속도가 필요한 부분만 C, C++로 바꾸라고 한다.
(Py와 prototype가 spell이 비슷해서 그런가..;)


Assembly를 좋아하는 사람도 비슷하다.
C로 짠 다음에 profiling하고 핵심코드 몇 줄을 Assembly로 바꾼다.


나는 대학 2학년 때 Assembly 숙제가 나왔는 데,
(Heap sort 구현)
일단 C로 짜고 Assembly로 포팅한 적이 있다.
그냥 Assembly로 짜려고 하니 너무 머리가 아파서 말이지.
Debugging 쉬운 언어로 내 구현을 검증하고 포팅했더니 훨씬 쉬웠다.


CLR도 비슷한 시도인 것 같다.
정말 덕지덕지 온갖 잡다한 언어들이 다 붙은 걸레가 될 수도 있긴하다.

[Tech]Script 언어

오늘은 가볍게 python와 perl을 조금 써봤다.
C, C++의 공포스럽고 엄청나게 복잡한 API에서 해방될 수 있어서 좋은 것 같다.
일단 간단하게 프로그램짜기 편하다.


GUI짜는 데 vim + python + wxPython binary만 설치하면 되니 편하다.
소스 파일도 1개다.
웹에서 copy&paste하니 바로 실행된다.


C++이었다면 Visual Studio를 설치하는 데만 1시간은 걸리고
간단한 예제도 상당히 길고 프로젝트 파일을 만들어야 한다.
파일도 많고 컴파일시간도 걸린다.
Petzold 책 펼치기도 귀찮아서 말이지.
(물론 좀 더 방법 쉬운 있겠으나, 다들 그렇게 한다.)


"Hello World"
역시 이런 거 찍는 게 쉬운 언어라야 초기에 진입하기가 쉽다.


Perl은 웹 뒤져서 SOAP 사용예제를 찾아다가 조금 수정해서
Google API를 한 번 써봤다.
쉽게 되서 좋군. Perl module 2개 깔고
request method만 부르면 된다.
Java나 Visual C++로 하려고 했다면 시간 오래걸렸을 것 같다.
java.sun.net, MSDN을 뒤지고 창만들고 하려면 배울 게 많다.


나도 script kid가 될까보다.


 

Python

Python
http://www.python.org/download/
-> Python 2.4.1 Windows installer

Active python
http://www.activestate.com/

wxPython
http://www.wxpython.org/
-> Download -> Binaries
-> wxPython2.6-win32-unicode-2.6.0.0-py24.exe
   wxPython2.6-win32-docs-demos-2.6.0.0.exe
  
http://wiki.wxpython.org/index.cgi/How_20to_20Learn_20wxPython
http://wiki.wxpython.org/
http://wiki.wxpython.org/index.cgi/Getting_20Started

Python Library Reference
http://www.python.org/doc/2.4.1/lib/lib.html

HTTP request보내기
http://www.python.org/doc/2.4.1/lib/module-httplib.html
http://www.python.org/doc/2.4.1/lib/httplib-examples.html

fpconst (A Python module for handling IEEE 754 floating point special values)
설치하기
http://research.warnes.net/projects/RStatServer/fpconst/
-> fpconst-0.7.2.zip
압축해제
cmd창 열기
c:\Python24\python.exe setup.py install

SOAPpy 설치하기
http://pywebsvcs.sourceforge.net/
SOAPpy-0.12.0.zip을 받음.
압축해제
cmd창 열기
c:\Python24\python.exe setup.py build
c:\Python24\python.exe setup.py install


파이썬 시작하기

---------------------------------
Python 예제 프로그램(Google API 이용하기)

import httplib, urllib

from wxPython.wx import *
class Form1(wxPanel):
    def __init__(self, parent, id):
        wxPanel.__init__(self, parent, id, wxPoint(), wxSize(500, 500))
        self.msgKeyword = wxStaticText(self, -1, "Keyword :", wxPoint(20, 30))
        self.keyword = wxTextCtrl(self, 20, "", wxPoint(100, 30), wxSize(140,-1))
        self.button = wxButton(self, 10, "Search", wxPoint(250, 30))
        EVT_BUTTON(self, 10, self.OnClick)
        self.display = wxTextCtrl(self, 5, "", wxPoint(20, 60), wxSize(700, 500),
                wxTE_MULTILINE | wxTE_READONLY)

    def OnClick(self,event):
        self.display.AppendText("Keyword: %s\n" % self.keyword.GetValue())
        headers = {"Content-type": "text/xml; charset=utf-8"}
        conn = httplib.HTTPConnection("api.google.com:80")
        conn.request("POST", "/search/beta2", "<?xml version='1.0' encoding='UTF-8'?> \
        <SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\"> \
        <SOAP-ENV:Body> \
        <ns1:doGoogleSearch xmlns:ns1=\"urn:GoogleSearch\"  \
        SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"> \
        <key xsi:type=\"xsd:string\">키값</key> \
        <q xsi:type=\"xsd:string\">" + self.keyword.GetValue() "</q> \
        <start xsi:type=\"xsd:int\">0</start> \
        <maxResults xsi:type=\"xsd:int\">10</maxResults> \
        <filter xsi:type=\"xsd:boolean\">true</filter> \
        <restrict xsi:type=\"xsd:string\"></restrict> \
        <safeSearch xsi:type=\"xsd:boolean\">false</safeSearch> \
        <lr xsi:type=\"xsd:string\"></lr> \
        <ie xsi:type=\"xsd:string\">latin1</ie> \
        <oe xsi:type=\"xsd:string\">latin1</oe> \
        </ns1:doGoogleSearch> \
        </SOAP-ENV:Body> \
        </SOAP-ENV:Envelope>", headers)
        response = conn.getresponse()
        self.display.AppendText("%s\n" % response.status);
        self.display.AppendText("%s\n" % response.reason);
        data = response.read()
        conn.close()
        print data;
        self.display.AppendText( "%s\n" % data.decode('utf-8').encode('cp949') );

app = wxPySimpleApp()
frame = wxFrame(None, -1, " Our first Control")
Form1(frame, -1)
frame.Show(1)
app.MainLoop()

Perl로 구현한 SOAP Client

Perl로 구현한 SOAP Client
http://search.cpan.org/~pmqs/Compress-Zlib-1.34/Zlib.pm
http://search.cpan.org/~gaas/libwww-perl-5.803/lib/LWP.pm
-> Download: libwww-perl-5.803.tar.gz

perl Makefile.PL LIB=/home/ilashman/perl
make
make test
make install

export PERL5LIB=$PERL5LIB:/home/ilashman/perl

Google API SOAP이용하기

http://users.skynet.be/pascalbotte/rcx-ws-doc/perlpost.htm
이 프로그램을 그대로 쓰고 message와 POST만 바꾸면 된다.
http://www.google.com/apis/ 을 받아서
googleapi\soap-samples\doGoogleSearch.xml 의 내용을 message에 적는 다.
POST 이후의 url 주소는 'http://api.google.com/search/beta2'로 한다.

참고)
Google Hacks, OReilly, Chapter 5. Introducing the Google Web API
-> Hack 50 Programming the Google Web API with Perl

2005년 5월 18일 수요일

[tech]요리와 아이디어

대중적인 소프트웨어 개발을 성공하게 하는 것은 약간의 아이디어일 때가 많다.
적절하게 새로운 것을 보여주고 획기적이라도 일관성은 유지해야 한다.
예를 들자면 apple의 디자인은 항상 혁신적이지만 일관성이 있다.
깔끔하고 하얀색을 많이 쓴다. 그리고 곡선이 멋지다.
항상 심플하다.


아이디어가 많더라도 일관성이 없는 것들을 섞어 버리면 안된다.
아이디어는 양념 같은 것이다.
적절하게 넣어주면 요리가 훨씬 맛을 더하지만
온갖 양념을 다 집어 넣으면 천박한 맛이 된다.
양념이 지나치면 입맛만 버린다.
인삼, 후추, 설탕, 소금, 파슬리, 카레 등 많은 재료를 다 넣었다고 생각해보라.
카레에는 카레의 향을 최대한 살려야 한다. 인삼을 넣지 않는 다.
닭죽에 인삼, 후추를 넣을 수는 있지만 꿀이나 카레를 넣지는 않는 다.


아이디어가 정말로 많고 서로 상충된다고 치자.
전부 다 구현하고 싶다면 작은 툴을 여러개 만들 수는 있다.
구글, 알소프트(알집 만든) 같은 회사들을 보면
다양한 아이디어로 다양한 소프트웨어를 만든다.
하나로 몰아 넣는 짓은 하지 않는 다.


 

시스템 설계, 디자인, framework

Three-Tier(3tier) : Client-server model을 이용
http://en.wikipedia.org/wiki/3_tier
. User Interface
. Functional Business Logic
. Data storage

MVC(Model-view-controller)
http://en.wikipedia.org/wiki/Model-view-controller
. Data Model
. User Interface
. Control Logic

Middleware
http://en.wikipedia.org/wiki/Middleware

Stub = skeleton
http://www.webopedia.com/TERM/s/stub.html
RMI에서는 client side는 skeleton, Server side는 stub로 부른다.

Code Generator

IDL Compiler

RPC : Remote Procedure Call
RMI : Remote Method Invocation (JDK 1.1에서부터 지원)
DDE : Dynamic Data Exchange
OLE : Object Linking and Embedding
CORBA : Common Object Request Broker Architecture
COM : Component Object Model
EJB : Enterprise JavaBeans
J2EE : Java 2 Platform, Enterprise Edition

KAIST 학생 정보를 얻는 곳

. 교내 신문
. http://www.kaist.ac.kr
. http://portal.kaist.ac.kr/ -> 로그인 -> 공지사항
. 학사력
https://portal.kaist.ac.kr/webcais/devsso/history/history_calendar.php?affair_kind=1  
. BBS
  . ara
  . 친구들 보드 - loco, ska, bar, ara
. 과 홈페이지
  http://cs.kaist.ac.kr/

유럽 여행 - 여행사 문의

. 짐 맡기기
  . 호텔은 언제든 맡아줌
  . 민박, 유스호스텔은 사바사바 잘해서 맡기기
  . 역 근처는 Coin locker이용
. 방구하기
  . 이리저리 온갖 동네 연락해보면 노숙은 안 할 것임


. 여행사 명 : 하나투어(hanatour)
. 출발 : 대한항공 6.23일(직항)
  돌아오는 날 : 에어프랑스 7.26일(직항, 대한항공 Code Share)
. 가격 : 89만원 + 세금
. 취소 조건 : 벌금 26만원
. 변경 : 출발일은 변경 불가
           돌아오는 날은 30만원에 1번 변경가능
. 입금 : 무통장 : 외환은행, 임광식, 172-18-34395-3


           카드 결제도 가능
. 담당자 : 김금옥 이사님, 02-6002-6882, 010-2447-7229, kay11ok@yahoo.co.kr

디지털 도어 락 해제법(Digital Door lock)

증상 : 버튼이 안 눌러짐(눌러도 효과음이 없고 반응이 없음)
       문이 안 열림.
       경고벨이 쉬지 않고 울림.

제품명 : Gateman art
원인 : 배터리가 다 되서 시스템이 나가버렸음.

준비물 : 9V 건전지(양 극이 같은 방향에 있는 것) 1개,
         1.5V AAA 건전지 4개,
         알루미늄 호일(or 전선)
         -> 총 가격 : 1만원
해결책 :
. 9V 건전지를 디지털 도어락 옆구리의 쇠부분에 한 전극당 하나씩 갖다 댄다.
  (Position이 안 맞아서 전지만 가지고는 정확하게
   접촉이 안되어 전기가 흐르지 않으므로 전선이나
   알루미늄 호일로 잘 연결한다.)
. 경고벨이 꺼지고 조용해 진다.
. 계속 대고 있는 상태에서 비밀번호를 눌러 문을 연다.
. 1.5V AAA 건전지 4개를 교체한다.
소요시간 : 준비물 구입, 고민, A/S 전화시간, 기타 삽질시간 합쳐서 30분

참고)
. 알루미늄 호일로 전극을 연장할 때 실수로 두 전극이 닿게하지 않도록 주의한다.
  불꽃이 튀면서 방전(단락, short)되어 버린다.
. 열쇠집가도 A/S 센터로 연락하라고만 한다. 결국 자신이 해결해야 한다.
. 집이 동네 슈퍼에서 멀다면 이런 락은 안 좋다. -.-

전조증상)
. 평소부터 버튼이 잘 안 눌리고 문이 안 열리면 언제든 이런 일이 생길 수 있다.
. 안쪽에서 버튼이 안열려서 돌려서 연다든지, 바깥쪽에서 버튼을 누르는 데 실패한다든지 하는 것들.

문의전화 : 디지털락 하단에 적혀 있다.
           (종류에 따라 상단, 측면, 앞면에 적혀있을 수도 있다.)
           ARS : 080-700-0789 상담원 : 2->2

[å]Joel On Software. 2

공학의 세계와 Business의 세계를 적절히 섞어서 보여주는 책이다.
공학적인 면에서는 다른 SE책들보다 훨씬 구체적이고 실무적이다.
Business 세계에서도 신문이나 매뉴얼, 소개책자들은 다들 자화자찬만 하는 데,
이 책은 저자가 만든 프로그램을 소개하기는 하지만 다른 프로그램들에 대해서는
어느 정도 냉철하게 말해주고 있다.


MS에서 근무한 적이 있는 사람이라 MS를 칭찬하는 면도 많은 데,
자신이 다녔던 다른 직장과 비교해서 설명하고 있으니
덮어두고 칭찬만 하는 것은 아니다.
에릭 레이몬드나 넷스케이프를 많이 씹고 있지만 나름대로 근거가 있다.
칭찬 일색이나 비난만 일색인 글보다는 낫다.
대부분의 Unix책에서는 Unix칭찬만 있고, Netscape 메뉴얼에도 마찬가지다.
MS의 웹 사이트들도 MSDN은 그나마 덜하지만 대부분의 글이 매우 추상적이고 반은 뻥이다.
"유저의 사용성을 극대화 합니다."
"안전합니다."
"당신의 시야를 넓혀줄 것입니다."


 

요즘 하는 일

지난 2년간 사놓은 책들을 읽어 치우고 있다.
오늘도 한 권 치웠다. 'Joel on software'


매일 쇼핑몰에 들어가서 여행에 필요한 물품을 하나씩 사고 있다.
매일 소포가 하나씩 온다.
빨리 출발해 버려야지, 계속 사들이는 데 끝이 없다.


복학 준비한다고 짐을 하나씩 집으로 보내고 있다. 찔끔찔끔.


유럽여행을 갈지, 말지 하루 12번씩 고민하고 있다.
호텔팩으로 할지, 자유여행으로 할지는 하루 2번씩 고민한다.
복학을 미룰지 말지도 하루 1번씩 고민 중이다.
새벽에 2번씩 깨서 유럽여행시 발생할 최악의 시나리오를 생각한다.
그리고는 1시간쯤 후 다시 잠든다. 악몽으로 복습한다.
결국은 훈련소처럼 어떻게든 가게 될 것 같다.
(여행은 군대처럼 의무사항은 아니지만, 마땅히 비교할 게 없다.)
훈련소도 3개월 전부터 미치게 준비했는 데,
결국은 대부분 소용없었다.
감기가 그렇게 심하게 걸릴 줄은 상상도 못했는 데, 다른 건 다 쉽게 넘겼다.
여행도 마찬가지 일 것 같다.
여행의 즐거움이든 어려움이든 지금으로써는 상상해낼 수 조차 없다.
지옥 같다는 군대도 동기들과 수다떠는 시간에는 정말 재미있었다.


날마나 전자제품이 하나씩 고장난다. 온갖 삽질 다해보고 수리를 맡긴다.


팀에서 작은 프로그램 디버깅을 하고 있다.
도무지 지난 2년간 배운게 뭔지, 배워도 배워도 끝이 없다.
오늘도 새로운 C++ abuse방법을 2개 찾아냈고 gdb 명령어 2개를 배웠다.
그래도 다행인 점은 같은 버그로 3번 이상 고민한 적은 없다는 것이다.


굼뱅이 같은 내 자신을 보면 너무 어이없는 데, 아무튼 방법이 없다.
온갖 삽질 다해보고 하루 쯤 기다리면
senior 누군가가 와서 해결책을 제시해 준다.
기다려도 아무도 관심 가져주지 않으면 작은 닭질들을 또 하면서 1주일 더 보낸다.
그 정도 되면 매니저가 내 일을 다른 사람에게 할당하거나
그 모듈은 구현을 포기한다.


아침에는 30분마다 시계를 확인한다.
6시부터 확인을 하고 다시 눈을 감는 다.
9시 반이 되면 일어나기 적당한 시각이라는 걸 알게 되고
꾸물거리다가 세수하고 출근하면 10시 반이다.


나도 내가 무슨 생각을 하면서 시간을 보내는 지 모르지만
아무튼 시간이 째깍째깍 잘도 간다.
금새 점심, 저녁 먹을 시간이 되고 다들 퇴근하면 나도 집에 간다.
수북히 쌓인 책 중 하나를 꺼내 읽으면 자정 ~ 오전2시 된다.

2005년 5월 17일 화요일

C++, Java 생성자에서 다른 생성자 부르기

C++에서는 생성자가 다른 생성자를 부르면
Temporary Object가 생겼다가 다시 소멸해 버린다.
따라서
obj = new Object명(인수); 라는 구문을 주었을 때.

heap에 object가 하나 만들어지고 그것의 생성자가
또 object를 만들어서 stack에 저장된다.
obj에는 stack의 pointer가 들어가서 stack에서 return된 후 object 사라지므로 invalid한 pointer가 되버린다.

따라서 그런 짓은 하지 않는 것이 좋다.
------------------------------------------------------
$ cat ./cpp_test3.cpp
#include <iostream>

using namespace std;

class B
{
    public:
    int m_i;
    char m_c;

    B(int i) : m_i(i)
    {
        cout << "B::B(int " << i <<  "), this:" << this << endl;
        B('z');
    }

    B(char c) : m_c(c)
    {
        cout << "B::B(char " << c << "), this:" << this << endl;
    }

    ~B()
    {
        cout << "B::~B(), this:" << this << ", m_i:" << m_i << ", m_c:" << m_c << endl;
    }
};

int main()
{
    B* p;
    p = new B(1);
    cout << "p:" << p << endl;
    cout << "p->m_i:" << p->m_i << endl;
    cout << "p->m_c:" << p->m_c << endl;
    delete p;

    return 0;
}
[ilashman@ob cpp_test]$ ./cpp_test3
B::B(int 1), this:0x8049f88
B::B(char z), this:0xbfffd550
B::~B(), this:0xbfffd550, m_i:-1073752680, m_c:z
p:0x8049f88
p->m_i:1
p->m_c:
B::~B(), this:0x8049f88, m_i:1, m_c:

----------------------------------------------------------
Java에서는 생성자가 다른 생성자를 불러도 된다.
다만 생성자가 다른 생성자를 부를 때는 첫번째 줄에서 불러야 한다.
(그렇지 않으면 compile시에 에러가 난다.)
생성자를 부를 때도 class명()라고 부르지 않고 this()라고 불러야 한다.
그리고 소멸자와 포인터가 없다.

$ cat C.java
class B {
    public int m_i;
    public char m_c;

    public void hi()
    {
        System.out.println("hi");
    }

    public B(char c)
    {
        m_c = c;
        System.out.println("B::B(char " + c + "), this:" + this);
    }

    public B(int i)
    {
        this('z');
        m_i = i;
        System.out.println("B::B(int " + i +  "), this:" + this);
        hi();
    }

    /*
    public ~B()
    {
        System.out.println("B::~B(), this:" + this + ", m_i:" + m_i + ", m_c:" + m_c);
    }
    */
}

class C {
    public static void main(String[] args) {
        B p = new B(1);
        System.out.println("&p:" + p);
        System.out.println("p.m_i:" + p.m_i);
        System.out.println("p.m_c:" + p.m_c);
    }
}

$ ~/local/j2sdk1.4.2_08/bin/java C
B::B(char z), this:B@14f8dab
B::B(int 1), this:B@14f8dab
hi
&p:B@14f8dab
p.m_i:1
p.m_c:z

학자

4년 전만 해도 무슨 일이 있어도 대학교수나 어디 연구원이 되어야겠다고 생각했다.
흰 가운을 입고, 칠판 앞에 서야만 논문도 쓰고, 연구할 거라고 생각했다.
하지만 창의적인 일이나 연구에는 그런 길만 있는 건 아닌 것 같다.


시간 투자의 차이 같은 건 있지만
동네 슈퍼 아저씨도 매상을 올리기 위해 많은 연구를 한다.
상품 위치, 가구 위치도 바꾸고 색칠도 해보고..


회사 R&D 파트도 학교보다 더 신기하고 대담한 것들을 연구하는 곳도 있다.
(이름만 R&D이고 맨날 똑같은 일만 하는 곳도 있다.)
교수가 아니더라도 논문을 쓰는 사람은 많다.
논문보다는 덜 거창한 것들도 많다.
Article, manual, tutorial, e-mail, news-group, book, memo ...


교수들 중에서도 3T라고 해서 창의적이거나 학문적인 건 하나도 없고
Tennis, TV, Tea만 즐기는 사람도 많다.


노벨상 수상자 중에서도 사기업 출신들이 있다. IBM이라든지.
박사 학위가 없는 사람도 아주 가끔씩은 나온다.
수학자나 물리학자가 경제학상을 받기도 한다.
노벨상 외에도 세상 유명한 상 많이 있고,
교수 아니라도 세상 직업은 많다.


에디슨 같은 사람이 자신의 직업이 '발명가'라고 생각하고
처음부터 명함에 '발명가'라고 박고 다녔을 리도 없다.
그냥 재미로 하고 돈 벌려고 하다보니 된거다.
직함은 '사장'이 될 수도 있고 '신문배달부'일 수도 있따.
그런건 유명해지고, 성공한 다음에 맘대로 하면 된다.


 

Parkinson&#039;s law(파킨슨 법칙), Peter principle, Dilbert principle

http://en.wikipedia.org/wiki/Parkinson%27s_Law
http://100.naver.com/100.php?id=180314

. 근무시간이 늘어도 하는 일의 양은 같다.
. 부하의 수가 늘어야 승진한다.
. 일이 적어도 부하는 무조건 많이 필요하다.
. 부하는 늘어야 하지만 경쟁자는 필요없다.
. 예산 심의 시간은 예산액에 반비례한다.
. 위원회의 크기가 커지면 비효율적이다.
. 무능하면 정부, 공기업, 유능하면 사기업에 들어야 한다.
. 공무원은 서로를 위해 서로의 일을 만든다.

Peter principle
http://en.wikipedia.org/wiki/Peter_principle

Dilbert principle
http://en.wikipedia.org/wiki/The_Dilbert_Principle

Rich Internet Application

http://en.wikipedia.org/wiki/Rich_Internet_Application
. Web Browser와 Desktop application의 연결고리가 되는 것들
. 별도의 설치 과정이 필요없다. 동의만 하면 알아서 깔린다.

예) Javascript, Macromedia flash, Java applet, XUL, Active X, AJAX

Multi-color Pen

우리가 보통 'Color monitor'라고 말하면
'A display monitor capable of displaying many colors' 라는 뜻이다.
여러가지 색이 나와야 color monitor지
단색이 나오면 Mono Monitor에 불과하다.
흑백 모니터에 색 셀로판지를 붙인 것이나 마찬가지.


그런데 Pen은 검은 색, 흰색만 아니면 모두 Color Pen이라고 부른다.
뭔가 대칭적이지 않아서 찝찝하다.


과연 Multicolor pen은 언제쯤 발명될까.
2색 펜, 3색 펜이 있기는 하지만 색이 혼합(blending)되지는 않는 다.
CRT 모니터 같은 경우도 사실은 색이 매우 가까이 있어서 병치 혼합되는
것이긴하다.
그리고 색연필 중에는 여러 색의 고체 덩어리를 합쳐서 만들어서
색이 랜덤(random)하게 나오기도 한다.


Pen의 꼭지(tail)에 dail button을 하나 달아서 적당히 돌리면
총천연색을 쓸 수 있는 펜이 나오면 재미있을 것 같다.


사실 컬러 프린터는 내가 방금 말한 기능이 그대로 들어있다.
실시간으로 색을 혼합해서 쓴다.
프린터의 혼합 모듈을 단추 크기로 줄이면 되겠네~

실미도, 난지도

실미도, 난지도도 여행지로 좋은 가보다.
이번 달에 팀 워크샵이나 한 번 가자는 데 어디가 좋을 지
사람들이 고민 중이다.


대략 고려할 요소는
이동시간 : 1~2시간
기간 : 1박 2일(금요일 ~ 토요일), 일요일까지 있으면 마누라들이 구박하신다나..
장소 : 콘도, 섬, 텐트, 산, 휴양림, 공원, 리조트 등..
비용 : 1인당 5~10만원(회사에서 지원)
주기 : 1년에 2번 정도


난지도는 서울 한가운데 있는 데 텐트가 있어서 캠핑이 가능하단다.
완전 보이스카웃 기분일 것 같다.
선유도공원도 한강 위에 있군.


실미도는 인천 -> 영종도 -> 잠진도 -> 배 10분 -> 대무의도 -> 실미도
(영화의 그 섬)
석모도는 김포 -> 강화도 -> 배 -> 석모도
(검색팀 사람들이랑)
강촌 리조트도 많이 간단다.
(네오위즈에서 회사 회원증이 있다는 군)


동해안도 사람들이 선호하는 데 멀어서..
강릉까지 밤새 달려서 회 한 접시 먹고 오는 것도 로망이 있기는 하다.
(별바라기 사람들이랑 대전->서울->강릉 왕복을 한 번 했었다.)


서울 교외로는 유명한 양수리도 있다.


수목원이나 휴양림도 괜찮은 것 같다.
별바라기에서 전국 모임할 때 한 번 캠핑장 빌려서 200명씩 들어간 적도 있다.


대학교 2학년 때는 고등학교 친구들이랑 음성에서 산 속에 있는 통나무집 빌렸던 것 같고 집에서도 가족들이랑 놀러갈 때 통나무집이나 콘도 많이 빌린다.


산은 남산, 유명산 등..


공원으로는 여의도 공원, 보라매 공원, 올림픽 공원, 선릉 공원
여의도 공원 - 자전거 타기, 인라인
보라매 공원 - 모르겠다. 내 동생있는 남도 학숙 근처겠군
올림픽 공원 - 인라인
선릉 공원 - 도시락 까먹기.


-----------------------------
다들 MT, 데이트 코스 같은 것이군.
어디 싸돌아 다녀봤어야 알지.
차 있고, 여자친구 있는 사람들이 잘 아는 것 같다.