기본 콘텐츠로 건너뛰기

11월, 2007의 게시물 표시

대한민국 국민의 M기질

각종 비리로 특권층 살지우기 1번 영향으로 IMF터짐 새로운 정부가 2번 뒷바라지 10년동안 뒤치닥거리 했다고 정부에 반감 자... 4번에서 생긴 반감이 있다고 치더라도 1번 특권층을 다시 뽑아야할까? 풉... IMF 또 겪고, 또 많은 사람이 명퇴하고, 또 많은 사람이 자살해야 할까? 만약 그렇다면 대한민국 국민은 M기질이 다분하다고 봐야겠다. 뭔게 계속 괴롭혀주고, 막막한 현실을 계속 제공해줘야하나보다. Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3507928

try { throw } catch {} & do { break } while (false) #2

rein님의 C/C++의 예외 모델 차이 포스팅에서 C와 C++ 예외 모델 차이, 나와 다른 견해에 대해 깔끔하게 잘 설명하셨다. rein님 포스팅을 보고 내 포스팅 에 덧글로 달까...라고 생각했지만 말도 길어지고 해서 트랙백납치!! 100년도 안 되는 삶을 살아오면서 실무에 setjmp/longjmp를 쓴 적은 단 한 번도 없다. 누구나 생각하듯 나 역시 'setjmp/longjmp는 미친 짓이야!'라고 밖에 설명할 길이 없다. (오로지 컴파일러나 커널/드라이버 만드는 사람이나 쓰는 system call이라 생각하고 있다!) 그러나 본인은 rein님과 달리 C++코드에 거침 없이 do-while(false)를 쓴다. 그것이 C++답지 않다는 것도 물론 알고 있다. 그것이 C++에서보다 좀더 신경써야할 것이 많다는 것도 알고 있다. 하지만 실무를 하면서 - 그것도 미칠 듯한 퍼포먼스를 내야할 Router나 기타 서버 프로그래밍을 하면서 try-catch는 내겐 너무 버겁다. 예외상황이 전체 프로그램에서 크게 차지하는 부분이 많지 않더라고 해도, 가끔씩 나는 장애와 그에 따라 발생하는 수많은 예외상황에 try-catch는 너무너무 무겁다. 결국 rein님한테 하고 싶은 소리는 저도 setjmp/longjmp는 쓰지 않아요. 업무 요건 상 한 번 예외상황이 발생하면 허천나게 발생해서 try-catch는 너무 무거워요. 결론은 업무요건에 맞춰 알아서 쓰자~* 원본 위치: http://purewell.egloos.com/3507734

try { throw } catch {} & do { break } while (false)

예외를 처리하기 위해 여러가지 방법이 있는데, C++에서 표준으로 제공하는 try-throw-catch가 있다. 그러나 이 방법은 exception을 처리하기 위해 갖가지 삽질을 내부적으로 하는 것으로 매우 느리다는게 잘 알려져 있다. 그래도 얼마나 느린지 알고 싶었다. 그래서 do {} while (false)와 비교해보기로 했다. #include <exception> #include <iostream> #include <sys/time.h> using namespace std; static size_t gTestCount(100000); typedef long long ts_t; ts_t getTimestamp(void) { static __thread struct timeval tv; gettimeofday(&tv, NULL); return 1000000LL * tv.tv_sec + tv.tv_usec; } inline void funcDOWHILE(void) { static __thread size_t i(0); do { ++i; if ( i%2 ) break; return; } while (false); ++i; return; } inline void funcEXCEPTION(void) { static __thread size_t i(0); static exception _e; try { ++i; if ( i%2 ) throw(exception()); } catch(const exception&) { ++i; } return; } int main(int argc, char* argv[]) { ts_t t1, t2, diff; t1 = getTimestamp(); ...

Message Queue of UN*X

발로 짠 UN*X message queue 프로그래밍. 아... 귀찮스러... CMake가 깔려 있다면, 아래와 같이 입력하면 대략 안성 맞춤이다. $ cmake . $ make msgprj.zip 원본 위치: http://purewell.egloos.com/3506312

