본문 바로가기

2014
마이크로소프트웨어

글: 이준혁 | neosarchizo@naver.com / 2014년 7월 28일


[Internet of Things] 인텔 최초의 아두이노 호환 보드(2)

인텔 갈릴레오 활용하기

지난 시간에는 인텔 갈릴레오(이하 갈릴레오)가 가진 경쟁 제품과의 차이점과 특징을 살펴봤다. 갈릴레오는 인텔이 개발한 아두이노 호환 보드로, 아두이노 UNO에 사용하는 소스 코드를 사용할 수 있고 리눅스가 구동된다는 특징을 가지고 있다. 이번 시간에는 갈릴레오의 초기 설정부터 이더넷, 미니 PCI 익스프레스 등을 활용하는 방법에 대해 살펴본다.



1회 | 인텔 갈릴레오 분석하기
2회 | 인텔 갈릴레오 활용하기

지난 시간에는 인텔 갈릴레오(이하 갈릴레오)가 가진 경쟁 제품과의 차이점과 특징을 살펴봤다. 갈릴레오는 인텔이 개발한 아두이노 호환 보드로, 아두이노 UNO에 사용하는 소스 코드를 사용할 수 있고 리눅스가 구동된다는 특징을 가지고 있다. 이번 시간에는 갈릴레오의 초기 설정부터 이더넷, 미니 PCI 익스프레스 등을 활용하는 방법에 대해 살펴본다.


초기설정

갈릴레오는 아두이노 UNO와 동일하게 스케치를 사용하지만 개발에 사용하는 프로그램은 다르다. 따라서 갈릴레오 홈페이지에서 관련 프로그램을 다운로드해 설치해야 한다. 갈릴레오 다운로드 페이지(communities.intel.com/docs/DOC-22226)로 이동하면 각 운영체제별 설치파일을 확인할 수 있다.


이것만은 반드시 주의하세요!

갈릴레오를 초기설정하기 전에 주의할 사항이 있다. PC와 연결할 때 반드시 전원 어댑터를 먼저 연결하고, 그 다음 USB를 연결해야 한다는 점이다. USB를 먼저 연결할 경우 회로가 망가질 수 있다. 반대로 연결을 해제하는 경우에도 USB를 먼저 제거한 뒤 전원 어댑터를 분리해야 한다.


● 윈도우

다운로드한 윈도우용 아두이노 설치파일의 압축을 해제하면 바로 실행이 가능한데, 가급적 최상단 루트와 가까운 곳에 압축을 해제하는 것이 좋다. 아두이노가 설치된 디렉토리의 경로가 너무 길면 정상적으로 작동하지 않는 문제가 발생할 수 있기 때문이다. 또 경로 상에 한글이나 공백이 없어야 한다.


아두이노를 설치한 뒤에는 드라이버를 설치해야 한다. 갈릴레오에 전원을 연결한 다음 USB를 통해 갈릴레오를 PC에 연결하면 자동으로 장치를 인식하고 드라이버 설치를 시도할 것이다. 그러나 이내 실패했다는 경고창이 나타나게 된다. 그럼 ‘장치 관리자’로 이동하자. ‘기타 장치’에서 ‘Gadget Serial v2.4’를 찾을 수 있는데, 여기에 마우스를 가져다 댄 뒤 우측 버튼을 눌러 ‘드라이버 소프트웨어 업데이트’를 선택한다. 아두이노가 설치된 경로에서 ‘hardwarearduionox86 ools’를  지정하고 설치를 진행하면 된다. 설치가 완료되면 ‘포트 (COM & LPT)’에 추가된 갈릴레오와 해당 포트 번호를 확인할 수 있다. 만약 갈릴레오의 포트 번호가 10 이상이라면 한 자릿수로 변경하는 것이 좋다. 스케치를 업로드할 때 포트 번호가 10 이상이면 에러가 발생할 수 있기 때문이다.


● 맥

맥용 아두이노도 압축 파일로 돼 있다. 파일의 압축을 해제하면 Arduino.app이란 응용프로그램을 확인할 수 있다. 주의할 점은 일반 아두이노에서 사용하는 아두이노 프로그램도 Arduino. app으로 돼 있기 때문에 서로 구분할 수 있도록 이름을 바꿔주는 것이 좋다. 응용프로그램의 이름을 변경할 시에는 공백이나 한글을 넣지 않도록 한다. 맥에서는 별도의 드라이버 설정 없이 바로 아두이노를 실행하면 된다. 포트는 ‘/dev/cu.usbmodemXX XX/’ 형태로 설정된다.


