카테고리 글 목록: WORKOUT

workout history and all about that~!

how to install zmq on ubuntu

/* 우분투 리파지토리에 node 리파지토리를 추가후 nodejs 인스톨 */
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

/* node 관련 폴더들을 현재 사용자 소유로 만든다. */
sudo chown -R `whoami` ~/.npm
sudo chown -R `whoami` /usr/lib/node_modules
sudo chown -R `whoami` /usr/local

/* node-gyp 를 인스톨한다. 노드에서 사용할 네이티브들을 컴파일 가능하게 해준다.*/
sudo npm install -g node-gyp

/* libzmq3-dev를 인스톨한다. */
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libzmq3-dev

/* 이제 zmq npm 패키지를 인스톨한다. */
npm install -g zmq

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious
meteor logo

Meteor Korea DEV School 4th day

1. 강의 자료 슬라이드 입니다.
(A slide for the presentation)

publish / subscribe 자료 입니다.

 

성치님의 강의 자료 입니다. 진심으로 감사 드립니다. :)

2. 강의 자료 동영상 입니다. (Lecture Video)
publish / subscribe

 

3. 강의 자료에 나오는 소스입니다. (source on gitHub)

https://github.com/ppillip/ourQuiz

4.페이스북 그룹

Meteor School

참석해주시고 호응해주신 모든분들께 감사드립니다.
thanks for every one who participated

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious
meteor logo

Meteor Korea DEV School 1st day

1. 강의 자료 슬라이드 입니다.
(A slide for the presentation)

 2. 강의 동영상 입니다.  음질이 조금 튀네요.. 마이크를 사야겠어요 ㅠㅠ
(Lecture screen cast , it has sound problem)


참석해주시고 호응해주신 모든분들께 감사드립니다.
thanks for every one who participated

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious
meteor logo

Worldwide Meteor Day in Seoul Korea

Meteorjs world wide in seoul korea

Thanks everyone for Participating in our Event.

참석해주신 모든분들께 감사드립니다.

http://www.meteorjs.kr/

The first movie has some problem. I’m fixing it up and so sorry about that.

첫번째 동영상이 잘렸는데요 예제 부분이라서 다시 올리고 있네요 -_-; 밝을때까지 다시 올려 놓겠습니다.

 

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious
meteor logo

번역 : How to Scale Meteor?

원문 : How to Scale Meteor?

<번역 시작>

어떻게 Meteor 를 Scale 하는가?

미티어의 최신버전을 사용중이리라 가정하고 작성 하였습니다.

이전 글에서 우리는 Meteor 응용 프로그램의 scaling 에대한 문제와 해결책 살펴 보았습니다. 하지만 실제로 어떻게 실전에서 scale 하는지를 보여 주지는 않았습니다. 이번에는 실제로 살펴 보겠습니다.

분산 구성

구성도 :

세개의 미티어서버와 하나의 MongoDB의 서버 , 그리고 부하분산서버로서 HaProxy 서버를 둡니다. 또한 , SSL 지원을 위해 HaProxy 앞에 스터드서버를 둡니다.

이제 이 서버들의 구성을 살펴 보겠습니다.

MongoDB 구성

MongoDB는 oplog를 지원하는 single-server replicaSet 을 사용합니다. multiserver replica set 을 사용하는 것이 좋지만, 간단하게 구현하기위해 위해 단일 ​​서버를 사용하여 구성해봅니다.

단일 Replica 구성

첫째, MongoDB의 서버가 replicaSet 을 인식할 수 있게 구동합니다.meteor replicaSet을 구동하기 위해서 다음과 같이 명령줄에 입력 합니다. :

mongod --replSet meteor

그런 다음, 몽고 쉘을 열고 단일 서버 replicaSet구성을 위해 다음을 추가 합니다 :

var config = {_id: "meteor", members: [{_id: 0, host: "127.0.0.1:27017"}]}
rs.initiate(config)

