2014년 12월 18일 목요일

New Model Make Those Obsolete

"In order to change an existing paradigm you do not struggle to try and change the problematic model.

You create a new model and make the old one obsolete.

That, in essence, is the higher service to which we are all being called."

~ Buckminster Fuller ~

http://p2pfoundation.net/Main_Page


2014년 12월 17일 수요일

Scalable Distributed Erlang

Scalable-Distributed Erlang에 대한 프리젠테이션입니다.

http://www.erlang-factory.com/upload/presentations/659/FactoryLite-SDErlangDesign.pdf

가장 인상 깊은 말은,
"All to all connections are not scalable onto
1000s of nodes."입니다.

1000개의 노드끼리 n-to-n 통신을 하면, 1백만개의 커넥션이 생기지요.
이 문제를 해결 할 수 있을지...

저는 차라리 reliable UDP로 통신하는 것이 어떨까 생각해 봅니다.

2014년 12월 4일 목요일

2014년 12월 2일 화요일

Google Storage API in Erlang


Erlang용 Native SDK가 없기 때문에,

직접 rest api를 만들어서 OAuth2에서 token을 받고, 
(  https://developers.google.com/accounts/docs/OAuth2ServiceAccount  )
그 token으로 API를 호출해야 한다. 


이 과정에서 시행착오가 있을 수 있는 부분이 몇가지 있다.

developer console에서 받은 p12 파일을 먼저 컨버팅해야 한다.


openssl pkcs12 -in some.p12 -out some.crt.pem -clcerts -nokeys

openssl pkcs12 -in some.p12 -out some.key.pem -nocerts -nodes

Certificate과 Key가 함께 있기 때문에, 일단 분리하고,


openssl rsa -in some.key.pem -out some.key2.pem


some.key2.pem이 RSA Private Key가 담긴 파일이 된다. 아래 코드는 이 파일을 RSA Private Key로 변환하는 코드이다.

get_private_key() ->
    FileName = m_config:get(gce_key_pem_file,"priv/google/some.key2.pem"),
    { ok , F } = file:read_file(FileName),
    PrivateKeyEntry = public_key:pem_decode(F),
    PrivateKeyEntry1=hd(PrivateKeyEntry),
    PrivateKey = public_key:pem_entry_decode(PrivateKeyEntry1),
    #'RSAPrivateKey'{publicExponent=Exponent
                    ,modulus=Modulus
                    ,privateExponent=PrivateExponent} = PrivateKey,
    [Exponent, Modulus, PrivateExponent].



그리고, JWT header, JWT Claim Set을 적절히 잘 만들고, 요 키로 sign을 해야 한다.




ToEncrypt = << (jwt_header())/binary , $. , (jwt_claim_set())/binary  >>,
S=base64url:encode(crypto:sign(rsa,'sha256',ToEncrypt,get_private_key())),
<< <<"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=">>/binary , ToEncrypt/binary , $. , S/binary >>. 


완성된 full source

m_oauth2.erl
https://gist.github.com/wdshin/2eb6998913b3b95454bc

m_google_storage.erl
https://gist.github.com/wdshin/54896699bf1f5aed926e


2014년 11월 19일 수요일

First Experience on Google Compute Engine

Google Compute Engine에서 Erlang,Riak,Cowboy 기반 서비스 설치 완료했습니다.

인상적인 것은, 다른 Region에서도 VM Instance를 만들면, 프로젝트가 쓰고 있는 같은 Privte 망에 붙어서 생성됩니다. 
그래서, cookie 만 같으면, Region간 통신이 바로 됩니다.

Regioin간 통신은 150ms 정도 나오고요.
같은 Region내의 다른 Zone간에는 1ms 이하로 떨어집니다.


2014년 11월 5일 수요일

Diffie Hellman Key Exchange in Erlang


test_dh() ->

    DHParams = crypto:dh_generate_parameters(1024,2),
    { PubKey1 , PriKey1 } = crypto:generate_key(dh,DHParams),
    { PubKey2 , PriKey2 } = crypto:generate_key(dh,DHParams),
 
    SharedKey1 = crypto:compute_key(dh,PubKey2,PriKey1,DHParams),
    SharedKey2 = crypto:compute_key(dh,PubKey1,PriKey2,DHParams),
 
    SharedKey1 =:= SharedKey2.


2014년 10월 16일 목요일

Erlang ,Cowboy, Riak


오랜만의 포스팅이다.
작년 10월에 포스팅하고, 거의 1년만이다.
그 동안 많은 일이 있었다.

erlang,riak으로 만든 SNS 서비스를 성공적으로 오픈했었다.
하지만, 서비스는 잘 되지는 않았다.

1년만에 다시 비슷한 서비스를 만든다.
그 1년 동안, 서버 코딩은 놓고, Unity를 이용한 게임 개발에 몰두했었다.
다시 서버 코딩을 시작하게 되었는데...
개발 환경이 매우 많이 바뀌었다.

riak은 1.4에서 2.0.1로 매우 많이 업그레이드 되었고,
erlang/OTP 도 15B03에서 17로 업그레이드 되었다.

Cowboy 또한 업그레이드 되었다.

Cowboy는 Erlang 17을 요구한다. 내부적으로 새로 생긴 데이터타입인 map을 지원한다.
하위 버젼의 Erlang에서는 empty map을 지칭하는 #{} 구문에서 에러를 내뱉는다.

Riak은 16B02기준으로 되어있다.
17로 컴파일하면 에러를 내뱉는다. 쿨럭~
rebar.config의 R16을 요구하는 라인을 없애도 컴파일 되지 않는다.

그리고, basho에서 만든 Erlang을 쓰지 않으면 security feature를 쓸 수 없다고 한다. 정말?

riak을 소스 컴파일 하기 위해서는 basho의 erlang을 쓸수밖에 없다.
결국은 erlang버젼을 맞추려면, cowboy버젼을 erlang R16에 맞춘 버젼을 쓸 수 밖에 없을 듯 하다.

cowboy를 쓰는 erlang은 17로 하고,
riak용 erlang은 16B02로 쓰는 방법이 있겠지만,
번거롭다.

다행히, cowboy master버젼이 아닌 1.0.0은 erlang 16B02에서 빌드가 된다.

To basho,
Please risk to be compiled in Erlang/OTP R17!