<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Openlook Stories</title><link>http://openlook.org/</link><description>Latest posts on Openlook Stories</description><language>ko</language><lastBuildDate>Sat, 16 Jul 2011 05:44:07 -0000</lastBuildDate><item><title>한국에서 23andMe 하는 과정</title><link>http://openlook.org/blog/2011/07/16/23andme-spit-from-korea/</link><description>





&lt;p&gt;처음으로 대중적인 관심을 집중적으로 받은 오락유전체학 (entertainment genomics) 상품인 &lt;a href="http://www.23andme.com"&gt;23andMe&lt;/a&gt;가 서비스를 시작한지 3년이 다 돼가고 있습니다. 언론과 학계의 관심 뿐만 아니라 사업적으로도 상당히 잘 되고 있다는 것이 제법 긍정적이죠. 이게 처음에 워낙 비싸서 정말 얼리어답터나 유전병에 관심이 많은 사람이 아니면 하기가 어려웠지만, 이제는 200달러에 비교적 쉽게 침을 한 번 뱉어볼 수 있는 정도가 됐습니다. 그래서 아 그래 나도 맨날 엄한 암세포나 대장균 유전자말고 내 유전자하고 좀 놀아보자 하고 마음먹고 해 보았지요~&lt;/p&gt;
&lt;p&gt;이미 &lt;a href="http://hongiiv.tistory.com/516"&gt;홍창범님&lt;/a&gt;과 &lt;a href="http://yong27.biohackers.net/354"&gt;김형용님&lt;/a&gt;께서 해 보셨기 때문에 조언을 얻어서 진행해 보았습니다. 미국에 막 부탁할 만한 지인이 없는 경우도 쉽게 할 수 있도록 최대한 지인활용을 배제하는 것을 원칙으로.. (?;;)&lt;/p&gt;
&lt;h4&gt;신용카드 결제하기&lt;/h4&gt;
&lt;p&gt;우선 &lt;a href="https://www.23andme.com/store/cart/"&gt;23andMe 사이트&lt;/a&gt;에 가서 주문합니다. 그런데, 주문할 때 아주 큰 문제는 한국을 결제 주소로 쓸 수가 없고, 신용카드와 결제주소가 영 안 맞으면 결제가 거부되기 때문에, 이 부분에 한해서는 지인을 활용하여 외국 신용카드를 써야합니다. 미국 카드도 괜찮고 일본 카드도 되는데, 저는 일본에 계신 &lt;a href="http://live.maroo.info/"&gt;거친마루님&lt;/a&gt;께 제가 침을 좀 뱉어보고자 하니 결제 한 번만 해 주십시오 하여 대신 결제를 해 주셨습니다. ^_^ (감사!)  단, $99에 1년 서비스를 추가 결제해야되게 돼 있어서 여러 번 신세를 지지 않으려면 선물세트($207)로 사는 것이 더 편하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;img alt="23andMe 키트" src="http://farm7.static.flickr.com/6018/5942290682_80b3c76932_m.jpg" /&gt;&lt;/p&gt;
&lt;h4&gt;키트 배송 방법&lt;/h4&gt;
&lt;p&gt;침을 담아가는 키트를 받을 때 주소로 한국을 쓸 수 없어서 지인을 활용하거나 요즘 아주 많은 배송대행 업체를 써야 합니다. 배송대행도 요새 크게 비싼 편이 아니라서 배송대행을 하기로 하고, 가격도 비교적 싸고 잔문제가 별로 없었던 &lt;a href="http://sevenzone.com/"&gt;세븐존&lt;/a&gt;이라는 업체에 보냈습니다. 오레곤으로 보내면 미국 내 세금이 안 붙는 대신 좀 느리고, 캘리포니아로 보내면 순식간에 도착하는 대신 세금이 붙습니다. 키트가 워낙 가벼워서 배송비와 대행료를 합쳐서 13000원이면 충분했습니다.&lt;/p&gt;
&lt;h4&gt;국내 통관&lt;/h4&gt;
&lt;p&gt;통관용 물품신고를 배송대행업체에 신청할 때 작성해야하는데요, 여기서 얼마로 쓰느냐에 따라서 세금이 달라집니다. 보통 통관할 때 구입한 사이트와 똑같이 생긴게 가격도 같으면 빨리 된다길래 $99로 신고했더니만 관세가 꽤 붙어버렸네요. 2개 통관에 45590원 냈습니다. 그런데 나중에 확인해보니까 키트를 다시 받을 때 23andMe가 받는 가격이 $25라고 하니까, $25로 신고하면 관세도 안 붙고 좋을 것 같은데.. 다음엔 그 쪽으로 해 봐야겠네요;&lt;/p&gt;
&lt;h4&gt;침 뱉기&lt;/h4&gt;
&lt;p&gt;튜브가 도착하면 침을 모아서 잘 뱉으면 됩니다. 사용방법은 친절하게 써 있으니 그냥 그대로 하면 되고, 뚜껑에 모여있는 보존액이 충분히 침하고 섞어주고 열심히 흔들어서 DNA분해효소를 무력화하는 것이 중요합니다. 튜브는 DNA Genotek의 &lt;a href="http://www.dnagenotek.com/DNA_Genotek_Product_OG500_Overview.html"&gt;ORAGene-DNA OG-500&lt;/a&gt;의 OEM 제품이 옵니다. 자세한 정보는 매뉴얼에 안 써 있는데, &lt;a href="http://www.patentgenius.com/patent/7482116.html"&gt;특허출원내용&lt;/a&gt;을 보면 뚜껑에 있는 보존액의 주성분은 Mg2+를 잡아서 DNase 활성을 막아주는 킬레이팅 에이전트 (EDTA일 확률이 높지만 CDTA, DTPA, DOTA, TETA 등도 언급되어 있음)와, 단백질 구조를 풀어서 DNase를 너덜너덜(;)하게 해 주는 환원제 (2-mercaptoethanol, DTT, dithionite, ascorbic acid 등 여러가지 중 하나), 항산화제 (항산화 비타민 등), pH 유지를 위한 버퍼 에이전트 (Tris, HEPES 등 중 하나)를 포함하고 있다고 합니다. 예상가능한 조합이지만 구체적으로 뭐라고 안 써놔서 실제로 받은 키트에 뭐가 들어있을지는 모르겠네요. DTT나 2-mercaptoethanol 특유의 냄새는 전혀 안 나는 걸 봐서는 보통 쓰는 조합은 아니거나 농도가 비교적 낮은 모양입니다.&lt;/p&gt;
&lt;p&gt;침은 모두 2ml 뱉도록 되어있는데 최종적으로는 보존액 2ml과 합쳐서 4ml이 됩니다. 신기하게도 여기서 DNA를 뽑으면 무려 110µg 정도 얻을 수 있다는군요. (침에 DNA가 이렇게 많았다니!!)&lt;/p&gt;
&lt;h4&gt;미국으로 다시 보내기&lt;/h4&gt;
&lt;p&gt;23andMe에서 직접 샘플을 처리하는 것이 아니고 LA에 있는 &lt;a href="http://www.ngi.com/"&gt;National Genetics Institute&lt;/a&gt;라는 의료용 유전자진단 전문 회사가 처리합니다. 그래서 침도 여기로 보내도록 주소가 되어 있습니다. 23andMe에서 미국 내 반송용으로는 선불택배를 지불해 놓았지만, 한국에서는 보낼 수 없으니까 마찬가지로 지인 활용을 할 수도 있고, 직접 보내는 것도 사실 가격 차이는 없습니다. 특히 NGI가 LA공항 바로 옆에 있으니까 훨씬 빨리 가겠죠~ (그냥 상상;;) 우체국 EMS에서 2개를 반송하는데 22000원으로 생각보다 싸게 보낼 수 있었습니다. 통관물품신고는 저는 홍창범님이 하신 대로 Toy, $10으로 신고하고 조마조마 하고 있었는데, 나중에 보니 공항에서 받자마자 바로 통관되는 게 크게 까다로운 것 같지는 않네요. 정식으로 하자면 보존액처리된 침 샘플은 미국 항공안전규정에서 생물학적 규제 면제 품목에 해당돼서 법적으로 큰 문제가 없지만, 많은 배송업체들이 침 샘플을 다룬 경험이 거의 없어서 엉뚱하게 돌려보내는 경우도 있다고 하네요. 눈치껏 잘 하면 됩니다. ^^; 저는 EMS를 한국에서 발송하고 4일 만에 NGI에 도착했습니다.&lt;/p&gt;
&lt;h4&gt;결과&lt;/h4&gt;
&lt;p&gt;결과는 받고 나서 6주 후에 나온다고 하는데.. 전 아직 안 받아서 나중에 받으면~~ ^^;&lt;/p&gt;
</description><pubDate>Sat, 16 Jul 2011 05:44:07 -0000</pubDate><guid>http://openlook.org/blog/2011/07/16/23andme-spit-from-korea/</guid><category>&lt;a href='/blog/tag/life/'&gt;life&lt;/a&gt;</category></item><item><title>유전체에 연결된 실수형 자료 빨리 접근하기</title><link>http://openlook.org/blog/2011/02/23/accessing-real-number-data-related-to-genomic-intervals/</link><description>





