2015년 12월 28일 월요일

2015년 회고

벌써 십수 년째 새해 소망은 같다.

다음 해에는 지난해보다 1g만큼 나은 사람이 된다.

중2병을 심하게 앓던 꼬꼬마 시절부터 아직 완치가 되지 않은 지금까지 한 번도 바뀐 적이 없다. 어차피 그럴듯한 새해 계획을 세운다고 한들 우주 최고 의지박약인 내가 계획을 실천할 수도 없을뿐더러 게으르고 즉흥적인 녀석이 구체적인 계획을 세우는 것 자체가 이미 있을 수 없는 일이기 때문이다.


나는 평생을 미숙하고 불완전한 상태로 살다 죽을 것이다. 아무리 노오력을 해도 바뀌지 않는다. 이미 결정이 난 인생을 살고 있다.


하지만 지난해보다 뭐라도 하나 나은 사람이 된다면 그것도 나름 사는 재미가 될 테고 대충 적당히 '올해는 작년보다 이거 하나는 나아졌다'고 퉁치면 한 해의 목표를 달성하는 거니까 나만의 성취감(ㅋㅋㅋ)도 느낄 수 있다.


작년 보다 키가 컸다. 작년 보다 칭찬을 더 받았다. 작년 보다 성적이 올랐다. 작년 보다 코드를 더 썼다. 작년 보다 감사 인사를 더 했다. 작년 보다 돈을 더 벌었다. 작년 보다 기부를 더 했다. 작년 보다 더 많은 곳을 돌아다녔다!


누가 보면 웃기지도 않을 소소한 '1g'만큼 나아진 내가 지금 내 모습이다. 


매년 1g씩 나아지긴 했지만 정말 딱 1g만큼이라서 거창하게 글까지 남겨가며 한 해를 회고한 기억은 거의 없는데, 멋지게 2015년을 회고하는 다른 존잘 님들의 글을 읽다 보니 나도 따라 하고 싶었다. ㅡ,.ㅡ 나는 따라쟁이니까.


작년부터 사비를 털어가며 왕성한 대외-_-활동을 하고 있다. 페북에서 말하기를,  올해는 2015년 12월 27일 현재 총 6개국, 19개 도시를 돌아다녔다고 한다. 처음엔 믿을 수 없었는데 가만 생각해보니 파이콘만 다섯 군데, 구글 I/O도 갔었고 떠난 김에 근처를 여행하기도 했고 다른 일(?)로 몰래 미국을 다녀온 적도 있으니 국내 도시 두어 군데가 포함되었다면 얼추 맞는 듯하다. 지금까지 살면서 가장 많이 돌아다닌 기록이다. 국내외 훌륭한 개발자를 만나고 이야기할 수 있는 기회를 가진다는 건 굉장한 경험이다. 한번 만나고 잊히지 않기 위해서는 상대방에게 걸맞은 사람이 되기 위해 노력을 해야 한다는 점도 마음에 든다.


올해는 초반 일복이 터져서 깃헙 Longest streak이 150을 넘었다. 깃헙 이전에는 따로 이런 걸 기록하지 않았지만 실제 데이터를 따져보지 않아도 기록 경신이 확실하다. 지금은 콤보가 끊어진지 좀 됐고, 365를 찍은 분을 보기도 했지만 내 목표는 작년 보다 나아지는 거니까 ;)


99년에 하우투 문서 번역으로 처음 오픈소스에 기여를 시작한 이래 가장 많은 코드 기여를 했다. pandas에 5 커밋. folium에 1커밋. celerybeatredis에 1커밋. 기타 프로젝트에 2커밋. pandas에는 올해만 402커밋을 기여한 분이 있지만 내 목표는 작년 보다 나아지는 거니까 ;) 내년부터는 스스로 pandas 기여에 강제성을 부여하기 위해서 오픈 프런티어로 활동한다. 내년 목표도 자동으로 달성이 되겠지.