적어도 3개의 노드를 가진 MongoDB를 ReplicaSet을 구성하는 것이 현명한 방법입니다.만약, MongoDB에 대한 전문 지식이없는 경우. MongoHQ 전용 서버를 사용할것을 강력히 추천합니다.

액세스 제어

우리는 별도의 MongoDB의 서버를 사용하고 있기 때문에, 무단 액세스를 방지 할 필요가있습니다.접근 제어를 위하여 방화벽을 구성할수도 있지만 MongoDB의 역할기반(role-based) 엑세스 제어를 사용할 수 있습니다.간단히 하기 위해, 우리가 방화벽을 제대로 구성했다고 가정하겠습니다.방화벽을 구성 할 수없는 경우, MongoDB의 역할 기반 액세스 제어를 사용 하길 바랍니다.

우리는 미티어앱의 데이터 베이스로 app 을 사용할것입니다.oplog 통합을 위해, local 데이터베이스를 사용할 예정입니다.

미티어 설정

우리가 scalable Meteor 배포를 구성하는 동안 몇가지 눈여겨 봐야할것들에 대해서 이번 섹션에 보여드리겠습니다.

Oplog 지원

미티어의 수평확장을 위해 oplog 가 작용 하는지에 대해 이전 글에서 소개 한바가 있습니다.

단순히 로컬 데이터베이스의 MongoDB의 URL을 아래와 같이 설정 하면 됩니다. MONGO_OPLOG_URL .

MONGO_OPLOG_URL=mongodb://localhost/local

(물론, MONGO_URL 또한 설정해야 합니다)

IE 8과 9 Sticky Session 지원

IE 8과 9는 Ajax 로 쿠키를 전송하지 않습니다; 이것이 로드밸런서를 망가트리는 현상에 대해서 다음섹션에 알아보겠습니다.다행히, SockJS 는 그문제의 해결책입니다. Meteor는 기본적으로 그 설정이 꺼져 있습니다. 설정을 켜려면 다음과 같이 환경변수를 설정해야 합니다 :

export USE_JSESSIONID=1

서버 선택

동일한 Meteor 서버를 선택하는 것이 매우 중요합니다. 같은 성능, 동일한 OS에 같은 데이터센터에 위치하고 구성 또한 같아야 합니다. 그렇지 않으면 서버들에 대하여 균일한 밸런싱을 기대 할 수 없습니다.

이번 설정에서, 나는 서버에 단 하나의 프로세스를 사용하고 있습니다.그래서 여러 코어 서버는 큰 도움이되지 않습니다.그래서 싱글 코어 서버 인스턴스를 선택하려고합니다.이것에 대하여 추후에 더 다뤄보겠습니다.

배포

Meteor app 을 배포하고 신중하게 설정하는 것은 매우 중요합니다. 가능하다면 방법을 잘 알고있는 사람과 상담하십시오.그럴수 없다면 Meteor Up 을 이용하세요.

로드 밸런서 구성 (HaProxy)

나는 Meteor 응용 프로그램에 대한 부하 분산 장치로 HaProxy 사용하고 있습니다.그것은 매우 안정적이고 많은 기업의 운영환경에서 사용되고 있습니다. 또한, HaProxy는 Sticky Session 지원기능을 내장하고 있습니다. 그리고 우리는 다른 몇가지 설정을 사용 할 것입니다.

Sticky Session(지속적 세션) 지원

우리는 Sticky Session을 구현할 수있는 몇 가지 방법이 있습니다.“쿠키”, “ip주소 해싱” 또는 “사용자정의 URL” 등을 이용하여 Sticky Session을 구현할 수 있습니다. 몇 가지 다른 방법들이 있긴하지만 위의 방법이 가장 일반적인 것입니다.

“ip주소 해싱”이 가장 쉬운 방법이지만, 부하 분산이 적절하게 이루어 지지 않습니다. 우리는 ip 정보와원천 ip가 숨겨진 프록시서버의 ip 를 신뢰할수가 없습니다. 프록시서버를 통한 ip는 한개의 서버만이 많은 요청을 받게 될 수 있다는 의미입니다.

