Permalink
Browse files

init

  • Loading branch information...
0 parents commit 444625ec373e63b3cbe0328a3eaf04daa3c38597 @nanha committed Nov 21, 2012
Showing with 22,777 additions and 0 deletions.
  1. +3 −0 .gitignore
  2. +19 −0 0.logging/0.coffee
  3. +26 −0 0.logging/1.coffee
  4. +18 −0 0.logging/2.coffee
  5. +16 −0 0.logging/3.coffee
  6. +25 −0 0.logging/4.coffee
  7. +21 −0 0.logging/5.coffee
  8. +20 −0 0.logging/Logger.coffee
  9. +2 −0 0.logging/data/debug.log
  10. +18 −0 0.logging/data/exception.log
  11. +4 −0 0.logging/data/std
  12. +2 −0 0.logging/data/stderr
  13. +1 −0 0.logging/data/stderr2
  14. +2 −0 0.logging/data/stdout
  15. +1 −0 0.logging/data/stdout2
  16. +25 −0 1.stream/0.basic/0.coffee
  17. +23 −0 1.stream/0.basic/1.coffee
  18. +31 −0 1.stream/0.basic/2.coffee
  19. +18 −0 1.stream/1.pipe/0.coffee
  20. +26 −0 1.stream/1.pipe/1.coffee
  21. +44 −0 1.stream/1.pipe/2.coffee
  22. +27 −0 1.stream/1.pipe/3.coffee
  23. +36 −0 1.stream/2.duplex/0.coffee
  24. +42 −0 1.stream/2.duplex/1.coffee
  25. +42 −0 1.stream/2.duplex/2.coffee
  26. +21 −0 1.stream/2.duplex/3.coffee
  27. +35 −0 1.stream/2.duplex/duplex.coffee
  28. +16 −0 1.stream/3.proxy/0.coffee
  29. +23 −0 1.stream/3.proxy/1.coffee
  30. +28 −0 1.stream/4.spawn/0.coffee
  31. +24 −0 1.stream/4.spawn/1.coffee
  32. +46 −0 1.stream/4.spawn/2.coffee
  33. BIN 1.stream/4.spawn/a.tar.gz
  34. +19 −0 1.stream/4.spawn/fibo.py
  35. +13 −0 1.stream/7.pause/stream_interface_pause.coffee
  36. +21 −0 1.stream/7.pause/stream_interface_pause2.coffee
  37. +18 −0 1.stream/7.pause/stream_interface_pause3.coffee
  38. +10 −0 1.stream/8.buffer/use_buffer_http.coffee
  39. +10 −0 1.stream/8.buffer/use_string_http.coffee
  40. +15 −0 1.stream/9.etc/0_benchmark_nouse_stream_http.coffee
  41. +17 −0 1.stream/9.etc/0_benchmark_use_stream_http.coffee
  42. +13 −0 1.stream/9.etc/module_byline_read.coffee
  43. +13 −0 1.stream/9.etc/module_byline_read2.coffee
  44. +14 −0 1.stream/9.etc/module_json_stream.coffee
  45. 0 1.stream/data/4_byline_read.coffee
  46. +3 −0 1.stream/data/CreateDummyData.sh
  47. +21,891 −0 1.stream/data/childprocess_stdout.txt
  48. 0 1.stream/data/dummy.bat
  49. +1 −0 1.stream/data/from_readable_interface.log
  50. +1 −0 1.stream/data/input.txt
  51. +3 −0 1.stream/data/inputline.txt
  52. +1 −0 1.stream/data/npm_all.json
  53. BIN 1.stream/data/output
  54. +1 −0 1.stream/data/output.txt
  55. +3 −0 1.stream/data/outputline.txt
  56. BIN 1.stream/data/realtime.png
  57. +1 −0 1.stream/data/wow
  58. +24 −0 package.json