&lt;p&gt;유전체에 연관된 데이터는 매우 많고 타입도 다양합니다. 그 중에 실수형 데이터가 쫙 깔린 것도 몇가지 있는데, 대표적으로 보존도(conservation score), ChIP이나 RNA-seq, &lt;a href="http://cshprotocols.cshlp.org/cgi/content/full/2010/2/pdb.prot5384"&gt;DNase-seq&lt;/a&gt; 등에서 나온 시퀀싱 데이터의 리드 수, &lt;a href="http://genome.ucsc.edu/cgi-bin/hgTrackUi?hgsid=2171&amp;amp;c=chr5&amp;amp;g=mapability"&gt;짧은 리드의 매핑 가능 정도&lt;/a&gt;, 예측된 유전자에 관련된 점수, GC 비율, RNA의 2차구조 안정성 같은 것들이 있겠죠.&lt;/p&gt;
&lt;p&gt;예를 들어서, &lt;a href="http://en.wikipedia.org/wiki/CLIP-Seq"&gt;CLIP-seq&lt;/a&gt;로 얻은 단백질에 붙을 걸로 예측되는 부분의 리드 주변 보존도가 다른 부분에 비해서 진화 속도가 더 빠른지 보존이 잘 되는지, 구조적으로 안정한지, 크로마틴이 풀려있다거나, RNAPol II가 멈춰있는 근처에서 막 붙는지 그런 것들을 정량적으로 보려면, 이런 것들을 미리 정리해 놓은 데이터를 쉽게 가져오면 좋지요.&lt;/p&gt;
&lt;p&gt;다행히도 UCSC느님께서 정리를 정말 잘 해두셔서 긁어오기만 하면 바로 짠 하고 쓸 수 있는데!
주로 &lt;a href="http://genome.ucsc.edu/FAQ/FAQformat#format6.1"&gt;bigWig&lt;/a&gt; 포맷으로 되어 있어서 파이썬에서 접근하려면 좀 번거롭죠. 다행히도 요새 전세계 실험생물학자들의 구세주로 떠오른 &lt;a href="http://galaxy.psu.edu"&gt;Galaxy&lt;/a&gt;가 파이썬으로 개발되면서 이런 대용량 포맷에 접근하는 모듈을 아주 깨끗하게 잘 만들어두었습니다~ &lt;a href="https://bitbucket.org/james_taylor/bx-python/overview"&gt;소스도 잘 공개되어&lt;/a&gt; 있어서 쉽게 깔 수 있구요. 다만 매뉴얼이 전혀 없다는 문제가 있는데.. 그래도 직접 다 만드는 것 보단..;&lt;/p&gt;
&lt;p&gt;그래서 쓰는 방법은.. 이렇게 대충 할 수 있습니다. (Lin28의 3'UTR 일부에서 36nt short read의 매핑 가능 점수를 가져오는 코드)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;from bx.bbi.bigwig_file import BigWigFile

crg36 = BigWigFile(open('crgMapabilityAlign36mer.bw'))

summarized = crg36.summarize('chr4', 133561496, 133561599, 133561599-133561496)
print summarized.size
print summarized.sum_squares

qresult = crg36.query('chr4', 133561496, 133561599, 10)
print qresult&lt;/pre&gt;&lt;/div&gt;
</description><pubDate>Wed, 23 Feb 2011 05:50:58 -0000</pubDate><guid>http://openlook.org/blog/2011/02/23/accessing-real-number-data-related-to-genomic-intervals/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>Tabix: 엄청 빠르게 탭으로 구분된 1차원 좌표계 검색하기</title><link>http://openlook.org/blog/2011/01/30/python-binding-for-tabit-genome-annotation-indexer/</link><description>





&lt;p&gt;시퀀싱 데이터를 대량으로 뽑아놓고 후속 통계 처리를 하자면,
각 태그가 각각 어느 영역에 들어가는지 분류하는 과정을 거쳐야 합니다.
요즘 &lt;a href="http://cufflinks.cbcb.umd.edu/"&gt;cufflinks&lt;/a&gt; 같이 자동으로 요약해주는 녀석들이 많이 나와서 그냥 단순히 RNA-seq이나 ChIP-seq에서 보통 많이 하는 분석만 하는 것은 간단해졌지만, CLIP-seq처럼 어디로 분석이 튈지 모르는 다른 대부분의 경우엔 매핑된 곳이 뭔지 대량으로 정확히 분류하는 것이 중요합니다.&lt;/p&gt;
&lt;p&gt;예를 들어 생쥐 유전체 mm9 버전에서는 &lt;a href="http://genome.ucsc.edu/cgi-bin/hgTracks?clade=mammal&amp;amp;org=Mouse&amp;amp;db=mm9&amp;amp;position=chr7:149,836,673-149,845,394"&gt;Igf2가 chr7의 149,836,673부터 149,845,394&lt;/a&gt;까지 있습니다. 사이에 인트론이 3개있고요. 여기서 만약에 14984050 근처에 어떤 태그 하나가 매핑되었다고 치면, 이게 어느 유전자인가 물어봐서 "Igf2의 2번째 인트론입니다"하는 대답하는 것을 수천만번 매우 빠르게 할 수 있어야 하는데요. 여기서 좀 더 복잡해지는 것은 Igf2 인트론에 &lt;a href="http://mirbase.org/cgi-bin/mirna_entry.pl?acc=MI0003484"&gt;mmu-mir-483&lt;/a&gt;이 껴 있듯이, 여러 주석이 겹쳐서 시작과 끝이 순서가 달라질 수 있어서, 단순히 정렬된 리스트의 &lt;a href="http://en.wikipedia.org/wiki/Binary_search"&gt;이진 탐색&lt;/a&gt;이나 &lt;a href="http://en.wikipedia.org/wiki/B%2B_tree"&gt;B+ tree&lt;/a&gt;같은 것으로는 인덱싱이 불가능합니다.&lt;/p&gt;
&lt;p&gt;이 문제를 해결하려면 가장 간단하게는 SQLdb에 모두 집어넣어놓고 SELECT절에 BETWEEN을 써서 검색하는 것이겠는데, &lt;a href="http://genome.ucsc.edu"&gt;UCSC Genome Browser&lt;/a&gt;도 이 방법으로 MySQL에 넣고 쓰고, RNA-seq 초창기 분석 도구로 유명했던 &lt;a href="http://woldlab.caltech.edu/wiki/RNASeq"&gt;ERANGE&lt;/a&gt;도 sqlite에 넣고 계속 SQL 질의를 보내서 해결합니다. 간단하긴 한데 써 보면 엄청나게 느려서 분석을 구경하는 사람들에게 NGS란 이렇게 오래걸릴 정도로 대단한거구나 하는 환상을 심어주기 쉬울 정도가 되죠.&lt;/p&gt;
&lt;p&gt;그렇지만 물론 BETWEEN을 수천만번 하는 것 보다 훨씬 빠른 인덱스를 만드는 방법이 많이 있겠죠. 대표적으로 &lt;a href="http://en.wikipedia.org/wiki/R%2B_tree"&gt;R+tree&lt;/a&gt;나 &lt;a href="http://en.wikipedia.org/wiki/Kd-tree"&gt;kd-tree&lt;/a&gt; 같은 2차원 공간 탐색이 가능한 인덱스를 쓰는 것도 있겠고요. 겹치는 녀석들끼리 링크드 리스트로 묶어서 서로 안 겹치는 클러스터로 만든 다음, 클러스터를 이진 탐색하는 방법도 있습니다. 알고리즘은 전자가 훨씬 멋있지만, 실제로 벤치마크해보면 후자가 압도적으로 빠릅니다.;; 이 방법을 구현한 파이썬 라이브러리로 &lt;a href="http://bioinfo.mbi.ucla.edu/pygr_0_7_1/intervaldb-doc.html"&gt;Pygr의 NLMSA&lt;/a&gt;가 널리 쓰입니다. 그런데 이 쪽 구현은 내부적으로 깔끔하게 구현하느라 그랬는지, 메모리 소모나 인덱싱 속도, 검색 속도 모두 생각보다 훨씬 많이 먹고 느리고 그렇습니다. 특히 인덱스 들고 있는 데에 파이썬 객체를 너무 많이 만들어내서... 물론 SQL쓰는 것보단 훨씬 빠르지만 말이죠.&lt;/p&gt;
&lt;p&gt;그러다 괜찮은 것을 발견했습니다. +_+ 어느날 &lt;a href="http://samtools.sourceforge.net/"&gt;samtools&lt;/a&gt; 새 버전이 나왔으면 받으려고 갔는데, &lt;a href="http://samtools.sourceforge.net/tabix.shtml"&gt;tabix&lt;/a&gt;라고 처음 보는 게 올라가 있길래 궁금해서 보니까 바로 이 기능을 하는 것이더군요! 이건 좀 더 범용으로 만들어서 탭으로 구분된 모든 텍스트파일을 인덱싱 가능하도록 만들었고, 게다가 원본 그대로 gzip한 다음에 원본에서 찾아주는 것이라 여러 도구에 쉽게 녹아들어갈 수 있게 만들었네요. (압축파일 안에서 랜덤액세스가 가능하도록 하는 도구도 물론 들어있습니다.)&lt;/p&gt;
&lt;p&gt;써보니 속도도 상당히 빠릅니다. 매우 만족! 그래서 파이썬에서 쓰려면 어떻게 해야하나 보니까, 이미 펄, 파이썬, 자바 바인딩이 들어있더군용. 그러나 파이썬 바인딩이 &lt;a href="http://docs.python.org/library/ctypes.html"&gt;ctypes&lt;/a&gt;를 쓰게 돼 있어서, 설치나 관리가 여러모로 번거롭고 속도도 (아주 약간) 느려지고.. 흐흐 예전부터 들어왔던 &lt;a href="http://cython.org/"&gt;Cython&lt;/a&gt;을 배워볼 절호의 기회다! 하고 Cython으로 한참 다시 바인딩하는 작업을 해 봤는데, 아무리 찾아봐도 이터레이터 객체를 구현할 때 &amp;#95;&amp;#95;next&amp;#95;&amp;#95;에서 NULL을 리턴할 방법이 없어서 깔끔하게 만들어 줄 수가 없네요.. 결국은 그냥 포기하고 C 모듈로 만들었습니다. (&lt;a href="http://openlook.org:625/src/1101/tabix-cpython-1.diff"&gt;tabix 0.2.3용 패치&lt;/a&gt;) 패치는 tabix 원저자에게 보냈습니다. 파이썬 2/3 겸용이죠. 호호호;&lt;/p&gt;
&lt;p&gt;이렇게 쓸 수 있습니다~ 일단 인덱스 만들고 확인하기.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;% head -3 lincRNAGuttman-mm9.bed
chr1        5072925 5073900 codingProm1131  181
chr1        6269675 6279350 K4-K36_0001     80
chr1        6277350 6277875 lincRNAProm0945 181
% bgzip lincRNAGuttman-mm9.bed
% tabix -p bed lincRNAGuttman-mm9.bed.gz chr1:6268000-6278000
chr1        6269675 6279350 K4-K36_0001     80
chr1        6277350 6277875 lincRNAProm0945 181&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;파이썬에서도 똑같이 접근하기.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;% python3
Python 3.1.2 (release31-maint, Sep 17 2010, 20:27:33)
[GCC 4.4.5] on linux2
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt; import tabix
&amp;gt;&amp;gt;&amp;gt; tb = tabix.Tabix('lincRNAGuttman-mm9.bed.gz')
&amp;gt;&amp;gt;&amp;gt; print('\n'.join(tb.query('chr1', 6268000, 6278000)))
chr1        6269675 6279350 K4-K36_0001     80
chr1        6277350 6277875 lincRNAProm0945 181
&amp;gt;&amp;gt;&amp;gt; print('\n'.join(tb.querys('chr13:101348694-101656441')))
chr13       101513748       101515023       codingProm1885  251
chr13       101544973       101546323       codingProm1178  183
chr13       101601798       101603798       codingProm1377  194&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;원래 pygr.NLMSA쓰고 있던 곳을 요걸로 바꾸니까 거의 10배 이상 빨라졌네요. ^&lt;em&gt;__&lt;/em&gt;^&lt;/p&gt;
</description><pubDate>Sun, 30 Jan 2011 02:10:04 -0000</pubDate><guid>http://openlook.org/blog/2011/01/30/python-binding-for-tabit-genome-annotation-indexer/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>RNA 연구에서의 시퀀싱 활용 (시작)</title><link>http://openlook.org/blog/2010/12/02/high-throughput-sequencing-for-RNA-studies/</link><description>





&lt;p&gt;대용량 시퀀싱(high-throughput sequencing; 다음부터 시퀀싱)이 폭발적으로 널리 쓰이기 시작하고도 이미 한참 지나서, 네이처 주요 논문들의 그림 구성, Affymetrix 주가, 학회장의 질문들 어느 것 하나 예전과 같은 게 없어졌습니다. 그래서 이제 논문 읽을 때 유전체학이나 전사체학 용어와 개념에 익숙하지 않고서는 읽기 힘든 논문이 한 둘이 아니게 됐는데...&lt;/p&gt;
&lt;p&gt;시퀀싱의 주요 수요처인 유전체 DNA 시퀀싱은 워낙 뻔하고 여기 저기서 늘 얘기하고 있는 것이니 넘어가고, 역동성이 넘치는(-O-) RNA 분야에서의 시퀀싱 활용에 대해서 대략 정리해 볼까 합니다. 한꺼번에 다 올리면 읽기 압박이 있으니 여러 회로 끊어서 찔끔찔끔 올리겠습니다~ (히히)&lt;/p&gt;
&lt;p&gt;순서는 모두 9번으로 나눠서,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;RNA 시퀀싱 기본 지식&lt;ol&gt;
&lt;li&gt;Illumina mRNA-seq 프로토콜 대충 보기&lt;/li&gt;
&lt;li&gt;Illumina SRA 프로토콜 대충 보기&lt;/li&gt;
&lt;li&gt;여러가지 RNA/DNA ligase&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;RNA 프로파일링&lt;ol&gt;
&lt;li&gt;RT하는 방법에 따라 다른 것&lt;/li&gt;
&lt;li&gt;조각내는 방법에 따라 다른 것&lt;/li&gt;
&lt;li&gt;CAGE, SAGE에서 파생된 프로파일링 기법들&lt;/li&gt;
&lt;li&gt;작은 RNA 프로파일링&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;번역효율 측정하기: ribosome profiling&lt;/li&gt;
&lt;li&gt;RNA와 단백질의 상호작용 보기&lt;ol&gt;
&lt;li&gt;RIP-seq&lt;/li&gt;
&lt;li&gt;CLIP-seq (UV cross-linking and immunoprecipitation), PAR-CLIP&lt;/li&gt;
&lt;li&gt;miRNA 타겟 보기: Ago HITS-CLIP&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;RNA 간의 상호작용 보기: CLASH&lt;/li&gt;
&lt;li&gt;RNA 잘리는 부분 알아내기: degradome sequencing&lt;/li&gt;
&lt;li&gt;RNA 2차구조 보기: Kertesz et al.과 FragSeq&lt;/li&gt;
&lt;li&gt;RNA 5' 3' 끝 알아내기: High-throughput 5'/3' RACE와 PET&lt;/li&gt;
&lt;li&gt;mRNA 3' UTR 끝 알아내기: 3P-seq&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;로 올리도록 하겠습니다. ^__^&lt;/p&gt;
&lt;p&gt;(다음 시간에 계속~)&lt;/p&gt;
</description><pubDate>Wed, 01 Dec 2010 16:23:17 -0000</pubDate><guid>http://openlook.org/blog/2010/12/02/high-throughput-sequencing-for-RNA-studies/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>후배를 찾습니다~</title><link>http://openlook.org/blog/2010/08/19/looking-for-a-new-colleague/</link><description>





&lt;p&gt;몇 군데에 이미 전에 올린 적이 있어서 이미 보신 분들도 있겠지만, 좀 더 많은 홍보를 (;ㅁ;) 위해서 잠잠한 블로그에도 올려봅니다. ^.^;;&lt;/p&gt;
&lt;p&gt;제가 공부하고 있는 실험실에 새로 석사과정, 통합과정 또는 박사과정 대학원생으로 참여할 대학원생을 모집합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://narrykim.org"&gt;저희 실험실&lt;/a&gt;은 동물 RNA의 유전자발현 조절 분야를 주로 연구합니다. 특히 microRNA의 생합성 경로와 조절 경로의 주요 단백질들의 기작을 밝힌 것으로 많이 알려져 있습니다. (&lt;a href="http://news.donga.com/90th_List/3/0300000001/20100511/28249482/1"&gt;지도교수님 최근 기사와 인터뷰&lt;/a&gt;, &lt;a href="http://bric.postech.ac.kr/myboard/read.php?id=158&amp;amp;Page=&amp;amp;Board=interview&amp;amp;itv_flag=1"&gt;조금 오래된 인터뷰&lt;/a&gt; 참조)&lt;/p&gt;
&lt;p&gt;이번에 찾고 있는 대학원생(1명)은 실험실에서 하는 분야 중 유전체학과 생물정보학 쪽을 주로 하도록 뽑을 예정이고요. 따라서, 학부나 석사 전공으로 컴퓨터과학, 통계학, 생물정보학 등을 전공하신 분을 기대하고 있습니다. 원하는 경우에는 실험도 배워서 스스로 데이터 만들어서 분석하는 요즘 유행하는 스타일로 공부할 수도 있습니다.&lt;/p&gt;
&lt;p&gt;특히 유전자 발현 조절 분야는 대규모 전사체/유전체 실험으로 계속 커지는 추세라서 대용량 데이터를 정량적으로 다뤄서 생물 연구를 할 수 있는 기회가 계속 늘고 있습니다.
실험실에서 최근에 많이 하는 high-throughput 실험들을 많이 도입해서 하고 있고, 원하는
실험을 필요하다면 웬만큼은 부담이 되더라도 할 수 있을 정도의 여유는 되기 때문에
연구할 데이터와 기회가 풍부하고요.  실험실의 주요 연구분야가 아직 미지의 영역이 매우 많은
분야라서 머리를 쥐어짜서 연구분야를 찾아 헤멜 필요도 없어서 연구 측면에서는 국내에서
대학원 생활하기에는 아주 좋은 여건이 될 것입니다~&lt;/p&gt;
&lt;p&gt;입학전공은 &lt;a href="http://biosci.snu.ac.kr/"&gt;생명과학부&lt;/a&gt;, &lt;a href="http://ipbi.snu.ac.kr/"&gt;생물정보학 협동과정&lt;/a&gt;, &lt;a href="http://ipge.snu.ac.kr"&gt;유전공학 협동과정&lt;/a&gt;, &lt;a href="http://cri.snu.ac.kr"&gt;종양생물학 협동과정&lt;/a&gt; 중 하나를 선택할 수 있습니다. 2011년 후기 이후 입학 가능하며 입시 이전에 협의가 되어야하고, 연구원으로 미리 일할 수도 있으므로, 되도록이면 빨리 연락을 주시는 편이 좋습니다. (보통 1년 이전에도 많이 연락하는 편입니다.)&lt;/p&gt;
&lt;p&gt;실험실에 관한 정보는 &lt;a href="http://narrykim.org"&gt;홈페이지&lt;/a&gt;를 참조하시고, 문의사항이나 지원에 관련된 것은 모두 저한테 자유롭게 보내주세요. 메일 주소는 &lt;a href="http://openlook.org/blog/site_profile#contact"&gt;제 자기소개 페이지 맨 끝&lt;/a&gt;에 있습니다. ^.^; 혹시 주변에 관심 있을 것 같은 학생이 있으면 알려주세요~ (나쁜 아저씨 아니에요~;;)&lt;/p&gt;
</description><pubDate>Thu, 19 Aug 2010 14:54:33 -0000</pubDate><guid>http://openlook.org/blog/2010/08/19/looking-for-a-new-colleague/</guid><category>&lt;a href='/blog/tag/life/'&gt;life&lt;/a&gt;</category></item><item><title>10월 13일 - 16일, 하이델베르크</title><link>http://openlook.org/blog/2010/07/18/heidelberg-in-october/</link><description>





&lt;p&gt;10월 13일부터 16일까지 독일 하이델베르크에서 하는 &lt;a href="http://www.embo-embl-symposia.org/symposia/2010/EES10-03/"&gt;The Non-Coding Genome&lt;/a&gt; 학회에 갑니다. &lt;br /&gt;
이히히. ^__^ 좋은 경험 있으시면 추천 바랍니다! (처음 가는 유럽이라 두근두근~)&lt;/p&gt;
&lt;p&gt;&lt;img alt="하이델베르크" src="http://farm1.static.flickr.com/101/303339926_ca5d0dbd6e.jpg" /&gt; &lt;br /&gt;
&amp;copy; &lt;a href="http://www.flickr.com/photos/junnn/"&gt;Junnn&lt;/a&gt;. &lt;a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;CC-BY-NC-SA&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Sun, 18 Jul 2010 13:40:03 -0000</pubDate><guid>http://openlook.org/blog/2010/07/18/heidelberg-in-october/</guid><category>&lt;a href='/blog/tag/life/'&gt;life&lt;/a&gt;</category></item><item><title>생물정보 태동기의 재미있는 사실들</title><link>http://openlook.org/blog/2010/07/16/fun-facts-on-early-bioinformatics/</link><description>





&lt;p&gt;어느 학문 분야든 성숙하다보면 해당 분야의 역사와 철학에 대한 연구가 따라오게 된다.
학문이 생기게 된 배경과 발전 과정, 패러다임의 변화, 다른 학문에 대한 영향, 연구자들의 분야
고유적인 연구 방법을 관찰하는 것은 재미있지 않을 수가 없다.&lt;/p&gt;
&lt;p&gt;최근에 PLoS Computational Biology에 &lt;a href="http://www.ploscompbiol.org/article/info:doi/10.1371/journal.pcbi.1000809"&gt;생물정보학의 뿌리&lt;/a&gt;라는 
기사가 올라왔다.
유전체 모델이나 RNA 2차구조 같은 것을 촘스키식 문법으로 다룬 것으로 유명한
David Searls가 쓴 생물정보학의 역사에 대한 글인데, 깊게 잘 다루었다.&lt;/p&gt;
&lt;p&gt;철학적인 생각은 글에 남겨두고, 의외로 모르고 지나가기엔 너무 아쉬웠을 만한 재미있는 사실 몇 가지만 추려보면,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;컴퓨터를 생물 연구에 처음으로 쓴 사람은 너무 뻔해서 약간은 재미없게도(?) &lt;a href="http://en.wikipedia.org/wiki/Ronald_Fisher"&gt;Ronald Fisher&lt;/a&gt;인데, EDSAC을 개발한 Wilkes와 Wheeler가 직접 작업을 돌려주었다. (1950년)&lt;/li&gt;
&lt;li&gt;소개가 필요없는 &lt;a href="http://en.wikipedia.org/wiki/Alan_Turing"&gt;Alan Turing&lt;/a&gt;은 말년에 주로 발생학 연구를 했으며 (1952년~), 역시 정보이론과 논리회로의 창시자격인 &lt;a href="http://en.wikipedia.org/wiki/Claude_Shannon"&gt;Claude Shannon&lt;/a&gt;은 심지어 박사학위를 계산유전학에 대한 연구로 받았다. (1940년)&lt;/li&gt;
&lt;li&gt;빅뱅이론으로 유명한 이론물리학자 &lt;a href="http://en.wikipedia.org/wiki/George_Gamow"&gt;George Gamow&lt;/a&gt;와 Monte Carlo 시뮬레이션으로 유명한 이론물리학자 &lt;a href="http://en.wikipedia.org/wiki/Nicholas_Metropolis"&gt;Nicholas Metropolis&lt;/a&gt;는 유전코드의 상세한 기전이 밝혀지기 전에, 서열의 통계적 분석과 시뮬레이션으로 유전코드의 이론적 특성 연구를 했는데 이 연구가 거의 역사 최초의 생물정보학 연구로 보통 받아들여진다. (1954년)&lt;/li&gt;
&lt;li&gt;역시 초기에 컴퓨터를 가장 널리 사용한 것은 결정학자들이었는데, 1952년에 이미 EDSAC으로 계산한 논문이 나왔다.&lt;/li&gt;
&lt;li&gt;또 다른 생물정보학의 주세부분야 중 하나인 계통분류계산은 1957년에 처음 시작되었다. 요즘 화학유전체학에서 거의 표준처럼 쓰이는 &lt;a href="http://en.wikipedia.org/wiki/Tanimoto_coefficient#Tanimoto_coefficient_.28extended_Jaccard_coefficient.29"&gt;타니모토 계수&lt;/a&gt;는 1960년에 IBM의 수학자인 타니모토가 세균 분류를 위해 개발했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;보통 어디서 트렌드따라 뚝 떨어진 신생융합듣보잡 취급을 많이 받는 생물정보학이지만 의외로 뿌리는 깊다. +_+ &lt;/p&gt;
</description><pubDate>Thu, 15 Jul 2010 15:52:09 -0000</pubDate><guid>http://openlook.org/blog/2010/07/16/fun-facts-on-early-bioinformatics/</guid><category>&lt;a href='/blog/tag/book/'&gt;book&lt;/a&gt;</category></item><item><title>시퀀싱 데이터에서 3' 어댑터 서열 제거</title><link>http://openlook.org/blog/2010/07/11/trimming-3p-adapters-from-illumina-reads/</link><description>





&lt;p&gt;small RNA 시퀀싱에서는 리드보다 RNA가 더 짧아서, 5' 끝부터 읽을 경우에는 3' 어댑터 시퀀스가 나오고, 프라이머를 뒤집어서 3' 끝부터 읽으면 5' 시퀀스가 나올 수 밖에 없다. small RNA가 아니더라도 &lt;a href="http://linkinghub.elsevier.com/retrieve/pii/S1046202305001787"&gt;CLIP&lt;/a&gt;에서는 보통 바인딩 사이트를 정확히 알기위해 짧게 쳐내서 시퀀싱하는 경향이 있어서, 보통 30nt 안쪽으로 들어오는 편이라 시퀀싱한 뒤에 어댑터 제거가 꼭 필요하다.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;AACTGTTTGCAGAGGAAACTGAATCTCGTATGCCGT  - hsa-miR-452 뒤에 Illumina SRA 1.5 3' 어댑터
&amp;lt;----- miR-452 ------&amp;gt;&amp;lt;-- 3' adapter&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;그렇지만 역시나 PCR 오류, 시퀀싱 오류, 어댑터 불량 등등 수많은 잡음때문에 역시 단순 문자열 비교로는 잘 안 통한다. 그래서 정규식을 쓰기도 하는데 영 속도가 만족스럽지 못하고, 모든 자리에서 어댑터 시퀀스랑 비교해서 미스매치를 세는 등의 방법(&lt;a href="http://www-huber.embl.de/users/anders/HTSeq/doc/overview.html"&gt;HTSeq 패키지&lt;/a&gt;)을 쓰기도 하는데, 갭을 전혀 허용하지 않아서 어댑터 합성 품질이 안 좋은 경우는 놓치는 것이 너무 많아서 결과를 보면 답답~하다.&lt;/p&gt;
&lt;p&gt;최근 많이 쓰이는 방법으로 &lt;a href="http://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm"&gt;Needleman-Wunsch&lt;/a&gt;와 &lt;a href="http://en.wikipedia.org/wiki/Smith-Waterman_algorithm"&gt;Smith-Waterman&lt;/a&gt;을 섞어서 어댑터의 5' 끝에게는 지역정렬처럼 아무데서나 시작하게 하고, 3' 끝에는 전체정렬처럼 끝까지 가게 하는 것이 있다. 그런데, 소프트웨어는 홈페이지에 오거나, 저자에게 말하면 준다고 다들 써 놓고서는 정작 홈페이지에 가면 아무 것도 없고, 메일 보내면 묵묵부답이라, 1년 넘게 정규식으로 불쌍하게 쓰다가, 결국 큰 마음먹고 토요일 밤을 투자했다. +_+&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openlook.org/src/1007/rnarryext-0.1.tar.gz"&gt;소스코드 받기 (파이썬용 C 확장 모듈)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;실제로는 affine gap penalty를 써서 행렬이 3개지만, 그냥 linear gap penalty를 쓴 경우라고 하고 행렬을 예를 들어 보면,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;시퀀스 리드: CCAGTCCA&lt;/li&gt;
&lt;li&gt;어댑터 시퀀스: CCAG&lt;/li&gt;
&lt;li&gt;점수: match 2, mismatch -3, gap penalty -3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="3&amp;apos; 어댑터 떼기" src="http://farm5.static.flickr.com/4094/4782042142_8b73a6bffb.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;이렇게 하면 짠~&lt;/p&gt;
</description><pubDate>Sun, 11 Jul 2010 03:26:47 -0000</pubDate><guid>http://openlook.org/blog/2010/07/11/trimming-3p-adapters-from-illumina-reads/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>구글 리더에서 Papers로 URL열기</title><link>http://openlook.org/blog/2010/06/23/send-to-papers-on-google-reader/</link><description>





&lt;p&gt;대학원생의 친구, &lt;a href="http://mekentosj.com/papers/"&gt;Papers&lt;/a&gt;!
공부하는 척 할 때 참 좋은 녀석이지만, RSS기능이 없어서 새 글을 받아보려면 반드시 나머지
반쪽이 필요한 어정쩡한 녀석이죠~&lt;/p&gt;
&lt;p&gt;&lt;a href="http://netnewswireapp.com/"&gt;NetNewsWire&lt;/a&gt;에 연결해서
보면 구글리더와 동기화해서 돌아다니면서 버스에서도 볼 수 있고 참 좋긴 한데.. 문제는
구글리더가 최근 글 10개만 주는 바람에, AOP feed가 없거나 글이 한꺼번에 잔뜩
올라오는 &lt;a href="http://www.pnas.org/"&gt;PNAS&lt;/a&gt;나 &lt;a href="http://www.plosone.org"&gt;PLoS ONE&lt;/a&gt;같은 경우에는 거의 글을 대부분 놓쳐버려서
가끔 구글리더 들어가서 확인해야해서 여러모로 귀찮습니다.&lt;/p&gt;
&lt;p&gt;결국 그냥 구글리더로 싹 읽으면 깔끔하고 좋기는 하지만, Papers에 논문 가져다 넣으려고 긁어 넣고 붙이고
하기가 귀찮아서 결국은 NNW에 남아있다가, 오늘 마음잡고 오랜만에 GreaseMonkey로 정리해 봤습니다~&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openlook.org/src/1006/ggreader-papers.user.js"&gt;Google Reader에서 c 눌러서 지금 글 Papers열기 (그리스몽키)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;설치하시면 C 누르면 Papers에서 글이 열립니다~&lt;/p&gt;
</description><pubDate>Wed, 23 Jun 2010 11:58:35 -0000</pubDate><guid>http://openlook.org/blog/2010/06/23/send-to-papers-on-google-reader/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>BSD에서 타임머신처럼 백업 관리하기</title><link>http://openlook.org/blog/2010/03/21/time-machine-like-rsync-backup/</link><description>





&lt;p&gt;엊그제 큰일날 뻔했습니다. 연구실 홈페이지 고치다가 www디렉토리를 복사한 다음에 지운다는 것이, 제 홈디렉토리에서 지워버리는 바람에 제 홈페이지가 몽땅 날아가 버린 것. --;
다행히도 작년 5월 백업도 있었고, 그 이후로는 업데이트를 거의 하나도 안 해서 간신히 살릴 수 있었지만 초등학교 때 만들었던 프로그램을 고등학교 다닐 때 모두 날린 이후로 최대 사건이 될 뻔 했습니다.;&lt;/p&gt;
&lt;p&gt;데스크탑은 &lt;a href="http://www.apple.com/macosx/what-is-macosx/time-machine.html"&gt;타임머신&lt;/a&gt;으로 잘 백업하고 있었는데 작년에 서버 옮기고 설정하기 귀찮다고 작업서버 홈 디렉토리 백업을 설정해 두지 않았는데요. 그래서 이참에 &lt;a href="http://blog.interlinked.org/tutorials/rsync_time_machine.html"&gt;rsync로 타임머신하고 거의 똑같이 쓸 수 있다&lt;/a&gt;는 얘길 들은 생각이 나서, 설정했습니다. 잘 되더군용! ^_^ 안심&lt;/p&gt;
&lt;p&gt;물론 파일은 대부분 하드링크 덕에 용량을 크게 차지하지는 않지만, 디렉토리 구조가 계속 복사되는 통에 생각보다는 용량을 꽤 차지했습니다. 타임머신은 최근 하루는 1시간 간격, 1주일은 하루 간격, 1달은 1주일 간격 이런 식으로 오래된 시간일 수록 띄엄띄엄 저장할 수 있도록 돼 있는데요. 그래서 이걸 어떻게 해야하나 검색을 좀 해 보다가 적당한 것이 안 보여서 간단하게 만들어 봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openlook.org/src/1003/cleanup-tm.py.txt"&gt;소스파일 다운로드 (파이썬 2용)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;음 마음이 편안하군요.~&lt;/p&gt;
</description><pubDate>Sun, 21 Mar 2010 05:48:32 -0000</pubDate><guid>http://openlook.org/blog/2010/03/21/time-machine-like-rsync-backup/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>근황</title><link>http://openlook.org/blog/2010/03/07/updates-2010-march/</link><description>





&lt;p&gt;거의 한 해 동안 글을 안 썼습니다. 바쁜 일도 많았지만 안 쓰다 보니 안 들어오고, 안 들어오니 안 쓰고 순환의 연속으로... 크크.
그래도 여지껏 RSS 구독을 남겨두신 분들께 혹시 궁금하시면 요즘 어떻게 살고 있는지
알려드리려고 근황을 남겨둡니다.&lt;/p&gt;
&lt;p&gt;&lt;img alt="셀카질" src="http://farm5.static.flickr.com/4005/4413754870_b56200c279.jpg" /&gt;&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;올림푸스 E-P1 산 기념으로 시험 셀카;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;작년 2월 말에 대전에서 졸업하고, 서울로 이사했습니다. 요즘은 낙성대역 근처에 삽니다. 보기보다 꽤 살 만한 동네입니다. 언덕이 많아 눈 쌓이면 매우 곤란한 점만 빼면. 처음 몇 달 간은 아침에 바삐 출근하는 사람들을 보기가 좀 갑갑했죠. 대전에선 하늘이 넓은 곳에서 여유롭게 돌아다녔는데 아무래도 서울은 좀 달라요.&lt;/p&gt;
&lt;p&gt;&lt;img alt="직접(?) 구운 RNA 쿠키~" src="http://farm5.static.flickr.com/4035/4412985367_8fd0090a61.jpg" /&gt;&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;직접(?) 구운 RNA 초코쿠키&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;작년 9월부터는 &lt;a href="http://www.narrykim.org"&gt;일하고 있던 연구실&lt;/a&gt;에서 박사과정을 시작했습니다. 2009년 2학기 시작이니까, 보통 4~5년 정도 한다고 생각하면 2013년이나 2014년 정도까지는 계속 학생입니다. (히히) 새로 옮긴 연구실은 &lt;a href="http://en.wikipedia.org/wiki/MicroRNA"&gt;microRNA&lt;/a&gt;라는 생분자를 연구하는 곳입니다. 실험실 분위기가 아주 좋아서 매일 출근하는 게 즐겁습니다. 지도교수님은 잘 모르는 분야의 얘기라도 호기심을 가지고 항상 관심있게 들어주시고, 학문적으로도 놀랍도록 식견이 있으시지만 인품도 모두가 내가 연구책임자가 되어도 저렇게 할 수 있을까 싶을 정도로 좋으셔서, 일할 수 있는 가장 좋은 환경에서 행복하게 일하고 있습니다. ^_^&lt;/p&gt;
&lt;p&gt;&lt;img alt="실험실 설정샷" src="http://farm5.static.flickr.com/4068/4413753418_f4e7f80a54.jpg" /&gt;&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;일하는 척 설정샷. ㅋㅋ;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;연구실에서 생물정보를 전공한 사람은 혼자라서, 여러 프로젝트에서 나오는 대용량 자료 처리는 대부분 맡아서 하고 있습니다. 그 덕에, 많은 사람들과 많은 연구주제에 동시에 참여할 수 있어서, 다양한 분야를 배울 기회가 됐습니다. 혼자하는 주력 연구로는 새로운 작은 RNA 발견을 위한 유전체학적 분석을 하고 있습니다. 돈도 많이 들고 유독물질과 방사능도 많이 접하게 돼서 원래 하던 일처럼 편하지는 않지만, 이제 실험도 어느 정도는 적응이 돼서 재미있게 하고 있습니다. 이히&lt;/p&gt;
&lt;p&gt;&lt;img alt="내 자리" src="http://farm5.static.flickr.com/4067/4412989485_eb1397d6bc.jpg" /&gt;&lt;img alt="내 실험대" src="http://farm3.static.flickr.com/2701/4413756252_138cde63d6.jpg" /&gt;&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;공부하는 자리와 실험대. 사진 찍을 때는 HHKB였지만 지금은 Filco 쓰고 있어요. 파이펫은 길슨.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;그리고 토요일마다 실험실원 여러 명에게 프로그래밍을 가르쳐드리고 있습니다. 요즘 생물 데이터가 워낙 대용량화되는 추세라서 뭘 하려면 정보의 흐름을 다루는 능력이 필요해서 다들 흥미를 가지고 참여하고 있습니다. 파이썬으로 하고 있는데, 전에 C++을 잠시 배운 적이 있었던 사람들이 "프로그래밍이 이렇게 재미있는 것인 줄 몰랐어요!"라고 합니다. 역시 파이썬! ㅋㅋ;&lt;/p&gt;
&lt;p&gt;&lt;img alt="연구실 밖 풍경" src="http://farm3.static.flickr.com/2602/4158635719_42e802ffd8.jpg" /&gt;&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;연구실 자리에서 보이는 바깥 풍경. 쭈욱 오르막이라 모두 가까이 보여서 좋음 +_+&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;주 5일제 하던 곳에서 주 6일제인 곳으로 옮기다보니, 사실 대전에서 서울에 왔어도 오히려 사람을 만날 수 있는 시간이 더 줄었습니다. 그래서 거의 모임이 있어도 못 가고, 점점 사회에서 떨어져서 산에 사는 사람이 되는 느낌이.. &amp;gt;_&amp;lt;.&lt;/p&gt;
&lt;p&gt;저도 작년 예약판매할 때 아이폰을 샀습니다. 원래 아이팟 터치를 늘 친구처럼 데리고 다녀서 소지품 수를 줄이는 효과도 좋지만, 거의 생활을 완전히 바꿔놓은 놀라운 기계네요. 화장실에서 책을 안 읽게 되었다는 슬픈 단점도 있습니다만.. 크... 몇년간 IT 관련해서는 뭘 배운 것이 없었는데, 아이폰 프로그래밍도 조금씩 해 보고 있습니다. 꼭 뭐 만들어 봐야지! 히히&lt;/p&gt;
&lt;p&gt;&lt;img alt="스탠포드 로댕 미술관" src="http://farm5.static.flickr.com/4008/4413025221_59ab0b6ba0.jpg" /&gt;&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;스탠포드 로댕 미술관 앞에서 실험실 동생과 동상 따라하기~&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;올해 초엔 처음으로 미국에 갔습니다. 아 말로만 듣다가 직접 가 보니 음식도 맞고 사람들도 괜찮고 좋네요. 다음에 또 가려면 열심히 연구해서 학회에 뭔가를 꼭 내야겠어요. (동기유발 효과가 불끈불끈) 콜로라도에 있는 &lt;a href="http://en.wikipedia.org/wiki/Keystone_Resort"&gt;키스톤 리조트&lt;/a&gt;에서 &lt;a href="http://www.keystonesymposia.org/meetings/viewmeetings.cfm?meetingid=1062"&gt;관련분야 학회&lt;/a&gt;에 참가한 뒤 샌 프란시스코에 갔습니다. 샌 프란시스코는 항상 날씨가 좋고 좀처럼 비가 오지 않는다는데, 제가 갔던 기간 중엔 폭풍우가 몰아치더군요.; 스탠포드 로댕 미술관. 그동안 미술관에 여러 번 갔지만 감동을 느끼기는 처음이었습니다. 작가가 그리면서 느꼈던 감정을 그대로 느끼는 듯한 감동! 이히히 다른 미술 전시회도 다시 가야 겠어요.&lt;/p&gt;
&lt;p&gt;이제 봄 입니다. 돌아올게요. 종종 또 보아요!&lt;/p&gt;
</description><pubDate>Sun, 07 Mar 2010 12:07:22 -0000</pubDate><guid>http://openlook.org/blog/2010/03/07/updates-2010-march/</guid><category>&lt;a href='/blog/tag/life/'&gt;life&lt;/a&gt;</category></item><item><title>군집이룬 자료의 비모수 두 표본 차이 검정 (C 구현)</title><link>http://openlook.org/blog/2009/06/09/optimized-implementation-of-non-parametric-rank-sum-for-clustered-data/</link><description>






&lt;p&gt;두 표본 집단의 차이가 의미가 있나 알아볼 때 보통
   &lt;a href="http://en.wikipedia.org/wiki/T-test"&gt;t-검정&lt;/a&gt;을 많이 씁니다.
   t-검정에서는 값의 분포가 정규분포라는 가정이 있어서, 자료의
   분포를 모르거나 정규분포로 바꾸기 매우 난감한 경우에는 t-검정을
   할 수 없어서 &lt;a href="http://en.wikipedia.org/wiki/Non-parametric_statistics"&gt;비모수 검정&lt;/a&gt;을 사용하는데요, 이쪽으로 가장 인기있는
   검정법은 아무래도 &lt;a href="http://en.wikipedia.org/wiki/Mann-Whitney_U"&gt;Mann-Whitney U test&lt;/a&gt;입니다.
&lt;/p&gt;
&lt;p&gt;어느날 MW-U로 재미나게~♪ 통계를 하다가~ 아니!! 결과가 엄청 편향되어 나오는 것입니다!
   비모수라더니!! &lt;a href="http://en.wikipedia.org/wiki/MiRNA"&gt;마이크로RNA&lt;/a&gt;
   &lt;a href="http://en.wikipedia.org/wiki/DNA_microarray"&gt;마이크로어레이&lt;/a&gt;로 나온
   결과를 분석하고 있었는데, 마이크로RNA가 염색체에서 떼로 몰려 있어서
   한 놈이 올라오면 같이 우루루 올라오는 특성이 있다보니 군집이 엄청 큰
   놈들에 의해 전체가 흔들려서, 아 무슨 좋은 방법이 없을까! 하다가 
   군집을 이룬 자료들에 쓸 수 있게 변형한 것
   (&lt;a href="http://www.ncbi.nlm.nih.gov/pubmed/10399203"&gt;Rosner and Grove, 1999&lt;/a&gt;,
   &lt;a href="http://pubs.amstat.org/doi/abs/10.1198/016214504000001583"&gt;Datta and Satten, 2005&lt;/a&gt;,
   &lt;a href="http://portal.acm.org/citation.cfm?id=1518517"&gt;Haataja et al., 2009&lt;/a&gt;)
   들을 발견했습니다. +_+
&lt;/p&gt;
&lt;p&gt;오.... 다 괜찮아 보이지만, 결국은 코드가 공개돼 있는
   &lt;a href="http://www.somnathdatta.org/software/Rank_Sum_2_Groups.txt"&gt;Datta와 Satten의 것&lt;/a&gt;으 로 해서 일단 결과를 뽑았습니다. 매우 만족스럽군요! ^_^
&lt;/p&gt;
&lt;p&gt;그런데 문제는 순수 &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt;로 구현되어 있다보니
   속도가 엄청나게 느려서, 자료가 별로 크지도 않은데 거의 2시간씩 돌려야
   돼서 시험삼아 돌려볼 때도 마음을 크게 먹고 돌려야 해서, 바로바로
   결과를 확인하는 재미가 없었습니다.
&lt;/p&gt;
&lt;p&gt;그래서 쭉 벼르고 있다가, 주말에 여자친구가 기말고사 공부해야 해서, 같이 공부하는
   척 하느라 짬이 난 김에
   &lt;a href="http://openlook.org/src/0906/cranksum.c.txt"&gt;C로 새로 코딩했습니다 (다운로드)&lt;/a&gt;. 
   R이나 &lt;a href="http://www.scipy.org/"&gt;SciPy&lt;/a&gt;같은데서 쉽게 쓸 수 있게 외부 의존성을 없애려고, Z-통계치에서
   p-value구하는 부분은 빼서 의존성을 줄였습니다. 그냥 libm만 있으면 됩니다.
   (파이썬에서는 &lt;a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html"&gt;scipy.stats.norm.pdf&lt;/a&gt;를 써서 Z에서 p-value를 구할 수 있습니다.)
   대략 돌려봤더니 2시간 걸리던게 30초로 줄었군요! 이히히 ^__^*
   간단하게 컴파일한 다음에 파이썬에서 쓰려면 이렇게 쓸 수 있습니다~
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ctypes&lt;/span&gt;
&lt;span class="n"&gt;cranksum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cdll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./cranksum.so&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;crs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cranksum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clustered_rank_sum&lt;/span&gt;
&lt;span class="n"&gt;crs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;restype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POINTER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_double&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;freecrs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cranksum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;free_clustered_rank_sum_result&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clustered_rank_sum&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="n"&gt;grp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cluster&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="nb"&gt;len&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="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;crs&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_double&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;grp&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cluster&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;
    &lt;span class="n"&gt;r&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;S&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ret&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;E.S&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ret&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;Var.S&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ret&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;z.stat&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ret&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="n"&gt;freecrs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&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;r&lt;/span&gt;

&lt;span class="n"&gt;X&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;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;4&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="mf"&gt;4&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;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;grp&lt;/span&gt; &lt;span class="o"&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;0&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;1&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;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="n"&gt;cluster&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;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;2&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;2&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;0&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;print&lt;/span&gt; &lt;span class="n"&gt;clustered_rank_sum&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="n"&gt;grp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;으음.. R에 붙이는 것은... 아직 잘 몰라서... (나중에..;)
&lt;/p&gt;



</description><pubDate>Tue, 09 Jun 2009 09:26:46 -0000</pubDate><guid>http://openlook.org/blog/2009/06/09/optimized-implementation-of-non-parametric-rank-sum-for-clustered-data/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>한 리스트를 빙글 빙글 돌면서 빈 자리 찾기</title><link>http://openlook.org/blog/2009/03/31/multiple-sequential-iteration-of-lists/</link><description>






&lt;p&gt;요즘 블로그에 통 글을 안 써와서 거의 폐가와 같이 되어 가고 있었는데요.. ^_^
   다름이 아니라, 제가 &amp;quot;이러면 좋겠다!&amp;quot;하고 생각해왔던 바로 그런 성격의 너무 좋은 분을
   만나게 되어서 다른 곳에는 신경 쓸 시간이 없었네요. 이히히;
&lt;/p&gt;
&lt;p&gt;그래도, 1달에 1개 정도는 유지해 두고자;; 쌓아뒀던 코드 단편 하나를 올려 봅니다. 헤헤.
&lt;/p&gt;
&lt;p&gt;종종 아주 긴 리스트에서 자원관리를 하면서, 자원을 &lt;a href="http://en.wikipedia.org/wiki/Sequential_search"&gt;순차탐색&lt;/a&gt;으로 할당해야하는 경우가 있습니다.
   주로 자원이 직접 사람이 쓰는 것이거나 해서, 순서대로 가는 것이 인지적으로나 쓰고 있는
   자리가 모아지는 점에서 유리한 경우에 그런데요. 도서관 같은 곳에서 좌석을 배정한다거나,
   &lt;a href="http://en.wikipedia.org/wiki/DHCP"&gt;DHCP&lt;/a&gt;서버에서 IP 주소를 나눠준다거나, 순차적으로 나눠주는 큐 관리 시스템에서 작업을
   나눠줄 빈 큐를 찾는다거나 생각보다 제법 많습니다.
&lt;/p&gt;
&lt;p&gt;이런 경우에, 10번째부터 순차검색하기 시작했으면 끝까지 돈 다음에 처음부터 9번째까지 돌아야
   하는 것이 중심원리(?)인데요. 구현하는 방법은 물론 클래스 인스턴스가 최근 찾은 인덱스를
   변수로 들고 있다가 그 인덱스부터 끝까지 한 번 돌리고, 처음부터 시작한 인덱스까지 다시
   돌리는 방법이 가장 평범하겠습니다. 완전 순서대로 배정할 필요는 없고 대충만 맞으면 되는
   경우다 싶으면, &lt;a href="http://en.wikipedia.org/wiki/FIFO"&gt;FIFO&lt;/a&gt; 큐 같은 것도 괜찮은데, 이걸 쓰면 시간이 지날 수록 여기저기 듬성 듬성
   나와서 원래 목적과는 달라질 수도 있고요~
&lt;/p&gt;
&lt;p&gt;그래서 range 2번 돌리는 폼 안 나는(?) 코드 대신 보통 끊임없는 &lt;a href="http://en.wikipedia.org/wiki/Iterator"&gt;이터레이터&lt;/a&gt;에서 개수 제한하는
   트릭으로 많이 쓰이는 zip을 섞어서 이렇게 하면 비교적 폼 나게(;;) 연속 검색이 가능한
   순차검색이 되겠습니다~
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;itertools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;izip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cycle&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;contiters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cycleiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;izip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycleiter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c"&gt;# 여기부터는 테스트&lt;/span&gt;
&lt;span class="n"&gt;itgen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contiters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;abcdef&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;itgen&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;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;

&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;itgen&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="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;print&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="n"&gt;c&lt;/span&gt; &lt;span class="o"&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="k"&gt;break&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;

&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;itgen&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="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;실행하면 이렇게 나옵니다.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;a b c
d e f a b
c d e f a b
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;못 찾으면 전체를 한 번 돌고, 찾으면 거기서 중단하면 그 다음에 시작하면 거기서부터 시작합니다~
&lt;/p&gt;
&lt;p&gt;여기서 종종 마지막으로 돌았던 놈에서부터 다음에 찾을 때 시작하고 싶은 경우가 있는데요. 비슷한 것이 아쉬운 사례로, &lt;a href="http://docs.python.org/library/itertools.html"&gt;itertools&lt;/a&gt;.takewhile을 쓰면 처음엔 조건이 맞을 때까지 다 가져오는 것은 좋은데, 그 다음 원소를 가지고 오고 싶어서 .next()하면 이미 조건 맞는지 보려고 갖고간 바람에, 조건 안 맞는 것 가져오는 목적으로 그 다음 이터레이터를 쓰지 못하는 것이 엄청 불편합니다.
&lt;/p&gt;
&lt;p&gt;그래서 전에 찾았던 부분에서 다시 시작하도록 해 보자면~
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;itertools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;izip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cycle&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;contiters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cycleiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;indicesnonfirst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;xrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;geniter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keeping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cycleiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()]):&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;keeping&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;elem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;izip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycleiter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indicesnonfirst&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;keeping&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;elem&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;geniter&lt;/span&gt;

