태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

개발서적 추천
Refactoring 리팩토링
마틴 파울러 저/윤성준,조재박 공역
Debug It! 실용주의 디버깅
폴 부처 저/박일 역
예스24 | 애드온2
2014.11.02 17:50
지식을 전해주는 책과 지혜를 전해주는 책이 있는데, 이 책은 지식보다는 지혜를 전해주는 것에 초점을 맞춘책이다. 테스트를 그저 버그의 예방을 위해서 작성하는 경우가 많지만, 이 책은 한걸음 더 나아가서 테스트를 작성하면서 어떻게 소프트웨어의 설계를 점진적으로 개선해 나갈 수 있는지에 대해서 알아본다. 

나는 아직 까지는 개발 하면서 테스트가 주는 이점 보다는 테스트 작성에 대한 부담을 많이 가지고 있다. 왜냐하면 처음에는 간단하게 시작되지만, 어플리케이션이 커지고 복잡해지면서 동시에 같이 양이 많아지고 복잡성과 유지보수 때문에 고민을 많이 하게 되기 때문이다. 테스트를 만들면서 설계를 단순히 하게되는 경험도 몇번은 있었지만, 테스트를 어떻게 효과적으로 잘 만들수 있는가에 대한 고민을 참 많이 했던것 같다. 

이 책은 테스트를 어떻게 하면 효과적으로 잘 만들수 있는 지에 대해 어려가지 많은 조언들을 해준다. 그 중에 몇가지를 한번 살펴보자. 

"100% 코드 커버리지 달성이 중요한게 아니다."

"테스트를 작성해서 얻게 되는 가장 큰 수확은 테스트 자체가 아니다. 작성 과정에서 얻는 깨달음이다."

"같은 테스트 클래스에 속한 테스트 메서드 까지도 순서를 가정하면 안 된다."

"스텁은 질문하고 Mock은 행동한다."

"테스트에서는 != 나 == 등의 비교문을 사용하는 단언문을 발견하면 주저하지 말고 추상화 수준이 적절한지 되짚어 보라."

"절대 실패하지 않는 테스트는 가치가 없다."

"테스트가 실패하는 원인은 오직 하나뿐이어야한다." - 단일 책임 원칙

"중복은 모든 악의 근원이다"

"파일 I/O 보다 느린 I/O는 없다."


좋은 테스트란 무엇일까? 이 책에서는 가독성, 유지보수성, 신뢰성이 있는 테스트가 좋은 테스트라고 말하고 있다. 이러한 가독성, 유지보수성, 신뢰성을 유지하기 위해 파트 2에서 냄새가 나는 테스트 라는 단어를 사용하면서 테스트의 안티패턴에 대해 이야기 하고 있다. 그러면서 좋지 않은 테스트를 어떻게 리팩토링 하면 되는지도 예제를 보여주면서 알려주고 있다. 자신의 테스트가 잘 작성된 테스트인지 알고 싶다면, 파트2의 4,5,6장을 읽어보면 뭔가 걸려지는 것이 분명이 힜을 것이라 생각한다. 나도 읽으면서 뜨끔한 구절이 많았다. 

그리고 파트3에서는 테스트 가능설계, Java이외의 다른 JVM언어를 활용한 테스트 작성 그리고 테스트 속도 높이는 법을 알아보게 되는데, 쉬운 내용은 아니지만, 설계를 더욱더 좋게 만들고, 테스트를 장황한 자바보다는 더욱더 간결하고 간편하게 만들수 있는 대안들을 보게 된다. 개인적으로는 새롭게 알게되는 내용이 많아서 흥미로운 장이었던 것 같다. 

이 책을 통해 테스트의 품질을 높이는 방법을 다양한 각도에서 바라보게 된것 같다. 테스트 주도 설계보다는 먼저 로직을 만들고 후에 필요한 부분의 테스트를 만들곤했어서, 테스트가 잘 깨어지기도 하고 테스트 자체의 품질도 많이 높지 않아서, 신뢰성이 떨어지거나, 유지보수성이 떨어지는 테스트를 만들어 내곤 했었는데, 이책을 보고 나서 다시금 품질 높은 테스트에 대한 마음이 생겼다. 지금 하고 있는 프로젝트는 비록 자바가 아니고 nodejs이지만 다시한번 책을 보면서 가독성, 유지보수성, 신뢰성을 가진 테스트를 작성해야겠다.


'' 카테고리의 다른 글

