2016년 8월 15일 월요일

PyCon APAC 2016 - '나의 사진은 내가 지난 과거에 한 일을 알고 있다' 구현


PyCon APAC 에서 들었던 나의 사진은 내가 지난 과거에 한 일을 알고 있다 를 시도해 보았습니다. 요약하면 사진에서 위치정보 및 사람의 표정정보를 추출하여 시각화 하는 내용입니다. 데이터 정제 과정에서 쉬고 있습니다..
순서
    1. 사진 선택
    2. 데이터 정제 - 데이터(위치정보, smile 정보)를 뽑아서 2차원 배열(Dataframe)으로 만든 다음
    3. 시각화 - 지도 상에서 보여주고, 누가 많이 웃었는지 판단한다.

1. 사진 선택

2. 데이터 정제 - 데이터(위치정보, smile 정보)를 뽑아서 2차원 배열(Dataframe)으로 만든 다음
    1) 위치 정보 - python image library 사용
    2) 안면 인식 정보 - Google vision api 사용(구글 계정에 api 사용 등록 필요)












3. 시각화 - 지도 상에서 보여주고, 누가 많이 웃었는지 판단한다.
작성 예정


자료1

Python Image Library 로 사진 로드

from PIL import Image
image = Image.open('C:\\ansan\\test\\160814_google_api_credential\\pycon_jeongwooLEE.JPG')

metadata 인 exif(Exchangeable Image File Format) 추출

exif_data = image._getexif()

