2016년 9월 1일 목요일

Tensorflow와 Docker, Jupyter 환경 설정

Docker Image를 이용하여 Tensorflow를 설치, 테스트 하는 - 몇달만에 띄우다가 까먹어서 헤깔린 내용들을 ㅠㅠ - 과정을 간단히 정리.

Docker의 특성상... 
 - 기존 환경과 완전히 격리시킬 수 있고, 
 - Light-weight container로 Host machine과 비교해도 Performance 또한 거의 손실이 없는 수준이고,  
 - 의존성 높은 tensorflow library 환경을 구축을 한번에 끝낼 수 있으니 
Tensorflow를 테스트해보고 싶은 사람에게는 Docker를 이용한 설치를 적극 추천한다. 
Production환경은 더 고려할게 많으니 논외. 

1. Docker 설치
MAC, 윈도우, 리눅스 모두 https://www.docker.com/ 에서 Installation Binary를 다운로드 받으면 쉽게 설치 가능하다. 
Docker의 Image는 Virtual Machine 이미지 자체,  이미지가 실행되어 떠 있는 아이는 Container 정도로 이해하면 쉽다. 

2. Tensorflow Docker Image Pull / Run
구글에서 제공하는 Tensorflow docker image를 다운로드 후 실행한다.
Docker는 로컬에 이미 image가 있는 경우 image를 container로 로딩, 
없으면 원격에서 image를 pulling 하여 인스톨 후 로딩한다.

간단하게 한줄이면 끝. 
$ docker run -it gcr.io/tensorflow/tensorflow  
Docker image Pull & Run
열심히 다운로드 하고, Jupyter Notebook을 띄웠다고 하고 끝난다. 

친절하게 
The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/
라고 하니, 어쩐지 늘 하던대로 http://127.0.0.1:8888/ 로 접속해 보자. 
localhost 접속 결과. 안된다.



그냥 접속하면 안된다. -_-;
docker는 container들에 virtual ip를 부여한다. 

VM IP를 확인하고... 
$ docker-machine ip default
virtual ip를 확인하자!

container port forwarding 옵션을 포함하여 다시 실행해주자.
$ docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
port forwarding과 함께하는 docker

그리고 위에서 확인한 http://192.168.99.100:8888 로 접속해보면...
노트북 리스트가 떴다!
이렇게 jupyter가 뜨면 tensorflow 환경 간단 구축 끝. 

2016년 8월 29일 월요일

iTerm2에서 갑자기 한글이 깨질때

MAC에서 iTerm2를 사용하다가 어느날 갑자기(!) 한글이 깨지기 시작했다.

이리저리 찾다가 조치하고 해결한 방법 메모.

~/.bash_profile 에 [LC_CTYPE="ko_KR.UTF-8"] 을 추가해주고 bash를 재시작하면 해결된다.

2016년 8월 28일 일요일

제로카 셰어링 한달 사용기

제로카 셰어링의 정체와 개인적 경과는 지난번 포스팅 (제로카 셰어링 당첨, 그리고 차량 인수) 참고와 검색을 추천합니다.

제로카 셰어링 한달 운영 결과 / 소회를 메모.
8월 정산내역

주유비 정산등이 빠져있으니 아직 최종 납부 금액이 결정되지는 않았지만,
일단 지난 달 차 사용 및 2차 임대료 관련 정산 결과는 이게 최종이라고 보면 된다.

대여료 부분만 계산하면 VAT 포함 217,800원이 원래 납입금액이고,
2차 임대를 통해 발생한 할인액이 171,427원이 되어서,
결국 46,373원으로 아반떼 AD를 한달간 리스한 셈이다.

