Monthly Archives: March 2011
책 리뷰 – 스마트 프라이싱

우연히 책 제목에 끌려서 나도 모르게 읽기 시작했다. 책을 고르고 보니 MBA로 유명한 와튼 스쿨에서 나온 책이라는(요새는 MBA하면 맥북 에어 가 더 먼저 떠오른다!!!)
말그대로 프라이싱, 가격 책정에 어떤 것들이 어떤 영향을 줄 것인가에 대한 책인데, 여기서 소개하는 전략에는 크게 몇가지가 있다..
1. 원하는 만큼 지불하라
2. 공짜
3. 가격 전쟁
4. 푼돈 효과
5. 자동 할인
6. 스스로의 가격을 책정하라
7. 구독하고 절약하라
8. 속물 효과
9. 효과가 있으면 지불하라
내가 경영이나 제품 마켓팅 쪽에 있지 않기 때문에 이것을 해당 분야에서 어떻게 적용할 수 있을지는 잘 모르겠다. 하지만, 나의 가치에 대해서 이 “스마트 프라이싱” 을 적용해 볼 수 있지 않을까? 뭐, 지금이야, 실력 부족으로 실력 향상에 더 큰 비중을 두어야 한 것은 당연하다. 그러나, 미래에 제 값을 받는 사람이 되기 위해서 위의 전략들을 어떻게 적용 할 수 있을까?
1. 무료 전략이다. 지금 이 블로그나, 트워터등을 통해서 가치 있는 정보를 무료로 제공한다. 어느 순간, 해당 정보를 좋아하는 사람들이 늘어나면, 나의 Name 브랜드도 적당히 가치가 생기지 않을까? 단 영어 공부는 필수다.
2. 원하는 만큼 지불하라 전략이다. 책이나 적당한 앱을 개발해서, 기부 형태로 공개한다. 물론, 국내에서 이런 형태가 수익을 잘 얻는 형태는 아니지만, 영어를 공부해서, 책의 내용이나, 가치등을 글로벌 하게 기부를 유도할 수 있다면, 어느 정도 내가 하고 싶은 공부하면서, 지속적으로 이런 활동을 영위할 수 있지 않을까?(이 것은 시장을 글로벌하게 가져가야만 가능할 것 같다.)
5, 7 번 푼돈효과와 구독하게 하는 것도 괜찮은 전략으로 보인다.
아직은 많이 멀었지만, 나의 미래에 나는 개발관련된 컨설팅과, 적당한 프로젝트에 참여해서 개발을 하거나, 책을 쓰거나, 강연을 통해서 수입을 얻어야 할 것 같다. 그리고 그런 방법에 대해서, 지금 부터 체계적인 방법을 통해서 어느 정도 기반을 닦아야만 그런 생활이 가능할 것이다. 다시 금 미래에 대해서 생각하게 해본 좋은 책이었다. 책을 읽어보고 자신의 현실에 맞춰서 적용해 볼 수 있다면, 책값이 전혀 아깝지 않은 책이 될듯 하다.
Hbase Standalone 으로 설치시 주의 사항
hbase-site.xml 내용안에 rootdir 은 다음과 같이 저장한다.
hbase.rootdir
file:///home1/irteam/data/hbase
이때 꼭 앞에 file:// 이 붙도록 주의하자.
hbase 가 standalone 으로 뜰때 기본 설정은 zookeeper 를 자체적으로 가지고 있는 녀석으로 띄운다.
이 설정을 바꿀려면 zookeeper 를 바라보도록 설정을 추가해줘야 한다.
페이스북 시대와 SNS, 페이스 북 시대에 친구의 정의는?
오늘 한빛 리더스 모임에 참석하면서 전성민 교수님의 강의를 함께 들을 수 있었다. 예전에 “페이스북 시대” 라는 책을 소개하면서 http://charsyam.pe.kr/?p=152 페이스북의 타켓팅 광고가 구글의 광고보다 더욱 효과적이다. 그리고 SNS 가 소개 마켓팅 처럼, 판매에 더욱 효과적이라는 얘기를 했었다.
그 때, 생각했던 것 중에 하나는, 페이스북에서의 친구는 정말 친구인건가? 라는 의문이 있었다. 소개 마켓팅이 되려면, 소개시켜주는 사람이 신뢰를 주지 못한다면, 관계가 형성되기 힘들꺼라는 생각이 들었기 때문이다.
페이스북이 서로의 소식을 빨리 연결해주는 메신저의 역할을 하지만, 인간 신뢰의 관계가 생성될까라는 의문에 대해서, 전성민 교수님의 얘기가 답을 주었다. 온라인으로 맺는 인간관계가 신뢰의 관계가 낮게 최초에 형성이 되지만, 점점 시간이 지나면서, 신뢰의 관계가 올라갈 수 있다는 것…
트워터를 시작하면서, 누군가를 팔로우하고 멘션을 달다 보면, 실제로 만나지는 않아도, 그 사람의 사상에 동감하고, 정보 전달을 하면서, 어느정도의 신뢰를 쌓을 수 있다는 것을 나 역시도 경험하고 있다. 우리가 말하는 친구의 관계까지는 아니라고 하지만, 페이스북등의 SNS 가 어느 정도의 신뢰를 형성할 수 있다는 것…
디지털 네이티브 라는 책을 보면, 인터넷 시대 이후와 이전에 태어난 사람을 디지털 원주민과 이주민으로 나눈다. 그리고 원주민과 이주민은 언어를 배우는 방식이 다르듯이, SNS 를 사용하는 방법도 달라진다고 한다. 나는 디지털 이주민 세대이기 때문에, 누군가와 SNS 를 통해서 쉽게 무언가를 나누는 것이 조금 불편한 세대이다. (스스로는 네이티브라고 믿지만 ㅋㅋ), 그런데 디지털 네이티브 세대는 SNS 친구를 받아들이는 것이 매우 빠르다고 하다. 결국 SNS 가 허브라면, 디지털 원주민이 정보의 전달이나 파급력에서 디지털 이주민 보다 빠르고 강력할 수 밖에 없다.
전성민 교수님의 말씀 중에, 외국인들의 트웟들은 좀 더 가벼운 내용이 많은 데, 우리 나라 사람들의 트웟은 좀 더 진중한 내용이 많다고 한다. 이것은 결국 트웟등에 우리 나라 사람들이 훨씬 더 신경을 많이 쓴다는 것이다. 분명히, 나이대에 따라 다르고, 지역마다 조금씩 다르긴 하겠지만. 페이스 북 시대에서 친구의 정의는 어떻게 내려야 할까? 그리고, 어떤 식으로 정보를 전달하는 것이 훨씬 더 효과적일까?
굉장히 좋은 생각을 가지게 해주는 시간이었다.
책 리뷰 – 사회적기업창업교과서(야마모토시게루, 생각비행)

