2017년 9월 28일 목요일

Network Packet Inspection using ntop

You can implement DPI application simply using ntop library. (nDPI)

http://www.ntop.org/get-started/download/

Emergency Contact Group on Andriod

자녀가 스마트폰에 빠져 살면, 부모는 스마트폰을 해지하고 싶은 마음이 생긴다.
그럴 때 스마트폰을 Screen-lock 상태로 만들고
Emergency Call만 하도록 설정하면 자녀가 스마트폰을 이용해서 Game, YouTube 같은
것을 할 수 없게 할 수 있다.

Android 버전에 따라 Contact에 대한 Emergency Call 설정하는 방법이 각각 다른데,
아래 URL을 참고하면 도움이 된다.
(Google에서 "ICE on Android" 라고 검색하면 이와 관련된 문서를 볼수있다)


https://android.stackexchange.com/questions/50573/ice-emergency-contacts-on-emergency-dialer-screen
https://rnn10.wordpress.com/2015/06/18/iceandroid/

2017년 9월 14일 목요일

자전거 여행용 패니어 이베라 IB-BA16

자전거 출퇴근을 많이 하다보니 패니어(가방)의 필요성이 느껴진다.
뭐가 좋을까 알아보다가 딱 내 눈을 뜨는 제품을 찾았다.

이베라 IB-BA16

블로그 참고: http://blog.naver.com/aimed40/220165118245
블로그 참고: http://jjcamper.net/220955626906

2017년 9월 11일 월요일

iptables

iptables

방화벽 설정 - iptables

Refer this web site which contains following contents
  • Start iptables (register iptables service)
  • Terminology
    • tables: contains filter, nat, mangle, raw
    • chain: contains INPUT, OUTPUT, FORWARD
      • INPUT: packets which directs from other host to local host.
      • OUTPUT: packets which directs from this host to other host.
      • Forward: packets which passes this host and then goes to other host.
    • match: is matching condition for example IP-5 Tuples.
      • --source (-s): matches source ip address
      • --destination (-d): matches destination ip address
      • --protocol (-p): matches protocol such as tcp, udp
      • --in-interface (-i): input network interface
      • --out-interface (-o): output network interface
      • --state: matches connection state
      • --table (-t): refer to some table name
      • --jump (j): how to treat matched packet
      • --match (-m): matches to certain module
    • target: action when a packet is matched to a condition
      • ACCEPT
      • DROP: delete a packet
      • REJECT: delete a packet and send a response(CONNECTION REFUSED) to original client
      • LOG: write the packet to /var/log/syslog
      • RETURN
    • command
      • -A (--append) : add a new rule
      • -D (--delete) : delete old rule
      • -C (--check) : test a packet
      • -I (--insert): insert a new rule
      • -L (--list) : print existing rules
      • -F (--flush) : delete all rule of chain
      • -N (--new) : make new chain
      • -X (--delete-chain) : delete a chain
      • -P (--policy): change base policy
    • connection tracking
  • print rule set and its sequence
$  iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
2    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
3    ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
4    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  192.168.122.0/24     anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
5    REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc



$ iptables -L --line-numbers -v