&lt;span class="c"&gt;# 테스트 부분은 동일&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;네~ 좀 지저분하긴 해 졌는데요;; 실행하면 이렇게~
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;a b c
c d e f a b
b c d e f a
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;모르는 것을 보면 전혀 못 알아볼지라도 찾아보기 좋아하는 어떤 분(^_^)을 위해 용어에 좀 과도하게 링크를 걸었습니다 ^^;&lt;/em&gt;
&lt;/p&gt;



</description><pubDate>Mon, 30 Mar 2009 16:18:38 -0000</pubDate><guid>http://openlook.org/blog/2009/03/31/multiple-sequential-iteration-of-lists/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category></item><item><title>어제 상정된 저작권법 개정안</title><link>http://openlook.org/blog/2009/02/26/copyright-law-2009-revision/</link><description>






&lt;p&gt;&lt;a href="http://news.naver.com/main/read.nhn?mode=LSD&amp;amp;mid=sec&amp;amp;sid1=100&amp;amp;oid=020&amp;amp;aid=0002028730"&gt;어제는 작년에 한참 대치하던 이른바 &amp;quot;MB악법&amp;quot;들을 포함한 여러 법안이 직권상정되거나 소위를 통과&lt;/a&gt;했습니다.
   미디어관련법개정안들과 FTA비준안이 진행되고 있는 데에 대해서 굉장히 유감이지만 다른 곳에도
   글이 많기에 생략하고, 어제 직권상정된 저작권법 개정안들은 이번의 쟁점법안은 아니지만 오픈룩과는 관련이 많기에 정리해 봤습니다.
