<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom">
    <title>The Last Mind</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/" />
    
    <id>tag:lastmind.net,2007-10-15:/blog//1</id>
    <updated>2008-11-17T14:57:22Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>

<link rel="self" href="http://feeds.feedburner.com/TheLastMind" type="application/atom+xml" /><entry>
    <title>Surrender</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/11/surrender.html" />
    <id>tag:lastmind.net,2008:/blog//1.626</id>

    <published>2008-11-17T14:54:28Z</published>
    <updated>2008-11-17T14:57:22Z</updated>

    <summary>예전에 강유원 씨가 번역한 달인이라는 책을 읽은 적이 있다. 이 책을 보면 ‘달인이 되는 다섯 가지 열쇠’ 중 하나로 ‘기꺼이 복종하라’라는 말이 있다. 사실 이 부분을 읽을 때에는 가르침을 비판 없이 무조건적으로 받아들이는 것이 대체 무슨 의미인가라고 생각하며 읽었고, 그저 ‘연습하고 또 연습하라’라는 지침의 확장 정도에 불과하다고 생각했다. 최근에, 가난뱅이님의 “독서는 어릴 때 하는 거다”란 글을 읽고 ‘기꺼이 복종하라’라는 말이 정말로 어떤 의미인지 깨달았다....</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Stray Thoughts" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p>예전에 강유원 씨가 번역한 <a href="http://www.aladdin.co.kr/shop/wproduct.aspx?ISBN=8990985307">달인</a>이라는 책을 읽은 적이 있다. 이 책을 보면 ‘달인이 되는 다섯 가지 열쇠’ 중 하나로 ‘<strong>기꺼이 복종하라</strong>’라는 말이 있다. 사실 이 부분을 읽을 때에는 가르침을 비판 없이 무조건적으로 받아들이는 것이 대체 무슨 의미인가라고 생각하며 읽었고, 그저 ‘연습하고 또 연습하라’라는 지침의 확장 정도에 불과하다고 생각했다.</p>  <p>최근에, 가난뱅이님의 “<a href="http://kr.blog.yahoo.com/sawoochi/1244350">독서는 어릴 때 하는 거다</a>”란 글을 읽고 ‘기꺼이 복종하라’라는 말이 정말로 어떤 의미인지 깨달았다.</p>  <blockquote>   <p>반면 토니는 러셀과는 다른 방식으로 합기도에 접근했다. 처음부터 그는 자신이 다른 무술을 배웠다는 것을 드러낼 만한 어떤 움직임, 심지어는 동작조차 취하지 않았다. 과시도 없었고 오히려 다른 학생들보다 더 많이 선생을 존중했다. 그는 조용하고 진지한 태도를 견지하면서 주변에서 일어나는 일들에 세심하게 신경 썼다. 사실 이 같은 태도는 무술을 수련한 사람이라면 누구나 알아차릴 만한 강력한 존재감을 보여 준다. 그는 앉고 서고 걷는 방식만으로도 자신이 달인의 길을 가고 있는 동행자임을 보여 주고 있었다.</p>   <cite>-- 달인, 조지 레오나르드 지음, 강유원 옮김, 여름언덕</cite> </blockquote>  <p>책에서는 모호한 방식으로 예를 들고 있지만, 이 일례에서 보여 주고자 하는 얘기는, 가난뱅이 님의 말씀대로, <strong>자신을 낮추고 스승을 존경하지 않는다면 배워도 제대로 배울 수가 없다는 것</strong>이다.</p>  <p>이것은 단순히 다른 사람에게 자신의 뛰어남을 뽐내지 않는, 예절의 문제가 아니다. 진심으로 자신을 낮출 수 있어야 한다는 얘기다.</p>  <p>그 동안의 나의 배움을 생각해 보아도 그렇다.</p>  <p>예전에 어떤 팀에 있을 때, 팀장이 바뀌는 일이 있었다. 새로운 팀장님은 내가 전혀 모르는 분이었다. 처음에는 그 분을 존경하지 않았다. 호시탐탐 그 분의 오류를 발견하고자 노렸다. 시간이 지나고, 자연스럽게 그 분의 기술적인 지식과 사람을 다루는 능력이 드러나게 되었고, 나는 그 분을 존경하게 됨과 동시에, 내가 그 동안 가지고 있지 않던 많은 것들을 배울 수 있었다. 심지어는 그 분을 만나고 있지 않는 현재에도 배우고 있다.</p>  <p>비슷한 예는 또 있다. 하나 같이 행동이 마음에 들지 않는 사람이 하나 있었는데, 시간이 지나면서 그 사람의 장점을 차차 알게 되고, 내게 없는 그 사람의 장점을 배우기 위해 노력하게 되었다. 그 사람이 장점으로 가진 그 분야에서, 그 사람은 나의 스승이 된 것이다.</p>  <p>책을 읽을 때에도 마찬가지다. 어떤 형편없는 책을 읽어도, 그 책에서 뭔가 하나라도 건져 내려는 태도로 읽게 되면, 배우는 것이 있지만, 처음부터 건질 게 없다고 생각하면, 그 책을 읽은 시간은 고스란히 낭비가 되어 버리는 것이다.</p>  <p>이러한 점을 깨닫고 받아들인다면, 다음과 같은 행동을 실천할 수 있다.</p>  <p><strong>1. 특정 분야에서 자신이 존경할 수 있는 스승을 찾아서 배움을 청한다.</strong></p>  <p>이 얘기는 ‘달인’에서도 언급된 첫 번째 규칙이다. 배움의 시작이자 끝이다.</p>  <p><strong>2. 설령 자신이 존경하지 않는 사람이라고 하더라도 그 사람에게서 배울 점을 찾는다.</strong></p>  <p>어떤 분야에서 설령 스승이 없다고 해도 주위에 스승이 될 만한 책이나 그에 준하는 사람은 있을 수 있다. 자신이 뛰어나다고 스스로나 주변 사람에게 얘기하는 사람은 아직 부족한 점이 많은 사람인 것 같다. 그러한 사람은 십중팔구 수년 후에는 현재와 똑같은 수준에 머무르고 있을 것이다.</p>  <p><strong>3. 남을 가르치기 위해서는 모든 면에서 존경 받을 수 있도록 하라.</strong></p>  <p>어떤 분야에서 뛰어난 것과 훌륭한 스승이 되는 것은 완전히 별개의 문제다. 그 사람이 존경 받을 수 없는 행동을 한다면, 이미 스승으로서의 능력을 포기한 것이나 다름 없다.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Playing Fallout 3</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/11/playing-fallout-3.html" />
    <id>tag:lastmind.net,2008:/blog//1.625</id>

    <published>2008-11-15T17:30:29Z</published>
    <updated>2008-11-15T17:35:16Z</updated>

    <summary>지난 주말에 Fallout 3를 Steam을 통해 구입해 플레이하고 있다. 주중에는 거의 플레이 할 시간이 없지만, 현재 25시간 정도 플레이 한 상태다. Fallout 3는 핵 전쟁 이후의 세계를 배경으로 한 유명한 롤플레잉 게임 시리즈인 Fallout 시리즈의 후속편이다. 여러 가지 사정으로 1, 2편의 개발사인 블랙 아일 스튜디오가 아니라, 엘더스크롤 시리즈로 유명한 베데스다 스튜디오가 맡게 되었다. 때문에 시리즈로서의 연속성에 의문을 갖는 사람이 많은 편이다. 주인공은 Vault라는 핵전쟁을...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Game" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p>지난 주말에 <a href="http://en.wikipedia.org/wiki/Fallout_3">Fallout 3</a>를 <a href="http://store.steampowered.com/about/">Steam</a>을 통해 구입해 플레이하고 있다. 주중에는 거의 플레이 할 시간이 없지만, 현재 25시간 정도 플레이 한 상태다.</p>  <p><a href="http://en.wikipedia.org/wiki/Fallout_3">Fallout 3</a>는 핵 전쟁 이후의 세계를 배경으로 한 유명한 롤플레잉 게임 시리즈인 <a href="http://en.wikipedia.org/wiki/Fallout_(series)">Fallout 시리즈</a>의 후속편이다. 여러 가지 사정으로 1, 2편의 개발사인 블랙 아일 스튜디오가 아니라, 엘더스크롤 시리즈로 유명한 <a href="http://en.wikipedia.org/wiki/Bethesda_Softworks">베데스다 스튜디오</a>가 맡게 되었다. 때문에 시리즈로서의 연속성에 의문을 갖는 사람이 많은 편이다.</p>  <p>주인공은 Vault라는 핵전쟁을 대비한 지하 주거 공간에서 태어나 자란 젊은이다. 어느 날 갑자기 의사로서 존경 받던 아버지가 어디론가 사라지고 동시에 Vault의 리더가 자신을 살해하려는 사실을 알고, Vault로부터 탈출하게 된다. 의지할 데 없는 황량한 바깥 세상에서 아버지를 찾기 위한 모험을 시작하는 것까지가 이 게임의 도입부에 해당한다.</p>  <p><a href="http://lastmind.net/blog/WindowsLiveWriter/Fallout3_132D/fallout_3_2.png"><img title="fallout_3" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="364" alt="fallout 3" src="http://lastmind.net/blog/WindowsLiveWriter/Fallout3_132D/fallout_3_thumb.png" width="644" border="0" /></a></p>  <p>답답한 Vault로부터 막 탈출해 바깥 세상을 처음으로 바라봤을 때, 어디로 가야 할 지를 알 수 없는 황량한 폐허에서 거주지 (메가톤)을 처음으로 찾았을 때의 감격은 이루 말할 수 없다. 전통적인 롤플레잉 게임처럼 퀘스트를 해결해 나가면서 성장하는 재미도 있지만, 건물의 폐허나 망가진 자동차들, 사람들, 변형된 동물들을 직접 발걸음을 옮기면서 하나하나 경험하는 재미도 있다. 이러한 재미는 기술의 발전으로 인해 접할 수 있게 된, 전작들에서는 얻기 힘든 것이 아니었을까 싶다.</p>  <p>설정 상 핵전쟁은 21세기에 발생했지만, 전쟁 전의 세계의 물건들을 보면 1950년대 정도의 것으로 보이고, 간간히 보이는 블랙 유머들은 바이오쇼크의 것과 매우 비슷한 느낌이 든다. 어쩌면 바이오쇼크가 Fallout의 전작들에서 그러한 분위기를 따온 것인지도 모르겠다.</p>  <p>게임의 플레이 방식 자체는 오블리비언을 많이 떠올리게 한다. 엔진 자체가 같으므로 그럴 수 밖에 없다고 생각하는데, 엘더스크롤 시리즈를 통해 잘 다듬어 진 게임 플레이 방식을 가져오는 것 자체는 나쁜 것이 아니라고 생각한다. 다만, 엘더스크롤에서 보던 단점들도 그대로 가지고 있다는 것이 문제지만...</p>  <p>선이냐 악이냐 선택해야 하는 갈림길이 이 게임에서도 발생하는데, 이 황량한 세계의 생존자들은 너무나 힘없고 가난해서, 이들을 돕지 않을 수가 없었다. 우락부락한 뮤턴트나 노예 상인들한테 습격 당하고 납치당하는 마을 사람들을 위해 사격술을 가르치고, 결국은 뮤턴트의 공격을 막아 내는 장면을 보면서 감격스러웠다. 이번에는 선 성향의 여성 캐릭터로 플레이하고, 다음 번에는 악 성향의 남성 캐릭터로 플레이 해보고 싶다.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Zend Framework Project Directory Structure</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/11/zend-framework-project-directory-structure.html" />
    <id>tag:lastmind.net,2008:/blog//1.624</id>

    <published>2008-11-12T18:13:54Z</published>
    <updated>2008-11-12T18:13:58Z</updated>

    <summary>Zend Framework는 Convention over Configuration 방식을 여러 부분에서 채용하고 있지만, 프로젝트의 디렉터리 구조에서는 그렇지 않다. 최근에 유행하는 Rails나 Django와 같이, 프로젝트를 생성하는 도구를 제공하지 않는다는 사실이나, 디렉터리 구조의 Convention이 존재하지 않고, 여러 안들을 제안한다는 사실로부터 이를 알 수 있다. 게다가, Zend에서도 기본적으로 디렉토리 구조는 사용자의 요구에 따라 유연하게 할 수 있는 것을 중요하게 생각하는 듯하다. 이러한 상황 하에서, 공식적으로 Zend가 제안하는 디렉토리 구조는 크게...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Software Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p><a href="http://framework.zend.com/">Zend Framework</a>는 <a href="http://en.wikipedia.org/wiki/Convention_over_Configuration">Convention over Configuration</a> 방식을 여러 부분에서 채용하고 있지만, 프로젝트의 디렉터리 구조에서는 그렇지 않다.</p>  <p>최근에 유행하는 Rails나 Django와 같이, 프로젝트를 생성하는 도구를 제공하지 않는다는 사실이나, 디렉터리 구조의 Convention이 존재하지 않고, <a href="http://framework.zend.com/wiki/display/ZFDEV/Choosing+Your+Application%27s+Directory+Layout">여러 안들을 제안</a>한다는 사실로부터 이를 알 수 있다. 게다가, Zend에서도 기본적으로 디렉토리 구조는 사용자의 요구에 따라 유연하게 할 수 있는 것을 중요하게 생각하는 듯하다.</p>  <p>이러한 상황 하에서, 공식적으로 Zend가 제안하는 디렉토리 구조는 크게 두 가지라고 생각된다. 튜토리얼에 해당하는 <a href="http://framework.zend.com/docs/quickstart">Quick Start 문서</a>에서 제안하는 디렉토리 구조와, <a href="http://framework.zend.com/manual/en/zend.controller.html">Zend_Controller 레퍼런스 문서</a>에서 제안하는 <a href="http://framework.zend.com/manual/en/zend.controller.modular.html">Moduler 디렉토리 구조</a>가 그것이다. 소규모 프로젝트에서는 Quick Start 문서의 것을 채택하는 것이 좋다고 생각한다.</p>  <p>한편, Zend Framework를 처음으로 사용해 본 것은 작년 이 맘 때였는데, 현재 Zend Framework 안정 릴리즈의 버전이 1.6.2인데, 당시의 버전이 1.0.2 였다. 그 동안 많은 변화가 있었겠지만, 라이브러리만 업그레이드해도 당시에 개발한 내용이 아직 동작한다는 것이 신기할 정도.</p>  <p>QuickStart 문서의 내용도 당시와는 많이 달라졌는데, 부트스트랩 방식이나 디렉토리 구조 등이 많이 달라졌다. 기능도 추가할 겸 둘러보다가 디렉토리 구조를 현재의 방식에 맞게 다듬게 되었다.</p>  <p>부트스트랩 방식과 디렉토리 구조에서 크게 달라진 점을 정리해 보면 다음과 같다.</p>  <ol>   <li>controllers, models, views 디렉토리가 application 디렉토리 밑으로 들어갔다. 이를 통해 Moduler 디렉토리 구조와 호환되고 필요할 때 전환도 쉬워 진 것 같다.</li>    <li>library 디렉토리에 Zend Framework 라이브러리를 포함하도록 한다. 프로젝트가 좀 더 독립적으로 배포될 수 있다. 또한, 외부의 Zend Framework 라이브러리를 참조하기 위해서 PHP include path가 수정되어야 하고, 결과적으로 부트스트랩에 영향을 미치는데, 이를 통해 부트스트랩을 수정해야 하는 일이 줄어들어, 설정이 단순화되었다.</li>    <li>html 디렉토리가 public 디렉토리로 변경되었다. 단순히 이름의 변경이지만, 좀 더 성숙되어 가는 느낌이랄까.</li> </ol>  <p>결과적으로는 다음과 같은 디렉토리 구조가 된다.</p>  <p><a href="http://lastmind.net/blog/WindowsLiveWriter/ZendFrameworkProjectDirectoryStructure_2423/image_2.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="223" alt="image" src="http://lastmind.net/blog/WindowsLiveWriter/ZendFrameworkProjectDirectoryStructure_2423/image_thumb.png" width="196" border="0" /></a>&#160;</p>  <p>QuickStart 문서의 디렉토리 구조를 기본으로 하는 프로젝트 생성 도구를 예전에 만들었었는데, 새로운 디렉토리 구조에 따라서 다시 만들어 봐야 할 것 같다. 예전보다는 많이 깔끔해 져서, 사실 Quick Start 문서에서 제공되는 프로젝트를 그대로 풀어서 해도 상관은 없지만 말이다.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Framework Design Guidelines</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/11/framework-design-guidelines.html" />
    <id>tag:lastmind.net,2008:/blog//1.623</id>

    <published>2008-11-03T16:27:05Z</published>
    <updated>2008-11-03T16:27:12Z</updated>

    <summary> The great proof of madness is the disproportion of one's designs to one's means. -- Napoleon Bonaparte (1769-1821) Framework Design Guidelines View SlideShare presentation or Upload your own. (tags: c#; .net;1998;2008)...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Software Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<blockquote>   <p>The great proof of madness is the disproportion of one's designs to one's means.</p>   <cite>-- Napoleon Bonaparte (1769-1821)</cite> </blockquote>  <div id="__ss_699083" style="width: 425px; text-align: left"><a title="Framework Design Guidelines" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/brada/framework-design-guidelines-presentation?type=powerpoint">Framework Design Guidelines</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=frameworkdesignguidelines-1225209286781447-8&amp;stripped_title=framework-design-guidelines-presentation" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=frameworkdesignguidelines-1225209286781447-8&amp;stripped_title=framework-design-guidelines-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>    <div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px">View SlideShare <a title="View Framework Design Guidelines on SlideShare" style="text-decoration: underline" href="http://www.slideshare.net/brada/framework-design-guidelines-presentation?type=powerpoint">presentation</a> or <a style="text-decoration: underline" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration: underline" href="http://slideshare.net/tag/c">c#;</a> <a style="text-decoration: underline" href="http://slideshare.net/tag/net-1998-2008">.net;1998;2008</a>)</div> </div>]]>
        
    </content>
</entry>

<entry>
    <title>Books Bought</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/10/books-bought.html" />
    <id>tag:lastmind.net,2008:/blog//1.622</id>

    <published>2008-10-21T20:06:53Z</published>
    <updated>2008-10-21T20:06:56Z</updated>

    <summary> ...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Book" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p>&#160;<a href="http://oreilly.com/catalog/9780596527587/"><img title="Head First Statistics" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" height="242" alt="Head First Statistics" src="http://lastmind.net/blog/WindowsLiveWriter/BooksBought_44DE/image_21.png" width="210" border="0" /></a> <a href="http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning"><img title="Pragmatic Thinking Learning" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" height="242" alt="Pragmatic Thinking Learning" src="http://lastmind.net/blog/WindowsLiveWriter/BooksBought_44DE/image_20.png" width="202" border="0" /></a> </p>  <p><a href="http://www.aladdin.co.kr/shop/wproduct.aspx?isbn=8991931448"><img title="별을 쫒는 자" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" height="242" alt="별을 쫒는 자" src="http://lastmind.net/blog/WindowsLiveWriter/BooksBought_44DE/image_19.png" width="161" border="0" /></a><a href="http://www.aladdin.co.kr/shop/wproduct.aspx?isbn=8960172561"><img title="화성 아이, 지구 입양기" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" height="242" alt="화성 아이, 지구 입양기" src="http://lastmind.net/blog/WindowsLiveWriter/BooksBought_44DE/image_22.png" width="164" border="0" /></a></p>]]>
        
    </content>
</entry>

<entry>
    <title>Movable Type 4.2 Upgrade</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/10/movable-type-42-upgrade.html" />
    <id>tag:lastmind.net,2008:/blog//1.621</id>

    <published>2008-10-10T20:19:12Z</published>
    <updated>2008-10-10T20:19:19Z</updated>

    <summary>Movable Type 4.2로 업그레이드 했습니다. 4.2에서 변경된 점들 가운데, 가장 마음에 드는 것은 Threaded Commenting인데, 이 때문에 Comment 쪽 템플릿을 수정해 줘야 했고, 결국 템플릿을 모두 4.2 디폴트 템플릿으로 바꾸고 다시 손봐야 했습니다. Movable Type의 템플릿/위젯 시스템은 깔끔하긴 하지만, 업그레이드 할 때마다 손으로 바꿔 주어야 하는 점이 좀 불편한 것 같습니다. 뭐, 이런 걸 신경 안 쓰려면 서비스 형 블로그를 쓰면 되는 일이긴 하지만요....</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Not categorized" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p><a href="http://www.movabletype.org/2008/08/movable_type_42_is_here.html">Movable Type 4.2</a>로 업그레이드 했습니다. <a href="http://www.movabletype.org/documentation/mt42/whats-new.html">4.2에서 변경된 점</a>들 가운데, 가장 마음에 드는 것은 <a href="http://www.movabletype.org/documentation/mt42/threading.html">Threaded Commenting</a>인데, 이 때문에 Comment 쪽 템플릿을 수정해 줘야 했고, 결국 템플릿을 모두 <a href="http://www.movabletype.org/documentation/appendices/default-templates.html">4.2 디폴트 템플릿</a>으로 바꾸고 다시 손봐야 했습니다.</p>  <p>Movable Type의 템플릿/위젯 시스템은 깔끔하긴 하지만, 업그레이드 할 때마다 손으로 바꿔 주어야 하는 점이 좀 불편한 것 같습니다. 뭐, 이런 걸 신경 안 쓰려면 서비스 형 블로그를 쓰면 되는 일이긴 하지만요.</p>]]>
        
    </content>
</entry>

<entry>
    <title>자바 성능을 결정짓는 코딩 습관과 튜닝 이야기</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/10/post-2.html" />
    <id>tag:lastmind.net,2008:/blog//1.620</id>

    <published>2008-10-06T22:01:14Z</published>
    <updated>2008-10-06T22:01:14Z</updated>

    <summary> 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기, 이상민 지음, 한빛 미디어 어떤 것에 대한 지식을 효율적으로 습득하는 방법에는, 그 지식에 관해, 체계적으로 분류하고 정리해 놓은 권위 있는 책을 읽는 방법도 있지만, 잡지와 같이 지식들을 그저 늘어놓은 형태의 정보를 접하는 방법도 있다. 이 책은 후자에 해당하는 책이다. 자바의 코딩 습관에 관한 책이나 자바 성능 튜닝에 관한 문서는 있지만,  경험이 부족한 사람들에게 필요한 것은 정보...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Book" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Software Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<div class="ttbReview"><a href="http://www.aladdin.co.kr/shop/wproduct.aspx?ISBN=8979145225&amp;ttbkey=ttbjosephjang0444001&amp;COPYPaper=1"><img style="display: inline; margin: 0px 10px 10px 0px" alt="" src="http://image.aladdin.co.kr/cover/cover/8979145225_1.jpg" align="left" border="0" /></a></div>  <p><a class="aladdin_title" href="http://www.aladdin.co.kr/shop/wproduct.aspx?ISBN=8979145225&amp;ttbkey=ttbjosephjang0444001&amp;COPYPaper=1">자바 성능을 결정짓는 코딩 습관과 튜닝 이야기</a>, 이상민 지음, 한빛 미디어</p>  <p>어떤 것에 대한 지식을 효율적으로 습득하는 방법에는, 그 지식에 관해, 체계적으로 분류하고 정리해 놓은 권위 있는 책을 읽는 방법도 있지만, 잡지와 같이 <strong>지식들을 그저 늘어놓은 형태의 정보</strong>를 접하는 방법도 있다.</p>  <p>이 책은 후자에 해당하는 책이다. <a href="http://lastmind.net/blog/2007/01/effective-java-programming-language-guide.html">자바의 코딩 습관에 관한 책</a>이나 <a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html">자바 성능 튜닝에 관한 문서</a>는 있지만,&#160; 경험이 부족한 사람들에게 필요한 것은 <strong>정보 자체가 아니라 정보에 대한 좋은 레퍼런스</strong>가 필요한 경우가 있다.</p>  <p>잡지의 형식의 특성 중 하나는 <strong>필자의 경험</strong>에 따른, <strong>시간이나 상황, 독자에 맞는 정보</strong>들을 보여 주려고 시도한다는 것이다. 권위가 있는 서적에서는 특성상 시간이나 경험에 따라 변할 수 있는 정보를 보여 주려고 하지는 않는다. 그럼에도 불구하고 현실에 살고 있는 우리들은 시간에 따라 변할 수 있는 정보를 필요로 한다. 예를 들어, 최소한 필자 또는 삼성 SDS에서 자주 쓰는 프로파일링 도구는 무엇인가와 같은 정보가 그러한 정보에 해당하는 것이다. (어떤 성능 튜닝 책에서는 프로파일링 도구를 모두 정리해 놓을 수 있지만, 이 책은 그런 것을 시도한 것 같지는 않다.)</p>  <p>이 책의 다른 미덕 하나는 <strong>‘이야기’와 ‘실제 사례’</strong>를 들려주려고 시도했다는 점이다. 필요한 정보만 정리되어 담겨 져 있는 책이나 문서가 아니라, 나 같은 경우에도 ‘이야기’가 담겨 있는 책은 훨씬 접하기가 편안하다. 말하자면, 주말에 편한 의자에 앉아서 시간 때우기 용으로 읽거나 심지어는 화장실에서 읽을 수도 있다는 것이다.</p>  <p>최소한 이 책은 초보자를 위한 자바의 기본적인 코딩 습관, 성능 튜닝에 관한 지식 등으로의 참고 자료 또는 잡지가 되는 것에는 성공했다고 생각한다. 다만, 숙련자가 읽기에는 정보의 깊이라든가 정확성 등은 약간 부족한 면이 있다.</p>]]>
        
    </content>
</entry>

<entry>
    <title>용의자 X의 헌신</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/10/x.html" />
    <id>tag:lastmind.net,2008:/blog//1.619</id>

    <published>2008-10-06T20:42:35Z</published>
    <updated>2008-10-06T20:42:35Z</updated>

    <summary> 용의자 X의 헌신 - 히가시노 게이고 지음, 양억관 옮김, 현대문학 추리물은 원래 좋아하는 편이지만, 책 읽는 양은 요즘 많이 줄어서, 추리 소설을 읽을 기회가 별로 없었는데, 오랜만에 눈에 띄는 소설이 있길래 골랐다. 이야기는 초반부에 독자들에게 살인 사건을 보여 주고, 이 때, 범인 (야스코)과 범행을 감추어 주기 위해 완벽한 계획을 세우는 수학자(이시가미)가 등장하며, 형사(구사나기)와 그의 물리학자 친구(유가와)가 사건을 해결해 나가는 방식이다. 초반부에서는 범행을 감추기...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Book" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<div class="ttbReview"><a href="http://www.aladdin.co.kr/shop/wproduct.aspx?ISBN=8972753696&amp;ttbkey=ttbjosephjang0444001&amp;COPYPaper=1"><img style="display: inline; margin: 0px 10px 10px 0px" alt="" src="http://image.aladdin.co.kr/cover/cover/8972753696_1.jpg" align="left" border="0" /></a></div>  <p><a class="aladdin_title" href="http://www.aladdin.co.kr/shop/wproduct.aspx?ISBN=8972753696&amp;ttbkey=ttbjosephjang0444001&amp;COPYPaper=1">용의자 X의 헌신</a> - 히가시노 게이고 지음, 양억관 옮김, 현대문학</p>  <p>추리물은 원래 좋아하는 편이지만, 책 읽는 양은 요즘 많이 줄어서, 추리 소설을 읽을 기회가 별로 없었는데, 오랜만에 눈에 띄는 소설이 있길래 골랐다.</p>  <p>이야기는 초반부에 독자들에게 살인 사건을 보여 주고, 이 때, 범인 (야스코)과 범행을 감추어 주기 위해 완벽한 계획을 세우는 수학자(이시가미)가 등장하며, 형사(구사나기)와 그의 물리학자 친구(유가와)가 사건을 해결해 나가는 방식이다. 초반부에서는 범행을 감추기 위한 작업, 중반부에서는 수사의 전개가 이어진다. 중반부까지 읽다 보니, 수사의 진척을 통해 범행이 거의 드러나면서, ‘유명세 치고는 시시하군.’이란 생각을 했는데, 문제는 후반부였다. 그야말로 예상치 못한 놀라운 반전이었는데, 중반까지도 평이하다고 생각했던 제목이 드디어 이해가 가던 대목이었다.</p>  <p>사건의 전개 상으로는 두 천재, 이시가미와 유가와의 대결 구도인데, 실제로 유가와는 이시가미의 친구이기 때문에, 유가와는 입을 다물고 묵묵히 지켜 보는 편이고, 이시가미의 역할이 많이 부각되는 편이다. 그리고, 꼭 천재적이어서 라기보다는 수학자나 물리학자의 성격이나 습관에 대한 묘사도 많이 눈에 띄는데, 흔히 그런 것과 달리, 크게 위화감은 없는 정도라서 만족스러웠다.</p>  <p>눈에 자주 띄는 책이라서 고른 것이었는데, 마음에 들어서, ‘히가시노 게이고’의 다른 소설, 그리고 나오키상 수상작들도 골라서 읽어 봐야겠다.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Crysis를 플레이하기 위한 그래픽 카드는?</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/10/crysis.html" />
    <id>tag:lastmind.net,2008:/blog//1.617</id>

    <published>2008-10-05T18:02:18Z</published>
    <updated>2008-10-05T18:02:18Z</updated>

    <summary>Crysis의 후속편인 Crysis Warhead를 구입해서 플레이하고 있다. Crysis는 이른바 ‘크라이실사’라는 별명을 가진, 게임 발전의 한 방향인 photorealism을 극한으로 추구한 게임이다. 물론, 그만큼 요구하는 하드웨어 사양도 높은 것으로 악명이 높다. 현재 내가 보유하고 있는 그래픽 카드가 Nvidia GeForce 8800GT인데, 1280x1024 Mainstream 설정으로도 특정 레벨에서는 플레이하기가 벅찬 면이 있다. 이 때문에 플레이 하다가 잠시 하드웨어 욕심이 나, Tech Report를 뒤져 봤다. (via the Tech Report) Crysis를...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Game" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Hardware" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p><a href="http://www.gamespot.com/pc/action/crysis/index.html">Crysis</a>의 후속편인 <a href="http://www.gamespot.com/pc/action/crysiswarhead/index.html">Crysis Warhead</a>를 구입해서 플레이하고 있다. Crysis는 이른바 ‘크라이실사’라는 별명을 가진, 게임 발전의 한 방향인 photorealism을 극한으로 추구한 게임이다. 물론, 그만큼 요구하는 하드웨어 사양도 높은 것으로 악명이 높다. 현재 내가 보유하고 있는 그래픽 카드가 <strong>Nvidia GeForce 8800GT</strong>인데, 1280x1024 Mainstream 설정으로도 특정 레벨에서는 플레이하기가 벅찬 면이 있다.</p>  <p><a href="http://lastmind.net/blog/WindowsLiveWriter/Crysis_126E/crysis_warhead_2.jpg"><img title="Crysis Warhead" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="480" alt="Crysis Warhead" src="http://lastmind.net/blog/WindowsLiveWriter/Crysis_126E/crysis_warhead_thumb.jpg" width="600" border="0" /></a> </p>  <p>이 때문에 플레이 하다가 잠시 하드웨어 욕심이 나, <a href="http://techreport.com/">Tech Report</a>를 뒤져 봤다. (via <a href="http://techreport.com/articles.x/15293/1">the Tech Report</a>)</p>  <p><a href="http://techreport.com/articles.x/15293/8"><img src="http://techreport.com/r.x/radeon-hd-4870-x2/crysis-1920-high.gif" /></a> </p>  <p>Crysis를 1920x1200 해상도에서 플레이 하고 싶은 것이 내 욕심인데, 최소한의 fps라고 할 수 있는 30 fps를 내는데도 최상의 그래픽 카드가 필요하다는 것을 알 수 있다.. 그러한 최상의 그래픽 카드에 해당하는 것이 <strong>Nvidia의 GeForce GTX 280</strong>과 <strong>ATI의 Radeon HD 4870 로</strong> 보인다. GTX 280은 약 50만원 대, 한 레벨 아래의 GTX 260이 30만원 후반 대, 4870이 약 30만원 초반 대 정도인데, Crysis 외에는 거의 활용하기 힘든 50만원 대의 그래픽 카드는 정신이 나가지 않고서는 도저히 지를 엄두가 안 나고, 그나마 30만원 대를 노려볼 만한데, 4870 쪽이 가격 대 성능비는 나아 보인다.</p>  <p>눈에 띄는 최근의 그래픽 카드 시장의 경향 중 하나가, SLI나 CrossFire를 그래픽 카드 하나에 넣어버린, 이른바 듀얼 코어 GPU다. SLI나 CrossFire를 사용하기 위해서 지원하는 고가의 보드 (물론 2-3만원 정도 비쌀 뿐이지만)를 구입해야 한다는 부담이 있는데, 그런 부담을 덜어 주기 위한 것으로 보인다. 무..물론 버스를 줄여 주는 의미도 있겠지만… 어쨌든, Nvidia의 GX2와 ATI의 X2계열이 그것인데, SLI나 CrossFire 자체가 애초에 효율적이지도 않거니와, 최고 성능을 위해서도 그다지 효과적인 안은 아니어서 관심은 별로 가지 않는다.</p>  <p>GTX 260을 살까 Radeon HD 4870을 살까 고민하다 보니, 몇 프레임 차이 나지도 않고, 별로 높지도 않은 30 프레임을 얻으려고 과연 30만원을 들일 가치가 있을까 싶은 생각이 들어서, 그냥 현재 상태로 얼른 클리어하고, Crysis를 봉인할 생각. 한 2-3년 후에 웃으면서 Crysis를 플레이 할 날이 오겠지…</p>]]>
        
    </content>
