토요일, 1월 31, 2015

[독서광] Node Web Development 한국어판

오늘은 노드 관련 서적 한 권을 소개하려 한다. 2011년 말에 출간되었기에 철이 지났을지도 모르는 책을 굳이 먼지를 털어가며 소개하려는 이유는 이 책 서술 방식이 흥미롭기 때문이다.

'웹 개발 플랫폼 노드 프로그래밍'이라는 부제가 붙은 'Node Web Development 한국어판'은 노드를 사용한 웹 개발 방법을 설명하고 있다. 딱 여기까지 소개 글을 읽고 나서 책 내용을 한번 상상해보면, 노드 역사, NPM 소개, 익스프레스 소개, 템플릿 소개, socket.io 소개, 단위 테스트 소개와 같은 목차가 머리 속에 그려질텐데, 이 책은 아주 흥미로운 접근 방식을 택하고 있으며, "노드로 웹 서버를 한번 만들어보면 어떨까?"라는 질문에 대한 해법을 단계별로 풀어간다.

일단 노드와 NPN 소개까지는 일반적인 방식을 택하고 있는데, 그 다음부터 일반적인 노드 서적의 정도에서 벗어나기 시작한다. 가장 먼저 간단한 애플리케이션을 만들어 본다. 그리고 나서 미들웨어를 위한 기반 구조인 커넥트(Connect)를 사용해 재구현하는 동시에 확장해본다. 그 다음에 커넥트 위에 만들어진 미들웨어인 익스프레스를 사용해 재구현하는 동시에 확장해본다. 그리고 나서 비동기식 프로그래밍 기법과 이벤트 처리 기법을 설명한다. 마지막으로 여기까지 배운 지식을 합쳐 간단한(하지만 필요한 필수 기능은 제공하는) 웹 서버를 노드로 처음부터 구현하면서(NPM 정적 웹 서버 모듈을 설치하고 나서 10줄짜리 웹 서버를 만드는 만행은 저지르지 않는다) 노드의 내부에서 일어나는 동작을 엿볼 수 있게 쏠쏠한 힌트를 제공한다. 아, 물론 웹 서버 프로토콜과 동작 방식 기초가 있어야 이 책을 흥미롭게 읽을 수 있다는 사실을 잊어서는 곤란하겠다.

요렇게 마무리하면 독자들이 멘붕을 일으킬 가능성이 높다는 사실을 알았는지, 6장에서는 sqlite3와 몽고DB를 사용한 영속적인 데이터베이스 저장 기법을 설명하고 사용자 인증 정보를 영속적으로 보관하는(이렇게 해야 노드 서버의 수평 확장이 가능해진다) 방법을 소개하며 마무리를 짓는다. 원서는 2판이 2013년에 나왔는데 아직 번역서는 안 나왔기 때문에 독자 여러분께 힌트를 주자면, 원서 2판에는 socket.io, 다중 사용자 지원과 다중 호스트 배포 방식, 단위 테스트 방법이 추가되었다. 큰 틀은 바뀌지 않았을지 모르지만 어느 정도 독자 요구에 맞춰 내용이 변경되었음을 알 수 있다.

결론: 노드를 사용해 블로그를 만들고, 트위터 타임라인을 만들고, 채팅을 만드는 실질적인 예제를 소개하는 대신 이런 기본을 파고드는 서술 방식에 대해 호불호가 확실하게 갈릴 가능성이 높다. 하지만 종종 이런 독자의 허를 찌르는 다소 변칙적인 책도 한 권 정도는 있어야 하지 않을까?

EOB

토요일, 1월 24, 2015

[B급 프로그래머] 1월 3주 소식

벌써 2015라는 숫자에 익숙해진 느낌이 든다. 오늘은 1월 3주 소식을 정리해 전해드리겠다.

  1. 웹/앱 소식
  2. 개발/관리도구 소식
  3. 고성능 서버/데이터베이스 소식
  4. 기타 읽을거리
EOB

토요일, 1월 17, 2015

[B급 프로그래머] IOTivity(OIC) vs AllJoyn(AllSeen Alliance)