나이를 먹을수록 새로운 경험을 하기 힘들어진다고 생각하는데 올해 새로 경험한 일들이 꽤 있다! 6월부터는 새로운 회사에 합류하게 되었고 얼마전부터는 (너무 부끄럽지만) 강사질도 하고 있다. 태어나서 처음으로 사람들 앞에서 영어로 발표도 했다. 무려 3번이나. 너무 바보 같아서 부끄럽지만 앞으로 딱 두 번만 더 해보면 잘할 수 있을 것 같다. 아, 변호사도 샀구나. 변호사를 선임하면 귀찮은 일 신경 안 써도 되고 알아서 다 해줄 것 같았는데 아니었다. 다 해주지는 않고 일부만 해주더라. 그래도 나름 좋은 레슨이었다고 생각한다. 맞다! 응급실도 가봤다!! 근데 생각해보니 이건 처음은 아니네 -_-a 그래도 정말로 응급한 상황이었다는 점에서 인생 최초의 응급실 경험으로 쳐야겠다. 응급실에 갈 때는 운전하지 말고 택시를 타자. 신호 지키느라, 주차장에서는 장애인 구역 피해서 주차하느라 정말 힘들었다.



애증의 파이콘도 사소한 해프닝은 있었지만 결과적으로는 잘 커버하면서 행사를 무사히 성공적으로 치렀다. 훌륭한 분들이 많이 계셔서 작년 보다 조금 더 수월하게, 그리고 더 성공적으로 해낼 수 있었다.



멋진 분들을 더 많이 알게 된 것도 큰 기쁨이다. 빅팬입니다. 더 친해지고 싶어요. 존경합니다. 저도 어딘가 쓸모가 있을 거예요!





물론 작년보다 못한 것도 많다.

매년 한 권씩 번역을 했었는데 올해는 기한을 넘겨버렸다. ㅠㅠ 죄송합니다. (_ _) 다음 달에는 꼭 끝낼게요!



감사 인사를 많이 못 했다. 어머니께서는 사람 구실하면서 사는 게 제일 힘든 일이라고 하셨는데 전화 한통 하거나 잠깐 시간 내서 얼굴 뵙고 인사하는 게 뭐가 그리 힘들다고 소홀히 했는지 마음이 무겁고 죄송하다. 감사 인사뿐만 아니라 오랜 친구들도 먼저 못 챙긴 게 너무 미안하고 창피하다. 요즘 Pay It Forward가 핫하다지만 난 Forward고 Backward고 둘 다 제대로 못했는 걸 ㅠㅠ



작년보다 운동을 덜 했다. 야구를 할 때나 헬스장에서 사료를 퍼먹으며 폭풍 PT를 하던 리즈 시절과 비교하지 않더라도 자전거는 체인이 풀린 채 방치되어 있고 가뜩이나 실다리 인형 같은 팔뚝과 허벅지는 전보다 더 힘을 잃었다.


베이스도 못 만졌다. ㅠㅠ 1년 동안 단 한 곡의 커버조차 하지 않았다. 프로필 사진을 계속 유지해도 되는 걸까;;;


공부도 소홀했다. 적당히 입으로만 먹고살려고 한다. 이건 좀 심각하다. 부끄러운 줄 모르면 늙은 거라고 하던데 부끄러움의 강도가 예전 같지 않은 걸 보면 꼰대화가 진행되고 있는 거다!!



그래도 이런저런 일들 더하고 빼면 올해도 1g쯤은 나은 사람이 되었으려나...

2015년 3월 16일 월요일

국내 커뮤니티가 발렌타인데이를 대하는 모습 #2

머릿글

1편


굳이 그래프를 보여가며 구구절절 설명하지 않아도 당연히 분위기에 따라 특정 주제의 글이 평소보다 더 자주 등장하기 마련이다. 그리고 비슷한 얘기가 계속 올라오면 사람에 따라서 짜증이 나기도 하고, 그래서 의도적으로 무시를 하기도 한다. 정말 흥하는 주제라면 너도 나도 그 글을 클릭할 것이고 댓글을 다는 행동을 통해 스스로 커뮤니티 구성원임을 확인하고 대세에 동참했다는 뿌듯함을 느끼기도 할 것이다.

발렌타인, 커플 관련 주제는 부러움, 혹은 시기의 대상이 될 수도 있다. 따라서 의도적으로 클릭하지 않는 사람도 유의미하게 있지 않을까 하는 추측을 해본다. 제 3자의 입장이 아니라 그런 내부인의 시각으로 사람들의 반응을 살펴보자.

빨간색은 발렌타인데이 관련 글이 차지하는 조회 수 비중을 나타내고 파란색은 그렇지 않은 글의 조회 수 비중이다. 커뮤니티별로 확실한 차이가 있는거 같다.



오유, 듀나, 여시, 웃대 회원은 발렌타인데이 관련 글을 더 클릭했다. 알싸는 그런거 없이 일단 글 올라오면 공평하게 다 눌러보는 듯... -ㅅ- 그리고 쭉빵부터 네이트판까지 다른 모든 커뮤니티 회원은 발렌타인데이 관련 글을 의도적으로 외면하고 있다. 네이트판은 발렌타인데이가 정말 싫은가 보다;;