“사용자정의 URL” 경로는 좋은 방법중 하나 입니다. SockJS는 아주 잘 지원 합니다.  하지만 사용자 정의 URL 사용을 위해서는 로드밸런서에서의 사용자 로직과 Meteor 서버에서의 추가 구성이 필요합니다.

“쿠키” 기반 솔루션은 적절하게 부하를 분산 할 수 있고 설정이 쉽기 때문에, 가장 이상적인 방법입니다.

부하분산 알고리즘

절적한 분산 알고리즘을 선택하는 것이 매우 중요합니다.HaProxy 는 많은 알고리즘을 제공합니다. roundrobin 알고리즘은 문서에 좋습니다. roundrobin는 Ruby on Rails 나 PHP로 만든 stateless(불연속) 웹앱에 아주 좋습니다.

반면에 Meteor 는 연속적이고 지속적인 연결을 가진다. 따라서 , leastconn 알고리즘을 사용하는 것이 좋다.leastconn 알고리즘은 가장낮은 수의 연결을 가지고 있는 서버에게 새로운 연결을 보낸다.이 알고리즘은 서버가 다운되어 다시 살아나는 경우에도 동일하게 부하를 분산한다. 만약 roundrobin 을 사용한다면 그것은 부하 불균형을 가저다 줄 것입니다.

Configuration (설정)

다음과 같은 구성 파일을 사용하여 HaProxy을 구성하는 방법을 참조하십시오 :

defaults
  mode  http
  timeout connect 5s
  timeout client  10s
  timeout server  10s

frontend public
  #binding port 80
  bind *:80
  default_backend apps

backend apps
  #load balancing algorithm
  balance leastconn

  #using JSESSIONID as the cookie
  cookie JSESSIONID insert nocache

  #adding server
  server host1 host1.example.com cookie host1
  server host2 host2.example.com  cookie host2
  server host3 host3.example.com  cookie host3

간단하게 유지하기 위해 설정 파일의 일부가 생략되어 있습니다.여기에서 전체 설정 파일을 받을 수 있습니다.

SSL with Stud

SSL 은 운영에 필수 조건입니다. 안타깝게도 HaProxy의 안정화 버전은 SSL을 지원하지 않지만, 스터드를 HaProxy 앞에 설치함으로써 ssl을 사용할수 있습니다. 스터드는 HaProxy와 같은 서버에 배포하는 것이 좋습니다.

이 소스 에서 Stud를 install 하세요.apt-get 으로 설치한 것은 구버전일테니까요.

다음과 같은 설정을 할수 있습니다.

#bind to defualt SSL port
frontend = "[*]:443"

#haproxy host and port
backend = "[localhost]:80"

#location of the .pem file
pem-file = "/path/to/ssl.pem"

전체 구성화일은 여기 에서 구할 수 있습니다.

스터드는 SSL 인증서와 하나의 개인 키 .PEM 파일이 필요합니다. .PEM 파일을 만드는 방법에 대하여 여기를 참조하세요

즐기세요

나는 이 글이 Meteor 를 수평확장하는 데 도움이 되기를 바랍니다. 이글에 문제가 있거나 수정이 필요한 경우 주저 하지 마시고  저에게 연락 하거나 아래 코멘트를 추가 해주시길 바랍니다.

<번역 끝>

번역이 이상한 경우는 댓글 부탁드립니다. 넓은 마음으로 이해 해주세요 ^^;;

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious

특정 key(columns) 만 뽑아 배열 만들기

몽고디비에서는 특정 컬럼만 뽑기 위해서 db.collection.find({조건},{key:1,…}) 로 질의 한다. 

몽고디비에 대한 의존도를 줄여보자.

1. map 만 쓴 질의
pj.yearlyCmltCntdHeatLoad.public.map(function(obj){ return obj.heatingCntdHeatLoad; });
-> 전세계?어디서나 쓸수 있는 질의 , 그런데 내가 가저오고 싶은 key 가 제일뒤에 보인다.