2015년 CES에 출품된 제품들을 보면 알겠지만, IoT(Internet of Things)가 대세로 자리잡은 듯이 보인다. 범람하는 IoT 기술이 오히려 시장에 혼란을 주기 때문에 OIC(Open Interconnection Consortium)AllSeen Alliance가 결성되어 IoT 표준화 작업을 진행 중이다.

단순히 표준 문서만 작성하는 데서 벗어나, 올신 얼라이언스가 먼저 AllJoyn을 공개했고, 이어서 OIC도 IOTivity라는 프레임워크를 공개했다.

간략하게 두 프레임워크의 특성을 소개하겠다.

IOTivity는 개발자가 IoT 애플리케이션을 개발하는 과정에서 필요한 여러 가지 API를 제공하며, 다양한 운영체제(현재 리눅스, 아두이노, 타이젠)를 지원한다. API는 RESTful 방식으로 되어 있으며, 다음 네 가지 빌딩 블록을 제공한다.

  1. 발견: 근접해 있거나 원격에 있는 장비와 자원을 탐색하는 여러 메커니즘을 지원
  2. 데이터 전송: 메시지와 스트림 모델 기반으로 정보 교환과 컨트롤 지원
  3. 데이터 관리: 다양한 자원으로부터 얻은 데이터를 수집하고 저장하고 분석하는 기능 지원
  4. 장비 관리: 구성, 권한 설정, 진단 지원

AllJoyn은 근처에 있는 장비를 발견하고, 브랜드/범주/전송/운영체제와 무관하게 각각에 대한 통신이 가능한 애플리케이션을 개발하는 과정을 쉽게 해주는 프레임워크다. 물리적인 전송의 세부 사항을 추상화하며, 사용하기 쉬운 API를 제공한다. 임베디드 RTOS 운영체제부터 상용 운영체제에 이르기까지 다양한 플랫폼 위에서 동작하며, 여러 언어를 제공한다.

AllJoyn은 전송(네트워크)을 담당하는 코어 프레임워크(Core Framework)와 실제 장비의 서비스를 개발하는 기본 서비스(Base Service) 또는 데이터 주도 API(Data-Driven API)로 구성된다. 애플리케이션 개발자 입장에서는 코어 프레임워크 위에 구성된 서비스 프레임워크를 사용하거나 데이터 주도 API를 사용할 수 있다. 서비스 프레임워크가 제공하는 기본 서비스는 다음과 같다.

  • 연결: 새 장비를 와이파이 네트워크에 붙이는 일관성 있는 방식 제공
  • 구성: 애플리케이션/장비의 특정 속성을 구성
  • 통지: AllJoyn 네트워크 상에서 장비가 텍스트 기반 통지를 송수신하게 허용. 또한 URL을 사용한 오디오와 이미지 지원
  • 제어판: 원격에서 제어되는 가상 제어판을 지원
  • 오디오 스트리밍: 동기화된 오디오 재생 기능 지원

IOTivity와 AllJoyn은 IoT의 표준화를 위해 추구하는 방향은 유사하지만 실제 설계 사상(그리고 지원하는 기능)은 많이 다르기 때문에 완전히 중원을 평정할만큼 강력한 위력을 발휘하기는 어려워 보인다. 이와 관련해 IoT 단체 춘추전국시대··· 통일 조짐은 2016년에나를 읽어보면 현재 IoT 표준화 단체의 전투 상황을 머리 속에 그릴 수 있을 것이다.

EOB

토요일, 1월 10, 2015

[B급 프로그래머] 1월 1주 소식

2015년을 맞이하여 첫 소식을 정리해보겠다.

  1. 웹/앱 소식
  2. 개발/관리도구 소식
  3. 고성능 서버/데이터베이스 소식
  4. 기타 읽을거리

조금 늦어졌지만, 2015년 새해 복 많이 받으시기 바란다.

화요일, 1월 06, 2015

[독서광] 처음 시작하는 인텔 갈릴레오