</entry>

<entry>
    <title>Best Practices for Form Design</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/10/best-practices-for-form-design-1.html" />
    <id>tag:lastmind.net,2008:/blog//1.616</id>

    <published>2008-10-05T14:35:35Z</published>
    <updated>2008-10-05T16:10:50Z</updated>

    <summary>Best Practices for Form Design (via Alan Kang)...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Software Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p><a href="http://www.lukew.com/resources/articles/WebForms_LukeW.pdf">Best Practices for Form Design</a> (via <a href="http://alankang.tistory.com/146">Alan Kang</a>)</p>  <p><img src="http://farm3.static.flickr.com/2036/2915265854_8912d2a615_o.png" /></p>]]>
        
    </content>
</entry>

<entry>
    <title>IIR Chapter 19-21</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/09/iir-chapter-1921.html" />
    <id>tag:lastmind.net,2008:/blog//1.614</id>

    <published>2008-09-29T17:03:52Z</published>
    <updated>2008-09-29T17:03:53Z</updated>

    <summary>몇몇 가벼운 기술 서적들을 읽다가, 다시 IIR을 들어 Chapter 19-21을 읽었습니다. Chapter 19 Web search basics Chapter 20 Web crawling and indexes Chapter 21 Link analysis 이제 Chapter 13-18을 읽을 차례군요....</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Software Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p>몇몇 가벼운 기술 서적들을 읽다가, 다시 <a href="http://lastmind.net/blog/2008/07/introduction-to-information-retrieval-1.html">IIR</a>을 들어 Chapter 19-21을 읽었습니다.</p>  <ul>   <li>Chapter 19 Web search basics</li>    <li>Chapter 20 Web crawling and indexes</li>    <li>Chapter 21 Link analysis</li> </ul>  <p>이제 Chapter 13-18을 읽을 차례군요.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Equality conditionals like if (BAR == foo)</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/09/equality-conditionals-like-if-bar-foo.html" />
    <id>tag:lastmind.net,2008:/blog//1.613</id>

    <published>2008-09-24T21:15:36Z</published>
    <updated>2008-09-24T21:15:36Z</updated>

    <summary>내가 싫어하는 코딩 스타일 중의 하나가 바로 다음과 같은 코딩 스타일이다. if (BAR == foo) { // whatever.. } Java에서는 다음과 같이 쓰기도 한다. if (BAR.equals(foo)) { // whatever.. } 원래 이러한 코딩 스타일은 if 문 내에서 의도하지 않은 assignment가 일어나는 것을 방지하기 위한 것이다. // XXX: assignment not intended if (foo = BAR) { // whatever.. } Java의 경우에는 NullPointerException (이하 NPE)을 방지하기...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Software Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p>내가 싫어하는 코딩 스타일 중의 하나가 바로 다음과 같은 코딩 스타일이다.</p>  <pre class="java" name="code">if (BAR == foo) {
	// whatever..
}</pre>

