Oct 042017
 

Docker

  • apt-get install lsb-release
  • curl -sSL https://get.docker.com | sh
  • docker run –rm armv7/armhf-ubuntu_core /bin/echo ‘Hello world’

Docker-compose

  • git clone https://github.com/docker/compose.git
  • cd compose
  • docker build -t docker-compose:armhf -f Dockerfile.armhf .
  • docker run –rm –entrypoint=”script/build/linux-entrypoint” -v $(pwd)/dist:/code/dist -v $(pwd)/.git:/code/.git “docker-compose:armhf”
  • ls -l dist/
  • cp dist/docker-compose-Linux-armv7l /usr/local/bin/docker-compose
  • chown root:root /usr/local/bin/docker-compose
  • chmod 0755 /usr/local/bin/docker-compose
  • docker-compose version

Dockerized HASS(Home ASSistant)

Dcokerized Node-Red

  • cd /root/node-red
  • wget https://github.com/pointbre/nodered-dietpi/blob/master/Dockerfile
  • docker build -t nodered-rpi:0.1 .
  • docker run -dit -p 1880:1880 –name nodered –privileged -v /root/node-red:/data nodered-rpi:0.1
  • 이제 http://rip_ip_address:1880 접속하면 됨
  • 한번 run한 이후로는 docker start nodered 혹은 docker stop nodered만 해주면 된다.
  • 부팅 후 자동 실행을 위해서는 /etc/systemd/system nodered.service 파일을 복사해넣은 후 cd /etc/systemd/system && systemctl enable nodered.service 하면 된다. 재부팅 후 HASS(port 8123, 실행이 시간이 약간 소요됨)와 Node-Red(port 1880)에 접속하면 두 서비스가 모두 살아있음을 확인할 수 있다.
  • 참고로, docker container안에서 백그라운드 서비스만 실행하는 경우, 실행 후 바로 docker container가 종료되는 현상이 있다. 이를 방지하기 위해서 bash 프로세스를 하나 더 실행하는 방식으로 node-red docker container가 계속 실행되도록 하는 트릭이 필요했다. 자세한 내용은 github을 참고하면 된다.
May 162017
 

RFLink gateway

RFLink RF gateway의 치명적 단점은 Serial 통신만 지원한다는 것이다. Arduino Mega의 USB포트를 이용하면 USB to Serial converter를 통해, 혹은 Arduino Mega의 Serial 포트를 통해 통신해야한다. Wireless를 지향하는 내 관점에서 이것은 치명적이었다. 할 수 없이 뭔가를 해야 했다.

Serial to Websocket

RF 신호가 올 때만 메시지를 보내는 방식 때문에 뭔가 “비동기”적인 방식을 사용해야 했다. MQTT말고 다른 걸 해보고 싶어 웹소켓을 골랐다. ESP8266 보드에 웹소켓 라이브러리를 넣어서, serial 포트에서 데이타가 들어오면 웹소켓으로 broadcast해 주면 될 듯 했다. 문제는 ESP8266을 한번도, 아니 arduino 조차도 한번도 제대로 해본적이 없다는 점이었다. 그래서 초보에게 쉬운 보드를 찾아보았다. Witty Cloud Development board를 알리익스프레스에서 USD 3.45짜리 2개를 구입했다. USB to serial 컨버터 내장에, 5v를 3.3v로 변환도 해주니 ESP8266에 처음 발들여 놓는 나에게 적당해 보였다. 이 때까지만 해도, 1 ~ 2 시간이면 되겠지 하는 자만심에 빠져 있었다.

삽질의 시작 CH340G USB칩

안 그래도 알리익스프레스에서 구한 저렴한 arduino mega 2560 때문에 머리가 아픈 상황이었다. osx 10.9.5 상태에서 아무리 해도 드라이버가 인식되질 않는 것(윈도우에서는 드라이버 설치시 잘 동작해서 RFLink 펌웨어를 올릴 수 있었슴)이었는데, 아차차 Witty Cloud Development board도 같은 칩을 사용한다는 걸 미리 체크하지 못한 것이었다.