2. 언더스코어 질의
_.pluck(pj.yearlyCmltCntdHeatLoad.public,'heatingCntdHeatLoad');
-> 언더스코어의 pluck 함수를 이용한 질의.(짧다!). parameter 의 순서가 바뀌었다면 최고 인데.. 쉽다.

3. 커피스크립트 질의
x.heatingCntdHeatLoad for x in pj.yearlyCmltCntdHeatLoad.public
-> 물론 추후 js 로 바뀜. 몽고 console 이 커피스크립트를 지원한다면 좋겠음.
,물론 커피로 만든 함수를 js 로 변환한뒤 콘솔에서 로딩해서 쓰는 방법도 있음.

여러분이 좋아하는 sql 

select heatingCntdHeatLoad from pj.yearlyCmltCntdHeatLoad.public
-> 간단해 보임

 

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious
angularjs-188x200

angularjs 와 java , mongodb 사용의 나쁜예 퀵하게 보기 (1)

현재 angularjs 와 java(톰켓)을 사용하여 SI 프로젝트를 하고 있습니다. 현시점에서 상태를 퀵하게 기술해봅니다.  전체를 상세 설명하려면 소스 공개가 가장 빠르겠지만 SI 특성상 공개 할수가 없습니다. 제 개발 패턴이 궁금하신분이 있다면(없겠지만) 차라리 데모?를 직접 보여 드릴 수는 있습니다. ㅎㅎㅎ

front : javascript ( angularjs 를 주로 씀 )
was : java / tomcat / struts2 / spring(젤 하는일없음)
db : mongodb 
o/s : dev-osx , server-ubuntu

1. 클라이언트

1.1 코딩기준 
	- jQuery 떡칠 way 는 하지 않고 (아예사용안함) angular way 로만 한다. 
	- single web page 로 구성한다. 
	- index.html 상단과 좌측 메뉴 처리 , appControl 관련된 javascript 처리
		-> 실제로 메인 app. 메인 컨텐츠 부분은 ng-view 로 동적 로딩 되게 한다. 
	- 동적 로딩되는 실제 ui 처리는 ng-view와 router 를 사용한다. 
          로딩되는 화일은 화면명.html + 화면명Ctrl.js 의 한쌍으로 구성한다.
		-> 개인적인 취향 jQuery 떡칠패턴으로 개발시부터 
                   ui.html + ui.js + ui.css를 주로 써왔음
	- 디렉티브는 별도로 저장한다. 
	- 전체 화면의 공유 데이터는 rootScope 데이터 변수를 사용하여 공유한다.
		-> service 는 사용하지 않는다 (angularjs 권고사항) 

1.2 폴더
	/estimate 	- index.html 및 화면명.html , 화면명Ctrl.js 화일들 저장 
	|- /directive	- angularjs 디렉티브 + ui.bootstrap 디렉티브
	|- /filter	- 필터관련 js 화일
	|- /helper	- 메뉴처리 js , 기타 분류안한 js 예) request 처리 js
	|- /service	- view Controller 에서 공통 사용되는 업무관련 함수들
			  ex) 몽고디비기본함수 (find,remove,update..) 클라이언트 구현체 
	/lib		- 외부 자바스크립트 프레임워크들 
	|- /bootstrap
	|- /Hightchart 
	|- underscore.js

	/schema
		schema.js   - json템플릿 리턴 및 벨리데이션 담당
		schema.json - json 스키마정의 

2. 서버 (tomcat)
	2.1 어떠한 경우도 서버페이지(jsp) 를 생성하지 않는다. 
	2.2 브라우저 요청과 서버쪽 Action 은 이름으로 매칭한다. (설정최소화)
	    -예) 클라이언트 요청 SalesEstimate-findProject 
		 -> 서버쪽 처리    SalesEstimateAction 의 findProject
	2.3 브라우저 리프레쉬 할경우 클라이언트 라우터 동작을 위한 리디렉트 구현
	2.4 odm 은 하지 않는다. jsonhashmap 변환으로 대체 (gson 라이브러리사용)		
		key 값을 method 로 사용하지 않음. key 값을 검색의 대상으로 동적 사용하므로 불가능함. 
	2.5 향후 node 로 변환 or 스프링및 스트러츠 걷어내고 jsp 만으로 전환.