동일 차종 취득시 금액을 보수적으로 1,600만원 정도 잡아주고,
적당히 6년 감가상각으로 때려주면 한달에 23만원씩 빠져나가는  - 취등록세, 기타 초기 비용 등도 있고 가속상각으로 적용하면 초반에 훨씬 더 많이 지출될 - 계산인데 꽤 경제적인 것은 사실이다.
당연히 여기에 세금과 보험, 유지비용이 더해지면 매달 지출 비용은 훨씬 더 올라가게 된다.
비교적 모든 결정에 가성비를 생각하는 버릇이 있어, 차량 구매와 비교하면 결과적으로 훌륭한 결정이었다고 생각한다.

하지만 운영 자체는 꽤 많이 신경 쓰인다.
차가 나갔는지, 제대로 정위치에 주차를 해두기는 했는지,
사고를 내지는 않았는지, 실내를 더럽히지는 않았는지,
급가속, 정지 등 차를 험하게 몰지는 않았는지 등등등등등등.

한달이라는 짧은 기간 동안에도,
 - 범퍼를 찢어먹고 돌아오고, (게다가 일종의 뺑소니였다. 박았다는 것을 본인이 알고도 신고를 안 함)
 - 정해진 위치가 아닌 곳에 세워두고 + 밤새 창문을 활짝 열어두고 반납하고,
 - 실내에 모래가 한 가득 쌓이고,
등등 수많은 일들이 있었다.
좌측 앞범퍼 뺑소니 건
어차피 추적 가능한 시스템이라 책임과 비용을 임차인에게 귀속시킬 수 있는데,
운전 자체가 서투른거야 어쩔수 없다고 쳐도 -
도대체 왜 '너도 나도 깨끗하게 관리 잘해서 서로서로 저렴하게 오래 같이 탑시다'는 안되는지. 서비스가 아니라 렌탈 고객의 '기본'이 안된 경우가 많아 아쉬움이 남는다.


또 쏘카의 서비스 자체도 만족스럽지 않은 부분이 많고, 의혹이 생기는 부분들도 생겼다.
기본적으로 콜센터는 항상 연결이 어렵고, 서비스 초기라 내부 프로세스가 안잡혀 있는지 제로카와 쏘카의 상담은 서로 핑퐁치기 바쁘다. 당연히 각 창구를 통한 상담 내역 등도 전혀 공유되지 않고 있다.
앱과 서비스 안정성은 초기 단계라 기능이 빈약하고 불안정하며 오류가 대단히 많다.

게다가 건별로 발생하는 정산 내역에  의구심이 드는 것은..
제로카 계약서에는 분명 '대여자 지불 요금의 50%'를 제로카 요금에서 할인하는 것으로 되어 있는데, 쏘카 이용자가 조기 반납하는 경우 등에 발생하는 쏘카가 받게 되는 일종의 낙전 수입은 제로카 차주에게 정산되지 않고 있다.
쏘카에서 발행한 쿠폰을 사용하여 임차가 발생하는 경우, 쏘카 이용자의 최종 결제액에 쿠폰 할인이 적용되어 예상 금액을 밑도는 대여건이 발생하는 경우도 허다하다.
제로카 계약서

대충 세줄 요약하며 마무리하면...
서비스 전반적으로는 만족하나, 개선할점은 아직 너무 많음.
카셰어링 소비자들의 시민의식은 0점에 수렴 중인 것을 경험하고 있으며,
차량을 주말에만 쓰거나 하는 경우는 제로카 이용을 적극 검토해 볼만 함.

2016년 7월 28일 목요일

제로카 셰어링 당첨, 그리고 차량 인수