그럼 댓글이 달리는 차이도 덩달아서 많고 적고 그런가?




댓글이 달리는 양상도 커뮤니티별로 확연히 차이가 난다!!! 궁금해서 클릭은 했지만 댓글은 남기고 싶지 않아! 라는 커뮤니티(오유)가 있고, 조회수는 낮은데 댓글이 폭발하는 커뮤니티(뽐뿌)도 있다. 알싸는 댓글에서도 차별없이 공평하다. 네이트판은 발렌타인데이라면 질색인건가?;;; 조회 수, 댓글 수 모두 정직하게 높은 듀나.

이 와중에 파코즈는 댓글 데이터가 사라졌네ㅠㅠ 어떻게 된건가;;

조회 수와 댓글 수의 상관 관계를 확인해보자. 자세한 내용은 그래프를 클릭. 파코즈는 댓글이 날아갔으니까 눈으로 필터링 ㅠㅠ
http://scari.github.io/bokeh/valen_count_reply_relation.html


발렌타인데이가 부러움이나 시기의 대상이라 이런 결과가 나온거라면 외로움은 어떨까? 동병상련;;을 느끼고 조회 수도 댓글도 평균 이상으로 달릴까? 아니면, 불편하기는 마찬가지니 의도적으로 외면할까?
 
발렌타인데이만큼 많이 외면하지는 않는다. 네이트판에서 인기글은 어떤건지 조사 좀 해봐야겠다. -_-;;



가슴이 뭉클해지는 결과다. ㅠㅠ 외로운 글에 관심을 이렇게나 가져주다니, 앞으로 징징글을 쓸때는 페북이 아니라 보배드림이나 루리웹으로 가자! 멀게만 느껴지던 커뮤니티였는데 급 호감... -ㅅ- 뽐뿌는 댓글 데이터 날아갔다! 강하게 키우는 곳이구나 뽐뿌는...상관 관계도 확인. 자세히 보려면 그래프 클릭.
http://scari.github.io/bokeh/lonely_count_reply_relation.html


여기까지만 하고 접으려고 했는데 네이트판 회원들의 취향이 너무 궁금하다. 솔로글을 좋아하는 것일까?
 빙고!

자세한 내용은 그래프를 클릭하자.

#1에서도 확인했지만 루리웹솔로외로움의 커뮤니티인가? ㅠㅠ #1에서 루리웹네이트판은 같은 외로움의 아이콘이었는데 커뮤니티 내에서 대접이 다르다. 루리웹은 징징글이 많이 올라오지만 내부에서 관심과 위로를 얻는 반면, 네이트판은 외로움을 토로해도 커뮤니티 내부에서 관심을 많이 얻지 못하는 것으로 해석하면 너무 비약이 심한가... 얘들아 서로 좀 잘해줘라. -ㅅ-

마무리가 좀 씁쓸하다. 그냥 글을 끝내자니 기분이 좀 이상하네.

여기까지 한 김에, 커뮤니티별 최고 인기글을 한번 뽑아봤다. 일부 커뮤니티는 회원이 아니면 열람할 수 없다. 간단하게 최다 댓글, 최다 조회 수 부분으로 나누어 뽑았다. 삭제된 게시물일 경우 차상위 게시물을 링크하려고 했으나 삭제된 사실도 나름 의미가 있다고 판단, 그냥 둔다.


아래는 가장 많은 조회수를 자랑하는 게시글이다.

pgr21의 최다 조회수 [69274] <참 인상 깊은 명절이 될것 같습니다.......>
네이트판의 최다 조회수 [691665] <*하루 물 2.5리터 한달 후기 !>
82쿡의 최다 조회수 [91671] <조빛나 사진 올려도 될까요?>
듀나의 최다 조회수 [6770] <한국을 잘 모르는 알랭 드 보통>
베스티즈의 최다 조회수[10602] <우리나라가 제일 남의시선 신경쓰는나라같아요...>
뽐뿌의 최다 조회수[1116336] <펑하겠습니다.> 뭐였을까? 너무 궁금하다 ㅠㅠ
웃대의 최다 조회수[2420] <아령누나 사는곳 알아냄 ㅋ>
파코즈의 최다 조회수[15634] <[참고] 안녕하십니까? HOSTWAY IDC 센터 입니다.>
쭉빵의 최다 조회수[34529] <카페인기글 예원이태임글봤는데 예원이 여우짓같은걸하는편임..?> 삭제됨.
루리웹의 최다 조회수[8463] <영상 속 여자 스칼렛 요한슨? 미란다커? 절묘하게 믹스한듯>
보배드림의 최다 조회수[97827] <자게가 점점 정사게를 닮아가는듯> 댓글과 조회수 모두 1등.
여시의 최다 조회수[22578] <애마방 유출당사자입니다.> 6등급 이상
클리앙의 최다 조회수[56703] <[스르륵 링크] 대한항공 여승무원 김도희씨가 아니라네요> 삭제
오유의 최다 조회수[26705] <아우디녀 보고 깜놀>
알싸의 최다 조회수[15632] <박정현 기억의 습작 ㄷㄷㄷㄷㄷ>  준회원 이상


