<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Openlook Stories</title><link>http://openlook.org/</link><description>Latest posts on Openlook Stories</description><language>ko</language><lastBuildDate>Mon, 21 Jul 2008 15:25:48 -0000</lastBuildDate><itunes:author>Hye-Shik Chang</itunes:author><itunes:explicit>no</itunes:explicit><itunes:subtitle>Latest posts on Openlook Stories</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Tech News" /></itunes:category><geo:lat>37.5654</geo:lat><geo:long>126.9309</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/hyeshik" type="application/rss+xml" /><item><title>파이쿠차 -오랜만의 파이썬 마을 모임!</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/342429981/</link><description>





&lt;p&gt;다음 주(7월 27일-8월 2일)에 오랜만에 &lt;a href="http://www.onoffmix.com/e/krho/192"&gt;애자일 개발 워크샵&lt;/a&gt; 일로 1주일 동안 서울에 머물게 됐습니다. 그래서 서울 방문 기념으로 거의 1년 만에 &lt;a href="http://python.kr"&gt;파이썬 마을&lt;/a&gt; 모임을 한 번 하려고 합니다.
&lt;/p&gt;
&lt;p&gt;지난 번에 다른 행사의 부대행사로 파이썬 관련 세션을 하나 생각하면서, 자기가 파이썬을 쓰는 분야에  대해서 얘기하고 토론하는 걸 좀 생각해 봤었는데요. 최근에 &lt;a href="http://www.pechakucha.or.kr/"&gt;페차쿠차&lt;/a&gt;라는 걸 보고 한 번 "&lt;strong&gt;내가 파이썬을 쓰는 곳/파이썬으로 만든 것&lt;/strong&gt;"을 페차쿠차 형식으로 한 번 해 보면 어떨까 생각했습니다.
&lt;/p&gt;
&lt;p&gt;페차쿠차는 발표 포맷이 정해져 있는데요, 슬라이드 20장을 각 20초 씩 해서 총 6분 발표를 해야합니다. 보통 많은 사람들이 발표하는 곳 가면 거의 반 정도는 발표하는 사람을 제발 끌어내리고 싶은 유혹을 받는데 그런 걸 줄이기 위한 포맷이라고 하네요. 그래서 이번에는 20장은 보통 엄청 오래 한 분 아니라면 회사 기밀까지 나와야할 것 같아서, 12장 * 20초 해서 4분으로 하면 좋을 것 같네요. 중요한 것은 슬라이드는 자동으로 넘어가니까 한 슬라이드에서 시간을 마음대로 조절해서 쓸 수는 없다는 게 페차쿠차의 기본 원리라고 합니다. (다양한 분야에 활용하시는 분들이 참석하셔서 경험을 나누시면 좋겠습니다!)
&lt;/p&gt;
&lt;p&gt;혹시 장소나 시간에 대해서 좋은 생각이나 제안 (또는 장소제공) 등 남기실 말씀이 있는 분들은 알려주세요. ^^ 대략 인원 추산도 해야하니 참석하실 수 있는 분들 답글 남겨주시면 고맙겠습니다~
&lt;/p&gt;
</description><pubDate>Mon, 21 Jul 2008 15:25:48 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/07/22/python-maeul-pechakucha/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/07/22/python-maeul-pechakucha/</feedburner:origLink></item><item><title>인스턴스 복사를 직접 다루기</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/332512487/</link><description>





&lt;p&gt;종종 한 인스턴스를 대량으로 복제해서 약간씩 바꿔야할 일이 있습니다.
   주로 진화 알고리즘 계열이나 고치기 전/후를 비교해야하거나, 엄청나게 바꾼 뒤에
   롤백을 해야한다는 등의 경우가 그런데요.
   파이썬에서 복사는 기본 타입들은 각각 독특한 방법이 있지만, 보통은
   &lt;a href="http://docs.python.org/lib/module-copy.html"&gt;copy모듈&lt;/a&gt;을 쓰면 간단합니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x83992ec&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x839970c&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;그런데 철학적(?)인 분위기를 잡으며 경험이 조금 더 많은 사람이 쓱 나타나서
   "너 깊은 복사랑 얕은 복사 알아?"라고 할 것 같은 느낌이 언제나 &lt;code&gt;copy&lt;/code&gt;를
   쓸 때마다 들곤 하죠;  깊은 복사(deep copy)는 참조하고 있는 객체 모두를
   복사하기 때문에 속성으로 들어있는 놈들까지 별개의 인스턴스가 돼서
   완전히 떨어집니다. 얕은 복사에서는 참조는 복사하지 않고 자신만 복사하기 때문에
   리스트같은 것들이 공유가 되는 특징이 있습니다. 물론 얕은 복사가 훨씬 빠르고
   자원을 효율적으로 쓰겠죠.
&lt;/p&gt;
&lt;p&gt;그런데 종종 클래스를 만들다 보면 어떤 것은 깊숙히, 어떤 것은 얕게 해야할 일이
   발생하는데요. 그러면 &lt;code&gt;copy.copy&lt;/code&gt;를 쓸 수도 없고 &lt;code&gt;copy.deepcopy&lt;/code&gt;를 쓸 수도 없고
   애매한 상황이 됩니다. 결국은 얕은 복사를 한 다음에 수동으로 깊은 복사를 해 주면
   되겠죠. 그래서 좀 더 복사 과정을 자세히 다뤄보도록 하겠습니다.
&lt;/p&gt;
&lt;p&gt;우선 복사를 하려면 인스턴스를 새로 하나 만들어야 합니다. 여기서 발생하는 문제!
   &lt;code&gt;__init__&lt;/code&gt;가 호출되면 복사라고 부르기가 애매하겠죠. 이미 초기화된 놈을 다시 초기화하게 되니까..
   그래서 &lt;code&gt;__init__&lt;/code&gt;는 호출하지 않고 그냥 객체만 생성하는 방법을 써야하는데,
   신형 클래스(new style class)냐 구형 클래스(old style class)냐에 따라서 방법이 다릅니다.
&lt;/p&gt;
&lt;p&gt;신형 클래스는 &lt;code&gt;__new__&lt;/code&gt;를 쓰면 됩니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;S&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;YAY!!!&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;YAY&lt;/span&gt;&lt;span class="err"&gt;!!!&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x8399bec&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x8399b2c&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;구형 클래스에서는 &lt;code&gt;types.InstanceType&lt;/code&gt;을 쓰거나 &lt;a href="http://docs.python.org/lib/module-types.html"&gt;types 모듈&lt;/a&gt; 불러오기가 귀찮으면 &lt;code&gt;type(s)&lt;/code&gt;를
   써서 만들 수 있습니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x8399aac&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x8399a6c&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;그래서 일부만 복사하는 놈을 만들어 보면
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;S&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="n"&gt;newobj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="n"&gt;newobj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="n"&gt;newobj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;newobj&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;이렇게 &lt;code&gt;a&lt;/code&gt;는 복사되고, &lt;code&gt;b&lt;/code&gt;는 공유되는 방식 &lt;code&gt;copy()&lt;/code&gt;를 만들 수 있습니다.
&lt;/p&gt;
&lt;p&gt;사실 파이썬 자체에서 &lt;a href="http://docs.python.org/lib/module-pickle.html"&gt;pickle&lt;/a&gt; 모듈같은
   곳에서 저장/복원을 위한 속성 저장법이 있는데, &lt;a href="http://docs.python.org/lib/module-copy.html"&gt;copy&lt;/a&gt;
   모듈도 같은 방법을 지원합니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;S&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__getstate__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__setstate__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][:],&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spam&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;egg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ham&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;egg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;spam&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;egg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;ham&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;spam&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;__getstate__&lt;/code&gt;나 &lt;code&gt;__setstate__&lt;/code&gt; 중 하나만 구현해도 상관은 없는데 그렇게 하면 리턴값이나 받아오는
   값이 모두 딕셔너리가 돼야합니다. 위에서는 &lt;code&gt;a&lt;/code&gt;는 그대로 참조만 가져오고, &lt;code&gt;b&lt;/code&gt;와 &lt;code&gt;c&lt;/code&gt;는 복사하는
   방식으로 클래스 복사 방법을 지정해 줬습니다. 복사와는 크게 관련은 없지만 pickle에서
   저장할 수 없는 속성들 (예를 들어 소켓 같은 것)이 들어있는 클래스는 &lt;code&gt;__getstate__&lt;/code&gt;를 지정해 주는
   방식으로 특정 속성을 저장에서 뺄 수 있습니다.
&lt;/p&gt;
</description><pubDate>Thu, 10 Jul 2008 13:02:39 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/07/10/python-manual-instance-copying/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/07/10/python-manual-instance-copying/</feedburner:origLink></item><item><title>파이썬 3의 한글</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/324626089/</link><description>





&lt;p&gt;따로 말은 필요없고 직접 예제로!
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;합계&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;딸기&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;바나나&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;오이&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;딸기&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;바나나&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;오이&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;가격&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;딸기&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;바나나&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;500&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;가격&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;오이&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;450&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;합계&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;가격&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;물건&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="err"&gt;물건&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;오이&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;딸기&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;딸기&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;바나나&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;오이&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;바나나&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;딸기&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="mf"&gt;2800&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;가격&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;딸기&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;오이&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;바나나&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;500&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;__builtins__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__doc__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__name__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__package__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;가격&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;딸기&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;바나나&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;오이&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;합계&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;전생에 백수였습니다&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;에 백수였&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;캬~~
&lt;/p&gt;
&lt;p&gt;관련 참조:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;a href="http://www.python.org/dev/peps/pep-3138/"&gt;PEP-3138 국제화 문자열 표현&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href="http://www.python.org/dev/peps/pep-3131/"&gt;PEP-3131 국제화 식별자&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 01 Jul 2008 06:00:19 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/07/01/hangul-representations-in-python3/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/07/01/hangul-representations-in-python3/</feedburner:origLink></item><item><title>"파이썬은 멀티코어 줘도 쓰잘데기가 없나요?"에 대한 파이썬 2.6의 대답</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/321758256/</link><description>





&lt;p&gt;바야흐로 초딩도 멀티코어로 오락하는 시대가 오면서 이제 파이썬 GIL 공포가
   많은 사람들을 위협하고 있었습니다. 그에 대한 해결책으로 예전부터
   병렬 프로그래밍을 위한 여러가지 프레임워크, 예를 들어
   &lt;a href="http://mpi4py.scipy.org/"&gt;MPI&lt;/a&gt;, CORBA, &lt;a href="http://pyro.sourceforge.net/"&gt;PyRO&lt;/a&gt; 같은 것들이 나왔지만, 다들 멋있게 모든 걸 포용하는
   라이브러리를 만들다 보니 설치가 어렵거나 배우는데 한참 걸리는 게 결국 문제가
   돼서 실제로 심각한 개발자 아니면 그냥 "CPU 1개면 충분해요"라고 눈을 반짝거리며
   스스로 최면을 걸고 있었던 것이 사실입니다~
&lt;/p&gt;
&lt;p&gt;그래서 GIL의 파이썬 프로젝트 자체에서의 해결책으로는 공식적으로 결론에 도달한
   것은 아니지만 &lt;a href="http://code.google.com/p/python-safethread/"&gt;Adam Olsen의 GIL없애기&lt;/a&gt; 프로젝트 같은 것도 있었는데,
   이번에 몇몇 사람들의 강력한 후원으로 파이썬 2.6과 3.0부터
   &lt;a href="http://pyprocessing.berlios.de/"&gt;pyProcessing&lt;/a&gt;이 새 이름 multiprocessing
   으로 표준 라이브러리로 들어오게 되었습니다.
