2016년 8월 27일 토요일

python variable, attribute(instance attribute, class attribute)

-- 정리 계기 --

python을 사용할 때 변수(variable) 이라는 말과 속성(attribute)이라는 말이 혼란스럽기도 했고, attribute를 알아보니 class, instance attribute 가 따로 있어 정리했습니다.
지금은 간단히 class 안에 있는 것은 attribute 이고 class 로 만든 새로운 instance는 variable 이라고 이해하고 있습니다.


-- 내용 --

variable:  우리가 일반적으로 이야기하는 변수, class 로 새로운 instance 를 생성하면 그것이 변수
attribute: class 내에서 만들어진 변수


attribute 세부
    1. instance attribute
    2. class attribute

Beyond performance considerations, there is a significant semantic difference. In the class attribute case, there is just one object referred to. In the instance-attribute-set-at-instantiation, there can be multiple objects referred to.
성능에 대한 이야기를 떠나서, 확실하게 다른점이 있다. class attribute는 1개의 object 밖에 없다. 초기화를 통해 만들어진 instance attribute눈 여러개의 object 가 만들어진다.

For instance
예를 들면 아래와 같다.

1. class attribute 
class A:
    foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
[5]

-> class level 에서 작성, self.xxx 로 사용하지 않음


2. instance attribute
class C:
    def __init__(self):
        self.foo = []
c, d = C(), C()
c.foo.append(5)
d.foo
[]

-> instance level 에서 접근, self.xxx 로 사용

The difference is that the attribute on the class is shared by all instances. The attribute on an instance is unique to that instance.
class 의 attribute는 모든 instance 들이 공유하고, instance 의 attribute 는 각 attribute 마다 고유하다.



참조: Link







2016년 8월 26일 금요일

python 에서 밑줄 ('_', underline) 사용된 파일, 함수, 변수 List 및 그 의미

1. 파일
    폴더 아래의 __init__.py
        해당 폴더가 파이썬 package 라고 인식할 수 있게 한다.
        그 폴더가 package 이기 때문에 그 안에 있는 python 파일들을 import 할 수 있다.

2. 메서드(method, 클래스 내부 함수, 가장 아래 예시 코드)
    1) '_' 이 앞에 붙으면 외부 사용자는 사용하지 말라는 권유의 문법이고,
 a leading underscore are simply to indicate to other programmers that the attribute or method is intended to be private. However, nothing special is done with the name itself.

    2) '__' 이 앞에 붙으면 private 가 되어 외부에서 사용할 수 없고, 다른 클래스 에서 사용하거나 override 할 수 없다.
 it can be used to define class-private instance and class variables, methods, variables stored in globals, and even variables stored in instances. private to this class on instances of other classes.

    3) __이름__ : __init__ 함수의 경우는 class 생성 시 자동으로 실행되는 생성자이다.
                  init 외의 __이름__ 는 그냥 함수이며 클래스 외부에서 call 할 수 있다.

3. 속성(Attribute, 클래스 내의 변수)
    위 2.메서드와 동일한 특성을 가진다.
    특별히 class 에서 default로 만들어진 attribute 이 있으며 각 사용법에 맞게 사용된다.
    __name__ : 해당 파일이 실행된 것이면 "__main__" 이 셋팅된다.
    __file__: 해당 파일의 이름
    그 외에도 종류가 있을 것이므로 확인 시 추가 예정


참조 : Link



2-예시 코드

1) 클래스 선언
class TestClass:
    def __init__(self):
        self.a = "a"
    def __dUnderscoreBothSide__(self):
        self.udb = "udb"
    def __dUnderscoreOneSide(self):
        self.udo = "udo"

2) 클래스 인스턴스 생성
t = TestClass()
 
3) attribute a 출력
t.a
'a'
 
4) attribute udb 출력  에러 확인
t.udb
AttributeError                            Traceback (most recent call last)
<ipython-input-4-12af1792c567> in <module>()
----> 1 t.udb
 
AttributeError: 'TestClass' object has no attribute 'udb'