다음은 댓글이 가장 많이 달린 게시글이다.

pgr21의 최다 댓글[745] <군대 안 간 인간을 공직에 앉히면 안된다?>
네이트판의 최다 댓글[599] <너네 언프리티랩스타 봤냐?>
82쿡의 최다 댓글[564] <30년 영어강사의 노하우-중고생이 꼭 알아야 할 기본 영어 동사 정리>
듀나의 최다 댓글[135] <2015년 아카데미 시상식 (2)>
베스티즈의 최다 댓글[839] <설 이벤트 有有有>
뽐뿌의 최다 댓글[351] <프리젠테이션 칭찬은 아니어도 잘 패스했네요>

웃대의 최다 댓글[116] <타로카드 무료로 봐드립니다!>
파코즈의 최다 댓글[65] <[일반] 남자들은 어디에 주차하죠?jpg>
쭉빵의 최다 댓글[9999] <'ㅅ')/ 항상 행복한 백현이 달글 12> 회원 전용.
루리웹의 최다 댓글[41] <닷지크롬 막혀서 속상한 사람있나여?>

보배드림의 최다 댓글[526] <자게가 점점 정사게를 닮아가는듯> 댓글과 조회수 모두 1등.
여시의 최다 댓글[9999] <양락오빠 팬클럽 모집합니다> 6등급 이상
클리앙의 최다 댓글[264] <감귤+한라봉 마지막 이벤트 합니다.>

오유의 최다 댓글[359] <아내가 위독합니다. 함께 기도해주시길 부탁드립니다>
알싸의 최다 댓글[1112] <정복성공> 준회원 이상






인기글은 그 커뮤니티의 성향을 어느정도 나타내는듯한 느낌적인 느낌...

인기글의 조회수와 댓글을 보니 커뮤니티별 화력을 어느정도 가늠할 수 있다. 사실 이거 하면서 모 커뮤니티의 후덜덜한 화력에 경외감이 들기도 했는데, 엄청난 글 리젠 속도에도 불구하고 댓글도 조회수도 빠지는게 없었다. 게다가 치열한 경쟁때문인지 글 제목 하나하나가 도저히 클릭을 안 하곤 못 베길 정도로 매력이 터지는 바람에 코딩은 안 하고 게시판 정주행;;을 하기도 했다.

그래서 진짜 진짜 마지막으로, 글이 등록된 날짜뿐만 아니라 시간(시/분/초)까지 구할 수 있었던 커뮤니티에 대해서 시간대별 활동 그래프를 뽑아봤다. 평이한 그래프가 나올거라 예상했는데 그나마 글 몇줄 쓸 정도는 나온거 같다. 자세히 보려면 그래프를 클릭.



* 추가
"히트맵을 서로 비교하는 용도로 하려면 수치들간의 스케일 맞춰주는 작업이 추가로 들어가야 합니다"라고 알려주신 고마운 분이 계셔서 추가. 수정 완료!











http://scari.github.io/bokeh/comm_traffic.html






바른 생활의 클리앙뽐뿌.
베스티즈 회원들은 잠들기 전에 자기의 최애 커뮤니티에서 하루를 마감한다.
어딘가에서 훼인냄새가 나는듯도??


이상으로 2015년 발렌타인/화이트 데이 기념 삽질기 끝.


추가)
클리앙월급 루팡의 패턴이라는 의견이 있다... 애플과 삼성의 새벽 발표가 그래프에 반영되어 있음을 지적해 주신 눈썰미 좋으신 분도..

베스티즈는.. 여초가 아니었어? 실망...




2015년 3월 15일 일요일

국내 커뮤니티가 발렌타인데이를 대하는 모습 #1