&lt;/p&gt;
&lt;p&gt;pyprocessing의 다른 &lt;a href="http://wiki.python.org/moin/ParallelProcessing"&gt;병렬 처리 라이브러리들&lt;/a&gt;에 대한 장점은
   뭐니뭐니해도 &lt;a href="http://docs.python.org/lib/module-threading.html"&gt;표준 threading&lt;/a&gt; 모듈과 API가 같다는 점이겠죠. threading으로 기존에 짜 놓은
   프로그램을 그냥 모듈 이름과 클래스 이름 아주 약간만 바꿔주면 쓰레딩 대신 멀티프로세싱을
   사용하게 되어서 결국에는 멀티코어를 제대로 쓰는 프로그램이 됩니다. 실제로
   쓰레딩같이 모든 변수를 공유하는 것은 아니고, 리턴값만 전달을 받기 때문에
   정확히는 좀 다르다고 볼 수도 있지만, 뭐 "그렇게 짜면 왕변태"라고 선언하면 되겠죠. ㅎㅎ;
&lt;/p&gt;
&lt;p&gt;그래서 실제로 쓰는 모양을 보려고 옛날에 유행했던 정규식으로 소수 검사를 하는 걸 한 번 돌려 봤습니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multiprocessing&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;isprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;convert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;xrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;^1?$|^(11+?)\1+$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;serial_st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;isprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1234567&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Serial:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;serial_st&lt;/span&gt;

&lt;span class="n"&gt;parallel_st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;processes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;isprime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1234567&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Parallel:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;parallel_st&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;보시면 threading으로 만든 모듈과 join, start, worker 등의 사용법이 같아서 그냥 쉽게 바꾸실 수 있는데, 이렇게 돌려보면 대략 시간이 듀얼코어에서는 이렇게 나옵니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;Serial: 18.2321028709
Parallel: 8.54528999329
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;대략 2배 정도 빨라졌죠~ 그냥 고전적인 던져주고 실행해서 리턴받는 방식 말고 보통
   실제로 더 많이 쓰는 &lt;a href="http://docs.python.org/lib/module-Queue.html"&gt;Queue&lt;/a&gt; 모델로 일꾼을 코어 개수만큼 돌려보면 이렇게 할 수도 있습니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multiprocessing&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;isprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;convert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;xrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;^1?$|^(11+?)\1+$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;primeworker&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;isprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;parallel_st&lt;/span&gt;

&lt;span class="n"&gt;parallel_st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;processes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;primeworker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1234567&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;시간은 대략 9초 정도 듭니다. 그리고 fd 넘겨주기를 지원하는 플랫폼들에서는 소켓도
   받아다가 넘길 수가 있으니 네트워크 프로그램도 간단하게 멀티코어를 쓸 수 있습니다.
&lt;/p&gt;
&lt;p&gt;아주 간단하게 멀티코어를 쓸 수 있는 장점으로 표준 라이브러리로 도입이 되긴 했지만,
   아직 문제가 몇 개 있는데요. 대표적으로 FreeBSD에서는 아직 POSIX 1003.1b 세마포어를 "제대로" 지원하지 않기 때문에 FreeBSD에서는 Queue나 Lock등과 관련된 것들을
   하나도 쓸 수가 없습니다. (위 예제는 그래서 리눅스에서 테스트할 수 밖에 없었습니다;;)
&lt;/p&gt;
&lt;p&gt;그 외에 MPI 등의 "심각한" 분산 API들을 쓰던 프로그래머들은 이게 애들 장난이냐 하면서 없는 기능들을 지적할 수도 있는데, 아무래도 표준 라이브러리로써 아주 간단하고
   기초적인 기능만 제공하는 것이 목적이고, 셋업이 복잡하거나 거대 프레임워크를 끌고 다니는 경우라면 표준에서 안정적으로 관리하기가 힘들겠죠. 그래서 multiprocessing을
   도입하자 주장한 개발자는 이 모듈은 절대 다른 분산 관련 모듈을 쓰지 말라는 의미가 아니고
   같이 쓰면 더욱 좋다고 강조합니다.
&lt;/p&gt;
</description><pubDate>Sat, 28 Jun 2008 01:54:33 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/06/28/python-multiprocessing/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/06/28/python-multiprocessing/</feedburner:origLink></item><item><title>파이썬 매킨토시 한중일 코덱</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/320505336/</link><description>





&lt;p&gt;한동안 CJK 코덱은 잊고 살았는데, 올해 초에 엉뚱하게 코덱 관련 버그가 하나 떨어졌습니다.
   &lt;a href="http://bugs.python.org/issue1276"&gt;X-MAC-JAPANESE 코덱이 없다고 하면서 파이썬 설치가 안 돼요&lt;/a&gt;
   라는 현상인데.. 파이썬 3.0에서는 빌드할 때 잠깐 빼고는 유니코드 코덱 없이는 소스 읽기 조차 안 될
   정도가 됐기 때문에 시스템 설정에 있는 기본 인코딩이 안 맞으면 설치도 안 되고 잘 뜨지도 않는
   현상이 발생된 것 같군요. 아니 무슨 90년대 유물인 MacJapanese가 아직 디폴트인지는 이해를
   못하겠지만 말이죠;;
&lt;/p&gt;
&lt;p&gt;그래서 찾아보니까 다른 오픈소스 유니코드 관련 프로그램들은 전혀 지원하고 있지 않았지만,
   펄이 유독 지원하고 있길래 어쩔 수 없이 펄보다는 나아야지 하는 오기로 (;;) 코덱 작업을 했습니다.
   으흐 -ㅇ-;
&lt;/p&gt;
&lt;p&gt;CJK와 관련된 것은 MacKorean MacJapanese MacChineseSimp MacChineseTrad 이렇게 4가지인데
   윈도우의 cp949 cp932 cp936 cp950과 마찬가지로 각각 &lt;a href="http://en.wikipedia.org/wiki/EUC-KR#EUC-KR"&gt;euc-kr&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Shift-jis"&gt;shift-jis&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Gb2312"&gt;gb2312&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Big5"&gt;big5&lt;/a&gt;를
   확장한 방식입니다. 그런데 확장을 MS보다 더 기상천외한 방법으로 유니코드 스펙을 최대한 활용한 덕에
   이런 매핑까지도 등장합니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;0xA34A  0xF864+0x005B+0x0031+0x0030+0x005D      # number ten in enclosing square, sans, shadowed
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2바이트짜리 글자 하나를 무려 유니코드 5글자에 매핑을 하는 데다가, &lt;a href="http://en.wikipedia.org/wiki/JIS_X_0213"&gt;JIS X 0213&lt;/a&gt;에서 주로 많이 써서 골탕을 먹였던 중간에 잘라먹어도 말이 되는 글자들이 등장합니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;0x31    0x0031  # DIGIT ONE
0xA542  0x0031+0x20DE   # DIGIT ONE + COMBINING ENCLOSING SQUARE
0xA341  0x0031+0x20DE+0xF87B    # DIGIT ONE + COMBINING ENCLOSING SQUARE, sans, shadowed
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;이런 경우에는 U+0031이 오면 0x31 한 글자, U+0031 U+20DE가 와도 0xA542 한 글자, U+0031 U+20DE U+F87B가 오면 0xA341 한 글자가 돼서 유니코드 1~3글자까지가 모두 다 2바이트가 돼버립니다.
   그냥 단순 문자열에서는 별 문제가 없지만, 스트림 입출력 트랜스코딩에서는 이거 때문에 아주 미칠 지경이죠. 어흐흐;
&lt;/p&gt;
&lt;p&gt;그래서 그냥 C 코덱으로 매핑 덮어쓰기로 만들려니 너무 따분하고 이제 아무도 안 쓰는 인코딩 만들어 봐야 뭐하나 하는 생각에 예전에 생각해 뒀던, 딕셔너리 2개만 뿅 하고 던져주면 매핑 테이블을 덮어써서 새로운 코덱이 되는 방법으로 해 봤습니다. 예를 들어서
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;encode_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="s"&gt;u&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c"&gt;# replace original mapping&lt;/span&gt;
    &lt;span class="s"&gt;u&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c"&gt;# invalidate original mapping&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;codec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_multibytecodec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_extcodec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;어쩌고&lt;/span&gt; &lt;span class="err"&gt;저쩌고&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;이렇게 해 주면 codec에 유니코드 a는 euc-kr에서 b로 인코딩해버리고, 유니코드 b는 모르니까
   인코딩 안 해 준다고 에러내는 코덱이 나오게 됩니다. 이걸로 역슬래시 같이 논란이 있는 부분이나
   용도에 따라서 좀 다르게 써야하는 만들어서 쓸 때 유용하지 않을까 생각해 봅니다~ -ㅇ-;
&lt;/p&gt;
&lt;p&gt;단, 이게 내부적으로 한 글자씩 조절을 하다보니 굉장히 비효율적이라 속도가 그렇게 빠르지는 않은
   편이지만.. 그래도 요새 컴퓨터가 워낙 좋으니까.. ^_^;;
&lt;/p&gt;
&lt;p&gt;혹시 맥에서 파이썬 빌드가 잘 안 되셨던 분들은 &lt;a href="http://bugs.python.org/issue1276"&gt;패치를&lt;/a&gt; 받으셔서
   한 번 해 보세요~ (아마도 별 문제가 없으면 &lt;a href="http://www.python.org/download/releases/2.6/"&gt;파이썬 2.6&lt;/a&gt;과 &lt;a href="http://www.python.org/download/releases/3.0/"&gt;3.0&lt;/a&gt;에 들어갈 수 있겠죠. 펄보다는 나아야지.. ㅎㅎ;;;;;;;;;;;)
&lt;/p&gt;
</description><pubDate>Thu, 26 Jun 2008 12:27:20 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/06/26/python-mac-cjk-codecs/</guid><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/06/26/python-mac-cjk-codecs/</feedburner:origLink></item><item><title>오픈룩에는 어떤 전공 사람들이 올까?</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/314575807/</link><description>





&lt;p&gt;얼마 전에 친구와 얘기하다가 "내 홈페이지는 아무래도 전산과만 오지 않을까~?"라는 말을
   했었는데, 그 후에 과연 진짜로 전공 분포가 어떻게 되는지 궁금해졌습니다. -ㅇ-;
&lt;/p&gt;
&lt;p&gt;그래서 간단하게 조사해 볼 수 있는 방법을 궁리해 보다가, 대전의 모 학교 내부 접속자들은 IP만 가지고도
   건물 위치를 알 수 있기 때문에 웹서버 접속 로그에서 학교 건물 이름으로 전공을 추측하는 게
   가능해서 그걸로 소집단이나마 해봤습니다. ^^;
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3143/2589757218_a437b8d4bc.jpg" alt="전공별 접속 통계"/&gt;
&lt;/p&gt;
&lt;p&gt;위 그래프에서는 요청횟수가 나타나 있는데, &lt;a href="http://openlook.org/app/nameanalysis/"&gt;"내 이름 어때"&lt;/a&gt;가
   최근 접속자에서 많은 부분을 차지하고 있기 때문에 별도로 분리해서 봤고, css, jpg등 부속적으로
   따라오는 파일들은 제외하고 순수한 문서 요청만 셌습니다. 기간은 6월 1일부터 오늘까지 18일간이고요~
   역시 전산과가 굉장히 많은 부분을 차지하는데, 의외로 전자과도 꽤 많습니다. 아무래도
   내 이름 어때에서 넘어온 게 아닌가 추측이 되는데, 학부(주로 기숙사)에서는 내 이름 어때
   요청만 굉장히 많은게 역시 학부생들 간의  유행 URL 전달이 대학원생들보다 활발한 것 같군요.