<p>Java에서는 다음과 같이 쓰기도 한다.</p>

<pre class="java" name="code">if (BAR.equals(foo)) {
	// whatever..
}</pre>

<p>원래 이러한 코딩 스타일은 if 문 내에서 의도하지 않은 assignment가 일어나는 것을 방지하기 위한 것이다.</p>

<pre class="java" name="code">// XXX: assignment not intended
if (foo = BAR) {
	// whatever..
}</pre>

<p>Java의 경우에는 NullPointerException (이하 NPE)을 방지하기 위한 목적도 있다고 한다.</p>

<pre class="java" name="code">// XXX: when foo is null, throws NPE
if (foo.equals(BAR)) {
	// whatever..
}</pre>

<p>일단, 이런 스타일을 싫어하는 첫 번째 이유는 <strong>읽기가 힘들다</strong>는 것이다. ‘if foo is BAR’는 내 마음의 회로에서 바로 처리가 되지만, ‘if BAR is foo’는 위화감이 있다. 아마도 언어적인 이유이거나 (an student is not me?) 수학식을 읽는 방식 (when pi is x?) 을 기대하기 때문이라고 생각한다.</p>

<p>두 번째 이유는 이러한 스타일을 사용함으로써 얻으려는 이익은 <strong>다른 방법으로도 얻을 수 있기 때문</strong>이다. 단순히 잘못된 방식이라는 것이다.</p>