Effective Unit Testing  (0) 2014.11.02
자바스크립트 자료구조와 알고리즘  (1) 2014.09.29
파이썬을 활용한 베이지안 통계  (2) 2014.08.26
뉴욕의 프로그래머  (1) 2008.10.25
Posted by 규이
2014.09.29 00:11



표지르 보면 알겠지만, 고슴도치 보인다. 오라일리 스타일의 동물이 있는 컴퓨터 서적이다. 이런 책은 보통 정말 딱딱한 경우가 많은데, 책이 두껍지 않아서 그런지 딱딱하다기 보다는 재미있게 읽은 것 같다. 자료구조와 알고리즘 책은 보통 C나 자바로 공부하는 경우가 대부분인 것 같은데, 자료구조 자체가 매우 유연하게 설계된 자바스크립트라서 그런지 책을 읽으면서 어렵다는 느낌보다는 '재미있다' 라는 느낌이 더 들었던 것 같다. 



위의 사진을 보면 알겠지만,


책에 코드가 정말 많다. 그리고 설명은 그렇게 많지않다. 이 책의 저자는 마치 궁금하면 코드를 보고 생각해봐! 라고 말하는 것 같다. 이런 부분은 좋기도 하고 안좋기도 한데, 왜냐하면 이 책을 자바스크립트에 익숙하지 않은 사람이 본다면 무슨말을 하는 코드인지 알기가 힘들기 때문에 책을 읽기가 편하지 않을 것이기 때문이다. 

그리고 이 책에서는 스파이더 몽키라는 나로서는 처음 써보는 그다지 유명하지 않은 자바스크립트 쉘을 사용하고 그리고 거기에서만 사용되는 함수를 자주 사용하기 때문에 이 책으로 공부를 하려면 스파이더 몽키를 사용하던지 아니면 자기 나름대로의 방법으로 코드를 고쳐서 사용해야한다. 나는 스파이더 몽키는 이 책에 나온 코드의 의미가 뭔지 확인 할 때에만 사용했고, 보통은 nodejs로 코딩을 했었다. 모든 챕터를 다 정리한 건 아니지만, 9장까지 현재 해놓은 상태이고 나머지 장도 조만간 다 할 계획이다.  링크는 아래에 있다. 

https://github.com/wapj/dsawj

이 책의 저자는 학교에서 프로그래밍을 가르치시는 선생님이다. 그래서 그런지 챕터의 끝에 꼭 이런 연습문제들이 붙어 있다. 스스로의 코딩 실력을 향상시키려면 이런 연습문제를 풀어야 되는 것 아닐까라는 생각이든다. 다시 한번 볼때는 이책의 연습문제도 모두 풀어봐야 겠다는 생각이든다. 


아쉬운 점으로 이책에 코드에 오타가 가끔 좀 보이는데, 이부분은 추후에 수정이 되었으면 한다. 일단 내가 찾은 것들은 출판사 홈페이지에 등록해둘 생각이다. 그리고 저자분이 자바스크립트에 그다지 많이 정통하신 분은 아니라는 생각이 드는데, 왜냐하면 자바스크립트의 프로토타입 상속을 사용하지 않는 점이나, 코드를 여러번 중복해서 쓰는점, 그리고 가끔 비효율적인 코드들이 보이기 때문이다. 그렇지만, 로직 자체에는 문제가 없으므로 보는 사람이 알아서(?) 수정을 하면되겠다..

이 책은 자료구조에 대해서 개념은 알고 구현은 해보지 않았지만, 한번 만들어 보고 싶은 사람중에 자바스크립트에 나름 익숙한 사람이 보면 최적인것 같다. 많이 어렵지도 않고 적당한 난이도로 되어 있으나 그래도 나름 시간이 많이 필요한 책이다. 자료구조와 알고리즘 둘다를 한책으로 볼 수 있다니 그것도 자바스크립트로!! 매력적인 책이다. 




'' 카테고리의 다른 글

Effective Unit Testing  (0) 2014.11.02
자바스크립트 자료구조와 알고리즘  (1) 2014.09.29
파이썬을 활용한 베이지안 통계  (2) 2014.08.26
뉴욕의 프로그래머  (1) 2008.10.25
Posted by 규이
2014.08.26 22:41




이 책은 누구를 위한 책인가?