카쉐어링 서비스 스타트업인 쏘카에서 최근 '제로카 셰어링' (http://zerocar.socar.kr/)을 출시했다. 상세 내용은 홈페이지, 기사, 기타 리뷰 등에 많이 올라오고 있는데 여러모로 비즈니스 모델과 마케팅 소구점이 흥미롭다.

국내의 관련 규제 이슈를 비껴가는 동시에 자사 셰어링 서비스의 커버리지는 확장,
동시에 비용의 일부 - 셰어링카의 주차장 임차료 - 와 차량의 유지보수/관리 의무의 일부는 1차 임차인에 전가시키면서도 혜택이라는 느낌을 주고 있다.
(B2C 장기렌탈의 요율이나, 또는 자차 구매시의 감가상각과 세금/보험/유지보수 비용 등과 비교하면 저렴하기는 하다.)

어찌되었건 매월 제로카 고객이 부담해야 할 월별 비용은 아래와 같다.

  • 본인 이용료 A = 기본 임차료 (VAT포함 217,800원) + 주유비용 + 하이패스요금
  • 2차 임차수익 B = 2차 임차 (셰어링) 수익 x 0.5 + 2차 임차 주행요금
  • 비용 = A-B

이런 구조라 2차 임차가 충분히 이루어지는 경우 (B => A의 경우) 0원에 차를 사용할 수 있다고 커뮤니케이션하여 '제로카'인 것이다.

나는 차를 소유하고 있지 않지만
주말 이동경로가 아스트랄하고, 장 볼때나 등등 차가 아쉬운 경우가 왕왕 있어서..
되도 그만, 안되어도 그만, 나중에 필요할 때 차는 구매하면되지 하는 생각을 하며 신청했었는데 덜컥 당첨되어 버렸다.
1차 대상자 선발에 14,000명이나 신청했다고 하니 어쨌건 140:1의 경쟁률을 뚫고(?) 선발이 된 셈. 온라인으로 계약서를 작성하고, 주차장 이용과 관련한 서류를 등기로 보낸 뒤 오늘 차량을 인수받았다.

차량 인수증
주행거리가 85km인 2017년형 풀옵션 (거의 풀옵션. 아반떼에 후방카메라와 풀터치스크린 인터페이스가 매립되어 있다니!) 아반떼 AD를 원하는 시간과 장소에서 인수받았고, 차량 상태, 구성품 등에 대해 확인 후 끝.

상상치도 못하게 탁송기사분이 나이 지긋하신 여사님이셨는데, 전국에 하나뿐인 큰 빌딩을 내비를 찍고도 못찾고 옆동네로 가셔서, 전화로 한참 설명하고 / 그래도 헤매시다 오셨다는건 함은정...

아무튼 새차가 그대로 왔다. 의자 비닐도 안뜯어지고, 차내 바닥용 매트도 트렁크에 그대로 담긴 그대로.
제로카는 기존 쏘카와 마찬가지로 앱으로 제어되며, 2차 임차 관리와 정산 정보 확인을 위한 기능들이 앱에 추가되어 있다. 마찬가지로 차량에는 ECU와 연결되어 있는 쏘카용 원격제어 단말기와 하이패스, 쏘카 주유카드 등이 함께 들어있었다.

아반떼 AD 2017년형

쏘카 제어 모듈

비닐도 안뜯은 정말 새차

매트도 안깔린채로 출고 상태대로 트렁크에 있다


안드로이드 태블릿 단말이 매립되어 있다.

매립 내비게이션. 보다시피 매우 조악하다. 폭스바겐 등 수입차에서나 볼 수 있는 조악한 내비게이션.
SK가 투자했고, 어차피 T map도 통신사 전체 공개한 마당에 T map을 깔아주었으면 어땠을지.
GPS 정확도, UI, 안내 모두 근래 만져본 내비중에 최악이어서 비교적 다 양호했던 첫만남 인상의 감점요인이었다.
어쨌건 통신 모듈이 얹어진 스마트 단말이니 차차 나아지리라 기대함.

아직 제로카 앱 자체가 활성화되지 않아 뭔가를 더 해볼수는 없지만, 요새 나름 핫한 이 서비스의 이용 경험들은 짬짬이 기록해 볼까 싶다.

2016년 7월 17일 일요일

Docker / iTerm Troubleshooting

맥북에서 Docker를 사용할 일이 있어 설치 후 Docker Quick Start Terminal의 Default를 iTerm으로 잡아주니 비정상적으로 동작한다.

찾아보니 iTerm 관련 오류가 있었고, 아래 링크에서 iterm.scpt를 복사하여,
"/Applications/Docker/"Docker Quickstart Terminal.app"/Contents/Resources/Scripts/iterm.scpt" 에 덮어씌워주고 해결됨.

https://github.com/virajkanwade/toolbox/blob/b45ae79a4b7eb16e397b759c53cac8d5c0da134c/osx/mpkg/quickstart.app/Contents/Resources/Scripts/iterm.scpt

* 위 경로는 Default location에 Docker를 설치한 경우에만 해당함. 아닌 경우 iterm.scpt를 찾아서 패치하면 된다.

2016년 5월 15일 일요일

19대 국회의원 정치자금 사용 내역 EDA (2탄)

[목차]
3. '분류항목'별 지출액 금액 분포를 보자. 
중복 제거한 '분류항목'의 개수는 총 59개이다. 그냥 분포가 아니라 정말 지출한 금액이니 아웃라이어 제거 같은 건 하지 말고 그냥 한번 구간을 좁혀가면서 보자. 

3-1. 전체 분류항목별 지출 금액 분포 
 - 부동산, 송사비용, 차량구입비 등이 중간값으로 1등

3-2. 1000만원 이하만 다시 보면?
 - 정치여론조사 컨설팅 / 의정보고 발송비... 평판 관리(?!)와 홍보에 건별로 비싸게 지불하고 있다.

3-3. 100만원 이하만 다시 보면?
 - 택시를 타고 어떻게 다니면 도대체 30만원이 나오는 거지?
 - 신문구독비가 70만원에 육박하는 건 무슨 신문을 몇 부나 보는 건가?
 - 주유비 분포도 참으로 다양하다. 

4. 그럼 누가누가 많이 썼나?
 4-1. 개인별 지출액 Top 20


 4-2. 당별 개인별 Top
  4-2-1. 새누리당



  4-2-2. 새정치

  4-2-3. 진보정의

  4-2-4. 통합진보


  4-2-5. 무소속

2016년 5월 9일 월요일

19대 국회의원 정치자금 사용 내역 EDA (1탄)

[목차]
19대 국회의원 정치자금 사용 내역 EDA (1탄) 
19대 국회의원 정치자금 사용 내역 EDA (2탄)
=========================================
짬짬이 해보는 19대 국회의원 정치자금 사용 내역 EDA.

오마이뉴스가 중앙선관위를 통해 받은 19대 국회의원 322명의 정치자금 수입/지출 보고서의 지출 내용 368,148건에 대한 심심풀이 분석이며,
해당 자료는 아래 링크에서 다운로드 할 수 있다.
https://github.com/OhmyNews/12-14_kapf

짬짬이 진행해 보는대로 후속 업데이트할 예정.

0. 로딩한 데이터 Summary부터.
 1) 총 368,148건.
 2) 지출액은 -8천만원 ~ 1.7억 (마이너스는 뭐지 ;)
 3) 사용처 중 가장 많이 등장하는 아이는 케이티. 아마도 통신비.