● 리눅스

리눅스용 아두이노는 tar 파일로 돼 있다. 파일을 다운로드한 후 의 명령어를 입력해 압축을 해제한다.


> 리눅스용 아두이노 파일 압축 해제하기

tar -zxvf arduino-1.5.3-linux32.tar.gz

리눅스에서는 기본적으로 모뎀 관리자가 설치돼 있는데, 모뎀 관리자를 제거해야 아두이노가 정상적으로 실행된다. 와 같이 모뎀 관리자를 삭제한다. 리눅스도 맥과 마찬가지로 별도의 드라이버 설정을 하지 않아도 된다.


> 리눅스 모뎀 관리자 제거하기

sudo apt-get remove modemmanager

갈릴레오 연결하기

아두이노와 드라이버 설치가 완료됐다면 이제 갈릴레오를 연결할 준비를 마친 것이다. 갈릴레오의 클라이언트 USB를 PC에 연결하고 아두이노를 실행한다. 아두이노가 실행됐다면 포트를 연결한다. ‘도구(Tools)’에서 ‘시리얼 포트(Serial Port)’를 선택하면 현재 활성화된 포트를 확인할 수 있다. 윈도우에서는 해당 COM 포트를 선택하면 되고, 맥에서는 ‘/dev/cu.usbmodem XXXX’로 표시된 것을 선택하면 된다. 다음으로 보드를 선택한다. ‘도구(Tools)’에서 ‘보드(Board)’를 선택하면 보드 목록이 표시된다. 현재는 갈릴레오 하나만 표시되만 x86기반 아두이노 호환 보드가 더 늘어나면 그 중 갈릴레오를 찾아 선택하면 된다.


펌웨어 업데이트

갈릴레오의 펌웨어는 2014년 4월 14일을 기준으로 0.7.5.7 버전까지 공개된 상태다. 갈릴레오가 아두이노를 호환하기 때문에 아두이노 UNO의 소스 코드와 쉴드를 사용할 수 있다고 하지만 아직 몇 가지 버그나 지원되지 않는 함수들이 존재한다. 인텔은 지속적인 펌웨어 업데이트를 통해 이러한 문제를 해결해 나갈 것이라고 밝혔다. 따라서 주기적으로 펌웨어 업데이트를 확인하는 것이 좋다.


펌웨어 업데이트 방법은 다음과 같다. 우선 갈릴레오에 삽입된 SD카드가 있다면 제거한 뒤 재부팅한다. 아두이노를 실행한 뒤 ‘도움말(Help)’ 메뉴에서 ‘Firmware Update’를 선택한다. 실행하면 진척도가 표시된 팝업창이 나타나는데, 이 팝업창이 사라지기 전까지 절대 갈릴레오의 연결을 해제하면 안 된다. 펌웨어 업데이트 시간은 대략 5분 정도 소요되며, 완료되면 성공했다는 메시지 창이 나타난다.


리눅스 시리얼 통신

갈릴레오 보드에 보면 ‘UART’라고 적힌 3.5mm 오디오 단자를 확인할 수 있는데, 이는 사운드와 관련된 처리를 하는 단자가 아니라, 갈릴레오의 리눅스와 시리얼 통신을 하기 위한 용도로 사용된다.



▲ 3.5mm to DB9 케이블


시리얼 통신을 하기 위해서는 과 같은 3.5mm to DB9 케이블이 필요하다. 요즘의 데스크톱과 노트북에는 DB9이 없는 모델이 많으므로, 이 글에서는 DB9을 다시 USB로 변환하는 케이블을 이용한다는 전제로 설명할 것이다. 시리얼 통신을 할 때 기존의 갈릴레오 USB 클라이언트와 연결할 필요는 없다. 시리얼 통신을 하기 위해 CoolTerm과 같은 터미널 프로그램이 필요한데, ‘freeware.the-meiers.org’라는 웹사이트에 접속하면 각 운영체제용 CoolTerm을 다운로드할 수 있다. 갈릴레오를 연결한 상태에서 CoolTerm을 실행한 다음 ‘Connection’ 메뉴에서 ‘Options...’를 선택한다. ‘Port’를 usbserial로, ‘Baudrate’를 115,200bps로 설정한다. 설정을 저장하고 ‘Connect’를 누르면 리눅스에 연결된다. 간혹 Connected 모드로 전환된 후 화면에 아무것도 표시되지 않는 경우가 있는데 엔터를 한번 입력하면 화면의 내용이 나타날 것이다. 처음 연결하는 경우에는 사용자에 root를 입력하고 비밀번호는 없기 때문에 그냥 엔터를 치면 된다.