200페이지 정도되는 기술서적 치고는 매우 얇은 책이다. 보통의 C언어 기본서 같은 경우는 200페이지라면 거의 일주일 만에 볼 수 있지만, 이 책은 베이지안 공식을 활용해서 삶속의 다양한 문제들을 어떻게 푸는지 재미있게(?) 설명한 책인지라, 파이썬과 통계학을 동시에 알아야하는 책이다. 최근에 유행하는 학문트렌드인 융합의 장르가 되겠다. 

그러면, 파이썬이 먼저인가 통계가 먼저인가? 이 책은 파이썬에 대해서는 거의 가르쳐주지 않는다. 책에 있는 예제를 풀기 위해서는 책의 저자 앨런 B. 다우니가 만든 'thinkbayes.py' 라는 파이썬 모듈을 사용해야하는데, 이 모듈은 numpy라는 모듈과 scipy 그리고 matplotlib이라는 모듈에 의존성이 있다. 그래서 파이썬을 잘 모르는 사람들은 아마 예제를 돌려보는데만 시간을 상당히 투자해야 할 것이다. 이 책을 쓴 저자는 파이썬이 쉬워서(물론 쉬운 언어에 속하지만) 파이썬을 택했고, 더구나 베이지안을 잘 설명하기 위해 일상생활의 예제들을 가지고 설명을 해두었다. 

이책의 두께가 200페이지 가량 있다는 것이 의미하는 것은 이 책만으로 설명이 부족한 부분이 많다는 것이다. 그렇다면 이 책을 술렁 술렁 넘겨 볼 수 있는 독자는 통계학을 알면서(베이지안 통계) 그것을 프로그래밍으로 어떻게 표현해야 하는지 궁금한 사람이나 파이썬에 매우 능숙한데 통계학은 기본(고등학교 때 배우는 확률에 관한 것들)만 알고 있는 프로그래머가 되겠다. 아마 생각에 앞의 사람들도 술렁 술렁은 못넘길것 같다. 실제로 통계과에서 베이지안을 학부 2학년때부터 배운 나조차도 술렁술렁은 넘기기 힘든 문제들이 많다. 

그 이유로 책이 얇아서 설명을 정말 최소한 만 해놓은 경우가 많고, 소스에 대한 설명도 있긴 하지만, 이게 어떻게 돌아가는 건지 알려면 생각이 조금 필요하다. 

그렇다면 이 책은 어떻게 읽으면 좋을까? 

이 책은 요리책처럼 따라서 해보는 책도 아니고, 단순히 지식을 열거해 놓은 책도 아니다. 기본적인 지식이 있다는 가정하에 (그 기본적인 지식은 물론 파이썬과 통계학이다) 그 지식을 어떻게 사용할지에 대해 앨런 B. 다우니가 자신의 지혜를 잘 펼쳐놓은 책이다. 지혜를 물려받기 위해서는 그 지혜를 음미해야한다. 천천히 곱씹으며 책의 저자가 한말이 무엇인지 잘 읽어보는 것이 중요하다. 프로그램이야 오타없이 돌리면 값이 나오지만, 그것이 왜 그렇게 되는 것인지 이해할 필요가 있고, 그리고 통계학을 잘모르는 사람이라면 우도(likelyhood) 같은 말이나 조건부 확률 이런 용어들에 대해 익숙해질 필요가 있다. 

위에 적어 놓은 말을 한마디로 줄이면, 쉽지 않은 문제들이 대부분이므로 천천히 이해하면서 읽자. 가 되겠다. 개인적으로는 읽으면서 이해가 안되는 것들은 위키피디아나 구글에서 찾아서 힌트를 많이 얻었다. 저자가 운영하는 블로그나 영분 pdf판 서적은 무료로 받을 수 있도록 해놓았기에 한글로 이해가 잘 안될 때는 영어로 보기도 했다. 

thinkbayes 홈페이지 : http://www.greenteapress.com/thinkbayes/

원저자의 블로그 : http://allendowney.blogspot.kr/

설치관련

위에서도 말했지만, 파이썬과 통계를 안다고 가정한 책이기에 좀 불친절한 부분들이 있다. 특별히 파이썬의 의존성이 걸리는 부분들을 설치하는 부분이나 저자가 만든 모듈을 다운 받을 때 일일이 찾아보거나 주소창에 쳐서 다운받고 했는데, 귀찮은 이들을 위해 소스를 받을 수 있는 링크를 걸어둔다. 

http://thinkbayes.com/thinkbayes.py

http://thinkbayes.com/thinkbayes_code.zip

https://github.com/AllenDowney/ThinkBayes

thinkbayes는 numpy, scipy, matplotlib에 의존성이 있는데, 각각 설치를 해야한다.

