기본 콘텐츠로 건너뛰기

3월, 2007의 게시물 표시

개혁해야지, 나는 빼고.

역시나 여르뽕

내 자랑스런 후배 가운데 그나마 겉모습이 성한 녀석이 하나 있는데 하는 짓은 다른 후배와 다를 바 없는 엽기다. 그래서 별명도 여르뽕. 오래간만에 오늘 대화를 살짝 갈무리 했다. 대화명은 나름 수정하였다. 샘이:요~슝 샘이:머더고 사라 여르뽕: 낭만 을 즐기며 샘이:미췬. 샘이:도구를 쓰면서? 여르뽕:아니 여르뽕:난 주로 만들지 샘이:ㅡ_-) 변태... 스샷 찍어서 달넷에 올려야지 여르뽕:이제 스샷의 시대는 갔어~ 샘이:오, 대담한데? 여르뽕: 대담한 노출 ? 샘이:역시 승태다워. 여르뽕:나 답다는건 너무 평범 하다는건데 역시나 자랑스런 내 후배님이다. orz OTL 원본 위치: http://purewell.egloos.com/3079300

오늘 블로그 막 내린겨?

정말이지 오늘 볼만한 블로그가 없네. 블로그 사용자가 오늘 블로그 안 쓰기로 모두 단합한겨? 그런겨? 아앍! 일만 하라는 신이 내린 계신게야... orz OTL 원본 위치: http://purewell.egloos.com/3079287

shm_open에서 path는 실제 파일이 아니다.

당연한 이치겠지만 shm_open에서 첫번째 인자로 받는 path는 실제 파일이 아니라 OS에서 shared memory object를 구분하기 위한 이름일 뿐이다. Linux 2.6 커널에서 /dev/shm를 마운트 하는데, 이것은 shm_open으로 연 객체를 사용자가 파일형태(실제 파일은 아니고 파일 흉내)로 shared memory object에 접근하도록 만들어놓은 interface일 뿐이다. IBM개발문서 를 보면 /dev/shm이 tmpfs라는 file system이라는 것과 reboot하면 깔끔하게 내용이 날아가버린다는 사실도 확인할 수 있다. 아래는 간략한 shm_open을 이용한 테스트 프로그램이다. 이것을 위해서는 df -h 해서 /dev/shm 용량이 2기가 정도는 있어줘야 문제 없이 일을 수행할 수 있을 것이다. 이는 fstab을 고치거나 'mount -oremount,size=2g /dev/shm' 하면 대충 넘어갈 것이다. (정확한 사용량은 1,749,470,000 bytes로 약 1.6 giga bytes에 이른다. 쒧!) // 헤더 겁내 많네. #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/resource.h> #include <signal.h> #include <fcntl.h> #include <errno.h> #include <unistd.h> // 아름다운 STL #include <map> #include <iostream> #include <string> using namespace std; const size_t g_total_count(170000);     //!< 객체 개수 const string g_shm_id("/shmob

비, 안개, 우박 그리고 황사

오늘 날씨 정말 멋지다. 새벽엔 보슬 비 에 아침에 자욱한 안개 , 그 안개가 누리끼리한게 황사 조미료 썼구만? 밥 먹고 있는데 건물 유리창 부수는 줄 알았더니만 우박 튀는 소리였네. 오늘 조용히 그리고 조심히 집에 후딱 들어가야겠다. 그나저나 저녁에 비 온다는 거 같더니만 우산도 안 가지고 나왔네 그려. 원본 위치: http://purewell.egloos.com/3078820

<이글루스펫> 두부최초진화

뭐냐... 점점 더 악마로 가는군. 원본 위치: http://purewell.egloos.com/3078533

봄바람과 글꼴

슬쩍 봄바람도 불거니와 잠도 오겠다, 지루한 참에 상냥한J씨 님과 봄봄 님이 웹폰트로 이글루스를 꾸민걸 보면서 나도 바꿔볼까 하고 삽질을 정신 없이 하기 시작했다. (일 해, 월급도둑아!) 그러다가 문득 귀찮음이 솔솔 찾아왔다. 자, 이제 이 귀찮음을 위해 삽질 결과를 날릴 수 있는 좋은 변명을 찾아야할 때가 온 것이다. 이런, 불여우 에서는 웹폰트로 아무리 꾸며도 제대로 나오지 않네? 아이 안타까워라. 원본 위치: http://purewell.egloos.com/3077096

