문제 상황

  • Windows에서 Docker를 사용하고 있는데 외부에서 접속이 안되는 문제가 있었다.
  • localhost에서 직접 expose 된 port로 연결했을때는 잘 되나, 다른 컴퓨터에서 접근하니 접근이 안되는 문제가 있었음.

상태

  • Windows 10 Pro 사용
  • Docker for Windows 사용
  • Docker로 gitlab 설치

문제 발견

  • Windows 방화벽 문제 였음.

해결책

해결책 1 : 특정 port만 열어 주자.

  • Windows 방화벽에서 특정 port만 지정해서 열어 봤더니 잘 동작하더라.
  • 그렇다고 Docker로 뭘 띄울때마다 port를 열고 닫고 하면.. 일이 너무 크다.

해결책 2 : 특정 process에게 권한을 주자.

  • 방화벽에 특정 process는 모든 port를 사용할 수 있도록 권한을 주자.
  • 고급옵션이 포함된 Windows 방화벽 을 실행하자.
  • 인바운드 규칙 -> 새 규칙 -> 프로그램 -> 다음 순으로 눌러 준다.
  • 다음 프로그램 -> 찾아 보기 -> com.docker.slirp.exe 를 골라 준다.
  • 다음 -> 다음 -> 이름을 적당히 해 준다. ( 여기서는 Docker )
  • Docker for windows를 종료하고, 다시 실행 시켜 준다.

결과

  • 이제 외부에서 접근이 될 것이다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 Tensorflow 설치후 notebook 실행 해 보기

블로그에 있는 이전 글인 "Windows 10 64bit 에서 텐서플로우(Tensorflow) 1.0.0 설치하기" 환경에서 시작하므로, 관심이 있으신 분들은 그 게시물을 미리 보고 오는게 더 편하겠다.

notebook?

jupyter는 파이썬 관련 프로그램인데, notebook 이라는게 있다. notebook은 웹 상에서 python 프로그램을 실행해 볼 수 있도록 해 준다. notebook에서 제공하는 가장 좋은 기능은, 프로그램을 작성할때, 혹은 실행할때, 한줄, 한줄 실행해 볼 수 있기 때문에 좋다. 물론 처음 사용할때는 좀 귀찮긴 하지만(사실 나도 전에 한 두번 쓴 적은 있고, 몇 일 전에서야 직접 띄워 봤다. ;; ) 또한 코드를 관리하는 화면에서 markdown으로 문서 작성도 가능하다. 그러므로 튜토리얼 등을 작성할때, 코드와 설명을 동시에 적어 둘 수 있어 참 보기가 좋다.

notebook 실행

우선 Anaconda Prompt를 띄운뒤에, tensorflow 환경으로 전환하기 위해 activate tf를 친 뒤 jupyter notebook를 실행하면 된다. jupyter는 직접 설치한 적이 없는데, tensorflow를 설치 할 때 자동으로 설치 되었기 때문에 사용이 가능한 것이다.

(D:\cjcho\Anaconda3) d:\cjcho\Works\ml\tf>activate tf

(tf) d:\cjcho\Works\ml\tf>jupyter notebook
[I 00:30:32.313 NotebookApp] Serving notebooks from local directory: d:\cjcho\Works\ml\tf
[I 00:30:32.314 NotebookApp] 0 active kernels
[I 00:30:32.314 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:32.314 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 00:30:32.320 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:35.225 NotebookApp] Accepting one-time-token-authenticated connection from ::1

위와 같이 출력 되면서 기다리면 자동으로 웹브라우져가 아래와 같이 뜬다.

notebook 작성하기

이제 이 환경에서 python 파일을 작성해 볼 수 있다. 우리는 notebook 이라는것을 만들어서 python 프로그램을 작성해 볼 것이므로 notebook을 하나 만들어 보자.

New -> Notebooks -> Python 3 를 눌러서 새로운 노트북을 만들어 보자.

아래와 같이 새로운 노트북이 하나 만들어 진다.

notebook에서 코딩

notebook에서 코드 입력하고 실행헤 보기

아래와 같이 코드를 입력하고 버튼을 눌러 보자.

그러면 입력했던 코드의 실행 결과가 바로 아랫줄에 출력된다.

notebook에서 코드 또 입력하고 실행해 보기

play 버튼을 누르게 되면, 연두색(혹은 파란색)으로 선택되어진 곳의 명령이 실행된다. 연두색으로 focus 되어 있는 곳에 다시 명령을 넣고 버튼을 눌러 보자.

아래와 같이 focus 되었던 곳의 코드 실행 결과가 나오는것을 알 수 있다.

notebook에서 markdown으로 문서 작성하기

또한 코드 중간에 설명을 입력해야 하는 경우에는 아래와 같이 markdown 을 이용해서 설명을 입력할 수도 있다.

notebook에서 다음 block 만들기

다음줄에 무언가를 입력하고 싶으면 Insert -> Insert Cell Below 를 눌러 주거나, Alt + Enter 를 치면 된다.

이렇게 한줄, 한줄 코드를 실행 할 수 있게 되어 있어 편리하게 코드를 테스트 해 보면서 작성 할 수 있다. 하지만, 그래도 한줄, 한줄 실행되는것이기 때문에, 이전 block 에서 사용했던 변수들등은 모두 다음줄에 그대로 이어진다. 당연히 stream등을 open 시켜 두었다면, 다음 block에서도 여전히 열려 있는 상태다. 즉, state가 유지 된다는 뜻이다.

notebook에서 Kernel 다시 실행하기

state를 없애고 처음부터 실행되게 하고 싶다면 Kernel -> Restart 혹은 Kernel -> Restart & Clear Output 을 골라 주면 된다. Toolbar에 를 눌러도 된다. 대신 Toolbar에 있는 버튼은 Output이 지워지지 않으니, Kernel -> Restart & Clear Output를 눌러서 하는게 더 좋을 수도...

아무튼 state를 없애기 위해서 Restart를 누르면 아래와 같이 경고 메세지가 뜨고, Restart & clear all outputs를 누르면 된다.

위에서 Restart & clear all outputs를 누른 결과 깔끔하게 정리된 화면을 볼 수 있다.

notebook 끝내기

간단하다. Anaconda Prompt에서 Ctrl + C 를 눌러 주면 된다. 대략 아래와 같이 출력이 되면서 종료 된다.

[I 01:22:27.320 NotebookApp] Interrupted...
[I 01:22:27.326 NotebookApp] Shutting down kernels
[I 01:22:27.946 NotebookApp] Kernel shutdown: 9ff899ca-b515-4080-a7b4-dc5cbb5b6af0

(tf) d:\cjcho\Works\ml\tf>

이제까지 보고 있었던 웹브라우저에서는 더 이상 사용할 수 없다는 에러 메세지를 보여준다.

웹 브라우저 창은 그냥 닫으면 된다.

이제 notebook을 쓸 수 있게 되었다. 더 궁금하면 인터넷에서 더 찾아 보자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 Tensorflow 설치후 notebook 실행 해 보기

블로그에 있는 이전 글인 "Windows 10 64bit 에서 텐서플로우(Tensorflow) 1.0.0 설치하기" 환경에서 시작하므로, 관심이 있으신 분들은 그 게시물을 미리 보고 오는게 더 편하겠다.

notebook?

jupyter는 파이썬 관련 프로그램인데, notebook 이라는게 있다. notebook은 웹 상에서 python 프로그램을 실행해 볼 수 있도록 해 준다. notebook에서 제공하는 가장 좋은 기능은, 프로그램을 작성할때, 혹은 실행할때, 한줄, 한줄 실행해 볼 수 있기 때문에 좋다. 물론 처음 사용할때는 좀 귀찮긴 하지만(사실 나도 전에 한 두번 쓴 적은 있고, 몇 일 전에서야 직접 띄워 봤다. ;; ) 또한 코드를 관리하는 화면에서 markdown으로 문서 작성도 가능하다. 그러므로 튜토리얼 등을 작성할때, 코드와 설명을 동시에 적어 둘 수 있어 참 보기가 좋다.

notebook 실행

우선 Anaconda Prompt를 띄운뒤에, tensorflow 환경으로 전환하기 위해 activate tf를 친 뒤 jupyter notebook를 실행하면 된다. jupyter는 직접 설치한 적이 없는데, tensorflow를 설치 할 때 자동으로 설치 되었기 때문에 사용이 가능한 것이다.

(D:\cjcho\Anaconda3) d:\cjcho\Works\ml\tf>activate tf

(tf) d:\cjcho\Works\ml\tf>jupyter notebook
[I 00:30:32.313 NotebookApp] Serving notebooks from local directory: d:\cjcho\Works\ml\tf
[I 00:30:32.314 NotebookApp] 0 active kernels
[I 00:30:32.314 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:32.314 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 00:30:32.320 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:35.225 NotebookApp] Accepting one-time-token-authenticated connection from ::1

위와 같이 출력 되면서 기다리면 자동으로 웹브라우져가 아래와 같이 뜬다.

notebook 작성하기

이제 이 환경에서 python 파일을 작성해 볼 수 있다. 우리는 notebook 이라는것을 만들어서 python 프로그램을 작성해 볼 것이므로 notebook을 하나 만들어 보자.

New -> Notebooks -> Python 3 를 눌러서 새로운 노트북을 만들어 보자.

아래와 같이 새로운 노트북이 하나 만들어 진다.

notebook에서 코딩

notebook에서 코드 입력하고 실행헤 보기

아래와 같이 코드를 입력하고 버튼을 눌러 보자.

그러면 입력했던 코드의 실행 결과가 바로 아랫줄에 출력된다.

notebook에서 코드 또 입력하고 실행해 보기

play 버튼을 누르게 되면, 연두색(혹은 파란색)으로 선택되어진 곳의 명령이 실행된다. 연두색으로 focus 되어 있는 곳에 다시 명령을 넣고 버튼을 눌러 보자.

아래와 같이 focus 되었던 곳의 코드 실행 결과가 나오는것을 알 수 있다.

notebook에서 markdown으로 문서 작성하기

또한 코드 중간에 설명을 입력해야 하는 경우에는 아래와 같이 markdown 을 이용해서 설명을 입력할 수도 있다.

notebook에서 다음 block 만들기

다음줄에 무언가를 입력하고 싶으면 Insert -> Insert Cell Below 를 눌러 주거나, Alt + Enter 를 치면 된다.

이렇게 한줄, 한줄 코드를 실행 할 수 있게 되어 있어 편리하게 코드를 테스트 해 보면서 작성 할 수 있다. 하지만, 그래도 한줄, 한줄 실행되는것이기 때문에, 이전 block 에서 사용했던 변수들등은 모두 다음줄에 그대로 이어진다. 당연히 stream등을 open 시켜 두었다면, 다음 block에서도 여전히 열려 있는 상태다. 즉, state가 유지 된다는 뜻이다.

notebook에서 Kernel 다시 실행하기

state를 없애고 처음부터 실행되게 하고 싶다면 Kernel -> Restart 혹은 Kernel -> Restart & Clear Output 을 골라 주면 된다. Toolbar에 를 눌러도 된다. 대신 Toolbar에 있는 버튼은 Output이 지워지지 않으니, Kernel -> Restart & Clear Output를 눌러서 하는게 더 좋을 수도...

아무튼 state를 없애기 위해서 Restart를 누르면 아래와 같이 경고 메세지가 뜨고, Restart & clear all outputs를 누르면 된다.

위에서 Restart & clear all outputs를 누른 결과 깔끔하게 정리된 화면을 볼 수 있다.

notebook 끝내기

간단하다. Anaconda Prompt에서 Ctrl + C 를 눌러 주면 된다. 대략 아래와 같이 출력이 되면서 종료 된다.

[I 01:22:27.320 NotebookApp] Interrupted...
[I 01:22:27.326 NotebookApp] Shutting down kernels
[I 01:22:27.946 NotebookApp] Kernel shutdown: 9ff899ca-b515-4080-a7b4-dc5cbb5b6af0

(tf) d:\cjcho\Works\ml\tf>

이제까지 보고 있었던 웹브라우저에서는 더 이상 사용할 수 없다는 에러 메세지를 보여준다.

웹 브라우저 창은 그냥 닫으면 된다.

이제 notebook을 쓸 수 있게 되었다. 더 궁금하면 인터넷에서 더 찾아 보자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 Tensorflow 설치후 notebook 실행 해 보기

블로그에 있는 이전 글인 "Windows 10 64bit 에서 텐서플로우(Tensorflow) 1.0.0 설치하기" 환경에서 시작하므로, 관심이 있으신 분들은 그 게시물을 미리 보고 오는게 더 편하겠다.

notebook?

jupyter는 파이썬 관련 프로그램인데, notebook 이라는게 있다. notebook은 웹 상에서 python 프로그램을 실행해 볼 수 있도록 해 준다. notebook에서 제공하는 가장 좋은 기능은, 프로그램을 작성할때, 혹은 실행할때, 한줄, 한줄 실행해 볼 수 있기 때문에 좋다. 물론 처음 사용할때는 좀 귀찮긴 하지만(사실 나도 전에 한 두번 쓴 적은 있고, 몇 일 전에서야 직접 띄워 봤다. ;; ) 또한 코드를 관리하는 화면에서 markdown으로 문서 작성도 가능하다. 그러므로 튜토리얼 등을 작성할때, 코드와 설명을 동시에 적어 둘 수 있어 참 보기가 좋다.

notebook 실행

우선 Anaconda Prompt를 띄운뒤에, tensorflow 환경으로 전환하기 위해 activate tf를 친 뒤 jupyter notebook를 실행하면 된다. jupyter는 직접 설치한 적이 없는데, tensorflow를 설치 할 때 자동으로 설치 되었기 때문에 사용이 가능한 것이다.

(D:\cjcho\Anaconda3) d:\cjcho\Works\ml\tf>activate tf

(tf) d:\cjcho\Works\ml\tf>jupyter notebook
[I 00:30:32.313 NotebookApp] Serving notebooks from local directory: d:\cjcho\Works\ml\tf
[I 00:30:32.314 NotebookApp] 0 active kernels
[I 00:30:32.314 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:32.314 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 00:30:32.320 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:35.225 NotebookApp] Accepting one-time-token-authenticated connection from ::1

위와 같이 출력 되면서 기다리면 자동으로 웹브라우져가 아래와 같이 뜬다.

notebook 작성하기

이제 이 환경에서 python 파일을 작성해 볼 수 있다. 우리는 notebook 이라는것을 만들어서 python 프로그램을 작성해 볼 것이므로 notebook을 하나 만들어 보자.

New -> Notebooks -> Python 3 를 눌러서 새로운 노트북을 만들어 보자.

아래와 같이 새로운 노트북이 하나 만들어 진다.

notebook에서 코딩

notebook에서 코드 입력하고 실행헤 보기

아래와 같이 코드를 입력하고 버튼을 눌러 보자.

그러면 입력했던 코드의 실행 결과가 바로 아랫줄에 출력된다.

notebook에서 코드 또 입력하고 실행해 보기

play 버튼을 누르게 되면, 연두색(혹은 파란색)으로 선택되어진 곳의 명령이 실행된다. 연두색으로 focus 되어 있는 곳에 다시 명령을 넣고 버튼을 눌러 보자.

아래와 같이 focus 되었던 곳의 코드 실행 결과가 나오는것을 알 수 있다.

notebook에서 markdown으로 문서 작성하기

또한 코드 중간에 설명을 입력해야 하는 경우에는 아래와 같이 markdown 을 이용해서 설명을 입력할 수도 있다.

notebook에서 다음 block 만들기

다음줄에 무언가를 입력하고 싶으면 Insert -> Insert Cell Below 를 눌러 주거나, Alt + Enter 를 치면 된다.

이렇게 한줄, 한줄 코드를 실행 할 수 있게 되어 있어 편리하게 코드를 테스트 해 보면서 작성 할 수 있다. 하지만, 그래도 한줄, 한줄 실행되는것이기 때문에, 이전 block 에서 사용했던 변수들등은 모두 다음줄에 그대로 이어진다. 당연히 stream등을 open 시켜 두었다면, 다음 block에서도 여전히 열려 있는 상태다. 즉, state가 유지 된다는 뜻이다.

notebook에서 Kernel 다시 실행하기

state를 없애고 처음부터 실행되게 하고 싶다면 Kernel -> Restart 혹은 Kernel -> Restart & Clear Output 을 골라 주면 된다. Toolbar에 를 눌러도 된다. 대신 Toolbar에 있는 버튼은 Output이 지워지지 않으니, Kernel -> Restart & Clear Output를 눌러서 하는게 더 좋을 수도...

아무튼 state를 없애기 위해서 Restart를 누르면 아래와 같이 경고 메세지가 뜨고, Restart & clear all outputs를 누르면 된다.

위에서 Restart & clear all outputs를 누른 결과 깔끔하게 정리된 화면을 볼 수 있다.

notebook 끝내기

간단하다. Anaconda Prompt에서 Ctrl + C 를 눌러 주면 된다. 대략 아래와 같이 출력이 되면서 종료 된다.

[I 01:22:27.320 NotebookApp] Interrupted...
[I 01:22:27.326 NotebookApp] Shutting down kernels
[I 01:22:27.946 NotebookApp] Kernel shutdown: 9ff899ca-b515-4080-a7b4-dc5cbb5b6af0

(tf) d:\cjcho\Works\ml\tf>

이제까지 보고 있었던 웹브라우저에서는 더 이상 사용할 수 없다는 에러 메세지를 보여준다.

웹 브라우저 창은 그냥 닫으면 된다.

이제 notebook을 쓸 수 있게 되었다. 더 궁금하면 인터넷에서 더 찾아 보자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 Tensorflow 설치후 notebook 실행 해 보기

블로그에 있는 이전 글인 "Windows 10 64bit 에서 텐서플로우(Tensorflow) 1.0.0 설치하기" 환경에서 시작하므로, 관심이 있으신 분들은 그 게시물을 미리 보고 오는게 더 편하겠다.

notebook?

jupyter는 파이썬 관련 프로그램인데, notebook 이라는게 있다. notebook은 웹 상에서 python 프로그램을 실행해 볼 수 있도록 해 준다. notebook에서 제공하는 가장 좋은 기능은, 프로그램을 작성할때, 혹은 실행할때, 한줄, 한줄 실행해 볼 수 있기 때문에 좋다. 물론 처음 사용할때는 좀 귀찮긴 하지만(사실 나도 전에 한 두번 쓴 적은 있고, 몇 일 전에서야 직접 띄워 봤다. ;; ) 또한 코드를 관리하는 화면에서 markdown으로 문서 작성도 가능하다. 그러므로 튜토리얼 등을 작성할때, 코드와 설명을 동시에 적어 둘 수 있어 참 보기가 좋다.

notebook 실행

우선 Anaconda Prompt를 띄운뒤에, tensorflow 환경으로 전환하기 위해 activate tf를 친 뒤 jupyter notebook를 실행하면 된다. jupyter는 직접 설치한 적이 없는데, tensorflow를 설치 할 때 자동으로 설치 되었기 때문에 사용이 가능한 것이다.

(D:\cjcho\Anaconda3) d:\cjcho\Works\ml\tf>activate tf

(tf) d:\cjcho\Works\ml\tf>jupyter notebook
[I 00:30:32.313 NotebookApp] Serving notebooks from local directory: d:\cjcho\Works\ml\tf
[I 00:30:32.314 NotebookApp] 0 active kernels
[I 00:30:32.314 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:32.314 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 00:30:32.320 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:35.225 NotebookApp] Accepting one-time-token-authenticated connection from ::1

위와 같이 출력 되면서 기다리면 자동으로 웹브라우져가 아래와 같이 뜬다.

notebook 작성하기

이제 이 환경에서 python 파일을 작성해 볼 수 있다. 우리는 notebook 이라는것을 만들어서 python 프로그램을 작성해 볼 것이므로 notebook을 하나 만들어 보자.

New -> Notebooks -> Python 3 를 눌러서 새로운 노트북을 만들어 보자.

아래와 같이 새로운 노트북이 하나 만들어 진다.

notebook에서 코딩

notebook에서 코드 입력하고 실행헤 보기

아래와 같이 코드를 입력하고 버튼을 눌러 보자.

그러면 입력했던 코드의 실행 결과가 바로 아랫줄에 출력된다.

notebook에서 코드 또 입력하고 실행해 보기

play 버튼을 누르게 되면, 연두색(혹은 파란색)으로 선택되어진 곳의 명령이 실행된다. 연두색으로 focus 되어 있는 곳에 다시 명령을 넣고 버튼을 눌러 보자.

아래와 같이 focus 되었던 곳의 코드 실행 결과가 나오는것을 알 수 있다.

notebook에서 markdown으로 문서 작성하기

또한 코드 중간에 설명을 입력해야 하는 경우에는 아래와 같이 markdown 을 이용해서 설명을 입력할 수도 있다.

notebook에서 다음 block 만들기

