기본 콘텐츠로 건너뛰기

9월, 2012의 게시물 표시

Meteor auth branch 변경 사항. 0.4.1 버전 9/22 기준

http://spectrumdig.blogspot.kr/2012/08/meteor-039.html  이후로 업데이트가 좀 되었다. api key/secret 을 더 이상 소스 안에서 관리 안함. accounts-ui 를 사용할 것을 권장하고 있다. $ meteor mongo 로 접근 > db["accounts._loginServiceConfiguration"].find() { "service" : "facebook", "appId" : " appID ", "secret" : " app Secret ", "_id" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxx" } 이와 같은 형태로 설정. 재설정시 서비스 명을 기준으로 remove > db["accounts._loginServiceConfiguration"].remove({service:"facebook"}) 그룹스의 글을 일단 옮겨와 본다. 기존에 setSecret method 및 config method 는 전부 지우고 Meteor.accounts.configuration collection 에 넣으라는 소리를 하는데 그것만으론 안된다. appID하고 appSecret은 지우고 collection 에 넣든 accounts-ui 를 써서 다시 지정했다고 해도 OAuth 인증 후 callback 으로 돌아오는 URL이 무조건 localhost:3000으로 되는 오류가 있는데 ROOT_URL 환경변수를 어플리케이션의 URL로 설정하던가 __meteor_runtime_config__.ROOT_URL = "http://<callback 받을 어플리케이션 URL>" ; 로 서버쪽 startup function 안쪽에 넣던가 하라고 한다.

시간 종결자 moment.js

http://momentjs.com/ 날짜 종결자라고 봐야겠다. time ago 찾다가 발견. formatting에서부터 i18n까지 거의 대부분의 스펙을 제공함. 한가지 기능만 살펴보면 블로그나 SNS 등에서 쓰는 상대시간(humanize time이라고 하더라)도 지원. http://momentjs.com/docs/#/displaying/from/ 의 내용을 참조하면 var start = moment(); // 현재시각 기준 혹은 var start = moment(1347961213698); 식으로 초기화하고 start.fromNow(); 로 얼마나 시간이 지났는지를 humanize time 으로 반환한다. a few second 대신 now 를 사용하고 싶다면 moment.relativeTime 를 수정하여 moment.relativeTime.s='now'; moment().fromNow(true); 이런식으로 true 옵션을 줘서 ago를 떼어내고 임의로 지정할 수 있다.

cloud9ide remote access tip

웹브라우저만 있으면 파일 업로드까지 가능한 막강 웹IDE인 cloud9ide 가 드디어 node 0.8.x 를 지원한다. 하지만 engine.io 탑재와 함께 내부기작이 바뀌었는지 외부에서 사용하기 위해 -l 옵션을 줘서 0.0.0.0 을 지정하면 클라이언트쪽 자바스크립트에서도 0.0.0.0을 참조하는 구조로 바뀌었다. 그래서 로컬로만 사용가능하고 외부에서 사용시 클라이언트쪽 통신이 끊어질 수 밖에 없는데 이래서야 원격 협업툴이 되지 않지. 그렇다고 직접 공인 IP를 찌르면 EADDRNOTAVAIL 오류가 난다. $ node cloud9/server.js -w ~/workspace -p 8123 -l 123.123.123.123 path.existsSync is now called `fs.existsSync`. connect plugin start events.js:66         throw arguments[1]; // Unhandled 'error' event                        ^ Error: listen EADDRNOTAVAIL     at errnoException (net.js:768:11)     at HTTPServer.Server._listen2 (net.js:891:19)     at listen (net.js:935:10)     at Server.listen (net.js:992:9)     at dns.js:71:18     at process.startup.processNextTick.process._tickCallback (node.js:244:9) 엄청 오랫동안 이 문제로 헤맸는데 결국 클라이언트는 접속할 도메인을 사용하게 하고 서버 사이드에서만 0.0.0.0 을 사용하면 되는 문제이지 않을까 싶어서 /etc/hosts 를 열고 c9.mydomain.com    0.0.0.0 이부분을 추가. 물론 c9.mydomain.com

Meteor 테스트 전략

* package를 만들고 테스트 할 때 /usr/local/meteor/packages/livedata 참조 package.js 내용을 보면 Package.describe({   summary: "Meteor's latency-compensated distributed data framework",   internal: true }); Package.on_use(function (api) {   api.use(['stream', 'uuid']);   api.use(['json', 'underscore', 'deps', 'logging'], ['client', 'server']);   // livedata_connection.js uses a Minimongo collection internally to   // manage the current set of subscriptions.   api.use('minimongo', ['client', 'server']);   api.add_files('writefence.js', 'server');   api.add_files('crossbar.js', 'server');   api.add_files('livedata_common.js', ['client', 'server']);   api.add_files('livedata_connection.js', 'client');   api.add_files('livedata_server.js', 'server');   api.add_files('client_convenience.js

webstorm 에서 meteor Application 을 기동하는 방법

webstorm 은 훌륭한 web-IDE고 meteor도 훌륭한 javascript framework 인데 meteor의 경우 실제로 node.js 파일을 실행하는 부분이 없어서 어딜 진입점으로 해야할지 난감하게 느낄 수도 있다. 고민하지 말고 meteor 실행 파일을 까보자. cat `which meteor` 해보니 맨 마지막 두줄에 export NODE_PATH="$DEV_BUNDLE/lib/node_modules" exec "$DEV_BUNDLE/bin/node" "$METEOR" "$@" 이 두문장이 보인다. $DEV_BUNDLE 이 어딘지 읽어보기 귀찮아서 찍어봤더니 meteor 설치 디렉토리더라 내 경우는 /usr/local/meteor which meteor 에서 bin 상위 경로라고 보면 된다. Edit Configuration 에서 Node.js 를 추가하고 아래와 같이 설정해보자. 이런식으로 주니 무리가 없더라. Environment variables 에 NODE_PATH 항목을 추가하고 meteor 를 설치한 경로 + /lib/node_modules 를 추가하는게 포인트. 눈치빠른 분이라면 meteor application 에 외부 package를 추가하고자 할때 어떻게 해야할지 감 잡으신 분도 있을거다 아무튼 저렇게 하고 가동하면 정상적으로 동작한다. 이제 터미널 옮겨다니 말고 편하게 콘솔창으로 서버 메시지를 보자.

node.js 에서 system call을 사용하는 방법

cloud9 을 사용해서 작업하고 있는데 업로드는 드래그&드랍으로 훌륭하게 지원하는 반면 다운로드를 지원하지 않아 조금 아쉽다. child_process 패키지를 사용하여 폴더를 전체를 압축한 다음 내려주자. http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options spawn을 사용해서 만들었다. 대충 express 를 통해 파일을 만들고 route/index.js 를 다음과 같이 해보았다. /*  * GET home page.  */ var spawn=require('child_process').spawn; var fs=require('fs'); exports.index = function(req, res) { var zip=spawn('zip',['-r', 'archive.zip', '.', '-i', '*']); zip.stdout.on('data', function (data) { console.log('stderr: ' + data); }); zip.stderr.on('data', function (data) { console.log('stderr: ' + data); }); zip.on('exit', function() { res.setHeader('Content-type', 'application/octet-stream') res.setHeader('Content-disposition', 'attachment; filename=archive.zip'); res.write(fs.readFileSync(__dir