마션 - 어느 괴짜 과학자의 화성판 어드벤처 생존기
앤디 위어 지음, 박아람 옮김 / 알에이치코리아(RHK) / 2015년 7월
평점 :
구판절판


책의 내용이 머리속으로 그려지지 않는다.
이공계 출신들에게는 다를까?
나처럼 물리, 화학의 문외한에게는 빠져들기 힘들 듯.

댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
몸을 긋는 소녀 - 샤프 오브젝트
길리언 플린 지음, 문은실 옮김 / 푸른숲 / 2014년 8월
평점 :
장바구니담기


처음으로
길리언 플린의 소설을 끝까지 읽었다.
그리고 후회한다.

다크플레이스, 나를 찾아줘, 그 여자의 살인법, 그리고 이 책.
어쩌면 이리도 음울하고 병적인지.
이 책은 그나마 중반까지는
그 병적이고 뒤틀리고 음울한 모습을 자제하고 있다.
하지만 결국에는 역시나다.
책을 덮은 후의 이 불쾌함과 불편함이란.
재미도, 유쾌함도, 신선함도, 즐거움도, 슬픔도, 아픔도, 카타르시스도 없다.
오직 불편함만 남는다.

어떤 사람이길래 이렇게
병든 인간과 병든 세상을 만들 수 있을까?
속표지의 밝은 미소를 짓고 있는 아름다운 작가가?
화사하고 밝은 외모 뒤에 어떤 어둠을 갖고 있길래?
작가에 대한 의문이 지워지지 않는다.

각종 상을 수상한
길리언 플린의 작품답게
잘 짜여지고 탄탄하고 내밀하고 섬세한 이야기이다.

길리언 플린의 다른 작품들처럼 이른바 '웰메이드' 소설이다.

그러나 나에게는
읽는 즐거움 대신
불편함과 불쾌함을 제공한다.




댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
그는 천사를 믿었다
R. J. 엘로리 지음, 나선숙 옮김 / 노블마인 / 2011년 3월
평점 :
절판


범죄소설이라기 보다는 자전적 문학작품같다.
인생을 관통하는 상실과 절망 그리고 그 치유에 관한 이야기.
그 예민하고 내밀한 어둠이 죽음에서 기인할 뿐,
성장 소설일 수도 있고,
삶의 심연에 대한 천착일 수도 있는, 그런 이야기.

댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
단일 페이지 웹 애플리케이션 - 프론트엔드부터 백엔드까지 자바스크립트로 완성하는 위키북스 오픈소스 & 웹 시리즈 61
마이클 미코스키 & 조시 C. 파월 지음, 유윤선 옮김 / 위키북스 / 2014년 7월
평점 :
장바구니담기


SPA 입문자를 위한 최고의 책이 아닐까 싶다.


 책 전체가 상세하고 친절한 설명으로 이루어져 있다. 

단순히 소스에 대한 설명만 상세한 것이 아니라 SPA 개발의 취지와 전반적인 원리 그리고 아키텍처까지 전반에 걸쳐서 풍부한 설명을 해준다. 나무나 숲만 설명하는 책이 아니라 나무와 숲 전부를 말해주는 책이다.


 프로그램 구조가 단순하고 명확하다.

jQuery, Node.js, MongoDB 이 세 가지 프로그램만 사용하고 기타의 라이브러리, 프레임워크, 툴등 을 사용하지 않음으로 배워야 할 내용의 핵심에 집중하고 있다. Node.js npm들은 설치해야 하지만 책의 내용을 따라하면 아무 문제가 발생하지 않는다.


 책 내용에 집중할 수 있다.

package.json 파일에서 의존성을 설정하는 방식으로 책의 내용을 진행하기 때문에 Node.js 버전에 신경 안 쓰고 책 내용에 집중할 수 있다. 기타 다른 의존 프로그램에 대한 정보나 버전 변화에 대한 내용을 인터넷에서 검색하고 적용하는 번거로움이 없다. 다만, 몽고 db는 2.6.X 버전을 사용해야 한다.


 숙련된 자바스크립트 코딩 기법을 익힐 수 있다.

