발생일: 2013.07.31 문제: 개인 프로젝트 서버는 노드 서버와 몽고 디비로 구현했다.몽고 디비의 래퍼로 몽구스(mongoose)를 사용하고 있는데,관계형 디비에 익숙하다보니 여간 삽질을 하고 있는 게 아니다. 여튼, 어떤 문서에 in 쿼리로 버추얼 속성을 넘겨서 조회하려고 하는데,이상하게 조회가 되지 않는다. 왜일까? 해결책: 버추얼 속성이기 때문에 쿼리 대상이 되지 않은 게 문제였다.쿼리를 조회하려면 버추얼 속성을 사용하면 안된다. in 쿼리http://stackoverflow.com/questions/5818303/how-do-i-perform-this-query-in-mongoose-mongodb-for-node-jshttp://stackoverflow.com/questions/8303900..
발생일: 2013.08.25 문제: 얼마 전에 립모션(Leap Motion)을 구입했다.문서나 예제도 많고, JavaScript API도 있어서 바로 실행해보기 아주 쉽더라.^^ 전체적인 개념을 빠르게 이해할 수 있게 큼직한 개념을 정리해뒀다. 해결책: 브라우저 동작 방식 - 서버에서 웹소켓 서버를 띄우고 디바이스에서 읽은 정보를 Push 하는 구조- 클라이언트(노드, 브라우저)에서는 웹소켓 클라이언트를 생성해 해당 메시지를 받도록 구현했다. Frame - 이벤트를 처리하는 프레임은 디바이스 프레임과 애니메이션 프레임으로 나눴다.- 디바이스 프레임은 립모션 디바이스에서 발생하는 모든 프레임을 받는다.- 애니메이션 프레임은 브라우저에서 requestAnimation 의 타이밍에 맞춰 가장 최근에 받은 프레..
발생일: 2013.05.29 문제: Jasmine 으로 테스트 작성 시, Spy 로 쉽게 목 객체를 만들 수 있다고 한다.자세히 알아보자. 해결책: http://pivotal.github.io/jasmine/#section-Spies spyOn(obj, methodName); 으로 특정 객체의 메서드를 목으로 만들 수 있다. spyOn(foo, 'setBar'); expect(foo.setBar).toHaveBeenCalled(); .toHaveBeenCalled();.toHaveBeenCalledWith('foo', 'bar'); foo.setBar.calls; // 호출 정보를 담아둔다. 각 호출의 전달 인자를 배열에 담고 있다..mostRecentCall; // 가장 최근의 호출.mostRecent..
발생일: 2013.05.31 문제: 노드를 사용하는 개인 프로젝트에 테스팅 도구로,BDD 테스트 프레임워크인 자스민(Jasmine)을 사용하고 있다. 다른 건 괜찮은데 비동기 테스트 부분이 잘 이해가 안된다.어떻게 하면 될까? 해결책: 아래처럼 `runs`와 `waitsFor`를 활용한다. describe('', function () { it('', function () { runs(function () { // 비동기 테스트가 필요한 코드를 작성한다. }); waitsFor(function () { // 이 함수가 true를 리턴할 때까지 테스트한다. // 즉, 이 함수는 반복해서 계속 호출된다. }, '시간이 만료된 경우', 1000); runs(function () { // waitsFor의 함수가..
발생일: 2013.05.28 문제: WebSocket Protocol 스펙을 보며 정리했던 메모 해결책: WebSocket Protocol Specification http://tools.ietf.org/html/rfc6455 개요 동일 근원 정책 아래에서 제공한다. 80/443 포트를 이용하는 HTTP 아래에서 동작하는 방식으로 설계했지만, 디자인 자체가 여기에 제한되어 있는 것은 아니다. 미래에는 비슷한 핸드쉐이크 방식으로 여러 포트에서 사용할 수도 있을 것이다. 프로토콜 개요 프로토콜은 핸드쉐이크와 데이터 전송으로 나뉜다. 클라이언트의 핸드쉐이크 GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec..
발생일: 2013.05.28 문제: WebSocket API 스펙을 보며 정리했던 메모 해결책: WebSocket API Specification http://www.w3.org/TR/websockets/ bufferedAmount send()로 추가한 데이터 중 아직 전송되지 않고 버퍼된 양 binaryType 개발자가 데이터를 어떤 방식으로 사용할 지 결정할 수 있게 한다. 기본 생성되면 "blob"로 저장되며, "blob" 또는 "arraybuffer" 중 선택할 수 있다. "blob"이면 파일에 저장하는 게 낫고, "arraybuffer"면 메모리에 쓰는 게 낫다. send(data) if data is a string 데이터를 유니코드 텍스트로 변환한다. 에러가 발생하지 않았다면, buffere..
발생일: 2013.05.28 문제: 웹소켓으로 채팅을 구현하는 것과 관련해 정리해뒀던 메모 해결책: 예전에 구글 톡은 어떻게 사용하고 있었나? https://developers.google.com/talk/ XMPP 프로토콜을 사용하고 있었는데, 이번에 행아웃으로 통합하면서 XMPP를 제공하지 않음. 구글톡이나 행아웃은 websocket을 쓰고 있나? https://plus.google.com/104401121686781166984/posts/Wc4vKDmmqEZ 구글 챗에서는 쓰고 있지 않다. 대신, 채널이란 개념을 쓰고 있다. WebSocket http://www.websocket.org/quantum.html 여기에 오버뷰가 잘 정리되어 있다. 이전에는 폴링, 롱폴링, 스트리밍이 있었다. - 폴링:..
발생일: 2013.04.19 문제: 어떤 면접에 base64 인코더를 구현하라는 문제가 나왔다는 얘기를 듣고,자바스크립트로 구현하는 걸 찾아봤다. 해결책: 아래 링크의 우리말 설명 굉장히 좋다.http://dakuo.tistory.com/entry/base64-%EC%9D%B8%EC%BD%94%EB%94%A9-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98 코드 예제. 아주 좋다.http://www.webtoolkit.info/javascript-base64.html 구현해본 코드 function b64(s) { var key = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var i = 0, len = s...
발생일: 2013.07.18 문제: 팀에서 한 주마다 가볍게 기술 관련 미팅을 진행하는데, 이번 주는 내가 발표하는 차례였다. 발표 주제는 '자바스크립트 템플릿 엔진'이었다.간단한 템플릿 엔진을 슈도 코드로 만들어보면서,클라이언트에서의 템플릿 처리 과정의 발전 모습과 큰 그림을 이해하도록 하는 데 중점을 뒀다. 그동안 네이버의 여러 서비스를 개발하면서 템플릿 처리를 위해 고민해왔던 과정을,최대한 쉽고 간단하게 설명하려고 노력했다.발표는 20분 정도였는데, 준비하는덴 열 시간이 넘게 걸린 것 같다. -_-; 나름 반응도 괜찮아서 기분이 좋았다.^^슬라이드를 함께 옮겨둔다. 해결책: JavaSript Template Engine from Ohgyun Ahn