문법강조

옷장수나라 블로그::Google의 Prettify 프로젝트 구글 이래도 이글루스에서 쓸 수 없다는거~* 법적 문제만 어떻게 하면 이글루스에서 저거 긁어와도 좋을텐데. 원본 위치: http://purewell.egloos.com/3076879

추통 입소하다.

아무리 내가 좀 무관심했기로서니 전화도 안 하고 오늘 훌쩍킹 입소한 동렬이. 조심해서 잘 갔다와라. 4주 아무 것도 아니다. 대충 뭐 하다가 힘들만 하면 쉬고 하니까 재밌을꺼야. 다만 좀 추울 때 가는구나. 쯧쯧... 그건 그렇고 백탄왕과 대화내용. 백탄왕: 오덕후 이미지 벗고 나와야할텐데. 샘이: 되려 군덕후 되는 거 아니여? 뒷통수가 아려와. 잇힝~* 원본 위치: http://purewell.egloos.com/3074626

완소 PHP, 처참하군.

Month of PHP Bugs - 23일차 내용을 살짝 곁들여본다면... 이 취약점에 대해서는 아직 대책이 없으므로 당분간 사용자와 서버 현황에 대한 모니터링을 강화하는 것이 좋겠습니다. 아직 대책이 없으므로 아직 대책이 없으므로 아직 대책이 없으므로 아직 대책이 없으므로 아직 대책이 없으므로 아직 대책 이 없으므로 PHP를 개발하는 사람 날밤 새겠군... 날밤이나 새면 다행이고, 아님 말고. 원본 위치: http://purewell.egloos.com/3070227

Perfomancing의 새이름, ScribeFire!

ScribeFire Perfomancing을 잘 사용했다가 갑자기 업그래이드 메시지가 나왔지만 이내 다운로드 실패가 떴다. 뭔가 해서 봤더니, ScribeFire 라는 새로운 이름으로 바뀌었다. 그다지 뭔가 바뀐 것 같진 않고 때깔만 조금 바꼈다. Perfomancing을 제거하고 불여우를 껐다 켰다, ScribeFire를 설치하고 불여우를 껐다 켰다. 이거 참... 이런 때 참 불편하구만. 혹여 Perfomancing을 제거하고 끄지 않았을 경우 플러그인이 꼬일 수 있기에 그렇게 하였다. 잘 올라가려나... Powered by ScribeFire .← 끝에 이거 자동으로 달아주는데 'Settings'에서 바꾸면 자동으로 붙지 않으며, Egloos를 MetaWeblog API 인식시키고(자동으로 하면 인식 못한다), API Key를 암호 넣는 곳에 넣으면 Perfomancing과 달리 에러를 뱉어내지 않는다. 카테고리도 잘 넘겨 주고 받는다. 만족~* 원본 위치: http://purewell.egloos.com/3070179

Perfomancing과 이글루스

몇달 째 Perfomancing과 이글루스가 안 되서 그냥 포기하고 이글루스 기본 편집기를 썼다. 그러다가 문득 어디선가 API Key를 Perfomancing에 API Key 있는 곳에 넣지 말고 패스워드를 대신해서 넣어보라는 글을 본 것 같다. (까마득하다) 오늘 그 기억을 더듬어 다시 설정했더니 일단 글목록까진 나왔다. 그리고 지금 Perfomancing을 이용하여 오래간만에 글을 쓰는데 과연 이게 잘 돌아갈런지... 응답이 왔는데 무슨 에러가 뜬다. 그런데 잘 된다. 뭐...뭐지? 원본 위치: http://purewell.egloos.com/3069470

DivX Player 3

DivX Player DivX Player 2 질렀다. 디자인 완전 포기 + 기술력 만빵 = 드림박스 DX-HD1080i 아, 정말이지 보면 볼 수록 싸구려 티가 철철 넘치는 디자인에 자꾸 속이 상하려고 한다. (아직도 포기 못했다) 의외지만... 왼쪽위에 ' 드림박스 '가 살짝 때깔 좋게 느껴진다. 자! A/V의 세계로!! 원본 위치: http://purewell.egloos.com/3065021

FreeMAT? MatLAB?

