twosb world

What a wonderful Programming?


  • 홈

  • About

  • 태그

  • 카테고리

  • 아카이브

  • 검색

Hexo 블로그 초간단 Markdown 이미지 업로드 방법

작성일 2018-07-01 | In HEXO , 꿀팁 |

* Hexo 블로그 초간단 Markdown 이미지 업로드 방법


원래 사진 파일 업로드는 imgur를 이용하고 있었는데, Github 내에서 간단하게 올리고 마크다운 문법도 자동으로 만들어주는 좋은 방법이 있어서 공유한다. 무려 이미지를 무료로 업로드 하고 쓸 수 있다!

fireshot pro screen capture 006 - twosb sangbeom lee - github_com_twosb

먼저 Github에 로그인하고 Your Profile 을 클릭한다.

fireshot pro screen capture 002 - twosb sangbeom lee - github_com_twosb

다음으로 나오는 페이지에서 [yourname].github.io Repository를 클릭한다.
(필자는 twosb.github.io : 사실 어느 레포든 상관 없다.)

fireshot pro screen capture 003 - twosb_twosb_github_io - github_com_twosb_twosb_github_io

레포에 들어가서 Issues 탭을 클릭한다.

fireshot pro screen capture 004 - issues twosb_twosb_github_io - github_com_twosb_twosb_github_io_issues

New issue 버튼을 클릭한다.

fireshot pro screen capture 005 - new issue twosb_twosb_github_io - github_com_twosb_twosb_github_io_issues_new

위와 같은 창이 나오는데,

fireshot pro screen capture 006 - new issue twosb_twosb_github_io - github_com_twosb_twosb_github_io_issues_new

사진 파일을 Leave a comment 가 적혀있는 칸에 끌어다 놓는다.(복수 파일 가능)

fireshot pro screen capture 007 - new issue twosb_twosb_github_io - github_com_twosb_twosb_github_io_issues_new

Uploading 어쩌고가 나오면 조금만 기다려주자..

fireshot pro screen capture 008 - new issue twosb_twosb_github_io - github_com_twosb_twosb_github_io_issues_new

완료! Markdown 문법대로 이미지 파일 경로를 만들어주었다. 개꿀!

default

이런식으로 작성을 끝내면 Submit new issue 를 하지 않고 그대로 뒤로 가기를 눌러도 업로드 된 파일은 남아있다.

앞으로 Typora 대신 Marp + Github image upload 전략을 사용해야겠다. 개꿀이다 이건!

Selenium을 이용한 네이버 기사 10페이지 제목 리스트 스크레이핑!(크롤링)

작성일 2018-06-27 | Edited on 2018-06-29 | In PYTHON |

* Selenium을 이용한 네이버 기사 10페이지 제목 리스트 스크레이핑!(크롤링)


실제 개발 시 구글링을 통해 참고하다보니 쓸데 없이 긴 글 보다 짧지만 정확한 정보가 있는 글이 몰입감이 훨씬 높다는 사실을 깨달았다. 그래서 필요한 과정만 정확히 쓰는 습관을 들이도록 하겠당.. = =

저번 포스팅에서 예고했던 것 처럼, 스크레이핑 툴인 셀레니움을 이용해 네이버 IT/과학 홈에 있는 기사 제목 200개를 스크레이핑 해보겠다. IDE은 주피터 노트북을 사용하겠다.

주피터 노트북은 터미널 창에서 pip install jupyter 를 입력하면 설치 할 수 있고, 파일들이 있는 폴더에서 Bash shell을 실행해 jupyter notebook 을 입력하면 실행시킬 수 있다.

* 바로 이 부분의 제목을 스크레이핑 할 것이다.

1. 스크레이핑을 위한 Selenium 설치

이곳에 셀레니움 설치 방법이 나와있다. 조금 수정하자면

  • 현재 ChromeDriver는 최신 버전이 2.4다. 받아준다.
  • chromedriver.exe를 굳이 D:\로 이동해주지 않아도 된다. 아래 예제에 경로가 이렇게 나와 있는데, D:/chromedriver에 해당하는 부분을 chromedriver.exe 파일이 있는 경로로 수정만 하면 된다.
1
driver = webdriver.Chrome('D:/chromedriver') # D:/chromedriver 부분을 수정해주자.


설치가 끝났으면 주피터 노트북을 켜고 New file을 만들어주고, 첫 줄에

1
2
3
from selenium import webdriver
import time
driver = webdriver.Chrome()

를 입력해주자. 동작을 하지 않는다면 () 안에 들어갈 부분을 적절하게 수정해주자. 그럼 아래와 같은 창이 뜬다.

Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다. 라는 멘트가 의미심장하다. 바로 이 새로운 Chrome 창에서 우리가 입력하는 명령어들이 수행된다.

import 는 추후 페이지를 이동 할 때 1초의 Delay를 걸어주기 위한 모듈이다. 일단 임포트 해주자.


2. 스크레이핑 할 네이버 기사 타이틀을 긁어오기
1
driver.get("http://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=105")

get 명령어를 통해 해당 URL로 이동한다. 그럼 자동화된 Chrome창이 아래와 같이 보일 것이다.

이어서

1
time.sleep(1)

코드를 추가해준다. 웹 페이지가 읽어들여질 때 까지 잠깐 기다려 주는 것이다. get 으로 웹페이지를 읽어준 후 추가해주는게 가장 효율적이다.

1
articles = driver.find_elements_by_css_selector('#section_body > ul > li > dl > dt > a')

그리고 기사 목록을 읽어들여준다. find_elements_by_css_selector 명령어를 사용해주는데, 저번 포스팅에서 사용했던 requests 모듈을 이용한 방식이 아닌 CSS Selector 방식을 사용하겠다.

CSS Selector에 대해 잘 모르겠다면, 이 곳을 참고하자. 너무나도 잘 설명되어 있다.


F12 를 눌러 개발자 도구로 들어간다. 그리고 빨간색 원 부분을 눌러준다. 단축키로는 Ctrl+Shift+C 이다.

스크롤을 아래로 내리면 기사가 시작되는 부분 가장 위에 배틀그라운드 모바일, 매출 순위 다시 급상승 이라는 기사 제목이 있다.(물론 기사가 계속 바뀌므로 다른 제목이 보일 것이다.) 이를 눌러주면 오른쪽 연한 파란 상자가 해당 제목이 들어가있는 html 코드 부분을 선택해준다.

오른쪽 연한 파란 상자 부분을 오른쪽으로 클릭한 후 Copy -> Copy selector 을 클릭하면

#section_body > ul.type06_headline > li:nth-child(1) > dl > dt:nth-child(2) > a

가 복사된다. 오른쪽으로 갈 수록 하위 코드로 내려가게 된다. 하나하나 간단하게 뜯어보자.


  1. #section_body : 앞에 # 는 id 를 나타낸다.

왼쪽은 id="section_body" 가 해당되는 범위이고, 오른쪽 파란 박스는 해당 id가 포함된 코드 부분이다.

class="section_body" 를 나타내는 .section_body 로 대체 할 수 있다.


  1. ul.type06_headline : ul 뒤의 . 은 type06_headline 의 class 를 나타낸다.

HTML에서 목록을 나타내는 태그인 ul 는 순서가 없는 목록이며, ol 은 순서가 있는 목록이다.

ul의 u는 위로 구멍이 뚫려 있으므로 제한이 없고, ol의 o는 구멍이 뚫려있지 않으므로 제한이 없다고 기억하자.

ul.type06_headline = ul + . + type06_headline 이라고 생각하면 된다.


  1. li:nth-child(1) : li 태그 밑에 붙는 nth-child(1) 에 대해 궁금하다면 이 곳을 참고한다. 카인드데스네~
  2. dl
  3. dt:nth-child(2)
  4. a

들의 설명은 생략하겠다.. 링크 글을 읽었다면 쉽게 이해할 수 있다. 모르면 댓글로..


결국, #section_body > ul.type06_headline > li:nth-child(1) > dl > dt:nth-child(2) > a CSS Selector 코드는 '#section_body > ul > li > dl > dt > a' 코드로 변경된다. (#section_body 는 .section_body 로 변경해도 상관 없다.)


3. 10페이지 기사 제목을 모두 담기

이를 article_Scraping 함수로 만들면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
article_list = []
def article_Scraping():
driver = webdriver.Chrome()
for i in range(1, 11):
driver.get("http://news.naver.com/main/main.nhn?\
mode=LSD&mid=shm&sid1=105#&date=%2000:00:00&page=" + str(i))
time.sleep(1)
articles = driver.find_elements_by_css_selector('#section_body > ul > li > dl > dt > a')
for article in articles:
if article.text == "동영상기사":
pass
elif len(article.text) != 0:
article_list.append(article.text)
driver.quit()
for article in article_list:
print(article)

article_Scraping()
  1. article_list : 1부터 10페이지의 모든 제목이 담길 list이다.
  2. article_Scraping : 10페이지 기사 제목을 담을 명령을 가진 함수를 만들었다.
  3. driver : chromedriver 실행!
  4. for문 (1) : 1부터 10페이지까지 1페이지 당 20개의 기사 제목들을 article_list 에 담는 노가다를 해준다.
  5. driver.get : 페이지를 이동해준다. 1페이지 주소는 아래와 같이 이루어져 있다.

끝에 있는 page=1에 1 부분만 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 으로 바꿔주면 된다.

그래서 for문 (1) 의 range 를 1부터 11까지 잡은 것이다.

  1. time.sleep : get 명령어로 1초 동안 다음 명령어로 움직이지 않고 쿨쿨 자준다.
  2. articles : CSS Selector로 기사가 있는 경로로 접근해준다. 최종 도착점은 a 태그이다. 하지만, articles를 무턱대고 출력하면 아래와 같은 결과가 나온다.

모든 텍스트를 출력하다보니 아무 내용 없는 "" 부분도 출력해버리게 된다. 걸러야 할 부분은 두 가지이다.

  • "동영상기사" 라는 내용이 입력된 기사의 Text
  • "" 로서 Text 길이가 0인 Text
  1. for article in articles: : 첫 번째로 article.text 가 "동영상기사" 인지 판단하여 맞으면 pass.
    두 번째로 article.text 의 길이가 0 이 아니면(0이면 pass인거임) article_list 에 append.
    두 조건의 순서가 뒤바뀌면 안된다.
  2. driver.quit : article_list 에 모든 기사 제목이 입력되었기 때문에 chromedriver 를 끈다.
  3. article_list 에 있는 모든 article 을 출력한다.
  4. article_Scraping 함수를 실행한다.

결과는 아래와 같다.

기사 제목이 한 줄씩 출력된다. 1페이지에 20개 기사씩, 총 200개의 기사 제목이 출력되는 것이다.


어떻게 보면 기초적인 스크레이핑지만, 생각보다 자잘한 조건들을 찾아서 넣어줘야 했다.

스크레이핑(크롤링)은 노가다다. 노가다를 즐기도록 하자.


* 더 궁금한 부분이 있다면, 댓글을 남겨주세요. 바로 대답 드리겠습니다.

STATS.NBA.COM 크롤링(스크래핑) by using JSON in Python

작성일 2018-06-24 | Edited on 2018-06-29 | In PYTHON |

STATS.NBA.COM 크롤링(스크래핑) by using JSON in Python



STATS.NBA.COM 파싱하기 드러워서 내가 쓴다…

크롤링인지 스크래핑인지 만만치 않다는 사실을 깨달았읍니다…


1
Question: 아래 URL의 NBA 데이터를 크롤링하여 판다스 데이터 프레임으로 나타내세요.

해당 페이지 링크는 아래과 같다.

http://stats.nba.com/teams/traditional/?sort=GP&dir=-1


그리고 우리가 Pandas로 구현해야 하는

이 테이블을 JSON 파일 형태로 html Pasing하여 출력하도록 하겠다.

1. STATS.NBA.COM 해당 페이지의 숨어있는 JSON 파일 찾기

위에 표시된 링크에 들어가면 이러한 화면이 보인다.


이곳에서 키보드의 F12 를 누르면, 오른쪽에 개발자 도구가 뜨게 되는데, Network 에 들어가서 XHR 탭을 클릭하고 F5 를 눌러보자.


Name 탭에 5가지의 Request 결과가 뜨는데, 이 중 4번째인 leaguedashteamstats?Conference= 로 시작하는 데이터를 클릭하고 오른쪽 탭의 resultSets 를 계속 펼쳐보면 rowSet 묶음에 STATS.NBA.COM 페이지에서 봤던 익숙한 NBA 팀 이름들이 뜬다.

개발자 도구 안에서도 JSON의 구조를 파악하고 Pasing이 가능하지만, 우리는 JSON 파일을 예쁘게 볼 수 있는 크롬 앱을 사용해보도록 하겠다. 필자가 쓰는 JSON Viewer는 Json Viewer다. 이 곳에서 크롬 앱에 추가할 수 있다. 일단 추가하면 JSON 파일을 열 때 알아서 예쁘게 보여준다.

그럼 이제 leaguedashteamstats?어쩌구를 더블클릭해서 열어보자… 혹은 이 링크를 누르면 JSON 형태의 웹 페이지가 보인다.


이것이 바로 우리가 데이터를 뽑아내야 할 JSON 웹 페이지의 구조이다. 오른쪽 위에 보이는 위아래 화살표 버튼을 클릭하면


이런 식으로 접히게 된다. 정신산란할 땐 접어놓고 복습호흡을 내뱉으며 하나하나 뜯어가며 코드를 분해하도록 하자.

이정도 정보를 얻었으면, 코드를 조금 작성해보자. IDE는 Jupyter Notebook을 사용하였다.


1
2
3
import requests
import json
import pandas as pd

import할 패키지는 총 3가지이다.

  • 원하는 웹 페이지에 Request(요청)를 보내 html 결과를 받기 위한 requests
  • html 안의 text 결과를 받아와서 데이터로 사용하기 위한 json
  • 그리고 DataFrame으로 데이터를 테이블 형태로 만들어줄 pandas.
    • as pd 를 붙이는 이유는 pandas를 매번 입력하기 귀찮아서 pd로 퉁쳐주기 위한 것이다.


1
url = "http://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=&DateTo=&Division=&GameScope=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2017-18&SeasonSegment=&SeasonType=Playoffs&ShotClockRange=&StarterBench=&TeamID=0&VsConference=&VsDivision="

우선 url 변수에 JSON 파일의 url 주소를 입력해준다. 그리고 아래 get_data 함수의 Parameter로 써준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def get_data(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
response = requests.get(url, headers=headers)
json_info = json.loads(response.text)
stats = json_info["resultSets"][0]["rowSet"]
df = pd.DataFrame(columns=[\
"TEAM","GP","W","L","WIN%","MIN","PTS","FGM","FGA",\
"FG%","3PM","3PA","3P%","FTM","FTA","FT%","OREB","DREB",\
"REB","AST","TOV","STL","BLK","BLKA","PF","PFD","+/-"])
for stat in stats:
df.loc[len(df)] = {
"TEAM":stat[1],
"GP":stat[2],
"W":stat[3],
"L":stat[4],
"WIN%":stat[5],
"MIN":stat[6],
"PTS":stat[26],
"FGM":stat[7],
"FGA":stat[8],
"FG%":stat[9],
"3PM":stat[10],
"3PA":stat[11],
"3P%":stat[12],
"FTM":stat[13],
"FTA":stat[14],
"FT%":stat[15],
"OREB":stat[16],
"DREB":stat[17],
"REB":stat[18],
"AST":stat[19],
"TOV":stat[20],
"STL":stat[21],
"BLK":stat[22],
"BLKA":stat[23],
"PF":stat[24],
"PFD":stat[25],
"+/-":stat[27],
}
df = df.sort_values(by=["GP"], ascending=False)
df = df.reset_index(drop=True)
df.index += 1
return df

하나씩 뜯어가면서 설명하겠다. 아래 코드는 위의 코드와 중복된다. 그러니 위의 코드만 입력하면 된다. 그냥 설명용으로 작성한다.


1
2
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}

STATS.NBA.COM은 아마도 Scraping을 하기 위해 필요로 하는 웹 브라우저 버전이 따로 있는 것 같다. 필자는 Chrome 67.0.3396.87 64Bit 버전을 사용하는데, 61.0.3163.100 버전을 사용하는 것 처럼 속여줘야 데이터를 가져오는 듯 하다. 그냥 구글링 해서 나의 고통을 가지고 있는 분의 질문에 대한 해답에 이런 늬앙스의 글이 있었다. 일단 headers 변수에 해당 내용을 입력해주자.


1
2
response = requests.get(url, headers=headers)
json_info = json.loads(response.text)

response 변수에 아까 입력한 url 주소의 html을 get 방식으로 받겠다고 요청을 보낸다. json_info 변수에 response변수로 받은 html내용의 text를 load하겠다는 명령어를 입력해준다.


1
stats = json_info["resultSets"][0]["rowSet"]

가장 고생을 많이 한 부분이다. stats 변수에 rowSet의 데이터가 입력되어야 하는데(NBA 16팀), json_info["resultSets"]["rowSet"] 으로 썼더니 'str' object has no attribute 'read' 에러가 떴다. [0]을 중간에 추가해줘야한다. JSON Viewer로 보면 이 구조가 잘 안보이고, 오히려 개발자 도구에서 본 구조에서 힌트를 얻었다.


