저는 원래 블로그를 시작할 때 다짐한 것이 있었습니다. 바쁘고 힘들더라도 일주일에 최소 3편이상의 포스트를 블로그에 올리겠노라고. 처음에는 열심히 썼습니다! 그러나, 게으름도 습관이라고 바쁨에 핑계를 대기 시작하더니 슬슬 1주일에 한개씩정도밖에 못 쓰게 되더군요. 그러더니 한달에 3-4개 정도 수준으로 꾸준히 5년 이상을 유지했는데 ...


  문제는 2015년 말에 발생했습니다. 엄청나게 힘든 프로젝트를 시작하게 된 것이죠. 1개월 반만에 앱 2개와 서버를 만들어야 했습니다. 어느정도 프로젝트에 대한 경험이 있으면 이 일정이 힘들다는 것을 공감할 것입니다. 물론 제가 PM 으로서 조인을 했기 때문에 열심히 일하는 개발자 보다는 시간적 여유가 있었습니다. 하지만 PL 을 겸했기 때문에 문제가 발생한 플랫폼에 대해서 실제적 코딩도 병행했습니다. 그렇기 때문에 도저히 블로그를 신경 쓸 여유가 없더군요. 


  2016년 초에는 평소 논의 되던 웹소설 플랫폼을 만드는 팀에 조인을 해서 팀 세팅을 하고 전체 플랫폼 설계를 하고 개발 진행을 하고 또 일정 부분을 맡아서 개발하는 통에 시간을 낼 수 없는 상태에서 9월에 오픈을 시켰습니다. 오픈하고 나서 한 두어달을 정말 마음을 졸이며 바라보다가 이제 어느정도 안정이 됐으니 조금만 써볼까? 하던 참에 드디어 터지더군요. 


  '최순실 게이트' 


  모든 정계의 이슈사항을 빨아먹었을 뿐만 아니라 제 개인적인 시간도 뉴스 검색하느라 시간을 보내게 만들더군요. 이제 도저히 이렇게는 안되겠다고 생각해서 설도 지났겠다. 마음을 다잡아서 다시 블로그에 신경을 써 볼까 합니다. 중간에 쓰다 멈춘 [페북정리] 용으로 만드는 여행기 부터 쓸까 합니다. 이제부터 다시 최소한 일주일에 한 편이라도 쓰자라고 다시 습관을 들여야겠습니다. 

  

  2017년 파이팅!!

몇년전에 ROR (Ruby on Rails)이 이슈화 될때의 유명한 ScreenCast 가 생각납니다. '15분만에 블로그' 만들기 였는데, 그 뒤로 새로운 언어나, 새로운 웹프레임워크의 강력함을 설명하기 위해서 항상 블로그를 얼마만큼 빠르게 만들어 낼 수 있는가가 그 척도가 되는 듯 합니다. 

Node.js
도 예외는 아닌듯 싶은데, 실제로도 빠르게 만들어 볼 수가 있으며, 사용하는 사람에게 프로그램을 짜는 즐거움까지 전달합니다. 

제가 예전에 정리한 포스트 에서 마지막에 실전 예제라고 소개하는 직접 블로그 만들기에 관한
 예제입니다. 소스가 예전 버젼에 맞춰져 있기 때문에 현행화를 조금 거쳤습니다. 

환경
    

    OSX Mountain Lion 
    Node.js v0.8.14 
    express 3.0.1
    jade 0.27.7


입니다. 그 외 소소한 것은 Default 를 쓴다고 해도 별 무리는 없을 듯 합니다. (OSX 에서 node.js 와 
npm 설치 방법은 여기 참조 하시면 됩니다)

1. express 를 설치해 줍니다.
    
   

 $ sudo npm install -g express 

       
express 를 전역으로 설치해 주라는 명령입니다. 전역은 별 다른 차이가 없다고 보시고 다만 명령행이 존재한다면 그 명령을 command line 상에서 사용할 수 있다는 점이 다르다고 보면 됩니다. 

2. 프로젝트를 만들어 줍니다. blog 라는 이름이 좋아보이는 군요. 

       $ cd ~/work
       $ mkdir blog
       $ cd blog
       $ express -c stylus
       $ npm install -d 


프로젝트를 만들고 연관된 하위 라이브러리들을 전부 설치해 주라는 명령입니다. 

3. nodemon 을 설치해줍니다. 

       $ sudo npm install nodemon


express 로 코딩을 하다보면 뭐 변경될 때마다 Ctrl-c 누르고 '화살표 위'를 누르는 횟수가
 비약적으로 많아집니다. nodemon 은 js 파일이 변경될 때마다 자동으로 파일을 재구동해주는 편리한 툴입니다. 손가락에 병 생기기 전에 미리 미리 깔아줍시다. 

4. 기본 템플릿으로 만들어진 것을 구동시켜 봅니다. 

       $ cd ~/work/blog
       $ nodemon app.js


구동시키면 다음과 같은 에러가 발생합니다. 

`doctype 5` is deprecated, you must now use `doctype html`
(예전하고 변경됐군요.)
       
 ~/work/blog/views/layout.jade 파일을 열어서 에러메시지처럼 변경해줍니다. 

 doctype 5 -> doctype html 


 로 변경해줍니다. 

http://localhost:3000 을 브라우져에 입력하면 아무것도 안했지만 자동으로 만들어진 내용들이 화면에 출력됩니다. 

5. 데이타베이스를 만들어 봅니다. 나중에는 Mongodb 와 연결할 것입니다. 하지만 처음에는 메모리에
 간단한 타입으로 만들어서 테스트 해 볼것입니다. 

       $ cd ~/work/blog
       $ emacs articleprovider-memory.js 