오픈소스 매틀랩 FreeMat FreeMAT 주인 알게 모니터링 중인 이글루가 있는데 그냥 막 가져오기 뭐하고, 그렇다고 계속 트랙백 남겨주기도 주인한테 귀찮아 보이고... 암튼 오픈소스로 MatLAB 클론을 만들었다는군. OS 안 가리고 잘 돌아간다는데... 뭘로 만든게지? QT인가? 설마 #if, #else, #endif로 OS별로 삽질해놓은 것은 아닐꺼고... 그나저나 학부시절에 추억, MatLAB(...이라고 쓰고 '맬랩'이라고 읽는다.) 살짝 가지고 놀았지. 회로쪽에 살짝 쓰기도 하고 ImageProcessing할 때도 살짝 쓰고 말이야. 원본 위치: http://purewell.egloos.com/3060560

완소 PHP가 그럴 리 없어!

Month of PHP Bugs - 18일차 MOPB 젝필드 삼종세트!! 자부하던 PHP가 잘도 망가지고 있다. 이것저것 잡다구리한 유틸에 PHP를 애용하고 있지만, 웹서비스로써 PHP가 너무 처참하게 무너져내리고 있다. 좀 안타깝기도 하고, PHP 엔진 개발자들의 한심한 작태에 일침을 놓는 것 같기도 하고... 심정이 좀 복잡할 뻔 했다. (뭐냐!?) 난 PHP를 웹서비스로 이용 안 하잖아? ㅋㄷㅋㄷ 갑자기 아~~~~~~무 이유 없이 Ruby 도 웹언어로 활약 가능하다는 걸 깨달았다. 그거도 좀 해볼까? 원본 위치: http://purewell.egloos.com/3060513

졸릴 때...

졸릴 때, 어떻게 하시나요? 화장실, 비상구 계단, 옆자리 ... 가리지 않고 20분 정도 잔다. 개운하게 다시 일하기! 원본 위치: http://purewell.egloos.com/3053676

한글/한자 논쟁

30년이상 되풀이 된 한글과 한자 논쟁 그 이유를 정리해본다 ← 거침 없이 클릭하시라! 오래간만에 글다운 글을 본 것 같다. 정말이지 저 글대로 잊을 만하면 한자네 한글이네 해서 매번 기사가 나고 그에 대해 말도 많이 오고 갔던 것으로 기억한다. 뱀발: 아련히 공룡책(Operation System Concept 번역본)이었나?  너무 순우리말로 번역한게 떠오르는구만... Thread를 날실(?)로 번역한 것처럼 억지가 많아서 오히려 읽는데 방해였지. 뱀발: 현재 컴퓨터에서 '한자'글쇠를 '한글을 한자로 변환'하는 것보다, '특수문자 입력(☆♡ 이런거 같은...)'에 더 많이 쓰는 것 같다. 원본 위치: http://purewell.egloos.com/3051781

가족도 지키는 군대생활!

의지의 한국인 2. 미국에서 한국인이 운영하는 식당에 무장강도가 들어왔는데, 45세 주인장이 한 놈은 머리에 총알을 곱게 심어주셨고, 다른 한 놈은 등짝에 심었다. 이 장면을 누군가 찍어 올렸고, 그 아래 한국인은 젊은 시절에 군대를 다녀오기 때문에 저렇게 할리우드액숀(hollywood-like)처럼 쏠 수 있다고 덧글이 달렸다. 정말 그렇다고 한다면 가족도 지킬 수 있는 군대생활 아닌가! 원본 위치: http://purewell.egloos.com/3048828

extern "C"

C++은 특성상(오버로딩이나 기타등등) symbol에 name mangling을 사용한다. 때에 따라서 이러한 name mangleing을 사용하지 말아야 할 때가 있다. 이러한 것은 extern "C" 키워드를 사용하여 name mangling을 하지 말도록 컴파일러에게 알려줘야한다. 일반적으로 C/C++을 섞어서 쓸 경우가 있을 때(library 작업 등) 아래와 같이 쓰는 것이 괜찮을 듯 싶다. #if defined( __cplusplus ) extern "C" { #endif extern int doIt(const char* what); #if defined( __cplusplus ) } #endif __cplusplus 라는 definition은 C++ 컴파일러가 암묵적으로 정의해놓은 것이다. (특별히 옵션 줄 필요 없음) extern "PASCAL" 파스칼 타입으로 name mangleing한다. extern "FORTRAN" 포트란 타입으로 name mangleing한다. 각기 언어와 C++간 협업을 할 때 쓰인다. 원본 위치: http://purewell.egloos.com/3047740

이글루스, 개인정보 관련 정책 바꿈