&lt;/p&gt;
&lt;p&gt;다음으론 요청수 말고 IP별 접속자 통계인데요. 접속자(unique visitor)에서 날짜별로 다른 날에
   접속한 경우 별도 방문으로 처리한 방문횟수를 세 봤습니다. (내 이름 어때는 제외)
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3054/2589757258_cf066d6c6c.jpg" alt="접속자 기준 통계"/&gt;
&lt;/p&gt;
&lt;p&gt;요청수는 전자과가 전산과보다 많았지만 접속자는 전산과가 더 많은데, 한 번 방문해서 눌러보는
   횟수가 전자과가 더 많은 것 같군요. 아마도 로그를 대충 둘러보면 전산과는 RSS를 구독하는 경우가
   많아서 접속이 거의 한 번에 1페이지씩인 경향이 다른 과보다 강한 것 같네요.
&lt;/p&gt;
&lt;p&gt;마지막으로 단골 손님 수를 전공별로 봤습니다.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3177/2588920517_47839e58b8.jpg" alt="단골 손님 통계"/&gt;
&lt;/p&gt;
&lt;p&gt;단골 손님의 기준은 18일 간 제가 글을 몇 개 안 썼기 때문에, 2번 이상 다른 날짜에 방문한 IP 수로
   했습니다. 수가 적어서 신뢰도가 아주 높지는 않지만 역시 전산과가 가장 많고 전자과가 두 번째군요.
   ^^;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;결론&lt;/strong&gt;: 앞으로는 정상인의 블로그로 거듭나기 위해 노력하겠습니다. --;;;;
&lt;/p&gt;
</description><pubDate>Wed, 18 Jun 2008 08:06:01 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/06/18/openlook-visitor-statistics-by-major/</guid><category>&lt;a href='/blog/tag/openlook/'&gt;openlook&lt;/a&gt;</category><category>&lt;a href='/blog/tag/life/'&gt;life&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/06/18/openlook-visitor-statistics-by-major/</feedburner:origLink></item><item><title>동영상(?)으로 보는 파이썬의 역사</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/313753494/</link><description>





&lt;p&gt;&lt;a href="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/"&gt;Michael Ogawa의 code_swarm&lt;/a&gt;이라는
   프로젝트에서 오픈소스 프로젝트의 CVS나 SVN 등 소스 저장고를 분석해서 일어난 작업들을
   시각적으로 보여주는 걸 만들었습니다. 요새 &lt;a href="http://ubietylab.net/ubigraph/"&gt;UbiGraph&lt;/a&gt;같은
   도구도 나오고 하는 걸 보면 시각화가 정말 굉장히 유행이네요~
&lt;/p&gt;
&lt;p&gt;&lt;object width="400" height="302"&gt;   &lt;param name="allowfullscreen" value="true" /&gt;   &lt;param name="allowscriptaccess" value="always" /&gt;   &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1093745&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;   &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1093745&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1093745?pg=embed&amp;sec=1093745"&gt;code_swarm - Python&lt;/a&gt; from &lt;a href="http://www.vimeo.com/michaelogawa?pg=embed&amp;sec=1093745"&gt;Michael Ogawa&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;sec=1093745"&gt;Vimeo&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;저는 3분 50초 쯤에 약간 왼쪽 아래에서 나타나서 잠시 머물다가 사라집니다;;; -ㅇ-;;;;;
&lt;/p&gt;
&lt;p&gt;이 영상은 미디어아트와 데이터 시각화에서 많은 관심을 모았던
   &lt;a href="http://processing.org/"&gt;Processing&lt;/a&gt;으로 만들었다고 하는데.. 전에 봤을 때는 괜히 어렵기만 하고 별 쓸모 없어보니더니
   이걸 보니 확 땡기는군요. ^^;;
&lt;/p&gt;
&lt;p&gt;-- via &lt;a href="http://www.pythonware.com/daily/1698556930198885667"&gt;Python Daily URL&lt;/a&gt;
&lt;/p&gt;
</description><pubDate>Mon, 16 Jun 2008 18:17:05 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/06/17/python-code-swarm/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category><category>&lt;a href='/blog/tag/computer/'&gt;computer&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/06/17/python-code-swarm/</feedburner:origLink></item><item><title>FreeBSD도 뒤늦게 subversion으로</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/308823842/</link><description>





&lt;p&gt;대략 2004~2005년경에 수많은 프로젝트들이 CVS에서 Subversion으로 옮겨갔는데
   거의 종교개혁 수준으로 다들 10년 넘게 쓰던 걸 갑자기 화아아악~ 바꾸는게 상당히 무서웠었죠. :)
   파이썬 프로젝트도 마찬가지로 &lt;a href="http://www.python.org/dev/peps/pep-0347/"&gt;2005년 7월에 약간 늦게 svn으로 바꿔서&lt;/a&gt; 지금은
   파이썬 sys모듈에 svn 리비전 번호가 문자열로 들어갈 정도로 잘(?) 운용되고 있습니다.
&lt;/p&gt;
&lt;p&gt;FreeBSD는 커널, 유저랜드 유틸리티 전체와 포트, 문서까지 포함하고 있는 거대 프로젝트이다보니
   뭘 해도 쉽지가 않은데요. 역시 그래서 그 유명한 &lt;a href="http://en.wikipedia.org/wiki/Bikeshedding"&gt;bikeshedding&lt;/a&gt;의 원조답게 수차례
   결론 없는 토론을 거의 반년에 한 번씩 거듭한 끝에, 드디어 얼마 전에 &lt;a href="http://lists.freebsd.org/pipermail/cvs-src/2008-May/091749.html"&gt;svn으로 이주가 완전히
끝났&lt;/a&gt;습니다. (링크는
   svn에서 최초 커밋)
&lt;/p&gt;
&lt;p&gt;물론 이전의 토론 과정에서는 &lt;a href="http://www.selenic.com/mercurial"&gt;hg&lt;/a&gt;, &lt;a href="http://git.or.cz"&gt;git&lt;/a&gt;, &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt;, &lt;a href="http://bazaar-vcs.org/"&gt;bazaar&lt;/a&gt;를 비롯한 수많은 SCM들의 변호사들이 등장해서
   굉장한 토론이 꾸준히 있었지만,
   분산SCM들은 분산 개발의 편리를 위해서 역사가 긴 대형 프로젝트에는 적합하지 않은 면이 많고,
   CVS는 그 동안 너무 문제점들이 많이 누적돼와서 결국엔 svn이 채택되었습니다.
   또한 &lt;a href="http://pypi.python.org/pypi/hgsvn/"&gt;hgsvn&lt;/a&gt;이나 &lt;a href="http://git.or.cz/course/svn.html"&gt;git-svn&lt;/a&gt;, &lt;a href="http://svk.bestpractical.com/"&gt;svk&lt;/a&gt; 같은 툴들이 있어서 개발자들이 개인 취향에 따라 다르게 쓸 수
   있다는 것도 아이러니하게 svn에 큰 점수를 줬습니다.
   &lt;a href="http://www.bsdcan.org/"&gt;BSDCan&lt;/a&gt;에서 subversion으로 이사를 주장했던
   Peter Wemm이 FreeBSD에서 내부적으로 꼭 필요한
   기능 (예를 들어 키워드 자동 치환, 로그 템플릿) 들을 직접 수정해서 패치를 올리고, 일일이 변환하고
   잘못된 점이 있나 확인하고, 다시 잘못된 것 수정하고, 기존 커미터들을 위한 svn 가이드도 작성한
   끝에 무사히 이사가 끝났습니다.
&lt;/p&gt;
&lt;p&gt;새 저장고와 관련된 것들은 대부분 &lt;a href="http://svn.freebsd.org"&gt;http://svn.freebsd.org&lt;/a&gt;에
   연결돼 있어서 구경하실 수 있습니다. :)
&lt;/p&gt;
</description><pubDate>Mon, 09 Jun 2008 21:11:42 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/06/10/freebsd-moved-to-subversion/</guid><category>&lt;a href='/blog/tag/freebsd/'&gt;freebsd&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/06/10/freebsd-moved-to-subversion/</feedburner:origLink></item><item><title>플레임에서 승리하는 자의 선택 [우리말 도우미], 지뢰밭용 업데이트</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/302728032/</link><description>





&lt;p&gt;&lt;img src="http://farm2.static.flickr.com/1067/870874406_ac55e70085.jpg" alt="우리말 도우미"/&gt;
&lt;/p&gt;
&lt;p&gt;예전에 올렸던 &lt;a href="http://openlook.org/blog/2007/07/23/cb-1178/"&gt;우리말 도우미&lt;/a&gt;를
   한동안 잊고 있었는데 &lt;a href="http://www.mozilla.org/projects/minefield/"&gt;불여우 3.0 지뢰밭&lt;/a&gt; 출시가 임박해서 많은 분이 요청해 주셔서 3.0 용으로 갱신했습니다.
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/ko/firefox/addon/5380"&gt;우리말 도우미 1.0 (불여우 부가 기능) 설치&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;3.0 지원 외에는 아주 사소한 레이아웃 관련 변경이 몇 개 있었지만 별로 눈에 안 띌 것 같네요 -ㅇ-;
&lt;/p&gt;
&lt;p&gt;아직 모래통 안에 들어 있어서 쉽게 설치가 안 되고, 사이트에 로그인해야지만 됩니다. 므흐흐..
   언젠가는 모래통을 탈출하여 쉽게 설치할 수 있는 날이 오겠죠. -ㅇ-;
&lt;/p&gt;
&lt;p&gt;이번 업데이트에 큰 도움을 주신 &lt;a href="http://lunapapa.egloos.com"&gt;신종훈&lt;/a&gt;님께 감사드립니다.
&lt;/p&gt;
</description><pubDate>Sun, 01 Jun 2008 16:07:23 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/06/02/urimal-doumi-for-minefield/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category><category>&lt;a href='/blog/tag/computer/'&gt;computer&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/06/02/urimal-doumi-for-minefield/</feedburner:origLink></item><item><title>2005년 이전 글들을 복구했습니다.</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/300988715/</link><description>





&lt;p&gt;2005년 2월에 &lt;a href="http://pyblosxom.sourceforge.net"&gt;pyblosxom&lt;/a&gt;에서 &lt;a href="http://coreblog.org/"&gt;COREBlog&lt;/a&gt;로 옮기면서 글 내용만 옮기고 댓글, 그림은 옮기지 않아서
   옛날 자료들이 검색엔진에서 걸리면 상당히 흉한 화면이 덩그러니 나왔었는데요.
   이제 문명의 혜택을 받은 django 사용자로써 --; 옛 글도 제대로 나오게 복구해 봤습니다.
   pyblosxom 때는 &lt;a href="http://moinmoin.wikiwikiweb.de"&gt;moinmoin&lt;/a&gt; 첨부를 써서 그림을
   올렸었지요. 그런데 지금 보니 절대경로로 쓴 것, 상대경로로 쓴 것, 애플리케이션 서버 포트에
   직접 접속하는 것 등등 별의 별 잡스러운 방법으로 일관성 없게 URL이 기록돼 있네요. 크흐;
&lt;/p&gt;
&lt;p&gt;지금은 이제 2003, 2004년에 남겨주신 소중한 댓글들도 모두 복구해서 잘 넣어 두었습니다. ^_^;
   (옛 글들은 오른쪽 곁에 있는 "이전 글 보기"를 누르시면 됩니다.)
   스팸 2000개 지우는게 생각보다 힘드네요. 흐;;
&lt;/p&gt;
&lt;p&gt;지금 옛 글들을 둘러보니 대체로 부끄러운 글이 많은데, 그 중에 그래도 가장 애착이 가는 것은
   &lt;a href="http://openlook.org/blog/2003/11/28/cb-593/"&gt;안 초연하다. (2003년 11월 28일)&lt;/a&gt;
   이군용! 지금도 뭐 상황은 같아서.. 5년이나 지나도 참 일관성 있습니다. 므흣; ㅠ.ㅠ