import PIL.ExifTags
exif = {
    PIL.ExifTags.TAGS[k]: v
    for k, v in image._getexif().items()
    if k in PIL.ExifTags.TAGS
} 
print exif['GPSInfo']
{1: u'N', 2: ((37, 1), (30, 1), (3516, 100)), \
3: u'E', 4: ((127, 1), (3, 1), (2797, 100)), \
5: '\x00', \
6: (12997, 125), \
7: ((3, 1), (21, 1), (1636, 100)), \
12: u'K', \
13: (0, 1), \
16: u'T', \
17: (22049, 91), \
23: u'T', \
24: (22049, 91), \
29: u'2016:08:14', \
31: (1414, 1)\

자료2


안면 인식 필요 함수 선언

from googleapiclient import discovery
import httplib2
from oauth2client.client import GoogleCredentials
DISCOVERY_URL='https://{api}.googleapis.com/$discovery/rest?version={apiVersion}'


def get_vision_service():
    credentials = GoogleCredentials.get_application_default()
    return discovery.build('vision', 'v1', credentials=credentials,
                           discoveryServiceUrl=DISCOVERY_URL)
import base64
def detect_face(face_file, max_results=4):
    """Uses the Vision API to detect faces in the given file.

Args:
face_file: A file-like object containing an image with faces.

Returns:
An array of dicts with information about the faces in the picture.
"""
    image_content = face_file.read()
    batch_request = [{
        'image': {
            'content': base64.b64encode(image_content).decode('UTF-8')
            },
        'features': [{
            'type': 'FACE_DETECTION',
            'maxResults': max_results,
            }]
        }]

    service = get_vision_service()
    request = service.images().annotate(body={
        'requests': batch_request,
        })
    response = request.execute()
   
    print response['responses']

    return response['responses'][0]['faceAnnotations']
from PIL import Image
from PIL import ImageDraw
def highlight_faces(image, faces, output_filename):
    """Draws a polygon around the faces, then saves to output_filename.

Args:
image: a file containing the image with the faces.
faces: a list of faces found in the file. This should be in the format
returned by the Vision API.
output_filename: the name of the image file to be created, where the faces
have polygons drawn around them.
"""
    im = Image.open(image)
    draw = ImageDraw.Draw(im)

    for face in faces:
        box = [(v.get('x', 0.0), v.get('y', 0.0)) for v in face['fdBoundingPoly']['vertices']]
        draw.line(box + [box[0]], width=5, fill='#00ff00')

    del draw
    im.save(output_filename)


변수 선언 및 안면 인식 함수 사용

input_filename = 'C:\\ansan\\test\\160814_google_api_credential\\baby.JPG'
output_filename = 'baby_output.jpg'
max_results = 1
with open(input_filename, 'rb') as image:
    faces = detect_face(image, max_results)
    print('Found %s face%s' % (len(faces), '' if len(faces) == 1 else 's'))

    print('Writing to file %s' % output_filename)
    # Reset the file pointer, so we can read the file again
    image.seek(0)
    highlight_faces(image, faces, output_filename)

[{u'faceAnnotations': [{u'headwearLikelihood': u'VERY_UNLIKELY', u'panAngle': 1.4963547, u'underExposedLikelihood': u'VERY_UNLIKELY', u'landmarkingConfidence': 0.79059792, u'detectionConfidence': 0.94661051, u'joyLikelihood': u'VERY_UNLIKELY', u'landmarks': [{u'position': {u'y': 449.23465, u'x': 503.81613, u'z': 0.0022879611}, u'type': u'LEFT_EYE'}, {u'position': {u'y': 444.72894, u'x': 597.8515, u'z': 2.5756142}, u'type': u'RIGHT_EYE'}, {u'position': {u'y': 427.36865, u'x': 465.58545, u'z': 10.819963}, u'type': u'LEFT_OF_LEFT_EYEBROW'}, {u'position': {u'y': 418.03116, u'x': 527.02679, u'z': -16.505922}, u'type': u'RIGHT_OF_LEFT_EYEBROW'}, {u'position': {u'y': 416.18243, u'x': 574.16132, u'z': -15.198085}, u'type': u'LEFT_OF_RIGHT_EYEBROW'}, {u'position': {u'y': 420.84039, u'x': 634.37378, u'z': 15.168227}, u'type': u'RIGHT_OF_RIGHT_EYEBROW'}, {u'position': {u'y': 441.13019, u'x': 551.59546, u'z': -19.157124}, u'type': u'MIDPOINT_BETWEEN_EYES'}, {u'position': {u'y': 494.74512, u'x': 554.02673, u'z': -54.059292}, u'type': u'NOSE_TIP'}, {u'position': {u'y': 537.65369, u'x': 554.56073, u'z': -34.004246}, u'type': u'UPPER_LIP'}, {u'position': {u'y': 570.61206, u'x': 556.36188, u'z': -29.879833}, u'type': u'LOWER_LIP'}, {u'position': {u'y': 554.16223, u'x': 525.21643, u'z': -12.002233}, u'type': u'MOUTH_LEFT'}, {u'position': {u'y': 550.5498, u'x': 583.75055, u'z': -10.347378}, u'type': u'MOUTH_RIGHT'}, {u'position': {u'y': 552.26843, u'x': 555.49371, u'z': -27.938482}, u'type': u'MOUTH_CENTER'}, {u'position': {u'y': 505.1066, u'x': 580.81744, u'z': -15.702008}, u'type': u'NOSE_BOTTOM_RIGHT'}, {u'position': {u'y': 508.08328, u'x': 529.22644, u'z': -17.579397}, u'type': u'NOSE_BOTTOM_LEFT'}, {u'position': {u'y': 511.78284, u'x': 554.6908, u'z': -32.374538}, u'type': u'NOSE_BOTTOM_CENTER'}, {u'position': {u'y': 440.61633, u'x': 500.44702, u'z': -5.8014951}, u'type': u'LEFT_EYE_TOP_BOUNDARY'}, {u'position': {u'y': 450.32327, u'x': 519.41406, u'z': 1.0637592}, u'type': u'LEFT_EYE_RIGHT_CORNER'}, {u'position': {u'y': 456.37872, u'x': 503.15567, u'z': -1.3067288}, u'type': u'LEFT_EYE_BOTTOM_BOUNDARY'}, {u'position': {u'y': 451.12354, u'x': 481.49588, u'z': 8.6241531}, u'type': u'LEFT_EYE_LEFT_CORNER'}, {u'position': {u'y': 448.17688, u'x': 499.11456, u'z': -2.023515}, u'type': u'LEFT_EYE_PUPIL'}, {u'position': {u'y': 436.93719, u'x': 601.48419, u'z': -3.1675515}, u'type': u'RIGHT_EYE_TOP_BOUNDARY'}, {u'position': {u'y': 445.92825, u'x': 620.89386, u'z': 12.357953}, u'type': u'RIGHT_EYE_RIGHT_CORNER'}, {u'position': {u'y': 451.51987, u'x': 599.65509, u'z': 1.3407084}, u'type': u'RIGHT_EYE_BOTTOM_BOUNDARY'}, {u'position': {u'y': 447.55365, u'x': 583.93152, u'z': 2.7170076}, u'type': u'RIGHT_EYE_LEFT_CORNER'}, {u'position': {u'y': 444.38281, u'x': 602.76892, u'z': 0.62409711}, u'type': u'RIGHT_EYE_PUPIL'}, {u'position': {u'y': 410.63309, u'x': 495.11249, u'z': -8.0115509}, u'type': u'LEFT_EYEBROW_UPPER_MIDPOINT'}, {u'position': {u'y': 406.6604, u'x': 604.77936, u'z': -5.1472058}, u'type': u'RIGHT_EYEBROW_UPPER_MIDPOINT'}, {u'position': {u'y': 511.14343, u'x': 435.76889, u'z': 117.74801}, u'type': u'LEFT_EAR_TRAGION'}, {u'position': {u'y': 501.62064, u'x': 664.09039, u'z': 123.30409}, u'type': u'RIGHT_EAR_TRAGION'}, {u'position': {u'y': 418.33411, u'x': 550.64563, u'z': -19.225826}, u'type': u'FOREHEAD_GLABELLA'}, {u'position': {u'y': 617.22266, u'x': 557.89929, u'z': -19.451101}, u'type': u'CHIN_GNATHION'}, {u'position': {u'y': 571.94324, u'x': 449.85013, u'z': 70.965286}, u'type': u'CHIN_LEFT_GONION'}, {u'position': {u'y': 564.47369, u'x': 657.51605, u'z': 76.351753}, u'type': u'CHIN_RIGHT_GONION'}], u'sorrowLikelihood': u'VERY_UNLIKELY', u'surpriseLikelihood': u'VERY_UNLIKELY', u'tiltAngle': 5.3879409, u'angerLikelihood': u'VERY_UNLIKELY', u'boundingPoly': {u'vertices': [{u'y': 281, u'x': 385}, {u'y': 281, u'x': 716}, {u'y': 665, u'x': 716}, {u'y': 665, u'x': 385}]}, u'rollAngle': -2.2223928, u'blurredLikelihood': u'VERY_UNLIKELY', u'fdBoundingPoly': {u'vertices': [{u'y': 367, u'x': 429}, {u'y': 367, u'x': 670}, {u'y': 608, u'x': 670}, {u'y': 608, u'x': 429}]}}]}]
Found 1 face
Writing to file baby_output.jpg

2016년 8월 6일 토요일

베트남 여행 준비

10월달에 베트남 갈 일이 생겨 필요한 정보들을 찾고 정리 했습니다.

개요
    1. 베트남 전체 모습
    2. 여행지
        2.1 북부, 중부, 남부 중 1곳 선택
        2.2 세부 지역 선택
    3. 숙소
    4. 교통
    5. 기념품
    6. 인터넷
    7. 언어
    8. 기타 필요한 것들

1. 베트남 전체 모습
베트남은 중국 아래에 있으며 태국과 붙어 있습니다.

















해변을 걸쳐서 상하로 길게 늘어져 있으며 오른쪽 해변은 남중국해로 지금 중국과 문제가 발생하고 있는 그곳 입니다.


















2. 여행지
    2.1 북부, 중부, 남부 중 1곳 선택

베트남의 유명 여행지는 크게 3곳으로 수렴합니다.
① 북부의 하노이, ② 중부의 다낭/호이안, ③ 남부의 호치민
짧은 여행의 경우 이 중 한곳을 선택한 후 그 주위를 여행하는 것이 안전해 보입니다.

이번 여행에는 호치민을 가기로 했습니다.


참조: 첫 베트남 여행지 어디로 정할까?


    2.2 세부 지역 선택
호치민 주위에는 아래와 같이 방문할 곳들이 많습니다.
하지만 짧은 기간에 안전한 결과를 얻으려면 유명한 정도를 확인해서 우선순위를 정하는 것이 좋을 것 같습니다.

우선순위를 정하는 방법은 주위에 물어보거나, 여행사에 문의 하거나 등등 여러가지 방법이 있겠지만 저는 "구글검색" 으로 정하도록 하겠습니다. 구글 해당 키워드로 몇 개의 페이지가 검색이 알려 주니까 인기도를 점검하기 좋은 방법이더라구요.
호치민은 다른 곳에 비해서 인기도(검색량)가 월등하기 때문에 제외하고 대표적인 여행지들을 비교해 보았습니다.













그 결과 이번 여행은 호치민, 무이네 로 정했습니다.














    2.3 방문 할 곳
전체적인 그림은 잡았지만 구체적인 것은 천천히 보면서 결정해볼 생각입니다.
참조: 호치민 걸어서 42분 관광명소 7곳


3. 숙소
방문하고 싶은 여행지들에 가까운지, 조식은 제공 하는지, 교통의 조건은 좋은지가 숙소를 정할 때 체크할 사항 입니다.
호치민:
무이네: 신카페에서 운영하는 리조트

참조
    베트남 호치민 숙소 추천
    무이네 숙소 어디로 정할까, 무이네 숙소 3곳 추천

4. 교통
    1) 호치민 공항 -> 호치민 숙소 : 국내선청사쪽 152번 버스 3000동, 오토바이 6만동, 택시는 10만동 -> 흥정을 해야만 함
    2) 호치민 숙소 <-> 무이네 : 여행사 버스 (Sinh Tourlist > Kim Tran Tourism)