Chain INPUT (policy ACCEPT 16M packets, 9085M bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere             udp dpt:domain
2        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere             tcp dpt:domain
3        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere             udp dpt:bootps
4        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT 1 packets, 336 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  any    virbr0  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     all  --  virbr0 any     192.168.122.0/24     anywhere
3        0     0 ACCEPT     all  --  virbr0 virbr0  anywhere             anywhere
4        0     0 REJECT     all  --  any    virbr0  anywhere             anywhere             reject-with icmp-port-unreachable
5        0     0 REJECT     all  --  virbr0 any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 7831K packets, 52G bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     udp  --  any    virbr0  anywhere             anywhere             udp dpt:bootpc

  • iptables configuration (Example)
    • Policy: Accept all ip packet
      • iptables -P INPUT ACCEPT
    • Rule: Delete all rules
      • iptables -F
    • Accept all packet
      • iptables -A INPUT -i lo -j ACCEPT
    • Accept packet which is matched to a condition
      • iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      • iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
      • iptables -P INPUT DROP
      • iptables -P FORWARD DROP
      • iptables -P OUTPUT ACCEPT
    • save current iptables rules
      • service iptables save



[ Reference ]

Firewall configuration - iptables (http://webdir.tistory.com/170)










2017년 8월 31일 목요일

3 Sixty MINI M5 vs M3 vs 그루 M3

모델별에 M3, M5, ME 같은 이름이 있는데, 그 약어를 살펴보면 이렇다.

  • M : Mini
  • 3: 3단 기어
  • 5: 5단 기어
  • E: Electronic Motor


비교 항목: 제조사, 모델, 가격, 스펙, 특징, 장점, 단점


Refer: 3 SIXTY 홈페이지
Refer: 3 SIXTY 동영상
Refer: 3 SIXTY YouTube
Refer: 3 SIXTY YouTube
Refer : 3 Sixty M3 블로그
Refer: 그루 M3 블로그

2017년 8월 25일 금요일

GIT Manual and git command example

GIT Manual (Guide Book)

누구나 쉽게 이해할 수 있는 Git 입문 (입문편, 발전편)   [Korean Edition]

Git Beginner's Guide for Dummies    [English Edition]

NULAB 이라는 일본 회사가 작성한 Git Guide Book이다.
지금까지 봤던 Git 설명서 중에서 가장 짜임새가 좋고, 쉽다.
Git 간편 안내서
git을 시작하기 위한 간편 안내서. 어렵지 않아요.


2017년 8월 23일 수요일

Linux(Ubuntu, CentOS, RedHat) OS가 느릴 때 점검할 사항

If linux OS(Ubuntu, CentOS, RedHat, Alpine, Debian) OS is slow,
then check something like these:

  - run 'htop' command, you can see that swap space is charged and physical memory is available(=free)
  - then run below command
      $ swapoff -a    # this takes several minutes, so please be patient.
      $ swapon -a


You can feel that Linux OS runs faster than before resetting swap memory

2017년 8월 16일 수요일

유두종 바이러스 치료

유두종 바이러스, 일명 피부 사마귀 치료


엄지 발가락 옆에 사마귀가 처음 생긴 것은 2005년 봄이었다.
대부분의 사마귀 환자들이 그렇듯 왜 사마귀가 생겼는지 알 수 없고, 생활하면서 불편함을 느낀다.

우선 외관상 피부병이 보이니까 다른 사람들에게 병이 보여질까 살짝 두렵다.
그리고 발가락에 생긴 사마귀는 신발을 신고, 걸을 때마다 고통을 준다.
더욱 환자를 고통스럽게 하는 것은 이 사마귀는 수년에 걸쳐서 조금씩 크기가 커지고
또 다른 부위에 사마귀가 생긴다는 것이다. 얼마나 더 많은 사마귀 자국이 생길지 예상할 수 없으니까 두려워진다.

내 몸의 사마귀도 거의 7년에 걸쳐서 환부의 크기는 2배 이상 커지고, 또 다른 사마귀가 발에 3개 더 생겼다.

사마귀가 자연스럽게 없어질거라 생각하고 4년을 기다렸다. 사마귀가 점점 커지면서 더 많은 통증을 주기만 할 뿐 좋아지는 기미가 없었다.
그래서 유명한 피부과에 갔다. 진료 접수하면서 피부과에 오지 말걸 이라는 생각이 들었다.
유명한 피부과에는 미용 목적으로 오는 젊고 예쁜 아가씨들이 많다.
그 환자들 속에서 내가 사마귀 치료를 위해 홀로 앉아 있으려니 묘한 기분이 들었다.
어쨌든 의사에게 환부를 보여주니까, 치료법이 없다고 한다.
헐~~ 이건 뭔 소리다냐?
이깟 사마귀에 대한 치료방법이 없다니...
현대 의학으로 할 수 있는 것은 사마귀 환부가 6개월 정도 안 보이게끔 레이져 치료를 하는 것 말고는 없단다.
일단, 보기 흉하니까 레이져로 환부를 치료해달라고 했다.
레이져 시술하고 대략 1~9개월 정도는 정말 깨끗해보였다.
그러나 1년 정도 되니까 다시 원래대로 보기 흉한 사마귀가 툭 튀어나왔다.
결국 또 다른 치료법을 찾으러 다녔다.
그러다 발견한 것이 사마귀 전문 한의원이었다.
120만원 정도 치료비가 들지만, 아프지 않게 치료가 가능하단다.

1년 전에 피부과 의사는  치료법이 없다고 했는데, 한의사는 자신있게 100% 완치를 할 수 있다고 하니까... "이 의사 사기꾼 아니야?" 라는 의심도 들었다.
그래도 나는 120만원을 투자하여 치료하기로 했다. (이때가 2011년 7월 20일쯤이다)
한약으로 족탕을 하고, 먹는 약만 잘 먹으면 되니까 별거 아니라 생각했지만...
치료 기간이 무려 4개월이나 되다보니... 정말 힘들다.
결론은 이 한의학적 치료법은 나에게 효과가 없었다.
120만원만 날렸을 뿐 아니라, 저녁마다 60분씩 족탕을 해야 하는 시간까지도 몽땅 날렸다.
그 한의사에게 한방 주먹을 날리고 싶었지만, 괜히 신문에 가십거리로 나올 것 같아서 참았다.

그러고는 2012년 2월~3월에 유럽으로 출장을 갔다 오면서, 비행기 안에서 이런 생각을 해봤다.
  "사마귀가 바이러스이니까, 열을 가하거나 강력한 자외선을 쪼여주면
   바이러스가 죽지 않을까?
   게다가 사마귀는 피부 안쪽 조직에 있는 바이러스가 아닌, 바깥쪽 피부이니까
   태양광만 오래 쪼여주어도 자외선 영향을 받을 것 같다.
   그리고 피부의 바깥쪽에만 기생하는 바이러스이니까 피부를 계속 깍아주면 바이러스의
   개수도 줄어들겠지.."
이런 생각을 하면서 귀국했다.

2012년 3월 봄부터 햇살이 좋아졌길래, 점심에 1시간씩 공원 의자에 앉아서 양말을 벗고 일광욕을 했다. 발에 햇볕이 잘 닿게 하면서... ^^
그렇게 3개월 정도를 일광욕을 하니까... 느낌상 아주 조금 좋아진 것 같다.
그리고 6월부터는 주말마다 2시간씩 수영장에서 수영을 하기 시작했다.
그런데 이게 정말 효과가 좋았다.
수영 자체가 효과있다는 것은 아니고, 수영장에서 2시간 넘에 있다보니 사마귀 환부가 퉁퉁 물에 불어서 손톱으로 살살 긁기만 해도 사마귀가 절반으로 크기가 줄었다.
이렇게 2012년 6월부터 9월까지 4개월간 수영장을 갈때마다 퉁퉁 물에 불었던 사마귀를 긁었다.
딱 4개월이 되니까 언제 그랬냐는 듯이 매끈한 피부가 재생되고, 사마귀의 흔적이 사라졌다.
참고로, 이 기간에 저녁마다 티눈제거제(액상)를 조금씩 발랐다. 이 액상 티눈제저약과 수영장 물의 영향이 많이 작용한 것 같다.

정리를 해보자면, 사마귀 완치에 영향을 준 요인들은 아래와 같다고 볼 수 있다.
  - 수영장의 물 (2시간 ~ 3시간 가량 사마귀 부위가 물에 퉁퉁 불어서 쉽게 긁어낼 수 있음)
  - 액상 티눈제거제 (밤마다 조금씩 발라서, 각질 제거 효과가 있었음)
  - 자외선 (점심 때마다 1시간씩 일광욕을 하면서 발에 햇볕을 쏘여줌)

비염 치료

벌써 비염 치료를 시작한지 10년째이다.

내가 했던 비염치료를 보면 아래와 같다.

  - 비중격 절제수술
     비중격이 살짝 휘어져 있어서 휘어진 뼈를 잘라냈다.

  - 하비갑개 절제수술
     하비갑개가 비대한 상태여서 점막을 절제하는 수술을 했다.
     그런데, 이 수술은 1~2년 정도 밖에 효과가 없다.
     왜냐하면, 우리의 피부는 상처가 나거나 베이면 다시 새살이 돋기 때문에 수술로 잘라냈다고 해도 결국 1년 정도의 시간이 흐르면 원상태로 점막이 복원된다.
     내 경우도 수술 후 2년이 지나니까 하비갑개가 다시 비대해졌다. ㅜㅜ

  - 한방치료
     한약과 침술로 치료를 했었다.
     기간은 4개월간 이었고, 이틀에 한번 씩 한의원에 들러서 침도 맞아야 했다.
     먹는 약도 있었고, 코에 뿌리는 약도 사용했다.
     참고로 한의원은 강남역 사거리에 있었다.
     이 한방치료는 치료 중에는 효과가 좀 있었다.
     특히, 침을 맞고 있을 때와 침을 맞고 3시간 정도는 코가 뻥 뚫리는 듯한 느낌을 받았다.
     그러나 4개월간의 치료를 마치고 다시 며칠 지나니까 원래대로 코가 막힌다.

     만약 다시 한방치료를 하라고 하면, 아래의 한의원을 가볼까 생각중이다.

     http://www.dooibian.com/

     다른 한의원과 다르게 외과적인 방법도 같이 사용한다. 그리고 이 방식으로 효과를 본 사람들도 많은 듯하다.


  - 식염수로 부비동 세척
     비후성비염이 있는 경우라면, 제일 큰 효과를 본다.
     나도 부비동에 항상 많은 양의 점액이 끈적끈적하게 있어서,
     이 비루(콧물)이 목 뒤로 넘어가서 목이 잠기는 경우도 있고
     헛기침도 자주하게 되었다.
     아침/점심 마다 식염수로 세척을 하니까 이 현상이 70% 이상 호전되었다.
     (100% 좋아지지는 않지만, 70% 정도만 개선되어도 숨쉬기에는 참 편하다)
     참고로 나는 스위퍼(Sweeper)


     [관련 동영상 모음]
       수소수 비강 세척법 (한의사께서 직접 시범을 보여줘요. 친절한 의사같아요 ^^)
       http://www.youtube.com/watch?v=bukv0NavxmE
       http://blog.naver.com/dooibian    <-- 한의사께서 직접 운영하는 블로그. 비염과 관련된 유익한 정보가 많아요.
      
       스위퍼(Sweeper) 세척기  (내가 현재 2년 동안 사용하고 있는 세척기. 그럭저럭 좋은 효과를 보고 있다. 안 하는 것보다는 훨씬 코가 뚫리는 느낌이다)
       http://blog.naver.com/cobyys1?Redirect=Log&logNo=100141780041
       http://dalmuti1.blog.me/30117258195
       http://www.medicore-mall.com/   <-- 제품을 판매하는 사이트

  - 석션
     병원에서 하는 것처럼 집에서도 직접 석션을 할 수 있다.
     나도 20만원짜리 전동 석션을 사용했었는데, 소음이 심해서 지금은 사용하지 않고, 식연수로 세척만 한다.

      http://www.jongnomedical.kr/shop/shopdetail.html?branduid=1486&xcode=007&mcode=006&scode=&type=X&search=&sort=price

      위의 제품은 내가 직접 사용해본 적은 없지만, 구조를 보아하니 괜찮은 것 같다.




[참고 도서]

  • 코골이, 축농증 수술 절대로 하지 마라 - 이우정 (한의사)

    축농증의 원인 및 치료법에 대해서 설명하고 있다.
    질병을 고치려면, 우리 몸에 대해서 잘 알아야 한다. 그런 의미에서 이 책을 읽으면 도움이 된다.




코어(Core) 운동

뱃살을 빼기 위해 좋은 방법

참고 동영상:
https://www.youtube.com/watch?v=leidSYXqSLo&index=14&list=PLfM7aikm_qxAtmfk7MIRZEzrMFZk-k-f7

참고 사이트:
http://m.blog.naver.com/idogonggam_a/220617640798


1. 걷기, 가볍게 뛰기

2. 윗몸 일으키기

3. 다리 들어올리기 (발목을 교차해서)
 

4. 다리 펴고, 다리를 들어올리기

5. 크런치 자세


6. 코어 운동 (1)


7. 코어 운동 (2)


8. 코어 운동 (3)


9. 코어운동 - 리버스 플랭크



2017년 8월 2일 수요일

Docker API for Python

Before running docker client written by python code,
You have to enable Docker remote API on Docker node(Server side).

Enabling Docker Remote API (on Server side)

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

  ## Caution: docker version 17.03 or earlyer
  ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:4243
  ## Caution: docker version 17.06 or later
  ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243

Run following command:
  $ systemctl daemon-reload

  $ systemctl restart docker.service


Install Python API (on client side)

  $ RUN pip install docker


Write Docker Client with Python code

Example Code:
import docker

my_client = docker.DockerClient(base_url='tcp://10.10.108.181:4243')

my_services = my_client.services.list()
idx = 0
for svc in my_services:
    print("[%d]  service             : %s" % (idx, svc))
    print("[%d]  service.id          : %s" % (idx, svc.id))
    print("[%d]  service.name        : %s" % (idx, svc.name))
    print("")
    idx += 1

my_svc = my_client.services.get("my-web")
print("service.id          : %s" % my_svc.id)
print("service.name        : %s" % my_svc.name)
print("service.version     : %s" % my_svc.version)
print("service.attrs       : %s" % my_svc.attrs)


my_images = my_client.images.list()
idx = 0
for img in my_images:
    print("[%d]  img                 : %s" % (idx, img))
    print("[%d]  img.id              : %s" % (idx, img.id))
    print("[%d]  img.attrs           : %s" % (idx, img.attrs))
    print("")
    idx += 1

my_nodes = my_client.nodes.list()
idx = 0
for node in my_nodes:
    print("[%d]  nodes               : %s" % (idx, node))
    print("[%d]  nodes.attrs         : %s" % (idx, node.attrs))
    print("[%d]  nodes.attrs[Status][Addr] : %s" % (idx, node.attrs["Status"]["Addr"]))
    print("")
    idx += 1

my_networks = my_client.networks.list()
idx = 0
for net in my_networks:
    print("[%d]  network             : %s" % (idx, net))
    print("[%d]  network.name        : %s" % (idx, net.name))
    print("[%d]  network.attrs       : %s" % (idx, net.attrs))
    print("")
    idx += 1

net = my_client.networks.get("management")
print("network       : %s" % net)
print("network.name  : %s" % net.name)
print("network.attrs : %s" % net.attrs)

net = my_client.networks.get("gq73i6y2jn9ydc3m44xf7e7ko")
print("network       : %s" % net)
print("network.name  : %s" % net.name)
print("network.attrs : %s" % net.attrs)
print("Subnet        : %s" % net.attrs['IPAM']['Config'][0]['Subnet'])
print("Gateway       : %s" % net.attrs['IPAM']['Config'][0]['Gateway'])
print("Driver        : %s" % net.attrs['IPAM']['Driver'])
print("Containers.keys  : %s" % net.attrs['Containers'].keys())
print("Containers.values: %s" % net.attrs['Containers'].values())
container_list = net.attrs['Containers'].values()
print("IPv4Address       : %s" % container_list[0]["IPv4Address"])
cidr = container_list[0]["IPv4Address"]
ip_addr = cidr.split('/')

print("ip_addr : %s" % ip_addr[0])

You can get detail information from:
  http://docker-py.readthedocs.io/en/stable/client.html

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