&lt;/p&gt;
&lt;p&gt;이번에 상정된 저작권법 개정안은 &lt;a href="http://likms.assembly.go.kr/bill/jsp/BillDetail.jsp?bill_id=PRC_C0T8V0Y7Q2S4K1S3B0I3S3V8P6S2A3"&gt;의안번호 1800400 진성호의원등 12인&lt;/a&gt;, &lt;a href="http://likms.assembly.go.kr/bill/jsp/BillDetail.jsp?bill_id=PRC_O0B8R1V1H2U7K1D4O5H0J5Z5I4U7P0"&gt;의안번호 1802291 강승규의원등 11인&lt;/a&gt;과 &lt;a href="http://likms.assembly.go.kr/bill/jsp/BillDetail.jsp?bill_id=PRC_W0I8V1S2Q0T5A1M7I1C0C1B9B4U6Q6"&gt;의안번호 1802888 변재일의원등 12인&lt;/a&gt;입니다.
   앞의 둘은 지금 나뉘어 있는 컴퓨터프로그램보호법과 저작권법을 저작권법 하나로 통합해서
   저작권법에서 컴퓨터 소프트웨어까지 관할하도록 하는 것이 주요 취지이고, 마지막 것은 FTA비준을 위해서 요구사항을 맞추는 것과 청소년 저작권 위반 처벌 완화에 대한 것입니다.