오늘은 한빛미디어에서 선물로 보내주신 아두이노 관련 서적을 하나 소개드리려 한다. 그런데 어떻게 된 영문인지 이름에 '아두이노'가 없고 '갈릴레오'만 들어있으니 여기에 대해 먼저 설명하고 넘어갈 필요가 있겠다.

Atmega CPU를 장착한 아두이노와는 달리 갈릴레오는 인텔의 32비트 x86 호환 쿼크 코어를 탑재하고 있다. 특별한 운영체제가 없이 펌웨어 수준에서 동작하는 아두이노와는 달리 갈릴레오는 리눅스 운영체제로 동작한다. 갈릴레오는 리눅스 상에서 아두이노 하드웨어/소프트웨어를 그대로 동작시킬 수 있게(하드웨어와 소프트웨어 핀 호환을 목표로 한다) 특수 하드웨어와 수정된 소프트웨어를 탑재하고 있다고 보면 이해가 쉽겠다. 100% 호환을 목표로 두고 있긴 하지만 갈릴레오에 존재하는 미묘한 문제(예: GPIO 속력과 PWM 관련해 문제가 많았기에 2세대 갈릴레오가 등장했다는 기사 참조)와 상대적으로 큰 보드 크기와 복잡도로 인해 완벽하게 아두이노를 대체하기는 어렵다는 생각이다. 뭐 그럼에도 불구하고 교육과 실험 목적으로는 크게 나쁘지 않다. 잘만 하면 임베디드 부문에서 리눅스와 아두이노 둘 다 다뤄볼 수 있으니까.

이제 갈릴레오와 아두이노의 관계를 알았으므로 책 내용으로 들어가보자. 지난 번에 소개드린 33가지 프로젝트로 배우는 아두이노와는 달리 이 책은 C도 잘 모르는 초보자가 보기에 적합한 내용을 담고 있다. 목차를 보면 알겠지만 일단 갈릴레오 소개와 보드 기초 사항을 설명한 다음 출력(디지털/아날로그)과 입력(디지털/아날로그)을 설명하고 반복문과 시리얼을 사용한 고급(?) 기법을 소개한다. 그리고 이더넷이 내장된 갈릴레오의 특성을 살려(아두이노 같으면 별도 확장 실드를 구매해야 하므로 여러 가지 면에서 번거롭다) 네트워크에 접속하고 웹 서버를 구동하는 방법을 설명한다. 이 과정에서 갈릴레오에 셀로 접속하는 트릭도 알려주므로 아두이노와는 또 다른 갈릴레오만의 접근 방식을 엿볼 수 있다.

단순히 갈릴레오를 아두이노처럼 사용하는 에물레이터를 벗어나 중간에 리눅스와 아두이노가 어떤 식으로 상호 작용하는지 알려주기 위해 /proc 파일 시스템을 사용해 센서를 읽고 액추에이터에 명령을 내리는 방법을 소개하며, 파이썬을 사용해 만든 프로그램과 연동하는 방법(아두이노 프로그램에서 popen 확장 명령으로 외부 명령을 수행한 다음 결과를 얻는 방식)도 설명하고 있다. 아두이노의 기본 명령이 아니라 갈릴레오에서 사용할 수 있는 확장 명령인 경우 명시적으로 이런 사실을 알려주므로 혼동의 여지를 없앴다. 책의 마지막 부분에는 부록 형태로 아두이노(+갈릴레오 전용) 프로그래밍 참조 문서를 제공하므로 많이 사용하는 명령을 한 눈에 확인할 수 있다.

이 책을 읽으면서 아주 복잡한 프로젝트를 수행하기는 어렵겠지만, 기초적인 개념 설명과 함께 어렵지 않은 실험거리를 제공하므로 '처음 시작하는'이라는 제목과 잘 어울린다는 생각이다.

결론: 갈릴레오/아두이노를 처음 접해 아두이노/갈릴레오로 뭔가를 하고는 싶은데 C 프로그래밍 언어나 전자 회로 기초가 부족해 곤란을 겪고 있는 초보자분들께 추천한다.

EOB

토요일, 1월 03, 2015

[번역은 즐거워] 고양이가 당신을 거대하고 예측불가능한 유인원으로 생각하는 이유