아두이노에서 리눅스 명령어 사용하기

앞서 설명했던 것처럼 시리얼 통신으로 갈릴레오의 리눅스를 제어할 수 있지만, 3.5mm to DB9 케이블을 가지고 있는 사람이 흔치 않을 것이다. 물론 케이블을 가지고 있지 않더라도 아두이노 스케치를 이용해 리눅스를 제어할 수 있다. 라즈베리파이가 system이라는 함수를 이용해 리눅스를 바로 제어할 수 있듯이, 갈릴레오도 동일하게 system이라는 함수를 제공하기 때문이다.


> system 함수를 이용해 현재 시간 가져오기

// 시간 정보를 담기 위한 변수

char buf;

void setup() {

// 아두이노 시리얼 모니터에서 확인하기 위해 Baudrate를 115,200bps로 설정한다.

Serial.begin(115200);

// 시스템 시간을 2013년 1월 1일 12시로 설정한다.

system("date 010112002013");

}

void loop() {

// 현재 시간을 '/home/root/time.txt'에 기록한다.

system("date '+%H:%M:%S' > /home/root/time.txt");

// 파일 변수

FILE *fp;

// '/home/root/time.txt' 파일을 읽기모드로 연다.

fp = fopen("/home/root/time.txt", "r");

// buf 변수에 텍스트 파일의 내용을 집어넣는다.

fgets(buf, 9, fp);

// 파일을 닫는다.

fclose(fp);


// 아두이노 시리얼 모니터에 출력한다.

Serial.print("The current time is ");

Serial.println(buf);

// 1초 멈춤

delay(1000);

}



▲ 아두이노 시리얼 모니터에 현재 시간 출력


은 system 함수를 이용해 리눅스 시스템의 현재 시간을 시리얼 모니터로 출력하는 예제다. 이를 실행하면 와 같이 현재 시간이 출력됨을 확인할 수 있다. 앞서 시리얼 통신에서 CoolTerm의 Baudrate를 115,200bps로 설정했던 것과 같이 아두이노 시리얼 모니터의 Baudrate도 동일하게 설정한다.


> system 함수를 이용해 파이썬 사용하기

// log.txt의 내용을 담을 변수

char output;

void setup() {

// 아두이노 시리얼 모니터에서 확인하기 위해 Baudrate를 115,200bps로 설정한다.

Serial.begin(115200);


// myScript.py 파일에 반복문으로 log.txt에 기록하는 파이썬 코드를 입력한다.

system("echo '#!/usr/bin/python' > myScript.py");

system("echo 'import time' >> myScript.py");

system("echo 'for i in range(10):' >> myScript.py");

system("echo ' with open("log.txt", "w") as fh:' >> myScript.py");

system("echo ' fh.write("{0}".format(i))' >> myScript.py");

system("echo ' time.sleep(1)' >> myScript.py");

// myScript.py 옵션을 변경한다.

system("chmod a+x myScript.py");

// myScript.py를 백그라운드로 실행한다.

system("./myScript.py &");

}

void loop() {

// 파일 변수

FILE *fp;

// log.txt 파일을 읽기모드로 연다.

fp = fopen("log.txt", "r");

// output 변수에 텍스트 파일의 내용을 집어넣는다.

fgets(output, 2, fp);

// 파일을 닫는다.

fclose(fp);

// 아두이노 시리얼 모니터에 출력한다.

Serial.println(output);

// 1초 멈춤

delay(1000);

}


는 system 함수를 사용해 파이썬 코드를 작성하고 실행하는 예제다. system 함수가 리눅스 시스템의 명령어를 그대로 사용하는 것이기 때문에 파이썬과 같이 리눅스에서 사용하는 다양한 프로그램을 이용할 수 있다.


이것만은 반드시 주의하세요!

system 함수는 리눅스 시스템에 직접적인 영향을 줄 수 있으므로 주의가 필요하다. 사용 전 꼭 관련 파일을 백업하고 사용하는 것이 좋다.



이더넷 사용하기