3. issue 
	router시 앵귤러 해쉬뱅 '/#/' 으로 인해서 ie 에서 비정상적 동작. 
           1. 심각하게 "angularjs 들어 내기" , "single web 안하기" 중에 고민중.
           2. 앵귤러들어내기 (meteor 에서 ddp만 내리고 클라이언트만 사용하기)
        "서버가 자바인 관계로 자료구조(json) 핸들링의 어려운점" 해결방안 모색
           1. 자바들어내기 - 현재는 hashmap 으로 꿋꿋하게 버티는중.

소스나 개발 패턴이 좀더 나아지면 (2)탄도 써보겠습니다.

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious

mongodb sparce index 퀵하게 보기

* mongodb의 index 특징 몇가지
-. array에 index 가능, 각각의 원소가 _id 와 함께 indexing 이됨
-. multi key index가능 : 단!!! 2개 key 이상 모두 배열로 insert 안됨!!
-. unique index 는 key가 없이 insert 될경우 key:null 로 간주하여 dupkey 에러 발생!!

* sparce index 
-> unique index 생성시 key 값이 없어도 insert 가 가능하게함

key로써 a,b,c 가 존재 하는 document 에서
unique와 함께 c로 index 를 걸었을경우
db.test.ensureIndex({c:1},{unique:true, sparse:true}) /* ensureIndex 함수이용 */

a:1 , b:2 , c:3  -> indexing 대상
a:1 , b:3           -> 제외
a:2 , b:3           -> 제외

스파스 인덱스는 인덱스 선언된 key 가 없는 doc의 경우 인덱싱에서 제외됨
-> 인덱스를 통해 접근할경우 key 가 없으면 쿼리 대상에서 제외된다는 이야기
-> 인덱스를 건 시점에서 쿼리 결과가 달라질수 있음
ex) sort 를 할경우 대상에서 제외되버림
-> 초반설계시에 key (컬럼)이 없이 insert 된넘들 ($exists 구문없이) 무시하기에 딱좋겠다.
<퀵하게 보기 끝>

테스트 해보자

테스트 데이터 넣고

> var t = db.test
> db.t.insert({a:1,b:2,c:3})
> db.t.insert({a:4,b:6})
> db.t.insert({a:9,b:11})
> t.find()
{ "_id" : ObjectId("514d541dc19f83d03d5b7706"), "a" : 1, "b" : 2, "c" : 3 }
{ "_id" : ObjectId("514d543cc19f83d03d5b7707"), "a" : 4, "b" : 6 }
{ "_id" : ObjectId("514d5441c19f83d03d5b7708"), "a" : 9, "b" : 11 }

이빨빠진 “c” key 로 index 걸어보기

> t.ensureIndex({c:1},{unique:true})
E11000 duplicate key error index: ppillip.test.$c_1  dup key: { : null }

-> 역시에러

그럼 이제 unique + sparse index 시도

> db.test.ensureIndex({c:1},{unique:true, sparse:true})

find 로 전체검색 해보면

> t.find()
{ "_id" : ObjectId("514d541dc19f83d03d5b7706"), "a" : 1, "b" : 2, "c" : 3 }
{ "_id" : ObjectId("514d543cc19f83d03d5b7707"), "a" : 4, "b" : 6 }
{ "_id" : ObjectId("514d5441c19f83d03d5b7708"), "a" : 9, "b" : 11 }

잘나오네

그럼 index 타게 sort 해보면

> t.find().sort({c:1})
{ "_id" : ObjectId("514d541dc19f83d03d5b7706"), "a" : 1, "b" : 2, "c" : 3 }

