# Android 앱 Decompiling & Repackaging


Compiling이 된다는 것은 Decompiling(역공학/Reverse Engineering)이 존재한다고 봐야하며

decompiled 결과물의 완성도에 따라 흔히들 된다 안된다고 언급되는 것 같다.


0. 준비물

  1. apktool: https://ibotpeaches.github.io/Apktool/
    • APK를 decompiling/repackaging 할 도구이다.
    • dex -> smali코드 로 decompiled 되는데 변수명이 기계어 수준이고 가독성이 떨어진다.
      하지만 부분부분씩은 읽고 수정할 수 있다.

  2. dex2jar + jd-gui 혹은 jadx
    • APK를 decompiling하여 Java코드 수준으로 해석해주며 읽는 용도로 사용할 것이다.

  3. zipalign
    • 메모리 사용량 개선을 위해 4바이트 정렬을 시켜주어야 한다.

  4. apksigner
    • repackaged APK는 signing이 풀려있기 때문에 다시 해야한다.
    • zipalign 이후에 한다.
    • jarsigner를 사용해도 되지만 그 경우 zipalign보다 먼저 해야한다.



1. Decompiling

  1. $ apktool d [APK명]
    • 폴더내에 apk가 풀리고 dex대신 smali 폴더가 생긴다.

  2. smali 폴더에 있는 smali 코드 파일들을 찾아 수정한다.
    • 이때 smali 코드의 해석을 쉽게하기 위해 dex2jar + jd-gui 혹은 jadx를 참조한다.


2. Repackaging

  1. $ apktool b [APK명]
    • 폴더내에 있던 구성요소와 smali 파일들이 APK로 만들어진다.

  2. $ zipalign -v 4 [source APK명] [destination APK명]
    • 메모리 사용량 개선을 위해 4바이트 정렬을 시켜주어야 한다.

  3. $ apksigner sign --ks [key명].keystore [APK명]
    • repackaged APK는 signing이 풀려있기 때문에 다시 해야한다.





Reference

- https://developer.android.com/studio/command-line/zipalign

https://ibotpeaches.github.io/Apktool/





# [Android Auto] VS Apple CarPlay 기능 알아보기


1. Android Auto는 무엇?

  • Android Phone이 자동차의 dashboard에 연결되어(USB) 아래와 같은 화면이 나오면서 동작하는것.

출처: https://www.android.com/auto/


  • 비교대상으로 Apple 진영에서의 CarPlay를 예로 들 수 있다.

출처: https://www.apple.com/kr/ios/carplay/




2. 차량의 기능지원여부

  • Android Auto: 외국 2015년 8월 부터 출시.1) 국내 2018년 7월에 정밀지도 문제로 카카오내비를 허용하여 출시.2) 기본은 Google Map
  • Apple CarPlay: 국내외 2014년 3월 부터 출시.3)

따라서 그 이후에 출시한 차는 대부분 이러한 기능이 고려되어 있는 상태. 차량 제조사의 업데이트에 의해 지원 가능하기도 하다.

그런데 왜 CarPlay는 그동안 지도문제가 없었을까?

기사상으로는 지도 해외반출 이슈, 주요 기밀시설 가리기 이슈 등 Google의 정책요인에 기인한 것으로 확인되고 있음.4)



3. Phone의 기능지원여부



4. 차량 Dashboard와 연결
  • Android Auto: 연결 전 Android Auto App. 설치해야 함. USB연결 필요.
    • Dashboard <-> Android device (Android Auto App. <-> Calling, Messaging, Navigating and etc)
  • Apple CarPlay: USB만 연결하면 끝.
    • Dashboard  <-> iOS device



5. Android Auto 주요기능

  • Stand-alone: Dashboard에 연결없이 Android Auto App.만으로 실행가능
  • Google Assistant: 음성명령
  • Navigation: 길안내. 한국은 카카오네비 지원(2018.07 기준)
  • 전화
  • 문자 읽어주기, 받아적기, 보내기
  • 음악 검색, 재생
  • 기타 자동차 제조사 앱 기능들


6. Apple CarPlay 주요기능

  • Siri: 음성명령. Setting에서 Siri 활성화 해야함
  • Navigation: Apple 지도
  • 전화
  • 문자 읽어주기, 받아적기, 보내기
  • 음악 검색, 재생
  • 책 읽어주기
  • 기타 자동차 제조사 앱 기능들


