SSH vs. SSL : 바보 같은 설명

11 11 2009

미국에서 살다보면 이런 저런 사소한 것에서 한국 사람들과 미국 사람들이 어떻게 다른지 느끼게 된다. 이것은 참으로 사소해서 누군가가 대놓고 “뭐가 다른데?”하고 물어보면 선뜻 입 밖으로 말이 잘 안나오게 된다. 흡사 “Mac이 Windows랑 다른게 뭐야?”라는 질문과도 비슷한 질문이다. 근데 이 사소한 것들이 참 큰 영향을 미친다. 흔히들 말하지 않는가? 사람들은 대개 사소한 것으로 싸운다. 큰 일은 싸움 자체가 잘 되지 않는다. 그런거다.

앞의 글을 포스트하고서 SSL을 이야기 하다가 갑자기 SSH가 튀어나와서 혹시나 딴지 걸 거 같아서, 웹을 찾아 보았다.
도대체 SSL과 SSH가 뭐가 다른가? 아마 인터뷰하다가 갑자기 이런 말이 튀어 나오면 대답 못할 거 같다. 몰라서 대답 못하는것이 아니라, 생각을 정리할 시간, 그리고 뭐가 달랐더라를 생각해야 하기 때문이다.
아무튼 찾은 것을 보자.

