2013년 9월 26일 목요일

GO 프로그래밍 언어의 가치

Go언어는 구글에서 나온 서버프로그래밍을 위한 새로운 프로그래밍 언어입니다. 이 언어는 유명한 컴퓨터 과학자인 Ken Thomson과 Rob Pike가 작성하였고, 개발 생산성과 성능의 두가지를 한번에 잡을 수 있는 언어입니다.

얼마나 자주 창조적인 개발을 위한 생산성과 실행 속도를 고민해보셨는지 생각해보셨나요?

Go로의 시작
Go를 이야기 하기 전에 제가 어떻게 Go라는 언어에 이끌렸는지 먼저 이야기 해야 할 것 같습니다. 저는1995년 부터 C언어를 알았고, 2001년에 PHP언어를 시작했습니다. 당시에 PHP언어는 객체지향과는 거리가 멀었고, 에러 처리에도 미흡했지만 웹어플리케이션을 만드는데 있어서, 그렇게 나쁘지만은 않은 언어였습니다.  먼저 저는 아래의 두가지 중요한 사실을 알 수 있었습니다.
  1. "객체지향"은 단지 프로그래밍의 한 방법일 뿐이다. 프로그래밍의 필수조건은 아니다. 개발 전체 시간에서 최고의 가치를 가지지 않는다.
  2. 데이터 모델에서 자유로운 변수 형태와 다양한 배열, 맵등의 지원은 개발 생산성을 향상시키며, 중요한 가치를 가진다.
 PHP는 작은 프로그램을 빠르게 작성하는데 탁월하지만, 모호한 변수타입으로 인해 프로그램을 테스트 하거나 디버깅하는데 그렇게 쉽지 않습니다. 그리고 그런 이유로 느리죠.
저는 2005년에 자바를 시작했는데, 자바는 제가 그동안 알았던 언어 중에 가장 실망스러운 것이었습니다. 지나치게 엄격한 타입을 가지고, 지나치게 장황하게 늘어놓죠. 무엇보다도 무거웠습니다. 꽉 짜여진 클래스에 코드를 담아 무작정 퍼나르며 생각없이 받아 먹는 하나의 캡슐약을 연상시켰습니다. 모든 IDE와 프레임워크, 컴파일 환경등등 지나치게 복잡하고 일이 많았습니다. 초기 개발 시간은 환경 설정에 시간이 많이 흐를정도로 군더더기가 많습니다. 특히나 자바VM은 큰 비용을 필요로 하다는 것입니다.

이후 얼마 안있어 자바대신에 파이썬을 선택했습니다. PHP에서 지원하지 않는 멀티 쓰레드나 불편한 백엔드 시스템 콘솔 개발을 위해, 선택한 언어였습니다. 언어의 기술은 간결했고, 짧은 코드에 강력한 기능을 보여주는 언어였습니다. 실제로 2009년에는 파이썬으로 모바일 프레임워크로 핸드폰을 개발하면서 파이썬의 가능성이 무한하다는 것도 느꼈습니다.
PHP와 같은 인터프리터 언어로 컴파일 없이 수정과 실행을 반복하면서 언어의 개발 속도도 빨랐습니다. 그러나, 파이썬의 문제는 느리다는 것입니다. 모바일 기기에 들어간 파이썬은 하드웨어를 읽어들이는 부분에서 속도의 이슈를 보이면서 오작동을 일으켰고, C로 바인딩하여 해결하기에 버거운 수준이었습니다.

파이썬으로 개발을 시작할 무렵, 구글이 이 언어를 선택했고, 파이썬을 창시한 Guido van Rossum을 채용하는 것을 보며, 앞으로 잠재력이 있을 것이라고 생각했습니다. 최근에 구글로 부터 새로운 언어 Go가 나왔다는 것을 알게 되었고, 쟁쟁한 컴퓨터 역사의 인물들이 개발에 참여했다는 사실에 관심을 갖게 되었습니다.
Go는 2009년에 발표되었습니다. 저는 2012년에 이 언어를 알게 되었는데, 저는 이 언어가 얼마나 대단한지, 초기에는 이해하지 못했습니다.