현재 시점에서 CH340G의 osx용 드라이버는 V1.4인데, osx 10.9.5 에서는 이걸 깔면 안된다. V1.3을 깔아야 하는데, 이외에도 usb 케이블 길이에 따른 이슈도 있었다. 가지고 있던 스마트폰 충전용 케이블을 사용했더니 부팅 후 자동으로 종료되는 문제가 발생해서 여러번 시도해보았다. 2시간여를 끙끙대다가 혹시나 싶어, 가장 짧은 케이블을 꽂고 했더니 그제서야 인식이 되었다. 일단 드라이버가 제대로 설치된 이후로는 arduino mega 2560도 긴 usb 케이블을 가지고서도 잘 인식이 되었다.

Arduino IDE로 esp8266 개발 환경 설정 및 라이브러리 설치

Board Manager

ESP8266

  • Arduino 재시작
  • Witty cloud 보드의 아래쪽 보드(ESP8266MOD칩이 없는 보드)에 달린 usb를 pc에 연결
  • Tool – Board
    • WeMos D1 R2 & mini를 선택
    • Port에서 /dev/cu.wchusbserial410 선택
    • Upload Speed에서 57600 선택
  • 필요한 추가 라이브러리 – ArduinoWebsockets하고 WifiManager 설치
    • Sketch – Include Library – Manage Libraries.. 클릭
      • websockets 검색 후 나오는 목록 선택 후 2.X.X 선택 후 설치
      • wifimanager 검색 후 나오는 항목 설치

라이브러리 설치

Websocket for RFLink gateway

  • github에서 Serial to Websocket 예제를 찾은 후 ip대신 이름으로 접근하게 해주는 mDNSOTA 펌웨어 업데이트가 가능하도록 간단히 수정했다. 최종 소스는 여기서 다운 받을 수 있다.
  • Verify 혹은 Upload 실행 후 후 보드의 Flash 버튼 눌러서 펌웨어 업로드하면 되는 데 빌드가 끝날 때쯤해서 Flash버튼을 누르고 있다가 업로드가 시작되면 버튼에서 손을 떼도 된다.
    • 아무리 해도 안되는 경우에는 usb 케이블을 뺀 후 Flash 버튼을 누른 채로 usb 케이블을 연결 후 Upload해서 업로드가 시작된 후 버튼에서 손을 떼면 된다.
  • 이제 Witty cloud 보드에서 하단 보드를 빼고 상단보드만 아두이노에 연결하면 된다. esp8266 자체는 3.3V 기반이지만, Witty cloud 보드는 5V를 3.3V로 바꿔서 사용하므로 VCC에 5V를 넣어줘야 한다는 것이다. 혹시 보드상의 esp8266에 직접 연결시에는 3.3V를 넣어줘야 한다.
    • 아두이노 RX –> 상단 보드 TX
    • 아두이노 TX –> 상단 보드 RX
    • 아두이노 5V –> 상단 보드 VCC
    • 아두이노 GND –> 상단 보드 GND

Witty cloud board pinout

  • Chrome extension Simple WebSocket Client 설치해서 입력(소스에 입력한 명칭을 사용) 후 open 버튼 눌러서 RFLink gateway에서 메시지를 받을 수 있는지 확인해 본다.
  • 웹브라우저로 http://rflink.local/update (소스에 입력한 명칭을 사용) 접속해서 펌웨어 업로드도 가능하다.
Jun 132012
 

코딩을 하다보면, 테스트를 해야 할 부분, 주석을 더 달아야 할 부분, 기능개선을 해야 할 부분 등 코드의 각 부분마다 제각기 할 일이 있다.
그런데 이 모든 것을 기록하기도 쉽지 않고, 그 위치를 기억하기는 더더욱 어렵다.

이럴 때 유용한 것이 Task Tag다.
말 그대로 소스의 특정 부분을 태그를 달고, 태그별로, 우선순위별로 보고, 완료 여부도 기록할 수 있다.
일단  Java 코딩용으로 사용하는 방법을 알아보자.
환경설정에서 C, C++, PHP, Javascript 등에 Task Tag 항목이 있다면 동일하게 사용할 수 있다.

 

[개발환경]
Mac OS X 10.6.8, Snow Leopard
Eclipse 3.7 Indigo version

1.Task Tag 추가 및 변경
환경설정 > Java > compiler > task tags
기존 Tag(FIXME, TODO, XXX)에서 XXX를 제거한다.
도대체 XXX는 무슨 의미인지 모르겠다. ㅠ.ㅠ
XXX 대신에 NOTE라는 Tag를 Low 우선순위로 생성한다.

각 태그는 다음과 같은 용도로 사용하면 될 듯 하다.

FIXME : 높은 우선순위, 버그 발생 부분, 시급한 수정을 필요로 한 부분에 대한 표시용으로 사용
TODO : 중간 우선순위, 테스트 필요, 주석 작성 필요 부분에 대한 표시용으로 사용
NOTE :  낮은 우선순위, 기능 개선 등이 필요한 부분, 기타 기록용

추가 할 때는 line number 공간에 오른쪽 마우스 클릭 후 Add Task하면 추가 가능

Show View > Task 선택 후 Task Tag를 우선순위 등에 목록으로 보고, 바로 이동가능
완료된 경우 목록 선택 후 오른쪽 마우스 클릭 후 Mark as completed를 하면 됨

종류별로 보고 싶으면 Task View 창의 오른쪽 상단의 역삼각형 클릭해서 Configure Contents 클릭해서 설정 가능
TODO만 보기, 완료되지 않은 것만 보기 등등의 세부 설정이 가능

Jun 122012
 

이전 Posting에서는 키보드 관련한 설정을 해봤고, 이제는 여기 저기 다른 환경에서 코딩하는 사람을 위해 탭, 공백, 들여쓰기 관련한 설정을 살펴보려고 합니다.

참고한 url : http://yatoyato.tistory.com/26

다음은 탭 대신에 공백으로 대체하고, 요즘의 추세에 맞춰서 편집 폭을 좀 늘려주는 것에 관련된 설정들이다.

 

[개발환경]
Mac OS X 10.6.8, Snow Leopard
Eclipse 3.7 Indigo version

1. General > Editor > Text Editors
Displayed tab width : 4
insert spaces for tabs 체크
show line number 체크

2. java > code style > formatter > active profile에서 Eclipse[built-in] 선택 후 edit
(1)indentation 탭에서
tap policy: spaces only
indentation size : 4
tab size: 4

(2)Line Wrapping 탭에서
maximum line width: 120

==> Profile 이름을 다르게 지정해서 저장

3.xml > xml files > editor
Line Width : 120
split multiple attributes each on a new line 체크
indent using spaces 선택

이 정도면 될듯 하다.

Jun 112012
 

iPhone 어플 개발"도" 해볼까 하고, 2년전에 구입한 맥북 화이트 2010를 가지고 스타2만 하다가, 이제 심심해서 ㅠ.ㅠ 슬슬 "코딩"도 해볼까 워밍업 중이다.
천천히 준비중이라서, 맥 환경에서 이클립스와 유용한 플러그인 쓰는 방법을 열심히 공부하고 있다.
한동안 그 결과물들을 정리해 나갈 예정인데, 이번은 그 처음으로 키보드 설정이다.

개발자 혹은 코더 관점에서 애플 키보드를 쓰면서 견디기 정말 힘든건 -.-a Home, End, Page Up, Page Down키가 없다는 거다.
물론 Fn이나 Command 키를 조합해서 쓰면 되는 걸 알고는 있지만,
습관이란 것은 쉽게 바뀌지 않아서 습관인거고,
한 손으로 누르던 것을 다른 손과 함께 눌러야 하는 게 불편한 것은 부인하기 어렵다.
게다가 맥북에다 일반 윈도우 PC용 키보드를 물려 쓰고 있고(애플 키보드 비싸다 ㅠ.ㅠ) 앞으로도 그럴 예정이라서,
적어도 이클립스 쓰면서는 편하게 살고자 방법을 2년만에, 이제서야 찾아 보았다.

[개발환경]
Mac OS X 10.6.8, Snow Leopard
Eclipse 3.7 Indigo version

1.KeyRemap4Macbook http://pqrs.org/macosx/keyremap4macbook/

필수 어플(?)이라고 하는데, 난 2년만에야 구글의 도움으로 찾게 되었다.
여러 기능이 있지만, 오로지 목표에만 집중하자.