이글루스 가 개인정보에서 필요 없는 부분은 가입할 때 받지 않거나, 가입한 사람도 지울 수 있도록 수정하였다. 아주매우많이 바람직한 방향이다. 다만 리플이... 내가 알려줄 성 싶으냐!! Commented by NoSyu at 2007-03-08 16:25 # 주민번호는 아마 성인인증(아직도 이글루스 18금이죠?;;) 때문일 듯 싶어요. 필요한 것만 가지는 모습 좋아보입니다.^^ Commented by 쌍부라 at 2007-03-08 17:47 # 18금 맞나요? 요새 당당하게 성인이 아님을 밝히는 곳이 많아진 걸 보면 아닌 것 같은데.. Commented by e91005 at 2007-03-09 08:54 # 유레님// 고맙습니다. 레키님// 그러게말입니다. 어쩔 수 없는 부분인것 같습니다. 도리님// 맞습니다. 어차피 상품발송할때 다시 주소를 확인하는건 필수니까요. Spatialguy님// 서비스에 꼭 필요한 개인정보만을 받겠다는 의미입니다. NoSyu님// 감사합니다. ^^ 쌍부라님// 혹시 보시면 알려주시면 감사하겠습니다. 신고하면 뭐 줘요? 잇힝~ > ///<)o 원본 위치: http://purewell.egloos.com/3047489

After end iterator

enditr.cpp #include <list> #include <vector> #include <deque> #include <map> #include <set> #include <iostream> #include <ctime> using namespace std; template<typename _T> void testSeqItr(void) {  _T some;  typename _T::const_iterator ib;  typename _T::const_iterator ie;  typename _T::const_iterator it;  for ( int i = 0; i < 1024; i++ )  {         some.push_back(rand());  }  ib = some.begin();  ie = some.end();  it = ie;  ++it;  cerr << __PRETTY_FUNCTION__ << endl;  cerr << "begin equal? " << (ib==it) << endl;  cerr << "end equal? " << (ie==it) << endl; } template<typename _T> void testAssItr(void) {  _T some;  typename _T::const_iterator ib;  typename _T::const_iterator ie;  typename _T::const_iterator it;  for ( int i = 0; i < 1024; i++ )  {         some.insert(make_pair(rand(),rand()));  }  ib = some.begin();  ie = some.end();  it = ie;  ++it;  cerr <<

배신자

이 녀석, 처음에 통 썼다가 너무 느려터져서 이글루스를 소개해줬더니만 얼마 되지 않아 티스토리 계정 얻었다며 룰루랄라하고 있다. 배신자! 원본 위치: http://purewell.egloos.com/3040444

DivX Player 2

DivX Player [DreamBox] DX-HD1080i 업계 최초로 USB 2.0 host 지원!! 끊김 없이 고화질 영상을 USB memory로 보자!! 근데 모양새가 껄쩍지근하네... [Trupia] DX-300 얘도 USB 2.0 host 지원하네? ODD도 달려 있고. DreamBox가 조사를 잘못한 것인가!? [중산물산] BITMAX 옥션, 네이트몰을 통해 판매자(중산물산)에게 문의했더니 USB 2.0 host 지원한다고 하는군. 이게 디자인이 예쁘네. 원본 위치: http://purewell.egloos.com/3038948

잘 놀아주지 않은 개는 말썽이 심하다.

개는 주인의 관심을 먹고 산다. 주인이 돌봐주지 않는 개는 일부로 말썽을 피우는데, 이것은 말썽을 피울 때 주인이 개를 큰 소리로 나무라거나 벌을 주는 행동이 개 자신에게 관심을 주는 것으로 해석하기 때문이다. 원본 위치: http://purewell.egloos.com/3037824

<이글루스펫> 쵸파

역시나... 쵸파는 악마였어!! 관련링크 원본 위치: http://purewell.egloos.com/3036803

Size of Max Mapped Memory