Go와 작업하기
저는 프로젝트의 프로토타입을 작업하면서, Go의 가치를 알 수 있었습니다.

  1. 컴파일러 언어의 이점 : 저는 컴파일러 언어로 돌아가는 것에 대한 이점을 알고 있습니다. 컴파일러는 프로그램이 실행가능한지 여부를 이론적으로 판단하여 에러를 체크할 뿐 아니라 이후에 문제를 해결하도록 에러를 도출 합니다. Go의 특별한 능력은 아니라 할 수 있지만 Go는 인터프리터와 함께 컴파일 기능을 동시에 가지고 있습니다.
  2. 표준 포맷 : Go는 C나 PHP보다는 엄격한 코딩 포맷을 가지고 있습니다. 파이썬보다는 덜 엄격하지만, 파이썬의 포맷보다 유연합니다.
  3. 작은 언어 : Go는 아주 작고 쉽게 설치가 됩니다. 이는 프로그래밍을 배우고 시작하는데 도움을 줍니다.
  4. 많은 기능 들 : Go언어는 파이썬과 같이 많은 서버프로그램의 기능을 언어 자체에 내장하고 있습니다. 가령, 웹서버를 돌린다거나 소켓 서버를 작성하는 것, OS의 내부 기능을 엑세스하는 것등 파이썬과 거의 유사하게 이용할 수 있습니다.
  5. 쉬운 다중 작업 : Go의 채널과 go루틴은 다중작업을 쉽게 처리하도록 해줍니다. 이는 Node.js와 파이썬의 Twisted보다 나은 기능을 제공합니다. 
  6. 쉬운 시작 : Go를 배우는데 시간이 그렇게 오래 걸리지 않습니다. 개발 환경도 컴파일러와 에디터만 있으면 바로 시작 가능합니다.
  7. 빠른 개발 속도 : Go의 개발 생산성은 무척 높습니다. 언어 내부에 공용 서버 컴포넌트가 있어 복잡한 서버를 빠른 시간안에 작성 할 수 있습니다. 적은 코드는 정확한 기능을 빠르게 만든다는 것을 의미합니다.
  8. 멀티코어 지원, 높은 성능 : 언어의 실행은 놀랍게도 빠르고 안정적입니다. 심지어 파이썬으로 개발하는 사람들에게는 경이적이다는 생각까지 들 정도입니다. 파이썬과 Node.js의 런타임과는 달리 Go의 런타임은 다중 OS 쓰레드를 지원하고, 동시적인 실행기능을 지원합니다.

생산성 향상을 위한 Go언어
Go언어의 일부 특징은 프로그램을 작성하고 배포하고 나서 알 수 있는 것들이 있습니다.
이 부분에 대한 Go언어의 장점이라고 생각하는 것들은 아래와 같습니다.

  1. 단일 실행파일 : Go는 정적으로 링크된 바이너리를 만듭니다. 이는 파일 하나에 모든 것을 넣고, 소스를 빌트하면 바로 작동가능하다는 것을 의미합니다. 이 특징은 오늘날 클라우드 기반의 배포 환경에서 유리합니다. 왜냐하면 배포되는 대상 서버에서는 기준 서버의 환경을 모르기 때문입니다.
  2. 크로스 컴파일 : 자바는 이부분에 대해서 완벽하지 않습니다. Go언어는 맥에서 작성되고 테스트 된 프로그램이 리눅스에서 완벽하게 컴파일 될 수 있음을 보장합니다. 그리고 대상 시스템을 맞는 옵션으로 컴파일을 하여 바이너리를 대상시스템으로 복사하면 바로 작동이 가능합니다.
  3. 설정을 빌트인 : 몇줄의 코드로 CPU, 메모리, lock여부등의 시스템 자원 정보를 프로그램에 담을 수 있습니다.

결론
저는 Go언어가 최고의 서버 프로그래밍 언어라고 생각합니다. Go는 파이썬의 모던한 개발 방식과 C와 C++의 속도를 가지고 있습니다. Go언어가 쉽게 개발되고, 많은 복잡한 시스템에 쉽게 배포되는 환경속에서도 개발 생산성과 속도를 다 동시에 만족시켜줍니다. 그리고 표준화되는 코드포맷과 작은 언어 스팩, 명확한 코드기술을 통해 협업을 하는데 이점을 줄 것입니다.