독자 여러분을 위한 2015년 인사를 글로 대신 드리려 한다. Why Your Cat Thinks You’re a Huge, Unpredictable Ape라는 재미있는 글이 wired에 올라와서 독자 여러분을 위해 전문을 번역해봤다.

싱글즈(Shingles)는 내 질병 이름(대상포진)이 아니라 내 고양이 이름이다. 나는 이 녀석을 죽도록 사랑하지만, 이 녀석은 나를 짜증나게 만든다.

나만이 갈등을 겪는 애묘가가 아니다. 토니 버핑턴은 오하이오 주립 대학의 수의사이며, 최근에 내게 많은 고양이 집사들이 끊임없이 자신들의 고양이 동료에 좌절감을 느낀다고 말해줬다. 먹이고, 뒤를 깨끗하게 청소하고, 쓰다듬고, 안아주고, 붙들고 있지만, 버핑턴은 우리 중에 극소수만 고양이 말을 어떻게 듣는지 안다고 말한다. 이는 우리보다 고양이를 더욱 좌절스럽게 만든다. 우리가 고양이를 아무리 사랑할지라도 고양이는 사로잡히고 길들여진 이방인에 불과하기 때문이다. 자신들의 풍습을 설명할 방법도 사람을 이해할 방법도 존재하지 않는다.

버핑턴 박사(어찌되었거나 다음 고양이로 좋은 이름이다)는 내게 고양이 말을 듣는 방법을 참을성 있게 설명했다. 더 많이 안을 수 있는 트릭이 아니라 고양이의 건강을 개선할 수 있는 더욱 조화로운 집안 분위기를 만드는 방법이다. 여러 해 동안, 버핑턴은 고양이과 동물의 방광 조직에 고통스럽고 만성적인 염증이 생기는 병인 간질성 방광염의 근본 원인을 연구해왔다. 버핑턴의 연구는 스트레스가 가득한 집안 환경이 질병을 일으키며, 아마도 다른 만성 고양이 질환 역시 일으킬지도 모른다는 가능성을 보여준다. 버핑턴은 최선의 치료가 고양이의 말을 듣는 방법을 배우고 고양이에게 선택의 기회를 주며, 고양이의 스트레스성 반응을 일으키는 환경 요인을 줄이는 데 있다고 믿는다.

당신은 거대하고 예측불가능한 유인원이다

당신은 누가 봐도 분명한 소파를 발톱으로 긁은 소리를 듣는다. 화난 목소리로 톡 쏘며, 고함지르며, 물을 쏘며, 심지어 배게를 던진다. 헛수고다. 고양이는 다시 원래대로 돌아가기 때문이다. 버핑턴에 따르면 고양이는 당신을 무시하지 않는다. 고양이는 자신의 행동과 부정적인 강화를 연결하는 방법을 모를 뿐이다. 고양이는 사회적인 신호를 읽을 필요성이 거의 없는 외로운 사냥군으로 진화했기 때문이다. 특히 행동 변화를 요구하는 사회적인 신호를 읽지 못한다.

"쇼파를 긁지않게 멈추고 싶어하기 때문에 사람이 고함을 지른다는 사실을 고양이가 어떻게 알겠습니까?"라고 버핑턴은 말한다. 발톱으로 긁는 행위를 주인의 분노와 연결하는 능력이 없는 상황에서, 고양이는 사람의 미친 공격성만 볼 뿐이다. "고양이에게 당신은 이유없이 자신을 공격하는 미친 영장류일뿐입니다."라고 버핑턴은 말한다.

행동을 포기하게 만드는 대신, 당신은 공포의 대상이 된다. 한술 더 떠, 고양이는 당황하게 되며 결국 스트레스를 받는다. 발톱을 긁거나 높이 뛰는 등의 고양잇과의 자연스러운 활동을 끊임없이 방해하기 때문이다. "고양이는 자신의 자연스러운 행동을 표현하기를 원할 때 그렇게 하지 못하면 병이 듭니다."라고 버핑턴은 말한다. 당신이 주변에 없을 때 고양이는 계속해서 자연스러운 행동을 할 것이다.