참조:
    호치민 공항에서 데탐거리 가기
    호치민에서 무이네 가는 방법 총정리!, 베트남 현지 여행사


5. 기념품
베트남에서 사면 좋은 것들을 검색해 보고, 그중 제 마음에 드는 것들을 골라 보았습니다.
대표적이고 안전한 G7 커피도 좋은데 커피는 많이 마시면 안되니 다른 좋은 차들을 사려고 생각 중입니다.
 - G7 커피
 - 다람쥐똥 커피(콘삭 커피)
 - 연꽃잎차
 - 인삼 우롱차
 - 커피 필터와 커피

여행자들이 구매 한 항목들(검색)
베트남 쌀국수
G7커피
연꽃입차
노니차
쪼리
베트남 모자
베트남 전통의상
베트남 마그넷
원피스
실크 스카프
새드 페인팅
세라믹 제품
자수
다람쥐똥커피(콘삭커피)
건망고
베트남핫소스
카페쓰어다
타로 과자
인삼 우롱차
커피 필터와 커피

참조: 베트남 기념품 구입하기, 베트남 쇼핑 리스트 및 기념품, 베트남 가이드 추천 기념품, 베트남서 사온 쇼핑 리스트, 베트남 기념품 쇼핑리스트

6. 인터넷

7. 언어
    여행 때 사용할 간단한 회화들 정리
    이해를 잘 하기 위해서 단어-단어로 나누어 정리( Link )

