2017년 7월 28일 금요일

Create large VM image(disk) file

You can create large virtual disk(or virtual image) file by qemu-img command like this:

  $ qemu-img create -f raw disk-img.raw 30G
  $ qemu-img info disk-img.raw
  $ ls -lh disk-img.raw

2017년 7월 26일 수요일

Set up VIM editor configuration

VIM editor's color setting

[ Set color schema ]
VIM editor에서 아래의 명령을 수행한다.
(1)
: color darkblue
(2)
: color desert

참고로 전체 color schema 보려면, 아래와 같이 directory 조회하면 된다.

ls /usr/share/vim/vim74/
blue.vim       delek.vim      evening.vim    murphy.vim     README.txt     slate.vim     
darkblue.vim   desert.vim     koehler.vim    pablo.vim      ron.vim        torte.vim     
default.vim    elflord.vim    morning.vim    peachpuff.vim  shine.vim      zellner.vim 

쉽게 아래와 같이 기본 설정을 바꿀 있다.

echo "color evening" >> ~/.vimrc


아래와 같이 'ab' 설정을 사용하면, coding할 때 편하다.

ab printf_ printf("%s %s(%d) \n", __func__, __FILE__, __LINE__);
ab while_ while ()^M{^M}
ab if_ if ()^M{^M}
ab for_ for (;;)^M{^M}






2017년 7월 20일 목요일

Study Item to Work



- OpenStack
- Docker and Swarm mode
- Kubernetes
- Ansible playbook
- TOSCA
- Gradle
- Vagrant
- CORD (M-CORD, R-CORD)
- Programming Language: Python
- Programming Language: Go Lang


2017년 7월 19일 수요일

항공권, 호텔을 싸게 예약하는 Tip

여행을 많이 다녀본 사람, 여행사에 근무하는 사람의 말을 종합해보니까 항공권, 호텔을 싸게 예약하는 Tip이 있더라. 요약해보면 아래와 같다.


해외 항공권 (Flight Ticket)

해외항공권을 11주전에 예약하는 것이 평균가보다 저렴하다.
해외항공권을 24주전에 예약하면 가장 싸게 구입할 수 있다.

나라 또는 도시별로 항공권 구매 Tip 차이가 있다고 한다.

일본 지역 항공권

일본 항공권을 13주전에 구입하면 가장 저렴하다. 

오사카 지역 항공권

오사카 항공권을 18주전에 구입하면 가장 저렴하다.

도쿄 지역 항공권

도쿄 항공권을 17주전에 구입하면 가장 저렴하다.

Guam 지역 항공권

Guam 항공권을 4주전에 구입하면 가장 저렴하다.




호텔 (Hotel)

호텔 예약할 때 트리**, 호텔***, 익스***, 아고* 등 호텔 예약 사이트를 이용하는 경우가 많다. 이런 호텔 예약 사이트가 최저가라고 스스로 광고를 하는데 내 경험으로는 최저가가 아닐 뿐더러 이런 예약 사이트의 각종 쿠폰과 할인 이벤트 타이밍에 맞추느라 스트레스만 생긴다.
하나**, 모두** 같은 국내 여행사에 전화를 해서 예약해도 위에서 말한 호텔 예약 사이트와 동일한 가격으로 예약이 된다. 이것은 매번 해외 여행을 할 때마다 경험한 것이고, 심지어는 성수기 때는 호텔 예약 사이트들이 좋은 위치의 호텔 예약이 안 될 때 국내 여행사에 전화를 하면 몇 시간 동안 알아봐주고 결국 내가 원하는 호텔을 싼 가격에 예약해준다.
결국 호텔 예약 사이트에서 웹 서핑질한다고 몇 시간씩 까먹는 시간을 생각해보면, 국내 여행사에 호텔 예약을 맡겨 놓는 것이 좋다. (금전적으로 + 시간적으로 모두 이익이다)



Tip 총정리

대체로 아래와 같은 일반적으로 통하는 Tip이 있다고 한다.

  • 3월에 출발하는 항공권이 가장 저렴 ( 8% 저렴)
  • 8월에 출발하는 항공권이 가장 비쌈 (13% 비쌈)