사회적기업창업교과서라는 이름, 최초에 이 제목만 보고 완전히 다른 착각에 빠졌다. 사회적기업, 아 Social Company 그럼, 페이스북, 트위터, 또는 그루폰 등의 소셜 사업을 하는 회사를 만드는 방법인가? 라는 생각이 든 것이다. 그리고 냉큼 구입해 버린 이 책은, Social Network 에 대한 것이 아니라, 정말 사회적 기업에 대한 이야기로 시작한다!!!(즉 나의 착각!!!)
소셜 기업이라는 것은 사회의 문제점을 해결하면서, 단순히 공익 차원이 아니라, 어느 정도의 이익까지 추구하는 일종의 공익을 추구하는 영리 회사를 말한다. 야마모토 시게루라는 소셜 기업가가 외치는 주장은 하고 싶은 일이 없다면, 소셜 기업을 창업하자라는 것이다. 사회도 돕고 돈도 벌고……
사실 소셜 기업에서의 이윤은 일반 기업에서 생각하는 엄청난 금액이 아니다. 현재 미국에서 가장 들어가기 힘든 기업은 미국을 위한 교육이라는 NGO 같은 소셜 기업이다. 연봉 자체는 다른 기업들에 비해서 얼마 되지 않지만, 아이비 리그를 포함해서 수많은 미국의 명문 대학에서 해당 단체에서 몇년간 일하길 원한다. 물론 그 나라의 문화가 자원봉사를 적극 장려하는 분위기이긴 하지만, 공공 사업이라고 해서 완전히 먹고 살기 힘들 정도의 돈을 주는 것은 아니다.
책에 나오는 소셜 사업은 중퇴 예방을 위한 사업, 싼 값의 방을 구해서, 예비 만화가에게 빌려주고, 예비 만화가와 실제 출판사를 연결해주는 사업, 이걸 보면서, 아, 이런식의 사업이다., 큰 이익은 아니지만, 수익이 적당히 나면서, 누군가를 도울 수 있는 이런 사업이 얼마나 참신하고 매력적인가를 보여준다.
나도 언젠가 가능하다면, 컴퓨터 쪽 분야의 기술을 가리키고, 실제 기업과 연결해 줄 수 있는 그런 회사를 만들고 싶다라는 생각이 들었다. 그리고 그런 사업을 시작하려면 어떤 것이 필요할까? 단순히 영리 목적의 학원이 아니라, 실제로 그 수료생에게 도움을 줄 수 있는, 그래서 다시 그 수료생들이 다른 사람들을 돕게 할 수 있는 그런 생각이 들었다.
지금의 소셜 SNS 가 아닌 진정한 소셜 기업, 방글라데시의 그라함 은행 같은 그런 것을 만들고 싶은 사람에게 권하고 싶은 책이다.
책 리뷰 – 대규모 웹 개발(한빛미디어, 카일 라우든)