@@ -0,0 +1,3 @@
+*.dd
+*.dd2
+*.swp
@@ -0,0 +1,19 @@
+#
+# 로그를 남기는 방법은
+# console과 process 객체를 사용합니다.
+# 서버프로그램의 가장 기본은
+# 표준출력과 표준에러를 구분하여 사용하셔야 합니다.
+#
+# console 은 v8 이 지원하고 있는것이 아닌
+# node의 라이브러리 디렉토리에 console.js 라고 존재하며
+# 이는 process 객체를 wrapping 하고 있습니다.
+#
+# 4가지의 로그내용입니다.
+
+console.log 'stdout from console'
+console.error 'stderr from console'
+
+process.stdout.write "stdout from process\n"
+process.stderr.write "stderr from process\n"
+
+# 실행해보죠
@@ -0,0 +1,26 @@
+#
+# exception 를 잡기위한 domain 모듈에 대해서 알아봅니다.
+# 2가지만 기억하세요. run 메소드와 bind 메소드입니다.
+# 가장 기본적인 방법인 run 메소드부터 설명합니다.
+#
+# domain 모듈을 로드한후 create 메소드를 실행하여
+# domain 컨텍스트를 준비합니다.
+d = require('domain').create()
+
+# 에러이벤트를 설정합니다.
+d.on 'error', (err)->
+ console.error 'domain from run ! =========='
+ console.error err
+ console.error err.stack
+
+#
+# domain의 run 메소드로 감싼 함수안에서
+# 프로그램을 구현합니다.
+d.run ->
+ # 존재하지 않은 파일을 읽어들여
+ # throw 에러를 발생시켜보겠습니다.
+ require('fs').readFile './nonExistFile', (err, data)->
+ throw new Error err if err
+ console.log arguments
+
+# 자 실행해보죠
@@ -0,0 +1,18 @@
+#
+# domain bind 함수입니다.
+#
+# 마찬가지로 domain 컨텍스트를 생성합니다.
+d = require('domain').create()
+
+# 에러 이벤트를 설정하고
+d.on 'error', (err)->
+ console.error 'domain from bind ! =========='
+ console.error err
+ console.error err.stack
+
+# callback 을 bind 함수의 컨텍스트로 묶어버립니다.
+require('fs').readFile './nonExistFile', d.bind (err, data)->
+ throw new Error err if err
+ console.log arguments
+
+# 실행해보죠
@@ -0,0 +1,16 @@
+#
+# 표준출력과 표준에러를 구분하여
+# 웹서버에 구현하고 이를 실행하여 로그를 확인해보겠습니다
+#
+# c 3 2>./data/stderr 1>./data/stdout
+# forever start -c c -e ./data/stderr -o ./data/stdout 3.coffee
+
+# 웹서버를 실행합니다.
+require('http').createServer (req, res)->
+ # 표준출력과 표준에러를 남깁니다.
+ console.log 'stdout from httpserver'
+ console.error 'stderr from httpserver'
+ res.end '1st Node.js Korea Conference'
+.listen 1337
+
+# 실행해보죠
@@ -0,0 +1,25 @@
+Logger = require __dirname + '/Logger'
+
+global.log = new Logger __dirname + '/data/debug.log'
+global.loge = new Logger __dirname + '/data/exception.log'
+
+log.debug 'message'
+log.info 'message'
+log.notice 'message'
+log.warning 'message'
+log.error 'message'
+log.alert 'message'
+log.crit 'message'
+
+##
+d = require('domain').create()
+
+d.on 'error', (err)->
+ console.log 'from bind ! =========='
+ console.error err
+ console.error err.stack
+ loge.crit err.stack
+
+require('fs').readFile './nonExistFile', d.bind (err, data)->
+ throw new Error err if err
+ console.log arguments
@@ -0,0 +1,21 @@
+http = require 'http'
+d = require('domain').create()
+
+Logger = require './Logger'
+global.log = new Logger __dirname + '/data/debug.log'
+global.loge = new Logger __dirname + '/data/exception.log'
+
+http.createServer d.bind (req, res)->
+ log.info req.url
+ if req.url == '/favicon.ico' then return
+
+ d.on 'error', (err)->
+ console.error 'domain==='
+ loge.crit err.stack
+ res.end err.stack
+
+ # error
+ JSON.parse '{}.'
+
+ res.end 'wow'
+.listen 1337
@@ -0,0 +1,20 @@
+winston = require 'winston'
+level = 'debug'
+
+module.exports = (filename)->
+ logger = new winston.Logger
+ transports: [
+ new winston.transports.Console({
+ colorize : true
+ level : level
+ }),
+ new winston.transports.File({
+ level : level
+ json : false
+ filename : filename
+ })
+ ]
+
+ logger.setLevels winston.config.syslog.levels
+
+ return logger
@@ -0,0 +1,2 @@
+2012-11-21T01:41:55.457Z - info: /
+2012-11-21T01:42:41.711Z - info: /
@@ -0,0 +1,18 @@
+2012-11-21T01:41:55.465Z - crit: SyntaxError: Unexpected token .
+ at Object.parse (native)
+ at Server.<anonymous> (/home/play/NodeconfExample/0.logging/5.coffee:22:10)
+ at Server.Domain.bind.b (domain.js:201:18)
+ at Server.EventEmitter.emit (events.js:96:17)
+ at HTTPParser.parser.onIncoming (http.js:1807:12)
+ at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23)
+ at Socket.socket.ondata (http.js:1704:22)
+ at TCP.onread (net.js:403:27)
+2012-11-21T01:42:41.718Z - crit: SyntaxError: Unexpected token .
+ at Object.parse (native)
+ at Server.<anonymous> (/home/play/NodeconfExample/0.logging/5.coffee:22:10)
+ at Server.Domain.bind.b (domain.js:201:18)
+ at Server.EventEmitter.emit (events.js:96:17)
+ at HTTPParser.parser.onIncoming (http.js:1807:12)
+ at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23)
+ at Socket.socket.ondata (http.js:1704:22)
+ at TCP.onread (net.js:403:27)
@@ -0,0 +1,4 @@
+stderr
+stderr
+stderr
+stderr
@@ -0,0 +1,2 @@
+stderr from console
+stderr from process
@@ -0,0 +1 @@
+stderr
@@ -0,0 +1,2 @@
+stdout from console
+stdout from process
@@ -0,0 +1 @@
+stdout
@@ -0,0 +1,25 @@
+#
+# 파일스트림의 기본구성에 대해서 알아보겠습니다.
+# 첫번째 읽기용 스트림입니다.
+#
+# 파일시스템 모듈을 불러오고
+fs = require 'fs'
+
+# 타켓을 설정합니다.
+target = '../data/input.txt'
+
+# createReadStream에 타켓을 지정하고
+# 옵션중 bufferSize를 5으로 설정하여
+# data의 흐름을 알아볼 수 있도록 합니다.
+src = fs.createReadStream target, bufferSize: 5
+
+# EventEmitter 객체를 상속하고 있기 때문에
+# 아래와 같이 이벤트를 설정할 수 있습니다.
+# 읽기용 스트림에서 지원하는 이벤트중 data와 end
+# 이벤트를 설정합니다.
+src.on 'data', (buf)->
+ console.log 'from src / data: '.yellow, buf.toString()
+src.on 'end', ->
+ console.log 'from src / end'
+
+# 그럼 실행해보죠
@@ -0,0 +1,23 @@
+#
+# 두번째로 쓰기용 스트림입니다.
+#
+# 모듈을 불러오고
+fs = require 'fs'
+
+# 타겟을 설정하고
+target = '../data/output'
+
+# createWriteStream에 타켓을 지정합니다.
+dest = fs.createWriteStream target
+
+# 버퍼사이즈를 임의로 설정하고,
+buf = new Buffer 100
+msg = "1st Korea Node.js Conference\n"
+# 버퍼에 메세지를 작성합니다.
+buf.write msg, 0
+
+# 쓰기용스트림에 write 메소드를 사용하여 버퍼를 작성합니다.
+dest.write buf
+dest.end()
+
+# 그럼 실행해보죠
@@ -0,0 +1,31 @@
+#
+# 자 우리는 읽기용과 쓰기용 스트림을 연결해봤죠.
+# 그럼 이때 발생하는 이벤트의 순서가 어떻게 되는지 알아보죠
+#
+fs = require 'fs'
+
+# 버퍼사이즈를 지정합니다.
+bufferSize = 10
+
+# 읽기용과 쓰기용 스트림을 선언하고
+src = fs.createReadStream '../data/input.txt', bufferSize: bufferSize
+dest = fs.createWriteStream '../data/output.txt'
+
+# 읽기용에 data, end, close 이벤트 설정합니다.
+src
+ .on 'data', (data)->
+ console.log 'from src / data: '.yellow, data.toString()
+ dest.write data
+ .on 'end', ()->
+ console.log 'from src / end'
+ .on 'close', ()->
+ console.log 'from src / close'
+
+# 그리고, 쓰기용에 drain 이벤트를 설정하고,
+# 나머지 이벤트는 뒤에서 설명하겠습니다.
+dest
+ .on 'drain', ()->
+ console.log 'from dest / drain'.cyan
+
+# 4가지의 이벤트가 어떻게 실행되는지 보죠
+# <마지막 예제, 다음 pipe 이동>
@@ -0,0 +1,18 @@
+#
+# 자 스트림의 pipe 에 대해서 설명합니다.
+# A.pipe(B) 의 형태에 해당하고
+# 표준입력 읽기용 스트림을 쓰기용 스트림으로 연결합니다.
+#
+# 앞선 예제에서는 여러줄로 구성되었는데,
+# 스트림의 프로토타입 메소드인 pipe 를 사용하니
+# 한줄로 정리되었습니다.
+#
+fs = require 'fs'
+
+# 타겟을 선언하고
+target = '../data/output.txt'
+
+# 파이프로 연결합니다.
+process.stdin.pipe fs.createWriteStream target
+
+# 실행해보죠
@@ -0,0 +1,26 @@
+#
+# 파일복사하는 예제입니다. 참고로 Node 런타임에서는
+# 파일복사 메소드가 없습니다.
+# 두가지의 파일스트림 메세도를 연결하고
+# 그냥 복사하면 심심하니까
+# 소문자를 대문자로 변경하여 저장해보겠습니다.
+#
+fs = require 'fs'
+
+# 두가지의 파일스트림을 선언하고
+src = fs.createReadStream '../data/input.txt'
+dest = fs.createWriteStream '../data/output.txt'
+
+# data 이벤트를 설정합니다.
+# 참고로 pipe 으로 연결할시에는
+# pipe 선언보다 상위에 이벤트를 설정해야합니다.
+src.on 'data', (buf)->
+ # 버퍼객체가 전달되면
+ # 대문자로 변경 후 버퍼의 write 메소드를 사용
+ # 전달되는 buffer 재작성
+ buf.write buf.toString().toUpperCase()
+
+# 파이프로 연결합니다.
+src.pipe dest
+
+# 그럼 실행해보죠
@@ -0,0 +1,44 @@
+#
+# 앞서 스트림사이의 이벤트의 순서를 알아보았습니다.
+# pipe 으로 연결할시에는 앞서 그림에서 설명한 8가지의
+# 이벤트 조절이 일어납니다. 그 흐름을 알아보겠습니다.
+#
+fs = require 'fs'
+
+bufferSize = 10
+
+# 스트림 2가지를 설정합니다.
+src = fs.createReadStream '../data/input.txt',
+ bufferSize: bufferSize
+dest = fs.createWriteStream '../data/output.txt'
+
+# 읽기용 스트림에 인터페이스에서 지원되는
+# 4가지 이벤트를 설정합니다.
+src
+ .on 'data', (data)->
+ console.log 'from src / data'.yellow, data.toString()
+ .on 'end', ->
+ console.log '====================='
+ console.log 'from src / end'.yellow
+ .on 'error', (e)->
+ console.log 'from src / error'.yellow
+ .on 'close', ->
+ console.log 'from src / close'.yellow
+
+# 쓰기용에도 4가지 모두 설정합니다.
+dest
+ .on 'drain', ->
+ console.log 'from dest / drain'.cyan
+ .on 'error', (e)->
+ console.log 'from dest / error'.cyan
+ .on 'close', ->
+ console.log 'from dest / close'.cyan
+ # <최소 실행되며, 모든 이벤트를 알아서 설정하고
+ # 실행합니다.>
+ .on 'pipe', (src)->
+ console.log 'from dest / pipe'.magenta
+
+# 파이프로 연결합니다.
+src.pipe dest
+
+# 실행해보죠
@@ -0,0 +1,27 @@
+#
+# 지금까지는 Node의 런타임에서 지원되는
+# 스트림 기능을 살펴보았습니다.
+# 지금부터는 stream interface 에 기초하여
+# 쓰기용 스트림을 만들어보고
+# 이것에 표준입력을 연결해보겠습니다.
+#
+# stream 모듈을 불러옵니다.
+Stream = require 'stream'
+
+# 스트림 객체를 생성하고
+dest = new Stream
+
+# pipe 메소드가 write 메소드를 실행하기 위한 조건인
+# writable 멤버변수값을 true 으로 설정합니다.
+dest.writable = true
+
+# write 메소드를 구현합니다.
+dest.write = (buf)->
+ console.log "message received:", buf
+
+# 그리고, end 메소드를 구현합니다.
+dest.end =->
+ console.log 'end'
+
+# 이를 파이프로 연결해보고, 실행해보죠
+process.stdin.pipe dest
Oops, something went wrong.

0 comments on commit 444625e

Please sign in to comment.