다음줄에 무언가를 입력하고 싶으면 Insert -> Insert Cell Below 를 눌러 주거나, Alt + Enter 를 치면 된다.

이렇게 한줄, 한줄 코드를 실행 할 수 있게 되어 있어 편리하게 코드를 테스트 해 보면서 작성 할 수 있다. 하지만, 그래도 한줄, 한줄 실행되는것이기 때문에, 이전 block 에서 사용했던 변수들등은 모두 다음줄에 그대로 이어진다. 당연히 stream등을 open 시켜 두었다면, 다음 block에서도 여전히 열려 있는 상태다. 즉, state가 유지 된다는 뜻이다.

notebook에서 Kernel 다시 실행하기

state를 없애고 처음부터 실행되게 하고 싶다면 Kernel -> Restart 혹은 Kernel -> Restart & Clear Output 을 골라 주면 된다. Toolbar에 를 눌러도 된다. 대신 Toolbar에 있는 버튼은 Output이 지워지지 않으니, Kernel -> Restart & Clear Output를 눌러서 하는게 더 좋을 수도...

아무튼 state를 없애기 위해서 Restart를 누르면 아래와 같이 경고 메세지가 뜨고, Restart & clear all outputs를 누르면 된다.

위에서 Restart & clear all outputs를 누른 결과 깔끔하게 정리된 화면을 볼 수 있다.

notebook 끝내기

간단하다. Anaconda Prompt에서 Ctrl + C 를 눌러 주면 된다. 대략 아래와 같이 출력이 되면서 종료 된다.

[I 01:22:27.320 NotebookApp] Interrupted...
[I 01:22:27.326 NotebookApp] Shutting down kernels
[I 01:22:27.946 NotebookApp] Kernel shutdown: 9ff899ca-b515-4080-a7b4-dc5cbb5b6af0

(tf) d:\cjcho\Works\ml\tf>

이제까지 보고 있었던 웹브라우저에서는 더 이상 사용할 수 없다는 에러 메세지를 보여준다.

웹 브라우저 창은 그냥 닫으면 된다.

이제 notebook을 쓸 수 있게 되었다. 더 궁금하면 인터넷에서 더 찾아 보자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 Tensorflow 설치후 notebook 실행 해 보기

블로그에 있는 이전 글인 "Windows 10 64bit 에서 텐서플로우(Tensorflow) 1.0.0 설치하기" 환경에서 시작하므로, 관심이 있으신 분들은 그 게시물을 미리 보고 오는게 더 편하겠다.

notebook?

jupyter는 파이썬 관련 프로그램인데, notebook 이라는게 있다. notebook은 웹 상에서 python 프로그램을 실행해 볼 수 있도록 해 준다. notebook에서 제공하는 가장 좋은 기능은, 프로그램을 작성할때, 혹은 실행할때, 한줄, 한줄 실행해 볼 수 있기 때문에 좋다. 물론 처음 사용할때는 좀 귀찮긴 하지만(사실 나도 전에 한 두번 쓴 적은 있고, 몇 일 전에서야 직접 띄워 봤다. ;; ) 또한 코드를 관리하는 화면에서 markdown으로 문서 작성도 가능하다. 그러므로 튜토리얼 등을 작성할때, 코드와 설명을 동시에 적어 둘 수 있어 참 보기가 좋다.

notebook 실행

우선 Anaconda Prompt를 띄운뒤에, tensorflow 환경으로 전환하기 위해 activate tf를 친 뒤 jupyter notebook를 실행하면 된다. jupyter는 직접 설치한 적이 없는데, tensorflow를 설치 할 때 자동으로 설치 되었기 때문에 사용이 가능한 것이다.

(D:\cjcho\Anaconda3) d:\cjcho\Works\ml\tf>activate tf

(tf) d:\cjcho\Works\ml\tf>jupyter notebook
[I 00:30:32.313 NotebookApp] Serving notebooks from local directory: d:\cjcho\Works\ml\tf
[I 00:30:32.314 NotebookApp] 0 active kernels
[I 00:30:32.314 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:32.314 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 00:30:32.320 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:35.225 NotebookApp] Accepting one-time-token-authenticated connection from ::1

위와 같이 출력 되면서 기다리면 자동으로 웹브라우져가 아래와 같이 뜬다.

notebook 작성하기

이제 이 환경에서 python 파일을 작성해 볼 수 있다. 우리는 notebook 이라는것을 만들어서 python 프로그램을 작성해 볼 것이므로 notebook을 하나 만들어 보자.

New -> Notebooks -> Python 3 를 눌러서 새로운 노트북을 만들어 보자.

아래와 같이 새로운 노트북이 하나 만들어 진다.

notebook에서 코딩

notebook에서 코드 입력하고 실행헤 보기

아래와 같이 코드를 입력하고 버튼을 눌러 보자.

그러면 입력했던 코드의 실행 결과가 바로 아랫줄에 출력된다.

notebook에서 코드 또 입력하고 실행해 보기

play 버튼을 누르게 되면, 연두색(혹은 파란색)으로 선택되어진 곳의 명령이 실행된다. 연두색으로 focus 되어 있는 곳에 다시 명령을 넣고 버튼을 눌러 보자.

아래와 같이 focus 되었던 곳의 코드 실행 결과가 나오는것을 알 수 있다.

notebook에서 markdown으로 문서 작성하기

또한 코드 중간에 설명을 입력해야 하는 경우에는 아래와 같이 markdown 을 이용해서 설명을 입력할 수도 있다.

notebook에서 다음 block 만들기

다음줄에 무언가를 입력하고 싶으면 Insert -> Insert Cell Below 를 눌러 주거나, Alt + Enter 를 치면 된다.

이렇게 한줄, 한줄 코드를 실행 할 수 있게 되어 있어 편리하게 코드를 테스트 해 보면서 작성 할 수 있다. 하지만, 그래도 한줄, 한줄 실행되는것이기 때문에, 이전 block 에서 사용했던 변수들등은 모두 다음줄에 그대로 이어진다. 당연히 stream등을 open 시켜 두었다면, 다음 block에서도 여전히 열려 있는 상태다. 즉, state가 유지 된다는 뜻이다.

notebook에서 Kernel 다시 실행하기

state를 없애고 처음부터 실행되게 하고 싶다면 Kernel -> Restart 혹은 Kernel -> Restart & Clear Output 을 골라 주면 된다. Toolbar에 를 눌러도 된다. 대신 Toolbar에 있는 버튼은 Output이 지워지지 않으니, Kernel -> Restart & Clear Output를 눌러서 하는게 더 좋을 수도...

아무튼 state를 없애기 위해서 Restart를 누르면 아래와 같이 경고 메세지가 뜨고, Restart & clear all outputs를 누르면 된다.

위에서 Restart & clear all outputs를 누른 결과 깔끔하게 정리된 화면을 볼 수 있다.

notebook 끝내기

간단하다. Anaconda Prompt에서 Ctrl + C 를 눌러 주면 된다. 대략 아래와 같이 출력이 되면서 종료 된다.

[I 01:22:27.320 NotebookApp] Interrupted...
[I 01:22:27.326 NotebookApp] Shutting down kernels
[I 01:22:27.946 NotebookApp] Kernel shutdown: 9ff899ca-b515-4080-a7b4-dc5cbb5b6af0

(tf) d:\cjcho\Works\ml\tf>

이제까지 보고 있었던 웹브라우저에서는 더 이상 사용할 수 없다는 에러 메세지를 보여준다.

웹 브라우저 창은 그냥 닫으면 된다.

이제 notebook을 쓸 수 있게 되었다. 더 궁금하면 인터넷에서 더 찾아 보자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 Tensorflow 설치후 notebook 실행 해 보기

블로그에 있는 이전 글인 "Windows 10 64bit 에서 텐서플로우(Tensorflow) 1.0.0 설치하기" 환경에서 시작하므로, 관심이 있으신 분들은 그 게시물을 미리 보고 오는게 더 편하겠다.

notebook?

jupyter는 파이썬 관련 프로그램인데, notebook 이라는게 있다. notebook은 웹 상에서 python 프로그램을 실행해 볼 수 있도록 해 준다. notebook에서 제공하는 가장 좋은 기능은, 프로그램을 작성할때, 혹은 실행할때, 한줄, 한줄 실행해 볼 수 있기 때문에 좋다. 물론 처음 사용할때는 좀 귀찮긴 하지만(사실 나도 전에 한 두번 쓴 적은 있고, 몇 일 전에서야 직접 띄워 봤다. ;; ) 또한 코드를 관리하는 화면에서 markdown으로 문서 작성도 가능하다. 그러므로 튜토리얼 등을 작성할때, 코드와 설명을 동시에 적어 둘 수 있어 참 보기가 좋다.

notebook 실행

우선 Anaconda Prompt를 띄운뒤에, tensorflow 환경으로 전환하기 위해 activate tf를 친 뒤 jupyter notebook를 실행하면 된다. jupyter는 직접 설치한 적이 없는데, tensorflow를 설치 할 때 자동으로 설치 되었기 때문에 사용이 가능한 것이다.

(D:\cjcho\Anaconda3) d:\cjcho\Works\ml\tf>activate tf