&lt;/p&gt;
&lt;p&gt;강승규의원외 개정안(강승규 정병국 진성호 백성운 안형환 김영우 배은희 조진래 김금래 조전혁 이달곤)에서
   컴퓨터프로그램보호법이 통합되는 것은 특별한 변동사항은 없고 두 법이 통합되는 정도인데, 점점 콘텐츠 융합 추세로 컴퓨터프로그램과 일반저작권의 경계가 모호해지는 것에 대응하기 위한 것이라고 합니다.
   실질적으로 바뀌는 것은 기존에 분리되어 있던 &lt;a href="http://www.copyright.or.kr"&gt;저작권위원회&lt;/a&gt;와 &lt;a href="http://www.socop.or.kr/"&gt;컴퓨터프로그램보호위원회&lt;/a&gt;가 통합된다고 하는군요.
&lt;/p&gt;
&lt;p&gt;그리고 통합 외에 온라인에서 불법적으로 전송하는 사람 또는 올라오는 게시판을 정지시킬 수 있는 법적 근거를 넣는다고 합니다. 그 부분은 저작권법 133-2에 신설되는데 불법복제물이 올라오면 삭제하고 이용자를 정지하도록 요청할 수 있다고 되어있습니다. 단, 여기서 서비스정지를 해야 하는 서비스 제공자 중에 기간통신사업자가 빠지는데, 인터넷 선만 제공하는 사업자가 불법복제를 하는지 관리를 해야하는 건 힘들어서 뺐다고는 하지만, 검토보고서를 보면 기간망사업자(KT, SK브로드밴드 등)만 인터넷 서비스를 제공하는 것도 아니고, 기간망사업자도 다른 것을 제공하는 경우가 많아서 좀 더 검토를 해 봐야 한다는군요.
&lt;/p&gt;
&lt;p&gt;이 내용은 진성호의원외 개정안(진성호 현경병 조전혁 강성천 황영철 박선영 김효재 강승규 윤석용 김동성 박준선 유정현)에서도 다룬 것인데, 그 개정안에서는 P2P같은 서비스도 온라인서비스사업자로 추가하는 내용과 위의 133-2를 같이 다루었고, 강승규의원외 개정안과는 다르게 기간망사업자도 대상에 포함되어 있습니다.
&lt;/p&gt;
&lt;p&gt;변재일의원외 개정안(변재일 양승조 강성종 이춘석 권영길 홍재형 강봉균 안규백 강기갑 이시종 김종률 백원우)은 한미FTA비준을 위해 나온 개정안 세트 중의 일부입니다.
   한미FTA의 저작권부분에서도 인정하는 여러 &lt;a href="http://en.wikipedia.org/wiki/Fair_use"&gt;공정한 사용(Fair Use)&lt;/a&gt;을 미리 도입하고, 청소년들이 저작권을 잘 모른채로 어겨서 심각하게 처벌되고 가정 문제나 성장 문제까지도 연결되는 것을 막기 위한 안입니다.
&lt;/p&gt;
&lt;p&gt;가장 눈에 띄는 것은, P2P 업자나 온라인서비스제공자들이 저작권보호를 위해 충분한 장치를
   하고 노력한 경우에는 사용자들이 발생시키는 저작권문제에 대해 책임이 없다는 것인데요.
   그동안은 사용자들이 저작권을 어기면 서비스제공자도 책임이 있었던 모양입니다.
   그리고 &amp;quot;공정한 사용&amp;quot;이 폭넓게 정의가 되었는데요. &amp;quot;통상적인 이용 방법과 충돌하지 아니하고 저작자의 합법적인 이익을 불합리하게 해하지 아니하는 경우에는 저작물의 이용을 가능하게 함.&amp;quot;이라고 정의되어서, 지금까지 저작권자에게 해가 없는 경우에도 엄밀하게는 불법적인 사용이 되어 버린 경우가 이제 어느 정도는 합법화가 되었습니다. 위키백과에서 도움이 되지 않을까 싶군요.
&lt;/p&gt;
&lt;p&gt;또한 청소년들이 자기도 모른채 저작권법을 어기고 5년 이하의 징역까지 받을 수 있었던
   문제가 있고, 이걸 악용해서 일부 나쁜 변호사들이 저작권 어기는 사람들 골라다가 협박메일을
   보내는 일이 심심찮게 있었는데요. 이제 침해 권리의 소매가가 100만원 이하이면 처벌하지 못하도록 단서가 붙었습니다. 그리고 인터넷 서비스 같은 곳에서 캐싱 목적으로 저작물을 저작권자 동의없이 임시 저장해 두는 것도 이번에 합법화가 되었습니다.
&lt;/p&gt;



</description><pubDate>Thu, 26 Feb 2009 02:50:46 -0000</pubDate><guid>http://openlook.org/blog/2009/02/26/copyright-law-2009-revision/</guid><category>&lt;a href='/blog/tag/computer/'&gt;computer&lt;/a&gt;</category></item><item><title>사진 프리젠테이션 배경음악으로 좋은 노래</title><link>http://openlook.org/blog/2009/02/04/background-music-for-photo-presentations/</link><description>






&lt;p&gt;여러 명이 모이면, 사진 찍는 사람이 한 명은 있기 마련이고, 기억에 오래 남습니다.
   행사가 끝날 무렵 사진을 모아서 동영상 비슷한 걸 만들어서 같이 보면, 회상도 되고
   뿌듯하기도 해서 뭉클해지는데요. 사진 프리젠테이션이 사실을 왜곡하는 게 아닌가
   싶을 정도로 강력해서 웬만한 기억은 모두 순식간에 아름다웠던 기억으로 만들어버리는
   막강한 힘이 있습니다.