Size of Max Shared Memory 절대로 심심하지 않다. 해야하는 일이기에 하는 것이다. Linux에서 별다른 세팅이 없으면 32bit 환경에서 최대 4G 메모리를 할당할 수 있으며, 이 중에 1G는 커널, 3G는 사용자에 할당한다. 포인터 크기(sizeof(void*))도 4byte이므로 한 프로세스에서 많이 써봤자 3G 밖에 못 쓴다는 것이다. 실험을 해보면 3G도 못 쓰고 2G 정도 밖에 못 쓴다. 64bit 환경에서 말이 조금 달라진다. 3G 이상 할당을 할 수 있다. 포인터 크기도 8byte인데 뭔들 못 하겠어. ㅡ_-) 언젠가 퍼포먼스 테스트한 것 같은데... 현재 64bit 시스템에서 3기가 할당하고 memset으로 3기가를 초기화 하여 메모리를 실제로 할당 받았다. (리눅스는 메모리 양과 관계 없이 일단 할당해주므로 실제로 할당 받도록 메모리에 접근을 해야한다) 자... 문제는 임의접근(radom access). 절망적이다. 1메가 바이트(1,048,576bytes) 임의접근을 했는데 정말 그지 같은 속도를 자랑(?)한다. Read는 거의 1분에 1% 올라간다. Write는 그것에 비해 2/3 정도 더 느리다. 이렇게 해서는 쓸 수 없다. 중간에 rand()랑 % 연산자랑 if 문이랑 뭐랑 뭐랑 자잘한거 몇개 쓰긴 하지만 이건 너무하다. 해당 작업을 할 때 vmstat을 보면 스왑I/O는 거의 일어나지 않는다. 대신 I/O가 빈번히 일어나는데 아무래도 하드 디스크에서 페이지 올리고 내리고 하니라 그런가보다. 1메가 바이트 임의접근하여 읽는데 걸린 시간: 7,276,902,360 (마이크로 세컨드) - 거짐 2 시간 1메가 바이트 임의접근하여 쓰는데 걸린 시간: 8,251,277,991 (마이크로 세컨드) - 2시간은 가뿐히 넘어주는 센스!! 위에서 3기가 할당한다고 했는데, 약 2.5G 할당한다. 이유는 프로세스가 기본적으로 사용하는 힙, 스택 등의 주소공간을 미리 사용하기 때문이다. 원본 위치: http://purewell.eg

Size of Max Shared Memory

Fedora Core 6 x86_64 /usr/include/linux/shm.h #define SHMMAX 0x2000000 32M RHEL 4 i686 /usr/include/linux/shm.h #define SHMMAX 0x2000000 32M 이걸로는 턱 없이 부족하겠군. 공유 메모리는 역시 간단한 환경설정 정보 정도만 공유하는 차원으로 써야겠군. 잘못 알았다. 커널 옵션을 주면 할당은 되는군. $ sysctl -n kernel.shmmax 33554432 $ sysctl -w kernel.shmmax=3355443200 $ sysctl -n kernel.shmmax 3355443200 뭐, 일단 이렇게 해서 shmget으로 3기가까지 할당은 할 수 있지만 이 녀석을 shmat으로 프로세스 메모리로 전부 멥핑할 수 없다. 프로세스가 기본적으로 쓰는 각종 환경 변수를 비롯하여, 스택, 힙 등에 할당된 메모리 때문에 그런데 약 2.5기가까지 할당하여 사용 가능하다. 64bit 시스템에서 포인터가 8바이트니까 더 쓸 수 있겠지? 원본 위치: http://purewell.egloos.com/3034765

작은 R/C 장난감, Avant-Courier

오늘도 열심히 돌아다녔지... 현대백화점 가서 주인님 구두랑 떨어져가는 내 불쌍한 운동화 대체품을 사고, 덕후들의 고휘도LED와 CPU가 흐르는 땅, 용산을 향하던 중 한 잘 생긴 총각이 파는 R/C 장난감이 내 눈에 들어왔다. 겉보기 꽤나 잘 만들어졌고 속도도 제법 빠르다. 히히히히 주인님한테 5천원 꾸고 내가 1만원 내서 낼름 집어 들었다. 본체엔 내장충전지가 들어가 있고, 조종기에 건전지 4개가 들어간다. 조종기 옆면에 충전 캐이블을 꺼내 본체에 끼워 충전한 뒤에 가지고 노는 장난감이다. 집에 오자마자 피로야 가라! 이 녀석을 꺼내 들어 우리집 악의 화신 토니를 향해 돌진하였다. 놀란 악마 토니는 열심히 도망다니기에 여념이 없었다. (좀 지나니까 익숙해졌는지 덤벼들고 쓰러트리고 바퀴를 물고 논다.) 으하하하!!! 작은 장난감이지만 제법 재밌는 녀석이다. 단점이 있다면 힘이 약하다는 것이다. 이불이나 카페트, 경사로에서는 거의 움직이지 못한다. 완벽한 마루, 아스팔트용. ㅋㅋ 원본 위치: http://purewell.egloos.com/3030170