5) attribute udo 출력  에러 확인
t.udo
AttributeError                            Traceback (most recent call last)
<ipython-input-5-89e092a247e5> in <module>()
----> 1 t.udo
 
AttributeError: 'TestClass' object has no attribute 'udo'
 
6) __dUnderscoreBothSide__ method함수 실행 확인 
t.__dUnderscoreBothSide__()
 
7) udb attribute 출력 확인
t.udb
'udb'
 
8) 클래스 외부에서__dUnderscoreOneSide 실행 시 에러 확인
t.__dUnderscoreOneSide()
AttributeError                            Traceback (most recent call last)
<ipython-input-8-58ea9d19081f> in <module>()
----> 1 t.__dUnderscoreOneSide()
 

AttributeError: 'TestClass' object has no attribute '__dUnderscoreOneSide'









FILE Format List

잘 몰랐던 file format 들은 적어놓고 기억


INF 파일
    의미: In computing, an INF file or Setup Information file is a plain-text file used by Microsoft Windows for the installation of software and drivers. INF files are most commonly used for installing device drivers for hardware components. Windows includes the IExpress tool for the creation of INF-based installations.
     컴퓨터 분야에서, INF 파일(설치 정보 파일)은 text로 구성되어 있으며 (Microsoft) Window에서 소포트웨어나 드라이버를 설치할 때 쓰는 파일이다. device deriver를 설치할 때 주로 사용한다. Window에 있는 IExpress tool 이 INF 만들 때 쓰인다.
    실행: 마우스 오른쪽 클릭하면 설치 를 선택할 수 있다.
          Windows 8.1 의 경우 "디지털 서명 정보가 없습니다." 라는 경고창이 뜰 때는 설정을 바꿔 줘야 한다.
           1. Windows key + i
           2. 전원 버튼 클릭
           3. 다시시작 클릭 + Shift key
           4. 문제 해결 클릭
           5. 7번 드라이버 서명안함 클릭
           6. 재시작


2016년 8월 20일 토요일

Dynamic Test Scheduling in Hardware-In-theLoop Simulation of Commercial Vehicles

Hardware-In-the Loop Simulation of Commercial Vehicles
차량에 대한 HIL 시뮬레이션 자료

나의 결론은 테스트 효율화를 위해 스테이트 머신 형태로 테스트가 진행되고 있다는 것

---

ABSTRACT

Modern day commercial vehicles are controlled by various Electronic
Control Units (ECU). They are not only tested as single units, but also by
networking them in Controlled Area Network bus (CAN) to form a complete
electrical control system. This is achieved using Hardware In the Loop (HIL)
Integration Lab. In HIL, the electrical system is connected to a real time
mathematical model of the vehicle plus it’s environment so as to form a loop.

Testing functionality of the electrical system begins by defining functional
tests. An example would be testing cruise control activation. Executing each test
is made possible by parameterizing variables in the vehicle dynamic model and
externally controlling them.

HIL based Verification and Validation (V&V) is moving towards
automation.

This is because of the complexity of electrical control systems is increasing and manual V&V is time consuming. In an automated test environment, a Test Engineer develops test scripts to implement functional tests. These test scripts execute the vehicle model in real time, control parameterized variables, and observe the electrical system response. This is compared to the expected response to decide if a functional test passed or failed.
Tests are designed to remain independent of each other. Scheduling of tests is done by the Test Engineer, which is a difficult task owing to their large number and possible combinations. Hence, the normal practice is to execute tests in a predefined sequence.

To solve the test scheduling problem in Hardware In the Loop simulation,
two solutions are proposed. 
Both the solutions exploit relationship between test case and state of the vehicle in a dynamic simulation environment. An example of such relationship is engaging cruise control only when vehicle speed is above 20 km/h. It can be proved that a test process that is sensitive to the simulation environment will be more realistic and hence efficient.

 One solution is to model the test execution as a state machine. Tests are