&lt;/p&gt;
</description><pubDate>Thu, 29 May 2008 13:30:49 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/05/29/recovered-articles-before-2005/</guid><category>&lt;a href='/blog/tag/openlook/'&gt;openlook&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/05/29/recovered-articles-before-2005/</feedburner:origLink></item><item><title>"내 이름 어때" 만든 이야기~</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/300284920/</link><description>





&lt;p&gt;며칠 전에 올렸던 "내 이름 어때?"를 만들면서 썼던 여러 가지 기술적인 부분에 대해서
   간단하게 정리해 봅니다. 물론 django로 만들었습니다! 이히히
&lt;/p&gt;

&lt;h4&gt;Django 템플릿에서 한글 조사 처리&lt;/h4&gt;
&lt;p&gt;이름 뒤에 은/는 이/가 같은 것들을 제대로 붙이려면 아무래도 템플릿에서 처리를 해 줘야하는데,
   django에서는 애플리케이션에서 직접 템플릿 태그나 필터를 정의하는 걸 매우 장려하는 분위기라서
   "필터"를 따로 정의해서 처리했습니다.
&lt;/p&gt;
&lt;p&gt;템플릿에서 이렇게 쓰려고 하는 부분이 있다면:
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="x"&gt;이름을 뒤집으면 &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;rev_last_name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;attach_korean_suffix&lt;/span&gt;&lt;span class="s2"&gt;:&amp;quot;이가&amp;quot;&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;되어서..&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;필터 정의를 이렇게 해 줬습니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nd"&gt;@register&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;attach_korean_suffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suffixes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;hangul&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ishangul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;hangul&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;suffixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;suffixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;마지막 줄에서 1:로 굳이 잡아준 이유는 이름 뒤의 ~이 처럼 받침이 없으면 끝에 안 붙는 경우도
   처리해 주려고요..
&lt;/p&gt;

&lt;h4&gt;추세 해석&lt;/h4&gt;
&lt;p&gt;이름의 인기가 늘고 있는지 줄어드는지를 글자로 판단해서 표현해 주기 위해서, 간단한 계산식을
   사용했습니다. 우선 원 데이터 자체는 샘플수가 적어서 노이즈가 많기 때문에 보통 많이 쓰이는
   9개 윈도우 평균으로 했고, 이렇게 하면 18개 포인트가 나와서 세 부분으로 나눠서
   앞 중간 뒤의 평균을 다시 구해서 3가지 값이 나왔습니다. 그래서 눈으로 딱 보면 값이 계속
   증가하는지, 올라갔다 내려갔다 하는지를 볼 수 있는데요, 그냥 값으로 볼 수는 없으니
   앞/중간 과 중간/뒤의 각각의 변동폭을 0에서 1사이로 정량화해서 봤습니다. 변동폭은 이름마다
   절대량이 다르기 때문에 상대량으로 비교해야해서 아래와 같은 식으로 썼습니다.
&lt;/p&gt;
&lt;p&gt;&lt;img src="/media/formula/3/d/0/3d06352db5d8ebf87a59fafeb59b6ac6.png" alt="\delta = {{\arctan {\log {N_B \over N_A}}} \over \pi} + 0.5"/&gt;
&lt;/p&gt;
&lt;p&gt;보기엔 약간 쓸데없이 복잡하긴 하지만, 그냥 상대비율을 (0, 1) 사이로 넣어주는 일 밖에 안 합니다;;;
&lt;/p&gt;
&lt;p&gt;이렇게 나온 값으로 앞 뒤가 모두 (0.4, 0.6) 구간에 들어오면 "꾸준한 추세입니다."라고 하거나,
   앞-중간은 (0.0, 0.3), 중간-뒤는 (0.0, 0.5) 구간에 들어가면 앞 반쪽에서 감소세가 강하고
   뒷 반쪽에서 감소세가 둔하다는 의미이므로 "확 줄어들다가 잦아드는 추세입니다."라고 보여주는 식으로
   주된 패턴들을 "대충" 느낌으로 나열하는 방법으로 코딩했습니다. 크흐;
&lt;/p&gt;

&lt;h4&gt;구글 차트&lt;/h4&gt;
&lt;p&gt;이름 전체의 성별 성향이나 이름의 시대적 경향, 이름 글자의 시대적 경향을 보이는 부분에서
   구글 차트를 불러서 사용했습니다. 구글 차트는 직접 URL을 코딩하는 방법은 아니고,
   &lt;a href="http://pygooglechart.slowchop.com"&gt;pygooglechart&lt;/a&gt;를 사용했는데요,
   이게 의외로 그런대로 잘 만들어서 웬만한 기능은 불편없이 쓸 수 있게 돼 있더군요. :)
&lt;/p&gt;
&lt;p&gt;다만, 하나 기술적인 문제가 있었던 부분은 이름 글자의 시대적 경향 같은 경우에는
   글자마다 실수값 18개씩(경향)이 저장돼야 하기 때문에, 이걸 그냥 저장하는 건 여러모로
   번거롭고 해서 구글 차트 API에서 쓰는 0~4095 사이 인코딩하는 방법으로 썼습니다.
   (base64와 거의 같은 방법입니다.) 그래서, 저장은 바로 구글 차트 API URL에 쓰면 되는
   형태가 돼서 다시 불러올 때 매우 빠르게 불러올 수 있긴 한데, 문제는 한 이름 안에
   이름 앞자와 뒷자의 경향을 모두 보여줘야하기 때문에 둘의 그래프 크기를 제대로 조절해 주지
   않으면 각 글자의 크기가 잘못 나온다는 점이었습니다.
&lt;/p&gt;
&lt;p&gt;그래서 결국 선택한 방법은 보여줄 때 앞자 뒷자 인코딩된 값을 다시 풀어서 큰 쪽의 스케일로
   맞춘 다음에 다시 인코딩하는 -.,-; 약간 노가다성 방법을 썼습니다. 역시 이런 부분은
   &lt;a href="http://numpy.scipy.org/"&gt;numpy&lt;/a&gt;의 array의 도움을 많이 받을 수 있었습니다.
&lt;/p&gt;
&lt;p&gt;확장코드 인코딩/디코딩 부분을 따로 떼서 쓸 일이 좀 있을 것 같아서..
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;encmap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;decmap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;encmap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;encmap&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decode_ggenc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;decmap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;64&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;decmap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encode_ggenc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encmap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;encmap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mf"&gt;64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;통계치가 적은 이름의 성별 추정&lt;/h4&gt;
&lt;p&gt;역시 통계 샘플 크기가 작아서 주요 이름들을 빼고는 제대로 된 통계치를 낼 수 없어서
   주요 이름들의 성별 경향으로 학습한 걸로 예측하는 부분이 필요했습니다.
   이번에는 아예 사용된 적 없는 글자까지도 어떻게 좀 해 보려고
   통계치에 전혀 의존하지 않고 그냥 자소별로 분해해서 이름만 피처로 사용하기로 했습니다.
   그래서 보통 &lt;a href="http://en.wikipedia.org/wiki/Support_vector_machine"&gt;SVM&lt;/a&gt;을
   쓰는 것이 여러모로 대세이기는 하지만, 카테고리성(이산) 피처값에 매우 유리한
   &lt;a href="http://en.wikipedia.org/wiki/Random_forest"&gt;random forest&lt;/a&gt;을 썼습니다.
   (물론 제가 수학을 워낙 못하는 것도 큰 요인으로;;;;)
&lt;/p&gt;
&lt;p&gt;Random forest는 아무래도 쓸 수 있는 구현이 적다는 게 큰 문제인데요.
   파이썬에서 쓸 수 있는 &lt;a href="http://www.ailab.si/orange/"&gt;orange&lt;/a&gt;를 쓰면 정말
   좋겠지만, 아쉽게도 이 구현은 리그레션은 지원하지 않고요. Y.Y
   &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt;용 패키지인
   &lt;a href="http://cran.r-project.org/web/packages/party/index.html"&gt;party&lt;/a&gt;와
   &lt;a href="http://cran.r-project.org/web/packages/randomForest/index.html"&gt;randomForest&lt;/a&gt;
   중에 선택해야하는데, party를 먼저 했으나 메모리 3기가를 먹더니 죽었고 (-_-)
   randomForest는 안정적으로 대략 200메가 정도 먹고 그런대로 쓸 만한 결과를 줬습니다. :)
&lt;/p&gt;
&lt;p&gt;학습 기법 측면에서는 남자 샘플이 2배 정도 되기 때문에 편향 문제가 있어서 샘플링 조절을
   좀 해야했는데요, 그냥 복잡한 것 쓰지 않고 대략 0.3 밑을 반 다운 샘플링하니까 전체적으로
   분포가 윗쪽하고 아랫쪽이 그런대로 맞았습니다. 중성적인 이름이 수가 훨씬 적은 것도 또한
   중성적 이름 쪽에서 오차를 많이 발생시킬 수 있는 요인이 될 수 있는데, 이쪽에서 오버샘플링을
   하려고 하다가 "될 거 같으면 대충해도 돼야 하는거지" 하는 교수님 말씀이 귓가를 스치며
   놀이인데 대충하자 하고 -ㅇ-;; 크흐; 그래서 결국 &lt;a href="http://en.wikipedia.org/wiki/Cross_validation"&gt;10-fold cross validation&lt;/a&gt;으로
   평균 피어슨 연관성이 0.97 정도 나왔습니다. (만... 역시 사람 느낌하고 좀 다른
   사례가 개별적으로는 제법 많이 발견되긴 하네요;)
&lt;/p&gt;

&lt;h4&gt;페이지 내용 캐시&lt;/h4&gt;
&lt;p&gt;서비스를 공개한 다음 날 점심시간이 좀 지나고 나서는 접속이 폭주해서, 실시간 계산이 상당히
   있었던 구현 특성상 앞으로 어떻게 될 지 참 고민이 있었는데요; 그래서 마침 전혀 필요없겠다
   싶어서 꺼놨던 &lt;a href="http://www.djangoproject.com/documentation/cache/"&gt;django의 캐시 프레임워크&lt;/a&gt;를
   살려서 해 봤습니다.
   백엔드를 선택할 수 있는데, 역시 제일 잘 나가는 &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt;를 썼습니다. 이거 소문대로 깔끔하고 잘 돌아가네요. ^_^;
&lt;/p&gt;
&lt;p&gt;Django는 다행히도 템플릿에서 일부만 특정 변수에 따라서 캐시하는 기능이 있어서
   이름에 따라 바뀌는 부분, 성에 따라 바뀌는 부분을 따로 따로 캐시하도록 3조각으로
   따로 캐시해서 생각보다 훨씬 간단하게 쉽게 캐시로 넣었고요, 지금은 CPU부하가 전보다
   같은 요청에서 거의 1/10로 줄어들었습니다! 이히히.
&lt;/p&gt;

&lt;h4&gt;다른 사소한 것들..&lt;/h4&gt;
&lt;p&gt;몇 분께서 물어보셨던 게 자료처리나 통계처리는 어떤 걸 썼느냐가 있는데, 특별히 쓴 것은 없구요, 파이썬 하나면 다 해결됩니다. -ㅇ-;
   물론 &lt;a href="http://numpy.scipy.org/"&gt;numpy&lt;/a&gt;, &lt;a href="http://matplotlib.sourceforge.net/"&gt;matplotlib&lt;/a&gt;도 아주 큰 도움이 됐습니다.
   collections.defaultdict를 전에는 그렇게 자주 쓰지는 않았는데, 이번에 좀 과격하게
   3~4 단계 쑥쑥 defaultdict를 겹쳐서도 써 봤더니 &lt;a href="http://docs.python.org/lib/module-pickle.html"&gt;pickle&lt;/a&gt;이 잘 안 되는 문제만 빼고는, 코드를 아주 많이 줄여준다는 점에서
   아주 사랑스러웠습니다.