1
2
3
4
df = pd.DataFrame(columns=[\
"TEAM","GP","W","L","WIN%","MIN","PTS","FGM","FGA",\
"FG%","3PM","3PA","3P%","FTM","FTA","FT%","OREB","DREB",\
"REB","AST","TOV","STL","BLK","BLKA","PF","PFD","+/-"])

df 변수 주소값에 pandas DataFrame을 할당해준다. 상단 columns에 TEAM, GP, W 등의 변수들을 추가해준다. 그럼 아래와 같은 형태로 나타난다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
for stat in stats:
df.loc[len(df)] = {
"TEAM":stat[1],
"GP":stat[2],
"W":stat[3],
"L":stat[4],
"WIN%":stat[5],
"MIN":stat[6],
"PTS":stat[26],
"FGM":stat[7],
"FGA":stat[8],
"FG%":stat[9],
"3PM":stat[10],
"3PA":stat[11],
"3P%":stat[12],
"FTM":stat[13],
"FTA":stat[14],
"FT%":stat[15],
"OREB":stat[16],
"DREB":stat[17],
"REB":stat[18],
"AST":stat[19],
"TOV":stat[20],
"STL":stat[21],
"BLK":stat[22],
"BLKA":stat[23],
"PF":stat[24],
"PFD":stat[25],
"+/-":stat[27],
}

for문으로 각 행에 column과 일치하는 데이터를 순서대로 넣어준다. 나머지는 다 순서대로인데, PTS 탭만 stat[26] 데이터를 차용한다. 헷갈리지 말자. 여기까지 입력했으면 아래와 같이 df 변수의 DataFrame이 만들어진다.


1
2
3
4
    df = df.sort_values(by=["GP"], ascending=False)
df = df.reset_index(drop=True)
df.index += 1
return df

만들어진 df를 GP column 기준으로 정렬해주고, ascending=False 명령어로 내림차순을 적용시켜준다. 그럼 아래와 같이 인덱스값이 흐트러지게 된다.

df = df.reset_index(drop=True) 명령으로 인덱스를 리셋해주고, 기존 인덱스는 drop해버린다. 더하여 인덱스가 0으로 시작하는데, df.index += 1 명령으로 인덱스에 모든 값을 1씩 더해준다. indent 위치를 주의하자. 이전 명령들의 indent보다 space 4칸이 적다. 그래야 모든 index에 적용된다. 마지막으로 df를 return해준다.

결과는…


img

위와 같다.

홈페이지의 이 표와 비교하면 내용은 완벽히 같다.. 추후 STATS.NBA.COM의 JSON url 값이나 column 고유값이 변하지 않는 이상, 팀간 GP 값의 변동이 있더라도 get_data 함수가 알아서 Parsing 해줄 것이다.

초기에 http://stats.nba.com/teams/traditional/?sort=GP&dir=-1 URL에서 보듯이, 이 예제에서는 GP값을 기준으로 정렬했는데 df = df.sort_values(by=["GP"], ascending=False) 명령에서 "GP" 부분을 다른 column 값으로 수정하면 다른 기준으로 정렬 될 것이다.


스크래핑, 혹은 크롤링이라고 불리는 작업이 쉽지 않다는 것을 깨달은 하루였다… T-T

소요 시간은 약 4시간정도. 그리고 이 글을 적는 것은 1시간 반 정도 걸렸다.ㅋㅋㅋㅋ

무려 5시간 넘게 뺏어간 놈이다.. 하지만 추후 크롤링을 더 수월하게 할 수 있을 것이라는 자신감이 생겼다.


다음 글 예고


  • Selenium을 이용한 네이버 기사 10페이지의 제목 리스트 크롤링!

나노휠 나노퀵 NQ-AIR 1000W+ 13Ah 후기! (등판각 위주)

작성일 2018-06-20 | Edited on 2018-06-29 | In 제품 Review |