설치형으로 간다고 달라지나?

요새 욕설이나 19禁 영상 등을 이글루스에 올려 동의 없이 게시물이 감춰지는 현상을 목격할 수 있다. 이에 블로거는 시대가 어느 때인데 사전 검열이나 그런 것으로 제한하려고 하느냐고 반발한다. (옳소!) 그런데 불평의 대상이 정보통신윤리위원회가 아니라 SK라는 것에 새삼 놀라울 따름이다. 더더욱 놀란 것은 이러한 검열(?)때문에 설치형 블로그로 옮긴다는 말도 안 되는 포스팅이 눈에 띄였다. 거참... 대단하다. 설치형 블로그 쓰면, 정보통신윤리위원회에 안 걸려들 것 같은가? 아무리 포털 블로그를 쓰지 않는다고 해서 정보통신윤리위원회가 적용하고 있는 법률을 피해가긴 어려울 것이다. 왜? 서버가 우리나라에 있으니깐. orz... 차라리 구글의 Blogger.com이나 MS의 MySpace 같은 곳으로 옮기겠다고 하는게 옳지 않을까? 덧글: 그나마 포털에 있는 블로그니까 이런 식으로 경고에 끝나는게 아닐까? 설치형블로그로 갔을 경우에는 호스팅 업체에 직접 압박이 가해지거나, 정보통신윤리위원회(또는 검경찰)를 직접상대해야할 것 같은데... 결론: 19禁 영상은 감추는게 맞고, 욕설이 뭐 어떠냐... 영화에도 다 나오는데... 관련법규 개정하라고 압력 넣는게 옳다! 결론2: 레진, 지못미 ▶◀ 결론3: 그냥 해외 포털로 옮겨라. Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3505932

앨리 새끼 근황

따쉭 폼잡기는... 한 주먹도 안 되는군. 자매품 -_- 세스 아깽들... (참고로 가운데 뒤집어진 녀석이 오드 아이인데 불쌍하게도 돼지풀(가칭) 운영자 사악드르(가칭)에게 팔려갔다.) 원본 위치: http://purewell.egloos.com/3505117

FreeBSD에서 shm_open은 open일 뿐이다.

Linux에서 잘 써먹고 있는 파일처럼 쓸 수 있는 shared memory interface인 shm_open. 이게 표준안(POSIX.1)에 있길래 아무런 의심 없이 잘 썼지. 그런데 아쉽게도 FreeBSD에서 이 녀석은 단순히 open을 wrapping한 것일뿐. 즉, 그냥 일반 파일을 조작하는 것에 불과하다는 것이지. 현재 FreeBSD 6.2가 나왔지만 FreeBSD에서 제공하는 man page 에는 아직도 래핑함수라는 걸 명시하고 있네. In the FreeBSD implementation, POSIX shared memory objects are implemented as ordinary files.  The shm_open() and shm_unlink() act as wrappers around the open(2) and unlink(2) routines, and path, flags, and mode arguments are as specified for those functions.  The flags argument is checked to ensure that the access mode specified is not O_WRONLY (which is not defined for shared memory objects). 에구구... 안타까워라. 실제로도 FreeBSD에서 shm_open하면 실행한 디렉토리에 바로 파일이 만들어지네... Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3502714

익스플로어호 침몰

Daum 미디어다음 붉은 선체에 하얀 줄무늬의 노르웨이 국적 유람선 'MS 익스플로러' 는 남극의 찬 수온을 견딜 수 있도록 설계된 첫 유람선으로, 불여우나 리눅스 등을 연상한 것은 나뿐인가? 원본 위치: http://purewell.egloos.com/3501696

FreeBSD::errno