나는 아래 두 링크를 참고해서 설치를 했다.

mac인 경우 scipy는 dmg바이너리를 받아서 설치하고, 
numpy는 easy_install numpy 또는 pip install numpy
matplotlib도 동일하게 easy_install matplotlib 또는 pip install matplotlib 로 설치가능하다.

읽고 난뒤의 소감

솔직히 파이썬이라는 타이틀의 제목과 목차와 책의 두께를 보고 '그냥 재미있게 심심할때 볼 수 있겠네'라는  착각을 했었다. 학부때의 기억력을 마구 마구 끄집어 내어서 집중해서 봐야하는 책이었다. 이 책하나를 본다고 통계를 실생활에 적용할 수 있는 수준까지는 되지 않겠지만, 통계와 우리의 주변에서 일어나는 사건들이 많이 연관이 되어 있음을 알 수 있는 책이었다. 간만에 뇌가 자극을 받으며 뇌세포가 활성화 되는 느낌을 받도록 해준 책이다. 다만 영어로 된 책의 썰렁한 농담은 뭔가 한국어로 번역하니 왜 저말이 있는지 알수 없는 경우가 많아서 어색한 느낌도 좀 들었다. 게속 해서 이런 융합형 책들이 나오면 좋겠다.





'' 카테고리의 다른 글

Effective Unit Testing  (0) 2014.11.02
자바스크립트 자료구조와 알고리즘  (1) 2014.09.29
파이썬을 활용한 베이지안 통계  (2) 2014.08.26
뉴욕의 프로그래머  (1) 2008.10.25
Posted by 규이


위의 링크에 있는 글을 간추린것.

1. 인포그래픽은 공유적인것(sharable)이다.
2. 인포그래픽은 링크걸 때 사용할 쓸 무지 좋은 미끼꺼리다.
3. 인포그래픽은 브랜드 인지도를 만들어준다.

인포그래픽을 어떻게 만드나?
1. 주제를 정해라
2. 정보/배경지식을 모아라
3. 뼈대를 만들어라
4. 컬러팔레트/그 이상의 것을 제공하라 

인포그래픽 배포
1. 이미지를 최적화하라
2. 표준 이미지 포맷을 사용하라.
3. 쉽게 공유가능하도록 페이지에 끼워넣기 가능한 html코드를 제공해라.
4. 소셜 공유버튼을 달아라.

인포그래픽 자랑하기
1. 소셜미디어에 공유해라.
2. 당신의 업계의 블로거들에게 접촉해봐라.
3. 인포그래픽 블로그나 디렉터에게 배포해줘라.


Posted by 규이
개발관련/리눅스2012.05.19 00:31

root계정으로 들어가자

gyus라는 유저를 추가해보자.

adduser gyus

비밀번호를 설정하자.

passwd gyus

패스워드 설정하기 

Posted by 규이
개발관련2012.05.15 16:47

아래 링크에 있는 걸 해볼려고 가상머신 우분투에 열심히 설치했는데, 다시 설치하는 귀찮음을 방지하기 위해 공유함.

http://yobriefca.se/blog/2012/05/08/starter-for-10-scala/?utm_source=twitterfeed&utm_medium=twitter

몽고디비는 스크립트화할수 있으나..그냥 apt-get install mongodb로 설치하시길...
(이거는 나중에 생각나면 만들어서 올릴게요. ; )
http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages (요거 보고 따라하세용)

스칼라 설치

#!/bin/bash

wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.0.1.tgz
tar zvf scala-2.9.0.1.tgz
sudo mv scala-2.9.0.1 /usr/local/

ln -s /usr/local/scala-2.9.0.1 /usr/local/scala 

SCALA_HOME="/usr/local/scala"

BIN_HOME="/usr/bin"

echo "INSTALL SCALA!"

ln -s $SCALA_HOME/bin/scala $BIN_HOME/scala
ln -s $SCALA_HOME/bin/scalac $BIN_HOME/scalac
ln -s $SCALA_HOME/bin/fsc $BIN_HOME/fsc
ln -s $SCALA_HOME/bin/sbaz $BIN_HOME/sbaz
ln -s $SCALA_HOME/bin/sbaz-setup $BIN_HOME/sbaz-setup
ln -s $SCALA_HOME/bin/scaladoc $BIN_HOME/scaladoc
ln -s $SCALA_HOME/bin/scalap $BIN_HOME/scalap

echo "INSTALL COMPLET!"

스칼라 삭제 