&lt;/p&gt;
&lt;p&gt;후속편으로는 이번에 들어온 로그를 한 번 분석해 보려고 하고 있습니다. ^^;
&lt;/p&gt;
</description><pubDate>Wed, 28 May 2008 20:35:42 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/05/29/my-name-technical/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category><category>&lt;a href='/blog/tag/computer/'&gt;computer&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/05/29/my-name-technical/</feedburner:origLink></item><item><title>내 이름 어때? -- 한국인의 이름 2탄!</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/298590655/</link><description>





&lt;p&gt;전에 올렸던 &lt;a href="http://openlook.org/blog/2008/05/17/statistics-of-korean-names/"&gt;한국인의 이름 통계&lt;/a&gt;를 많은 분들이 관심있게 봐 주셔서, 
   본인 이름은 얼마나 많은가요, 얼마나 중성적인가요 같은 질문을 많이 받았습니다.
   그래서 직접 확인하실 수 있게 통계에서 나온 여러 자료들을 모아서 한 페이지에
   보이도록 서비스를 만들어 봤습니다.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3228/2525636670_fa7deaa60b.jpg" alt="내 이름 어때!"/&gt;
&lt;/p&gt;
&lt;p&gt;대부분은 이전 글에서 소개해 드렸던 내용이고요, 이번에 추가된 부분은 통계에서
   자료가 충분하지 않을 때 자동으로 추정하는 것과 이름이나 글자가 시대가 바뀌면서
   어떤 빈도 변화가 있는지 그래프로 나타내는 부분입니다.
&lt;/p&gt;
&lt;p&gt;자동 성별 추정 부분은 통계 수치없이도 단순하게 바로 이름에서 예측할 수 있게
   하기 위해 피처는 그냥 이름을 자소로 쪼갰고, &lt;a href="http://en.wikipedia.org/wiki/Random_forest"&gt;random forest&lt;/a&gt;를 사용했습니다.
   (옵션은 리그레션, 500그루, mtry=3, &lt;a href="http://cran.r-project.org/web/packages/randomForest/index.html"&gt;R randomForest 패키지&lt;/a&gt; 사용)
   10배 교차검정에서 피어슨 연관성이 0.97이 나와서 대략 결과는 좋긴 한데, 실제로 보다 보면
   얼토당토않은 결과가 심심찮게 나옵니다;; 나중에 제대로 쓰려면 글자 단위 통계도 피처로
   좀 추가해야할 것 같네요.
&lt;/p&gt;
&lt;p&gt;그리고, 역시 이름도 시대별 흐름이 있는데요. 예를 들어 미자, 혜자, 경자 같이 -자로 
   끝나는 이름은 60년대생까지 매우 흔한 여자 이름이었지만 70년대부터 급속히 사라지는데
   그래프로 직접 이런 경향을 확인할 수 있도록 했습니다. 데이터셋이 그렇게 크지 않기 때문에
   그냥 생데이터를 쓰지는 못하고, 9년 단위 슬라이딩 윈도우 평균으로 했기 때문에 갑자기
   튀는 최고점 같은 것은 좀 무시되었습니다. (이 분석을 위해 "생년"만 추가로 데이터를 받아서 보충했습니다.)
&lt;/p&gt;
&lt;p&gt;자 그럼 본인 이름을 넣어보세요~   ----&amp;gt; &lt;a href="http://openlook.org/app/nameanalysis/"&gt;내 이름 어때!&lt;/a&gt; &amp;lt;----
&lt;/p&gt;
</description><pubDate>Mon, 26 May 2008 19:58:03 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/05/27/my-name/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category><category>&lt;a href='/blog/tag/life/'&gt;life&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/05/27/my-name/</feedburner:origLink></item><item><title>이터레이터 팁 몇 가지</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/293649442/</link><description>





&lt;p&gt;나중에 쓰려고 쌓아두고 있던 간단한 예시인데, 더 이상 쌓이지가 않아서 (--;)
   방출해 봅니다;
&lt;/p&gt;
&lt;p&gt;파이썬 이터레이터/제너레이터는 함축적으로 프로그래밍하는 걸 즐기는 사람들에게는
   정말 재미있지만, 절차적 프로그래밍을 하다가 갑자기 이터레이터를 쓰는 게 적응이
   잘 안 되는 경우도 많이 볼 수 있습니다.  최고의(!) 파이썬 책으로
   유명한 David Beazley가 지난 3월에 PyCon 2008에서 튜토리얼로
   &lt;a href="http://www.dabeaz.com/generators/index.html"&gt;시스템 프로그래머를 위한 제너레이터 트릭&lt;/a&gt;을 발표했습니다. 여러모로 재미있는 내용인데요~ 저기서는 제너레이터를
   주로 다뤘는데, 몇 가지 이터레이터와 관련된 사용 예를 소개해 드리려고요~
   (별로 관련 없는 것이 뒤죽박죽;;)
&lt;/p&gt;
&lt;p&gt;zip을 쓰면 이터레이터를 일정 개수씩 빼오는 걸 간단하게 할 수 있습니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;abcdefghijklmnopqrstvwxyz&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;f&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;g&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;h&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;i&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;j&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;빈칸이 올 때까지 입력받은 걸 리스트로 받으려면?
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;raw_input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; 
&lt;span class="n"&gt;batteries&lt;/span&gt; &lt;span class="n"&gt;included&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Python - &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;batteries included&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;딕셔너리 2개에서 양쪽 중 하나라도 키가 있는 것들을 뽑아서 돌려서 합치려는 경우..
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;6&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;9&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(이 경우는 collections.defaultdict를 써도 간단합니다.)
&lt;/p&gt;
&lt;p&gt;리스트를 받아서 순위를 계산
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;operator&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(이건 뭐 주제하고 상관도 없고 제멋대로;;;)
&lt;/p&gt;
</description><pubDate>Mon, 19 May 2008 17:33:59 -0000</pubDate><guid isPermaLink="false">http://openlook.org/blog/2008/05/20/few-tips-for-iterators/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hye-Shik Chang</dc:creator><feedburner:origLink>http://openlook.org/blog/2008/05/20/few-tips-for-iterators/</feedburner:origLink></item><item><title>한국인의 이름에 대한 여러 수치 조사</title><link>http://feeds.feedburner.com/~r/hyeshik/~3/292112329/</link><description>





&lt;p&gt;예전부터 꼭 해 보고 싶었던 것 중의 하나로 이름 데이터베이스를 구해서
   흔한 이름, 여성적 이름, 중성적 이름 등등 같은 것 통계내기가 있었습니다.
   요새 주변 사람들 중에 아기를 낳아서 새로 이름 짓는 사람도
   많고, 아무래도 이름에서 나오는 느낌의 신비(?)에 접근하고 싶어서! -ㅇ-
&lt;/p&gt;
&lt;p&gt;그러다가 얼마 전에 이름 데이터베이스를 하나 구했는데, 정보활용 동의를 받은
   사이트에 가입한 분들의 정보에서 이름, 성별 2가지만 추출한 것을 받았기 때문에
   개인정보보호와 관련된 문제는 심각하지 않을 것 같습니다. 정확한 통계를 위해서는
   성별외에도 생년이나 출생지같이 이름에 중대한 영향을 미치는 요소를 파악해서
   편향성을 봐야하겠지만, 개인정보의 과다한 사용이 될까 해서 그냥 이름 성별 외에는
   사용하지 않기로 결정했습니다. 그 결과 통계에 편향이 있는 것은 눈에 보이지만
   편향을 피하기도 힘들고, 신뢰도가 어느 정도 되는지 정확히 통계적인 분석은
   불가능했습니다. 따라서, 아래 분석은 그냥 재미로 읽어주시고 과학적인 통계로
   이뤄진 것이 아님을 유의해 주세요. :)
&lt;/p&gt;
&lt;p&gt;사용한 데이터셋은 기본적인 오타나 잘못 입력된 것이 명확한 자료들, 깨진 자료들은
   수작업으로 제거했고, 결국 80757명 (남자 52640명, 여자 28117명) 데이터로 분석했습니다.
   여자 수가 훨씬 적게 샘플링됐기 때문에, 전체적으로 분석에서 비율에 맞춰서 보정하려고
   노력했습니다.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=p3&amp;amp;chco=4d89f9,f9894d&amp;amp;chd=t:65,35&amp;amp;chs=350x100&amp;amp;chl=male%20%2852640%29|female%20%2828117%29" alt="데이터셋 내 성별 편향"/&gt;
&lt;/p&gt;