우선, 오늘의 선수들 소개. 랜덤 순서. 작성자가 회원인 커뮤니티도 있고 아닌 커뮤니티도 있음을 미리 밝히며, 커뮤니티 소개는 잘못했다간 어그로를 끌 수도 있으니 패스. 대부분은 이름은 들어본 적이 있는 커뮤니티일거라 생각한다.

앞 얘기가 궁금한 분은 여기를 먼저 보고 와도 좋다!

이상 15개 커뮤니티를 대상으로 진행한다.
여기 없는 커뮤니티는 내가 모르는 곳이거나, 크롤링이 귀찮게 되어 있거나, 정줄놓고 막 긁어오다가 밴 당했거나, 그것도 아니면 잉여력이 미처 닿지 못했기 때문이다.

모든 게시물을 긁지는 못하고, 일반적으로 말하는 '자유게시판'과 유사한 성격의 게시판을 1순위로, 그런 곳이 없거나 올라오는 글이 안습인 경우에는 커뮤니티의 대표 게시판을 하루에 한번씩 모았다. 글쓴이와 관련된 정보는 긁지 않았으며, 올라온 날짜(시간), 댓글 수, 조회 수도 함께 모았다.


데이터를 들여다보는 방법은 발렌타인데이, 화이트데이, 커플/솔로, 외로움 관련 내용의 출현 빈도를 기본으로 하고 가급적 커뮤니티별 비교는 피하려 했지만 이렇게나 모아놓으면 별 수 없자나?

...그래도 막 그래프를 한 곳에 겹쳐놓고 이거 봐라 얘네가 다른 곳이랑 비교해서 어쩌고 저쩌고 하지는 않는다. 혹시나 이거보고 커뮤니티끼리 싸우는 일은 없었으면 좋겠다. 보면 알겠지만 우린 어차피 다 마찬가지야. 하아.

일부만 관심이 있겠지만 사용한 소프트웨어를 잠깐 언급만 하고 넘어가자.
Python 3.4, mongodb 3.0, pandas 0.15.2, IPython 3.0 (jupyter), bokeh 0.8.1, lxml, konlpy(형태소분석기는 twitter-korean-text) ㅇㅇ 이 정도.

자, 시작해볼까.

http://scari.github.io/bokeh/community_total.html


커플 얘기는 언제나 흥한다. 초콜렛과 발렌타인데이 얘기는 2월 7일부터 급격하게 상승세를 타는데 비해 화이트데이는 3월 12일부터. 역시 화이트데이는 역사적으로 보나 트래픽으로 보나 '끕'이 좀 떨어진다.

커플 얘기는 발렌타인데이와 화이트데이가 다가옴에 따라 동반 상승하는 경향을 보인다. '커플'은 평소에도 흥하는 주제인데, 발렌타인데이가 끝난 2월 15일에는 평균 이하로 뚝 떨어지는 모습을 보인다. 어제까지 남친/여친/애인/여보/자기/선물/초콜렛/시發... 얘기로 도배를 하던 커플들이 자제를 하는 모습이다...는 훼이크. 어제 싸우고 헤어져서 얘기도 꺼내기 싫은 걸로 해석하자. 3일이 채 되지 않아서 다시 올라가잖아? 이건 헤어진 남친/여친 욕을 하느라 다시 회복하는 것으로 보인다.


그럼 각 커뮤니티별로 위 주제에 대해서 어떻게 반응하고 있는지 알아보기 위해서, 전체 게시물 갯수에서 해당 주제 게시물이 차지하는 비율이 얼마나 되는지 확인해보자. x축과 y축의 스케일을 일부러 모두 통일했다.ㅋㅋㅋ 비교잼!

먼저 발렌타인데이다. 그래프를 클릭하면 좀 더 편하게 볼 수 있는 페이지가 열린다. 검은색이 해당 커뮤니티의 그래프이고 붉은색은 전체 커뮤니티 평균선이다.



http://scari.github.io/bokeh/comm_valentine.html



일부 커뮤니티를 제외하고는 발렌타인데이가 다가올 수록 관련 주제 게시물의 늘어나긴 하는데, 여초 커뮤니티의 경우에는 그 비율이 남초 커뮤니티에 비해 떨어진다. 여자들이 발렌타인데이에 관심이 없다기 보다는 남자들의 관심이 폭발적이라고 해야겠다.남초 커뮤니티의 대부분은 평균을 상회하는 관심을 보여준다 ㅋㅋㅋ 남초 커뮤니티 중에서 발렌타인데이에 초탈한 커뮤니티는 보배드림정도? 여초 커뮤니티에서 평균을 상회하는 관심을 보이는 커뮤니티는 바로 네이트판! 되시겠다. 왠지 막장 스토리의 냄새가 난다.