#!/bin/bash

echo uninstall scala

sudo rm -rf /usr/local/scala
sudo rm -rf /usr/bin/scala /usr/bin/scalac /usr/bin/fsc /usr/bin/sbaz /usr/bin/sbaz-setup /usr/bin/scaladoc /usr/bin/scalap 

플레이 프레임워크 설치 

#!/bin/bash
wget http://download.playframework.org/releases/play-2.0.1.zip

unzip play-2.0.1.zip

sudo mv ./play-2.0.1 /usr/local/
sudo chown -R gyu.gyu /usr/local/play-2.0.1
sudo ln -s /usr/local/play-2.0.1 /usr/local/play
sudo chmod +x /usr/local/play/play
sudo ln -s /usr/local/play/play /usr/bin/play


플레이 프레임워크 삭제 

#!/bin/bash
echo "play uninstall"

if [ -e "./play-2.0.1.zip" ];then
    sudo rm -rf ./play-2.0.1.zip
fi

sudo rm -rf ./play-2.0.1

if [ -d "/usr/local/play-2.0.1"  ];then
    sudo rm -rf /usr/local/play-2.0.1
fi

if [ -e "/usr/local/play" ];then
echo "Remove /usr/local/play symbolic link"
sudo rm /usr/local/play
fi

if [ -e "/usr/bin/play" ];then
echo "Remove /usr/bin/play symbolic link"
sudo rm /usr/bin/play
fi

그냥 스크립트 실행하면되니 설치노가다는 좀 줄겠지~ ㅎ

클라우드가 별거냐 저런거 자동화해주는게 클라우드지.

'개발관련' 카테고리의 다른 글

[ubuntu]scala, play2 설치, 제거 스크립트  (0) 2012.05.15
Subversion의 프로퍼티 자주 쓰는거  (0) 2012.05.10
Posted by 규이
SICP풀이2012.05.11 12:18

문제를 한글로 누가 적어놓은 사람 없나..ㅠㅠ 

;Exercise 1.3.
;Define a procedure that takes three numbers as arguments and 
;returns the sum of the squares of the two larger numbers.

(define (sum a b) (+ a b))
(define (square a) (* a a))
(define (largerNumber2 a b) 
   (cond ((> a b) a)
        ((= a b) a)
        ((< a b) b)
    )
  )

(define (largerNumber3 a b c)  (square (sum (largerNumber2 a b) (largerNumber2 a c))))

(largerNumber3 2 2 2)
(largerNumber3 10 11 12)
(largerNumber3 10 12 12)

'SICP풀이' 카테고리의 다른 글

[scip]연습문제 1.3  (0) 2012.05.11
Posted by 규이
nodejs2012.05.10 20:58

3장 노드의 기본모듈 (1,2장은 그냥 읽기만 했음 설치는 아래 링크 참조)

http://godpage.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%AC-1004%EC%97%90%EC%84%9C-nodejs%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0 

- 개인적으로 여러버전을 사용하려고 할때 환경변수의 패스를 수정하는게 아니라 심볼릭 링크를 만들어서 연결하는게 편한것 같음. 책에는 안나와 있지만..- 

process : 노드js의 프로세스에 관한 모듈 

nextTick : CPU연산이 많은 작업을 비동기로 실행할수 있도록 도와주는 메서드란다.
nextTick에 등록된 함수는 바로 실행하지 않고 이벤트 큐에 등록한다.
싱글스레드가 현재 작업을 완료하고 나서 다음 이벤트 처리때 처리함

process.nextTic(function() {
    console.log("nextTick으로 호출됐심다");
});

이벤트 (nodejs는 이벤트 루프 기반 - 비동기 콜백방식 이라고 하는게 더 알아먹기 쉬울라나?)

- 그러고 보니 책에는 Object를 전부 객체라고 이야기를 해놨네..흠.. 맞는듯 틀린듯 -  

발생하는 이벤트는 모두 events.EventEmitter(이벤트 발생기 - 이벤트 던지는 넘? )의 객체임
require('events').EventEmitter로 접근
listener 리스너 - 이벤트 발생시 실행되는 함수

관련 함수 
emitter.on(event, listener) or emitter.addListener(event, listener)
emitter.once(event, listener) - 한번만 실행해야하는 리스너
emitter.removeListener(event, listener)
emitter.removeAllListeners([event]) - event지정안하면 다 삭제
emitter.emit(event, [arg1], [arg2], ...) - 이벤트 발생시키기 > 글치...이름대로구만