&lt;/p&gt;
&lt;p&gt;마침 어제도 어학당 마지막 학기를 기념해서 학기 중에 다른 분들이 찍었던 사진들을
   모아서 &lt;a href="http://www.boinx.com/fotomagico/overview/"&gt;FotoMagico&lt;/a&gt;로 음악을
   깔아서 보여드렸는데, 다들 반응이 &amp;quot;아니 이랬었나!&amp;quot; 하면서 센티멘탈해진다고 놀랐습니다. :)
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Ken_burns_effect"&gt;팬 &amp;amp; 줌 효과 (켄 번 효과)&lt;/a&gt;도 중요하지만
   역시 배경음악도 큰 역할을 하는데, 이런 회고용 사진 프리젠테이션 배경음악을 몇 번
   골라보니까 좋은 회고 사진 배경음악의 기준이 몇몇 있는 것 같습니다~
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     전반적으로 비슷한 느낌으로 진행돼야 하고, 너무 극적인 전개가 있으면 안 좋다.
 &lt;/li&gt;

 &lt;li&gt;
     거북하거나 복잡한 느낌을 남기지 않으려면 코드와 가사가 긍정적인 편이 좋다.
 &lt;/li&gt;

 &lt;li&gt;
     전주가 짧아서, 가사가 시작되기 전의 썰렁함이 적어야 좋다.
 &lt;/li&gt;

 &lt;li&gt;
     간주가 길어서 가사 부분과 이질적인 시간이 생기면 다른 종류의 사진을 중간에 넣어야 해서 귀찮으니, 그냥 간주가 짧은게 좋다.
 &lt;/li&gt;

 &lt;li&gt;
     보컬이 너무 기교있거나 강한 느낌을 주면 사진보다 보컬에 신경이 쓰이기 때문에, 기교 없이 간단하게 부르는 노래가 좋다.
 &lt;/li&gt;

 &lt;li&gt;
     체육활동이나 승부와 관련이 있는 행사라면 좀 발랄한 비트도 괜찮다.
 &lt;/li&gt;

 &lt;li&gt;
     간단한 멜로디 패턴이 많이 반복되는 형식이면, 중간에 잘라 붙여서 길이 조절하기가 쉬워서 좋고, 모르는 노래라도 프리젠테이션 도중에 익숙해져서 친숙한 느낌을 줄 수 있다.
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;대충 몇 번 해보지는 않았지만 이런 게 중요했던 것 같습니다. 그래서 제가 써 봤던 배경음악을 소개해 드릴게요~
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;strong&gt;상상 - 송은이&lt;/strong&gt;: 단순하게 계속 반복돼서 쉽게 친숙해지고 자르기도 정말 쉽고, 목소리도 친근한데다, 아무 행사 사진에 깔아도 아무데나 척척 잘 어울려서 감동도 주고 긍정적인 느낌도 주는 곡~ 원곡은 3분 29초인데, 잘라붙이면 2분 10초, 1분 30초 로도 편집이 가능하고 중간을 반복해서 5분 정도로 늘릴 수도 있습니다. (&lt;a href="http://agile.egloos.com/4539142"&gt;BioXP 7기 동영상 (글 중간에 있음)&lt;/a&gt;에서 사용)
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;비밀의 화원 - 이상은&lt;/strong&gt;: 창준형이 소개해 준 매우 좋은 회고용 배경음악. 역시 친숙해지기 쉬운 멜로디, 단순한 전개, 희망적 메시지 등 중요 요건을 모두 갖추고 있습니다. 중간에 분위기가 다른 패턴이 몇 번 나오는데, 여기서 다른 사건 뭉치의 사진으로 전환하면 좋습니다.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;많이 안아 주고 싶어요 - 비누도둑&lt;/strong&gt;: 비밀의 화원은 좀 부담스러운 분위기도 있긴 한데, 이 곡은 시종일관 사랑스러운 분위기라 긍정적인 분위기 사진만 있을 때 일관적으로 좋은 분위기를 만들 수 있습니다. +_+ 역시 반복이 매우 많아서 길이 조절이 쉽고, 비트가 앞의 두 곡에 비해서 좀 빠른 편이라 화면전환에 대충 동기화하기가 쉽습니다.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;Love - 요조&lt;/strong&gt;: 마찬가지로 처음부터 끝까지 사랑스러운 분위기이고, 쉽게 친숙해지는 분위기에 아주 따뜻한 느낌을 줍니다. 전주도 기타가 썰렁하지 않고 바로 사진이 나와도 좋은 분위기로 시작해 줍니다. 화기애애한 모임들 배경음악으로 아주 좋습니다.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;Games People Play - Inner Circle&lt;/strong&gt;: 지루하다 못해 상투적일 정도의 배경음악이기는 하지만, 그래도 전주도 전혀 없는데다 여행이나 야외 활동 사진으로 아무데나 깔아도 정말 잘 어울립니다. 누구나 다 아는 멜로디에, 영어라 가사가 안 들리는 것도 장점이고요. :)
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;Signal Song - 라이너스의 담요&lt;/strong&gt;: 담요 노래는 거의 대부분이 강아지를 안고 부르는 분위기이기는 하지만, 이 곡은 특히 아기나 애완동물 사진 프리젠테이션 배경음악으로 잘 어울립니다. +_+ 다만 0:35 근처까지 전주 부분이 효과음만 나오기에 그 앞을 잘라야 프리젠테이션이 안 썰렁합니다.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;Ready, Get Set, Go! (radio edit) - 페퍼톤스&lt;/strong&gt;: 사진 부분보다는, 엔딩 크레딧 롤 올릴 때 매우 좋습니다. 엔딩 크레딧 롤(?)은 참가한 사람들 이름이나 간단한 통계, 있었던 사건들 목록 같은 것을 보여주면서 사진과는 또 다른 매우 효과적인 회고용 감동 도구로 쓸 수 있습니다. Radio Edit는 원래 3분 46초인데, 역시 1분 10초, 1분 40초, 2분 20초 정도로 편집할 수 있습니다.
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여러분들이 알고 계시는 좋은 사진 프리젠테이션 배경음악은 어떤 게 있나요? 저도 알려주세요~ +_+
&lt;/p&gt;



</description><pubDate>Wed, 04 Feb 2009 12:49:00 -0000</pubDate><guid>http://openlook.org/blog/2009/02/04/background-music-for-photo-presentations/</guid><category>&lt;a href='/blog/tag/life/'&gt;life&lt;/a&gt;</category></item><item><title>정수선형계획법으로 팀 짜기</title><link>http://openlook.org/blog/2009/01/17/team-assignment-by-integer-programming/</link><description>






&lt;p&gt;2006년의 &lt;a href="http://agile.egloos.com/1506450"&gt;한 워크숍&lt;/a&gt;을 진행하면서
   팀을 짜는데, 모든 팀이 비슷한 조건을 갖도록 잔기술을 썼던 적이 있습니다.
   기준은 평균 실력, 평균 연령, 성비 같은 것들을 모두 비슷하게 맞추고
   가능한 다른 곳에서 온 사람들이 섞이도록 했는데요. 이게 손으로 대충해도 되지만
   문제는 신청을 한 분이 모두 오는 게 아니라, 몇몇 분들이 빠지거나 지각해서
   미리 팀을 짜도 헛수고라 빨리빨리 모두 고려해서 좋은 팀 구성을 해야해서
   자동화를 해야 했습니다.
&lt;/p&gt;
&lt;p&gt;그래서 당시에는 학교에 사이트 라이선스가 있어서
   &lt;a href="http://www.ilog.com/products/oplstudio/"&gt;ILOG OPL&lt;/a&gt;로 &lt;a href="http://en.wikipedia.org/wiki/Linear_Programming#Integer_unknowns"&gt;정수계획(IP)&lt;/a&gt;을
   했었는데요. 얼마 전에 &lt;a href="http://agile.egloos.com"&gt;창준형&lt;/a&gt;이 그 소스를 참고하고 싶어 하셔서
   찾았는데 소스가 없어졌더군요. 크흐. 그래서 생각난 김에 한 번 오픈소스 선형계획 툴킷인
   &lt;a href="http://www.gnu.org/software/glpk/"&gt;GLPK&lt;/a&gt;용으로 만들어 봤습니다.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openlook.org/src/0901/teamup.mod.txt"&gt;모델 코드&lt;/a&gt;, &lt;a href="http://openlook.org/src/0901/teamup.data.txt"&gt;데이터 예제&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;예제는 누구나 쉽게 데이터 성질을 해석할 수 있도록(;;) 소녀시대, 브라운 아이드 걸스, 원더걸스를 모아놓고 &lt;a href="http://agile.egloos.com/4786225"&gt;수학캠프&lt;/a&gt;를 하는 것을 가정하고(;;;)
   최대한 다른 그룹끼리 섞이게, 팀 간 평균 나이, 수학실력, 성비는 비슷하게 하도록 하는데,
   수학실력은 몰라서 관련이 있을리는 만무하지만 &lt;a href="http://www.epg.co.kr/"&gt;epg 스타정보&lt;/a&gt;에서 인기순위로 대충 매기고, 성비는 모두 여자라
   제 맘대로 다수를 남자로 바꿨습니다. ^.~
&lt;/p&gt;
&lt;p&gt;자 그러면 시험삼아 예제 데이터를 한 번 해 볼까요! 팀은 6개로 나누는 것으로 하고, 우선 제대로 돌아가는지 보기
   위해 멤버 수만 같게 맞추는 걸 조건으로 해 보면 결과가..
&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; 평균 EPG 인기 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; A &lt;/td&gt;&lt;td&gt; 제시카 써니 티파니 &lt;/td&gt;&lt;td&gt; 1:2 &lt;/td&gt;&lt;td&gt; 21.0 &lt;/td&gt;&lt;td&gt; 4.33 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; B &lt;/td&gt;&lt;td&gt; 가인 제아 선미 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 22.7 &lt;/td&gt;&lt;td&gt; 2.7 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; C &lt;/td&gt;&lt;td&gt; 태연 윤아 예은 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 20.7 &lt;/td&gt;&lt;td&gt; 5.0 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; D &lt;/td&gt;&lt;td&gt; 수영 서현 선예 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 20.0 &lt;/td&gt;&lt;td&gt; 3.0 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; E &lt;/td&gt;&lt;td&gt; 효연 미료 소희 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 22.0 &lt;/td&gt;&lt;td&gt; 3.0 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; F &lt;/td&gt;&lt;td&gt; 유리 나르샤 유빈 &lt;/td&gt;&lt;td&gt; 3:0 &lt;/td&gt;&lt;td&gt; 23.3 &lt;/td&gt;&lt;td&gt; 3.0 &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;팀 안의 인원 수만 맞지, 어느 하나도 비슷하게 흩어진 게 없습니다. 특히 B, C팀은 여러모로 차이가 많이 나서 비슷한 팀구성 목표에 맞지 않고요, A팀은 소녀시대만 있죠. 그럼 앞에서 언급한 4가지 조건 모두를 맞춰서 최적화한 결과는.. (120초 제한으로 풀어서 최적해는 아님)
&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; 평균 EPG 인기 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; A &lt;/td&gt;&lt;td&gt; 제시카 가인 예은 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 21.7 &lt;/td&gt;&lt;td&gt; 3.7 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; B &lt;/td&gt;&lt;td&gt; 태연 서현 유빈 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 20.7 &lt;/td&gt;&lt;td&gt; 3.7 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; C &lt;/td&gt;&lt;td&gt; 티파니 제아 선미 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 22.0 &lt;/td&gt;&lt;td&gt; 3.7 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; D &lt;/td&gt;&lt;td&gt; 유리 나르샤 소희 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 22.0 &lt;/td&gt;&lt;td&gt; 3.3 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; E &lt;/td&gt;&lt;td&gt; 효연 수영 선예 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 20.7 &lt;/td&gt;&lt;td&gt; 3.3 &lt;/td&gt;&lt;/tr&gt;
   &lt;tr&gt;&lt;td&gt; F &lt;/td&gt;&lt;td&gt; 써니 윤아 미료 &lt;/td&gt;&lt;td&gt; 2:1 &lt;/td&gt;&lt;td&gt; 22.7 &lt;/td&gt;&lt;td&gt; 3.3 &lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;그런대로 비슷비슷한 팀들로 구성이 됐습니다~ 재미있는 수학시간이 될 것 같네요. -ㅇ-;
&lt;/p&gt;
&lt;p&gt;사실 이 문제 같은 경우에는 결정하는 변수가 모두 정수라서 (정수가 적을수록 쉽게 구할 수 있음) 사실 전수조사에 주먹구구 좀 넣어서 돌리는 거나 큰 차이는 안 납니다만.. 그래도 재미로~ ^.^;;
&lt;/p&gt;



</description><pubDate>Fri, 16 Jan 2009 16:50:43 -0000</pubDate><guid>http://openlook.org/blog/2009/01/17/team-assignment-by-integer-programming/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>'한'씨 여배우가 진짜 많은가?</title><link>http://openlook.org/blog/2009/01/10/family-name-bias-in-actresses/</link><description>






&lt;p&gt;넋놓고 TV를 보고 있으면 종종 여자 연예인들의 성씨가 많이 편중됐다는 생각이 듭니다.
   그래서 얼마 전에 과연 진짜로 성씨가 편중됐나! 세 보려고 하고 있었는데 마침
   어학당 친구들과 얘기하다가 보니 이미 신문기사에서도 여러 번 다룬 적이 있다는군요!
   (또박사님, 곰형님 감사!) 찾아보니 &lt;a href="http://www.chosun.com/se/news/200405/200405110290.html"&gt;2004년 조선일보&lt;/a&gt;에서 어느 스포츠신문에서 &amp;quot;한씨 열풍&amp;quot;을 지적했다고 하고, &lt;a href="http://isplus.joins.com/enter/star/200708/03/200708031405595306020100000201020002010201.html"&gt;2007년 일간스포츠&lt;/a&gt;에서는 역술인들이 '한'씨가 연예인으로 운이 좋은 성씨라고 한다는 얘기를 전하고 있습니다. &lt;a href="http://www.hani.co.kr/arti/culture/entertainment/195709.html"&gt;2007년 한겨레신문&lt;/a&gt;에서는 대중설문조사로 좋아하는 성씨에 대해 조사를 했었는데, 여기서는 '한'씨가 무려 43/332명이 가장 선호하는 성씨로 조사돼서 인구 조사의 비율인 1.53%와 비교하면 뚜렷한 차이가 있음을 보였습니다.
&lt;/p&gt;
&lt;p&gt;그렇다면 과연 진짜로 성씨 편중이 통계적으로도 뚜렷한 현상인지, 시대적으로 변화가
   있는 것인지 궁금해지는데요! 연예인 데이터베이스 중 파싱하기가 비교적 쉬웠던
   &lt;a href="http://www.epg.co.kr/"&gt;epg TV가이드&lt;/a&gt;에 1월 7일 기준으로 등록된 연예인 전체에서
   한국에서 활동하는 배우, 가수 3941명 중, 이름이 한국사람의 보통
   이름처럼 들리는 느낌을 가진 사람 3407명 만을 골라서 통계에 썼습니다.
   예를 들어, 두 글자 이름이라도 &amp;quot;하은&amp;quot;의 경우에는 한국사람 이름에서 흔히 쓰는 패턴이므로
   포함했지만 &amp;quot;태연&amp;quot;은 성-이름 보다는 이름으로 훨씬 더 많이 쓰이기 때문에 제외했습니다.
   (이 과정에서 데이터 편향이 생겼을 수도 있는데, 실제 최종 결과에서는 이 영향으로 생길 수
   있는 편향과 반대 결과가 나와서 신경쓸 만한 수준은 아니었습니다.)
