2018년 2월 3일 토요일

[python][hackerrank] Designer PDF Viewer

#!/bin/python3
import string
from functools import reduce

h = {key: int(value) for key, value in zip(string.ascii_lowercase, input().strip().split(' '))}
word = input().strip()

height = reduce(max, map(lambda x: h[x], word))


print(len(word)*height)

참고자료: 딕셔너리로 한꺼번에 가져오기 위한 자료.
https://stackoverflow.com/questions/16060899/alphabet-range-python

[python][hackerrank] The Hurdle Race

이렇게 풀었다.
https://www.hackerrank.com/challenges/the-hurdle-race/problem
#!/bin/python3

n, k = [int(x) for x in input().strip().split(' ')]
height = [int(x) for x in input().strip().split(' ')]


print((lambda x: x if x > 0 else 0)(max(height)-k))
음... 나쁘지 않은듯. 결국 인풋을 받는 내용을 빼고는 한줄로 끝낸 거니까... 근대 이게 효율적인건가?

2018년 1월 26일 금요일

[clojure] 클로저로 mx-record 구하기 (mx-record in clojure)

예전에 MX-RECORD 받아와야 할 때, 자바로 된 것을 클로저로 바꾸면 어떨까 해서 한 번 짜봤던 것이 있다.

시작은 이렇게 하자. nslookup 을 사용할 것이다.
(use '[clojure.java.shell :only [sh]])

(sh "notepad" "a.txt")
(sh "notepad" "/a.txt")
(sh "pwd")
(sh "nslookup")
(sh "nslookup" "-query=mx" "google.com")

뭔가 보이는 것 같다.
(defn find-mx [hostname]
  (letfn [(nslookup [hostname] (sh "nslookup" "-query=mx" hostname))]
    (nslookup hostname)))

(find-mx "google.com")
자세히 보아하니 뭔가 엄청 나오는 거 같다.
좀 더 정리해보자. 보아하니 내가 찾으려는 내용에는 mail이라는 거와 exchanger라는게 붙어 있는 것 같다.
일단 해보자.
(defn find-mx [hostname]
  (letfn [(nslookup [hostname] (sh "nslookup" "-query=mx" hostname))]
    (remove nil? (map #(re-matches #"(.+)mail\sexchanger(.+)" %) 
                       (clojure.string/split (second (second (nslookup hostname))) #"\r\n")))))

(find-mx "google.com")

(["google.com\tMX preference = 10, mail exchanger = aspmx.l.google.com" "google.com\tMX
preference =
10, " " = aspmx.l.google.com"] ["google.com\tMX preference = 30, mail exchanger = alt2.aspmx.l.goog
le.com" "google.com\tMX preference = 30, " " = alt2.aspmx.l.google.com"] ["google.com\tMX
preference
= 20, mail exchanger = alt1.aspmx.l.google.com" "google.com\tMX preference = 20, " " =
alt1.aspmx.l
.google.com"] ["google.com\tMX preference = 50, mail exchanger = alt4.aspmx.l.google.com"
"google.co
m\tMX preference = 50, " " = alt4.aspmx.l.google.com"] ["google.com\tMX preference = 40, mail exchan
ger = alt3.aspmx.l.google.com" "google.com\tMX preference = 40, " " =
alt3.aspmx.l.google.com"])

나온 거 같다. 다른 테스트도 해보자.
user=> (count (find-mx "google.com"))
5
user=> (count (find-mx "google33.com"))
0
user=> (count (find-mx "naver.com"))
3

MX레코드가 있는지 없는지만 확인하고 싶다면
(count (find-mx hostname)) 0)
  true
  false)

(mx-exist? "google.com")
true
(mx-exist? "google3134.com")
false

2018년 1월 25일 목요일

[clojure] 리습-1 너 누구냐

클로저는 리습-1이란다. (그렇단다.)

리습-1

함수나 값 바인딩에 있어서 이름을 같은 방식으로 해석.

리습-2

심벌이 함수 호출 위치에 있는지 인지 위치에 있는지 등의 맥락에 따라 다르게 해석 (다른 곳에서 알아보니 함수이름이 저장되는 곳이랑 변수이름이 저장되는 곳이 다를 수도 있다네... 그러니 같은 변수이름 함수이름이 똑같아도 된다는 말인 것 같다.)

리습-1의 단점은 이름에 의존하기에 어쩌다 그 이름을 겹치게 사용하면 문제가 생길 수 있다는 것이다. (음... 다른 리습을 사용안해봐서 잘 모르겠다)
이런걸 포기하고 바인딩에 대한 단순성을 가지기 위해 리습-1을 사용하는 듯 하다.

어쨋든

클로저는 리습-1의 해석방식을 적용하여 명확한 구현과 심벌을 조회할 때 혼란에 빠지지않고 로직에 집중하라는 말씀이시다. (사실 잘모름...)
클로저의 단순성이 무엇인가
(defn best [f xs]
  (reduce #(if (f % %2) % %2) xs))
(best > [1 2 3 4 5 6])
6
위 best함수는 > 함수를 받아 몸체 안에서 f로 호출한다. (이렇게 함수, 값이 이름바인딩으로 아주 일괄적)
이게 뭐? 라고 생각한하면

리습-2(커먼리습)은 명시적으로 함수를 호출해주는 다른 함수 (funcall 이라고 하네?)의 도움이 필요하다. 마찬가지로 어떤 함수를 넘기려면 다음과 같이 함수 객체임을 표시하는 태그를 사용해야함.

;; 이거 클로저아님 커먼리습 코드임 실행안되니까 따라치지 말길.
(defun best (f xs)
  (reduce #'(lambda (l r)
             (if (funcall f l r) l r))
         xs))

(best #'>' '(1 2 3 4 5 6))
뭐 이상해 보이는건 내가 커먼리습을 몰라서 그런거지 절대 클로저가 좋아서 그런건 아닌듯. 그냥 차이를 알고 있자.


2018년 1월 23일 화요일

[Udacity] Robotics nanodegree term 1 후기

엄청 빡셌다.

유다시티 로보틱스 강의는 전체적으로 수학적 지식을 많이 요한다.
유다시티 강의의 특징은 제대로 가르쳐준다는 것이다. vagrant, docker 필요한 것은 다 써서 환경을 만들어주고
우리는 필요한 것만 배우면 된다. (설치가 안되요... 이런 걱정을 하지말아도 된다. 알아서 vm을 넘겨준다.)

혹여 안되는 것이 있어도, 1:1 채팅으로 많은 것을 해결 할 수 있다. 그것이 수학이던 프로그래밍이던... (대신 영어로)

디테일한 부분은 설명을 안하고 넘어가기도 한다. 관련 내용은 링크를 막 뿌리는데 그거로 공부하라는 것 같다.

그리고 slack을 이용할 수 있는데 난 잘 이용하지 않았다. 왜냐하면 1:1 채팅으로 스크린샷 등 보내주면서 물어보기 때문에 여기서 안되면
슬랙이 무슨 소용인가 싶었다.

프로젝트가 재미있는데 프로젝트를 하는 것보다, 프로젝트를 어떻게 풀었는지 적는 것이 너무 힘들었다.

프로젝트 1 : 저절로 길을 따라 가는 로봇 (https://github.com/ssisksl77/Udacity-RoboND-Rover-Project)
가장 재미 있었다. 파이썬으로 좌표를 따서 맵에 붙이고 좌표를 변경하고 하는 것이 아주 흥미로웠다. 이 프로젝트까지는 무료이기 때문에 한번 들어보는 것도 괜찮겠다.

프로젝트 2 : 로봇팔 (깃허브링크 없음)
꽤나 힘들었다. 푸는 것이야, 구글을 보고 이곳저곳 보고 해서 풀었지만. 완.벽.한. 개념이해가 없었다.
유다시티는 이것을 그냥 놔두지 않는다. 결국 6관절 로봇팔을 손으로 그려서 여기는 sin세타 저기는 코사인 뭐 그런걸 다 적어서 어떻게 저 각도를 구할 수 있었는지 주말내내 그려서 찾아냈다.

프로젝트 3 : 물체 인식 로봇 (깃허브 https://github.com/ssisksl77/RoboND-Perception-Project)
여기부터 머신러닝을 공부하기 시작했다. SVM 이란걸 만들어서 물체들을 인식할 녀석들의 형태 같은 것들을 저장한다. 여기부터 아... 머신러닝이 이런거구나... 라는 느낌을 받았다.
filtering RANSAC Exercise: https://www.youtube.com/watch?v=vt0QpQmOjto
Cluster Visualization : https://www.youtube.com/watch?v=xcQ5ySgGAMM
Object Recognition : https://www.youtube.com/watch?v=bwYcwcsnXbU
Train SVM: https://www.youtube.com/watch?v=GXwLPqTjkZ8 also contained in this repository

프로젝트 4 : 딥러닝 사람인식하는 쿼드로터 (https://github.com/ssisksl77/RoboND-DeepLearning-Project)
애뮬레이터로 드론이 나온다. 특정 인간을 찾아서 그 사람만을 따라가는 것이다. 이 내용은 딥러닝을 지식이 다분이 필요한데... 정말 힘들었다.
딥러닝을 어느정도 이해하고(이제 다 까먹은듯..) 풀 때는 재미있었다.
AWS에 들어가서 GPU연산용 EC2를 켜고 주피터 노트북으로 딥러닝 연산을 이것저것 바꿔보면서 해보면서 느낀 점은... 프로그래밍이 정말 필요없겠네... 이런느낌이었다.
다 풀고나서 끝이 아니다.
이게 뭔지 어떻게 풀었는지 설명하라는 것은 정말 답이 없었다.(한 6번 퇴짜 맞은듯 하다). 해당 깃허브에 가면 어떻게 문제를 풀었는지 볼 수 있는데... 하... 머리를 쥐어짰다. 정말...
하지만 그 사람을 따라다니는 것을 보면 흐믓하기도 했다.
Follow Me: https://www.youtube.com/watch?v=QYENm4WjB8k

하지만 term2는 안듣기로 했다. 왜냐하면 TX2를 구매해서 조립하고 그걸 가지고 뭔갈 하는 건가본데...
일단 TX2가 한국으로는 할인이 안된다. 물어봤더니 그래서 2학기 자체가 할인되니 그건 좋지? (뭐래...)
둘째, python 에서 C++로 변경해서 코딩해야 한다. 커리큘럼이 똑같은데 이 말은 비슷한 내용을 C++로만 바꾸고 실습해보는 수업일 수 있다는 점.
셋째, 쉬고싶어서. 일을하면서 다른 공부를 하는 건 재미있었는데, 이렇게 프로젝트를 3주에 하나씩 끝내지 않으면 돈이 날아간다는 생각하니 엄청힘들었다.
넷째, 이제 다른 것도 공부해야지. 머신러닝도 제대로 좀 알아야 할 거 같고, 파이썬, 클로저, 자바도 좀 더 제대로 만지고 싶다.


일단 Udacity는 가격의 값어치를 하는 곳은 분명하다. 하지만 그 만큼 많은 공부를 해야 한다. 유다시티의 nanodegree의 강의 내용은 꽤나 짧다.
우리가 기대해야 할 것은 프로젝트다. 프로젝트를 진행할 때, 함수를 만드는 방식, 클래스를 이용하는 방식, 등등을 꼬집어 준다.
그리고 정말로 이해를 했는지 끝까지 물고늘어진다.(로보틱스과정만 그런걸지도...)

프로젝트의 실력있는 분이 옆에서 도와주는 것처럼 하기 위해 많은 노력을 한다. 그 점을 높이산다. 좀 아쉬운 점은 한국에 있기 때문에 오프라인 이벤트들을 참여할 수 없었다.
그리고 많이 비싸다. 값어치를 하지만 많이 비싸다는 것을 유념하자. 하지만 머신러닝을 공부할 때 질좋은 교육을 배우고 싶다면 유다시티를 추천한다.

2017년 12월 13일 수요일

서평 [IT 트렌드 스페셜 리포트]를 읽고

IT 트렌드 스페셜 리포트

이 책은7가지의 IT 기술을 개괄적으로 설명을 하고 있다.

어찌보면, 누구나 들어봤을 이야기들이다. 이 책이 아니더라도 어디서든 IT트렌드들은 읽을 수 있을 것이다.
하지만 이 책이 다른 점은 IT트렌드가 무엇인지를 알려주는 것이 아니다.
실제 우리가 들어본 IT기술들이 어떻게 쓰이고 있는지 알려준다. 단순히 이곳에서 쓰이고 저곳에서 쓰인다로 끝나는 것이 아니라.
어떻게 설계되어 있는지 무엇을 확인해야 하는지 그런 실질적인 내용도 담고 있다.

또 눈여겨 보아야 할 점은 현업에 종사하는 사람의 이야기와 그들이 실제로 어떻세 사용하고 있는지 적어노았다.
단순히 근무환경이나 비전을 묻는 것이 아닌, 실제 기술을 묻는다.

이 책은 단순히 넓은 식견을 넓혀주는 것이 아니라.
놓치기 쉬운 부분들. 어쩌면 IT트렌드를 쫓아가야 할 때, 알아야할 세세한 부분을 설명한다.
물론, 책의 내용은 적지만 어디를 보고 나아가야 할지 짚어준다.

하지만 짧은 페이지 수는 좀 아쉬울 수 있다. 좀 더 많은 사례들이 나왔으면 싶었다.
각 장당 한 회사의 사례만으로는 성이 차지 않는다.

그럼에도 읽을 만한 가치가 있다고 생각한다.

2017년 12월 3일 일요일

[clojure][designpattern] 클로저 디자인패턴 - 전략패턴

clojure design pattern 출처::http://clojure.or.kr/docs/clojure-and-gof-design-patterns.html
2. 전략패턴(Strategy Pattern)
요약 : 이름 정렬 , 유료고객은 먼저.

(def users [{:subscription true :name "Y"} {:subscription true :name "Z"} {:subscription false :name "Z"}])

(sort (comparator (fn [u1 u2]
                    (cond
                      (= (:subscription u1) (:subscription u2))
                      (neg? (compare (:name u1) (:name u2)))

                      (:subscription u1)
                      true

                      :else
                      false)))
      users)
위 소스는 comparator를 만들고 하는 것이 아주 비슷하다.
아래 소스를 봐보자.
(sort-by (juxt (complement :subscription) :name) users) ;; forward sort
(sort-by (juxt :subscription :name) #(compare %2 %1) users) ;; reverse sort
워워 하나씩 보자.
(sort-by count ["aaa" "bb" "c"])

("c" "bb" "aaa")
juxt 이녀석은 뭘까? (juxtaposition : 병렬, 병치)
((juxt a b c) x) == [(a x) (b x) (c x)]
(for [user users]
  ((juxt :subscription :name) user))
;; ([true "Y"] [true "Z"] [false "Z"])


(for [user users]
  ((juxt (complement :subscription) :name) user))
;; ([false "Y"] [false "Z"] [true "Z"])

complement (보수 말하는건가) : 함수를 받아서 true/false의 반대값을 내보냄
(def odd?? (complement even?))
(odd?? 3)
true 
이걸 먼저 알아보자
(sort-by (juxt (complement :subscription) :name) users) ;; forward sort
user=> ((complement :subscription ) {:subscription "HI"})
false
user=> ((complement :a ) {:b "HI"})
true

두 줄로 만들어지는 것이 신기하다. juxt는 엄청난 함수 인 것 같다. 나중에 쓸일이 많을 것 같다.

2017년 11월 30일 목요일

[clojure][design pattern] 클로저 - 커맨드패턴

clojure design pattern 출처::http://clojure.or.kr/docs/clojure-and-gof-design-patterns.html#command


커맨드패턴(Command Pattern)

보면 알겠지만 커맨드(명령)을 login/logout명령으로 나눠서 따로 구현했다.
구현할 때 Command 인터페이스를 구현하여 execute(실행해라!)모든 명령을 이 인터페이스가 있는 녀석으로 구현하면
뭐든 간에 execute만 실행하면 될 것이다.

(defn login [id pass] (println "id: " id ", pass: " pass))

(defn logout [id] (println "logout: " id))

(defn execute [command]
  (do
    (println "logging")
    (command)))

;; 익명인터페이스와 동급

(execute #(login "name" "123"))  

(execute #(logout "idid"))

(defn execute [command & args]
  (apply command args))

(execute login "id" "password") 
apply를 사용하는 이유는 [command & args]에서 args는 리스트형태(?)로 반환하기 때문에 이 리스트 괄호를 깨부시고 안에 들어가서 적용(apply)해야 한다.

(defn wrong-execute [command & args]
  (command args))
(wrong-execute login "id" "password")

ArityException Wrong number of args (1) passed to: user/login  clojure.lang.AFn.throwArity (AFn.java:429)
보는바와 같이 login에는 잘못된 숫자의 매개변수가 들어간 것이다.
아마
(login ["id" "password"])
요래 들어갔을 것이다. 이렇게 실행해보자.
user=> (login ["id" "password"])
ArityException Wrong number of args (1) passed to: user/login  clojure.lang.AFn.throwArity (AFn.java:429)
똑같다 이제 apply를 해보자
user=> (apply login ["id" "password"])
id:  id , pass:  password
nil
아까 apply를 이용하면 괄호들을 깨부수고 안으로 들어(?)간다고 했다.
(apply login ["id" "password"]) == (login "id" "password")
요래 들어가는 것!!! (apply를 꼭 써야 한다.)
============================

이게 왜 중요하다는 거지?

일단 커맨트패턴이 뭔지보자. (자바의 눈으로)

execute()하나를 함께 쓰기 위해서 Command라는 인터페이스를 각각 구현하는 것이다.
그러면 login/logout을 하기 위해 login,logout클래스를 만들고 Command라는 인터페이스를 구현할 것이다.

자 그렇다면 로그인을 위한 Command 인터페이스를 클래스로 구현했다. 그리고 이제 이 클래스를 사용할 것이다.
아니!
정확히는 이 클래스에 있는 Command 안에 execute을 사용할 것이다.

이 커맨드들을 어딘가에 뒀다가 가져오려면 리턴도 되야하고 매개변수로 넣어지기도 해야 할것이다.
클래스는 그럴 수 없다.(뭔줄알고!!) 메소드를 넣을 수도 없다. 인터페이스를 넣는 것이다.
execute를 사용하기 위해!!

클로저의 눈으로 보자.
일단 클로저에서는 함수를 그냥 넘기기 때문에 개념이 아예 다르다.
그냥... 뭔 만들고 넣고 하는게 아니라...
함수를 보내고 받은걸 쓰면 된다.

뭐가 더 좋다가 아니라 이 두 개념을 마음대로 노닐 수 있는 내가 되었으면 좋겠다.

2017년 11월 16일 목요일

[clojure] loop: doseq,dotimes, while, loop, recur 정리

출처 : Clojure Loop

doseq

foreach 문과 비슷하다. 각각의 요소(element)를 돈다(iterate). 중요한 것은 lazy sequence를 강제(force) 평가(evaluation)한다.

(doseq [n (range 10)]
  (println n))
0
1
~
9

dotimes

일반 for문과 비슷하다. 숫자만큼 포문을 돈다.

(dotimes [i 10]
  (println i))
0
1
~
9

while

단순 while문과 비슷

(def a (atom 0))
(while (< @a 10)
  (do
    (println @a)
    (swap! a inc)))
0
1
~
9

loop/recur

loop를 이용하여 재귀를 돌 범위를 정한다. recur을 이용하여 loop의 값을 바꾼다.

(loop [i 0]
  (if (< i 10)
    (do (println i) 
        (recur (inc i)))
    i))
0
1
~
9

defn/recur

함수를 재귀

함수 이름을 부르지 않고 recur을 사용하는 이유는 tail recursion때문이다.

(defn increase [i]
  (if (< i 10)
    (do (println i)
        (recur (inc i)))
    i))
(increase 0)
0
1
~
9

[java]이클립스 JDK 패스 설정

-vm
 C:\Program Files\Java\jdk1.8.0_152\bin\javaw.exe
이런식의 내용을 eclipse.ini 에 맨 위에 넣는다.

2017년 8월 27일 일요일

Udacity Robotics Nanodegree Program 첫번째 프로젝트를 하면서 느끼는 점.

Rover Control

유다시티 강의의 첫번째 프로젝트. 로버가 저절로 길을 찾아가기이다.
Robotics 강의가 뭔지 잘 몰랐고, C++가 필요하다 하길래 C++와 나름 친숙해지고 자신감을 가지고 수강을 했다.

낭패였다

Robotics에서는 로봇을 칭할 때, 3가지가 필요하다.
  1. Perception
  2. Decision Making
  3. Action
C++ 같은 것이 중요한 것이 아니라.
  1. 상황을 인지하고
  2. 어떻게 할지 결정하고
  3. 행동을 하는 것
이것을 어떻게 해내야 할지. 고민하고 기법들을 좀 더 공부해 놓는 것이 더 도움이 될 것이었다.
파이썬을 회사에서 사용해보긴 했지만, 데이터 시각화나 수학적 계산은 다른 문제다.
여차여차 유다시티에서 하는 강의들을 따라가고 있지만 과연 얼마나 더 할 수 있을지는 미지수다.
주말마다 이것 때문에 어딜 나가지 못한다...
정말 이번에 느낀 것은... 선형대수가 정말 중요하다는 점!
계속 공부하지 않으면 안되겠다!

게다가 나는 자바로 개발을 하고 있는데도 요즘 자바에 너무 관심을 끈게 아닌가 싶다.
자바에도 따로 관심이 있는 분야가 있는데(JAVA - ASM 라이브러리 이다. 정말 멋진 기술이라고 생각한다.)
언젠가 이것도 좀 더 공부해서 토이프로젝트로 하나 뭔가 만들어봤으면 좋겠다. (ASM하나만을 이용해서!)
너무 주저리 주저리 쓴건가.
아래에 현재 하고 있는 프로젝트의 링크를 담아놓아야겠다.

2017년 8월 17일 목요일

[서평] Node를 사용한다면 어디로 가야 하는지 가르쳐주는 [Node.js 6.x 블루프린트]


나는 Node.js에 대해 잘 알지 못한다. Node.js 자바스크립트만 알면 된다는 장점을 내새워 치고 올라오고 있는 기술 중 하나이다.
Node.js는 커지는 신생 기술인만큼 변화의 물결이 크다.(지금도 초기 만큼 변화가 큰지는 모르겠지만) 그만큼 개발자체와 새로운 변화를 사랑하는 사람들에게는 행복할 것이다.

해도해도 너무하다는 말도 많을 것이다.

내가 Node.js에 대해 잘 알지도 못하면서 이런 말을 하는 이유는 Node관련 세미나를 한 번 견학한 적이 있기 때문인데 그때도 1년에 다르게 새로운 기술이 나오고, 이전 기술이 옛것이 되면서 크게 발전하고 있다는 것이다.

그러므로 기존에 사용하던 모듈이 금방금방 deprecated 되는 현상을 맞볼 것이라고 한다.

예를 들자면,
이 책에서 promise라는 기술을 콜백 지옥에서 벗어나기 위한 기술로 소개한다. 하지만 내가 견학했던 세미나에선 이렇게 말했다.

"Promise도 이젠 옛말이죠. 이런 다른 걸 씁니다."

이 격한 파도의 물결을 온몸으로 받아치고 싶다면, Node.js를 그래도 알아야만 한다면

당신은 이 책을 읽어야 한다.

이 책은 말그대로 청사진이다. Node.js는 너무 많은 변화가 자칫 어디로 가야할지 헷갈리게 할 수 있다. 여기저기서 소위 약파는(?) 기술들이 많기 때문이다.

이 책을 한 번 읽으면 Node.js라는 기술이 어디로 가고 있는지 알 수 있을 것이다.

2017년 8월 8일 화요일

Udacity Robotics Nanodegree Program 수강시작!

인강 하나 듣는데 전공, 경력, 게다가 자소서까지 썼다. 이렇게까지 해서 들을 가치가 있을까. 했지만 쓰는게 어려운 것은 아니므로 보냈다. 

Robotics Nanodegree slack을 바로 열어줬는데, 다들 이미 로봇전공인 사람들이 많아보여서 나는 아무말도 하지 않고 가만히 있었다. (분명 떨어졌으리라 생각했다.)

그리고 2개월이 지나서 유다시티 Robotics Nanodegree를 수강 할 수 있게 되었다.

보기에는 엄청난(?) 경쟁률을 뚫고 내가 되었다는데 사실여부를 알 수 없다.

가격도 엄청나게 비싸다. 게다가 저게 끝이 아니다. (한 번 더 내야 하는...)

Cousera, Udemy, Udacity를 전부 사용해보았지만 항상 느낀 것이 Udacity에는 활기가 넘치는 것이 느껴진다. 가르치는 것을 즐기는 듯한 느낌이 들어서 제대로 돈을 주고 배워보고 싶은 마음이 있었다.

하지만 내 일과가 Udacity가 전부는 아니기 때문에
과연 잘 할 수 있을지 의문이지만, 
나는 열심히 해왔고, 또 더 열심히 할 것이니까
해낼 것이다.