갈릴레오는 기본적으로 이더넷 포트를 가지고 있으며, 기존에 아두이노 이더넷 쉴드에서 사용하던 이더넷 라이브러리를 그대로 사용하면 된다. 이더넷을 초기화할 때 MAC 주소가 사용되는데, 갈릴레오의 MAC 주소는 이더넷 포트 위에 스티커로 붙여져 있다.


> 이더넷을 이용해 구글에서 검색 결과 가져오기

// SPI와 Ethernet 라이브러리를 참조한다.

#include

#include

// 이더넷 포트 위 스티커에 기록된 갈릴레오의 MAC 주소를 입력한다.

byte mac = { 0x98, 0x4F, 0xEE, 0x00, 0x0C, 0x47 };

// 구글 페이지 주소

char server = "www.google.com";

// DNS가 아니라 IP주소를 사용하고 싶은 경우

// 아래 주석을 해제하고 IPAddress를 사용하면 된다.

// IPAddress server(74,125, 232,128);

// DHCP 서버를 이용한 초기화에 실패하면 다음의 고정 IP를 이용한다.

IPAddress ip(192,168, 0,177);

// EthernetClient 변수 선언

EthernetClient client;

void setup() {

// 아두이노 시리얼 모니터에서 확인하기 위해 Baudrate를 115,200bps로 설정한다.

Serial.begin(115200);


// DHCP서버를 이용해 Ethernet 초기화를 시도하고,

// 실패하면 0을 반환한다.

if (Ethernet.begin(mac) == 0) {

Serial.println("Failed to configure Ethernet using DHCP");


// DHCP 서버를 이용한 시도가 실패하면

// 앞에서 설정한 고정 IP를 이용해 초기화한다.

Ethernet.begin(mac, ip);

}

// 초기화될 때까지 잠시 기다린다. 간혹 기다리는 시간이 너무 짧아

// 초기화가 안 되는 경우도 있을 수 있다. 그때에는 delay 시간을 늘려주면 된다.

delay(1000);

Serial.println("connecting...");

// EthernetClient를 이용해 구글에 접속을 시도한다.

// 포트는 기본 80으로 설정한다.

if (client.connect(server, 80)) {

Serial.println("connected");

// 구글 쪽과 연결되면

// 구글 쪽으로 요청을 보낸다.

client.println("GET /search?q=arduino HTTP/1.1");

client.println("Host: www.google.com");

client.println("Connection: close");

client.println();

}

else {

// 연결에 실패한 경우

Serial.println("connection failed");

}

}

void loop()

{

// 서버 쪽에서 오는 바이트가 있는지 확인한다.

if (client.available()) {

// 한 바이트를 읽어온다.

char c = client.read();

Serial.print(c);

}

// 서버와의 연결이 끊어졌는지 확인한다.

if (!client.connected()) {

Serial.println();

Serial.println("disconnecting.");

// EthernetClient 작업을 멈춘다.

client.stop();

// 무한 반복을 이용해 아무 작업도 안 하도록 만든다.

while(true);

}

}


쉴드 사용하기


▲ IOREF 점퍼와 VIN 점퍼


갈릴레오는 아두이노 UNO에서 사용되는 5V, 3.3V 쉴드 모두 호환한다. 단, 쉴드를 사용할 때는 전압에 맞게 IOREF 점퍼를 설정해야 한다. 5V 쉴드를 이용하는 경우 과 같이 표시된 IOREF 점퍼를 우측에 꼽고, 3.3V 쉴드를 이용하는 경우 좌측에 꼽아 사용한다. IOREF 점퍼의 설정에 따라 아날로그 핀의 출력 범위도 변경된다.


IOREF 점퍼의 설정에 따라 아날로그 핀의 출력범위가 변경되지만, 아날로그 입력은 변경되지 않는다. analogRead 함수로 입력을 받는 경우 IOREF 점퍼 설정에 상관없이 5V를 기준으로 최대 1024까지 인식한다.


을 보면 IOREF 점퍼 우측에 VIN 점퍼를 볼 수 있는데, 이 점퍼는 쉴드에 공급되는 전압을 설정하는 점퍼다. 만약 쉴드에 5V 이상의 전압이 필요한 경우 VIN 점퍼를 제거해 사용하면 된다.


IOREF 점퍼 설정

// IOREF 점퍼가 5V로 지정된 경우

// 다음은 아날로그 핀의 출력을 5V로 설정한 것과 같다.