SPA 가 아니더라도 자바스크립트 자체의 숙련된 코딩 기법을 익힐 수 있다. 단편적인 자바스크립트 코딩 기법 뿐 아니라 사이트 전체에 걸친 고급의 자바스크립트 구성과 코딩 기법을 배울 수 있다.


자바스크립트 전문 개발자들에게는 어떻게 비쳐질 지 몰라도 

나처럼 자바스크립트를 보조 언어 정도로만 사용해서 기업 업무 사이트만 개발해 온 Asp.net 개발자 - UI 쪽은 별로 신경을 쓰지 않았고 자바스크립트는 클라이언트 유효성 검증, 간단한 DOM 제어 정도를 위해서만 사용해 왔다 - 에게는 정말 시야를 넓혀 주는 좋은 책이란 생각이 든다.


다만, 맘에 걸리는 부분은 AngularJS 대신 jQuery를 사용했다는 점이다. 

그래서 그런지 간단한 채팅 사이트 임에도 불구하고 소스 내용이 상당히 많다. 

십 수 년의 경험을 가진 asp.net 개발자 입장에서는 

SPA라는 것이 상당한 노가다 작업으로 보이지만 

-방대한 javascript 소스는 좀 질릴 정도다 - 

사이트의 특성에 따라서는 피할 수 없는 선택이 아닐까 싶다.

실제 SPA 사이트 구성을 jQuery로 하는 것은 상당한 작업이 될 지도 모르지만

이 책을 통해 배우고 공부하고자 하는 사람에게는 장점일 수도 있을 것 같다.

 

여하튼 SPA를 처음 공부하고자 하는 사람에게는 이 책을 강력히 추천한다. 

상세하고 친절하고 깊이있는 설명은 많은 것을 가르쳐 주고, 

잡다한 의존성 프로그램으로 요점을 흐려버리는 번잡한 구조를 사용하지도 않고 

덕분에 별도의 인터넷 검색과 학습이 필요없이 책에만 집중할 수 있고

SPA의 기본 개념과 원리를 익히고, 

자바스크립트 실력을 향상 시킬 수 있다.



댓글(0) 먼댓글(0) 좋아요(1)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
모던 웹을 위한 Node.js 프로그래밍 - 개정판, 페이스북, 월마트, 링크드인이 선택한 자바스크립트 + 노드제이에스 서버 프로그래밍
윤인성 지음 / 한빛미디어 / 2013년 9월
평점 :
구판절판


Node.js 입문자들에게 좋은 책일 듯 싶다.

기본적인 내용들을 쉬운 예제로 설명한다.


이른바 MEAN 스택 관련된 책을을 보면

이해하기 어려운 책들이 많다.

입문자를 위한 기본적인 내용에 대한 설명은 간략하고

기타의 툴(?)이나 라이브러리, 프레임워크에 대한 내용들이 많아서

가장 기본적이고 핵심적인 내용을 빠르게 습득하고자 하는 

입문자에게 부적절한 경우가 많은 것 같다.


기타의 여러 가지 의존 프로그램들과 부가적인 내용들을 

책과 별도로 인터넷으로 공부해야만 책의 내용을 소화할 수 있는 경우가 많은 것 같다.

일단, 책을 통해서 기본과 핵심만 빠르고 쉽게 익히고자 하는 

(나 같은) '게으른' 입문자로 하여금

책을 집어 던지게 만드는, 

입문자에게는 부적절한 그런 책들이 많는 것 같다.

이 책은 그런면에서 입문자에게 훌륭하다.


그러나 2015년 9월 현재에는 node.js 입문자들에게 치명적인 약점을 가지고 있다.

8장부터 나오는 express의 버전업으로 인해서, 