발렌타인데이에 대응하는 화이트데이 그래프는 기대만큼 볼만하지 않다. 데이터가 충분히 쌓이지 않은 탓인데 화이트데이 그래프에서 주목할 커뮤니티는 오늘의유머루리웹.
 http://scari.github.io/bokeh/comm_white.html

http://scari.github.io/bokeh/comm_white.html

오유의 경우 커뮤니티 평균(파란색) 보다 열광적인 반응을 보이고 있고 루리웹은 화이트데이가 오기전에 반짝 흥했다가 막상 화이트데이가 닥치니까 잠잠... Aㅏ... ㅠㅠ


화이트데이 전체 그래프




그럼 조사대상 주제 중에서 가장 강력한 '커플'은 커뮤니티별로 어떤 모습을 가지고 있을까? 보라색이 전체 평균. 검은색이 해당 커뮤니티의 그래프다.

http://scari.github.io/bokeh/comm_couple.html
데이터가 누락된 구간이 발렌타인데이 그래프에서는 바닥에 붙어 있어서 잘 확인이 되지 않았는데, 커플 그래프는 그래도 좀 떠 있으니까 데이터가 빠진 구간이 쉽게 확인이 된다.(그래도 그래프가 뭔가 이상하지만 그냥 넘어가기로 한다... 안주거리 하나 생겼네.. -.-)

커플 그래프에서 재밌는 점은 회원들 연령대가 비교적 높은 편인 클리앙82쿡은 커플 글이 별로 없다는 점이다. 그렇다고 커플 글이 많은 곳은 분홍분홍 핑크빛인가 하면 그것도 아니다. 커플 그래프를 봤으니 솔로도 봐야지? 솔로는 전체 그래프에서 봤듯이 비중이 그리 높지 않다. 하지만 솔로 그래프에서 놓치지 말아야 할 커뮤니티가 하나 있다.
http://scari.github.io/bokeh/comm_solo.html
Aㅏ... 그렇구나... 전체 솔로 그래프는 위 오유 그래프를 클릭하면 확인할 수 있다.

여기까지 확인하고 나니 그래프 너머로 코스모가외로움이 느껴진다. 기본적으로 커뮤니티라는 곳은 씐나는 곳이긴 하지만, 사람들이 외로움을 조금 덜어두고 가는 곳이기도 하니까 외로움이 느껴지는 글은 얼마나 되는지 확인해보자. 전체 그래프에서 유추할 수 있듯이, 외로운 글은 그렇게 많지 않다. 하지만 프로작이 필요한 커뮤니티가 보인다;;

http://scari.github.io/bokeh/comm_lonely.html

http://scari.github.io/bokeh/comm_lonely.html
ㅠㅠ 루리야 힘내! 판녀들도 힘내! 오유와 82쿡도 의미있는 외로움을 보인다. 전체 그래프는 위 그래프를 클릭하거나 여기.

아... 글만 쓰는데도 지친다. -_-; 아직 더 남았는데 일단 여기서 끊고 잠시 쉬었다 가야겠다. 2탄은 체력 보충하면 또 바로.

아, 하나 남았네. "{}의 초콜렛".format(community_name)
여기도 좀 이상하지만 그냥 넘어가자...


2편에서 계속


[예고] 발렌타인데이와 국내 커뮤니티의 모습

지난 2월 13일.
발렌타인데이를 하루 앞두고 쓸데없는 잉여병이 또 도져서 각 커뮤니티가 발렌타인 데이를 맞이하는 모습을 알아보려고 개인 장난감 공개 용으로 만들어 둔 페이스북 페이지, 프로글래머에 이런 글을 투척하고는 국내 커뮤니티 게시판을 크롤링하기 시작했다.
https://www.facebook.com/proglamour.scari/posts/857860810947477

발렌타인데이가 지나가고, 본격적으로 삽질을 시작.
존잘님과 비교하면 나는 개뿔 기술도 없고 데이터에 대한 인사이트도 허접해서 어설프게 '빅데이터'니 '데이터 분석'이니 하는 버즈워드를 함부로 갖다 쓰다간 본전도 못 찾고 영혼까지 탈탈 털리므로, 쌈마이 모드로 가기로 한다. -_-