treated as states. Entry conditions for each state are defined using state variables
of the dynamic model. When a simulation is run, state variables of the dynamic
model are sampled in real time. One sample of state variables trigger a transition
from one state to another in the state machine. When the state machine is in one
state, a test case corresponding to that state is selected and executed. A sequence
of these transitions results in a test process evolving in time.
The second proposed solution is functionally similar to a state machine but
it’s implementation is derived from logic design. Here, one sample of state
variables is compared with entry conditions of each test case. Test cases whose
entry conditions match with the current sample are selected for execution.

Both the solutions use Failure Mode Effective Analysis (FMEA) to resolve test selection conflicts, that is, situations where more than one test is selected.
Results show that test execution using this approach is sensitive to the simulation environment and comparable to that of a real test drive scenario. An
improvement in test efficiency both in Qualitative and Quantitative terms is also
achieved. Test runs show how the new method of test execution allows faults to
propagate from one test to another like in a real test drive.

django 기초 강좌 수강 기록

django 기초 강좌 수강기록

1.  python 설치 - anaconda 3 64 bit 설치
2. easy_install django, 최신버전 특정 버전 django==1.9
3. django-admin --version
참조 Link

4. core file 생성
5. django-admin startproject MyProjectName
6. pycham 설치 및 MyProjectName open
7. manage.py 파일은 사용하는 것이지 수정하는 것이 아니다.
8. __init__ 파일은 내용이 없으며 MyProjectName 이라는 폴더가 그냥 폴더가 아니라 python package 라는 것을 알려준다.
9. setting.py 는 웹싸이트에 필요한 것들을 설정해 놓은 것이다.
10. urls.py 웹싸이트의 내용들(contents)을 보여주는 테이블이다. 특정 url 을 연결해 준다.
11. wsgi.py 는 특별한 서버의 기능을 나타내며 긴 시간이 지난 후 배우니 신경쓰지 않아도 된다.
12. 처음에는 setting.py, urls.py 만보면 된다.
13. python manage.py runserver 를 쓰면 지금 첫 생성한 프로젝트를 서버레 올려준다.
14. 127.0.0.1:8000 에 웹브라우저로 접속하면 초기 화면을 볼 수 있다.
참조: Link

15. 서버가 돌아가고 있을 때 소스코드를 변경하여도 서버를 재시작 하는 것이 아니라 브라우저로 접속을 다시하면 업데이트 된 것을 볼 수 있다.
16. python manage.py startapp music 하면 새로운 app 이 나타난다.
 - app 을 만든다. app 은 하나의 일을 하는 단위이다.
참조: Link

17. music 폴더 속의 파일 이름들을 보면 전체를 그려볼 수 있다.
18. wesite 나 소스코드 들을 database 에 hook up 하는 것이며, django 에서는 한 줄이면 된다.
19. admin.py 은 admin 권한을 이야기 한다.
20. apps.py: 이 app의 configuration을 위한 파일이다.
21. model.py: database 에 대한 blueprint 이다.
22. tests.py 는 테스트를 작성할 수 있는 공간이란 뜻이다.
23. views.py 파이썬 함수들이 있는 곳이며, 유저의 요청을 받아 들여서 그 요청한 것에 대한 결과를 다시 보여주는 것이다. 95%의 확률로 어떤 웹페이지를 요청하고 그 웹페이지를 전달해 주는 것이다.
참조: Link

24. 어떤 웹페이지를 요청하게 되면 urls.py 를 확인하게 된다.
25. 아래와 같이 쓰면 music 으로 접근했을 때 music app의 아래에 있는 urls.py 에서 어떤 동작을 할 지를 찾게 된다.
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^music/', include('music.urls')),
]
26. music app urls.py 파일에서는 아래와 같이 해당 regular expression 일 대 view.py 에 선언되어 있는 index 함수를 부르게 된다.
urlpatterns = [
    url(r'^$', views.index),
]
27. index 함수는 "This is the music app homepage" 문장을 리턴해 주는 Http 문장이므로 이를 웹브라우저에 보여준다.
def index(request):
    return HttpResponse("<h1>This is the music app homepage")
참조: Link