자 수많은 callback 들하고 higher-order function 들이 난무하기 때문에 정신 사납지만 조금만 익숙해지면 쉽게 볼 수가 있을 것입니다. 사실 고백하자면 Synchronous 방식에 익숙해져 있다면 Node.js 의 거의 대부분을 이루고 있는 Asynchronous 방식이 많이 혼동될 수가 있습니다. 언젠가 언급을 하겠지만 미리 소스를 읽기 쉽게 가볍게 설명을 드리면 

- Callback 함수는 소스 볼 때 잊어버리는 것이 편하다. 
  Callback 은 Asynchronous 일 때 함수의 원하는 행동이 끝나고 나서 추가로 동작하는 방식으로 구동됩니다. function A (id , callback ) ; 이라는 함수가 있다면 A 의 내용이 수행되고 그 다음에 차례로 callback 이라는 함수가 실행된다고 보는 것이 편합니다. 

- function A (id, function (err, result) {..}) ; 와 같은 형식으로 선언이 되어 있다면 
  A 를 실행하기 위해서 파라미터로 id 가 필요하고 그 결과가 err 와 result 로 나온다 라고 보시면 편하게 이해되실 수 있습니다. 

드릴 말씀이 많지만 이 부분을 기억하시고 소스를 보시는 것이 마음 편하게 이해되실 듯 합니다. 


6. 5 에서 만들어준 방식과 app.js 와 연동 시켜보는 작업을 해 줍니다. 

       app.js 를 열어서 

       var express = require('express')
          , routes = require('./routes')
 , user = require('./routes/user')
 , http = require('http')
 , path = require('path');


의 아래에 
       

       var ArticleProvider = require('./articleprovider-memory').ArticleProvider;


과 같이 추가해 줍니다. 

       // app.get('/', routes.index);


기존의 소스를 커멘트 처리 해주시고 
       
그 위에다가 
 


을 추가해 줍니다. 

부연 설명을 드리자면 GET 방식으로 들어온 요청 '/' 에 대해서 function (req, res) 을 수행하라는 내용입니다. 그리고 다시 그 안으로 들어가 보면 articleProvider.findAll 을 수행하고 난 뒤에 function (error, docs) 를 수행하라는 뜻입니다. articleProvider.findAll 의 결과는 error, docs 가 되겠지요? 이 부분을 확실하게 이해를 하는 것이 좋을 것입니다. 거의 대부분이 이런 형식으로 이루어져 있습니다. Asynchronous 방식과 higher-orders function (함수를 입력 파라미터로 넘겨 받는 방식) 그리고 Anonymous function 이 섞여있는 Node.js 의 전형적인 방식의 함수 모습입니다. 

app.get 은 URL 로 넘겨온 값을 '매칭' 하는 함수이고 그것을 실행한 결과를 function (req, res) 로
 넘기고, articleProvider.findAll 은 articleprovider-memory.js 에서 선언한 함수입니다. 저장된 데이터를 전부 가져오고 난 뒤에 파라미터로 선언된 Anonymous function 인 function (error, docs) 를 실행하고 그 결과값 - 저장된 데이터 - 가 docs 로 넘겨집니다. 

http://localhost:3000 에 다시 잘 동작하는 지 확인해 봅니다. 

7. 이제 포장 작업을 해줄 차례입니다. 

       $ emacs ~/work/blog/views/index.jade


로 기본 화면 구성을 열어줍니다. 


jade
 라고 불리는 HTML 엔진입니다. 위 처럼 써주면 대응되는 HTML 코드로 바꾸어 줍니다. 자세한 것은 따로 공부를 하시면 됩니다. (저도 뭐 HTML 은 고수가 아니라서..)

extends layout 이라는 것은 layout.jade 로 부터 확장한다는 뜻입니다. 기초적인 설정은 전부 그곳에
 있다고 해도 과언이 아니겠지요? 

       $ emacs ~/work/blog/views/layout.jade 


로 열어줍니다. 



body 부분에 쓰여져 있는 block content 가 index.jade 의 block content 와 대응되리라는 것을 쉽게
 알 수가 있습니다. (응?..)

8.
jade 파일이 준비가 됐다면 app.js 에서 바꾸어 줄 필요가 있습니다. 


여기서 res.send 는 기본적인 내용을 전달하는 것이므로 (그래서 json 기반의 app 서버 작성시 편합니다) 렌더링 해주는 함수로 변경해줘야 합니다. 위 내용을 


index.jade 를 기본으로 삼되, title 에는 'Blog' 값을 넘기고 , articles 에는 docs 를 넘기라는
 내용입니다. 