EPERM 1 Operation not permitted ENOENT 2 No such file or directory ESRCH 3 No such process EINTR 4 Interrupted system call EIO 5 Input/output error ENXIO 6 Device not configured E2BIG 7 Argument list too long ENOEXEC 8 Exec format error EBADF 9 Bad file descriptor ECHILD 10 No child processes EDEADLK 11 Resource deadlock avoided 11 was EAGAIN ENOMEM 12 Cannot allocate memory EACCES 13 Permission denied EFAULT 14 Bad address ENOTBLK 15 Block device required EBUSY 16 Device busy EEXIST 17 File exists EXDEV 18 Cross-device link ENODEV 19 Operation not supported by device ENOTDIR 20 Not a directory EISDIR 21 Is a directory EINVAL 22 Invalid argument ENFILE 23 Too many open files in system EMFILE 24 Too many open files ENOTTY 25 Inappropriate ioctl for device ETXTBSY 26 Text file busy EFBIG 27 File too large ENOSPC 28 No space left on device ESPIPE 29 Illegal seek EROFS 30 Read-only filesystem EMLINK 31 Too many links EPIPE 32 Broken pipe EDOM 33 Numerical argument out of domain ERANGE 34 R...

OpenMP

OpenMP는 다양한 플랫폼 에서 C/C++/Fortran에서 병렬처리 를 손쉽게 해주는 API일종이다. 공식 홈페이지는 http://www.openmp.org 이다. 뭔말인고 하니, 병렬처리 프로그래밍하려면 UNIX에서 fork/ipc나 pthread 등등 다양한 API에 대해 공부해야하고, 이것을 Windows로 옮길 경우, Win32API로 소스를 뜯어 고쳐야하는 불상사가 있었다. 이걸 해결하고자 OpenMP 표준을 지키는 컴파일러에서 간단하게 thread를 생성, 운용할 수 있도록 통합한 API이다. 게다가 잘만 운용하면 기존 소스를 거의 고칠 필요가 없다는 것! OpenMP는 현재 2.5(Draft는 3.0)까지 나왔으며, GCC에서 지원하는 것도 2.5까지다. 컴파일할 때 -fopenmp를 해주면 "#pragma omp" 구문을 알아서 "omp_*" 함수로 변환해준다. 아래는 간단한 예제이며, 돌려본 결과를 미리 이야기 하자면, 66.7% 이득을 봤다. 나름 쓸모 있는 녀석이긴 하지만, 제어할 수 있는 부분이 너무 적어서 과연 과학적 연산을 제외하고 일반적인 상품(게임 클라이언트)에 쓸모가 있을런지는 모르겠다. 테스트 환경 Linux 2.6.23 AMD Athlon 64 X2 Dual Core 3800+ RAM 2G GCC 4.1.2 GLIBC 2.7 CMAKE 2.4 먼저 소스 파일(openmp.c) #include <pthread.h> #include <sys/time.h> #include <omp.h> #include <stdio.h> #define __restrict__ restrict static const size_t gTestCount = 10000000; static const size_t gArraySize = 32*32; long long getTimestamp(void) { static __thread struct timev...

앨리 새끼 근황

앨리 새끼 근황. 짜식들... 추우니까 나오지도 않고 올망졸망 모여만 있구나!! 원본 위치: http://purewell.egloos.com/3498281

Intel 교육