7. Android Auto외의 다른 방법들

  • Mirrorlink:
    • CCC5) 에서 만든 Car-Smart-phone 표준규격
      • IVI(In Vehicle Infortainment) 에 화면을 복제하는 방식
      • 차량의 정보를 받아 올 수도 있다.
    • Android만 지원함
      • Dashboard <-> Android device (Android MirrorLink 지원 App. <-> 연계하는 앱)


Reference:

1) 관련기사: https://android-developers.googleblog.com/2015/08/announcing-android-auto-desktop-head.html

2) 관련기사: http://www.yonhapnews.co.kr/bulletin/2018/07/10/0200000000AKR20180710115900017.HTML

3) 관련기사: https://www.apple.com/kr/newsroom/2014/03/03Apple-Rolls-Out-CarPlay-Giving-Drivers-a-Smarter-Safer-More-Fun-Way-to-Use-iPhone-in-the-Car/

4) 련기사: http://news.mt.co.kr/mtview.php?no=2016092818070804379

5) Car Connectivity Consortium: https://mirrorlink.com/about%20ccc

   - https://www.carwow.co.uk/guides/buying/what-is-mirrorlink

# 5분만에 보는 Swift 인트로

Udacity의 강좌 Intro to iOS App Development with Swift 내용중 Swift에 대한 내용을 정리함



# 목차

1. 변수

2. 조건문

3. 클래스

4. 함수



1. 변수

// Variables

let y = 100             // 상수


var x1:Int = 42         // Int 변수

var x2 = 42             // Int 생략할 있다.


var myString = "Hello"  // string 객체 변수



2. 조건문

// Control Flow

if x < 50 {

    print("x is", x, "and less then 50")

} else {

    print("x is", x, "and greater then or equal to 50")

}



3. 클래스

// Classes

class ViewController : UIViewController {   // class [클래스명] : [상속받을 클래스명]

    // Instance Variables go here

    // Class functions go here

}



4. 함수

// Functions

func printMessage(message : String) {       // func [함수명]([인자명]: [인자타입]) { // 구현부 }

    print(message)

}

printMessage(message: "Oi!")                // 함수명([인자명]: [인자값])



더 많은 Swift 관련 강의가 필요하면

Learn Swift Programming Syntax

를 참조해주세요. (물론 다른강의도 많습니다.)



================================

Reference

- https://www.udacity.com/course/intro-to-ios-app-development-with-swift--ud585


# Wrap-up "Kotlin for Android Developers" at Udacity

Personally, I want to wrap-up the course to make a summary

- Link: https://www.udacity.com/course/kotlin-for-android-developers--ud888


I learned Kotlin for Android quickly with example.

I don't think this course shows all of Kotlin.

But it's effective to learn some important points and functions in Android Studio.



1. Import Kotlin plugin in the project

    - Menu > "Tools" > "Kotlin" > "Configure Kotlin in project" > "Android with Gradle"

       This function modifies gradle files to add Kotlin plugin.

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/9484b0a9e04b95242544b2a83ca656ab64476114



2. Convert Java file to Kotlin file

    - Menu > "Code" > "Convert Java File to Kotlin File"

       This function converts a Java file to a Kotlin file.

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/f61f09a603b02dcd15bd51deb78fef699fc5181a

      This case is lucky. Normally, there are some errors about

        + Nullable check

        + Lambda conversions

        + other non-standard Java features



3. Use SAM Conversions

    - SAM: Single Abstract Method

    - Methods like "View.OnClickListener.OnClick()" can be applied.

      ex) fab.setOnClickListener { startActivity(CreateActivity.get(this@MainActivity)) }

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/ad3637101c5f8458187563e43fb548a39e819f96



4. Access views directly without "findViewById()"

    - Add "kotlin-android-extensions" plugin to support this

    - Import "kotlinx.android.synthetic.~~"

        ex) import kotlinx.android.synthetic.main.activity_main.*

              You can have direct accesses the views in "R.layout.activity_main".

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/ad3637101c5f8458187563e43fb548a39e819f96



5. Convert Java's "switch" to Kotlin's "when"

    - "when" looks like "switch" without typing "case" keyword

       and supports

        + string comparison

        + "is" keyword

        + return value

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/ad3637101c5f8458187563e43fb548a39e819f96



