기본 콘텐츠로 건너뛰기

8월, 2007의 게시물 표시

Windows에서 F1이 도움말로 작동하지 않도록 하기

출입금지 긴급대피로

하고 싶은 말이 뭔지는 알겠지만, 참 거시기 하단 말이지. (3호선) 원본 위치: http://purewell.egloos.com/3365727

내 얼굴 나이는?

클릭 원본 위치: http://purewell.egloos.com/3364812

꼭 욕을 해야해

2005년에 - 지금은 기억도 흐릿한 시절에 두루넷을 사용하고, 8월엔가 해지하고 끝에 미납금 이 얼마 붙어 있었나보다. 그런데 오늘 문자메시지로 5만여원이 미납되었으니 하나로텔레콤 농협 통장으로 돈을 이체하란다. (순간 피싱일꺼란 생각도 했지만) 문자메시지에 찍힌 전화번호로 전화하니 무슨 신용 어찌고 회사란다. 돈관리 해주는 회산가 보다. 암튼 그 회사에서 다시 하나로텔레콤 106번에 전화해서 자초 지종을 들었다. 합병으로 인해 전산 통합이 이뤄지지 않아서 늦었단다. 고지서를 받은 적이 없기 때문에 근거 자료도 만들 겸 고지서를 다시 보내달라고 했더니, 가상계좌번호 알려드리면 안 되겠냐고 한다. 신발놈. 돈만 받아가고, 떠난 고객은 뭐 때문에 돈을 내야는지 알 필요도 없다는거냐!? 화딱지가 나서 좀 뭐라고 했더니, 바로 온세통신에 전화해보셔야 한다고 전화번호 다시 알려주겠단다. 갑자기 빡이 돌았다. 합병했다면서? 합병했으면 전산이 어떻게 되든 간에 고객서비스차원에서 알아서 거기(하나로텔레콤)에서 전화해서 해결해야지, (고객한테 미뤄?) 생각해보니 열받네? 이렇게 내뱉어줬더니 바로 보내주겠단다. 새로운 주소 불러달란다. 신발놈. 꼭 욕 이나 목청을 높혀 야 일할 생각한다. 연초에 SKT상담원은 관리하고 있는 CP업체에 알아서 전화하고 몇 번이나 전화해서 진행상황 알려주더만. 하나로텔레콤, 좀 보고 배우지? 뱀발: 두루넷은 2005년 9월에 하나로텔레콤에 흡수합병되었다. 어찌 이리도 절묘한 타이밍이란 말인가? 원본 위치: http://purewell.egloos.com/3361702

소켓을 통해 다른 프로세스에 FD를 넘겨보자!