나노휠 나노퀵 NQ-AIR 1000W+ 13Ah 후기! (등판각 위주)


  1. 중대까지 어떻게 갈 것인가 고민고민하다가.. 스쿠터 대신 전동킥보드를 골랐다. 그 중, 싱글에 1000W 파워를 가지고 있는 나노퀵 AIR 1000W를 골랐다.

  1. 고른 이유는 신품 가격은 좀 비싼데(최저가 71만원 수준) 중고가가 굉장히 싸다! 그래서 샀는데.. 문제가..ㅠㅜ 있다가 서술하겠다. 아무튼 1000km 정도 탄 것을 45만원에 구매했다.

    img

    제조회사 - 나노휠 : 극악의 A/S로 유명하지만.. 중고로 샀고 어차피 소모품이라는 생각에 크게 신경쓰지는 않았다. 어쨌든 서울이나 광명에 A/S 센터가 있기에 문제가 생기면 가면 되겠지.

    최고속도 - 55~60 : 아니다! 전원 버튼과 모드 버튼을 동시에 꾸욱 눌러서 설정 모드로 들어가 P7로 맞추면 실제 GPS속도와 비슷하게 나오는데, 약 50km 정도라고 생각하면 된다. 47km까진 봤다.

    주행거리 - 70km : 뭐지…ㅎ? 뻥스펙이 심하다. 정속이 아닌 고속 주행 기준 30km 정도는 아니지만 40km는 안될 것이라고 생각된다. 실제로 30km정도 타고 배터리 1칸~1칸 반 남았다.

    충전시간 - 6~10시간 : 충전중이다. 잘때 꽂아놓고 탈때 뽑으면 되겠지 뭐.

    등판각도 : 아주아주 중요하다! 다른 전동킥보드를 타보진 않았지만, 약 20도까진 가능하다고 생각한다. 심지어 10도까지는 30km 정도로 올라갈 수 있는걸 확인했다! 놀라웠다. 정말 힘 좋다. 타고 다니는 코스 기준으로 등판각이 가장 중요했기 때문에 만족만족.

    배터리 - 리튬이온 : 흫….. 싸구려 중국제를 쓰는걸로 알고있다. 타다보면 타사 배터리(LG, 삼성)보다 성능 저하가 굉장히 빠르다고.. 교체하려면 30만원인가? 걍 버리고 다른거 사든지 스쿠터로 가든지 차던대로 차나 타든지 해야지.

    배터리 용량 - 13A : 실제로 아쉬운 부분이다. 최대 40km 정도는 달릴 수 있긴 한데, 50km 정도였으면 좋겠다. 아아.. 인간의 욕심은 끝이 없고..

    휠 사이즈 - 10인치 : 음 확실히 8인치 제품보다는 낫다! 스쿠터 정도의 안정감을 주진 않지만, 크게 출렁이는 도로상태를 빼고는 서울에서 타기에는 매우 훌륭하다. 단, 튜브리스 타이어라 펑크 가능성은 좀 높다..

    무게 - 23kg : 아! 집이 4층인데 팔 빠지는 줄 알았다! 집 1층에 차가 있어서 뒷트렁크에 넣을 생각으로 샀는데, 생각보다 집에서 충전할 일이 가끔 생길 것 같아 불안하다..ㅠㅠ 진짜진짜 무겁다. 안장까지 합치면 25kg다. 진짜 무겁다. 다시 생각해보자.

    접이식 : 이라고는 하지만 원터치가 아니어서 익숙해져도 최소 1분 정도는 걸릴 것 같다. 원터치 전동킥보드들이 부러워진다..

    그 외에 쓰로틀 위치가 너무 상단에 위치해서 계속 땡기고 있으면 손가락과 손목이 아프다! 이건 어떻게 수정해야하나…ㅜ0ㅜ 그리고 안장도 좀 낮다.

https://youtu.be/1irvQi-KZ4s

사진과 유튜브를 보면 알겠지만 등판각은 오져버린다! 저것보다 속도 더 낼 수 있다. 진짜다.

  1. 근데 좀 빡치는건.. 뒷바퀴쪽에서 계속 끼긱~ 끼긱~ 소리가 난다. 아마 결합을 너무 세게 했거나 너무 약하게 한 것 같은데, 어느 부위인지 모르니.. 구글갓의 힘을 빌려서 반드시 해결해야겠다. 끌어도, 천천히 가도, 빨리 가도 계속 귓구멍을 세게 때린다. -_-
  1. 오늘의 코스는 다음과 같다.

  • 출발 코스 : 약 9km. 길동역 - 천호역 - 광나루역 - 건대입구역 - 성수역

  • 복귀 코스 : 길 살짝 잘못 들어서 약 20km정도.. 성수역 - 압구정로데오 - 한남 - 동작 - 이수역