어제 Intel 과 BestInfra 가 함께한 Software Optimization on Intel Architecture(Linux)를 듣고 왔다. 몇몇가지 정리를 하자면 아래와 같다. 인텔에서 제작한 최신 C/C++ 컴파일러(ICC 10 - 2007년 11월 21일 기준)는 인텔에서 출시한 모든 CPU에 추가된 확장명령코드를 이용해 최적화를 할 수 있다. 다른 컴파일러들이 귀찮아서 거의 안 하는 짓꺼리를 인텔 컴파일러는 이 꽉 깨물고 최적화해준다. 뭐, 가장 볼만한게 Loop Vectorization 을 해서 SIMD 로 기계어 만들어내고 그걸 CPU에 집어넣으니, GCC의 x86코드보다 훨 빠르다!라는 것. 당연하지. (GCC는 범용 컴파일러. 많은 종류 CPU를 소화할 수 있지만 그만큼 특화가 어렵고, 같이 제공하는 GLIBC 역시 특화한 라이브러리에 비해 느린 편이다.) 뱀발: 관계자 설명에 의하면, 인텔은 최신 머신에 대해 최고 컴파일러를 빨리 내놓을 뿐, 최소 6개월 정도면 GCC에서도 비슷한 수준으로 최적화하는 컴파일러를 만들어낸다고 한다. 장사를 하자고 말자고? 어짜피 인텔은 H/W회사지 S/W회사가 아니다. 컴파일러 장사를 하기보단, 자사 CPU에서 이런 식으로 동작시키면 좀더 빠르게 동작해요를 홍보하기 위한 것이지. 뭐... 이게 중요한게 아니고... 인텔 컴파일러 장점은 GCC/GLIBC와 거의 완벽하게 호환(확장기능까지!)하기때문에 소스코드를 고칠 노력 없이 컴파일 옵션만으로도 더 나은 성능을 맛 볼 수 있다. 게다가 각종 Object/Library 파일도 호환한다. 몇몇가지 자주 쓰이는 수치관련 라이브러리를 최적화하여 만들어 제공한다. 예로 기본 math대신에 imf라이브러리를 이용하면 좀더 좋은 성능을 맛볼 수 있다. 원한다면 소스에서 컴파일러 디렉티브를 이용해 최적화요소를 컴파일러에게 직접 지시할 수도 있다. 컴파일러가 내뿜는 최적화 요소 정보가 GCC보다 훨씬 많고 다양해서 실제 코드를 고쳐서 최적화를 할 때 많은 도움이 된다...

IA - Intel Architecture

IA는 말 그대로 인텔에서 만든 CPU 구조이다. 보통 흔히 볼 수 있는 것이 IA-32이며, IBM호환, i386, x86 등과도 비스무레하게 쓰인다. 이 녀석은 최초에 하위호환성 이유로 CISC구조를 가지고 가고 있으며, 이후에 성능한계를 극복하기 위해 겉은 CISC이며 내부적으론 RISC구조를 일부 갖게 되었다. 그러나 역시나 CISC정신을 이어 받아, 쓰던 기계어는 그대로 계속 쓸 수 있다. Intel이 서버시장에서 성능한계를 극복하고자 HP와 손을 잡고 2001년 첫 Itanium을 발표했다. 이른바 IA-64로 HP도움으로 RISC를 기반하며, 과거 CISC 기계어는 emulator로 작동한다. 여기서 IA-64는 IA-32와 호환하지 않는다.(해도 쓸모가 없을 정도로 느리겠지...) OS를 비롯해서 모든 application을 다시 만들어야하는 수고가 있지만 시장에서 잘 돌아가고 있나보다. Itanium2를 2007년 11월에 발표한 것 보니까... 아무튼 IA-32와 IA-64와 뭔가 관련이 있을까해서 찾아봤는데, Intel브랜드라는 것외에는 아무런 관련이 없다는 결론이다. Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3496817

전공분야 최고 지식DB

각종 검색엔진을 통해 내가 원하는 정보를 찾는데 최고 지식DB는 아쉽게도 네이뇬 지식즐 (가칭)이 아니었다. 전공분야 최고 지식DB는 . . . . . . . . . . . . . . . . . . . . . . 해피캠퍼스. orz OTL 공짜로 지식을 습득하는 시대는 끝난 것인가? Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3496774

Linux::errno