스트림 - 모든 스트림을 다루는 객체의 추상 인터페이스(추상?!)
 - 읽기 쓰기 둘다가능 (그래서 아래 2개의 모듈이 존재)

Readable Stream
    data - 데이터가 들어올때 읽음
    stream.pipe(destination, [options]) - 스트림에서 읽어들인 내용을 destination으로 지정된 쓰기 스트림에 연결

Writable Stream
    
파일시스템 - 음 이거는 잘 봐둬야 될듯 (근데 귀찮...;)

fs.rename(original, newfile, [callback]) - 당연히 파일명 변경
fs.stat(path, [callback]) - 파일에 관한 여러가지 정보
fs.writeFile(파일명, 데이타, 인코딩, [콜백])
   - 음..머 파일 쓰기. 없으면 만들고 있으면 덮어쓴다. 데이타에 있는 문자열을 파일로 작성함 
fs.watchFile(파일명, [옵션들], 리스너) - 파일의 변경사항 감시.. 호 이런거 첨봄. 
fs.createReadStream(패스, [옵션들]) - 위에나온 Readable Stream을 리턴해준다.
fs.createWriteStream (패스, [옵션들]) - 글치.. 당연히 이것도 있어야지. 당연히 Writable Stream을 리턴합니당.

경로(PATH 말하는거임 - 敬老 가 아님다)

path.normalize(path) - /usr/local/node 이런거 잘 틀리기 쉬우니 알아서 고쳐준다.
     (슬래시두개 라든가, 윈도우에서는 \를 쓴다든가하는 - 그럼 util에다 넣지..싶었으나 저거하나땜에 util쓰면 귀찮긋징..ㅎ)
path.join([path1], [path2], [...]) - 그냥 패스를 이어 붙여줌
path.resolve([from ..], to) - 전달 받은 경로의 절대경로를 반환
path.dirname(path) - 유닉스에 dirname이라는게 있다. 머냐면 디렉토리명만 짤라서 보내주는거임.
                              궁금하면 dirname을 구글에서 찾으세여.
path.basename(path, [ext]) - 이거는 디렉토리는 짤라내고 파일명만 반환. ext에 있는 문자열도 짤라냄.
path.extname(path) - 요거는 확장자만 돌려줌
path.exists(p, [callback]) - 파일이 있는지 확인하는 함수

네트워크 - 비동기 네트워크를 다루는 클래스다.

- 흐미 내가 못하는 거다. - 

net.createServer([options], [connectionListener]) - TCP서버를 생성한다. connectionListener에 지정한 콜백함수는
        connection(서버에 요청이 들어올때 마다 생성됨)이벤트에 자동으로 연결된다. 
        allowHalfOpen : 한쪽에서 연결을 종료하면 반대쪽도 종료할것인지 정하는거 디폴트는 false
        이거는 예제를 한번 해봐야 될것 같은데 
        http://nodejs.org/api/net.html#net_net_createserver_options_connectionlistener 여기있는걸 함 해보자. 
        포트로 붙는거말고 소켓으로 붙는게 있는데, 이거 재밌음....(처음 알아서..?! 역시 모르니 글이 길어 지는구나..)
        암튼 아래에 적을 server객체를 만들기위해 쓰는넘

net.Server
server.listen(port, [host], [listeningListener]) - 지정한 port, host로 들어온 컨넥션을 받을 수 있게 함.
        서버가 바운드 (올라간다라고 표현들 한다.)될 때 listening이벤트가 발생하는데,
        listeningListener를 콜백으로 등록해놨으면 그게 listening 이벤트 리스너에 추가된다.
        (머... 그냥 실행된다라고 하지.. - 근데 정확하게는 적어놓은게 맞다. 공돌이식 으로 생각하자. )
server.address() - 서버호스트와 포트정보 
server.pause(밀리세컨드) - 말그대로다 밀리초만큼 서버.멈춤이다. DoS공격 같은거에 좋단다. 

- 책에는 net.Server가 가지고 있는 이벤트에 대해서도 나와있는데 그냥 넘어간다. 궁금하면 책을사자. - 

net.Socket - TCP나 UNIX의 소켓을 추상화한 오브젝트이다. - 그래야 자바스크립트에서 쓰지 ㅎ- 

- 찾아보니 소켓은 아이피랑 포트를 합친걸 소켓이라하네. 그러나 여기서는 자바스크립트 객체겠지여.-