싸게 여행하려면, 2~3개월 전쯤 티켓을 예약하는 것이 좋고
가능하면 3월에 여행하면 여행비를 많이 줄일 수 있을 것이다.


참고 URL

Stop-Over 여행 방법 블로그: http://blog.travelmate.co.kr/220878504186



2017년 7월 17일 월요일

Raspberry PI - 적외선 센서 응용 (infrared light sensor) with HC-SR501

HC-SR501 PIR Motion Detector - Product Description (Manual)

https://www.mpja.com/download/31227sc.pdf



Interfacing HC-SR501 PIR Motion Sensor with Raspberry Pi

Python Program Example Code

https://electrosome.com/pir-motion-sensor-hc-sr501-raspberry-pi/

https://www.modmypi.com/blog/raspberry-pi-gpio-sensing-motion-detection

2017년 7월 12일 수요일

How to install and configure VNC on Ubuntu 14.04 or 16.04

Installing the Desktop Environment and VNC Server

$ apt install xfce4 xfce4-goodies tightvncserver
$ apt-get install gnome-panel
$ apt-get install gnome-settings-daemon gnome-terminal metacity nautilus



Edit configure file

$ cat ~/.vnc/xstartup

#!/bin/sh

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
autocutsel -s CLIPBOARD -fork
autocutsel -s PRIMARY -fork
vncconfig -iconic &

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &

gnome-terminal &


Start VNC server

You could do this at the command line to control the geometry of a particular desktop, for example:

$ vncserver -geometry 1920x1080
or
vncserver -geometry 1024x768


or You could create a ~/.vnc/config file and populate it with the following to control the geometry of all desktops created by a particular user:

  -geometry 1920x1080

or You could create an /etc/vnc/config.custom file and populate it as above to control the geometry of all desktops created by all users.



Stop VNC server

$ vncserver -kill :1
or
$ vncserver -kill :2



You can get more information from https://support.realvnc.com/knowledgebase/article/View/393/5/how-can-i-change-the-geometry-of-a-vnc-server-in-virtual-mode-desktop



2017년 7월 7일 금요일

20년 전, 처음으로 돈을 받고 프로그램을 개발한 기억

딱 20년전, 이때쯤이다.
1997년 여름. 나의 대학교 2학년 여름 방학이 시작되었다.
기말시험을 치르고, 밀린 SW 프로그램 과제를 제출하느라 정신없다가 갑자기 방학이 시작되니까 공허해졌다.
나는 갑자기 닥친 공허함을 달래기 위해서, 그리고 생활비를 벌기 위해서 아르바이트(단기 돈벌이)로 무엇을 할까 고민하고 있었다.  바로 그때 서강대학교 행정부서의 어떤 직원에게서 연락이 왔다. (나를 어떻게 알고 연락을 했는지 모르겠다. --)

학교 행정부서의 웹서버와 웹페이지를 만들어 줄 수있냐는 문의였다.
간단한 MS-DOS 응용 프로그램, CGI 프로그램 정도는 만들 줄 알았고, HTML의 모든 TAG는 암기하는 수준이고, Java Script를 다룰 줄 알았기 때문에 학교 행정 직원의 제안을 받아들였다.
(지금은 구닥다리 테크닉이지만, 90년대 중반에 이런 것을 하는 사람이 별로 없었다. ㅋㅋ)

학교 행정 부서의 요구 사항은 이랬다.
 - 서강대학교 전체 웹 서비스에 대한 검색 기능 개발 (막막했다. 검색 엔진을 어떻게 만드는지 몰라서)
 - 외국에 거주하는 서강대학교 졸업생을 위해 증명서 접수를 할 수 있는 웹 접수 창구 개발
 - 학적 관련 안내 서비스
 - 병무 관련 안내 서비스
 - 기타 ...

개발 기간은 2학기 시작하기 전까지 ^^
여유로워야할 여름 방학이 갑자기 분주해졌다.