EPERM 1 Operation not permitted ENOENT 2 No such file or directory ESRCH 3 No such process EINTR 4 Interrupted system call EIO 5 I/O error ENXIO 6 No such device or address E2BIG 7 Arg list too long ENOEXEC 8 Exec format error EBADF 9 Bad file number ECHILD 10 No child processes EAGAIN 11 Try again ENOMEM 12 Out of memory EACCES 13 Permission denied EFAULT 14 Bad address ENOTBLK 15 Block device required EBUSY 16 Device or resource busy EEXIST 17 File exists EXDEV 18 Cross-device link ENODEV 19 No such device ENOTDIR 20 Not a directory EISDIR 21 Is a directory EINVAL 22 Invalid argument ENFILE 23 File table overflow EMFILE 24 Too many open files ENOTTY 25 Not a typewriter ETXTBSY 26 Text file busy EFBIG 27 File too large ENOSPC 28 No space left on device ESPIPE 29 Illegal seek EROFS 30 Read-only file system EMLINK 31 Too many links EPIPE 32 Broken pipe EDOM 33 Math argument out of domain of func ERANGE 34 Math result not representable EDEADLK 35 Resource deadlock would occur ENAMETOOLON...

중이 싫으면 절간을 떠나라?

'중이 싫으면 절간을 떠나라' 내가 싫어하는 말 가운데 하나다. 거의 '똥이 무서워서 피하나, 더러워서 피하지'와 동급 수준이다. 난 능동적인 삶이 좋다. 피동에 늘어지는 것도 싫다. 덕분에 좀 거칠긴 해도 피동문장을 쓰지 않으려고 노력한다. 각설하고, 중이 싫으면 절간을 고치던가, 같이 사는 스님을 설득하던가 해야지 않나? 똥도 더러우면 얼른 치우거나 누굴 부르거나 해서 치울 생각을 해야지 그냥 그 순간만 피해가? 언제까지 그렇게 살텐가? 하하하하하하하하하하하하하하하하하! 또 각설하고, 삶을 살면서 무조건 부딪힐 필요는 없지만, 그렇다고 매순간을 요리조리 피해다닐 필요도 없다. 좀 팍팍한 느낌이 들지 모르겠지만, 지금까지 부딪히지 않고 잘 피해서 지내왔다면, 적당히 부딪혀 보는 삶도 살아야하지 않을까? Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3482506

금세, 금새?

으아악! 이제까지 금새가 맞는 말로 잘못 알고 있었다. 물론 '금새'는 물건값을 뜻하는 명사이다. 그러나 우리가 흔히 쓰는 '바로 지금'이란 말은 '금세'이고, 이것은 '금시(今時)에'의 준말이란다. 어흑... Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3482491

EPOLL* == POLL*

Linux에서 사용할 수 있는 최고 MUX, epoll! 아흥~* 이것에 그냥 아주 녹아들어 살고 있다. 아주 좋아좋아~* 각설하고, 프로그래머라면 될 수 있으면 잘 설계한 소스 하나 가지고 여기저기 사골 울궈 먹듯 울궈 먹고 싶어할 것이다. 나 역시 그랬고, 기존 poll을 잘 씌운 클래스를 epoll로 포팅하려고 했다. 이때 문제점이 하나 있는데, 각 API에서 이벤트를 나타내는 변수를 POLL* 또는 EPOLL*로 처리하고 있다. 많이 쓰이는 녀석(IN, OUT, ERROR)은 대충 비슷해보이는데 말이야... 변환 없이 그냥 EPOLL에 POLL* 쓰면 혼날까? 결과적으론 EPOLL*랑 POLL*랑 동일한 녀석이다. 소스를 보자... #include <cstdio> #include <cstdlib> #include <typeinfo> using namespace std; #include <sys/poll.h> #include <sys/epoll.h> #define SHOWDEF(x) \ printf("%s(%s,%u): 0x%04X\n", #x, typeid(x).name(), sizeof(x), x) #define CMPDEF(x) \ printf("compare %s: %d\n", #x, POLL##x == EPOLL##x) int main(int,char**) { SHOWDEF(POLLIN); SHOWDEF(POLLPRI); SHOWDEF(POLLOUT); SHOWDEF(POLLERR); SHOWDEF(POLLHUP); SHOWDEF(EPOLLIN); SHOWDEF(EPOLLPRI); SHOWDEF(EPOLLOUT); SHOWDEF(EPOLLERR); SHOWDEF(EPOLLHUP); CMPDEF(IN); CMPDEF(PRI); CMPDEF(O...