2013년 9월 25일 수요일

RSA Cipher

소 개
RSA는 공개키 암호시스템의 하나로, 현재 전자 상거래 등에 광범위하게 이용되고 있다.1977 년 로널드 라이베스트, 아디 샤미르, 레오널드 애들먼이 발명하였으며, RSA라는 이름은 이 3명의 이름 앞 글자를 딴 것이다. 이 세 발명자는 이 공로로 2002년 튜링상을 수상했다. RSA 암호체계의 안정성은 큰 숫자를 소인수분해하는 것이 어렵다는 것에 기반을 두고 있다. 만약 큰 수의 소인수 분해를 획기적으로 빠르게 할 수 있는 알고리즘이 발견된다면 이 암호 체계는 가치가 떨어질 것이다. 1993년 피터쇼어는 쇼어 알고리즘을 발표하여, 양자 컴퓨터를 이용하여 임의의 정수를 다항 시간 안에 소인수분해하는 방법을 보였다. 따라서 양자 컴퓨터가 본격적으로 실용화되면 RSA 알고리즘은 무용지물이 될 것이다. 그러나 양자 컴퓨터가 이 정도 수준으로 실용화되려면 아직 여러 해가 더 필요할 것으로 보인다.
RSA 암호화 알고리즘은 1983년에 발명자들이 소속되어 있던 매사추세츠 공과대학교에 의해 미국에 특허로 등록되었고, 2000년 9월 21일에 그 특허가 만료되었다.

개 요
RSA 는 두 개의 키를 사용한다. 여기서 키란 메시지를 열고 잠그는 상수(constant)를 의미한다. 이 중 공개키(public key)는 모두에게 알려져 있으며, 메시지를 암호화(encrypt)하는데 쓰인다. 이렇게 암호화된 메시지는 개인(비밀)키(private key)를 가진 자만이 해독(decrypt)하여 열어볼 수 있다. 다시 말하면, 누구나 어떤 메시지를 암호화할 수 있지만, 그것을 해독하여 열람할 수 있는 사람은 개인키를 지닌 단 한 사람 뿐인 것이다. RSA는 소인수분해의 난해함에 기반하여, 공개키만을 가지고는 개인키를 쉽게 짐작할 수 없도록 디자인되어 있다. 보다 이해하기 쉬운 예를 들자면, A라는 사람에게 B라는 사람이 메시지를 전하고자 할 때 B는 A의 열린 자물쇠를 들고 와 그의 메시지를 봉인하고, 그런 다음 A에게 전해 주면, 자물쇠의 열쇠를 가지고 있는 A가 그 메시지를 열어보는 식이 된다. 중간에 그 메시지를 가로채는 사람은 그 열쇠를 가지고 있지 않으므로 메시지를 열람할 수 없다. 그리고 RSA의 디자인 상, 그 열쇠는 자물쇠의 형태만 보고서는 쉽게 제작할 수가 없게 되어 있다.
이와 같은 암호에 기본적인 이론을 재고하는 수학이 정수론이 다. 이런 아이디어를 수학 적으 로 말하면 암호화과정을 하나의 함수로 볼 때 암호의 해독과정은 그 함수의 역함수를 찾는 작업이다. 따라서 역함수를 구하기 매우 어려운 함수가 무궁무진하듯이 해독이 거의 불가능한 암호도 많은 것이다. 암호에 쓰이는 계산방법은 우리가 알고 있는 것과는 다르다. 하지만 모르는 사이에 우리는 메일 이런 계산을 하고 있다. 시간 계산의 예를 보자 5시에서 3시간 후는 8시이고 이것을 식으로 쓰면 3+5=8 이다. 그런데 11시에서 5시간 후는 4시이므로 11+5=4가 된다 이것을 12가법(NOD)인 계산이라고 한다. 12가 아닌 다른 것도 법이 될 수 있으며 덧셈과 뺄셈 외에도 곱셈과 나눗셈도 가능하다. 이러한 계산과 관련되어 페르마의 작은 정리 라는 것이 있다. X가 소수일 때 a의 x제곱은 x를 법으로 하는 a와 같다는 것이다. 요일계산을 예로 들면(이때 7이 법이다) 1일이 월요일인 달의 21일은 3의 7승이므로 이 정리에 의해 3일과 같은 요일 즉 수요일이 된다. 78년 미국 mit 의 리베스트 샤미르에이들만이 제안한 RSA 암호체계는 페르마의 작은 정리와 함정합수의 개념을 이용했다.
암 호화에 사용되는 법과 암호화열쇠는 공개하지만 암호문을 가로챈 제3자는 해독열쇠가 없어 암호를 읽을 수가 없도록 만든 것이다. 이 때 열쇠를 알아내는 방법은 자연수의 소인수 분해와 관련돼 있는데 수가 커지면 이것은 현실적으로 불가능하다. 예를 들어 1초에 1백만 번 연산을 할 수 있는 컴퓨터를 이용하여 현대에 알려진 가장 빠른 방법으로 계산해도 1백자리 숫자를 소인수 분해하는 데는 1백년이 걸린다고 한다. 더구나 재래식 방법으로는 우주의 역사보다도 긴 시간이 필요하다 따라서 이러한 암호체계는 소인수분해에 대한 새로운 수학적 발견 이 없다면 깨뜨리기가 불가능한 것이다.
실 제로 정수론을 전공하는 많은 수학자들이 효과적인 소수 판정방법과 소인수 분해 방법을 찾는 연구를 하고 있으며 연구결과가 군사기밀 혹은 기업비밀로 분류되기도 한다. 소수 판정방법의 연구가 안정한 암호화 열쇠를 만들기 위해 필요한 연구라면 소인수 분해방법의 연구는 이러한 암호체계를 깨뜨리기 위해 필요한 연구라고 할 수 있다. 한편 미국 버클리 대학의 렌스트라는 최근 타원곡선 이론을 써서 큰 수를 효과적으로 소인수 분해하는 기존의 방법과는 전혀 다른 새로운 방법을 발견하여 수학계에 충격과 희망을 주고 있다. 