<p>일단 <strong>conditional에서의 의도하지 않은 assignments를 방지</strong>하기 위해서는 이미 오래 전부터 <strong>컴파일러가 보여 주고 있는 경고 (warning) 메시지</strong>를 이용하면 된다. 게다가 프로그래밍에 익숙해 지면 저런 실수는 흔치는 않은 일이 된다.</p>

<p><strong>NPE의 방지</strong>는 방어적인 프로그래밍의 입장에서 일견 설득력이 있어 보이지만, Java의 스타일을 해치고, 결과적으로 <strong>오류 가능성을 감추어서 견고한 코드로 만드는 길을 막는다</strong>고 생각한다.</p>

<p>일반적인 프로그래밍에서 nullity는 말 그대로 invalidity를 의미하고, Java에서는 이러한 의미를 잘 살려서 코딩 할 수 있다.</p>

<p><strong>Case 1</strong></p>

<pre class="java" name="code">Foo foo1 = new Foo();
assert foo1 != null;
foo1.bar();

Foo foo2 = getValidFoo();
assert foo2 != null;
foo2.bar();</pre>

<p>foo1과 foo2의 경우가 바로 그런 경우다. </p>

<p>foo1의 경우 Java의 new 키워드를 통해 valid하다는 것 즉, null이 아니라는 것이 보장된다.</p>

<p>getValidFoo()는 항상 valid한 Foo instance를 돌려준다라는 의미를 가지고 있다. 만약 getFooValid()가 null을 돌려준다면 assertion failure나 NPE가 발생할 것이다. 하지만, 그것은 getValidFoo()의 오류이므로, getValidFoo()를 사용하는 코드에서는 이 점을 무시할 수 있다. 그리고, getValidFoo()에서 제대로 Foo instance를 돌려줄 수 없는 상황이라면 exception을 throw할 것이다.</p>

<p>우리는 모든 코드에서 모든 변수의 validity를 체크할 수 있지만, 우리는 단순히 그렇게 하지 않는다. 만약 그렇게 한다면, 그것은 편집증 환자의 코드로 보일 뿐이다. 좋은 프로그래밍 언어는 그렇게 하지 않아도 되도록 하는 여러 장치들(new keyword, types, exception, assertion, …)을 가지고 있다.</p>

<p>만약 getValidFoo()가 믿을 만 하지 않아서 불안하다면 assertion을 사용해 명시적으로 오류를 발생시키면 된다.</p>

<p><strong>Case 2</strong></p>

<pre class="java" name="code">Foo foo3 = getFoo();
if (foo3 == null)
	throw new RuntimeException(&quot;foo2 is null&quot;);
assert foo3 != null;
foo3.bar();</pre>

<p>getFoo()가 semantic 상으로 null을 돌려줄 수 있을 경우가 있다. 이 경우 우리는 foo의 메서드를 호출할 예정이고 이후로도 다른 처리를 해야 하므로, 명시적으로 nullity 체크를 해서 적절한 처리를 하면 된다. </p>

<p>nullity는 위에서 얘기 한대로 invalidity를 의미하므로 이러한 상황에 대해서는 어떻게 대처할지 미리 준비가 되어 있어야 한다. 단순히 if (foo.equals(BAR))로 해결되었다고 착각하는 것은 위험하다. 그러한 코드가 invalidity 상황을 해결할 수 없다는 것이 아니다. 이러한 코딩 스타일이라는 것은 곧 <strong>invalidity 상황에 대해서 무시하는 습관</strong>을 들이는 것이랑 같다는 것이다.</p>

<p>한편, Case 1의 getValidFoo() 처럼, 원래의 의미는 validity를 보장해야 하나 실제로 그렇지 않을 경우, 안정성을 보장해야 하는 상황에서, 치명적인 결과를 가져오는 것이 걱정된다면, Case 2로 처리하라. 명시적으로 invalidity 상황을 처리하지 않고 위와 같은 코딩 스타일로 해결하고자 하는 것은 단순히 게으른 것이다.</p>

<p><strong>Case 3</strong></p>

<pre class="java" name="code">
Foo foo4 = getFoo();
if (foo4 == null || foo4.equals(BAR) != true) {
	// do A
}
else {
	// do B
}

Foo foo5 = getFoo();
if (BAR.equals(foo5)) {
	// do B
}
else {
	// do A
}
// XXX: possible to throw NPE
foo5.bar();</pre>

<p>마지막으로, foo4의 nullity가 invalidity라고 보기 힘든 경우가 있다. value object일 경우가 많을 텐데, 이 경우 null인 경우는 foo4의 상태 중 하나일 뿐인 것이다. 이 경우만이 겨우 위의 코딩 스타일이 약간이나마 빛을 발하는 경우라고 볼 수 있는데, 약간의 코드를 절약할 뿐, 충분히 명시적이지 못한 코드라고 생각한다. 만약 단순히 equality test만 있는 것이 아니라 메서드 호출도 필요한 상황이라면 실수할 여지가 있다.</p>

<p>이러한 경우라면 <a href="http://en.wikipedia.org/wiki/Null_Object_pattern">Null Object 패턴</a>을 활용해 보라고 조언하고 싶다.</p>

<pre class="java" name="code">Foo foo6 = getValidFoo();
assert foo6 != null;
if (foo6.equals(BAR)) {
	// do B
}
else {
	// do A
}
foo6.bar();</pre>

<p>즉, null 값으로 invalidity를 표현하지 말고 이를 표현하기 위한 객체를 만드는데, 이렇게 되면, null 값이 다시 invalidity를 의미하게 되므로, Case 1 또는 Case 2와 같은 방식으로 처리하면 된다. 그리고, 훨씬 Java 언어에 자연스러운 스타일이 될 것이다.</p>

<p><strong>Closing</strong></p>

<p>프로그래밍에 있어서 nullity 문제와 같이 사소한 코딩 상의 버그를 발생시키지 않는 비결은 의도를 발생할 수 있는 모든 경우를 명시적으로 처리하는 것이다. 코너 케이스들을 대충 해 놓는 경우들이 자주 보이는데 , 결국은 자신 또는 누군가가 그에 대한 비용을 치르게 될 것이란 점을 기억하라고 조언하고 싶다.</p>]]>
        
    </content>
</entry>

<entry>
    <title>COUNT() in MySQL</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/09/count-in-mysql.html" />
    <id>tag:lastmind.net,2008:/blog//1.612</id>

    <published>2008-09-22T19:38:14Z</published>
    <updated>2008-09-22T19:38:14Z</updated>

    <summary>MyISAM을 쓰던 시절에는 당연히 COUNT(val) 보다는 COUNT(*)을 써야 한다는 조언을 들어왔는데, InnoDB에서도 그렇게 해야 하는가는 약간 혼란스러운 문제였다. Peter Zaitsev의 결론은 대부분의 경우, COUNT(*)를 사용하는 것이 좋다라는 것이지만, 역시 의도에 따라 정확하게 사용하는 것이 가장 바람직하다. MySQL 5.0 Reference Manual에 따르면, COUNT()의 정확한 의미는 다음과 같다. COUNT(*): SELECT문에 의한 결과 row들의 개수. (NULL 여부에 상관없음.) COUNT(expr): SELECT 문에 의한 결과 row들 중 expr의 non-NULL...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Software Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p>MyISAM을 쓰던 시절에는 당연히 COUNT(val) 보다는 COUNT(*)을 써야 한다는 조언을 들어왔는데, InnoDB에서도 그렇게 해야 하는가는 약간 혼란스러운 문제였다.</p>  <p><a href="http://www.mysqlperformanceblog.com/">Peter Zaitsev</a>의 결론은 <a href="http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/">대부분의 경우, COUNT(*)를 사용하는 것이 좋다</a>라는 것이지만, 역시 의도에 따라 <a href="http://www.mysqlperformanceblog.com/2008/09/20/a-common-problem-when-optimizing-count/">정확하게 사용하는 것이 가장 바람직하다</a>.</p>  <p><a href="http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count">MySQL 5.0 Reference Manual에 따르면, COUNT()의 정확한 의미</a>는 다음과 같다.</p>  <ul>   <li>COUNT(*): SELECT문에 의한 결과 row들의 개수. (NULL 여부에 상관없음.) </li>    <li>COUNT(expr): SELECT 문에 의한 결과 row들 중 expr의 <strong>non-NULL</strong> 값의 개수. </li>    <li>COUNT(DISTINCT expr): 서로 다른 non-NULL 값들의 개수. </li> </ul>  <p>MyISAM은 테이블마다 row 개수에 대한 카운터를 가지고 있고, 이 카운터의 이점을 얻으려면 COUNT(*)를 사용하라는 조언이 자주 제시되었는데, COUNT()의 정확한 의미를 알고 나면 이러한 조언의 근거를 알 수 있다.</p>  <p>즉, COUNT(*)는 단순히 row들의 개수를 의미하기 때문에, row 개수에 대한 카운터를 사용할 수 있지만, COUNT(expr)은 non-NULL 값의 개수를 의미하기 때문에, 만약 expr이 NOT NULL constraint를 가진 필드가 아니라면, row 개수에 대한 카운터를 사용할 수가 없다. (물론, NOT NULL constraint를 가진 필드라면 그렇지 않다.)</p>  <p>MyISAM의 row 개수 카운터는 매우 유용하지만, 매우 한정된 쿼리, 즉 전체 row들의 개수를 얻는 데에만 사용할 수 있을 뿐이다.</p>  <p><strong>Update</strong>: 오늘 낮에 InnoDB의 구조에 따른 COUNT() 성능에 관해 남세동 팀장님과 이야기를 나누었는데, 집에 돌아와서 실험을 해보니 InnoDB에서는 COUNT()의 쿼리 플랜이 MyISAM의 경우와 확실하게 다른 것으로 보인다. 실험 결과는, 한마디로 하자면, Index가 존재하는 경우에는 Index를 활용하는 쪽으로 플랜이 만들어 지는 것 같다. 정확한 결과는 다음 포스팅에…</p>]]>
        
    </content>
</entry>

<entry>
    <title>미국 헌법과 인권의 역사</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/09/american-constitution-and-history.html" />
    <id>tag:lastmind.net,2008:/blog//1.611</id>

    <published>2008-09-15T16:24:09Z</published>
    <updated>2008-09-15T16:26:13Z</updated>

    <summary> 미국 헌법과 인권의 역사, 장호순 지음, 개마고원 우리가 현재 당연하다고 생각하며 누리고 있는 기본권의 혜택들이, 실은 20세기 초에도 제대로 확립되지 않았다는 사실은, 보통 사람들에게는 의외로 잘 알려지지 않은 사실이다. 대한민국이 근대적인 헌법을 기초한 것은 1948년의 일이고, 사회적인 논의나 합의의 과정을 거쳐서 만들어진 것이 아니라, 주어진 것이나 다름없는 헌법이었기 때문일 것이다. 그렇다고 해서, 현대의 미국이나 유럽의 정치사를 접할 기회가 많이 있었던 것도 아니기 때문일...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Book" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<a href="http://www.aladdin.co.kr/shop/wproduct.aspx?ISBN=8957690549&amp;ttbkey=ttbjosephjang0444001&amp;COPYPaper=1"><img style="margin: 0px 10px 10px 0px" alt="" src="http://image.aladdin.co.kr/cover/cover/8957690549_1.jpg" align="left" border="0" /></a>   <p><a href="http://www.aladdin.co.kr/shop/wproduct.aspx?ISBN=8957690549&amp;ttbkey=ttbjosephjang0444001&amp;COPYPaper=1">미국 헌법과 인권의 역사</a>, 장호순 지음, 개마고원</p>  <p>우리가 현재 당연하다고 생각하며 누리고 있는 기본권의 혜택들이, 실은 20세기 초에도 제대로 확립되지 않았다는 사실은, 보통 사람들에게는 의외로 잘 알려지지 않은 사실이다.</p>  <p>대한민국이 근대적인 헌법을 기초한 것은 1948년의 일이고, 사회적인 논의나 합의의 과정을 거쳐서 만들어진 것이 아니라, 주어진 것이나 다름없는 헌법이었기 때문일 것이다. 그렇다고 해서, 현대의 미국이나 유럽의 정치사를 접할 기회가 많이 있었던 것도 아니기 때문일 것이다.</p>  <p>일단 나만 해도, 고등학교 교육과정에서도 역사 과목이라고는 '국사' 밖에 없었으며, 공과대학이었던 대학교에서도 '한국 근현대사', '정치학' 정도 수준이 다였기 때문이다.</p>  <p>'정치학' 수업에서 본 비디오를 통해 막연히, 영국이나 미국은 오랜 민주주의의 전통을 가진 정치 선진국이라는 이미지를 가지고 있었는데, 처음으로 이러한 이미지가 깨어지기 시작한 것은, '포레스트 검프'나 '미시시피 버닝', '말콤 X' 등의 영화를 보면서 알게 된, 남북전쟁 이후에도 지속된 백인들의 강력한 유색 인종 차별이었다. 여성투표권이 주어진 것도 20세기의 일이라는 것은 가히 충격적이었다.</p>  <p>그렇다면, 20세기 동안 무슨 일이 있었기에, 미국 시민들은 현재와 같은 권리를 누리고 있는 것일까? 그동안 미국의 사법제도를 다룬 글이나 책 (미국 헌법과 민주주의)을 통해 약간씩은 알게 되었지만, 미국의 역사를 제대로 알지 못하기 때문에, 내 질문에 초점이 맞춰진 이 책을 가벼운 마음으로 고르게 되었다.</p>  <p>이 책에서는 현재 우리나라의 헌법재판소의 지위에 해당하는 미국의 최고 사법 기구인 연방대법원들의 주요한 판례를 중심으로, 우리가 당연하다고 생각하며 누리고 있는 권리들, 또는 현재도 논란이 되고 있는 이슈들이 어떠한 과정을 통해 논의가 되고 결정되어 왔는가를 읽기 좋게 분야 별로 정리해놓았다.</p>  <p>미국 연방대법원은 역시 오랜 민주주의의 전통을 가진 나라 답게, 헌법을 초안한 국부들의 생각을 존중해, 어떤 헌법 조항이 애매할 경우, 학자들에게 그 조항이 어떠한 배경에서 나왔는지 조사를 요구하는 경우도 있다. 1948년과 1987년의 '주어진' 헌법을 가지고 있는 대한민국으로서는 이해하기 어려운 문화다.</p>  <p>연방대법원은 이러한 헌법에 비추어 해석을 할 가치가 있을 경우에만 사안을 받아들이는데, 미국은 대한민국과는 달리 판례중심주의이고, 이에 따라 연방대법원도 기존의 판례들에 벗어나지 않고, 일관성을 지키는 것을 매우 중요시하며 보수적인 편이다. 그럼에도 불구하고, 이 책에는 기존의 판례를 뒤엎고 새롭게 인권을 보호하기 위한 해석을 내놓은 사례들이 많이 등장한다.</p>  <p>상식적으로, 사법의 과정에서, 정치적, 경제적, 사회적 환경과 독립적으로, 판례 (또는 법 조항의 해석)의 일관성을 지키는 것은 매우 중요한 일이고, 실제로도 미국의 법조계는 그러한 점들을 중요하게 여겼다.</p>  <p>그럼에도 불구하고, 백인과 유색인종 사이의 평등권 문제나, 노동시간 제한 등과 같은 당연해 보이는 문제도, 그러한 환경의 변화에 따라, 연방대법원의 판단은 180도로 달라졌다는 것을 우리는 이 책에서 볼 수 있다. <strong>결국은 정치적, 경제적, 사회적 환경의 변화에 따라, 법의 적용도 달라질 수 밖에 없었다</strong>는 것이다. 물론 그러한 일이 자주 일어나서도, 바람직하지 못한 방향으로 일어나서도 안될 것이다. 다만, 기존 법이나 판례 등을 지키는 것만이 중요하지는 않다는 보수주의자를 일깨우는 교훈일 것이다.</p>  <p>판례의 일관성을 깨는 일은 당시의 사회로부터 많은 비판을 받았으며, 기득권 세력으로부터도 많은 비난을 받는다. 그로부터 수십년 후에 태어난 우리는 그러한 결정이 옳았다는 것을 알지만 (그렇게 생각하지만), 그러한 결정을 하는 시점에서 어떤 결정이 역사적으로 올바른지는 어떻게 판단할 수 있을까? 그리고, 올바른 결정을 하기 위한 사법 시스템을 확립하기 위해서는 어떠한 환경과 조건이 필요할까? 미국의 국부들에 의해 쓰여진 국가의 철학, 이를 지켜나가는 것을 전통으로 확립하기 위한 역사, 도그마와 무관하게 자유롭게 의견을 개진해 올바른 방향을 찾아나갈 수 있는 민주주의의 문화 모두가 필요한 것이 아닐까 싶다.</p>  <p>이 책이 다루고 있는 각각의 사안에 대해서, 사회적 분위기 뿐만 아니라, 역사적인 측면, 정치, 경제적인 사건들도 자세히 설명을 하고 있어서, 따로 찾아보지 않아도 될 정도로, 읽기가 매우 편리했다.</p>  <p>다음 번에는 미국의 현대사에 관한 책을 읽어보고 싶다.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Google Chrome 사용 소감</title>
    <link rel="alternate" type="text/html" href="http://lastmind.net/blog/2008/09/google-chrome.html" />
    <id>tag:lastmind.net,2008:/blog//1.610</id>

    <published>2008-09-03T22:42:28Z</published>
    <updated>2008-09-03T22:42:28Z</updated>

    <summary>Google Chrome을 잠시 사용해 본 느낌은 다음과 같다. Fast (but not that fast) 내가 들어가는 사이트는 한정되어있고, 느린 사이트는 아예 들어가지 않아서, V8의 벤치마크 등에서 나타나는 Javascript 엔진의 이점을 100% 누리기는 힘든 것 같다. 실제로 빠른 것은 사실이지만, '빠르다'는 느낌이, 페이징이나 스크롤 방식의 차이에서도 오는 것 같다. Convenient Google Chrome은 나의 취향과 일치한다. 말하자면, Firefox를 처음 설치했을 때, 내 입맛에 맞도록, 설정하고, Firefox Extension들을...</summary>
    <author>
        <name>Joseph Jang</name>
        <uri>http://lastmind.net/blog/</uri>
    </author>
    
        <category term="Software" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://lastmind.net/blog/">
        <![CDATA[<p><a href="http://www.google.com/chrome">Google Chrome</a>을 잠시 사용해 본 느낌은 다음과 같다.</p>  <h3><strong>Fast (but not that fast)</strong></h3>  <p>내가 들어가는 사이트는 한정되어있고, 느린 사이트는 아예 들어가지 않아서, <a href="http://scriptnode.com/article/google-chrome-benchmarks/">V8의 벤치마크</a> 등에서 나타나는 Javascript 엔진의 이점을 100% 누리기는 힘든 것 같다.</p>  <p>실제로 빠른 것은 사실이지만, '빠르다'는 느낌이, 페이징이나 스크롤 방식의 차이에서도 오는 것 같다.</p>  <h3><strong>Convenient</strong></h3>  <p>Google Chrome은 나의 취향과 일치한다. 말하자면, Firefox를 처음 설치했을 때, 내 입맛에 맞도록, 설정하고, Firefox Extension들을 설치해야하는 과정들을 생략해도 된다는 점이 편리하다. 하지만, 기존의 브라우저들을 넘어서는 획기적인 개선이 있는가 하면 잘 모르겠다.</p>  <h3><strong>Final Thoughts - <strong>Yet Another Browser</strong></strong></h3>  <p>일단, Javascript가 더욱 더 보편화 되어가고 있고, 성능 문제가 되어가고 있는 시점에서, Javascript 엔진의 성능이라는 과제를 모든 브라우저 벤더에게 던져준 것을 칭찬하고 싶다.</p>  <p>하지만, 성능의 개선이나, 사용자 인터페이스 개선에도 불구하고, 내겐 또 하나의 브라우저일 뿐이다.</p>  <p>또한, 브라우저를 사용한 작업은 단순히 브라우징에만 국한되지 않고 다양하기 때문에, Firefox의 Extension으로 인한 여러가지 이점은 버릴 수 없다.</p>  <p>결국, 내가 원하는 것은 Google Chrome의 이점들이 Firefox에 잘 흡수되었으면 하는 것이다.</p>  <p>앞으로, 주로 웹 브라우징만 하는 곳 - 내 경우엔 노트북 - 에서는 Google Chrome을 사용해 볼 생각이다. 어차피 리눅스 버전은 없으니...</p>]]>
        
    </content>
</entry>

</feed>