단편 만화를 보고, 장편 만화를 보면서, 뭐야, 이거 장수만 차이나지 양만 늘리면 되지 라고 쉽게 생각하는 것 처럼, 네이버, 다음 등의 포털 사이트를 보고, 개인 웹페이지만 만들어보면 쉽게 만들 수 있겠지라고 생각할 수 있을 것이다. 하지만, 3층 건물을 짓는 것과, 100층 건물을 짓는 것이 설계라든지, 시공이 다를 수 밖에 없듯이, 일반 개인 웹페이지를 만드는 것과 대규모 사이트의 웹 개발은 완전히 다른 작업일 수 있다.
동시 접속이 100이하인 사이트와 동시 접속이 1만~10만을 넘는 웹 사이트라면, 기본적인 웹페이지의 사이즈를 줄이는 것 부터, 파일들을 어떻게 관리할 것인지등에 대한 많은 고민을 해야합니다.
대규모 웹 개발의 경우는 최초의 대형 포털이라고 부를 수 있는 야후의 개발자가 집필한 책입니다. 그리고 크게 두 가지로 내용이 나뉘는데, 책의 부제목 처럼 배경지식과 개발기법입니다.
대규모 웹 개발을 위해서 가장 필요한 것 중에 하나는 모듈화 입니다. 각각의 페이지를 어떻게 나누고 그 페이지 안에서 또 어떻게 구간 구간을 나눌 것인지, css 를 어떻게 이용할 것인지 등등의 기본적인 내용부터 시작합니다.(물론, 저는 웹 개발을 거의 안해봐서 모르는 것 투성이였습니다. OTL) 그리고 웹 사이트를 어떻게 구성할 것인지, 어느 부분에서 속도를 개선할 수 있을런지 등의 중요한 부분들에 대한 내용들로 마무리 됩니다.
최초에 이 책을 봤을 때, 가장 큰 단점은, 웹 개발을 잘 모르는 사람에게는 모르는 내용이 대부분일 수 있다는 겁니다. 반대로 장점은, 웹 개발을 하시는 분들이, 어떤 부분에 신경을 써야할지 잘 집어준거(?) 같다라는 느낌이 듭니다.(죄송합니다. 제가 웹 개발을 잘 몰라서 T.T)
사실 저는 이 책을 볼 때, 웹 개발 자체에 대한 내용보다는, 대규모 사이트에서의 문제점, 내부 구조를 어떻게 잡고, Scalability 는 어떻게 제공하는 것이 좋을 것인지에 대한 내용이 있을 것이라고 생각했는데, 좀 더 웹 개발 자체에 집중된 Professional 한 내용이었습니다. 제 기대는 깨어져버리긴 했지만, 좀 더 집중된 주제에 대해서 책들이 나오는 외국이 부럽고, 이런 책들을 계속 번역해주는 한빛미디어에 감사드리고 싶습니다.
언젠가 우리나라도, 이런식으로 각 분야에 대한 디테일한 내용들이 많이 나오길 바랍니다.
Python Development With Boost.Python
Python 을 사용하다보면, 그 편리함에 감탄하다가도, 좀 더 나은 성능을 가지고 싶다라는 욕망에 몸을 던지게 됩니다. 결국 가끔씩 속도의 유혹에 이기지 못해, Binding 이라는 외도를 하게 되는데……
이 외도를 하는 방법에 3가지가 있다고 합니다.
1. Pure Python Binding
2. Boost.Python
3. SWIG
여기서 제가 해본 것은 1,2번입니다. 1,2번은 실제로 성능 차이는 거의 없는 것 같습니다.
-----Boost.Python Binding----
4 function calls in 1.232 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.232 1.232 :1()
1 1.190 1.190 1.232 1.232 test.py:4(testgo)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.042 0.042 0.042 0.042 {range}
----Pure Python Binding ----
1000004 function calls in 1.266 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.266 1.266 :1()
1 0.509 0.509 1.266 1.266 test.py:4(testgo)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1000000 0.715 0.000 0.715 0.000 {pure_test.pure_test}
1 0.042 0.042 0.042 0.042 {range}
단지 이상한 것은 Pure Python Binding 에서는 cProfile이 제대로된 호출을 찾아내는데, Boost.Python 에서는 제대로 된 Profile 결과가 나오지 않습니다. 다만, 사용시간은 제대로 나옵니다.
그런데, Pure Python Binding 은 개발이 조금 귀찮습니다. Boost.Python 은 Boost를 설치해야 합니다. 설치시에도 –with-python 옵션을 줘야만 함께 생성됩니다. 그 대신 제공해주는 것이 풍부합니다. 그래서 간단한 Boost.Python 모듈 소스를 소개합니다.
먼저 개발을 위해서는 다음과 같은 setup.py를 만들어줘야 합니다.
from distutils.core import setup, Extension
module1 = Extension('boost_test',
include_dirs = ['/boost/include'],
libraries = ['boost_python'],
library_dirs = ['/boost/lib'],
sources = ['src/boost_test.cpp'])
setup (name = 'boost_test',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1])
그리고 소스는 굉장히 간단합니다. 실용성을 위해서 list 안에 list 가 있는 케이스로
작성을 했습니다. list 나 tuple 이나 사용법은 동일합니다.
#include
#include
#include
using namespace boost::python;
int get_int( tuple list1, list listoflist ){
return boost::python::len(list1);
}
const char *get_string( list list1, list listoflist ){
list mylist = boost::python::extract(listoflist[1]);
//str 을 쓰면 object 를 string으로 만들어 줍니다.
//str 을 안쓰고 다른 type 이 오면 TypeConvertError 가 생깁니다.
std::string k = boost::python::extract(str(mylist[0]));
return k.c_str();
}
BOOST_PYTHON_MODULE(boost_test)
{
def("get_string", &get_string );
def("get_int", &get_int );
}
마지막으로 간단한 테스트 코드입니다.
import boost_test
if __name__=="__main__":
print boost_test.get_int( ('1','2','3'), ['2'] )
print boost_test.get_string( ['1','2','3'], [['2'],['1','3']] )
class 를 binding 하는 방법 역시 boost.python 에서는 굉장히 쉽고, 이미 boost 페이지 내에서 찾기 쉽기 때문에 생략합니다.
A Walk In The Cloud
미흡한 지식으로 Cloud 를 살짝 정리해보았습니다.
과연 Developer/Operator/DBA는 Cloud 에서 어떤 포지션을 가져야 할까요?
Memcached VS DBMS Performance Comparison
이제는 대부분의 기업들에서 사용하고 있지만, 아직도 모르시는 분들을 위해서 간단하게 정리합니다.
혹시 조금의 비용만 들이고, 당신의 웹사이트나 어플맄케이션의 성능을 10배 이상 올릴 수 있다면
어떻게 하시겠습니까?
가장 손쉬운 방법은 바로 DBMS와 함께 Memcached 를 사용하는 것입니다.
보통 일반적으로 2 Tier , App -> DBMS 이런형태로 사용하게 되는데, 여기에 중간에 Memcached를
집어넣으므로써 굉장히 손쉽게 성능을 향상시킬 수 있습니다.