&lt;/p&gt;

&lt;h4&gt;진짜로 한씨가 많냐!&lt;/h4&gt;
&lt;p&gt;여자 배우/가수에서 '한'씨의 비율은 3.19%로 조사됐습니다. 원래 인구 중 비율은 1.56%로 1141명 중 21명 정도 나와야 하는데, 45명이 나온 것입니다. 제가 좋아한다고 한예슬, 한지민은 2명으로 세고 뭐 이런 것 아니고, 다 1명으로 셌습니다. (ㅎㅎ;) &lt;a href="http://en.wikipedia.org/wiki/Binomial_test"&gt;이항검정&lt;/a&gt;으로 '한'씨에 대한 선호는 없다는 귀무가설에 대해서 &lt;a href="http://en.wikipedia.org/wiki/P-value"&gt;P-value&lt;/a&gt;가 8.9×10&lt;sup&gt;-6&lt;/sup&gt;정도 나왔습니다. 따라서 한씨에 대한 선호는 확실히 있다고 볼 수 있습니다.
&lt;/p&gt;
&lt;p&gt;그렇다면, '한'씨가 원래 끼가 있거나 미모가 특출나서 연예인이 많이 되는 건 아닐까? 하고 의심해 볼 수도 있는데요. 그래서 예명 말고 본명을 보면 36명이 원래 '한'씨인 것으로 기록돼 있는데요. 마찬가지로 이항검정에서 같은 가설로 하면 P-value가 0.002로 좀 약해지기는 하지만, 여전히 경향이 있습니다. 그렇다면 진짜 '한'씨가 왕비도 많이 내고 그래서 끼가 있는 걸까요! 아.. 아쉽게도 데이터베이스에 기록된 본명이 온전하지 않거나, 본명을 숨기는 연예인이 많은 것 같습니다. 김씨는 원래 1141명 중 304명은 나와야하는데, 대상에서 267명만 본명이 '김'씨라서 역시 P&amp;lt;0.0076 정도로, 본명 성씨 분포가 원래 인구 비율과 다르다고 볼 수 있습니다.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3467/3184553394_8e3f54b024.jpg" alt="예명에서의 주요 성씨 분포"/&gt;
&lt;/p&gt;
&lt;p&gt;한편, '한'씨 말고도 여자 배우/가수 사이에서 많이 쓰이는 성씨가 더 있습니다.
   '선우'씨는 인구 중 비율은 0.01%이지만, 무려 5명 (0.35%)이 있어서 '한'씨보다 더 뚜렷하게
   나타났습니다. 그런데, 젊은 분들이 아니고, 원래 희성이다보니 잘 눈에는 안 띈 것 같네요.
   그 외에도 '채'씨, '고'씨, '하'씨가 &lt;a href="http://en.wikipedia.org/wiki/Bonferroni_correction"&gt;본페로니 보정&lt;/a&gt;을 했을 때 95% 신뢰 수준에서 더 많이 나오는 성씨로 나타났습니다. 반면에 '김'씨는 비율대로라면 304명이 나와야하지만 활동하는 이름으로는 247명 밖에 쓰지 않아서, 흔한 성이라 그런지 피하는 경향이 뚜렷했습니다. (P&amp;lt;7.9×10&lt;sup&gt;-5&lt;/sup&gt;)
&lt;/p&gt;
&lt;p&gt;남자는 어떨까요! 남자 배우/가수에서는 '주'씨 외에는 확실하게 많이 쓰이는 성씨가 보이지 않았습니다. '주'씨는 인구비율로 2018명 중 9명이 나와야 하는데, 22명이 있어서 P&amp;lt;0.00032로 95% 신뢰구간 상한선인 0.00056에 턱걸이 했습니다. 예명을 쓰면서 '주'씨로 바꾼 남자 연예인은 대표적으로 주진모, 주민준, 주호성 이 있습니다.
&lt;/p&gt;

&lt;h4&gt;시대별로 변하는 선호 경향&lt;/h4&gt;
&lt;p&gt;이름은 시대적 유행이 있기 마련이라, 시대별로 나눠서 봤습니다. 데뷰는 정확하게 기록되어 있지 않아서, 그냥 생년월일로 했습니다.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3420/3182818714_61beb181b9_o.jpg" alt="시대별 여자 배우/가수 성씨 변화"/&gt;
&lt;/p&gt;
&lt;p&gt;&amp;quot;같음&amp;quot; 가로줄을 기준으로 윗쪽이면 인구 비례보다 많고, 아래면 인구 비례보다 낮게 나온 성씨입니다.  가로줄은 생년으로 묶은 그룹이고 서로 약간씩 겹치기도 합니다. 각 그룹에서 95% 신뢰구간에서 지지되는 특징적인 성씨들만 골라서 표시했습니다. 즉, '오'씨는 65년~74년 태생 여자 연예인들에게 많이 나타났지만, 다른 세대에는 인구 비례와 거의 비슷했고요, 71~80년 태생 여자 연예인들은 '정'씨가 인구 비례에 비해 거의 1/4 밖에 안 된다는 뜻입니다.
&lt;/p&gt;
&lt;p&gt;잘 살펴보면 50, 60년대생에서는 '금', '방', '오' 씨가 인기였다가, 70년대생에서는 '유', '고' 씨가 인기이고, 80년대생에 와서야 '한' 씨의 인기가 시작됩니다. '채'씨도 '한'씨보다 약간 앞서 제법 높은 인기를 끌었었고, 80년대 후반에서는 '민'씨가 상당한 인기를 끌고 있습니다. 반면에 '김', '박', '정'은 시대별로 잠깐씩 적게 나타나는데, 흔한 성를 갖고 있던 여배우들이 성을 바꾸는 경우가 많다고 볼 수 있습니다. 아마도 여자이름은 비슷한 경우가 훨씬 많아서, 흔한 성이기까지 하면 기존에 활동하는 사람과 겹쳐서 피하려고 바꾸는 경우가 많겠죠.
&lt;/p&gt;

&lt;h4&gt;류/유 씨 두음법칙 적용&lt;/h4&gt;
&lt;p&gt;보통 남한에서 대부분 성이 두음법칙을 적용한 것을 더 많이 쓰는 반면에, 류(柳)씨는
   두음법칙을 안 쓰는 사람이 훨씬 많습니다. 그래서 성씨 통계에서도 '류'씨가 따로 잡혀있고,
   반면에 두음법칙을 보통 적용하는 유(劉)씨와, 원래 '유'인 유(兪) 씨도 있어서,
   인구조사에서는 '류' 1.31%, '유' 0.95%로 잡혀있습니다.
&lt;/p&gt;
&lt;p&gt;그런데 통계에서는 거의 모든 기준. 즉, 남자, 여자, 배우, 가수, 시대에 상관없이 거의 대부분에서 유의미한 수준에서 적고, '유'씨가 뚜렷하게 많았습니다. 즉, 일상에서는 '류'씨를 쓰다가도 연예인이 되면서는 발음이 쉽도록 두음법칙을 적용하는 경향이 있다고 볼 수 있겠습니다.
&lt;/p&gt;

&lt;h4&gt;코미디언/개그맨도 성씨 선호가 있을까?&lt;/h4&gt;
&lt;p&gt;상대적으로 코미디언/개그맨들은 이름을 고상하게 지을 필요가 적은데. 과연 배우/가수들과 비슷한 경향을 보일까요?
&lt;/p&gt;
&lt;p&gt;통계 결과로 데이터베이스에 있는 여자(95명) 중에서는 모든 연령대에서 유의미하게 더 많이 나오거나 덜 나오는 성씨가 없었습니다. 아마도 본명 그대로 쓰는 경우가 많은 것 같군요. 남자(331명)는 유의미한 것이 하나 있었는데 '박'씨가 1/2배 정도로 적게 나타났습니다. (P &amp;lt; 0.00036) 보정을 하면 아주 유의미한 정도는 아니라서 애매하긴 하지만, 원인은 모르겠지만 박씨가 적기는 합니다.
&lt;/p&gt;
&lt;p&gt;요약하면, 여자 배우/가수는 성씨 선호가 뚜렷하고 예명을 지을 때 신경을 많이 쓰지만, 코미디언/개그맨 이나 남자 배우/가수는 기본 인구 비례와 별 차이가 없다는 결과가 나왔습니다.
&lt;/p&gt;

&lt;h4&gt;자소별로 뭔가 느낌이 있는 것 아닐까!&lt;/h4&gt;
&lt;p&gt;신문 기사에서도 'ㅎ'이 연예계 운에 좋다고 했으므로 (;;) 자소별 분석을 해 볼 만 하겠습니다. 다음 표에 요약했습니다. (95% 신뢰도로 유효한 것만 표시)
&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; 첫소리 &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; ㅡ &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; ㄴ ㄹ &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;/table&gt;
&lt;/p&gt;
&lt;p&gt;뭔가 안 보이던 걸 기대를 했었는데, 그냥 '김'이 적고 '한'이 많다 같이
   앞에서 나왔던 성씨별 경향으로 대충 설명이 됩니다. 그런데, 남자에서
   받침이 없는 성씨가 많다고 나타났는데, 실제로 남자에서 많이 쓰인
   받침 없는 성씨로는 '주', '하', '지' 같은 것이 있어서 산뜻한 느낌을
   주는 경향이 있었습니다. 'ㅘ'가 적게 나타난 것은 '황'씨가 1/1.5배
   정도로 줄어든 것 때문입니다. 여자에서도 마찬가지로 '황'씨가 적기는
   했지만 '황'씨가 원래 인구가 비교적 적고 데이터베이스에서 여자 샘플수가
   적었기 때문에 통계적으로 유의미하게 나오지 않았을 뿐 비슷한 정도로
   적었습니다. 발음이 힘들어서 일까요?
&lt;/p&gt;

&lt;h4&gt;앞으로 트렌드는!&lt;/h4&gt;
&lt;p&gt;85년 이후 출생을 살펴보면 여자는 '서', '민', '고'씨가 인기이고, 남자는
   '강', '성'씨가 인기입니다. (아직 데이터베이스에 등록된 사람이 몇 안 되어서 통계적 유의성은 떨어집니다만.) 새로 예명을 지으실 일이 있으면(;;) 참고해서 예쁘게 지어 보세요. -O-;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;참고: 통계는 RPy로 했고, 그래프는 Apple Numbers로 그렸습니다.&lt;/em&gt;
&lt;/p&gt;



</description><pubDate>Sat, 10 Jan 2009 04:50:53 -0000</pubDate><guid>http://openlook.org/blog/2009/01/10/family-name-bias-in-actresses/</guid></item><item><title>자주 보는 논문 저자 찾기</title><link>http://openlook.org/blog/2009/01/07/who-wrotes-the-most-papers-in-my-hand/</link><description>






&lt;p&gt;저는 논문 관리를 &lt;a href="http://mekentosj.com/papers/"&gt;Papers&lt;/a&gt;로 하고 있습니다. 순전히 이 프로그램 때문에 맥을 사는 사람이 있을 정도로 정확하게 타게팅을 해서 나온 놈이라 정말 편리합니다. 다만 &lt;a href="http://www.devon-technologies.com/"&gt;DevonThink&lt;/a&gt;같이 정보를 자동으로 모아서 못 보는 패턴까지 파악하게 해 주는 기능이 많이 아쉬운데요. 그래서 갑자기 자주 보는 저자들의 PubMed 자동 알리미 설정을 한 번 해 볼까하고 저자를 생각해 봤는데, 아무래도 빼먹은 게 있을 것 같아서 Papers에 등록해 놓은 논문 전체에서 가장 많이 쓴 사람들을 찾아봤습니다.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openlook.org/src/0901/topauthors.py"&gt;소스코드&lt;/a&gt; - 다행히도 CSV 출력을 지원해서 BibTex 파싱 같은 것은 안 해도 됐고요. 이름은 중간이름을 간혹 생략하는 경우도 있어서 그냥 성과 이름 첫 글자만 가지고 비교를 했습니다. 하는 김에 가장 많이 보는 잡지 이름도 출력했습니다. 결과를 보니까 오! 간단하게 알리미 설정할 사람들 목록이 나왔습니다. :)
&lt;/p&gt;
&lt;p&gt;제 상위 저자, 잡지는 이렇게 나오는군요.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;===== Authors =====
  1   21 David P Bartel
  2   18 Gregory J Hannon
  3   11 Eric C Lai
  4   11 Thomas Tuschl
  5   10 Nikolaus Rajewsky
  6   10 Alexander Stark
  7   10 Alexei A Aravin

===== Journals =====
  1   96 Nature
  2   89 Science
  3   49 Proceedings of the National Academy of Sciences
  4   48 Bioinformatics
  5   40 Cell
  6   39 Nucleic Acids Research
  7   36 Genome Research
  8   36 Nature biotechnology
  9   31 PLoS Computational Biology
 10   30 Nature Genetics
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;여러분의 Papers 책꽂이는 누가 많이 차지하고 있나요!
&lt;/p&gt;



</description><pubDate>Wed, 07 Jan 2009 05:59:45 -0000</pubDate><guid>http://openlook.org/blog/2009/01/07/who-wrotes-the-most-papers-in-my-hand/</guid><category>&lt;a href='/blog/tag/happyhacking/'&gt;happyhacking&lt;/a&gt;</category></item><item><title>파이썬 2.6의 상위 호환성 기능</title><link>http://openlook.org/blog/2008/12/25/python-2.6-forward-compatibility/</link><description>






&lt;p&gt;파이썬 역사상 가장 큰 개혁인 3.0이 발표된 지 이제 한 달이 되어 갑니다.
   이번 업데이트는 워낙 변한 것이 많아서 파이썬 개발팀 내부에서도 실제 개발에 적용되려면 2년은
   걸릴 것으로 보고 있는데요. 그래서 중간 징검다리로 파이썬 2.6이 3.0을 전후로
   발표되었습니다. 2.6에는 3.0 대비에 대한 기능이
   많이 들어갔는데, 이 부분만 간단하게 맛보기로 소개해 드립니다~
&lt;/p&gt;