2.Eclipse에서 환경설정

환경설정 > General > Keys 에서 다음을 찾아서 맵핑을 변경

Line Start : Home
Line End : End
Page Up : PgUp
Page Down : PgDn
Quick Fix : Ctrl + 1
Content Asistant : Ctrl + Space
Select Line Start : Shift + Home
Select Line End : Shift + End
Select Page Up : Shift + PgUp
Select Page Down : Shift + PgDn

이제 Home, End, Page Up, Page Down과 함께 Shift 누르고 Home, End, Page Up, Page Down 사용이 가능해진다.
아~ 행복하다 ^^

Sep 232011
 

Mysql의 문자열 관련 함수를 보면 구분자를 가지고 분해하는 함수가 없다. ㅠ.ㅠ
varchar로 선언한 컬럼에 'a,b,c,d,e'의 값을 넣고서 첫번째 값은 a, 두번째 값은 b처럼 얻어내고 싶어서 찾아보았더니 해당 문자열 함수 관련 페이지에 다른 사용자가 구현해놓은 것을 발견했다.

test라는 table의 ip 컬럼에 '192.168.1.1;192.168.1.2,192.168.1.3'의 값이 들어있을 때,
첫번째의 192.168.1.1을 얻어내려면, select replace(substring(substring_index(ip, ';', 1), length(substring_index(ip, ';', 1 – 1)) + 1), ';', '') from test
두번째의 192.168.1.2를 얻어내려면, select replace(substring(substring_index(ip, ';', 2), length(substring_index(ip, ';', 2 – 1)) + 1), ';', '') from test

ip 컬럼에 '192.168.1.1'만 들어있어도(구분자가 없어도) 문제없음을 확인했다.
'192.168.1.1;192.168.1.1' 처럼 같은 값이 들어있어도 잘 되는 것으로 수정완료함

참고한 원문 : http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index (하단 사용자 Comment 중)

Jun 012011
 

출처 : http://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf

SO-RCVBUF, SO-SNDBUF:
These parameters allow setting the high water mark for the Send and the Receive Socket.
They can be adjusted for flow control management.
The size of the received buffer is the maximum size advertised window for that connection.
 Socket buffer sizes must be increased in order to increase performances .
Nevertheless these values must be smaller than internal driver resources in order to close the TCP window before exhausting internal driver resources. 
The received buffer size depends on the TCP Windows size, the TCP Maximum segment size and the time needed to absorb the incoming frames.
With a Maximum Segment Size of 300 bytes (a MODBUS request needs a maximum of 256 bytes + the MBAP header size), if we need 3 frames buffering, the socket buffer size value can be adjusted to 900 bytes.
For biggest needs and best-scheduled time, the size of the TCP window may be increased. 
[요약] 주고 받는 최대 패킷 크기보다 송신 버퍼, 수신버퍼를 크게 잡아야 한다

TCP-NODELAY:
Small packets (called tinygrams) are normally not a problem on LANs, since most LANs are not congested, but these tinygrams can lead to congestion on wide area networks.
A simple solution, called the "NAGLE algorithm", is to collect small amounts of data and sends them in a single segment when TCP acknowledgments of previous packets arrive. 
In order to have better real-time behavior it  is recommended to send small amounts of data directly without trying to gather them in a single segment.
That is why it is recommended to force the TCP-NODELAY option that disables the "NAGLE algorithm" on client and server connections. 
[요약] 좀 더 빠르게 데이타를 주고 받고 싶다면 TCP-NODELAY 옵션을 True로 해라

 
SO-REUSEADDR:
When a MODBUS server closes a TCP connection initialized by a remote client, the local port number used for this connection cannot be reused for a new opening while that connection stays in the "Time-wait" state (during two MSL : Maximum Segment
Lifetime).
It is recommended specifying the SO-REUSEADDR option for each client and server connection to bypass this restriction.
This option allows the process to assign itself a port number that is part of a connection that is in the 2MSL wait for client and listening socket.
[요약] 클라이언트 접속시 할당되는 Port를 기다림없이 재활용하고 싶다면 SO-REUSEADDR 옵션을 True로 해라