&lt;h4&gt;성씨별 빈도&lt;/h4&gt;
&lt;p&gt;기본적으로 성씨별 빈도는 &lt;a href="http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9D%B8%EA%B5%AC%EC%88%9C_%EC%84%B1%EC%94%A8_%EB%AA%A9%EB%A1%9D"&gt;통계청에서도 발표하는 자료&lt;/a&gt;이기 때문에 
   우리 데이터셋이 성씨별로 편향되어 있지 않은지 보기 위해 똑같이 빈도 조사를 해 봤습니다.
   그래서 순위를 보면 (한자는 음가기준으로 합산)
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 순위 &lt;/td&gt;&lt;td&gt; 2000년 통계청 &lt;/td&gt;&lt;td&gt; 데이터셋 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    1  &lt;/td&gt;&lt;td&gt; 김 (21.6%) &lt;/td&gt;&lt;td&gt; 김 (21.6%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    2  &lt;/td&gt;&lt;td&gt; 이 (14.8%) &lt;/td&gt;&lt;td&gt; 이 (14.8%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    3  &lt;/td&gt;&lt;td&gt; 박 (8.5%) &lt;/td&gt;&lt;td&gt; 박 (8.4%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    4  &lt;/td&gt;&lt;td&gt; 정 (4.9%) &lt;/td&gt;&lt;td&gt; 정 (4.8%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    5  &lt;/td&gt;&lt;td&gt; 최 (4.7%) &lt;/td&gt;&lt;td&gt; 최 (4.7%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    6  &lt;/td&gt;&lt;td&gt; 조 (2.9%) &lt;/td&gt;&lt;td&gt; 조 (2.9%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    7  &lt;/td&gt;&lt;td&gt; 강 (2.5%) &lt;/td&gt;&lt;td&gt; 강 (2.4%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    8  &lt;/td&gt;&lt;td&gt; 윤 (2.1%) &lt;/td&gt;&lt;td&gt; 장 (2.2%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;    9  &lt;/td&gt;&lt;td&gt; 장 (2.1%) &lt;/td&gt;&lt;td&gt; 임 (2.1%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;   10  &lt;/td&gt;&lt;td&gt; 임 (2.0%) &lt;/td&gt;&lt;td&gt; 윤 (2.1%) &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;아주 비슷하게 나온 것이, 장난으로 엉뚱한 이름으로 가입한 경우가 그렇게 많이 포함되어
   있지 않고 편향도 그다지 뚜렷한 것은 아니라는 것을 확인할 수 있습니다.
&lt;/p&gt;
&lt;p&gt;이 다음 통계부터는 성과 이름을 분리해서 쓰기 때문에 2글자 성을 구별할 필요가 있었는데요.
   특별히 좋은 방법이 없어서 그냥 일정 빈도 이상의 2글자 성씨로 시작하는 이름을 모두 2글자
   성씨로 봤습니다. 즉 "서문교"같은 이름은 서씨인지 서문씨인지 구분할 수 없으므로 그냥 모두
   서문씨인 것으로 처리했습니다. (이 조사에서 처리한 2글자 성씨: 남궁, 독고, 동방, 사공, 서문,
   선우, 제갈, 황보)
&lt;/p&gt;

&lt;h4&gt;가장 흔한 이름은 무엇일까!&lt;/h4&gt;
&lt;p&gt;자기 이름이 무척 흔한 분들은 보통 인터넷에 이름 쓸 때도 전혀 거리낌 없이 막 써도
   익명이 보장될 정도인데요. 과연 흔한 이름은 어떤 게 있을까 무척 어릴 때 부터 궁금했는데
   정량적으로 조사해 봤습니다!  물론 세대별 차이가 있긴 한데, 이번 데이터셋은 이름, 성별 외의
   개인정보를 사용하지 않았기 때문에 세대별 편향성 같은 것은 고려하지 않았습니다.
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 1 &lt;/td&gt;&lt;td&gt; 정훈 (0.367%) &lt;/td&gt;&lt;td&gt; 미경 (1.106%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 2 &lt;/td&gt;&lt;td&gt; 성호 (0.350%) &lt;/td&gt;&lt;td&gt; 은주 (1.024%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 3 &lt;/td&gt;&lt;td&gt; 정호 (0.293%) &lt;/td&gt;&lt;td&gt; 미영 (0.942%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 4 &lt;/td&gt;&lt;td&gt; 성진 (0.285%) &lt;/td&gt;&lt;td&gt; 은영 (0.882%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 5 &lt;/td&gt;&lt;td&gt; 성훈 (0.285%) &lt;/td&gt;&lt;td&gt; 경희 (0.850%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 6 &lt;/td&gt;&lt;td&gt; 영수 (0.281%) &lt;/td&gt;&lt;td&gt; 은경 (0.839%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 7 &lt;/td&gt;&lt;td&gt; 상훈 (0.277%) &lt;/td&gt;&lt;td&gt; 정희 (0.825%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 8 &lt;/td&gt;&lt;td&gt; 영호 (0.264%) &lt;/td&gt;&lt;td&gt; 은정 (0.818%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 9 &lt;/td&gt;&lt;td&gt; 준호 (0.262%) &lt;/td&gt;&lt;td&gt; 미숙 (0.804%) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 10 &lt;/td&gt;&lt;td&gt; 진호 (0.260%) &lt;/td&gt;&lt;td&gt; 현숙 (0.800%) &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;아는 정훈이 미경이가 보통 너댓명 씩은 되시니까 다들 1등은 놀라지 않으실 것 같네요 :)
&lt;/p&gt;
&lt;p&gt;그 뒷 순위로는 남자는 재호- 영진 - 상현 - 성환 - 재영 - 영민 - 재훈 - 영준 - 영철 - 성수 등등이고, 여자는 은희 - 현주 - 미정 - 영미 - 현정 - 지영 - 영숙 - 정숙 - 선희 - 은숙 이렇게 나가는데, 둘의 비율 차이가 비교가 안 될 정도입니다. 즉, 여자 이름은 0.2% 이상 이름이 115개나 되는데 남자는 0.2% 이상이 27개 밖에 안 됩니다. 여자 이름이 훨씬 집중적으로 같은 이름이 많이 쓰이고, 남자 이름이 다양성이 높다고 볼 수 있겠습니다. (엔트로피 계산은 생략;;)
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=bvg&amp;amp;chs=460x200&amp;amp;chd=e:eR..SEIjAAAAAA,ODjkQmggM1NsCu&amp;amp;chco=4d89f9,f9894d&amp;amp;chxt=x&amp;amp;chxl=0:|0%25|0.01%25|0.1%25|0.2%25|0.5%25|0.75%25|1%25&amp;amp;chg=10,20,1,0&amp;amp;chbh=20" alt="빈도별 이름 사용 인구"/&gt;
&lt;/p&gt;

&lt;h4&gt;이름에 많이 쓰이는 글자는?&lt;/h4&gt;
&lt;p&gt;이름 전체 말고 각 글자별로 보는 방법도 있겠죠~ 그래서 성별로 어떤 글자가 위치별로 많이 쓰이는지
   알아봤습니다.
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 순위 &lt;/td&gt;&lt;td&gt; 남자 앞 &lt;/td&gt;&lt;td&gt; 남자 뒤 &lt;/td&gt;&lt;td&gt; 여자 앞 &lt;/td&gt;&lt;td&gt; 여자 뒤 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 1 &lt;/td&gt;&lt;td&gt; 성 5.56%&lt;/td&gt;&lt;td&gt;호 5.42%&lt;/td&gt;&lt;td&gt;미 8.34%&lt;/td&gt;&lt;td&gt;희 10.04%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 2 &lt;/td&gt;&lt;td&gt; 영 5.09%&lt;/td&gt;&lt;td&gt;수 4.67%&lt;/td&gt;&lt;td&gt;은 7.66%&lt;/td&gt;&lt;td&gt;숙 9.31%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 3 &lt;/td&gt;&lt;td&gt; 상 4.30%&lt;/td&gt;&lt;td&gt;석 3.32%&lt;/td&gt;&lt;td&gt;정 6.12%&lt;/td&gt;&lt;td&gt;영 6.90%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 4 &lt;/td&gt;&lt;td&gt; 재 4.19%&lt;/td&gt;&lt;td&gt;철 3.30%&lt;/td&gt;&lt;td&gt;영 5.64%&lt;/td&gt;&lt;td&gt;정 6.15%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 5 &lt;/td&gt;&lt;td&gt; 종 4.12%&lt;/td&gt;&lt;td&gt;훈 3.13%&lt;/td&gt;&lt;td&gt;경 4.81%&lt;/td&gt;&lt;td&gt;경 5.47%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 6 &lt;/td&gt;&lt;td&gt; 정 4.03%&lt;/td&gt;&lt;td&gt;현 3.12%&lt;/td&gt;&lt;td&gt;현 4.51%&lt;/td&gt;&lt;td&gt;미 5.29%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 7 &lt;/td&gt;&lt;td&gt; 동 3.07%&lt;/td&gt;&lt;td&gt;진 2.92%&lt;/td&gt;&lt;td&gt;선 3.89%&lt;/td&gt;&lt;td&gt;자 4.81%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 8 &lt;/td&gt;&lt;td&gt; 용 3.00%&lt;/td&gt;&lt;td&gt;영 2.58%&lt;/td&gt;&lt;td&gt;혜 3.83%&lt;/td&gt;&lt;td&gt;순 4.60%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 9 &lt;/td&gt;&lt;td&gt; 승 2.79%&lt;/td&gt;&lt;td&gt;환 2.55%&lt;/td&gt;&lt;td&gt;지 3.72%&lt;/td&gt;&lt;td&gt;선 3.61%&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;10 &lt;/td&gt;&lt;td&gt; 경 2.68%&lt;/td&gt;&lt;td&gt;식 2.54%&lt;/td&gt;&lt;td&gt;수 2.77%&lt;/td&gt;&lt;td&gt;주 3.49%&lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;역시 여자 이름이 흔히 쓰는 글자가 좀 더 집중되어 있는데, 보통 한국인의 평균 얼굴 만들듯이
   대충 아무렇게나 상관관계 없이 뽑았을 때 가장 흔해 보이는 이름은 성호, 미희 가 되겠습니다.
   성별 구분을 하지 않고 그냥 뽑으면 영희가 가장 대표적인 이름이 됩니다. :)
&lt;/p&gt;
&lt;p&gt;제 이름은 여자 앞글자에서 8등, 남자 뒷글자에서 10등 했군요;;;;
&lt;/p&gt;

&lt;h4&gt;도무지 여자인지 남자인지 알 수 없는 이름은!&lt;/h4&gt;
&lt;p&gt;종종 중성적 매력이 있는 이름이 있죠. "정민"이라던지.. 양쪽에서 모두 많이 쓰여서 이름만 봐서는
   설렐지 안 설렐지 결정도 못할 무서운 그런 이름! 흐흐. 그래서 양쪽에서 모두 많이 쓰이는 이름들을
   찾아 봤습니다. 성별 편향은 여성내비율 / (남성내비율 + 여성내비율) 로 계산했으므로
   0에 가까운 값이 나오면 남자 이름에서 압도적으로 많이 쓰이는 것이고 1에 가까우면 여성 편향이
   있는 게 됩니다. 샘플이 적은 이름들은 비율이 잘못 계산될 수 있기 때문에 최소 0.05% 이상 있는
   이름에 대해서만 조사했습니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;경진 0.492
태희 0.494
기정 0.495
정윤 0.498
희원 0.4996
진 0.531
정민 0.532
윤영 0.542
주현 0.547
세영 0.555
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;태희는 당연히 여자 아닌가 생각했더니, 거의 완벽한 중성적 이름이군요. -ㅁ-;
&lt;/p&gt;
&lt;p&gt;저도 저런 이름 있었으면 무척 좋았을텐데 아쉽네요. 제 이름은 남자반 여자반 갈라놓은
   남녀공학 학교같은 분위기라서 --;;
&lt;/p&gt;
&lt;p&gt;그런데, 성별 편향을 조사하면서 잘 살펴보면 0.5 경계선 주변의 이름이 그다지 많지 않다는
   것을 알 수 있었습니다. 그래서 편향값의 분포를 히스토그램으로 그려 봤는데 진짜 확실하게
   드러납니다.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=bvs&amp;amp;chs=460x200&amp;amp;chd=e:HuPlOrN6GpGECPC.DMCAC9ATB4AhAnAjAmArA5BbAUBXAgAtA6AAAsAiAQAPAOALAjBKAXAiApAuATAuARAhAvAsAUAuAcA7A1Af,AHAgAxBEArAvAVAhAqAfAyAGAnAMAQAQATAXAhA6AOBBAaAoA4AAAyAqAUAVAWATBACXAyBUByCJA.CsBFCdEQEtCiHbF-SKaA4P&amp;amp;chco=4d89f9,f9894d&amp;amp;chxt=x&amp;amp;chxl=0:|0|||||0.1|||||0.2|||||0.3|||||0.4|||||0.5|||||0.6|||||0.7|||||0.8|||||0.9|||||1&amp;amp;chg=10,20,1,0&amp;amp;chbh=5" alt="이름별 성별 편향 분포"/&gt;
&lt;/p&gt;
&lt;p&gt;여성쪽이 압도적으로 확 올라가 버리는 것은 이름이 아무래도 집중되는 경향도 있긴 하지만,
   여자가 남자이름을 쓰는 경우가 남자가 여자이름을 쓰는 경우에 비해서 훨씬 많은 것이 주요
   원인인 것 같군요.
&lt;/p&gt;

&lt;h4&gt;남자/여자 이름에 각각 많은 글자?&lt;/h4&gt;
&lt;p&gt;전체적인 빈도 뿐만 아니라, 어떤 특정 글자가 전체적인 느낌을 압도해서 남자로 만들어버린다거나
   여자로 만들어버리는 글자들이 제법 있는데요. 예를 들어서 "철"이나 뒷 글자가 "국"인 경우에는
   웬만한 글자가지고는 여자이름을 만들기가 어렵고, 앞 글자가 "미"나 뒷 글자가 "숙"인 경우에는
   남자 이름을 만들기가 쉽지가 않습니다. 그래서 한 번 글자별 성별 편향을 조사해 봤습니다.
   편향성은 마찬가지로 아까와 같이 0과 가까우면 남자, 1과 가까우면 여자입니다.
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 순위 &lt;/td&gt;&lt;td&gt; 남자 앞글자 &lt;/td&gt;&lt;td&gt; 남자 뒷글자 &lt;/td&gt;&lt;td&gt; 여자 앞글자 &lt;/td&gt;&lt;td&gt; 여자뒷글자 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 1 &lt;/td&gt;&lt;td&gt; 왕 (0.0) &lt;/td&gt;&lt;td&gt; 황 (0.0) &lt;/td&gt;&lt;td&gt; 미 (0.9954) &lt;/td&gt;&lt;td&gt; 애 (1.0) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 2 &lt;/td&gt;&lt;td&gt; 웅 (0.0) &lt;/td&gt;&lt;td&gt; 율 (0.0) &lt;/td&gt;&lt;td&gt; 애 (0.9908) &lt;/td&gt;&lt;td&gt; 분 (1.0) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 3 &lt;/td&gt;&lt;td&gt; 범 (0.0184) &lt;/td&gt;&lt;td&gt; 률 (0.0) &lt;/td&gt;&lt;td&gt; 난 (0.9905) &lt;/td&gt;&lt;td&gt; 녀 (1.0) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 4 &lt;/td&gt;&lt;td&gt; 철 (0.0268) &lt;/td&gt;&lt;td&gt; 술 (0.0) &lt;/td&gt;&lt;td&gt; 혜 (0.9892) &lt;/td&gt;&lt;td&gt; 름 (1.0) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 5 &lt;/td&gt;&lt;td&gt; 대 (0.0341) &lt;/td&gt;&lt;td&gt; 걸 (0.0) &lt;/td&gt;&lt;td&gt; 숙 (0.9840) &lt;/td&gt;&lt;td&gt; 자 (0.9996) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 6 &lt;/td&gt;&lt;td&gt; 익 (0.0352) &lt;/td&gt;&lt;td&gt; 탁 (0.0) &lt;/td&gt;&lt;td&gt; 소 (0.9824) &lt;/td&gt;&lt;td&gt; 란 (0.9987) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 7 &lt;/td&gt;&lt;td&gt; 중 (0.0538) &lt;/td&gt;&lt;td&gt; 백 (0.0) &lt;/td&gt;&lt;td&gt; 분 (0.9771) &lt;/td&gt;&lt;td&gt; 미 (0.9986) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 8 &lt;/td&gt;&lt;td&gt; 낙 (0.0612) &lt;/td&gt;&lt;td&gt; 돈 (0.0) &lt;/td&gt;&lt;td&gt; 아 (0.9662) &lt;/td&gt;&lt;td&gt; 혜 (0.9983) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 9 &lt;/td&gt;&lt;td&gt; 택 (0.0630) &lt;/td&gt;&lt;td&gt; 룡 (0.0) &lt;/td&gt;&lt;td&gt; 매 (0.9630) &lt;/td&gt;&lt;td&gt; 임 (0.9981) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 10 &lt;/td&gt;&lt;td&gt; 권 (0.0738) &lt;/td&gt;&lt;td&gt; 건 (0.0) &lt;/td&gt;&lt;td&gt; 말 (0.9571) &lt;/td&gt;&lt;td&gt; 라 (0.9969) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 상위 25 평균 &lt;/td&gt;&lt;td&gt; 0.0727 &lt;/td&gt;&lt;td&gt; 0.0069 &lt;/td&gt;&lt;td&gt;  0.9337 &lt;/td&gt;&lt;td&gt; 0.9848 &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;역시 뭔가 성별을 치명적으로 결정해버릴 수 있는 글자들이 많이 보이는 것 같군요. :)
   그런데, 뒷 글자가 앞 글자에 비해서 편향이 훨씬 심한 것을 볼 수 있는데, 그래서
   남녀 데이터를 모두 합쳐서 앞/뒤의 각각의 표준편차를 구해봤는데 각각 0.31, 0.38로
   차이가 제법 나는군요. 앞 글자보다는 뒷 글자가 전체 성별 느낌을 결정하는데 중요한
   역할을 하는게 아닌가 싶습니다.
&lt;/p&gt;

&lt;h4&gt;앞 뒤 위치에 따라서 성별이 다른 글자&lt;/h4&gt;
&lt;p&gt;어떤 글자들은 앞에 오면 남자이름에 주로 쓰이지만, 뒤에 갈 때는 여자이름에 쓰이는 경우가
   있는데요, 이런 게 어떤게 있는지 한 번 찾아봤습니다. (편향은 앞의 설명과 마찬가지로 계산했습니다.)
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 글자 &lt;/td&gt;&lt;td&gt; 앞글자 편향 &lt;/td&gt;&lt;td&gt; 뒷글자 편향 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 보 &lt;/td&gt;&lt;td&gt; 0.747 (여) &lt;/td&gt;&lt;td&gt; 0.084 (남) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 수 &lt;/td&gt;&lt;td&gt; 0.725 (여) &lt;/td&gt;&lt;td&gt; 0.093 (남) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 복 &lt;/td&gt;&lt;td&gt; 0.777 (여) &lt;/td&gt;&lt;td&gt; 0.239 (남) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 서 &lt;/td&gt;&lt;td&gt; 0.625 (여) &lt;/td&gt;&lt;td&gt; 0.087 (남) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 행 &lt;/td&gt;&lt;td&gt; 0.604 (여) &lt;/td&gt;&lt;td&gt; 0.128 (남) &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;예를 들어, "보"가 앞에 오면 여자 이름인데, 뒤에 오면 남자인 경향이 훨씬 높다는 것이죠.
   그런데 신기하게도 편향이 차이나는 것 상위 13개가 모두 앞 글자에서 여자/뒷 글자에서
   남자이고, 처음으로 뒷 글자에서 더욱 여성스러워 지는 것은 "이" (0.57 -&amp;gt; 0.92),
   "자" (0.65 -&amp;gt; 0.99) 입니다.
&lt;/p&gt;

&lt;h4&gt;성별을 진짜로 확! 바꿔버리는 글자&lt;/h4&gt;
&lt;p&gt;앞에서는 그냥 전체적으로 한 성별에서 많이 나오는 글자들을 조사했는데요. 이번에는
   원래는 여성성이 있는 글자에 다른 글자가 붙어서 남성 이름으로 바꿔버린다던지 완전히
   반대로 바꿔버리는 글자들이 있는지 조사해 봤습니다.
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 순위 &lt;/td&gt;&lt;td&gt; 남성 앞글자 편향조절 &lt;/td&gt;&lt;td&gt; 여성 앞글자 편향조절 &lt;/td&gt;&lt;td&gt; 남성 뒷글자 편향조절 &lt;/td&gt;&lt;td&gt; 여성 뒷글자 편향조절 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 1 &lt;/td&gt;&lt;td&gt; 철 (0.703) &lt;/td&gt;&lt;td&gt; 슬 (-0.672) &lt;/td&gt;&lt;td&gt; 호 (0.549) &lt;/td&gt;&lt;td&gt; 아 (-0.572) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 2 &lt;/td&gt;&lt;td&gt; 대 (0.576) &lt;/td&gt;&lt;td&gt; 미 (-0.642) &lt;/td&gt;&lt;td&gt; 석 (0.522) &lt;/td&gt;&lt;td&gt; 이 (-0.519) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 3 &lt;/td&gt;&lt;td&gt; 요 (0.546) &lt;/td&gt;&lt;td&gt; 예 (-0.491) &lt;/td&gt;&lt;td&gt; 규 (0.494) &lt;/td&gt;&lt;td&gt; 미 (-0.486) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 4 &lt;/td&gt;&lt;td&gt; 충 (0.490) &lt;/td&gt;&lt;td&gt; 혜 (-0.441) &lt;/td&gt;&lt;td&gt; 상 (0.480) &lt;/td&gt;&lt;td&gt; 실 (-0.485) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 5 &lt;/td&gt;&lt;td&gt; 치 (0.486) &lt;/td&gt;&lt;td&gt; 소 (-0.433) &lt;/td&gt;&lt;td&gt; 준 (0.468) &lt;/td&gt;&lt;td&gt; 숙 (-0.484) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 6 &lt;/td&gt;&lt;td&gt; 창 (0.468) &lt;/td&gt;&lt;td&gt; 은 (-0.433) &lt;/td&gt;&lt;td&gt; 용 (0.460) &lt;/td&gt;&lt;td&gt; 순 (-0.435) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 7 &lt;/td&gt;&lt;td&gt; 형 (0.455) &lt;/td&gt;&lt;td&gt; 금 (-0.342) &lt;/td&gt;&lt;td&gt; 식 (0.451) &lt;/td&gt;&lt;td&gt; 림 (-0.428) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 8 &lt;/td&gt;&lt;td&gt; 동 (0.448) &lt;/td&gt;&lt;td&gt; 옥 (-0.329) &lt;/td&gt;&lt;td&gt; 찬 (0.442) &lt;/td&gt;&lt;td&gt; 경 (-0.422) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 9 &lt;/td&gt;&lt;td&gt; 용 (0.445) &lt;/td&gt;&lt;td&gt; 여 (-0.315) &lt;/td&gt;&lt;td&gt; 필 (0.437) &lt;/td&gt;&lt;td&gt; 은 (-0.421) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 10 &lt;/td&gt;&lt;td&gt; 병 (0.444) &lt;/td&gt;&lt;td&gt; 지 (-0.311) &lt;/td&gt;&lt;td&gt; 한 (0.436) &lt;/td&gt;&lt;td&gt; 례 (-0.419) &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;므흐흐. 역시 단순 빈도 조사를 한 앞 것보다 좀 더 결정적인 글자들이 강조되었는데요.
   제 이름은 앞 글자에서 -0.441, 뒷 글자가 0.451 해서 아슬아슬하게 남자 이름이 되었군요!
   -O-;
&lt;/p&gt;

&lt;h4&gt;한 위치에만 압도적으로 많이 쓰이는 글자&lt;/h4&gt;
&lt;p&gt;각 성별 안에서도 한 자리에만 많이 나오는 글자가 있는데, 뭐가 있나 조사해 봤습니다.
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 순위 &lt;/td&gt;&lt;td&gt; 남자 앞글자 &lt;/td&gt;&lt;td&gt; 남자 뒷글자 &lt;/td&gt;&lt;td&gt; 여자 앞글자 &lt;/td&gt;&lt;td&gt; 여자 뒷글자 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 1 &lt;/td&gt;&lt;td&gt; 자 (52/1) &lt;/td&gt;&lt;td&gt; 식 (1/1339) &lt;/td&gt;&lt;td&gt; 세 (135/1) &lt;/td&gt;&lt;td&gt; 실 (1/160) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 2 &lt;/td&gt;&lt;td&gt; 병 (1394/31) &lt;/td&gt;&lt;td&gt; 섭 (3/798) &lt;/td&gt;&lt;td&gt; 소 (360/4) &lt;/td&gt;&lt;td&gt; 심 (2/162) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 3 &lt;/td&gt;&lt;td&gt; 지 (498/13) &lt;/td&gt;&lt;td&gt; 곤 (1/240) &lt;/td&gt;&lt;td&gt; 계 (59/1) &lt;/td&gt;&lt;td&gt; 례 (3/167) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 4 &lt;/td&gt;&lt;td&gt; 여 (36/1) &lt;/td&gt;&lt;td&gt; 엽 (1/152) &lt;/td&gt;&lt;td&gt; 보 (160/3) &lt;/td&gt;&lt;td&gt; 랑 (1/29) &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; 5 &lt;/td&gt;&lt;td&gt; 시 (108/3) &lt;/td&gt;&lt;td&gt; 열 (7/555) &lt;/td&gt;&lt;td&gt; 유 (314/7) &lt;/td&gt;&lt;td&gt; 자 (52/1353) &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;-식, -실, -례 는 자주 보지만 식-, 실-, 례-는 좀처럼 보기 힘든 것 같은 게 위의 표에서
   표현되어 있는데, 전체를 조사해 보면 반 정도 글자는 앞 뒷 글자 구분이 있고,
   반 정도는 앞 뒤에서 모두 사용되는군요.
&lt;/p&gt;

&lt;h4&gt;한글 자모별 편향&lt;/h4&gt;
&lt;p&gt;한글은 분해해서 자모의 느낌도 볼 수 있으니까, 각 자모별 조사도 해 봤습니다~
   전체 자료는 표시하기에 너무 많아서 몇 가지 주요 자모만..
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;ㄱ&lt;/td&gt;&lt;td&gt;ㄷ&lt;/td&gt;&lt;td&gt;ㅁ&lt;/td&gt;&lt;td&gt;ㅅ&lt;/td&gt;&lt;td&gt;ㅇ&lt;/td&gt;&lt;td&gt;ㅈ&lt;/td&gt;&lt;td&gt;ㅊ&lt;/td&gt;&lt;td&gt;ㅌ&lt;/td&gt;&lt;td&gt;ㅎ&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;남자 초성 (앞) &lt;/td&gt;&lt;td&gt;11.0&lt;/td&gt;&lt;td&gt;6.3&lt;/td&gt;&lt;td&gt;4.0&lt;/td&gt;&lt;td&gt;18.2&lt;/td&gt;&lt;td&gt;17.1&lt;/td&gt;&lt;td&gt;19.8&lt;/td&gt;&lt;td&gt;5.0&lt;/td&gt;&lt;td&gt;2.6&lt;/td&gt;&lt;td&gt;10.1&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;남자 초성 (뒤) &lt;/td&gt;&lt;td&gt;12.4&lt;/td&gt;&lt;td&gt;2.3&lt;/td&gt;&lt;td&gt;4.4&lt;/td&gt;&lt;td&gt;18.4&lt;/td&gt;&lt;td&gt;18.5&lt;/td&gt;&lt;td&gt;9.6&lt;/td&gt;&lt;td&gt;5.1&lt;/td&gt;&lt;td&gt;2.0&lt;/td&gt;&lt;td&gt;21.2&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;여자 초성 (앞) &lt;/td&gt;&lt;td&gt;8.4&lt;/td&gt;&lt;td&gt;0.9&lt;/td&gt;&lt;td&gt;13.4&lt;/td&gt;&lt;td&gt;17.2&lt;/td&gt;&lt;td&gt;24.8&lt;/td&gt;&lt;td&gt;15.6&lt;/td&gt;&lt;td&gt;1.3&lt;/td&gt;&lt;td&gt;0.4&lt;/td&gt;&lt;td&gt;14.5&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;여자 초성 (뒤) &lt;/td&gt;&lt;td&gt;6.4&lt;/td&gt;&lt;td&gt;0.5&lt;/td&gt;&lt;td&gt;6.3&lt;/td&gt;&lt;td&gt;20.5&lt;/td&gt;&lt;td&gt;22.8&lt;/td&gt;&lt;td&gt;18.9&lt;/td&gt;&lt;td&gt;0.2&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;td&gt;17.5&lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;ㅏ&lt;/td&gt;&lt;td&gt;ㅐ&lt;/td&gt;&lt;td&gt;ㅓ&lt;/td&gt;&lt;td&gt;ㅕ&lt;/td&gt;&lt;td&gt;ㅗ&lt;/td&gt;&lt;td&gt;ㅘ&lt;/td&gt;&lt;td&gt;ㅛ&lt;/td&gt;&lt;td&gt;ㅜ&lt;/td&gt;&lt;td&gt;ㅡ&lt;/td&gt;&lt;td&gt;ㅢ&lt;/td&gt;&lt;td&gt;ㅣ&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;남자 중성 (앞) &lt;/td&gt;&lt;td&gt;11.1&lt;/td&gt;&lt;td&gt;9.3&lt;/td&gt;&lt;td&gt;14.8&lt;/td&gt;&lt;td&gt;16.8&lt;/td&gt;&lt;td&gt;11.1&lt;/td&gt;&lt;td&gt;2.8&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;td&gt;8.2&lt;/td&gt;&lt;td&gt;4.6&lt;/td&gt;&lt;td&gt;1.3&lt;/td&gt;&lt;td&gt;11.0&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;남자 중성 (뒤) &lt;/td&gt;&lt;td&gt;5.5&lt;/td&gt;&lt;td&gt;4.7&lt;/td&gt;&lt;td&gt;15.1&lt;/td&gt;&lt;td&gt;10.6&lt;/td&gt;&lt;td&gt;11.3&lt;/td&gt;&lt;td&gt;4.3&lt;/td&gt;&lt;td&gt;2.6&lt;/td&gt;&lt;td&gt;20.7&lt;/td&gt;&lt;td&gt;2.6&lt;/td&gt;&lt;td&gt;1.7&lt;/td&gt;&lt;td&gt;13.9&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;여자 중성 (앞) &lt;/td&gt;&lt;td&gt;4.5&lt;/td&gt;&lt;td&gt;3.0&lt;/td&gt;&lt;td&gt;13.2&lt;/td&gt;&lt;td&gt;20.0&lt;/td&gt;&lt;td&gt;5.8&lt;/td&gt;&lt;td&gt;0.9&lt;/td&gt;&lt;td&gt;1.5&lt;/td&gt;&lt;td&gt;9.3&lt;/td&gt;&lt;td&gt;10.1&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;td&gt;19.7&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;여자 중성 (뒤) &lt;/td&gt;&lt;td&gt;11.1&lt;/td&gt;&lt;td&gt;2.6&lt;/td&gt;&lt;td&gt;10.9&lt;/td&gt;&lt;td&gt;18.2&lt;/td&gt;&lt;td&gt;4.0&lt;/td&gt;&lt;td&gt;2.9&lt;/td&gt;&lt;td&gt;0.3&lt;/td&gt;&lt;td&gt;19.2&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;td&gt;10.2&lt;/td&gt;&lt;td&gt;14.7&lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;없음&lt;/td&gt;&lt;td&gt;ㄱ&lt;/td&gt;&lt;td&gt;ㄴ&lt;/td&gt;&lt;td&gt;ㄹ&lt;/td&gt;&lt;td&gt;ㅁ&lt;/td&gt;&lt;td&gt;ㅂ&lt;/td&gt;&lt;td&gt;ㅇ&lt;/td&gt;&lt;td&gt;ㅍ&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;남자 종성 (앞)&lt;/td&gt;&lt;td&gt;23.9&lt;/td&gt;&lt;td&gt;3.6&lt;/td&gt;&lt;td&gt;19.2&lt;/td&gt;&lt;td&gt;2.4&lt;/td&gt;&lt;td&gt;1.5&lt;/td&gt;&lt;td&gt;0.2&lt;/td&gt;&lt;td&gt;49.2&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;남자 종성 (뒤)&lt;/td&gt;&lt;td&gt;28.9&lt;/td&gt;&lt;td&gt;13.0&lt;/td&gt;&lt;td&gt;31.4&lt;/td&gt;&lt;td&gt;8.1&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;td&gt;14.4&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;여자 종성 (앞)&lt;/td&gt;&lt;td&gt;34.8&lt;/td&gt;&lt;td&gt;3.3&lt;/td&gt;&lt;td&gt;31.3&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;td&gt;2.0&lt;/td&gt;&lt;td&gt;0.1&lt;/td&gt;&lt;td&gt;27.6&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt;여자 종성 (뒤)&lt;/td&gt;&lt;td&gt;38.1&lt;/td&gt;&lt;td&gt;13.6&lt;/td&gt;&lt;td&gt;23.0&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;td&gt;3.3&lt;/td&gt;&lt;td&gt;0.2&lt;/td&gt;&lt;td&gt;20.7&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;가만 보고 있으면, 어감하고 직결되는 부분이 몇 군데가 확 눈에 띄는데요, 여자 이름에
   받침이 없는 경우가 훨씬 많고, 뒷글자에 훨씬 많이 나오는 종성 같은 것들이 뚜렷하군요.
   (분석할 것은 많지만 지면 상 생략 -ㅇ-) 재미있는 것은 남자 중 거의 절반이
   이름 앞글자가 ㅇ 받침이네요. +_+
&lt;/p&gt;

&lt;h4&gt;성과 연결된 이름&lt;/h4&gt;
&lt;p&gt;종종 이름 중에 한가지 성씨하고 유독 잘 어울리는 이름이 있습니다.
   예를 들어 한아름, 조아라, 정다운 이런 이름은 다른 성보다 한 성에 보통 집중되어 있죠.
   그래서 그런 게 어떤게 있나 조사해 봤습니다. (괄호 안의 수치는 성의 빈도에 대한
   해당 이름 내의 성의 빈도차)
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;여자이름&lt;/em&gt;
   정다운 (21배), 조아라 (17.9배), 한송희 (14배), 한아름 (13.4배), 한송이 (11.5배),
   고은선 (9.4배), 안소희 (8.4배), 조한나 (8.3배)
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;남자이름&lt;/em&gt;
   남궁원 (268배), 백운봉 (125배), 심현보 (107배), 구정모 (79배), 허근 (69.7배), 홍준표 (59.4배),
   홍광표 (55.4배), 권혁성 (53배), 홍원표 (52배), 권오성 (47.7배), 권대혁 (45.4배), 허욱 (39.6배)
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;여자이름은 대부분 연결된 글자들이 뜻하는 다른 단어들이 영향을 많이 주었는데,
   남자이름은 돌림자와 관련된 것이 매우 많습니다. 즉, 홍씨와 권씨가 압도적으로 상위 빈도를
   모두 차지했는데, 그 이유를 연구실 동료인 홍모군에게 문의한 결과, 홍씨가 넘어온 것이 조선대라서
   얼마 되지 않다보니 항렬자가 상당히 같은 연대에서 많이 동기화되어 있다고 하는군요.
&lt;/p&gt;
&lt;p&gt;그래서 그냥 위치별로도 따로 조사를 해 봤는데, 따로 한 것과 큰 차이는 없어서 이름을 분해한 글자를 기준으로 성과의 상관관계를 봤습니다. (성-이름글자 순서)
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;여자이름&lt;/em&gt;
   여-운 (49.4배), 권-혁 (36.1배), 민-홍 (17배), 백-설 (13.2배), 한-름 (13.1배), 남-우 (11.9배)
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;남자이름&lt;/em&gt;
   구-본 (246.9배), 연-흠 (221배), 구-자 (141.5배), 인-치 (55.8배), 연-제 (42.1배), 구-회 (35배),
   홍-표 (32.4배), 윤-여 (31.5배), 추-엽 (30.5배), 성-낙 (26.9배), 심-보 (20.8배), 곽-노 (19.9배),
   권-오 (18.3배), 성-백 (17.9배), 허-행 (15배), 구-모 (14.7배), 임-채 (12배), 원-유 (11.9배)
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;주로 대부분 돌림자와 관련된 것을 알 수 있는데, 그동안 이상하게 한 성씨에서 한 글자를 많이
   봤다 싶은 것들이 골고루 나와있네요. :-)
&lt;/p&gt;

&lt;h4&gt;머릿글자가 겹치는 이름&lt;/h4&gt;
&lt;p&gt;이름을 대충 숨겨서 쓰려고 ㅇㅁㅂ 같은 방법을 많이 쓰는데, 이렇게 쓰면 과연 겹치는 사람이
   얼마나 될지 궁금해서 한 번 찾아 봤습니다. 머릿글자가 ㅇㅁㅂ인 사람은 8만명 중 6명으로
   0.000075 확률이라서 일부러 누구 찍어서 말하는 게 아니라고 말하기 매우 힘든 수준이라고
   볼 수 있겠죠;  그럼 과연 가장 많이 겹치는, 머릿글자만 따도 이미 익명성이 보장되는 것은
   어떤 게 있을까요!
&lt;/p&gt;
&lt;p&gt;&lt;table&gt;
   &lt;tr&gt;&lt;td&gt; 머릿글자 &lt;/td&gt;&lt;td&gt; 비율 &lt;/td&gt;&lt;td&gt; 예시 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; ㅇㅈㅎ &lt;/td&gt;&lt;td&gt; 1.50% &lt;/td&gt;&lt;td&gt; 안정환 안재현 오지호 유정현 엄지혜 임지훈 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; ㅇㅈㅇ &lt;/td&gt;&lt;t