HW 준비하고, Linux OS설치하고, Apache Web Server 설치하고, Web service story board 작성하고, HTML과 JPG 이미지 파일로 GUI 제작하고, CGI로 민원 접수 처리하는 기능 만들고, DBMS가 없어서 직접 DB처리하는 SW 만들고...
돈을 받고 일을 하니까, 장난 삼아서 만드는 것이랑 심적 부담이 달랐다.
대학생 아르바이트라고 하기에는 보수(개발비)도 많았다. 다른 친구들의 알바 급여보다 3~4배 정도 많았던 것으로 기억한다.

대학교 2학년 여름 방학에 숨 넘어가는 줄 알았다.
CGI를 C언어로 개발하다보니 개발 속도는 더디고, 그때는 Debugging Tool이 좋지 않아서 테스트할 때 문제 해결하는 시간도 길었다. 우여곡절 끝에 개발 완료하고 2학기부터 웹 서비스를 시작했다.

헐~ 반응이 좋았다.
그 당시 서강대 학생들 중에 내가 만든 웹 서비스를 안 쓴 사람이 없을 정도...
웹 서버 로그를 보고 있으면 쭉쭉 로그가 올라갔다..

해외에서 증명서 발급 접수 신청한 것이 DB에 저장된 것을 보니까 뿌듯했다. ^^

아마추어의 첫 일 치고는 그럭저럭 잘 한듯...

Kuryr, Docker for Openstack Neutron

Kuryr is Docker for Openstack Neutron

Kuryr에 대한 나의 느낌

Openstack에 익숙해지니까, Docker Container가 유행했고, Docker Container를 가지고 이것저것 테스트하면서 Docker Container 격리 기술에 익숙해니까, 
Kubernetes, Swarm, Mesos 같은 container cluster 기술이 등장하면서 또 한차례 괴로움을 느꼈다.
(신기술이 나오면, 반가워야 하는데... 변화와 진화 속도가 너무 빨라서 내가 괴로울 때가 있다)

이제 container cluster 기술에 익숙해지니까, Openstack과 container를 같이 사용하자는 제안이 여기저기서 나온다.
잘 모르고 생각하면, Openstack과 Docker container를 같이 쓰는 것은 좋아 보이지만 Network 관리하는 방식이나 Network driver가 서로 달라서 Bare Metal Machine(HW)만 공유할 뿐 실제 Network driver를 같이 사용하는 것은 안 되어 진정한 cluster라고 할 수 없다.
즉, 한개의 Bare Matal Machine에 2개의 Cluster platform이 따로 운영되는 것이다.
(무슨 의미인지 마음으로 느껴지지 않는다면, Openstack으로 다양한 Network을 구성하고 테스트해보라. Openstack Neutron으로 networking을 한다는 것이 쉽지 않음을 알 수 있다. 게다가 다른 cluster와 overlay network을 구성하려면 더 괴롭힘을 당할 수 있다는 것도 알 것이다)

그런데 작년부터 이런 문제를 간파하고 똘똘한 개발자가 Openstack neutron과 
Swarm network driver를 같이 쓸 수 있는 network driver를 만들었다.
개발 Motive와 Concept이 아주 훌륭한다.
이렇게 세상이 필요로 하는 것을 만들어준 개발자에게 존경을 표한다 ^^

Openstack neutron과 Swarm network을 같이 공유할 수 있게 해주는 것이
Kuryr network driver이다. 발음이 좀 어렵다.
YouTube에서 Kuryr 소개 영상을 보면, 발표자가 Kuryr를 어떻게 발음하는지 들을 수 있으나 발표자마다 발음이 제각각이다. ^^
표준 어휘가 아니니까 발음에 대해서는 각자의 개성에 맡겨야 할듯하군.



Using existing Neutron networks

아래와 같이 neutron이 생성한 Network UUID를 이용해서 docker network과 연동할 수 있다.


$ docker network create -d kuryr --ipam-driver=kuryr --subnet=10.10.0.0/24 --gateway=10.10.0.1 \
   -o neutron.net.uuid=d98d1259-03d1-4b45-9b86-b039cba1d90d mynet

