이 블로그 검색

2012년 12월 26일 수요일

JavaScript Allongé eBook 구입

얼마 전 Hacker News 에 소개된 전자책인데 leanpub을 통해 구입해서 읽고 있다 . PDF혹은 아이패드나 아이폰에서도 볼수 있는 eBook 형식으로 제공된다. JavaScript Allongé 는 기본 문법을 알고 있는 독자를 대상으로, 각 장마다 자바 스크립트의 함수를 사용하는 새로운 관점들을 소개하고 있다. 그리고 각 장이 끝날 때마다 recipes 항목을 통해서, 앞서 배웠던 항목을 기본으로,  실용적인 활용 법을 소개해주고 있다. 개인적으로 추천할만한 내용이라고 생각한다. 한번 방문해보시길...
(Allongé 는 에스프레소와 아메리카노의 중간 정도 되는 커피라고 한다~커피관련 지식은 덤^^)

2012년 12월 25일 화요일

node.js chat server with QT client

node.js tcp chatting server with QT client


node.js로 구현한 채팅 서버 및 QT로 GUI를 꾸민 클라이언트이다.
사용자 등록, 로그인, 대화상대 추가/삭제, 로그인/아웃 알림 및 메시지 전달 기능이 구현되어 있다.

Current features:
  1. enroll user
  2. add/remove friend
  3. login and retrieve my friend list
  4. notify logged in/out
  5. deliver chat message

Server

net, Buffer module을 이용해서 작성되었다. 클라이언트와 주고받는 패킷의 정의는 다음과 같다.

The Packet format is : binary data + string 
4 byte header (means a length of following message) + message

The message format is :
string|(delimiter)... 

제일 먼저 32비트 정수가 포함되고 이후에는 문자열로 구성된 양식이다. 헤더와 메시지를 구분하는 별도 구분은 없다. 문자열의 길이는 이 32비트 정수에 설정 된다. 메시지의 형식은 먼저 사용 목적이 나오고 이후 구분자로 구분된 데이터들이 전송된다. 예를 들어 로그인의 경우라면 전달되는 전체 데이터는 다음과 같게 된다.

ex) Login message
4byte_integerLOGIN|SomeUserId|SomePassWord~

즉, 바이너리 데이터와 문자열이 포함되는 형식인데, 결국 다음과 같은 C 구조체가 전송되는 것과 같다.

This can be described as a C structure like this :
typedef struct _PACKET_LOGIN
{
    unsigned int nLen; //4byte, contains 34
    char szMSg [30];    
} PACKET_LOGIN;

이러한 구조체 데이터에 nLen 에는 문자열의 길이 (30)이 설정되고 szMSg 에는 "LOGIN|someUserId|SomePassWord~" 문자열이 담겨져서 node.js 서버로 전송되는것과 같다. 그러므로 전체 데이터의 길이는 헤더에 설정된 메시지 길이(30 byte) + 헤더 자체의 길이 (4byte) = 34 byte가 된다.

인터넷에서는 echo 서버, 혹은 단순히 클라이언트의 데이터를 받는 즉시 브로드캐스팅하는 예제를 볼수 있다. 하지만 tcp의 메시지 경계 없음으로 인한 데이터 fragmentation을 고려해줘야 제대로 동작하는 서버를 작성할수 있다. 이 때문에 전달되는 데이터가 완전한 하나의 패킷이 될때, 해당 처리를 해주고 만약 기대하는 길이만큼 전송이 다 되지 않았다면, 지금까지 받은 데이터를 누적시키는 작업이 필요하다.
전달되는 데이터가 모두 문자열이라면, 일반 변수를 사용해서도 가능하겠지만, 지금 구현하는것은 헤더부분이 32비트 정수형이기 때문에 (즉 바이너리 데이터 + 스트링 의 혼합) 뭔가 다른 방법이 필요하다. 이때 node.js 가 제공하는 Buffer 모듈을 사용하면 문자열 데이터 뿐만 아니라, 정수형 데이터도 처리가 가능하다.

2012년 12월 11일 화요일

node.js 의 thread pool(libuv) 부분


node.js 에서의 입출력 동작은 멀티쓰레드(thread pool)로 구현된다.
소스 코드에서 이 부분을 정리해본다. 다음과 같이 파일을 비동기로 읽어오는 스크립트가 있을때,
함수 호출을 따라가 보면 다음과 같다.

var fs = require('fs');
fs.readFile('./bigFile.txt', 'utf8', function(err, data) {
    console.log(data);
});
console.log('exiting...');

사용자의 스크립트에서 호출한 fs.readFile 함수는 /lib/fs.js 에 존재하며
내부적으로 다음 함수 호출을 한다.

node.js : threads-a-gogo compile error


node.js를 위한 thread, threads_a_gogo 컴파일시 오류 해결 방법

2012년 12월 6일 목요일

node.js single thread / multi thread ?

node.js 는 단일 쓰레드 환경이다.
그런데 이 말은, 사용자의 스크립트가 단일 쓰레드에서 구동된다는 의미이다. 즉, 사용자의 요청들을 처리하기 위한 이벤트 루프가 하나의 쓰레드로 돌아간다. 그러나, 실제 비동기 작업은 멀티 쓰레드(thread pool) 로 구현된다.


위 그림은 Jeff Kunkel 의 Node.js Explained 유튜브 동영상을 갭쳐한 것이다. 우측으로 node.js 의 쓰레드들이 잘 나타나 있다. node.js는 비동기 작업을 위해 libuv 를 활용하는데 여기서 Thread Pool 을 만들어서 작업쓰레드 들이 요청들을 처리하게 된다.

2012년 12월 4일 화요일

꿀벌이 사라진 이후

꿀벌을 보고 공상하다. 아니 망상일까?
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

꿀벌이 사라진 이후

꿀벌이 완전히 종적을 감추자, 과일등을 위주로 곡물생산량이 급감한다. 
인간들은 벌들이 사라진 근본원인은 생각하거나 개선하려 하지 않고, 
불완전한 유전자 조작 기술을 이용, 무성 생식이 가능한 생명체의 DNA 와 
농작물의 그것을 뒤섞어, 열매를 얻을수 있게 개량을 시도 하였다. 

2012년 12월 1일 토요일