WsFTP : Users’ Guide

  • SSL : SSL (Secure Socket Layer) is a protocol for encrypting and decrypting data sent across direct internet connections. When a client makes an SSL connection with a server, all data sent to and from that server is encoded with a complex mathematical algorithm that makes it extremely difficult to decode anything that is intercepted.
  • SSH : SSH (Secure Shell) is a security protocol that allows you to make a secure connection to a server that has the SSH and SFTP (Secure File Transfer Protocol) protocols installed. Where FTP servers usually `listen’ on port 21 for connection, SSH servers use port 22.

참 미국적인 설명이다. 뭔가 거창하게는 써져 있는데, 별로 이해하는데 도움이 되지 않는다. 특히나 SSH에 대한 설명이 압권이다. security protocol이라고? 그러면 SSL은 security protocol아닌가? 그리고 SSH와 SFTP가 설치된 서버에 접속할때 쓰이는 거라는데.. 이건 뭐 설명도 아니다. 왜 그런지 다른 것과 비교해서 볼까? 누군가가 Web site가 뭐에요?라고 물어 본다고 하자. 그럼 대답이 Web server로 서비스하는 사이트야. 음… 이게 대답인가? 전혀 대답이 안되어 있지 않은가? Web이 뭔지 Web site가 뭔지, Web server로 서비스를 하는게 뭔지.. 전혀 설명이 안되어 있지 않은가? 더 쉽게 비유해 볼까? “야구가 뭐야?”란 질문에 “야구 선수들이 하는 게임이야”라고 답해주는 것과 아무런 차이가 없지 않은가?

미국 사람들이 이런 식의 말을 참 잘한다. 그럼 더 물어 보려고 해도 상당히 미묘하게 물어봐야 하기 때문에, 영어가 짧은 외국인 입장에선 참 뭐라고 물어보기가 힘들다. 지네는 뭐가 잘못된 것인지 모른다. 이런 바보들…

자 쉽게 설명해 보자. ( 쉽게 설명하면 개념 자체를 잡기는 쉬우나, 세세하게는 틀릴 수있다. 자세하게 설명하면 내용은 정확하나 이해하기 어려울 수있다. 그래서 항상 먼저 쉽게 설명하는 식으로 개념을 잡고, 더 알고 싶으면 자세하게 살펴보는게 좋다.)

SSL은 Secure Socket Layer의 약자다. 즉 통신을 하는데, OSI 7레이어 모델이 있지 않은가? 그런식으로 소켓 레이어가 있다. link 레이어 위에 쯤 속하겠지? 그게 network layer인가 그렇지? 음.. 어떻게 보면 link layer에 들어가겠는데?
아무튼.. TCP/IP로 통신을 하려면 socket을 만들어야 한다. 그리고 통신의 주체 사이에 이 소켓을 통해서 데이터를 주고 받게 된다. 바로 이 레이어에 암호화 기술을 넣어서, 보내고 받는 데이터가 다 암호화가 되어 있고, 그것을 편하게 구현하고 사용할 수있게 만들어 놓은게 SSL이라는 것이다. 그러므로 OpenSSL에는 각종 지원하는 암호화 기법이 다 함수로 들어가 있고, 여기에 덧대어서 바로 SSL secure socket을 만들고 관리하고 없애고 하는 함수들이 들어가 있다.
즉 이것은 end-user용 프로그램이나 그런 개념이 아니라, 프로그래머들이 이용해 주어야 할 개념이다.

SSH는 Secure Shell의 약자다. Unix를 쓰면 Bourne Shell이니 C-Shell이니 TCShell이니 하는 거, 그냥 공기같은 개념 아닌가? 예전엔 원격 컴퓨터를 이용하는 방법엔 두가지가 있었다. 하나는 telnet이고 다른 하나는 rlogin이다. 뭐 요새같은 GUI의 시대야 Apple Remote Access나 MS Remote Desktop혹은 VNC같은 것들이 바로 그런 용도인데, 옛날에는 Command-Line 환경이니까, Unix 명령을 내릴 수있는 프롬프트가 뜨는게 다였다. 암튼 그런식으로 원격지의 컴퓨터를 접속할 수있는데.. 문제는 이때 사용되는 ID와 password가 그냥 clear-text로 보내지는거다. clear-text란 암호화가 되지 않고 그냥 그대로 가는 것을 말한다. 그래서 통신 포트를 가로채서 packet 검사를 해보면 사람들이 로그인할때, 어떤 아이디에 어떤 암호를 쓰는지 다 볼 수가 있었다. 91년이었나 92년이었나.. KETEL엔가 접속할 때였다. 번개가 치는 비오는 날이었는데, 노이즈가 싹 끼는거다. 정말로 우연히 KETEL 시스템의 관리자로 들어가진 적이 있다. 아마도 로그인 정보가 번개와 비에 의한 노이즈로 변경이 가해졌고, 아마 그게 우연히 관리자의 것과 같았나보다. 여담이지만 갑자기 그게 생각나네…
뭐 순간 rm -r / 하면 께임 끝! 인데…… 그래도 착했던 나는 살포시 log-out을 해 주었다.
암튼.. clear text를 그대로 보내면 이런 저런 위험이 많이 도사린다. 노이즈에 의한 거야 뭘로도 어쩔 수없는 거겠지만, 감청/도청은 막아야 하지 않겠는가? 그래서 일종의 접속 단말 프로그램으로 ssh가 나왔다. 이 ssh는 rlogin처럼 원격 컴퓨터에 대한 Unix prompt상태로도 들어갈 수있게 해주고 ssh -x하면, 원격 컴퓨터의 X-Window 환경을 내 로컬 컴퓨터에서 띄울 수있다. ( local X-Window를 이용해서). 즉.. end-user 프로그램에 가까운 개념이 SSH이다. 물론 여기서도 암호화가 사용되기 때문에.. 왜냐하면 정보를 clear-text로 보내면 안되니까… 역시 암호화 관련 함수가 있게 마련이다.

에..이렇게 한번 쉽게 정리해 보았다.
다음에라도 보면, 쉽게 기억 나겠지. :)

하지만.. 이해하기 쉬우면 틀린 내용도 많은 법.. 쉽게 이해하자면 그렇다는 소리다.





OpenSSL 사용법

11 11 2009

OpenSSL을 사용하려고 하면 몇가지 문제에 봉착하게 된다.

우선 쉽게 설명이 잘 되어 있는 문서가 전무하다. OpenSSL 웹사이트를 가면 몇가지 설명을 볼 수가 있는데, 대개 제대로 설명이 안되어 있다.  예를 들어 DES로 encryption과 decryption을 한다고 하자. MAN -s 3 ssl 로 OpenSSL에 대한 설명을 보면, 뭘 어디서부터 손대야 할지 알 수가 없다. 그래서 찾다 찾다 DES를 직접 건드려보기로 했다. 이때 중요한 함수가 몇개 있다.

void DES_random_key(DES_cblock *ret);

int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule);
int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule);
int DES_set_key_checked(const_DES_cblock *key,
       DES_key_schedule *schedule);
void DES_set_key_unchecked(const_DES_cblock *key,
       DES_key_schedule *schedule);

void DES_set_odd_parity(DES_cblock *key);
int DES_is_weak_key(const_DES_cblock *key);

void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output,
       DES_key_schedule *ks, int enc);

여기서 어떤 함수를 써야 하는지 파악하기 위해서, 간단한 예제라도 있으면 좋겠는데, 전혀 그렇지 않다.
굳이 찾자면, OpenSSL의 test 폴더에 있는 샘플 코드를 보는 것이다.
아무튼 MAN 페이지를 아무리 찾아봐도, 저 schedule 변수가 뭐할때 쓰는건지, checked와 unchecked key의 차이는 뭔지 알 수가 없다. 물론 이것은 암호화 자체의 spec에 준하는 함수이기 때문에 DES 자체를 이해하는 것이 필요하다. 하지만 DES 문서를 봐도 때로는 알 수가 없다.
그러다가 OpenSSL의 mailing list에서, 직접 특정 암호화 함수를 사용하지 말고 high-level 함수를 이용하는 것이 더 좋다라는 답변을 들었다. 음.. 그게 뭐지? 힌트로 얻은 것이 EVP_EncryptInit_ex()였다.
아.. command라인에서 쓰더라도 openssl 명령을 쓰고 그 옆에 어떤 암호화 기법을 쓸지를 정해주지 않던가? (물론 바로 암호화 명령을 써도 되지만) 음.. 함수들도 그렇게 구성이 되어 있구나.. 그런 것을 알게 되었다. 근데 이런 설명이 MAN 페이지엔 제대로 되어 있지 않다. (혹 이 시점에서 MAN 페이지 구석 구석 찾아보고 “있는데?” 하는 분들 있을지 모르겠다. 여기서 말하고자 하는 건, 눈에 확 띄지 않는다는 뜻이다. )

그래서 MAN 페이지를 뚤어지게 찾아보다가 찾아내서 만든 코드가 아래의 코드다.

- (char *)generateCipherText:(NSString *)inputString withCipherTextLength:(int *)cipherTextLength
{
	BOOL isSuccessful = YES;

	const char *inputCString = [inputString cStringUsingEncoding:NSASCIIStringEncoding];
	int sourceLength = strlen( inputCString );

	int result = 0;
	unsigned char inputBuffer[16], outputBuffer[16];
	int outputLength = 0;
	int inputLength = 0;

	bzero( inputBuffer, 16 );
	bzero( outputBuffer, 16 );

	char *finalBuffer;
	finalBuffer = (char *)malloc( 64 );
	bzero( finalBuffer, 64 );

	// Initialize cipher context
	EVP_CIPHER_CTX ctx;
	EVP_CIPHER_CTX_init( &ctx );

	// Copy a key
	unsigned char keyForDES[8];
	memcpy( keyForDES, kKeyText, 8 ); // "LXFExpor"

	result = EVP_EncryptInit(&ctx, EVP_des_ecb(), keyForDES, NULL);
	if( result )
	{
		int byteLeft = sourceLength;
		int bytesToCopy;
		int inputLoc = 0, outputLoc = 0;

		while( byteLeft > 0 )
		{
			if( byteLeft < 8 )
			{
				bytesToCopy = byteLeft;
				byteLeft = 0;
			}
			else
			{
				bytesToCopy = 8;
				byteLeft -= 8;
			}

			bzero( inputBuffer, 16 );
			memcpy( inputBuffer, inputCString+inputLoc, bytesToCopy );
			inputLoc += bytesToCopy;

			bzero( outputBuffer, 16 );
			inputLength = bytesToCopy;
			result = EVP_EncryptUpdate(&ctx, outputBuffer, &outputLength, inputBuffer, inputLength);
			if( result )
			{
				memcpy( finalBuffer+outputLoc, outputBuffer, outputLength );
				outputLoc += outputLength;
			}
			else
			{
				isSuccessful = NO;
				break;
			}
		}

		bzero( outputBuffer, 16 );
		result = EVP_EncryptFinal( &ctx, outputBuffer, &outputLength );
		if( result )
		{
			memcpy( finalBuffer+outputLoc, outputBuffer, outputLength );
			outputLoc += outputLength;

			*cipherTextLength = outputLoc;

			isSuccessful = YES;
		}
		else
		{
			isSuccessful = NO;
		}
	}
	else
		isSuccessful = NO;

	EVP_CIPHER_CTX_cleanup(&ctx);

	if( isSuccessful == NO )
	{
		NSGetCriticalAlertPanel( @"Cirtical Information", @"It couldn't create a registration file.", @"OK", nil, nil );

		return (char *)-1;
	}
	else
		return finalBuffer;
}

위의 코드는 암호화를 하는 부분, 즉 cipher 과정이다. 혹 암호화에 익숙하지 않으신 분들에겐 encryption이란 말이 더 편하게 들릴지 모르겠다. encryption == cipher, decryption == decipher로 이해하시면 되겠다.

간단해 보이지 않는가? 암호화 하는 부분만 떼어내면 참 간단한 코드다. 그런데 이게 예가 MAN page에 나오질 않는다.
Oreilly에서 OpenSSL에 관련된 책이 단 한권 나오긴 한다. 물론 SSL에 대한 것이어서 암호화에 대한 것보단 socket을 열어서 SSH로 connection을 하는 쪽에 더 촛점이 맞추어져 있는거 같긴하다. 그 부분으로써 암호화에 대한 설명이 나온다. 왜냐하면 SSH 세션을 열면, 그 안에서 통신의 안전을 위해서 암호화 기법이 사용되기 때문이다.

근데 보기엔 간단해 보이지만, 저 코드를 완성하는데 꼬박 하루가 걸렸다. 왜일까?
OpenSSL의 구현에 묘한 점이 있기때문인데, 바로 EVP_EncryptUpdate()이 호출되는 부분이다. 앞에서 언급한 “도대체 어디서부터 시작해야 하나”라는 것이 OpenSSL을 사용하기 힘들게 만드는 첫번째 이유라면, 두번째가 바로 이 함수때문 같다. (암호화 자체를 이해하는거야… 당연히 암호화에 대해 아는 사람이 OpenSSL을 시도하는 거라고 생각하니 제끼고.. )

이 함수가 동작하는데 좀 묘한 면이 있는데.. 사실 Encryption을 할때와 Decryptiond을 할때가 조금 패턴이 다르다.
즉 이 함수가 호출될때, input에 들어있는 original text가 output에 encryption이 되어서 바로 들어갈때도 있고, 아닐때도 있다는 것이다. 아마 기억에 encryption때는 바로 바로 들어갔던거 같고, decryption때가 바로 안들어가고, 그 다음 iteration때 들어갔던 것 같다. 그때, outputLength가 실제 변환된 것만큼 되지 않고 0으로 되더라는 것이다. 그래서.. 아.. 뭘 잘못 사용하고 있나보다 하고 그거 알아내려다가 하루 웬 종일 지나갔다. 알고보니 다음 단계에서 세팅되는 것이다.
아마 decryption때 그런것 같은데, encryption때는 EVP_EncryptFinal()가 호출되기 직전, 즉 마지막으로 encryption을 할때 그랬던 것같다. 아 맞다. 그런 거 같다. 그래서 outputLength가 0이 되더라도 놀라지 말고 끝까지, 즉 EVP_EncryptFinal()를 호출하라는 것이다.

OpenSSL이 이렇게 움직이는 이유는 bit stuffing때문인거 같다. MPEG4/H-264의 CABAC을 구현할때랑 JPEG Encoder/Decoder를 구현할때, 이 bit stuffing을 많이 사용했는데, 처음 구현할때는 고생했다. (USC에서..) 근데 회사에서 하니 아무래도 한번 해 본거라, 대충 어떻게 할지 방향이 이미 잡혀 있기에 고생 자체는 안했다. 시간이 들었을 뿐.
근데 내가 bit stuffing을 구현하는 것은 modulo 연산을 이용해서, 실제 일정 길이의 비트가 필요하기 전에, 그것을 충분히 대응해 줄 수있게 버퍼를 미리 채워주게 구현해서 아무런 문제가 없는데, 아마 그렇게 구현하지 않으면 (modulo 연산이 생각보다 헷갈린 면이 있어서 ), 해당 스텝내에 encoding 혹은 decoding을 하려 하면, 일정양의 비트 데이터를 확보해야 하는데, 미처 준비가 안될 수있다. 그럼 다음 스템으로 그 처리를 넘기면 그때는 확실하게 확보가 되기 때문에 (아닐 수도 있다. 데이터의 끝부분에서 미쳐 준비가 안되는 일이 생기곤 한다. ) 그렇게 구현이 되었겠다 싶다.

이런 설명이 있어야 한다. 없으니 제대로 동작하는데도 마치 안되는 것처럼 생각되어서 하루를 낭비하지 않는가?
으… USC에서 내 개인 프로젝트 못하고 이것으로 하루 웬종일 썼다.

다음에는 decoding 부분을 포스팅해 보겠다.





기술 블로깅에 대해서

8 11 2009

궁금한 점이 있다.

프로그래머들을 보면 전문성이란 측면에서 한국 사람들이 확실히 떨어지는 것을 본다.
깊이가 없고, 기술적인 배경보다는 운용의 묘를 더 살리는 것 같다. 삼성이란 기업에서도 그랬었다. 삼성이나 금성이 제품을 만들때, 대부분의 기술은 외국의 기술을 가져다 쓴다. 그것을 용도에 맞게 변경하고 추가할 거 추가하고 그런다. 그리고 기술적인 판단을 내릴때 그다지 기술적이지 못한 결정을 내린다.

그리고 인터넷에 떠다니는 정보들을 보면, 유럽이나 미국에서는 굉장히 기술적인 내용이 많고 잘 되어 있다. 개념 설명부터 시작해서 실제 구현이나 각종 것들.. 그리고 오픈 소스를 봐도 수준 차이가 한참 많이 난다는 것을 쉽게 확인할 수있다.

왜 이런 차이가 날까? 이곳 미국에서 살다보니 느끼는 것이 있다. 한국 사람들.. 머리가 참 좋다. 물론 다른 나라 사람들도 머리가 좋다. 그런데 머리가 좋은 방식에 차이가 있다. 한국 사람들은 감정을 내세우지 않는다면, 그리고 기다려 줄 줄 안다면 금상첨화로 좋은력과 머리를 가지고 있다. 하지만 거기에 맹점이 있다.

또한 생활 방식에 있어서의 차이가 기술 블로깅등에서의 차이점을 만드는 것 같다.

여기 미국에서 보면, 사람들이 자기네가 얼마나 힘들게 일하는지 꽤나 말하는 것을 볼 수가 있는데.. 제발 좀 한국 사람들이나 일본 사람들 일하는 것 좀 보고 말해 주었으면 좋겠다. 모든 것은 상대적이지만 특히 시간이란 것, 그리고 노력이라는 면은 굉장히 상대적이다. 한국 사람들이 천천히 하자라고 할때와 미국 사람들이 천천히 하자라고 할때, 그 속도에 심각한 차이가 있다. 한국 사람들의 천천히는 미국 사람들의 빨리 빨리 보다 훨씬 빠르다. 이건 내가 몇년을 이곳에 살면서 느낀 것이다. 뉴욕이 미국에선 참 바쁜 곳이라고 하는데, 거기서도 아침 일찍 가게를 여는 사람들은 역시 한국 사람들이다. 서울에서 느껴지는 긴박감이 뉴욕에선 그다지 느껴지지 않는다. 물론 뉴욕은 바쁜 도시다.. 하지만 역시 상대적인 것이다.

한국에서는 회사에서 11시 12시 새벽 1시 2시에 퇴근한다. 그나마 퇴근 제대로 하면 다행이다. 퇴근 후 회식으로 포장되는 음주는 업무의 연장이라는 미명하에 자행되곤 한다. 그리고 집에 들어오면 마누라들이 한마디씩들 하겠지. 대학 졸업후, 혹은 대학에서도 어떤론이나 어떤 아이디어에 빠지면, “철없는 놈” 혹은 “실제를 모르는 놈”, “세상을 모르는 놈”으로 치부되는게 한국이다. 나이가 들어 30세 40세 50세가 되면 전문성이 더 높아지고, 기술적 수준이 깊어지고, 그것을 바탕으로 블로깅을 하고, 정보를 공유하면서 또 새로 배우고 하는 그런 바탕 위에서 블로깅이 있어야 하는데 (이과적 블로깅 이야기다. 물론 문과도 방향은 다르겠지만 비슷한 면이 있을 것이다. ) 한국에서는 대개 기술 블로깅이나 BBS등을 들어가면 대개 깊지 못하고 몇년이 지나도 초심자의 수준에서 머물러있다.  원리를 앍고 생각하면 그런 질문이나 글이 나올 수가 없는데, 몇년이 지나도 거기서 거기다.

이 말은 무슨 뜻일까? 정말 실력있는 사람들은 바빠서 블로깅 할 틈이 없다는 면도 있겠고.. 혹은 이미 30 중반만 되도 명퇴를 걱정해야 하는 사회 풍조.. 그리고 기술이 있는 사람들을 나이가 들었다는 이유로 가벼이 여기는 풍조.. (회사에서 나이가 많이 들었다는 이유로 짜르는 것은 정말 웃기는 이야기다. 나이가 있기에, 실패의 경험도 많고, 되는 이유와 안되는 이유도 알고, 생각도 깊어진다. 그것이 얼마나 중요한 것인지 모르는가들? ) 그리고 대학 졸업후엔 공부하지 않는 풍조…

아니 대학때도 마찬가지다. 전공 공부가 더 중요한 것인데 우리네는 쓸데 없이 지나칠 정도로 외국어 공부(라고 말하지만 영어 공부)와 취직 준비로 바쁘다. 회사에선 필요한 사람을 뽑기 위한 것인데, 그 시험이 시험을 위한 실력 쌓기를 불러 일으키는 것이다. 익히 아는 바지만 시험 점수가 좋은 것과 실력이 좋은 것은 딱히 일치하진 않는다. 물론 완벽한 평가 기준이란 정말 힘든 것이어서 그나마 객관적인 것을 찾으려다 보니 시험을 보게 되는 것인데, 그렇다고 해서 시험이 만능이 되면, 지금 한국 사회와 같은 문제가 생기는 것이다. 방송에선 그것을 시청률 지상주의라고 하지. 외국에선 시청률은 참고 사항이라는데..

아마 결혼해서도 집에서 전공 공부를 하고, 이리 저리 해보면, 당장 마누라에게 듣기 싫은 소리를 들어야 할것이다. “그거 한다고 밥이 나와?” “그래봤자 회사 짤리는 건 마찬가지야”.. 나이가 들어 “현실”이란 것에 눈을 뜨면, 더 이상 기술, 과학.. 그런 것은 뒷전이 된다. ( 이공계 월급 더 주자, 대우 잘해주자가 문제의 핵심이 아니다, 이 국회의원과 나랏님들아..  물론 일하고 가치를 만드는 것만큼 대우가 있어야겠지. 그것은 그것대로 해결해야지만, 문제를 해결하는 핵심이 아니라는 것이다. )

이러니 기술이 깊어질 수가 있을까? 이러니 제대로 된 오픈 소스나 블로그 글들이 올라올 수있을까?

나의 이 허접한 블로그도 참 창피한 것이어서, 내 입으로 이런 말을 하는 것도 얼굴 화끈해지는 일이지만.. 그래도 할 말은 해야지.
(여기서 사카이 같은 사람들의 답변은 정중히 거부합니다.)

한국에도 훌륭한 블로그나 오픈소스들이 나와야 하는거 아닌가?

미국에 살다보니 왜 사람들이 오픈 소스를 하는지 알겠다. 한국에선 철없는 사람들이 하는 것으로 치부들 하지. 그거 돈도 안되는거 왜 하냐고. 근데 미국에선 그게 돈이더라. 얘네들이 자본주의 동물들인데, 돈 안되는거 하겠는가? 단지 직접적으로 돈이 안되는 것일 뿐이다. 간접적으로 그리고 그게 미끼가 되어 더 돈이 된다. 뭐라고 설명하긴 힘든데, 여기서 살아들 보시면 그 모습을 보게 된다. 이 놈들이 어떤 놈들인데 시간 낭비하면서 남 좋은 일 할까…

한국에서도 좀 회사 업무 외에 개인 시간들이 나면 좋겠고, 물론 그 바탕엔 한국 사회의 “현실 지상주의”가 좀 변화가 생기면 좋겠다는 생각이 든다. 삼성이나 LG에서 비디오 사업부에서 개발하거나 연구 총괄같은데 있는 사람들이 개인 시간에 멋진 MPEG 라이브러니나, 인코딩 기술, 회사에선 좋은 아이디어인데도 윗사람들이 몰라줘서 못하는 것들.. 그런 것을 해 볼 수있다면, 그것들이 만들어 내는 기회 비용이 얼마나 크겠는가? 서울대, 과기대 포항공대만이 다가 아니다. 내가 삼성에 들어가면서 신입사원 연수교육을 받을때 느낀 것이 있다. 정말 그때 합숙하면서 많은 생각을 했다. 소위 사람들이 무시하는 대학 출신의 사람들…

정말 우수하고 좋은 사람들이 너무 많다. 단지 고등학교때, 그리고 달달 암기와는 거리가 있는 사람들이었을 뿐, 그 사람들이 멍청하거나 그런게 아니다. 다른 방식으로 머리가 좋은 사람들이다. 그 사람들이 힘을 함쳤을때 만들어 낼 수있는 가치.. 엄청난거다.

일본은 외국 유학한 사람들보다 자기네 나라 학교를 나온 사람들을 더 쳐준다고 한다. 일본 학교는 좋으니까라고 할 수도 있겠지만, 일본이라고 어디 처음부터 그랬을까? 한국 사람들도 충분히 훌륭하다. 단지 자기네들을 스스로들 인정하지 않는다는데 문제가 있고, “그거 해봐야 되겠어?”라고 미리 초치는 분위기가 만연해 있기 때문이다. 뭐든지 가방끈으로만 판단하고..

미국도 가방끈 긴 놈이 일단 연봉은 많은 것은 사실이지만, 회사만 좋다면 (이게 무슨 의민지는 아시리라 본다. 단지 회사 이름이 유명하고, 연봉 많이 주는 것을 의미하는 것이 아니다. ) 굳이 석박사 따지 않은 사람들도 엄청 연봉 높고 잘 나가는 사람들 많다.

높이 나는 새는 멀리 본다. 낮게 나는 새는 자세히 본다.

한국 내에 있으면 한국의 단점이 너무 잘 보인다. 외국에 있으면 단점이 있음에도 불구하고 장점도 많다는 것을 본다.
외국에 있으면 애국자가 된다고들 한다. 단지 한국이 그리워서 그러는게 아니다. 실제 외국에서 살다보니, 한국이 참 안타까운 점이 많다. 이야.. 정말 좋은 요소를 많이 가지고 있는데.. 왜 다른 조그만 것들에 얽매여서 그 장점을 발휘하지 못하나..

얼마전에 YouTube에서 옛날 상공회의소 대표였던 독일 출신 이.. 누구 (지금 어느 정부 소유 회사의 사장이 된거 같던데) 선생의 강의가 비디오로 올라온게 있다. 그것을 보고 무릎을 탁쳤다. 그런 사람 말에 귀를 기울여야 한다.

하지만 한국 내에선 “야.. 우리가 이렇게 가능성 많데. 훌륭하데.. ” 그런 수준에서 자위나 하고 말겠지..
“이승엽의 데드볼로 요미우리 자이언츠의 공격 물꼬가 열렸다” 이런 식으로… 본질이 그게 아닌데 말이지..

한국이여.. 부디 잘되어라. 대륙의 고구려와 해상왕국 백제의 기상을 물려 받아 다시 펄펄 나는 그때가 와야 한다.

단 남보다 잘 나갈때, 남을 보듬고 겸손할 수있는 그런 성품을 가지면서 말이다.

(발해가 망할때.. 그 밑에 있던 말갈/거란 족들이 고구려 인들을 무척이나 증오했었다고 한다. 왜 그랬을까? 그런 역사는 반복되지 말아야 한다. 제발들 좀 남에게 보이려고 좋은 옷 사고, 좋은 시계 차고, 좋은 차 사지 말자들.. 내실을 갖추고 겸손하자들.. )

 





뭘 말하려는 것인지 포커스를 못 잡는 사람들..

8 11 2009

여기 블로그를 읽는 사람들을 보면, 가끔 이상한 생각이 든다.

항상 느끼는 것이지만 한국 사람들은 비교적 생각이 깊고, 두 단계 세 단계의 생각을 한다. 하지만 다른 나라 사람들은 대개 생각이 단편적인 것 같다.

많지 않지만 몇개의 글에 답변들이 남겨져 있는데, 그것을 보면 더욱 그러한 것을 느낀다.

말하려는 본질을 파악하지 못하고 지엽적인 것에 매달린다. 누가 그것을 몰라서 안썼나? 문제의 본질이 아니기 때문에 굳이 언급할 필요가 없던 것이다.

대개 초짜들이 그런 실수들을 하는데, 이곳 미국에서는 자신들이 초짜인것을 모르는 것 같다.

뭐랄까.. 한두가지 밖에 모르는 사람이 더 많이 아는 사람이 가지는 의문을 기본을 몰라서 궁금해 하는 것으로 생각한다는 것이다.

예를 들어보자. 초등학생이 처음 덧셈을 공부할때, 1+1이 왜 2인가를 궁금해 한다고 하자. 그런데 또한 산수를 이미 알고, 수학을 공부하면서 정수론에 들어가서 “정수란 무엇인가”에 대해 고민을 하는 사람이 있다고 하자. 그 사람이 왜 “1+1 = 2″인가에 대한 궁금증을 가진다고 할때, 그 궁금증이 초등학생이 가진 그 궁금증과 같은 것일까?

한국 사람들은 사람을 딱 보고, 그리고 혹은 말하는 것을 보고, 왜 그런 궁금증을 가지는지 파악을 한다.

하지만 다른 사람들은 그다지 그런것 같지 않다. 꼭 초등학생이 덧셈을 몰라서 궁금해 하는 것인양 생각을 한다.

어쩌랴.. 인간들…

이제부터는 다시 블로깅을 한글로 해야 할 것 같다.

한글로 할때, 이상한 사람들이 들어와서 말도 안되는 태클을 걸어서 영어로 쓰기로 했는데, 이제는 영어로 태클을 걸어오는 사람들이 있다. 간혹 검색되는 것을 보면, 한국 사람들도 이 블로그를 읽는 것 같은데, 그래도 아직 한국내 블로그등에 내 블로그가 걸려 있는 경우가 없는 것으로 보아 한국 사람들은 이 블로그를 잘 모르는 것 같다.

어차피 이 블로그는 내 메모겸 해서 있는 것이기에, 굳이 다른 사람들이 안 읽어도 좋으므로 별 상관 없을 것 같다.

개인적으로는 이렇게 한번 메모해 놓은 것을 다시 보는 경우가 꽤 많고, 기억을 더듬는데도 좋아서, 그냥 하드 디스크에 저장해 놓고 혼자 보는 것보다 훨 나은 것 같다. 회사나 다른 곳에서도 억세스 하기가 편하니까..

한달에 이젠 거의 6000명 가까이 내 블로그를 방문하는데, 일단 그 숫자는 떨어지겠지.
뭐 별 상관없다. 남들 보라고 쓰는 블로그가 아니니까..

그럼 한글 블로깅 시작!!!

당장 쓸 것이 QuickTime에서 Audio Channel이 mono라는 것이 어떤 의미를 갖는지.. Stereo와 Dual Mono와의 차이등에 대해서 쓸 것이 있다. 스크린 샷등이 회사 컴에 있기 때문에, 회사에서 카피를 해 와야 하겠다.

혹시 몰라 하는 말인데.. 프로그래밍을 하시는 분들이 방문을 하시고, 답변을 남기는 것에 대해 환영하고, 언제든지 건설적인 대화를 나누는 것에 대해서 열려 있다. 그런 분들과의 인맥을 다지고 싶다.





How to use DES in OpenSSL library?

8 11 2009

Well, I would like to use DES or BASE64 which are symmetric, i.e. encryption of a plain text produces a cypher text, and description of the cypher text produce the original plain text.

However, only by reading its MAN page, it turned out to be very very very difficult to understand and use it.

Even at the OpenSSL web site, there was no good tutorial on how to use it.

I wasted almost a whole day to figure out how to use it, and fortunately I think I found it.

Well, if you download the source codes, there is a directory for testing, “test”. And there is a destest.c.

And.. here is the one from Google code search.





What’s new in Interface Builder 3.2 – II

1 11 2009

OK. Mr. bonaldi left a comment to my previous post, What’s new in Interface Builder 3.2.
According to him, it is moved to “Library” tab of “Library” window.
Let’s take a look at where it is.

library

OK. it is there. However, isn’t it strange? This is not about “Oh.. it’s at other place”.
When you take care of a class or an instance, it is supposed to be done under “identity” tab of that specific instance’s “Inspector” window. So, you can handle all things about the chosen instance. It is handy and very reasonable.
The “library” window is for “stock” classes. From the IB 3.2.x, Apple added a “library” tab on the “Library” window, and put the outlet. Others added there are :

  1. Lineage
  2. Definitions
  3. Outlets
  4. Actions

Think about this.
When you choose an instance, it is to say that you want to do something with the instance.
Adding outlets, actions are one of them. So, it was reasonable to to have those on the “identity” tab.
Very reasonable!
However, IB 3.2.x suddenly introduced “Library” tab on “Library” window and separated housekeeping into two places : Inspector window and Library window.

It is not even mentioned in its IB Help.

ADDED : Probably someone at Apple started raise serious question about object ( instance ) vs. class.
The object (instance) and the class is different. The class is kind of template for making an object or an instance.
So, instantiated class is object or instance.
On IB’s main window, it displays instances of class, i.e objects. “File Owner” and others are all instances of certain classes. So, if you are adding outlets or actions using “identity” tab, it is like to add those to “objects”.
Strictly speaking, it should be a class not an object. It is to add something to a class and instance of that class contains the added things. So, in other words, in previous version of IB, it used mixed concepts of instances and classes. So, probably someone at Apple wanted to raised question on using the terms in mixed way.

If someone at Apple Inc. visits this blog, can you clarify this?

ADDED : After searching documents I found out that the Interface Builder release notes contains information on those changes. Ah~ Why did I miss it!!!!

According to this statement, yeah.. it is true that they really differentiated “instance” and “class”.

Add actions and outlets to a class. Adding actions and outlets to a class does not require an instance of that class, and you can simply add outlets and actions to a class from within the Outlets and Actions detail views of the Classes tab.





What’s new in Interface Builder 3.2

30 10 2009

From Interface Builder 3.x, it seemed to me that Apple people wants to separate Xcode and Interface Builder more strictly. One major difference between IB 2.x and 3.x was that you are not supposed to create objects with IB anymore. You should create an object using Xcode, then IB recognizes the object. Also, creating IBOutlet is also recommended to be done from Xcode side, although you can still make IBOutlets with IB.

Now, with IB 3.x, today I noticed big changes there.

First it supports “User defined runtime attributes”. It is like to set properties of objects within IB. Then when an NIB/XIB is loaded, the default values for those properties are set to the ones set using the IB.

Second, you CANNOT create IBActions, or action handlers using IB anymore! NOT ANYMORE!!!!!
If you can’t believe me, take a look at this.

IB3_2

So, now you should memorize this pattern.

- (IBAction)doSomething:(id)sender
{
}




iSight camera and iPhone simulator

24 10 2009

Did I point out that there were problems with iPhone/iPod touch for developers?
Hmm.. I don’t remember it.
Anyway, one big problem is that developers should buy any new iPhone/iPod touch to developer for any added H/W features. I have an iPod touch, but have some idea of using a camera in an iPhone. Then… well.. I don’t have an iPhone. Wait a sec. Doesn’t my MacBook have a built-in iSight camera? Yes. But I have never heard anywhere that the iPhone simulator. No. the iPhone simulator doesn’t use the iSight camera as iPhone built-in camera.

I wish that the next version of iPhone SDK would support the iSight camera.





QTMovieView IB PlugIn on Snow Leopard problem

20 10 2009

Recently I found a weird problem with QTMovieView IB Plug-In on Snow Leopard.

If you create an XIB or NIB file on a Snow Leopard and add a QTMovieView to a Window, its movie controller is not displayed even though you check “Show controller” check box.

Created on Snow Leopard

Created on Snow Leopard

Created on pre-Snow Leopard

Created on pre-Snow Leopard

As you can see, they are exactly same as far as their nature is concerned. Also, whether it is XIB or NIB doesn’t matter.

ADDED : It doesn’t display the movie controller either with IB 3.1.4, the latest IB for Leopard.





The sample project location : People at Apple should think about it again!

17 10 2009

Well, finally I got to write a post about the location of Sample projects location.

It has used to be  /Developer/Examples. However after introduction of iPhone SDK, the sample projects began to be located in /Developer/Documentation/DocSets/*.docset/Contents/Resources/Documents/samplecode.

Then why did they leave the /Developer/Example folder?
Also, when you search sample codes using the Xcode’s search feature, it presents a HTML page for the sample code.
But its “open project in xcode” button doesn’t find the location of the project. It just presents an Open File dialog box and you need to browse into the directory to find a project file.
samplecode


They should think about how to distribute sample codes again!