구 현
RSA 공개키 암호에 사용될 공개 키 {N,E}와 개인 키{N,D}를 생성하기 위해서는 먼저 모든 사용자들은 각각 다음의 작업을 수행하여야 한다.
① 두 개의 큰 소수 p와 q를 선정한 다음에 Modulus N = p * q와 PI(N)을 계산한다.
② 공개키 E는 PI(N) = (p - 1)(q - 1)과 서로 소의 관계가 되게 임의 로 선정한다.
E * D mon PI(N) = 1의 관계에 있는 개인키 D를 "확장된 유클리드 알고리즘"으로 구한다.
④ {E,N}을 공개키로 공개하고, {D,N}을 개인키로 자신이 안전하게 보관한다.
그 다음 RSA 암호의 암호화를 위해서는 먼저 암호화된 메시지를 받을 수신자의 공개키 {E, N}을 취득한 후에 암호화 할 평문M을 정수 M으로 전환하여 다음과 같은 암호화 작업을 수행한 결과인 암호문 C를 수신자에게 보내고, 수신자는 자신의 개인키를 이용한 복호화 작업을 통해서 원래의 평문M을 복원하게 된다.
RSA암호화 : E(M) = M ^ E mod N = C
RSA복호화 : D(C) = C ^ D mod N = ((M ^ E) ^ D) mod N = M

응 용
RSA 를 응용한 기술로는 전자서명 방식이 있다. 전자서명 방식에서는 송신자가 자신의 비밀키를 이용해 메시지를 복호화 알고리즘에 돌린 결과를 메시지와 함께 전송한다. 이 때 수신자 B는 송신자A의 공개키를 이용해 사인된 메시지를 암호화 알고리즘에 돌려 함께 전송되어온 메시지와의 관계로 사인의 진실 여부를 확인해 볼 수 있다.
한편, 인증 기능의 구조를 서명 등의 [본인 확인]의 케이스로 보면
① 수비 기능에서는 복호의 역할을 다한 비밀 키를 작용시켜 서명 문을 작성한다.
② 그 서명 문을 받은 사람은 서명인이 공개하고 있는 공개 키를 작용시켜 서명이 진짜인가, 어떤가를 확인한다는 것이다.
공개 키를 작용시킴으로써 만약 암호가 풀린다면 그 공개 키에 대응한 비밀 키로 서명되기 때문이어서 그 비밀 키는 서명자만의 비밀이기 때문에 본인 확인이 끝난 것으로 된다는 이론으로 된다. 