6. Insert a method/variable in the class

    - "kotlin-android-extensions" can make extension codes simple.

       In compile time, static method/variable is inserted for this.

        ex) val Context.layoutInflater get() = LayoutInflater.from(this)

             ==> So, we can use this like this.

            val view = context.layoutInflater.inflate(R.layout.item_note, parent, false)

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/fb586664b645c847e79678b81dc4741fa2e5e2c3



7. Use "data class" instead of just "class"

    - to support automatically

        + Identity: equal()

        + Copy: copy()

        + Hash

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/47aeae37c7488b7577bc7a5713a83753ed31f534



8. Add Anko library

    - Anko library contains a lot of helpers for Android SDK.

      In this trial, we will use "doAsync()" instead of "AsyncTask"

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/ec2d1fc3a3faa520f3d3b2c71b063bfb03af5a61



9. Use "doAsync(): instead of "AsyncTask"

    - handles thread pooling and execution

        ex) doAsync { runnable.run() }

   - Result: https://github.com/ndukwon/kotlin-notepad/commit/e28010bf0514844d5455daccbd0febcf7031f5ba



10. Apply "lateinit" keyword

    - to initialize it by the time to be used

        ex) lateinit var notes: NoteDatabase

    - should not be nullable: cleaner and safer

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/e28010bf0514844d5455daccbd0febcf7031f5ba



11. Add "@JvmStatic"

    - to help Java file understand getter/setter will be generated automatically

    - more: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-static/index.html

    - Result: https://github.com/ndukwon/kotlin-notepad/commit/e28010bf0514844d5455daccbd0febcf7031f5ba



To be updated....




Reference:

https://www.udacity.com/course/kotlin-for-android-developers--ud888

- https://thdev.tech/kotlin/2016/08/02/Basic-Kotlin-01.html

# Resume(이력서) 작성 팁

KOOC 강의 - [2018_01] 유학과 취업을 위한 문서 작성법 을 듣고 정리한 내용입니다.

올바르지 않는 부분이 있다면 적극적으로 수정하겠습니다.



# Resume(이력서)의 큰 틀

- Contact information

- Career objective

- Professional experience

- Education

- Additional information


큰 틀의 하나씩 알아보도록 합니다.


1. Contact information

- 이름, 주소, 전화번호, 이메일, 링크드인 계정, 홈페이지 주소 등의 세부항목

A. 이름: 이름, 성 순서, full name으로. Resume에서 가장 크게(18~22pt)


B. 주소: 우편을 받을 수 있는 주소, 현재 거주지

    영어 주소는 우리나라와 반대 순서임: 건물번호, 번지수, 광역구, 광역시 국가명

    ex) 대전광역시 유성구 대학로 291 한국과학기술원(KAIST) 우편번호 34141

    KAIST, 291 Daehak-ro, Yuseong-gu, Daejeon 34141, Republic of Korea (컴마의 위치도 맞춰야 함)


C. 전화번호: 국가번호를 포함한 번호

    ex) +82-10-1234-5678


D. 이메일: 잘 확인할 수 있는 이메일. 이름 유추 가능한 이메일 주소가 좋다. 부적절한 아이디 안됨


E. 링크드인 계정: 잘 꾸며저 있다면 써도 된다.


F. 개인주소: 프로페셔널한 개인 웹페이지가 있다면 작성



2. Career objective

- 취업 목적의 경우 필수

- 왜 이력서를 쓰고, 어떤 포지션을 지원하는지 모호하지 않게

- 직책을 알고 있다면: A[직책] position in/at [부서명/회사분야]

- 의미심장한 단어와 표현의 사용

- 업무 중심으로 기재시: 주어 제외하고 동사 현재형

ex)

OBJECTIVE:

To apply the knowledge aquired through a bachelor's degree in Marketing and Communications and two summer internships at a public relation agency(경험)

to an entry-level position on the marketing or PR team of a major financial institution.(원하는 포지션 언급)



3. Professional experience

- 업무기간, 회사명, 직책, 소재지, 업무내용, 업무성과 등

- 현재에서 과거의 순서로

- full-time/part-time, 유급/무급 기재

- 경력요약(Career Summary) 쓰기도 함

- 특정양식 제공시 거기에 맞춤

- 지원 분야에 맞는 경력

- 신입은 아르바이트, 인턴 등


A. 회사:

- 회사명, 위치, 직책, 기간 등

- 회사명, 직책: 대문자 굵은글씨로 강조

- 직책은 회사이름과 다른 서체로 작성

- 회사 위치: 도시와 국가 작성

- 근무한 기간: 연도, 월만 표기

- 직함 보다는 업무 성과를 표시


B. 업적:

- 주요실적 및 성과: 실적이 능력과 직결되는 영업관련 업종들, 실적/성과를 제일 강조해야 함

- 프로젝트명 기재

- 글머리 기호(bullet point)를 사용하여 상세업무 내용 입력

- 성과를 수치화하여 숫자로 표현할 수 있는지 점검

- 회사에 어떻게 기여 했는가가 초점

- PAR(Problem Action Result) 에 맞추어 작성

P: 이런 문제가 있었고 - 생략가능, 유추 가능하기 때문

A: 어떤 일을 했고 - 사실을 나열, 주어 없이 바로 동사를 사용

R: 어떤 결과를 얻었다. - 가장 중요, 회사에 미친 긍정적인 영향, 측정 가능한 숫자로 결과를 제시


ex) (주어 생략이고 과거형 표현임)

KAIST Company 2015-Present

Chinese Technical Business Management(Intern)

> Translated these and catalogs with Physics professor of Harvard University.

  Contributed to persuading Korea Science and Engineering Foundation to increase research fund.

> Helped communication between company employees and Chinese clients through interpretation.

  Contributed to US$100,000,000 of sale and increased business productivity by 5%.


ex)

-----------------

 WORK EXPERIENCE

-----------------

First bank of Korea, Seoul, Korea 04/2011 ~ 05/2013

- Service Representative (part-time)

- Consulted VIP customers for investment plans

- Processed account transactions for VIP customers

- Translated English documents into Korean



4. Education

- 대학명, 학과명, 학교주소, 학위명 전공 등

- 재학중이거나 최근 졸업한 경우 일한 경력보다 학력을 먼저 기재

- 현재에서 과거의 순서로

- 대학 졸업자는 대학부터. 고등하교는 굳이 안써도 됨. 신입 지원자에 한해 외국/특목고등학교

- 학교이름은 굵게 약어 대신 Fullname으로, 옆에 재학기간을 명시

- 성적 좋지 않으면 쓰지말길... (3.5/5.0 이상만)


# 학위

1) 준학사(정규적인 학사 프로그램이 아닌 경우)

- 준문학사: A.A. degree (Associate Degree of Arts, 마침표 중요) 

- 준이학사: A.S. degree (Associate Defree of Science, 마침표 중요)


2) 학사(일반대학교, 4년제)

- 문학사: B.A. degree (Bachelor of Arts)

- 이학사: B.S. degree (Bachelor of Science)

- 법학사: B.L. degree (Bachelor of Lows)

- 미술학사: B.F.L degree (Bachelor of Fine Arts)


3) 석사

- 문학석사: M.A. degree (Master of Arts)

- 이학석사: M.S. degree (Master of Science)

- 경영학석사: M.B.A degree (Master of Business Administration)

- 미술석사: M.F.A degree (Master of Fine Arts)


4) 박사

- 철학박사, 이학박사: Ph.D. degree (Doctor of philosophy)

- 법률/법학박사: J.S.D. or J.D. (Doctor of Judicial Science)

- 의학박사: M.D. (Doctor of Medicine)


5) 기타(본인의 계획이나 목적에 부합하는 경우 선택적)

- (자격, 학위) 증서, 졸업증서: Diploma

- 수료증, 자격증, 면허증: Certificate

- 준학사와 동등한 학위: AA-equivalent diploma

- 성적: 성적이 자랑할 만 하다면, 만점 기준도 표시

- 논문 제목: 석사, 박사 등

- 수상 경력

- 장학금

- 이수 과목: 희망하는 업무와 관계가 깊은 것을 모아 구체적으로 작성


ex)

Hanguk University, Seoul, Korea Sep. 11 - Jul. 15

. Bachelor of Arts in Business

  - 2nd class honors(GPA: 3.8/4.0) (과에서 2등 했다.)

  - core courses included-Leadership, Human Resources Management, Marketing Management, Asian Market studies

. Received Hanguk Scholarship (2011, 2013 and 2014) (장학금 받았다.)


ex)

St. Louis university, 2016

St. Louis, MO

Bachelor of Science, Finance



5. Additional information

- 관심을 가질만한 내용으로 자신의 특장점이 부각될 수 있도록


A. Language Skill:

- 다국어 언어 능력(필수)

  Fluant in English: 영어에 강하다.

  Proficient in English: 영어에 능통하다.


B. Computer Skill:

- 특별히 잘하는 소프트웨어가 있다면(엑셀로 매출 수익분석) 프로그램 이름을 명시


C. 취미:

- 혼자서 하는것 보다 리더쉽, 팀워크를 보여줄 수 있는 것이 좋음


D. 기타:

- 자격증, 특허, 출판물, 수상내역, 수업활동, 외국경험 등


# 소재목 쓰기

- 작성하는 내용을 포괄하는 간결한 제목을 대문자로 작성

ex) RELEVANT COURSEWORK & SKILLS, CAMPUS INVOLVEMENT (전공관련 이수한 수업 & 동아리 활동)

- 해당 활동을 한 기간도 병기


# 각 주제를 시간 순으로 작성

- 소분류의 주제들을 현재 -> 과거 순으로

- 프로젝트: 프로젝트명, 내용, 역할, 지원하는 업무와 연관성

- 대외활동: 단체명, 역할, 위치, 활동내용, 기간

- 수업활동: 과목명, 배운 내용, 기술 적용 내용 등, (박사, 포닥을 지원할때 많이 씀)


ex1)

Additional Information

> Fluent in Chinese(lived in China for 10 years) and English(attended international school for 6 years. TOEFL iBT 115/120)

> Proficient in Microsoft Office products.

  Expert in Excel in Visual Basic programming and data analysis skills.

> Received the best presentation award from the university business plan competition.

> Enjoy baseball, swimming and basketball.


ex2)

RELAVENT COURSEWORK & SKILLS

Statistics, Introductory Econometrics: STATA

- Relied on STATA to analyze population dynamics of lower-class neighborhoods

Mathmatics, Differential Equations & Linear Algebra: MATLAB

- Used MATLAB to manipilate eigenvalues of quasitriangular matrices and convert complex diagonal from to real block diagonal from

Computer Science, Introduction to programming: Python

- Used the Twitter API to write a basic parts of a Twitter client


ex3)

CAMPUS INVOLVEMENT

Selected Participant December 2012, 2013

University of Wisconsin-Madison

3-Day Start-Up Competition

- Worked on a team to create business plan and analytical mock-ups.

  Team mentorship to computer science PhDs and MBA students


Active Member September 2012 - May 2014

University of Wisconsin-Madison

Economics Student Association

- Participated in forums and discussions presented by key econimic thinksers and companies associated with the university


Class President 1 Scholar September 2010 - May 2014

University of Wisconsin-Madison

3-Day Start-Up Competition

- Selected into Towers-Napp scholar program - awarded to academically outstanding and underrepresented students of all majors



# Resume 쓰는 목적

- 취업 혹은 학업, 연구 등을 위해

- 자신의 인적사항, 학력사항, 경력사항 및 외국어, 컴퓨터 능력 등 기타 활용능력 보여주기 위해

- 문서로 작성(한번 내면 바꿀 수 없다.)

- 면접관에게서 많은 질문이나 관심을 끌어내기 위해서

- 내가 지원하는 곳에서 필요로 하는 것, 관심사를 토대로 경력, 경험 등을 기술



# Resume에서 부각하고 싶은 포인트

- 지금까지 자신의 경력 가운데 핵심사항은 무엇인가?

- 내가 하고 싶은 일, 할 수 있는 일은 무엇인가?

- 지금까지 해온 일과 앞으로 할 일의 상관관계와 당위성을 연결하자



# 작성 팁

1. 이력서에 꼭 들어가야 할 사항들을 빠짐없이 작성

2. 내가 가진 장점이 한 눈에 들어오도록 작성

3. 가능하다면 적절한 범위 내에서 이력서에 자신의 개성을 담자

   (특히 디자인 업계나 창의성을 요구하는 업종의 경우 양식에 있어 비교적 자유로움)

4. 이력서 작성 후 수정을 통해 자신만의 이력서를 완성

- 깔끔하고 개성있게, 장단점이 잘 담기도록 개선해 나가야 한다.

5. Job description에 포함된 키워드들을 최대한 많이 포함할 것



# 체크리스트

- 나에게 맞는 이력서 양식을 사용하였는지

- 일관성 있고 통일된 양식 사용

- 지원하고자 하는 직무나 선업에 맞추어 작성할 것(직무와 관련된 역량만 작성)