analogWrite(pinNum, 255);

// IOREF가 3.3V로 지정된 경우

// 다음은 아날로그 핀의 출력을 3.3V로 설정한 것과 같다.

analogWrite(pinNum, 255);


이것만은 반드시 주의하세요!

VIN 점퍼가 제거되지 않은 상태에서 5V 이상의 전압이 VIN 핀에 연결되면 자칫 보드가 망가지거나 오작동을 일으킬 수 있다.



미니 PCI 익스프레스 사용하기

갈릴레오 뒷면을 보면 주로 노트북에서 많이 사용되는 미니 PCI 익스프레스를 볼 수 있다. 덕분에 갈릴레오는 기존 노트북에서 사용되던 미니 PCI 익스프레스용 WiFi, 블루투스, SSD 모듈 등을 연결해 사용할 수 있다. 필자는 WiFi와 블루투스 통신이 가능한 Intel Centrino Advanced-N 6235 모듈(이하 N6235 모듈)을 연결해 사용할 것이다. N6235 모듈을 사용하기 위해서는 안테나, 안테나와 모듈을 연결할 케이블, SD카드가 필요하다.



▲ N6235 모듈을 연결한 모습


N6235 모듈은 기본 모듈보다 반 정도 작은 크기이기 때문에 와 같이 고정하는 홀더를 연결해야 한다. 갈릴레오에 N6235 모듈을 끼우고 와 같이 안테나와 케이블을 연결한다.


● 부팅용 SD카드 설정하기

갈리레오에 기본으로 설치된 리눅스는 WiFi를 지원되지 않는다. 따라서 N6235 모듈을 이용해 WiFi를 사용하려면 SD카드에 리눅스를 다시 설치한 후 부팅해야 한다. SD카드에 설치할 리눅스는 인텔에서 제공한다. 갈릴레오용 아두이노 다운로드 페이지(communities.intel.com/docs/DOC-22226)에 접속하면 하단에 ‘LINUX IMAGE FOR SD for Intel Galileo’라는 파일을 찾을 수 있다. SD카드에 기존 파일이 남아있다면 삭제한 뒤 다운로드한 것을 설치하면 된다.


● N6235 모듈용 드라이버 추가하기

SD카드에 설치한 리눅스는 N6235 모듈의 하위 버전인 N6205 모듈까지만 지원한다. 따라서 N6235 모듈용 드라이버를 별도로 추가해야 한다.


WiFi 드라이버 다운로드 페이지(wireless.kernel.org/en/ users/Drivers/iwlwifi)로 이동해 ‘iwlwifi-6000g2b-ucode-18.168.6.1.tgz’라고 표시된 파일을 다운로드한다. 다운로드한 파일을 SD카드의 루트에 복사하고 갈릴레오를 PC와 연결한 뒤 시리얼 통신으로 접속한다.


> iwlwifi-6000g2b-ucode-18.168.6.1.tgz 파일 압축 해제

tar xzvf /media/mmcblk0p1/iwlwifi-6000g2b-ucode-18.168.6.1.tgz

> iwlwifi-6000g2b-ucode-18.168.6.1.tgz 파일을 펌웨어 디렉토리로 복사

cp iwlwifi-6000g2b-ucode-18.168.6.1/iwlwifi-6000g2b-6.ucode /lib/firmware/

과 같이 입력하면 루트로 복사한 iwlwifi-6000g2b-ucode-18.168.6.1.tgz 파일의 압축이 풀린다. 정상적으로 압축이 풀렸다면 과 같이 입력해 해당 파일을 ‘/lib/firm ware/’ 디렉토리로 복사한다. 여기까지 정상적으로 진행됐다면 드라이버 추가가 완료된 것이다.


● WPA 설정

갈릴레오로 기존에 사용하던 WiFi AP에 연결하려면 WPA 설정을 해야 한다. WiFi AP의 이름이 ‘mywifi’이고, 비밀번호가 ‘mypassword’라고 가정하자.


> WPA 설정하기

wpa_passphrase mywifi ‹‹ EOF › /etc/wpa_supplicant.conf

› mypassword

› EOF


의 첫 번째 줄을 입력하면 하단으로 커서가 이동하면서 ‘>’ 표시가 나타난다. 여기에 mypassword를 입력한다. 다음 EOF를 입력하고 엔터를 치면 ‘/etc/wpa_suppicant.conf’ 파일에 WPA 설정이 기록된다. 해당 파일을 열어보면 WiFi AP의 이름과 비밀번호 그리고 암호화된 비밀번호를 확인할 수 있다.