DivX Player

아... 아래 기능을 만족하는 DivX Player가 없다. 언제 나오려나... DVD ODD Free Code USB 2.0 HOST NTFS Remote Controller Firmware Upgrade Reasonable Price (십만원대!) 아놔, USB 2.0 호스트만 들어가면 20만원이 넘어가버린다. 특별한 기능이라도 있나? 게다가 왜 ODD를 지원하지 않는거지? 난 네트워킹 기능 없어도 되니까 저 스펙만 있는거 어디 없나!!! 원본 위치: http://purewell.egloos.com/3028768

3.1

KLDP에 있는 1day1 님이 올려주신 태극기. 허락 안 맡고 가져 왔음. 대한 독립 만세! 원본 위치: http://purewell.egloos.com/3027115

이 블로그의 인기 게시물

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]=&

SQLite에서 파일 크기 줄이기

간단한 개인 프로젝트를 하고 있는데, SQLite DB파일 크기가 매우 커져서 테이블에 필요 없는 레코드를 날렸다. 그런데 날리고도 파일크기가 그대로라서 여기저기 뒤져보니 VACUUM 커맨드를 사용하란다. 사용법은 매우 간단하다. 그저 "VACUUM;"이라고 날려주면 동작한다. (참조: http://sqlite.org/lang_vacuum.html ) 다만, 동작이 매우 느려서 자주 쓸만한 것은 아니다. 실제로 100MB짜리 파일을 7KB로 줄이는데 수 분이 걸렸다. 소스를 봐야겠지만, DB를 EXPORT한 뒤에, 파일을 지우고 다시 IMPORT하는게 아닐까 하는 의구심이 든다. 매번 하기 귀찮으면 "PRAGMA auto_vacuum=1;"를 하면, 새로운 빈 페이지(DELETE나 DROP TABLE 같은...)가 생길 때마다, VACUUM을 실행한다. 다만, SQLite구조 문제로 테이블을 생성하기 전에 미리 날려야하는 안타까움이 있다. (참조: http://sqlite.org/pragma.html#pragma_auto_vacuum )

Java에서 클라이언트 인증받는 TLS/SSL 연결 만들기

열심히 OpenSSL 소스 까보면서 공부해서 Java로(??!) 소켓 연결 맺기 해보는 중이다... 물론 Java에서 SSLSocketFactory에서 SSLSocket을 만들어 Buffer 연결하고 깔작거리면 얼마나 좋으련만, 세상이 녹록치 않더라. TLS/SSL은 클라이언트가 서버를 인증하는 것도 있지만, 서버가 클라이언트 인증을 필요로 할 때도 있다. 그래서 이땐 클라이언트가 사전에 서버쪽이랑 깔짝거려서 발급받은 인증서를 미리 쥐고 있다가, 서버에 접속(정확히는 접속해서 Handshake과정에서)할 때 넘겨줘야한다. SSLSocketFactory에서 그냥 깔짝깔짝 하는 걸로는 어림 반푼어치가 없더라고... SSLSocket부터 올라가보니, SSLContext라는 익숙한 놈이 있고, 이놈을 만들려면 KeyManagerFactory가 있어야 하고 TrustManagerFactory도 있어야 하는데, 각각은 KeyStore를 필요로 하고, KeyStore는 PKCS12 인증서를 필요로 하더라... 학학학 일단 잡다한 소리 집어치우고, 암호 설정한 PKCS12 인증서를 준비하자. 참고로 암호 안 걸리면 인증서 읽다가 널뽀인따 맞고 죽더라. 인증서 내보내기(export)할 때 꼭 6자 이상 암호 걸어서 내보내자. 순서는 아래와 같다. KeyStore 객체를 PKCS12 알고리즘으로 생성하고, 준비한 인증서 파일을 읽는다. KeyManagerFactory 객체를 SunX509 알고리즘으로 생성하고, 1에서 만들어진 KeyStore로 초기화한다. TrustManagerFactory 객체를 SunX509 알고리즘으로 생성하고, 1에서 만들어진 KeyStore로 초기화한다. SSLContext를 TLS 알고리즘(또는 필요에 따라 다른 것도 가능)으로 생성하고, 2, 3에서 만들어진 KeyManagerFactory와 TrustManagerFactory를 통해 만든 KeyManager[]와 TrustManager[]로 초기화한다. S