9. 이쁘장 (?) 하게 바꾸어줄 시간입니다. (It's CSS Time!!)

귀찮으니까 나중에 쓸 내용까지 전부 CSS 로 밀어 넣기로 합니다. 참 이 내용은 stylus 라는
 라이브러리를 이용합니다. 

       $ emacs ~/work/blog/public/stylesheets/style.styl





인덴테이션이 중요합니다. 이 파일을 작성하면 이 파일에서 style.css 를 자동으로 생성하는 것 같습니다. (자세히는 모르겠음..)
        
여기까지 작성이 완료 됐다면 http://localhost:3000 으로 확인 바랍니다. 색.. 색깔이 나올것입니다. 

10. 새로 글 작성하는 기능을 추가해 보겠습니다. MVC 모델에 따라서 , M 은 이미 작성되어 있고
 (articleprovider-memory.js) 로 , V 에 해당하는 부분을 작성해 줍니다. 

$ emacs ~/work/blog/views/blog_new.jade



음.. 암호 같지요? 저한테도 암호 같습니다. 당분간 외워서 하는 수밖에 없을 듯합니다. 

11. 10 에 대응되는 C (controller) 부분을 추가해 줍니다. 2개의 라우팅 부분을 추가해 줍니다. 

$ emacs ~/work/blog/app.js



app.get 은 GET 방식 , app.post 는 POST 방식입니다. app.get 방식으로 '/blog/new' 로 브
라우져에서 접속하면 blog_new.jade 를 렌더링 하고 , 그 렌더링 페이지에서 내용을 입력하고 Send 버튼을 클릭하면 articleProvider.save 함수를 호출하고 res.redirect 함수로 '/' 에 돌아간다는 내용입니다. http://localhost:3000/blog/new 로 이동해서 테스트 해보기 바랍니다. 

12. 이제 mongodb 를 붙일 시간입니다. 지금까지 만들어온 메모리 버젼은 소스 변경하면 (nodemon 이
 알아서 app.js 를 재구동하니..) 작성하고 테스트 한 내용이 날라가버립니다. 그런 귀찮음을 제거하고자 mongodb 를 연동하는 것입니다. 

먼저 mongodb 모듈을 설치해야 합니다. . 

$ emacs ~/work/blog/package.json




에 위와 같이 "mongodb": "*" 를 추가해 주고 

$ cd ~/work/blog
$ npm install -d 


를 실행 합니다. 
 

13. 이제
mongodb 와 연결해서 포스트 관리해 주는 articleprovider-mongodb 를 제작할 시간입니다.

$ cd ~/work/blog
$ emacs articleprovider-mongodb.js 




14. memory 에서 articleprovider-mongodb 로 바꼈기 때문에 연관된 부분을 app.js 에서 수정할 필요가 있습니다. 

$ cd ~/work/blog
$ emacs app.js


아래와 같이 변경 해줍니다. 

var ArticleProvider = require('./articleprovider-mongodb').ArticleProvider;
//var ArticleProvider = require('./articleprovider-memory').ArticleProvider;


 
메모리를 로딩하는 부분을 comment 처리해주고 그 위로 내용을 추가해 줍니다. articleprovider 를 mongodb 기반으로 바꾸어 준다는 내용입니다. 

var articleProvider = new ArticleProvider('192.168.0.87', 27017);
// var articleProvider = new ArticleProvider();


이 내용은 192.168.0.87 서버에 mongodb 가 띄어져 있고 27017 port 로 접속한다는 이야기
 입니다. 제 경우는 머신이 두대 있을 경우에 쓰는 방법이고 대부분 한 서버에서 같이 동작시킬 때는 192.168.0.87 대신 localhost 라고 입력해 주시면 됩니다. 

또 저와같이 다른 머신에 mongodb 데몬을 띄워논 경우에는 그 머신의 mongodb.conf 파일을 열어서 bind_ip 부분을 comment 처리 하거나 

bind_ip = 192.168.0.* 


으로 같은 대역대에 있는 접속을 허용하는 식으로 변경해 주어야 외부에서 접속이 됩니다. 물론 내부는 세팅해 줄 필요가 없습니다. mongodb.conf 파일은 ubuntu 경우에는 /etc/mongodb.conf 존재합니다. 

15. index 페이지에서 개별 개별 포스트를 클릭했을 때 , 내용을 상세하게 보여주는 페이지 부분에 대한 작성 입니다. 

먼저 V (views) 부분에 대한 처리입니다. 

$ emacs ~/work/blog/views/blog_show.jade



jade 는 꼭 시간을 들여서 익히셔야 합니다. (저도..) 웹 개발이 빨라집니다. 

16. index 페이지에서 개별 개별 포스트를 클릭했을 때 , C (controller) 에 해당하는 라우팅 하는
 부분을 app.js 에 추가해줍니다. 

$ emacs ~/work/blog/app.js




http://localhost:3000 으로 화면을 띄우고 개별 Post 를 클릭하셔서 제대로 동작되는 지 확인하시면 됩니다. 

17. 이제 개별 Post 에 댓글 기능을 추가해 보겠습니다. 16 에서 열어둔 파일에 마저 작업을 해
 줍니다. POST 방식으로 댓글을 Post 에 추가하는 로직입니다. 

$ emacs ~/work/blog/app.js



을 추가해 줍니다. View 에 해당하는 것은 언제 추가해 주냐고요? 15 에서 추가해 줬습니다. 자 이제 모든 것이 완성 됐습니다. http://localhost:3000 에서 확인해 주시기 바랍니다. 

원문 은 여기서 확인 가능합니다. 구버젼 node.js 와 express 로 되어 있어서 현행화 이슈가 있었기에 제가 정리하는 김에 현행화를 한 것입니다. 

제가 현행화한 모든 소스는 https://github.com/crazia/nodejs-mongodb 여기에서 다운 받을 수
 있습니다. 

$ cd ~/work
$ git clone git://github.com/crazia/nodejs-mongodb.git 
$ cd nodejs-mongodb
$ npm install -d 
$ node app.js 


하시면 쉽게 완성된 형태를 따라하실 수 있습니다. 

예전에 죽이는 한마디 서평 에서 썼듯이 제목은 블로그 포스팅에서 70% 이상의 효력을 발휘합니다. 제목으로 인해서 그 글을 읽을지 말지가 거의 결정된다고 해도 과언이 아닙니다.

이런 것들이 사업계획서나 투자계획서 등에도 응용이 되기 때문에 잘 지어진 제목이 얼마만큼 사업하는 사람한테는 중요한지는 다시 언급이 불필요할 정도입니다. (게다가 이후에 나오는 내용은 블루오션 전략과도 어느정도 관련이 있다고 봅니다.)

물론 저도 글을 쓰다보면 자구 자꾸 까먹는 사항이기는 합니다만, 저를 위해서도 다시 한번 정리할 까 합니다.

1. 사람은 새로운 것을 좋아한다?

이 물음에 대한 답은 Yes , No 어느쪽일까요?

정답은 반반입니다. 새로운 것을 좋아한다고 믿고 싶지만 실은 완전 새로운 것이라면 배우기 귀찮아 합니다. 사람들은 변화를 싫어하는 보수적인 속성이 있다고 합니다. 그래서 조직이나 사람이 그렇게 안 변하는 것입니다. (하우스 박사님 만세!! : People don't change - Dr.House)

즉 정리해서 다시 말하자면, 사람은 자신이 이해할 수 있을 만큼의 새로운 것을 좋아합니다. 이것이 바로 핵심입니다. 무엇인가 글을 보기 위해서 리스트를 보고 있다가 제목이 이해가 되지 않는다면 - 흔히들 말하길 - 사람은 호기심의 동물이기 때문에 글을 보기 위해서 클릭할 꺼라 생각하지만 실은 거의 대부분 그냥 지나쳐 버린다는 것입니다.

이건 심리적으로 뇌의 작용하고 관계가 있다고 합니다. 주변의 모든 상황을 자신이 이해할 수 있을만큼 합리적으로 생각해버린답니다. - 자신의 의지와는 상관 없이! -  심지어 자신이 설명할 수 없는 상황이라면 거짓말을 해서라도 합리적으로 판단 한답니다.

설득의 심리학 이라는 책에서 보면 사람을 최면에 걸고 나서 손에 우산을 쥐어주고 최면을 깨운 다음에 왜 우산을 들고 있냐고 질문하면 너무나 자연스럽게 거짓말을 한다는 사례가 있습니다.


그리고 드러커가 말했듯이 사람들은 자신이 생각하는 방향에 사실을 가져다 붙이는 경향이 있습니다. 즉 그말은 포스트를 읽는 사람이 이미 어느정도 짐작하고 있는 사실이 읽힐 가능성이 더 높다는 것입니다. (예: '가카는 삽질을 좋아하신다' 라는 포스트가 있다고 가정하면 읽는 사람은 이미 알고 있는 내용이지만 확인차 글을 읽을 확률이 높다는 것입니다.)


결국 블로그 제목을 지을 때는

1. 읽는 사람의 입장에서 이해가 되는 형식으로 제목을 지어야 합니다.
2. 이미 널리 받아들여지는 사실에 조그만 변화를 주는 것이 제일 좋습니다.




죽이는 말 한마디 로 마케팅 전쟁에서 싸우지 않고 승리하기


저자: 탁정언

글쓰기의 능력이 정말 필요해 지는 시기가 왔습니다. 트위터 블로그 등 자신을 표현해야 할 일들이 누구나 할 것 없이 많아지고 있기 때문이지요.

아무리 상대방에게 호감을 이끌고 싶어서 글을 남발해도 눈쌀을 찌푸리게 만드는 사람이 있는가 하면, 가끔가다 한번 쓴 글이 여러 사람에게 호감을 이끌어 내는 사람이 있습니다. 그 차이가 무엇인가? 바로 낚시성 제목입니다. 그냥 낚시성 제목이 아니라 한번 더 생각하게 되는 스토리가 있는 그러한 제목을 써야 한다는 것입니다.

블로그 포스팅의 핵심은 제목이다. 라는 예전 포스팅에서도 비슷한 내용이 언급됐었습니다. 이러한 제목을 잘 짓는 방법이 블로그나 트위터 같은 소셜형 미디어 뿐만 아니라, 사업 계획서나 투자 계획서, 마케팅과 홍보에도 결정적인 요인을 제공합니다.

저자는 이러한 마케팅과 홍보쪽 카피라이터로 일한 25년간의 경험을 이 책 한권에 압축했습니다. 숙달되기 위해 일만 시간이 필요하다는데 저자는 무려 3만시간 가까이 투자한 셈이지요. 달인 의 세배쯤 되는 노하우가 이 책에 잘 압축되어 있습니다. 

뿐만 아니라 저자는 잭 트라우트 - 알 리스 의 '포지셔닝'에 깊은 감명을 받은 듯이 책에서 말하고 있습니다. 그 언급을 보는 순간 저는 깨달았습니다. 어찌해서 이 책을 그리 술술 읽을 수 있었는지를.. (잭 트라우트 광신도임, 그 사람 책 다 샀음..)

저는 "마케팅 = 전략" 이라고 항상 생각해 왔습니다. 이러한 제 생각은 피터 드러커의 저서로부터 시작되서 잭 트라우트의 저서 에 와서 확립이 됐는데요. 트라우트가 포지셔닝에서 말하는 것은 마케팅의 전략적인 측면에서 '속성'을 정하는 목표에 관한 이야기 였다면, '죽이는 한마디'에서 저자는 마케팅의 전술적인 측면에서 실제로 가지고 쓸 수 있는 도구로서 소개를 한다고나 할까요?

"판단은 이성이 하지만 결정은 감성이 한다.

라는 제 주장과 어느정도 맞 물리는 것 같은 내용이라 더 기쁘게 읽었던 것 같습니다. 정말 주변 사람에게 추천해 주고 싶은 책이였습니다. 하지만 좋은 책이라 다른 사람들은 좀 안봤으면 하는 저의 얄팍한 심정이 담겨 있네요.

별첨:
 죽이는 한마디의 8가지 원리

딱 부러지게 잘라 말하면 기억에 흉터가 남는다.
인생은 쇼다

익숙한 말에서 하나만 바뀌어도 마음을 혹하게 한다.
공든 TOP은 절대 무너지지 않는다.

서로 대립하는 개념이 부딪치면 호기심의 불꽃이 튄다.
순결한 창녀

전혀 어울리지 않는 개념이 만나서 서로 자석처럼 끌어당긴다
살인의 추억

앞뒤가 다른 이야기의 힘으로 무관심을 죽인다
너무나 사랑해서 헤어지기로 했습니다.

고정관념에 도전장을 던져 상식의 뒤통수를 때린다.
영어공부 절대로 하지마라

오직 나만 주장할 수 있는 뜻밖의 진리로 인식을 바꾼다.
입술은 여자의 붉은 피부다

초등학생 영어 실력으로 단순 명료한 메시지를 던진다.
Impossible? I'm Possible


블로그를 운영할 때 방문자가 많은 것이 당연히 좋습니다. 그렇다면 그런 방문자를 유치하기 위해서는 컨텐츠가 좋아야 하는데, 자신이 쓰는 블로그의 제목이 바로 컨텐츠를 비춰주는 거울이라고 할 수 있습니다.

저번에 올린 '프로 블로거' 포스팅에서 언급을 안했던 부분입니다. 그 책에서 말하는 블로그 포스팅의 중요한 점은 '니치' 블로그 사이트로 만들고 글을 자주 올리되, 일관적으로 올리라고 했습니다.

그리고 포스팅을 할 때 가장 중요하게 여기는 부분이 바로 '제목' 이라고 했습니다. 제목은 사람들이 검색했을 때 가장 많이 걸리는 부분이기도 하고, 포스팅의 내용을 미루어 유추할 수 있게 해 줍니다. 결국 자신이 블로그를 돌아다닐 때 어떤 부분에 많이 끌리는 지를 생각해 보시면 블로그 제목을 어떻게 달아야 할지 답이 나올 듯 합니다.

그 다음으로 중요한 것이 블로그 내용의 첫줄이라고 합니다. '제목 - 첫줄'이 중요하다. 감이 오지 않습니까? www.tistory.com 에 보면 수 많은 글들이 올라옵니다. 검색으로 찾을 수도 있고 또는 나열되어 있는 글에서 선택할 수도 있습니다. 그렇게 선택할 때의 기준이 굵은 글씨로 되어 있는 '제목' 에 눈이 가고 그 다음에 그 아래에 쓰여져 있는 '첫줄' 을 살펴보게 됩니다.

제 기준을 예를 들어 설명하자면 목록에서 봤을 때 포스트를 선택하는 기준의 70% 를 제목이 차지하고, 그 글을 진짜 볼지 말지를 첫줄에서 30% 에서 결정 합니다. 아무리 첫줄이 좋아도 사람들의 흥미를 끄는 제목이 이상하다면 그 포스트는 발견이 안되고 지나칠 확률이 높다는 것이지요.

결론적으로 말씀을 드리면 사람들이 많이 방문하게 하는 핵심은 블로그의 제목이라는 것입니다.
대런 로우즈.크리스 개럿 지음
우성섭 옮김

요즘같은 트위터 시대에 왠 블로그인가 하실 수도 있겠지만, 이 책은 일반적인 '블로깅'이라는 컨텐츠수익을 얻어내는 것을 목표로 하고 있습니다. 비지니스적인 것과 비슷하기도 하고 저 같은 엔지니어들은 쉽게 간과할 수 있는 내용들이 글 내용에서 약간은 언급되고 있습니다.

저는 거의 그거 딱 한가지라고 단정지을 수 있는데요. 바로 블로그의 목표에 관한 것입니다. 어떠한 주제로 글을 쓸 것인가에 관한 것입니다. 대부분의 사람들은 블로그는 소소한 자신의 일상에 관한 글이라고 여기기 쉬운데요. 프로 블로그 나 파워 블로그가 될려고 하는 사람들은 소소한 자신의 일상만 가지고는 어렵다는 이야기를 하고 있습니다.

무엇인가 '정보'를 제공할 수 있는 그런 블로그가 되야 한다고 필자들은 주장하고 있습니다. 그러한 니치 주제를 다루는 블로그가 되라고 이야기 하고 있습니다. 만약 자신이 여러방면에 관심이 있다면 과감하게 그것들을 나눠서 다루라는 이야기를 하고 있습니다.

사업도 마찬가지입니다. 사람이기 때문에 이거 저거 다 관심이 갈 수밖에 없습니다. 하지만 그것을 수행하는 주체(자신이나 기업)는 하나이기 때문에 다른 사람들이 어떻게 봐주는 가 하는 것에 민감할 수 밖에 없습니다. 그래서 자신의 비젼이나 목표와 상관없는 것들은 과감하게 쳐 내고 자신이 진짜 하고 싶은 것에 집중하라는 이야기 입니다.

이 책은 그런 문어발식으로 관심이 간다면 과감하게 각 주제 하나당 하나의 블로그를 운영하는 멀티 블로그 체제로 가라고 추천하고 있습니다. 트라우트가 말하는 단일 브랜드 전략과도 비슷하군요.

혹시라도 자신의 블로그에 사람이 많이 오길 바라신다면 자신의 블로그에서 말하고자 하는 바를 한가지로 압축할 필요가 있겠지요? (일단 나부터..)
노는 시간은 줄일 수 없고, 일 할 시간을 쪼개서 블로그를 쓰는 건실한(?) 경영자 였는데, 요즘 일 때문에 블로그 쓸 시간이나 있어? 라는 선배의 말을 절실하게 공감하고 있습니다.

이제좀 열심히 써 볼까 해서 방향도 정했는데, 이 상태로 가다가는 블로그 문 닫아야 할지 모르겠네요. -ㅅ-

문 닫기 싫어서 한번 발악(?) 해 봅니다.
파워 블로거 까지 바라지 않고 , 일정 수준의 사람들이 꾸준하게 방문하기를 원한다면 그정도는 노투를 이용해서 쉽게 해결 할 수 있습니다.

예전에 제가 아는 분에게 물었습니다. 블로그 쓰기 힘든 이유가 무엇이냐고. 그랬더니 그 분이 말하길 "백지의 공포증" 이 있다고 하셨습니다. 무엇인가를 쓸려고 블로그 에서 포스팅 하기를 누르면 아무것도 쓸 수가 없어서, 한동안 백지만 바라보다가 꺼버린다고 하시더군요.

노투는 이러한 것을 쉽게 도와줄 수가 있습니다. 생활속에서 살아가다가 문득 글감이 떠오르거나, 갑자기 생각날 때가 있습니다. 처음부터 글로 쓸려고 하면 버거운 그런 것들 ..

보통 영화, 노래, 애니 가 이런 범주에 들기 쉽습니다. 이럴때 노투 (http://notoo.kr) 를 열고 그냥 검색을 하시고 나온 사진과 찾은 동영상을 연습장에 붙이세요.

사진과 영화가 붙어 있는 상태면, 간단한 2-3줄 짜리 글만 곁들여도 훌륭한 포스팅이 된답니다.
제 경우를 예로 들어 볼까요? 저는 요즘 '그때 그시절' 이라는 화두로 예전에 제가 즐겁게 했던 놀이 문화에 대한 정리를 하고 있습니다.

갑자기 친구들하고 이야기 하다가 '마크로스' 가 생각이 나는 겁니다. 그래서 검색창을 열고 일단 사진 검색을 통해서 'macross minmei' 라고 입력합니다.  (그냥 마크로스 라고 쳤더니만 '마크로스 프론티어' 이미지만 잔뜩 나오더군요..)
이렇게 검색으로 나온 어여뿐 '민메이' 양을 사진을 크기와 위치를 적당하게 만들어서 배치합니다.  보기 좋으니 크게 만들어서 화면에 꽉 차게 배치를 해 봅니다.

그리고 민메이 하면 역시 노래죠. 전설의 그 노래를 찾아 볼까요?
사진과 동영상을 찾았으면 간단하게 글 몇 줄만 글상자에 넣어서 붙이면 간단한 포스팅 완료군요.
어언 20년 전 이 비디오 테이프를 구해서 늘어날 때 까지 이부분을 보고 또 봤던 기억이 나는군요.. 간만에 들어도 정말 명곡이군요 ㅎㅎ




파울로 코엘료 지음
박경희 옮김


 

두려워해도 됩니다. 걱정해도 됩니다.
그러나 비겁하지는 마십시오
두려움과 마주하고, 근심의 순간을 뛰어넘으십시오.
무언가를 간절히 원하면 온 우주는 당신의 소망이 이루어지도록 도울 것입니다.
그러기 위해, 용감하십시오. 의미 있는 것들을 위해 투쟁할 만큼 용감하십시오.
남들이 아닌 바로 '나'에게 의미 있는 그것을 위해.

 - 파울로 코엘료 -

종교적이라고 할 수 있을까요? 아니면 범신론적이라고 할 수 있을까요? 결국은
연금술적이라고 할 수가 있을 것입니다. 코엘료의 책에 담겨 있는 사상 말입니다.

맑은 날 이른 새벽에 산속을 산책하는 기분이라고나 할까요? 물론 100% 동감 못하는
부분도 있지만 그의 사상에는 대부분 동감합니다.

이 책은 그의 소설이 아니라 산문집입니다. 그의 블로그에 올려져 있는 글들을 추려서
책으로 낸 것이지요. 그럼에도 불구하고 그의 소설에서 이야기 하던 바를 평소의
생활에서도 같은 견지를 유지하는 것이 보입니다. 그런 모습이 참으로 멋지고도 대단해
보입니다.

여러 주제를 가진 산문이기 때문에 주제를 꼽기 힘들지만, 글 전반에 흐르는 기조는 거의
비슷하다고 감히 말 할 수 있습니다.

인간, 사랑, 자신의 신화..

'산을 옮길 만한 믿음이 있을지라도 , 사랑이 없으면 내가 아무것도 아니요'
'그중에 제일은 사랑이라'

 - 고린도전사 13장 13절 사도 바울

사랑! 그것이면 충분하다고 합니다.

간단한 설치

서버(unix 계열) 일은 해야겠고 그러자고 Linux 를 깔자니 귀찮고, 그렇다고 항상 서버에 접속해서 일을 할 수는 없는 것이고.. 이럴때를 위한 획기적인 방법이 존재합니다.

바로 colinux 라는 솔루션입니다. vmware 에 가깝다고 보시면 되는데 가상의 리눅스 머신을 윈도안에서 띄우는 솔루션이지요. 자 이제 이것을 설치하면 서버머신이 없더라도 윈도에서 놀면서(!) 서버일을 할 수 있는 멋진 장점이 있습니다.

http://www.colinux.org/ 에서 좌측 프레임의 Downloads 링크를 따라가면 나오는 페이지에서 coLinux-0.7.3.exe 를 받아서 설치합니다. 설치중에 어디에다 설치할 것인지 물어보는 부분이 있는데 기본으로 "c:\Program Files\colinux" 입니다. "c:\colinux" 가 여러모로 편하다고 하지만 기본으로 해도 별 지장은 없습니다.

root file system 을 다운 받을까 하는 물음이 있습니다. 나중에 따로 받기가 매우 귀찮을 꺼라는 생각이 팍팍 들더군요. 다루기 쉬운 애로 받아서 깔도록 하지요. 전 'Debian XXX' 를 선택해서 받았습니다.

설치가 끝나고 '시작메뉴' 나 '프로그램 설치정보'를 찾아봐도 colinux 가 설치됐다는 정보가 없습니다. 조금 더 뒤져보면 "c:\Program Files\colinux' 관련 파일들이 있다는 것을 알게 됩니다.

Debian-4.0r0-etch.ext3.1gb.bz2 이게 위에서 다운 받은 루트 이미지 입니다. 이것을 압축 해제 하고 나온 파일의 이름을 root_fs 로 수정합니다. 물론 이 파일은 colinux 가 설치된 곳에 저장이 되어야 합니다.여기까지 기본 준비는 끝나고 이제 실행에 옮겨보기로 하지요.

"c:\Program Files\colinux" 로 이동해서 콘솔상에서

colinux-daemon.exe @example.conf

라고 실행합니다. 이건 어플리케이션 형태로 colinux 를 실행하는 방식인데, 뭔가 될려고 하다가 중지됩니다. "c:\colinux" 밑에 설치했다면 제대로 동작하지만 c:\Program Files\colinux" 밑에 설치했으면 동작하지 않습니다. example.conf 파일을 열어보기로 하지요. cobd0="c:\coLinux\root_fs" 라고 되어 있는 부분을 다음과 같이 바꾸어 줍니다. cobd0="c:\Program Files\coLinux\root_fs" 다시 콘솔에서

colinux-daemon.exe @example.conf

라고 실행하면 colinux 가 부팅됩니다. 아이디 패스워드는 루트로 바로 접속이 가능합니다. root/root 이니 로긴해서 사용 아이디 만들어서 사용하시면 됩니다.

저는 어플리케이션 형태로 실행하는걸 테스트 목적으로 쓰고, 그 다음부터는 서비스 형태로 등록해서 필요할때만 서비스를 실행시켜서 리눅스를 부팅하고 사용하는 방법을 즐겨 합니다. colinux 가 설치되어 있는 디렉토리 콘솔창에서

colinux-daemon.exe @example.conf --install-service "coLinux"

라고 입력합니다. 이러면 'coLinux' 라는 이름으로 서비스가 등록됩니다.

colinux-daemon.exe @example.conf --remove-service "coLinux"

하면 서비스가 해제됩니다. 서비스가 등록되어 있는 상태에서 리눅스를 부팅시키려면

net start "coLinux"

라고 콘솔에서 입력하시면 리눅스가 부팅이 됩니다. 그러면

colinux-console-nt.exe

를 실행해서 콘솔로 연결해서 사용이 가능합니다.


Network & Putty 를 이용해서 접속하기

example.conf 파일중에서 막혀있던 eth0 부분을 아래와 같이 바꾸어 주면 됩니다.

  • eth0=slirp,,tcp:22:22/tcp:80:80/tcp:23:23

이제부터 coLinux 안에서 네트워크를 쓸 수가 있습니다. 위의 내용을 가볍게 살표보자면 eth0=slirp 부분은 네트워크 드라이버로 slirp(위키에 내용 링크) 방식을 쓴다는 것입니다. eth0=slirp,, 에서 쉼표 2개는 맥 어드레스 쓰는 부분인데 건너 뛰자는 것이고, tcp:22:22 부분은 프로토콜: 호스팅 컴퓨터에서의 port : colinux 안에서의 port 입니다.

자 이제 putty 를 열고 접속대상 ip 에 127.0.0.1 을 써주고 '연결'을 누르지만 접속이 안되는 것을 확인 하실 수 있습니다. ssh 데몬이 설치가 안되어 있기 때문입니다.

먼저 apt-get 을 이용해서 필요한 몇가지 유틸을 설치해 보도록 하지요.

데비안 에서 apt-get 을 사용하기 전에는

  • apt-get update

를 실행해서 꼭 소스 리스트를 업데이트 해줘야 합니다. 그대로 실행하셨다면 최신의 빵빵한 소스로 업데이트들이 됐습니다.

그상태에서

  • apt-get install sudo
  • apt-get install emacs (or vim)
  • apt-get ssh

를 차례로 입력해주면 sudo package , emacs , ssh 가 전부 설치됩니다.

sudo 명령을 쓰기 위해서는 /etc/sudoers 에 아이디를 추가해야 한다. 예제로 만들어진 거에 보이는 root 의 옵션을 그대로 따라 하시면 됩니다.

여기까지 가능하셨으면 putty 창을 여시고 127.0.0.1 로 ssh 커넥션을 하시면 프롬프트 창이 나타나서 사용이 가능합니다.


Windows Partition 보기

coLinux 에서 윈도즈 파티션(ntfs) 를 마운트 하는 방법에 대해서 알아보겠습니다.

윈도즈 파티션 자체를 마운트 해야 합니다.

그런데 config 파일에 설정하는 방법 말고 서비스를 띄울때 띄우는 방법이 있습니다. (config 에서 하는 방법은 아직 못 찾았습니다) 서비스를 등록할때 기존 방식으로 등록하는 대신

  • colinux-daemon.exe @example.conf cofs0=c:\ --install-service "coLinux"

이런 방식으로 서비스를 등록합니다. 그리고 coLinux 콘솔창에 접속해서 prompt 상에서

  • mount -t cofs 0 /mnt

일반 유저는 sudo 를 포함해서 실행시키면 됩니다.


swap file 추가하기

xp 이상이라면 fsutil.exe 라는 툴이 있습니다. 스왑파일은 1기가 정도로 잡아주는 것이 좋기 때문에 windows 에서 command prompt 창을 실행시켜서 다음과 같이 명령을 쳐 줍니다.

  • fsutil.exe file createnew c:\colinux\swap_file 1073741824

라고 하면 1기가 짜리 스왑파일이 생깁니다. 뒤에 나와 있는 숫자는 스왑 파일의 크기 입니다. 이제 이를 colinux 에 인식시키는 일만 해주면 됩니다.

example.conf 에서 #cobd1="c:\colinux\swap_device" 인 곳을 찾아서 앞에 주석을 제거 합니다. 다음처럼 작성해 줍니다.

  • cobd1="c:\colinux\swap_file"

로 fsutil 을 이용해서 만든 파일로 설정을 수정합니다. 그리고 coLinux 부팅후 /etc/fstab 을 에디터로 연 후

  • /dev/cobd1 swap swap defaults 0 0

으로 수정합니다. 저장한 후에 에디터를 종료하고 colinux 콘솔상에서

  • mkswap /dev/cobd1

라고 명령을 입력해서 스왑을 만들어 줍니다. 다시 리부팅을 한 후에

  • swapon -a

명령을 이용해서 스왑을 켜주고요. 그다음에 프로그램 이거 저거 사용후에 free 나 top 명령을 이용해서 스왑이 사용되는지 여부를 알아볼 수가 있습니다.



root file system 크기 늘려주기

원본 보기

데비안을 디폴트 루트 시스템으로 사용을 마음 먹었으면 1기가 정도의 크기 일 것입니다. 그러나 사실상 개발을 생각하고 이것 저것 깔아 주다 보면 턱 없이 루트 시스템의 용량이 적습니다. 그래서 새로 파티션을 만들어 /home 에 늘려주는 것도 하나의 방법이 되겠지만 , 루트 파일 시스템 자체를 늘려주는 방법이 제일 편하고 관리도 편합니다. 10기가 정도면 거의 다 개발해도 될테니 10기가 정도로 늘려줄 생각을 하겠습니다. 스왑을 만들때 썼던 fsutil 이 또 필요하군요.

  • fsutil.exe file createnew c:\colinux\drive_1.ext3.10GB 10737418240

drive_1.ext3.10GB 라는 10기가 바이트 짜리 파일이 생성됐습니다. 그러면 c:\coLinux (이 디렉토리에 설치하신게 아니라면 coLinux 가 설치된 디렉토리로 이동하셔서) 로 이동하셔서 기존의 root file system 인 root_fs 파일을 백업 받습니다.

  • copy root_fs old_fs

config 파일을 열어줍니다. example.conf 가 일반적인 config 파일이니 그 파일을 에디터로 열어서

cobd2="c:\colinux\old_fs" cobd3="c:\colinux\drive_1.ext3.10GB"

라는 행을 추가해 줍니다. cobd1 은 스왑파일로 정해놨었지요. 이제 coLinux 를 부팅시켜줍니다. 그리고 console 창에서 다음과 같이 명령을 입력합니다.

  • e2fsck /dev/cobd2

복사시킨 파일시스템이 clean 한지 체크하는 것입니다. clean 하다고 메시지가 뜰 것입니다. 그러면 새로운 이미지에 , 기존의 시스템을 복사해야 합니다. (10 기가로 확장하는 순서)

  • dd if/dev/cobd2 of=/dev/cobd3

잘 복사됐는지 파일시스템을 체크해 줍니다.

  • e2fsck -f /dev/cobd3

10기가 정도 되니 시간이 좀 걸리는 군요. 체크가 끝나면 새로운 파일시스템에 있는 모든 공간을 쓸 수 있게 리사이징 해줍니다.

  • resize2fs -p /dev/cobd3

리사이징이 끝나면 다시 한번 파일시스템 체크를 해줍니다.

  • e2fsck /dev/cobd3

여기까지 진행이 됐으면 새로운 시스템이 설치된 10 기가 짜리 이미지를 얻은 것입니다. 이제 config 파일(example.conf) 에 root_image 를 바꾸어 줍니다.

  • cobd0="c:\colinux\drive_1.ext3.10GB"

colinux 를 재부팅 하신후에 제대로 교체 됐는지 확인을 위해서 'df' 를 입력합니다.

df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/cobd0 10321208 649668 9147272 7% /

root file system 이 10기가로 용량이 늘어난 것을 확인 하실 수 있습니다. root_fs , old_fs 는 이제 지워주셔도 됩니다.


한글 세팅

데비안은 일반적으로 리눅스 형태로 받아서 OS 를 설치하면 이 작업이 되어 있으나 colinux 는 데비안 이미지 자체만 받기 때문에 많은 것을 수동으로 설치해 줘야 합니다.

- 기본메모리 64M , Swap File 없이 처음 진행

colinux 콘솔상에서

  • apt-get install locales

라고 입력하면 로케일 관련 파일들이 설치되고

  • dpkg-reconfigure locales

입력시 나오는 창에서 'k' 를 누르고 방향키를 아래로 몇번 내려주면 한글을 고를 수가 있습니다. 'ko_KR.EUC-KR EUC-KR' 과 'ko_KR.UTF-8 UTF-8' 이 바로 그것이지요. 스페이스 키를 눌러서 두 항목을 선택해 줍니다. 이중에 디폴트를 선택하라고 하면 UTF-8 을 선택해주지만 바로 메모리 exausted 가 뜨는군요 -0- , 메모리도 늘려줘야 하지만, swap 도 정해줘야 겠군요.

- 메모리 128M , Swap File 1 기가로 만들어 주고 , 기본 루트 파일 시스템도
10기가로 늘려준 상태에서 다시 진행

다시 시도해서 , 기본으로 ko_KR.UTF-8 을 지정해 줘도 깔끔하게 설치가 됩니다.


회사 위키에 정리한 것을 가져와 봤습니다. - 귀찮아서 따로 따로 정리하기가 벅차더군요 , 앞으로 회사 위키 - 블로그 로 정리하는 습관을 들이면 괜찮은 정리 습관이 될 것 같습니다.

+ Recent posts