"고양이를 훈련하는 방법은 주변 환경 개선입니다."라고 버핑턴은 말한다. 예를 들어, 소파 모서리에 양면 테이프를 붙이거나, 부엌 조리대에 은박지를 붙여놓는다. 그리고 근처에 개박하로 덮은 고양이 기둥이나 버려진 표류목으로 만든 기가 막힌 캣타워와 같이 관심을 끌 대안을 놓아둔다. 대안을 대상으로 고양이가 원하는 행동을 할 때, 선물을 주거나 애정으로 보답한다. "집은 부정적인 강화를 제공하게 만드는 반면, 고양이게게는 긍정적인 강화를 제공해야 합니다."

고양잇과 풍수

고양이가 자지 않는 매일 몇 시간 동안, 고양이는 최대한 균형잡히게 집에서 움직이기를 원하는 작은 에너지 덩어리다. 하지만 냉장고 근처에 음식 접시를 놓아두거나 드라이어기 옆에 작은 상자를 놓아두거나, 정원으로 나가는 여닫이 유리문 주변에 고양이가 좋아하는 카드 보드 상자를 놓아둠으로써 고양이의 몰입을 방해해왔다.

냉장고 소리나 탈수기 소리에 귀가 멀지도 모르겠다. 하지만 버핑턴에 따르면, 고양이가 먹거나 배변하는 동안 냉장고나 탈수 소리는 괴물이 으르렁거리는 소리로 들린다. 접시와 고양이 배변통은 조용한 곳에 놓아둬서, 고양이가 위협을 느낄 때 안전한 탈출 경로가 되는 (벽장이 아닌) 고요한 장소를 만든다.

풍경 역시 스트레스를 줄 수 있다. 고양이는 다른 동물에 대해 호기심이 많다. 하지만 멍멍이, 강아지, 염소, 말 등 사이에 시각적인 경계가 없으면 고양이는 위협을 느낄 것이다. "고양이는 유리를 이해하지 못합니다. 하지만 높이는 이해합니다."라고 버핑턴은 말한다. 고양이에게 캣 트리나 책장과 같은 높은 장소에 올라갈 수 있게 만들어주자. 평온한 상태에서 주변을 관찰할 수 있는 장소 말이다.

솜털로 뒤덮인 새끼 고양이의 배는 건드리지 마세요

풍경과 소리만 고양이의 감각을 공격하는 집안의 유일한 방해물은 아니다. 사람은 고양이보다 더 노골적으로 애정을 표시하며, 종종 귀여운 털뭉치만 보면 못견뎌한다. 하지만 우리와 같이 고양이도 정중하게 다뤄달라고 말하기를 원한다. "누군가 항상 당신을 들여올려 안아주고 비비면 이를 환영하겠습니까?"라고 버핑턴은 말한다.

솜털로 뒤덮인 새끼 고양이가 상호 작용을 이끌게 놓아두는 편이 좋다. 당신에게 와서 몸의 일부를 비비면, 고양이를 쓰다듬어도 좋다는 허락을 내린 것이다.

고양잇과 동물의 다른 행위에 주의해야 한다. 쓰다듬기를 원하는 초청장으로 보이기 때문이다. 솜털로 뒤덮인 새끼 고양이가 발라당 뒤집어서 배를 드러내는 행동이 전통적이다. 스다듬으러 가면, 고양이는 물고 뜯는다. "배를 드러내는 행동은 만들어놓은 함정이 아닙니다."라고 버핑턴은 말한다. "고양이가 무는 이유는 사생활을 침해 받았기에 두렵기 때문입니다." 고양이의 배는 가장 취약한 부분이며, 이를 드러냄으로써 고양이는 자신이 당신을 신뢰하고 있다는 사실을 알려준다. 배를 쓰다듬어 주기를 원하는 행동은 아니다.

배가 유일한 출입 금지 구역이 아니다. 고양이를 쓰다듬다 보면, 갑자기 고양이가 슬그머니 도망쳐 방 반대편에 가서 뭔가 뒤에 웅크린 다음 당신을 빤히 쳐다보는 경험을 한 적이 없는가?