8. 기타 필요한 것들
    1) 전기 콘센트:  한국(220V, 60Hz) 과 다른(110V, 125V, 220V, 50Hz) 로서 220V 와 50Hz로 사용할 수 있는 제품인지 확인
    2) 여행자 보함
    3) 도난 방지 - 복대, 백팩
    4) 간단한 약품 - 밴드, 소독약, 감기약, 설사약
    5) 복귀하는 티켓
    6) 과도
    7) 면도기

참조:
   여행준비물, 반드시
 

2016년 8월 4일 목요일

사내 실무 영어 - Practical Business


업무에 도움이 되는 영어책을 발견하여 정리
고객(유럽)과 일주일에 3일 회의 진행하는데 본인이 수준있는 영어를 쓰는지 의심이 되어 괜찮은 책을 보며 연습을 할 생각
각 챕터에 소개된 표현 중 내가 바로 쓸 수 있는 문장을 적고 어떤 상황에서 사용할지 정리

목차
    1. 비즈니스 회의
    2. 비즈니스 프레젠테이션
    3. 효율적인 업무 진행
    4. 효과적인 의사 표현
    5. 비즈니스 이메일


1. 비즈니스 회의
Can I add one more item to the agenda?
고객이 회의를 마무리 해야 할지 확인할 때 can I say one more thing? 혹은 can I ask one more thing? 이렇게 이야기 하고 있는데,
Can I add one more item? 하나 더해도 되겠어?

So, what you're saying is ~ ?
지금은 So, You mean that ~ 이렇게 이야기 하는데 너가 지금 이렇게 말하고 있는거지?

list the action items
회의에서 가장 중요한 것은 action item 이기 때문에 let's start with our action tables 등으로 action item을 강조하는 것이 좋을 것 같다.

2. 비즈니스 프레젠테이션
I'm working as SW Engineer.
The title(subject) of my presentation is ~
I would like to show you ~
As you can see from the chart on the screen,
Sorry, but I'm not quite clear on ~

3. 효율적인 업무 진행
I'd like you to ~
Could I ask you a favor.
Could you let me know the status of ~ ?
It is ~ behind schedule.
It is ~ ahead of schedule
When do you think ~ is done?
It should be finished by ~
It has to be done before ~
Find a root cause
How about ~?
We should ~
We need to ~
We have to ~

4. 효과적인 의사 표현
I understand your position but ~

5. 비즈니스 이메일
I would be grateful if you could ~
moving back
bring forward





2016년 7월 29일 금요일

MCU SW 공부 1 - Clock, Timer, Counter, Prescaler 개념 비교


Micro Controller Unit(이하 MCU) 을 분석하는 과정은 다음과 같다(알고 있는 수준에서)

1. MCU를 선택 한다.
    - 어떤 기능을 수행해야 하는지
    - 거기에 맞는 Spec을 가진 MCU는 무엇이 있는지
    - 사용가능 MCU 중 가장 저렴한 것은 무엇인지

2. 실행 주기 선택 한다.
    - MCU는 혼자 실행 될 수도 있고, 다른 MCU와 연동해서 사용할 수도 있다.
    - 그리고 외부 ECU 와 연동될 수도 있다.
    - 그렇게 때문에 최소 실행주기 및 특정 기능들의 실행 주기를 선택해야 한다.

3. 기능을 구현하여 실행 시킨다.
    - 2번에서 정한 특정 주기마다 실행 될 함수를 구현한다.
    - 특정 주기마다 실행 되는 함수는 Call Back Function, Interrupt Service Routine, Task 등 여러가지로 불릴 수 있다..


아직 1번 어떤 MCU를 선택해야 하는지는 시스템 전체를 볼 수 있는 눈이 없기 때문에 보류하고,
3번 실행되는 기능은 요구사항에 맞추어 세부적으로 구현이 들어가는 것인데 이 세부를 보기 전에 주기적으로 꼭 실행되어야 하는 함수들이 무엇인지 결정되어야 한다.
그것이 2번 실행 주기를 선택하는 것이다.

Clock은 MCU 동작의 기준이 되는 시계이다.
일정한 시간 간격으로 0과 1의 값이 번갈아 나타난다.

그 Clock 의 개수를 세어 주는 것이 Counter 이다.
8bit Counter 는 8개 bit 만큼 셀 수 있다.
2^8 = 256 이므로 8bit Counter 는 0~255 까지 셀 수 있다.
이 Counter의 값과 비교하여 특정 조건이 되면 Interrupt를 실행시킬 수 있는데
이 방법에 따라

오버플로우 인터럽트: 카운터의 값이 오버플로우 되는 겨우 발생
출력비교 인터럽트: 카운터 값이 출력비교 레지스터의 값과 같게 되는 순간에 발생
입력 캡쳐 인터럽트: 입력이 들어올 경우 발생, 그리고 그때의 시간을 저장

등의 방식으로 동작할 수 있다. 각 인터럽트가 걸렸을 때 이미 등록해 놓은 특정 함수가 실행될 수 있는 것이다.

Counter 라는 단어의 의미를 보았지만 비슷한 의미로 Timer 도 쓰인다.
이 둘의 차이는

Timer: MCU 내부 클럭을 세는 장치
Counter: MCU 외부에서 입력되는 클럭을 세는 장치

Timer/Counter라고 같이 사용되는곳이 많은(검색 시 다수가 그렇게 표현) 같은 의미라고 이해해될 될 것이라고 생각.

-- Prescaler 추가 --
개발자는 필요한 시간 단위가 있는데 MCU 의 clock 주파수가 높아 그 시간을 못맞출 수 있다.
8MHz 의 system clock 을 가지고 있다면 timer 의 clock 기본 주기는 0.125us 이 된다.
(1 Second * 1000 * 1000 / 8,000,000Hz = 0.125us)
실제 필요한 동작단위가 1us 라면 8 이라는 prescaler 값이 필요한 것이다.

-- hertz(hz) 추가 --
진동 현상이 있을 때 1초에 몇 번의 왕복 운동이 있는지 나타내는 단위
주기적으로 반복되는 모든 현상에 일반적으로 쓰일 수 있다.

보통 가정집에 들어오는 교류 전원은 220V, 60Hz 인데 교류 전압을 1초 동안 60번 0V를 기준으로 (-110~+110 까지) 오르락 내리락 하며 사인 진동을 반복한다.

컴퓨터 CPU 클럭을 얘기할 때 헤르츠 단위를 쓰는 이유는 무엇일까? CPU가 일정한 속도로 동작하기 위해서는 일정한 간격으로 전기적 펄스를 공급 받아야 하는데 이 전기적 펄스가 초당 CPU에 공급되는 횟수라는 개념에서 Hz라는 단위를 쓴다.

2016년 7월 24일 일요일

(E,K)소프트웨어 개발자로 자신을 홍보할 수 있는 편리한 3가지 방법 - 3 Easy Ways To Market Yourself as a Software Developer

본인에게는 앞으로 소프트웨어 개발자로 어떻게 살아야 할지가 메인 관심사(고민) 입니다.
그러던 중 소프트웨어 개발자로서 33살에 은퇴하고 프리랜서로 일하는 성공적인 커리어를 진행하고 있는 John Sonmez(Soft Skills 저자) 가 소개하는 소프트웨어 개발자로서의 자세는 그 고민에 대한 답을 해 주네요. 사실 이 글을 보고 블로그를 만들었었습니다.

이해를 잘 하기 위해 번역 해 보았습니다.

---

Do you want to get a better job?
더 좋은 직업을 가지고 싶으세요?
Want to make more money?
더 많은 돈을 벌고 싶으신 가요?
Perhaps you just want to get a promotion at your current job or open more opportunities.
당신은 지금 다니고 있는 직장에서 승진을 하거나, 더 많은 기회들을 가지고 싶을 것 입니다.
Good, you are not alone.  Who doesn’t want to make more money and be more successful or have better opportunities?
좋아요, 당신은 혼자가 아닙니다. 누가 돈을 안벌고 싶고, 성공하거나 많은 기회를 얻고싶지 않을까요?
The problem is most software developers don’t realize that they always need to be actively marketing themselves.
문제는 많은 소프트웨어 개발자들이 자신들을 적극적으로 홍보해야 한다는 사실을 깨닫지 못하는 데 있습니다.
I’ve written before about how you should be selling yourself and how everything is about selling, but part of selling successfully is marketing.
나는 당신이 어떻게 자신의 몸값을 높여야 하고, 모든 것이 몸값과 관련된 것이다 라는것을 이야기 하기 전에, 
몸값을 높이는 중요한 방법이 홍보(Marketing) 라는것을 이야기 하고 싶습니다.

1. Start a blog

1. 블로그를 시작하라.

I’m going to start with the most obvious thing and it really shouldn’t take you much convincing, since you are reading my blog right now.
먼저 명확하기 때문에 당신을 설득할 필요가 없는 방법을 이야기 하려고 합니다. 왜냐하면 당신이 이미 이 블로그를 읽고 있기 때문입니다.

The easiest way to showcase your abilities and knowledge in the software development field is to create a blog.
소프트웨어 개발자인 당신이 능력과 지식을 보여줄 수 있는 가장 쉬운 방법은 블로그를 만드는 것입니다.
A blog allows you to show the depth of your knowledge much better than you could  possibly do in a resume or in a short job interview.
블로그는 당신이 가지고 있는 지식의 깊이를 이력서나 짧은 인터뷰보다 훨씬 더 정확하게 보여줄 수 있습니다.
Hiring software developers is a gamble because anyone can make up some experience or pretend to know how to program.  A candidate for a software development job can even memorize common interview questions or be exceptionally good at interviewing, but it is pretty hard to fake a blog.
소프트웨어 개발자는 고용하는 것은 도박과 비슷합니다. 왜냐하면 누구나 경험을 만들수는 있고, 프로그램을 만들 능력이 있는 것처럼 행동할 수 있기 때문입니다. 소프트웨어 개발 지원자는 일반적인 인터뷰 질문들에 대해서 외워서 올 수 도 있고, 잠깐 동안의 인터뷰때 잘 하는것처럼 꾸밀 수도 있지만, 블로그는 거짓으로 만들기가 어렵습니다.

More importantly though, since this post is about marketing yourself as a software developer, a blog puts your name out there in the search engines for a variety of topics.
더 중요한 것은, 이 포스트에서 소프트웨어 개발자의 자기 홍보에 대한 글을 이야기 하고 있지만, 블로그는 당신의 이름을 다양한 방식으로 노출(검색) 되도록 해 줍니다.

All kinds of opportunities have come my way via my blog.  Almost every major advancement in my career over the last 3-4 years has in some way been a direct result of my blog.
나의 경우에 많은 기회들이 블로그를 통한 것이며, 지난 3~4년간 내 경력에서 거의 모든 큰 경력이 내 블로그로 인한 것입니다.

Do you know of any “famous” software developers that don’t have a blog?
혹시 당신이 아는 “유명한” 소프트웨어 개발자 중에 블로그를 안하는 사람을 알고 있습니까?
Perhaps you do, but there aren’t many.  So it goes to show you, if you want to get your name out there, it is essential to have a blog.
알 수도 있지만, 그리 많지 않을 겁니다. 이 사실은 당신이 괜찮은 소프트웨어 개발자가 되려면 블로그를 만드는 것은 기본이라는 것을 알 수 있습니다.
Starting a blog is pretty easy.  In fact, if you are reading this post, there is a good chance you’ve already started a blog, but perhaps you haven’t seen much success from it.  That is probably due to the hard part about blogging, which is keeping up with it.
블로그를 시작하는 것은 정말 쉽습니다. 사실 당신이 이 포스트를 읽고 있다면, 블로그 시작에 좋은 기회가 된 것입니다. 하지만 성공하긴 쉽지 않은 것도 사실입니다.
Anyone can start a blog, but to be successful at it and to really see its benefits, you have to be consistent.  This doesn’t mean you have to blog 3 times a week, but it does mean that you have to be blogging at some regular interval and you have to keep it up for a long time.
누구나 블로그를 시작할 수는 있습니다, 하지만 성공적이며 그로 인한 이득도 얻으려고 한다면, 꾸준해야 합니다. 이 말은 블로그를 한 주에 3번은 해야 한다는 식의 이야기는 아닙니다, 하지만 정기적으로 해야 하며 오랜 시간을 해야 한다는 이야기 입니다.
An easy way to get started is to use a shared hosting plan, like the one I am currently using at BlueHost, to create a simple WordPress site very quickly for a very cheap price.  If you get bigger, you eventually might need to scale out, but this is a good and fast cheap way to get started.
시작하기 쉬운 방법은 호스트를 공유 받아서, 내가 지금 쓰고 있는 BlueHost 같은, 간단한 WordPress 싸이트를 싸게 빨리 만들면 됩니다. 나중에 호스트를 키워야 할 수도 있지만, 그것은 그 때 하면됩니다.

2. Build a network

2. 네트워크를 구축하라
Selling is easy if you don’t have to sell.
홍보할 필요가 없다면 홍보는 쉬워집니다.
What I mean by this is that it is much easier to “sell” a product into an existing audience than it is to go out and look for people to buy your product.
내가 의미하는 것은 새로운 고객을 찾는것이 아닌, 이미 존재하고 있는 고객에게 파는 것이 훨씬 쉽다는 것입니다.
No one wants to be sold anything, but people like to find solutions for their problems and help people they like.
아무도 사는 것을 좋아하지는 않지만, 사람들은 자신들의 문제점을 찾아 해결하고, 자신들이 좋아하는 사람의 문제를 해결하는 것을 좋아 합니다.
So what does this have to do with marketing yourself?
그러면 이것이 자신을 홍보하는 것과 무슨 상관이 있느냐?
Well, the next time you need a job or you are looking for a new opportunity, or even if you planning on selling a product or starting your own business, don’t you think it would be great if you could just reach out to people who already know and like you rather than cold calling recruiters or sending out impersonal cover letters en masse?
만약 다음에 새로운 직장이나 기회를 찾거나, 자신의 상품을 가지고 비지니스를 시작한다면, 전혀 모르는 사람보다, 나에게 호감이 있는 사람들과 함께 하는것이 좋지 않겠습니까?
The best jobs I’ve gotten in my career and every good opportunity has been the result of someone from my network either bringing the opportunity to me or helping me get my foot in the door.
내가 지금까지 가졌던 좋은 기회들은 이미 알고있던 사람들로 인한 것이 많았습니다.
I am actually working on a product right now that will help software developers learn to market themselves and when I launch this product I’ll already have a large audience of potential customers from my network.
실제로 나는 지금 소프트웨어 개발자가 자신을 홍보할 수 있도록 해주는 상품을 제작 중이며 많은 잠재 고객들로서 지인들이 기다리고 있습니다.

Building a network isn’t difficult, but it takes time and it does take some effort. Networking is not about finding out what other people can do for you, but finding out what you can do for other people.
네트워크를 만드는 것은 어렵지 않지만, 노력과 시간이 쓰입니다. 네트워킹은 다른사람들이 당신을 위해서 무엇을 할 수 있는지 찾는 것이 아니라, 당신이 다른사람을 위해서 무엇을 할 수 있는지 찾는 것입니다.
The easiest way to build a network is to start helping people and taking an interest in what they are doing.
네트워크를 쌓는 가장 쉬운 방법은 다른사람들을 도우면서 그 사람들이 필요한 것이 무엇인지 알아보는 것입니다.
You should have the mindset of always networking.  Every new person you meet, every person you interact with online is potentially someone who can become part of your network.
당신은 언제나 네트워킹을 위한 마음가짐이 있어야 한다. 새로운 사람을 만나거나, 온라인상에서 피드백을 주고 받을 때 그 사람이 당신의 네트워크에 들어온다고 생각 해야 합니다.
You also have to get out, meet and interact with people, both offline and online.  There are many ways you can do this:
밖으로 나가서, 오프라인 온라인에서 만나고 주고 받아야 합니다. 구체적인 방법을 나열해 보면,
  • Join local user groups
  • 지역 모임에 나가는 것
  • Go to conferences
  • 컨퍼런스에 참가하는 것
  • Blog and comment on other people’s blogs
  • 블로그를 하고, 다른사람의 블로그에 코멘트를 하는 것
  • Ask people in your network to introduce you to people they think you should meet
  • 당신이 이미 알고있는 사람들에게 당신이 만날 필요가 있는 사람들을 소개 받는 것
  • Follow and interact with them people Twitter and other social networks
  • 소셜 네트워크 사람들을 팔로우 하고 메시지 주고 받는 것
  • Host your own dinner or get together about a topic you are interested in
  • 하나의 토픽을 정해서 같이 식사하는 것
And remember networking is all about what you can do for someone else, not what they can do for you; whether you believe in it or not the principle of Karma is real.
그리고 기억하세요, 네트워킹은 다른사람이 당신을 위해 무엇을 할 수 있는지에 관한것이 아니라 당신이 다른사람들을 위해서 무엇을 할 수 있는지 라는 것을, 당신이 믿든 안믿든 카르마는 존재합니다.

3. Build a personal brand (the best way to market yourself as a software developer)

3. 개인 브랜드를 만드세요(소프트웨어 개발자로서의 자신을 홍보하는 최고의 방법)
You hear about personal brands quite a bit these days, but people are often pretty confused about what a personal brand is.
요즘은 개인 브랜드가 중요하단 것을 들었을 것입니다, 하지만 사람들은 개인 브랜드라는 것이 무엇인지 혼란스러워 하는 경향이 있다습니다.
I overheard someone on a HGTV design show talking about how their personal brand was all about industrial looking modern designs or some other hogwash like that.
나는 HGTV의 디자인 쇼에서 출연자들이 자신의 개인 브랜드에 대해서, 개인 브랜드란 산업에서 듣는 현대적인 디자인이나 그 비슷한 헛소리 라고 이야기 하는 것을 들었습니다.
That person, although they were an experienced designer, didn’t understand the key concept about a personal brand: it is no different than corporate branding.
그 사람은, 경험많은 디자이너였지만, 개인 브랜드에 대한 중요한 개념을 이해하고 있지는 않았다고 생각합니다.: 회사 브랜드와 다를바 없습니다.
Branding is all about sending a consistent message that is recognized by some repeated stimulus which when seen instantly reminds the viewer of that message.
브랜딩이라는 것은 보는 사람으로 하여금 지속적으로 같은 메시지를 받아서 자극을 받도록 하는 것입니다.

For example, when you see the famous golden arches, you probably think McDonalds.  And when you think McDonalds, you probably think Big Macs, Quarter Pounders, Happy Meals and Egg McMuffins.
예를 들면, 당신이 금빛의 아크형태를 본다면, 아마 당신은 McDonald를 생각 할 것이고, McDonald를 생각한 당신은 빅맥,  쿼터 파운더, 해피밀, 달걀과 맥버핀 을 생각할 것입니다.
No matter where you go, if you are driving down the highway and pull off an exit to go to a McDonalds, you have a certain set of expectations about that place, which you have come to expect from repeated exposures to a consistent message associated with a distinct set of imagery.
당신이 어디에 있고, 무슨일을 하건 McDonald는 당신에게 지속적인 동일한 이미지를 노출시킵니다.
Building a personal brand is no different than building a brand like McDonalds or Starbucks or any other brand.  Decide what imagery you are going to use, and the message you are going to convey, and do it consistently.
개인 브랜드를 구축하는 것은 McDonald나 Starbucks가 브랜드를 구축하는 것과 다르지 않다. 어떤 이미지를 사용하고, 어떤 메시지를, 지속적으로 사용할 것인지 정하는 것입니다.
For instance, if you come to my blog, you have a certain set of expectations about what kind of posts you will see here.  You know that you won’t see some crap that I threw together in 5 minutes just so I can get a post out.  You know that you are likely to get something technical, like Getting Started with Dart, or something more about developer psychology and principals, like this post.
예를 들어, 당신이 내 블로그에 들어오면, 어떤 종류의 포스트를 볼 것인지 기대하는 것이 있을 것입니다. 5분만에 만든 포스트를 볼 것이라고 생각은 안하지 않겠습니까? 기술적이거나 개발자의 심리, 원리와 관련된 글을 볼 것이라고 생각하지 않나요?
I don’t have the budget of a company like McDonalds, and I’m still learning about personal branding myself, but everywhere I go I try to present a consistent visual image and message.
나는 McDonald와 같은 예산이 많지 않습니다. 그리고 아직 개인 브랜딩에 대해서도 배우는 중이지만 어디를 가든지 지속적인 이미지와 메시지를 주기 위해 노력 중입니다.
I use the same logo for Simple Programmer everywhere, and I include the same headshot, and almost all of my content somehow relates back to the idea of making the complex simple.  That is what I do.  I make the complex simple, whether through creating online courses for Pluralsight, writing articles in my blog, doing YouTube videos or evenpodcasting about Health and Fitness.
나는 항상 같은 Simple Programmer 로고를 사용 합니다. 얼굴이 나온 사진을 사용하고, 메시지는 “복잡한 것을 간단하게 만든다”는 것입니다. 그것이 내가 하는 일입니다. 나는 복잡한 것을 간단하게 만듭니다, Pluralsight를 위한 온라인 강좌를 만든다 던지, 내 블로그에서 사설을 쓴 다던지, 유튜브 비디오를 만들거나 건강과 운동에 관련된 팟캐스트를 하는 방식으로.
I want you to understand that when you see my logo or you see my name, you are going to be dealing with someone who genuinely wants to help you understand things that sometimes seem complex and understand how simple they really are.
나는 당신이 내 로고나 이름을 볼 때, 당신이 겪고 있는 복잡한 것이 사실은 간단하다는 것을 인식할 수 있게 도와주는 사람을 생각했으면 합니다.
So, if you want to get started building a personal brand, decide your message, decide the visualization you want to associate with that message, and start using it consistently everywhere you can.
당신이 개인 브랜드를 만들고 싶어 한다면, 당신의 메시지를 만들고, 그 메시지를 시각화할 수 있는것을 생각하고, 그것을 어느곳에서든 지속적으로 사용하기를 바랍니다.

It is all about changing your mindset

지금까지 이야기한  모든것들은 전부 자신의 마인드셋(사고방식)을 바꾸는 것입니다.
Marketing isn’t easy, but it is an essential skill that most software developers don’t realize they need to have.
마케팅은 쉽지 않습니다, 하지만 소프트웨어 개발자들에게 필수적인 기술이며, 이를 모르는 사람이 너무 많습니다.
Most software developers—myself included, for most of my career—think of career advancement in terms of acquiring new skills and climbing the corporate ladder, but a much more effective way to think about career advancement is to think of yourself as a business and treating your skills and unique talents as an offering that you actively promote.
많은 소프트웨어 개발자들—나도 포함해서, 초반의 내 커리어에서—에게는 새로운 기술을 습득해서 발전을 하거나, 회사에서 승진을 하는 것 만이 목표였습니다. 하지만 더욱 효과적인 커리어 개발은 당신이 가진 기술과 재능을 비즈니스 자체라고 생각하는 것입니다.
This fundamental change in mindset is critical to taking your career to the next level and making a name for yourself in the world of software development.  That is exactly why I am building a product around this idea that will show you exactly step-by-step how to do it.
이런 근본적인 마음가짐의 변화는 당신의 커리어를 다음 레벨로 올리고 소프트웨어 개발 세계에서 당신의 이름을 알리기 위한 것이며,그것이 왜 내가 그와 관련된 교육 프로그램를 만드는 이유 입니다.
The product itself is top secret right now, so I can’t reveal too much about it, but you can be sure in my upcoming blog posts and YouTube videos that I’ll be revealing more information.
이 프로그램은 현재 일급비밀입니다. 그래서 많은 것을 알려주지는 못하지만 다음에 올릴 블로그 포스트와 유튜브 비디오를 통해 조금 더 많은 정보를 공유 하도록 하겠습니다.
If you are really eager to be one of the first to find out what I am doing and want to know about this mysterious product the moment it comes out, you can reserve your spot in line, by signing up here.  I’ll be offering some free goodies and other stuff to some of the first people who sign up as I get closer to the product launch and need to get some early testers.
만약 당신이 내가 하는 프로그램이 무엇인지 아는 첫번째 사람이 되길 원한다면, 여기 등록을 해서 예약할 수 있습니다.