이제 이거 타고 중대 언덕 함 넘어봐야 쓰겄다! 헬멧에 달 고프로 하나 장만해야 하나..? ㅎㅎㅎ

중앙대학원 컴퓨터공학과 합격!

작성일 2018-06-19 | Edited on 2018-06-29 | In 컴공대학원 |

중앙대학원 컴퓨터공학과 합격! (Feat. 나노휠 Air 1000W 전동킥보드)


  1. 사실 기대한 건 아니었다! 특히나 문과 학부생+30살이라는 조건때문에 공대쪽 일반대학원에 진학할 수 있을거라는 생각을 하지 않았다. 그래서 연세 정보전문대학원도 지원을 했던거고.. 하지만 오히려 그 곳은 떨어지고 중대 컴퓨터공학과에 붙었다. 지원자수는 내가 마지막이었으니 총 22명, 아마 떨어진 사람이 없지 않을까..? 라는 생각을 한다. 어쨌든간에 일반대학원으로 진학하게 된 것은 좋은 일이다.
  1. 한가지 더 좋은 이유는 중대는 집에서 가깝다는 것이다. 단연코 이게 학교 선택의 이유로 작용해서는 안되겠지만, 기왕 된거 가까운게 좋은 것 아니겠는가? 그러나 석사생은 주차장 이용이 불가능하다. 이 문제를 타개하기 위해 두가지 선택지를 고르게 되었다.
  • 대중교통을 이용한다 : 최소 2번의 버스 환승과 마의 중대 언덕을 버스 타고 다니려니 혼절각. 시간도 더 오래 걸린다.

  • 또 다른 탈 것을 산다 : 스쿠터를 우선 봤으나 어차피 아침 저녁 헬 시간에는 막힐 것 같았다. 그렇다면 다른 수단은 없을까?

    그리하여 찾아낸 것이 바로 전동킥보드다. 특히나 남성역 - 숭실대 - 중대 언덕을 넘기 위해서는 등판각이 좋은 녀석을 찾아야 했기 때문에-물론, 현충원으로 다니는 방법도 있지만- 3시간 정도 서치한 결과, 마감과 A/S, 배터리 수명은 헬이지만 중고값이 낮고 타다가 걍 버려도 될 정도의 모델을 찾았다.

나노휠 나노퀵 NQ-AIR 1000W+ 13Ah

알고보니 다나와 전동킥보드 판매 랭킹 1위더라.. -_- 왜 네이버 카페부터 가입해서 열심히 찾았나 몰라. 암튼 거기서는 대차게 까고 있는 모델인데 실사용 유저들이 갑툭튀해서 저는 잘 타고 있어요~ 하는 댓글을 믿기로 했다. 믿는 자에게 복이 온다니 안라하겠지 뭐.(추가 : 1000W+가 아니라 1000W이었슴다. 눈물..)

코스는 대강 아래와 같다.

이 숭실대 - 중앙대 뒤편 달마사 부근 언덕.. 무섭긴 한데 그래도 잘 탈 수 있겠지?

  1. 중대 대학원 합격 후 컨택을 하느라 아주 심신이 지쳤었다. 보통 공대의 테크트리는 선 컨택 - 후 합격 구조인데, 난 자대도 아닌데다가 문과 출신이라 전혀 기대도 하지 않았기 때문이다. 덕분에 이 페이지만 하루에 2~3시간 씩 뒤져봤던 것 같다. 메일을 3개 쯤 보냈고, 다행히 한 교수님께서 면담을 해보자고 답장이 오셔서 이것 저것 준비해 갔는데, 준비 하는 것 보다는 열심히 할 수 있는 자세를 계속해서 보여드리는 것이 중요한 것 같다. 연구 분야가 다르고, 연구실에 자리가 없어서 못들어갈 뻔 했다.. 다행히 연구실 구경과 연구실 가족들까지 소개 받고, 교수님께 감사의 인사를 드리고 패스트 캠퍼스 18주 과정이 끝나는 8월 중순~말 쯤 연구실에 들어가기로 했다. 물론, 그 전에 가끔 가서 눈도장을 찍어야겠지. 많이 발전한 상태로 들어가 나도 도움이 될 수 있는 사람이 되고싶다.
123

twosb

I'm cutty sexy pretty elegant guy...

15 포스트
13 카테고리
62 태그
© 2018 twosb