서버에서 connection이벤트가 발생하면 콜백 함수(예제에서는 createServer에 connectionListener를 지정한 곳으로 소켓이 전달 됨.  c 라고 변수명을 적은곳 )로 소켓이 전달된다. 

socket.write(data, [encoding], [callback]) - 소켓에 데이터 전달.
socket.end(data, [encoding]) - 소켓 종료. FIN을 보내서 소켓을 닫으므로 서버쪽에서는 데이터 보낼 수 있다. 
socket.pause() - 소켓에서 데이터를 읽는 것을 멈추어 data이벤트가 발생하지 않게한다. 
socket.resume() - 다시 데이터받기.
socket.remoteAddress - 접속한 클라이언트의 원격 IP를 리턴함.
socket.bufferSize - 소켓에 쓰기위해 현재 버퍼에 있는 캐릭터 문자의 크기를 알수 있음. 인코딩되기 전의 크기이니 주의!

HTTP와 HTTPS  

HTTP - http의 서버, 클라이언트가 사용해야 하는 모듈 
HTTPS - http위에 TLS/SSL 을 얹어서 보안을 강화한거 http랑 거의 비슷. (그래서 패쓰 ㅎㅎㅎ)

아래의 3가지 이벤트가 사용가능하다. 
request - 요청이 들어올 때 발생
connection - TCP 스트림이 생성되면 발생
close - 서버가 닫힐 때 발생

http.createServer([requestListener]) - http 서버 생성.
        requestListener는 function(request, response) { blar..blar..} 요런 형식으로 되어있어야됨.
        server.listen(port, [host], [listeningListener]) 를 실행하면 서버가 바운드됨.
        이거도 예제를 해봐야 되는데...없어서 그냥 간단히 만들었음.
        아래 예제대로 만들면 nodejs로 웹서버를 띄울수 있음. 
        그리고 웹브라우저에서 localhost:8124로 들어가보면 'you connected local webserver'라고 뜰꺼임

http.ServerReqeust - EventEmitter의 객체 
        아래 2가지 이벤트가 사용가능하다.
        data  - 콜백함수 function(chunk) {}
        end - 요청이 종료될 때 발생하는 이벤트
        request.mothod - HTTP 메서드를 리턴 
        request.header - 헤더정보
        request.httpVersion - HTTP 버전
        request.setEncoding(encoding=utf8) - 인코딩설정
        request.pause() 
        request.resume()

http.ServerResponse - Writable Stream 객체이다. 
        response.writeHead(statusCode, [reasonPhrase], [headers]) - 응답 헤더 지정
        response.write(chunk, encoding='utf8') - 응답 바디에 청크를 보냄
        response.end([data], [encoding]) - 응답 종료        

var http = require('http');
var net = require('net');

// Craete a HTTP server
var server = http.createServer(function (req, res){
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('you connected local webserver');
});

// Running Server
server.listen(8124, function(){
console.log("server running!");
});

URL과 쿼리 문자열 - 이건...머지?   URL에 대한 모듈 

url
url.parse(urlstr, parseQueryString=false, slashesDenoteHost=false)
        - URL문자열을 호스트명이나 쿼리 문자열, 경로등으로 파싱한 객체를 리턴 
        parseQueryString은 쿼리문자열을 추가로 파싱할건지 지정 디폴트 false
        slashesDenoteHost은 / 가 호스트를 나타내는지 지정
url.format(urlObj) - url객체를 URL문자열로 변경.

querystring - 이 녀석은 자주 쓸듯
querystring.stringify(obj, sep='&', eq='=') - JSON객체의 키와 값을 이용해 쿼리문자열로 만듦.
        sep는 구분자 &, eq는 키와 값을 연결하는 녀석인 = 
querystring.parse(str, sep='&', eq='=') - 쿼리문자열을 JSON객체로 변환

Child Process - 이거 너무 멋진 모듈임!

- 콘솔의 command의 자식 프로세스구만 이걸로 콘솔 명령어를 nodejs에서! - 
child.stdin, child.stdout, child.stderr의 세가지 스트림을 사용 - 오 직이네 -  

require('child_process').spawn(command, args=[], [options]) - command를 사용하는 자식프로세스 생성
child_process.exec(command, [options], function(error, stdout, stderr) {} ) - command를 사용하고 결과를 리턴 

클러스터 - CPU계산량이 많은 경우 클러스터링으로 해결하는데, 그거 할려면 요걸쓰세염.

- 다중 프로세스의 로드밸런싱을 통합해 클러스터 모듈로 제공한다고 함.