28. 데이터 베이스를 만들려고 한다. 그러기 위해 django 에서 중요한 내용을 습득해야 한다.
29. django project를 만들면 default로 sqlite db 가 만들어진다.
30. 이것은 setting file의 77라인에 DATABASES 라는 구조로 만들어져 있다.
31. django 는 mysql 이나 XX 등 어떤 database 나 쓸 수 있지만 기본으로 되느 sqlite3 는 어려움 없이 사용할 수 있어서 테스트에 최적이다.
32. 기본으로 아래 APP 들이 설치되어 있다. 이 앱들은 데이터 베이스에 접근해야 동작하는 것들이 있다. 하지만 migration 이 되어있지 않아 앱이 제대로 실행되지 않은 상태이다.
INSTALLED_APPS = [
    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',]
33. 데이터베이스와 싱크가 맞지 않아서 벌어지는 것이다.
34. 콘솔에서 python manage.py migrate 누르면 싱크가 된다.
35. 각 앱이 실행하기 위한 테이블이 데이터베이스에 있고 앱과 데이터베이스가 싱크가 된 것이다.
36. 싱크한 후 python manage.py runserver 하면 이번에는 no issue 라고 뜬다.
참조: Link

37. 이제는 Model 을 만들려고 한다. Model 은 저장할 데이터에 대한 blueprint 이다.
38. 코드와 데이터베이스의 셋팅은 따로 떨어져 있지 않다. Model.py 에서 한번에 할 수 있다.
39. Model.py 파일에서 class 를 만들면 자동으로 데이터베이스 테이블로 만들어 준다.
40. 각 데이터끼리는 연결해 주고, 포함관계에 따라 지워질 수 있다.
class Album(models.Model):
    # 이것들은 컬럼    artist = models.CharField(max_length=250)
    album_title = models.CharField(max_length=500)
    genre = models.CharField(max_length=100)
    album_logo = models.CharField(max_length=1000)


class Song(models.Model):
    # 앨범을 지우면 그 앨범에 연결된 곡은 같이 지워진다.    album = models.foreinKey(Album, on_delete=models.CASCADE)
    file_type = models.CharField(max_length=10)
    song_title = models.CharField(max_length=250)
참조: Link


41. 새로 만든 앱은 setting.py 에서 추가해 준다.
INSTALLED_APPS = [
    'music.apps.MusicConfig',    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',]
42. models.py 에서 class 생성한 것을 데이터베이스에 연결 시키려면 python manage.py makemigrations music 이라고 명령을 주어야 한다.
43. migration 이라는 말은 데이터 베이스에 적용시킨다는 것이다.
44. python manage.py migrate 하면 적용 완료 시켜준다.
참조: Link

45. python manage.py shell 을 구동시켜서 데이터베이스에 데이터를 저장할 수 있다.
참조: Link

46. object를 읽을 때 __str__ 함수를 사용해서 object 가 아닌 문자열을 리턴할 수 있다.
47. filter 를 써서 필요한 정보만 읽을 수 있다.
참조: Link

48. python manage.py createsuperuser 를 하면 admin 계정을 만들 수 있다.
49. Music 폴더의 admin.py 에 Album 정보를 넣으면 admin.site.register(Album) 을 적으면 된다.
참조: Link

50. view 는 간단한 함수로서 html 을 리턴해 주는 것이다.
51. urls.py 에서 어떤 정규식과 같은 url이 불리면 views.py 의 특정 함수가 불리게 되고 그 함수의 return 값이 html 이다.
참조: Link

52. 가지고 있는 Album 정보를 모두 페이지에 디스플레이 하려고 한다.
53. views.py 에서 music page 를 보여주는 index 함수를 수정한다.
54. 아래와 같이 database 의 정보를 all_albums 라는 변수로 연결시켜 준다.
all_albums = Album.objects.all()
55. album 의 각 정보를 loop 돌면서 출력해 주면 music 페이지에서 해당 리스트를 볼 수 있다.
def index(request):
    all_albums = Album.objects.all()
    html = ''    for album in all_albums:
        url = '/music/' + str(album.id) + '/'        html += '<a href="' + url + '">' + album.album_title + '</a><br>'    return HttpResponse(html)
참조: Link

56. 데이터 베이스의 내용을 가지고 웹페이지에 쓰는 것 까진 했지만 웹페이지가 투박해서 꾸며야 한다.
57. template 를 만드는 방법을 생각해야 한다.
58. music 폴더에서 template 이라는 자식 폴더를 만들고, 그 자식으로 music 폴더를 만든다.
59. 그 안에 index 라는 이름의 html 파일을 만든다.
60. 아래와 같이 연결하면 자동으로 template 폴더의 내용물을 찾는다.
template = loader.get.get_template('music/index.html')
61. template 를 load 한 다음 내용을 render 하면 된다.
62. python 에서 있던 내용을 context 라고 하는 dictionary 로 만들어서 render 할 때 인자로 넣어주면 된다.
63. html template 안에  python 코드를 넣으면 된다. 넣는 방법은 {% 여기에 넣는 것 %} 이다. 그 때 html 속에서 사용되는 변수는 {{ 이것으로 둘러 쌓인다 }}
64. html 속에서 python if 문을 아래와 같이 쓸 수 있다.






참조: Link

65. django.shortcut 을 쓰면 경로를 단축시킬 수 있다(예를 들어 template.render -> render)

참조: Link

66.  앨범이 있는 것 없는 것 확인하여 없으면 404 에러를 띄울 수 있게 한다.

참조: 16 - Raising a 404 HTTP Error


참조: 17 - Adding Songs to our Database


참조: 18 - Related Objects Set

참조: 19 - Designing the Details Template

XX. url 구조를 dynamic 하게 만드는 법

참조: 20 - Removing Hardcoded URLs



참조: 21 - Namespace and HTTP 404 Shortcut

참조: 22 - Simple Form
참조: 23 - Adding Forms to the Template
참조: 24 - Favorite View Function
참조: 25 - Bootstrap and Static Files
참조:
참조:
참조:
참조:
참조:
참조:











2016년 8월 15일 월요일

PyCon APAC 2016 후기 - 이정우



개요
    1. 어떤 프로그램을 들었는지
    2. 후원사 부스 특이사항
    3. 파이콘에서 느낀 것

1. 어떤 프로그램을 들었는지
  • (1일)Wes McKinney 키노트 : 우리나라에 Pandas를 만든 사람이 왔다는 것 자체가 신기했습니다. Pandas 만든 사람이니 기본 내용보다 변경된 내용 알려줄 텐데 그것을 이해하려고 하면 머리가 아프겠다고 생각하고 집중하지 못했습니다.
  • (1일)나의 사진은 내가 지난 과거에 한 일을 알고 있다-최규민님: 사진에 있는 정보를 뽑아내고, 그 정보들을 조합해서 결과를 보여주는 것인데 실제로 해보고 싶다는 생각이 들었습니다. 많은 정보들을 보여주셨는데 그 중 집중 한 것은 이동한 경로를 사진의 위치 데이터 바탕으로 지도상에 찍어 준 것과, 사진 속 얼굴을 인식하여 얼마나 즐거웠는지 판단한 것 입니다. 직접 구현해보고 싶어 간단하게 진행(블로그링크) 하고 있습니다.
  • (1일)Introduction to deep learning for machine vision tasks using Keras-Michael Amy: Machine learning을 해야 하는데 몇번 시도해본 결과 머리가 아팠던 기억이 있어 이해는 미뤄두고 듣기만 했습니다..
  • (1일)뉴스를 재미있게 만드는 방법; 뉴스잼-김경훈님: 뉴스를 재미있게 보여주기 위해서 필요한 작업을 수집, 분석, 전달 로 나누고 각 세부적인 작업들에서 사용한 정말 다양한 라이브러리를 소개해 주셨습니다. 방대한 내용을 차근차근 설명해주시는 모습을 보고 회사 선배님이었으면 좋겠다라고 생각 했습니다;
  • (1일)The PSF and our community-김영근님: Python 의 김영근님이 커뮤니티를 어떻게 시작했고 어떤 마음으로 하고 있다는 것을 설명, 운영하는 분들의 노고를 많이 느낄 수 있었습니다. 
  • (1일)기계학습을 활용한 게임 어뷰징 검출-김정주님: 게임중 채팅창에 광고하는 어뷰징 프로그램을 감지하는 방법에 대한 고민하고, 기계학습을 사용해서 100% 검출을 할 수 있었다는 내용이었습니다. 역시 분석 할 데이터가 있고, 그 효과를 바로 느낄 수 있는 것이 가장 중요하다고 느꼈습니다. 게임에서는 채팅창이 도배되면 유저들이 대화를 못하고, 게임도 하기 싫어질 테니까요..
  • (2일)Django vs Flask, 까봅시다!-김도현님: Django 와 Flask 를 둘다 써본 사람으로써 어떤 장 단점이 있다고 느낀것을 공유해 주셨습니다. 1) Django는 암시적이지만 기능이 많고, Flask는 명시적이지만 기능이 적다. 2) Flask 가 간결하지만 구현 방법이 다양해서 초보자가 따라가기에 힘들다. 3) Django 구현방법이 사람마다 편차가 적어 초보자가 하는 것이 적당하다. 
  • (2일)Python으로 19대 국회 뽀개기-이홍주님: 머신러닝을 할 때는 attribute들을 vector로 만드는 작업(featurization)이 가장 중요하다. 
  • (2일)Debugging Tips and Tricks-Roy Hyunjin Han: 8가지 debug 하는 방법을 보여주었습니다. 제가 평소 사용하지 않는 디버깅 기술들을 빠르고 명확하게 끊김없이 하셔서 멋있어 보였습니다. 8가지 중 Jupyer notebook 에서 에러 발생 시 창에 'debug' 를 쓰면 바로 debug 모드로 들어가는 것이 이해도 잘 되고 바로 사용할 것 같았습니다. 세션이 끝나고 insight 를 얻고 싶어 뛰어나지 않은 개발자로서 할만 하고, 요즘 가장 hot 한 것이 무엇이 있냐고 물었는데 www.openai.com 싸이트를 소개시켜 주었습니다. 머신러닝 중 reinforcement 에 관련된 것이었습니다.    