(tf) d:\cjcho\Works\ml\tf>jupyter notebook
[I 00:30:32.313 NotebookApp] Serving notebooks from local directory: d:\cjcho\Works\ml\tf
[I 00:30:32.314 NotebookApp] 0 active kernels
[I 00:30:32.314 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:32.314 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 00:30:32.320 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=a958ad4c1a9101d3064d30f50a920e7f15226790a6ac2df0
[I 00:30:35.225 NotebookApp] Accepting one-time-token-authenticated connection from ::1

위와 같이 출력 되면서 기다리면 자동으로 웹브라우져가 아래와 같이 뜬다.

notebook 작성하기

이제 이 환경에서 python 파일을 작성해 볼 수 있다. 우리는 notebook 이라는것을 만들어서 python 프로그램을 작성해 볼 것이므로 notebook을 하나 만들어 보자.

New -> Notebooks -> Python 3 를 눌러서 새로운 노트북을 만들어 보자.

아래와 같이 새로운 노트북이 하나 만들어 진다.

notebook에서 코딩

notebook에서 코드 입력하고 실행헤 보기

아래와 같이 코드를 입력하고 버튼을 눌러 보자.

그러면 입력했던 코드의 실행 결과가 바로 아랫줄에 출력된다.

notebook에서 코드 또 입력하고 실행해 보기

play 버튼을 누르게 되면, 연두색(혹은 파란색)으로 선택되어진 곳의 명령이 실행된다. 연두색으로 focus 되어 있는 곳에 다시 명령을 넣고 버튼을 눌러 보자.

아래와 같이 focus 되었던 곳의 코드 실행 결과가 나오는것을 알 수 있다.

notebook에서 markdown으로 문서 작성하기

또한 코드 중간에 설명을 입력해야 하는 경우에는 아래와 같이 markdown 을 이용해서 설명을 입력할 수도 있다.

notebook에서 다음 block 만들기

다음줄에 무언가를 입력하고 싶으면 Insert -> Insert Cell Below 를 눌러 주거나, Alt + Enter 를 치면 된다.

이렇게 한줄, 한줄 코드를 실행 할 수 있게 되어 있어 편리하게 코드를 테스트 해 보면서 작성 할 수 있다. 하지만, 그래도 한줄, 한줄 실행되는것이기 때문에, 이전 block 에서 사용했던 변수들등은 모두 다음줄에 그대로 이어진다. 당연히 stream등을 open 시켜 두었다면, 다음 block에서도 여전히 열려 있는 상태다. 즉, state가 유지 된다는 뜻이다.

notebook에서 Kernel 다시 실행하기

state를 없애고 처음부터 실행되게 하고 싶다면 Kernel -> Restart 혹은 Kernel -> Restart & Clear Output 을 골라 주면 된다. Toolbar에 를 눌러도 된다. 대신 Toolbar에 있는 버튼은 Output이 지워지지 않으니, Kernel -> Restart & Clear Output를 눌러서 하는게 더 좋을 수도...

아무튼 state를 없애기 위해서 Restart를 누르면 아래와 같이 경고 메세지가 뜨고, Restart & clear all outputs를 누르면 된다.

위에서 Restart & clear all outputs를 누른 결과 깔끔하게 정리된 화면을 볼 수 있다.

notebook 끝내기

간단하다. Anaconda Prompt에서 Ctrl + C 를 눌러 주면 된다. 대략 아래와 같이 출력이 되면서 종료 된다.

[I 01:22:27.320 NotebookApp] Interrupted...
[I 01:22:27.326 NotebookApp] Shutting down kernels
[I 01:22:27.946 NotebookApp] Kernel shutdown: 9ff899ca-b515-4080-a7b4-dc5cbb5b6af0

(tf) d:\cjcho\Works\ml\tf>

이제까지 보고 있었던 웹브라우저에서는 더 이상 사용할 수 없다는 에러 메세지를 보여준다.

웹 브라우저 창은 그냥 닫으면 된다.

이제 notebook을 쓸 수 있게 되었다. 더 궁금하면 인터넷에서 더 찾아 보자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 64bit에서 Tensorflow(텐서플로우) 설치 하기

이제 Windows 10 64bit에서 Tensorflow를 바로 설치해서 사용할 수 있게 되었다. 이전에 리눅스에서 설치 해 봤는데, 너무 귀찮고 뭔가 어려웠다. 특히 그래픽카드 설정하는 부분이 제일 짜증났다. -_- 이제는 걍 Windows 10 에 바로 설치가 되니깐.. 이번 기회에 깔아 보았다.

Python 설치

Tensorflow는 C++, Python API를 제공하고 있고, 실험적이지만 Java API 도 있다고 한다. 여기서는 Python 을 이용해서 해 볼 거다. C++ 이나 Java는 계속 컴파일도 해야 하고 귀찮아 보인다. 대부분의 예제도 Python 으로 만들어져 있으니 당근 Python 으로 가는게 좋은 수순으로 생각된다. Python은 파이썬 공식 홈페이지에서 제공하는 배포판을 설치를 해도 되지만, 머신러닝 하는 사람들은 대부분 Anaconda 라고 하는 비공식 배포판을 이용해서 설치한다. Anaconda에 있는 배포판을 설치하면 아주 많은 라이브러리를 기본적으로 포함하고 있으니. 우리도 Anaconda에 있는 배포판을 사용해서 설치 하도록 하자.

Anaconda 설치

아래의 링크에 들어 가서 Python 3.x 대 버젼을 받도록 하자. ( 예전에는 3.5 였는데, 지금은 3.6 으로 되어 있다. )

설치 방법이야, 그냥 Next 만 열심히 눌러도 잘 된다. Python 관련 PATH 설정까지 자동으로 해 주므로 잘 설치 하도록 하자.

설치시 주의 사항

Python때문인지, Tensorflow 때문인지는 몰라도, 이쪽 세계에서는 설치하는 경로에 공백이나 한글등이 들어가면 동작이 제대로 안 하는 경우가 많다. 그러므로 반드시 공백이나 한글이 없는 경로에 설치 하자. 글쓴이의 경우에는 D:\cjcho\Anaconda3 에 설치 했다.

Tensorflow 설치 하기

Tensorflow를 돌릴 수 있도록 Python은 설치 했으니 Tensorflow를 설치해 보자.

Anaconda 에서 tensorflow를 위한 가상환경 만들기

보통 개발을 하면, 환경 구성을 잘 해 두는데, 이게 이것저것 설치하다 보면 환경이 섞여서 뭔가 꼬이는 경우가 많이 발생한다. 그래서 Python에서는 "가상의 개발 환경"을 여러 프로그램별로 따로 구성해서 쓸 수 있도록 "가상환경"이라는것을 제공해 준다. 보통 virtualenv라는것을 이용해서, 환경을 여러개 만드는데, Anaconda에서는 conda 라는 명령을 이용해서 여러개의 가상환경을 만들 수 있다.

다른 개발 환경과 섞이지 않도록 tensorflow 만을 위해 독립적인 환경을 따로 만들도록 하자. conda 관련 명령을 실행 시키기 위해서 anaconda prompt를 실행 시키자. Windows 키를 누른뒤에 anaconda prompt라고 치면 나온다.

프롬프트의 앞에 (D:\cjcho\Anaconda3) 라고 뜨는것은 현재 사용중인 환경의 이름을 나타낸다.

conda info --envs 명령을 이용해서 현재 만들어진 가상 환경을 확인해 보자. 글쓴이의 경우에는 이미 만들어진 환경이 있어 아래와 같이 여러개의 환경이 나온다.

(D:\cjcho\Anaconda3) C:\Users\magic>conda info --envs
# conda environments:
#
bunnies                  D:\cjcho\Anaconda3\envs\bunnies
snowflakes               D:\cjcho\Anaconda3\envs\snowflakes
tf_gpu                   D:\cjcho\Anaconda3\envs\tf_gpu
root                  *  D:\cjcho\Anaconda3

(D:\cjcho\Anaconda3) C:\Users\magic>

Windows 10에서 동작하는 tensorflow는 python 3.5를 지원하므로 python은 3.5로 지정해서 python 환경을 먼저 만들어야 한다. 이 환경 이름을 tf 라고하자. conda create --name tf python=3.5 라는 명령을 이용하면 python 3.5를 기반으로 하는 tf라는 환경을 만들 수 있다.

(D:\cjcho\Anaconda3) C:\Users\magic>conda create --name tf python=3.5
Fetching package metadata .............
Solving package specifications: .
Package plan for installation in environment D:\cjcho\Anaconda3\envs\tf:

The following NEW packages will be INSTALLED:

    certifi:        2017.1.23-py35_0 conda-forge
    pip:            9.0.1-py35_0     conda-forge
    python:         3.5.3-1          conda-forge
    setuptools:     33.1.0-py35_0    conda-forge
    vs2015_runtime: 14.0.25420-0     conda-forge
    wheel:          0.29.0-py35_0    conda-forge

wincertstore:   0.2-py35_0       conda-forge

Proceed ([y]/n)? y

python-3.5.3-1 100% |###############################| Time: 0:00:32 545.45 kB/s
#
# To activate this environment, use:
# > activate tf
#
# To deactivate this environment, use:
# > deactivate tf
#
# * for power-users using bash, you must source
#

(D:\cjcho\Anaconda3) C:\Users\magic>

tensorflow를 동작시킬 tf 라는 Python 3.5 환경을 만들었으니, activate tf 라는 명령으로 tf 환경 안으로 들어 가자.

(D:\cjcho\Anaconda3) C:\Users\magic>activate tf

(tf) C:\Users\magic>

tf라는 환경으로 진입했다. tf라는 환경에 python 3.5가 제대로 설치 되어 있는지도 확인하고 어떤 라이브러리(?)들이 설치 되어 있는지도 확인하자. conda list라는 명령을 사용하면 된다.

(tf) C:\Users\magic>conda list
# packages in environment at D:\cjcho\Anaconda3\envs\tf:
#
certifi                   2017.1.23                py35_0    conda-forge
pip                       9.0.1                    py35_0    conda-forge
python                    3.5.3                         1    conda-forge
setuptools                33.1.0                   py35_0    conda-forge
vs2015_runtime            14.0.25420                    0    conda-forge
wheel                     0.29.0                   py35_0    conda-forge
wincertstore              0.2                      py35_0    conda-forge

(tf) C:\Users\magic>

위에 보다시피 python 3.5가 제대로 설치 된 것을 볼 수 있다.

가상환경에 tensorflow 설치 하기

tensorflow를 설치할때 CPU용을 설치 할 것인지 GPU 용을 설치 할 것인지를 정해야 한다.

가상환경에 tensorflow 설치 하기 / CPU 용

보통 anaconda에서는 conda install 이라는 명령을 통해서 패키지를 설치하게 되는데, Tensorflow 공식 가이드에서는 pip를 이용해서 설치 하도록 하고 있다. tensorflow는 CPU 버젼과 GPU 버젼이 따로 있는데, pip라는것을 이용하는 방법만이 CPU와 GPU 두가지를 모두를 제공하고 있다. conda install방식을 사용하면 CPU 버젼만 사용할 수 있다. CPU 버젼 설치는pip를 사용하지 않고 걍 conda install명령으로 설치해 볼 것이다. anaconda는 이미 tensorflow를 Windows 에서 설치 할 수 있도록 패키징 해 두었다. https://anaconda.org/ 에 접속해서 tensorflow 라고 검색을 해 보자.

  • 중요 : Tensorflow 팀에서는 Anaconda를 이용한 설치 방법에 대해서는 관라하지도 않을것이고, 확인하지도 않을 것이라고 했다. 그러므로 pip를 이용하는 방법이 더 좋겠으나, 여기서 CPU 버전은 그냥 conda 방식을 이용해서 보여 주도록 한다. 어차피 GPU 방식은 pip를 이용해서 설치해야 한다.

아래와 같이 이미 패키징 된 것들을 많이 볼 수 있다.

conda-forge가 anaconda의 기본 패키징 저장소이므로, 우리는 conda-forge / tensorflow 를 클릭해서 들어 가 보도록 하자. 그러면 아래와 같이 어떤 명령을 치면 tensorflow를 설치할 수 있는지 알 수 있다.

아까 tf환경으로 들어 가 있던 프롬프트에서 conda install -c conda-forge tensorflow=1.0.0 명령을 이용해 설치 하도록 하자.

만약 Tensorflow 공식 가이드대로 pip로 설치 하고 싶다면 pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_x86_64.whl 를 쳐 넣으면 된다. 혹시 이렇게 해서 설치가 안되면, 파일명의 제일 뒤를 _x86_64.whl 라고 하지 말고, _amd64.whl 이라고 바꿔보자. 얼마전까지만 해도 링크가 깨졌는지, 제대로 동작하지 않았었다.

아래 메세지들은 0.12.1 버젼을 기준으로 캡쳐 된 것이다. 그러므로 1.0.0 으로 설치를 하면 조금 다른 내용이 나올 것이다.

(tf) C:\Users\magic>conda install -c conda-forge tensorflow=0.12.1
Fetching package metadata .............

Solving package specifications: .

Package plan for installation in environment D:\cjcho\Anaconda3\envs\tf:

The following NEW packages will be INSTALLED:

    mkl:        2017.0.1-0
    mock:       2.0.0-py35_0      conda-forge
    numpy:      1.12.0-py35_0
    pbr:        1.10.0-py35_0     conda-forge
    protobuf:   3.1.0-py35_vc14_0 conda-forge [vc14]
    six:        1.10.0-py35_1     conda-forge
    tensorflow: 0.12.1-py35_2     conda-forge

zlib:       1.2.11-vc14_0     conda-forge [vc14]

Proceed ([y]/n)? y

numpy-1.12.0-p 100% |###############################| Time: 0:00:01   3.69 MB/s

tensorflow-0.1 100% |###############################| Time: 0:01:26 178.02 kB/s

(tf) C:\Users\magic>

가상환경에 tensorflow 설치 하기 / GPU 용

주의사항 : GPU용은 NVIDIA CUDA 8.0 이상을 지원하는 GPU만을 사용할 수 있다. 만약 지원하지 않는 GPU라면 이 과정을 거쳐도 사용할 수 없으니. 깔끔하게 포기하자.

아래 두 툴킷을 설치해야 한다. 이 툴킷들은 NVIDIA에서 제공하는 프로그램이고, 자신의 GPU에서 아래 버젼의 툴킷을 사용할 수 있는지 확인되어야 한다. 참고로 GTX 670의 경우 아래의 두 툴킷을 모두 사용할 수 있는 환경이었다.

NVIDIA 홈페이지에 접근해서, 가입하고... 동의한 뒤에... 다운 받아 설치해야 한다.

위 툴킷을 설치하고 하고 난 뒤 tensorflow를 설치하면 된다.

GPU 환경을 사용하기 위한 tensorflow는 conda 방식으로 설치할 수 없다.. 그러므로 pip 방식을 통해서 설치해야 한다. 아래의 명령을 이용해서 tensorflow 를 설치 할 수 있다.

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.0.0-cp35-cp35m-win_x86_64.whl 

CPU 버전을 pip로 설치할 때와 마찬가지로 해당 패키지를 찾을 수 없을때 URL의 끝 부분을 _x86_64.whl 대신 _amd64.whl로 바꿔서 해 보면 잘 될 수도 있다.

설치에는 좀 오래 걸리니깐 기다려야 한다. cuDNN 및 CUDA에 있는 몇가지 헤더 파일을 복사 하던지.. 무 그런 작업이 있다... 지금은 생각나지 않으니 통과...;; 아래 내용을 계속 진행하다 보면 문제가 생길 수 있는데, 그 상황에 맞게 인터넷에 찾아보면 어렵지 않게 문제를 해결 할 수 있다. ;; 구찬 ;;

Tensorflow가 잘 동작하는지 확인

간단 코드 확인

이하는 CPU 버젼에서 확인한 내용이다.

간단한 코드를 짜서 잘 동작하는지 확인해 보자.

(tf) C:\Users\magic>python
Python 3.5.3 | packaged by conda-forge | (default, Feb  9 2017, 15:12:38) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, Tensorflow!')
>>> sess = tf.Session()
>>> print (sess.run(hello))
b'Hello, Tensorflow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a+b))
42
>>> quit()

(tf) C:\Users\magic>

머신러닝 돌려서 확인하기

이 쪽 세계에는 손글씨를 인식하는 MNIST라는 유명한게 있다. 이것을 이용해서 tensorflow를 테스트 해 보자. tensorflow는 기본적인 예제(?)들을 포함하고 있는데, 간단한 명령 하나로 테스트 해 볼 수 있다. 우선 tensorflow가 어디에 설치 되어 있는지 확인하자. python -c "import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))" 명령을 이용하면 된다. 가이드 문서에는 " 가 아니라 '로 되어 있는데, Windows에서는 ' 대신 "를 사용해야 한다.

(tf) C:\Users\magic>python -c "import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))"
D:\cjcho\Anaconda3\envs\tf\lib\site-packages\tensorflow

(tf) C:\Users\magic>

위에 나온 경로에서 models\image\minist\ 디렉토리에 가면 convolutional.py 파일이 있다. 이게 바로 예제이다.

python -m tensorflow.models.image.mnist.convolutional 명령을 이용해서 잘 동작하는지 확인해 보자.

(tf) C:\Users\magic>python -m tensorflow.models.image.mnist.convolutional
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data\train-images-idx3-ubyte.gz
Extracting data\train-labels-idx1-ubyte.gz
Extracting data\t10k-images-idx3-ubyte.gz
Extracting data\t10k-labels-idx1-ubyte.gz
Initialized!
Step 0 (epoch 0.00), 5.6 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 295.2 ms
Minibatch loss: 3.254, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.8%
....
....

시간이 꽤나 오래 걸릴것이다.

속도 차이

집에 마침 NVIDIA GPU가 있어서, CPU와 GPU를 버젼을 모두 설치해서 테스트 해 보았다.

CPU : 1590초(26분정도), Intel Core it 3570K, 3.40GHz, 4 core
GPU :  140초( 2분정도), Nvidia GTX 670

NVIDIA GTX 670이 꽤나 오래 전에 나온 GPU인데도, CPU보다 10배 가까이 빠르다.

그렇다. 이제 NVIDIA GPU를 구매하러 가자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Windows 10 64bit에서 Tensorflow(텐서플로우) 설치 하기

이제 Windows 10 64bit에서 Tensorflow를 바로 설치해서 사용할 수 있게 되었다. 이전에 리눅스에서 설치 해 봤는데, 너무 귀찮고 뭔가 어려웠다. 특히 그래픽카드 설정하는 부분이 제일 짜증났다. -_- 이제는 걍 Windows 10 에 바로 설치가 되니깐.. 이번 기회에 깔아 보았다.

Python 설치

Tensorflow는 C++, Python API를 제공하고 있고, 실험적이지만 Java API 도 있다고 한다. 여기서는 Python 을 이용해서 해 볼 거다. C++ 이나 Java는 계속 컴파일도 해야 하고 귀찮아 보인다. 대부분의 예제도 Python 으로 만들어져 있으니 당근 Python 으로 가는게 좋은 수순으로 생각된다. Python은 파이썬 공식 홈페이지에서 제공하는 배포판을 설치를 해도 되지만, 머신러닝 하는 사람들은 대부분 Anaconda 라고 하는 비공식 배포판을 이용해서 설치한다. Anaconda에 있는 배포판을 설치하면 아주 많은 라이브러리를 기본적으로 포함하고 있으니. 우리도 Anaconda에 있는 배포판을 사용해서 설치 하도록 하자.

Anaconda 설치

아래의 링크에 들어 가서 Python 3.x 대 버젼을 받도록 하자. ( 예전에는 3.5 였는데, 지금은 3.6 으로 되어 있다. )

설치 방법이야, 그냥 Next 만 열심히 눌러도 잘 된다. Python 관련 PATH 설정까지 자동으로 해 주므로 잘 설치 하도록 하자.

설치시 주의 사항

Python때문인지, Tensorflow 때문인지는 몰라도, 이쪽 세계에서는 설치하는 경로에 공백이나 한글등이 들어가면 동작이 제대로 안 하는 경우가 많다. 그러므로 반드시 공백이나 한글이 없는 경로에 설치 하자. 글쓴이의 경우에는 D:\cjcho\Anaconda3 에 설치 했다.

Tensorflow 설치 하기

Tensorflow를 돌릴 수 있도록 Python은 설치 했으니 Tensorflow를 설치해 보자.

Anaconda 에서 tensorflow를 위한 가상환경 만들기

보통 개발을 하면, 환경 구성을 잘 해 두는데, 이게 이것저것 설치하다 보면 환경이 섞여서 뭔가 꼬이는 경우가 많이 발생한다. 그래서 Python에서는 "가상의 개발 환경"을 여러 프로그램별로 따로 구성해서 쓸 수 있도록 "가상환경"이라는것을 제공해 준다. 보통 virtualenv라는것을 이용해서, 환경을 여러개 만드는데, Anaconda에서는 conda 라는 명령을 이용해서 여러개의 가상환경을 만들 수 있다.

다른 개발 환경과 섞이지 않도록 tensorflow 만을 위해 독립적인 환경을 따로 만들도록 하자. conda 관련 명령을 실행 시키기 위해서 anaconda prompt를 실행 시키자. Windows 키를 누른뒤에 anaconda prompt라고 치면 나온다.

프롬프트의 앞에 (D:\cjcho\Anaconda3) 라고 뜨는것은 현재 사용중인 환경의 이름을 나타낸다.

conda info --envs 명령을 이용해서 현재 만들어진 가상 환경을 확인해 보자. 글쓴이의 경우에는 이미 만들어진 환경이 있어 아래와 같이 여러개의 환경이 나온다.

(D:\cjcho\Anaconda3) C:\Users\magic>conda info --envs
# conda environments:
#
bunnies                  D:\cjcho\Anaconda3\envs\bunnies
snowflakes               D:\cjcho\Anaconda3\envs\snowflakes
tf_gpu                   D:\cjcho\Anaconda3\envs\tf_gpu
root                  *  D:\cjcho\Anaconda3

(D:\cjcho\Anaconda3) C:\Users\magic>

Windows 10에서 동작하는 tensorflow는 python 3.5를 지원하므로 python은 3.5로 지정해서 python 환경을 먼저 만들어야 한다. 이 환경 이름을 tf 라고하자. conda create --name tf python=3.5 라는 명령을 이용하면 python 3.5를 기반으로 하는 tf라는 환경을 만들 수 있다.

(D:\cjcho\Anaconda3) C:\Users\magic>conda create --name tf python=3.5
Fetching package metadata .............
Solving package specifications: .
Package plan for installation in environment D:\cjcho\Anaconda3\envs\tf:

The following NEW packages will be INSTALLED:

    certifi:        2017.1.23-py35_0 conda-forge
    pip:            9.0.1-py35_0     conda-forge
    python:         3.5.3-1          conda-forge
    setuptools:     33.1.0-py35_0    conda-forge
    vs2015_runtime: 14.0.25420-0     conda-forge
    wheel:          0.29.0-py35_0    conda-forge

wincertstore:   0.2-py35_0       conda-forge

Proceed ([y]/n)? y

python-3.5.3-1 100% |###############################| Time: 0:00:32 545.45 kB/s
#
# To activate this environment, use:
# > activate tf
#
# To deactivate this environment, use:
# > deactivate tf
#
# * for power-users using bash, you must source
#

(D:\cjcho\Anaconda3) C:\Users\magic>

tensorflow를 동작시킬 tf 라는 Python 3.5 환경을 만들었으니, activate tf 라는 명령으로 tf 환경 안으로 들어 가자.

(D:\cjcho\Anaconda3) C:\Users\magic>activate tf

(tf) C:\Users\magic>

tf라는 환경으로 진입했다. tf라는 환경에 python 3.5가 제대로 설치 되어 있는지도 확인하고 어떤 라이브러리(?)들이 설치 되어 있는지도 확인하자. conda list라는 명령을 사용하면 된다.

(tf) C:\Users\magic>conda list
# packages in environment at D:\cjcho\Anaconda3\envs\tf:
#
certifi                   2017.1.23                py35_0    conda-forge
pip                       9.0.1                    py35_0    conda-forge
python                    3.5.3                         1    conda-forge
setuptools                33.1.0                   py35_0    conda-forge
vs2015_runtime            14.0.25420                    0    conda-forge
wheel                     0.29.0                   py35_0    conda-forge
wincertstore              0.2                      py35_0    conda-forge

(tf) C:\Users\magic>

위에 보다시피 python 3.5가 제대로 설치 된 것을 볼 수 있다.

가상환경에 tensorflow 설치 하기

tensorflow를 설치할때 CPU용을 설치 할 것인지 GPU 용을 설치 할 것인지를 정해야 한다.

가상환경에 tensorflow 설치 하기 / CPU 용

보통 anaconda에서는 conda install 이라는 명령을 통해서 패키지를 설치하게 되는데, Tensorflow 공식 가이드에서는 pip를 이용해서 설치 하도록 하고 있다. tensorflow는 CPU 버젼과 GPU 버젼이 따로 있는데, pip라는것을 이용하는 방법만이 CPU와 GPU 두가지를 모두를 제공하고 있다. conda install방식을 사용하면 CPU 버젼만 사용할 수 있다. CPU 버젼 설치는pip를 사용하지 않고 걍 conda install명령으로 설치해 볼 것이다. anaconda는 이미 tensorflow를 Windows 에서 설치 할 수 있도록 패키징 해 두었다. https://anaconda.org/ 에 접속해서 tensorflow 라고 검색을 해 보자.

  • 중요 : Tensorflow 팀에서는 Anaconda를 이용한 설치 방법에 대해서는 관라하지도 않을것이고, 확인하지도 않을 것이라고 했다. 그러므로 pip를 이용하는 방법이 더 좋겠으나, 여기서 CPU 버전은 그냥 conda 방식을 이용해서 보여 주도록 한다. 어차피 GPU 방식은 pip를 이용해서 설치해야 한다.

아래와 같이 이미 패키징 된 것들을 많이 볼 수 있다.

conda-forge가 anaconda의 기본 패키징 저장소이므로, 우리는 conda-forge / tensorflow 를 클릭해서 들어 가 보도록 하자. 그러면 아래와 같이 어떤 명령을 치면 tensorflow를 설치할 수 있는지 알 수 있다.

아까 tf환경으로 들어 가 있던 프롬프트에서 conda install -c conda-forge tensorflow=1.0.0 명령을 이용해 설치 하도록 하자.

만약 Tensorflow 공식 가이드대로 pip로 설치 하고 싶다면 pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_x86_64.whl 를 쳐 넣으면 된다. 혹시 이렇게 해서 설치가 안되면, 파일명의 제일 뒤를 _x86_64.whl 라고 하지 말고, _amd64.whl 이라고 바꿔보자. 얼마전까지만 해도 링크가 깨졌는지, 제대로 동작하지 않았었다.

아래 메세지들은 0.12.1 버젼을 기준으로 캡쳐 된 것이다. 그러므로 1.0.0 으로 설치를 하면 조금 다른 내용이 나올 것이다.

(tf) C:\Users\magic>conda install -c conda-forge tensorflow=0.12.1
Fetching package metadata .............

Solving package specifications: .

Package plan for installation in environment D:\cjcho\Anaconda3\envs\tf:

The following NEW packages will be INSTALLED:

    mkl:        2017.0.1-0
    mock:       2.0.0-py35_0      conda-forge
    numpy:      1.12.0-py35_0
    pbr:        1.10.0-py35_0     conda-forge
    protobuf:   3.1.0-py35_vc14_0 conda-forge [vc14]
    six:        1.10.0-py35_1     conda-forge
    tensorflow: 0.12.1-py35_2     conda-forge

zlib:       1.2.11-vc14_0     conda-forge [vc14]

Proceed ([y]/n)? y

numpy-1.12.0-p 100% |###############################| Time: 0:00:01   3.69 MB/s

tensorflow-0.1 100% |###############################| Time: 0:01:26 178.02 kB/s

(tf) C:\Users\magic>

가상환경에 tensorflow 설치 하기 / GPU 용

주의사항 : GPU용은 NVIDIA CUDA 8.0 이상을 지원하는 GPU만을 사용할 수 있다. 만약 지원하지 않는 GPU라면 이 과정을 거쳐도 사용할 수 없으니. 깔끔하게 포기하자.

아래 두 툴킷을 설치해야 한다. 이 툴킷들은 NVIDIA에서 제공하는 프로그램이고, 자신의 GPU에서 아래 버젼의 툴킷을 사용할 수 있는지 확인되어야 한다. 참고로 GTX 670의 경우 아래의 두 툴킷을 모두 사용할 수 있는 환경이었다.

NVIDIA 홈페이지에 접근해서, 가입하고... 동의한 뒤에... 다운 받아 설치해야 한다.

위 툴킷을 설치하고 하고 난 뒤 tensorflow를 설치하면 된다.

GPU 환경을 사용하기 위한 tensorflow는 conda 방식으로 설치할 수 없다.. 그러므로 pip 방식을 통해서 설치해야 한다. 아래의 명령을 이용해서 tensorflow 를 설치 할 수 있다.

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.0.0-cp35-cp35m-win_x86_64.whl 

CPU 버전을 pip로 설치할 때와 마찬가지로 해당 패키지를 찾을 수 없을때 URL의 끝 부분을 _x86_64.whl 대신 _amd64.whl로 바꿔서 해 보면 잘 될 수도 있다.

설치에는 좀 오래 걸리니깐 기다려야 한다. cuDNN 및 CUDA에 있는 몇가지 헤더 파일을 복사 하던지.. 무 그런 작업이 있다... 지금은 생각나지 않으니 통과...;; 아래 내용을 계속 진행하다 보면 문제가 생길 수 있는데, 그 상황에 맞게 인터넷에 찾아보면 어렵지 않게 문제를 해결 할 수 있다. ;; 구찬 ;;

Tensorflow가 잘 동작하는지 확인

간단 코드 확인

이하는 CPU 버젼에서 확인한 내용이다.

간단한 코드를 짜서 잘 동작하는지 확인해 보자.

(tf) C:\Users\magic>python
Python 3.5.3 | packaged by conda-forge | (default, Feb  9 2017, 15:12:38) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, Tensorflow!')
>>> sess = tf.Session()
>>> print (sess.run(hello))
b'Hello, Tensorflow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a+b))
42
>>> quit()

(tf) C:\Users\magic>

머신러닝 돌려서 확인하기

이 쪽 세계에는 손글씨를 인식하는 MNIST라는 유명한게 있다. 이것을 이용해서 tensorflow를 테스트 해 보자. tensorflow는 기본적인 예제(?)들을 포함하고 있는데, 간단한 명령 하나로 테스트 해 볼 수 있다. 우선 tensorflow가 어디에 설치 되어 있는지 확인하자. python -c "import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))" 명령을 이용하면 된다. 가이드 문서에는 " 가 아니라 '로 되어 있는데, Windows에서는 ' 대신 "를 사용해야 한다.

(tf) C:\Users\magic>python -c "import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))"
D:\cjcho\Anaconda3\envs\tf\lib\site-packages\tensorflow

(tf) C:\Users\magic>

위에 나온 경로에서 models\image\minist\ 디렉토리에 가면 convolutional.py 파일이 있다. 이게 바로 예제이다.

python -m tensorflow.models.image.mnist.convolutional 명령을 이용해서 잘 동작하는지 확인해 보자.

(tf) C:\Users\magic>python -m tensorflow.models.image.mnist.convolutional
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data\train-images-idx3-ubyte.gz
Extracting data\train-labels-idx1-ubyte.gz
Extracting data\t10k-images-idx3-ubyte.gz
Extracting data\t10k-labels-idx1-ubyte.gz
Initialized!
Step 0 (epoch 0.00), 5.6 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 295.2 ms
Minibatch loss: 3.254, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.8%
....
....

시간이 꽤나 오래 걸릴것이다.

속도 차이

집에 마침 NVIDIA GPU가 있어서, CPU와 GPU를 버젼을 모두 설치해서 테스트 해 보았다.

CPU : 1590초(26분정도), Intel Core it 3570K, 3.40GHz, 4 core
GPU :  140초( 2분정도), Nvidia GTX 670

NVIDIA GTX 670이 꽤나 오래 전에 나온 GPU인데도, CPU보다 10배 가까이 빠르다.

그렇다. 이제 NVIDIA GPU를 구매하러 가자.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Facebook에서 Android dex를 압축(?) 해 주는 툴을 만들어 두었는데, 이것의 이름이 ReDex다.


https://github.com/facebook/redex


Docker로 Ubuntu 14.04 container를  만들고, 위 링크에 있는 가이드 문서대로 따라 했지만 문제가 발생했다.

몇 가지 빠진 부분이 있어 내가 했었던 작업의 기록을 남겨 둔다.

( 이 과정을 Dockerfile로 만들면 좋겠지만, 귀찮아서 통과 )



1. Ubuntu 14.04 로 Docker Container 만들기 

docker run -i -t --name ubuntu14.04_redex ubuntu:14.04 /bin/bash



2. 디렉토리 이동 ( root의 home directory에 모든것을 설치할 예정 )

cd ~



3. redex 가이드 문서에 Ubuntu 14.04 부분을 실행하기 전에 아래의 것을 먼저 실행해야 한다.

redex 설치 및 사용할 때, 그리고 인터넷에서 android sdk 를 다운로드 받을 때 필요하다.

apt-get update

apt-get install curl

apt-get install unzip

apt-get install openjdk-7-jdk

apt-get install wget



4. android sdk를 먼저 설치해야 한다. ( 아래 과정 중 test 과정에서 java를 컴파일 하고, 이를 dx로 묶는 과정이 있다. )

wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz 

tar zxvf android-sdk_r24.4.1-linux.tgz 

cd android-sdk-linux

tools/android update sdk --no-ui

( 이후 라이센스에 동의하라고 하면 y를 눌러 주면 된다. 혹시 화면이 멈추면 엔터를 한번 쳐 주면 라이센스 동의 문구가 나온다. )

tools/android update sdk -u -a -t 4,5

( 상황에 따라서 뒤에 있는 숫자인 4,5 를 바꿔야 하는 경우도 있다. 숫자에 맞는 version을 다운받게 된다. 목록을 알고 싶다면 tools/android list sdk -a -u 를 쳐서 번호를 확인하도록 하자. 여기서는 23.0.3을 사용한다. 24는 java version 8이 필요하기 때문에 openjdk 7으로 실행할 수 없다. )



5. ~/.bashrc 파일의 제일 아래쪽에 아래 내용을 추가하도록 하자. ( vi ~/.bashrc ) 

ANDROID_SDK=/root/android-sdk-linux/

PATH=$PATH:/root/android-sdk-linux/build-tools/23.0.3/:



6. 이후 bashrc 파일에 넣어 둔 환경을 현재 터미널에도 적용하기 위해 source 명령으로 상태를 업데이트 해 준다.

source ~/.bashrc



7. redex 가이드 문서에 따라서 각종 tool 다운로드 및 설치 ( 이하의 과정은 달라졌을 수도 있으니, 공식 홈페이지에 가이드 문서를 반드시 다시 확인하자. )

sudo apt-get install \
    g++ \
    automake \
    autoconf \
    autoconf-archive \
    libtool \
    libboost-all-dev \
    libevent-dev \
    libdouble-conversion-dev \
    libgoogle-glog-dev \
    libgflags-dev \
    liblz4-dev \
    liblzma-dev \
    libsnappy-dev \
    make \
    zlib1g-dev \
    binutils-dev \
    libjemalloc-dev \
    libssl-dev \
    libiberty-dev \
    libjsoncpp-dev



8. redex 가이드 문서에 따라서 다운로드, 빌드, 설치

git clone https://github.com/facebook/redex.git

cd redex

autoreconf -ivf && ./configure && make

sudo make install



9. 설치가 다 되었으면 잘 동작하는지 체크 한다.

./test/setup.sh

cd test

make check

근데 여기서 에러가 난다.. 이유는 모르겠음.. ;; 요건 무시해도 된다.



10. 이후 redex 명령을 이용해서 apk를 redex 시킬 수 있다.

( 만약 zipalign 문제가 생기면, 위에 설명한 환경 설정이 제대로 안 된 것이다. ./bashrc 파일에 ANDROID_SDK를 확인해 보도록 하자. )

redex a.apk -o a.redex.apk




그 결과 다음과 같은 결과를 얻었다.

c.apk -> c.redex.apk : 44.8M -> 44.5M

s.apk -> s.redex.apk : 39.8M -> 39.4M

w.apk -> w.redex.apk : 38.4M -> 38.1M

t.apk -> t.redex.apk : 33.8M -> 33.4M

원본 apk는 이미 proguard를 거친 뒤였음에도 약 250kb ~ 400kb 정도 용량이 줄어 들었다.

( 실제로 동작하는지는 확인하지 않았다 ;; ㅎㅎ )


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 발자국 2016.10.21 00:07 신고

    빠른나이는 아니지만 뒤늦게 프로그래밍에 재미를 찾아 공부하고있는 백수입니다.
    검색중에 들렸습니다.
    2003년부터 올해까지 꾸준히 공부하시고 포스팅 하신 흔적보고 감동받아 이렇게 덧글 작성해봅니다.
    존경합니다!!

    • 2016.12.20 12:01 신고

      오랫동안 관리되지 않던 블로그라 부끄럽습니다. 즐거운 나날들 보내세요~

자바스크립트를 공부하기로 했다.

그래서 책을 구매하려고 보니.. 제일 유명한게 "자바스크립트 완벽 가이드".

그런데.. 5e은.. 잘못 번역되어 있는게 너무 많아.. 욕을 꽤나 먹는 상황.


마침 3월 말에, 6e이 나와서.. 이 책을 구매 했다.


하지만, 여전히 몇가지 잘못 된 부분이 보여. 이곳에 정리하고자 한다.

인사이트에 올려두면 더 좋겠지만. 오랜만에 내 블로그에 글도 좀 적고..

꾸준히 공부하는 내용도 정리 좀 하고... 할 겸.


내용은 발견하는대로 귀찮지 않으면 업데이트 할 예정이다.



8페이지 중간 부분 수정


var square = function(x); { // 여기서 함수는 값이 되고, 변수 square에 할당된다.

var square = function(x) { // 여기서 함수는 값이 되고, 변수 square에 할당된다.


; 를 제거해야 한다.


9페이지 윗부분 수정


function abs(x) {    // 절대 값을 계산하는 함수를 정의한다.

    if ( x>= 0 ) {   // 괄호 안의 표현식 값이 참이면

        return x;    // if 절 안의 코드를 실행한다.

}                    // if 절의 끝을 나타낸다.

function abs(x) {    // 절대 값을 계산하는 함수를 정의한다.

    if ( x>= 0 ) {   // 괄호 안의 표현식 값이 참이면

        return x;    // if 절 안의 코드를 실행한다.

   }                 // if 절의 끝을 나타낸다


로 괄호의 위치가 잘못 되었다.


53페이지에서 String Warpper 객체 및 동작에 대한 설명 추가


var s = "test"; // 이 문자열을 사용한다.

s.len = 4;      // 문자열 프로퍼티에 값을 할당한다.

var t = s.len;  // 프로퍼티를 참조하라.


이 코드를 실행해 보면 t 값은 undefined이다. 2행은 생성된 임시 String 객체의 len프로퍼티에 4를 할당한다. 그리고 임시 객체는 바로 삭제 된다. 3행은 기존 문자열 값과 같은 값을 가진 새로운 String 객체를 생성하고 len 프로퍼티를 읽으려고 한다. 이 프로퍼티는 존재하지 않아서 undefined로 평가된다. ... 문자열이나 숫자, 불리언 값에서 프로퍼티(혹은 메서드)의 값을 읽으려고 할 때, 문자열, 숫자, 불리언 값이 객체처럼 동작하는 것을 보여준다. ... 값을 할당하는 것은 임시 객체에서 수행되며, 지속되지 않는다.


위의 문장을 이해하기 어려웠는데, 52 페이지에서 마지막에 설명된 내용과 53페이지의 마지막 내용을 잘 읽어보면 이해할 수 있다.


// javascript 에서 s 는 test라는 값을 가지는 단순한 문자열 리터럴일뿐이다.

var s = "test";


// javascript 에서 s의 프로퍼티에 접근하는 순간, s를 String 객체로 만든 뒤에 처리한다. 그 후 사용하고 난 String객체는 버린다.

s.indexOf(" ");   


// 위의 문장은 아마도 내부에서는 

// var anonymousStringObject = new String(s); 

// anonymousStringObject.indexOf(" ");

// 

// anonymousStringObject = undefined; 

// 또는 anonymousStringObject = (function () { return; })(); 로

// 처리가 될 듯 함.


// java 에서 "test" 자체가 String object이다. variable의 type역시 String class으로 받게 된다.

// java

String str = "test";


// 하지만 javascript에서는 "string"이라는 type이 따로 있고, new String(..)으로 정의할 수 있는 String object가 따로 있다.

// javascript

//

// typeof("AA") : "string"

//

// var str = new String("AA");

// typeof(str) : "object"





 63 페이지 중간 부분(3번째 단락)


+와 == 연산자는 객체를 원시 타입으로 변환할 때 Data 타입 객체는 특별하게 취급한다.

 +와 == 연산자는 객체를 원시 타입으로 변환할 때 Date 타입 객체는 특별하게 취급한다.


로 Data를 Date로 변경해야 한다.



 63 페이지 중간 부분 Date 동작이 특이한 점


javascript에서 객체타입이 원시타입으로 변환 될 때는, 기본적으로 객체에서 숫자로의 변환이다. 이 떄는 valueOf()가 사용된다. Date 객체가 참 특이하게, +와 == 연산자랑 같이 사용 할 때는 toString()이 사용되어 string type으로 변환되고, 나머지인 < 나 -(빼기) 등의 연산자랑 같이 사용 할 때는 valueOf()이 사용된다.



 66 페이지 두번째 소스 들여쓰기 잘못.


var scope = "global scope";


function checkscope() {

    var scope = "local scope";

        function nested() {

            var scope = "nested scope";

            return scope;

        }

    return nested();

}

checkscope();


var scope = "global scope";


function checkscope() {

    var scope = "local scope";

    function nested() {

        var scope = "nested scope";

        return scope;

    }

    return nested();

}

checkscope();


와 같이 들여쓰기가 잘못되었음.



 66 페이지 마지막 예제... 자바스크립트알못이지만... 설명이 애매하다... 또한, 들여쓰기도 잘못되어 있다.


function test(o) {

    var i = 0;

    if ( typeof o == "object") {

        var j = 0;

        for ( var k=0; k < 10 ; k++ ) {

            console.log(k);

        }

        console.log(k);

    }

    console.log(j);   // j는 정의되어 있고, 초기화 되어 있지 않을 것이다.

}



해당 부분은 javascript의 특징인 hoisting 을 설명하는 부분이다. hoisting이란, 변수의 정의 및 할당이 실제 코드의 순서에서 아랫쪽에 되어 있다고 하더라고, 해당 변수의 정의를 상단으로 끌어 올린것으로 처리 된다는 설명이다. 또한, javascript에서는 변수의 scope가 블록 기호인 { } 로 묶이는 부분에 대해서 scope를 가지는것이 아니라, 함수 전체에 영향을 받는것으로 되어 있다.


예제에는 j라는 변수가 if 문 안에서 정의되어 있으나, console.log(j)에서도 j의 선언부가 hoisting 되어서 접근이 가능하다는것을 표현하고 싶었던것 같은데, 그렇다면 parameter로 받는 o의 상태에 따라 j가 0이 될 수도 있고, undefined 상태일 수도 있다고 설명을 좀 더 정확하게 적었어야 했다.


hoisting 상태를 고려한다면 위의 코드는 아래와 같이 변할 것으로 예상된다.



function test(o) {

    var i = 0;

    var j;

    if ( typeof o == "object") {

        j = 0;

        for ( var k=0; k < 10 ; k++ ) {

            console.log(k);

        }

        console.log(k);

    }

    console.log(j);   // o가 object가 아닌 경우, j는 정의되어 있고, 초기화 되어 있지 않을 것이다.

}




73 페이지 첫번째 소스 코드


[?]          // 빈 배열: 대괄호 안에 표현식이 없으면 원소가 없음을 말한다.

[]        // 빈 배열 : 대괄호 안에 표현식이 없으면 원소가 없음을 말한다.


? 가 필요 없이 들어가 있다.



73 페이지 마지막 소스 코드


var p = { x:2.3, y:-1.2 };    // 두개의 프로퍼티를 가진 객체

var q = {?};                  // 프로퍼티가 없는 빈 객체

q.x = 2.3; q.y = -1.2;        // 객체 q와 p는 같은 프로퍼티를 갖는다.


var p = { x:2.3, y:-1.2 };    // 두개의 프로퍼티를 가진 객체

var q = };                  // 프로퍼티가 없는 빈 객체

q.x = 2.3; q.y = -1.2;        // 객체 q와 p는 같은 프로퍼티를 갖는다.


?가 필요 없이 들어가 있다.



83페이지 마지막 예제


1 + 2                   // => '3'

"hello" + " " + "there" // => 'hello there'

"1" + "2"               // => '12'

1 + 2                   // => 3

"hello" + " " + "there" // => 'hello there'

"1" + "2"               // => '12'


문자 3이 아니라, 숫자 3으로 계산되어야 한다.



84페이지 중간 예제


 1 + {?}     // => "1[object Object]" : 객체를 문자열로 바꾼 후 이어붙이기

 1 + {}     // => "1[object Object]" : 객체를 문자열로 바꾼 후 이어붙이기


로 필요 없이 ? 가 들어가 있다.



 94 페이지 첫번째 예제가 나온 뒤 4번째 줄에 대한 설명


또한 우변 피연산자가 함수가 아니라면 TypeError 예외가 발생한다.

일반적으로는 "함수"가 아니라, "클래스"가 아니라면 TypeError이 발생한다고 생각 할 수 있다.

하지만 javascript에서는 class라는 형태를 function으로 정의 하기 때문에, 함수가 아니라면 TypeError가 난다고 말 하는게 맞는듯 하다.



97 페이지 첫번째 예제 설명이 명확하지 않음


// max_width가 정의되어 있으면 이것을 사용한다.

// 이 외의 경우 preference 객체에 속한 값을 찾아 본다.

// 그것조차 정의되어 있지 않을 경우 하드코딩된 상수를 사용한다.

var max = max_width || preferences.max_width || 500;

 

위 설명에서 잘못된 부분이 있다.

"max_width가 정의되어 있으면 이것을 사용한다." 부분이다. 정의되어 있는것은 당연히 중요하고, max_width가 어떤 값을 가지느냐도 중요한 문제이다.

max_width가 정의되어 있지 않으면 당연히 max_width는 false로 처리 되고, 그 이후 prefrenerces.max_width를 평가할 것이다.

하지만 max_width가 정의되어 있고 0이라는 값을 가지고 있을때는 어떻게 동작할 것인가? 당연히 0은 false로 처리 될 것이고, prefrernces.max_width을 확인해야 할 것이다. 그러므로 해당 설명을 정확하게 하려면 다음고 같이 바뀌어야 한다.


// max_width가 정의되어 있으면서 0 이 아니라면, 이것을 사용한다. 정의되어 있더라도 0 이라면 이것을 사용하지 않는다.




 97 페이지 두번째 예제


function copy(o, p) {

    p = p || {?};   // 만약 인자 p가 null이면, 새롭게 객체를 생성한다.

    // ...

}


function copy(o, p) {

    p = p || {};   // 만약 인자 p가 null이면, 새롭게 객체를 생성한다.

    // ...

}


로 ? 가 쓸데 없이 들어 있다.


전반적으로 ;; 소스코드 부분의 들여쓰기나, 띄워쓰기(코딩 컨벤션)가 일정하게 되어 있지 않다. 세미콜론 처리 역시 어떤 예제는 꼬박꼬박 넣고, 어떤 예제는 두 줄이상의 소스코드인데도, 넣었다(99페이지 마지막 예제) 안 넣었다(97페이지 마지막예제) 한다. 그래서 이런건 또 왠만해서는 생략.


빈객체나 빈 문배열등을 만들때 쓸데 없이 ? 가 들어 있는 경우가 많다. ? 에 대한 문제는 너무 많아서 이제 부터는 생략.

{?} 나 [?] (?) 등을 보시게 되면... ? 는 없는 것으로 생각하고 코드를 보시라.



자바 스크립트는 기본적으로 Type Checking이라던지, 각종 코드에 대한 검사를 덜 하는것으로 판단된다. 예를 들면 변수를 선언하지 않고도 바로 사용한다던지, 읽기 전용 속성인데도 값을 할당한다던지 하는것에 대해서 에러를 발생시키지 않는다. 

이러한 방식은 코드를 더 쉽게, 그리고 유연하게 만들 수 있는 장점이 있겠지만, 나 같은 사람들에게는 오히려 혼란을 가중 시키기도 한다. 이러한 문제를 해결 하기 위해서 "strict mode"라는 것을 지원한다. 이 기능을 켜 두게 되면, 자바 스크립트가 말 그대로 "엄격"한 검사를 통해서 실행된다. 


"엄격"하게 자바스크립트를 작성하고, 실행하고 싶다면 js 파일의 첫번째 줄에 "use strict"; 를 추가해 주면 된다. 특정 함수만 "엄격"하게 실행하고 싶다면 함수 구현의 첫번째 줄에 "use strict"; 라고 넣으면 된다. ( " 를 빼 먹지 말고 다 적어야 한다. ) - IE 10 미만 버젼에서는 사용할 수 없다고 한다.



"use strict";  // 이 선언으로 인해서 현재 js 파일은 엄격 모드로 실행되게 된다.


function a() {

    // ....

}



function b() { // 아래와 같이 특정 함수만 엄격 모드로 실행되게 할 수도 있다.

    "use strict";

    // .....

}





106페이지 delete연산자 6번째줄 부터 있는 예제


var o = { x:1, y:2 };

delete o.x;

"x" in o;


뜬금 없는 문법 오류로 보일 수 있지만 in 이라는 연산자가 있는 것이다. 

"PROPERTY_NAME" in OBJECT 의 형태로 사용할 수 있다.



106페이지 중간 즈음에 delete 연산자 설명중


delete 연산자의 피연산자는 좌변값(lvalue)이다. 피연산자가 좌변 값이 아니면 연산자는 아무런 동작을 하지 않고, true를 반환한다. 피연산자가 좌변값이면 연산자는 해당 좌변 값을 삭제하려고 시도하며, 피연산자가 성공적으로 삭데되었을 경우 true를 반환한다.


좌변값이라는 용어를 먼저 알아야 한다.


변수에 값을 할달 하는 경우 아래와 같이 코드를 작성한다.


var x = 10;


위 코드에서 = 를 기준으로 왼쪽에 있는 것을 좌변값(left-value,lvalue)라고 하고, 오른쪽에 있는것 우변값(right-value,rvalue)라고 한다. variable이 좌변 값이 된다. 즉, 어떤 값을 할당 할 수 있는것들이 lvalue가 되고, 이것들을 delete 시킬 수 있다는 것이다.


설명상 "delete 연산자의 피연산자는 좌변값(lvalue)이다." 라는것은, delete의 왼쪽에 있는 값이 피연산자라는것이 아니라, delete 다음에 올 수 있는 피연산자는 lvalue 형태의 것들만 올 수 있다는 의미이다.


그 아래쪽에도 나오지만, 정확하게 말하면 위의 코드에서 x를 delete 시킬 수는 없다. delete 시킬 수 있는것은 property 형태만 가능하다. 107페이지 첫번째 예제에서 this.x 에 값을 할당 한 뒤, 그냥 x를 delete 시킬 수는 없었지만, this.x 를 delete 시킬 수는 있게 된다.


107페이지, 110페이지


부수효과


계속해서 부수효과라는 용어가 등장한다. 부수효과라는 용어는 Side Effect라는 용어의 한국어 번역 단어로 많이 사용된다. 우리가 일반적으로 생각하는 Side Effect는 "예상치 못했던 문제 상황"을 뜻하는데, 여기서는 그렇지 않다.

여기서 말하는 부수효과를 쉽게 말하면, state 를 바꾸는것을 생각하면 된다. 아래의 코드를 보자


var x = 3;


위의 코드는 사실상 아무것도 하지 않는것으로 느껴지지만, x라는 변수를 생성하고 이 변수에 3을 할당한 코드이다. x의 state가 변경된 것이다. 이렇다면 이는 "부수효과가 있다"고 볼 수 있다. 하지만 다음 코드를 보자.


Math.cos(Math.PI);


위 코드는 PI 값으로 코사인 정보를 얻어왔지만, 아무곳에서 할당하지 않았다. 즉, state의 변화가 없다. 이 경우 "부수효과가 없다." 고 볼 수 있다.



 

 



 

 



 

 



 

 


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

[ google drive에서 복사 해 온거라 ;;; 이미지가 깨질 수 있습니다. ]

[ 바로 보기 : https://docs.google.com/document/d/1-yNddpgu71tbFaupqrOrQ23xv8SV_6Y_8OfokPuEQTk/edit?usp=sharing ]


Windows 에서 

Docker Toolbox로 Docker 사용하기




작성자 : 조찬제 ( http://blog.ggaman.com )

작성일 : 2015년 11월 23일




Windows Docker Toolbox를 이용하여 Docker 환경 갖추기


Docker란?

 - “도커” 라고 읽음

 - Linux안에서 또 다른 Linux의 Isolate 한 환경을 만들어 줌

 - Windows에서는? VirtualBox에 boot2docker 간단한 Linux 이미지를 올리고 거기에, 또 다른 Linux를 올려 줌


Docker .vs. VM

 - VM : Linux 위에 가상화 환경을 처리한 Hypervisor가 뜨고, 그 위에 다시 Linux OS가 올라감

 - Docker : Linux 위에 Docker Engine이 있고 그 위에 OS 없이 바로 파일이 올라감. ( 속도 빠름 )

http://static1.squarespace.com/static/4ff3e918e4b03ec22b113d00/t/53cb75cae4b0cb413c8933d4/1405842891457/

Docker 이미지

 - Linux(Host OS)위에 뜰 Linux File들의 집합

 - 해당 Docker 이미지는 수정이 불가능 한 Read Only 상태이다.

 - Docker 이미지를 이용하면, 똑같은 환경의 여러 Linux를 띄울 수 있다.


Docker 컨테이너

 - Docker 이미지를 동작 시킨 Linux 상태 ( CentOS Docker 이미지의 복사본이 Ubuntu(Host OS)에 올라간 상태 )

 - 실제 동작중인 Docker 컨테이너에 접속하여 파일을 추가하거나, 삭제, 서버 실행 등을 할 수 있다.

 - Docker 컨테이너에서, Apache 서버를 띄우게 되면, 그 프로세스는 실제로는 Host OS의 자원을 사용하게 된다.

 - Docker 컨테이너가 종료되면, Docker 컨테이너에서 실행되던 모든 프로세스가 죽는다.

 - Docker 컨테이너가 종료된다고 해도, 편집된 파일들은 컨테이너에 그대로 유지 된다.

 - 종료된 Docker 컨테이너를 살릴 수도 있다. 살린 후 접속해 보면, 편집된 파일들이 유지 됨을 알 수 있다.

 - 다만, 이전에 실행되었던 모든 프로세스가 죽었으므로 다시 살려줘야 한다.

- 컨테이너가 다시 살아 날 때 기본적으로 수행해야 하는 명령어를 설정해 줄 수 있다.

- 이를 이용해 컨테이너가 뜨자마자 서버를 실행하는 등의 작업을 할 수 있다.




Windows 기준 Docker 환경 만들기 ( Mac 도 비슷할거라... )


가이드 문서 진행 기준

 - Windows 7

 - 가용 디스크 용량 50GByte 이상

Docker ToolBox

 - Docker 사용시 필요한 이것저것이 모두 묶여 있음.

 - Docker Toolbox(boot2docker, Kitematic)

 - Oracle Virtual Box

 - Git

다음의 경로에서 Docker Toolbox를 Windows용으로 다운로드 받아 설치한다.

https://www.docker.com/docker-toolbox

2015년 11월 23일 기준으로 DockerToolbox-1.9.0d.exe 다운로드를 할 수 있다.

https://thinkfree.netffice24.com/weboffice/resource/tfsi/8d13a148e467b7be3868675c3ab114b6/html/files/2080795046.png

설치 과정은 언제나처럼 OK와 Next를 연속해서 누르다가 Close 를 누르면 된다.

설치를 완료하면 아래와 같이 Quickstart Terminal 과 Kitematic을 실행할 수 있는 아이콘을 볼 수 있다.

혹시 설치를 하다가 실패하면, 시스템에 이미 설치 되어 있던, Virtual Box와 Git 등을 제거하고 다시 설치 시도해 본다.




Docker에서 사용할 VM을 만들기 전 할 일


Docker Toolbox의 제약 넘어서기

Docker를 실행할 수 있는 Terminal을 실행시키기 전에 몇가지 작업이 필요하다.

Docker를 동작시키기 위해 Docker Toolbox에서 만들어 주는 기본 VM의 Disk의 최대 용량이 약 10~18Gbyte 이기 때문에, Linux를 설치하고 HDCS등을 설치하면 용량이 부족해서 설치가 실패하는 경우가 있다. 또한 Docker용 VM Disk가 생성될 하드 디스크의 용량이 부족하면 실행시 문제가 될 수 있다.

그러므로 Docker를 동작시키기 위한 VM Disk의 위치와 용량을 변경할 필요가 있다. 여기서는 VM Disk가 생성될 하드 디스크의 위치를 "U:\_VM_\docker" 이라고 가정하고, 용량은 약 50GByte 를 잡는다고 가정하자.

Docker Toolbox 가 설치된 디렉토리로 이동해서 start.sh 파일을 문서 편집기로 수정해 준다.

https://thinkfree.netffice24.com/weboffice/resource/tfsi/8d13a148e467b7be3868675c3ab114b6/html/files/869933943.png

start.sh 파일을 문서 편집기로 열고

DOCKER_MACHINE=./docker-machine.exe

를 찾아서 아래와 같이 두 줄로 수정한다. ( Windows 지만 경로가 / 로 구분 되는것에 주의하자. )

DOCKER_MACHINE_CMD=./docker-machine.exe

DOCKER_MACHINE="./docker-machine.exe -s U:/_VM_/docker/"

또한 

if [ ! -f $DOCKER_MACHINE ] || [ ! -f "${VBOXMANAGE}" ]; then

를 찾아

if [ ! -f $DOCKER_MACHINE_CMD ] || [ ! -f "${VBOXMANAGE}" ]; then

로 수정한다.

이렇게 하면 Docker를 동작시키기 위한 VM Disk가 U:\_VM_\docker 에 disk.vmdk 파일이 생기고, 그 용량도 최대 약 50GByte까지 사용 가능해 준다. U:\_VM_\docker 디렉토리는 미리 만들어 두도록 하자.

이제 Docker 를 실행해 볼 수 있는 환경 준비가 끝났다.

https://thinkfree.netffice24.com/weboffice/resource/tfsi/8d13a148e467b7be3868675c3ab114b6/html/files/1025.png

Docker QuickStart Terminal을 실행 시키면 VirtualBox를 하나 띄우게 된다.

https://thinkfree.netffice24.com/weboffice/resource/tfsi/8d13a148e467b7be3868675c3ab114b6/html/files/1430971613.png

이후 조금 기다리면 아래와 같이 Docker Quick Terminal을 만날 수 있다. 

https://thinkfree.netffice24.com/weboffice/resource/tfsi/8d13a148e467b7be3868675c3ab114b6/html/files/567108051.png

여기서 뜨는 Linux 터미널은 사실상은 Windows 상에서 동작하는것이고, 단순히 Linux command를 사용할 수 있도록 되어 있는 터미널이다.

실제로 Docker 이미지가 올라갈 곳은 Virtual Box에 default 라는 VM에 올라 가게 된다. 궁금하다면 VirtualBox Manager UI를 띄워서 아래와 같이 확인할 수 있다.

https://thinkfree.netffice24.com/weboffice/resource/tfsi/8d13a148e467b7be3868675c3ab114b6/html/files/783967742.png

이로써 docker를 실행 시킬 수 있는 기본 환경이 마련되었다.





Docker를 이용하여 Dockerfile 로 이미지 만들기 준비



Docker 이미지를 만들기 위한 준비

여기서는 CentOS 6.6과 Java(Oracle JDK)를 설정하는 것으로 진행하겠다.

로컬 컴퓨터에 적당한 디렉토리를 만들고, 아래의 경로에 접속하여 다음의 파일을 다운로드 받자.

https://drive.google.com/folderview?id=0B4JVe12NOkhxUk41RkV5aWVRVHc&usp=sharing

 - Dockerfile ( Docker 자동 설치 스크립트 )

 - jdk-7u80-linux-x64.rpm ( Oracle JDK )

여기서는 U:\docker 라는 디렉토리에 다운로드 받았다는 가정으로 진행된다.

위 파일을 받고 나면 아래와 같이 총 2개의 파일을 다운로드 받게 된다. 



Docker 이미지 만들기


Docker Quick Terminal에서 Dockerfile이 있는 경로(u:\docker)로 이동하여 아래와 같은 명령을 내리면, Docker Image를 생성하게 된다.

docker build -t centos_oracle_java .

위 명령은 현재 디렉토리에 있는 Dockerfile 파일을 이용해서 centos_oracle_java라는 이름을 가지는 Docker Image를 생성하는 과정이다.

장비에 따라 다르겠지만, 3~5여분이 흐르면 CentOS와 Oracle Java가 설치 완료된 이미지를 생성하게 된다.

이미지가 제대로 생성되었는지 확인하기 위해 아래의 명령을 입력하여 확인하자.

docker images

centos_oracle_java는 이번에 우리가 만든 Docker 이미지이다. centos 이미지는 centos_oracle_java 이미지를 만들기 위한 기본 이미지이므로, 자동으로 받아 진 것이다. 즉, centos 이미지를 다운로드 받고, 그 이미지에다가 Oracle Java를 위한 이것 저것을 설치한 후, 그것들 다시 이미지로 만들어 둔 것이 centos_oracle_java이다. Dockerfile의 첫 번째 명령인 FROM 부분에서 centos 를 base 이미지로 사용한다고 적혀 있는 것을 발견할 수 있을 것이다.




Docker 컨테이너 만들기


이미지가 다 만들어 지고 나면, 8000 포트로 동작하는 서버를 위한 컨테이너를 만들어 보자.

docker run -i -t -p 8081:80 --name chat_server centos_oracle_java //bin/bash

위 명령은 centos_oracle_java 이미지를 이용하여 chat_server라는 이름을 가지는 컨테이너를 하나 만들게 된다.

chat_server 라는 이름을 가진 컨테이너에서 8081 포트를 Host OS에서 공개한 채로 서버가 뜰 것을이므로,  컨테이너 외부에서 접속할 포트컨테이너 내부 포트로 80을 연결하도록 설정하였다. 그러므로 컨테이너에 들어갈 프로그램을 작성 할 때엔 컨테이너 내부 포트인 80 포트를 기준으로 작성해야 한다.

컨테이너가 동작하고 난 직후에 자동으로 //bin/bash 명령이 수행되어 컨테이너 안에 shell로 접속할 수 있게 된다. ( 원래는 /bin/sh 처럼 제일 앞에 / 를 한개만 적어야 하나, Winodws에서 수행할 때에는 제일 앞에 / 를 두개 적어 줘야 한다. ) 컨테이너 안의 Shell로 잘 들어왔는지 확인하기 위해서 아래 명령을 쳐서 확인해 보도록 하자. Cent OS 정보를 볼 수 있을 것이다.

cat /etc/*release*

이제 컨테이너를 빠져 나오도록 하자.

exit

컨테이너에서 빠져 나오면 다시 Docker Quick Terminal 로 돌아 온 것을 알 수 있다.



Docker 컨테이너 상태 확인하기


docker 컨테이너 목록을 보고 싶다면 다음의 명령어로 확인 할 수 있다.

docker ps -a

출력은 다음을 뜻한다.

 - 컨테이너 ID는 9d77b23c2910 이다. 

 - 컨테이너는 centos_oracle_java라는 이미지를 바탕으로 생성된 것이다.

 - 컨테이너가 뜰 때 수행된 명령은 //bin/bash 이다.

 - 컨테이너가 만들어 진지 7분 정도 지났다.

 - 컨테이너가 2분전에 종료되었다.

 - 현재 할당된 포트는 없다.

 - 컨테이너 ID가 너무 어려워서  우리가 chat_server 라는 이름을 주었다.

우리가 이전에 아래와 같은 명령을 내려서 Docker 컨테이너를 띄웠다.

docker run -d -p 8081:80 --name chat_server centos_oracle_java //bin/bash

하지만, 현재 docker 컨테이너의 상태를 확인해 본 결과 port 할당이 하나도 이루어져 있다는것을 알 수 있다. 이는 docker 컨테이너가 내려 갔기 때문에 더 이상 Host OS의 port를 mapping 하지 않게 되었기 때문에 없는 것이다.



Docker 컨테이너 살리기/죽이기/없애기

죽었던 chat_server 컨테이너를 살려 보도록 하자.

docker start chat_server

이후 docker ps -a 를 통해서 chat_server 컨테이너가 동작 중인지 확인해 보자.

그 결과 STATUS 부분에서 “Up” 이라고 적혀 있으면 컨테이너가 실행 중인 것이다.

하지만, 이상하게도 이전과는 달리 chat_server 컨테이너에 shell로 들어 간 것이 아니고, Docker Quick Terminal로 빠져 나와 있다. 또한, 빠져 나와 있는데도 chat_server 컨테이너가 죽지 않고 살아 있다는것을 알 수 있다.

여기에 대한 설명은 어려운데, 간단히 설명하면, 컨테이너는 실행 할 때 수행한 명령의 process가 종료되지 않으면 컨테이너를 살려두고, process가 종료되면 컨테이너도 같이 종료시키게 된다. 우리가 chat_server를 실행시킬 때 내부적으로 //bin/bash를 실행 시키고, 그냥 나왔기 때문에 컨테이너 안에서는 여전히 //bin/bash process가 살아 있어서 컨테이너가 종료되지 않고 살아 있는 것이다.

만약 컨테이너를 죽이고 싶다면 아래의 명령을 이용할 수 있다.

docker stop chat_server

그렇다면 컨테이너를 띄운 상태에서 shell로 접근하고 싶을때는 어떻게 해야 할까? 두가지 방법이 있다.

  1. 새로운 컨테이너를 만들면서 shell로 접속하기

  2. 이미 만들어진  컨테이너에 shell로 접속하기

    1. 만들어져는 있지만 죽은 컨테이너를 띄우면서 shell로 접속하기

    2. 이미 띄워진 컨테이너에 shell로 접속하기

1의 방법인 컨테이너를 띄우면서 shell로 접속하기는 이전에 chat_server 컨테이너를 띄울 때 사용했던 방법과 동일하다.

docker run -i -t -p 8081:80 --name chat_server centos_oracle_java //bin/bash

2.a의 방법은, 우선 chat_server 컨테이너를 띄운 뒤에 2.b 방식을 따라하면 된다.

docker start chat_server

2.b 방식은, 이미 떠 있는 chat_sever 컨테이너에 명령을 수행하고, 그 명령의 입력과 출력을 주고 받을 수 있도록 설정하면 된다. 아래의 명령으로 shell에 접속 할 수 있게 된다.

docker exec -i -t chat_server //bin/bash

-i 과 -t 옵션을 주어야만 //bin/bash 명령을 컨테이너와 주고 받을 수 있다.

chat_server 컨테이너가 더 이상 필요 없다면 삭제를 하면 된다. 만약 삭제하고자 하는 컨테이너가 실행중이라면 먼저 docker stop 으로 멈추고 아래 명령을 이용하면 삭제 할 수 있다.

docker rm chat_server

다시, centos_oracle_java 이미지에서 chat_server2 라는 컨테이너를 만들면, 완전 clean 한 상태로 새로운 컨테이너를 만들 수 있다. 만약 chat_server 에 이것저것 작업하다가 환경이 잘 못 된 경우, 이런 방식으로 쉽게 clean 한 환경을 만들 수 있는 장점이 있다.

새로운 chat_server2 컨테이너를 만들고 shell로 접근해 보자. 아래의 명령을 이용하도록 하자.

docker run -i -t -p 8081:80 --name chat_server2 centos_oracle_java //bin/bash

컨테이너의 shell에 접근한 상태에서 exit 명령으로 shell을 종료하게 되면, 컨테이너 역시 종료 된다. 그렇다면 컨테이너를 종료 시키지 않은 상태에서, Docker Quick Terminal로 나갈려면 어떻게 해야 할까? 아래의 키 조합을 순차적으로 누르면 된다.

^P ^Q ( Control + P, Control + Q )

 

docker ps -a 명령으로 확인해 보면 chat_server2가 종료되지 않고 실행 중인 것으로 발견할 수 있다.



Docker Toolbox 지우기


0. VirtualBox 에 떠 있는 모든 VM 들 내리기

1. 제어판 -> 프로그램 제거 -> Oracle VirtualBox ( Virtual Box를 사용한다면 그냥 둬도 된다. )

2. 제어판 -> 프로그램 제거 -> Docker Tool box

3. 제어판 -> 프로그램 제거 -> Git ( Git 을 사용한다면 그냥 둬도 된다. )

3. c:\Users\사용자명\.boot2docker 삭제

4. c:\Users\사용자명\.docker 삭제



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

아두이노 IDE를 사용해 보면 알겠지만, 한글에 대한 처리가 잘 되지 않는다.


한글 글자 조합이 완료되었을때에 대한 처리부분을 대충 수정해서

사용하는데 크게 무리가 없도록 처리 해 두었다.

( 물론 아직도 버그는 있고, 그걸 굳이 고칠 생각은 없다. )


첨부된 pde.jar 파일을 다운로드 받아

arduino-1.0.5-r2/lib 밑에 pde.jar 을 교체해 주면 된다.



필요하신 분들은 잘 쓰시길...


pde.jar


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'공부 > 기타' 카테고리의 다른 글

[아두이노] Arduino IDE 1.0.5-r2 한글 패치  (2) 2014.03.08
발해고에 대하여...  (0) 2004.10.25
  1. CRX48 2015.03.20 17:21 신고

    감사합니다~

백만년 만에 글. 너무 글을 안써서 오랜만에 생각나서 써 봄. ㅋ


Java에서 제공하는 기본적인 Reader계열에서는 UTF-8의 BOM을 제대로 처리하지 못합니다. 그렇기 때문에 BOM이 있는 UTF-8 stream을 Reader로 넣으면, String의 제일 앞글자에 0xfeff 가 들어 오는 문제가 생깁니다.


"UTF-8의 BOM을 제대로 처리 못하는 Java의 문제가 아니냐?" 고 물을 수 있겠지만은, Unicode 표준에는 UTF-8에 대해서는 BOM을 적지 않도록 권고(neither required nor recommended)하고 있습니다. 그런데 MS Windows 계열에서 만들어진 일부 문서에서는 BOM을 포함하는 경우가 종종있습니다.


이를 해결할 수 있는 방법은, 


 1. BOM에 대한 정보를 inputStream에서 미리 읽어 버리고, BOM 이후부터 Reader에서 읽도록 처리하는 방법

 2. 얻어진 String에서 tmp = tmp.replace("\uFEFF", ""); 와 같은 방법으로 0xfeff 무시하기

 3. 각종 외부 라이브러리를 이용해서 처리 하기


입니다.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 제미니 2014.07.08 13:41 신고

    이 글 덕분에 문제를 해결했습니다. 감사합니다!

""Samsung | Galaxy Nexus | Aperture priority | 1/17sec | F/2.8 | 0.00 EV | ISO-400, 0, 0 | Flash did not fire | 2012:11:09 17:51:49

모란시장. 1인 소주 한병에 6천원. 맥주나 막걸리도 가능. 술 값만 내면 철판에 구워주는 염통, 갈매기살, 곱창등 각종 돼지 부속을 먹을 수 있음. 2인이서 각 1병 먹으면 1.2만원에 살큰하게 먹을 수 있음.

통영에가면 "다찌집"이라도 불리는 술 집이 있는데, 거긴 얼음 양동이에 술과 음료가 몇병 들어있고 안주가 해산물로 나옴. 기본이 3만원인가 4만원으로 기억. 이후 소주 1병당 만원정도고 안주는 계속 추가되는 시스템. 좋기는 하나 가격이 비싼 가격이 흠.

그에 비해 모란시장에서는 1인당 6천원이라는 싼 가격에 간단히 한 잔 할 수 있는게 좋음.

결론은 다음에 모란시장가면 또 가야지.
ㅋㅋㅋ
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Google Android 개발자 간담회에 참석을 했다.


일시 : 2012년 9월 17일.

장소 : 강남 파이낸스 센터 21층 (구글코리아)



주요 내용은 아래와 같았다.


* Android Design Guide

* What's New in Android

* In App Billing / Subscription

* How to get featured in Play Store

* QnA


해당 세션들은 외국분들이 와서 영어로 진행하였다. - 정말 다국적 발표자들이었음.


기본적인 내용은 Google I/O 2012 행사에서 진행했던 세션들을 정리해서 다시 이야기하는 형식이었다.

( 유튜브에 가면 Google I/O 2012 행사를 모두 볼 수 있다! - 보러가기 )


나는 운 좋게도 Google I/O 2012에 직접 참석을 했었고, 회사에서 Google I/O 행사 발표 준비를 하느라 많이 본 내용이었기 때문에 몇몇 세션들은 어렵지 않았다.


그 중에서 내가 참석하지도, 유튜브에서 보지도 않았던 "In App Billing/Subscription" 관련 세션에서 재미나는 것을 알게 되었다. 이미 알고 있는 사람들은 뻔할 수도 있지만 말이다. Google Play 스토어에서 물건을 구매하면 총 금액의 30%를 구글측에서 가지고 가고, 나머지를 개발자가 가지고 간다고 알고 있었다.


(확대해서 사진을 찍었더니. 엉망이네 T_T )


하지만 정확하게 말하면 그 30%를 

텔레콤회사(통신사)

빌링회사(카드사)

구글

욜케 3군데서 나눠 먹는다고 한다. 어찌보면 당연한건데, 난 그냥 자연스럽게 구글이 다 먹는다고 생각하고 있었다.


나온 이야기중 몇가지 정리를 하자면.

1. 메뉴를 아랫쪽에 배치하지 말자.

허니컴과 ICS에서는 기본적으로는 하드웨어 버튼이 없으며, 스크린의 하단에 back, home 등의 버튼이 존재한다. 그러므로 App의 메뉴나 버튼이 하단에 존재하면 사용자가 잘못 누르게 될 가능성이 있다. 그러므로 하단에 버튼이나 메뉴를 배치하지 않도록 하자.


2. billing 시스템은 섞어 쓰지 못한다.

그러니깐 삼성AppStore에 올리면서 Google Billing system을 사용하지는 못한다. 만약에 삼성앱스와 구글플레이에 모두 올려야 한다면 삼성앱스에 올릴때는 삼성의 결재 시스템을, 구글 플레이에 올릴때는 구글플레이의 결재 시스템을 사용하는 두개의 apk을 각각 올려라.


3. 애플의 앱스토어에 있는 리딤코드 같은건 아직...(뒤에 앉아서 제대로 못 들어서 맞는지는 모르겠다. )


4. 구글 플레이에 나라별로 다른 스크린샷을 올릴 수 있을까? 없다.


5. 디벨로퍼 콘솔의 beta가 진행중( 난 안 들어가봐서 잘 모르겠네 ;; )


나머지는 I/O 2012 자료를 참고하는것이 좋겠다. ( 굳이 여기에 정리 안해도 찾아 볼 사람들은... ㅎㅎ )


생각보다 사람들이 질문을 많이 했다. 나도 궁금한게 한 3개쯤 됐는데 못 물어보고 말았다능.. 쩝.


그리고 한국말로 질문한 사람은 나 밖이다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

영어 공부를 해야 겠다고 느끼긴 했으나, 영어로 질문을 못했다고 부끄럽거나 하지는 않다. ㅋㅋ

( 그래도 영어 공부는 정말로 해야 겠다. -_- 질문은 커녕 말을 알아 먹기도 힘드니 T_T )


재미난 것은 한국말로 질문을 했는데도, 통역을 통하지 않고도 내 질문을 알아 먹었다는것!!!

"Google Plus App이나 Youtube App에서는 Home Button을 누르면 Menu가 왼쪽에서 나오는데, 이렇게 Menu가 나오는 방식이...." 이라고 한국말로 물었는데 -_- 단박에 알아 들었다는게... 하긴 한국말 절반에 영어 절반이니... ㅎㅎ


이런 행사가 있을때마다 회사의 파트장님이나 팀장님에게 허락을 받아야 하는데(업무시간이 마치지 않은 시간이니깐 허락을 얻는건 당연) 매번 참석하도록 해 주셔서 감사합니다.(라고 뜬금 없는 아부를 좀... ) 


이런 행사에 참석을 하면서 느끼는건데, 무언가 목적을 가지고 참석하는 사람들은 부끄러움은 살짝 접고 참석하기 때문에 뭔가 더 활발한 모습을 볼 수 있는것 같다. QnA 시간에도 열의를 가지고 참석하고, 옆 사람에게 말도 쉽게 걸고. 그래서 보고 있으면 참 흐뭇하다. ㅎㅎ




질문에 대한 이야기가 나왔으니 잠시 다른길로 빠져서 예전부터 가지고 있던 생각을...

( 이걸로 다시 글을 하나 쓰자니... 좀 귀찮기도 하고 말야. ㅎㅎ )


가끔씩 세미나에 참석을 하면 이상한 버릇을 가지고 있는 사람들을 만날 수 있다. ( 이번 구글 세미나는 아니었으니 괜히 이번에 참석하신 분들은  신경쓰지 않아도 된다. )


세미나를 진행하면 어떤 수준의 사람들이 참석을 하는지 알 수 없고, 그렇기 때문에 세미나 발표자료를 만들 때 되도록이면 쉽게 만들기 위해서 노력을 하고, 그렇게 때문에 "정확하지 않은 내용"을 발표에 포함시키는 경우도 있다. 


그리고 나중에 질문의 시간에 "니가 뭘 모르는가 본데..." 라는 늬앙스를 잔뜩 풍기면서 질문을 던지는 사람들이 있다. 이런건 발표하는 사람에 대한 예의가 아니라고 생각된다. 소위 말하는 "우리끼리 하는 클래스명까지 나오는 디테일한 기술 세미나"도 아니고, 많은 사람들을 위한 공개 세미나에서 발표하는 건데... 설령 그 사람이 정말로 잘못 알고 있거나, 혹은 모른다고 해도 그런식으로 말을 해야 할까?


그 사람은 그 세미나를 준비하기 위해서 많은 준비를 했을 것이다. 실제 발표 내용을 조사하고, 발표내용을 다듬고, 실제 발표 연습을 해는것만으로 2-3일은 소비했을 것이다.

그런 사람들을 보면

"그럼 니가 해 보던가, 안 할 꺼면 닥치고 있어!" 

라고 외쳐 주고 싶다.



누군가가 이런류의 이야기를 했다. ( 잘 기억은 안 난다. )


"서로 잡아 먹기 위한게 아니라고"

"아무런 도움이 되지 않는다고"

"해결해 나가기 위한 것이라고"





암튼!

주저리 주저리 끝. ㅋ.



Google Android 개발자 간담회 덕분에 백만년만에 블로그에 포스팅 해 봄.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 돼지왕왕돼지 2012.10.14 10:45 신고

    구글 아이오도 직접 다녀오셨어요? 좋으시겠어요 부럽부럽 ㅠㅠ

    • 2012.10.14 16:59 신고

      오잉~
      제가 언젠가 방문해서 댓글까지 남겼던
      돼지왕왕돼지 님이시다 ㅎㅎ

      완전 좋더라구요.
      내년엔 자비를 들여서라도 가볼려구요 ㅎㅎ

      방문 감사합니다 ㅎㅎ

근데 한국은 아니래.

http://www.altools.com/Home/News.aspx?&articleIdx=59&m=3




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 한빛가람 2014.05.13 06:27 신고

    역시 이스트소프트사는 뭔가 남다르네요.

넥서스7. 또 간단 사용기.

액정과 베젤 사이에 유격이 있다. 누워서 넥7을 쓰면 액정이 살짝 밑으로 처짐.

다들 베젤이 광활하다고는 하지만, 실제 손으로 잡고 사용해 보면 전혀 그렇지 않음. 그 정도 베젤이지만 가끔씩 잡다가 의도치 않게 터치되는 경우도...아마 더 좁았다면 조심해서 잡고 사용해야 될 정도?

동영상을 이어폰 없이 본다는건 좀 무리일듯. 넥7을 세웠을때 화면의 뒷쪽 아래편에 스피커가 있음. 실제 동영상을 볼 때는 가로로 눕혀서 보게 되는데, 이 때 스피커가 왼쪽 혹은 오른쪽 후면에 존재하게됨. 안 그래도 후면에 스피커가 있는데 그마저 한쪽 방향으로 치우쳐 소리 전달이 좀 어려움.

지하철이나 자기전에 웹서핑용으로는 대박. 갤탭 10.1인치는 아이패드에 비하면 가볍긴 하지만, 누워서 들고 조작하기에는 무거운편. 하지만 넥7은 누워서 들고 조작하기에도 힘들다 무겁다는 느낌은 전혀 없음.

성능도 빠릿빠릿. 젤리빈의 위력인지 cpu, gpu파워가 좋아서인지 버벅임을 거의 느낄 수 없음. H264 720p동영상은 돌려봤음. 아직 1080p는 안 돌려봤으니 패스. 기본 동영상 재생 프로그램이 동작하지 않는 포맷이 많은것 같음. 테스트시는 mx플레이어 사용.

젤리빈에서 내가 사용하던 프로그램은 거의 다 잘 동작했음. 슈퍼눈팅은 좀 문제가 있었음.

뒷면의 감촉이 좋음. 내가 받은게 화이트(한정판)이라서 실제 판매품은 어떨지 모르겠지만 뒷면이 약간부드러운 플라스틱이라고 해야하나? 암튼 맨질맨질하고 광택이 나는 느낌의 재질이 아님. 딱 잡았을때 미끄러지지 않게 되어 있는 촉감.

젤리빈의 새로운 노티바가 생각보다 편함. 예전엔 노티 내용이 한줄로 나왔었는데 이제 여러줄로 볼 수 있어 굳이 메일이나 sms로 가지 않게 됨. 카톡같은 메세징 서비스에서 활용하면 좋을 듯.

카메라는 전면 카메라 뿐. 그런데 전면 카메라를 따로 쓸 수 있는 앱이 깔려있지 않음. 구글 플러스에 행아웃때 쓸수있을듯한데... 간단한 메모 내용은 걍 카메라로 찍어 보기 때문에 후면 카메라가 없다는거에 좀 아쉬움이...

핸드폰으로 글을 적어서 이만.
이 글 쓰는 핸드폰도 구글IO에 가서 받은 갤럭시 넥서스 젤리빈 ㅋ.
자랑임. ㅋ
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

뜬근없는 인증. 


어떤 장비를 받을 수 있을까 설레였던 마음이었을까? 아침에 부리나케 일어났다.

는 개뿔 -_-


지금 한 방을 세명이서 쓰는데, 세명다 알람을 6시 30분 에 맞춰뒀다. 난 알람으로 mini(MBC라디오)를 틀어 놓았는데, 나머지 두 분들은 잘 일어 나셨고.. 난 라디오를 들으며 -_- 다시 30분 숙면 모드 ;;;


7시쯤 되니깐 밖에서 요란한 소리가 난다. "WAKE UP" 어쩌고 저쩌고 하면서 흑인 아저씨들의 노동요처럼 들리는 음악(보다는 소리)를 계속 낸다. 처음에는 "아~ 이 동네 신기하구나~ 아침에 일어나라고 씨끄럽게 하는구나~"헸다.


하지만 알고 보니 내가 묶은 호텔에 월급을 제대로 받지 못하고 잘린 사람이 있는것 같더라. 음악을 잘 들어보니 "WAKE UP" 하라고 하고, "지금 뭐할 시간~?", "CHECK OUT 할 시간" 뭐 이런 노래를 한다. 밖에 나가니 막 종이를 나눠주더라고. 그 분들은 아침 7시부터 중간에 잠시 쉬고 오후 4시 정도까지 그 짓(?)을 하고 계셨단다. (호텔 개객끼)


SAMSUNG | NX10 | Normal program | 1/45sec | F/2.0 | 0.00 EV | ISO-800 | Flash did not fire | 2012:06:28 04:22:20


SAMSUNG | NX10 | Normal program | 1/45sec | F/2.0 | 0.00 EV | ISO-800 | Flash did not fire | 2012:06:28 04:23:16




아침 일찍 1등으로 제일 앞에서 키노트를 보겠다는 것은. 젠장.


SAMSUNG | NX10 | Normal program | 1/100sec | F/2.0 | 0.00 EV | ISO-200 | Flash did not fire | 2012:06:28 06:23:57사실 키 노트 입장 사진이다. ㅋㅋㅋ 그냥 사람이 많았구나~ 라고 생각하자.


도착하니 이미 줄은 백만년치서 있고, Name Tag을 받는데만도 만만치 않았다. 등록 과정을 모두 마치고 나면 QR코드가 메일로 하나 오는데, 중간 과정까지만 진행을 해서, 확인 코드만 딸랑 있었던 일행이 있어서, 여기 저기 돌아 다닌다고 바빴다. 등록 과정은 간단했다. General Attendees 라고 적힌 곳에 가면, 노트북에 QR 코드 리더기가 있고, 거기다가 QR코드를 가져다 대면 끝. 더 쉬운건 거기 옆에 서 있는 Staff 에게 QR코드를 보여주기만 하면 알아서 스티커를 뽑아 준다. ㅎ. 그 근처에 시간표와 각종 안내가 되어 있는 소책자의 앞 뒤에 이름이 적힌 스티커를 붙이고 Name Tag으로 만들어 목에 메면 끝!


등록 과정을 마치고 T셔츠를 받을때는 여기서 금방 발급받은 NameTag과 Photo ID(여권)를 달라고 한다. 난 그때 여권을 가지고 오지 않아서, "Photo ID를 안 가지고 왔다, Name Card 면 안되겠니?" 했더니 확인하고 주더라. 근데 회사에서 오신 몇분은 원래 참석하려고 했던 사람 대신에 참석을 해서 신청한 이름과 Photo ID(여권)에 있는 이름이 같을 리가 있나? 그 분들도 "Name card ok?" 했지만 "No" 라는 답이.... ;;;



이번 여행엔 내가 운이 좋은가 보다. 이번에 SFO에서 입국심사를 할 때, "이렇게 물어 보면 이렇게 해야지~" 하면서 많은 시나리오를 머리속에서 만들어 두었다. 그리고 입국 심사에 가기 전까지도 많은 생각을 해 두었다.


아저씨 : "Hello~, Welcome to San Fransisco."

나 : "Hi~"

아저씨 : ( 5초간 여권과 내 얼굴을 본다. ) 

아저씨 : (손가락 4개를 펴서 모으며) "오른손"

나 : ?!


아저씨가 정말로 "오른손"이라고 말했다.

사실은 그건 하나도 충격적이지 않다. 한국 사람이 많이 오면 한국말도 할 수 있는거지 뭐..


그것보다 더 충격적인건.... 단 1개의 질문도 하지 않았다는거다 ;;;;; 정말. 단 1개도...

( 속으론 많이 준비해 뒀는데.. ;; 영어 연습하려고 했는데 ;;; 약간 아쉽기도 ;;; )



SAMSUNG | NX10 | Normal program | 1/50sec | F/2.0 | 0.00 EV | ISO-200 | Flash did not fire | 2012:06:28 08:20:03계속 세이브린 게이라고 말하게 되는 세르게이 브린. 

키노트는 정말로 괜찮았다. 완전히 완전하고, 액티브하게 액티브했고, 익사이팅 하게 익사이팅했다.

특히, 세르게이 브린이 구글 글라스를 끼고 헐레벌떡 뛰어 온 다음. 그때부터는 정말로 정말했다.(응?)

SAMSUNG | NX10 | Normal program | 1/40sec | F/2.0 | 0.00 EV | ISO-800 | Flash did not fire | 2012:06:28 07:53:36 


SAMSUNG | NX10 | Normal program | 1/50sec | F/2.0 | 0.00 EV | ISO-320 | Flash did not fire | 2012:06:28 07:54:31비행선에서 쩜프를~~

갑자기 Hang Out(구글의 단체 회상 채팅)을 시작하는데, 화상채팅에 참석한 사람들이 비행선을 타고 있고, 얼굴에는 구글 글라스를 착용하고 있다. 그리곤.. 어쩌고 저쩌고... 하더니 비행선에서 점프~ ;;


비행선에서 점프해서 지상에에 도착할때까지 행아웃은 계속 되었다. 바닥에 착륙해서는 자전거타고 건물을 넘고, 줄을 타고 건물을 내려오고, 다시 자전거로.... 


오오! 키노트 세션이 있는 장소까지!


완전히 재미 있었다. 저런 짓을 해 볼 수 있다니~ 짱이얌~ 이럼서. ㅎㅎ.

권순선님 말씀대로라면 "말 그대로 Hang Out on the air"를 했다나~ (정확히 워딩은 pass~ pass~ )


가격은 $1500(우리돈으로는 세금포함하면 170만원 정도? ). 그 정도면 신기한 물건에 투자 할 수 있을듯 도 하지만, 구글 글래스는 미국 개발자에게만 선 주문이 가능하단다. -_-;;

SAMSUNG | NX10 | Normal program | 1/50sec | F/2.0 | 0.00 EV | ISO-640 | Flash did not fire | 2012:06:28 08:21:48 



새로운 장비도 소개 되었다. 구글의 7인치 젤리빈 레퍼런스 장비인 "넥서스 7".

그리고 하나 더 소개 되었는데, 그게 바로 "Nexus Q".

넥서스 큐는 장비에 있는 멀티 미디어 데이터를 이곳 저곳으로 sharing 할 수 있도록 해 주는 시스템 정도 되는 것 같다. (틀리다면 나도 모르겠다. -_-; 책임감 ㅇ벗음. ㅋ )


근데 좀 의문인게, 구글이 이전에 구글 TV를 만들때 셋탑박스 형태로 만들었는데, 넥서스큐와 좀 시장이 겹치는게 아닌가 싶다. 전시 되어 있던 구글 TV들은 화면과 일체형인것 같기는 했지만... 그럼 구글 TV 셋탑 박스쪽은 어떻게 되는건가?? 흠...


그리고  새로운? 업데이트괸? 갤럭시 넥서스를 한대 받았다. 처음에는 잘못 알아 들어서, 기존 갤럭시 넥서스와 하드웨어 사양이 다른가? 라고 생각했는데... 옆에 분들 말을 들으니, 젤리빈이 업데이트 되어 있다는 말이었다고 하더라. (아직 안 뜯어 봐서 모름. ㅋ.)


요렇게 3종 셋트 사진.





각종 세션에 대한 이야기는 다음으로 미루고. 오늘 있었던 메인 이벤트!

Name Tag에 이름 바꾸기 ;;;;

이전에 말했다시피 회사에서 원래 오려고 했던 분들이 오지 못해서 몇분은 다른 분들이 참석을 하셨다. 그러니 Name Tag에 있는 이름과 Photo ID 가 같을 리가 있나. 처음에는 꼼수를 몇번 부렸다.


우선 나는 당당하니깐(구글코리아느님께서 제공해주신 Ticket, 한글과컴퓨터 씽크프리느님께서 제공해주신 교통편과 숙박비 - 회사느님 사랑해요~) 우선 내가 먼저 이것저것 물어 본다.


처음에는 구글 계정의 사진을, 보여주며 "봐~ 여기이 계정에 내 사진이 올라와 있잖아. 이 구글 계정이 내 계정임을 증명하고 있으니 괜찮치 않니?" 라고 질문을 던질려고 사진도 정면 사진 올려 두고, 말도 머릿속으로 막 생각하고 했으나...

장비를 나눠주는 곳에서는, 정확하게도 Name Tag과 Photo ID의 이름이 같은지를 꼬박꼬박 확인하고 있었다. 그래서 fail.


일행중에 한명은 "성"만 같고 이름은 영어이름을 NameTag에 적어 두었지만, 잘 통과 했다. 그래서 이런 식으로 해결 해 볼까 했지만, 원래 참석하실 분들과, 대신 참석한 사람들의 성이 달랐다. 그래서 fail.


그래서 이번에는 Photo ID 를 가지고 오라고 했으니, 우리나라 주민등록증은 어떨까 생각했다. 거기는 영어로 이름이 안 적혀 있으니깐 걔네들이 알게 뭐야. 라면서...


"내가 여권을 안 가지고 왔어, 근데 저건 가지고 싶어. 어떻게 해야 할까?"

"여권이 없으면 안돼~"

"그러면 한국 주민등록증은 안되겠니?, 근데 주민 등록증에 이름이 영어로 안 적혀 있어, 대신 얼굴은 같잖아. 안 되겠어?"

"그럼 저기 등록 도우미 분들에게 가봐~"

그래서 fail.



결국 -_-  registration support(맞나?) 에 가서 사실대로 말했다. 원래와야 할 사람이 오지 못하고 다른 사람이 참석을 했다. 우리가 "참가자 변경" 신청을 했지만, 니네(구글)들이 이미 시간이 지났다면서 처리를 안 해 줬다. 그래서 그러니, 우리는 저 장비들을 받고 싶다. 


당근 저렇게 영어를 말 했어야 했으나, 오늘내로 해결해야 겠다는 생각에, 머릿속에 말을 만들지 않고 가서.. 완전 버벅대고... 완전 "쏘리~" 를 연발하면서 이야기를 진행했다.(저렇게 간단한 이야기를 5분이나 ;; )


인상 좋으신(사실 처음에는 그냥 평범했지만...) 아저씨-할아버지가(도대체 이 나라 사람들은 몇살 부터 흰머리가 나는거냐 ;;) 에게 가서 사정사정 했다. 사실 내가 이야기를 한 시간 보다 그 분이 이야기를 하고 내가 못 알아 들었다고 하고, 또 그 분이 이야기 하고, 또 못알아 들었다고 하고, 또 이야기를 하고 또 못알아 들어 미안하다고 하고... 했더니. 괜찮데. 다시 천천히 이야기 해 준다. ㅋ. ( 뒤 늦게 생각해 봄에 정말로 쉬운 말이었음을 깨닫는다. 왜 그걸 못 알아 들었는지... 휴... )


결국 이전에 transform을 신청하고 거부 당했던  메일들의 기록을 뒤져서 겨우 참가자 이름을 변경할 수 있었다. ( 엉엉. 영어 잘 하고 싶어요... T_T )

잡담이지만, 그 아저씨는 메일 프로그램을 T-rex 라는걸 쓰는것 같던데.. 그게 좋은건가? 왜 Gmail 안 쓰고??



암튼 이러한 일로 하루가 많이 복잡했다. T_T


다음에 구글 I/O에 참석하실 분들은 꼭! 본인이 직접 가던지 아니면 일찌감치 등록자 변경을 신청을 하던지 하자. 그리고 영어 이름 써 두지 말고. 걍 여권에 적혀 있는 한국 이름으로 신청하도록 하자.



이렇게 해서 이번 글은 끝.

응? 장비구경은 안 시켜 주냐고?

그건 다음글에 할 껀데.. 지금 피곤해서 다음글을 적을지 말지 고민중 ;;;


모양 잡아서 사진을 찍고, 컴퓨터로 옮기고, 블로그에 삽입하고 하는 것 보다 글만 이렇게 주저리 주저리 하는게 시간이 훨씬 더 덜 걸리거든.. ㅎㅎ


그리고 졸린다~ 그래서 끝!

( 진짜 완전 졸려서 ;; 실수로 공개를 해 버렸다. ;; 그래서.. 공개로 걍 놔둠,. ㅎㅎ )

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. Jeongmin 2012.06.28 17:50 신고

    재밌게 읽었습니다 ^^
    젤리빈 얼른 써보고 싶네요 ㅎ

  2. 유겸애비 2012.06.28 23:31 신고

    Name card란 말을 안 쓰는걸로 아는데.. business card 혹은 그냥 card

예전에 회사에서 Java One 참석으로 인해 샌프란시스코에 간 적이 있다.

그리고 그 글을 아직 채 정리하지 못하고 있다. ( 무려 3,4년 전인데 ;; )

 

그리고 올해 Google I/O 2012에 참석을 하기 위해서

지금 샌프란시스코다.

 

우엉~ T_T

그 글 정리는 모르겠고. 이 글 정리도 모르겠다.

 

우선 Google I/O 2012에 대해서 잘 정리하고, 여행관련 글은 따로 적어야겠다.

 

올만에 안부인사~ 끝~

 

아.

얼굴 없는 인증

 

SAMSUNG | NX10 | Landscape mode (for landscape photos with the background in focus) | 1/500sec | F/5.6 | 0.00 EV | ISO-100 | Off Compulsory | 2010:02:04 12:32:12

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. Eminency 2012.06.28 12:45 신고

    부럽네요~ 저는 작년 초에 SF에 갔었긴 합니다만 또 가고 싶군요 ㅎ

아직도 살아 있다는것을 보여 주기 위해서 오랜만에 사진 몇장. 

회사에서 사이판 월드리조트로 워크샵을 갔음.


찍은 사진의 대부분이 인물 사진이라 허락을 받지 않은 상태이므로.
대충 몇장만 급하게... ㅎㅎ.

 

SAMSUNG | NX10 | Normal program | 1/160sec | F/9.0 | 0.00 EV | ISO-200 | Off Compulsory | 2012:03:10 17:36:32

SAMSUNG | NX10 | Normal program | 1/1000sec | F/6.7 | 0.00 EV | ISO-800 | Off Compulsory | 2012:03:10 17:33:32

SAMSUNG | NX10 | Normal program | 1/50sec | F/2.0 | 0.00 EV | ISO-800 | Flash did not fire | 2012:03:11 11:56:21

SAMSUNG | NX10 | Normal program | 1/1000sec | F/6.3 | 0.00 EV | ISO-100 | Flash did not fire | 2012:03:11 10:33:57

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'여행' 카테고리의 다른 글

201203 - 회사 워크샵. 사이판. 월드리조트.  (0) 2012.03.19
안드로이드의 타겟은 모바일 환경이기 때문에, 프로그램을 만들거나 실행할때 몇몇 제약이 있다.

이야기 할 내용은 왠만해서는 접할 수 없는 안드로이드 프로그램의 메소드 갯수 제한에 관한 이야기다.

안드로이드 프로그램을 작성하기 위한 순서를 보자.

1. "자바언어"로 프로그램을 작성한다.
2. "자바 컴파일러"로 JavaVM의 Bytecode를 생성해 낸다. 
3. JavaVM의 Bytecode를 DalvikVM의 Bytecode로 변경하면서
4. .dex 파일을 만들어 낸다.
5. .dex 파일과 xml 파일과 각종 이미지들을 zip포맷으로 묶고, 확장자를 apk로 바꾼다.
( 5번 항목은 더 복잡한 내용이 있지만 여기서는 굳이 말할 필요가 없어서 대충. ㅋ )


안드로이드에서는 많은 class 및 jar들도 모두 한꺼번에 묶어서 .dex 파일로 묶어 주게 되어 있는데, 안드로이드 프로그램 배포 파일인  .apk 파일을  .zip 으로 확장자를 변경한 뒤에 압축을 풀어 보면 classes.dex 파일을 볼 수 있는데, 이것이 바로 DalvikVM의 Bytecode가 들어 있는 .dex 파일이다. 모든 class 파일과 jar 파일을 단 1개의 .dex 파일안에 다 넣게 되어 있다. ( 틀렸다면 제보해 주세요. )

이때, 발생 할 수 있는 문제가 바로 메소드 갯수 제한이다.

큰 프로그램을 작성하다 보면, 혹은 많은 양의 라이브러리를 가져다 쓰다 보면 당연히 프로그램의 덩치가 커지게 될 것이다. 이때 빌드를 돌리게 되면 위의  순서에서 2번 class파일이나 jar파일을 만드는데는 문제가 없으나, 3번 과정에서 dex 파일을 만들때 "format == null" 따위의 도저히 예측 할 수 없는 에러를 발생 시키고 죽어 버린다.

모바일프로그램이라 큰 프로그램을 짜지 않을것이라고 생각했는지, 아니면 가난한 리소스때문에 일부러 그렇게 설계했는지 몰라도 dex 파일에는 64k(6.5만개) 이상의  메소드가 정의 될 수 없도록 되어 있다. dex 파일 포맷에서 method index를 저장하는 공간이 16bit로 되어 있으므로 당연히 6.5만개 이상의 메소드를 만들게 되면, method index table의 공간이 부족하여 dex 파일을 못 만드는 것이다.

혹시나 6.5만개 이상의 메소드를 사용하는 프로그램을 만들게 되면 거기에 대한 대비책을 만들어야 한다.

1. 안드로이드에서 기본적으로 제공하는 라이브러리를 쓰자.
2. 프로그램 빌드시 실제로 사용되지 않는 라이브러리들을 제거 하자.
3. 필요 없는 메소드들을 생성하지 말자.
4. 그렇게 큰 프로그램은 모바일 프로그램으로 만들 생각을 하지 말자.


하지만, 프로그램에서 필요 없는 메소드들이 어디 있으랴? 좀 더 구조적이고 아름다운 코드를 짜기 위해서 메소드 갯수가 늘어 나는것은 어쩔 수 없는 일이다. 그러므로 좀 더 우아한 방법을 찾아야 하고, 그 방법이 바로 바로 ProGuard 이다.

ProGuard는 Java Bytecode를 난독화, 사용하지 않는 코드 제거, 최적화 등을 수행해 주는 오픈소스 툴이다. 구글 안드로이드측에서도  2.2 인가 부터 이 놈을 추천하고 있다. 해당 툴을 사용하여 최적화 및 사용하지 않는 코드를 제거하게 되면, 메소드 갯수가 많이 줄어 든다. 단, 최적화를 거쳤다면 메소드가 사라지기도 하고, com.ggaman.A.java 파일의 내용 및 메소드가 com.ggaman.B.java 으로 이동되어 있는 경우도 있다. 
그러므로 실제 출시된 제품의 디버깅이 힘든 점이 존재한다. 물론 옮겨진 위치나 변경된 정보를 로그로 남겨주지만 그거 비교하는 것도 얼마나 짜증나는 일이겠는가? 또한 ProGuard 역시 사람이 많든 프로그램이라 버그가 있어, 제대로 빌드를 만들어 주지 못하거나, 빌드는 되나 실행시 제대로 수행되지 않는 경우도 있다. 

하지만 6.5만개 이상의 메소드를 사용할 수 밖에 없는 경우에는 어쩔 수 없이 선택해야만 한다. 

ProGuard에 대한 설명을 하기 위해서 글을 적은것이 아니기 때문에  ProGuard에 관련된 더 자세한 사항은 아래 링크를 이용해 주시라.

구글의 ProGuard 검색 결과
http://www.google.co.kr/#q=proguard&newwindow=1



또 다른 방법도 있다. 문제 상황에 대해서 한번 더 생각해 보면 프로그램의 덩치가 크기 때문에 dex 파일을 만들때 메소드 갯수가 많아서 dex 파일을 못 만들어 내는 것이다. 그렇다면 dex 파일을 여러개 만들면 안될까?

몇 일 전 안드로이드 개발자 블로그에 이 문제를 해결 할 만한 방법이 올라 왔다.

dex 파일을 쪼개서 만들고, Custom Class Loader를 이용해서 dex 파일에 있는  class를 사용하는 방법이다. Android에서는 dex 파일을 읽기 위해서 DexClassLoader를 제공해 주고 있다. 이를 이용해서 파일로 저장되어 있는 dex파일세서 class를 읽어와서 사용할 수 있음을 보여준 예제이다.

다만 해당 방법은 항상 dex파일을 로컬 스토리지에 두고 사용해야 하므로 최초 수행시 dex파일을 로컬 스토리지로 복사해야 하는 점, 그리고 자바의 리플렉션을 이용해서 Class를 찾고 객체는 생성해주어야 하기 때문에 동작이 느린 이슈가 있을 수 있다. 

하지만 로컬스토리지 복사나 동작이 느린것것이 프로그램이 아예 빌드가 되지 않는 것 보다는 훨씬 더 좋은 선택으로 생각된다.

해당 블로그 글은 아래의 링크를 클릭해서 따라 가면 된다.



오랜만에 포스팅 끝. ㅋ.
(검색이 잘 되도록 제목 수정. ㅋ )
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 닉쑤 2011.08.03 03:23 신고

    저도 안드로이드 폰 씁니다 ㅎㅎㅎ

    하지만 개발 내용은 알고싶지 않은..ㅎㄷㄷ;

어제 워크샵으로 워터파크ㅡ오션월드에 갔다 왔었다.

몸이 뻐근하여 지금은 찜질방.
오기전에 회사에 들려 와서 읽을 책을 몇권 골라왔는데 그 중에 한권.

samsung | SHW-M250S

법정스님의 산문집 홀로 사는 즐거움.

책을 펼쳐서 한편을 읽고서는 이내 곧 책을 덮는다.

이 책 첫번째 글인 "산방에 비친 달빛에 잠이 깨어"에서는 법정스님이 자연에서 느낀점을 적어 두었는데, 이곳에서 읽는것은 정말로 맛이 나지 않는다. 에어컨 돌아가는 소리에 사람들 소리...

이제까지 읽을 기회를 잡지못하고 있었는데, 이렇게 허무하게 이 책을 이런곳에서 읽어 버릴순 없지.

내일 적당히 운치 있는곳에 앉어 느긋하니 읽어 보아야겠다.

꼬리.
폰에서 글쓰기 어렵구나.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 닉쑤 2011.07.11 13:28 신고

    저 보내주심 되겠네요~
    딱 읽기 좋은 환경이에요ㅎ

백만년만에 글을 쓰게 되었는데, 글이 책리뷰라서 좀 안타깝긴하다.
네이버 카페 코드인(http://codein.co.kr)에서 책 리뷰를 해 줄 리뷰어를 모집했고, 그래서 얼른 냉큼 후딱 신청해서 당첨이 되었다.

리뷰하려고 하는 책은 "안드로이드 프로그래밍 정복 1권" 이다.

안드로이드프로그래밍정복.1(개정판)SDK2.3진저브레드를적용한안드?
카테고리 미분류
지은이 김상형 (한빛미디어, 2011년)
상세보기


회사에서 하는 일이 Office 프로그램개발인데, Java를 이용해서 만들어야 했으므로 Java swing을 기준으로 개발을 해 왔었다. 하지만 시대의 급변에 따라서 모바일 환경이 중요해졌고, 안드로이드쪽을 공부해야 했었다. 그 때 마침 리뷰어를 모집하는 글이 눈에 띈 것이다.


보통의 프로그래밍 개발 관련 자료들은 인터넷에 널려 있다. 이러한것들이 책으로 출간되는 이유는 무엇일까? 개인적으로 몇가지는 꼽자면 아래와 같다.

1.
첫번째 이유는 튜토리얼은 영어로 되어 있다는 것이다. 아무리 영어를 잘 한다고해도 한글로 되어 있는 문서보다 영어를 읽는데는 어려움이 따른다. 물론 영어 단어의 의미를 정확하게 파악하기도 힘들다.

2.
두번째 이유는 정제되어 있는 내용을 쉽게 읽을 수 있다는 것이다. 인터넷에 떠다니는 내용들은 정확한 내용이 아닐 수도 있고, 아예 잘못된 내용들이 맞는것처럼 돌아 다니는 경우도 있다. 물론 경험적인 측면에서 내려진 답들은 책에 나오지는 않을 수 있지만, "경험적"이라는 의미가 "정확한"이라는 의미가 되지 않는것은 확실히다.

3.
세번째 이유는 좀 더 읽기 쉽다는 것이다. 아무리 좋은 내용이라도 모니터로 보는것과 종이로 보는것이 눈의 피로도에서도 다를 것이다. 그리고 책을 한장 한장 넘겨가면서 읽는것, 그리고 몇번씩 줄을 그어가면서 읽는것, 중요한 내용을 표시하기 위해서 책의 한쪽 끝을 접어 두는것 등의 아날로그적 감성도 한 몫한다.

물론 다른 의견을 가지고 있는 사람도 있으리라.



이전에도 개인적인 궁금함으로 몇권을 안드로이드 관련 책을 따로 구매해서 읽었는데, 그리 만족스럽지는 않았다. 인터넷에 있는 튜토리얼 보다도 못한 책들도 읽었던 것으로 기억한다. 차라리 영어로 되어 있는 인터넷 사이트를 보는게 더 편했을법한 책들도 읽어 보았다.

그런 면에서는 지금 리뷰를 하는 책은 이제까지 읽었던 책 중에서는 제일 좋다고 생각한다. 원래 출간 될 때에는 한권으로 되어 있는 책이었는데, Android SDK 2.3이 나오고 책의 내용도 더 보강을 해서 1권과 2권으로 나누어서 총 2권으로 다시 출간 되었다.



1권은 개발환경 설정부터 Android 개발에 관련된 전반적인 내용이 나온다.

이클립스 설치부터 ADT, DDMS 사용법까지 개발환경을 스크린 샷과 함께 제공해 준다. 현재 Android SDK 3.0이 나오지 않은 상태에서는 책에 있는데로 하면 큰 무리는 없을 듯 하나, 환경 설치등은 인터넷에서 찾아서 최신환경에 맞추는것이 좋아 보인다.

그리고 안드로이드의 기본인 액티비티, 레이아웃, 뷰, 메뉴 관리, 리소스 관리 등이 나온다. 이는 안드로이드에서 기본이 되는 내용이므로 Android를 처음 접하시는 분들은 반드시 읽어보고 알아야 하는 내용이다. 원래 기본기가 중요한거다.


2권에서는 고급스러운 주제들이 나온다.

실무에서 사용하기 좋은 정보들은 2권에 있다. 1권에 있는 내용들은 기초를 다루고 있기 때문에 자바에 경력이 충분하고 본인이 프로그래밍적인 센스가 있다고 생각하는 사람이라면, 기본기는 인터넷으로 튜토리얼을 찾아서 읽고 2권을 구매하여 읽는것이 도움이 될 듯하다.

2권에서는 렌더링, 애니메이션, 네트워크, 미디어 처리에 대해서 나오며, Hello World 프로그램만 짜고 싶지 않다면 2권을 반드시 읽어 보는것이 좋을 듯 하다.



처음에는 이 책을 보고 인터넷에서 떠돌아 다니면서 보았던 안드로이드 관련 정보들을 머릿속에서 새롭게 정리하다는 생각으로 읽어 보았다. 1권에서는 안드로이드 기본에 대해서 잘 나와 있기 때문에 도움이 되었다. 그리고 "이제 실무에 쓸 수 있는 내용을 읽어 볼까~"했는데 정작 고급주제들은 2권에 있다고 한다.

처음 책을 받았을때는 "정복"시리즈답게 한권에 모두 있을 줄 알았는데, 알고보니 내가 리뷰를 하게 된 책은 1권이었던 것이다. -_- 책을 다 읽고 나서 책표지에 있는 "1" 이라는 숫자를 발견하다니 ;;;


실무에서 사용할 고급스러운 주제는 2권에 있으니 책을 구매하실 때는 이러한 점에 유의해야 한다. 처음부터 탄탄한 기초를 쌓고 싶다면 1권부터 사서 읽으시고, 이미 기본적인 내용을 알고 있으시다면 2권부터 시작해도 큰 무리는 없을 듯 하다.

다음 주말즈음에는 2권을 구매하여 읽어 볼 생각이다. 고급 주제중에 일부는 인터넷에서 자료를 찾기 힘든 내용도 있다. File이나 CP 같은 경우에는 인터넷에서 자료를 좀 찾을 수 있었지만, 서페이스뷰 같은 경우에는 쉽게 찾기 힘든 분야이기도하고, 잘 설명 된것도 못 보았다. ( 잘 설명된 "한글"페이지가 있다면 알려..굽신굽신..)


여하튼 1권만 읽었으니 1권만 평가를 한다면, 이제까지 읽어 보았던 안드로이드 관련 책 중에는 제일 잘 만든 책임은 확실하다.
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 닉쑤 2011.04.03 05:52 신고

    리뷰 솔직담백하게 잘 쓰시는데요? ㅋ

    별일 없으시죠? ^^

    아, 저 4월 20일날 한국가요. 움하하!

    • Chan 2011.04.03 21:17 신고

      오~ 한국에? 좋은 소식 가지고 오길 빌께. ㅎㅎ

중문에 관광단지여서, 관광이 목적인 사람은 많은곳을 볼 수 있어서 좋겠지만, 나 같이 여행 자체가 목적인 사람은 그리 크게 볼 것이 없다. 그래서 여미지 식물원을 나와서도 그리 크게 갈 만한곳이 없다. 저번에 왔을때 천제연 폭포는 가 보았고... 그래서 절대 솔로, 그것도 남자 혼자서 가지 말아야 할 곳으로 발길을 돌렸다. 바로 테디베어 박물관.

처음부터 이야기를 꺼내자면, 테디베어 박물관이라고 하면 왠지 건물안에 그냥 테디베어만 있을거라고 생각하게 된다. 하지만 그리 크지는 않지만, 야외에도 몇가지를 꾸며 놓고 있다.

SONY | DSC-W120 | Normal program | 1/80sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:36:15

건물 벽, 왼쪽에 테디베어 뮤지엄이라고 적혀 있다.

SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:36:31

건물로 들어서면 정면에 보이는 안내판. 바로 좌측에서 입장권을 받는다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:38:21

입장권 가격은 7천원. 역시나 그냥 혼자서 구경하기에는 비싼 가격이다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:38:43

왕 비싼곰돌이가 있음.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:38:54

결혼하는 곰돌이들.

입구부터 난관이다. -_- 입구부터 커플을 위한 곳이나 얼른 꺼져 달라고 말하는듯 하다. ㅋㅋㅋㅋ.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 12:39:16

엘리베이터 입구에도 곰이. 사소한곳까지 모두 신경을 써서 만들어 두었다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 12:39:29

예술 작품 급의 곰돌이들도 등장하고.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:40:12

군바리 곰돌이도 등장한다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:40:23

펑크곰.

SONY | DSC-W120 | Normal program | 1/50sec | F/3.2 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:40:34

섹쉬곰도 있다. ㅋ.

SONY | DSC-W120 | Normal program | 1/40sec | F/3.2 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:41:07

이렇게 해 놓으니 진짜 뭔가 작품 같은 느낌.

아래층에는 각종 곰돌이 상품을 팔고 있다.
SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:41:51
SONY | DSC-W120 | Normal program | 1/100sec | F/5.0 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 12:42:08

대빵 곰이랑 나도 사진 찍고 싶었단 말야!!! T_T

SONY | DSC-W120 | Normal program | 1/100sec | F/3.5 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:42:29

북극곰 관련해서 행사를 했는데... 사진은 아래에 나올꺼다.

SONY | DSC-W120 | Normal program | 1/15sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:43:04

안내종이를 나눠주는것도 깔끔하게 만들어 뒀다. 이런 참 잘 해 놓았다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 12:43:47

펼쳐서 한장 찍어 봤다. 별 말은 없다. 걍 소개.

SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:44:38

각종 영화 장면이나, 시대를 곰인형을 이용해서 나타 낸것이 대부분이다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:44:57
SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:47:01
SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:47:52

이렇게 초창기에 있었던 곰인형들을 모아두고 그 역사를 이야기 해 주기도 한다.

SONY | DSC-W120 | Normal program | 1/15sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:48:12
SONY | DSC-W120 | Normal program | 1/15sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:48:55
SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:49:18

이 놈들까지!!! ㅡ_ㅡ+

SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:50:19

전쟁 장면을 나타내고 있다.

SONY | DSC-W120 | Normal program | 1/160sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:51:45

푸우푸우~ 푸우푸우~

SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:52:02

곰돌이 해부시간. ㅋ.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:52:21

진시황의 무덤 장면.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:54:25
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:55:02
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:55:14
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:55:23
SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:55:44

예술작품 패러디 - 생각하는 사람

SONY | DSC-W120 | Normal program | 1/15sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:56:06

예술작품 패러디 - 모나리자

SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:56:32

예술작품 패러디 - 자화상(맞나?)

SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:56:41

예술작품 패러디 - 피리 부는 소년?

SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:56:49

예술작품 패러디 - 천지창조(인가?)

SONY | DSC-W120 | Normal program | 1/15sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:57:19

예술작품 패러디 - 이건.. 이삭줍는.. 그거랑 비슷한데 그건 아니네 -_- ㅋㅋㅋ. 모르겠다.

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:57:28

예술작품 패러디 - 키스(적혀있군.흠흠)

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:58:01
SONY | DSC-W120 | Normal program | 1/50sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:58:27

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:58:51

푸우

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 12:59:13

푸우

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 12:59:36

푸우 아는 동물들.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:00:31

한낱 인형따위도 루이비똥을 가지고 있는데...

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:00:59

인형들이 왜 장신구가 필요하냐구! 걍 옷만 있으면 되지 -_-

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:01:45

지구

SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:02:26

패션쇼 그

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 13:02:43

잔칫날

SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:03:22

제주

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:03:48

드라마 "궁"에 나왔던 그 곰들이다. 주인공 둘만.

SONY | DSC-W120 | Normal program | 1/15sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:04:02

주인공 + 부주인공 까지 총 4명.

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:05:15

또 그놈이다.

SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:05:47
SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:07:31

요게 그냥 곰 같아 보이겠지만.

SONY | DSC-W120 | Normal program | 1/8sec | F/5.0 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:08:07

아까 입구에 적혀 있던 그 125캐럿 눈깔(!)을 가진 곰이다.

SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:08:46

우리나라를 여행중인 곰도 있는데.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:09:12

이 놈이다. 나 보다 가 본 곳이 더 많다. -_-

SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:10:17

안 믿어 줄까봐 인증샷도 막 날렸다.



이상으로 테디베어는 끝이다.

테디베어 박물관에서는 북극곰 살리기 프로젝트라는 기획 전시를 하고 있었는데, 테디베어 보다는 오히려 이곳이 더 재미있었고, 의미도 좋았다. 물론 난 대담하게 혼자 테디베어 박물관에 발을 들인 솔로 남자이기 때문이라고는 말 못한다.

멋진 아이디어로 북극곰을 살리는 혹은 지구 온난화를 경고하는 곰돌이들이 있다. 여기서 부터는 굳이 사진에 설명을 넣지 않아도, 정말로 멋진 아이디어를 이해할 수 있으므로, 그냥 구경해 주기를...

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 13:10:44

기획 전시실 입구.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 13:11:17
SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:11:27
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:11:58
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 13:12:16
SONY | DSC-W120 | Normal program | 1/10sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:12:35
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 13:12:58
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 13:13:32
SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:13:53
SONY | DSC-W120 | Normal program | 1/50sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:14:04
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 13:14:26
SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:14:46
SONY | DSC-W120 | Normal program | 1/25sec | F/3.2 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:15:29
SONY | DSC-W120 | Normal program | 1/20sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:15:46
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 13:16:30
SONY | DSC-W120 | Normal program | 1/50sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:17:11
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 13:17:27
SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:18:01
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 13:18:22
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 13:18:41
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 13:19:24
SONY | DSC-W120 | Normal program | 1/15sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 13:19:40


아래층으로 내려오면 각종 기념품을 파는데, 당연하게도 모두 곰과 관련이 있는 기념품이다. 생각보다 귀여운게 많았다. 선물용으로 몇개 구입하는것도 나쁘지 않아 보인다. 나도 실제로 몇개를 구입하고 선물 하기도 했다.
SONY | DSC-W120 | Normal program | 1/160sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:20:10
SONY | DSC-W120 | Normal program | 1/125sec | F/5.0 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:20:36

나도나도 같이 찍고 싶어. 우엥. T_T

SONY | DSC-W120 | Normal program | 1/160sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:21:08

팬더로 변장을 안해도 되도록 해 줄께 T_T


기념품 가게를 나오면 박물관안의 야외로 나올 수 있는데 이곳에도 곰들을 전시해 두었다.
SONY | DSC-W120 | Normal program | 1/400sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:38:47

테디베어 박물관 외형.

SONY | DSC-W120 | Normal program | 1/800sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:38:49

그 새 날씨가 맑아 졌다.

SONY | DSC-W120 | Normal program | 1/320sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:40:04
SONY | DSC-W120 | Normal program | 1/1000sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:40:20
SONY | DSC-W120 | Normal program | 1/80sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:41:10
SONY | DSC-W120 | Normal program | 1/100sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:41:33
SONY | DSC-W120 | Normal program | 1/200sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:42:14
SONY | DSC-W120 | Normal program | 1/200sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:42:38
SONY | DSC-W120 | Normal program | 1/400sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 13:43:06
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 13:44:45

이상으로 중문 관광은 끝이다. 사실 초콜렛 관련 건물이라던지 소리 박물관이라던지를 더 가 볼 생각도 했었지만, 별로 크게 의미가 없을것 같아서 이정도로 중문 관광은 끝내도록 한다.

남은 자투리 시간을 이용해서 조금이나마 올레길을 걸어 보자는 생각에 경치가 좋다는 올레 7코스로 발길을 돌린다.
저작자 표시 비영리 변경 금지
신고
이 장소를 Daum지도에서 확인해보세요.
제주 서귀포시 예래동 | 테디베어뮤지엄(제주)
도움말 Daum 지도
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 닉쑤 2010.12.21 04:48 신고

    큰 곰돌이랑 셀카 찍었어야죠~~ ㅎㅎ

    당당하게 -ㅅ-

    • 2010.12.25 18:52 신고

      눈이 너무 많았어.
      눈이 한 200개쯤 되었으니깐... ㅋ

      그리고 사람들이 줄을 서 있더라고. ㅎㅎ.
      용기가 나지 않았음. ㅋ

  2. 토끼 2011.05.26 15:25 신고

    이거 사진에 테두리 어떻게 한거야? 옵션 없던데 다른데서 직접해서 블로그에 올린건가.

    • 2011.05.29 00:25 신고

      다른데서 편집해서 올리는거야.
      포토웍스. 라고 검색해 보아~ ㅎ.

오늘은 중문을 돌아 보기로 되어 있는 날이다.

왠지 중문에서는 맛있는 음식을 먹지 못할것 같다는 생각에 아침을 챙겨 먹는다. 어제 밖에 나가서 미리 사 두었던 라면을 끓인다. 아래 사진을 딱 보면 알 수 있다시피 남자의 귀차니즘을 발견할 수 있다.  발견한다면 당신은 진정한 남자!
라면.SONY | DSC-W120 | Normal program | 1/10sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 09:33:39

아침에는 라면에 제격.

물 끓기전에 면이랑 스프랑 다 넣어 놓고, 면 익을때까지 기다리기. ㅋㅋㅋㅋㅋㅋㅋ. 이렇게 하나 저렇게 하나 속에 들어가면 똑같다는 생각에 걍 대충 끓여 먹고 리조트에 이야기해 여미지까지 차로 데려다 달라고 한다. 물론 나오기 전에 라운지에 있던 귤을 몇개 챙기는 센스를 발휘해 줬다.

리조트를 나와서 우선 중문에서 제일 유명하다는 여미지 식물원으로 향한다. 여미지 식물원은 1992년 한국 기네스 협회로 부터 "동양 최대 온실"을 인정 받았다고 한다. 그리고 이전에는 서울시시설관리공단에서 위탁관리를 받아오다가 현재는 다른 회사에서 운영하고 있다고 한다.
여미지 식물원 입구SONY | DSC-W120 | Normal program | 1/100sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 10:58:33

식물원

SONY | DSC-W120 | Normal program | 1/250sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 10:58:54
SONY | DSC-W120 | Normal program | 1/200sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 10:59:52
입구 바로 옆에는 매표소가 있다. 이곳에서 입장권을 구매하면 된다.
입장권SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:01:45

입장권. 입장권이 예쁘지는 않다.

가격은 7천원이라서 비싼 편이라고 생각한다. 물론 동양 최대이고 매우 많은 식물들이 있기는 하지만... 글쎄 혼자들어가서 보기에는 비싼 가격이다. 카메라라도 있는 사람이면 몰라도, 그냥 휘 둘러 보고 올 바에는 들어가지 않는것이 더 좋을 듯 하다.
SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:01:52

뒷면도 꼼꼼하게 찍어 둔다.


들어가면 정면에 보이는...
정면 구조물SONY | DSC-W120 | Normal program | 1/200sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:02:51

날씨가 많이 흐리다.

사진으로 보면 알 수 있겠지만. 날씨가 많이 흐렸다. 그래서 밖을 찍은것은 모두 흐리게 나왔다. 비록 각종 기후의 식물들이 많아서, 특이한 식물들은 모두 건물 안에 있기 때문에 큰 문제가 되지 않겠지만.. 외부에 나와 있는 경치를 찍을때는 이 놈의 날씨가... 계속 사물을 잡아 먹어 버렸다.

식물원에서는 별로 할 말이 없기 때문에 그냥 이번 포스팅은 그리 크게 중요하지 않는 내용은 펼쳐서 보여지도록 하고, 몇몇 중요한 사진만 내용을 적도록 하겠다. ㅋㅋㅋㅋㅋ

밖에는 우선 "정원" 이라는 이름으로, 여러나라의 정원을 꾸며두었다. 한국 일본 등등의 정원이 테마별로 꾸며져 있어서 돌아 다니면서 각 나라의 정원별 특색을 볼 수 있도록 되어 있다.
SONY | DSC-W120 | Normal program | 1/80sec | F/3.2 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:03:47
SONY | DSC-W120 | Normal program | 1/320sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:04:25

호돌이 관광열차(?)도 돌아 다니고 있지만 난 굳이 걷는것을 택했다.



일본식 정원은 정말로 보면 일본 이구나~ 라는 생각이 들 정도로 꾸며져 있다. 그냥 보면 일본식이구나 라는 생각이 든다.
SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:11:01
SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:12:07
SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:12:42
SONY | DSC-W120 | Normal program | 1/160sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:13:58

요게 일본식 정원의 특이한 점이라고 한다. 궁금하면 "고산수정원"에 대해서 찾아 보도록 하자.

SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:17:30
SONY | DSC-W120 | Normal program | 1/125sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:18:11
SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:18:45
SONY | DSC-W120 | Normal program | 1/125sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:21:07
SONY | DSC-W120 | Normal program | 1/50sec | F/3.2 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 11:22:04
SONY | DSC-W120 | Normal program | 1/400sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:22:33
SONY | DSC-W120 | Normal program | 1/200sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:22:53
SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:23:25
SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:24:25

한국 정원은 작은 연못과 정자가 있다는 점이 다르다.

SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:25:12
SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:26:57

내가 보기엔 한국식 정원이 제일 운치가 있다.

SONY | DSC-W120 | Normal program | 1/80sec | F/5.0 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 11:27:15

곳곳에서 음악이 흘러 나와서 걷는데는 지루하지 않다.

SONY | DSC-W120 | Normal program | 1/100sec | F/5.0 | 0.00 EV | ISO-320 | Off Compulsory | 2009:12:25 11:29:01
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 11:30:47
SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:31:21
SONY | DSC-W120 | Normal program | 1/160sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:31:46

보다시피 이태리 정원은 크기가 매우 큰 편이다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:32:19
SONY | DSC-W120 | Normal program | 1/200sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:32:47

그리고 큰 분수도 준비되어 있다.

SONY | DSC-W120 | Normal program | 1/125sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:34:39
SONY | DSC-W120 | Normal program | 1/200sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:35:28
SONY | DSC-W120 | Normal program | 1/250sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:36:15
SONY | DSC-W120 | Normal program | 1/80sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:36:40
SONY | DSC-W120 | Normal program | 1/80sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:36:57
SONY | DSC-W120 | Normal program | 1/200sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:37:29

얼핏보면 아무런 이상한 점을 못 느끼겠지만.

SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:38:00

자세히 보면, 한 가지에서 파랗게 살아 있는 잎들과 죽어 있는 잎들이 명백하게 구분된다.

SONY | DSC-W120 | Normal program | 1/125sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:38:27

이 놈의 이름은 블루버드.

SONY | DSC-W120 | Normal program | 1/100sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:38:39
SONY | DSC-W120 | Normal program | 1/160sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:39:14
SONY | DSC-W120 | Normal program | 1/125sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:41:31
SONY | DSC-W120 | Normal program | 1/250sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:43:08

구경하는 도중에 비가 왔다. 잠시 비를 피했지만, 비가 그치지 않을것 같아. 그냥 옷을 뒤집어 쓰고 구경을 다녔다.

SONY | DSC-W120 | Normal program | 1/200sec | F/8.0 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:43:48

여미지 식물원에서도, 천제연 폭포로 갈 수 있는 다리가 보인다.

SONY | DSC-W120 | Normal program | 1/80sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:44:16
SONY | DSC-W120 | Normal program | 1/80sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:44:48
SONY | DSC-W120 | Normal program | 1/125sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:44:56
SONY | DSC-W120 | Normal program | 1/250sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:45:23

왼쪽에 뭔가 웅크리고 있는게 보인다.

SONY | DSC-W120 | Normal program | 1/125sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:45:59

요렇게 보면 귀엽지만.

SONY | DSC-W120 | Normal program | 1/100sec | F/4.0 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:46:28

이렇게 보면 매우 역동적이다.

SONY | DSC-W120 | Normal program | 1/200sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:48:38

따뜻한 남쪽나라인 제주도라서 그런지 칠한 야자수들이 곳곳에 있다.

SONY | DSC-W120 | Normal program | 1/200sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:50:42

실내로 들어 왔다.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 11:51:33
SONY | DSC-W120 | Normal program | 1/50sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:52:21
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 11:53:08

파리지옥. 참.. 신기한 놈이야.

SONY | DSC-W120 | Normal program | 1/50sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:54:39
SONY | DSC-W120 | Normal program | 1/250sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:55:15

요걸 동영상으로 찍었어야 했는데. 저기 하얀 부분이 계속 움직여서 보는데 지루하지 않았다.

SONY | DSC-W120 | Normal program | 1/50sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:55:59
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 11:59:40

파인애플이 이렇게 자란다는건 볼 때마다 신기하다.

SONY | DSC-W120 | Normal program | 1/50sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:00:42

곳곳에 사진 찍을 수 있는 공간을 마련해 두었다.

SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:01:03

바나나도 이렇게 이상하게 열린다. 신기해. ㅋ.

SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:02:29
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:03:28

ㅡ_ㅡ+ 쳇.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 12:05:03

보다시피 식물이 거꾸로 매달려 있다.

SONY | DSC-W120 | Normal program | 1/25sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:05:29

그리고 모양도 좀 이상하고...

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:05:48

이 놈의 이름은 박쥐란이다. ㅎㅎ. 마치 박쥐가 매달린것 처럼 보인다.

SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:06:55
SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:08:18
SONY | DSC-W120 | Normal program | 1/80sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:09:30
SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:10:50
SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:11:32
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 12:12:19

종이의 원료가 되었다던 파피루스.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:12:29

파피루스를 다른 각도에서.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 12:12:42

이렇게 가는것을 어떻게... 종이로 만들었을까??

SONY | DSC-W120 | Normal program | 1/100sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:13:19
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:14:10

역시 포토존.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:14:48
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 12:15:05
SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-250 | Off Compulsory | 2009:12:25 12:15:54
SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:16:31

똑딱이의 한계. ㅋ.

SONY | DSC-W120 | Normal program | 1/30sec | F/2.8 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:16:58
SONY | DSC-W120 | Normal program | 1/250sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:20:12
SONY | DSC-W120 | Normal program | 1/125sec | F/5.8 | 0.00 EV | ISO-200 | Off Compulsory | 2009:12:25 12:21:00

아까 말했던 그 조형물 설명.


온신들을 모두 둘러 보고 나서 밖으로 나왔더니, 밖에도 크리스마스를 맞이하여 몇개를 꾸며 두었다. 그래서 몇장 찍어 본다. 여기서부터는 사진들이 재미있을 것이다. 그냥 크리스마스 기분에 맞추라고 해 둔것도 있지만, 크리스마스 트리에 꼬마들이 소원을 적어 둔것이 있는데(물론 어른들도 적어 두었으리라), 그 중에서 재미있는 소원들이 많아서 몇장 찍어 두었다.
SONY | DSC-W120 | Normal program | 1/80sec | F/4.0 | 0.00 EV | ISO-160 | Off Compulsory | 2009:12:25 12:21:32
SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:22:32

트리님. 소원을 들어 주세요~

SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:22:45

피카츄랑 놀면 감전 당해요.

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:22:56

그래 꿈은 크게 꾸는거야.

SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:23:26

T_T

SONY | DSC-W120 | Normal program | 1/40sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:23:42

MBLAQ 여친이라매 -_- 만나게 해 달라는 건 뭐니...

SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:23:57

아.. 간절함이 묻어 난다...

SONY | DSC-W120 | Normal program | 1/60sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:24:17

나라를 걱정하는 사람부터,

SONY | DSC-W120 | Normal program | 1/50sec | F/5.0 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:25:09

지구를 걱정하는 사람까지.

SONY | DSC-W120 | Normal program | 1/25sec | F/5.0 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:26:11

"산타" 또한 종말을 걱정하고 있는 것을 알 수 있다.

SONY | DSC-W120 | Normal program | 1/40sec | F/5.0 | 0.00 EV | ISO-400 | Off Compulsory | 2009:12:25 12:26:25

물론 내 가족의 안위가 우선이지.


건물 안쪽 구경을 마치고 다시 밖으로 나왔는데, 비는 어느새 그쳤다. 하지만 날씨는 아직도 희뿌연 구름으로 가득차있다. 본건물 바로 옆에 있는 꽈배기 모양의 나무. 이 나무는 키우는 노력보다도 꾸미는 노력이 더 들었을테지. 역시 사람이던 나무던 후천적으로 다 고칠 수 있는 거야... ㅋㅋㅋㅋㅋㅋㅋ
SONY | DSC-W120 | Normal program | 1/125sec | F/2.8 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:27:58
SONY | DSC-W120 | Normal program | 1/1600sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:28:09
SONY | DSC-W120 | Normal program | 1/320sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:28:31
SONY | DSC-W120 | Normal program | 1/320sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:29:29
SONY | DSC-W120 | Normal program | 1/400sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:29:51

나오면서 정면에서 한 컷.

SONY | DSC-W120 | Normal program | 1/160sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:31:03

저 뒤로 식물원을 두고, 나도 한 컷.

SONY | DSC-W120 | Normal program | 1/80sec | F/7.1 | 0.00 EV | ISO-125 | Off Compulsory | 2009:12:25 12:32:56

선물 받은 모자 잘 쓰고 있다는 증거 사진. ㅋ.


사진이 엄청 많다. =_=

저 사진들 찍으면서 적을 말들을 모두 생각해 두었는데, 이제는 시간이 너무 오래 지나서 잘 기억나지도 않는다. ㅋㅋㅋㅋㅋㅋㅋ. 중문은 사진이 많아서 두번 나눠서 올려야 겠다. ㅋㅋ
저작자 표시 비영리 변경 금지
신고
이 장소를 Daum지도에서 확인해보세요.
제주 서귀포시 예래동 | 제주여미지식물원
도움말 Daum 지도
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 닉쑤 2010.12.21 04:49 신고

    셀카에 깜놀...

    얼짱 각도로찍어야죠 ㅋ

  2. sangpire 2010.12.21 11:31 신고

    와 겨울에 제주 여행이군요...

    • 2010.12.25 18:54 신고

      이건 작년 겨울의 제주도 여행이죠. ㅎㅎ
      근데... 올해도 지금 제주도랍니다. ㅎㅎ

      아직 끝내지 못한 여행을 계속하고 있네요. ㅎㅎ

  3. 토끼 2011.05.04 12:23 신고

    흐음~ 혼자 놀러갔구만~

    • 2011.05.20 13:50 신고

      ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
      ㅠ_ㅠ

+ Recent posts