고양이가 뭔가 이상하게 행동하면, 이런 고양이의 행동을 불러일으킨 원인이 있습니다."라고 버핑턴은 말한다. 아마 꼬리 시작 부분을 만져 엉덩이를 들게 만들었을지도 모른다. 이 영역은 신경으로 가득 차 있으므로, 너무 많이 만지면 간지럼을 탄다. 또한 두 팔로 안아 올리는 행위는 고양이에게 일반적이지 않다. 고양이가 무릎 위로 올라가더라도 반드시 들어 올려달라는 초청장을 의미하지는 않는다.

무슨 뜻이냐고? 당신의 고양이를 번쩍 들어 올려, 바짝 붙어, 천사와 같은 배를 문질러도 문제 없지 않느냐구? 문제 없다. 어느 누구도 시샘하지 않는다. 여기에 대해 이야기만 하지 마라.

고양이들끼리 친구 만들기

싱글즈와 나는 최근 다른 두 마리 고양이가 살고 있는 집으로 이사했다. 그리고 내 방돌이와 나는 여러 달 동안 고양이들이 함께 놀게 만들려고 시도했다. 잘 되지 않았다. 몇 번이고 되풀이해서, 거실에 함께 놓아뒀지만 가벼운 호기심이 공황과 싸움으로 바뀌는 모습만 볼 뿐이다.

버핑턴은 우리가 완전히 잘못하고 있다고 말했다. 버핑턴에 따르면, 동일한 수건을 사용해 차례로 고양이를 문지른 다음 서로의 체취를 알게 만드는 방법으로 천천히 시작해야 한다. 서로를 소개하기 전에, 고양이들이 존경하는 주인으로부터 먹이, 배변, 사랑을 잘 받았는지 확인하자. 다시 말해 고양이들이 편안함을 느껴야 한다. 일단 고양이들이 함께 있게 되면, 애정을 듬뿍 줌으로써 주인이 고양이들 뒤를 보살펴 준다는 사실을 고양이가 알게 만들자. 고양이들이 어울리게 압력을 가하지 말고, 각자 방해받지 않는 안전한 탈출구가 있는지 확인하자.

만일 고양이가 어울리지 못하고 떠나기로 결정하며, 그렇게 하게 둬라. 버핑턴은 고양이에 대한 우리의 가장 큰 오해 중 하나가 고양이들이 다른 고양이들과 어울릴 필요가 있다는 우려다. 야생에서 고양이들은 홀로 사냥하고 공유하지 않는다. 다른 고양이는 친구가 아니라 경쟁자다.

고양이가 당신을 챙기기

고양이는 보이는 것만큼 무관심하지 않다. 고양이는 유대감을 원하며, 이를 위한 가장 좋은 수단은 쓰다듬고 먹이를 주고 놀아주는 것이다. 고양이가 놀고 싶지 않아하면, 뭔가 잘못하고 있는 셈이다. 레이저 포인터를 사용한다면, 미친 듯이 흔들어대지 말자. 자연스러운 속력으로 움직여 고양이가 종종 잡을 수 있게 만들자. 끈에 묶은 쥐돌이도 동일한 규칙을 적용하자.

싱글즈는 내가 하루 종일 자리를 비울 때 끊임없이 울곤 했으며, 싱글즈를 혼자 두면 신경증에 걸리지 않을지 걱정했다. 버핑턴은 오갈 때마다 작은 의식을 만들어라고 조언한다. "떠나기 전에 고양이를 불러, 사랑을 표현하고 안녕이라고 말한다는 사실을 알게 할 수 있습니다."라고 버핑턴은 말한다. 그리고 집에 올 때도 비슷한 의식이 있어야 한다고 조언한다. "몇몇 결혼한 사람들은 하루에 한 시간도 접촉하지 않고서도 잘 살아갑니다. 고양이와 관계도 하루 10분이면 충분합니다. 물론 정말로 질이 높아야 하겠지만 말입니다."라고 버핑턴은 말한다.

EOB