SO-KEEPALIVE:
By default on TCP/IP protocol no data are sent across an idle TCP connection.
Therefore if no process at the ends of a TCP connection is sending data to the other, nothing is exchanged between the two TCP modules.
This assumes that either the client application or the server application uses timers to detect inactivity in order to close a connection.
It is recommended to enable the KEEPALIVE option on both client and server connection in order to poll the other end to know if the distant has either crashed and is down or crashed and rebooted.
Nevertheless we must keep on mind that enabling KEEPALIVE can cause perfectly good connections to be dropped during transient failures, that it consumes unnecessary bandwidth on the network if the keep alive timer is too short.
[요약] 서버, 클라이언트 양쪽 모두를 위해 SO-KEEPALIVE 옵션을 True로 하는 게 좋다

Apr 072011
 

일반적으로 이클립스를 윈도우7 작업표시줄에 고정해보려고 하니 잘 안되었다.
해본 사람은 알겠지만, 이상하게 안되었다. 자꾸 고정시킨 녀석 말고 다른 데에 다시 실행중 아이콘이 생긴다 ㅠ.ㅠ
 

작업 표시줄에 고정해서 쓰는게 너무 편한데, 그렇다고 포기할 내가 아니었다.
구글神에게 여쭤보니 답을 내려주셨다.
http://thoughtfulcode.wordpress.com/2010/07/15/pin-eclipse-helios-to-windows-7-taskbar/

하는 방법
1.eclipse.ini에 다음 옵션을 추가(설치한 jdk의 bin 디렉토리를 직접 지정해주는 과정)
-vm
C:\Program Files\Java\jdk1.6.0_24\bin <– 자기가 설치한 jdk 위치로 지정함

2.eclipse 실행

3.작업표시줄에 실행된 eclipse 아이콘에 대고 오른쪽 마우스 클릭 후 작업표시줄에 고정

4.마지막 결과물 – 잘 고정된다 ^^

Dec 222010
 

JEXL(Java Expression Language)

소개
수식, 함수 호출 등을 Dynamic 하게 할 수 있도록 지원해주는 Apache Common 프로젝트의 하위 프로젝트
사이트 : http://commons.apache.org/jexl/index.html
아이디어에 따라 많은 활용이 가능하다.
 

사용예제
"a1 + (a2 * 0.2) / a3" -> a1, a2 a3의 값을 db에서 읽어와서 동적으로 결과를 얻는게 가능함
"foo.bar()" -> foo라는 클래스를 생성해서 foo클래스의 bar()라는 메쏘드 호출하고 결과를 얻는게 가능함

static한 메쏘드 호출이 필요한 경우
public class MyClass {
    …
    public static String check(int intParam) {
    }
    …
    public static void main(String args) {
        …
        JexlEngine jexl = new JexlEngine();
        String jexlExp = "MyClass.check(intParam)";
        Expression e = jexl.createExpression(jexlExp);
        JexlContext jc = new MapContext();
        //static하게 호출해야 하므로 클래스명.class로 설정해줌
        //동적생성되는 객체의 경우는 new 클래스명()으로 설정해서 동적생성하면 됨
        jc.set("MyClass", MyClass.class);
        jc.set("intParam", 10);
        Object ojbResult = e.evaluate(jc);
    }
}

 

2011-07-27에 추가한 내용
수식 평가시에도 JexlContext를 이용해야 제대로 수식이 평가됨
예1) "8129391220 * 1" => 수식 만들어서 바로 평가하면 오류 발생
예2) "VAR * 1"로 수식 생성, VAR에 대해 JexlContext 생성 후 set하면 제대로 수식 평가됨
 

Dec 152010
 

구글이 제공해주는 고마운 API다 ^^*
http://code.google.com/intl/ko/apis/maps/documentation/geocoding/index.html#Geocoding

 

참고로 두 좌표간 거리 계산은 다음을 참조하면 됨
http://yc0345.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%91%90-%EC%A2%8C%ED%91%9C%EA%B0%84-%EA%B1%B0%EB%A6%AC-%EA%B5%AC%ED%95%98%EA%B8%B0

1 2 3 4 5 6 7 8 9 10 »