- 필수적으로 포함되어야 할 내용들이 모두 들어가 있는가?

- 타이핑, 문법 오류가 없는가? 긴 문장에서의 오류 등. 최소 2명에게 리뷰

- 형식이 적절한가?: 깔끔한 구성, 적절한 여백, 본문 10~12pt

- 거짓된 정보가 포함되어 있지는 않은가?

- 예쁘게, 한눈에 들어오게, 시간없는 사람 잘 볼 수 있게

- 추천인, Objective, Summary는 선택사항



# DON'T

- 정렬:

  모든 내용을 가운데 정렬로 하면 읽기 어려움

- 여백:

  너무 많은 여백을 두는것은 좋치않음

  너무 적은 여백도 안좋고 프린트시 짤려 나갈 수 있음

- 폰트:

  이름과 소제목은 내용과 같은 크기로 작성하지 않아야 함

  이름과 소제목은 이텔릭체도 하지 않아야 함

  제목 이외에는 12 포인트 이하로 해야함

  파피루스체, 장식용 글씨체 같은건 사용하지 말자 (에너지를 써서 글을 읽게됨)

  같은 글씨체를 쓰는게 좋다.

   


# 교정

- 사소한 오류가 당락을 결정지을 수 있다.

- 교정을 적어도 2~3번 이상 하는 것이 좋다.

- 쓰면서는 오류를 찾아내기 힘들다.

- 영어로 쓸때 의도한대로 잘 표현하는 것이 어려울 수 있다.

- 훌륭하고 기발한 표현보다는 쉽게 읽히면서 의미 전달이 잘 되는 자연스러운 문장을 사용하기 위해


1) Self-review

- 자신이 작성한 글은 익숙하기 때문에 오류를 찾기 힘들다.

- 소리내어 읽거나, 프린트해서 보거나, 이력서를 거꾸로 읽어나가는 등 평소와 다른 접근을 하는 것이 필요

- 작성해놀고 며칠 후 다시 보는게 도움이 된다. 


2) Peer-review

- 친구나 이력서를 작성하고 있는 주변사람을 활용

- 2명 이상에게 부탁하는 것이 효과적

- 타인은 제 3자이기 때문에 좀 더 다른 관점에서 평가하고 비판할 수 있다.


3) Expert-review

- 이력서/논문/학업계획서 등을 전문적으로 교정하는 전문가에게 교정받는 것

- 자연스러운 영어 표현으로 수정할 수 있다.

- 교정 시간, 교정한 양에 따라 비용이 발생

- 가장 정확하고, 빠르고, 편한 방법



# 이력서 업데이트

- 긴 시간 한 회사에 몸담았던 당신은 자신이 회사에 있어야 하는 존재임을 말해주는 이력서를 위해 해마다 새로운 프로필을 추가할 수 있어야 한다.

  자신의 회사 생명력을 길게 하면서도 인생을 원하는 모습대로 살기 위해서는 인생의 이력서를 매해 새롭게 쓸 수 있어야 한다.

  그 방법 중의 하나가 바로 공부 이력서를 바꾸는 것이다.

  [조연심, 이장우 [퍼스널 브랜드로 승부하라], 21세기북스, 2012]

- 작년과 올해의 이력서가 같다면 당신은 이미 실패한 사람이고, 이제 기업에서 퇴출당하는 사람들의 대부분은 뭘 잘못해서가 아니라, 특별히 잘하는 것이 없어서 그럴 것이다.

  [톰 피터스]

- 월별, 분기별, 년별 업데이트

  상 받았을때

  규모있고 중요한 프로젝트를 완료했을때

  새로운 프로젝트나 사업부, 지점 등에 참여하게 되었을 때

  새로운 간부/임원을 맞아 조직의 체계가 바뀌었을 때

  주소, 전화번호, 이메일 등 개인정보가 변경되었을 때

  교육과정을 추가로 이수 했거나 자격증을 취득했을 때

  전문가 협회에 등록했을 때

  새로운 비영리 봉사활동에 참여했을 때

  성과와 관련된 피드백을 받았을 때



==========================================

Reference

http://kooc.kaist.ac.kr/profile/joinLectures/14841

# [1000] A+B를 출력 solved by Python, C++, C, Java, Kotlin

문제: https://www.acmicpc.net/problem/1000


나는 이 문제가 백준코딩의 시작이었다.

