2016년 6월 27일 월요일

[Link] GDB 사용

나중에 정리하려고 GDB 사용 관련 링크 저장

GDB를 이용한 디버깅

Debugging Under Unix: gdb Tutorial


실행 중인 process에 attach
$ gdb - `pidof PROCESS이름`


gdb 를 통한 디버깅 따라하기

GDB 사용법




2016년 6월 14일 화요일

The Node Beginner Book 대충 정리

The Node Beginner Book 대충 정리

보면서 눈에 띄는 것 만 대충 정리함.

http://www.nodebeginner.org/index-kr.html


Node.js

- server side JavaScript
 : Server side JavaScript 실행환경과 라이브러리로 이루어져 있음.

- Event driven callbacks
 : event에 대한 callback을 등록하여 처리 하도록 함.
   각 event 상황에 대해서 처리하도록 callback을 등록하여 단순해 지지만
   callback 내에서 과도한 operation을 처리할 경우 성능 문제 발생 가능

http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb


[Documentation에서 설명하는 기본 use scenario]

- 웹페이지 제공 => HTTP 서버가 필요.
- 서버는 어떤 URL 요청(request)에 응답 => 요청과 요청을 처리할 핸들러들을 위한 라우터(router) 필요.
- 서버로 도착한 요청 처리 => 요청 핸들러(request handlers)가 필요.
- 라우터에서의 POST 데이터 처리, request handler 들에게 넘기기 위한 request 가공 => 요청 데이터 핸들링(request data handling)이 필요.
- URL 요청 시 내용 표시 => request handler 들이 사용자 브라우저로 콘텐트를 보내기 위해 사용할 수 있는 뷰 로직(view logic)이 필요.
- 이미지들을 업로드 => 업로드 핸들링(upload handling)이 필요.


[Hello world example]

server.js


var http = require("http");
function start() {
  function onRequest(request, response) {
    console.log("Request received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;
http server를 사용해서 hello world를 만들 것이므로
require로 http 모듈을 사용할 수 있도록 함.

http server 모듈의 request event를수신했을 때 response로
text/plain content type으로 "hello world"를 전송함.
http://nodejs.org/api/http.html#http_class_http_server

exports는 함수를 외부에서 사용할 수 있도록 할 때 사용.



index.js


var server = require("./server");

server.start();
다른 js파일을 내장 모듈 불러오듯 require를 사용해서 불러오고 export된 함수를 사용.


[request 정보 확인 for route]


                               url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring(string)["foo"]    |
                                            |
                         querystring(string)["hello"]
request의 method, path, query 들을 확인하여 적절한 handler에서 처리하기 위해 필요한 함수들 



request handler들을 path에 따라 등록하고 route하는 예제


var http = require("http");
var url = require("url");
function start(route, handle) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    route(handle, pathname);

    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;
기본 hello world server에서 변경된 점은
url의 pathname을 확인하여 route하는 루틴이 포함된 점이다.
간단한 예제라 route의 결과를 가지고 response를 보내는 것이 구현되어 있지는 않음.



function route(handle, pathname) {
  console.log("About to route a request for " + pathname);
  if (typeof handle[pathname] === 'function') {
    handle[pathname]();
  } else {
    console.log("No request handler found for " + pathname);
  }
}

exports.route = route;
hanlder들 중에서 pathname의 key를 가진 function object를 찾아서 실행함.



var server = require("./server");
var router = require("./router");
var requestHandlers = require("./requestHandlers");
var handle = {}
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;

server.start(router.route, handle);
url path에 따른 handler들을 매핑한 뒤
server로 router와 handle을 넘겨서 시작함.


[TODOs]

- understanding node.js : http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb

- dependency injection pattern : http://martinfowler.com/articles/injection.html

- function programming 관련 : http://steve-yegge.blogspot.kr/2006/03/execution-in-kingdom-of-nouns.html