2월 1일 데이터부터 수집하려고 했는데, 이게 뭐라고 하다보니 또 욕심이 도져서;; 작년 크리스마스가 끝난 2014년 12월 26일부터 수집하기로 하고 광속 크롤링. 이것도 작은 이야깃거리는 하나 나올텐데, 별로 영양가는 없으므로 패스하기로 한다.

2월 15일까지 모은 데이터.
https://www.facebook.com/proglamour.scari/photos/a.825627350837490.1073741828.825585830841642/858749144191977/?type=1

근데 뭘 좀 해보려고 하니 설 연휴가 코앞이네.
오피셜하게는 백수니까 귀성길 정체를 피하기 위해 일찍 고향으로 내려갔다. 어차피 집에서 뭔가를 한다는건 불가능이니 크롤링 사이트나 2개 더 추가하고... 잊었다.


결국, 화이트데이가 다가오고 나서야 생각이 나는데, 어차피 이렇게 된거 화이트데이까지 엮어서 세트로 해보기로 결ㅋ정ㅋ.

크롤링은 잘 돌고 있었나, 데이터 확인.

으음.... 어쨌든 늘긴 늘었군. 좋아 그럼 게임을 시작하지.

2015년 3월 14일 토요일

python3.4 pip install fail

python3.4 환경에서 pip install이 실패하는 문제가 좀 전에 생겼다.
제일 의심스러운 건 얼마 전에 jupyter를 써보겠다고 conda update를 돌리고 jupyter를 설치한 건데 확실하진 않다.

scari@sylvanas:~/codes$ python --version
Python 3.4.3 :: Anaconda 2.1.0 (x86_64)

scari@sylvanas:~/codes$ pip --version
pip 6.0.8 from /Users/scari/anaconda3/lib/python3.4/site-packages (python 3.4)



scari@sylvanas:~/codes$ pip install konlpy
Exception:
Traceback (most recent call last):
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/basecommand.py", line 232, in main
    status = self.run(options, args)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/commands/install.py", line 339, in run
    requirement_set.prepare_files(finder)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/req/req_set.py", line 229, in prepare_files
    req_to_install.check_if_exists()
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/req/req_install.py", line 931, in check_if_exists
    self.satisfied_by = pkg_resources.get_distribution(self.req)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 461, in get_distribution
    dist = get_provider(dist)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 341, in get_provider
    return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 870, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 740, in resolve
    env = Environment(self.entries)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 927, in __init__
    self.scan(search_path)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 957, in scan
    self.add(dist)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 977, in add
    dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
TypeError: unorderable types: str() < NoneType() 



이렇게 되는겨... 저기서 str이랑 None을 비교하나 보다. 소스를 까본다.



970     def add(self, dist):
971         """Add `dist` if we ``can_add()`` it and it has not already been added
972         """
973         if self.can_add(dist) and dist.has_version():
974             dists = self._distmap.setdefault(dist.key, [])
975             if dist not in dists:
976                 dists.append(dist)
977                 dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)


아, sort()key로 hashcmp attr를 넘기네. 그럼 hashcmp를 찾아보자.



2388     @property
2389     def hashcmp(self):
2390         return (
2391             self.parsed_version,
2392             self.precedence,
2393             self.key,
2394             _remove_md5_fragment(self.location),
2395             self.py_version,
2396             self.platform,
2397         )



아따 뭘 많이도 반환하네. 우선 반환하는 튜플을 한번 찍어볼까?
return(...)을 복사해서 return 전에 붙이고 print로 바꿔준다. 요로케. 흐흐흐



2388     @property
2389     def hashcmp(self):
2390         print (
2391             self.parsed_version,
2392             self.precedence,
2393             self.key,
2394             _remove_md5_fragment(self.location),
2395             self.py_version,
2396             self.platform,
2397         )
2398         return (
2399             self.parsed_version,
2400             self.precedence,
2401             self.key,
2402             _remove_md5_fragment(self.location),
2403             self.py_version,
2404             self.platform,
2405         )



그리고 다시 pip를 해보면? 짜잔~



scari@sylvanas:~/codes$ pip install konlpy
[snip]
0.8.1 -1 bokeh /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 None
2.32.1 -1 boto /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 None
1.0.0 -1 cachetools /Users/scari/anaconda3/lib/python3.4/site-packages None None
0.8.6 -1 cffi /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 macosx-10.5-x86_64
0.3.3 -1 colorama /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 None
[snip]