1. 당별 지출액 계를 살펴보자

2. "분류항목"별 비교를 해보자.
2-1. 어떤 분류에 내 세금을 많이 썼을까? (Top 20) 
 1) 인건비가 엄청 높음. 사람 쓰는데 돈 많이 쓰는군.
 2) 용처가 매우 수상쩍은 '정치-활동비용'이 두번째.
 3) 역시 부동산 비용.

2-2. 당별 Top 10 지출 분류 항목은? 
당별로 지출 분류 Top 20을 뽑아보자.
 1) 새누리: 인건비, 정치활동비, 사무실 ...

 2) 새정연: 새누리와 동일

 3) 통진당: 특별당비(?), 정치활동비, 사무실. 특별당비의 정체는 나중에 밝혀보자.

 4) 무소속: 인건비.

 5) 진보정의당 : 정치활동비, 특별당비

모두 '정치 활동비'라는 녀석의 정체를 밝힐 필요가 있어보인다.
'후원-특별당비' 항목도 뭔가 궁금하다.
2탄은 다음 번에 시간날때 이어서...


2016년 4월 27일 수요일

연령대별 장래 인구 추계 (1960 ~ 2060)



통계청 자료로 만든 연령대별 장래 인구 추계. (1960 ~ 2060)
다들 얘기하는 노령화 사회로의 변화를 예고하고 있다.
말그대로 100세시대, '노후'에 대한 대비는 개인의 준비 문제가 아니라 사회의 문제로 심각하게 논의되어야 할 것 같다.