백준코딩을 시작하려면 이걸 젤 먼저 풀어야 할 것 같은데 왜 1000번일까?....

function을 채워넣는 문제만 풀어봤던 나는 백준코딩 사이트의 입출력이 친절하지 않게 느껴진다.

입력은 text를 통으로 던져주고, 그걸 분석해내는 것 부터가 시작이다.

출력은 걍 바닥(콘솔)에다 뿌리는거다.

심지어 로그같은것도 찍을 수 없는데다가 출력화면이 없다.

Judge만 하지 틀린이유나 예제를 공개하지 않는다.

이러한 평가방법은 더 불친절해서 거만하게 까지 느껴진다.


어쨌든 콘솔입력을 쉽게 접하지 않은 사람에게 시작부터가 챌린지다.

콘솔입력을 받아들이는 방법은 조금씩 달라지겠지만

1000번 문제가 자신만의 입력방식을 찾고 익혀볼 수 있는 문제가 아닐까 생각한다.


1. By Python:

input()으로 한줄을 읽고 parsing한 다음 계산한다.

input 말고도 있겠지만 input()이 Python의 표준이라고 하기도 하고

parsing, converting이 상대적으로 쉽기 때문에 걍 풀어버렸다.


 

'''
input example
1 2

'''

line = input()
a, b = line.split(' ')
print(int(a) + int(b))



2. By C++:

scanf, cin도 있고 text에 예제를 저장해서 불러오는 등 다양한 방법이 있는데 C++하면 cin인것 같아서...

하지만, 속도가 느리다는 백준의 비교측정 포스트를 보고 scanf로 추후 바꾸게 된다.



#include <stdio.h>

#include <iostream>


using namespace std;


int main() {

    

    int a, b;

    cin >> a >> b;

    cout << a+b << "\n";

    

    return 0;

}

 

여기서 중요한 건, include와 "main"이라는 함수명 등이 고스란이 포함되어 있어야 한다는 것이다.

이것은 백지에서 시작하는 것이 function을 채워넣는 문제에 비하여

얼마나 불필요한 일들에 신경을 써야 하는지를 보여준다.

반면에 이렇게 함으로서 개인이 즐겨쓰는 라이브러리를 포함할 수도 있고(백준에서 지원 안해주면 컴파일에러나고 왜 그런지도 모르겠지만...)

알고리즘의 자유도는 증가하는 것 같다.



3. By C:

단순하게 scanf를 썼다.

 #include <stdio.h>


int main() {

    

    int a, b;

    scanf("%d %d", &a, &b);

    printf("%d\n", a+b);

    

    return 0;

}



4. By Java:

BufferedReader로 열심히 해봤다가

언어별 기본 포멧을 제공한다는 것을 발견하고는

부끄러워서 지우고 예제와 같은 방법을 사용하기로 했다.


import java.util.Scanner;

public class main {

public static void main_2() {
Scanner sc = new Scanner(System.in);
int a, b;
a = sc.nextInt();
b = sc.nextInt();
System.out.println(a + b);
}
}



5. By Kotlin:

Kotlin은 class를 쓰지 않고도 이렇게 메소드만 달랑 쓸수 있단다.

잘 몰라서 예제와 똑같아 했다.



import java.util.Scanner

fun main(args: Array<String>) {
val sc: Scanner = Scanner(System.`in`)
var a = sc.nextInt()
var b = sc.nextInt()
println(a + b)
}



================================================================

Reference:

- https://www.acmicpc.net/problem/1000

- https://www.acmicpc.net/help/language


"시즌 RL - Deep Reinforcement Learning" Wrap-up

학습을 마치며 전반적 강의내용에 대한 정리를 해본다.

Reinforcement의 뜻은(강화학습이지만) "어떻게 하면 좋은선택을 꾸준히 할 수 있을까?"를 목표로 최적화해 나아가는 과정으로 이해된다.

개인적으로 이 강의가 상당히 어렵고 난해하게 느껴졌는데

아마도 Supervised learning의 상식을 가지고 Reinforcement learning분야를 해결해 나아간다는 것이

어떻게 보면 진짜로 잘 될까? 이게 왜 되는거지? 왜 꼭 이렇게 하는거지? 라는 의문이 생겨서 학습을 방해한 것 같다.



몇가지 인상깊은 특징을 나열해보면