일단 단순 DBMS Select 쿼리를 했을 때 걸리는 시간입니다.
1. select dbms
[time=0:00:00.035560]
2. get memcached
[time=0:00:00.000415]
입니다. 이것은 극단적인 예이긴 하지만, 거의 100배 정도 차이가 나는걸 볼 수 있습니다.
그렇다면, 어느 부분에 memcached 를 적용하는 것이 좋을까요?
1] Read 작업이 많은 경우!!!
2] 항상 같은 값이나, 일정 동안 같은 값을 가져가는 경우
즉, 단순 select 작업이 많은 경우에는 memcached를 이용하면 바로 위와 같은 성능 향상을
바로 획득할 수 있습니다.
여기서 memcached를 사용할 경우의 Tip 을 몇가지 소개합니다.
1. memcached 서버의 memory가 많을 수록 좋다.
-> 당연한 일이지만, memory 가 클 수록 더 많은 데이터를 Cache 할 수 있으므로 좋습니다.
-> O(1) 알고리즘이니, 데이터가 많아져도 속도의 저하가 없습니다.
2. memcached 서버와는 Connection Pool 등으로 Connection 작업을 줄인다.
-> 매번 작업할 때 마다, memcached 서버와 Connection 을 맺어야 하면, 배보다 배꼽이
-> 큰 경우가 발생합니다. 즉 한번 맺으면 쭈욱 계속 사용하는 것이 성능상 향상이 있습니다.
3. -f 옵션을 잘 사용하자.
-> memcached 는 slab allocator 를 사용하는 slab의 크기는 이 -f 옵션의 팩터를 이용해서ㅇ해서
-> 증가합니다. 즉 n 바이트 이하는 전부 n 이라는 chunk를 생성하게 됩니다. 그리고 이 n보다
-> 커지는 크기는 n*factor 크기 단위로 증가합니다. 즉 memory 를 적절히 사용하려면 이 -f를
-> 적절히 이용하면 효율적으로 사용할 수 있습니다.
python try-except Performance Comparison
Python 으로 코드를 짜면서 가장 많이 고민하게 되는 내가 정말 Python 을 Python 답게 짜고 있는지가 고민입니다. C/C++ 로만 코드를 작성했기 때문에(아직 C++도 C 처럼 짜고 있는데…) 여러가지가 고민을 가지게 되는데, 가장 강하게 고민이 드는 것 중에 하나가 예외 처리입니다.
c++에서도 try, catch 를 제공하지만, 잘 쓰지 않기 때문에 이런 류의 예외처리에 익숙하지 않은데, Python 에서는 모든게 try-except 로 처리해야 하는 것 같더군요.
익숙하지 않은 상황에서는 return value 와 try-except 를 혼용하는 이상한 구조가 되버렸습니다. 그래서 코드를 다시 정리를 하려고 생각하는데, C/C++ 만 이용하던 초급 개발자라서, try-except 를 쓰면 성능상에 제약이 생기지 않을까 라는 생각이 들어서 간단한 코드로 비교를 해보았습니다.
테스트는 time 을 이용해서 비교했고, 각각 1000000 번 시도한 결과 값을 측정했습니다. 일단 간단히 결과부터 보여드리자면 다음과 같습니다. 결과부터 말씀드리자면, try-except 를 써도 전혀 속도에 영향이 없다입니다. 반복 루프에서 100% 예외가 발생하는 상황이 아니라면, 거의 영향이 없었습니다. 저도 만족해서 써도 될듯 하네요 ^^ 그래서 all-try.py 만 속도가 많이 느립니다.
DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./no-try.py
real 0m0.657s
user 0m0.603s
sys 0m0.050s
DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./use-try-but-not-call.pyreal 0m0.683s
user 0m0.627s
sys 0m0.051s
DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./use-try.pyreal 0m0.681s
user 0m0.625s
sys 0m0.052s
DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./all-try.pyreal 0m2.031s
user 0m1.975s
sys 0m0.052s
그럼 비교 코드를 올리겠습니다. 혹시나 뭔가 비교를 잘못한거 같다면 저에게 알려주시면 감사하겠습니다.
no-try.py
from test_config import TEST_CONFIG
list = []
def add_list( num ):
list.append(num)
if( num == TEST_CONFIG.TRYCOUNT ):
return
for i in range( TEST_CONFIG.RANGE ):
add_list(i)
use-try-but-not-call.py
from test_config import TEST_CONFIG
list = []
def add_list( num ):
list.append(num)
if( num == TEST_CONFIG.TRYCOUNT ):
return
for i in range( TEST_CONFIG.RANGE ):
try:
add_list(i)
except:
print i
use-try.py
from test_config import TEST_CONFIG
list = []
def add_list( num ):
list.append(num)
if( num == TEST_CONFIG.TRYCOUNT ):
raise Exception("Exception")
for i in range( TEST_CONFIG.RANGE ):
try:
add_list(i)
except:
continue
all-try.py
from test_config import TEST_CONFIG
list = []
def add_list( num ):
list.append(num)
raise Exception("Exception")
for i in range( TEST_CONFIG.RANGE ):
try:
add_list(i)
except:
continue