<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Lucy Park</title>
    <description>Bilingual posts regarding data science, machine learning, and some miscellaneous geeky stuff.
</description>
    <link>http://www.lucypark.kr/</link>
    <atom:link href="http://www.lucypark.kr/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 06 Apr 2025 13:12:08 -0700</pubDate>
    <lastBuildDate>Sun, 06 Apr 2025 13:12:08 -0700</lastBuildDate>
    <generator>Jekyll v3.2.1</generator>
    
      <item>
        <title>2016년 이벤트 정산</title>
        <description>&lt;style&gt;
@import url(https://fonts.googleapis.com/earlyaccess/nanumgothiccoding.css); code { font-family: 'Nanum Gothic Coding', monospace !important; }
&lt;/style&gt;

&lt;p&gt;9월 중순의 어느 날,
어떤 친절한 분께서 내가 올해 단 한 번도 블로그 포스트를 쓴 적이 없다는 사실을 알려주셨다.
&lt;a href=&quot;https://ko.wikipedia.org/wiki/박근혜_게이트&quot;&gt;한국에도&lt;/a&gt;,
&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C%EA%B3%A0&quot;&gt;인류에도&lt;/a&gt;
굵직굵직한 사건들이 있었던만큼이나 내 개인사에도 꽤 큰 변화와 사건을 겪었던 한 해여서 글 쓸 시간이 부족했다고 한다면, 지나친 자기 합리화일까? &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;2016년이 저물기까지 이제 고작 몇 시간 남았지만,
단 하나의 포스트라도 발행하기 위해 서둘러 데이터를 모으고 기억을 더듬어보았다.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;ol id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#올해의-사건들&quot; id=&quot;markdown-toc-올해의-사건들&quot;&gt;올해의 사건들&lt;/a&gt;    &lt;ol&gt;
      &lt;li&gt;&lt;a href=&quot;#1-3월-넘버웍스&quot; id=&quot;markdown-toc-1-3월-넘버웍스&quot;&gt;1-3월: 넘버웍스&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#4-6월-졸업&quot; id=&quot;markdown-toc-4-6월-졸업&quot;&gt;4-6월: 졸업&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#7-8월-태국&quot; id=&quot;markdown-toc-7-8월-태국&quot;&gt;7-8월: 태국&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#9-12월-취직&quot; id=&quot;markdown-toc-9-12월-취직&quot;&gt;9-12월: 취직&lt;/a&gt;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#my-year-in-data&quot; id=&quot;markdown-toc-my-year-in-data&quot;&gt;My year in data&lt;/a&gt;    &lt;ol&gt;
      &lt;li&gt;&lt;a href=&quot;#local-activities&quot; id=&quot;markdown-toc-local-activities&quot;&gt;Local activities&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#online-activities&quot; id=&quot;markdown-toc-online-activities&quot;&gt;Online activities&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#offline-activities&quot; id=&quot;markdown-toc-offline-activities&quot;&gt;Offline activities&lt;/a&gt;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#올해의-things&quot; id=&quot;markdown-toc-올해의-things&quot;&gt;올해의 Things&lt;/a&gt;    &lt;ol&gt;
      &lt;li&gt;&lt;a href=&quot;#올해의-책-algorithms-to-live-by&quot; id=&quot;markdown-toc-올해의-책-algorithms-to-live-by&quot;&gt;올해의 책: “Algorithms to Live By”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#올해의-음악-chopin-polonaise-in-a-flat-major-op53-played-by-sungjin-cho&quot; id=&quot;markdown-toc-올해의-음악-chopin-polonaise-in-a-flat-major-op53-played-by-sungjin-cho&quot;&gt;올해의 음악: “Chopin Polonaise in A flat major Op.53 (played by Sungjin Cho)”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#올해의-영화-none&quot; id=&quot;markdown-toc-올해의-영화-none&quot;&gt;올해의 영화: None&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#올해의-장난감-애플펜슬&quot; id=&quot;markdown-toc-올해의-장난감-애플펜슬&quot;&gt;올해의 장난감: “애플펜슬”&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#올해의-기타등등&quot; id=&quot;markdown-toc-올해의-기타등등&quot;&gt;올해의 기타등등&lt;/a&gt;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#2017년은&quot; id=&quot;markdown-toc-2017년은&quot;&gt;2017년은?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;올해의-사건들&quot;&gt;올해의 사건들&lt;/h3&gt;

&lt;p&gt;나의 2016년은 4개의 phase로 나뉘어 있었다.
넘버웍스와 함께했던 1-3월,
졸업 준비를 위해 달린 4-6월,
몸과 마음에게 포상을 내린 7-8월,
그리고 취직 후 회사에 있었던 9-12월.&lt;/p&gt;

&lt;h4 id=&quot;1-3월-넘버웍스&quot;&gt;1-3월: 넘버웍스&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://numberworks.io&quot;&gt;넘버웍스&lt;/a&gt;는 SKT 출신의 데이터 엔지니어 4명이 차린 데이터 스타트업이다.
&lt;a href=&quot;http://www.slideshare.net/yongho/rdd-paper-review&quot;&gt;어려운 개념도 누구나 쉽게 이해할 수 있게 해설해주는&lt;/a&gt; 대단한 능력을 가진 (내 마음 속) 슈퍼스타 &lt;a href=&quot;https://www.facebook.com/yonghosee&quot;&gt;하용호&lt;/a&gt; 선배가 있는 곳이기도 하고,
&lt;a href=&quot;https://www.facebook.com/yonghosee/posts/944456152260185&quot;&gt;매력적인&lt;/a&gt; &lt;a href=&quot;https://www.facebook.com/yonghosee/posts/1017311828307950&quot;&gt;채용공고&lt;/a&gt;를 내는 것으로 유명한 회사이기도 하다.
원래는 어떻게든 2월에 졸업을 하려고 용을 쓰다가, 능력자들이 있는 곳에 가면 다방면으로 많이 배울 수 있을거라는 생각에 미련없이 다음 학기로 졸업을 미뤘다.&lt;/p&gt;

&lt;p&gt;넘버웍스와 함께 있던 이 시기에 나는 cloud computing과 Apache Spark 사용 등 데이터 엔지니어링에 대한 노하우를 익히거나, 스타트업이 돌아가는 방식에 대해 많이 배우기도 했지만,
가장 크게 남은 것은 사람이다.
보스로서의 롤모델, 언젠가 같이 사업을 하고 싶다고 생각되는 존경할만한 동료, 뛰어난 멘토를 단 3개월만에 얻었다면 그야말로 엄청난 수확 아닌가?
지금도 넘버웍스 사람들과는 따뜻한 가족적 애착을 가지며 꾸준한 만남을 이어가고 있다.
개인적으로는, 박사과정으로 있던 기간 전체를 통틀어 가장 행복했던 때였다고 생각한다.&lt;/p&gt;

&lt;p&gt;그 외에도 이 시기에는
&lt;a href=&quot;http://aikorea.org&quot;&gt;AIKorea&lt;/a&gt; 밋업 참여,
R 패키지인 &lt;a href=&quot;https://cran.r-project.org/web/packages/MCMCpack/index.html&quot;&gt;MCMCpack&lt;/a&gt; 디버깅,
친구 지은킴의 브라이덜 샤워,
헬스장 등록 그리고 줌바 시작(!),
R과의 속초 나들이,
어느덧 십년지기 친구가 된 Yinyee의 한국 방문,
뽀모도로 사용 시작 &lt;sup id=&quot;fnref:7&quot;&gt;&lt;a href=&quot;#fn:7&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;
등이 있었고,
사회적으로는 넷플릭스의 한국 진출이 있었다. &lt;sup id=&quot;fnref:6&quot;&gt;&lt;a href=&quot;#fn:6&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h4 id=&quot;4-6월-졸업&quot;&gt;4-6월: 졸업&lt;/h4&gt;

&lt;p&gt;마음 같아서는 넘버웍스에 계속 있고 싶었으나,
2011년에 시작한 일, 즉 박사과정을 마무리짓기 위해 학교에 다시 돌아가야 했다.
마침 12월에 제출했던 논문의 리뷰가 와서 수정을 해야했고, 디펜스도 치뤄야했다.&lt;/p&gt;

&lt;p&gt;디펜스 준비는 생각보다 힘들었다.
어수선한 낮을 피하고 조금이라도 주차를 수월하게 하려고 나는 서울이 아니라 Reykjavik의 시간대에 맞춰 생활을 했고,
실험 결과가 뜻대로 나오지 않아 자신감은 바닥을 찍기 일쑤였고,
서울의 공기가 너무 좋지 않아서 꽤 오랜 기간 기침을 했다. &lt;sup id=&quot;fnref:8&quot;&gt;&lt;a href=&quot;#fn:8&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;
그나마 기쁨이 되어준 시간은, 월/수 저녁마다 낙성대의 헬스장에 가서 &lt;a href=&quot;http://zumba.com&quot;&gt;줌바&lt;/a&gt;를 할 때였다.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;caption&quot; src=&quot;/images/2016-12-31-lab.jpg&quot; width=&quot;780&quot; alt=&quot;새벽까지 실험을 하곤 하던 연구실, 나의 자리&quot; /&gt;&lt;/p&gt;

&lt;p&gt;하지만 좌절의 시기도 지나고 어느 순간 “에고 나도 모르겠다 어떻게든 되겠지 일단 조금이라도 더 달려보자”라는 생각을 하게 되었고,
어찌어찌해서 디펜스를 성공적으로 마무리할 수 있었다!
디펜스가 끝나고 약 일주일 후 논문의 최종본이 완성되던 순간, 함께 동고동락 했던 내 15인치 맥북프로는 장렬히 전사했다.
나의 졸업은, 하다못해 나의 실험 장비부터 시작해서 주변의 모두가 도와주었다. 참 많은 분들께 많은 빚을 졌다.&lt;/p&gt;

&lt;p&gt;디펜스를 마침과 동시에, 그 동안 친구들과 번역한 책도 출판되었다.
&lt;a href=&quot;https://www.goodreads.com/book/show/30299413&quot;&gt;밑바닥부터 시작하는 데이터 과학&lt;/a&gt;은
데이터과학에 사용되는 기본 알고리즘 몇 가지를 라이브러리의 도움 없이 파이썬의 기본 문법만을 이용해서 구현해보는 책이다.
데이터과학의 기본기를 다지고 싶은 분들께 추천드리고 싶다.&lt;/p&gt;

&lt;p&gt;그 외에도 이 시기에는 &lt;a href=&quot;http://popong.com&quot;&gt;팀포퐁&lt;/a&gt;의 주역 주희 언니가 출산을 하고, 중학교 때부터 서로 많은 의지를 해온 L군이 결혼을 했다.
&lt;a href=&quot;https://www.facebook.com/groups/TensorFlowKR/&quot;&gt;텐서플로우 코리아&lt;/a&gt;의 운영진이 되었고, 2009년부터 함께 해온 애마 조나단&lt;sup id=&quot;fnref:14&quot;&gt;&lt;a href=&quot;#fn:14&quot; class=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;을 현중이에게 넘겨줬다.&lt;/p&gt;

&lt;h4 id=&quot;7-8월-태국&quot;&gt;7-8월: 태국&lt;/h4&gt;

&lt;p&gt;디펜스가 끝나고 나서는 긴장이 풀려서인지 육체적으로 고생을 많이 했다.
친구 K양은 디펜스 끝나고 못 잤던 잠을 자기 위해 4일을 내리 잤다고 하던데,
나는 잠을 자는 법을 잊었는지 1시간 이상을 자기가 어려웠다.
잠을 못자서 지하주차장에서 정신줄 놓고 주차하다가 후미를 벽에 박아서 견적 150만원이 나오기도 해서,
컨디션이 안 좋을 때는 운전을 절대하면 안된다는 교훈을 얻기도 했다.&lt;/p&gt;

&lt;p&gt;7월 중순에 약 60만원을 들여 서울-푸켓-방콕-오사카-서울 등 네 개 도시를 39일에 걸쳐 경유하는 비행기표를 티켓팅 했고,
에어비앤비에서 한 달 간 머물 숙소를 구했다.
그 후 대학원 시절 함께 미팅하러 다닌 (ㅋㅋ) 망구스와 부산 여행을 가고,
존경하는 &lt;a href=&quot;https://github.com/blissray&quot;&gt;최성철 교수님&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://www.cse.ust.hk/~hunkim/&quot;&gt;김성훈 교수님&lt;/a&gt;과 제주도에서 바다수영 경주를 했다.
티켓팅한지 정확히 일주일 후에 푸켓 행 비행기를 탔고,
이 때부터 지난 10년을 정리하는 시간을 가졌다.
몇 년 전 발리에 갔을 때 너무 습해서 습할 것을 걱정했는데,
푸켓은 우기임에도 불구하고 하나도 안 습하고 하나도 안 더웠다.
음식도 싸고 맛있고 마사지도 해줘, 와이파이 빵빵해! 천국이었다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;나는 여기서 음악도 안 듣고 영화도 안 보고 책도 안 읽고 논문도 안 쓰고 실험도 안 하고 그저 벽에 붙은 도마뱀 가족만 보고, 자다가 밥 먹고 쓸데없는 글 쓰다가 메신저로 종일 사람들과 수다만 떠는듯.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;사실 여행 장소를 푸켓으로 정한 이유는 간단했다. &lt;a href=&quot;http://nomadlist.com&quot;&gt;디지털 노마드를 위한 웹사이트&lt;/a&gt;에 들어가서 인터넷 잘되고(good internet) 안전하고(safe) 공기 좋고(clean air) 여성 친화적인 곳(female friendly)을 찍었더니 코사무이가 1등으로 나왔다. 그런데 코사무이는 한국, 일본과 연결되는 직항이 없으니 근처의 푸켓으로 선회했던 것이다.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;caption&quot; src=&quot;/images/2016-12-31-phuket.png&quot; width=&quot;400&quot; alt=&quot;여행 장소를 고르는 것을 도와준 nomadlist.com&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이 시기, 푸켓에서 나는 수 주의 고민 끝에 졸업 후의 진로를 정했고, &lt;a href=&quot;http://land.naver.com/&quot;&gt;원격으로 집을 구해서&lt;/a&gt; &lt;a href=&quot;https://planner5d.com/&quot;&gt;원격으로 인테리어도 했다&lt;/a&gt;.
&lt;a href=&quot;http://www.scubadivingphuket.net/padiscubadivingcoursesphuket.php&quot;&gt;PADI Advanced Open Water 스쿠버 다이빙 자격증을 따고&lt;/a&gt;,
&lt;a href=&quot;http://www.phuket-hhh.com/&quot;&gt;Hash&lt;/a&gt;에 처음 참가해보고,
&lt;a href=&quot;http://www.pokemongo.com/&quot;&gt;포켓몬도 열심히 잡았다&lt;/a&gt;.
푸켓 이후에 3일 간 방문했던 방콕은 나와 너무도 맞지 않았지만,
그곳에서 갔던 인도 분자요리 음식점 &lt;a href=&quot;http://eatatgaggan.com/&quot;&gt;Gaggan&lt;/a&gt;은 훌륭했고,
약 일주일 간 머물렀던 오사카와 교토에서는
&lt;a href=&quot;https://tabelog.com&quot;&gt;다베로그&lt;/a&gt;를 열심히 뒤지며 &lt;a href=&quot;https://www.goodreads.com/book/show/31320871&quot;&gt;친구가 추천해준 책&lt;/a&gt;을 읽었다.&lt;/p&gt;

&lt;p&gt;그러고는 한국에 돌아왔다.
돌아오는 비행기에서 후다닥 졸업생 답사를 작성했고,
새까맣게 탄 채로 졸업 사진을 찍었다.&lt;/p&gt;

&lt;h4 id=&quot;9-12월-취직&quot;&gt;9-12월: 취직&lt;/h4&gt;

&lt;p&gt;예전에도 몇몇 회사를 다녀보기는 했지만,
풀타임의 고정적인 직업으로는 사실상 첫 회사를 구하는 것과 다름이 없었다.
진로를 결정하던 시간은 무엇보다 나의 가치관에 대해 고민해볼 수 있는 귀중한 시간이었고,
나는 결과적으로 &lt;a href=&quot;http://labs.naver.com&quot;&gt;네이버 랩스&lt;/a&gt;의 기계번역 팀을 나의 “첫 직장”으로 선택하게 되어,
지금은 통번역앱 &lt;strong&gt;파파고&lt;/strong&gt;
(&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.naver.labs.translator&amp;amp;hl=ko&quot;&gt;구글플레이&lt;/a&gt;,
&lt;a href=&quot;https://itunes.apple.com/kr/app/papago-tong-yeog-beon-yeog/id1147874819?mt=8&quot;&gt;앱스토어&lt;/a&gt;)
를 만들고 있다.
(우리 팀에서 &lt;a href=&quot;http://recruit.navercorp.com/naver/job/detail/developer?annoId=20000240&amp;amp;classId=170&amp;amp;jobId=2023&amp;amp;entTypeCd=&amp;amp;searchTxt=&quot;&gt;OCR&lt;/a&gt;, &lt;a href=&quot;http://recruit.navercorp.com/naver/job/detail/developer?annoId=20000240&amp;amp;classId=170&amp;amp;jobId=2022&quot;&gt;기계번역&lt;/a&gt; 개발을 함께하실 인재를 찾고 있어요!)&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;caption&quot; src=&quot;/images/2016-12-31-papago.png&quot; width=&quot;400&quot; alt=&quot;귀엽고 능력있는 파파고&quot; /&gt;&lt;/p&gt;

&lt;p&gt;모두가 직장이란 괴로운 곳이니 금세 질릴거라고들 하던데,
오자마자 약간 어수선했던 분위기를 넘기고 나니
지금은 무척 즐겁게 생활하고 있다.
아직은 꼬꼬마지만, 앞으로가 꽤 기대된다.&lt;/p&gt;

&lt;p&gt;그 외에도 10월에는 나를 지난 1년간 즐겁게 해주던 &lt;a href=&quot;http://lucypark.zumba.com&quot;&gt;줌바 강사 자격증&lt;/a&gt;을 땄고, 차를 팔았다.
국가적으로 큰 이벤트가 있었던 11월 12일에는 장보러 가던 중 교통사고가 나서 한 동안 허리 때문에 고생하기도 했고,
애플 앱스토어 계정이 중국의 누군가에 의해 털리기도 했다.
그리고 12월 들어서 파파고는 사내 과제발표회에서 좋은 성과를 거두었고 (발표는 내가 했다!),
앱스토어 1위를 며칠째 굳건히 지키고 있다.&lt;/p&gt;

&lt;h3 id=&quot;my-year-in-data&quot;&gt;My year in data&lt;/h3&gt;

&lt;p&gt;Quantified self에 관심이 많아서 데이터를 열심히 쌓아오기는 했으나,
한 번도 데이터를 열어본 적도 없었다.
올해는 연말을 맞이한 기념으로! 간단히 집계라도 해봐야겠다는 생각이 들었다.
올해가 얼마 남지 않았기에 화려한 시각화를 할 시간은 없으니, 간단한 커맨드라인 툴을 몇 가지를 이용하기로 한다. &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/e9t/data_hacks&quot;&gt;data_hacks&lt;/a&gt;: 막대그래프나 히스토그램을 그림 &lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://csvkit.rtfd.org/&quot;&gt;csvkit&lt;/a&gt;: CSV 파싱에 사용 &lt;sup id=&quot;fnref:5&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot;&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stedolan.github.io/jq/&quot;&gt;jq&lt;/a&gt;: JSON 파싱에 사용&lt;/li&gt;
  &lt;li&gt;grep, sed, awk, … 등 전통적인 커맨드라인 툴 &lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;9&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;사용한 데이터 파일은 다음과 같이 acquire했다. &lt;sup id=&quot;fnref:9&quot;&gt;&lt;a href=&quot;#fn:9&quot; class=&quot;footnote&quot;&gt;10&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;diigo.csv&lt;/code&gt;: 북마킹 사이트. &lt;a href=&quot;https://www.diigo.com/tools/export&quot;&gt;여기&lt;/a&gt;에서 다운받을 수 있다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;facebook/html/timeline.htm&lt;/code&gt;: &lt;a href=&quot;https://www.facebook.com/settings?tab=account&quot;&gt;여기&lt;/a&gt;에서 &lt;code class=&quot;highlighter-rouge&quot;&gt;Download a copy of your Facebook data.&lt;/code&gt; 링크 클릭.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;goodreads.csv&lt;/code&gt;: 독서 로깅 사이트. &lt;a href=&quot;https://www.goodreads.com/review/import&quot;&gt;여기&lt;/a&gt;에서 &lt;code class=&quot;highlighter-rouge&quot;&gt;Export Library&lt;/code&gt; 버튼 클릭.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;google/Takeout/Searches/2016-*.json&lt;/code&gt;: &lt;a href=&quot;https://www.google.com/settings/takeout&quot;&gt;여기&lt;/a&gt;에서 다운로드.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;imdb.csv&lt;/code&gt;: &lt;a href=&quot;http://www.imdb.com/user/ur35251371/ratings&quot;&gt;내 영화 평점 페이지&lt;/a&gt;에서 &lt;code class=&quot;highlighter-rouge&quot;&gt;Export this list&lt;/code&gt; 링크 클릭.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;lastfm.csv&lt;/code&gt;: &lt;a href=&quot;https://benjaminbenben.com/lastfm-to-csv/&quot;&gt;누군가 만들어준 좋은 사이트&lt;/a&gt;에서 계정명 입력.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;momento.txt&lt;/code&gt;: &lt;a href=&quot;https://momentoapp.com&quot;&gt;나의 소셜 미디어 피드를 모아주는 앱&lt;/a&gt;. 앱에서 직접 export.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;moves/csv/full/summary.csv&lt;/code&gt;: &lt;a href=&quot;https://accounts.moves-app.com/signin/export&quot;&gt;여기&lt;/a&gt; 또는 앱에서 직접 export.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;rescuetime.csv&lt;/code&gt;: &lt;a href=&quot;http://rescuetime.com&quot;&gt;컴퓨터 사용 로깅 툴&lt;/a&gt;. API 키를 발급 받아 다음 url의 APIKEY 대신 입력하면 해당 기간에 쌓인 데이터를 csv 형태로 받을 수 있다.&lt;/p&gt;

    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  https://www.rescuetime.com/anapi/data?rtapi_key=APIKEY&amp;amp;perspective=interval&amp;amp;format=csv&amp;amp;resolution_time=hour&amp;amp;restrict_kind=activity&amp;amp;restrict_begin=2016-01-01&amp;amp;restrict_end=2016-12-31
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;local-activities&quot;&gt;Local activities&lt;/h4&gt;

&lt;p&gt;올해 5월부터 &lt;a href=&quot;http://rescuetime.com&quot;&gt;RescueTime (프리미엄 $36/year, 50% 할인가)&lt;/a&gt;을 사용했는데&lt;sup id=&quot;fnref:10&quot;&gt;&lt;a href=&quot;#fn:10&quot; class=&quot;footnote&quot;&gt;11&lt;/a&gt;&lt;/sup&gt;, 이 앱을 사용하면 컴퓨터로 어떤 작업을 얼마나 했는지 알 수 있다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat rescuetime.csv | head -n 3 | csvlook
|                Date | Time Spent (seconds) | Number of People | Activity     | Category                  | Productivity |
| ------------------- | -------------------- | ---------------- | ------------ | ------------------------- | ------------ |
| 2016-05-01 00:00:00 |                1,631 |             True | facebook.com | General Social Networking |           -2 |
| 2016-05-01 00:00:00 |                  509 |             True | kakaotalk    | Instant Message           |            2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;나는 5월 어느 날부터 총 4,944,815초간 컴퓨터를 사용했고,
태국에 있던 8월에 컴퓨터 사용 시간이 가장 적었다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvcut -c 1,2 rescuetime.csv | sed 's/-[0-9]*T[0-9:]*//; s/,/ /' | tail -n +2 | bar_chart.py -A
# each ∎ represents a count of 10947. total 4944815
2016-05 [526640] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-06 [695003] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-07 [648595] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-08 [308345] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-09 [461830] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-10 [799097] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-11 [725727] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-12 [779578] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;컴퓨터를 사용하면서 주로 어떤 작업을 했을까?
Category를 기준으로 빈도를 뽑아봤다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvcut -c 2,5 rescuetime.csv | sed 's/,/ /' | tail -n +2 | bar_chart.py -avrp -l 20
# each ∎ represents a count of 24457. total 4944815
                Systems Operations [1124979] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (22.75%)
                     Uncategorized [478736] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (9.68%)
                   Instant Message [437887] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (8.86%)
         General Social Networking [404389] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (8.18%)
      General Software Development [338240] ∎∎∎∎∎∎∎∎∎∎∎∎∎ (6.84%)
                             Email [313121] ∎∎∎∎∎∎∎∎∎∎∎∎ (6.33%)
           Professional Networking [291506] ∎∎∎∎∎∎∎∎∎∎∎ (5.90%)
                            Search [205358] ∎∎∎∎∎∎∎∎ (4.15%)
                 General Utilities [129091] ∎∎∎∎∎ (2.61%)
            General News &amp;amp; Opinion [114753] ∎∎∎∎ (2.32%)
                             Video [109229] ∎∎∎∎ (2.21%)
                      Presentation [104857] ∎∎∎∎ (2.12%)
                          Browsers [ 99340] ∎∎∎∎ (2.01%)
                 Design &amp;amp; Planning [ 93210] ∎∎∎ (1.89%)
      General Reference &amp;amp; Learning [ 79305] ∎∎∎ (1.60%)
          Data Modeling &amp;amp; Analysis [ 74543] ∎∎∎ (1.51%)
                         Calendars [ 68191] ∎∎ (1.38%)
                  General Business [ 60699] ∎∎ (1.23%)
          Engineering &amp;amp; Technology [ 57673] ∎∎ (1.17%)
                  General Shopping [ 57642] ∎∎ (1.17%)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;응? Systems Operation이라는게 대체 뭐길래 이렇게 빈도가 높지?!&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat rescuetime.csv | grep Systems | head
2016-05-01T00:00:00,1,1,SecurityAgent,Systems Operations,2
2016-05-01T01:00:00,306,1,Terminal,Systems Operations,2
2016-05-01T02:00:00,48,1,Terminal,Systems Operations,2
2016-05-01T20:00:00,6,1,Terminal,Systems Operations,2
2016-05-01T21:00:00,2,1,Terminal,Systems Operations,2
2016-05-01T22:00:00,9,1,Terminal,Systems Operations,2
2016-05-01T23:00:00,4,1,Terminal,Systems Operations,2
2016-05-02T01:00:00,10,1,Terminal,Systems Operations,2
2016-05-02T12:00:00,135,1,Terminal,Systems Operations,2
2016-05-02T13:00:00,99,1,Terminal,Systems Operations,2

$ cat rescuetime.csv | grep Uncategorized | head
2016-05-01T00:00:00,4,1,slownews.kr,Uncategorized,0
2016-05-01T00:00:00,4,1,matt-welsh.blogspot.kr,Uncategorized,0
2016-05-01T00:00:00,1,1,nlpers.blogspot.kr,Uncategorized,0
2016-05-01T01:00:00,795,1,***.**.**.186:8000,Uncategorized,0
2016-05-01T01:00:00,36,1,wikidiff.com,Uncategorized,0
2016-05-01T01:00:00,1,1,matt-welsh.blogspot.kr,Uncategorized,0
2016-05-01T02:00:00,147,1,***.**.**.186:8000,Uncategorized,0
2016-05-01T19:00:00,28,1,data-8.appspot.com,Uncategorized,0
2016-05-01T19:00:00,16,1,***.**.**.186:8000,Uncategorized,0
2016-05-01T19:00:00,3,1,ric.co.jp,Uncategorized,0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;하하. 알고보니까 터미널이었다.
Uncategorized는 말 그대로 분류되지 않은 각종 웹사이트들이었다.
이쯤되니 터미널을 사용하고 있던 시간에 대해 좀 더 들여다보고 싶어졌다.
일단 월별로 사용량을 뽑아봤다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat rescuetime.csv | grep Terminal | csvcut -c 1,2 | sed 's/-[0-9]*T[0-9:]*//; s/,/ /' | tail -n +2 | bar_chart.py -A
# each ∎ represents a count of 4276. total 1099255
2016-05 [ 50298] ∎∎∎∎∎∎∎∎∎∎∎
2016-06 [150071] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-07 [ 14274] ∎∎∎
2016-08 [    10]
2016-09 [134475] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-10 [257665] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-11 [180361] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-12 [312101] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;논문 작업을 하던 5, 6월에 비해, 취직을 한 후 10-12월에 프로그래밍 시간이 확 늘었다.
태국에 있던 8월은… 하하. 일을 하나도 안했다니. 내 자신이 대견하게 느껴진 순간이었다.&lt;/p&gt;

&lt;p&gt;그렇다면 터미널을 사용했던 시간대는 어떻게 될까?
주로 10시부터 18시까지 열심히 일했다.
그리고 흠, 밤샜던 날은 내 생각만큼 그리 많지 않았다는 것을 알게 되었다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 다음은 누적 시간이 아니라 단순 빈도이다.
$ cat rescuetime.csv | grep Terminal | csvcut -c 1,2 | cut -d 'T' -f 2 | cut -d ':' -f 1 | bar_chart.py
# each ∎ represents a count of 2. total 1400
00 [    53] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
01 [    37] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
02 [    31] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
03 [    18] ∎∎∎∎∎∎∎∎∎
04 [     9] ∎∎∎∎
05 [    13] ∎∎∎∎∎∎
06 [    14] ∎∎∎∎∎∎∎
07 [    12] ∎∎∎∎∎∎
08 [    28] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
09 [    48] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
10 [    70] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
11 [    84] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
12 [    74] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
13 [    88] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
14 [    92] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
15 [   103] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
16 [   101] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
17 [   101] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
18 [    93] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
19 [    71] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
20 [    68] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
21 [    63] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
22 [    63] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
23 [    66] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;한편, 좋은 데이터 분석가는 drill down을 해서 trivial하지 않은 패턴도 찾을 수 있어야 한다는 평소에 철학에 따라,
논문을 한창 쓰던 6월의 데이터만 뽑아보았다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat rescuetime.csv | grep 2016-06 | grep Terminal | csvcut -c 1,2 | cut -d 'T' -f 2 | cut -d ':' -f 1 | bar_chart.py
# each ∎ represents a count of 1. total 269
00 [    11] ∎∎∎∎∎∎∎∎∎∎∎
01 [    10] ∎∎∎∎∎∎∎∎∎∎
02 [    14] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
03 [    11] ∎∎∎∎∎∎∎∎∎∎∎
04 [     7] ∎∎∎∎∎∎∎
05 [    10] ∎∎∎∎∎∎∎∎∎∎
06 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
07 [     9] ∎∎∎∎∎∎∎∎∎
08 [    11] ∎∎∎∎∎∎∎∎∎∎∎
09 [     7] ∎∎∎∎∎∎∎
10 [     9] ∎∎∎∎∎∎∎∎∎
11 [    10] ∎∎∎∎∎∎∎∎∎∎
12 [     8] ∎∎∎∎∎∎∎∎
13 [    11] ∎∎∎∎∎∎∎∎∎∎∎
14 [    13] ∎∎∎∎∎∎∎∎∎∎∎∎∎
15 [    14] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
16 [    14] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
17 [    14] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
18 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
19 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
20 [    14] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
21 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
22 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
23 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;맙소사…… 6월은 그야말로 밤낮이 없는 생활이었다!
(이러니 몸이 그 고생을 하지…)
12월만 뽑아보니 내가 바람직하다고 생각하는 형태의 아름다운 그래프가 나왔다.
역시 회사란 좋은 곳이라는 생각을 하며 감격했다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat rescuetime.csv | grep 2016-12 | grep Terminal | csvcut -c 1,2 | cut -d 'T' -f 2 | cut -d ':' -f 1 | bar_chart.py
# each ∎ represents a count of 1. total 277
00 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
01 [     6] ∎∎∎∎∎∎
02 [     3] ∎∎∎
03 [     1] ∎
08 [     1] ∎
09 [     5] ∎∎∎∎∎
10 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
11 [    19] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
12 [    17] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
13 [    18] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
14 [    22] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
15 [    25] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
16 [    22] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
17 [    22] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
18 [    22] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
19 [    18] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
20 [    13] ∎∎∎∎∎∎∎∎∎∎∎∎∎
21 [    16] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
22 [    12] ∎∎∎∎∎∎∎∎∎∎∎∎
23 [    11] ∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;사용 프로그램/웹사이트 빈도를 뽑아봐도 재밌는 결과를 얻을 수 있다.
여기서는 웹사이트를 제외하고 내가 사용한 프로그램만 뽑아봤다. (중간의 localhost는 노이즈.ㅎㅎ)&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvcut -c 2,4 rescuetime.csv | grep -v '.*\..*' | tail -n +2 | sed 's/,/ /' | bar_chart.py -avr -l 20
# each ∎ represents a count of 24991. total 2495991
                            Terminal [1099561] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
                               Gmail [197265] ∎∎∎∎∎∎∎
                                line [149113] ∎∎∎∎∎
                               slack [118028] ∎∎∎∎
                           works one [ 67718] ∎∎
                              Finder [ 64759] ∎∎
                           kakaotalk [ 63601] ∎∎
                              newtab [ 59474] ∎∎
                              iterm2 [ 51264] ∎∎
                microsoft powerpoint [ 50716] ∎∎
                      localhost:4000 [ 48183] ∎
                             Keynote [ 37378] ∎
                 Google Spreadsheets [ 34719] ∎
                       Google Chrome [ 34430] ∎
                              iTunes [ 28353] ∎
                    mendeley desktop [ 28108] ∎
                                skim [ 24422]
                         acrobat pro [ 21409]
                         loginwindow [ 19086]
     freechat for facebook messenger [ 17606]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;또, &lt;a href=&quot;https://www.diigo.com/premium/pricing_table_details&quot;&gt;diigo(Standard Premium $40/year)&lt;/a&gt;는 웹페이지 북마킹 로그를 기록해주고, 나중에 편리하게 검색할 수 있게 도와주는 서비스이다.
나는 올해 diigo를 통해 총 3,395개의 웹페이지를 북마킹했다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c &quot;created_at&quot; -r &quot;2016-*&quot; diigo.csv | wc -l
    3395
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;재밌게도 태국에 있던 8월에 북마킹을 가장 활발하게 했다고 데이터는 말하는데, 사실 이 데이터는 오해의 여지가 있다.
diigo premium 기능 중 Twitter favorite을 자동으로 diigo로 발행하게 하는 기능을 저 시기에 켰을 뿐이다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c &quot;created_at&quot; -r &quot;2016-*&quot; diigo.csv | csvcut -c &quot;created_at&quot; | tail -n +2 | cut -c 1-7 | bar_chart.py
# each ∎ represents a count of 6. total 1323
2016-01 [    69] ∎∎∎∎∎∎∎∎∎∎∎
2016-02 [    28] ∎∎∎∎
2016-03 [    39] ∎∎∎∎∎∎
2016-04 [    51] ∎∎∎∎∎∎∎∎
2016-05 [   103] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-06 [   160] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-07 [    93] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-08 [   388] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-09 [    99] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-10 [    89] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-11 [   155] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-12 [    49] ∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;그 기능을 오후 3시에 켰나보다. ㅋㅋ&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c &quot;created_at&quot; -r &quot;2016-*&quot; diigo.csv | csvcut -c &quot;created_at&quot; | cut -c 12-14 | awk -F ':' '{ans = ($1 + 9) % 24; print ans}' | bar_chart.py -n
# each ∎ represents a count of 5. total 1324
 0 [    53] ∎∎∎∎∎∎∎∎∎∎
 1 [    19] ∎∎∎
 2 [    35] ∎∎∎∎∎∎∎
 3 [     9] ∎
 4 [    10] ∎∎
 5 [     5] ∎
 6 [     9] ∎
 7 [     5] ∎
 8 [    17] ∎∎∎
 9 [    23] ∎∎∎∎
10 [    58] ∎∎∎∎∎∎∎∎∎∎∎
11 [    37] ∎∎∎∎∎∎∎
12 [    51] ∎∎∎∎∎∎∎∎∎∎
13 [    56] ∎∎∎∎∎∎∎∎∎∎∎
14 [    62] ∎∎∎∎∎∎∎∎∎∎∎∎
15 [   340] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
16 [   143] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
17 [    58] ∎∎∎∎∎∎∎∎∎∎∎
18 [    65] ∎∎∎∎∎∎∎∎∎∎∎∎∎
19 [    58] ∎∎∎∎∎∎∎∎∎∎∎
20 [    45] ∎∎∎∎∎∎∎∎∎
21 [    43] ∎∎∎∎∎∎∎∎
22 [    45] ∎∎∎∎∎∎∎∎∎
23 [    78] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;diigo에 북마킹할 때는 페이지의 태그를 자동 혹은 수동으로 달 수 있는데, 올해 내가 북마킹한 페이지의 태그의 빈도를 집계해보면 다음과 같다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c &quot;created_at&quot; -r &quot;2016-*&quot; diigo.csv | csvcut -c &quot;tags&quot; | grep -v &quot;no_tag&quot; | sed 's/&quot;//g' | awk '{print tolower($0)}' | sed $'s/,/\\\n/g' | bar_chart.py -vr | head
# each ∎ represents a count of 6. total 911
                    twitter [   308] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
                     pocket [    78] ∎∎∎∎∎∎∎∎∎∎∎∎∎
                     github [    66] ∎∎∎∎∎∎∎∎∎∎∎
                    s****** [    19] ∎∎∎
            quantified self [     9] ∎
                     nlproc [     8] ∎
                      naver [     7] ∎
                      zumba [     6] ∎
                   language [     5]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;생각보다 깃헙이 많이 북마킹 되어 있어서 놀랐다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c &quot;created_at&quot; -r &quot;2016-*&quot; diigo.csv | csvcut -c &quot;url&quot; | cut -d'/' -f3 | cut -d':' -f1 | sed 's/www.//' | bar_chart.py -vrp -l 20
# each ∎ represents a count of 2. total 1324
                          github.com [    82] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (6.19%)
                         twitter.com [    30] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (2.27%)
                    en.wikipedia.org [    24] ∎∎∎∎∎∎∎∎∎∎∎∎ (1.81%)
                      news.naver.com [    23] ∎∎∎∎∎∎∎∎∎∎∎ (1.74%)
                   stackoverflow.com [    20] ∎∎∎∎∎∎∎∎∎∎ (1.51%)
                                t.co [    18] ∎∎∎∎∎∎∎∎∎ (1.36%)
                        facebook.com [    18] ∎∎∎∎∎∎∎∎∎ (1.36%)
                           arxiv.org [    17] ∎∎∎∎∎∎∎∎ (1.28%)
                      blog.naver.com [    14] ∎∎∎∎∎∎∎ (1.06%)
                     gist.github.com [    13] ∎∎∎∎∎∎ (0.98%)
                         youtube.com [    12] ∎∎∎∎∎∎ (0.91%)
                           quora.com [    11] ∎∎∎∎∎ (0.83%)
                        brunch.co.kr [    11] ∎∎∎∎∎ (0.83%)
                         nytimes.com [    11] ∎∎∎∎∎ (0.83%)
                          medium.com [    11] ∎∎∎∎∎ (0.83%)
                  newspeppermint.com [    10] ∎∎∎∎∎ (0.76%)
                       37signals.com [    10] ∎∎∎∎∎ (0.76%)
                  m.signalvnoise.com [    10] ∎∎∎∎∎ (0.76%)
                      biz.chosun.com [     8] ∎∎∎∎ (0.60%)
                           namu.wiki [     8] ∎∎∎∎ (0.60%)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;online-activities&quot;&gt;Online activities&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://momentoapp.com&quot;&gt;Momento 앱(프리미엄 $3.99/year)&lt;/a&gt;은 내가 사용하는 각종 소셜 미디어 피드들을 모아주는 앱이다.
모멘토에서 데이터를 export하면 다음과 같은 형태의 텍스트파일이 생긴다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ head -n 20 momento.txt
24 December 2016
================

Activity Summary
Walking: 22 meters · 16 steps · 39secs · 1 calories
Feed: Moves (App)

23 December 2016
================

11:03 AM
Feed: Moves (App)
At: NAVER Green Factory (37.35938269183, 127.10492276417)

12:16 PM
Feed: Swarm (Lucy Park)
URL: Optional(&quot;https://foursquare.com/checkin/585c9723349355744eaa60fe&quot;)
At: StoveOn: 성남시 분당구 정자일로 55, 두산위브상가, Seongnam-si, Gyeonggi-do, South Korea (37.3567967964811, 127.105420551965)

1:08 PM
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;일단 모멘토 데이터에 있는 피드를 빈도별로 집계해보았다.
나는 페이스북을 비공개 모드로 놓고 일기장으로 사용한다.
그 사실을 반영한듯, 페이스북에 무려 1,462개의 피드가 있다고 나왔다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat momento.txt | grep  &quot;Feed: &quot; | sed 's/ (.*//; s/Feed: //' | bar_chart.py -vr
# each ∎ represents a count of 21. total 3279
 Facebook [  1462] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
    Moves [   911] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
    Swarm [   769] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  Twitter [    97] ∎∎∎∎
Goodreads [    20]
 Web Feed [    17]
     Uber [     2]
  YouTube [     1]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;확실히 예전에 비해 트위터 사용량은 크게 줄었다.
트위터에는 1년 간 97개의 트윗을 올렸는데, 심지어 그 중 32건은 리트윗이다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat momento.txt | grep &quot;^RT&quot; | wc -l
      32
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;페이스북 사용에 대해서 조금 더 관찰해보고 싶어졌다.
Momento로는 페이스북 파싱이 쉽지 않아서, 차라리 페이스북에서 직접 받은 데이터를 이용해보기로 했다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ egrep -o '&amp;lt;div class=&quot;meta&quot;&amp;gt;.*?UTC.*?&amp;lt;/div&amp;gt;' facebook/html/timeline.htm | grep '.*2016.*' |  perl -pe 's|&amp;lt;div class=&quot;meta&quot;&amp;gt;(.*) at (.*) UTC.*&amp;lt;/div&amp;gt;|\1|' | { while read line ; do date -j -f &quot;%A, %B %d, %Y&quot; +&quot;%Y-%m&quot; &quot;$line&quot; ; done } | bar_chart.py
# each ∎ represents a count of 4. total 1176
2016-01 [    57] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-02 [    43] ∎∎∎∎∎∎∎∎∎∎
2016-03 [    36] ∎∎∎∎∎∎∎∎∎
2016-04 [    61] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-05 [   125] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-06 [   260] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-07 [   181] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-08 [   118] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-09 [    90] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-10 [    76] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-11 [    63] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
2016-12 [    66] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;디펜스를 보았던 6월에 포스팅 수가 폭발했다.ㅋㅋㅋ
시간대는 제법 다양하게 분포되어 있었다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ egrep -o '&amp;lt;div class=&quot;meta&quot;&amp;gt;.*?UTC.*?&amp;lt;/div&amp;gt;' facebook/html/timeline.htm | grep '.*2016.*' | perl -pe 's|&amp;lt;div class=&quot;meta&quot;&amp;gt;.* at (.*) UTC.*&amp;lt;/div&amp;gt;|\1|' | awk -F ':' '{if ($2 ~ /pm/) { print$1+12 } else { print $1 }}' | bar_chart.py -n
# each ∎ represents a count of 2. total 1176
 1 [    53] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 2 [    40] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 3 [    15] ∎∎∎∎∎∎∎
 4 [    22] ∎∎∎∎∎∎∎∎∎∎∎
 5 [    25] ∎∎∎∎∎∎∎∎∎∎∎∎
 6 [    23] ∎∎∎∎∎∎∎∎∎∎∎
 7 [    24] ∎∎∎∎∎∎∎∎∎∎∎∎
 8 [    34] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 9 [    54] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
10 [    60] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
11 [    50] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
12 [    92] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
13 [    48] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
14 [    37] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
15 [    48] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
16 [    72] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
17 [    67] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
18 [    64] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
19 [    50] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
20 [    47] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
21 [    56] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
22 [    72] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
23 [    74] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
24 [    49] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;구글은 이메일, 검색어 등 나에 대한 재미있는 데이터를 아주 많이 가지고 있고,
나 또한 나의 데이터를 아주 편리하게 이용할 수 있게 도와준다.
올해 나는 구글을 통해 총 15,733번, 하루 평균 43번의 검색을 했다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat google/Takeout/Searches/2016-*.json | jq '.event[].query.query_text' | wc -l
   15733
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;그 중에서 검색어의 unigram만 뽑아보면 다음과 같다.
이 결과만 보면, 2016년은 파이썬과 함께했던 한 해인듯 하다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat google/Takeout/Searches/2016-*.json | jq '.event[].query.query_text' | sed 's/&quot;//g' | tr &quot; &quot; &quot;\n&quot; | bar_chart.py -vpr -l 20
# each ∎ represents a count of 18. total 51906
                                            to [   532] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (1.02%)
                                        python [   454] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (0.87%)
                                           not [   287] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (0.55%)
                                           mac [   286] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (0.55%)
                                            in [   266] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (0.51%)
                                            of [   258] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (0.50%)
                                           the [   239] ∎∎∎∎∎∎∎∎∎∎∎∎∎ (0.46%)
                                         spark [   231] ∎∎∎∎∎∎∎∎∎∎∎∎ (0.45%)
                                           for [   222] ∎∎∎∎∎∎∎∎∎∎∎∎ (0.43%)
                                       jupyter [   207] ∎∎∎∎∎∎∎∎∎∎∎ (0.40%)
                                           and [   188] ∎∎∎∎∎∎∎∎∎∎ (0.36%)
                                        pandas [   174] ∎∎∎∎∎∎∎∎∎ (0.34%)
                                            is [   170] ∎∎∎∎∎∎∎∎∎ (0.33%)
                                         flask [   167] ∎∎∎∎∎∎∎∎∎ (0.32%)
                                             a [   165] ∎∎∎∎∎∎∎∎∎ (0.32%)
                                            -&amp;gt; [   160] ∎∎∎∎∎∎∎∎ (0.31%)
                                          ipad [   156] ∎∎∎∎∎∎∎∎ (0.30%)
                                          file [   155] ∎∎∎∎∎∎∎∎ (0.30%)
                                          with [   148] ∎∎∎∎∎∎∎∎ (0.29%)
                                       install [   139] ∎∎∎∎∎∎∎ (0.27%)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;offline-activities&quot;&gt;Offline activities&lt;/h4&gt;

&lt;p&gt;나는 &lt;a href=&quot;https://www.swarmapp.com/&quot;&gt;Swarm(구 Foursquare)&lt;/a&gt;을 여전히 사용하는, 세상에 많지 않는 사람 중 한 명이다.
Momento 앱이 Swarm의 데이터도 가져가기 때문에, 내가 올해는 어떤 곳에 많이 방문했는지 쉽게 확인해볼 수 있었다. &lt;sup id=&quot;fnref:13&quot;&gt;&lt;a href=&quot;#fn:13&quot; class=&quot;footnote&quot;&gt;12&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat momento.txt | grep -A 2 Swarm | grep At | cut -d &quot;:&quot; -f 2 | bar_chart.py -vr -l 20
# each ∎ represents a count of 2. total 769
                               FITNESS FM 낙성대점 [    41] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
                               서울대학교 공대폭포 [    23] ∎∎∎∎∎∎∎∎∎∎∎
           NAVER Green Factory (네이버 그린팩토리) [    17] ∎∎∎∎∎∎∎∎
                                     Bayview Lodge [    12] ∎∎∎∎∎∎
                        Tesco Lotus (เทสโก้ โลตัส) [    11] ∎∎∎∎∎
                       COSTCO WHOLESALE (코스트코) [     9] ∎∎∎∎
                            카페 몽실 Cafe Mongsil [     9] ∎∎∎∎
                                      이진내과의원 [     8] ∎∎∎∎
                                          꼬박꼬박 [     8] ∎∎∎∎
                             메리츠타워 아워홈식당 [     7] ∎∎∎
                                        TOZ (토즈) [     7] ∎∎∎
                                 본플러스 분당병원 [     6] ∎∎∎
                                 Cookie Restaurant [     6] ∎∎∎
               보라매병원 / Boramae Medical Center [     6] ∎∎∎
                    Jean Boulangerie (쟝 블랑제리) [     6] ∎∎∎
                                      혼자 노는 양 [     5] ∎∎
                                    emart (이마트) [     5] ∎∎
                                      coffee@works [     5] ∎∎
                                        아라쭈꾸미 [     5] ∎∎
                               서울대학교 학생회관 [     5] ∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;위 목록에 있는 &lt;a href=&quot;https://www.airbnb.com/rooms/773361&quot;&gt;Bayview Lodge&lt;/a&gt;는 푸켓에 있을 때 한 달 간 머물렀던 숙소이다.
도심과 약간 떨어진 Chalong에 위치해 있고, 귀여운 골든 리트리버가 두 마리가 살고 있으며 아주 끝내주는 뷰를 자랑한다.
혹시 푸켓을 일주일 이상 방문하게 되는 사람이 있다면 적극적으로 추천할 수 있을 것 같다.
또, 카페 몽실은 논문 쓰는 동안 자주 갔던 아주 포근한 북카페였는데, 아쉽게도 올해 8월에 문을 닫았다.&lt;/p&gt;

&lt;p&gt;다음은 체크인 시간이다.
12시에 체크인이 잔뜩 몰려있는 것을 보니, 체크인 시간이 제대로 기록되지 않고 default값으로 fallback한게 아닌가 의심이 된다.
데이터를 열어서 확인해봐야할 것 같다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat momento.txt | grep -B 1 Swarm | grep &quot;AM\|PM&quot; | awk -F ':' '{if ($2 ~ /PM/) { print $1+12 } else { print $1 }}' | bar_chart.py -n
# each ∎ represents a count of 1. total 637
 1 [     6] ∎∎∎∎∎∎
 2 [     1] ∎
 3 [     3] ∎∎∎
 4 [     1] ∎
 5 [     4] ∎∎∎∎
 6 [     2] ∎∎
 7 [     5] ∎∎∎∎∎
 8 [    14] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 9 [     9] ∎∎∎∎∎∎∎∎∎
10 [    17] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
11 [    29] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
12 [     9] ∎∎∎∎∎∎∎∎∎
13 [    60] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
14 [    41] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
15 [    29] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
16 [    34] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
17 [    48] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
18 [    65] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
19 [    60] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
20 [    52] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
21 [    38] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
22 [    27] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
23 [     9] ∎∎∎∎∎∎∎∎∎
24 [    74] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Momento에는 Moves 앱의 데이터도 들어가 있어서, 내가 매일 얼마나 걸었는지 확인할 수 있다. &lt;sup id=&quot;fnref:11&quot;&gt;&lt;a href=&quot;#fn:11&quot; class=&quot;footnote&quot;&gt;13&lt;/a&gt;&lt;/sup&gt; &lt;sup id=&quot;fnref:12&quot;&gt;&lt;a href=&quot;#fn:12&quot; class=&quot;footnote&quot;&gt;14&lt;/a&gt;&lt;/sup&gt;
다음은 step 수 기준의 히스토그램이다.
나는 평균적으로 매일 약 4,600 걸음을 걸었는데, 내년에는 조금 더 걸을 수 있도록 해봐야겠다.
제일 많이 걸은 날은 약 26,000 걸음을 걸었다.
난 그 날을 정확히 기억한다. 교토에서 미숙이와 한밤중에 한참을 걸으며 수다 떨던, 바로 그 날이다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat momento.txt | grep Walking | cut -d '·' -f 2 | sed 's/,//g; s/steps//' | histogram.py
# NumSamples = 168; Min = 0.00; Max = 26117.00
# Mean = 4608.869048; Variance = 11118671.899518; SD = 3334.467259; Median 4317.500000
# each ∎ represents a count of 1
    0.0000 -  2611.7000 [    44]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 2611.7000 -  5223.4000 [    64]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 5223.4000 -  7835.1000 [    44]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 7835.1000 - 10446.8000 [     7]: ∎∎∎∎∎∎∎
10446.8000 - 13058.5000 [     5]: ∎∎∎∎∎
13058.5000 - 15670.2000 [     2]: ∎∎
15670.2000 - 18281.9000 [     1]: ∎
18281.9000 - 20893.6000 [     0]:
20893.6000 - 23505.3000 [     0]:
23505.3000 - 26117.0000 [     1]: ∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;올해의-things&quot;&gt;올해의 Things&lt;/h3&gt;

&lt;h4 id=&quot;올해의-책-algorithms-to-live-by&quot;&gt;올해의 책: “Algorithms to Live By”&lt;/h4&gt;

&lt;p&gt;올해는 책을 많이 읽지는 못했다.
읽기 시작한 책은 총 20권, 끝낸 책이 총 13권이다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvcut -c &quot;Title,My Rating,Date Read&quot; goodreads.csv | csvgrep -c &quot;Date Read&quot; -r &quot;2016-*&quot; | csvsort -r -c &quot;Date Read&quot; | csvlook
| Title                                                                                     | My Rating |  Date Read |
| ----------------------------------------------------------------------------------------- | --------- | ---------- |
| The Conquest of Happiness                                                                 |         4 | 2016-12-16 |
| 만화로 배우는 프레젠테이션: 그림 속에 숨겨진 제안의 기술 20                               |         3 | 2016-11-23 |
| Heads Up Philosophy                                                                       |         2 | 2016-10-24 |
| 음식의 언어: 세상에서 가장 맛있는 인문학                                                  |         4 | 2016-10-24 |
| Algorithms to Live By: The Computer Science of Human Decisions                            |         5 | 2016-08-18 |
| The Harvard Medical School Guide to a Good Night's Sleep (Harvard Medical School Guides)  |         5 | 2016-07-03 |
| 익숙한 새벽 세시                                                                          |         3 | 2016-06-15 |
| Stretching Anatomy: Your Illustrated Guide to Improving Flexibility and Muscular Strength |         3 | 2016-05-23 |
| Data Science from Scratch: First Principles with Python                                   |         5 | 2016-05-22 |
| Probabilistic Programming &amp;amp; Bayesian Methods for Hackers                                  |         3 | 2016-03-03 |
| 삶의 한가운데                                                                             |         5 | 2016-01-29 |
| 요리는 화학이다                                                                           |         2 | 2016-01-21 |
| 하노버에서 온 음악편지                                                                    |         4 | 2016-01-18 |
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;그 중에서 가장 즐겁고 재미있게 읽은 책은 &lt;a href=&quot;https://www.goodreads.com/book/show/25666050-algorithms-to-live-by&quot;&gt;Algorithms to Live By&lt;/a&gt;로,
무려 &lt;a href=&quot;http://cocosci.berkeley.edu/tom/&quot;&gt;Tom Griffiths&lt;/a&gt;가 공동저자이다.
너무 즐겁게 읽어서 주변의 소중한 두어명에게도 선물해줬다.&lt;/p&gt;

&lt;p&gt;책에 준 평점 분포는 다음과 같다.
책을 많이 읽지는 않았지만, 좋은 책을 많이 알게 된 것 같아 기쁘다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c &quot;Date Read&quot; -r &quot;2016-*&quot; goodreads.csv | csvcut -c &quot;My Rating&quot; | tail -n +2 | bar_chart.py -n
# each ∎ represents a count of 1. total 13
2 [     2] ∎∎
3 [     4] ∎∎∎∎
4 [     3] ∎∎∎
5 [     4] ∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;올해의-음악-chopin-polonaise-in-a-flat-major-op53-played-by-sungjin-cho&quot;&gt;올해의 음악: “Chopin Polonaise in A flat major Op.53 (played by Sungjin Cho)”&lt;/h4&gt;

&lt;p&gt;(로깅이 제대로 되는지 조금 의심스러운) Last.fm에 따르면 나는 올해 음악을 8,982번 들었다.
하루에 평균적으로 24곡을 들었다는 말인데, 내 예상보다는 훨씬 적은 수이다.
생각해보면 요즘 음악을 많이 안듣기는 했다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c 4 -r &quot;.*2016.*&quot; lastfm.csv  | wc -l
    8982
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;음악은 주로 디펜스가 있던 6월에 많이 들었다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvcut -c 4 lastfm.csv | grep &quot;.*2016.*&quot; | cut -d &quot; &quot; -f 2 | bar_chart.py -vr
# each ∎ represents a count of 38. total 8980
Jun [  2926] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
Nov [  1329] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
Apr [  1125] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
Dec [   855] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
Oct [   732] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
Mar [   708] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
Feb [   507] ∎∎∎∎∎∎∎∎∎∎∎∎∎
Jan [   437] ∎∎∎∎∎∎∎∎∎∎∎
May [   336] ∎∎∎∎∎∎∎∎
Jul [    17]
Aug [     8]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;당연히 낮에 음악을 많이 들었겠지만, 분포를 보면 새벽에도 음악을 꽤 많이 들었다.
역시 새벽은 작업 환경이 좋은가보다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvcut -c 4 lastfm.csv | grep &quot;.*2016.*&quot; | cut -d &quot; &quot; -f 4 | awk -F ':' '{ print ($1 + 9) % 24; }' | bar_chart.py -n
# each ∎ represents a count of 8. total 8981
 0 [   303] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 1 [   444] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 2 [   374] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 3 [   269] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 4 [   260] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 5 [   210] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 6 [   171] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 7 [   294] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 8 [   231] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 9 [   237] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
10 [   262] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
11 [   318] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
12 [   257] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
13 [   498] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
14 [   402] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
15 [   520] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
16 [   542] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
17 [   576] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
18 [   566] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
19 [   491] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
20 [   486] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
21 [   475] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
22 [   411] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
23 [   384] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;올해의 키워드를 꼽으라고 한다면, “줌바”도 아마 포함될 것이다.
가장 많이 들은 음악 1위는 줌바 노래이다.
그 다음에 따라오는 곡들은, 평소에 무한반복하면서 듣는 곡들이다.
매년 꽤 크게 양상이 달라지는 것 같다.
순위권에도 못들었지만, 올해의 음악은
좋은 노동요가 되어준
&lt;a href=&quot;https://www.youtube.com/watch?v=d3IKMiv8AHw&quot;&gt;조성진 님이 연주한 쇼팽의 폴로네즈 A 플랫 장조 Op.53&lt;/a&gt;로 하고 싶다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c 4 -r &quot;.*2016.*&quot; lastfm.csv | csvcut -c 3 | bar_chart.py -vrp -l 10
# each ∎ represents a count of 13. total 8982
                                 Love Me Like You [   378] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (4.21%)
           Symphonic Etudes Op. 13 - Variation II [   349] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (3.89%)
                                 Pure Imagination [   123] ∎∎∎∎∎∎∎∎∎ (1.37%)
                                        넌 행복해 [   116] ∎∎∎∎∎∎∎∎ (1.29%)
                                Be Still My Heart [   107] ∎∎∎∎∎∎∎∎ (1.19%)
                                       Inevitable [   102] ∎∎∎∎∎∎∎ (1.14%)
                                            父_子 [   102] ∎∎∎∎∎∎∎ (1.14%)
Chopin : 24 Pre`ludes Op.28 - In C Major (쇼팽 :  [    93] ∎∎∎∎∎∎∎ (1.04%)
                  Burnitup! (feat. Missy Elliott) [    89] ∎∎∎∎∎∎ (0.99%)
                 Esta Noche Quiero Más - Merengue [    62] ∎∎∎∎ (0.69%)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;최빈도 음악가를 뽑아보면, 곡과는 조금 다른 느낌이다.
앨범 단위로 듣는 음악의 아티스트들이 주로 포진해있다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvgrep -c 4 -r &quot;.*2016.*&quot; lastfm.csv | csvcut -c 1 | bar_chart.py -vrp -l 10
# each ∎ represents a count of 21. total 8982
                                    Evgeny Kissin [   608] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (6.77%)
                                     Ivan Moravec [   389] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (4.33%)
                                           박주원 [   386] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (4.30%)
                                       Little Mix [   378] ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (4.21%)
                                            ZUMBA [   267] ∎∎∎∎∎∎∎∎∎∎∎∎ (2.97%)
                                           조성진 [   263] ∎∎∎∎∎∎∎∎∎∎∎∎ (2.93%)
                                           주걸륜 [   241] ∎∎∎∎∎∎∎∎∎∎∎ (2.68%)
                                Arthur Rubinstein [   240] ∎∎∎∎∎∎∎∎∎∎∎ (2.67%)
                               Sviatoslav Richter [   228] ∎∎∎∎∎∎∎∎∎∎ (2.54%)
                                           김동률 [   215] ∎∎∎∎∎∎∎∎∎∎ (2.39%)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;올해의-영화-none&quot;&gt;올해의 영화: None&lt;/h4&gt;

&lt;p&gt;영화는 크리스마스 때까지 총 66편을 봤다.
(아래에는 67이라고 나오는데, 파일이 헤더를 포함하고 있어서 총 66편이다.)&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ wc -l imdb.csv
      67 imdb.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;본 영화의 수보다 더 관심이 가는 것은 평점 분포이다.
스스로 5.5점을 기준으로 좋고 나쁨을 평가해서 “진정한 리커트 스케일”을 사용해보려고 했는데,
분포가 제법 그럴듯하게 나와서 뿌듯하다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ csvcut -c &quot;You rated&quot; imdb.csv | tail -n +2 | bar_chart.py -n
# each ∎ represents a count of 1. total 66
 1 [     3] ∎∎∎
 2 [     7] ∎∎∎∎∎∎∎
 3 [     7] ∎∎∎∎∎∎∎
 4 [     4] ∎∎∎∎
 5 [     4] ∎∎∎∎
 6 [    13] ∎∎∎∎∎∎∎∎∎∎∎∎∎
 7 [     8] ∎∎∎∎∎∎∎∎
 8 [     9] ∎∎∎∎∎∎∎∎∎
 9 [     7] ∎∎∎∎∎∎∎
10 [     4] ∎∎∎∎
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;10점짜리 영화가 4편이나 되지만, 사실 다 예전에 봤던 영화를 다시 본 것들이어서 아쉽게도 올해의 영화는 딱히 없다고 해야할 것 같다.&lt;/p&gt;

&lt;h4 id=&quot;올해의-장난감-애플펜슬&quot;&gt;올해의 장난감: “애플펜슬”&lt;/h4&gt;

&lt;p&gt;올해도 재미있는 장난감을 많이 샀는데,
그 중에서 가장 유용하게 사용하고 있는 것은 5월에 구매한 애플펜슬이다. (아이패드는 거들 뿐…)
애플펜슬 덕분에 많은 자료를 전산화할 수 있었고, 책장도 무척 가벼워졌다.
&lt;a href=&quot;http://pdfexpert.com&quot;&gt;PDF Expert ($9.99)&lt;/a&gt; 덕분에 논문 annotation도 꽤 편리하게 하고 있다.&lt;/p&gt;

&lt;div class=&quot;center image&quot;&gt;
    &lt;img src=&quot;/images/2016-12-31-pebble-1.png&quot; height=&quot;250px&quot; /&gt;
    &lt;img src=&quot;/images/2016-12-31-pebble-2.png&quot; height=&quot;250px&quot; /&gt;
    &lt;figcaption itemprop=&quot;name&quot;&gt;유용한 페블 타임 라운드. 페블은 (아쉽게도) 최근 Fitbit에 인수되었다.&lt;/figcaption&gt;
&lt;/div&gt;

&lt;p&gt;그 외에도 5월에는
&lt;a href=&quot;https://www.pebble.com/pebble-time-round-smartwatch-features&quot;&gt;페블 타임 라운드 ($149)&lt;/a&gt;,
&lt;a href=&quot;http://www.mi.com/en/air2/&quot;&gt;샤오미 미에어 2 ($133)&lt;/a&gt;와,
여차저차해서 결과적으로 환불하게 된 &lt;a href=&quot;https://www.23andme.com/&quot;&gt;23andme ($149/kit)&lt;/a&gt; 3세트를 구매했다.
7월에는 &lt;a href=&quot;https://gopro.com/&quot;&gt;고프로&lt;/a&gt;와 &lt;a href=&quot;http://getnarrative.com/&quot;&gt;내러티브 2.0 ($199)&lt;/a&gt;,
11월에는 &lt;a href=&quot;http://spire.io&quot;&gt;Spire ($199.95/2 kits)&lt;/a&gt;를 구매하고, 1년 전쯤(?) 구매한 &lt;a href=&quot;https://lumoshelmet.co/&quot;&gt;루모스 자전거 헬멧 ($114)&lt;/a&gt;이 드디어 도착했다.
12월에는 &lt;a href=&quot;http://shopping.naver.com/detail/detail.nhn?cat_id=50002540&amp;amp;frm=NVSCPRO&amp;amp;nv_mid=9354379320&quot;&gt;대우 DEH-C450 에어미스트 가습기 (45,000원)&lt;/a&gt;,
&lt;a href=&quot;http://shopping.naver.com/detail/detail.nhn?nv_mid=10603364325&amp;amp;cat_id=50002350&quot;&gt;Black and Decker CS1820T (195,000원)&lt;/a&gt;과,
아직 도착하지 않은 &lt;a href=&quot;http://hello.is&quot;&gt;Sense with Voice ($149)&lt;/a&gt;를 구매했다.&lt;/p&gt;

&lt;p&gt;난 샤넬백이 필요없으니까. ㅋㅋ&lt;/p&gt;

&lt;h4 id=&quot;올해의-기타등등&quot;&gt;올해의 기타등등&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;올해의 맥OS 앱: &lt;a href=&quot;https://pilotmoon.com/dwellclick/&quot;&gt;Dwellclick ($10.99)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;올해의 편의점 도시락: GS25 별미밥상 닭가슴살 도시락 (3,800원)&lt;/li&gt;
  &lt;li&gt;올해의 행복했던 순간: 4월 29일, 동물원, 첫 봄 나들이&lt;/li&gt;
  &lt;li&gt;올해의 카페: 카페 몽실&lt;/li&gt;
  &lt;li&gt;올해의 맥주: &lt;a href=&quot;https://www.beeradvocate.com/beer/profile/39/131/&quot;&gt;Ayinger Celebrator&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;올해의 온라인 쇼핑몰: 쿠팡 (쿠팡페이, 정기배송 최고!)&lt;/li&gt;
  &lt;li&gt;올해의 잘한 짓: 연구노트 작성하기&lt;/li&gt;
  &lt;li&gt;올해의 소비: &lt;a href=&quot;https://twitter.com/echojuliett/status/752737508820082688&quot;&gt;Amazon Drive ($59.99/year)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2017년은&quot;&gt;2017년은?&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;알고리즘 공부를 해서 기본기를 다져야겠다.&lt;/li&gt;
  &lt;li&gt;중고서점에 CD, 책을 다 팔고, 자료를 최대한 전산화 해야겠다.&lt;/li&gt;
  &lt;li&gt;많이 걷고, 꾸준한 코어 운동을 해야겠다. 플랭크!&lt;/li&gt;
  &lt;li&gt;사실 2016년의 다짐은 “다른 사람에게 부탁 잘하기”였는데, 결과적으로 잘 지키지는 못했다. 다시 2017년의 다짐으로 defer해야겠다.&lt;/li&gt;
  &lt;li&gt;데이터를 통해 보는 나의 일년, 재밌었다. 내년에는 Spire (긴장상태), Sense (수면), 브로콜리 (expenses)를 통해 좀 더 데이터를 잘 쌓아보고 싶다. 내년도 올해와 같이 phase가 명확히 나뉜다면, phase별 비교를 해보는 것도 재밌을 것이다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;데이터에서 잘 드러나지는 않았지만, 개인적으로 올해는 심리적인 안정기였다.
이제 제법 평정을 찾았으니, 2017년에는 주변 사람들의 행복을 더욱 챙기는 한 해로 만들어야겠다는 생각을 해본다. 2017년의 키워드는, 다시 한 번 “사람”이다.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;심지어 2015년 말에는 회고글을 써놓고도 출판할 시간이 없을 정도로 정신이 없었다!&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:7&quot;&gt;
      &lt;p&gt;맥용 뽀모도로 클라언트로는 &lt;a href=&quot;https://heyfocus.com/&quot;&gt;Focus App ($19.99)&lt;/a&gt; 추천.&amp;nbsp;&lt;a href=&quot;#fnref:7&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:6&quot;&gt;
      &lt;p&gt;OITNB을 보며 Laura Prepon의 당찬 모습에 반해 덕질도 좀 하고… &lt;!-- https://www.facebook.com/echojuliett/posts/10208577710784057 --&gt;&amp;nbsp;&lt;a href=&quot;#fnref:6&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:8&quot;&gt;
      &lt;p&gt;이 때문에 5월 말쯤 Mi Air 2(약 $120)를 사기도 했는데, 4월 초에 진작 샀으면 더 도움이 되지 않았을까 싶기도 한다. 기침은 결국 8월 말까지 이어졌다.&amp;nbsp;&lt;a href=&quot;#fnref:8&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:14&quot;&gt;
      &lt;p&gt;조나단은 Yamaha Vino 50cc 스쿠터로, 교내에서 발이 되어주었다.&amp;nbsp;&lt;a href=&quot;#fnref:14&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;분석을 Mac OSX에서 진행했기 때문에, 몇몇 명령은 리눅스와 약간 상이하다.&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://github.com/bitly/data_hacks&quot;&gt;bit.ly의 data_hacks&lt;/a&gt;를 forking해서 CJK formatting, line number option 추가, float support 등의 기능을 추가했다. 이 도구는 &lt;a href=&quot;http://twitter.com/shurain&quot;&gt;@shurain&lt;/a&gt; 덕분에 알게 되었으며, CJK formatting 역시 그의 contribution이다. 이 도구를 알게 되기 전까지 나는 개인적으로 lucy’s utils라는 뜻을 가진 도구 모음인 “lutils”를 만들어 쓰고 있었는데, 아… 이게 piping을 지원해주니 훨씬 편하다. ㅋㅋㅋ&amp;nbsp;&lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:5&quot;&gt;
      &lt;p&gt;csvkit은 data_hacks와 마찬가지로 CJK formatting 문제가 있다. Dependency인 agate를 &lt;a href=&quot;https://github.com/e9t/agate&quot;&gt;CJK formatting이 지원되는 버젼&lt;/a&gt;으로 설치해서 사용하면 한글도 이쁘게 정렬시켜서 출력할 수 있다.&amp;nbsp;&lt;a href=&quot;#fnref:5&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;cf. &lt;a href=&quot;http://datascienceatthecommandline.com/&quot;&gt;http://datascienceatthecommandline.com/&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:9&quot;&gt;
      &lt;p&gt;1Password, Apple Health 데이터는 시간 부족으로 이번에는 활용하지 못했다.&amp;nbsp;&lt;a href=&quot;#fnref:9&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:10&quot;&gt;
      &lt;p&gt;그 전까지는 &lt;a href=&quot;http://desktimeapp.com&quot;&gt;Desktime&lt;/a&gt;을 썼다.&amp;nbsp;&lt;a href=&quot;#fnref:10&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:13&quot;&gt;
      &lt;p&gt;개인적인 습관상 학교, 집, 직장에는 체크인하지 않는다.&amp;nbsp;&lt;a href=&quot;#fnref:13&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:11&quot;&gt;
      &lt;p&gt;Moves는 7월부터 사용했기 때문에 올해 상반기의 데이터가 없는 것이 아쉽다.&amp;nbsp;&lt;a href=&quot;#fnref:11&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:12&quot;&gt;
      &lt;p&gt;Moves 앱을 이용한 시각화 중에는 &lt;a href=&quot;https://github.com/hyeshik/moves-daily-life&quot;&gt;혜식님의 것&lt;/a&gt;을 가장 좋아한다.&amp;nbsp;&lt;a href=&quot;#fnref:12&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Sat, 31 Dec 2016 23:27:00 -0800</pubDate>
        <link>http://www.lucypark.kr/blog/2016/12/31/2016-zeitgeist/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2016/12/31/2016-zeitgeist/</guid>
        
        <category>year end</category>
        
        <category>quantified self</category>
        
        
      </item>
    
      <item>
        <title>BLAS/LAPACK benchmarks with NumPy, SciPy and Theano</title>
        <description>&lt;p&gt;최근 컴퓨터를 한 대 새로 구입한 기념으로 가지고 있는 머신 몇 대에 BLAS/LAPACK benchmark를 해봤다.&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;a href=&quot;http://www.netlib.org/blas/&quot;&gt;&lt;strong&gt;BLAS(Basic Linear Algebra Subprograms)&lt;/strong&gt;&lt;/a&gt;란
벡터 및 행렬 연산을 관장하는 스펙이며
GNU Octave&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;,
Mathematica, NumPy, R,
그리고 아래의 LAPACK
등 다양한 소프트웨어에 사용된다.
BLAS를 잘 설정하고 다루면 같은 코드를 돌리더라도 몇 배에 달하는 속도 향상을 이룰 수 있기 때문에
잘 이해하고 있으면 좋다.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;BLAS는 다음의 3가지 레벨로 구성되어 있다 (괄호 안 숫자는 발표 연도) &lt;sup id=&quot;fnref:7&quot;&gt;&lt;a href=&quot;#fn:7&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Level 1 (1979): &lt;a href=&quot;https://github.com/xianyi/OpenBLAS/blob/develop/cblas.h#L55-L117&quot;&gt;scalar-vector and vector-vector operations&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;예를 들어 &lt;code class=&quot;highlighter-rouge&quot;&gt;daxpy&lt;/code&gt;는 말 그대로 “double precision scalar $a$ times vector $x$ plus vector $y$”를 수행한 후 $y$에 결과값을 대입한다&lt;/li&gt;
      &lt;li&gt;$\mathbf{y} \leftarrow a \mathbf{x} + \mathbf{y}$&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Level 2 (1988): &lt;a href=&quot;https://github.com/xianyi/OpenBLAS/blob/develop/cblas.h#L119-L244&quot;&gt;matrix-vector operations&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;예를 들어 &lt;code class=&quot;highlighter-rouge&quot;&gt;sgemv&lt;/code&gt;는 말 그대로 “single precision general matrix-vector product”를 계산한다&lt;/li&gt;
      &lt;li&gt;$\mathbf{y} \leftarrow a \mathbf{Ax} + b \mathbf{y}$&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Level 3 (1990): &lt;a href=&quot;https://github.com/xianyi/OpenBLAS/blob/develop/cblas.h#L246-L320&quot;&gt;matrix-matrix operations&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;예를 들어 &lt;code class=&quot;highlighter-rouge&quot;&gt;gemm&lt;/code&gt;은 “general matrix-matrix product”를 계산한다&lt;/li&gt;
      &lt;li&gt;$\mathbf{C} \leftarrow a \mathbf{AB} + b \mathbf{C}$&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BLAS의 구현체로는
NVIDIA의 CUDA용 &lt;a href=&quot;https://developer.nvidia.com/cublas&quot;&gt;cuBLAS&lt;/a&gt;,
AMD의 &lt;a href=&quot;http://developer.amd.com/tools-and-sdks/archive/amd-core-math-library-acml/&quot;&gt;ACML&lt;/a&gt;,
인텔의 &lt;a href=&quot;https://software.intel.com/en-us/intel-mkl&quot;&gt;MKL&lt;/a&gt;,
애플의 Accelerate Framework안에 포함된 &lt;a href=&quot;https://developer.apple.com/library/mac/documentation/Performance/Conceptual/vecLib/&quot;&gt;vecLib&lt;/a&gt;,
오픈소스인 &lt;a href=&quot;http://math-atlas.sourceforge.net/&quot;&gt;ATLAS&lt;/a&gt;,
그리고 아마 가장 범용적으로 쓰이는 오픈소스 &lt;a href=&quot;http://www.openblas.net/&quot;&gt;OpenBLAS&lt;/a&gt; 등이 있으며
&lt;a href=&quot;https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms#Implementations&quot;&gt;그 외에도 다양한 구현체가 있다&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;한편 &lt;a href=&quot;http://www.netlib.org/lapack/&quot;&gt;&lt;strong&gt;LAPACK(Linear Algebra PACKage)&lt;/strong&gt;&lt;/a&gt;은
least squares와 SVD(singular value decomposition) 등의 행렬 분해(matrix decomposition) 과정 이 구현 되어있는 스펙이며 2008년 FORTRAN 버젼이 공개되었다.
ATLAS와 OpenBLAS가 LAPACK의 일부를 구현하고 있고,
그 외에는 LAPACK++ 등의 구현체가 있다.&lt;sup id=&quot;fnref:6&quot;&gt;&lt;a href=&quot;#fn:6&quot; class=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h3 id=&quot;commands-used-for-benchmarks&quot;&gt;Commands used for benchmarks&lt;/h3&gt;

&lt;p&gt;다음은 성능 측정을 할 때 사용한 명령 목록이다 (Ubuntu 기준):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Switch BLAS: &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo update-alternatives --config libblas.so.3&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Switch LAPACK: &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo update-alternatives --config liblapack.so.3&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Check BLAS/LAPACK linkage with numpy: &lt;code class=&quot;highlighter-rouge&quot;&gt;python -c &quot;import numpy; numpy.__config__.show()&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;NumPy test (~30s &lt;sup id=&quot;fnref:5&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;): &lt;code class=&quot;highlighter-rouge&quot;&gt;python -c &quot;import numpy; numpy.test()&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;SciPy test (~1m &lt;sup id=&quot;fnref:5:1&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;): &lt;code class=&quot;highlighter-rouge&quot;&gt;python -c &quot;import scipy; scipy.test()&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Theano test (~30m &lt;sup id=&quot;fnref:5:2&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;): &lt;code class=&quot;highlighter-rouge&quot;&gt;python -c &quot;import theano; theano.test()&quot;&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;GPU: &lt;code class=&quot;highlighter-rouge&quot;&gt;THEANO_FLAGS=floatX=float32,device=gpu python -c &quot;import theano; theano.test()&quot;&lt;/code&gt; &lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;BLAS test: Theano 패키지에 포함된 다음 코드를 돌리면 그들의 머신에서 생성한 벤치마크가 나온다:&lt;/p&gt;

    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; python `python -c &quot;import os, theano; print os.path.dirname(theano.__file__)&quot;`/misc/check_blas.py
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Theano BLAS benchmarks:&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;2000x2000(M=N=K=2000)의 float64 행렬에 대해 &lt;code class=&quot;highlighter-rouge&quot;&gt;gemm&lt;/code&gt;을 10번 수행했다.
(All memory layout was in C order):&lt;/p&gt;

  &lt;p&gt;테스트용으로 사용된 CPU의 상세 스펙은 다음과 같고:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;Xeon E5345 (2.33Ghz, 8M L2 cache, 1333Mhz FSB)&lt;/li&gt;
    &lt;li&gt;Xeon E5430 (2.66Ghz, 12M L2 cache, 1333Mhz FSB)&lt;/li&gt;
    &lt;li&gt;Xeon E5450 (3Ghz, 12M L2 cache, 1333Mhz FSB)&lt;/li&gt;
    &lt;li&gt;Core 2 E8500 (2.8Ghz, hyper-threads enabled)&lt;/li&gt;
    &lt;li&gt;Core i7 930 (2.8Ghz, hyper-threads enabled)&lt;/li&gt;
    &lt;li&gt;Core i7 950 (3.07GHz, hyper-threads enabled)&lt;/li&gt;
    &lt;li&gt;Xeon X5560 (2.8Ghz, 12M L2 cache, hyper-threads?)&lt;/li&gt;
    &lt;li&gt;Xeon X5550 (2.67GHz, 8M l2 cache?, hyper-threads enabled)&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;라이브러리는 다음과 같을 때:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;numpy with ATLAS from distribution (FC9) package (1 thread)&lt;/li&gt;
    &lt;li&gt;manually compiled numpy and ATLAS with 2 threads&lt;/li&gt;
    &lt;li&gt;goto 1.26 with 1, 2, 4 and 8 threads&lt;/li&gt;
    &lt;li&gt;goto2 1.13 compiled with multiple threads enabled&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;각 CPU와 라이브러리에 대한 테스트 수행결과는 다음과 같다.
(라이브러리 이름 옆의 숫자는 사용된 thread의 수이다):&lt;/p&gt;

  &lt;table class=&quot;table table-striped table-condensed&quot;&gt;&lt;tr&gt;&lt;th&gt;CPU&lt;/th&gt;&lt;th&gt;Xeon E5345&lt;/th&gt;&lt;th&gt;Xeon E5430&lt;/th&gt;&lt;th&gt;Xeon E5450&lt;/th&gt;&lt;th&gt;Core 2 E8500&lt;/th&gt;&lt;th&gt;Core i7 930&lt;/th&gt;&lt;th&gt;Core i7 950&lt;/th&gt;&lt;th&gt;Xeon X5560&lt;/th&gt;&lt;th&gt;Xeon X5550&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;numpy 1.3.0 blas &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; 775.92s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;numpy_FC9_atlas/1&lt;/td&gt;&lt;td&gt;39.2s&lt;/td&gt;&lt;td&gt; 35.0s&lt;/td&gt;&lt;td&gt; 30.7s&lt;/td&gt;&lt;td&gt;29.6s&lt;/td&gt;&lt;td&gt;21.5s&lt;/td&gt;&lt;td&gt;19.60s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;numpy_MAN_atlas/2&lt;/td&gt;&lt;td&gt;12.0s&lt;/td&gt;&lt;td&gt; 11.6s&lt;/td&gt;&lt;td&gt; 10.2s&lt;/td&gt;&lt;td&gt; 9.2s&lt;/td&gt;&lt;td&gt; 9.0s&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;goto/1&lt;/td&gt;&lt;td&gt;18.7s&lt;/td&gt;&lt;td&gt; 16.1s&lt;/td&gt;&lt;td&gt; 14.2s&lt;/td&gt;&lt;td&gt;13.7s&lt;/td&gt;&lt;td&gt;16.1s&lt;/td&gt;&lt;td&gt;14.67s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto/2&lt;/td&gt;&lt;td&gt; 9.5s&lt;/td&gt;&lt;td&gt;8.1s&lt;/td&gt;&lt;td&gt;7.1s&lt;/td&gt;&lt;td&gt; 7.3s&lt;/td&gt;&lt;td&gt; 8.1s&lt;/td&gt;&lt;td&gt; 7.4s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto/4&lt;/td&gt;&lt;td&gt; 4.9s&lt;/td&gt;&lt;td&gt;4.4s&lt;/td&gt;&lt;td&gt;3.7s&lt;/td&gt;&lt;td&gt; -&lt;/td&gt;&lt;td&gt; 4.1s&lt;/td&gt;&lt;td&gt; 3.8s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto/8&lt;/td&gt;&lt;td&gt; 2.7s&lt;/td&gt;&lt;td&gt;2.4s&lt;/td&gt;&lt;td&gt;2.0s&lt;/td&gt;&lt;td&gt; -&lt;/td&gt;&lt;td&gt; 4.1s&lt;/td&gt;&lt;td&gt; 3.8s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;openblas/1&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;14.04s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;openblas/2&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; 7.16s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;openblas/4&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; 3.71s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;openblas/8&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; 3.70s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;mkl 11.0.083/1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;7.97s&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;mkl 10.2.2.025/1 &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;13.7s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;mkl 10.2.2.025/2 &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; 7.6s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;mkl 10.2.2.025/4 &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; 4.0s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;mkl 10.2.2.025/8 &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; 2.0s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto2 1.13/1&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;14.37s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto2 1.13/2&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;7.26s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto2 1.13/4&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;3.70s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto2 1.13/8&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;1.94s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;goto2 1.13/16&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;3.16s&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

  &lt;p&gt;또, GPU에 대한 벤치마크는 다음과 같다 (Test time in float32):&lt;/p&gt;

  &lt;table class=&quot;table table-striped table-condensed&quot;&gt;&lt;tr&gt;&lt;th&gt;CUDA version&lt;/th&gt;&lt;th&gt;6.5&lt;/th&gt;&lt;th&gt;6.0&lt;/th&gt;&lt;th&gt;5.5&lt;/th&gt;&lt;th&gt;5.0&lt;/th&gt;&lt;th&gt;4.2&lt;/th&gt;&lt;th&gt;4.1&lt;/th&gt;&lt;th&gt;4.0&lt;/th&gt;&lt;th&gt;3.2&lt;/th&gt;&lt;th&gt;3.0&lt;/th&gt;&lt;th&gt;note&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;K6000/NOECC&lt;/td&gt;&lt;td&gt;0.06s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.06s&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;K40&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.07s&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;K20m/ECC&lt;/td&gt;&lt;td&gt; 0.08s&lt;/td&gt;&lt;td&gt;0.08s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.07s &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;K20/NOECC&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.07s &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;M2090&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.19s &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;C2075&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;0.25s &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;M2075&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.25s &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;M2070&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.25s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.27s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.32s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;M2070-Q&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.48s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.27s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.32s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;M2050(Amazon)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.25s &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;C1060&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;0.46s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;K600&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 1.04s &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;GTX Titan Black &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.05s &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;GTX Titan(D15U-50)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.06s&lt;/td&gt;&lt;td&gt;0.06s&lt;/td&gt;&lt;td&gt;don't work&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;GTX 780&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.06s &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;GTX 980&lt;/td&gt;&lt;td&gt; 0.06s&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;GTX 970&lt;/td&gt;&lt;td&gt; 0.08s&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;GTX 680&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.11s &lt;/td&gt;&lt;td&gt;0.12s &lt;/td&gt;&lt;td&gt;0.154s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.218s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GRID K520&lt;/td&gt;&lt;td&gt; 0.14s&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;GTX 580&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.16s &lt;/td&gt;&lt;td&gt;0.16s &lt;/td&gt;&lt;td&gt;0.164s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.203s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GTX 480&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.19s &lt;/td&gt;&lt;td&gt;0.19s &lt;/td&gt;&lt;td&gt;0.192s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.237s&lt;/td&gt;&lt;td&gt;0.27s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GTX 750 Ti&lt;/td&gt;&lt;td&gt; 0.20s&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;GTX 470&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.23s &lt;/td&gt;&lt;td&gt;0.23s &lt;/td&gt;&lt;td&gt;0.238s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.297s&lt;/td&gt;&lt;td&gt;0.34s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GTX 660&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.18s &lt;/td&gt;&lt;td&gt;0.20s &lt;/td&gt;&lt;td&gt;0.23s &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;GTX 560&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;0.30s &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;GTX 650 Ti&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.27s &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;GTX 765M&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.27s&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;GTX 460&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.37s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.45s &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;GTX 285&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt; 0.42s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.452s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.452s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.40s&lt;/td&gt;&lt;td&gt;cuda 3.0 seems faster? driver version?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;750M&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;0.49s &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;GT 610&lt;/td&gt;&lt;td&gt; 2.38s&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;GTX 550 Ti&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;0.57s &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;GT 520&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;2.68s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3.06s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;520M&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2.44s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3.19s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;with bumblebee on Ubuntu 12.04&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GT 220&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;3.80s &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GT 210&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;6.35s &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;8500 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;10.68s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;my-test-results&quot;&gt;My test results&lt;/h3&gt;

&lt;p&gt;비교하는 컴퓨터는 총 7대이며,
하드웨어 스펙은 다음과 같다:&lt;/p&gt;

&lt;table class=&quot;table table-striped&quot;&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;OS&lt;/th&gt;&lt;th&gt;CPU&lt;/th&gt;&lt;th&gt;RAM&lt;/th&gt;&lt;th&gt;GPU&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tigger&lt;/td&gt;&lt;td&gt;MacBook Air 13&quot; (Early 2014)&lt;/td&gt;&lt;td&gt;Mac OS X 10.10.4&lt;/td&gt;&lt;td&gt;Intel Core i5-4260U 1.4GHz&lt;/td&gt;&lt;td&gt;4GB 1600MHz (DDR3)&lt;/td&gt;&lt;td&gt;&lt;s&gt;Intel HD Graphics 5000 1536MB&lt;/s&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;playbook&lt;/td&gt;&lt;td&gt;MacBook Pro 15&quot; (Mid 2014)&lt;/td&gt;&lt;td&gt;Mac OS X 10.10.4&lt;/td&gt;&lt;td&gt;Intel Core i7-4770HQ 2.2GHz&lt;/td&gt;&lt;td&gt;16GB 1600MHz (DDR3)&lt;/td&gt;&lt;td&gt;&lt;s&gt;Intel Iris Pro 1536MB&lt;/s&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;joker&lt;/td&gt;&lt;td&gt;PC&lt;/td&gt;&lt;td&gt;Ubuntu 13.10&lt;/td&gt;&lt;td&gt;Intel Xeon E3-1230 v3 3.30GHz&lt;/td&gt;&lt;td&gt;8GB 1600MHz (DDR3)&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dada&lt;/td&gt;&lt;td&gt;PC&lt;/td&gt;&lt;td&gt;Ubuntu 14.04.1&lt;/td&gt;&lt;td&gt;Intel Pentium G620 2.6GHz&lt;/td&gt;&lt;td&gt;8GB 1067MHz (DDR3)&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;daca&lt;/td&gt;&lt;td&gt;PC&lt;/td&gt;&lt;td&gt;Ubuntu 14.04.2&lt;/td&gt;&lt;td&gt;Intel Core i7-3930K 3.2GHz&lt;/td&gt;&lt;td&gt;32GB 1600MHz (DDR3)&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;merci&lt;/td&gt;&lt;td&gt;PC&lt;/td&gt;&lt;td&gt;Ubuntu 14.04.2&lt;/td&gt;&lt;td&gt;Intel Core i7-5820K 3.3GHz&lt;/td&gt;&lt;td&gt;32GB 2133 MHz (DDR4)&lt;/td&gt;&lt;td&gt;NVIDIA GeForce GTX 980&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;labpc&lt;/td&gt;&lt;td&gt;PC&lt;/td&gt;&lt;td&gt;Windows 7&lt;/td&gt;&lt;td&gt;AMD Phenom II X3 720 2.8GHz&lt;/td&gt;&lt;td&gt;16GB 2133 MHz (DDR3)?&lt;/td&gt;&lt;td&gt;&lt;s&gt;ATI Radeon HD 4850&lt;/s&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;각 머신에 깔려있는 소프트웨어/패키지 버젼은 다음과 같다:&lt;/p&gt;

&lt;table class=&quot;table table-striped&quot;&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;python&lt;/th&gt;&lt;th&gt;numpy&lt;/th&gt;&lt;th&gt;scipy&lt;/th&gt;&lt;th&gt;theano&lt;/th&gt;&lt;th&gt;cuda&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tigger&lt;/td&gt;&lt;td&gt;2.7.6&lt;/td&gt;&lt;td&gt;1.8.0rc1&lt;/td&gt;&lt;td&gt;0.13.0b1&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;playbook&lt;/td&gt;&lt;td&gt;2.7.10&lt;/td&gt;&lt;td&gt;1.9.2&lt;/td&gt;&lt;td&gt;0.15.1&lt;/td&gt;&lt;td&gt;0.7.0&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;joker&lt;/td&gt;&lt;td&gt;2.7.5&lt;/td&gt;&lt;td&gt;1.8.0&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;dada&lt;/td&gt;&lt;td&gt;2.7.6&lt;/td&gt;&lt;td&gt;1.9.1&lt;/td&gt;&lt;td&gt;0.16.0&lt;/td&gt;&lt;td&gt;0.7.0&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;daca&lt;/td&gt;&lt;td&gt;2.7.6&lt;/td&gt;&lt;td&gt;1.9.2&lt;/td&gt;&lt;td&gt;0.16.0&lt;/td&gt;&lt;td&gt;0.7.0&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;merci&lt;/td&gt;&lt;td&gt;2.7.6&lt;/td&gt;&lt;td&gt;1.9.2&lt;/td&gt;&lt;td&gt;0.16.0&lt;/td&gt;&lt;td&gt;0.7.0&lt;/td&gt;&lt;td&gt;7.0.27&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;labpc&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;/table&gt;

&lt;p&gt;결과를 최종적으로 요약 정리한 표이다 (괄호 안 숫자는 테스트 수):&lt;/p&gt;

&lt;table class=&quot;table table-striped&quot;&gt;&lt;tr&gt;&lt;th&gt;name&lt;/th&gt;&lt;th&gt;numpy&lt;/th&gt;&lt;th&gt;scipy&lt;/th&gt;&lt;th&gt;theano&lt;/th&gt;&lt;th&gt;blas&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tigger&lt;/td&gt;&lt;td&gt;109.813&lt;/td&gt;&lt;td&gt;275.232&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;playbook&lt;/td&gt;&lt;td&gt;22.767 (5557)&lt;/td&gt;&lt;td&gt;145.634 (17005)&lt;/td&gt;&lt;td&gt;5705.634 (2724)&lt;/td&gt;&lt;td&gt;1.181&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;joker&lt;/td&gt;&lt;td&gt;22.279&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;dada/blas&lt;/td&gt;&lt;td&gt;26.335 (5580)&lt;/td&gt;&lt;td&gt;195.697 (18456)&lt;/td&gt;&lt;td&gt;4546.648 (2722)&lt;/td&gt;&lt;td&gt;17.37&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;daca/openblas&lt;/td&gt;&lt;td&gt;18.965 (5593)&lt;/td&gt;&lt;td&gt;148.614 (18456)&lt;/td&gt;&lt;td&gt;3418.434 (2722)&lt;/td&gt;&lt;td&gt;1.9490&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;merci/blas&lt;/b&gt;&lt;/td&gt;&lt;td&gt;24.243 (-)&lt;/td&gt;&lt;td&gt;49.994 (-)&lt;/td&gt;&lt;td&gt;2700.233 (-)&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;merci/openblas&lt;/b&gt;&lt;/td&gt;&lt;td&gt;15.193 (5593)&lt;/td&gt;&lt;td&gt;114.156 (18456)&lt;/td&gt;&lt;td&gt;3447.037 (2722)&lt;/td&gt;&lt;td&gt;2.76&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;merci/openblas+cuda&lt;/b&gt;&lt;/td&gt;&lt;td&gt;16.393 (5593)&lt;/td&gt;&lt;td&gt;109.405 (18456)&lt;/td&gt;&lt;td&gt;4165.916 (19844) - &lt;b&gt;FAILED&lt;/b&gt;&lt;/td&gt;&lt;td&gt;0.06&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;labpc&lt;/td&gt;&lt;td&gt;39.183&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;다음은 앞서 나열된 머신 중 merci에서 작업한 상세 로그이다.&lt;/p&gt;

&lt;h4 id=&quot;1단계-vanilla-ubuntu&quot;&gt;1단계: Vanilla Ubuntu&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo apt-get install python-dev python-pip python-nose g++ libopenblas-dev git
$ sudo apt-get install python-numpy     # 1.8.1
$ sudo apt-get install python-scipy     # 0.14.0
$ sudo pip install Theano               # 0.7.0
$ python -c &quot;import numpy; numpy.__config__.show()&quot;  # or, `from numpy.distutils.system_info import get_info; get_info('blas')`
blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;NumPy (1.8.1): 24.243s, OK&lt;/li&gt;
  &lt;li&gt;SciPy (0.14.0): 49.994s, OK&lt;/li&gt;
  &lt;li&gt;Theano (0.7.0): 2700.233s, OK&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;2단계-with-openblas&quot;&gt;2단계: With OpenBLAS&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo apt-get install libopenblas-dev
$ sudo apt-get purge python-numpy python-scipy      # http://stackoverflow.com/a/25326614/1054939 http://stackoverflow.com/q/29979539/1054939
$ sudo pip install numpy    # 1.9.2
$ sudo pip install scipy    # 0.16.0
$ sudo update-alternatives --config libblas.so.3    # /usr/lib/openblas-base/libblas.so.3
$ sudo update-alternatives --config liblapack.so.3  # /usr/lib/lapack/liblapack.so.3
$ python -c &quot;import numpy; numpy.__config__.show()&quot;                                                                                                                           [22/7614]
blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/lib']
    language = f77
openblas_info:
    libraries = ['openblas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
atlas_3_10_threads_info:
  NOT AVAILABLE
atlas_info:
  NOT AVAILABLE
atlas_3_10_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;NumPy (1.9.2): 15.193s (5593), OK&lt;/li&gt;
  &lt;li&gt;SciPy (0.16.0): 114.156s (18456), OK&lt;/li&gt;
  &lt;li&gt;Theano (0.7.0): 3447.037s (2722), OK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SciPy 테스트 시간의 큰 차이에 관해서는 #scipy irc에서 물어보니 BLAS나 라이브러리의 성능 자체보다는 버전에 따른 테스트 수 차이 때문일 수 있다고.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;10:27 PM &amp;lt;e9t_&amp;gt; I'm using Ubuntu 14.04, and installed numpy+scipy with apt-get. Then I installed libopenblas-dev, purged numpy+scipy and reinstalled them with pip. But the test results are peculiar.
10:27 PM &amp;lt;e9t_&amp;gt; - numpy.test(): 24s -&amp;gt; 15s (decreased. great!)
10:27 PM &amp;lt;e9t_&amp;gt; - scipy.test(): 50s -&amp;gt; 114s (increased. why?)
10:27 PM &amp;lt;e9t_&amp;gt; Anyone know the reason?
10:34 PM &amp;lt;jtaylor&amp;gt; e9t_: likely the version difference, not blas
10:35 PM &amp;lt;jtaylor&amp;gt; scipy simply added more tests
10:35 PM &amp;lt;jtaylor&amp;gt; numpy too, but numpy also reduced the time the tests takes in recent versions
10:35 PM &amp;lt;jtaylor&amp;gt; the number of tests should be printed too
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;!--
#### 3단계: with atlas

    $ sudo apt-get install libatlas3-base
    $ sudo apt-get remove libopenblas-base  # http://stackoverflow.com/a/9713071/1054939
    $ sudo update-alternatives -config liblapack.so.3  # /usr/lib/atlas-base/atlas/liblapack.so.

- NumPy (1.9.2): 13.624s (5593), OK
- SciPy (0.16.0): 100.103s (18451), FAIL
--&gt;

&lt;h4 id=&quot;3단계-with-cuda&quot;&gt;3단계: With CUDA&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/index.html#pre-installation-actions&quot;&gt;Pre-installation&lt;/a&gt;: NVIDIA 툴킷 설치&lt;/p&gt;

    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; $ lspci | grep -i nvidia
 $ sudo apt-get install nvidia-346  # nvidia-current installed driver 304.125 which resulted in API mismatch
 $ sudo apt-get install nvidia-cuda-toolkit
 $ nvidia-smi
 NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-downloads&quot;&gt;Install cuda&lt;/a&gt;&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;NOTE: &lt;code class=&quot;highlighter-rouge&quot;&gt;apt-get install cuda&lt;/code&gt;를 하면서(?) &lt;code class=&quot;highlighter-rouge&quot;&gt;WARNING - No MPI compiler found.&lt;/code&gt;라는 워닝이 떴다. MPI는 message passing interface인데, 큰 문제가 되지 않을 것 같아 일단 별다른 조치는 취하지 않음.&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; $ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0-28_amd64.deb
 $ sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb
 $ sudo apt-get update
 $ sudo apt-get install cuda
 $ sudo reboot 0
 $ nvidia-smi
 Sat Sep  5 05:07:26 2015
 +------------------------------------------------------+
 | NVIDIA-SMI 346.82     Driver Version: 346.82         |
 |-------------------------------+----------------------+----------------------+
 | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
 | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
 |===============================+======================+======================|
 |   0  GeForce GTX 980     Off  | 0000:01:00.0     N/A |                  N/A |
 |  0%   42C    P0    N/A /  N/A |     15MiB /  4095MiB |     N/A      Default |
 +-------------------------------+----------------------+----------------------+

 +-----------------------------------------------------------------------------+
 | Processes:                                                       GPU Memory |
 |  GPU       PID  Type  Process name                               Usage      |
 |=============================================================================|
 |    0            C+G   Not Supported                                         |
 +-----------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/index.html#post-installation-actions&quot;&gt;Post-installation&lt;/a&gt;: PATH 등록 및 테스트&lt;/p&gt;

    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; $ echo &quot;export PATH=/usr/local/cuda-7.0/bin:$PATH&quot; &amp;gt;&amp;gt; ~/.bash_aliases
 $ echo &quot;export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH&quot; &amp;gt;&amp;gt; ~/.bash_aliases
 $ source ~/.bash_aliases
 $ cuda-install-samples-7.0.sh ~/tmp
 $ cat /proc/driver/nvidia/version
 NVRM version: NVIDIA UNIX x86_64 Kernel Module  346.82  Wed Jun 17 10:37:46 PDT 2015
 GCC version:  gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
 $ nvcc -V
 nvcc: NVIDIA (R) Cuda compiler driver
 Copyright (c) 2005-2015 NVIDIA Corporation
 Built on Mon_Feb_16_22:59:02_CST_2015
 Cuda compilation tools, release 7.0, V7.0.27
 $ cd ~/tmp/NVIDIA_CUDA-7.0_Samples
 $ make
 $ ./bin/x86_64/linux/release/deviceQuery
 ./bin/x86_64/linux/release/deviceQuery Starting...

  CUDA Device Query (Runtime API) version (CUDART static linking)

 Detected 1 CUDA Capable device(s)

 Device 0: &quot;GeForce GTX 980&quot;
   CUDA Driver Version / Runtime Version          7.0 / 7.0
   CUDA Capability Major/Minor version number:    5.2
   Total amount of global memory:                 4096 MBytes (4294639616 bytes)
   (16) Multiprocessors, (128) CUDA Cores/MP:     2048 CUDA Cores
   GPU Max Clock rate:                            1329 MHz (1.33 GHz)
   Memory Clock rate:                             3505 Mhz
   Memory Bus Width:                              256-bit
   L2 Cache Size:                                 2097152 bytes
   Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
   Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
   Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
   Total amount of constant memory:               65536 bytes
   Total amount of shared memory per block:       49152 bytes
   Total number of registers available per block: 65536
   Warp size:                                     32
   Maximum number of threads per multiprocessor:  2048
   Maximum number of threads per block:           1024
   Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
   Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
   Maximum memory pitch:                          2147483647 bytes
   Texture alignment:                             512 bytes
   Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
   Run time limit on kernels:                     Yes
   Integrated GPU sharing Host Memory:            No
   Support host page-locked memory mapping:       Yes
   Alignment requirement for Surfaces:            Yes
   Device has ECC support:                        Disabled
   Device supports Unified Addressing (UVA):      Yes
   Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
   Compute Mode:
      &amp;lt; Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) &amp;gt;

 deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 7.0, CUDA Runtime Version = 7.0, NumDevs = 1, Device0 = GeForce GTX 980
 Result = PASS
 $ ./bin/x86_64/linux/release/bandwidthTest
 [CUDA Bandwidth Test] - Starting...
 Running on...

  Device 0: GeForce GTX 980
  Quick Mode

  Host to Device Bandwidth, 1 Device(s)
  PINNED Memory Transfers
    Transfer Size (Bytes)        Bandwidth(MB/s)
    33554432                     12164.5

  Device to Host Bandwidth, 1 Device(s)
  PINNED Memory Transfers
    Transfer Size (Bytes)        Bandwidth(MB/s)
    33554432                     12896.5

  Device to Device Bandwidth, 1 Device(s)
  PINNED Memory Transfers
    Transfer Size (Bytes)        Bandwidth(MB/s)
    33554432                     164863.5

 Result = PASS

 NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;NumPy (1.9.2): 16.393 (5593), OK&lt;/li&gt;
  &lt;li&gt;SciPy (0.16.0): 109.405 (18456), OK&lt;/li&gt;
  &lt;li&gt;Theano (0.7.0): 4165.916 (19844), FAILED&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;4단계-bleeding-edge-theano&quot;&gt;4단계: Bleeding edge Theano&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ git clone git://github.com/Theano/Theano.git
$ cd Theano
$ python setup.py develop   # 0.7.0.dev-c042a9c49ac6516b74668747d1e6e6bbe832efba
$ THEANO_FLAGS=init_gpu_device=gpu0,device=cpu,floatX=float32 python -c &quot;import theano; theano.test()&quot;
WARNING (theano.sandbox.cuda): GPU device gpu0 will be initialized, and used if a GPU is needed. However, no computation, nor shared variables, will be implicitly moved to that device. If you want
that behavior, use the 'device' flag instead.
Using gpu device 0: GeForce GTX 980 (CNMeM is enabled)
Theano version 0.7.0.dev-c042a9c49ac6516b74668747d1e6e6bbe832efba
theano is installed in /home/epark/pkgs/Theano/theano
NumPy version 1.9.2
NumPy is installed in /usr/local/lib/python2.7/dist-packages/numpy
Python version 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2]
nose version 1.3.1
......00001     #include &amp;lt;Python.h&amp;gt;
00002   #include &amp;lt;iostream&amp;gt;
00003   #include &quot;theano_mod_helper.h&quot;

... # 더 자세한 로그는 [이 링크](http://pastebin.com/WSqrQkYA)에서 볼 수 있음

----------------------------------------------------------------------
Ran 19844 tests in 4093.222s

FAILED (KNOWNFAIL=18, SKIP=69, errors=218, failures=192)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Theano (0.7.0): 4093.222 (19844), FAILED &lt;sup id=&quot;fnref:8&quot;&gt;&lt;a href=&quot;#fn:8&quot; class=&quot;footnote&quot;&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;some-random-comments&quot;&gt;Some random comments&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Test 결과를 볼 때는 1) 테스트 시간 뿐 아니라 2) 패키지 버젼 3) 테스트 수를 아는 것이 중요. 같은 버젼이라도 다른 환경(ex: OS, GPU)에서 실행할 경우 테스트 수는 달라질 수 있다.&lt;/li&gt;
  &lt;li&gt;Ubuntu에서는 &lt;code class=&quot;highlighter-rouge&quot;&gt;numpy&lt;/code&gt;나 &lt;code class=&quot;highlighter-rouge&quot;&gt;scipy&lt;/code&gt;를 깔 때 ppa를 이용하지 않는 이상 &lt;code class=&quot;highlighter-rouge&quot;&gt;apt-get&lt;/code&gt;을 사용하면 더 낮은 버젼(ex: 14.04의 경우 1.8.2)이 깔린다. &lt;code class=&quot;highlighter-rouge&quot;&gt;pip&lt;/code&gt;으로 설치해야 좀 더 최신버젼을 깔 수 있다(ex: 내 경우 1.9.2). 버젼 간 속도 차가 나는 경우가 있으니 &lt;code class=&quot;highlighter-rouge&quot;&gt;pip&lt;/code&gt; 설치를 권장.&lt;/li&gt;
  &lt;li&gt;dada, daca에서 Python 2.7.6에 NumPy 1.9.1, SciPy 0.13.3가 깔려있을 때는 SciPy의 test가 항상 fail했다. 특히 daca의 경우 NumPy test에서 segfault도 발생. 최신 버젼으로 업글하면 문제가 해결되었을 가능성도 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://stackoverflow.com/questions/7596612/benchmarking-python-vs-c-using-blas-and-numpy&quot;&gt;Some other benchmark codes for BLAS&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;옥타브가 생각보다 잘 안 알려져 있던데, MATLAB의 오픈소스 버젼이라고 생각하면 된다.&amp;nbsp;&lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;리눅스 커널을 열거나 core dump를 읽기 시작할 때부터 segfault에 대한 이해가 깊어지듯.&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:7&quot;&gt;
      &lt;p&gt;각 함수의 이름에 대한 설명을 좀 더 보고 싶을 때는 &lt;a href=&quot;https://software.intel.com/en-us/node/520724&quot;&gt;Intel Developer Zone&lt;/a&gt;가 좋은 가이드가 되어준다.&amp;nbsp;&lt;a href=&quot;#fnref:7&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:6&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://wiki.debian.org/DebianScience/LinearAlgebraLibraries&quot;&gt;Handle different versions of BLAS and LAPACK&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;#fnref:6&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:5&quot;&gt;
      &lt;p&gt;NumPy, SciPy, Theano 각각에 대한 test 시간은 &lt;a href=&quot;http://deeplearning.net/software/theano/install_ubuntu.html&quot;&gt;Theano 웹사이트&lt;/a&gt;에서 제공.&amp;nbsp;&lt;a href=&quot;#fnref:5&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;#fnref:5:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;#fnref:5:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;또는, &lt;a href=&quot;http://deeplearning.net/software/theano/library/config.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.theanorc&lt;/code&gt;를 사용&lt;/a&gt;.&amp;nbsp;&lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:8&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!topic/theano-users/_yALWD6SgoY&quot;&gt;Theano users&lt;/a&gt;에 질문을 올려두었더니 GPU 사용할 때는 test가 fail해도 별 문제가 없는거라고 함…&amp;nbsp;&lt;a href=&quot;#fnref:8&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Sun, 06 Sep 2015 22:28:00 -0700</pubDate>
        <link>http://www.lucypark.kr/blog/2015/09/06/blas-benchmarks/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2015/09/06/blas-benchmarks/</guid>
        
        <category>BLAS</category>
        
        <category>benchmark</category>
        
        <category>Python</category>
        
        <category>Theano</category>
        
        <category>GPGPU</category>
        
        
      </item>
    
      <item>
        <title>한 학기 강의, 그리고 내가 배운 것들</title>
        <description>&lt;p&gt;지난 봄학기,
데이터 사이언스 입문 과목인 &lt;a href=&quot;/courses/2015-dm/&quot;&gt;Data Mining&lt;/a&gt;과
한 학기 동안 실제로 데이터마이닝 프로젝트를 수행하는 &lt;a href=&quot;/courses/2015-ba/&quot;&gt;Business Analytics&lt;/a&gt; 
를 강의할 기회가 주어졌다.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;강의한다는 소식을 듣고 몇 분은 학계에 남을거냐는 질문을 주셨고
커리어패스 측면에서 그것은 아주 자연스러운 질문이지만,
사실 나는 졸업 후 큰 회사든 작은 회사든 산업계로 가고 싶다는 생각을 하고 있다.
졸업 후 학계에 남고 싶은 마음이 컸다면
오히려 진행 중인 연구에 집중하기 위해 이 일은 고사했을 것 같다.
하지만 새로운 경험은 대체로 나를 크게 성장시켜주기 때문에
이 일도 내게 그런 기회일거라 생각했다.&lt;/p&gt;

&lt;p&gt;그런데 박사 초년 시절 지도교수님의 조교 역할을 일 년간 하고,
한 두 시간에 걸친 짤막한 튜토리얼 해본게 전부인 나로서는 과목 하나를 통째를 맡는다는게 사실은 꽤 부담스럽고 긴장되는 일이기도 했다.
다만 &lt;a href=&quot;https://sites.google.com/site/pskang80/&quot;&gt;내가 정말 좋아하고 존경하는 선배님&lt;/a&gt;의 제안이었고,
학생들의 눈높이에 맞는 수업을 할 수 있을거라는 자신감도 있었고,
나 또한 수업을 준비하면서 많이 배울 것 같다는 생각이 들어서 하게 되었다.
그리고 실제로도 많이 배웠다.
당초 예상했던대로 데이터 분석이라는 영역에 대한 이해도 어느 정도 깊어졌다고도 생각하지만,
사실은 그 외의 것들을 훨씬 다양하게 배운 것 같다.&lt;/p&gt;

&lt;!-- 출판사에서 데이터 분석 관련 책을 써보라는 권유도 받고 있던터라 강의 노트를 모아 출판해도 괜찮겠다는 생각도 들었다. --&gt;

&lt;p&gt;시간이 더 지나기 전에 내가 얻은 크고 작은 배움들을 기록하는 것이 의미있을거라 생각해서 느낀 바를 정리해보았다.
&lt;!--
더러 민감한 사안이 있을 수도 있고
일부 &quot;실패&quot;한 시도들을 공개적으로 거론하는 것이 부끄럽기도 하지만,
--&gt;
쓰다보니 제법 긴 글이 되어버렸다만 :sweat:
비슷한 경험을 할/하고 있는 다른 누군가에게도 도움이 될 수 있었으면 하는 마음과
그 분들이 가르칠 학생들이 더 나은 강의를 듣게 되었으면 좋겠다는 마음으로
내가 겪은 시행착오와 배움에 대한 글을 세상에 내놓는다.&lt;/p&gt;

&lt;!--
&gt; CAVEAT: 이 글은 배우는 입장과 가르치는 입장 모두에서 쓴 글이기 때문에 대상 독자도 양측 모두가 될 수 있습니다.
--&gt;

&lt;ol id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#배움-1-less-is-more&quot; id=&quot;markdown-toc-배움-1-less-is-more&quot;&gt;배움 1. Less is more.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#배움-2-mutual-motivation-is-important&quot; id=&quot;markdown-toc-배움-2-mutual-motivation-is-important&quot;&gt;배움 2. Mutual motivation is important.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#배움-3-getting-feedback-needs-effort&quot; id=&quot;markdown-toc-배움-3-getting-feedback-needs-effort&quot;&gt;배움 3. Getting feedback needs effort.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#배움-4-encouraging-class-participation-is-difficult-even-more-than-you-expect&quot; id=&quot;markdown-toc-배움-4-encouraging-class-participation-is-difficult-even-more-than-you-expect&quot;&gt;배움 4. Encouraging class participation is difficult, even more than you expect.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#배움-5-가르치는-법도-배워야-한다&quot; id=&quot;markdown-toc-배움-5-가르치는-법도-배워야-한다&quot;&gt;배움 5. 가르치는 법도 배워야 한다.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#배움-6-데이터-사이언스-강의에서-프로그래밍이-필수적이지는-않다&quot; id=&quot;markdown-toc-배움-6-데이터-사이언스-강의에서-프로그래밍이-필수적이지는-않다&quot;&gt;배움 6. 데이터 사이언스 강의에서 프로그래밍이 필수적이지는 않다.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#배움-7-그-외의-것들&quot; id=&quot;markdown-toc-배움-7-그-외의-것들&quot;&gt;배움 7+: 그 외의 것들&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;배움-1-less-is-more&quot;&gt;배움 1. Less is more.&lt;/h3&gt;

&lt;p&gt;아무래도 처음 수업을 맡은 학기였기 때문에 커리큘럼부터 시작해서 강의자료 준비까지, 엄청난 의욕에 불타올라서 열심히 준비했다.
게다가 학생들에게 전달해주고 싶은 내용이 한두가지가 아니었다.
내가 수업을 들을 때 배웠던 것은 물론이고, 그 때 배우지 못해서 아쉬웠던 것들까지 커리큘럼에 넣고 싶었다.
학생들이 나중에 어디가서 “입데마”하지 않기 위해서는 당연히 실습도 중요한 portion을 차지해야 했다.&lt;/p&gt;

&lt;!--
사실 학기 초에는 &quot;중요한 알고리즘을 다 알려주지 않으면 데이터마이너로서의 경쟁력이 떨어질 수 있다&quot;는 생각이 강했으나
굳이 하나하나를 균일하게 파지 않고 대략적인 아이디어를 전달하는데는 그리 오랜 시간이 걸리지 않는다. --&gt;

&lt;p&gt;하지만 (당연하게도) 내가 다루고 싶은만큼 많은 내용을 다루기에는 나에게 할당된 수업 시간이 부족했다.
가령 데이터마이닝 수업의 경우,
나는 내가 데이터마이닝 시간에 배웠던 것 중
multiple linear regression, logistic regression, decision trees, k-NN, k-means, hierarchical clustering, market basket analysis, neural networks을 넣고,
내가 중요하다고 생각하는
SVM, data visualization, distributed systems, 그리고 text mining 등을 추가해서
각 항목을 거의 동등한 비중으로 다루기로 했다.
(물론 국내외의 많은 대학들의 데이터마이닝 수업도 대체로 비슷한 병렬적인 모양새여서,
내가 커리큘럼을 독창적으로 짰다기보다는 오히려 “내가 배웠던대로” 안전한 방식을 취하고 약간의 variation을 준 것에 가깝다.)&lt;/p&gt;

&lt;p&gt;그런데 학기의 중반쯤 깨달았던 것은, 이 조차도 범위가 너무 넓다는 것이다.
이유는 다음과 같다:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;모든 것이 겉핥기가 된다.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;사실 linear regression (LR) 하나만 한다고 해도,
 단순히 regressor과 regressand의 관계를 이해하는 것을 넘어서는 practical한 문제가 아주 많다.
 Normalization을 해야하는가? 계수로 변수의 중요도를 알 수 있는가?
 (또는 중요한 변수를 판별할 수 있는가?)
 변수가 레코드 수보다 너무 많을 때는 어떻게 하는가?
 불필요한 변수가 너무 많다면 regularization이 낫나 변수 선택이 낫나?
 L1, L2 regularization이란 무엇인가?
 LR을 분류 문제에 적용할 수 있는가? 실제로 학습은 어떻게 되는가?
 Stochastic gradient descent에 어떤 장단점이 있는가? 등등.
 하지만 독립변수와 종속변수에 대해 이제 처음 들었고,
 때로는 함수의 역할이나 정의도 아리송해하는 학생들에게
 그런 내용을 한두시간 안에 전달하려는 것은 과욕이고,
 결국엔 피상적인 내용의 전달과 이해에 그치게 된다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;병렬적 나열은 정작 중요한 것을 놓치게 한다.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;서비스 개발을 할 때 사용자들이 중요한 기능을 놓치지 않도록 핵심을 강조하는 디자인을 하는 것이 중요하듯,
 수업 역시 학생들이 학기가 끝난 후 &lt;em&gt;다른 모든 것은 잊더라도 과목의 핵심적인 내용은 습득해갈 수 있도록&lt;/em&gt; 디자인하는 것이 좋다.
 실제로 데이터 분석을 할 때는 data cleaning 등 전처리는 작업 시간 중 어마어마한 비중이 투자되고,
 data exploration은 좋은 분석 결과를 내기 위해 필수적인 단계이며,
 parameter selection은 가장 challenging하고 expertise가 필요한 부분인데,
 커리큘럼에서 알고리즘을 주욱 나열하고 나면
 아무리 그 부분들에 대한 중요성을 강조해도 그것이 충분히 전달되지 못할 수 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;가르치는 사람의 마음을 급하게 한다.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;1번과도 이어지는 내용이지만, 시간이라는 자원은 한정적이기 때문에 전달할 수 있는 내용도 한정적이다.
 제약조건을 초과하는 내용을 전달하려다보면 학생들이 얼마나 이해했는지 덜 확인하게 되고,
 강사의 말은 빨라지고,
 오히려 학생들의 지식 수용율은 떨어진다는 것을 깨달았다.
 다음은 내가 linear regression 수업을 신나게 하고나서 받은 피드백이었다:&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;ul&gt;
        &lt;li&gt;내용설명을 해주실때 조금 빨라서 필기하거나 이해하는데 조금 어려움이 있었습니다.&lt;/li&gt;
        &lt;li&gt;제가 컴퓨터를 잘못해서 개인적인 바람이지만 python하실 때 속도 조금만 더 느리게 해주셨으면 좋겠습니다ㅠㅠ! 감사합니다.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;커리큘럼 맞추겠다고, 혹은 알고리즘 하나를 더 가르치겠다고 서둘러 진도를 빼는 것은 가장 어리석은 방법인듯하다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Less_is_more&quot;&gt;“조금이 더 많다(less is more)”&lt;/a&gt; 전략을 택하면
실력 편차가 있는 군집 내에서도 내용에 대한 이해의 깊이는 달라지더라도 같은 주제에 대한 문제의식의 공유가 가능해진다.&lt;/p&gt;

&lt;p&gt;내가 들었던 수업 중 less is more 정신이 가장 뚜렷하게 반영된 수업은 
&lt;a href=&quot;http://soar.snu.ac.kr/~moon/&quot;&gt;문병로 교수님&lt;/a&gt;의 &lt;a href=&quot;http://soar.snu.ac.kr/course/ga/2015/&quot;&gt;유전 알고리즘&lt;/a&gt; 수업이었는데,
그 수업은 한 학기 내내 알고리즘 하나만 공부하며 그것을 최적화해 나가는 방법을 배운다.
뭣도 모르던 시절에 들었던거라 성적은 형편 없었지만 가장 기억에 남는 명강의 중 하나이고,&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;
아무리 바보여도 “유전자 알고리즘이 아니라 유전 알고리즘이다!”라고 하는 교수님의 말씀만큼은 기억에 확실히 남았다.&lt;/p&gt;

&lt;p&gt;아마 수업을 또 하게 된다면, 나는 같은 방식의 병렬적인 커리큘럼을 쓰지는 않을 것 같다.
수많은 알고리즘과 그들의 변종을 “다” 알려주는 것은 어차피 불가능하다.
시간도 부족하고 내가 그것들을 모두 제대로 알기도 어려울 것이다.
그렇다면 이제, &lt;em&gt;덜&lt;/em&gt; 가르친다면 &lt;em&gt;무엇을&lt;/em&gt; 가르칠 것이냐의 문제가 남는다.
또 기회가 있다면
나는 내가 데이터 마이닝이라는 분야에서 더 잘 아는 분야, 즉 내 세부적인 전공 분야에 더 focus해서 가르칠 것 같다.
두 가지 이유에서인데,
내 스스로 보다 재미있게 얘기를 들려줄 수 있을 뿐더러
어차피 이 학생들이 훗날 연구자가 된다면 나와 협력자가 될 가능성이 많기 때문이다.&lt;/p&gt;

&lt;p&gt;내가 종종 인용하는 글 &lt;a href=&quot;http://norvig.com/21-days.html&quot;&gt;Teach Yourself Programming in Ten Years&lt;/a&gt;에서 Peter Norvig은
“어떤 OS를 써야할까요?”라는 질문에 대해 “뭐든 상관없으니 친구들이 쓰는걸 쓰세요.”라고 한다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When asked “what operating system should I use, Windows, Unix, or Mac?”, my answer is usually: “use whatever your friends use.” The advantage you get from learning from your friends will offset any intrinsic difference between OS, or between programming languages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;수업과 연구 분야도 마찬가지가 아닐까.
옆 친구와 옆 연구실, 선생과 학생은 서로 잠재적 동료이고,
가장 많은 것을 배우고 가르칠 수 있는 관계이다.&lt;/p&gt;

&lt;!-- 초반에는 class 모두가 같은 선상에서 출발할 수 있도록 속도를 느리게 한 후 (하향 평준화) 점차 가속해 나가는 것이 좋은 모델인 것 같다 (평균 상향 조정). --&gt;

&lt;h3 id=&quot;배움-2-mutual-motivation-is-important&quot;&gt;배움 2. Mutual motivation is important.&lt;/h3&gt;

&lt;p&gt;강의실에서의 motivation은 상당히 중요하다.
그렇지 않으면 선생, 학생 모두에게 시간 낭비가 되니까.&lt;/p&gt;

&lt;p&gt;예시를 보여주거나, 동영상을 보여주는 등 학생들의 흥미를 돋구는 방법은 아주 많지만,
이번에 느낀 것은 &lt;strong&gt;단 5분이라도 문제에 대해 직접 생각해볼 수 있는 시간&lt;/strong&gt;이 필요하다는 것이다.
그 과정이 없으면 “주입식 교육”이 되기 쉽다.
즉, 알고리즘의 목적과 방법론, 효과, 장단점을 일방적으로 전달하기보다는
(알고리즘이 해결하는) 문제를 하나 던져 주고,
먼저 그 문제가 왜 문제인지, 왜 풀어야하는 문제인지를 고민해본 후
그 문제를 어떻게 풀 수 있을까를 스스로 고민하는 과정이 있는 것이 좋은 것 같다.
만일 그 이후에 해당 알고리즘의 태동과 발전 과정을 보여준다면
한 수업이 마치 한 편의 드라마를 보듯 흥미진진하지 않을까.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;내가 생각하는 좋은 알고리즘 수업 방식:&lt;/p&gt;

  &lt;ol&gt;
    &lt;li&gt;Teaser로 시작: 이런 문제가 있어. 이게 왜 문제일까? 너희들은 어떻게 풀어볼래?&lt;sup id=&quot;fnref:6&quot;&gt;&lt;a href=&quot;#fn:6&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
    &lt;li&gt;이 수업이 커리큘럼 상에서 어디쯤에 위치해있는지 보여주기 (큰 그림 보여주기)&lt;/li&gt;
    &lt;li&gt;문제를 해결할 수 있는 가장 간단한 방법 전달 (실제로 학생들이 생각한 접근과 비슷할 것임)&lt;/li&gt;
    &lt;li&gt;하지만 거기에는 A와 같은 문제가 있어서, 많은 사람들이 연구하고 개선해서 2015년에는 B와 같은 수준이 되었다&lt;/li&gt;
    &lt;li&gt;수업 끝에 오늘 다룬 내용 요약&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;이 중에서 4번 항목에 관해 한 마디를 덧붙이자면,
학생들은 문제에 “답” 내지는 “정해진 공식”이 정해져 있다고 생각하는 경우가 많았다.
예를 들어, 텍스트 분석을 할 때 “TF-IDF에 대한 공식이 뭔가요? 강의자료와 외부자료의 공식이 다른데 어떤걸로 공부하면 되나요?”라는 질문이 있었다.&lt;/p&gt;

&lt;p&gt;실제로 TF-IDF는 처음 제안되었던 지표 외에도 수많은 variant가 있다.
그것에 대해 수업 중 긴 시간을 할애해서, 다음과 같은 얘기를 해줬다.
과학에 관한 한 “정답”은 존재하지 않는다.
흔히들 “기술은 발전한다”고 하는데,
기술이 발전한다는 것 자체가 여러분이 알고 있는 “어제의 최상의 해결법”이 개선되었다는 것을 의미한다.
그리고 그렇게 발전시키는 것은 여러분이다.
따라서 여러분도 여기서 알고리즘을 배울 때 그것의 정답(알고리즘의 현재)이 뭔지 알려고 하기보다는
그것의 단점이 무엇인지 찾고, 어떻게 개선할 수 있을지(알고리즘의 미래) 생각해봤으면 좋겠다.&lt;/p&gt;

&lt;!--
가령 박스오피스를 띄워놓고, 요즘 흥행하는 영화들 중 본 것이 뭐가 있냐고 묻는다.
그 다음에 영화 하나를 찍어서 가르키면서 &quot;내가 이 영화를 좋아할까?&quot;라고 묻는다.
그 이야기는 자연스럽게 추천시스템으로 이어질 수 있다.
--&gt;

&lt;p&gt;한편, 반드시 선생만 학생을 motivate시켜야하는 것은 아니라는 것도 배웠다.
학생도 얼마든지 선생을 motivate 시킬 수 있다.
학생들의 열정은 선생에게 큰 힘이 되고, 하나라도 더 가르쳐주고 싶다는 원동력이 된다는 것을 배웠다.
이광근 교수님께서도 최근 저술하신
&lt;a href=&quot;https://www.goodreads.com/book/show/25737254&quot;&gt;컴퓨터 과학이 여는 세계&lt;/a&gt;에서 이 같은 생각을 말씀하셨다:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;강의실 학생들의 반짝이는 눈빛은 내겐 큰 은전이었다. 항상 그들의 시선을 북돋아주는 것으로 답하고 싶었다. 학생들이 던진 질문들이 나를 어떻게 공부시켰는지. 그들은 상상하지 못할 것이다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;간혹, 학생들로부터 선생들의 열정이 부족한 것 같다는 얘기를 들었다.
그런데 학생들도 선생이 열정이 가질 수 있게 할 수 있다.
좋은 강의를 듣고 싶다면, 선생들을 신나게 해주자.&lt;/p&gt;

&lt;h3 id=&quot;배움-3-getting-feedback-needs-effort&quot;&gt;배움 3. Getting feedback needs effort.&lt;/h3&gt;

&lt;p&gt;수업을 매학기 수개의 강의를 하시는 교수님들은 경험이 많아 문제가 없으시겠지만,
단 한 학기, 두 과목만 담당하게 된 내 입장에서
가장 먼저 만난 어려움은 &lt;a href=&quot;https://en.wikipedia.org/wiki/Cold_start&quot;&gt;콜드 스타트(cold start)&lt;/a&gt;였다.
강의든 세미나든 가장 중요한 것은 청중에 대한 지식을 가지고 그들에게 맞춤형으로 내용을 전달해야한다는 것인데,
나는 학생들에 대한 사전 지식이 거의 전무했다.
그래서 학생들에 대한 정보를 그 때 그 때 최대한 얻으려는 방식으로 문제를 극복하려 했다.
일단 수업과 별개로 첫 시간에 학생들에게 자기 소개서를 제출해달라고 부탁했고,
원래는 학기 말에 하는 강의평가를 매 수업이 끝날 때마다 진행했다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015-06-06-survey.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;매 수업이 끝난 후 두 가지 질문을 꾸준히 물었다:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;수업 수준이 어땠나요? (5점 스케일의 리커트 척도)&lt;/li&gt;
  &lt;li&gt;이번 수업에서 좋았던 점, 안 좋았던 점, 그리고 추가적으로 수업에 대해 제안하고 싶은 것이 있는지 말씀해주세요. (서술형)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;1번을 통해 학생들의 만족도를 파악할 수 있었고, 학생들에게 적정한 난이도를 찾으려고 했다.
예를 들자면 다음과 같은 피드백을 받을 수 있었다:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;너무너무너무너무너무너무 좋았습니다. 프로그래밍에 대해 어렵게 생각하고 하기 싫다는 부정적인 견해가 많았습니다. 하지만 교수님께서 눈높이를 맞쳐주시고 쉽고 천천히 모두가 이해할 수 있도록 설명해주시는 모습이 인상적이었습니다. 감사합니다.&lt;/li&gt;
    &lt;li&gt;저 정말 너무 재밌습니다. 1학년 때 자바를 배웠지만 그땐 흥미가없어서 저에게 프로그래밍은 잘맞지 않는것 같아 구체적으로 생각하고 있지 않았는데 교수님께 배우면서 정말 흥미를 많이 느낍니다. 감사합니다!&lt;/li&gt;
    &lt;li&gt;사전 수업 준비가 철저하시고 천천히 쉽게 설명해 주시려는 점도 정말 좋았습니다. 학생 의견을 최대한 수렴하려는 점도 정말 좋습니다.^0^//&lt;/li&gt;
    &lt;li&gt;기존의 다른 다른 교수님들에게는 조금 부족했던 열정을 보여주셔서 일방적인 게 아니라 함께하는 수업이라고 느꼈습니다.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;피드백이 항상 긍정적인 것은 아니었다. 때로는 다음과 같은 피드백도 받았고, 덕분에 많이 배웠다:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;수업안에서의 흐름에 대한 당위성? 원인과 결과? 이런게 좀더 분명했으면 좋겠습니다. 이렇기 때문에 이런걸 배우고, 또 이런것이 결과적으로 필요하다. 이런식으로 수업이 진행되었으면 좋겠습니다.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;이 방식을 적용한 데이터마이닝 수업은, 총 40명짜리 클래스였는데 학기 말까지 총 208건의 피드백을 받았다.
총 38명의 학생들이 설문에 참여했고, 학생 당 피드백 횟수는 평균적으로 4.58회였다.&lt;/p&gt;

&lt;!--
&lt;table class=&quot;table&quot;&gt;&lt;tr&gt;&lt;th&gt;count&lt;/th&gt;&lt;th&gt;date&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;2015-03-13&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;2015-03-20&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;2015-03-27&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;2015-04-03&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;2015-04-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;2015-04-17&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;2015-05-01&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;2015-05-15&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;2015-05-22&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;2015-05-29&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;2015-06-05&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;208&lt;/td&gt;&lt;td&gt;total&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

강의진,3
강정현,5
고혜림,2
구경모,1
김남훈,3
김도완,6
김선홍,9
김수연,1
김진국,6
김푸름,4
박성준,5
박소연,1
박연암,3
박지훈,5
배지현,3
백승일,9
서한빈,6
신창환,2
안영지,2
여현규,2
이문형,9
이승준,7
이유진,8
이윤서,7
이재훈,5
이정원,2
이충기,5
이한별,1
이현교,9
임지원,1
정재윤,8
정현도,3
조윤주,7
천훈영,5
최다영,3
최지수,4
한태경,3
황진호,9
--&gt;

&lt;p&gt;여러 가지 차원에서 강의의 openness를 최대한 확장하려 했지만,
강의 평가에 관한 한 학생들의 confidentiality를 보장해주려 했다.
처음에는 평가 결과를 학생들과 공유할까 했지만,
혹시 비밀보장이 안될 것을 우려해 입을 못 여는 학생이 있을까 싶어 공개를 안하기로 결정했다.&lt;sup id=&quot;fnref:5&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;!--
한편, 피드백 채널이 완전히 익명이었다면 (나조차도 피드백을 누가 쓴건지 몰랐다면)
부정적인 피드백을 조금 더 받아서 강의를 조금 더 개선할 수 있었겠지만,
사실 초보 시간강사에게 너무 과한 피드백이 들어왔다면 마음도 많이 아팠을 것 같아서
일면 다행이라고도 생각한다. :grin:
--&gt;

&lt;p&gt;또, Business Analytics 수업은 학생 수가 7명으로 적어서 직접 물어보면 되겠다고 생각했는데,
오히려 잘못된 생각이었던 것 같다.
온라인 피드백 채널이 오프라인에서 직접 얘기하는 것보다 좋은 점은
1) 수업이 끝난 후 충분히 생각할 시간이 주어지고
2) “좋게” 얘기해야한다는 학생들의 부담도 줄여줄 수 있다는 것이다.
학생 수가 적어도, 온라인 피드백을 받는 것이 좋을 것 같다.&lt;/p&gt;

&lt;h3 id=&quot;배움-4-encouraging-class-participation-is-difficult-even-more-than-you-expect&quot;&gt;배움 4. Encouraging class participation is difficult, even more than you expect.&lt;/h3&gt;

&lt;p&gt;데이터마이닝 수업은 인원이 40명으로 조금 더 많아서 사실 강의실 내에서 학생들과의 interaction이 많을거라고 기대하지는 않았다.
Business Analytics는 인원이 소수이기 때문에 조금 더 활발한 수업이 될 수 있을거라 생각했다.
그런데 한 가지 문제가 있었다.
그 수업은 영어 수업이었던 것이다.
한국어 수업이었어도 어려웠을텐데 영어 수업에서 학생들의 참여를 이끌어낸다는 것은 참 어려운 일이었다.
교육 사례를 찾아보니 토론을 활발하게 하기 위해서는 pairwise discussion을 시킨 후 발표하게 하면 낫다는 얘기도 있던데,
딱 한 번 해본 경험상 그게 분위기를 크게 바꾸지는 않았다.
학생들에게 이유를 물으니 언어 때문이라고 했다.&lt;/p&gt;

&lt;p&gt;또, 수업을 하는 모든 사람이 같은 염원을 가지고 있겠지만,
나도 수업이 강의실에서만 이루어지지 않고 강의실 밖에서도 이루어지기를 원했다.
요즘 e-class 시스템(또는 온라인 강의실)은 참 잘 되어 있다.
각종 MOOC들만 봐도 그렇고, 온라인 포럼, 평가 시스템 등이 (발전의 여지는 아주 많지만) 제법 쓸만하다.
나도 이번에 e-class를 최대한 활용하려고 했다.&lt;/p&gt;

&lt;p&gt;특히 &lt;a href=&quot;https://class.coursera.org/mmds-002/forum&quot;&gt;Coursera의 클래스 포럼&lt;/a&gt;이나
&lt;a href=&quot;https://piazza.com/&quot;&gt;Piazza&lt;/a&gt; 등을 보면
학생들이 교실 밖에서도 활발하게 토론하는 모습을 볼 수 있다.
그렇게 학생들 간 토론이 많이 이루어졌으면 좋겠다는 생각에
e-class와 구글그룹스 메일링 리스트를 열어두었다.&lt;/p&gt;

&lt;p&gt;결과적으로는 잘 안됐다.
일단 학생들이 그런 공개 토론 문화에 익숙지도 않은데 그 의도를 충분히 학생들에게 전달하지 못했던 탓이 컸다고 생각한다.
언젠가 다시 강의를 할 기회가 생긴다면 다시 한 번 시도를 해보고 싶은 부분이다.
토론을 평가 지표에 넣는 것도 방법이겠지만, 그것보다는 토론 문화를 만드는 방법에 대해 고민을 해보는 것이 좋을 것 같다.
교육 관련 자료를 찾다보면 첫 강의가 한 학기의 분위기를 완전히 판가름한다는 얘기가 있다.
온라인이든, 오프라인이든,
좋은 토론 문화를 만들려면 첫 시간부터 토론을 활성화시키는 것이 중요한듯 하다.
그렇게 할 수 있는 방법은 아직 조금 더 고민을 해봐야겠지만.&lt;/p&gt;

&lt;p&gt;또, e-class로는 시험 문제도 낼 수 있는데, 문제와 문항의 셔플 등까지도 가능해서 컨닝 등을 방지하기 좋았다.
자동채점까지 해주니 조교가 배정되지 않은 내 입장에서는 아주 매력적인 시스템이었다.
다만 주관식은 학생들이 수식 등을 입력할 수 없어서 시험 문항에서 제외했는데,
시험이 다 끝나고 나서야 든 생각이지만, 객관식은 e-class로 내고 주관식만 별도로 종이 시험으로 봤어도 좋았을 것 같다.&lt;/p&gt;

&lt;h3 id=&quot;배움-5-가르치는-법도-배워야-한다&quot;&gt;배움 5. 가르치는 법도 배워야 한다.&lt;/h3&gt;

&lt;p&gt;강의실에는 내가 예상치 못한 수많은 boundary cases가 있는데,
굳이 처음부터 시행착오를 겪어가며 하나하나 배울 필요는 없는 것 같다.
교수법에 대해 알려진 스터디는 무수하게 많다.
심지어 딱 나같은 사람을 위한 이런 글도 있다:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www2.warwick.ac.uk/fac/cross_fac/heahistory/publications/focusonteaching/teachingasaphd/&quot;&gt;Teaching as a Phd Student&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.psychologicalscience.org/index.php/publications/observer/2013/march-13/tips-for-the-first-time-graduate-student-instructor.html&quot;&gt;Tips for the First-Time Graduate Student Instructor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;그런데 아직까지도 고민되는 것이 하나 있다.
내가 과제, 또는 강의실의 원칙을 잘못 정해서 수정하고 싶을 때는 어떻게 해야할까?
양해를 구하고 원칙을 수정해야할까, 한 번 정해진 원칙을 원칙이라고 고수해야할까?
나는 지난 학기에 전자를 택했지만 그 방법이 좋은 것인지는 아직도 모르겠다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;원칙을 수정한 예: 올해 모 회사가 주최한 코딩 대회에서 하면 안되는 원칙을 미리 공지하지 않아서, 그런 “헛점”을 이용해 좋은 성능을 낸 참여자들이 있었다. 주최측은 “헛점”을 이용한 참가자들을 실격처리 했다.&lt;/li&gt;
  &lt;li&gt;원칙을 고수한 예: 모 대학의 Information Retrieval 수업에서 query-answer set을 가지고 Okapi BM25를 측정하는 과제가 있었는데, 한 학생이 if-else 문 100개를 써서 좋은 성능을 얻었다고 한다.  그런데 처음부터 공지한 바가 없기 때문에 학생에게 애초에 공지한대로 높은 점수를 주었다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;애초에 설계를 잘하지 못했다면, 사후에 어떤 방식을 취하든 참가자들은 잘못된 설계 탓을 할 것이다.
그리고 나도 그런 문제는 100% 시스템의 설계자 탓이라고 생각한다.
게임에 fair player들만 있는 것은 물론 아니고, 시스템에 헛점이 있으면 그 구멍을 이용하는 사람은 얼마든지 있을 수 있다.&lt;/p&gt;

&lt;p&gt;강의도 처음부터 잘 설계되어 운영되면 좋겠지만, “처음”이라는 것의 어려움은 만만치 않다.
그나마 다행인 것은, 항상 “다음”이라는 것이 존재한다는 것.&lt;/p&gt;

&lt;h3 id=&quot;배움-6-데이터-사이언스-강의에서-프로그래밍이-필수적이지는-않다&quot;&gt;배움 6. 데이터 사이언스 강의에서 프로그래밍이 필수적이지는 않다.&lt;/h3&gt;

&lt;p&gt;보통은 박사과정 학생에게 수업의 커리큘럼을 맡기지는 않을텐데, 믿음을 가지고 커리큘럼에 대한 98%, 최대한의 자유를 주셨다.&lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;
Drew Conway가 &lt;a href=&quot;/blog/2015/06/21/the-data-science-venn-diagram/&quot;&gt;데이터 사이언스 벤 다이어그램&lt;/a&gt;을 통해서도 얘기했지만, 데이터는 전자적으로(electronically) 거래되는 재화(commodity)이기 때문에 이 시장에 참여하기 위해서는 좋은 싫든 프로그래밍을 좀 해야한다.
그런 차원에서 나도 학생들이 “입데마”를 하지 않게하기 위해 여느 데마 수업과 마찬가지로 프로그래밍을 중요한 일부분으로 포함을 시켰다.&lt;/p&gt;

&lt;p&gt;그런데 여기서 내가 간과한 사실이 두 가지가 있는데,
첫째는 학생들의 프로그래밍 수준을 모른 채로 덤볐다는 것과
둘째는 이 수업이 데이터마이닝 심화도 아니고 입문 수업이라는 사실이었다.&lt;/p&gt;

&lt;p&gt;먼저, 학생들 간의 수준 차가 크다.
다음은 프로그래밍 관련해서 학생들이 준 피드백이다:&lt;/p&gt;

&lt;blockquote&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;Python 을 처음 쓰는 사람이 많았기 때문에 처음 설명부분에서 자세하게 할 수 밖에 없는 부분은 이해하지만 이부분에서 너무 많은 시간을 쓴 것 같습니다 :D&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;특히 학부 수준의 데이터마이닝 수업에 참여하는 학생들이 모두 프로그래밍을 할 수 있는 것은 아니기 때문에
이들은 프로그래밍을 하기 위해 별도의 노력을 하거나, 어느 정도 소외가 될 수 밖에 없다.
&lt;a href=&quot;/courses/tips/introduction-to-python.html&quot;&gt;파이썬 튜토리얼을 한 시간 가지기는 했지만&lt;/a&gt;
이런 식의 crash course는 가장 기본적인 문법을 다루는 것에 그칠 뿐
소프트웨어 버젼 확인하기나 디버깅 방법 등 pragmatical한 프로그래밍은 전혀 다룰 수 없다.
(그러면 자연히 학생들의 고생이 많아지고, 흥미도 떨어진다. 이건 가장 지양해야 하는 것!)&lt;/p&gt;

&lt;p&gt;이 수업은 데이터마이닝 수업이다.
그런데도 그 안에서
배워야할게 프로그래밍과 데이터 사이언스 두 가지라면 학생 입장에서는 벅찰 수밖에 없다.
&lt;a href=&quot;https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms&quot;&gt;그 중 한 가지라도 없으면 문제의 복잡도가 낮아져서 훨씬 수월해진다&lt;/a&gt;.
이상적인 경우에는 데이터마이닝을 두 학기로 나눠서 한 학기는 이론,
다른 한 학기는 (프로그래밍을 완비한 상태로) 실습을 해도 좋겠지만,
상황이 여의치 않아 한 학기밖에 없을 때는
아쉬운대로
이론만 다루는 것도 괜찮을 것 같다.
즉, 논란의 여지는 있겠지만, 목적이 데이터마이닝 알고리즘에 대한 감을 잡게 하는 것이라면 프로그래밍은 굳이 필요하지 않다.&lt;/p&gt;

&lt;p&gt;그럼에도 만일 한 학기 내에 프로그래밍을 꼭 해야한다고 생각한다면,
미리 공개된 패키지를 이용해 알고리즘을 돌려보는 것보다는 linear regression 과 같이 단순한 알고리즘을 직접 짜서 돌려보게 하는게 나은 것 같다.
게다가 패키지를 쓰게 하면 카피 잡는 것이 무지 어렵다. 심증은 있으나 물증이 없기 때문에.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[숙제 예시] Linear regression을 직접 짜보고, 서로 다른 성질을 가진 세 가지의 주어진 데이터셋에 적용해서 좋은 예측 성능 내기 (점수는 예측 성능에 따라 부여)&lt;/p&gt;

  &lt;ol&gt;
    &lt;li&gt;중고차 가격 예측 등과 같이 재미있으면서도 성능이 잘 나올 법한 일반적인 데이터셋&lt;/li&gt;
    &lt;li&gt;변수의 개수가 월등히 많은 fat 한 데이터 (feature selection의 중요성, 차원의 저주를 알려주기 위한 초석)&lt;/li&gt;
    &lt;li&gt;Classification 문제 (다음 알고리즘인 logistic regression으로 넘어가기 위한 초석)&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;마지막으로, 프로그래밍 언어를 파이썬으로 할지 R로 할지도 고민을 많이 했다.
나는 파이썬을 택했지만, 학기가 끝난 후에는 파이썬 대신 자바스크립트를 선택했어도 괜찮았을 것 같다는 생각이 들었다.
여러 단점에도 불구하고,
자바스크립트는 결과물을 바로바로 시각적으로 볼 수 있어서 engage 되기 쉽고
OS의 영향을 적게 받기 때문에 프로그래밍을 처음 접하거나 익숙하지 않은 학생들에게도
“즐거움”을 좀 더 줄 수 있기 때문이다.
(한편, 대부분의 학생들이 프로그래밍에 꽤 익숙하거나
앞으로 직업적으로 코딩을 할 친구들이었다면 다른 선택을 했을 것이다.)
요즘엔 자바스크립트 라이브러리와 튜토리얼도 많다:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Clustering: &lt;a href=&quot;http://engineer.abeja.asia/?p=124&quot;&gt;Clustering in JavaScript&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Deep nets: &lt;a href=&quot;http://cs.stanford.edu/people/karpathy/convnetjs/&quot;&gt;ConvNetJS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/josephmisiti/awesome-machine-learning#javascript&quot;&gt;그리고 여기에 훨씬 더 exhaustive 리스트가 있음&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;배움-7-그-외의-것들&quot;&gt;배움 7+: 그 외의 것들&lt;/h3&gt;

&lt;p&gt;그 외에 간간이 메모해 둔 것들을 무작위로 나열해보았다:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;좋은 수업(시스템)을 만드는데는 어마어마어마어마한 시간이 들어간다.&lt;/li&gt;
  &lt;li&gt;수업 프로젝트로 Kaggle 문제를 써도 된다고 했는데, submission 가능한 것에 한정해서 실제로 submission까지 하게 했으면 좋았을 것 같다.&lt;/li&gt;
  &lt;li&gt;수업 프로젝트 제안서를 제출하기 전에 학생들이 데이터마이닝의 개념에 어느 정도 익숙해지거나, 제안서 예시가 여러 개 주어져야 한다.
    &lt;ul&gt;
      &lt;li&gt;실제로 전에 통계 수업을 들어본 학생들은 설문조사를 해서 그 데이터로 학습하려고 했음&lt;/li&gt;
      &lt;li&gt;이미 산출된 통계량을 사용하려는 학생들도 있었음&lt;/li&gt;
      &lt;li&gt;기본적으로 어떤 분석을 할 수 있는지 모르기 때문에 목적과 방법이 부합하지 않을 수 있음&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;과제는 굳이 엄밀하게 채점하지 않아도 되는듯. 특히 수업 초반의 과제를 엄격하게 채점하면 채점하는 사람은 힘들면서 학생들의 의욕만 떨어진다.&lt;/li&gt;
  &lt;li&gt;선생은 건강에 특별히 유의해야 한다. 4월 말 독감에 걸렸는데, 매주 말을 해야해서 엄청 고생했다. 기침이 오래 간게 반드시 수업 때문이라고는 할 수 없겠지만, 나을만하면 수업을 해야해서 다시 기침이 심해지는 것이 반복돼서 목이 좀처럼 낫지 못한 것 같다. 결국 6월 말에 다 나은건 우연만은 아니라고 생각함.
    &lt;ul&gt;
      &lt;li&gt;특히 대학의 시간 강사에게 휴강은 있지만 휴가는 없다. 대체해줄 사람이 없으니 결석을 할 수도 없고, 학기 중에 사표를 낼 수도 없다.&lt;/li&gt;
      &lt;li&gt;게다가 엄밀히 말하면, 휴강을 하는 것은 돈을 받고 서비스를 제공하지 않는 것이다. 정말 불가피한 경우 휴강을 할 수는 있지만, 말 그대로 정말 불가피한 경우에 해당된다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;잘 말하는 연습은 &lt;a href=&quot;http://www.paulgraham.com/speak.html&quot;&gt;그럼에도&lt;/a&gt; 필요하다.&lt;/li&gt;
  &lt;li&gt;조교가 없으면 정말 정말 힘들다.
    &lt;ul&gt;
      &lt;li&gt;수업 준비, 과제/시험 출제/채점, 이메일 답변까지 하려니 몸이 남아나질 않았다. 이 중 하나만 빠져도 할 만 할 것 같은데, 뺄 수 있는게 없다. (결국 이메일 답변에 소홀해지곤 했다.)&lt;/li&gt;
      &lt;li&gt;이런 상황을 나도 예상하고, 학생들에게 양해를 구하고, 그렇기 때문에 너희가 서로 peer discussion을 많이 해야한다는 얘기도 했으면 좋았을듯.&lt;/li&gt;
      &lt;li&gt;책임과 권한 분산, 즉 공정성을 위해서도 조교는 필요하다. 모든 권한이 한 곳에 집중되는 것은 언제나 위험하다.&lt;/li&gt;
      &lt;li&gt;어쨌든 그런 의미에서 수백명 수업하고 답안지 채점하는 초중고등학교 선생님들 존경합니다..&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;나는 openness advocate여서 강의자료도 최대한 open하려고 했다. 강의자료에 내 저작물이 아닌 것이 포함된 경우(ex: 선배님 강의록 발췌)에는 공개하지 않았다. 언젠가 완전히 나만의 자료로 만들게 될 기회가 생긴다면 전부 open할 생각이다.&lt;/li&gt;
  &lt;li&gt;강의 자료를 만들 때 다른 사람의 자료를 인용할 일이 있으면 출처 표기에 각별히 신경썼는데, 빠르게 작업하는 자료에서 출처를 하나하나 명시하는 것이 힘들다는 것을 느꼈다. 내 스스로를 합리화하는 것이라기보다는, 간혹 의견/내용의 출처를 누락하는 사람들이 의도적으로 그런게 아닐 수 있겠다는 것을 이해하게 되었다.&lt;/li&gt;
  &lt;li&gt;사실 선배님이 물려주신 훌륭한 강의 노트도 있었고 선배님은 자유롭게 쓰라고 하셨지만, 웬지 그대로 쓰기에는 내 자존심이 허락하지 않아서 나만의 강의자료를 만들기 시작했다.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;지금은 강의자료에 영어와 한국어가 혼재되어 있는데, 이것도 어떤 학생들은 불편했다고 한다. 앞으로 한국어 강의는 최대한 한국어로 만들어야겠다는 생각.&lt;/li&gt;
  &lt;li&gt;단 한 번도 가르치는 입장으로 자료 정리를 한 적이 없는데, 지난 학기를 기점으로, 다른 누군가에게 다시 티칭할 수 있는 가능성을 염두에 두고 자료를 모르기 시작했다.&lt;/li&gt;
  &lt;li&gt;한 강의에 학생수가 너무 많다. 조금 슬펐던 피드백은, 열정이 없는 교수님들 중에 돋보엿다는 것이었다. 나도 학생들을 하나하나 충분히 챙겨주지 못해 미안한 마음이 많이 있었는데도, 그런 얘기를 들었다. Richard Socher가 지난 학기에 스탠포드에서 맡은 &lt;a href=&quot;http://cs224d.stanford.edu/&quot;&gt;CS224d 수업&lt;/a&gt;은 조교 수가 무려 6명이었다. 160명 정도가 강의를 들었다고 하니 강사를 포함해서 1인당 20명 조금 넘는 인원을 맡은 것이다. 실제로 이번에 내가 e-class를 통해 시험을 본 이유는 내가 꼼꼼하게 채점을 할 자신이 없어서기도 했다. 즉, 조교의 유무, 뜨논 교수+조교 대 학생 비율이 evaluation의 방법이나 수준까지 결정을 할 수 있다는 것이다.&lt;/li&gt;
  &lt;li&gt;가까워지려는 노력을 굳이 하지 않아도 나이 차가 적은 시간 강사니까 학생들이 나를 편하게 여길 줄 알았지만, evaluator과 evaluatee 간의 벽은 존재했다.&lt;/li&gt;
  &lt;li&gt;학생들과 가까워지고 싶으면서도 우습게 보이지 않아야 한다는&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;, 그 종잇장만큼 얇은 차이 사이에서 줄 타기하는 것은 어렵다.&lt;/li&gt;
  &lt;li&gt;발표 후 “질문이나 코멘트 있으시면 말씀해주시기 바랍니다.”를 말하는 것도 교육의 일부분이구나.&lt;/li&gt;
  &lt;li&gt;데이터 마이닝이 &lt;a href=&quot;https://machinelearningmastery.com/applied-machine-learning-process/&quot;&gt;problem definintion, data acquisition부터 presentation까지&lt;/a&gt;라면, 시각화도 중요한 요소라고 생각해서 포함.&lt;/li&gt;
  &lt;li&gt;과제에 extra credit 문제를 포함시키는 것은 무의미한듯.&lt;/li&gt;
  &lt;li&gt;첫번째 숙제로 &lt;a href=&quot;/courses/2015-dm/assignments.html#assignment-1-classification&quot;&gt;MNIST 데이터셋 분류하기&lt;/a&gt;를 냈는데, 학생들이 무척 힘들어하면서도 재밌어했다. 괜찮았던듯.&lt;/li&gt;
  &lt;li&gt;교습법 연구에 자주 등장하는 말이긴 한데, 나는 내가 평가할 자격이 되나 싶은데, 학생들은 나를 “절대자”로 믿는 것이 부담스러웠다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;나도 학부 때 백 수십 학점에 해당하는 수업을 들었지만, 기억에 남는 것은 손에 꼽힌다.
학생들이 삶을 살아가는데 필요한 철학, 또는 데이터 기반의 사고를 수업을 통해 조금이라도 얻어간다면 그것으로 족하지 않을까.
그리고 학생들이 종강을 빨리 하기를 원한다지만,
사실 그 강의실에 있던 그 누구보다도 내가 빨리 종강하고 싶었을 것 같다.ㅋㅋ&lt;/p&gt;

&lt;p&gt;우여곡절 많은, 그럼에도 참 뜻깊은 시간이었다.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;사실 이건 반드시 less is more이어서 좋았다기보다는 교수님의 내공이 존경스러웠던 것일지도 모르겠다. :sweat:&amp;nbsp;&lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:6&quot;&gt;
      &lt;p&gt;이건 반드시 수업 시작할 때가 아니라 직전 시간에 해도 좋을듯. 어쩌면 그게 나을지도.&amp;nbsp;&lt;a href=&quot;#fnref:6&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:5&quot;&gt;
      &lt;p&gt;이 원칙은 설문조사 시행 후 나 혼자 결정한 것인데, 학생들에게 명시적으로 전달해주지 못한 점이 아쉽다.&amp;nbsp;&lt;a href=&quot;#fnref:5&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;2%는 다른 학교와의 협약 때문에 이미 정해져 있었다.&amp;nbsp;&lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://parkjonghee.wix.com/research&quot;&gt;존경하는 또 다른 교수님&lt;/a&gt;은, 자기가 직접 만든 강의자료를 쓰지 않으면 “죽은 강의”가 된다고 조언해주셨다. 무척 공감했다.&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;재밌게도, 선생이 우습게 보이면 학생들의 학업 성취가 크게 떨어진다는 연구도 있다: Bain, K. (2004). What the best college teachers do. Cambridge, MA: Harvard University Press.&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Mon, 03 Aug 2015 17:33:00 -0700</pubDate>
        <link>http://www.lucypark.kr/blog/2015/08/03/lecturing/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2015/08/03/lecturing/</guid>
        
        <category>lecturing</category>
        
        
      </item>
    
      <item>
        <title>D3를 이용한 서울시내 맛집 시각화 (feat. 식신로드)</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;이 글의 초안은 원래 지난 5월 초에 작성했는데, 바쁜 일들 처리하고, 메르스가 오고, 여차저차 하다보니 어느덧 6월 말이 되어버렸네요. 시의성을 위해서는 맛집 대신 &lt;a href=&quot;http://mersmap.com&quot;&gt;다른 내용의 지도&lt;/a&gt;를 내보내는게 좋을 것 같지만, 이 또한 나름의 의미가 있는듯 해서 그대로 올립니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!-- more --&gt;
&lt;p&gt;맛집&lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;과 같이 &lt;strong&gt;지리적 위치&lt;/strong&gt;가 중요한 데이터는 지도 상에 표시했을 때 훨씬 보기가 쉽다.
(ex: 이성빈, &lt;a href=&quot;http://blog.naver.com/ryuiel/220344353129&quot;&gt;봉천동 맛집 대폭발공개&lt;/a&gt;)
비단 맛집 뿐 아니라 &lt;a href=&quot;http://ansim.me/&quot;&gt;병원&lt;/a&gt;이나, &lt;a href=&quot;https://wishbeen.co.kr/plan/2d39a1f6192018a3&quot;&gt;여행 일정&lt;/a&gt;등도 &lt;strong&gt;지도&lt;/strong&gt;라는 시각화 방식을 사용하면 훨씬 효과적으로 정보를 전달할 수 있다.&lt;/p&gt;

&lt;p&gt;게다가 지도 상에 점을 찍는 것은 어렵지 않다.
가장 손쉽게는 MS 파워포인트를 이용할 수 있고,
디자이너분들께서 능숙하게 다루는 어도비 포토샵이나 일러스트레이터도 있지만
그 밖에도 아주 손쉽게 사용할 수 있는, 지도에 특화된 서비스도 많다 &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://a.tiles.mapbox.com/v4/e9t.m5i26pom/page.html?access_token=pk.eyJ1IjoiZTl0IiwiYSI6IkZVM3JiSTAifQ.kEYkiPjN62oTKgAHV8bcxw#11/37.6195/126.9964&quot;&gt;맵박스&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.google.com/maps/d/u/0/edit?mid=zyQI2YnznlUc.kJpfm7-T19ek&quot;&gt;구글 마이맵스&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.google.com/fusiontables/DataSource?docid=1BrcGxSjXxWwBsD7BE9AE3aLrRcJItrejbaBvBRw#map:id=3&quot;&gt;구글 퓨전테이블&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;또는 지도 특화 서비스는 아니지만
&lt;a href=&quot;http://4sq.com/1IvyvGJ&quot;&gt;포스퀘어&lt;/a&gt; 같은
맛집 서비스를 이용해서 나만의 지도를 큐레이션할 수도 있다.
이들은 모두 클릭 몇 번만 하면 화면 너머 블랙박스에서 돌아가는 마술로 지도 위에 점을 멋있게 뿌려준다는 특성을 가지고 있다.&lt;/p&gt;

&lt;p&gt;그런데 맛집 지도를 &lt;strong&gt;웹 기반으로, 인터렉티브&lt;/strong&gt;하게 만들 수는 없을까?
그 동안 마이크 보스톡(Mike Bostock)느님이 미국 지도를 이용해서
&lt;a href=&quot;http://bl.ocks.org/mbostock/9744818&quot;&gt;다양하고&lt;/a&gt;
&lt;a href=&quot;http://bl.ocks.org/mbostock/9885854&quot;&gt;멋진&lt;/a&gt;
&lt;a href=&quot;http://bl.ocks.org/mbostock/9978356&quot;&gt;시각화&lt;/a&gt;를 수도 없이 많이 보여줬는데,
우리 지역의 지도로는 그렇게 만들 수 없나?&lt;/p&gt;

&lt;p&gt;물론 할 수 있다.
여기서 총 4단계에 걸쳐 다음의 웹 기반 &lt;strong&gt;서울 맛집 지도&lt;/strong&gt;를 그리는 방법에 대해 알아보자.&lt;/p&gt;

&lt;div class=&quot;hidden-xs&quot;&gt;
    &lt;!-- https://gist.github.com/e9t/ba9edd99793a5c91eaab --&gt;
    &lt;style&gt;
        svg circle {
          fill: orange;
          opacity: .5;
          stroke: white;
        }
        svg circle:hover {
          fill: red;
          stroke: #333;
        }
        svg text {
          pointer-events: none;
        }
        svg .municipality {
          fill: #efefef;
          stroke: #fff;
        }
        svg .municipality-label {
          fill: #bbb;
          font-size: 12px;
          font-weight: 300;
          text-anchor: middle;
        }
        svg #map text {
          color: #333;
          font-size: 10px;
          text-anchor: middle;
        }
        svg #places text {
          color: #777;
          font: 10px sans-serif;
          text-anchor: start;
        }
        #title {
            font-family: sans-serif;
        }
        #title p {
            font-size: 10pt;
        }
    &lt;/style&gt;
    &lt;div id=&quot;chart&quot;&gt;&lt;/div&gt;
    &lt;script src=&quot;https://d3js.org/d3.v3.min.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://d3js.org/topojson.v1.min.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
    var width = 800,
        height = 600;
    var svg = d3.select(&quot;#chart&quot;).append(&quot;svg&quot;)
        .attr(&quot;width&quot;, width)
        .attr(&quot;height&quot;, height);
    var map = svg.append(&quot;g&quot;).attr(&quot;id&quot;, &quot;map&quot;),
        places = svg.append(&quot;g&quot;).attr(&quot;id&quot;, &quot;places&quot;);
    var projection = d3.geo.mercator()
        .center([126.9895, 37.5651])
        .scale(100000)
        .translate([width/2, height/2]);
    var path = d3.geo.path().projection(projection);
    d3.json(&quot;https://gist.githubusercontent.com/e9t/ba9edd99793a5c91eaab/raw/de4c6da8eb7106494c68f9a9fcdbdf978559edd8/seoul_municipalities_topo_simple.json&quot;, function(error, data) {
      var features = topojson.feature(data, data.objects.seoul_municipalities_geo).features;
      map.selectAll('path')
          .data(features)
        .enter().append('path')
          .attr('class', function(d) { console.log(); return 'municipality c' + d.properties.code })
          .attr('d', path);
      map.selectAll('text')
          .data(features)
        .enter().append(&quot;text&quot;)
          .attr(&quot;transform&quot;, function(d) { return &quot;translate(&quot; + path.centroid(d) + &quot;)&quot;; })
          .attr(&quot;dy&quot;, &quot;.35em&quot;)
          .attr(&quot;class&quot;, &quot;municipality-label&quot;)
          .text(function(d) { return d.properties.name; })
    });
    d3.csv(&quot;https://gist.githubusercontent.com/e9t/ba9edd99793a5c91eaab/raw/de4c6da8eb7106494c68f9a9fcdbdf978559edd8/places.csv&quot;, function(data) {
        places.selectAll(&quot;circle&quot;)
            .data(data)
          .enter().append(&quot;circle&quot;)
            .attr(&quot;cx&quot;, function(d) { return projection([d.lon, d.lat])[0]; })
            .attr(&quot;cy&quot;, function(d) { return projection([d.lon, d.lat])[1]; })
            .attr(&quot;r&quot;, 10);
        places.selectAll(&quot;text&quot;)
            .data(data)
          .enter().append(&quot;text&quot;)
            .attr(&quot;x&quot;, function(d) { return projection([d.lon, d.lat])[0]; })
            .attr(&quot;y&quot;, function(d) { return projection([d.lon, d.lat])[1] + 8; })
            .text(function(d) { return d.name });
    });
    &lt;/script&gt;
&lt;/div&gt;
&lt;div class=&quot;visible-xs&quot;&gt;
    &lt;img src=&quot;/images/2015-06-22-done.png&quot; width=&quot;400px&quot; class=&quot;caption&quot; alt=&quot;인터랙티브 버젼은 너비 768px 이상의 큰 화면에서만 보실 수 있습니다.&quot; /&gt;
&lt;/div&gt;

&lt;h3 id=&quot;0단계-들어가기-전&quot;&gt;0단계: 들어가기 전&lt;/h3&gt;

&lt;p&gt;웹 기반 인터렉티브 지도를 그리기 위해서는 몇 가지 기반 기술과 재료가 필요하다.
일단 HTML, CSS, 자바스크립트에 대한 사전지식이 조금 있어야하고,
아래의 두 가지가 적어도 무슨 일을 하는 녀석들인지 알아야 한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://d3js.org&quot;&gt;D3.js&lt;/a&gt;: 자바스크립트 라이브러리로서, 데이터 기반으로 DOM을 편리하게 조작할 수 있게 해준다. 앞서 언급한 마이크 보스톡은 이 라이브러리를 능수능란, 자유자재로 다루기로 유명하다.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mbostock/topojson&quot;&gt;TopoJSON&lt;/a&gt;: 지리공간적 데이터를 담는 포맷의 일종인데, GeoJSON의 보다 훨씬 효율적&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;인 버젼이라고 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;재료로는 1) 지도 데이터와 2) 맛집 목록이 필요하다.&lt;br /&gt;
먼저 지도 데이터는 &lt;a href=&quot;https://github.com/southkorea/seoul-maps&quot;&gt;서울시 셰이프파일을 TopoJSON으로 변환한 파일&lt;/a&gt;을 썼고,
맛집 목록은 위키트리 김도담 기자님의
&lt;a href=&quot;http://www.wikitree.co.kr/main/news_view.php?id=217101&quot;&gt;식신로드 서울지역 만점식당 20선&lt;/a&gt;을 이용했다.
이 리스트를 선택한 이유는 맛집의 이름 뿐 아니라 주소까지 나와 있어서,
지오매핑(geomapping)이 아주 편하기 때문이다.
(물론 식신로드 만점식당을 정주행해보고 싶다는 개인적인 소망도 크게 작용했다.)&lt;/p&gt;

&lt;h3 id=&quot;1단계-맛집의-위경도-구하기&quot;&gt;1단계: 맛집의 위경도 구하기&lt;/h3&gt;

&lt;p&gt;주소가 있으면, 맛집의 위도와 경도를 아주 쉽게 구할 수 있다.
나는 다음과 같이 quick ‘n dirty하게 &lt;a href=&quot;http://developer.naver.com/wiki/pages/JavaScript&quot;&gt;네이버의 지도 API&lt;/a&gt;를 이용했다:&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;figcaption class=&quot;code-highlight-caption&quot;&gt;&lt;span class=&quot;code-highlight-caption-title&quot;&gt;crawl.py&lt;/span&gt;&lt;a class=&quot;code-highlight-caption-link&quot; href=&quot;https://gist.github.com/e9t/ba9edd99793a5c91eaab&quot;&gt;link&lt;/a&gt;&lt;/figcaption&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;c&quot;&gt;#! /usr/bin/python3&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;lxml&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;html&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;requests&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;7&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;8&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;n&quot;&gt;APIKEY&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;''&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# 이 곳에 네이버 API 키를 입력 (http://developer.naver.com/wiki/pages/OpenAPI)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;9&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;n&quot;&gt;MAPAPI&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'http://openapi.map.naver.com/api/geocode.php?key=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s&amp;amp;encoding=utf-8&amp;amp;coord=LatLng&amp;amp;query=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s'&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;10&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;11&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;12&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_latlon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;13&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MAPAPI&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;APIKEY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;14&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;lon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xpath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'//point/x/text()'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xpath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'//point/y/text()'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;15&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;16&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;17&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;18&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;prep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;19&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;' '&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;20&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lon&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_latlon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;21&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;22&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;s&quot;&gt;'num'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'name'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;23&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;s&quot;&gt;'lat'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'lon'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;24&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;s&quot;&gt;'description'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;25&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;s&quot;&gt;'phone'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;26&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;s&quot;&gt;'addr'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;27&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;28&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;29&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;30&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# get data from article&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;31&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'http://m.wikitree.co.kr/main/news_view.php?id=217101'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;32&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;document_fromstring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;33&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xpath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'//div[@id=&quot;ct_size&quot;]/div//text()'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;34&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;35&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;36&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;37&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s.'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;38&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;39&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\xa0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;40&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;41&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:]]&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;42&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;43&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;44&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# save data to file&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;45&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'places.csv'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'w'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;46&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'name,lat,lon&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;47&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;48&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%(name)&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s,&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%(lat)&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s,&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%(lon)&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;찍으려는 좌표가 몇 개 안 되거나 찍고자하는 점의 주소를 구하지 못한 경우에는 수작업으로 위경도 정보를 얻는 방법도 있다.
일종의 꼼수지만, 다음과 같이 &lt;a href=&quot;http://maps.google.com&quot;&gt;구글 지도&lt;/a&gt;에 상호명을 입력하면 대략적인 위경도 정보가 URL에 뜬다:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015-06-22-gmap.png&quot; width=&quot;800&quot; /&gt;&lt;/p&gt;

&lt;p&gt;최종적인 맛집 데이터는 다음과 같이 식당 이름(name), 위도(lat, latitude), 경도(lon, longitude)만 최소한으로 담고 있으면 된다.
(물론 필요에 따라 변수를 추가하면, 점의 색이나 모양 등을 그에 맞게 바꿀 수 있다.)&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;figcaption class=&quot;code-highlight-caption&quot;&gt;&lt;span class=&quot;code-highlight-caption-title&quot;&gt;places.csv&lt;/span&gt;&lt;a class=&quot;code-highlight-caption-link&quot; href=&quot;https://gist.github.com/e9t/ba9edd99793a5c91eaab&quot;&gt;link&lt;/a&gt;&lt;/figcaption&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;name,lat,lon
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;다성일식,37.5569016,126.9329799
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;봉산집,37.5344248,126.9750082
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;창고43,37.5189582,126.9307458
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;돕감자탕,37.5414873,127.0692836
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;대보명가,37.6456867,127.0071573
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;7&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;해뜨는집,37.5900691,127.0084044
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;8&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;아이 해브어 드림,37.4986175,127.0278876
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;9&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;아현동 간장게장,37.5546000,126.9561000
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;10&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;왕소금구이,37.5204088,127.0361107
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;11&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;라틀리에 모니크,37.5261816,127.0448766
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;12&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;비스트로 딩고,37.5210777,127.0198099
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;13&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;줄리에뜨,37.4947204,127.0009384
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;14&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;충주집,37.5862178,127.0345490
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;15&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;영화루,37.5801384,126.9690401
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;16&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;일품헌,37.4845029,127.0391935
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;17&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;립스테이크,37.5955682,126.9640695
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;18&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;오가와,37.5720260,126.9743351
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;19&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;까사디노아,37.5620845,126.9235561
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;20&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;충무로 주꾸미 불고기,37.5617693,126.9921966
&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;서울 지역에 대한 데이터이기 때문에 위도는 대부분 37도 부근, 경도는 127도 부근에 위치하고 있다.
내 데이터가 부정확한 값을 담고 있으면 지도도 제대로 그릴 수 없다.&lt;/p&gt;

&lt;h3 id=&quot;2단계-지도를-펼쳐보자&quot;&gt;2단계: 지도를 펼쳐보자&lt;/h3&gt;

&lt;p&gt;맛집 데이터를 구해두었으니, 맛집을 지도에 뿌리기 전에 먼저 지도를 그려보자.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;이라는 이름으로 HTML 파일을 하나 생성하고 아래를 복사해 넣자.
앞에서 HTML에 대한 사전지식이 있어야 한다고 했지만 우리가 사용할 HTML은 이게 전부고,
여기에 CSS와 자바스크립트만 조금(?) 채워 넣으면 된다.&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;charset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;c&quot;&gt;/* CSS는 여기에 */&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;7&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;8&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;9&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;10&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;chart&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;11&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://d3js.org/d3.v3.min.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;12&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://d3js.org/topojson.v1.min.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;13&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;14&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;c1&quot;&gt;// 자바스크립트는 여기에&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;15&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;16&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;17&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;10번째 줄에서 id가 chart인 div를 생성했는데,
자바스크립트를 이용해서 이곳에 우리의 지도를 넣을 것이다.&lt;/p&gt;

&lt;p&gt;웹페이지에 “옷을 입히는 부분”인 CSS는 뒤에서 다시 살펴보고,
일단 자바스크립트부터 넣어보자.
11, 12번째 줄에서 각각 d3.v3.min.js와 topojson.v1.min.js를 불러오고 있다.
전자는 d3.js를 사용하기 위해 필요하고, 후자는 지도 데이터를 렌더링하는데 사용된다.
지금부터 우리가 작성하는 코드는 “자바스크립트는 여기에”라고 되어 있는 부분에 입력하면 된다.&lt;/p&gt;

&lt;p&gt;먼저 d3를 이용해서 10번째 줄의 div 안에 크기가 800x600 픽셀인 svg를 생성해보자.
이 div의 id가 chart라는 성질을 이용했다.&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;800&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nx&quot;&gt;height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;600&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;#chart&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;svg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;다음으로 svg 안에 지도 레이어 &lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt;과 맛집 레이어 &lt;code class=&quot;highlighter-rouge&quot;&gt;places&lt;/code&gt;를 만들자.&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;svg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;g&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;map&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nx&quot;&gt;places&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;svg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;g&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;places&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;지도를 그릴 때 다양한 &lt;a href=&quot;https://github.com/mbostock/d3/wiki/Geo-Projections&quot;&gt;투영법&lt;/a&gt;에 대해 알면 좋다. 여기서는 &lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%A9%94%EB%A5%B4%EC%B9%B4%ED%86%A0%EB%A5%B4_%EB%8F%84%EB%B2%95&quot;&gt;메르카토르 투영법&lt;/a&gt;을 이용했고, 지도는 앞에서 언급한
&lt;a href=&quot;https://github.com/southkorea/seoul-maps&quot;&gt;서울시 셰이프파일을 TopoJSON으로 변환한 파일&lt;/a&gt;을 사용해서&lt;sup id=&quot;fnref:5&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;
&lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; 레이어에 각 지역구에 대한 path와 지역명을 표시한 text 요소를 생성했다.&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;projection&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;geo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mercator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;126.9895&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;37.5651&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;translate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;geo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;7&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;8&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nx&quot;&gt;d3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;seoul_municipalities_topo_simple.json&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;9&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;topojson&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;feature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;seoul_municipalities_geo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;10&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;11&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selectAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;12&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;13&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;14&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;class&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;municipality c&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;code&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;15&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;d&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;16&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;17&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selectAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;18&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;19&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;20&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;transform&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;translate(&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;centroid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;21&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;dy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;.35em&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;22&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;class&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;municipality-label&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;23&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;24&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;이제 터미널에서 파이썬3를 이용해 로컬 웹 서버를 돌리자.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python -m http.server 8888      # for Python2, `python -m SimpleHTTPServer`
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;위 명령을 입력한 후 명령이 종료되지 않는 것은 버그가 아니라 우리의 로컬 웹 서버가 정상적으로 돌아가고 있다는 의미니까 기다리고 있거나 놀라지 말자.
웹 브라우저를 열어서 http://localhost:8888에 들어가보자.
엇, 우리가 아는 서울시 모양을 볼 수 있다!
우측 상단에 “…구”라는 글자가 작게 보이는 것으로 봐서,
앞으로 CSS만 잘 입히면 지역명도 잘 출력될 듯하다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015-06-22-seoul.png&quot; width=&quot;400&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;3단계-지도에-점을-찍자&quot;&gt;3단계: 지도에 점을 찍자&lt;/h3&gt;

&lt;p&gt;이제 1단계에서 만든 맛집 위경도를 데이터 places.csv를 이용해 맛집을 지도에 뿌려보자.
(이 역시 “자바스크립트는 여기에” 부분에 계속 추가하면 된다.)
각 맛집에 대해 &lt;code class=&quot;highlighter-rouge&quot;&gt;places&lt;/code&gt; 레이어에 circle과 text를 생성한 것을 볼 수 있다.&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nx&quot;&gt;d3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;places.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nx&quot;&gt;places&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selectAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;circle&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;circle&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;cx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;cy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;7&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;8&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt; &lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;9&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nx&quot;&gt;places&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selectAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;10&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;11&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;12&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;x&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;13&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;y&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;)&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;14&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7d;);&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;15&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;h3 id=&quot;4단계-지도에-옷을-입히자&quot;&gt;4단계: 지도에 옷을 입히자&lt;/h3&gt;

&lt;p&gt;맛집의 위치까지 점을 찍었지만 아직까지는 우리 지도는 전체적으로 까맣기만 한데,
“CSS는 여기에”라고 되어 있는 부분에 각 element에 대한 색을 입히면 멋진 지도가 완성된다.&lt;/p&gt;

&lt;p&gt;나는 다음과 같은 값들을 줘서 지도를 완성했다.&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;circle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;orange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;stroke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;white&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;circle&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;:hover&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;7&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;8&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;stroke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#333&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;9&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;10&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;11&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;pointer-events&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;none&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;12&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;13&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;.municipality&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;14&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#efefef&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;15&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;stroke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#fff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;16&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;17&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;.municipality-label&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;18&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#bbb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;19&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;12px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;20&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;21&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;text-anchor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;22&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;23&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#map&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;24&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#333&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;25&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;26&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;text-anchor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;27&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;28&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#places&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;29&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#777&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;30&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nl&quot;&gt;font&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sans-serif&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;31&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;py&quot;&gt;text-anchor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;32&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;끝이다!
&lt;a href=&quot;https://gist.github.com/e9t/ba9edd99793a5c91eaab#file-index-html&quot;&gt;코드 전체는 여기에서&lt;/a&gt; 볼 수 있고, 완성된 지도는 &lt;a href=&quot;http://bl.ocks.org/e9t/raw/ba9edd99793a5c91eaab/&quot;&gt;이 링크&lt;/a&gt;에서 볼 수 있다.
앞에서 적용한 CSS 때문에, 마우스를 점에 올려놓으면(i.e., hover action을 주면) 점이 붉은 색으로 바뀐다.&lt;/p&gt;

&lt;p&gt;지도 하나를 그렸을 뿐이지만
이렇게 “내 코드”가 되고나면 재현성(reproducibility)나 다른 영역에 대한 적용성(applicability) 등을 거머쥘 수 있게 되는 것은 큰 매력이다.
즉, 같은 서울시 지도를 이용해서 다른 데이터를 표시하는 것은 데이터만 바꿔 끼우면 되니까 &lt;a href=&quot;https://twitter.com/HuffPostKorea/status/612515357010493440&quot;&gt;너무도&lt;/a&gt; 간단한 일이 된다.
뿐만 아니라
미세한 동작이나 세밀한 디자인 하나하나를 커스터마이징하는 재미도 있다.
이 지도를 응용해서 나는 &lt;a href=&quot;http://bl.ocks.org/e9t/85fcfb53db389696624f/&quot;&gt;서울시 스시야 기행&lt;/a&gt;도 그렸는데,
같은 지도를 이용하고 같은 방식으로 시각화를 했지만,
1) 가격대에 따라 점마다 색을 다르게 하고, 2) 색의 범례를 추가하고, 3) 점마다 링크를 추가하고, 4) 맛집의 이름이 겹치지 않도록 forced layout을 적용하는 등의 기능을 추가했다.
전국 지도를 이용해서 같은 방식으로 그린 지도로는 &lt;a href=&quot;http://bl.ocks.org/e9t/a97a4f2653a0ce97fd76&quot;&gt;롯데리아 보로노이&lt;/a&gt;가 있다. 여기에는 보로노이 다이어그램을 추가적으로 입혔다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;마치면서 잠깐 광고 한 마디!&lt;/strong&gt;
곧 (2015년 7월 초?!) 제가 번역한 “&lt;a href=&quot;https://www.goodreads.com/book/show/25784723-d3&quot;&gt;D3를 이용한 시각적 스토리텔링&lt;/a&gt; (리치 킹 저, 박은정/김한결 번역, 인사이트 출판사)”이 출판됩니다.
이 책에는 아주아주 쉽고 상세한 설명이 담겨 있어 웹 기반 시각화 만들기에 대한 탄탄한 기초를 마련할 수 있으니
혹시 이 글의 설명이 너무 어렵게 느껴졌다면 책을 보시는 것도 추천드립니다.
더불어 이 책에는 &lt;a href=&quot;http://bl.ocks.org/e9t/55699e9fa8c3eb7fe40c&quot;&gt;서울시에서 한 걸음 나가 국내 지도를 활용하고, 점 찍는 것에서 한 걸음 나가 코로플래스를 그리는 법&lt;/a&gt;&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;에 관한 설명도 부록으로 담았으니 많은 관심 가져주세요 :D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Updated 2015-07-08&lt;/strong&gt;.
이 포스트는 &lt;a href=&quot;http://slownews.kr/43212&quot;&gt;슬로우뉴스에도 동시 게재&lt;/a&gt; 되었습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;“맛집”이라는 단어는 누가 만든걸까? 영어로 번역하면 “tasty restaurant” 정도이려나?  다른 나라 말로 번역하기도 참 어려운, 아주 맛깔나는 표현인듯.&amp;nbsp;&lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;이들을 사용하면 데이터 시트를 직접 로딩할 수 있고 HTML 기반이기 때문에, 파워포인트나 포토샵 등을 쓸 때에 비해 scalability, interactivity와 같은 장점을 얻을 수 있다.&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;마이크 보스톡느님에 의하면 TopoJSON은 일반적으로 GeoJSON에 비해 약 80%의 용량 절감이 있다고 한다.&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:5&quot;&gt;
      &lt;p&gt;우리 나라 전국 단위 지도 TopoJSON 파일은 &lt;a href=&quot;https://github.com/southkorea/southkorea-maps&quot;&gt;여기서&lt;/a&gt; 구할 수 있음.&amp;nbsp;&lt;a href=&quot;#fnref:5&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;최근 본 인상적인 코로플래스의 예: &lt;a href=&quot;http://www.nytimes.com/interactive/2015/05/03/upshot/the-best-and-worst-places-to-grow-up-how-your-area-compares.html&quot;&gt;The Best and Worst Places to Grow Up: How Your Area Compares&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 24 Jun 2015 14:29:00 -0700</pubDate>
        <link>http://www.lucypark.kr/blog/2015/06/24/seoul-matzip-mapping/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2015/06/24/seoul-matzip-mapping/</guid>
        
        <category>visualization</category>
        
        <category>geomapping</category>
        
        <category>matzip</category>
        
        <category>d3</category>
        
        
      </item>
    
      <item>
        <title>[번역] 데이터 사이언스 벤 다이어그램</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;새해에 블로그를 부활시켜보겠다고 다짐했는데, 벌써 반년이 지나고도 새 글이 없어서 좋은 글이라도 하나 번역해서 올려야겠다고 생각했다.
원문은 Drew Conway의 &lt;a href=&quot;http://drewconway.com/zia/2013/3/26/the-data-science-venn-diagram&quot;&gt;The Data Science Venn Diagram&lt;/a&gt;라는, 데이터 분석가들 사이에서는 나름 고전이 된 2010년의 (꽤 오래된) 글이다.
이 글에 등장한 다이어그램은 실제로 데이터 분석 또는 데이터 사이언스 관련 자료에서 꽤 빈번하게 등장하고, 나도 데이터마이닝에 관해 소개할 기회가 있으면 종종 사용한다.
마침 학기 말인데, 한 학기를 회고하는 시점에서 번역하기 적절한 자료라고도 판단했다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!-- more --&gt;

&lt;blockquote&gt;
  &lt;p&gt;이 글은 Drew의 허락을 받고 번역을 했으며, 내용을 매끄럽게 하기 위해 곳곳에서 의역을 했음을 밝힌다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;지난 월요일 나는 - 영광스럽게도 - 뉴욕시에서 데이터에 관한 한 가장 뛰어난 뇌들이 모인다는 반나절짜리 &lt;a href=&quot;http://en.wikipedia.org/wiki/Unconference&quot;&gt;언컨퍼런스(unconference)&lt;/a&gt;에 참석했다.
이 행사는 &lt;a href=&quot;http://oreilly.com/&quot;&gt;오라일리(O’Reily)&lt;/a&gt;의 &lt;a href=&quot;http://strataconf.com/strata2011&quot;&gt;스트라타(Strata) 컨퍼런스&lt;/a&gt;를 준비하기 위한 것이었는데,
그 날 열린 소규모 세션(breakout session)들은 참석 인원이 적당해서 아주 뛰어난, 전문가적인 토론이 가능했다.
내가 참석한 세션 중 가장 좋았던 것은 데이터 사이언스의 교습법에 대한 것이었는데,
아니나 다를까 이 세션의 주제는 결국, 뛰어난 데이터 사이언티스트가 되기 위해 필요한 능력(skill)은 무엇인가에 대한 토론으로 이어지게 되었다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.drewconway.com/zia/?p=2167&quot;&gt;전에도 이야기했지만&lt;/a&gt;,
나는 “데이터 사이언스”라는 용어는
&lt;a href=&quot;http://www.drewconway.com/zia/?p=2208&quot;&gt;잘못된 표현(misnomer)이라고 생각한다&lt;/a&gt;.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;
하지만 이 토론을 마치고 나서 상당히 희망적인 생각을 가지게 되었는데,
그 이유는 우리가 데이터 사이언스라는 과목의 커리큘럼에 대한 아무런 합의를 이끌어내지 못했기 때문이다.
데이터 사이언티스트가 되기 위한 능력을 정의하는 것이 어려운 이유는,
워낙 실무(substance)와 방법론(methodology) 사이의 경계가 모호한데다가
해커, 통계학자, 도메인 전문가와 그들 사이의 교집합을 뚜렷하게 구분하면서
데이터 사이언스가 속하는 지점을 찾아내는 것이 쉽지 않기 때문이다.&lt;/p&gt;

&lt;p&gt;다만 유일하게 명확한 것은
경쟁력 있는 데이터 사이언티스트가 되기 위해서 &lt;a href=&quot;http://www.quora.com/How-do-I-become-a-data-scientist&quot;&gt;아주 많이 배워야한다&lt;/a&gt;는 것인데,
불행히도 교과서와 튜토리얼을 나열하는 것만으로는 거기에 별 도움이 되지 않는다.
따라서,
&lt;a href=&quot;http://www.dataists.com/2010/09/a-taxonomy-of-data-science/&quot;&gt;이미&lt;/a&gt;
&lt;a href=&quot;http://dataspora.com/blog/sexy-data-geeks/&quot;&gt;너무&lt;/a&gt;
&lt;a href=&quot;http://flowingdata.com/2009/06/04/rise-of-the-data-scientist/&quot;&gt;많은&lt;/a&gt;
&lt;a href=&quot;http://radar.oreilly.com/2010/06/what-is-data-science.html&quot;&gt;의견&lt;/a&gt;이
오간 주제임에도 불구하고,
논란을 축소하고 내 생각을 덧붙이기 위해
데이터 사이언스 벤 다이어그램(Data Science Venn Diagram)을 소개한다.&lt;/p&gt;

&lt;div class=&quot;hidden-xs&quot;&gt;
    &lt;div id=&quot;venn&quot;&gt;&lt;/div&gt;
    &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;/static/venn.min.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
    // define sets and set set intersections
    var sets = [ {sets: ['A'], size: 40, label: '해킹 실력'},
                 {sets: ['B'], size: 40, label: '수학 및 통계에 대한 지식'},
                 {sets: ['C'], size: 40, label: '도메인 전문성'},
                 {sets: ['A','B'], size: 8, label: '기계학습'},
                 {sets: ['A','C'], size: 8, label: '위험구역!'},
                 {sets: ['C','B'], size: 8, label: '전통적 학문'},
                 {sets: ['A','B','C'], size: 30, label: '데이터 사이언스'}
               ];
    var chart = venn.VennDiagram()
                    .width(700)
                    .height(500)
                    .fontSize(20);
    d3.select(&quot;#venn&quot;).datum(sets).call(chart);
    &lt;/script&gt;
&lt;/div&gt;
&lt;div class=&quot;visible-xs&quot;&gt;
    &lt;img src=&quot;/images/2015-06-21-venn.png&quot; width=&quot;400px&quot; /&gt;
&lt;/div&gt;

&lt;h3 id=&quot;데이터-사이언스-벤-다이어그램-읽는-법&quot;&gt;데이터 사이언스 벤 다이어그램 읽는 법&lt;/h3&gt;

&lt;p&gt;데이터의 3원색: &lt;strong&gt;해킹 실력, 수학 및 통계에 대한 지식, 도메인 전문성&lt;/strong&gt; &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;지난 월요일에 우리는 데이터 사이언스라는 강좌가 대학의 “어떤 학과”에서 열려야할지 토론하는데 많은 시간을 할애했다. 참석한 모두가 데이터 사이언스에 필요한 능력들이 얼마나 학제적(interdiciplinary)인지 이해하고 있었기 때문에 토론은 다분히 수사적이었다. 그런데 하필 위의 세 가지 항목을 택한 이유는 다음과 같다. 첫째, 셋 모두 특정 학과와 무관하다. 둘째, 각 영역은 독립적으로도 아주 가치있지만, 세 가지 중 두 가지만 결합되었을 때는 데이터 사이언스가 아닐 뿐더러 경우에 따라 아주 위험한 선택이 될 수도 있는 것들이다.&lt;/li&gt;
  &lt;li&gt;좋든 싫든 데이터는 전자적으로(electronically) 거래되는 재화(commodity)이다. 따라서 이 시장에 참여하기 위해서는 프로그래밍을 좀 해야한다. 그렇다고 컴퓨터 공학을 전공해야 한다는 것은 아니다. 실제로 내가 아는 뛰어난 해커 몇명은 컴공 수업을 단 한 개도 들어본 적이 없다. 성공적인 데이터 해커가 된다는 것은 텍스트 파일을 명령줄(command line)에서 조작할 줄 알고, 벡터 연산을 이해하고, 알고리즘적으로 사고하는 등의 것을 말한다.&lt;/li&gt;
  &lt;li&gt;일단 데이터를 수집하고 정제했다면 다음 단계는 데이터에서 인사이트(insight)를 이끌어내는 것이다. 이를 위해서는 적절한 수학 및 통계학적 방법론을 적용하고, 그에 대한 최소한의 이해는 할 수 있어야 한다. 경쟁력 있는 데이터 사이언티스트가 되기 위해서 반드시 통계학 박사학위가 있어야 한다는 말은 아니지만, 적어도 &lt;a href=&quot;http://en.wikipedia.org/wiki/Ordinary_least_squares&quot;&gt;최소자승법 회귀분석(ordinary least squares regression)&lt;/a&gt;이 무엇이고, 그것을 어떻게 해석해야하는지는 알아야 한다.&lt;/li&gt;
  &lt;li&gt;마지막 조각인 도메인 전문성은 이 주제에 대한 다른 사람들의 주장과 가장 큰 차이를 보이는 부분이다. 나는 데이터와 수학/통계의 결합은 기계학습(machine learning)밖에 되지 못한다고 생각한다. 당신의 관심 분야가 그것이라면 다행이지만, 데이터 사이언스라면 그렇지 않다. 사이언스, 즉 과학이란 원래 세상에 대한 흥미로운 질문이나 가설을 던진 후 데이터를 수집해서 통계적 방법론으로 검증하여 지식을 발견하고 쌓아나가는 것이다. 도메인 전문성과 수학 및 통계적 지식의 교집합은 대부분의 전통적인 학문이 속하는 영역이다. 많은 박사급 연구자들은 이 구역에서 전문성을 쌓는데 자기 시간의 대부분을 할애하며, 기술(technology) 습득에는 시간을 많이 투자하지 않는다. 이러한 성향은 연구자들의 기술 이해 수준에 대한 보상을 하지 않는 학계의 특성 때문이기도 하다. 물론, 나는 그런 전통을 타계하고자하는 젊은 학자 또는 대학원생도 많이 만났다.&lt;/li&gt;
  &lt;li&gt;마지막으로, 해킹 실력과 도메인 전문성의 결합에 대한 의견은 다음과 같다. 이 영역에 속하는 사람들은 “아는 것이 해”가 되는 부류이며, 이 영역은 다이어그램에서 가장 문제가 되는 부분이다. 이 영역에 속하는 사람들은 자기가 적당히 아는 분야에 대해 스스로 데이터를 추출하거나 구조화할 수 있고, R도 적당히 알아서 회귀분석 계수도 보고할 수 있지만 그 계수들의 의미에 대해서는 제대로 알지 못한다. 바로 이 영역의 사람들은, 몰라서, 혹은 숨겨진 다른 의도 때문에, 자신들이 어떤 과정으로 무엇을 만들었는지도 모른 채, 겉으로는 마치 적법해보이는 분석 결과를 보이며 “거짓말, 망할 거짓말, 그리고 통계학(lies, damned lies, and statistics)” 따위의 말들이 세상에 존재하는 이유가 된다. 다행히도, 수학 및 통계적 지식을 전혀 습득하지 않으면서 해킹 실력과 도메인 전문성을 동시에 쌓아나가는 것은 쉬운 일이 아니기 때문에 이 부분에 속하는 사람은 그리 많지 않다. 한편, 재앙을 만드는데는 많은 사람이 필요하지 않기도 하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;데이터 사이언스가 무언인지, 데이터 사이언티스트가 되기 위해서는 어떻게 해야하는지에 대해 내 설명이 도움이 되었으면 한다.
이러한 질문들에 대해 거시적인 답을 내리려는 시도는 논의가 지나치게 미시적인 것,
즉 세세한 도구나 플랫폼 따위에 대한 토론으로 번지는 것을 방지한다고 생각한다.&lt;/p&gt;

&lt;p&gt;물론 내가 많은 중요한 부분을 놓쳤을 수 있다.
그런데 다시 한번 말하지만 구체적인 그림을 그리는 것이 목적이 아니었음을 말하고 싶다.
언제나 그렇듯, 어떠한 코멘트도 대환영이다.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;2015년 6월 기준으로 이 문장에서 원문의 링크 두 개는 동작하지 않는데, 대신 &lt;a href=&quot;http://qr.ae/7neOEH&quot;&gt;“데이터 사이언스란 무엇인가?”라는 질문에 대한 이 답변&lt;/a&gt;을 보면 Drew가 왜 데이터 사이언스가 잘못된 표현이라고 생각하는지 엿볼 수 있다.&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;원문에서는 domain expertise이라는 표현 대신 substantive expertise라는 표현을 사용했다.&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Sun, 21 Jun 2015 22:41:00 -0700</pubDate>
        <link>http://www.lucypark.kr/blog/2015/06/21/the-data-science-venn-diagram/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2015/06/21/the-data-science-venn-diagram/</guid>
        
        <category>translation</category>
        
        
      </item>
    
      <item>
        <title>2015년 계획하기</title>
        <description>&lt;p&gt;삶은 &lt;a href=&quot;http://en.wikipedia.org/wiki/Dynamical_system&quot;&gt;dynamic&lt;/a&gt;하고
결정은 &lt;a href=&quot;http://en.wikipedia.org/wiki/Greedy_algorithm&quot;&gt;greedy&lt;/a&gt;하기 때문에
계획은 &lt;a href=&quot;http://en.wikipedia.org/wiki/Online_machine_learning&quot;&gt;online adaptation&lt;/a&gt; 하게 마련이다. &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;
그런 관점에서 1년 앞을 내다보는 연간 계획은 무의미할 수도 있지만,
다짐과 계획을 세우고 기록해두면 바쁜 일상 중에 큰 그림을 떠올리게 되기도 한다.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;p&gt;그리고 재밌게도, 균형을 찾자던 작년 초의 목표 중 상당수는 달성한 것 같다?
정서적 편안함을 많이 찾았고, 무엇보다 일과 여가 중 일에 많이 쏠려있던 삶이 어느 정도 정상 범주에 들어온 듯한 느낌적 느낌이다.
한편 &lt;a href=&quot;/blog/2014/01/04/2014-resolutions/&quot;&gt;작년의 personal resolutions&lt;/a&gt;에는 다음의 개선점이 있다:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;“Networking”은 미리 계획하는거라기보다는 기회가 왔을 때 (행사, 미팅 제안 등) 놓치지 않는 것이 중요.&lt;/li&gt;
  &lt;li&gt;“Working out”은 몰아서 하는 것이 아니라 밥 먹듯이 꾸준히 해야하는 것.&lt;/li&gt;
  &lt;li&gt;“Playing your guts out”은 굳이 마음 먹지 않아도 저절로 되는듯;&lt;/li&gt;
  &lt;li&gt;매달 목표를 정하기에는 한 달은 생각보다 너무 짧다 ㅎㅎ 목표의 granularity를 낮춰도 될 것 같다.&lt;/li&gt;
  &lt;li&gt;작년의 목표들은 지극히 개인적인 boundary 내의 일들이었다. 올해는 주변인들과의 관계에 더욱 집중해도 되지 않을까.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;위의 점들을 보완해서, 2015년의 모토는 &lt;strong&gt;“Give thanks”&lt;/strong&gt; 한 가지로 정한다.
방식은 세 가지:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Explicitly express thanks to those I am thankful (ex: by spending time together)&lt;/li&gt;
  &lt;li&gt;Embrace the uncomfortable&lt;/li&gt;
  &lt;li&gt;연락이 오면 답장은 빨리빨리&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;사실 위의 1, 2번은 2014년의 resolution 중에서 가장 하고 싶었지만 미흡했던 것들이기도 하다.
내 삶에는 언제나 참 감사한 분들이 많이 있었는데,
호의를 돌려주는 것에 좀 무심하지 않았나하는 생각이 들었다.
올해는 오는 연락만 받는 수동적인 자세에서 벗어나, 감사함을 느끼는 분들께 내가 먼저 연락하고 표현해야겠다는 생각.
3번은 내가 가장 부족하다고 느끼는 부분이면서 또 연락을 너무 spontaneous하게 많이 주고 받다보면 overwhelm이 되어서 잘 안되는 부분인데, 조금씩이라도 개선해나가면 좋을거라고 생각하고 있다.&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h3 id=&quot;some-minor-goals&quot;&gt;Some minor goals&lt;/h3&gt;

&lt;p&gt;그 외에도 다음과 같은 마이너한(?) 목표들이 있다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;일
    &lt;ul&gt;
      &lt;li&gt;올해는 졸업을…ㅎㅎ 그리고 keep an eye on the job market.&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://konlpy.org/ko&quot;&gt;KoNLPy&lt;/a&gt;를 더 쓸만한 녀석으로 발전시키기. (근데 이건 일인가 여가인가?)&lt;/li&gt;
      &lt;li&gt;트렌드를 좇는데는 그래도 RSS만큼 좋은 도구가 없는듯하다. RSS 열심히 tracking 하기!&lt;/li&gt;
      &lt;li&gt;연구실 식구들 챙기기.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;여가
    &lt;ul&gt;
      &lt;li&gt;작년에 영화보는 눈 좀 만들고 싶다고 해놓고보니 책 보는 시간은 확 줄고 영화를 너무 많이 본 느낌-_-; 올해는 다시 책도 많이 보기!&lt;/li&gt;
      &lt;li&gt;멀리 해외여행이 아니라도 주말마다 소소하게 여행해도 좋을 것 같다. 모처럼 야구 관련 프로젝트도 시작하게 되었으니 야구 경기도 보러 다니면 좋겠다는 생각.&lt;/li&gt;
      &lt;li&gt;Kaggling&lt;/li&gt;
      &lt;li&gt;드립커피를 시작했다! ㅎㅎ
        &lt;ul&gt;
          &lt;li&gt;2015년의 모토에 맞게 주변 사람들에게 쉽게 베풀 수 있는 무언가를 해보고 싶었는데, 벌써 올해 들어서 시작한 일 중 가장 잘했다고 생각하는 일이다.&lt;/li&gt;
          &lt;li&gt;작년쯤부터 향기라는 것이 얼마나 사람의 감정을 좌우할 수 있는지 깨닫게 되어서 시작하게 되었다. (8할은 lovit 군 덕 :)&lt;/li&gt;
          &lt;li&gt;열심히 배워서, 올해는 아끼는 모두에게 맛있는 한 잔씩 대접하고 싶다는 생각… 4월에 아마도 있을 커피 박람회도 기대!&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;블로그 좀 더 신경쓰기
        &lt;ul&gt;
          &lt;li&gt;원래 글을 습관적으로 쓰다가 특이하게도 2, 3년 전쯤부터 글쓰는 것에 대한 두려움이 많이 커졌는데, 올해는 블로그를 통해서 두려움을 많이 버리고 싶다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;지식축적 &amp;amp; 연구
    &lt;ul&gt;
      &lt;li&gt;Apache Spark, Julia 들여다보기.&lt;/li&gt;
      &lt;li&gt;Statistical NLP 관련 논문을 더 많이 읽고, 한국어 NLP 관련 좋은 논문 쓰기.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;그리고 올해도 &lt;a href=&quot;http://popong.com&quot;&gt;포퐁&lt;/a&gt;은 가늘고 길게 키워나가기.&lt;br /&gt;
그나저나 2월이 다갔는데도 여전히 새 것 같구나, “2015”라는 문자열은.ㅎㅎ&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;생뚱맞지만 이러한 이유로 정치인의 공약이행률을 계산해서 그것을 맹신하는 것도 위험하다고 생각한다. 공약은 약속이기 때문에 지키는 것도 중요하지만, 한편 상황에 따라 계획을 수정할 줄 아는 융통성도 정치인에게는 중요한 요소이기 때문.&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;지킬 수 있을까? 내 스스로도 적으면서 반신반의하고 있기는 하다… ^^;&amp;nbsp;&lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Fri, 20 Feb 2015 14:00:00 -0800</pubDate>
        <link>http://www.lucypark.kr/blog/2015/02/20/2015-resolutions/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2015/02/20/2015-resolutions/</guid>
        
        <category>year end</category>
        
        
      </item>
    
      <item>
        <title>2014년 이벤트 정산</title>
        <description>&lt;p&gt;지난해 회고와 올해 계획을 정리해야지 해야지 하며 미루다가 어느덧 2월이 되었다.
얼렁뚱땅 넘어가게 생긴 와중에 구정이 되었고, 더불어 나를 많이 아껴주셨던 친구의 어머님께서 별세하셨다는 슬픈 소식을 듣고 나서 뛰어가던 발걸음을 멈추고 지금이라도 잠시 돌아보는 것이 좋겠다는 생각이 들었다.
이럴 때 보면, 우리 나라에서 같은 해를 시작할 기회가 두 번 주어진다는게 참 행운이라는 생각도 든다.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Life is so vulnerable and unpredictable. Gotta cherish people that we love and value, and not wait till it’s too late. – My good friend YY&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;올해의-주요-사건&quot;&gt;올해의 주요 사건&lt;/h3&gt;

&lt;p&gt;2014년에는 월별로 다음과 같은 일들이 있었다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1월: 계획했던 휴식기답게 푹 쉬었음&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2월: 미국 Sunlight Foundation에 2주간 Exchange Fellow로 초청 + 미국 여행&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;온라인으로만 알던 open government 계의 수많은 스타트업과 NGO의 사람들을 만나고 올 수 있는 좋은 기회였다. 어마어마한 society의 규모와, 그들의 자부심에 놀랐다. 하나하나의 단체는 마치 스타트업과 같은 자유로운 분위기였지만, 그들간에 연결과 협력망이 워낙 촘촘해서 전체적으로는 하나의 거대한 corporate을 보는 느낌도 들었다.&lt;/li&gt;
      &lt;li&gt;개인적으로는 이 시기는 아직 사람들을 적극적으로 만날 준비가 되었던 때가 아니어서 매일 반복적으로 여러 개의 미팅을 하는 것이 힘들기도 했다. 지금 간다면 조금 다를텐데 하는 아쉬움도 :)&lt;/li&gt;
      &lt;li&gt;Fellowship 덕분에 방문 일정이 끝난 후 DC, 뉴욕, 플로리다 등을 2주간 여행하고 왔다. 때때로 생각나는 이 때, 정말 행복했다. 난생 처음으로 여행 중 먹고 마시는데 돈도 아끼지 않고 펑펑 쓰고 다녀서 2주 간 쓰고 다닌 돈이 대학원생 몇 달치 월급. 꺅! ㅎㅎㅎ 취직할데가 있을까 싶지만 언젠가 기회가 된다면 플로리다에 살아보고도 싶다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;3월: 외할머니 팔순잔치&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;어느덧 존경하는 외할머니의 팔순. 항상 건강하셔서 다행이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;4월: 동아사이언스 인터뷰(5월호), 세월호&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;우리나라에 정말 큰 일이 있었다. 이 일이 터졌을 때, 그리고 그 이후에도 외국에 갈 일이 있으면 세월호에 대한 질문을 꼭 받았다. “너희 사회는, 그 비극을 어떻게 사회적 발전으로 승화시켰니?”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;5월: 발리 OGP 컨퍼런스 + 서울 e-Parl 컨퍼런스 + 미소&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;미국 NDI에서 OGP Asia Conference에 패널로 초청해줘서 아시아권 정부 인사들 앞에서 발표할 기회가 주어졌다. 정부들은 직접 서비스 제작을 하기보다는 좋은 building block을 제공하는데 최대한의 노력을 기울이고, 시민과 시민단체들이 스스로에게 필요한 서비스를 만들 수 있는 기반을 마련하자는 메세지를 전달했다.&lt;/li&gt;
      &lt;li&gt;이 때를 틈타 &lt;a href=&quot;https://twitter.com/teampopong/status/463587837682520064&quot;&gt;poodl&lt;/a&gt; release! 국회에서 API와 데이터를 개방하기 이전에, 경험을 쌓아보자는 차원에서 개방한 정치 데이터셋.&lt;/li&gt;
      &lt;li&gt;그 이후 바로 UN 주최의 Biannual e-Parliament Conference를 국회에서 호스팅해서 참석할 기회가 주어졌다.&lt;/li&gt;
      &lt;li&gt;나와 반평생을 함께한(?) 우리집 강아지 미소가 많이 아파해서 걱정스러운 한 달이었다. 요새는 다시 기력을 되찾아(?) 건강하고 정정하게 말썽피우며 다닌다.&lt;/li&gt;
      &lt;li&gt;그 외: 발리에서 Fitbit을 잃어버리고 와서 너무 안타까웠고 브로가 넥서스7 2014를 선물로 줌! 으흐흐. &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;6월: 캘리포니아 학회 및 여행&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;이번에는 학회를 빌미로 캘리포니아로 가게 되었다. SF에서 &lt;a href=&quot;http://www.eventbrite.com/e/debug-dc-growthathon-for-immigration-reform-tickets-11498082073?aff=es2&amp;amp;rank=1&quot;&gt;해커톤&lt;/a&gt;도 참석. 미국은 참 많은 일이 개방과 협력으로 돌아간다는 것을 다시 한 번 느끼게 되었다.&lt;/li&gt;
      &lt;li&gt;학과의 우수연구자에게 주는 이중한 상 시상. 탈 자격이 있나 싶어서 부끄럽지만, 더 열심히 해야겠다고 생각하는 계기가 되었다.&lt;/li&gt;
      &lt;li&gt;파이썬 한국어 분석 패키지 &lt;a href=&quot;https://github.com/e9t/konlpy&quot;&gt;KoNLPy&lt;/a&gt; &lt;a href=&quot;https://github.com/e9t/konlpy/releases/tag/v0.1&quot;&gt;v0.1 릴리즈&lt;/a&gt;. 숫자만 다뤄오던 사람이 텍스트를 다루게 될 때 느끼는 장벽을 누구보다 잘 알고 있어서 시작하게 된 프로젝트. 패키징에 서투른 연구자가 패키지 개발과 매니징을 한다는게 지금 생각해보면 참 무모한 일이었던 것 같지만, 하면서 많이 배웠다. 아직도 많이 부족한 프로젝트지만 시작하길 잘했다는 생각이 든다. 어쩌면 내가 2014년에 가장 잘했던 일 중 하나가 아닐까.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;7월: polidata&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://cran.r-project.org/web/packages/polidata/&quot;&gt;polidata v0.1&lt;/a&gt; 릴리즈. poodl의 데이터를 좀 더 쉽게 이용할 수 있게 해달라는 모 교수님의 요청에 따라 만들게 되었는데, 이 때문에 얼굴도 본 적 없는 커미터들한테 엄청 까였다.ㅋㅋ 덕분에 R 생태계의 장단점을 더욱 잘 파악할 수 있게 됨.&lt;/li&gt;
      &lt;li&gt;워낙 미팅이 많아서인지 일의 능률도 많이 떨어져서 같이 coworking하는 분들께 많이 죄송하기도…&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;8월: KoNLPy&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;KoNLPy v0.3.0까지 릴리즈! 그리고 무려 제 1회 &lt;a href=&quot;http://www.slideshare.net/lucypark/py-con-2014-38531830&quot;&gt;PyCon Korea에서 발표&lt;/a&gt;할 기회가 주어졌고, 그 덕분에 패키지도 널리 알릴 수 있게 되었다. 알만한 주변 분들은 다 알지만 내가 너무 좋아하는 퍼키님의 &lt;a href=&quot;https://github.com/konlpy/konlpy/pull/17&quot;&gt;풀리퀘스트&lt;/a&gt; 받는 영광을 누리게 되어서 더욱 뜻 깊었던 때!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;9월: 초심 준비, 번역, 프랑스어 시작&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/511101701126762496&quot;&gt;논문 초심 준비 시작&lt;/a&gt;… &lt;s&gt;박사 아무나 따는 건 줄 알았다가 큰 코 다침.&lt;/s&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/18058155-visual-storytelling-with-d3&quot;&gt;Visual storytelling with D3&lt;/a&gt; 번역 시작. 시각화는 사실 전공과 아주 맞아 떨어지는 것은 아니지만, 원서가 워낙 디테일 하나하나를 자세하게 설명해주었길래 오히려 이 기회로 기본기를 탄탄히 다질 수 있지 않을까하는 생각으로 시작. &lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
      &lt;li&gt;프랑스어 독학 시작: 원래는 학교에서 프랑스어 수업을 청강하려다가 유치원생이 언어를 습득하는 방식으로 배워보기로 결정. 먼저 &lt;a href=&quot;http://duolingo.com&quot;&gt;Duolingo&lt;/a&gt;로 기본적인 말하기, 듣기, 쓰기를 익힌 후, 영화, 음악 등 찾아서 반복적으로 듣기 시작.&lt;/li&gt;
      &lt;li&gt;윤종신 계열의 뮤지션들이 대거 나온 멜로디 포레스트 캠프! 특히 아이유가 나와서 너무 좋았음ㅠ 2015년에도 다시 가고 싶다.ㅎ&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;10월: 컨디션 관리&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;노트북도 상하고 &lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; 내 건강도 상함. 졸업 준비한답시고 무리를 했는지 면역력이 떨어져서 평생 겪어본 적 없는 알러지로 응급실만 5+번 다녀왔다. 이 때를 계기로 요새는 절대 과로 안 함.&lt;/li&gt;
      &lt;li&gt;정보과학회, 데마학회, 국회 간담회 등 외부 발표가 많았음.&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/526551145653604352&quot;&gt;주변의 관리직에 대해 다시 생각해보게 되는 일이 생김&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;겨울철 추위에 대비해 차 사려고 &lt;a href=&quot;http://github.com/e9t/encar&quot;&gt;한참 알아봄&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;11월: 대만 컨퍼런스&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;대만 g0v summit. 최근 몇년 중 &lt;a href=&quot;https://twitter.com/echojuliett/status/531987528396447744&quot;&gt;가장 inspirational했던 컨퍼런스&lt;/a&gt;. 그만큼 좋았던 시간이었던 것과 함께 개인적으로는 큰 아쉬움이 남는 시간이었기도.&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/534339435349815296&quot;&gt;다시 맥북 유저가 됨&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;(처음부터 의도치는 않았는데) 온 가족을 페블 유저가 되게 함&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;12월: 변화에 대한 준비&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/539470063703568384&quot;&gt;학교를 졸업하고 싶다는 생각이 처음으로 들었다.&lt;/a&gt; 장기적으로는 긍정적인 현상이 아닐까?&lt;/li&gt;
      &lt;li&gt;2015년 1-2월, 그리고 3-6월의 갖가지 플랜이 마련되었다. 아, 나 일 좀 그만 벌려야하는데…ㅎㅎ&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;그 외에도, 2014년에는 특이하게도 한 달에 한 두건 정도는 스타트업 등에서 같이 일하자는 제의가 있었다. (붐은 붐인가보다!)
그 제의가 새로운 만남과 상생의 계기가 되기도 하고, 한 두번은 서로가 아쉬운 상황이 되기도 했지만 돌이켜보면 대부분은 좋은 경험이었다.
무엇보다, 열정적으로 무언가를 위해 달리는 사람들은 함께 있는 것만으로 자극이 되기 때문에 좋다.&lt;/p&gt;

&lt;h3 id=&quot;올해의-베스트&quot;&gt;올해의 베스트&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;2014년의 가젯: &lt;a href=&quot;http://getpebble.com&quot;&gt;Pebble Pebble&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;스마트워치임에도 5일간 지속되는 배터리가 가장 큰 매력. 핏빗 아쉽지 않은 만보계 기능도. (by Misfit)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;2014년의 웹서비스: &lt;a href=&quot;https://www.diigo.com/user/echojuliett&quot;&gt;Diigo&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;웹 북마킹 기능이 훌륭해서, 꾸준히 프리미엄 서비스를 사용하고 있다. 가장 편리한 건 익스텐션을 통해 구글링 할 때 &lt;a href=&quot;https://www.diigo.com/extension/chrome/image/pSearch.png&quot;&gt;북마킹한 사이트들도 같이 검색해주는 것&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;2014년의 베이커리: &lt;a href=&quot;https://foursquare.com/v/religiuese/512c9326e4b00885fcd78706&quot;&gt;를리지외즈&lt;/a&gt;, 서울 관악구
    &lt;ul&gt;
      &lt;li&gt;관악구 일대에서 가히 최고의 밸런스를 자랑하는 빵집이라고 할 수 있음.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;2014년의 숙소: &lt;a href=&quot;https://www.airbnb.co.kr/rooms/220539&quot;&gt;J&amp;amp;L’s Country Home&lt;/a&gt;, Clovis, CA
    &lt;ul&gt;
      &lt;li&gt;캘리포니아 프레스노 지역에서 요양하시려는 분들께 숙소로 강추! 나는 3일 머물렀는데 이후 일정 다 취소하고 여기 계속 머물고 싶었다… 호스트 분들이 가족처럼 따뜻하게 대해줘서, 정말 행복과 편안함을 만끽할 수 있는 곳. 노후에 딱 이분들처럼 소박하고 아기자기하게 살고 싶다는 생각.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;2014년의 영화: &lt;a href=&quot;http://www.imdb.com/title/tt2278871/&quot;&gt;Blue is the warmest color&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;레아 세이두 ♡&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;올해의-배움&quot;&gt;올해의 배움&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Doing Proofs of Concepts(POC) is almost always right.
    &lt;ul&gt;
      &lt;li&gt;포퐁에서 지방선거 프로젝트, 학교에서 의안 예측 프로젝트를 진행할 때 느꼈다.&lt;/li&gt;
      &lt;li&gt;요즘은 분석 업무를 수행하기 전에 POC는 반드시 하고 넘어간다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;동업자는 친구가 아니다.
    &lt;ul&gt;
      &lt;li&gt;“친구와 동업하지 말라”는 말이 있다. 그럼에도 페이스북이나 구글처럼 친구들끼리 사업해서 성공하는 경우는 꽤 많이 있다.&lt;/li&gt;
      &lt;li&gt;하지만 반대로 “동업자는 친구가 될 수 있을까?” 2014년에는 내가 친구라고 생각했던 “동업자” 한 명이 나를 완전히 동업자로만 생각했던 적이 있는데, “진짜 친구라면 그런 결정들을 내리지 않아”라는 또 다른 친구의 말에 내가 정말 바보같이 느껴졌다. 이 때부터는, 동업자와 친구가 되려고 하기보다는 믿을 수 있는 친구와 “동업”하는 것이 나에게 더 맞는다는 생각이 들었다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;권력이 불균형을 이룰 때, 강자가 쉽게 할 수 있는 호의를 베풀지 않으면 약자는 배신감을 느낀다.
    &lt;ul&gt;
      &lt;li&gt;약자인 경우, 권력의 상위에 있는 사람에게 지나치게 의존해서는 안된다.&lt;/li&gt;
      &lt;li&gt;강자인 경우, 달래거나 설득하거나 다른 보상을 해주지 않으면 관계의 신뢰는 깨질 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://comic.naver.com/webtoon/detail.nhn?titleId=602922&amp;amp;no=19#content_image_11&quot;&gt;사람들은 옳은 사람 말을 듣지 않는다. 좋은 사람 말을 듣는다.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/508330589645053952&quot;&gt;행동 없는 말은 신뢰를 위협한다.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/501496848427659264&quot;&gt;관심이 깊은 이해를 수반하는 것은 아니다.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/483279457717739521&quot;&gt;성격은 특성이지, 단점도 장점도 아니다.&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;특정 상황이 주어졌을 때 해당 특성은 단점 또는 장점이 되기는 한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/echojuliett/status/464735231501541376&quot;&gt;판단력도 능력이다.&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;능력이 부족한 것을 아쉬워할 수는 있어도 탓할 수는 없다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;업무를 같이 하는 경우, 업무에 대한 ownership을 가진 단 한 사람이 있어야한다.
    &lt;ul&gt;
      &lt;li&gt;Because not everyone can always agree.&lt;/li&gt;
      &lt;li&gt;사실은 부부나 연인도 업무를 같이 하는 것이나 다름없기 때문에, 모든 경우에 대해 원만한 합의를 도출할 자신이 없다면 상호존중이 전제된 불평등한 관계가 더 건강한 relationship을 가져오지 않을까 싶었다. (물론 항상 한쪽으로 치우친 일방적인 관계가 아니라 회사에도 CEO, CTO가 있듯 사안에 따라 다른 한 쪽이 더 큰 결정권을 행사한다는 의미.)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;나를 좋아하는 사람은 자기가 대우 받고 싶은대로 내게 행동한다.
    &lt;ul&gt;
      &lt;li&gt;그 사람이 내게 하는 행동을 reflection하면 나도 그 사람에게 좋은 사람이 될 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;!--
### 올해의 성장

나는 올해 어떤 부분에서 얼마만큼이나 성장했을까?
내가 1년간 이룬 것은 무엇일까?
--&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;2013년에 넥서스7을 잃어버린 후, 독서량이 떨어진 것을 넥서스 탓을 했었는데… 브로가 넥서스7을 다시 선물해준 이후에도 독서량이 급감한 것을 보면 그건 완전 핑계였던듯 ㅎㅎ&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;어느덧 교정본도 나와서 2015년 중에 출판될 예정 ^^&amp;nbsp;&lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;12.04 쓸때는 아무 문제 없었는데 14.04을 깔고 나니 노트북에서 업글 할 때마다 문제가 생겼다.ㅠㅠㅠ 이 덕분에 결국 맥북으로 회귀.&amp;nbsp;&lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 18 Feb 2015 12:51:00 -0800</pubDate>
        <link>http://www.lucypark.kr/blog/2015/02/18/2014-zeitgeist/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2015/02/18/2014-zeitgeist/</guid>
        
        <category>year end</category>
        
        
      </item>
    
      <item>
        <title>언어의 장벽</title>
        <description>&lt;p&gt;나는 한국어가 모국어인 사람으로서, 언어의 장벽을 무척 번거롭고 힘들어한다.
생활에 불편함이 있을 때는 개선 방향을 찾아야한다고 믿는 공학도로서,
&lt;strong&gt;언어의 장벽&lt;/strong&gt; 또한 많이 생각해보는 주제이다.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;p&gt;그에 대한 (훗날 달라질 수도 있는) 오늘의 생각:&lt;/p&gt;

&lt;ol&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;/ol&gt;

&lt;p&gt;그래서 지금 시점에서 상상할 수 있는 편리한 미래는:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Language-independent NLP와 기계번역 기술이 크게 발전하는 시나리오&lt;/li&gt;
  &lt;li&gt;자연스럽게 언어들이 합병되면서 세계 각국은 글로벌 언어로 수렴(하면서 각자 방언 구사)&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;당장 몇 십년 내에는 1번이 훨씬 가능성 있어보이는데,
인터넷을 통한 빠른 소통이 2번을 빠른 시일내에 가능하게 할지도 모르겠다.
1번이 2번을 가속화시킬지도 모르는 일이고.&lt;/p&gt;

&lt;p&gt;주저리 주저리 얘기했지만, @cornchz 군이 깔끔하게 정리해줬다.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;ko&quot; dir=&quot;ltr&quot;&gt;아무도 총대 매고 욕 먹기는 싫으니 제1언어 바꾸잔 얘기를 못 할텐데, 사실 문화는 꾸준히 생기고 없어지고 변화하는 것. 언어도 그래왔고, 이걸 문화적으로 옳다 그르다라고 말할 수는 없는 것이다.&lt;/p&gt;&amp;mdash; Kang Cheol (@cornchz) &lt;a href=&quot;https://twitter.com/cornchz/status/509924413764943872&quot;&gt;September 11, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;욕 많이 먹지만 복거일 아저씨가 생각나는 이 시점…&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 11 Sep 2014 13:32:00 -0700</pubDate>
        <link>http://www.lucypark.kr/blog/2014/09/11/language/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2014/09/11/language/</guid>
        
        <category>language</category>
        
        
      </item>
    
      <item>
        <title>2014 PyCon 코리아 발표기</title>
        <description>&lt;p&gt;저는 “개발자”가 아닙니다.&lt;br /&gt;
컴퓨터공학을 전공한 것도 아니고
학부 때 들은 컴공과 수업이 전공필수 “컴퓨터의 기초”가 전부이기도 하지만,&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; 무엇보다 스스로가 개발자라고 생각하지 않습니다.&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;
그런 제가 요 몇 년간 “개발자 코스프레”를 할 수 있게 된데에는 간결하면서도 강력한, 파이썬이라는 언어의 힘이 상당히 컸습니다.
올해는 그러한 파이썬의 개발자 컨퍼런스, &lt;a href=&quot;http://pycon.kr&quot;&gt;PyCon&lt;/a&gt;이 국내에서 처음 열린 해이고,
파이썬 팬으로써 저도 작게나마 기여를 하고 싶어 발표자로서 참여하게 되었습니다.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;p&gt;행사가 마무리된 후 약 일주일 간 생각을 정리하며, 간단한 기록을 남깁니다.&lt;/p&gt;

&lt;h3 id=&quot;발표-주제-선택&quot;&gt;발표 주제 선택&lt;/h3&gt;

&lt;p&gt;국내에서 처음 PyCon이 개최된다는 소식을 접한 것은 6월 말 쯤이었습니다.
당시 소식을 전해준 &lt;a href=&quot;http://twitter.com/cornchz&quot;&gt;@cornchz&lt;/a&gt;군은 나름 첫 PyCon인데 발표를 하는게 큰 의미가 있지 않겠냐고 했고, 저도 그 말에 동의했습니다.
다만 발표를 하긴 해야겠는데, 뭘할지 조금 고민은 되었지요.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://popong.com&quot;&gt;팀포퐁&lt;/a&gt;에서 &lt;a href=&quot;http://github.com/teampopong&quot;&gt;대부분의 개발을 파이썬으로 하고 있는데&lt;/a&gt;, 그 경험을 공유해볼까?&lt;/li&gt;
  &lt;li&gt;처음 파이썬을 시작했을때 인코딩 때문에 주구장창 고생했던게 기억나는데, 다른 분들이 좀 덜 고생할 수 있게 인코딩 얘기를 해볼까?&lt;/li&gt;
  &lt;li&gt;아직은 부족하지만, 이제 막 개발을 시작한 파이썬 한국어 NLP 도구인 &lt;a href=&quot;http://konlpy.readthedocs.org&quot;&gt;KoNLPy&lt;/a&gt;를 공유해볼까?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;주제를 정하면서 세 가지를 고려하기로 했습니다.&lt;br /&gt;
1) 청중이 듣고 싶어할 말인지, 2) 내가 하고 싶은 말인지, 3) 내가 가장 잘 할 수 있는 말인지.&lt;/p&gt;

&lt;p&gt;첫 번째 주제는 두 번째와 세 번째 조건은 아주 잘 충족했지만, 가장 중요한 첫 번째 조건을 충족시킬 수 있을지 확신이 없었습니다.
내용이 불충분하거나 주제가 핵심에서 벗어났기 때문이 아니라, 제가 “제품”에 대해 가지고 있는 애정이 너무 크다보니 “제품 홍보”가 될 수 있겠다는 우려가 컸기 때문입니다.
하지만 PyCon의 청중은 “제품 홍보”를 듣기 위해 자신의 시간을 투자하는 것은 아니겠지요.&lt;/p&gt;

&lt;p&gt;또, 저는 “누구나 얻어갈 것이 하나씩은 있는 발표”가 좋은 발표라고 생각하는데,
두 번째 주제는 아주 중요한 내용임에도 불구하고 제대로 준비하지 못하면 누군가에게는 크게 도움이 될지라도 누군가에게는 전혀 도움이 못될거라고 생각했습니다.
게다가 저는 제 자신이 &lt;a href=&quot;http://blog.dahlia.kr/post/1268041887&quot;&gt;유니코드 이해의 7단계&lt;/a&gt; 중 5단계에 속하(ㄴ다고 생각하)기 때문에 이것이 &lt;strong&gt;내가&lt;/strong&gt; 가장 잘 할 수 있는 발표,
즉 상대우위가 있는 발표도 아닐거라고 생각했습니다.&lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;반면 세 번째 주제는 세 가지 조건을 어느 정도 다 충족을 했습니다.
주변을 둘러보면, 한국어 NLP는 관심이 높으면서도 정작 제대로 정리되고 있지 않은 분야 중 하나인데,
새로운 discussion을 이끌어내거나, &lt;strong&gt;오픈소스 한국어 NLP에 대한 관심을 환기시키기만 해도 충분히 의미있는 발표&lt;/strong&gt;가 될거라고 생각했습니다.
또한, PyCon의 대상이 대부분 개발자이기 때문에 데이터 분석가로서 데이터 분석에 대한 얘기를 해보면 좋겠다고 생각했고,
&lt;strong&gt;한국&lt;/strong&gt;에서 열리는 PyCon인만큼 한국적인 무언가가 있었으면 좋겠다는 생각도 있었습니다.
뿐만 아니라 준비과정 자체가 &lt;strong&gt;나의 성장&lt;/strong&gt;에 도움이 되는 발표가 될 것 같았죠.
한편 8월 말 컨퍼런스 때까지 준비를 충분히 마칠 수 있을지 확신이 들지 않기도 했는데,
&lt;a href=&quot;http://pokr.kr&quot;&gt;대정모&lt;/a&gt;의 베타 런치에 비춰 생각해보니 어차피 언제 공개해도 부족함은 느끼게 마련이고,
따라서 기회가 있을 때 최대한 일찍 공개를 하는 것이 모두에게 beneficial하다고 생각했습니다.
그래서 최종적으로, 첫 PyCon에서는 파이썬 한국어 NLP에 대해 발표를 하기로 결정했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Now is better than never.” – The Zen of Python&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;자바-미안하다-파이썬-한국어-nlp&quot;&gt;자바, 미안하다! 파이썬 한국어 NLP&lt;/h3&gt;

&lt;p&gt;사실 제목은 좀 낚시성입니다 ㅎㅎ&lt;br /&gt;
내용을 보면 아시겠지만 자바를 디스하는 것은 전혀 아니고, 발표를 준비하던 당시 재미있는 &lt;a href=&quot;https://www.google.com/search?q=%EB%94%B8%EC%95%84+%EB%AF%B8%EC%95%88%ED%95%98%EB%8B%A4&amp;amp;newwindow=1&amp;amp;es_sm=93&amp;amp;source=lnms&amp;amp;tbm=isch&amp;amp;sa=X&amp;amp;ei=Cb0IVPz-K4nh8AWiyYGYBA&amp;amp;ved=0CAkQ_AUoAg&amp;amp;biw=1545&amp;amp;bih=791&quot;&gt;시사적 이슈&lt;/a&gt;가 있었는데
마침 rhyme도 맞고 해서 활용(?)한 측면이 강합니다.
발표 내용은 다음의 세 가지를 신경썼습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;누구든 얻어갈 수 있는 한 가지가 있게 한다. (새로운 시각, 새로운 개념, 새로운 기술 등)&lt;/li&gt;
  &lt;li&gt;세상에 존재하지 않는 무언가를 내놓는다.&lt;/li&gt;
  &lt;li&gt;어려운 것은 괜찮지만 이해가 안 되는 것은 별로다.&lt;sup id=&quot;fnref:5&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;그렇게 해서 나온 것이 아래의 발표자료입니다.&lt;/p&gt;

&lt;center&gt;&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/38531830&quot; width=&quot;595&quot; height=&quot;485&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;p&gt;세 줄 요약:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;파이썬으로 한국어 분석할 수 있는 &lt;a href=&quot;http://konlpy.readthedocs.org&quot;&gt;KoNLPy&lt;/a&gt;를 만들고 있습니다.&lt;/li&gt;
  &lt;li&gt;자바 등으로 개발된 기존 한국어 형태소 분석기의 wrapper와, NLP에 편리한 함수들을 파이썬으로 손쉽게 설치하고 사용할 수 있게 하는 것이 목표입니다.&lt;/li&gt;
  &lt;li&gt;크롤링부터 NLP분석, 시각화까지 하나의 언어로 처리할 수 있다는 편리함을 제공하며, 이것이 한국어 자연어처리에 대한 진입 장벽을 많이 낮춰줄 것이라고 희망합니다.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;아쉬웠던-점&quot;&gt;아쉬웠던 점&lt;/h3&gt;

&lt;p&gt;미리 조금씩 준비한다고는 했는데, 아직 내공이 부족한지 처음하는 발표는 참 만족하기 어려운 것 같습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;먼저, 왜 파이썬으로 NLP를 하면 좋은지, KoNLPy에 어떤 철학이 내재되어 있는지 충분히 강조하지 못한 점이 아쉬웠습니다. 이 부분에 대해서는 앞으로 꾸준히 정리해서 KoNLPy의 문서에서 다룰 예정입니다.&lt;/li&gt;
  &lt;li&gt;청중이 jargon에 압도당하지 않게 최대한 줄이려고 했는데, 지금 생각해보면 좀 더 심층적인 내용을 전달하는 것도 의미 있었을 것 같습니다.&lt;sup id=&quot;fnref:6&quot;&gt;&lt;a href=&quot;#fn:6&quot; class=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;발표를 하다보니 다른 분들 발표는 거의 못듣거나 신경을 못쓰기도 했습니다… 내년에는 청중이 되거나, 아침에 발표를 할 수 있게 부탁드려야겠습니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;좋았던-점&quot;&gt;좋았던 점&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;발표 직후, 퍼키님께서 &lt;a href=&quot;https://twitter.com/hyeshik/status/505662534490128384&quot;&gt;KoNLPy를 사용해보셨고 Python3에서도 큰 문제 없이 돌아간다고 말씀해주셨어요&lt;/a&gt;. 꺅!&lt;/li&gt;
  &lt;li&gt;발표 이후로 일주일도 안 자났는데 관심 있는 분들의 &lt;a href=&quot;https://github.com/e9t/konlpy/graphs/contributors&quot;&gt;contribution&lt;/a&gt;이 생겼습니다. 컴백서님 감사합니다!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://ozinger.org&quot;&gt;오징어 네트워크&lt;/a&gt;에 #koreannlp 채널이 생겼습니다.&lt;sup id=&quot;fnref:7&quot;&gt;&lt;a href=&quot;#fn:7&quot; class=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;그 외 관심 있는 분들과 네트워크를 형성하게 되었습니다.&lt;/li&gt;
  &lt;li&gt;아이디어도 몇 가지 제안 받았습니다.
    &lt;ul&gt;
      &lt;li&gt;형태소 분석기/사전 간 성능을 엄밀히 비교해서 publish&lt;/li&gt;
      &lt;li&gt;형태소 분석 모듈을 동시에 비교하기 더 쉽게, 함수를 자체 내장&lt;/li&gt;
      &lt;li&gt;사용자 사전 추가 interface를 편리하게 import할 수 있는 인터페이스를 만듦&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PyCon에 참석해보니, 각종 전문분야에서 온 다양한 사람들을 만날 수 있었고,
그것은 다른 개발자 컨퍼런스에서 발견하기 어려운, 독특한 모습이었던 것 같습니다.
또, 이번 컨퍼런스 준비에 참여하신 &lt;a href=&quot;https://twitter.com/lqez&quot;&gt;박현우&lt;/a&gt;님께서 Lightning Talk에서 말씀하신 것과 같이, 이런 행사는 행사 자체도 중요하지만 그 이후도 중요하다고 생각합니다.
KoNLPy, 그리고 한국어 NLP 관련 내용을 이 블로그를 통해 조금씩 꾸준히 전달해보도록 하겠습니다.&lt;/p&gt;

&lt;p&gt;결과적으로는, 발표하길 참 잘했다고 생각합니다.&lt;br /&gt;
PyCon Korean 2015에서는 더 재미있고 풍부한 세션들을 들을 수 있기를 바랍니다.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;생각해보면 국내 유일의 파이썬 커미터인 &lt;a href=&quot;https://twitter.com/hyeshik&quot;&gt;perky&lt;/a&gt;님도 컴공 전공은 아니시죠…^^ 그게 또한 커다란 용기가 됩니다.&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;누군가는, 개발을 하면 다 개발자 아니냐고 하겠지만, 수학을 사용하는 모든 사람이 자신이 수학자라고 생각하지는 않겠지요. 물론 수학을 사용하는 모든 사람을 수학자라고도 볼 수도 있겠습니다.&amp;nbsp;&lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;나중에 “유니코드 이해 7단계”라고 하는&lt;a href=&quot;http://mearie.org&quot;&gt;강성훈 씨&lt;/a&gt;의 유니코드 강연을 들을 기회가 있으면 좋겠네요.&amp;nbsp;&lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:5&quot;&gt;
      &lt;p&gt;사실 저는 가장 어려운 개념도 내공이 깊은 사람은 누구나 이해할 수 있게 쉽게 설명할 수 있다고 생각합니다. 즉, 어떤 개념이 전달이 안될 때는 개념 자체의 난이도나 청자의 이해력 뿐 아니라 화자의 전달력도 영향을 주기 때문에, 화자의 입장에서는 자신이 최선의 방식으로 내용을 효과적으로 전달하고 있는지도 의심해봐야한다고 생각합니다.&amp;nbsp;&lt;a href=&quot;#fnref:5&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:6&quot;&gt;
      &lt;p&gt;…는 어디까지나 제 느낌이고 생각인데, 직접적인 피드백을 받지 못해서 확신은 없네요. 내년에는 발표에 대한 사전/사후 피드백을 주고 받을 수 있는 통로가 생기면 좋겠습니다.&amp;nbsp;&lt;a href=&quot;#fnref:6&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:7&quot;&gt;
      &lt;p&gt;채널 이름을 #konlpy가 아니라 #koreannlp로 정한 것은, 프로그래밍 언어와 패키지와 무관하게 한국어 NLP에 대해 관심 가지고 있는 분들을 모으기 위함입니다. 잘 될지는 모르겠지만 꼭 이곳을 통하지 않더라도 지속적으로 논의가 이루어졌으면 좋겠네요.&amp;nbsp;&lt;a href=&quot;#fnref:7&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Fri, 05 Sep 2014 06:13:00 -0700</pubDate>
        <link>http://www.lucypark.kr/blog/2014/09/05/python-korea-2014/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2014/09/05/python-korea-2014/</guid>
        
        <category>Python</category>
        
        <category>conference</category>
        
        <category>talk</category>
        
        
      </item>
    
      <item>
        <title>구글 한글 웹폰트 미리보기</title>
        <description>&lt;p&gt;구글에서는 &lt;a href=&quot;https://developers.google.com/fonts/&quot;&gt;웹폰트를 다수 공개하여&lt;/a&gt; 웹개발시 편리하게 이용할 수 있게 했다.&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;
지금은 키릴(Cyrillic), 데바나가리(Devanagari), 그리스(Greek), 크메르(Khmer), 라틴(Latin), 베트남(Vietnamese) 등 6가지 문자에 대한 폰트를 제공하고 있고,
한글 폰트는 아직 정식으로 제공되는 것이 없지만 &lt;a href=&quot;http://www.google.com/fonts/earlyaccess&quot;&gt;early access&lt;/a&gt;로 총 10개가 제공되고 있다.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;p&gt;사용법도 아주 간단해서 쉽게 가져다 쓸 수 있다.
가령 한나체를 사용하려면 아래 HTML을 복사해서 파일로 저장하면 된다.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;figure class=&quot;code-highlight-figure&quot;&gt;&lt;div class=&quot;code-highlight&quot;&gt;&lt;pre class=&quot;code-highlight-pre&quot;&gt;&lt;div data-line=&quot;1&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;2&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;3&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/css&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://fonts.googleapis.com/earlyaccess/hanna.css&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;4&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;5&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;#x7b;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;6&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;nl&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;'Hanna'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;serif&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;7&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;        &lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;48px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;8&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;      &lt;span class=&quot;p&quot;&gt;&amp;#x7d;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;9&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;10&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;11&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;12&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;다람쥐 헌 쳇바퀴에 타고파&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;13&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div data-line=&quot;14&quot; class=&quot;code-highlight-row numbered&quot;&gt;&lt;div class=&quot;code-highlight-line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;각 폰트 별 사용법은 &lt;a href=&quot;http://www.google.com/fonts/earlyaccess&quot;&gt;early access&lt;/a&gt; 페이지에서 직접 확인해볼 수 있는데,
미리보기가 없어서 조금 불편하다.
공개되어 있는 총 10개의 한글 글꼴은 아래에서 모양을 확인해볼 수 있다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Serif 족&lt;/strong&gt;: &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/kopubbatang.css&quot;&gt;코펍 바탕체&lt;/a&gt;, &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/jejumyeongjo.css&quot;&gt;제주 명조체&lt;/a&gt;, &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/nanummyeongjo.css&quot;&gt;나눔 명조체&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/2014-06-11-fonts/kopub-batang.png&quot; alt=&quot;'코펍 바탕체'&quot; /&gt;
 &lt;img src=&quot;/images/2014-06-11-fonts/jeju-myeongjo.png&quot; alt=&quot;'제주 명조체'&quot; /&gt;
 &lt;img src=&quot;/images/2014-06-11-fonts/nanum-myeongjo.png&quot; alt=&quot;'나눔 명조체'&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Sans-serif 족&lt;/strong&gt;: &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/hanna.css&quot;&gt;한나체&lt;/a&gt;, &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/jejugothic.css&quot;&gt;제주 고딕체&lt;/a&gt;, &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/nanumgothic.css&quot;&gt;나눔 고딕체&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/2014-06-11-fonts/hanna.png&quot; alt=&quot;'한나체'&quot; /&gt;
 &lt;img src=&quot;/images/2014-06-11-fonts/jeju-gothic.png&quot; alt=&quot;'제주 고딕체'&quot; /&gt;
 &lt;img src=&quot;/images/2014-06-11-fonts/nanum-gothic.png&quot; alt=&quot;'나눔 고딕체'&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Cursive 족&lt;/strong&gt;: &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/nanumbrushscript.css&quot;&gt;나눔 브러시 스크립트체&lt;/a&gt;, &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/nanumpenscript.css&quot;&gt;나눔 펜 스크립트체&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/2014-06-11-fonts/nanum-brush-script.png&quot; alt=&quot;'나눔 브러시 스크립트체'&quot; /&gt;
 &lt;img src=&quot;/images/2014-06-11-fonts/nanum-pen-script.png&quot; alt=&quot;'나눔 펜 스크립트체'&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Monospace 족&lt;/strong&gt;: &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/nanumgothiccoding.css&quot;&gt;나눔 고딕 코딩체&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/2014-06-11-fonts/nanum-gothic-coding.png&quot; alt=&quot;'나눔 고딕 코딩체'&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Fantasy 족&lt;/strong&gt;: &lt;a href=&quot;http://fonts.googleapis.com/earlyaccess/jejuhallasan.css&quot;&gt;제주 한라산체&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/2014-06-11-fonts/jeju-hallasan.png&quot; alt=&quot;'제주 한라산체'&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;사실 구글 폰트의 예시에는 한나체, 제주 고딕체, 제주 한라산체의 generic family가 serif로 되어 있다.
그런데 나는 한나체, 제주 고딕체는 sans serif라고 판단해서 여기서는 족을 옮겨서 표시하고 &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/early-access-fonts/BP_dgfZy2ow&quot;&gt;구글 폰트에는 예시를 수정하자고 제안&lt;/a&gt;했다.
제주 한라산체의 경우, 분류가 애매하다는 생각도 들었지만 sans serif가 아닌 fantasy로 분류한 이유는 fantasy 웹폰트가 하나도 없다는 아쉬움과 동시에 실제로 아주 재미있는 폰트라고도 생각되었기 때문이다.
(어쨌든 serif는 아님ㅎ)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Updated 2015-06-15&lt;/strong&gt;.
&lt;a href=&quot;https://twitter.com/theeluwin&quot;&gt;@theeluwin&lt;/a&gt;님께서 최근 Google의 &lt;a href=&quot;http://theeluwin.github.io/NotoSansKR-Hestia/&quot;&gt;NotoSansKR를 웹폰트로 변환해서 공개&lt;/a&gt; 하셨습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;웹폰트 외의 일반 폰트는 &lt;a href=&quot;http://software.naver.com/software/fontList.nhn?categoryId=I0000000&quot;&gt;네이버 소프트웨어&lt;/a&gt;에서 풍부하게 제공한다.&amp;nbsp;&lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;이렇게 HTML &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link&quot;&gt;link&lt;/a&gt; element나, early access 페이지에서 제시한대로 CSS &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@import&quot;&gt;@import&lt;/a&gt; at-rule을 여러 번 반복하면 여러 개의 서체를 사용할 수 있다.&amp;nbsp;&lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 11 Jun 2014 02:07:00 -0700</pubDate>
        <link>http://www.lucypark.kr/blog/2014/06/11/korean-google-fonts-preview/</link>
        <guid isPermaLink="true">http://www.lucypark.kr/blog/2014/06/11/korean-google-fonts-preview/</guid>
        
        <category>fonts</category>
        
        
      </item>
    
  </channel>
</rss>