참고문헌

사랑은...

사랑은...
우연히 찾아온다.

말을 하지않아도
의도를 하지않아도
사랑인지 아닌지는 단번에 안다.

눈과 입은 마음의 창
그 너머에 본질을 꽤뚫는 순간...
세상에 천둥이 친다.


사랑은...
무언의 언어

말을 하지않아도
의도를 하지않아도
사랑인지 아닌지는 단번에 안다.

행동과 말은 마음의 창
하나로 이어지는 순간...
찌릿한 전류가 흐른다.


사랑은 벽처럼 나에게 다가오지만
극복 후 그 너머엔
또 다른 내가 서 있다

눈꽃을 하얗게 피웠다.

잠을 깨고보니 꿈속에서 보았던 아름다운 눈꽃 세상은

또 다른 꿈 속의 풍경이었다.


이리도 아름다운 풍경이 또 있을까?

황홀함에 난 몸도 마음도 눈처럼 포근하고 부드러워진다.



나 몰래 눈은 그렇게 소리없이 밤새 땅으로 내려왔구나



밖을 나가 눈을 만져본다..  포근한 눈은 만지기엔 너무 차갑다.

그리고 이내 사라져버린다.. 꿈처럼

Love or Like?

그것의 모든 것을 알려고 하는 것이다.

사랑과 앎은 같은 말일 수도 있다.

하지만, 그것에 대해 완벽하게 알게 되면 사랑이 없어지는 것일까?

만일 없어지고 난다면 사랑을 어떻게 유지할수 있을까?



만약 유지가 된다면, 그건 믿음이 있기 때문이다..

믿음만 남는다면 그건 한편으로 위험할수도 있지만

시간은 추억을 만들며 추억을 통해 서로에 대해 더욱 신뢰를 하게 된다.



그리고 그 뒤에는??

모든 상황을 판단할 수 없게 된다.

그렇다면 그뒤엔..

난 아마도 존재하지 않을 것이다.

시간

내일이면 모든것이 끝날 것처럼 아끼며 하루를 살아야 하는데

마음의 평온과 알찬 마음

아주 중요한 것이다.



인생은 아주 길면 100세라지만

100년도 어떻게 보면 1년씩 100번일 뿐이다.

이따금 시계를 보지 않고 TV를 보면서 10분을 1초처럼 보내는가 하면, 아침에 일어나기 싫어서 침대에서 시계만 바라보며 1시간같은 1분을 보내기도 한다.

인생은 자기가 얼마나 하루에 충실하느냐에 달려있다

난 얼마나 충실했는가??

얼마나 28년을 잘 보내왔는가??

1년을 1초처럼 보내온 해가 얼마나 될까??



매년 새로운 희망을 가진 나를 생각하며 맞이하겠다.

사람의 관계


사람의 관계는 머라 말할 수가 없다.

아는 사람의 사람으로 연결되는 반면..

모르는 사람끼리도 우연에 의해 친구가 된다.

아는 사람이지만 연락을안하는 경우도 있지만 어떠한 계기에 의해서 연락을 하기도 한다.

전혀 만날수 없을 것 같은 사람도 알수없는 계기로 친구가 되고 연인도 된다...

단지 이런 바탕에는 무난한 성격과 성격이 바탕이 되어야 할듯하다..연락도 자주하고, 욕먹지 않아야 되고..

솔 직히 주변에 먼가 일에 매달리는 사람들을 보면 좀 성격이 괴팍하거나 짜증나는 말투를 가진 사람이 있다. 성공은 했지만 그 성공을 축하하는 사람이 주변에 없는 것, 난 머리가 좋은데 날 도와줄 사람은 없는 것.. 많이 알고 있다고 생각했는데 진정한 친구는 별로 없고, 결혼식이나 특별한 때에 하객이 별로 없는 경우도 인생의 아픔이 될 것이다.

난 잘보이려고 노력하고 싶지는 않다..

다만 나의 이름을 들었을때 최소한 짜증은 안나는 사람이 되고 싶다.

난 믿는다 남에게 상처를 주면 반드시 돌아온다는 것을...