역시 “c” 없는 document는 무시당했어!! $exists 구문은 안써도 되겠다!

내생각
RDB : (db설계/수정 <-> 개발/수정) * n
noSql : (개발/수정 -> db 반영) * n
“간단하고 빠르게 개발자 위주로 가기는 nosql이 유리하다”는 내생각을 다시한번 확인함

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious

mongodb 검색조건 트릭

json의 같은 level 내의 key 값 중복에 대한 성질과도 관계있는 검색조건 트릭에 대하여 정리해봅니다.

select * from users where age > 10
표현을 몽고 nosql 문장으로 표현한다면?
db.users.find({age:{$gt>10}});

select * from users where age > 10 and age < 20 표현을 몽고 nosql 문장으로 표현한다면? (복수 선택 가능) 1. db.users.find({ age : {$gt:10,$lt:20} }) 2. db.users.find({ $and : [ {age:{$gt:10}} , {age:{$lt:20}} ] }) 3. db.users.find({ age : { $gt : 10 }, age : { $lt : 20 } }) (아... 열라 복잡해.. 괄호지옥이다;;) 첫번째는 정답입니다. 그리고 제일 간단하고 직관적으로 보입니다. 괄호지옥이지만 그중에서 제일 심플하지요. 몽고디비에서 속도가 빠른 패턴이랍니다. 두번째는 정답입니다. 같은 패턴으로 $or 가 있습니다. 몽고 nosql 사용시 정석?문법입니다. 세번째는 오답입니다. 결과가 age < 20 인 모든 document를 리턴합니다.
좀더정확히 말하자면 “age가 20보다 작은, 모든 document를 포함한 커서” 를 리턴합니다.
json 이 같은 레벨에서 키값 중복을 허용하지 않습니다. 불행히도 중복 정의 한다고 해도 에러를 리턴 하지도 않습니다. 그래서 뒤에 값만 반영됩니다. 쉽게 확인해보시려면 브라우저나 node 아님 그냥 몽고 shell 에서 다음과 같이 해보세요

> var a = {age:10,age:20};
> a
{age:20}

이렇게 됩니다.

그래서 키값 한개에 범주 같은 중복조건을 주려면 1.번 패턴이 가장 빠르다고 합니다. 2.번 패턴은 가장 정석 패턴입니다.

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious

mongodb aggregation (distinct)

mongodb 의 distinct 는 어떻게 할까

step 1. 테스트 데이터 만들어 넣기
* 몽고디비 접속 옵션중 –shell 옵션을 사용하여 js 화일을 로딩합니다. js 화일에 선언되어있는 함수나 셋팅을 현재 세션에서 사용 할 수 있습니다.

step 2. map reduce 를 이용해서 값을 가져오기

step 3. aggregation 함수를 사용해서 시도
* aggregate 함수는 mongodb ver 2.2.0 이상에서 지원 됩니다.
* 함수 사용법은 aggregate([{필터},{필터},{필터}]) 와 같습니다. 자세한 내용은 “http://docs.mongodb.org/manual/aggregation/” 에 가시면 볼수 있습니다.

결과값

{
    "result" : [
    {
        "_id" : { "a" : "여수", "b" : "파주"},
        "n" : 2
    },
    {
        "_id" : { "a" : "서울", "b" : "일본"},
        "n" : 1
    },
    {
        "_id" : { "a" : "강릉", "b" : "서울"},
        "n" : 1
    },
    {
        "_id" : { "a" : "서울", "b" : "시드니"},
        "n" : 2
    },
    {
        "_id" : { "a" : "파주", "b" : "서울"},
        "n" : 1
    },
    {
        "_id" : { "a" : "서울", "b" : "서울"},
        "n" : 5
    }
],
    "ok" : 1
}

*몽고디비의 aggregate 는 bson 을 C 로 만들어서 조금더 속도가 낫다는 10gen의 언급이 있습니다.

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious