<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Whiteship&#039;s Note</title>
		<link>http://whiteship.me/</link>
		<description>행복한 개발자입니다.</description>
		<language>ko</language>
		<pubDate>Fri, 12 Mar 2010 21:27:36 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<image>
		<title>Whiteship&#039;s Note</title>
		<url><![CDATA[http://cfile29.uf.tistory.com/image/20655B274AEC40202CAF9A]]></url>
		<link>http://whiteship.me/</link>
		<description>행복한 개발자입니다.</description>
		</image>
		<item>
			<title>Visitor 패턴</title>
			<link>http://whiteship.me/2598</link>
			<description>&lt;a title=&quot;[http://c2.com/cgi/wiki?VisitorPattern]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://c2.com/cgi/wiki?VisitorPattern&quot;&gt;http://c2.com/cgi/wiki?VisitorPattern&lt;/a&gt;&lt;br /&gt;
&lt;a title=&quot;[http://en.wikipedia.org/wiki/Visitor_pattern]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Visitor_pattern&quot;&gt;http://en.wikipedia.org/wiki/Visitor_pattern&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;Composition 패턴을 구현한 구조물에 어떤 기능을 수행하고 싶을 때 해당 기능을 별도의 인터페이스로 분리해낸것이 Visitor 패턴. 이렇게 하여 기존의 구조물에 해당하는 코드는 변경하지 않고 그것들을 사용하는 새로운 기능을 새로 추가할 수 있으니 Open-Closed 원칙을 달성했다고 볼 수 있다.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/1179DE244B9A310D0AA326&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/1179DE244B9A310D0AA326&quot; alt=&quot;&quot; filemime=&quot;image/png&quot; filename=&quot;그림 1.png&quot; height=&quot;338&quot; width=&quot;600&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
생각해보니 이런 패턴이 적용된 것들이 꽤 많으며, 적용할 수 있는 곳도 많은 것 같다. 윈도우에서 폴더나 파일을 우클릭한 다음에 저장, 복사, 이동 등을 하는 것들이 모두 이 패턴을 이용해서 구현하지 않았을까..&lt;br /&gt;
&lt;br /&gt;게다가 ASM은 이 패턴을 사용하여 BCEL이나 SERP 같은 코드 조작 툴보다 훨씬 뛰어난 성능의 라이브러리를 제공하고 있다.&lt;br /&gt;
&lt;br /&gt;그렇다 사실은 ASM 공부하다가 맨 첨에 등장하는게 이 패턴이라 잠깐 보고 넘어가기로 한 것이다. ㅋㅋ&lt;br /&gt;
&lt;br /&gt;흠... 하지만 ASM이 조작하는 클래스 처럼 클래스 아래 변수 쫙! 메서드 쫙! 변수와 메서드에는 어트리뷰터가 쫙! 있는 단순구조가 아니라, 파일이나 폴더 처럼 파일 안에 파일 쫙! 그 안에 또 파일 쫙! 이런 트리구조라면 Visitor 패턴을 개조한 Hierarchical Visitor 패턴이 더 효율적이고 유용하겠다.&lt;br /&gt;
&lt;br /&gt;&lt;a title=&quot;[http://c2.com/cgi/wiki?HierarchicalVisitorPattern]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://c2.com/cgi/wiki?HierarchicalVisitorPattern&quot;&gt;http://c2.com/cgi/wiki?HierarchicalVisitorPattern&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;자 어서 ASM도 보도록 하자. ㄱㄱㄱㄱ&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2598-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Design Pattern</category>
			<category>Visitor 패턴</category>
			<category>디자인 패턴</category>
			<author>기선</author>
			<guid>http://whiteship.me/2598</guid>
			<comments>http://whiteship.me/2598#entry2598comment</comments>
			<pubDate>Fri, 12 Mar 2010 21:26:52 +0900</pubDate>
		</item>
		<item>
			<title>[Agile 번역] 어떻게 하면 번역을 기민하게 할 수 있을까?</title>
			<link>http://whiteship.me/2597</link>
			<description>번역은 쉽지 않다. 하지만 나름 재미는 있다. 돈은 되지 않지만, 하고 나면 뿌듯하다. 책으로 치면 지금하고 있는 책까지 두 권째다. 난 번역을 잘하지 못한다. 한글 실력이 엉망이고 책읽기를 별로 좋아하지 않아서 인지 문학 도서에 비하면 비교적 쉬운 영어를 사용하는 서적들 임에도 불구하고 한글 문장으로 옮기는 일이 쉽지 않다. 그래도 최소한 내가 다시 읽었을 때 이해할 수 있을 정도의 수준 만큼은 달성하고자 노력한다.&lt;div id=&quot;&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;cjabiokabamngnbigeeibddnihgllkggmousedown-target-element&quot;&gt;
그렇게 어렵사리 번역을 하고나면 사실 다른 사람의 시각에서 읽었을 때 어떠한지 궁금하다. 그래서 베타리딩을 한다. 베타리딩을 하면서 내가 미처 감지하지 못했던 어색한 부분과 이해 못할 만한 부분이 드러난다. 그 부분을 개선하는 작업은 중요하다. 내가 읽었을 때 이해할 수 있었던 건 난 원문의 내용을 읽었기 때문이다. 그래서 원문을 보지 않고도 이해할 수 있는지 알려면 반드시 베타리딩이 필요하다. 코딩으로 치면 일종의 테스트다. 그런데 베타리딩도 쉽지 않다. 하이버네이트 같은 경우 한 챕터당 워드로 100페이지 정도가 된다. 넘는 것도 있고 덜 되는 것도 있지만 대충 그렇다. 그걸 바쁜 개발자들에게 읽어달라고 부탁하기가 참 뭐하다. 그 분들이 받는 댓가라고는 책을 미리 읽어볼 수 있다는 것 정도?&lt;/div&gt;
&lt;div id=&quot;&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;&quot;&gt;
그래서 이런 저런 이유로 고민 중에 번역에도 Agile 기법을 도입하면 어떨까 하는 생각이 들었다. 그래서 상상을 해봤다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(203, 203, 203); border-right-color: rgb(203, 203, 203); border-bottom-color: rgb(203, 203, 203); border-left-color: rgb(203, 203, 203); background-color: rgb(255, 255, 255); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;div&gt;
&lt;b&gt;페어 번역&lt;/b&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
두 명이 앉아서 번역을 한다. 한명은 부르고 한명은 타이핑 하거나 그 반대로 한명이 읊으면서 동시에 타이핑도 하고 옆 사람은 보고 있다가 이상한 문장이나 틀린걸 봐주면 될 것 같다. 하지만 이건 번역으로 먹고 사는 사람이 아닌 이상 힘들어 보인다. 그렇게 30분 정도 번역을 한 다음 교대한다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
이런식으로 하루에 2시간을 번역한다고 쳤을 때 두 사람은 각각 1시간 번역 1시간 리뷰를 하게 된다. 한 사람이 2시간을 번역할 때와 2사람이 각각 1시간 번역/1시간 리뷰를 했을 때의 생산량과 품질을 확인해보고 싶다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;리뷰 퍼스트 번역&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
타이핑을 하기 전에 먼저 말로 리뷰를 한다. 아 이 문장은 대충 요러 요러한 이야기 같네요. 이렇게 옮기겠습니다. 라고 말을 한 뒤에 타이핑을 한다. 그리고 타이핑이 끝나면 옆 사람과 리팩토링을 진행한다. 어설프거나 한글 어법에 어긋나면 교정한다. 나중에 QA 팀 겪인 출판사의 검수자가 봐주겠지만 최소한의 품질을 보장하기 위한 수단이라고 보면 되겠다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
페어 번역을 진행할 때 타이핑만 하지 않고 리뷰를 함으로써 대화를 유도할 수 있다. 하지만 대화가 목적은 아니기에 잡담으로 새는 일이 없게 주의해야겠다. 리뷰를 최소화하고 바로 타이핑을 한다. 그 다음 리팩토링에 해당하는 작업도 반드시 단락 단위나 문자 단위로 하는게 좋겠다. 이런 과정이 없다면 페어 번역을 하는 의미가 없으니 이렇게 하지 않을꺼면 페어 번역을 하지 않는게 좋겠다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;&quot;&gt;
&lt;b&gt;점진적인 베타리딩&lt;/b&gt;&lt;/div&gt;
&lt;div id=&quot;&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;&quot;&gt;
베타리더에게 전달하는 과정을 일종의 배포로 간주하고 Agile 기법인 여러번 그리고 점진적으로 배포하는 수단을 번역에도 도입하면 어떨까. 예를 들어 베타리딩 주기를 1주일로 잡고 1주일치 번역한 내용을 베타리더에게 공개한다. 그리고 피드백을 받은 다음 그 주 초에 지난 배포의 개선 작업을 한 다음에 주 중~말까지 새로운 번역 작업을 진행하는 식이다.&lt;/div&gt;
&lt;div id=&quot;&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;cjabiokabamngnbigeeibddnihgllkggmousedown-target-element&quot;&gt;
베타리더에게 한번에 100 페이지씩 읽어야 하는 부담을 줄일 수 있고 피드백을 초기에 받음으로써 나중에 뭉탱이로 중복적인 피드백을 받는 것을 개선할 수 있을 것 같다. 하지만 베타리더도 번역자 못지않게 기민해야 할 것이다.&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;cjabiokabamngnbigeeibddnihgllkggmousedown-target-element&quot;&gt;
&lt;/div&gt;
&lt;div id=&quot;cjabiokabamngnbigeeibddnihgllkggmousedown-target-element&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;cjabiokabamngnbigeeibddnihgllkggmousedown-target-element&quot;&gt;
다음 번역은 봄싹에서 진행할 계획인데 이 세가지를 시도해 봐야겠다.&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cjabiokabamngnbigeeibddnihgllkggmousedown-target-element&quot;&gt;
과연.. 어떨까.. 후훗.. 재밌을 것 같다.&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2597-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Thinking</category>
			<category>agile</category>
			<category>번역</category>
			<author>기선</author>
			<guid>http://whiteship.me/2597</guid>
			<comments>http://whiteship.me/2597#entry2597comment</comments>
			<pubDate>Fri, 12 Mar 2010 11:09:50 +0900</pubDate>
		</item>
		<item>
			<title>[ClassLoader] Thread의 getContextClassLoader()</title>
			<link>http://whiteship.me/2596</link>
			<description>pdf: &lt;a href=&quot;http://www.theserverside.com/tt/articles/content/dm_classForname/DynLoad.pdf&quot;&gt;http://www.theserverside.com/tt/articles/content/dm_classForname/DynLoad.pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
먼저 간단한 퀴즈로 시작하는.. 긴 문서..&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/12783C184B98ACDD2026BC&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/12783C184B98ACDD2026BC&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;1.jpg&quot; height=&quot;636&quot; width=&quot;546&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
이 코드가 문제를 일으킬 수 있는 상황은 저 클래스를 자바 Extentions 폴더 (&amp;lt;JDK&amp;gt;/jre/lib/ext 또는 &amp;lt;JRE&amp;gt;/lib/ext)에 놓았을 경우입니다. 그렇지 않고 그냥 CLASSPATH에 둘었다면 별 문제가 없을 가능성이 큽니다. 대체 저런식으로 동적으로 로딩하려는 클래스들이 App CL의 CLASSLOADER에 있기 마련일 테니까요.&lt;br /&gt;
&lt;br /&gt;
하지만, Extention 폴더로 이동하면 무슨일이 벌어질까요. ClassNotFoundExcepion이 발생합니다. 그 원인을 정확히 모르신다면 ClassLoader에 대한 아주 기본적인 개념이 부족한거라 봐도 무방하겠습니다.&lt;br /&gt;
&lt;br /&gt;
이 글에서 그에 대한 해결책 두 개를 제공해주며, 그 중 하나가 바로 쓰레드 컨텍스트 클래스로더를 사용하는 것입니다. &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;a title=&quot;[ http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#getContextClassLoader%28%29]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;%20http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#getContextClassLoader%28%29&quot;&gt;http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#getContextClassLoader%28%29&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Returns the context ClassLoader for this Thread. The context ClassLoader is provided by the creator of the thread for use by code running in this thread when loading classes and resources. If not set, the default is the ClassLoader context of the parent Thread. The context ClassLoader of the primordial thread is typically set to the class loader used to load the application.&lt;br /&gt;
&lt;br /&gt;
First, if there is a security manager, and the caller&#039;s class loader is not null and the caller&#039;s class loader is not the same as or an ancestor of the context class loader for the thread whose context class loader is being requested, then the security manager&#039;s checkPermission method is called with a RuntimePermission(&quot;getClassLoader&quot;) permission to see if it&#039;s ok to get the context ClassLoader.&lt;/blockquote&gt;&lt;br /&gt;
별짓을 하지 않는다면 쓰레드 컨텍스트 클래스로더는 System(또는 Application) CL이 됩니다. 따라서 저 위의 코드를 자바 extentions 폴더에 넣고 실행하더라도 쓰레드 컨텍스트 클래스로더를 가져와서 loadClass를 호출하면 아무런 문제없이 동작합니다.&lt;br /&gt;
&lt;br /&gt;
안그래도 대체 Thread Context ClassLoader가 왜 생긴건지 궁금했는데 이 글을 통해서 짐작할 수 있게 됐습니다. 클래스로더 계층 구조를 만들 때, 예를 들어 톰캣의 Common CL 같은 녀석은 자기 하위의 CL인 WebAPP CL에 어떤 클래스들이 들어올지 모를겁니다. 하지만 그런 상태에서 Common CL에서 WebAPP CL에서만 로딩할 수 있는 어떤 클래스를 로딩할 필요가 있다면... WebAPP CL을 직접 참조하지 않고 바로 Thread Context ClassLoader를 사용해서 로딩하도록 코딩을 하면 로딩할 수 있게 되는거죠.&lt;br /&gt;
&lt;br /&gt;
흠.. 하지만 이.. 미적지근한 느낌은 뭘까요.. 왠지 상위 CL에서 하위 CL의 클래스패스에 있는걸 로딩해버리면 왠지 꼬여버릴 것만 같은 이 기분... 아.. 불안해. 왜 그럴까나.. &lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2596-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Java</category>
			<category>ClassLoader</category>
			<category>Java</category>
			<category>Thread Context ClassLoader</category>
			<author>기선</author>
			<guid>http://whiteship.me/2596</guid>
			<comments>http://whiteship.me/2596#entry2596comment</comments>
			<pubDate>Thu, 11 Mar 2010 17:57:58 +0900</pubDate>
		</item>
		<item>
			<title>[구글 Visualization API] Fluent Interface 적용하기</title>
			<link>http://whiteship.me/2595</link>
			<description>&lt;a title=&quot;[http://martinfowler.com/bliki/FluentInterface.html]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://martinfowler.com/bliki/FluentInterface.html&quot;&gt;http://martinfowler.com/bliki/FluentInterface.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;이름은 좀 멋지지만 별거 아니라는... &lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Statistics statistics = new Statistics(StatisticsChartType.MOTION, &quot;스터디 참석자 통계 그래프&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statistics.addColumn(StatisticsColumnType.STRING, &quot;스터디 이름&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statistics.addColumn(StatisticsColumnType.DATE, &quot;모임 날짜&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statistics.addColumn(StatisticsColumnType.NUMBER, &quot;참석자 수&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statistics.addColumn(StatisticsColumnType.NUMBER, &quot;모임 횟수&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statistics.addColumn(StatisticsColumnType.NUMBER, &quot;참석율&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statistics.addColumn(StatisticsColumnType.STRING, &quot;스터디 상태&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statistics.addColumn(StatisticsColumnType.STRING, &quot;모임명 이름&quot;);&lt;br /&gt;
&lt;br /&gt;이 코드는 얼마전에 봄싹 사이트에 Statistics 메뉴를 추가하면서 코딩한 것인데 오늘 보다가 갑자기 Fluent Interface가 떠올랐습니다. 그래서 적용해봤지요.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Statistics statistics = new Statistics(StatisticsChartType.MOTION, &quot;스터디 참석자 통계 그래프&quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .withColumn(StatisticsColumnType.STRING, &quot;스터디 이름&quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .withColumn(StatisticsColumnType.DATE, &quot;모임 날짜&quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .withColumn(StatisticsColumnType.NUMBER, &quot;참석자 수&quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .withColumn(StatisticsColumnType.NUMBER, &quot;모임 횟수&quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .withColumn(StatisticsColumnType.NUMBER, &quot;참석율&quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .withColumn(StatisticsColumnType.STRING, &quot;스터디 상태&quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .withColumn(StatisticsColumnType.STRING, &quot;모임명 이름&quot;);&lt;br /&gt;
&lt;br /&gt;조금 fluent 하게 보이나요??ㅋ 객체를 다 만든 다음에 추가하는게 아니라 객체 만들 때 메서드를 연달아 호출하는 모양이여서 메서드 이름을 add -&amp;gt; with로 변경했습니다. 메서드 리턴 타입도 당연히 바꿨지요. &lt;br /&gt;
&lt;br /&gt;장점은 저렇게 조금 API가 이쁘고 사용하기 편해진다는 것이고 단점은 디버깅할 때 조금 불편할 수 있다는데.. 머.. 글쎄요. 그다지...&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2595-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Coding</category>
			<category>Fluent Interface</category>
			<author>기선</author>
			<guid>http://whiteship.me/2595</guid>
			<comments>http://whiteship.me/2595#entry2595comment</comments>
			<pubDate>Thu, 11 Mar 2010 14:18:50 +0900</pubDate>
		</item>
		<item>
			<title>[거꾸로 읽는 세계사] 드레퓌스 사건을 보고서...</title>
			<link>http://whiteship.me/2594</link>
			<description>요즘 역사 공부를 하는 중인데 그 두번째 책으로 선택한게 &#039;거꾸로 읽는 세계사&#039;다. 오래전에 쓴 책이고 2009년에 개정했다지만 역시 약간의 운동권 냄새(?)가 나긴 난다. 하지만 뭐 어떠하리.. 내가 생각할 수 있게 해주는 책이면 그만이다.&lt;br /&gt;
&lt;br /&gt;
구글링 해보면 대략 나오기 때문에 자세한 사건 소개는 안하고 시간만 요약해 봅니다. &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid rgb(203, 203, 203); padding: 10px; background-color: rgb(255, 255, 255);&quot; class=&quot;txc-textbox&quot;&gt;
1894년 12월: 드레퓌스 죄없이 유태인이기 때문에 누명을 쓰고 무기징역 선고 받음. 소위 &#039;악마섬&#039;이라 불리는 곳으로 끌려감.&lt;br /&gt;
&lt;br /&gt;
1896년 3월: 피카르 중령이 진짜 반역자 에스테라지 발견. 상부에 보고하지만 묵살 당함.&lt;br /&gt;
&lt;br /&gt;
1898년 1월 13일: 에밀 졸라가 &#039;로로르&#039;라는 신문에 대통령에게 보내는 &#039;나는 고발한다.&#039;라는 공개 편지 기고.&lt;br /&gt;
&lt;br /&gt;
1898년 8월 30일: 앙리 중령 자살. 진실이 탄로날까 두려워서..&lt;br /&gt;
&lt;br /&gt;
1899년 6월 3일: 재심이 열림. 하지만 7명의 재판관 중 2명의 재판관만 드레퓌스 편을 들어 줌. 결국 드레퓌스는 &#039;정상을 참작하여&#039; 10년 형 선고 받음. 에밀 졸라가 다시 펜을 든다.&lt;br /&gt;
&lt;br /&gt;
1899년 9월 19일: 드레퓌스 특별 사면. 드레퓌스를 지지했던 시민들 실망. 왜냐면.. 사면이라는게 자신의 죄를 인정해야 받을 수 있는 것이었기 때문에.&lt;br /&gt;
&lt;br /&gt;
1902년: 에밀 졸라 석탄난로 가스 때문에 자다가 질식사. 옛날에 연탄 가스 때문에 죽는 것과 비슷한 듯.. 하지만 죽음이 석연찮은건 사실.&lt;br /&gt;
&lt;br /&gt;
1904년 3월: 드레퓌스 재심 청구&lt;br /&gt;
&lt;br /&gt;
1906년 7월 12일: 드레퓌스 무죄 선고&lt;/div&gt;
&lt;br /&gt;
내가 보기엔 드레퓌스 사건은 특별 사면을 받은 시점에서 끝났다. 드레퓌스가 &#039;사면&#039;을 받았다고 해서 실망할수도 있겠지만, 당사자가 아니고서는 그러면 안된다. 자신이 유배 당했는데도 끝까지 남편을 위해서 고생해준 아내를 두고 어떻게 그 고통을 어떻게 지속하겠는가. 차라리 억울하더라도 &#039;사면&#039;을 받고 세상으로 나와서 다시 자신의 죄를 벗기는데 노력했으니 아주 현명한 선택이었다고 생각한다.&lt;br /&gt;
&lt;br /&gt;
여기에 견줄만큼은 아니지만 이와 비슷한 사건은 저 뒤로도 전 세계에서 많이 발생했을 것이다. 저 사건으로 인해 프랑스를 비롯한 유럽에서 &#039;인권&#039;을 중요시 하게 되었다는 단순한 결론으로 끝나는건 정말 아쉬운 일이다. &lt;br /&gt;
&lt;br /&gt;
저 사건은 비양심적인 대규모 집단과 양심적인 소수와의 싸움이다. 그 힘들고 때로는 승리가 불가능해 보이는 싸움에서도 얌심이 승리하는 방법을 알려준 역사적인 의미를 지니고 있다. 사실 책에서는 민중의 역할을 중요하게 본다. 아마도 이는 저자가 민중의 단결을 원했기 때문일 수도 있고 어쩌면 일부는 사실일 수도 있다. 하지만 난 그렇게 생각하지 않는다. 민중은 그냥 자기 맘에 드는걸 따라갔을 뿐이지. 그게 옳고 그른지 생각하는 건 한참이 지나서야 가능한 일인 것 같다. (이점에 대해서는 아직도 생각을 정리하는 중이라 나중에 자세히 쓸 생각이다.) 따라서 나는 민중 보다는 &#039;창조적 소수자&#039; &#039;양심적인 지성인&#039;의 역할이 민중의 역할보다 크다고 생각한다.&lt;br /&gt;
&lt;br /&gt;
그 양심의 편에 서있던 대표적인 인물이 에밀 졸라 였다. 이미 프랑스에서 성공한 작가로 굳이 저런 일에 뛰어들지 않아도 혼자 잘먹고 잘 살 수 있었을텐데 그 사람은 왜 무모할 정도로 저런 일에 뛰어든걸까.&lt;br /&gt;
&lt;br /&gt;
에밀 졸라 같이 절대 다수를 상대로 자신의 신념을 굽히지 않았던 사람들은 역사적으로 많은 것 같다. 가톨릭 교회가 면죄부를 팔던 시절에 &#039;루터&#039;라는 사람도 그러했고, 사대주의에 쩔어있던 고려시대의 &#039;묘청&#039;도 그러했다. 언론과 맞짱뜬 &#039;노무현&#039; 전대통령은 어떠한가.&lt;br /&gt;
&lt;br /&gt;
내가 이런 역사를 통해서 궁금한건 바로 저 사람들이다. 대체 무엇때문에.. 왜... 저 사람들은 피곤한 길을 선택한 것일까. 아니 피곤하다 못해 자신의 목숨이 달려있는 일에 뛰어든 것일까. 하다못해 어느정도 승부수라도 보이면 모르겠다. 그런데 전혀 그런 상황이 아니었단 말이다.&lt;br /&gt;
&lt;br /&gt;
다시 본 사건으로 돌아가서 에밀 졸라가 &#039;나는 고발한다&#039;는 글을 썼을 당시 드레퓌스는 이미 정부, 군대, 반유태인 세력 등 대다수로부터 미움을 받고 낙인이 찍힌 상태였다. 군국주의자들의 위신을 떨어뜨릴 수 있기 때문에 이미 진범도 알고 있으면서도 건들지 않았다. 오히려 진범인 에스테라지는 영국으로 망명가서 &#039;다 위에서 시킨일이다&#039;라는 내용의 책까지 썼다. 어디 그뿐인가. 시민들도 동요하여 유태인 상점을 부수고 다니며 드레퓌스 재심 반대파를 결성하여 드레퓌스 지지 세력과 싸움을 하고 다녔다. 그런 시대에 과감하게 펜을 들어 대통령에게 글을 보내다니.. 이게 말이나 되는 소~리?&lt;br /&gt;
&lt;br /&gt;
지금 대한민국으로 따지면 한국을 대표 할만한 소설가(이외수가 그정도 되려나? 흠; 누가 노벨 문학상이라도 받았어야지 원.. )가 이명박한테 제발 4대강 한다면서 땅좀 파헤치지 말라고. &#039;너는 삽질한다.&#039;라는 장문의 비판글을 써제낀 겪이나 다름없다.&lt;br /&gt;
&lt;br /&gt;
대체 그런 용기와 심념은 어디서 나오는 것일까... &lt;br /&gt;
혹시 모르니.. 다음에는 에밀 졸라가 쓴 &#039;진실&#039;이라는 소설을 봐야겠다.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2594-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Reading</category>
			<category>드레퓌스 사건</category>
			<category>에밀 졸라</category>
			<author>기선</author>
			<guid>http://whiteship.me/2594</guid>
			<comments>http://whiteship.me/2594#entry2594comment</comments>
			<pubDate>Wed, 10 Mar 2010 10:51:23 +0900</pubDate>
		</item>
		<item>
			<title>Class.forName()와 ClassLoader.loadClass() 차이점</title>
			<link>http://whiteship.me/2593</link>
			<description>&lt;a href=&quot;http://www.javaworld.com/javaworld/javaqa/2003-03/01-qa-0314-forname.html?page=1&quot;&gt;http://www.javaworld.com/javaworld/javaqa/2003-03/01-qa-0314-forname.html?page=1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
일단 Class.forName() 메서드는 인자가 한 개 짜리인 것과 세 개 짜리인 것이 있습니다.&lt;br /&gt;
&lt;br /&gt;
static Class&amp;lt;?&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; forName(String className)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns the Class object associated with the class or interface with the given string name.&lt;br /&gt;
&lt;br /&gt;
static Class&amp;lt;?&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; forName(String name, boolean initialize, ClassLoader loader)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns the Class object associated with the class or interface with the given string name, using the given class loader.&lt;br /&gt;
&lt;br /&gt;
1. 클래스를 로딩할 때 사용하는 클래스로더 차이&lt;br /&gt;
&lt;br /&gt;
인자가 한개 짜리인 forName(String) 메서드는 클래스를 로딩할 때 사용하는 클래스로더가 저 코드를 실행하는 클래스로더가 됩니다. 하지만 ClassLoader.loadClass()를 사용하면 당연히 자기 자신을 사용해서 클래스 로딩을 실행하게 되죠. (그렇다고 해서 반드시 해당 클래스로더가 읽어온다는 보장은 없죠. 그 부모가 읽어올 수도 있고 클래스 패스에 없을 수도 있고 암튼 여기서 로딩한다는 건 로딩을 시도한다고 보시기 바랍니다.)&lt;br /&gt;
&lt;br /&gt;
하지만 Class.forName(String, boolean, ClassLoader)를 사용하면 클래스 로더를 지정해 줄 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
2. 초기화&lt;br /&gt;
&lt;br /&gt;
Class.forName(String) 메서드를 사용하면 곧바로 클래스의 static 초기화 블럭과 static 멤버 변수의 값을 초기화 합니다. 하지만 ClassLoader.loadClass()를 사용하면 해당 클래스를 처음으로 사용하기 전까지 초기화가 지연됩니다.&lt;br /&gt;
&lt;br /&gt;
이것 역시 Class.forName(String, boolean, ClassLoader)의 두번째 인자값을 이용하여 조절할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
- 클래스 초기화 에러&lt;br /&gt;
&lt;br /&gt;
만약 Class.forName(String)을 사용해서 로딩할 때 static 영역에서 에러가 난다면 해당 클래스는 다시 로딩할 수가 없습니다. 특정 클래스로더가 일단 로딩한 클래스는 다시 로딩할 수가 없죠. 그래서 NoClassDefinitionFound 에러가 날 수도 있습니다.&lt;br /&gt;
&lt;br /&gt;
이때는 해당 클래스로더 인스턴스를 버리고 새로 만들어야 하는데 그럴 때를 대비해 인자 세개짜리 forName을 쓰라는군요. &lt;br /&gt;
&lt;br /&gt;
결국 forName()으로 클래스를 로딩할 떄는 별 개의 클래스로더를 쓰라는건데... 흠.. 그렇게 단순해 보이지가 않는데;; 머 클래스로더를 지정해 둔다고 해봤자. 보통 App CL로 읽어올테고 그럼 App CL 인스턴스를 버리라고?? 에이;; 그건 좀.. &lt;br /&gt;
&lt;br /&gt;
forName으로 읽어올 클래스를 클래스패스를 가지고 있으면서 parent로 위임하지도 않는 CL을 이용해서 forName으로 읽은 경우라면 뭐 괜찮을지도.. 어쨋거나 직접 통제가 가능한 클래스로더를 사용해야 겠군요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2593-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Java</category>
			<category>Class.forName()</category>
			<category>ClassLoader.loadClass()</category>
			<category>클래스로더</category>
			<author>기선</author>
			<guid>http://whiteship.me/2593</guid>
			<comments>http://whiteship.me/2593#entry2593comment</comments>
			<pubDate>Tue, 09 Mar 2010 18:04:02 +0900</pubDate>
		</item>
		<item>
			<title>[Google Visualization API] 캬.. 멋지구나~</title>
			<link>http://whiteship.me/2592</link>
			<description>&lt;a title=&quot;[http://code.google.com/intl/ko-KR/apis/visualization/interactive_charts.html]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/intl/ko-KR/apis/visualization/interactive_charts.html&quot;&gt;http://code.google.com/intl/ko-KR/apis/visualization/interactive_charts.html&lt;/a&gt;&lt;br /&gt;
&lt;a title=&quot;[http://code.google.com/intl/ko-KR/apis/visualization/documentation/index.html]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/intl/ko-KR/apis/visualization/documentation/index.html&quot;&gt;http://code.google.com/intl/ko-KR/apis/visualization/documentation/index.html&lt;/a&gt;&lt;br /&gt;
&lt;a title=&quot;[http://code.google.com/intl/ko-KR/apis/visualization/documentation/using_overview.html]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/intl/ko-KR/apis/visualization/documentation/using_overview.html&quot;&gt;http://code.google.com/intl/ko-KR/apis/visualization/documentation/using_overview.html&lt;/a&gt;&lt;br /&gt;
&lt;a title=&quot;[http://code.google.com/intl/ko-KR/apis/visualization/documentation/reference.html]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/intl/ko-KR/apis/visualization/documentation/reference.html&quot;&gt;http://code.google.com/intl/ko-KR/apis/visualization/documentation/reference.html&lt;/a&gt;&lt;br /&gt;
&lt;a title=&quot;[http://code.google.com/apis/ajax/playground/?type=visualization#motion_chart]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/apis/ajax/playground/?type=visualization#motion_chart&quot;&gt;http://code.google.com/apis/ajax/playground/?type=visualization#motion_chart&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile30.uf.tistory.com/original/174274264B93B1535A8428&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile30.uf.tistory.com/image/174274264B93B1535A8428&quot; alt=&quot;&quot; filemime=&quot;image/png&quot; filename=&quot;그림 2.png&quot; height=&quot;377&quot; width=&quot;600&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
09-10 시즌 보딩을 저번 주를 끝으로 접었더니 주말에 갑자기 시간이 좀 생겼네요.&lt;br /&gt;
심심해서 낮에는 본가에 다녀오고 저녁에는 와이프가 공부하느라 흑흑.. 저는 코딩이나... &lt;br /&gt;
&lt;br /&gt;&lt;a title=&quot;[http://springsprout.org/statistics/index.do]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://springsprout.org/statistics/index.do&quot;&gt;http://springsprout.org/statistics/index.do&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2592-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Coding</category>
			<category>구글 비주얼 API</category>
			<author>기선</author>
			<guid>http://whiteship.me/2592</guid>
			<comments>http://whiteship.me/2592#entry2592comment</comments>
			<pubDate>Sun, 07 Mar 2010 23:12:08 +0900</pubDate>
		</item>
		<item>
			<title>톰캣 메일링 리스트 가입하기</title>
			<link>http://whiteship.me/2591</link>
			<description>&lt;a title=&quot;[http://tomcat.apache.org/lists.html#tomcat-dev]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://tomcat.apache.org/lists.html#tomcat-dev&quot;&gt;http://tomcat.apache.org/lists.html#tomcat-dev&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;1. 메일 보내기&lt;br /&gt;
&lt;br /&gt;위 페이지에서 원하는 메일링 리스트로 메일을 보낸다. 제목도 없고 본문도 없이 그냥 빈 메일..&lt;br /&gt;
&lt;br /&gt;2. 답장하기&lt;br /&gt;
&lt;br /&gt;그럼 조금 뒤에 메일이 한통오는데 잘 읽어보면 결국 확인할겸 해당 주소로 답장을 보내달라는 것이다.&lt;br /&gt;
그냥 답장 버튼을 눌러서 간단하게 적어서 전송하면 된다.&lt;br /&gt;
&lt;br /&gt;3. 확인하기&lt;br /&gt;
&lt;br /&gt;그럼 확인 메일이 또 한통 온다.&lt;br /&gt;
&lt;br /&gt;끝.&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2591-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Coding</category>
			<category>mailing</category>
			<category>tomcat</category>
			<author>기선</author>
			<guid>http://whiteship.me/2591</guid>
			<comments>http://whiteship.me/2591#entry2591comment</comments>
			<pubDate>Fri, 05 Mar 2010 20:34:58 +0900</pubDate>
		</item>
		<item>
			<title>[스프링 3.0] @Async 테스트</title>
			<link>http://whiteship.me/2590</link>
			<description>@Async 애노테이션을 사용한 메서드의 반환 타입은 둘 중 하나여야 합니다. void 거나.. java.util.concurrent.Future 타입이어야 한다네요. 뭐.. 그러니까 사실상 하나나 마찬가지이죠. 그렇다고 해서 다른 리턴타입으로 설정하면 비동기로 동작하지 않는 건 아닙니다. 다만;; 해당 메서드의 클라이언트 입장에서 보면 리턴값이 전부 null 이기 때문에 황당한 경우가 발생할테지만 말이죠.&lt;br /&gt;
&lt;br /&gt;스프링에서 Future 인터페이스의 구현체로 AsyncResult를 제공해줍니다. 이걸 이용해서 간단하게 Thread를 반환하는 비동기 메서드를 만들었습니다.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Async&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public Future&amp;lt;Thread&amp;gt; more() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new AsyncResult&amp;lt;Thread&amp;gt;(Thread.currentThread());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;@Async는 @Transaction과 비슷하게 타입에 선언할 수도 있습니다. 그러면 해당 클래스의 모든 메서드가 비동기 메서드로 처리되겠죠.&lt;br /&gt;
&lt;br /&gt;&amp;lt;task:executor id=&quot;myExecutor&quot; pool-size=&quot;5&quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;쓰레드 풀 갯수를 5개로 설정해 놓고 다음과 같이 테스트를 해봤습니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Test&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void async() throws Exception {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assertThat(beanService, is(notNullValue()));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set&amp;lt;Thread&amp;gt; threads = new HashSet&amp;lt;Thread&amp;gt;();&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; 200 ; i++){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collectThreadInfo(beanService.more(), threads);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assertThat(threads.size(), is(5));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assertThat(threads.contains(beanService.more().get()), is(true));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void collectThreadInfo(Future&amp;lt;Thread&amp;gt; future, Set&amp;lt;Thread&amp;gt; threads) throws Exception {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; threads.add(future.get());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;200번까지 안돌려도 상관없지만. 그냥.. 충분히 돌려서 쓰레드 풀에 있는 모든 쓰레드를 컬렉션에 모아둔 다음에 쓰레드 풀에서 만든 쓰레드 갯수를 확인하고 마지막으로 한 번 더 호출해서 반환 받은 Thread가 현재까지 사용한 쓰레드 중 하나인지 확인합니다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2590-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>3.0</category>
			<category>@Async</category>
			<category>Spring</category>
			<author>기선</author>
			<guid>http://whiteship.me/2590</guid>
			<comments>http://whiteship.me/2590#entry2590comment</comments>
			<pubDate>Thu, 04 Mar 2010 17:55:29 +0900</pubDate>
		</item>
		<item>
			<title>[MySQL Administrator] Row 갯수 제대로 못세나?</title>
			<link>http://whiteship.me/2589</link>
			<description>&lt;div&gt;
스키마 테이블 탭에서 보여주는 Rows 갯수는 믿지 못하겠습니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/1265C61A4B8E116424355C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/1265C61A4B8E116424355C&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;1.jpg&quot; height=&quot;56&quot; width=&quot;497&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;
리프래시를 하면..&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/12743F1A4B8E116505005E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/12743F1A4B8E116505005E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;2.jpg&quot; height=&quot;56&quot; width=&quot;480&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
헐.. 갯수가 계속 바뀝니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/1307A51C4B8E11CE3C213C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/1307A51C4B8E11CE3C213C&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;3.jpg&quot; height=&quot;218&quot; width=&quot;537&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;&quot;&gt;
이렇게 찍으면 정확한 갯수가 나오는데 말이죠. 왜이런담; 멀라 멀라. @_@&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-2589-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Good Tools</category>
			<category>MySQL</category>
			<category>MySQL Administrator</category>
			<author>기선</author>
			<guid>http://whiteship.me/2589</guid>
			<comments>http://whiteship.me/2589#entry2589comment</comments>
			<pubDate>Wed, 03 Mar 2010 16:38:58 +0900</pubDate>
		</item>
	</channel>
</rss>