- 강의내용은 사실 많은 내용을 함축하고 있는것으로 보인다.

  왜 그렇게 접근하는가를 찾으려다 보면 다른 이론을 알아야만 풀리는 것들이 많다.

- Q-table 방식:

  다음 Action을 정할때 기대하는 가장 큰값을 찾는 논리에 있어서 최적경로 알고리즘과 유사한 부분이 있다.

  하지만, 최적경로 탐색은 path간의 weight이 이미 계산되어 있으나,

  RL에서는 탐험을 통해 이 최적경로를 찾아내는 과정 또한 포함되어 있다.

  이 때문에 탐험으로 찾아진 Q-table은 절대적인 weight도 아니고 최적이라고 판단하기 어렵다.

- Q-Network 방식:

  Q-table 방식과 비교될 수 없는 확실히 다른 것인데 이 점을 빨리 깨닫지 못해서 시간을 허비했다.

- 학습을 위해 일정구간을 저장하고, 그 자료를 샘플링해서, next Q를 더해 학습하는 방법이 DQN의 핵심으로 판단된다.



# Wrap-up

1. Frozen Lake World(OpenAI GYM)


2. Q-function

    a. Deterministic: Q-table(Q-learning)

    b. Stochastic: Q-Network

        diverges due to:

        - Correlations between samples

        - Non-stationary Target


3. Exploit VS Exploration

    a. E-greedy

    b. Decay E-greedy

    c. Add random noise


4. DQN: Deep Q-Network

    a. solutions

        1) Go Deep

        2) Capture and Replay

            - 일정구간을 저장했다가 저장된 구간을 랜덤으로 골라 학습

            - Correlations between samples 을 해결

        3) Separate networks

            - 학습하는 동안 next Q를 구할때는 학습을 반영하지 않는 별도의 DQN(target)을 사용함

            - Non-stationary Target 을 해결

    b. DQN 2013

    c. DQN 2015




Reference:

- http://hunkim.github.io/ml/

# Activation functions

여러종류의 Activation function이 존재하고 각각의 미분법이 존재하며

아래 4개의 function에 대해서 알아보기로 한다.

1. Sigmoid

2. tanh

3. ReLU

4. Leaky ReLU



1. Sigmoid

1) definition: 

 

2) derivatives:

 



2. tanh

1) definition:

 

2) derivatives:


 


3. ReLU

 

1) definition:

 

2) derivatives:

 

 



4. Leaky ReLU

 

1) definition:

 

2) derivatives:

# 미분(Derivatives)

지수, 로그 등 함수 형태에 따라 공식이 달라진다.

외워도 안쓰면 잊어버려서 여기에 계속 추가해 가면서 정리해 둔다.

모든 공식은 미분 정의에 대입하여 추출된다.

 

 


0. 자연상수(Euler constant) e 의 정의: 

    미분공식을 구할때 자연상수의 정의에 대입하여 e로 치환하는 방식을 많이 쓰기 때문에

    외우고 시작해야 한다.

   

 

 

1. 1, 2, 3...n차 함수 미분   

   

    이건 그냥 상식선...

 

 

2. log함수 미분

   

   

 

 

 

3. 지수함수 미분

 

 

 

4. 분수함수 미분

 

 

 

 

 

 

Reference:

- https://ko.wikipedia.org/wiki/E_(%EC%83%81%EC%88%98)

- http://blog.naver.com/PostView.nhn?blogId=sbssbi69&logNo=90164383593

- http://cronix.tistory.com/1

'Fundamentals > Mathematics' 카테고리의 다른 글

log의 성질 정리  (0) 2017.11.09

# log의 성질 정리

라는 지수함수에서 반대로 를 찾으려는 관점의 함수이다.

이고 싶을때, 는 무엇이 되어야 하는가?

이를 표현하고자 라는 형식이 유래되었다.

따라서 지수의 관점에서 생각해보고 해결해나가야 하는것 같다.



# 0 또는 1 로 단순해지는 것

1) 

   

 

2) 

    



# 로그의 덧셈, 뺄셈

3)

    

   

 

 

4)

   

 

5)

   


# log 밑변환

6)

   




Reference:

- http://j1w2k3.tistory.com/968

- http://blog.naver.com/PostView.nhn?blogId=sbssbi69&logNo=90159024636

- http://mathbang.net/596


'Fundamentals > Mathematics' 카테고리의 다른 글

미분(Derivatives)  (0) 2017.11.10

+ Recent posts