cluster.isMaster - 마스터 프로세스인지
cluster.isWorker - 워커 프로세스인지 

아래에 있는 예제를 참고 하는게 도움이 될듯함다.
http://nodejs.org/api/cluster.html 


아...이것 말고도 많은데 일단 책에 있는거 요약해서 올립니다. 
지금 nodejs 공부중이니 혹시 질문을 올려주시면, 열~~~~~~~심히 찾아서 알려드리겠슴다. 



       

'nodejs' 카테고리의 다른 글

[nodejs] [아웃사이더]님 책3장 노드의 기본모듈 정리  (0) 2012.05.10
Posted by 규이
개발관련2012.05.10 12:53

소스관리 프로그램은 개발자라면 거의 쓰고 있을 텐데, 알면 편한 Subversion의 프로퍼티들을 정리한다.
(사실 누가 정리해놓은거 있으면 그냥 그거 보고 싶은데 없는듯?! ) 

락이 필요한파일인 경우
svn:needs-lock : *

파일의 타입지정
svn:mime-type : <text|binary|image/pnc>

커밋할때 무시
svn:ignore : *

파일에 실행권한을 부여(chmod 755 * 랑 같음) 
svn:executable : *

윈도우즈랑 리눅스랑 개행을 운영체제에 맞게 자동으로해줌
svn:eol-style : native


'개발관련' 카테고리의 다른 글

[ubuntu]scala, play2 설치, 제거 스크립트  (0) 2012.05.15
Subversion의 프로퍼티 자주 쓰는거  (0) 2012.05.10
Posted by 규이
Java2012.03.06 18:30
외우고 있는 코드를 매번 쓰는건 꽤나 귀찮은 작업이다.
그래서 이클립스에 템플릿으로 등록해놓고 사용하니 매우 편하다. 

이클립스의 Windows -> Preferences순으로 클릭하면 
Preferences 화면이 나온다. 

여기서 Java > Editor > Templates 순으로 가야된다. 

[##_http://godpage.tistory.com/script/powerEditor/pages/1C%7Ccfile21.uf@164D644B4F55D82302AAD8.png%7Cwidth=%22683%22%20height=%22544%22%20alt=%22%22%20filename=%221.png%22%20filemime=%22image/jpeg%22%7C_##]



내가 자주 사용하는 건 테스트 케이스 static 클래스 임포트랑 로그 변수를 자동으로 입력해주는 템플릿을 자주 사용한다. 
등록해보자 

[##_http://godpage.tistory.com/script/powerEditor/pages/1C%7Ccfile9.uf@174D644B4F55D823034574.png%7Cwidth=%22602%22%20height=%22295%22%20alt=%22%22%20filename=%222.png%22%20filemime=%22image/jpeg%22%7C_##]

 log4j 변수용으로 하나 만들고 

[##_http://godpage.tistory.com/script/powerEditor/pages/1C%7Ccfile1.uf@184D644B4F55D82304A67F.png%7Cwidth=%22683%22%20height=%22331%22%20alt=%22%22%20filename=%223.png%22%20filemime=%22image/jpeg%22%7C_##]



테스트 케이스 클래스 임포트 용으로 하나 만들자. 



addlog를 타이핑하고 컨트롤과 스페이스를 같이 누르면 addlog라고 뜰것이다. 그걸 선택하면 아래와 같이
템플릿으로 설정한걸 이클립스에서 넣어준다. 


[##_http://godpage.tistory.com/script/powerEditor/pages/1C%7Ccfile8.uf@114D644B4F55D824067E89.png%7Cwidth=%22435%22%20height=%22197%22%20alt=%22%22%20filename=%225.png%22%20filemime=%22image/jpeg%22%7C_##]
아래는 템플릿 추가할때의 구문들이다. 

log4j 변수추가하기

${:import('org.apache.commons.logging.Log','org.apache.commons.logging.LogFactory')}

private Log log = LogFactory.getLog(${primary_type_name}.class);


테스트 케이스용 import 클래스 추가하기

${:importStatic(

'org.hamcrest.CoreMatchers.*'
, 'org.junit.Assert.*'
, 'org.junit.matchers.JUnitMatchers.*'
, 'org.hamcrest.Matchers.*;'
, 'org.junit.Test'
)}


이걸로 조금 더 편해지는 사람이 있을라나?  


조금 더 자세한것은 아래 링크를 참조하시요.
http://eclipse.dzone.com/news/effective-eclipse-custom-templ
 
Posted by 규이