<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>rein&#039;s world &#187; Computer</title>
	<atom:link href="http://rein.kr/blog/archives/category/computer/feed" rel="self" type="application/rss+xml" />
	<link>http://rein.kr/blog</link>
	<description>프로그래머, 독서가, 게이머 그리고 블로거</description>
	<lastBuildDate>Wed, 23 May 2012 11:40:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-beta4-20841</generator>
		<item>
		<title>django 기반 웹 사이트 배포 방법?</title>
		<link>http://rein.kr/blog/archives/2946</link>
		<comments>http://rein.kr/blog/archives/2946#comments</comments>
		<pubDate>Wed, 23 May 2012 11:39:28 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[apt]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[배포]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wsgi]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2946</guid>
		<description><![CDATA[django 기반의 웹 사이트를 배포해야 하는데, 타겟 머신이 확정되지 않은 상태에서도 설치할 파일들은 저장할 수 있어야하고 + 설치 시기도 적당히 제어할 수 있어야 하는 상황. 일단 다음과 같은 가정으로 설치하게 했다: (Dev) django app은 데비안 패키지(.deb)로 묶는다 (Deploy) .deb은 chroot-jailed sftp에 전송 (Deploy) 올린 애를 apt 저장소 형식으로 내보냄 (Service front-end) 이걸 자동으로 받거나, 원격 [...]]]></description>
			<content:encoded><![CDATA[<p>django 기반의 웹 사이트를 배포해야 하는데, 타겟 머신이 확정되지 않은 상태에서도 설치할 파일들은 저장할 수 있어야하고 + 설치 시기도 적당히 제어할 수 있어야 하는 상황.</p>
<p>일단 다음과 같은 가정으로 설치하게 했다:</p>
<ol>
<li>(Dev) django app은 데비안 패키지(.deb)로 묶는다</li>
<li>(Deploy) .deb은 chroot-jailed sftp에 전송</li>
<li>(Deploy) 올린 애를 apt 저장소 형식으로 내보냄</li>
<li>(Service front-end) 이걸 자동으로 받거나, 원격 스크립트, 혹은 로컬에서 직접 설치</li>
<li>(Service front-end) 설치 작업 자체는 .deb의 postinst 를 이용한다:
<ul>
<li>사이트 실제 코드는 .deb으로 포장된 python package 형식으로 설치</li>
<li>사이트에서 읽을 일부 스태틱 데이터도 이 .deb에 포함.</li>
<li>매우 간단한 wsgi application 정의하는 파일과 django 설정 파일을 특정 디렉터리에 복사하고</li>
<li>기본 설정 파일(=django가 읽을 settings module)을 서버 정보를 이용해서 sed로 수정</li>
<li>static file 들은 적당한 mount 지점에 가도록 symlink 추가</li>
<li>처음에 설치한 디렉터리를 이용해서 띄우는 설정을 /etc/apache/available에 추가하고 apache 재시작</li>
</ul>
</li>
</ol>
<p>&#8230;를 하는 상황.</p>
<p>근데 바꿀 수 있는 부분이 대략 이렇다:</p>
<ul>
<li>django: 하지만 python 기반 (뭐 wsgi 기반의&#8230;) 이어야 함.  ((Go로 만들고 싶은 생각이 약간 있긴 하지만 그건 근 미래에는 힘들 듯))</li>
<li>apache: 맘 편하게 gunicorn + nginx reverse proxy 같은 <em>고전적인 조합을</em> 생각하는 중</li>
<li>.deb 전송 방식으로 sftp<sup>[<a href="http://rein.kr/blog/archives/2946#footnote_0_2946" id="identifier_0_2946" class="footnote-link footnote-identifier-link" title="chroot jail이라 upload 디렉터리만 보이는 정도로">1</a>]</sup> : shell 권한을 주기 곤란해서 고른 것인데, 그냥 http put 으로 넣는게 더 나을지도?</li>
</ul>
<p>&nbsp;</p>
<p>django 기반의 사이트를 배포해 보신 분들의 의견을 구합니다. 아는 게 없는 동네라 뭔가 엄한 -_- 조합을 만들었다 싶기도 하고.</p>
<p>혹은 다른 WSGI 프레임웍을 썼을 때 좀 더 배포가 편했다거나 &#8212; flask나 cherrypy만 써도 이보다 간단할 것 같은데&#8230; &#8212; 하는 경험 있으면 들려주세요. 흑흑<br />
상식적인(?) 방법은 fabric이나 puppet으로 배포하는 쪽인 거 같긴하지만; (혹은 chef?)</p>
<ol class="footnotes"><li id="footnote_0_2946" class="footnote">chroot jail이라 upload 디렉터리만 보이는 정도로</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2946/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NDC 참관기: 덤프 파일을 통한 사후 디버깅 실용 테크닉</title>
		<link>http://rein.kr/blog/archives/2934</link>
		<comments>http://rein.kr/blog/archives/2934#comments</comments>
		<pubDate>Tue, 01 May 2012 23:02:54 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[ndc2012]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2934</guid>
		<description><![CDATA[슬라이드는 &#8220;덤프 파일을 통한 사후 디버깅 실용 테크닉&#8220;에서 볼 수 있음. 넥슨 김이선 님의 발표. 내용 요약: 돈을 벌기 전에는 배포 전 디버깅이 중요하다. 라이브 상황에서는 배포 후 디버깅이 더 중요해진다. 덤프 파일 특정 상황 &#8212; 특히 안좋은 상황 &#8212; 에서 프로세스 상태를 디버깅 용으로 남기는 것. 풀 메모리 덤프를 남기면 좋지만 커서(&#8230;) 미니 덤프를 [...]]]></description>
			<content:encoded><![CDATA[<p>슬라이드는 &#8220;<a href="NDC2012http://www.slideshare.net/veblush/ndc2012-12695435">덤프 파일을 통한 사후 디버깅 실용 테크닉</a>&#8220;에서 볼 수 있음.</p>
<p>넥슨 김이선 님의 발표.</p>
<h2>내용 요약:</h2>
<p>돈을 벌기 전에는 배포 전 디버깅이 중요하다.<br />
라이브 상황에서는 배포 후 디버깅이 더 중요해진다.</p>
<h3>덤프 파일</h3>
<p>특정 상황 &#8212; 특히 안좋은 상황 &#8212; 에서 프로세스 상태를 디버깅 용으로 남기는 것.<br />
풀 메모리 덤프를 남기면 좋지만 커서(&#8230;) 미니 덤프를 남긴다.<br />
상용 서비스까지 갔다면 미니덤프를 남기고 이를 수집해서 디버깅하는 시스템은 필수.</p>
<p>하지만 미니 덤프 디버깅의 현실은&#8230;</p>
<ul>
<li>덤프 파일을 열었는데 심볼이 없다고 어셈블리 코드가 보이는 경우</li>
<li>여기서 죽으면 안되는데 왜 죽었나 싶은 경우?</li>
<li>콜스택이 깨졌다거나</li>
<li>풀 메모리 덤프를 남겼는데 내가 보려는 객체는 어디에?</li>
</ul>
<h3>덤프 파일과 pdb 파일 연결하기</h3>
<ul>
<li>미니덤프 헤더는 RSDS 헤더, GUID, age, pdb-path 등이 들어감</li>
<li>pdb, exe, minidump는 이 GUID로 연결된다</li>
<li>심볼서버는 당연히 써야</li>
<li>보안 솔루션 (더미다 류) 을 사용하면 덤프 파일의 GUID가 바뀐다</li>
<li>하지만 COFF file format의 링크 시간을 기록한 타임 스탬프는 유지</li>
<li>클라이언트 덤프 수집단계에 미니덤프와 해당하는 PDB를 맺어주는 단계를 넣자(클라이언트 버전 정보; 타임 스탬프를 이용해서)</li>
</ul>
<h3>여러 개의 덤프 파일을 분석할 때</h3>
<p>일어나지 않을 것 같은 일도 덤프 파일이 많으면 분석할 수 있음<sup>[<a href="http://rein.kr/blog/archives/2934#footnote_0_2934" id="identifier_0_2934" class="footnote-link footnote-identifier-link" title="이건 이전 회사에 있을 때 내가 포스트모텀 디버깅, 그것도 최대한 많은 수를 수집해야 한다고 주장한 이유와 같음">1</a>]</sup></p>
<ul>
<li>분류 기준으로 EIP, callstack, 게임에 따른 정보(맵, 장비, &#8230;)</li>
<li>외부 모듈이나 말이 안되는 곳이면 어떻게하지? 클라는 환경을 통제할 수 없으니 외부 변수를 추적한다</li>
<li>EIP와 다른 변인 (OS, CPU, GPU) 등을 보면 예상되는 것과 다른 분포인 경우가 있다 (=환경 편재)</li>
<li>OS라면 드라이버 버그, CPU의 문제 (보통은 mainboard), GPU 문제, 외부 모듈 (보안 프로그램이나 해킹 툴)</li>
</ul>
<p><strong>사례 분석</strong></p>
<p>&nbsp;</p>
<ol>
<li>DF의 코드 베이스를 VS 2003에서 VS 2008로 이전함.</li>
<li>특정 유저 (소수) 에서 채널 선택하는 순간 HeapAlloc/HeapFree 중에 크래시 하는 버그 발견</li>
<li>Heap-corruption이라,
<ul>
<li>게임 시작에서 채널 선택하는 부분까지의 코드를 리뷰</li>
<li>이 영역에 많은 수의 trap code와 HeapValidate 코드 삽입</li>
<li>하지만 문제는 발견되지 않음</li>
</ul>
</li>
<li>모듈 목록에 환경 편재가 있음: BFCO0GAF.dll 등의 알파벳/숫자가 섞인 특정 패턴의 모듈 발견</li>
<li>해당 dll이 악성 프로그램이 삽입한 것; 2003과 2008의 heap 구현이 달라서 생긴 일</li>
</ol>
<h3>콜 스택이 깨지는 경우</h3>
<ul>
<li>EBP, ESP 중 하나만 깨져도 콜 스택을 복원할 수 없다</li>
<li>이를 다음 휴리스틱으로 극복
<ol>
<li>스택 메모리에서 주소를 추려낸다 (모듈 정보의 주소 영역을 이용해서)</li>
<li>스택 메모리에서 스택 주소를 추려낸다</li>
<li>1 + 2를 해서 콜 스택을 추정</li>
</ol>
</li>
<li>프로그래머의 해석이 필수</li>
</ul>
<h3>힙 메모리 문제</h3>
<ul>
<li>메모리 덤프가 있으면 디버깅에 큰 도움이 된다</li>
<li>하지만 모든 메모리 객체에 접근하는 건 쉽지 않음</li>
<li>메모리를 exhaustive하게 검색</li>
<li>vfptr 값 이용</li>
<li>typeid(T)의 구현 형태를 이용해서 타입 이름을 이용해서 검색</li>
</ul>
<p>&#8230;<a href="http://code.google.com/p/dump-analysis-tool/">이걸 포함한 오픈소스 툴을 공개</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>감상:</h2>
<p>이번에 네 개 세션 밖에 못들었는데, 그 중 제일 괜찮은 강연이었다. 다음 세션을 회사 돌아갈 시간이라 못 들은게 아쉬움.</p>
<p>내가 예전에 했던 유사한 시도는 통계적으로 분류하고 / 적당한걸 찾을 수 있게 도와준다 정도였는데 (VS 안띄우게 하는게 목표였으니..) 이렇게 실제 사례를 바탕으로 한 내용을 알고 있었다면 훨씬 좋게 할 수 있었을 듯.<br />
그리고 바이너리가 수정된 경우의 처리는 제대로 못했는데 &#8212; ipkn 패치해서 돌아가게 수정 &#8212; 이 부분에 대한 정보도 얻게 되어서 좋았다.</p>
<p>게다가 강연자 분이 &#8220;이런거 되는걸 모아서 새로 짜서 공유했습니다&#8221;라고 말한건 대박(&#8230;).<br />
아마 `지식 공유&#8217;란 점에서 모델이 될만한 수준.</p>
<p>summerlight 님이 녹화한 영상도 토런트 시딩되고 있을테니 (촬영 가능한 세션이었음) 관심 생기신 분들은 한 번씩 보는걸 추천합니다.</p>
<ol class="footnotes"><li id="footnote_0_2934" class="footnote">이건 이전 회사에 있을 때 내가 포스트모텀 디버깅, 그것도 최대한 많은 수를 수집해야 한다고 주장한 이유와 같음</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2934/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NDC 참관기: 실시간 HTTP 양방향 통신에 붙여&#8230;</title>
		<link>http://rein.kr/blog/archives/2929</link>
		<comments>http://rein.kr/blog/archives/2929#comments</comments>
		<pubDate>Tue, 01 May 2012 23:01:35 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[ndc2012]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2929</guid>
		<description><![CDATA[이전 글에 안 써놓은 감상을 여기에. HTTP 자체가 프로토콜 적으로 한계를 갖기 때문에 여러 가지 보완 방법이 제시되고 있는데, 현재 상태를 다른 수단으로 극복하기 위한 몇 가지 시도에 대해서 논해서 재밌었다. 구현이 궁금했지만 까본 적은 없었던 몇 가지 구현체 &#8212; FB 메신저, gmail에 달린 google talk &#8212; 를 분석하고 이에 대한 단점 (장점이야 HTTP 한계 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rein.kr/blog/archives/2925">이전 글</a>에 안 써놓은 감상을 여기에.</p>
<p>HTTP 자체가 프로토콜 적으로 한계를 갖기 때문에 여러 가지 보완 방법이 제시되고 있는데, 현재 상태를 다른 수단으로 극복하기 위한 몇 가지 시도에 대해서 논해서 재밌었다.</p>
<p>구현이 궁금했지만 까본 적은 없었던 몇 가지 구현체 &#8212; FB 메신저, gmail에 달린 google talk &#8212; 를 분석하고 이에 대한 단점 (장점이야 HTTP 한계 극복이니) 을 논한 점은 +.<br />
html5의 web-socket을 좀 더 자세히 다뤄줬으면 좋았겠지만 이건 스코프를 벗어나는 문제인 듯 하니 어쩔 수 없겠지.</p>
<p>&nbsp;</p>
<p>앞으로 알아봐야 할 것, 생각해 볼 것들을 정리하자면,</p>
<ul>
<li>http가 주 프로토콜인 non-SNG 게임 서비스를 만들 일이 근 미래(3년 내)에 있을까?</li>
<li>그렇다면 html5 + web socket 기술이 충분히 침투한 상태일까?</li>
<li>모바일까지 지원한다면 결국 어느 기술을 골라서 쓰게 될까?</li>
<li>말미에 언급한 미들웨어 서버의 성숙도는 충분할까?</li>
</ul>
<p>정도인데;</p>
<p>일단 http가 주 프로토콜인 서비스를 만들 일은 머지 않은 미래에 겪게될 것 같다. 지금 하는 일이랑 연관이 없긴 하지만(&#8230;).</p>
<p>표준화 속도나 사람들이 적응하는 속도를 따져보면 mobile 말고는 html5 지원율은 높지 않을 (낮을?) 것이고, web socket 침투율은 더 낮을 것 같다. 특히 브라우저 벤더에 따라 기본 보안 설정이 상이할 가능성이 높을 것 같음.</p>
<p>뭔가 별도 플러그인으로 가기엔 모바일 지원이 매우 힘들 것 같고, 강연에서 언급한 몇 가지 방식을 잘 조합하거나, 성숙도 높은 미들웨어를 고르지 않을까 하는 정도.</p>
<p>대부분의 문제를 잘 해결해주는(&#8230;) 미들웨어 솔루션을 만들어서 팔 수 있다면 좋겠다는 생각도 좀 들긴한다.</p>
]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2929/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NDC 참관기: 실시간 HTTP 양방향 통신</title>
		<link>http://rein.kr/blog/archives/2925</link>
		<comments>http://rein.kr/blog/archives/2925#comments</comments>
		<pubDate>Thu, 26 Apr 2012 00:24:49 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[ndc2012]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2925</guid>
		<description><![CDATA[수요일(2012-04-25) 오후에 있었던 이승재 군의 발표. 발표 자료는 http://ricanet.com/new/view.php?id=blog/120425 에서. HTTP Protocol의 한계 http는 request/response protocol이다. 이로 인해서 클라이언트 쪽의 이벤트는 서버 쪽에 쉽게 전달할 수 있지만, 서버 쪽의 이벤트는 클라이언트가 요청하기 전에는 전달할 수 없다. 그런데 현재의 웹 쪽 트렌드를 보자면, twitter나 facebook, google mail (or talk) 같은 경우 실시간으로 메시지를 보낸다. 어떻게 하는걸까? [...]]]></description>
			<content:encoded><![CDATA[<p>수요일(2012-04-25) 오후에 있었던 이승재 군의 발표.</p>
<p>발표 자료는 <a href="http://ricanet.com/new/view.php?id=blog/120425">http://ricanet.com/new/view.php?id=blog/120425</a> 에서.</p>
<h3>HTTP Protocol의 한계</h3>
<p>http는 request/response protocol이다. 이로 인해서 클라이언트 쪽의 이벤트는<br />
서버 쪽에 쉽게 전달할 수 있지만, 서버 쪽의 이벤트는 클라이언트가 요청하기<br />
전에는 전달할 수 없다.</p>
<p>그런데 현재의 웹 쪽 트렌드를 보자면, twitter나 facebook, google mail (or talk)<br />
같은 경우 실시간으로 메시지를 보낸다. 어떻게 하는걸까?</p>
<h3>이를 극복하기 위한 기법들</h3>
<p>기본적으로 꼼수다 &#8212; <em>프로토콜의 한계 때문에</em>.</p>
<p><strong>Polling</strong></p>
<p>웹 브라우저에서 주기적으로 요청을 보낸다. (클라이언트 쪽 타이머 이용)<br />
문제:</p>
<ul>
<li>트래픽이 많다 / 서버 쪽 부하가 걸린다</li>
<li>지연 시간이 크다; 이벤트-클라이언트 요청 시간 차이 때문에. 그렇다고지연 시간을 줄이면 트래픽/서버 부하가 더 커진다.</li>
</ul>
<p><strong>Long-polling</strong></p>
<p>클라이언트가 미리 요청을 보내고, 서버는 이벤트가 생기는 순간까지 기다렸다가<br />
이를 모아서 (이미 온 요청에) 응답을 보낸다.<br />
Facebook 메신저 구현이 이를 이용한다.<br />
문제:</p>
<ul>
<li>구현 복잡도. 서버가 요청이 이미 와 있는 경우와 그렇지 않은 경우를 구분해서 처리해야하는 등.</li>
<li>지연 시간; 응답을 보낸 후 클라이언트가 다시 요청을 보내올 때까지의 시차.</li>
</ul>
<p><strong>Hidden iframe</strong></p>
<p>페이지에 숨겨 놓은 iframe을 통해서 메시지를 계속 흘려 보낸다. (서버가 응답을<br />
끝내지 않는다) 그래서 http streaming이라고 부르기도 한다.<br />
Gmail messenger(=google talk)에서 사용하는 방법이다.</p>
<p>문제:</p>
<ul>
<li>응답이 끝나지 않기 때문에 클라이언트 쪽 웹 브라우저에 메모리 릭이 생긴다.</li>
<li>프록시 / 보안 프로그램이 응답이 완전히 끝나야만 이를 넘겨주는 경우가 있다.</li>
</ul>
<p><strong>Browser plugin</strong></p>
<p>Flash, ActiveX 등을 이용. 사실 상 TCP 소켓처럼 쓸 수 있다.<br />
호환성 문제가 너무 커서&#8230;</p>
<p><strong>WebSocket (html5)</strong></p>
<p>javascript 단에서 진짜 소켓을 쓸 수 있다. 표준화가 아직이라 (protocol은<br />
결정되었지만, API가 아직 unstable).<br />
기존 웹브라우저와의 호환성 문제.</p>
<h3>WebIRC (=IRC web-bridge for smartphones) 만들기</h3>
<p>Long-polling이 호환성이 좋고 (최소한 iOS, android를 지원해야 했음),<br />
구현이 재밌어 보여서(&#8230;) 이를 구현함.</p>
<p><strong>프로토콜</strong></p>
<ul>
<li>InitLog: 각 채널 최근 로그 k 줄을 요청</li>
<li>UpdateLog(last\[\]): 각 채널에서<em>내가 마지막으로 받은 로그 ID가 last</em>일 때 그 이후 로그를 요청</li>
</ul>
<p><strong>서버 구현 이슈</strong></p>
<p>HTTP 핸들러가 새로운 내용이 없으면 대기하는 것.<br />
vs.<br />
Event listener가 새로운 내용이 왔을 때 대기 중인 스레드(의 요청)를 깨우는 것<br />
사이의 레이스 컨디션.<sup>[<a href="http://rein.kr/blog/archives/2925#footnote_0_2925" id="identifier_0_2925" class="footnote-link footnote-identifier-link" title="내 생각, 그리고 최치선 군의 의견을 조합하자면, 저건 pthread condvar 류의&nbsp;동기화 도구를 사용하면 해결 될듯 함. 치선 군이 실 서비스에서 사용하고 있는 추천 구현체는 gevent의&nbsp;Queue (monkey-patching하는).">1</a>]</sup></p>
<p>node.js 류를 사용하면 오히려 쉬웠을지도 모르지만 이미 python으로 구현.</p>
<p><strong>Webserver Architecture</strong></p>
<p>동시에 살아있는 연결이 많아서,</p>
<ul>
<li>커넥션 당 1 스레드 때문에 메모리 병목</li>
<li><em>고전적인 웹 서버의 경우 더 중요한</em> 페이지 뷰보다 동시 접속 수가 문제</li>
<li>Gevent로 쉽게 해결</li>
<li>Long-polling에 맞춰서 구현했더니 stateless 프로토콜이 되어 네트워크 단절에 강해졌다.</li>
<li>채팅 보내는 것이 네트워크 불안정엔 약했음. 이걸 극복하려니 사실상 TCP 류의 프로토콜을 HTTP 위에 재구현하는 형태가 되어버리게 되서&#8230;</li>
</ul>
<h3>Middlewares</h3>
<p>앞에서 언급한 방법들엔 정답이 없다. 각 방법의 장단점이 다름.</p>
<p>orbited2, socket.io 같은 미들웨어가 있다.<br />
그렇지만 정작 제작 시점에 사용하려던 orbited 사이트가 내려가 있어서<br />
long-polling을 직접 구현.</p>
<p><strong>Orbited</strong></p>
<p>orbited.js + *application.js* &#8212; orbited server &#8212; application server</p>
<p>위의 형태로 구성. Web-router + firewall의 역할. Legacy TCP 응용프로그램<br />
서버인 경우에도 쉽게 통신할 수 있다.</p>
<p><strong>socket.io</strong></p>
<p>nopde.js 기반. 메시지 단위 전송을 지원한다.</p>
<p><strong>확인해야 할 사항</strong></p>
<ul>
<li>연결 당 서버 리소스 소모량</li>
<li>연결이 불안정하면 어떻게 되는가?</li>
<li>웹 브라우저를 껐다켜도 괜찮은가?</li>
</ul>
<h3>웹-게임 연동</h3>
<p>이런 기술을 쓰면 웹 게임에서도 네트워크 제약(http 문제)이 *거의* 없어진다.</p>
<p>WoW 전정실, 아이온, 마비의 거래소, 넥슨 홈이나 스팀의 업적 시스템 구현이라거나,<br />
게임 웹 채팅, 친구 게임 참여 알리기, 우편 도착 알림 등의 실시간 기능이 가능해질듯.</p>
<p>결론(?): 취미 프로젝트 좋아요(&#8230;)</p>
<ol class="footnotes"><li id="footnote_0_2925" class="footnote">내 생각, 그리고 최치선 군의 의견을 조합하자면, 저건 pthread condvar 류의 동기화 도구를 사용하면 해결 될듯 함. 치선 군이 실 서비스에서 사용하고 있는 추천 구현체는 gevent의 Queue (monkey-patching하는).</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2925/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>블로그 로딩 시간 줄이기</title>
		<link>http://rein.kr/blog/archives/2906</link>
		<comments>http://rein.kr/blog/archives/2906#comments</comments>
		<pubDate>Sat, 31 Mar 2012 14:32:18 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2906</guid>
		<description><![CDATA[주말 저녁에 블로그 패이지 뜨는 속도가 이상하리만치 느려서 최적화하기로 결정했다 &#8212; 심지어 구글은 페이지 랭크에 로딩 속도를 반영한다. 사용한 도구는 Chrome용 Pagespeed 확장기능. 여기서 네트워크 탭을 이용해서 오래걸리는 기능을 하나씩 제거했다. 최적화 하기 이전 측정치는  다음과 같다. WordPress JetPack 관련 이 플러그인엔 적어도 두 가지 문제가 있다. 우선 통계 플러그인이 제 3자인 quantcast 쪽에 js파일을 [...]]]></description>
			<content:encoded><![CDATA[<p>주말 저녁에 블로그 패이지 뜨는 속도가 이상하리만치 느려서 최적화하기로 결정했다 &#8212; 심지어 <a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html">구글은 페이지 랭크에 로딩 속도를 반영</a>한다.</p>
<p>사용한 도구는 Chrome용 Pagespeed 확장기능. 여기서 네트워크 탭을 이용해서 오래걸리는 기능을 하나씩 제거했다.<br />
최적화 하기 이전 측정치는  다음과 같다.</p>
<p><img class="aligncenter size-full wp-image-2912" style="border-style: initial; border-color: initial;" title="Before (part 1)" src="http://rein.kr/blog/wp-content/uploads/2012/03/b1.png" alt="" width="640" height="713" /></p>
<div><img class="aligncenter size-full wp-image-2913" title="Before (part 2)" src="http://rein.kr/blog/wp-content/uploads/2012/03/b2.png" alt="" width="640" height="458" /><br />
<strong>WordPress JetPack 관련</strong><br />
이 플러그인엔 적어도 두 가지 문제가 있다. 우선 통계 플러그인이 제 3자인 quantcast 쪽에 js파일을 큰 쿠키를 던져 요청하고, 이걸 실행한다. 위에서 quant.js, pixel;&#8230; 에 해당하는 내용. 이게 적어도 500ms는 걸리더라. 이게 이전부터 꽤 이슈였던듯. <a href="http://www.christopher-parsons.com/blog/technology/respecting-user-privacy-in-wordpress/">Respecting User Privacy in WordPress</a>에 따르면 2011년 초 이전부터 있던 일이란다. 이슈화돼서 그런지 이에 대한 방책도 있다. <a href="http://wordpress.org/extend/plugins/wp-donottrack/faq/">WP DoNotTrack</a>이란 플러그인이 이에 해당하는 DOM 삽입을 차단해준다. 이걸 쓰면 이 500ms를 줄일 수 있더라.그리고 쓰지도 않는 gravatar hovercard관련으로 로드하는 js 파일도 지연시간이 꽤 큰 편. 게다가 css까지 로드 하는 시간을 생각하면 아주 악몽이다. 저 위에선 6초 넘게 날려먹었음. (분산도 커서 더욱 거지 같기도하고). 첫 js 로드도  길고, 얘가 로드하는 파일도 다운로드가 오래 걸리고&#8230;<br />
하지만 이게 어이 없었던건 &#8212; 난 켜지도 않은 기능이니 &#8212; 데이터베이스에 원래 있어야 할 옵션이 없어서 그렇다. 다음 항목을 wp_options 테이블에 추가하면 됨. (wp 부분은 설치 설정에 따라 다름)</p>
<blockquote><p>mysql&gt; insert into wp_options (option_id, option_name, option_value) values (NULL, &#8216;gravatar_disable_hovercards&#8217;, &#8216;disabled&#8217;);</p></blockquote>
<p>이걸로 적어도 500ms ~ 3000ms 정도를 벌 수 있다.</p>
<p>&nbsp;</p>
<p><strong>블로그 테마 관련</strong></p>
<p>위의 두 가지를 제외하면 다음 내용들이 적당히 튀어나온다.</p>
<p>1. 블로그 내용 시작 부분에 Google Transliteration관련 스크립트를 로드하더라. 이건 내 블로그엔 필요 없는 듯 하니 제거. jquery도 구글 서버에서 가져오게 수정.</p>
<p>2. 서버의 vhost 중 내 블로그만 mod_pagespeed 를 적용해 봤다.<sup>[<a href="http://rein.kr/blog/archives/2906#footnote_0_2906" id="identifier_0_2906" class="footnote-link footnote-identifier-link" title="사실 캡쳐한건 이 모듈 적용 후임">1</a>]</sup> wp supercache가 문제를 일으키길레 일단 이 플러그인은 삭제. 그리고 .htaccess에서 켰던 mod_deflate 강제하는 것도 껐다. 어차피 mod_pagespeed가 따로 로드하고 적용함. 이거 적용한 후엔 html 타입으로 가는 컨텐츠에 각 파일 별 만료 태그, css sprite, caching등이 자동 적용된다. 약간은 빨라지는듯.</p>
<p>3. 최근 댓글 보여주는 것도 잠시 생각하고 껐다. 이건 이글루스 블로그들을 따라 해본던데 좀 별로인듯.</p>
<p>4. 더불어 CC라이센스 플레이트에 붙어있는 아이콘 이미지 로딩이 느리길레 역시 제거함.</p>
<p>&nbsp;</p>
<h3><strong>최종 결과:</strong></h3>
<p>이 결과 대략 800ms ~ 900ms 정도에 페이지 로딩이 되고, 최종 렌더링도 1.3초 수준에 해결.</p>
<p><img class="aligncenter size-full wp-image-2917" title="After (part 1)" src="http://rein.kr/blog/wp-content/uploads/2012/03/after-1.png" alt="" width="640" height="717" /> <img class="aligncenter size-medium wp-image-2918" title="After (part 2)" src="http://rein.kr/blog/wp-content/uploads/2012/03/after-2-640x403.png" alt="" width="640" height="403" /></p>
</div>
<ol class="footnotes"><li id="footnote_0_2906" class="footnote">사실 캡쳐한건 이 모듈 적용 후임</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2906/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>VS 2010 빌드 속도 올리기</title>
		<link>http://rein.kr/blog/archives/2899</link>
		<comments>http://rein.kr/blog/archives/2899#comments</comments>
		<pubDate>Wed, 28 Mar 2012 12:24:35 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2899</guid>
		<description><![CDATA[C++만 가지고 쓰는 얘기. 작년에 지급 받은 머신 셋팅을 수정해서 어떻게 빌드 속도를 올렸는지 정리. 아마 한동안 업으로 Win32에서 C++ 할 일은 없을 것 같아서 기억이 사라지기 전에 정리. 저 머신 자체가 내 손을 이미 떠나서 틀린 부분이 있을테니 발견하면 지적 좀 해주시길. 머신 스펙은  대략, CPU: intel i7-2600 DRAM: 16 GiB Storage: intel SSD [...]]]></description>
			<content:encoded><![CDATA[<p>C++만 가지고 쓰는 얘기.</p>
<p><a href="http://rein.kr/blog/archives/2814">작년에 지급 받은 머신</a> 셋팅을 수정해서 어떻게 빌드 속도를 올렸는지 정리. 아마 한동안 업으로 Win32에서 C++ 할 일은 없을 것 같아서 기억이 사라지기 전에 정리.<br />
저 머신 자체가 내 손을 이미 떠나서 틀린 부분이 있을테니 발견하면 지적 좀 해주시길.</p>
<p>머신 스펙은  대략,</p>
<ul>
<li>CPU: intel i7-2600</li>
<li>DRAM: 16 GiB</li>
<li>Storage: intel SSD 80 GB + SATA HDD 500 GB</li>
</ul>
<p>그리고 SSD 용량이 적어서 아래 같은 일을 추가로 했다.</p>
<ul>
<li>4 GiB의 RAM drive를 할당하고, TEMP, TMP에 해당하는 디렉터리를 RAM 드라이브에 맵핑</li>
<li>VisualStudio와 Windows Platform SDK는 SSD에 설치</li>
<li>기타 프로그램(오피스나 LaTeX)은 HDD에 설치</li>
<li>소스 체크아웃은 HDD 쪽에</li>
<li>빌드 스크랫치도 HDD 쪽에</li>
<li>IPCH 파일 저장되는 위치 변경. 방법은 민장님 블로그의 &#8220;<a href="http://minjang.egloos.com/2827484">Visual Studio (C/C++) 2010 몇 가지 팁</a>&#8221; 참조</li>
</ul>
<p>대략 이 정도만 설정해도 꽤 빨라지더라. 이전 머신 (Q8600 + 4GiB RAM + HDD only) 에서 빌드할 때 20+분 걸리던게 2+분 수준으로 줄어듦. 예전엔 인크레디빌드 써봐야 빌드 시간이 18분 수준이라 안 쓰느니만 못한 꼴을 몇 번 봤고, 머신 변경 후에는 아예 안 쓰게 되었음. 최대 코어 수도 12개던가로 제한되어 있기도 하고(구입한 라이센스 문제).<br />
그 원인이 된건 다음 것들인듯.</p>
<ul>
<li>IO가 두 디스크에 분산되서 소스 로드 속도가 빨라졌다; 어차피 Windows 헤더와 개발 중이 프로그램 헤더가 모두 로드 되야 하니&#8230;</li>
<li>VS가 북키핑 용으로 쓰는 듯한 일부 .log, build.unsuccessful<sup>[<a href="http://rein.kr/blog/archives/2899#footnote_0_2899" id="identifier_0_2899" class="footnote-link footnote-identifier-link" title="정확한 파일 이름은 누가 좀..">1</a>]</sup> 파일들 (내용물이 없거나 매우 짧은) 을 임시 디렉터리에 해당하는 곳에 잔뜩 쓴다. 이게 RAM drive로 옮겨가서 디스크 IO 감소 + 분산</li>
<li>CPU 아키텍쳐 변화 (무려 두 세대) + 코어 수 증가(4에서 8로)로 단일 파일 컴파일 속도 증가</li>
<li>Win32/x64가 다 있는 경우 개발 중에는 x64 빌드만 사용. 빌드 / 테스트 수행 시간 모두 짧더라</li>
</ul>
<p>등의 이유로 빨라졌다고 생각한다.</p>
<p>&nbsp;</p>
<p>궁금한 것:</p>
<ul>
<li>모든 소스가 SSD 두 개, 혹은 SSD RAID 위에 올라가 있다면 좋겠지만 그런 설정은 받아본 적이 없으니 궁금증만&#8230;</li>
<li>빌드 스크랫치 전체를 RAM 위에 올려놓고 싶긴한데, ECC RAM 아니면 살짝 불안하기도 하고, 그 정도로 메모리를 풍족하게 써본 적도 없고&#8230;</li>
<li>여기에 unity build를 섞었다면 어땠을까 하는 것..</li>
</ul>
<p>해보신 분들의 의견을 구합니다(&#8230;).</p>
<p>&nbsp;</p>
<p>PS. 근데 가장 좋은건 Google이나 Microsoft 처럼 빌드 팜이 있는 거겠지만, 그 정도의 엔지니어링을 하는 건 아니었으니&#8230;</p>
<p>&nbsp;</p>
<ol class="footnotes"><li id="footnote_0_2899" class="footnote">정확한 파일 이름은 누가 좀..</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2899/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>node.js 혹은 CPS 단상</title>
		<link>http://rein.kr/blog/archives/2867</link>
		<comments>http://rein.kr/blog/archives/2867#comments</comments>
		<pubDate>Sat, 03 Mar 2012 05:30:19 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[멀티스레딩]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2867</guid>
		<description><![CDATA[지난 주에 둘째 태어나서 병원에 있는 동안 SNS와 블로고스피어를 스쳐지나간 글 중 제일 눈에 띄는 부분이 &#8220;CPS와 node.js&#8221; 관련된 내용이었다. iPhone은 정리에는 그다지 좋은 기기라고 못하겠다. 내가 생각하던 문맥을 저장하기엔 내 활용 방법의 문제거나 기기가 부족하거나; 여하튼 기억나는 글들을 여기 정리하자면 (twitter는 정리가 불가능하니 제외), 웹 서버 아키텍처와 프로그래밍 모델의 진화 http://ricanet.com/new/view.php?id=blog/110903 (node.js의 I/O 모델을 점검하기에 좋은 [...]]]></description>
			<content:encoded><![CDATA[<p>지난 주에 둘째 태어나서 병원에 있는 동안 SNS와 블로고스피어를 스쳐지나간 글 중 제일 눈에 띄는 부분이 &#8220;CPS와 node.js&#8221; 관련된 내용이었다.</p>
<p>iPhone은 정리에는 그다지 좋은 기기라고 못하겠다. 내가 생각하던 문맥을 저장하기엔 내 활용 방법의 문제거나 기기가 부족하거나; 여하튼 기억나는 글들을 여기 정리하자면 (twitter는 정리가 불가능하니 제외),</p>
<p>웹 서버 아키텍처와 프로그래밍 모델의 진화 <a href="http://ricanet.com/new/view.php?id=blog/110903">http://ricanet.com/new/view.php?id=blog/110903</a> (node.js의 I/O 모델을 점검하기에 좋은 글)</p>
<p>Node.js의 소개글 들에 대한 유감 <a href="http://himskim.egloos.com/3810574">http://himskim.egloos.com/3810574</a></p>
<p>이에 대한 홍민희 님의 글 <a href="http://blog.dahlia.kr/post/18300740247">http://blog.dahlia.kr/post/18300740247</a></p>
<p>그리고 다시 (홍민희 님의) 비동기 I/O 프로그래밍 모델 관련 글 <a href="http://blog.dahlia.kr/post/18355002657">http://blog.dahlia.kr/post/18355002657</a></p>
<p>&nbsp;</p>
<p>이에 대한 내 생각을 정리하자면:</p>
<p>1. node.js는 hype이라 생각한다. node.js 광신도(&#8230;)들이 말하는 장점은 이미 오래된 얘기고 (이벤트 기반의 비동기 I/O 모델, 단일 이벤트 루프와 그로 인한 싱글 스레드의 단순함), 이런 시도를 하는게 node.js만 있는 것도 아니다. 다만 세상에 JavaScript 프로그래머가 많기 때문에 그렇게 느껴지는 것 뿐이지. 서버 혹은 백엔드 프로그래밍에선 너무 오래된 &#8212; <em>(게임) 서버 프로그래밍을 주로 하던 이들 사이엔 이게 왜 이슈가 되는지 궁금해하는 사람들이 나온다 </em>&#8211; 이슈라서 말이지.</p>
<p>다음 언어들로도 `흔히&#8217; CPS 스타일의 프로그래밍을 할 수 있다. 그리고 이 언어들 모두에서 node.js에서 `하면 안된다&#8217;라고 주장하는 한 이벤트에서 긴 계산을 하는 일도 실행 모델에 따라선 해도 된다. 그리고 이 언어들에선 `흔히 하는 일&#8217;에 불과하다.</p>
<p>Go: goroutine 자체가 일종의 CPS 스타일 프로그래밍이다. 그리고 일반적인 이벤트 큐 처럼 쓸 수 있는 channel 개념 역시 존재한다. 그리고 이 두 개념을 최대한 활용해서 만든 언어가 Go다. 자세한 내용은 내 과거 포스팅을 참조하자 (<a href="http://rein.kr/blog/archives/tags/go">http://rein.kr/blog/archives/tags/go</a>) 개인적으론 이런 류의 I/O 비동기 / 멀티플렉싱을 생각하고 짠다면 Go가 가장 깔끔한 프로그램이 나온다고 생각한다.<sup>[<a href="http://rein.kr/blog/archives/2867#footnote_0_2867" id="identifier_0_2867" class="footnote-link footnote-identifier-link" title="이 언어를 만든 회사가 Google이란 생각을 하면 더 그렇다">1</a>]</sup></p>
<p>C#: C#의 익명 함수 (delegate라고 부르던데) 역시 이런 CPS 스타일로 프로그래밍 할 수 있다. Nexon의 `마비노기 영웅전&#8217;과 `마비노기 2&#8242;도 이런 개념을 활용해서 서버를 구현했다. 2011년 NDC 세션의 내용을 정리해놓은 것처럼 (<a href="http://rein.kr/blog/archives/2696">http://rein.kr/blog/archives/2696</a>, <a href="http://rein.kr/blog/archives/2671">http://rein.kr/blog/archives/2671</a>) 이걸가지고도 JS에서 흔히 하듯이 성공/실패 처리를 cps로 작성한다.</p>
<p>C++: C++11의 lambda 혹은 그 이전의 std::function<sup>[<a href="http://rein.kr/blog/archives/2867#footnote_1_2867" id="identifier_1_2867" class="footnote-link footnote-identifier-link" title="혹은 그 이전 구현체인 std::tr1::function, 혹은 이거랑 별반 다를게 없는 boost::function을 생각하면 더 이전부터">2</a>]</sup> 을 이용하면 역시 CPS 형태의 코드를 작성할 수 있다. 내가 작성한 게임 서버 라이브러리 역시 이를 이용한 CPS 스타일의 코드가 포함되어 있다.</p>
<p>&nbsp;</p>
<p>2. node.js가 단일 스레드, 즉 단일 문맥만으로 처리하기 때문에, computation-intensive한 작업은 처리할 수 없다. 그래서 어쩔 수 없이 백그라운드 태스크 큐 등을 써야하고, 이로 인해 생기는 지연 시간(latency) 문제는 극복할 수 없다.<br />
게임 서버에서도 node.js처럼 (혹은 그보다 낫게)</p>
<ul>
<li>복수의 스레드가 네트워크 이벤트(read/write)를 비동기로 처리하고,</li>
<li>네트워크 이벤트를 서버 메인 스레드(그러니까 논리적으론 단일 스레드 프로그램)로 전달하고,</li>
<li>서버 메인스레드가 내부 로직을 처리해서 다시 네트워크로 보내는</li>
</ul>
<p>구조를 사용한 서버들이 있다. 다만 이 경우엔 계산 량이 많은 경우 지연 시간이 길어진다. 그것도 게임 상에서 상호 연관이 없어 보이는 부분들 사이에 영향을 주는 형태로 -_-;<br />
게임 서버는 웹과는 좀 다르게 persistent storage에 다 저장하지도 못하고, 각 연결 간에 상호 작용도 많아서 어쩔 수 없이 생기는 문제이긴하지만 맨 첫 글에서 얘기하는 것 처럼 node.js가 `유니크&#8217;한 것은 아니다. JavaScript로 서버 프로그래밍을 진행한다는 것은 꽤 참신하지만 말이다.</p>
<p>그리고 서버 메인스레드가 1개가 아니라 복수개 일 수도 있고 &#8212; 내가 본 코드에선 이게 주류다 &#8212; 걔 중에도 IO 스레드가 full swing을 하돼 non-blocking한 알고리즘을 이용해서 복수의 큐를 사용하고, 블럭킹을 제거한 구현체도 있다.</p>
<p>&nbsp;</p>
<p>3. 프로그래밍 모델은 CPS는 `쉽게 만들어낼 수 있지만&#8217;, 프로그래머에겐 꽤 골치거리라 생각한다. 홍민희 님의 말대로 가장 쉬운 형태는 co-routine일 것이라 생각한다. CPS처럼 이전 문맥에 대해 생각할 필요도 없고, 불필요한 nesting (node.js말하는 거임) 도 필요치 않다. 다만 이 경우에는 언어적인 수준에서 지원하지 않으면 안된다. 불행히도 내가 사용하는 주요 언어인 C/C++의 경우 co-routine을 사용할 수단은 OS fiber수준 정돈데, 이 경우엔 다른 동기화 객체들을 쓸 때, 동기화 단위가 스레드라서 fiber끼리 switching할 때 지옥을 보게 된다. 하지만 node.js 정도의 프로그래밍 모델에선 이게 가장 간편할 것이다. 각 연결 별 문맥끼리 상호작용이 적다면 더더욱 말이다.</p>
<p style="text-align: right;">
<ol class="footnotes"><li id="footnote_0_2867" class="footnote">이 언어를 만든 회사가 Google이란 생각을 하면 더 그렇다</li><li id="footnote_1_2867" class="footnote">혹은 그 이전 구현체인 std::tr1::function, 혹은 이거랑 별반 다를게 없는 boost::function을 생각하면 더 이전부터</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2867/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>리뷰: The Art of Readable Code</title>
		<link>http://rein.kr/blog/archives/2860</link>
		<comments>http://rein.kr/blog/archives/2860#comments</comments>
		<pubDate>Wed, 22 Feb 2012 00:40:00 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[책]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2860</guid>
		<description><![CDATA[&#34;어떻게 하면 읽기 쉬운 (=이해하기 쉬운) 코드를 짤 것인가&#34;에 관한 책. 아주 짧은 에세이 몇 편이라고 생각하면 된다. 180 페이지 정도 밖에 안됨… 크게 세 가지 주제를 다룬다: 표면적인 것 개선하기 (Surface-level improvements): 변수 명 짓기, 코멘트 달기/달지 말기, 반복문과 로직 단순하게 만들기 (Simplifying loops and logic): 읽기 쉬운 구조로 짜기; 중간 변수 뽑기; 거대한 [...]]]></description>
			<content:encoded><![CDATA[<p>&quot;어떻게 하면 읽기 쉬운 (=이해하기 쉬운) 코드를 짤 것인가&quot;에 관한 책. 아주 짧은 에세이 몇 편이라고 생각하면 된다. 180 페이지 정도 밖에 안됨…</p>
<p>크게 세 가지 주제를 다룬다:</p>
<ol>
<li>표면적인 것 개선하기 (Surface-level improvements): 변수 명 짓기, 코멘트 달기/달지 말기, </li>
<li>반복문과 로직 단순하게 만들기 (Simplifying loops and logic): 읽기 쉬운 구조로 짜기; 중간 변수 뽑기; 거대한 expression쪼개기 등등 </li>
<li>코드 재조직하기 (Reorganizing your code): 리팩터링에 가까운 이야기들; 한 번에 하나의 일만 하게 코드 뽑아내기 등등 </li>
<li>(덤. 추가 주제; 테스팅만 다룸) </li>
</ol>
<p>대략 이런 예제들이 나온다<sup>[<a href="http://rein.kr/blog/archives/2860#footnote_0_2860" id="identifier_0_2860" class="footnote-link footnote-identifier-link" title="예제는 C++, JavaScript, Python, Java(?) 위주; 어려운 문법은 안 나옴">1</a>]</sup> :</p>
<p>pp. 78 – 79 의 중첩된 루프 제거하기:</p>
<p>for (int i = 0; i &lt; results.size(); i++) {    <br />&#160;&#160;&#160; if (results[i] != NULL) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; non_null_count++;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (results[i]-&gt;name != &quot;&quot;) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cout &lt;&lt; &quot;Considering candidate&#8230;&quot; &lt;&lt; endl;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // &#8230;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; }     <br />}</p>
<p>를 이렇게 바꾼다:</p>
<p>for (int i = 0; i &lt; results.size(); i++) {    <br />&#160;&#160;&#160; if (results[i] == NULL) continue;     <br />&#160;&#160;&#160; non_null_count++;</p>
<p>&#160;&#160;&#160; if (results[i]-&gt;name == &quot;&quot;) continue;    <br />&#160;&#160;&#160; cout &lt;&lt; &quot;Considering candidate&#8230;&quot; &lt;&lt; endl;     <br />&#160;&#160;&#160; // &#8230;     <br />}     </p>
<p>뭐 이렇게 간단한 거 말고도 리팩터링 책에서 말하는 메서드/멤버 함수 뽑아내기, 한 메서드/멤버 함수에서 한 가지 일만 하기 등등 같은 것도 다룬다.</p>
<p>&#160;</p>
<p>엄청 큰 내용을 다루는 것은 아니지만,</p>
<p>1. 읽기 쉬운 코드에 대한 (저자 주관이 담겨있지만) 개념 정리</p>
<p>2. 간단한 실례들.</p>
<p>3. 적당한 follow-up 글/책을 알려줌</p>
<p>정도가 있으니 어느 정도 `읽기 좋은 코드’에 신경을 쓰게 될 것 같고, 이 이후에 따라가기도 편한 듯 싶다.</p>
<p>게다가 챕터 구성이 처세술 책 같다 – 이거 칭찬임; 중요한 내용을 서두에 던지고, 설명하고, 요약하는 구성을 사용하기 때문에 머리에 잘 남는다.</p>
<p>ps. 정작 이 책을 읽었으면 하는 사람들은 안 읽을 거 같음. (…)</p>
<ol class="footnotes"><li id="footnote_0_2860" class="footnote">예제는 C++, JavaScript, Python, Java(?) 위주; 어려운 문법은 안 나옴</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2860/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>회사에서 사용하는 모니터 구성 변경</title>
		<link>http://rein.kr/blog/archives/2856</link>
		<comments>http://rein.kr/blog/archives/2856#comments</comments>
		<pubDate>Wed, 18 Jan 2012 12:32:48 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[일상]]></category>
		<category><![CDATA[회사]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2856</guid>
		<description><![CDATA[오늘 오후까지는 회사에서 삼성 모니터 3대 (TN 23&#34;, 2048 by 1152 두 대; TN 17&#34;, 1280 by 1024 한 대) 구성으로 사용하고 있었다. 개발 머신에서 17&#34; + 23&#34;을 쓰고, 인터넷 연결된 머신에서 23&#34;를 한 대 쓰는 구성으로 했다. 사실 이런 구성이 된 건 예전에 Dell UltraSharp U2407 을 얻어서 사용했는데, 이게 맛이 가면서 삼성 SyncMaster [...]]]></description>
			<content:encoded><![CDATA[<p>오늘 오후까지는 회사에서 삼성 모니터 3대 (TN 23&quot;, 2048 by 1152 두 대; TN 17&quot;, 1280 by 1024 한 대) 구성으로 사용하고 있었다. 개발 머신에서 17&quot; + 23&quot;을 쓰고, 인터넷 연결된 머신에서 23&quot;를 한 대 쓰는 구성으로 했다.</p>
<p>사실 이런 구성이 된 건 예전에 Dell UltraSharp U2407 을 얻어서 사용했는데, 이게 맛이 가면서 삼성 SyncMaster 2343BWX (TN 패널) 을 받게 되어서 임. 이거 하나랑 17” 두 개 쓰다가 17” 하나를 동일한 23”로 바꿔서 현재까지의 상태가 된 것. </p>
<p>프로그래머는 막눈이라고 – 적어도 일단 나는 – 그냥 저냥 쓸만한 모니터 같긴 한데, 이젠 눈이 나빠서인지 삼성 2343BWX가지곤 오래 집중하기가 힘들더라. 그런 의미에서 삼성 SyncMaster 2343 BWX 의 가장 큰(?) 단점: 도트 피치가 작다 – 사람에 따라선 선호할 수도 있음; 여기서는 VS 2010 전체 화면 모드로, 2048 by 1152 해상도에서 16pt 폰트를 쓰면 한 화면에 두 개의 에디터 창(80 column)을 볼 수 있음. 하지만 도트 피치 문제로 10pt~14pt 정도에선 집중하기 힘들더라; 두통이 찾아오는 지라(…).</p>
<p>게다가 해상도 가지고 계산해 보면 알겠지만 16:9 비율이다. 이것도 취향문제일진 모르겠지만, 에디터에서 위 아래 길이가 짧은 건 꽤나 불편하다. 그렇다고 이 크기의 모니터를 회전 시켜서 쓰는 것도 좀;;; (TN 패널 자른 방향 때문인지 세로로 쓰면 색 왜곡도 심하다)</p>
<p>그래서 새해 지름으로 – 그러니까 내 돈으로 – Dell UltraSharp U2412M (이하 U2412M)두 대를 질렀다. 이걸로 17&quot; 한 대와 23&quot; 한 대를 대체했음. 개발 머신 용 설정으로 이 두 대를 수평으로 이어서 쓰게 되었다. 대략 다음과 같은 구성:</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="dell-dual" border="0" alt="dell-dual" src="http://rein.kr/blog/wp-content/uploads/2012/01/dell-dual.jpg" width="640" height="366" /></p>
<p>해상도는 1920 by 1200으로 줄어들었지만, 폰트 크기는 15pt로 줄여서, 수직으로 더 많은 내용을 볼 수 있는 건 내 취향임. 폰트 크기를 줄여도 실제 글자 크기는 거의 동일하다. (도트 피치 0.249 vs. 0.270) 비슷한 이유로, 수평 해상도는 살짝 줄어들었지만 폰트 크기 역시 줄어서 수평 공간도 80 column 기준으로 오히려 약간 남게 바뀐다.<sup>[<a href="http://rein.kr/blog/archives/2856#footnote_0_2856" id="identifier_0_2856" class="footnote-link footnote-identifier-link" title="오른쪽 모니터에 떠 있는 에디터의 색상 테마는 solarized임. 흰색이 아니다">1</a>]</sup> </p>
<p><em>게다가 이 모니터는 의자 위치에 따라 색이 바뀌진 않아…</em></p>
<p>그래서 Samsung SyncMaster 2343 BWX 랑 Dell U2412M을 비교한다면 난 전적으로 후자의 손을 들어주겠음 – 적어도 내가 프로그래머인 한은 말이다… 어떤 의미로 비교대상은 고가 모델인 Dell U2410 쪽인데, 집에서 쓰는 이 모델이랑 비교하자면 이렇다:</p>
<ul>
<li>입력 단자 수가 적다. DVI도 하나 뿐이고, VGA, DP 로 끝. </li>
<li>SD 카드 리더도 없고… </li>
<li>설정 버튼도 훨씬 촌스럽고(…) 불편하다. </li>
<li>색 재현 율이 다르다고 하지만 이건 내 능력 밖의 얘기라 (먼산) </li>
<li>더 가볍다 (포장 기준으로 거의 3Kg 차이) </li>
</ul>
<p>집에서 쓴다면 XBox360도 연결하고 쓴다거나 하고, 편의 기능 (DVI가 2개라거나; SD 카드 읽기라거나) 도 있어서 굳이 U2412M을 사진 않겠지만, 두 대 사서 구성할 생각이면 U2412M도 훌륭하다고 생각한다. (일단 가격이 절반임; 양쪽 다 IPS 패널임에도…)    <br />물론 금전적인 여유가 있다면 U2410 두 대 구성도 가능하지만, 그 돈이면 그냥 U3011 사세요 (…). 얘는 HDMI도 2개임…</p>
<p>&#160;</p>
<p>PS. 델 4:3 모니터인 UltraSharp 2007FP는 왜 이렇게 비싼가요? 36만이라니 이거면 U2412M 사고도 돈이 남는다고…</p>
<ol class="footnotes"><li id="footnote_0_2856" class="footnote">오른쪽 모니터에 떠 있는 에디터의 색상 테마는 solarized임. 흰색이 아니다</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2856/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>위키백과의 BMP페이지에서&#8230;</title>
		<link>http://rein.kr/blog/archives/2850</link>
		<comments>http://rein.kr/blog/archives/2850#comments</comments>
		<pubDate>Sat, 31 Dec 2011 23:10:15 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[다국어]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2850</guid>
		<description><![CDATA[Basic Multilingual Plane 페이지를 보다가 나온 대목: Sometimes, the terms “astral plane” and “astral characters” are used informally to refer to the planes above the Basic Multilingual Plane (planes 1–16) and their characters. (강조는 내가 넣은 것) 아스트랄 플레인이라니!! 사실 슬레이어즈는 유니코드 문자셋의 앞쪽 코드 포인트들이 뒷쪽 코드 포인트(아스트랄 플레인)를 사용한 암투인 것.]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Basic_Multilingual_Plane">Basic Multilingual Plane</a> 페이지를 보다가 나온 대목:</p>
<blockquote><p>Sometimes, the terms <strong>“astral plane”</strong> and “astral characters” are used informally to refer to the planes above the Basic Multilingual Plane (planes 1–16) and their characters.</p></blockquote>
<p>(강조는 내가 넣은 것)</p>
<p>아스트랄 플레인이라니!! <del>사실 슬레이어즈는 유니코드 문자셋의 앞쪽 코드 포인트들이 뒷쪽 코드 포인트(아스트랄 플레인)를 사용한 암투인 것. </del></p>
]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2850/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>2011, 내 프로그래밍 언어는&#8230;</title>
		<link>http://rein.kr/blog/archives/2843</link>
		<comments>http://rein.kr/blog/archives/2843#comments</comments>
		<pubDate>Sat, 31 Dec 2011 11:35:13 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2843</guid>
		<description><![CDATA[twitter에 #code2011 에 덧붙여 글 하나 쓰기. 2011년에 주로 사용한 언어는, C++ Python C# JavaScript SQL Lua Go 순으로 쓴 것 같다. (트윗에는 Lua를 못 적었음&#8230;) C++ 우선 주 언어로 쓴 C++. 내년에 공개될 모 서버를 작성했다. 사내 테스트까지 나간 것 중 C++11을 사용한 것으론 처음일듯.그리고 옮겨간 팀의 서버 역시 C++로 작성하고 있다. 크래시 보고 [...]]]></description>
			<content:encoded><![CDATA[<p>twitter에 #code2011 에 덧붙여 글 하나 쓰기. 2011년에 주로 사용한 언어는,</p>
<ul>
<li>C++</li>
<li>Python</li>
<li>C#</li>
<li>JavaScript</li>
<li>SQL</li>
<li>Lua</li>
<li>Go</li>
</ul>
<div>순으로 쓴 것 같다. (트윗에는 Lua를 못 적었음&#8230;)</div>
<h2>C++</h2>
<p>우선 주 언어로 쓴 C++. 내년에 공개될 모 서버를 작성했다. 사내 테스트까지 나간 것 중 C++11을 사용한 것으론 처음일듯.<br />그리고 옮겨간 팀의 서버 역시 C++로 작성하고 있다. 크래시 보고 도구도 밑 단은 C++&#8230;</p>
<p>내가 주목한 특징을 꼽자면,</p>
<ul>
<li>바위에 끌로 새기는 것 같이 작업함 &#8211; 집중해서 빡쎄게;</li>
<li>lambda로 이전에 boost 쓰는 걸 대체 &#8211; C++11 만세!(&#8230;)</li>
<li>괜찮은 성능 &#8211; 내가 사용하는 모든 언어 중 가장 월등한 성능을 자랑한다</li>
<li>Bare metal 위에서 돈다 (위랑 같은 의미?)</li>
<li>원하는 수준만큼 저 수준에서, 원하는 만큼 세밀하게 제어할 수 있다</li>
</ul>
<div>그래서 이걸로 여전히 게임 서버를 짜고 있는듯&#8230;</div>
<div> </div>
<h2>Python</h2>
<p>팀 내의 코드 생성기나 대부분의 스크립트는 python으로 작성한다. 올해에는 대략,</p>
<ul>
<li>데이터 변환 도구; .xls -&gt; sqlite -&gt; (C++ internal form) 으로 몇 가지 데이터를 옮겼는데, 이 중 첫 단계는 모두 python에서 해결</li>
<li>크래시 덤프 분석 및 집계 기능. 크래시 덤프를  cdb 수준에서 분석하면 이를 토대로 다른 덤프들과 비교하고, 이에 대해서 웹에서 볼 수 있게 했다</li>
<li>덤프 수집 (web)</li>
<li>크래시 덤프 뷰어 (web)</li>
<li>빌드 도구나 덤프 관련 툴에서 메일 생성 / 알림 기능</li>
</ul>
<p>에서 python을 주로 썼다. 물론 예전부터 쓰던 코드 생성기, 빌드 보조 도구에도 python을 쓰고 있다.</p>
<p>&#8230;덧붙이자면 요즘 .svg를 python으로 만드는 뻘짓을 했다. 근데 생각해보니 python-cairo를 쓰는 게 더 간단하잖아?;;;</p>
<p>&nbsp;</p>
<h2>C#</h2>
<p>연초에 파일 전송 도구를 하나 짜야 했다. 원래 생각했던 건 python 기반으로 빨리 짜고 딴거 하고 놀자(&#8230;)였는데, </p>
<blockquote><p>이거 누가 유지 보수 하냐</p>
</blockquote>
<p>라는 태클에 물건너 갔음. 흑흑.</p>
<p>그래서 실 서비스에서 써본적(&#8230;)도 없는 C#으로 짰음. 사실 태클건 사람들은 태클 걸면 C++로 짤 거라고 생각했다고&#8230;<br />애매하게 편하고, 애매한 수준까지만 제어할 수 있어서 개인적으로 불만이 좀 많았음. 내가 python을 안 쓴다면 모를까 Orz. </p>
<p>누가 비슷한거 시키면 그땐 정말 python 쓸 테다&#8230; 일단 저거 linux에서 옮겨서 쓸 생각을 하니 눈 앞이 캄캄하기도 하고 &#8212; 누가 Mono 관련 조언 좀&#8230;</p>
<p>&nbsp;</p>
<h2>JavaScript</h2>
<p>까놓고 말하면 js에는 완전 초보임. 그래서 python쪽에서 js를 쓰긴 했는데, 크롬에서만 돌길래(&#8230;) 포기하고 jQuery로 전부 옮겼다. JavaScript를 썼다기 보단 jQuery를 쓴 느낌이지만 (&#8230;).</p>
<p>CouchDB에서 map-reduce 용 언어로 js를 쓰긴하지만, 이건 그렇게까지 복잡하게 활용한게 없으니 좀 애매하다. 따지고 보면 올해는 js보다 json을 더 많이 본 것도 같다(운다).</p>
<p>올해 얻은 건 jQuery를 좀 더 익숙하게 쓰게 되었다 정도?</p>
<p>&nbsp;</p>
<h2>SQL</h2>
<p>ORM하나 제대로 쓰고 싶었습니다만 꿈도 희망도 없어; 그냥 python위에서 클래스 수준으로 포장해서 하단의 데이터 스토어로만 쓴 듯.<br />위안이라면 MySQL / CouchDB를 선택해서 쓸 수 있게 만들었다 정도지만; </p>
<h2>Lua</h2>
<p>팀 내에서 사용하는 서버 용 부하 테스트 툴은 (NDC에서 ipkn이 발표한 내용은 <a href="http://ipkn.upnl.org/ndc.html">http://ipkn.upnl.org/ndc.html</a> 을 참조) lua를 스크립트 언어로 쓴다.<br />그런 의미에서랑, 몇 가지 도구에서 lua를 썼다. 이쪽에선 내가 발전이 전혀 없는듯&#8230; </p>
<h2>Go</h2>
<p>연초에는 좀 만졌지만 &#8212; 위에서 C#/Python으로 헀던 일 중 일부는 원래 Go로 하려던 건데 &#8212; 그 이후엔 망했음.<br />과연 내년에는 나의 야망(&#8230;)대로 Go로 돌아가는 서비스를 만들 수 있을까;</p>
<p>일단 올해에는 회사 안에서 / 실제 서비스에서 linux 기반으로 해도 된다는 건 확인했으니, 내년을 기약합시다(&#8230;). </p>
<p>&nbsp;</p>
<p><strong>요약:</strong></p>
<ul>
<li>C++/python을 여전히 많이 쓰고 있다.</li>
<li>C#은 안 편했음; 내년에는 아마 다른 선택을 할 듯.</li>
<li>웹 질(&#8230;)로 JavaScript/SQL을 좀 만졌다. 내년엔 기약 없음&#8230;</li>
<li>Go. linux 기반 서비스를 좀 더 해도 될 것 같으니 내년을 기약 </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2843/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>디스크 공간이 부족하다</title>
		<link>http://rein.kr/blog/archives/2839</link>
		<comments>http://rein.kr/blog/archives/2839#comments</comments>
		<pubDate>Mon, 26 Dec 2011 14:33:18 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[회사]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2839</guid>
		<description><![CDATA[작년 가을에, Google BreakPad를 써서 크래시 덤프를 보낼 수 있겠다고 썼다. 여하튼 이걸 위해 간단한 웹 서비스를 만들었었다. 팀 내에서 이걸 쓰다가 좀 확장해서 (…) 같은 스튜디오 내의 다른 팀에도 약간 적용했음. 대략 매일 매일 얼마나 많은 덤프가 나오는지, 가장 많이 발생한 원인 (WinDbg의 버킷 비슷한 것) 은 뭔지, 같은 원인으로 죽은 덤프는 어떤지, 각각의 [...]]]></description>
			<content:encoded><![CDATA[<p>작년 가을에, Google BreakPad를 써서 크래시 덤프를 보낼 수 있겠다고 썼다. 여하튼 이걸 위해 간단한 웹 서비스를 만들었었다. 팀 내에서 이걸 쓰다가 좀 확장해서 (…) 같은 스튜디오 내의 다른 팀에도 약간 적용했음. 대략</p>
<ul>
<li>매일 매일 얼마나 많은 덤프가 나오는지,</li>
<li>가장 많이 발생한 원인 (WinDbg의 버킷 비슷한 것) 은 뭔지,</li>
<li>같은 원인으로 죽은 덤프는 어떤지,</li>
<li>각각의 덤프 별 콜 스택 플랫폼 정보 (OS 버전, 각 모듈 별 버전) 는 어떤지</li>
</ul>
<p>가 나오는 페이지를 만들었다.<sup>[<a href="http://rein.kr/blog/archives/2839#footnote_0_2839" id="identifier_0_2839" class="footnote-link footnote-identifier-link" title="실제 페이지 구현은 회사에서 만든 부분이라 여기서 공개하는 건 무리">1</a>]</sup> 아니 근데 생각지도 못했던 문제를 만났다;</p>
<p>여름에 서버를 설치한 후, 총 3개 팀이 사용하게 했고, 이에 따라 차근차근 크래시 덤프가 쌓여간다. 최근 덤프가 좀 무섭게 쌓여서 (…) 디스크 사용량을 추적해봤더니 대략 이런 결과가; (8월 중순 쯤 서버를 리셋했고, 그 이후의 디스크 사용량)</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="cr3" src="http://rein.kr/blog/wp-content/uploads/2011/12/cr3.jpg" alt="cr3" width="637" height="343" border="0" /></p>
<p>팀 + 1개 팀 상태에서는 참 완만하게 올라갔는데 (…), 좀 덩치 큰 다른 팀까지 적용했더니 순식간에 하드디스크가 차고 있다; 게다가 기울기가 더 올라가서, 현재 Doomsday는 다음 달 중순까지 당겨진 상태 Orz. 개발 중인 프로그램에 적용한 것이고, 개발 팀만 접근 가능한 위치라 전체 메모리 덤프를 받게 했더니 정말 저장 공간을 왕창 잡아 먹더라; 이건 내 예상 실패라고 밖엔;</p>
<p>HDD 가격 올랐다고 구매 신청해도 안 사줄 기세던데 이를 어찌 해결하는가; 일단 같은 콜 스택 + 같은 모듈 (이름; 버전; 체크 섬) 인 것들 지워서 지난 주 후반에 40 GiB 쯤 확보했는데, 그럼에도 불구하고 (…) 이미 216 GiB 쯤 쓴 상태. 사진은 2주 전 상태임.</p>
<p>&nbsp;</p>
<p>저 서버를 설정할 때만 해도, 연말까지 300 GiB 정도는 넉넉하리라 생각했다<sup>[<a href="http://rein.kr/blog/archives/2839#footnote_1_2839" id="identifier_1_2839" class="footnote-link footnote-identifier-link" title="즉, 한 달에 50 GiB 이상은 안 나오겠지 정도로&hellip;">2</a>]</sup> 하다못해 HDD 하나 추가하는 건 별 큰 일 아니라고 생각했다. 하지만 태국 홍수 덕에 구매 팀에서 HDD 가격 비싸다고 장비도 안 사주는 마당이니, 망한 상황인 듯. 아마 1월부턴 90일 정도만 남기고 – 어차피 개발 중인 프로그램들 용으로 덤프 받는 서버라 버전 정보가 휙휙 올라가는지라; – 다 지워버리던가 해야.</p>
<p>사실 내가 궁금한 건 이거다; <strong>과거의 덤프가 남아있다면 뭐가 좋을까?</strong> 그냥 간단한 텍스트 정보 – 크래시 한 상황에 대한 OS 정보, 콜 스택 정도가 있다면 충분할까? 아니면 전체 메모리 덤프가 다 있다면 오~래 가는 버그를 좀 더 쉽게 잡을 수 있을까?</p>
<p><em>원래 목적이던 &#8220;자주 발생하는 버그를 빨리 잡자&#8221;</em>는 어느 정도 되어가는 것 같은데 – 일주일쯤 피크 치는 버그는 대충 잘 잡히는 듯? – <strong>오래된 버그를 잡는데 도움이 되려면 어느 정도 범위를 가지고 있어야 할지</strong>;;;</p>
<p>PS. iPhone 4 렌즈 수차 정말 망이네; 화면 위 아래 수평선의 기울기를 비교해보면 Orz (…).</p>
<ol class="footnotes"><li id="footnote_0_2839" class="footnote">실제 페이지 구현은 <em>회사에서 만든 부분이라</em> 여기서 공개하는 건 무리</li><li id="footnote_1_2839" class="footnote">즉, 한 달에 50 GiB 이상은 안 나오겠지 정도로…</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2839/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Windows 서비스를 시작하지 못하는 문제 디버깅</title>
		<link>http://rein.kr/blog/archives/2835</link>
		<comments>http://rein.kr/blog/archives/2835#comments</comments>
		<pubDate>Wed, 14 Dec 2011 12:54:17 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2835</guid>
		<description><![CDATA[연초에 .NET 4.0으로 작성한 Windows 서비스가 하나 있다. 이걸 개발 팀 – 운영 팀 사이에서 쓰고 있는데, 지난 주 목요일에 이게 동작하지 않는다고 연락이 왔다. 그에 해당하는 시점이 &#34;시스템 업데이트를 위해 머신 재 시작 후&#34;라서 그게 문젤까 의심했는데, 문제가 생기도록 변경된 부분이 딱 하나였다. 운영 팀에서 &#34;서비스와 데스크톱 상호 작용 허용&#34; (allow service to interact [...]]]></description>
			<content:encoded><![CDATA[<p>연초에 .NET 4.0으로 작성한 Windows 서비스가 하나 있다. 이걸 개발 팀 – 운영 팀 사이에서 쓰고 있는데, 지난 주 목요일에 이게 동작하지 않는다고 연락이 왔다. 그에 해당하는 시점이 &quot;시스템 업데이트를 위해 머신 재 시작 후&quot;라서 그게 문젤까 의심했는데, 문제가 생기도록 변경된 부분이 딱 하나였다. </p>
<p>운영 팀에서 &quot;서비스와 데스크톱 상호 작용 허용&quot; (allow service to interact with desktop) 설정을 켰음 – 이유는 모르겠지만, 대부분의 개발팀이 이 설정을 요구한다고; 계정은 로컬 시스템 계정 (local administrator) 였고; 여하튼 이 설정이 켜져서 문제가 된 부분은 대략 이렇다:</p>
<ul>
<li>개발 편의성을 도모하고자, 1개의 바이너리가 서비스 혹은 콘솔 창 모드로 동작함</li>
<li>이 두 가지를 Environment.UserInteractive 값을 가지고 구분했다</li>
<li>&quot;서비스와 데스크톱 상호 작용 허용&quot;이 체크되어 있으면, <strong><em>Environment.UserInteractive가 true로 설정된다</em></strong></li>
<li>…그리고 내가 작성한 서비스는 콘솔 창을 띄웠다 (…)</li>
</ul>
<p>Orz.</p>
<p>부연하자면, 서비스는 세션 0에서 실행되기 때문에<sup>[<a href="http://rein.kr/blog/archives/2835#footnote_0_2835" id="identifier_0_2835" class="footnote-link footnote-identifier-link" title="Session 0 isolation 참고">1</a>]</sup> 사용자가 터미널 접속한 경우, &quot;이런 이런 서비스에서 창을 띄우려고 합니다&quot;란 메시지를 받게 된다. 그리고 그런 유저가 없으니 – <em>서비스는 보통 sc </em><a href="file://\\host-name"><em>\\host-name</em></a><em> start blah-blah-service 명령이나 관제 툴로 띄운다 – </em>서비스는 더 진행하지 못하고 사망. 일정 시간 안에 서비스를 시작하지 못하면 서비스 매니저는 그 서비스를 죽여버린다(…).</p>
<p>결과:</p>
<ul>
<li>일단 그 날 저 체크 박스 꺼버리는 걸로 문제 해결.</li>
<li>Environment.UserInteractive 말고도 SessionID를 확인하도록 코드 추가. (세션 0이면 서비스로 뜨게)</li>
</ul>
<p>.NET을 잘 모르고 써서 생긴 문제긴 한데, 내가 운영 매뉴얼?을 좀 만들었으면 괜찮았을지도 모르겠다. 으으.</p>
<ol class="footnotes"><li id="footnote_0_2835" class="footnote"><a href="http://msdn.microsoft.com/en-us/library/bb756986.aspx" rel="nofollow">Session 0 isolation</a> 참고</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2835/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python Jinja2</title>
		<link>http://rein.kr/blog/archives/2830</link>
		<comments>http://rein.kr/blog/archives/2830#comments</comments>
		<pubDate>Mon, 05 Dec 2011 14:44:41 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[회사]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2830</guid>
		<description><![CDATA[한 동안 포스팅을 못했다. 그간 있었던 일을 요약하자면, 팀이 바뀌었다 모 게임의 서버를 새로 짜는 작업을 하고 있다 회사에서도 linux 서버를 만지기 시작 첫 번째 일과 두 번째는 사실 한 몸이고; 나머지에 대해서 기록; 저 linux 서버 위에 예전에 짰던 크래시 덤프 수집하는 녀석을 올렸다. Windows + IIS + MSSQL Server + WSGI&#160; (isapi 사용) [...]]]></description>
			<content:encoded><![CDATA[<p>한 동안 포스팅을 못했다. 그간 있었던 일을 요약하자면,</p>
<ul>
<li>팀이 바뀌었다 </li>
<li>모 게임의 서버를 새로 짜는 작업을 하고 있다 </li>
<li>회사에서도 linux 서버를 만지기 시작 </li>
</ul>
<p>첫 번째 일과 두 번째는 사실 한 몸이고; 나머지에 대해서 기록;</p>
<p>저 linux 서버 위에 예전에 짰던 크래시 덤프 수집하는 녀석을 올렸다. Windows + IIS + MSSQL Server + WSGI&#160; (isapi 사용) application 이던 걸 linux + apache2 + MySQL (or CouchDB) + WSGI (mod_wsgi) 로 옮겼다. 실제 서버는 아마 nginx proxying + gunicorn 같은 애를 쓰게 되지 않을까 싶지만;</p>
<p>저기로 옮기면서 페이지도 페이스 리프팅. 원래 좀 중구난방이던 크래시 덤프 보기 페이지에 시간 대 별 보기라거나, 카테고리 기능이라거나, failure bucket id (windbg 얘기) 로 분류하기 등등을 넣었다. 덕분에 거의 0이던 jquery 프로그래밍 경험치가 충전된 듯 (…).    <br />아무래도 이건 혼자 쓸 것만 만들다가 Firefox / Chrome이 아닌 웹 브라우저에서도 동작하게 해서 그런 거지만;</p>
<p>내가 처음 짠 코드의 문제가 CherryPy 에서 html 코드를 직접 토해낸다는 점. 간단한 건 그냥 문자열 혹은 문자열의 list로, 좀 복잡하면 문자열 yield return으로 때웠는데, 코드가 좀 길어지니까 감당이 안되더라. 일단 이걸 내가 계속 진행할 수 있는 처지가 아니라서 – 요약 1 참조 – 다른 프로그래머에게 넘겨주게 생겼는데 얘기하다 나온 게</p>
<ul>
<li>유지 보수가 가능한가? Python을 중점적으로 쓰는 나와 ipkn 말고 유지가 가능한가? </li>
<li>굳이 linux 서버를 쓸 이유가? </li>
</ul>
<p>이 두 가지. 그래서 목표가 &quot;다른 프로그래머가 적응하는 시간을 줄이자&quot;, &quot;문서를 최소한만 쓰자&quot;로&#160; 데, 이건 대략 만족한 듯. 만약 이걸 asp.net 으로 옮긴다고 해도 로직 / 화면 두 가지만 분해되어 있으면 어떻게 될 거라고 믿기로 하고 (하략). 매우 저 수준으로(…) html을 직접 토해내던 WSGI application을 좀 분해하기로 했다. ipkn의 조언에 따라 – 그리고 손에 든 것만으로 문제를 푸는 나의 나쁜 습관을 가까스로 극복하고 – 템플릿 언어를 하나 골라서 써 보기로 했다. 그래서 flask 쓸 때 잠시 봤던 신사 (jinja2; <a href="http://jinja.pocoo.org/"><u><font color="#0066cc">http://jinja.pocoo.org/</font></u></a> )를 써봤다.. </p>
<p>홈페이지의 첫 예제를 여기 가져와보자면,</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:2EC9848E-067D-4e79-BAB7-06CA927DB962:30c286b5-7c2d-41c9-83c6-c1423ba09acf" class="wlWriterEditableSmartContent">
<div style="font-family:consolas,lucida console,courier,monospace">
<span style="color:#BC7A00">{%</span>&#160;<span style="color:#008000"><b>extends</b></span>&#160;<span style="color:#BA2121">&#8220;layout.html&#8221;</span>&#160;<span style="color:#BC7A00">%}</span><br />
<span style="color:#BC7A00">{%</span>&#160;<span style="color:#008000"><b>block</b></span>&#160;<span style="color:#19177C">body</span>&#160;<span style="color:#BC7A00">%}</span><br />
&#160;&#160;<span style="color:#008000"><b>&lt;ul&gt;</b></span><br />
&#160;&#160;<span style="color:#BC7A00">{%</span>&#160;<span style="color:#008000"><b>for</b></span>&#160;<span style="color:#19177C">user</span>&#160;<span style="color:#008000"><b>in</b></span>&#160;<span style="color:#19177C">users</span>&#160;<span style="color:#BC7A00">%}</span><br />
&#160;&#160;&#160;&#160;<span style="color:#008000"><b>&lt;li&gt;&lt;a</b></span>&#160;<span style="color:#7D9029">href=</span><span style="color:#BA2121">&#8220;</span><span style="color:#BC7A00">{{</span>&#160;<span style="color:#19177C">user.url</span>&#160;<span style="color:#BC7A00">}}</span><span style="color:#BA2121">&#8220;</span><span style="color:#008000"><b>&gt;</b></span><span style="color:#BC7A00">{{</span>&#160;<span style="color:#19177C">user.username</span>&#160;<span style="color:#BC7A00">}}</span><span style="color:#008000"><b>&lt;/a&gt;&lt;/li&gt;</b></span><br />
&#160;&#160;<span style="color:#BC7A00">{%</span>&#160;<span style="color:#008000"><b>endfor</b></span>&#160;<span style="color:#BC7A00">%}</span><br />
&#160;&#160;<span style="color:#008000"><b>&lt;/ul&gt;</b></span><br />
<span style="color:#BC7A00">{%</span>&#160;<span style="color:#008000"><b>endblock</b></span>&#160;<span style="color:#BC7A00">%}</span>
</div>
</div>
<p>&#160;</p>
<p>정도인데; layout.html의 내용을 상속하고, (아마도 이중 일부인) body 블록을 override하는 예제. {{ }} 안의 내용은 print, {% %} 안은 제어문이 들어간다. 대략 있을 건 다 있음. 제대로 만든 PHP 같다고 누가 얘기했는데 누구였는지 까먹었다. 참고로 저 for 문 마지막에 : 찍어도 된다 (…). 레이아웃 코드에 제어문이 있는 걸 싫어하는 사람도 있지만 난 PHP도 싫어하지 않는 성향이라; 이 정도면 오히려 적절한 조합이 아닌가 싶다.</p>
<p>html 템플릿 파일 쪽만 봐도 내용을 어느 정도 알 수 있고, 중복 제거도 쉽고, python 쪽에서 미리 데이터를 구워(?)두기도 편한 편. 극단적으로 말하면 2000년 즈음의 VBA의 생산성을 다른 형태로 살렸다고도 할 수 있다.<sup>[<a href="http://rein.kr/blog/archives/2830#footnote_0_2830" id="identifier_0_2830" class="footnote-link footnote-identifier-link" title="DB &ndash;&amp;gt; UI 로 넘기는 형태의 프로그래밍에서 작업할게 거의 없다">1</a>]</sup> </p>
<p>경험담:</p>
<ul>
<li>python 코드 크기 절반으로. 기능도 추가했는데! (…) </li>
<li>Jinja의 템플릿 언어가 python과 비슷하다. 적응하는데 5분이면 충분함. </li>
<li>페이지 레이아웃을 python 함수로 표현하는 건 무모했다. 적당한 hook을 만들기가 영; Jinja2의 템플릿 페이지 상속 기능으로 다 대체하는 편이 편했음. </li>
<li>vim 용 문법 강조 파일도 제공함. </li>
<li>JSON 응답도 템플릿 처리가 가능; 텍스트 형태의 응답이면 대부분 쉽게 될듯함. </li>
</ul>
<p>라서 매우 편하게 작업했다. 팀 동료 몇 명에게 보여줬는데, 반응도 나쁘지 않았음.    <br />내가 전에 작업했던 얘길 했더니 팀 동료 한 명은 이렇게 표현했음:</p>
<blockquote><p>&quot;이 생퀴 python으로 CGI 프로그래밍하지 마라&quot;</p>
</blockquote>
<p>Orz. 하..하지만 나 C로 CGI짜본 남잔데! (어이)</p>
<p>요약(?)</p>
<ul>
<li>새 도구 좀 빨리 씁시다 </li>
<li>머리가 나쁘면 손발이 고생 </li>
</ul>
<ol class="footnotes"><li id="footnote_0_2830" class="footnote">DB –&gt; UI 로 넘기는 형태의 프로그래밍에서 작업할게 거의 없다</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2830/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VS 2010 소스 서버 설정과 홈 디렉터리 문제</title>
		<link>http://rein.kr/blog/archives/2822</link>
		<comments>http://rein.kr/blog/archives/2822#comments</comments>
		<pubDate>Thu, 27 Oct 2011 14:53:56 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2822</guid>
		<description><![CDATA[최근에 받은 머신에서 크래시 덤프 디버깅 하다 겪은 일. VisualStudio 2010에서 포스트모텀 디버깅[1] 할 때 심볼 서버, 소스 서버를 이용해서 디버깅하는데, 얘가 소스 서버에서 파일을 안 가져온다. 그래서 내가 추적한 순서 (&#8230;) svn.exe 가 있는가 &#8211; 없으면 svn.exe cat &#8230; 이 실행 안될테니 심볼 서버 접근이 잘 되는가 &#8211; 안 그러면 .pdb 에서 소스 리스팅을 [...]]]></description>
			<content:encoded><![CDATA[<p>최근에 받은 머신에서 크래시 덤프 디버깅 하다 겪은 일.</p>
<p>VisualStudio 2010에서 포스트모텀 디버깅<sup>[<a href="http://rein.kr/blog/archives/2822#footnote_0_2822" id="identifier_0_2822" class="footnote-link footnote-identifier-link" title="혹은 사후 디버깅. 크래시 덤프를 가지고 진행하는 디버깅">1</a>]</sup> 할 때 심볼 서버, 소스 서버를 이용해서 디버깅하는데, 얘가 소스 서버에서 파일을 안 가져온다. 그래서 내가 추적한 순서 (&#8230;)</p>
<p>svn.exe 가 있는가 &#8211; 없으면 svn.exe cat &#8230; 이 실행 안될테니</p>
<p>심볼 서버 접근이 잘 되는가 &#8211; 안 그러면 .pdb 에서 소스 리스팅을 못할테니</p>
<p>.pdb에 소스 정보가 없는가 &#8211; &#8230;없으면 못 찾아올테니</p>
<p>&#8230;여기까지 했으니 전부 아니었음. .pdb도 잘 가져오고, 거기에 소스 인덱싱된 것도 있고, <em>거의</em> 똑같은 설정의 다른 머신에선 디버깅 잘 되더라고 Orz</p>
<p>&nbsp;</p>
<p><em>관리자 모드</em>로 VS 2010을 재실행하고 나니 원인이 보이더라. 유저 홈 디렉터리를 d:\Users로 옮겼는데, 소스 서버 데이터를 c:\Users\rein\AppData\&#8230; 에 저장하는 것. 이전에는 일반 유저 권한이라 c:\Users 밑에 뭔가 못 만들어서 svn.exe cat이 실패한 모양. 이유는 모르겠지만, VS2010은 저 설정이 거의 하드 코딩되어 있거나, 홈 디렉터리 위치를 c:\에서 d:\로 바꾸려고 레지스트리에서 바꾼게 불충분한 모양.</p>
<p>좀 더 이유를 아시는 분은 설명 좀 (굽신굽신)</p>
<ol class="footnotes"><li id="footnote_0_2822" class="footnote">혹은 사후 디버깅. 크래시 덤프를 가지고 진행하는 디버깅</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2822/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rest in peace, dmr</title>
		<link>http://rein.kr/blog/archives/2820</link>
		<comments>http://rein.kr/blog/archives/2820#comments</comments>
		<pubDate>Thu, 13 Oct 2011 12:11:02 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2820</guid>
		<description><![CDATA[Dennies MacAlistair Ritche (dmr) 사망. (실제 날짜는10/8일이라 한다) 여기서 그의 명복을 빌어본다. 지난 주의 스티브 잡스 사망도 슬픈 일이지만, 개인적으로는 데니스 리치의 사망이 더 임팩트 큰 일. 간단히 말해서, 우리가 현재 쓰고 있는 SW의 가장 밑 바닥을 지탱하는 기술과 개념이 데니스 리치 손에서 태어났다. 시스템 프로그래밍의 가장 널리 쓰이는 C 언어의 창시자다; 우리가 쓰는 linux, [...]]]></description>
			<content:encoded><![CDATA[<p>Dennies MacAlistair Ritche (dmr) 사망. (실제 날짜는10/8일이라 한다) </p>
<p>여기서 그의 명복을 빌어본다.</p>
<p>지난 주의 스티브 잡스 사망도 슬픈 일이지만, 개인적으로는 데니스 리치의 사망이 더 임팩트 큰 일. </p>
<p>간단히 말해서, 우리가 현재 쓰고 있는 SW의 가장 밑 바닥을 지탱하는 기술과 개념이 데니스 리치 손에서 태어났다.</p>
<ul>
<li>시스템 프로그래밍의 가장 널리 쓰이는 C 언어의 창시자다; 우리가 쓰는 linux, Windows는(아마?)는 C 기반의 커널로 되어 있다. 대표적인 웹 서버 (아파치나 nginx) 역시 C로 만들었다. 그리고 이 C로 Unix를 재 작성(!)해서 `앞으로 OS를 어떻게 만드느냐&#8217;에 관해선 사실 상 결론을 내려버렸다.<sup>[<a href="http://rein.kr/blog/archives/2820#footnote_0_2820" id="identifier_0_2820" class="footnote-link footnote-identifier-link" title="더불어 이 두 업적으로 1983년에 켄 톰슨과 함께 튜링 어워드를 받았다">1</a>]</sup> </li>
<li>내가 가장 사랑하는 *nix의 일관성 – 간단한 텍스트 기반 I/O의 프로그램을 연결해주는 파이프.</li>
<li>현대적인 개념의 C-runtime IO 방식을 고안.</li>
<li>내가 읽어 본 가장 간결하고 군더더기 없는 프로그래밍 책 – The C Programming Language의 저자.</li>
</ul>
<p>좀 더 쓰자니 그냥 여길 링크: <a href="http://j.mearie.org/post/11385959754/rip-dennis-ritchie">http://j.mearie.org/post/11385959754/rip-dennis-ritchie</a> 에 더 잘 정리되어 있다.</p>
<ol class="footnotes"><li id="footnote_0_2820" class="footnote">더불어 이 두 업적으로 1983년에 켄 톰슨과 함께 튜링 어워드를 받았다</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2820/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>머신 교체: 드디어 새 머신 오다</title>
		<link>http://rein.kr/blog/archives/2814</link>
		<comments>http://rein.kr/blog/archives/2814#comments</comments>
		<pubDate>Wed, 12 Oct 2011 11:37:00 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[회사]]></category>
		<category><![CDATA[잡담]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2814</guid>
		<description><![CDATA[그 동안 징징대던 구 머신을 대체하기 위한 새 머신 도착. 이미 어제 (10/11) 의 일. 여하튼 밑은 스펙. ( )안은 Windows Experience Index에 찍힌 값. i7 2600 (7.6) intel 80G ssd (320 series) + sata hdd 500G (7.7) ddr3 1333MHz 4G (4G * 4 따로 달고 기존 달린 건 딴 머신으로) (7.6) nVidia 450 GTS [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rein.kr/blog/archives/2797">그 동안 징징대던 구 머신을</a> 대체하기 위한 새 머신 도착. 이미 어제 (10/11) 의 일. 여하튼 밑은 스펙. ( )안은 Windows Experience Index에 찍힌 값.</p>
<ul>
<li>i7 2600 (7.6) </li>
<li>intel 80G ssd (320 series) + sata hdd 500G (7.7) </li>
<li>ddr3 1333MHz 4G (4G * 4 따로 달고 기존 달린 건 딴 머신으로) (7.6) </li>
<li>nVidia 450 GTS (7.2) </li>
</ul>
<p>우왕ㅋ굳ㅋ. 여기에 ㅊㅊㅅ 님이 &quot;256G SSD + GTX 560ti&quot; 주는 곳 있음! 이라고 츳코미를 날렸지만 뭐(…).</p>
<p>어제는 32 bits OS가 깔린 채로 와서, 밀고 새 OS 깔고 퇴근. 이 아래는 오늘의 삽질기.</p>
<p>드라이버 디스크를 집에서 만들어왔으나, 정작 이걸 묶어서 (.tar.gz) 가져왔다가 망함. gzip은 .NET의 System.IO.compression.GZipStream 으로 풀었으나 tar가 Orz. 여하튼 이건 꼼수로 넘어가서 각종 드라이버 설치. (여기까지 대략 오전 10시)</p>
<p>(사이에 모종의 사내 서버 문제가 풀리는 걸 확인…)</p>
<p>intel DP67BA 보드가 PS/2 슬롯이 없는지라, 이걸 위한 젠더 케이블을 링코 코엑스 점 가서 사와야 했음. 어차피 연필도 사야 하는 상황이라 겸사겸사 (…). 11시가 넘어서 네트워크에 연결 완료. (mac address 등록까지 걸리는 시간이…)</p>
<p>본격적으로 프로그램 설치 시작. 대략 VisualStudio 3종 세트<sup>[<a href="http://rein.kr/blog/archives/2814#footnote_0_2814" id="identifier_0_2814" class="footnote-link footnote-identifier-link" title="VS 2005, 2008, 2010; 그리고 각각에 속한 SP와 일부 hotfix 설치">1</a>]</sup> – 이게 바로 라이브러리 개발자의 위용 – 와 기본적인 개발 도구를 설치 했음. 대략,</p>
<ul>
<li>소스 컨트롤 3종 셋: p4, svn, git </li>
<li>viemu / gvim </li>
<li>perl + Debugging Tools for Windows </li>
<li>python 및 내가 쓰는 패키지 일부 </li>
<li>7-zip </li>
<li>putty </li>
<li>Google Chrome </li>
<li>mRemote </li>
</ul>
<p>정도를 설치. 여기서 p4, git, vim, putty, mRemote는 설정 파일과 registry도 이전;</p>
<p>점심 쯤 추가 DRAM 도착. 설치하고 ram-disk 4G 할당. 이제 스크래치는 전부 여기로<sup>[<a href="http://rein.kr/blog/archives/2814#footnote_1_2814" id="identifier_1_2814" class="footnote-link footnote-identifier-link" title="TEMP, TMP, Windows\Temp, Windows\tmp, 그리고 VS의 C++ 메타 파일도 전부 이전">2</a>]</sup> 옮기게 설정. 근데 이 때 케이스 외곽에 꽂혀있는 드라이버 디스크 발견. 아침엔 무슨 삽질을 한 것인가…</p>
<p>소스 저장소에서 파일을 못 가져와서 뭐가 문제일까 고민했는데, 대략 회사 보안 정책 / 보안 도구 문제 ;; 이거 해결하고 마지막으로 (대략 오후 3시?) 설치된 프로그램 테스트. C# 프로젝트들은 빌드 되는데, C++ 프로젝트는 빌드가 안되네? CL.exe 실행하는 MSBuild task들이 예외를 던지더라…확인 결과 TEMP, TMP는 드라이브 루트면 안됨; MS 파일 시스템의 권한 설정 상 루트가 특이해서 생기는 문제인 듯. (thanx to Azyu)</p>
<p>OS 설치할 때 USB 키보드를 생각 없이 꽂아서 했더니 키보드 타입이 101key, type 3가 아닌 101 key type 1으로 잡혀버림; 망했다를 외치고 레지스트리를 고쳤다 Orz. 평소 하던 데로 ctrl, win key도 caps lock, ctrl 자리로 보냈음.</p>
<p>여하튼 이렇게 하루가 끝. 4시부터 대략 2 시간 동안은 크래시 덤프 디버깅하는 운명에 처하긴 했지만 말이다…</p>
<p>대략 빌드 속도는 프로젝트마다 차이가 있지만 1.5~3배 정도 빨라짐. 스크래치 디렉터리 옮기고 + CRT는 SSD에서 읽고 + CPU 파워가 올라간 덕택인 듯…</p>
<ol class="footnotes"><li id="footnote_0_2814" class="footnote">VS 2005, 2008, 2010; 그리고 각각에 속한 SP와 일부 hotfix 설치</li><li id="footnote_1_2814" class="footnote">TEMP, TMP, Windows\Temp, Windows\tmp, 그리고 VS의 C++ 메타 파일도 전부 이전</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2814/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>머신 교체: 현재 상황</title>
		<link>http://rein.kr/blog/archives/2797</link>
		<comments>http://rein.kr/blog/archives/2797#comments</comments>
		<pubDate>Thu, 22 Sep 2011 10:58:57 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[잡담]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2797</guid>
		<description><![CDATA[어제 `회사에서 컴퓨터 안 바꿔주고 있어서 짜증난다&#8216;라는 글을 썼다. 이 글을 본 분들의 여차저차(&#8230;)로, 팀장 권한으로 새 머신을 신청할 수 있다는 사실을 확인했고, (이를 이용해서) 4. 6년된 머신 대신 새 머신을 하나 받기로 했고 대략 원하는 스펙[1]의 머신을 받게 될 듯 (예정?) 여하튼 대략 이러한 상황이 되었음. 이젠 내 머신에서도 릴리즈 빌드가 할만해질듯. 엄하게 팀장님 [...]]]></description>
			<content:encoded><![CDATA[<p>어제 `<a href="http://rein.kr/blog/archives/2792">회사에서 컴퓨터 안 바꿔주고 있어서 짜증난다</a>&#8216;라는 글을 썼다.<br />
이 글을 본 분들의 여차저차(&#8230;)로,</p>
<ul>
<li>팀장 권한으로 새 머신을 신청할 수 있다는 사실을 확인했고,</li>
<li>(이를 이용해서) 4. 6년된 머신 대신 새 머신을 하나 받기로 했고</li>
<li>대략 원하는 스펙<sup>[<a href="http://rein.kr/blog/archives/2797#footnote_0_2797" id="identifier_0_2797" class="footnote-link footnote-identifier-link" title="i7 2600, RAM 8G, SSD/HDD 듀얼 구성, &amp;#8230;">1</a>]</sup>의 머신을 받게 될 듯 (예정?)</li>
</ul>
<p>여하튼 대략 이러한 상황이 되었음. 이젠 내 머신에서도 릴리즈 빌드가 할만해질듯.</p>
<p>엄하게 팀장님 디스하는 상황이 (사내에서) 되어버린 건 좀 많이 죄송하지만 (&#8230;&#8230;..)</p>
<p>&nbsp;</p>
<p>댓글란에 적어준, 혹은 트위터 멘션으로 보내준 의견/사연들을 놓고 생각하면 소위 IT 업계란 곳도 프로그래머 생산성, 좁게봐서 하드웨어 공급면에 그다지 신경쓰지 않는 듯 하다. 일단 48개월 주기의 교체 일정에 대해선 사람들 반응이 매우 안 좋다.</p>
<p>교체 주기가 24개월 이하인 곳은 규모가 있는 한국계 회사 중엔 1개 (NHN)인 듯 하다. 나머지는 24개월, 36개월, 내가 있는 곳은 48개월(&#8230;).<br />
기껏해야 연봉의  1~2% 수준인<sup>[<a href="http://rein.kr/blog/archives/2797#footnote_1_2797" id="identifier_1_2797" class="footnote-link footnote-identifier-link" title="이번 모회사 공채에 신입사원에게 준다는 기준선이라던 연봉 3000만원 기준으로 150만원짜리 머신을 2년 쓴다면 대략 2.5%. 여러가지 부대 비용이 들어가는 걸 생각하면 대략 총비용을 2 년치로 나눠서 1.25%다 겨우&amp;#8230; 연봉이 높아지면 이 비율은 더 작겠다">2</a>]</sup> 수준일 머신 비용에 너무 신경 쓰는 건 너무 피곤하지 않은가.</p>
<p>뭐 국내 굴지의 모 기업에선 `<a href="http://research.microsoft.com/en-us/news/features/vibe.aspx">이미 효과가 상당부분 인정되는 듀얼모니터</a>&#8216;를 절전이란 이유로 자제하라고 한다니 말 다했지.</p>
<p>혹은 모 금융 공기업 전산직은 연차 순(&#8230;)으로 좋은 머신을 주고, 5+년된 머신으로도 개발한다는데야&#8230;</p>
<p>&nbsp;</p>
<p>원인은 뭘까? 내 나름대로 정리하자면,</p>
<ul>
<li>프로그래머 연봉이 아직 낮은 축이라 생산성이 아니라 소요 비용에 신경쓴다</li>
<li>조직이 커지면 개발 부문 이외, 사무나 회계 등의 연간 목표도 중요하다</li>
<li>비슷하게, 상대적으로 컴퓨터 성능에 영향을 덜 받는 부문에서는 이런 얘기에 귀 기울이지 않는 듯</li>
</ul>
<div>정도? 국내 IT 회사들의 분발을 기대하겠다.</div>
<ol class="footnotes"><li id="footnote_0_2797" class="footnote">i7 2600, RAM 8G, SSD/HDD 듀얼 구성, &#8230;</li><li id="footnote_1_2797" class="footnote">이번 모회사 공채에 신입사원에게 준다는 기준선이라던 연봉 3000만원 기준으로 150만원짜리 머신을 2년 쓴다면 대략 2.5%. 여러가지 부대 비용이 들어가는 걸 생각하면 대략 총비용을 2 년치로 나눠서 1.25%다 겨우&#8230; 연봉이 높아지면 이 비율은 더 작겠다</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2797/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>내 생산성의 장애물: 머신 언제 교체해주나&#8230;</title>
		<link>http://rein.kr/blog/archives/2792</link>
		<comments>http://rein.kr/blog/archives/2792#comments</comments>
		<pubDate>Wed, 21 Sep 2011 02:49:40 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[일상]]></category>
		<category><![CDATA[회사]]></category>
		<category><![CDATA[잡담]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2792</guid>
		<description><![CDATA[얼마 전에 (거의 두 달 전) `내 생산성의 장애물’이란 글을 썼다. 프로그래밍 할 때 `나를 붙잡는 잡것들’의 목록을 적었는데 그 중 마지막에 적어놓은 HW 관련된 일에 대해서 몇 줄 써보고자 한다. Joel on Software의 Joel Test 9번째 항목은 이러하다. 9. (예산이 허용하는 범위 내에서) 가장 좋은 툴을 사용하는가? 9. Do you use the best tools [...]]]></description>
			<content:encoded><![CDATA[<p>얼마 전에 (거의 두 달 전) <a href="http://rein.kr/blog/archives/2768">`내 생산성의 장애물’이란 글</a>을 썼다. 프로그래밍 할 때 `나를 붙잡는 잡것들’의 목록을 적었는데 그 중 마지막에 적어놓은 HW 관련된 일에 대해서 몇 줄 써보고자 한다.</p>
<p>Joel on Software의 Joel Test 9번째 항목은 이러하다.</p>
<blockquote><p>9. <strong>(예산이 허용하는 범위 내에서) 가장 좋은 툴을 사용하는가?</strong></p>
<p>9. Do you use the best tools money can buy?</p></blockquote>
<p>현재 내 상황은 이 항목에 대한 답이 `No’다. 나는 지금 939일 (2.6년) 된 장비와, 1689일 (=4.6년) 된 개발 장비 쓰고 있는데.<sup>[<a href="http://rein.kr/blog/archives/2792#footnote_0_2792" id="identifier_0_2792" class="footnote-link footnote-identifier-link" title="심지어 전자의 장비는 후자의 장비가 너무 느려서 퇴사자 컴퓨터 받아온 것">1</a>]</sup> 연초에 교체 대상 컴퓨터를 조사해 갔던 것 같은데, 이 중 후자만 바꿔준다고 해놓고 교체없이 3Q가 끝나간다면 문제가 많지 않나. Workstation을 쓰고 있는 것도 아니고 지극히 일반적인 의미에서의 개발용 데스크 탑 쓰고 있는데 4+년의 교체 주기는 `회사가 생산성에 관심이 없거나&#8217;, `내 가치가 이런 것도 오래 걸릴 정도의 평가를 받고 있거나&#8217;가 아닐까.</p>
<p>혹시 SW회사에서 개발 장비 교체 문제에 <em>감가상각 같은 정신 나간 기준</em>을 들면 그 회사에서 나가야 한다는 강력한 신호인데 말이지.<sup>[<a href="http://rein.kr/blog/archives/2792#footnote_1_2792" id="identifier_1_2792" class="footnote-link footnote-identifier-link" title="물론 시중에는 개발을 랩탑에서 하는 이상한 곳도 있다. 데스크 탑 / 랩탑 선호로 선택하거나 둘 다 지급 하는 게 아니라 랩탑에서&hellip; 워크스테이션과 노트북과 테스트 용 서버(&hellip;)를 지급하는 회사도 있던데&hellip;">2</a>]</sup> 아오.</p>
<p>나와 같이 일하는 동료들, 혹은 IRC나 기타 SNS 미디어를 통해 얘기하는 사람들은 잘 알고 있겠지만, 나 스스로 올해 정해놓은 시한이 하나 있다:</p>
<blockquote><p>2007년 2월에 입사하면서 받은 개발 머신을 올해 말까지 계속 써야만 하는 상황이면 다른 회사를 알아보거나 창업하기로</p></blockquote>
<p>적어놓으니 뭔가 하드웨어 구걸하는 꼬락서니긴 한데. 지금으론 슬슬 `내가 왜 이런 걸로 고민해야 하는가’의 한계선인 듯. 어차피 회사 다니는 것도 단순한 계약일 뿐,</p>
<blockquote><p>내가 얻는 이익 (돈, 안정감, 일의 만족) &gt; 내가 받는 피해 (짜증, 귀찮음, 시간 소모)</p></blockquote>
<p>이 부등식이 만족되지 않으면<sup>[<a href="http://rein.kr/blog/archives/2792#footnote_2_2792" id="identifier_2_2792" class="footnote-link footnote-identifier-link" title=" &amp;gt; 대신 &amp;gt;&amp;gt; 가 와야 맞겠지 ">3</a>]</sup> 별로 더 연장할 이유가 없다. 연초에 연봉 왕창(~2x%?) 올려주면 뭐하냐.</p>
<p>얼마 전에 사람이 필요해서 학교 후배들이랑 열심히 이 사람 저 사람 알아보다가 좀 시들해진 것도 이거 탓이 꽤 큼. 4년 넘는 장비를 쓰는 회사로 `내가 후배를 데려오는 것’에 대한 도덕적인 거부감이 – 즉, 엔지니어에 대한 적당한 대우가 아니다 – 이유다. `반짝 반짝한’ 후배들 중 상당 수가 대학원에 묶여 있거나<sup>[<a href="http://rein.kr/blog/archives/2792#footnote_3_2792" id="identifier_3_2792" class="footnote-link footnote-identifier-link" title="석사 학위 없으면 병역 특례 자격이 없으니">4</a>]</sup> 이미 다른 회사를 다니면서 이직할 생각 없다고 말한 것도 이유이긴 하지만… 여하튼 Joel Test 9번 항목과 영 안 맞는 상황이니 내가 짱짱한 후배를 데려오기엔 죄책감이 든다.</p>
<ol class="footnotes"><li id="footnote_0_2792" class="footnote">심지어 전자의 장비는 후자의 장비가 너무 느려서 퇴사자 컴퓨터 받아온 것</li><li id="footnote_1_2792" class="footnote">물론 시중에는 개발을 랩탑에서 하는 이상한 곳도 있다. 데스크 탑 / 랩탑 선호로 선택하거나 둘 다 지급 하는 게 아니라 랩탑에서… 워크스테이션과 노트북과 테스트 용 서버(…)를 지급하는 회사도 있던데…</li><li id="footnote_2_2792" class="footnote"> &gt; 대신 &gt;&gt; 가 와야 맞겠지 </li><li id="footnote_3_2792" class="footnote">석사 학위 없으면 병역 특례 자격이 없으니</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2792/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>리뷰: Bastion</title>
		<link>http://rein.kr/blog/archives/2786</link>
		<comments>http://rein.kr/blog/archives/2786#comments</comments>
		<pubDate>Sun, 21 Aug 2011 12:59:19 +0000</pubDate>
		<dc:creator>rein</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://rein.kr/blog/?p=2786</guid>
		<description><![CDATA[어제 Steam에서 구매한 (발매 일은 8/16)[1] 게임. 가벼운(?) 게임 플레이를 제공하는 아기자기한 2D 게임을 원하던 터라 주저 없이 구매. 19.99 (이하 USD)를 할인해서 14.99던가에 판매하더라.. 다만 OST 합본 팩을 안 산걸 조금 후회… OST를 따로 사니 추가로 $5쯤 추가로 들었다 Orz. 전형적인 2D, 쿼터 뷰, 핵&#38;슬래시 장르라고나 할까… 게임 배경이 배경이니 좀 음울하긴 하지만 색조는 [...]]]></description>
			<content:encoded><![CDATA[<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="bastion-title" border="0" alt="bastion-title" src="http://rein.kr/blog/wp-content/uploads/2011/08/bastion-title.jpg" width="640" height="359" /></p>
<p>어제 Steam에서 구매한 (발매 일은 8/16)<sup>[<a href="http://rein.kr/blog/archives/2786#footnote_0_2786" id="identifier_0_2786" class="footnote-link footnote-identifier-link" title="XBox Live Arcade를 통해서는 지난 달에 발매되긴 했다.">1</a>]</sup> 게임. 가벼운(?) 게임 플레이를 제공하는 아기자기한 2D 게임을 원하던 터라 주저 없이 구매. 19.99 (이하 USD)를 할인해서 14.99던가에 판매하더라.. 다만 OST 합본 팩을 안 산걸 조금 후회… OST를 따로 사니 추가로 $5쯤 추가로 들었다 Orz.</p>
<p>전형적인 2D, 쿼터 뷰, 핵&amp;슬래시 장르라고나 할까…    <br />게임 배경이 배경이니 좀 음울하긴 하지만 색조는 화사(?)한 편에 가깝다. 2D에서 좀 더 보여주기 쉬운 색감이랄까.</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="bastion-graphic" border="0" alt="bastion-graphic" src="http://rein.kr/blog/wp-content/uploads/2011/08/bastion-graphic.png" width="640" height="360" /></p>
<p>화면 중앙 왼쪽의 다리 난간이 좀 이상하게 보일 거다. 던전(?)에 들어가면 일부 지역만 보이고/이동가능하고, 특정 경로로 이동하면 화면에 타일들이 `떠오른다&#8217;. 저 다리 난간도 떠올라서 생기는 중(…). 적도 그렇게 생긴 화면에 턱 하고 나타나는 경우가 있어서 나름대로 긴장감 유지에 좋음.</p>
<p>정말 좋았던 부분은 음악 + 해설(?). 주요 등장 인물 중 한 명이 주인공의 행동을 서술하는 형식인데. 이게 음성으로 낮게 깔려 나옴. 일부 동작 – 예를 들어 새로 얻은 무기로 열심히 물건들을 부순다거나, 추락한다거나, … – 에 반응해서 그에 대한 설명을 하기도 한다. 시작하자마자 떨어지고 나서 나오는 해설에 잠시 멍해지더라(…).</p>
<p>&#160;</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="bastion-mortar" border="0" alt="bastion-mortar" src="http://rein.kr/blog/wp-content/uploads/2011/08/bastion-mortar.png" width="640" height="360" /></p>
<p>무기가 다양하게 나오는데 – 망치, 바셰티, 창(할버드?), 활, 저격소총, 샷건, 박격포, …이건 뭐라 설명할 수 없는 로켓포(?), 화염방사기 등… – 이에 대한 업그레이드 재료 + 돈으로 이 무기에 추가 옵션을 달아서 게임 플레이가 꽤 변한다. 로켓포 최종 업그레이드 같은 경우 자동 추적(…)옵션이 달리기도. (무려 범위 무기에 궁극 무기라 한 방에 거의 다 잡는데…) </p>
<p>스크린 샷에서는 터렛에 맞아가며 박격포를 조준하는 장면. 무기마다 컨트롤이 확연히 다른 것도 재미요소. 활은 오래 겨냥하면 더 세게 나가고, 저격 소총은 오래 겨냥하면 더 정확히 나가고… 박격포는 더 오래 겨냥해야 멀리 나가고(…). 일부 근접 무기는 오래 누르면 던진다거나 하기도; 그리고 무기 마스터 던전도 존재한다. 각 무기에 맞는 특정 미션을 수행하면 수행 수준에 따라 보상을 달리 주는 곳(…). </p>
<p>사원이란 시스템으로 난이도를 조절하는 것도 괜찮았음. 사원에 특정 신상을 활성화하면 특정 조건의 몹이 특정 형태로 더 강해지거나 하는 게 생김 – 물론 돈과 경험치도 더 줍니다… 그래서 별도의 난이도 시스템이 외부에 preset으로 주어지는 게 아니라 유저가 알아서 잘(?) 하면 되는 구조… 요즘처럼 게임이 대중화 된 상태에선 난이도에 대해 호 불호가 극명하기 때문에 이건 꽤 괜찮은 선택으로 보인다.</p>
<p>&#160;</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="bastion-portal" border="0" alt="bastion-portal" src="http://rein.kr/blog/wp-content/uploads/2011/08/bastion-portal.jpg" width="640" height="360" /></p>
<p>보너스: Steam 판매용 버전에만 있다는 깨알 같은 포탈 패러디. 특수 스킬을 고를 수 있는데 Gel Canister란 녀석이 있다(…). 이거에 대한 NPC들의 반응도 깨알 같다(…). 일단 `Who Knows Where&#8217; 클리어 할 때 매우 편하다.</p>
<p>한 번 클리어한 던전에 또 진입할 수가 없는데, 대신 `Who Knows Where&#8217;라는 모드가 있다. 게임이 전체적으로 3종류의 던전 배경이 있는데 그 각각에 대해 몬스터의 웨이브가 k번 반복되는 그런 반복 던전. 돈은 여기서 모으면 됩니다. 어차피 스토리를 이해하기 위해선 꼭 한 번 씩은 가야 하니…</p>
<p>&#160;</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="bastion-ville" border="0" alt="bastion-ville" src="http://rein.kr/blog/wp-content/uploads/2011/08/bastion-ville.jpg" width="640" height="360" /></p>
<p>마을은 왼쪽에 보이는 노란 아이콘 (검은 배경) 같은 상점(?)류가 총 6곳 있다. 처음엔 0곳이지만 스토리를 진행하다 보면 늘어나고, 각각이 지원하는 기능이 다름. 하지만 마을은 큰 의미가 없는 게임이라(…). </p>
<p>전체적으로 올해 나온 게임 중엔 가장 맘에 듬. 짧다는 것만 빼고(…). 시작해서 엔딩 볼 때 까지 실 플레이 시간은 5시간 미만?. 물론 두 번 엔딩 봐야 하고(…), 업적도 채워야 하니 그보다 더 걸리긴 함. 일단 가격도 그다지 비싸지 않으니 추천. 이 게임 분류가 인디긴 하지만 무려 HD 해상도도 지원하고 / 그래픽 / 사운드(!!) 모두 나무랄 곳이 없다. </p>
<p>&#160;</p>
<p>PS. 여기서 잠시 스포일러 성 멘트 하나. 게임 엔딩 선택지가 commit or rollback이다. 이런 공돌이들 같으니(?).</p>
<ol class="footnotes"><li id="footnote_0_2786" class="footnote">XBox Live Arcade를 통해서는 지난 달에 발매되긴 했다.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://rein.kr/blog/archives/2786/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