2. 후원사 부스 특이사항
    JetBrain: PyCharm을 만드는 회사로 대기열이 가장 길었는데, JetBrain에 등록을 하면 추첨을 해서 PyCharm Pro 버전을 무료로 주기 때문이었습니다. 하지만 그 내용에 대한 공지가 따로 없었기 때문에 (저를 포함)많은 사람들이 제일 좋은 것을 준다고 생각해서 줄을 서 있었고, JetBrain Member에게 문의하니 몇명이 등록하는지 마지막날까지 확인해서 내부적으로 결정할 것이라고 결정된 것은 없다고 확인하였습니다.
    SmartStudy: 사진을 셀카포함 거의 안찍었는데 facebook에 셀카 찍어서 #PyConAPAC, #SmartStudy 공유하면 bottle 준다고 해서 찍음, 그 사진이 남아서 다행입니다.
    Elastic: Twitter 에 태그 남기면 Stress ball 을 주셨습니다. 개인적으로 건강에 관련된 아이템을 좋아해서 기분 좋았습니다.

3. 파이콘에서 느낀 것
    이렇게 수준높은 컨퍼런스를 5만원 내고 3일 동안 즐길 수 있어서 행운이었습니다.
    봉사하는 분들은 정말 세션 내용들을 못드는 것을 보고 죄송한 마음이 들었습니다..
    세션들을 듣는다고 해도 그 내용을 정말 기억하고 이해해서 내 업무에 쓰기는 정말 어렵다는 것을 느꼈고, 그래서 생각한 것은, 들었던 내용을 토론 형식으로 꾸준히 리뷰하면 각자 자기 수준을 뛰어넘는 인싸이트를 얻을 수 있을 것 같다는 것입니다.

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