&lt;h4&gt;파이썬 3.0 호환 대비 옵션&lt;/h4&gt;
&lt;p&gt;파이썬 2.6에서는 3.0에 대비하는 개발자의 편의를 위해서 -3 옵션을 지원합니다.
   파이썬을 띄울 때 &lt;a href="http://docs.python.org/dev/using/cmdline.html#cmdoption-3"&gt;-3&lt;/a&gt; 옵션을 주면 3.0 호환성 경고가 뜹니다. 예를 들면 이렇게요~
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;cysteine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;perky&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="o"&gt;~%&lt;/span&gt; &lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;6&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mf"&gt;2.6&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="n"&gt;r261&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;67515&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dec&lt;/span&gt;  &lt;span class="mf"&gt;6&lt;/span&gt; &lt;span class="mf"&gt;2008&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;40&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GCC&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="mf"&gt;20070719&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FreeBSD&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;freebsd7&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sb"&gt;`1`&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="o"&gt;&amp;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="ne"&gt;SyntaxWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;backquote&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;supported&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;3.&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;use&lt;/span&gt; &lt;span class="nb"&gt;repr&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&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;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&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;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;hehe&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;__main__&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="ne"&gt;DeprecationWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;supported&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;3.&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;use&lt;/span&gt; &lt;span class="n"&gt;functools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;h,e,h,e&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;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="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key&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="n"&gt;__main__&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="ne"&gt;DeprecationWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;supported&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;3.&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;use&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt;
&lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;이렇게 파이썬 3.0에서 없어지면서 대체할 수 있는 것을 쓰면 경고가 뜹니다.
   &lt;strike&gt;옵션으로 주지 않고 프로그램 안에서 옵션을 넣어준 것 처럼 하려면
   &lt;a href="http://docs.python.org/dev/library/sys.html#sys.py3kwarning"&gt;sys.py3kwarning&lt;/a&gt; 을 True로 설정해 주면 됩니다.&lt;/strike&gt; 프로그램 안에서는 &lt;a href="http://docs.python.org/dev/library/sys.html#sys.py3kwarning"&gt;sys.py3kwarning&lt;/a&gt;을 보면
   -3이 설정되었는지 알 수 있지만, 파이썬이 뜨고 나서는 바꿀 수 없습니다.
&lt;/p&gt;

&lt;h4&gt;파이썬 3.0 호환 빌트인 함수&lt;/h4&gt;
&lt;p&gt;파이썬 3.0에서 새로 생기거나 동작이 바뀌는 빌트인 함수를 2.6에서 미리 쓸 수 있습니다.
   그냥 3.0을 바로 쓰는 것과 무슨 차이냐 하면, 기존 2.x용으로 개발된 프로그램 안에서도
   모듈 하나 안에서만 선택적으로 빌트인 함수를 3.0 것으로 바꿔서 3.0인 것처럼 쓸 수 있는
   것이죠. 하나씩 이렇게 3.0용으로 바꾸다보면 돌아가는 상태를 유지한 채로 2.x에서 3.0용으로
   부드럽게 넘어갈 수도 있고요~
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.python.org/dev/library/future_builtins.html#module-future_builtins"&gt;future_builtins&lt;/a&gt; 모듈이 파이썬 3.0 빌트인 함수를 제공합니다.
&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="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;future_builtins&lt;/span&gt; &lt;span class="kn"&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="nb"&gt;map&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="s"&gt;&amp;#39;12345&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;# 파이썬 3에서 이터레이터로 바뀌는 map&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imap&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;x833deec&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;_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&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;ascii&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="c"&gt;# 기존의 repr()을 대체하는 ascii()&lt;/span&gt;
&lt;span class="s"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;xed&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;x95&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;x9c&amp;#39;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;파이썬 3.0에서 바뀌는 문법 미리 맛보기&lt;/h4&gt;
&lt;p&gt;파이썬 3.0에서 바뀌는 print나 유니코드 문자열, 바이트 문자열 같은 것들을 모듈 단위로 미리 쓸 수도 있습니다. 마찬가지로 부분 부분 대처를 해서 3.0용으로 부드럽게 넘어갈 수 있겠죠.
&lt;/p&gt;
&lt;h5&gt;유니코드 문자열&lt;/h5&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="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="nb"&gt;len&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="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\xec\x82\xb0\xed\x83\x80&lt;/span&gt;&lt;span class="s"&gt;&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="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unicode_literals&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="nb"&gt;len&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="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;u&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\uc0b0\ud0c0&lt;/span&gt;&lt;span class="s"&gt;&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;/pre&gt;&lt;/div&gt;
&lt;h5&gt;print 함수&lt;/h5&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;print&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;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;u&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\ud55c\uae00&lt;/span&gt;&lt;span class="s"&gt;&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="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;print_function&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;print&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;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;한글&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
&lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;어때요! 한 번 해보고 싶으시죠!
&lt;/p&gt;
&lt;p&gt;다음에는 파이썬 3.0 호환성과 직접적인 관련은 없는 2.6의 새로운 기능을 소개해 드리겠습니다~
&lt;/p&gt;



</description><pubDate>Thu, 25 Dec 2008 10:39:29 -0000</pubDate><guid>http://openlook.org/blog/2008/12/25/python-2.6-forward-compatibility/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category></item><item><title>파이썬의 매력이 self를 쓰는 거라고 생각해요</title><link>http://openlook.org/blog/2008/12/13/why-self-in-python-is-attractive/</link><description>






&lt;p&gt;종종 파이썬에 대한 평을 인터넷에서 한 번씩 검색해 보는데요. 많은 분들이 가장
   많이 싫어하는 것은 뭐니뭐니 해도 &amp;quot;들여쓰기 강제&amp;quot;겠죠. 뭐 이거야 취향 문제라
   어쩔 수 없는 것이고. 사실 파이썬 사용자들 중에서 &amp;quot;들여쓰기 강제&amp;quot;를 좋아하는 사람이
   많기 때문에 파이썬의 원래 목적에도 더 맞다고 생각되고... ^.^;
&lt;/p&gt;
&lt;p&gt;그에 못지않게 자주 지적되는 것이, 객체 안에서 꼭 self.를 달아 줘야 된다는 것인데요.
   저는 self.를 항상 명시적으로 붙이는 거야말로 파이썬의 참 매력이고, self가 없어지면
   파이썬이 무너진다고 생각합니다! 특히 자바 프로그래머들이 파이썬의 self에 대해
   많이 지적하는데, 자바와 파이썬 모두에서 영향력이 있는 브루스 엑켈도 &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=239003"&gt;self를
(메쏘드 선언에서만이라도) 없애보자&lt;/a&gt; 했는데, 그에 대한 응답으로 귀도가 &lt;a href="http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html"&gt;불가능한 일이다&lt;/a&gt;라고
   그 이유를 논리적으로 설명했었습니다.
&lt;/p&gt;
&lt;p&gt;브루스 엑켈의 제의가 선언에서만 없애자는 것이었기 때문에, 메쏘드 내부의 코드에서
   없애면 안 되는 이유에 대해서는 귀도가 설명하지 않았는데요. 브루스 엑켈이 스스로 결론 내린
   그 앞 부분의 문제 &amp;quot;self가 왜 있어야 하냐!&amp;quot; 그 이유에 대해서 좀 설명해서
   자바 프로그래머 분들이 파이썬을 좀 더 이해할 수 있도록 도와볼까 합니다.
&lt;/p&gt;
&lt;p&gt;파이썬에서 self가 붙게 된 역사적인 이유는 파이썬의 클래스 내 메쏘드는 기본적으로
   외부에 독립되어 있는 함수에 껍데기를 씌운 것이기 때문입니다. 자바는 아예 독립 함수가 없고,
   다른 언어에서는 대체로 독립된 함수들과 메쏘드는 다른 취급을 받는데, 파이썬에서는 그냥
   함수를 메쏘드로 편입시켜서 쓸 수도 있고, 둘을 비슷한 방법으로 바꿔서 다룰 수 있습니다.
   예를 들면 이런 코드가 가능하겠죠.
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;egg&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;print&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;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&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="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="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;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
    &lt;span class="n"&gt;egg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;egg&lt;/span&gt;

&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;wow&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;밖에서 선언된 함수를 클래스 정의할 때 메쏘드로 끌어들인 것이죠. 메타클래스를 쓴다면 더
   동적으로 해 버릴 수도 있습니다. 도대체 이런 코드를 뭐에 쓰냐! 하는 의문을 가지실 수도 있는데요.
   의외로 이런 기술이 많이 쓰입니다. egg함수를 C로 구현된 확장모듈에서 끌여들일 수도 있고요.
   egg만 사용자가 구현할 수 있도록 노출시켜서 외부 모듈에서 불러올 수도 있고요. 심지어
   R이나 .NET같은 브릿지에서 다른 언어로 구현된 것을 쓸 수도 있습니다. 메쏘드가 결국
   함수기반이라는 것은 생각보다 강력한 개념으로, __로 시작하는 내부 속성을 쓰면 더욱 희한한 것도
   제어할 수 있게 되고, 클래스를 안 쓴 코드와 클래스를 쓰는 코드 사이를 넘나들거나 점진적으로 변경할 때 아주 쓸모가 있습니다.
&lt;/p&gt;
&lt;p&gt;파이썬에서 instance.method(A, B) 는 class.method(instance, A, B) 와 같은 역할을 합니다.
   이것은 함수가 메쏘드가 된 얘기 외에도, 다중상속을 받았거나 이름이 중복되는 메쏘드를 부를 때 쓰이기도 하고, 다양하게 상속받은 하위 인스턴스들을 명시적으로 한 메쏘드에게 콕 찝어 줄 때도 쓰이고, 이 규칙 하나가 수많은 모호함을 해결해 줍니다. 그래서 이 일관성이 문법 전반에 계속 흐르고 있습니다.
&lt;/p&gt;
&lt;p&gt;그렇다면 그냥 함수는 함수로 쓰고 메쏘드는 메쏘드로 쓰고 같은 데서 상속받으면 비슷한 인터페이스가
   나올 수 있지 않겠느냐 하는 의문이 있을 수도 있습니다. self의 또 다른 존재 이유로 파이썬을 파이썬으로
   만드는 가장 중요한 특징인 &amp;quot;네임스페이스&amp;quot;가 등장합니다.
&lt;/p&gt;
&lt;p&gt;&amp;quot;네임스페이스&amp;quot;는 파이썬에서 변수를 담아두는 공간으로, 원래는 로컬, 모듈 전체, 빌트인 세 가지 네임스페이스를 찾도록 되어 있다가, 파이썬 2.1부터 상위에 싸여있는 것들도 찾도록 돼 있습니다. 이해를 돕기 위해 예를 들어드리면
&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;X&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;print&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="n"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;이런 파일이 있다면 A는 모듈 전체, 나머지는 로컬에 들어갑니다. 그런데 Y()의 입장에서 C는 로컬인데, B와 D는 자기 로컬은 아니면서 상위 네임스페이스에 속한 변수들이 됩니다. 따라서, 파이썬 2.1부터는 모듈 전체로 가기 전에 B, D가 있는 X영역부터 찾습니다. 파이썬은 변수 선언을 하지 않기 때문에, 변수의 네임스페이스는 대입이 한 번이라도 일어난 최소의 네임스페이스에 영역을 잡는데요. 위에서 C는 Y()안에서 대입이 있었기 때문에 Y()안의 네임스페이스에 잡히고, B, D는 X()에서 대입이 있기 때문에 X()의 네임스페이스에 잡힙니다. 그런데, A는 대입이 모듈에서만 있고, X()에는 없어서 X() 로컬이 아니라 글로벌로 잡힙니다.
   이런 네임스페이스를 바꿔주는 키워드가 원래부터 지원되는 global과 파이썬 3.0부터 지원되는 nonlocal이 있습니다. 이건 따로 관심이 있으시면 매뉴얼을 보시면 되겠습니다. +_+
&lt;/p&gt;
&lt;p&gt;여기서 갑자기 웬 네임스페이스 설명을 self하는 데 하느냐! 하면..
&lt;/p&gt;
&lt;p&gt;self.을 생략하게되면 로컬 네임스페이스와 인스턴스 네임스페이스가 섞이게 된다는 것입니다. 즉 클래스에서 x = 1하면 이게 로컬로 갈 지, 인스턴스로 갈지 모호해 지는거죠. 자바나 C++은 명시적으로 선언을 하기 때문에 헷갈리지 않지만, 파이썬은 선언을 않기에 명시적으로 쓸 필요가 있죠. 그래서 펄이나 루비에서는 따로 @나 !같은 기호를 도입해서 쓰는데.. 파이썬의 원칙 중 매우 중요한 것으로 &amp;quot;연산자 너무 늘리지 말자&amp;quot;가 있어서 고려 대상은 아닙니다. self.라고 쓰면 파이썬 문법을 모르는 사람도 아 이게 뭐구나! 하고 추측을 할 수 있지만 @같은 걸 붙여놓으면, 문법책을 참조하거나 고난도의 눈치를 보지 않고서는 인스턴스 네임스페이스인지, 클래스 네임스페이스인지, 글로벌 네임스페이스인지 알기가 힘들겠죠.
&lt;/p&gt;
&lt;p&gt;그럼 또 제기될 수 있는 의문! 대입은 그럼 명시적으로 하고, 쓸 때만 인스턴스와 클래스도 한 번 타 주면 되지 않겠니? 하고 소극적인 부탁을 해 볼 수도 있겠는데요. 읽는 방법, 쓰는 방법이 다른 건 아무래도 파이썬 원칙에는 맞지 않고, 속도도 많이 느려집니다.
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;모호한 것을 보면, 추측할 수 있을 거라는 유혹은 단호하게 거절한다. (In the face of ambiguity, refuse the temptation to guess.) -- 팀 피터스, 파이썬의 선(Zen)
&lt;/p&gt;
&lt;/blockquote&gt;


</description><pubDate>Fri, 12 Dec 2008 18:55:38 -0000</pubDate><guid>http://openlook.org/blog/2008/12/13/why-self-in-python-is-attractive/</guid><category>&lt;a href='/blog/tag/python/'&gt;python&lt;/a&gt;</category></item></channel></rss>