library(ggplot2)
library(dplyr)
library(scales)
library(reshape2)

df <- as.data.frame(read.csv("population2.csv", header=TRUE))
head(df)

df2 <- df %>% mutate(age_range2 = '0~14')
df2[4:13, ]$age_range2 <- '15~64'
df2[14:20, ]$age_range2 <- '65+'

df2m <- melt(cbind(df2[2:12], age_range=df2$age_range2), id.vars=c('age_range'))
levels(df2m$variable) <- gsub("X", "", levels(df2m$variable))

# for annotation
year_total <- 
  df2m %>% 
  group_by(Year) %>%
  summarise(year_total = sum(Percentage))

age_range_total <- df2m %>% 
  group_by(Year, age_range) %>% 
  summarise(avg = sum(Percentage))

df2m_tmp <- left_join(age_range_total, year_total, by="Year")
df2m_tmp <- df2m_tmp %>% mutate(prop = avg/year_total)
df2m_tmp <- df2m_tmp %>% mutate(cumsum = cumsum(prop))

# plotting with annotation
ggplot(df2m,aes(x = Year, y = Percentage, fill = age_range)) + 
  geom_bar(position = "fill",stat = "identity", ylab='percentage', xlab='year') + 
  scale_y_continuous(labels = percent_format()) +
  annotate(geom="text", 
           x=df2m_tmp$Year, 
           y=df2m_tmp$cumsum, 
           label=paste0(as.character(round(df2m_tmp$prop*100, digits=1)),'%'), size=4) 


2016년 4월 5일 화요일

Python request package exception handling

사이트 목록을 돌며 title 내용을 가져오는 간단한 크롤링 코드를 짜서 돌리다가,
목록 중간 특정 웹사이트에서  에러가 발생하여 exception catch 처리한 내용. 기록/메모를 위해 남겨둔다.

[error msg] 
requests.exceptions.ConnectionError: HTTPConnectionPool(host='hostname', port=80): Max retries exceeded with url: hostname ...

response == none 인 경우를 잡아내 주면 보통 문제없이 돌았었는데, 이번처럼 request pkg의 ConnectionError를 handling 안해주면 죽는 경우가 생긴다. 

[Code]
import requests as rq
import bs4

header = {'User-Agent':'Mozilla/5.0'}

def get_html_title(url):        
    request = rq.Request('Get', url, headers = header)
    r = request.prepare()
    s = rq.Session()
    try: 
        response = s.send(r)
    except rq.exceptions.ConnectionError:
        return ''
    if response == None: 
        return ''
    html_content = response.text    
    navigator = bs4.BeautifulSoup(html_content, "html.parser")    
    title = navigator.find('title')
    if title == None:
        return ''
    return title.get_text() 

[Request PKG의 Exception Case]
http://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions

Errors and Exceptions

In the event of a network problem (e.g. DNS failure, refused connection, etc), Requests will raise aConnectionError exception.
In the rare event of an invalid HTTP response, Requests will raise an HTTPError exception.
If a request times out, a Timeout exception is raised.
If a request exceeds the configured number of maximum redirections, a TooManyRedirects exception is raised.
All exceptions that Requests explicitly raises inherit from requests.exceptions.RequestException.