● 자동으로 WiFi에 연결하도록 설정하기

N6235 모듈이 작동될 때 자동으로 WiFi에 연결하도록 설정해보자.


> /etc/network/interfaces 파일 수정하기

# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface

auto lo

iface lo inet loopback

# Wireless interfaces

# 하단에 auto wlan0을 추가한다.

auto wlan0

iface wlan0 inet dhcp

wireless_mode managed

wireless_essid any

wpa-driver wext

wpa-conf /etc/wpa_supplicant.conf


WiFi가 자동으로 연결되도록 하기 위해서는 ‘/etc/network/ interfaces’ 파일을 수정해야 한다. 해당 파일을 열면 과 같이 표시되는 것을 볼 수 있다. 여기에 밑줄로 표시한 ‘auto wlan0’을 추가한다.



> 네트워크 재시작하기

/etc/init.d/networking restart

> 구글 사이트를 이용해 네트워크 연결 확인하기

ping www.google.com

> 네트워크 껐다 켜기

# 네트워크 끄기

ifdown wlan0

# 네트워크 켜기

ifup wlan0


/etc/network/interfaces 파일을 수정하고 의 명령으로 네트워크를 재시작한다. 재시작 시 자동으로 설정된 WPA로 WiFi AP 연결을 시도할 것이다. 연결에 성공한 후 DNS가 설정됐다고 출력되면 의 명령으로 네트워크 연결이 정상적으로 이뤄졌는지 확인할 수 있다. 과 같이 네트워크를 껐다 켤 수도 있다.


갈릴레오의 가능성

이번 시간에는 갈릴레오를 활용하는 방법에 대해 살펴봤다. 갈릴레오는 아두이노 호환 보드이기 때문에 기존의 아두이노와 같이 스케치를 이용해 개발할 수도 있고, 리눅스가 구동되기 때문에 라즈베리파이나 비글본 블랙처럼 리눅스 프로젝트를 해 볼 수도 있다. 이 글에서는 N6235 모듈로 미니 PCI 익스프레스를 이용했지만 원한다면 SSD, LTE 등 기존 노트북에 사용되는 다양한 모듈을 사용할 수도 있다. 물론 아직 몇 가지 버그와 지원되지 않는 함수가 있어 미흡한 점도 있지만, 인텔이 지속적인 펌웨어 업데이트를 통해 해결하고 있어 차차 개선될 것으로 기대된다.



▲ 인텔 Minnowboard


갈릴레오는 최초의 x86 기반 오픈소스 하드웨어로, 기존 ARM 기반 오픈소스 하드웨어에 비하면 아직은 ‘걸음마 단계’라고 할 수 있다. 하지만 갈릴레오를 시작으로 점차 x86 기반 보드들이 점차 늘어날 것으로 예상된다. 최근 인텔이 x86 기반의 ‘Minnowboard’라는 제품을 출시하기도 했는데, 이 제품은 2013년에 출시한 베이트레일 아키텍처 기반의 CPU를 사용한 고성능 제품이다. 때문에 PC용 윈도우8도 실행할 수 있다고 한다. 또 인텔은 웨어러블에 많이 사용될 것으로 예상되는 ‘에디슨’도 올해 안에 출시할 예정이라고 밝힌 바 있다. 따라서 앞으로 x86 기반 오픈소스 하드웨어 보드 시장이 크게 성장할 것으로 기대된다.



/필/자/소/개/

이준혁이준혁 neosarchizo@naver.com | 회계와 경영을 전공했지만 프로그래밍이 너무 좋아 개발자의 길을 걷고 있다. 취미로 자동주식매매, 웹크롤러, iOS, 안드로이드 등과 관련된 개발을 해왔으며, 현재는 매직에코에서 오픈소스 하드웨어와 서버 관련 개발을 하고 있다.

● 기획·정리 | 서준석 기자 seojs@imaso.co.kr



※ 본 내용은 (주)마소인터렉티브(http://www.imaso.co.kr/)의 저작권 동의에 의해 공유되고 있습니다.
    Copyright ⓒ Maso Interactive Corp. 무단전재 및 재배포 금지

    [원문출처 : http://www.imaso.co.kr/news/article_view.php?article_idx=20140728162328]

맨 위로
맨 위로