돼지풀 강제이사촉구 성명서

돼지풀(가칭) 은 엄청난 인기를 휘몰아가는 블로그이지만 블로그 주인장 사악드르(가칭)의 귀차니즘에 말미암아 지속적으로 호스팅 업체로부터 한도 트래픽 초과 메시지를 네티즌에게 강요하고 있다. 아눼... 가글(가칭) 애들센스(가칭) 을 붙여서 돈 모아 한도 트래픽을 늘리던가, 아니면 최후 수단으로 덕후루스(가칭) 나 네이뇬(가칭) 블로그 , 그들만의이야기(가칭) 등 블로그 전문 무료 서비스로 이사를 강제로 촉구하는 바이다. 2007년 11월 7일 돼지풀(가칭) 팬과는 전혀 상관 없는 샘이 뱀꼬리: 동의하면 댓글 달든지 말든지... -_- 원본 위치: http://purewell.egloos.com/3473445

이글루스에 스크립트 삽입하기

<img src = 'betagarden.gif' onload = "Javascript:document.getElementById('TOP').innerHTML ='<imgwidth=0 border=0 height=0></img>' + '<scrip'+'t defersrc=\'http://www.google-analytics.com/urchin.js\'type=\'text/javascript\'></scrip'+'t><scrip' + 't defertype=\'text/javascript\' >_uacct =\'UXXXXXXXX1\';urchinTracker();</scrip' + 't>'"> 말이 필요 없지 않은가? 원본 위치: http://purewell.egloos.com/3472454

검찰에 출두하래

아침에 자리를 비웠더니 옆에 앉은 A군이 검찰에서 전화 왔었다고 한다. 10월 20일에 출두 안 했다고 11월 5일 오후 2시 서울검찰청 제 3호에 출두하라고 메모를 남겨놨다. 뭐지? 내가 나도 모르는 사이에 뭔가를 저질렀나? 이전처럼 ISP업체가 잘못된 DHCP정보를 싸이버수사대에 넘겨서 하지도 않은 해킹을 했다고 덤탱이 쓴 건가? 181818181818... 이러고 있는데, 번뜩 뭔가 떠올랐다. 샘이: 어눌한 목소리로? A군: 아줌마가 녹음한 목소리 샘이: 녹음한 목소리가 어눌했어? A군: 그냥 사람이 녹음한 것 같아. 뭐, 관련해서 일 없으면 피싱인 것 같아. 샘이: 검찰에 끌려갈 일 한 적 없다. 있었으면 등기로 출두장을 우편물로 보냈겠지. (모시러 오거나) A군: 글치- 샘이: 전화에서 내 이름을 먼저 불렀어? A군: 아니 샘이: -_- 9번 누르래? A군: 응... 피싱이 확실해지고 있다. 이를 더 확실히 하기 위해 검찰청 홈페이지(http://www.sppo.go.kr) 에서 대표 전화(02 - 3480 - 2000)를 알아내서 전화해봤다. 거의 걸자마자 바로 받아서 깜짝 놀랐다. 상담원: 여보세요? 샘이: 네, 한 9시 반 즈음해서 10월 20일까지 검찰 출두하지 않았다는 전화를 받았는데요. 상담원: 혹시 0이나 9번 누르라고 하지 않았나요? 샘이: 네, 누르라는데요? 상담원: 보이스피싱입니다. 샘이: 네, 감사합니다. 상담원: 네, 감사합니다. 빠른 응답과, 빠른 처리... 이번엔 검찰을 사칭해서 보이스피싱하나 보다. 검찰 상담원측도 하도 확인 전화가 많이 오는지 바로 물어보는구나! 이렇게 생각하고 있는데, A군 자리로 전화가 와서 똑같은 소리를 한단다. 바로 끊었지만... 개쉙! 원본 위치: http://purewell.egloos.com/3465914