또는 neutron의 network name을 직접 이용하여 docker network이 neutron network을 참조할 수 있다.

$ docker network create -d kuryr --ipam-driver=kuryr --subnet=10.10.0.0/24 --gateway=10.10.0.1 \
   -o neutron.net.name=my_neutron_net mynet


Using existing Neutron ports

Container를 생성할 때, Neutron ports의 특정 ip address를 지정하는 것이 된다. 

$ docker run -it --net=kuryr_net --ip=10.0.0.5 ubuntu

그러나, Docker swarm network이 Neutron ports를 참조하는 것은 안 될 것 같다. swarm service를 구성하는 각 container는 docker engine이 해당 network의 subnet 정보를 확인하여 자동 할당해주는 ip address를 사용하도록 되어 있으니까.









You can get more information from


Docker and Swarm





Make Private Registry (Deploy a registry server)

Run a local registry

Use a command like the following to start the registry container

  $ docker run -d -p 5000:5000 --restart=always --name registry registry:2
or you can change service port number (5555)
  $ docker run -d -p 5555:5000 --restart=always --name registry registry:2  

The registry is now ready to use.

Copy an image from Docker Hub to your registry

Pull the busybox:ubuntu-14.04  or busybox:1.26

  $ docker  pull  busybox:1.26

Tag the image as localhost:5000/andrew-busybox
  
  $ docker  tag  busybox:1.26  localhost:5000/andrew-busybox

Push the image to the local registry running at localhost:5000

  $ docker  push  localhost:5000/andrew-busybox

Verify if the image is on private registry server

  $ curl  -X GET  http://localhost:5000/v2/_catalog
  $ curl  -X GET  http://localhost:5000/v2/andrew-busybox/tags/list

Let's test.
Remove the cached docker images, and then pull the new image from my local registry.

  $ docker  image  remove  busybox:1.26
  $ docker  image  remove  localhost:5000/andrew-busybox
  $ docker  pull  localhost:5000/andrew-busybox



You can read more information about private registry from https://docs.docker.com/registry/deploying/

Search image repository on private registry

You can get a image repository information from private registry like this,

  $ curl  -X GET  http://localhost:5000/v2/_catalog
  {"repositories":["andrew_busybox_0614","busybox"]}

  $ curl  -X GET  http://localhost:5000/v2/busybox/tags/list
  {"name":"busybox","tags":["17.03"]}

You can read more information about API specification from https://docs.docker.com/registry/spec/api/#listing-repositories


Delete image repository on private registry

You can delete a image repository from private registry like this,


  $ curl -X DELETE http://localhost:5000/v2/busybox/busybox/17.03



You can read more information about API specification from 





Usefull docker command

Stop all docker container

  $ docker stop $(docker ps -a -q)

Remove(Delete) all docker container

  $ docker rm $(docker ps -a -q)

Remove(Delete all docker images
  $ docker rmi $(docker images -q)

Docker process status with pretty format
  $  docker ps --no-trunc --format "table {{.Image}}\t{{.Names}}\t{{.Command}}\t{{.CreatedAt}}\t{{.Ports}}"


Extract exposed port information from docker image
  $ docker image inspect http_svr:17.07  --format "table {{.Config.ExposedPorts}}"
    table map[10000/tcp:{} 8080/tcp:{}]


Send a process signal to docker container
  $ docker kill -s HUP $(docker ps --no-trunc --filter 'name=mysite_lbaas-1' --format "table {{.Names}}" | grep -v "NAME")

Useful alias

You can add the following alias command for docker operation

=========================================
alias docker_ps='docker ps --no-trunc --format "table {{.Names}}\t{{.Image}}\t{{.Command}}\t{{.CreatedAt}}\t{{.Ports}}"'
alias docker_rm='docker rm $(docker ps -a -q)'
alias docker_rmi='docker rmi $(docker images -q) --force'
alias docker_stop='docker stop $(docker ps -a -q)'

alias docker_monitor='while true; do date; docker_ps ; sleep 10; echo ""; echo ""; done'
=========================================




Enabling Docker Remote API

Read the web page:
  https://www.ivankrizsan.se/2016/05/18/enabling-docker-remote-api-on-ubuntu-16-04/

Modify docker.service file.
  file path: /lib/systemd/system/docker.service

  ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:4243

Run following command:
  $ systemctl daemon-reload

  $ systemctl restart docker.service


Read the web page:
  https://docs.docker.com/registry/insecure/

  file path: /etc/docker/daemon.json
  {
    "insecure-registries" : ["swarm00:5000"]
  }


Test REST API
  $ curl http://10.10.2.241:4243/images/json
  $ curl http://10.10.2.241:4243/containers/json


Dockerfile

Write following example Dockerfile:

FROM ubuntu:16.04

RUN apt-get update -y
RUN apt-get install -y apt-utils
RUN apt-get install -y net-tools vim iperf

## This EXPOSE option is not effective on swarm mode.
# EXPOSE 20001 20002 20003

CMD /usr/bin/iperf -s -p 20001 -o /tmp/andrew.log


After writing Dockerfile above, then run following command:

  $ docker build -t andrewubuntu:v3 .
  $ docker tag andrewubuntu:v3  swarm-master:5000/andrewubuntu:v3
  $ docker push  swarm-master:5000/andrewubuntu:v3
  $ docker service create --name andrewubuntu-1  --publish 30001:30001  swarm-master:5000/andrewubuntu:v3


Python Example Code






Function Call Stack - Print

If you want to print function call stack on log function,
then just do following:

import inspect
print(str(inspect.stack()[1][1:4]) + ' ' + "Something to print")

In this example Python code, Stack depth is most important.
Stack depth [1] means that previous calling function frame(or context)

If you use some log api, then you may write like following example:


import inspect
def log_debug(self, msg):
    try:
        self.logger.debug(str(inspect.stack()[1][1:4]) + ' ' + "Something to print")



Log




Thread




try, except, else, finally

import socket
try:
    ip = socket.gethostbyname('daum.net')
except Exception as ex:
    print("Exception: type(%s)   %s" % (type(ex), ex.args))
    print("Exception: %s" % str(ex))
    exit()
else:
    print("IP Address: %s" % ip)
finally:
    print("Once again, IP Address: %s" % ip)





JSON Parser


#!/usr/bin/python3

try:
    import json
    from pprint import pprint

    output = '[{"name": "andrew", "nick": "peter", "location": "Seoul"}]'

    json_content = json.loads(output)
    pprint(json_content[0])
    print("\n My Location: %s" % json_content[0]["location"])
except Exception as ex:
    print("My Exception: %s" % str(ex))




TIME, DATE

Example Python code:
import time
import datetime

print("Form 1 = %s" % datetime.datetime.now())
print("Form 2 = %s" % time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())))



__file__ and os.path module package

Example Python code:
#!/usr/bin/python3

import os


print("__file__: %s" % __file__)

print("realpath: %s" % os.path.realpath(__file__))
print("dirname : %s" % os.path.dirname(os.path.realpath(__file__)))
print("abspath : %s" % os.path.abspath(os.path.dirname(os.path.realpath(__file__))))

Output:
__file__: ./aa.py
realpath: /root/andrew_test/python_example/aa.py
dirname : /root/andrew_test/python_example
abspath : /root/andrew_test/python_example





Popen

You can fork a process and get stream from the pipe of the process.
Example Python code:
import subprocess
import shlex

command = "ls -alh"
popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
(stdoutdata, stderrdata) = popen.communicate()

print("stdoutdata: %s" % stdoutdata)

print("stderrdata: %s" % stderrdata)



Set Timezone to Seoul Korea on Ubuntu

Just do following command line

  $ rm /etc/localtime
  $ ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime


If you use docker container, then you can do like the following line.

  ===================== Dockerfile ========================
  RUN  rm  /etc/localtime
  RUN  ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
  =========================================================