이 책의 8장 이후의 예제들은 거의 정상 동작하지 않는 단점을 가지고 있다.


내 개인적인 생각으로는

책의 저자가 별도의 웹 페이지 또는 출판사 사이트를 통해서

8장의 변화된 내용에 대한 보충 설명을 배포 했었어야 한다고 생각한다.

저자, 출판사 모두 책임의식이 부족하다는 생각이 든다.


변경폭이 커다란 버전업을 반영하는 A/S는 부실하다고 생각하지만

그럼에도 불구하고 입문자에게는 추천할 만한 내용이라고 생각한다.


지금이라도 이 책으로 Node.js에 입문하고자 하는 사람이 있을 지 몰라

오타 및 내가 인터넷을 통해 찾아본 변경 사항들을 8장 위주로 간략하게 적는다.

8장 이후의 예제들은 8장의 변경 사항을 원용하면

정상 동작하는 걸 확인할 수 있다.

(2015년 9월 기준)


p144.

 doctype 5 => doctype


p.172 logger (morgan 으로 대체).

$npm install morgan

var morgan = require('morgan'),

app.use(morgan('combined'));


p.178 router

app.use(app.router); 제거


p.182 cookieParser

$ npm install cookie-parser

cookieParser = require('cookie-parser')

app.use(cookieParser());


p.184 bodyParser

$npm install body-parser

var bodyParser = require('body-parser')

app.use(bodyParser.urlencoded({ extended: false }))


p.188 파일 업로드 (formidable로 대체)

npm install formidable@latest (node_modules 폴더로 이동해서 실행.)

formidable = require('formidable');


  .post(function (request, response) {

        var form = new formidable.IncomingForm();

        form.encoding = 'utf-8';

        form.uploadDir = 'multipart'; // 임시 파일이 생성될 디렉토리

        form.keepExtensions = true; // 파일 확장자를 남길것인가.

        form.maxFieldsSize = 2 * 1024 * 1024;


  // 파일 업로드

        form.parse(request, function(err, fields, files) {

            response.redirect('/');

        });


// 업로드 후처리

form.on('end', function(fields, files){

            if(this.openedFiles){

                if(this.openedFiles[0].type.indexOf('image') != -1){

                    // 파일 이름 변경

                    var outputPath = __dirname + '/multipart/' + Date.now() + '_' + this.openedFiles[0].name;        

                    fs.rename(this.openedFiles[0].path, outputPath, function(error) {

                        response.redirect('/');

                    })

                }else {

                    // 파일 제거

                    fs.unlink(this.openedFiles[0].path, function(error){

                        response.send(400);

                    })

                }

            }else {

                response.send(400);

            }

        });

    });


p. 194 session

$ npm install express-session

session = require('express-session');

app.use(session({

    secret: 'secret key',

    key:'rint',

    cookie:{

        maxAge:60 * 1000

    }

}));


p.199 

app.del => app.route('/user/:id').delete(


p. 236

[request.param('id')] => [request.params.id]


p.238 bodyParser  추가 해야 함,

bodyParser = require('body-parser')

app.use(bodyParser.urlencoded({ extended: false }));


p.282

io.sockets.sockets[id].emit('smart', data); => io.sockets.connected[id].emit('smart', data);


p.284 get/set 메소드 사용 안 함.

set => socket.name = data;

get => socket.emit('responsename', socket.name);

p.290

socket.set('room', data) => socket.room = data;

p.291

io.sockets.in(socket.room).emit('message', data);


댓글(1) 먼댓글(0) 좋아요(1)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
철구소 2015-09-29 18:13   좋아요 0 | 댓글달기 | 수정 | 삭제 | URL
오타가 있어서 댓글 남깁니다~
p.188 `npm install formiadable` - > `npm install formidable`
유용한 포스트 정말 감사합니다~ 오늘도 많이 배우고 갑니다 ^^