Windows에서 되는지 실행 안 해봤고, 단순히 UNIX Network Programming(이하 UNP)에 나온 걸 정리해보겠다. MSDN에는 WSASendMsg 라는 녀석을 준비하였는데 대충 비슷하게 보인다. 다만 Overlapped I/O 를 Windows용으로 써야하기때문에 API가 다른 것 같다. socket에는 sendmsg/recvmsg라는 녀석이 있다. 이 녀석 형태를 보면 아래와 같다. ssize_t sendmsg(int s, const struct msghdr *msg, int flags); ssize_t recvmsg(int s, struct msghdr *msg, int flags); send/recv와 달리 버퍼가 안 보이고, msghdr 라는 구조체를 쓰는데 - 물론 이 녀석이 버퍼겠지 - 이걸 우선 까보자. struct msghdr {     void         * msg_name;     // 접속할 주소     socklen_t    msg_namelen;    // 접속할 주소 크기     struct iovec * msg_iov;      // IO 버퍼     size_t       msg_iovlen;     // IO 버퍼 개수     void         * msg_control;  // 제어 정보 버퍼     socklen_t    msg_controllen; // 제어 정보 버퍼 크기     int          msg_flags;      // 플래그 }; 읔, 뭔가 많다. ㅡ_-) 난 이런게 젤 싫더라... sendmsg/recvmsg는 접속/비접속형 소켓을 모두 지원한다. msg_name과 msg_namelen은 비접속형 소켓(예:UDP)에서 받을 주소 구조체(예:struct sockaddr_in)을 알맞게 만들어서 넣어주는 것이다. 또한 I/O vector를 지원하여, msg_iov에는 struct iovec 배열의 주소, msg_iovlen은 배열 원소 개수를 예쁘게 넣는다. 이때 msg_iov

socketpair

socketpair는 IPC 가운데 하나로 보통 부모 자식 간의 대화를 전달할 때 쓴다고 한다. 얘도 pipe처럼 두개 file-descriptor를 던져주는데, pipe와 달리 두 file-descriptor가 모두 읽기/쓰기가 가능하다. 아래는 예제이다. #include <sys/types.h> #include <sys/socket.h> #include <iostream> #include <errno.h> #include <sys/wait.h> using namespace std; int main(int,char**) {     int s[2];     if ( -1 == socketpair (AF_UNIX, SOCK_STREAM, AF_LOCAL,s) )     {         cout << strerror(errno) << endl;         return 1;     }     char buf[1024];     if ( fork() )     {         strcpy(buf, "Hello, world!");         send(s[0], buf, strlen(buf)+1, 0);         int res;         wait(&res);     }     else     {         recv(s[1], buf, sizeof(buf), 0);         cout << buf << endl;     }     return 0; } 어디선가 pipe와 다른 점은 부모자식이 아닌 프로세스 간 통신이 가능하다는데, 부모자식이 아니면 어떻게 소켓을 넘겨주는지 궁금하다. 원본 위치: http://purewell.egloos.com/3357801

원치 않은 SYN flooding 공격

서버를 운영하다보면 별의 별 일이 다 생기는데, 공격이 아닌데 공격처럼 보이는 경우가 가끔씩 있다. TCP 접속은 3-way hand shaking 순서로 이뤄지는데, 이때 네트워크가 쀍스럽게 느릴 때, 원치 않는 공격이 발생할 수 있다. client server --- SYN ---> <--- ACK/SYN --- --- ACK ---> 뭐 이런건데, 최초 SYN을 보낼 때, 클라이언트 OS는 타이머를 시작할 것이다. 그런데 망이 그지 같아서 SYN이 겁놔 느리게 서버에 도착했을 경우(간신히 TTL은 넘지 않은 상태에서) 서버는 ACK/SYN을 보낼테지만, 역시나 너무 느려서 클라이언트 OS 타이머는 타임아웃을 보낼꺼고 connect 실패를 반환할 것이다. 여기까지는 별 문제 없지만, 일반적인 어플리캐이션은 보통 3번 정도 retry를 하며 그만큼 SYN을 날리고 실패할 것이다. 이때 이런 것을 해당 지역에 수많은 클라이언트들이 동시에 한다면 원치 않는 DDoS가 될 수 있다. 원본 위치: http://purewell.egloos.com/3357784

롯데월드

넛스가 롯데월드 가자고 해서 주인님과 함께 셋이서 롯데월드를 목숨을 걸고 다녀왔다. 사진은 나중에... 확실히 에버랜드보다 놀이기구는 재밌는게 많지만, 둘 중에 하나 선택하라면 에버랜드다. 롯데월드, 사람이 너무 많아. 에어컨도 시원하게 안 틀어줘... 게다가 그지 같은 2호선. 원본 위치: http://purewell.egloos.com/3355481

connect 완료 시점은 accept가 아니다.

흔히 생각하기에 TCP에서 3-way handshaking(SYN→SYN-ACK→ACK)를 완료하는 시점이 accept를 하는 시점이라고 착각하기 쉽다. 그러나 경기도 오산이라는거~* listen시점부터 이미 서버쪽은 3-way handshaking를 할 수 있고, 접속을 완료한 뒤에는 그것을 backlog queue에 고스란히 모셔둔다. accept함수는 큐에서 그것을 긁어올 뿐. 원본 위치: http://purewell.egloos.com/3351468

2012, 멸망!

▒ 네이트닷컴 - 뉴스 이건 아닌 것 같아. 그때 마야인들은 우리가 2000년에 Y2K Problem을 맞이한 이유처럼, 2012년 즈음해서 새로 다시 만들려고 했던 건 아닐까? 만약 점괘나 천체관측 결과로 멸망이 8만년에 일어날 것이다라고 한다면, 8만년까지 달력을 만들 것인가? 그냥 단순히 그 시대에는 2012년까지 갈려면 멀었으니까 대충 그때 즈음으로 한 것이겠지. 원본 위치: http://purewell.egloos.com/3349816

빡센 여름

아주 그냥, 여름을 제대로 나고 있다. 8월 11일 - Everland Summer Splash! 8월 18일 - Star Dust 8월 25일 - Lotte World 휴... 쉬고 싶어... 원본 위치: http://purewell.egloos.com/3345745

백탄왕 닮았다

난 커피프린스를 보지 않는다. (딱히 반감이 있어서 그런 건 아니고) 그런데 은찬을 보면 볼 수록 돼지풀 (가칭) 운영자 사악드르 (가칭) 친구이자 내 후배인 백탄왕 과 너무 닮은 것 같다. ㅋㅋ 원본 위치: http://purewell.egloos.com/3342413

카리스마 로빈

카리스마 로빈을 보는 중에 괴생명체가 나오긴 하지만, 가볍게 무시하고... 아무리 봐도 봐도 봐도 질리지가 않는구만... 헐헐헐 원본 위치: http://purewell.egloos.com/3341808

지하철 에어컨 좀 빵빵하게!

썩을... 매일 타는 지하철, 매일 짜증이다. 5호선만 타고 다니며, 약냉방칸에 절/대/로/ 타지 않는데도 매일 덥다. 아... 좀!! 시원시원하게 틀어봐! 출퇴근 시간에는 시원시원하게 틀어줘야하지 않겠어? 원본 위치: http://purewell.egloos.com/3340909

포털 블로그냐 개인 계정 블로그냐

포털에서 제공하는 블로그냐 개인 계정 블로그냐 그것이 문제로다. 일단 한 쪽 장점을 열거하면 다른 쪽 단점이니 정리해보자. 개인 계정 블로그 장점 수정이 자유롭다. AdSense를 손쉽게 달 수 있다. 운영자로부터 게시물을 삭제/수정 당하지 않는다. 포털 블로그 장점 공짜 무제한 용량 무제한 트래픽 동일 포탈 블로그끼리 손쉬운 링크 정기 점검 및 백업 기타 서비스 (책으로 편찬) 짜잘하네. 자, 자유를 원할 것인가, 무제한 용량과 트래픽을 원할 것인가? 참고로 이 글은 절대로 돼지풀 (가칭)을 운영하는 후배 보라고 쓴 것 아님. ㅋㅋ. 뱀발: 호스팅 업체에 근무하는 친구에게 알아봤는데 호스팅 업체에서도 개인계정은 별 돈이 안 되기에 크게 신경 안 쓴다는군. 원본 위치: http://purewell.egloos.com/3339612

비루스 만세!?

비루스나 하나 만들어볼까나. 후배 블로그가 안 들어가진다. 트래픽 한도 초과란다. ㅋㅋ 비루스 만세!! 네티즌 비루스가 내 블로그에서 돼지풀 (가칭) 블로그를 강타한 모양이다. ㅋㅋ * 뱀발: 정말로 비루스를 만들지도 않았는데 어떻게 트래픽 한도를 초과했을까? 야동이라도 올려놓은게냐!? 원본 위치: http://purewell.egloos.com/3338338

여긴 서울이 아니야

어제부터 일기예보에서 신나게 폭염과 열대야를 떠들어대는 것을 들었다. 그러나 오늘 새벽에 추워서 이불 돌돌 말아 잤고(선풍기 끌 생각을 안 하다니) 하루 종일 흐리멍텅한 하늘이어서 그리 덥지 않았다. 지금도 선풍기 바람 쐬면서 앉아 있으면 시원한 듯. 그러나 다른 동에 살고 있는 사람은 더워 죽을꺼 같다는 둥, 선풍기 바람이 시원치 않다는 둥 한다. 이 작은 나라에서도, 도시 안에서도 날씨는 다른가보다. 원본 위치: http://purewell.egloos.com/3338325

소개팅 압박

달무리 선배(절대로 이모씨 아들 모진군이라고는 말 못 해!)가 요새 외롭다고 소개팅시켜달란다. 우리 회사가 여사우가 많긴 하지만, 대다수 임자 있으신 몸들. 게다가 내가 있는 곳은 개발팀. 내 주위에 소개팅가용여성이 없는 걸 어쩌라는거니? 어쩌라는거니? 어쩌라는거니? 원본 위치: http://purewell.egloos.com/3338005

에버랜드와 북극곰

북극곰 시원하겠다. 그나저나 옆에 애들이 자꾸 ' 빽꼼빽꼼 '이라고 하네. ㅋㅋ 일전에 짧은 3D 애니매이션 빽곰 을 말하는건가? 아무튼 시원하겠다. 마지막은 에버랜드에 나타난 유빈영화사 원본 위치: http://purewell.egloos.com/3337856

공짜는 바로 써주자.

금요일에 어떻게 어떻게 해서 애벌레랜드(가칭) 자유이용권 을 무료로 얻었다. 뒤도 안 돌아보고 바로 주인님께 토요일에 애벌레랜드 가자고 했고, 기간이 토요일까지만이라고 뻥쳤다. (이러지 않으면 귀찮아서 차일피일 미루다 못 간다. 게다가 이번 여름휴가도 어디 가지 못하고 방에 콕! 쳐박혀 있었다고 !!!) 부랴부랴 금요일 밤에 짐 싸고 교통편 확인한 뒤에 토요일 아침에 일기예보를 확인했다. (뭔가 이상하지 않우?) 써글... 토, 일 모두 비 왕창 이라는군. 그러나 우리는 애벌레랜드로 강행 했고 결과는 최고 였다! 날씨는 화창하다 못해 뙝볕이었지만 습하지 않았고, 애벌레랜드 Summer Slash (가칭)로 사방에서 물대포가 쏟아지는데 살짝 춥기까지 했다. 주인님과 함께 지쳐 쓰러질 때까지 놀았고, 집에 오자마자 퍼질러 잤다. 교훈: 공짜로 얻은게 있으면 아끼지 말고 바로바로 써주자. 교훈2: 우리나라 일기예보는 당분간은 반대로 알아 듣자. 원본 위치: http://purewell.egloos.com/3334957

파일 시스템 정보 읽어오기

이왕 하는 거 파일 시스템 정보까지 얻어오면 좋겠다 싶으면 POSIX표준인 statvfs()를 쓸 수 있다. 자세한 설명은 역시나 man 페이지를 확인하고, 아래 예제 소스는 /dev/shm 파일 시스템에 전체 크기와 남아 있는 용량을 기가바이트 단위로 표시한 것이다. #include <iostream> using namespace std; #include <sys/statvfs.h> const double div4giga(1024*1024*1024); bool printFSStat(const char* dev) {     struct statvfs vfs;     if ( statvfs(dev, &vfs) < 0 )     {        return false;     }     cout << "Total: " << vfs.f_bsize * vfs.f_blocks / div4giga << endl;     cout << "Free: " << vfs.f_bsize * vfs.f_bavail / div4giga << endl;     cout << "Used: " << vfs.f_bsize * (vfs.f_blocks-vfs.f_bavail) / div4giga << endl;     return true; } int main(int argc, char* argv[]) {     if ( !printFSStat("/dev/shm") )     {        cout << strerror(errno) << endl;     }     return 0; } * 뱀발: 요즘 시스템은 심심하면 64bit라 그런지 잘 돌아가는데, 혹시나 2G 이상 파일 시스템에서 안 될 경우에는 " -D_LARGEFILE_SOURCE -D_FILE_O

마운트 정보 읽어오기

Linux에서 마운트 정보를 읽어보자. getmntent() 가 바로 그것이다. 아쉽게도 POSIX, ANSI, IEEE 표준이 아니며, 리눅스 와 SunOS , HP-UX 등에서 사용할 수 있으며, FreeBSD 에서는 getmntinfo() 로부터 알아낼 수 있다. 이 함수는 내부 버퍼를 사용하기 때문에 쓰레드에 안전하지 않으며, getmntent_r() 으로 쓰레드에 대응할 수 있다. 자, 먼저 getmntent()를 하기 앞서, 마운트 정보를 읽고 쓸 수 있도록 핸들을 얻어와야하는데 그것을 하는 것이 setmntent() 이고, 다 쓴 핸들을 닫을 때 쓰는 것이 endmntent() 이다. 만약 중간에 마운트 정보를 바꿨으면, endmntent()할 때 비로소 적용된다. 자세한 것은 man페이지를 참조하고, 간단하게 C++로 마운트 목록을 보여주는 프로그램을 짜보았다. #include <iostream> #include <list> #include <string> #include <cstdio> #include <errno.h> using namespace std; #include <mntent.h> typedef struct me_type {     string fsname;     string dir;     string type;     string opts;     int freq;     int passno; } me_type; typedef list<me_type> me_list; bool getMountList(me_list& ml) {     ml.clear();     struct mntent * mnt;     const char* table = "/etc/mtab"; // 부팅할 때 정보를 읽으려면 /etc/fstab로 수정한다.     FILE* fp;     fp = setmntent (table, "r");   

서버야 죽지마, 흑흑!

4년 정도 쓴 서버가 드디어 한 두 대씩 맛탱이가 가고 있다. 심심치 않게 스스로 자살을 해주는 센스는 어디서 배운 버르장머리인지 모르겠지만 - 뭔가 말이 이상한데? - 거의 PC수준 서버를 혹사시키면서 수 년 동안 잘도 써왔다는게 놀랍다. 이렇게 열심히 일한 서버에게 몇 마디 해주고 싶다. 서버야 죽지마! 아직 할 일이 더 많이 있어. 게다가 내가 아무리 PC수준이라고 해도 네 몸값이 장난이 아니거든!? 아직 죽으면 안 되! 나는 야속하다. 원본 위치: http://purewell.egloos.com/3333939

비루스나 하나 만들어볼까나.

후배 가 블로그 하나 차려놓고 놀고 있는데, 요새 글이 잘 안 올라와서 협박을 좀 했다. 샘이: 포스팅좀 해봐. 심심해. 샤들: 응, 부산 갔다오면 더 올라오겠죠. 샘이: 없으면 지어서라도 올려. 심심해. 샤들: 알겠어요. ㅋㅋ 샘이: 안 올리면네 홈페이지로 RSS요청 계속 날려서 트래픽 소모시킬껴. 샤들: ㄱ- 협박하는 선배나, 협박한다고 지어서라도 올리겠다는 후배나... 각설하고, RSS요청을 계속 날려서 트래픽을 소모시키려면 한 컴퓨터에서 다다다 한다고 해결되지 않을 성 싶다. 호스팅 업체도 나름 DoS 탐지해서 막을테니까. 이럴 때 방법 없는게 비루스를 이용해서 전세계 컴퓨터가 한 호스트를 동시에 요청하는거다. DDoS... -_- 비루스 하나 만들어볼까나... 이 글을 보신 모든 분들께, 당장 http://dcple.com 을 서핑하십시오! (이거 광고 아냐?) 원본 위치: http://purewell.egloos.com/3327982

fork는 epoll에서 감시하는 객체까지 복제하지 않는다.

리눅스 서버에서 epoll을 이용해서 event를 감시하면서 동시에 fork할 때는 주의가 아주매우많이 필요하다. 커널 소스를 직접 들여다 봐야하겠지만, 대략 시간이 없고 귀찮은 관계로 생략한다. 결론부터 말하자만 epoll_fd로 관리하는 감시할 이벤트 목록은 커널영역에 만들어지며, fork가 이를 복제하지 않기 때문에 부모 자식 간에 동일한 epoll_fd로 목록을 수정하면 인생 종치는거다. 자자... 말이 길었다. 대충 소스를 보도록 하자. #include <sys/epoll.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char* argv[]) {         const size_t epoll_size(1024);         int epoll_fd = epoll_create(epoll_size);         struct epoll_event ev;         memset(&ev, 0, sizeof(ev));         ev.events = EPOLLIN;         epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &ev);         printf("%s\n", strerror(errno));         if (!fork())         {                 //epoll_ctl(epoll_fd, EPOLL_CTL_DEL, 0, &ev); // 여기 주목!                 close(epoll_fd);                 return 0;         }         sleep(1);         struct epoll_event evs[epoll_size];         int res = epoll_wait(epoll_fd, evs, epoll_size, 1000);         prin

New type

요즘 빈번하게 사람이든 짐승이든 기형을 많이 발견하곤 한다. 불현듯 생각난 것은 언젠가는 new type이 생기지 않을까? 지금 이 시간에도 늑대의 이빨, 박쥐의 귀, 코끼리의 목청, 말의 다리를 가진 사람이 태어났을지도. 원본 위치: http://purewell.egloos.com/3321972

금융은 어떻게 하는게 좋을까?

모금융회사 선전을 보면 돈 빌린 고객이 피치 못할 사정으로 돈을 갚을 수 없을 때 금융은 돈을 받아야 할까 말아야 할까라는 광고를 때리고 있다. 당연히 고객입장에서는 받지 말아야하고, 회사 입장에서는 받아야겠지. 근데 조건 봐서 안 받겠다는 것이다. 아직 우리나라 금융 첫발자국 정도 밖에 안 되겠지만, 눈꼽만치라도 발전하는 모습이 나름 보기 좋구먼. 원본 위치: http://purewell.egloos.com/3321827

고양이 복수

고양이는 복수를 하는 동물이라고 그런다. 그래서 그런지 부모님 댁에 키우는 어미 고양이는 새끼 고양이가 사람에 의해 찡찡거리면 찡찡거리는 상황이 끝났어도 터벅터벅 걸어와서 확 긋고(?) 간다고 한다. 헐, 좀 무서워지는데? 원본 위치: http://purewell.egloos.com/3318428

나한테 맡기지...

40대 커리어우먼 '과욕에 철창행' -_- 그러게 나한테 맡겼어야지. 1년만에 두 배로 불려준다니깐!? 그나저나 벗이나 좋은 관계를 유지하고 싶은 사람하고는 절대로 돈 거래가 있어서는 안 된다. 그냥 주는거라면 몰라도 말이지. 원본 위치: http://purewell.egloos.com/3318072

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)