self.platformNone인 경우는 너무 흔하고, 가끔 self.py_version까지 None인 녀석들이 있다.
그랬구나. 그래서 TypeError가 났던거였구나. 내가 고쳐줄게 우쭈쭈쭈.
py_versionplatformNone인 경우에는 ''를 반환하도록 고쳐준다.



2388     @property
2389     def hashcmp(self):
2390         return (
2391             self.parsed_version,
2392             self.precedence,
2393             self.key,
2394             _remove_md5_fragment(self.location),
2395             self.py_version or '',
2396             self.platform or '',
2397         )

문제가 해결이 되었나 확인해볼까?


scari@sylvanas:~/codes$ pip install konlpy
Collecting konlpy
Downloading konlpy-0.4.3-py2.py3-none-any.whl (22.4MB)
100% |################################| 22.5MB 12kB/s
[snip]
Successfully installed JPype1-py3-0.5.5.2 konlpy-0.4.3



ㅋㅋㅋㅋㅋ 잘된다! 한 건 했으니까 PR 날려야지 룰루~


...


Aㅏ...


https://bitbucket.org/pypa/setuptools/pull-request/122/ensure-py_version-and-platform-are-str-in/diff



삽질한게 아까워서 블로그에 기록. 역시 이런 거저 먹는 꿀 버그는 먼저 밟는 사람이 임자다.
이 버그 한달만 빨리 밟았어도 setuptools에 커밋 하나 하는건데 아쉽 ㅠㅠ

P.S) 쓰고 나니 konlpy PPL 글이 되버렸다.

2015년 3월 11일 수요일

Building OpenCV 3.0 Beta on Mac OS X Yosemite with Anaconda / Python3

Python3로 넘어가기로 마음먹은지 몇 달이 지나지 않았을 때쯤, PyCon JP에서 어느 발표를 보고 문득 OpenCV를 써보고 싶은 생각이 들었다. Python3에서 쓰려면 OpenCV 3.0을 써야했고, 그 때는 아직 정식 패키지가 나오지도 않은 Alpha 버전이었다.

인간 빌드머신인 사수님께 비할바는 아니지만 나도 빌드밥은 조금 먹어봤고 소프트웨어를 빌드해서 쓰는데 별로 거부감이 없었으므로 쉽게 생각하고 빌드를 했는데...
안됨 ㅠㅠ
왜죠?

SO에 질문도 올려보고,
http://stackoverflow.com/questions/26815537/opencv-3-0-0-alpha-with-python-3-failed-to-import-cv2

"살짝 힘들었는데, 결국은 성공함ㅋㅋㅋ" 라고 읽혀-_-지는 성공기에 댓글도 쭈삣쭈삣 달아보고,
http://luigolas.com/blog/2014/09/15/install-opencv3-with-python-3-mac-osx/

어쨌든, No Luck. 안됨. 빌드는 제대로 된거 같은데 import를 하면 난리남.
같은 증상을 호소하는 애들도 나타나고, 괜한 영웅심이 발동해서 멋지게 이 난제;를 해결하고 보란듯이 SO에 self answer를 달고 싶었으나 능력 부족으로 일단 홀드. piku 작업을 하고 있을때라서 시간을 더 들이기 아까웠다. (...하지만 몇 일뒤 Beta 버전이 나오는데, 모르고 지나침)

일도 바쁘고, OpenCV는 잊혀져가고, 그러다 어떤 친구가 Disqus에 답글도 달고 SO에 답변도 달아주면서 관심을 다시 환기시키는 계기가 되었는데, 이 때는 정신이 없어서 "어 그래? 고생했구나" 하는 느낌으로 Accept.

그러다가 오늘 다시 생각이 나서 찾아보니 OpenCV는 내가 그 삽질을 하고 몇 일 뒤에 Beta를 내놨고, 그 친구의 답변덕분에 무려 4개월만에 OpenCV를 써보게 되었다! ㅠㅠ 저렇게 단순한 문제를 못 찾아내서 넉달동안 문제를 묵혀둔게 너무 부끄러워 기록을 해둔다. 빌드 스크립트는 Gist에 올려둠.

요약)
http://stackoverflow.com/questions/26815537/opencv-3-0-0-alpha-with-python-3-failed-to-import-cv2
http://luigolas.com/blog/2014/09/15/install-opencv3-with-python-3-mac-osx/

https://gist.github.com/scari/89927508e7bc8b9b4584
$ sudo install_name_tool -change libpython3.4m.dylib ~/anaconda3/lib/libpython3.4m.dylib ~/anaconda3/lib/python3.4/site-packages/cv2.so