안녕하세요.


최근 일 년간은 딥러닝에서의 초모수(hyperparameter) 최적화 방안 연구에만 매진하다보니 블로그를 방치해 두었네요.

그럼에도 불구하고 방문해 주셨던 분들께 감사를 표합니다.

  


일년만에 다시 아이들을 위한 소프트웨어 강연인 소.물.이 있어 

이렇게 발표 자료를 공유하는 겸사 겸사 블로그에 기록을 남깁니다.


강연의 요약은 다음과 같습니다:


일자: 2018년 5월 26일 오후 3시

장소: 태장마루 도서관

신청: https://www.suwonlib.go.kr/tm/html/03_culture/culture_view.asp?bd_seqn5=8928&lib_code_cul=TM


제목: 기계는 어떻게 생각할까? (How do Machines Think?)


생각하는 기계를 만들고 싶다는 생각은 언제 시작했을까요? 오늘날 인공지능이라고 부르는 기계들은 어떻게 동작하는 걸까요? 생각하는 기계는 과연 어떻게 우리의 미래를 바꿀까요? 꼬리를 무는 호기심에 아이들이 열어갈 희망찬 미래를 기대하며 재밌게 이야기하고자 합니다.

 

안녕하세요.


아래와 같이 "소프트웨어, 사람과 사물의 소통을 향하여"라는 주제로 소프트웨어 특강을 진행합니다.

  • 일시: 2017년 5월 27일 오후 3시
  • 장소: 수원시 영통구 태장마루 도서관
  • 대상: 초등학교 3~6학년과 학부모
  • 신청: 공지 참조


아래는 발표 자료입니다. 참고하시기 바랍니다.




안녕하세요. "생각의 웹"입니다.


2월 9일(월) 15:00~18:00 강남역 근처 강남토즈 타워점에서 개최한 제 34차 W3C 대한민국 관심 그룹 회의 참석 후기를 공유하고자 이렇게 포스팅합니다.

http://onoffmix.com/event/41031 


이번 회의에서는 KIG를 이끌고 있는 이원석 박사님의 주관으로 W3C 표준화가 한창인 service worker, ETRI의 hybrid web platform인 HyWAI 소개 및 이를 이용한 web bluetooth app 개발 사례에 대해 다뤘습니다. 계획 상으로는 W3C CEO인 Jeff Jaffe가 참석할 예정이었으나 급작스런 부친 상으로 모든 일정을 취소하고 귀국한 관계로 대면할 기회를 갖지 못해 아쉬웠습니다. 각 세션에 앞서 이원석 박사님은 올 해 KIG 정기 회의를 통해 HTML5 최신 기술 동향 및 hybrid app 개발 사례에 포커스할 예정이며 공개로 진행되는 만큼 많은 참석과 의견 교류를 바란다고 말씀하셨습니다.



첫 번째 세션으로 service worker spec의 editor이자 삼성전자 책임 연구원인 송정기 님이 발표한 사례를 들어 알기 쉽게 정리한 service worker 입니다. 
발표자에 따르면 service worker API를 통해 개발 가능한 기능은 크게 오프라인 우선 지원(offline first)백그라운드 수행(background processing)을 통한 푸시 알림(push notification) 두 가지 입니다.
오프라인 우선 지원의 경우, service worker의 API와 개발자의 필요에 따라 캐쉬(cache)를 생성할 수 있는 전역 cache API 및 WHATWG에서 표준화 중인 fetch event를 처리하는 API를 통해 HTTP 요청(request)의 프록시(proxy) 역할을 수행하는 service worker를 구현할 수 있습니다. 이는 URL을 입력하거나 링크를 클릭하는 요청(client request)이나 AJAX 요청 혹은 내부 리소스 요청(resource request) 등을 대신하는 proxy를 service worker로 등록함으로써 offline 환경에서 캐쉬 데이터로 브라우징이 가능하도록 한 것으로 이에 대한 자세한 API 사용 사례(usage)는 spec. editor의 한 명이자 구글의 엔지니어인 jake의 블로그를 읽어 보기를 바랍니다. HTML5Rocks에 도창욱 님이 번역한 글도 참고하면 좋습니다.현재 구현이 상당 부분 진행되어 Chrome 40 버전 이상 혹은 Firefox의 nightly version에서 약간의 환경 설정을 통해 테스트 가능합니다. 마지막으로 service worker에 대한 spec 진행 사항에 대한 알고 싶은 분들은 트위터에서 @jungkee 를 follow 하고 spec 자체를 github를 통해 작성하고 있으니 자유롭게 의견을 개진할 수 있습니다.
시간 관계 상 백그라운드 수행을 통한 푸시 알림 기능은 다루지 못한 관계로 추후 KIG에서 이 부분에 대해 다룰 예정이라고 합니다.

두 번째 세션은 Hybrid Web Application Interface를 줄인 HyWAI (하이웨이)에 대해 ETRI 전종홍 책임 연구원 님이 발표했습니다. 이 프로젝트는 PhoneGap 이 발표된 시점인 2009년 1.0을 시작으로 현재 3.5 버전에 이르렀으며 3.5 버전의 경우 re-engineering를 통한 구조 개선 및 BT/BLE를 포괄하는 Web Bluetooth API가 주안점이라고 합니다. 
ETRI 정책 상 open source로 진행할 수 없어 간략한 sample app을 mobile2.tistory.com/8 에 공개했으니 다운로드 받아 써 볼 수 있습니다.


세 번째 세션은 HyWAI 프로젝트를 수행한 엠트리 소프트의 신현진 이사님의 HyWAI를 통한 Web Bluetooth app 개발 사례 소개입니다. hybrid app 개발 사례 소개에 앞서 hybrid app 개발 시 경험한 이슈 사항들을 공유해 주셨는데 그중 cross platform 지원 시 web view 호환성 및 파편화 문제(fragmentation issue)가 심도 있게 다뤄졌습니다. 특히   Crosswalk, wkwebview (iOS) 프로젝트는 지켜 볼만한 오픈소스 프로젝트라고 합니다. 데모 앱으로 구글이 주창한 BLE 기반의 physical web 사용 사례 (use case)를 hybrid app으로 구현해 bluetooth로 전송한 URL를 실행하는 과정을 코드와 함께 시연했습니다.


이상입니다.

이후 소개된 발표 자료가 공유되면 업데이트하도록 하겠습니다.



감사합니다.


 

생각의 웹입니다.


벌써 한 해의 마지막 날이 되었습니다. 

마지막이라는 생각이 드니 미뤄두었던 일들을 서둘러 마무리해야 한다는 생각이 들어 

최근 알게 된 웹 API 시작부터 끝까지 라는 주제의 읽어 볼만한 좋은 포스팅을 공유합니다.


 그 시작으로

Matt McLarty의 비즈니스 관점에서의 웹 API

라는 포스팅을 간략하게 한글로 요약합니다. 



  • 내부 데이터의 가용성 수준 평가 척도
    1. 데이터 적용 가능성
      • 이 데이터가 핵심 비즈니스 목표를 추구하는데 도움이 될 것인가?
      • 이 데이터가 비즈니스를 차별화 해주는가?
      • 이 데이터를 공개해서 상품화할 예정인가?
    2. 데이터 정확성
      • 이 데이터는 현재 어떻게 제공되고 있는가?
      • 이 데이터가 권위있는 출처에서 오는 것인가?
      • 올바른 목적으로 올바른 사용자가 사용하는 데이터인가?
    3. 데이터 접근성
      • 프로그래밍하기 위해 어떤 데이터가 적합한가?
      • 이 데이터를 사용하기 위한 다른 방법은 무엇인가?
      • 개발자들이 이 데이터를 이용하는 앱들을 만들기에 얼마나 쉬운가?
      • 많은 클라이언트의 요청을 수용할 만큼 데이터 처리 용량을 늘릴 수 있는가?
  • 평가 결과에 따라 두 종류의 API가 존재
    1. 유용한 API
      • 정확하고 응용할 수 있는 데이터를 제공
        • “medium is the message” thinking fails - APIs and Open Data만으로는 충분치 않다.
        • right data through right APIs - brings desired revenue and innovation benefits
        • 사례
          • Google Maps
          • SNS (Twitter, Facebook, ...) API - 선거 유세에도 영향을 미칠 정도로 영향력이 커짐
          • 아마존 사례
            1. 제품과 솔루션 공급을 API를 통해 할 수 있게 함
            2. 가치있는 데이터를 수집, 분석, 개선, 배포하는 API 기반 접근을 수행함
              • CEO 제프 베조스 曰 우리는 물건을 팔 때 돈을 버는 것이 아니라 고객들로 하여금 구매를 결정할 수 있게해서 돈을 법니다. (“We don’t make money when we sell things. We make money when we help customers make purchase decisions.” - Jeff Bezos )
              • Envision -> Focus -> Disrupt -> Iterate -> Persist -> Broaden -> Envision -> ...
            3. 전략적인 포지셔닝과 전술적인 공급 간의 균형을 유지하는 단련된 방식이 존재
          1. 지속적으로 응용 가능한 데이터를 수집
          2. API를 데이터에 대한 보편적 접근 법으로 이용
          3. 단기적으로 필요한 것 뿐 아니라 장기적으로 명확히 필요한 것을 제공
          4. 강점(position of strength)에서 부터 확장하라
    2. 가용한 데이터
      • 사용할 수 있는 데이터를 제공
      • 엔터프라이즈 앱 개발의 패러다임 변화
        • n-tiered web model to API centered topology
        • Java EE to JavaScript
      • Twilio 사례
        • 임의의 통신사의 SMS 이나 VOIP를 사용할 수 있는 API를 개발자에게 제공하여 수익 창출
      • Ingenie 사례
        • 16~25세의 고객이 보유한 스마트폰을 통해 수집한 운전 데이터로 자동차 보험 요금을 줄여주는 서비스 제공
      • API 설계의 중요성이 부각
        • 새로운 개발자들에게 API 사용성 증대를 통해 API 사용을 촉진할 필요성 대두
  • 요약
    1. 비즈니스 전략에 맞춰 API를 정비하라
    2. API를 통해 접근 가능하고 정확하고 응용가능한 데이터를 제공하라
    3. API가 유용하고 사용할 수 있도록 만들라
    4. 아마존처럼 데이터를 통해 가능한 분열(Data-Enabled Disruption)이 반복되는 문화를 수립하라
    5. Twilio 처럼 비즈니스를 다른 대형 경쟁사들과 차별화하는 API 개발자 경험을 만들라



모든 것이 연결되는 초연결 사회로 향해 가는 시점에서 

웹 API를 통한 메시업(mesh-up)를 비즈니스 시작부터 염두해 두지 않고는 더 이상 지속적으로 경쟁력 있는 서비스를 

도출할 수 없는 시대가 되고 있습니다.


올바른 이해를 기반한 전략 수립과 기민한 실천으로 미래 사회의 개척자가 되길 희망합니다.

감사합니다.   




안녕하세요,

"생각의 웹"입니다.


혹시 지난 "AppIN 세미나 - Do IoT Yourself" 강연에 참석하시고 꾸준히 이 블로그에 방문해 주시는 분들이 계신가요?

글을 시작하기 앞서 그 분들께 먼저 감사 말씀드립니다.


이번 포스팅에는 D.IoT.Y 두 번째 강연 시 대디스랩 송영광 대표님과 함께 만들었던 온도센서를 JavaScript로 구현해보고자 합니다.

이 강연은 다음 포스팅을 참조하시기 바랍니다.


Intuitive Understanding Arduino for IoT: Do IoT Yourself 2nd



여기서 실습한 온도 센서 만들기는  Sparkfun Starter Kit for RedBoard에 내장된 센서/엑추에이터로 한정해야 했기에 가격이 저렴한 서미스터 센서(Thermistor)로 기능을 구현하기 위해 arduino IDE에서 꽤 복잡한 코딩을 해야 했습니다. 


다음 코드는 실습 당시 복사/붙여넣기 했던 코드입니다.


#include <avr/pgmspace.h>

int led_state;
unsigned long time;

#define THERM_PIN   0  // 10k thermo & 10k resistor as divider.

/*
 *  Big lookup Table (approx 750 entries), 
 *  subtract 238 from ADC reading to start at 0*C. 
 *  Entries in 10ths of degree i.e. 242 = 24.2*C Covers 0*C to 150*C 
 *  For 10k resistor/10k thermistor voltage divider w/ therm on the + side.
 */
const int temps[] PROGMEM = { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
    15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
	34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
	52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 68, 
	69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 
	87, 88, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 
	102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 
	115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 
	128, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 140, 
	141, 142, 143, 143, 144, 145, 146, 147, 148, 149, 150, 151, 151, 152, 
	153, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 164, 165, 
	166, 167, 167, 168, 169, 170, 171, 172, 173, 174, 175, 175, 176, 177, 
	178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 189, 190, 
	190, 191, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 202, 
	203, 204, 205, 205, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 
	215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 225, 226, 227, 
	228, 228, 229, 230, 231, 232, 233, 234, 235, 235, 236, 237, 238, 239, 
	240, 241, 242, 243, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 
	252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 261, 262, 263, 264, 
	265, 266, 267, 268, 269, 269, 270, 271, 272, 273, 274, 275, 276, 277, 
	278, 279, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 289, 
	290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 301, 302, 
	303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 315, 
	316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 
	330, 331, 332, 333, 334, 335, 335, 336, 337, 338, 339, 340, 341, 342, 
	343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 
	357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 
	371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 
	385, 386, 387, 388, 389, 390, 392, 393, 394, 395, 396, 397, 398, 399, 
	400, 401, 402, 403, 404, 405, 406, 407, 408, 410, 411, 412, 413, 414, 
	415, 416, 417, 418, 419, 420, 422, 423, 424, 425, 426, 427, 428, 429, 
	430, 432, 433, 434, 435, 436, 437, 438, 439, 441, 442, 443, 444, 445, 
	446, 448, 449, 450, 451, 452, 453, 455, 456, 457, 458, 459, 460, 462, 
	463, 464, 465, 466, 468, 469, 470, 471, 472, 474, 475, 476, 477, 479, 
	480, 481, 482, 484, 485, 486, 487, 489, 490, 491, 492, 494, 495, 496, 
	498, 499, 500, 501, 503, 504, 505, 507, 508, 509, 511, 512, 513, 515, 
	516, 517, 519, 520, 521, 523, 524, 525, 527, 528, 530, 531, 532, 534, 
	535, 537, 538, 539, 541, 542, 544, 545, 547, 548, 550, 551, 552, 554, 
	555, 557, 558, 560, 561, 563, 564, 566, 567, 569, 570, 572, 574, 575, 
	577, 578, 580, 581, 583, 585, 586, 588, 589, 591, 593, 594, 596, 598, 
	599, 601, 603, 604, 606, 608, 609, 611, 613, 614, 616, 618, 620, 621, 
	623, 625, 627, 628, 630, 632, 634, 636, 638, 639, 641, 643, 645, 647, 
	649, 651, 653, 654, 656, 658, 660, 662, 664, 666, 668, 670, 672, 674, 
	676, 678, 680, 683, 685, 687, 689, 691, 693, 695, 697, 700, 702, 704, 
	706, 708, 711, 713, 715, 718, 720, 722, 725, 727, 729, 732, 734, 737, 
	739, 741, 744, 746, 749, 752, 754, 757, 759, 762, 764, 767, 770, 773, 
	775, 778, 781, 784, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 
	816, 819, 822, 825, 829, 832, 835, 838, 842, 845, 848, 852, 855, 859, 
	862, 866, 869, 873, 877, 881, 884, 888, 892, 896, 900, 904, 908, 912, 
	916, 920, 925, 929, 933, 938, 942, 947, 952, 956, 961, 966, 971, 976, 
	981, 986, 991, 997, 1002, 1007, 1013, 1019, 1024, 1030, 1036, 1042, 
	1049, 1055, 1061, 1068, 1075, 1082, 1088, 1096, 1103, 1110, 1118, 1126, 
	1134, 1142, 1150, 1159, 1168, 1177, 1186, 1196, 1206, 1216, 1226, 1237, 
	1248, 1260, 1272, 1284, 1297, 1310, 1324, 1338, 1353, 1369, 1385, 1402, 
	1420, 1439, 1459, 1480, 1502 
};


void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(19200);
  time=millis();
  //Serial.println("Ready");
}

void loop() { 

  int therm;   
  therm = analogRead(THERM_PIN) - 238;
  therm = pgm_read_word(&temps[therm]);
  
  //Serial.println(therm, DEC);
  float temp = (float)therm / 10.0;
  Serial.println(temp, 1);
  
  if (millis()-time > 1000) {   
    time = millis();
    digitalWrite(13,led_state);
    led_state =! led_state;
  }
  delay(2000);
}

약간 코딩 지식이 필요하기에 실습 시에는 많은 설명이 되지는 않았지만 여기서 조금 설명하자면
 look up table를 만들어 A0에서 읽어들인 값을 table에 있는 값에 대응해서 serial로 출력하는 logic이 되겠습니다.


보시듯, 여기서 이 프로그램의 logic의 핵심은 look up table을 어떻게 만들었는가이고 

이에 대한 답변은 table를 만들기 위해서는 서미스터 혹은 하드웨어 부품들에 대한 이해가 필요하다는 것입니다. 

즉 아래의 그림처럼 서미스터의 데이터 쉬트에서 table이 도출되었습니다. (송영광 대표님이 엑셀 신공을 사용하셨다고 하더군요. ^^a) 


서미스터는 회로 구성을 어떻게 했는가에 따라 (즉, 어떤 저항을 달았느냐)에 따라 다른 값을 내어 놓습니다. 

다시 말해 이 값은 위의 그래프에서 온도 X일때의 Y값과 같은 형태로 나옵니다.

하드웨어의 경우 물리의 세계에 닿아 있기에 재료의 특성과 환경에 따라 영향을 받기에 로직 만으로 이해하고자 하는 SW 쟁이는 이해하기 쉽지 않죠.  


따라서, 사실 원하는 동작을 얻기 위해서는 arduino 회로를 적절히 구성할 뿐 아니라
arduino IDE를 이용해 관련 로직을 구현한 후 해당 프로그램(속칭 펌웨어)을  

arduino 에서 전송해 테스트해 보는 일을 반복해야 합니다.


여기서 문제는 arduino에 이 동작 외에 추가로 기능을 구현해야 할 경우, 

반드시 arduino IDE로 펌웨어를 업드레이드해 주어야 합니다. 

이는 꽤 불편한 일이 아닐 수 없습니다. 


쓰다 보니 문제 제기로만으로도 꽤 길어졌는데 이에 대해 제가 제시하는 해결책은 다음과 같습니다.


1. arduino의 펌웨어에 호스트(host)의 명령을 처리해 동작을 수행하는 인터프리터(interpreter) 를 전송합니다.


2. 호스트는 arduino에 명령을 전송합니다. (e.g. A0 포트에서 아날로그 값을 읽어 오기)


3. 인터프리터는 명령을 받아 동작을 수행 후 결과를 호스트에 전송합니다.



혹시, 이 방식을 어디선가 본 듯한 느낌을 받은 분이 있나요? ;-)

앞서 소개한 바와 같이 이 방식으로 구현된 node.js 모듈이 바로 duino 입니다.   


관련 포스팅 : http://webofthink.tistory.com/13



이번에는 duino 모듈로 이 똑같은 동작을 수행해 보도록 하겠습니다. 


먼저, 아래 파일을 다운로드 받기 바랍니다.


duino.zip

(이 모듈은 현재 버전인 v0.0.9를 조금 수정해서 DHT11 센서 지원 및 윈도우즈에서 동작하도록 수정 확장한 버전입니다. 리눅스나 OS X는 기존 버전을 써도 무방합니다.)


이 파일의 압축을 풀어 src/du/du.ino 파일을 실행합니다. 

(먼저 Arduino IDE가 설치되어 있어야 합니다. 참고바랍니다.)


해당 arduino 펌웨어를 arduino 보드에 다운로드합니다.


정상적으로 전송되면 이제 node.js로 동일한 역할을 하는 코드를 구현해 봅니다.

코드를 다음과 같이 작성해 temp.js로 저장하고 콘솔에서 node temp 로 실행합니다.


var arduinoPort = 'COM7'; // only works in windows with patched duino module.
var pinName = '00'; // it means A0 pin

// look up table for resolving data to the appropriates temperature
var temps = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
    15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
	34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
	52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 68, 
	69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 
	87, 88, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 
	102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 
	115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 
	128, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 140, 
	141, 142, 143, 143, 144, 145, 146, 147, 148, 149, 150, 151, 151, 152, 
	153, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 164, 165, 
	166, 167, 167, 168, 169, 170, 171, 172, 173, 174, 175, 175, 176, 177, 
	178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 189, 190, 
	190, 191, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 202, 
	203, 204, 205, 205, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 
	215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 225, 226, 227, 
	228, 228, 229, 230, 231, 232, 233, 234, 235, 235, 236, 237, 238, 239, 
	240, 241, 242, 243, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 
	252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 261, 262, 263, 264, 
	265, 266, 267, 268, 269, 269, 270, 271, 272, 273, 274, 275, 276, 277, 
	278, 279, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 289, 
	290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 301, 302, 
	303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 315, 
	316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 
	330, 331, 332, 333, 334, 335, 335, 336, 337, 338, 339, 340, 341, 342, 
	343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 
	357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 
	371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 
	385, 386, 387, 388, 389, 390, 392, 393, 394, 395, 396, 397, 398, 399, 
	400, 401, 402, 403, 404, 405, 406, 407, 408, 410, 411, 412, 413, 414, 
	415, 416, 417, 418, 419, 420, 422, 423, 424, 425, 426, 427, 428, 429, 
	430, 432, 433, 434, 435, 436, 437, 438, 439, 441, 442, 443, 444, 445, 
	446, 448, 449, 450, 451, 452, 453, 455, 456, 457, 458, 459, 460, 462, 
	463, 464, 465, 466, 468, 469, 470, 471, 472, 474, 475, 476, 477, 479, 
	480, 481, 482, 484, 485, 486, 487, 489, 490, 491, 492, 494, 495, 496, 
	498, 499, 500, 501, 503, 504, 505, 507, 508, 509, 511, 512, 513, 515, 
	516, 517, 519, 520, 521, 523, 524, 525, 527, 528, 530, 531, 532, 534, 
	535, 537, 538, 539, 541, 542, 544, 545, 547, 548, 550, 551, 552, 554, 
	555, 557, 558, 560, 561, 563, 564, 566, 567, 569, 570, 572, 574, 575, 
	577, 578, 580, 581, 583, 585, 586, 588, 589, 591, 593, 594, 596, 598, 
	599, 601, 603, 604, 606, 608, 609, 611, 613, 614, 616, 618, 620, 621, 
	623, 625, 627, 628, 630, 632, 634, 636, 638, 639, 641, 643, 645, 647, 
	649, 651, 653, 654, 656, 658, 660, 662, 664, 666, 668, 670, 672, 674, 
	676, 678, 680, 683, 685, 687, 689, 691, 693, 695, 697, 700, 702, 704, 
	706, 708, 711, 713, 715, 718, 720, 722, 725, 727, 729, 732, 734, 737, 
	739, 741, 744, 746, 749, 752, 754, 757, 759, 762, 764, 767, 770, 773, 
	775, 778, 781, 784, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 
	816, 819, 822, 825, 829, 832, 835, 838, 842, 845, 848, 852, 855, 859, 
	862, 866, 869, 873, 877, 881, 884, 888, 892, 896, 900, 904, 908, 912, 
	916, 920, 925, 929, 933, 938, 942, 947, 952, 956, 961, 966, 971, 976, 
	981, 986, 991, 997, 1002, 1007, 1013, 1019, 1024, 1030, 1036, 1042, 
	1049, 1055, 1061, 1068, 1075, 1082, 1088, 1096, 1103, 1110, 1118, 1126, 
	1134, 1142, 1150, 1159, 1168, 1177, 1186, 1196, 1206, 1216, 1226, 1237, 
	1248, 1260, 1272, 1284, 1297, 1310, 1324, 1338, 1353, 1369, 1385, 1402, 
	1420, 1439, 1459, 1480, 1502
];


var arduino = require('duino');
var board = new arduino.Board({
    device: 'COM7',
    debug: false //true
});



board.on('ready', function () {
    console.log("arduino board is ready to serve.");
    board.pinMode(pinName, 'in');
    
    setInterval(function () {
        console.log('request to get an analog value from ' + pinName);
        board.analogRead(pinName);
    }, 1000);
});

board.on('data', function (message) {
    // message looks like {pin}::{data}. so it will be disassembled properly.
    var m = message.slice(0, -1).split('::'),
        err = null,
        pin, data;
    
    if (!m.length) {
        return;
    }
    
    pin = m[0];
    data = m.length === 2 ? m[1] : null;

    console.log('reading value from pin' + pin + ': ' + data );
    if (pin === pinName) {        
        var converted = temps[parseInt(data) - 238] / 10.0;
        console.log('current temperature is ' + converted + ' degree of celsius');
    }
});


C:\tests>node temp.js
arduino board is ready to serve.
request to get an analog value from 00
reading value from pin00: 489
current temperature is 23.5 degree of celsius
request to get an analog value from 00
reading value from pin00: 489
current temperature is 23.5 degree of celsius
request to get an analog value from 00
reading value from pin00: 489
current temperature is 23.5 degree of celsius
^C
C:\tests>


단순히 보면 위의 코드가 앞서 arduino 펌웨어의 코드보다 더 간략해 보이지 않지만, 

이 코드는 세번 째 강연으로 진행했던 사물 간의 연결을 위한 Open API에서
다루었던 serialport 모듈의 기능을 포함하고 있습니다.

(즉 비슷한 코딩 량으로 두 가지 일을 한번에 한 것입니다.)


이외에도 앞서 문제로 제기했던 것들의 해결책으로써 

호스트에서 arduino 원격 제어와 펌웨어 업데이트 없이 추가 기능 구현이 가능해 졌습니다. 


더 나아가 이를 RESTful Web API와 JavaScript API 형태인 Open API로 재 설계한다면
웹을 통해서 아두이노를 원격 제어하는 게 가능해 집니다.


마지막으로 사족을 붙여 보겠습니다.


아래 포스팅을 통해 사물과 사물 간의 대화를 위해서는 수 많은 기술적 제약들이 현재 존재함을 말씀드린 바 있습니다.


- 사물 인터넷을 지탱하는 것 

- 사물 인터넷은 어떻게 생각하게 될까?


저는 이 장벽을 푸는 첫 번째 기술적 열쇠로 자바스크립트 언어를 바라보고 있습니다. 

이 언어를 사용하는 많은 개발자들이 존재하면서도 지적 재산권(IP) 문제에 자유롭고 계속적으로 기능이 향상되고 있기 때문입니다.


최근 뉴스에 등장한 오라클과 구글의 안드로이드에서의 자바 언어 사용 관련 특허 분쟁은 사물인터넷 시대를 맞이 할 우리에게 시사하는 점이 많습니다.

처음 기술을 개발한 세력이 개방과 공유를 빙자해 전파하더라도 나중에 가서는 그것을 사유화하려고 할 것이기 때문입니다. 


그러나 우리는 지난 사반세기 동안 이런 사유화를 막고 지구적 공동체를 만들어낸 훌륭한 사례를 본 적이 있습니다. 

따라서 웹과 arduino가 그러했듯이 오픈 소스 소프트웨어오픈소스 하드웨어가 초연결 사회로 나아가는 축으로 자리 잡길 기대합니다.


감사합니다.  


안녕하세요,

"생각의 웹"입니다.


AllJoyn Framework (이하 올조인)은 퀄컴에서 개발한 P2P 기술을 오픈 소스로 공개 후 AllSeen Alliance (이하 올신) 주관으로 리눅스 재단의 프로젝트로 진행하는 만물 인터넷 (사물 인터넷보다 한단계 더 나아간 개념입니다만 저는 아직까지는 동의어 혹은 파생어로 봅니다.  ) 프레임 워크입니다.


이 기술을 공개된 지도 일 년이 지난 것으로 기억하는데 가장 최근인 올 해 7월 IFA 2014에서 공개한 데모에 대해 정리한 포스팅이 있어 올조인에 대해 아직 문외한인 분들은 읽어 보면 좋을 것 같아 링크 공유합니다.


퀄컴 올조인으로 물꼬튼 올신의 현재 (칫솔 - 초이의 IT 휴게실)  



올조인의 가장 긍정적인 면은 처음부터 누구나 소스 코드를 사용할 수 있도록 공개하고도 더불어 다양한 플랫폼 개발자들을 위해 여러 프로그래밍 언어의 API 문서와 프로그래밍 가이드를 잘 정리해 두었다는 점입니다.


튜토리얼: https://allseenalliance.org/alljoyn-framework-tutorial



오픈소스의 영향으로 인지는 모르겠지만 간단한 검색어를 통한 구글링으로도 꽤 많은 관련 포스팅이 눈에 띄는데 아래 '바쁜척쟁이 개발자의 블로그'에 기능 별로 잘 정리되어 있는 것 같아 살펴 보시길 추천합니다.


http://busydeveloper.tistory.com/category/Alljoyn



개인적으로 아쉬운 점이자 이 포스팅을 쓰게 된 동기는  official site의 가이드에는 JavaScript API가 준비되지 않았다는 점입니다.

개발 이력을 살펴 보니 NPAPI를 이용해 browser에서 사용 가능한 API를 만들려는 시도가 있었다가 실패한 듯 하고 (github에서 관련 프로젝트가 없어졌더군요.) 
대신 아래 경로처럼  node.js를 위한 npm 모듈이 존재하는 것을 확인했습니다.


https://github.com/octoblu/alljoyn


따라서, 현재 클라이언트의 주변에서는 올조인 기기들을 찾을 수 없겠지만 node.js를 탑재한 모바일 기기나 
클라이언트와 node.js 서버가 같은 네트워크 상에 있다는 가정 하에서는 Open API를 통해 기기 간 통신이 가능할 것으로 보입니다.


각론으로 들어가면 사실 올조인의 API는 P2P 개념이 부족한 분들에게는 조금 생소할 수도 있습니다.

하는 역할인 기기 간 통신에 비해 복잡해 보이기도 하고요. 

각 인터페이스들의 역할과 상호 작용의 개념을 명확히 이해하기 위해 먼저 위의 튜토리얼을 읽어 보실 것을 권합니다.

어느 정도 동작 방식에 대해 이해 하셨나요? 아래 코드는 위의 깃허브의 샘플 코드에서 유추해서 Web IDL 형태로 간단히 정리해 본 JavaScript API 입니다.

 


typedef DOMString AllJoynAppName; 

callback SignalMessageCallback = void (DOMString message, DOMString info);
[Constructor (DOMString appName)]
interface BusAttachment {

    void createInterface(AllJoynAppName name, InterfaceDescription description);

    void registerBusListener(BusListener listener);

    void start();

    void connect();

    void findAdvertisedName(AllJoynAppName name);

   void registerSignalHandler(BusObject bus, 
       SignalMessageCallback  smcb,
       InterfaceDescription description, 
       DOMString signalType);
};

[Constructor ()]
interface InterfaceDescription {

    void addSignal(DOMString target, 
        DOMString messageType,
        DOMString message);
};

callback FoundAdvertisedCallback = void (DOMString name);
callback LostAdvertisedCallback = void (DOMString name);
callback NameOwnerChangedCallback = void (DOMString name);

[Constructor (FoundAdvertisedCallback facb, 
    LostAdvertisedCallback lacb, 
    NameOwnerChangedCallback nocb)]
interface BusListener {
};

[Constructor (DOMString busName)]
interface BusObject {

    void addInterface(InterfaceDescription description);
};

callback AcceptSessionJoinerCallback = void (unsigned short port, AllJoynAppName joiner);
callback SessionJoinedCallback = void (unsigned short port, DOMString sessionId, AllJoynAppName joiner);

[Constructor (AcceptSessionJoinerCallback asjcb, SessionJoinedCallback sjcb)]
interface SessionPortListener {
};

문서화 수준과 지원하는 OS (유닉스 계열 - OS X, linux 만 지원)이 부족한 것으로 보아 아직 신뢰할 만한 수준이 아닌 것으로 보입니다.
즉 이 모듈을 사용할 때 각자가 해야 할 삽질이 정해져 있다는 것을 의미합니다. -_-;; 


어쨌든 올신에는 꽤 많은 기기 제작업체가 가입해 있고 슬슬 호환 기기들도 출시를 앞두고 있은 것 같아 기존 레거시 시스템들과 혹은 올신에 가입하지 않는 업체들의 기기와의 대화를 위해 인터프리터 역할을 할 노드가 필요하리라고 예측합니다.

추후 좀 더 구체화된 내용이 있으면 포스팅하도록 하겠습니다.


감사합니다.


행복한 하루 되시길! 

안녕하세요,

"생각의 웹"입니다.


이번에는 지난 한국 웹 20주년 행사에서 삼성전자 책임 연구원이자 Open Knowledge Korea를 이끌고 있는 김학래 님이 시멘틱 웹과 링크드 오픈 데이터라는 주제로 발표한 강연을 정리해 보았습니다.

먼저 공유된 슬라이드를 보시죠.



실내 조명이 어두운 관계로 행사장에서 찍은 사진들이 썩 훌륭하지는 않지만 몇 장 공유합니다.



일부는 슬라이드에도 기재되어 있는 내용이지만 강의를 듣지 않은 분들을 위해 간략하게 정리해서 공유합니다.


시멘틱 웹(Semantic Web)?


- 2001년 scientific american 잡지에서 처음 소개

- 웹의 창시자인 팀 버너스 리의 최초 제안서인 information management에서도 소개된 개념

- 발표자가 2004년 마이크로 소프트웨어 잡지에 관련 기사를 기고


'Relationship' between 'Things'


 - Google Knowledge graph -> search & answer 의 개념. 

 - 구글 창업자인 Larry Page는 이를 두고 '이제 문자열(string)이 아닌 사물들(things)을 검색'할 수 있게 되었다고 표현



패러다임의 변화 (Paradigm Shift)


- 웹에서 기계 대 사람 (machines vs. human) 간의 경쟁에서 사람들의 자발적 참여와 협력을 통해 만들어진 산출물(e.g. 위키 등)이 우위를 보임 

- data web에 대한 가능성이 발현



링크드 오픈 데이터 (Linked open data)


- 데이터를 설명하는 메타 데이터

- 링크드 오픈 데이터가 무엇인지 (what it is) 보다 이것이 어떤 유익을 주는지 (what it is good for you)가 핵심

- 이를 통해 데이터를 보다 쉽게 사용할 수 있게 됨



삼성 지식 그래프 (Samsung Knowledge Graph - K SharP) 개발 사례 소개


- 데이터 (Data)를 지식 (Knowledge)화해서 서비스 (Service) 창출하는 것을 목표로 개발 중. 

- 개발 완료 후 외부 공개할 예정



우리가 상상하는 미래는?


- 지식 그래프 기반 개인 비서 (personal assistant)를 대중 화 되기 시작함. 구글, 애플, 마이크로소프트는 관련 서비스를 이미 실행 중.

- 생각하는 지능형 웹으로 만들기 위한 기술적 도전



결론


- 다양한 기술의 조합과 응용을 통해 진화

- 기반 기술에 대한 올바른 이해와 지속적 관심

- 한국어 데이터 처리 기술에 대한 관심과 연구가 필요함 




행사장에서 K-SharP를 통해 아인슈타인과 퀴리 부인 등의 유명 과학자들의 공통점을 유추해 내는 시연이 있었는데 그 결과 놀랍게도 '채식 주의자' (vegetarian) 이라고 나와서 개인적으로 흥미로웠습니다. 각종 오픈소스 시각화(visualization) 도구들도 훌륭하고요.

아직 상용화 수준까지는 갈 길도 멀고 이미 엄청난 레거시 데이터를 통해 비즈니스를 하는 기업들이 많아 자체 경쟁력이 많아 보이지는 않지만 웹 정신 특유의 공유와 협력으로 의외의 결과가 나타날 수도 있지 않을까 하는 기대를 갖게 합니다.   


이번 포스팅은 여기까지 입니다.

감사합니다.




안녕하세요.

'생각의 웹'입니다.


이글을 읽는 분들 중 지난 한국 웹 20주년 기념 컨퍼런스에 참석하신 분이 계신지 모르겠습니다.

이날 오후 첫번째 세션 중 트랙 C에서 엔씨 소프트 김민태 차장님이 '웹을 지탱하는 차세대 기술' 이라는 주제로 발표하셨는데 그림과 같이 가장 상단 부에 배치하신 기술이 지금 제가 여러분들께 소개하고자 하는 웹 컴포넌트(Web Component)입니다.


김민태 차장님이 의리로 공유하신 슬라이드를 보시죠.



슬라이드가 그림 위주로 작성된 관계로 강의를 듣지 않은 분들을 위해 제가 기록한 강의록을 아래와 같이 공유합니다.

- 웹의 성공 요인: simplicity -> 2000년대 application 형태로 진화

- Web Application

○ 고생스러움

* 올드한 느낌 

* 통합되지 않는 낙후된 개발환경

* 규모가 커지면 아키텍쳐링하기 힘듦

* 라이브러리 의존성 (너무 많은 라이브러리와 버전간 충돌 문제)

○ 웹 기술의 한계

* 자바스크립트의 한계

□ Common JS spec로 해결 시도 중

e.g. Cloud9

□ 그러나 기술 표준의 부재로 과도한 엔지니어링 노력이 필요

* div의 한계

□ Web Components 스펙으로 돌파구 마련

□ 그런데 관심이 별로 없음

□ 신기술들

. Template

◊ 템플릿 라이브러리를 사용하지 않아도 사용 가능

. Shadow DOM

◊ 랜더링 되지 않는 DOM (createShadowRoot() API)

. Custom Elements

◊ Element를 user defined 할 수 있음.

. HTML Imports

◊ 뷰를 가지고 있는 컴포넌트를 가져올 수 있음 -> 기존 웹 개발 패러다임의 변화를 가져올 수 있음

* 현재 사용가능한가?

□ polyfill로 모든 브라우저에서 대응 가능!! (구글 polymer, 모질라 brick)

e.g. slideshare - Polymer: Web Components & Web 참조

○ 퍼포먼스 이슈

* 브라우저 구조상 이슈로 성능 향상에 한계가 있음

□ DOM, Rendering 이슈

□ 중첩된 DOM 객체들 처리 이슈

□ 고해상도 지원

* 해결 방안 : Web GL

□ CPU 대신 GPU로 처리

□ Unity 2D 처리 사례처럼 3D 가속으로 2D를 처리 가능

. 단, 구현이 쉽지 않음. 

○ 기능 이슈의 해결 방안

* Service Worker

* Web Worker

* Transpiler & ASM.js


  김민태 차장님이 완소 자료로 언급하셨던 구글 폴리머 관련 슬라이드입니다.



공교롭게도 (아니면 필연적으로) 당일 오후 두번째 세션 트랙 A에서 W3C 다니엘 데이비스(Daniel Davis)가 발표한 'HTML5 이후의 변화들'이라는 강연에서도 HTML5가 우리에게 준 것들 (What did HTML5 gives us?)로 이 웹 컴포넌트를 예로 듭니다.


웹 컴포넌트는 위의 그림처럼 <meter>라는 사용자 정의 (custom) 태그 (tag)로 손쉽게 원하는 컴포넌트를 만들 수 있게 하는 기술입니다.

이로써, <div> 태그에 각종 class 속성을 입혀 원하는 컴포넌트를 만들던 이전 방식에서 벗어나 보다 직관적이고 확장성 있는 컴포넌트 개발이 가능합니다.


사실 이 기술은 년 초 WWW 2014 컨퍼런스 HTML5 기술 튜토리얼 시간에 공유된 바 있는 데 지금까지 저도 많은 관심을 갖지 못했었습니다.

(제대로 잘 만드는 것보다 어떻게든 만드는 것에만 급급했기 때문이죠. 아마 대부분의 개발자 분들이 처한 입장이 아닐까 싶군요.)

아래 링크를 가시면 다양한 예제를 코드와 더불어 경험해 볼 수 있습니다.


http://mainline.essi.fr/HTML5slides/chapter7Seoul.html


이번 포스팅을 정리합니다.


웹 컴포넌트 기술은 이미 현실에 적용된 차세대 웹 기술 중에서 가장 효용성이 있는 기술입니다. 널리 퍼뜨려 사용하게 만드는 것이 의리입니다. ^^

혹시 여전히 한국 사회의 악의 축으로 자리 잡고 있는 IE6, 7 과 같은 구형 브라우저들 때문에 사용을 주저하시는 분들이 있다면 이를 매꿔주는 다양한 폴리필(polyfill)이 있으니 걱정 놓으셔도 됩니다.


다음 포스팅으로 저만의 웹 컴포넌트를 만들어 이에 대한 후기를 공유해볼까 하는데 언제가 될지는 선뜻 약속드리기 힘드네요. ^^;

블로거 분들이 댓글로 관심 보여주시면 포스팅이 좀 빨라지지 않을까요? ;-)


긴 글 읽어 주셔서 감사합니다.

행복한 하루 되시길! 

 


'Web of Humans > HTML5' 카테고리의 다른 글

차세대 웹 기술 - 웹 컴포넌트 (Web Components)  (0) 2014.10.23
W3C HTML5 official tutorial  (0) 2014.04.30

안녕하세요.

'생각의 웹'입니다.


사람 뿐 아니라 기계도 정보를 이해하고 이를 체계화해서 새로운 지식을 창출해 낸다면 세상은 어떻게 변할까요?

시멘틱 웹(Semantic Web)은 정보(Information)에 기계가 이해할 수 있는 의미(Semantics)를 부여하기 위한 메타 데이터(Meta data)를 추가하고 이로써 온톨로지(Ontology)를 만들어내는 과정을 통해 새로운 정보를 추론할 수 있는 웹 기술입니다.


이 글을 쓰는 저도 이 분야에 대해서는 입문자 수준이기에 제가 WWW2014 컨퍼런스 튜토리얼(Tutorial) 세션에서 들었던 슬라이드가 시멘틱 웹 입문자에게 좋은 가이드가 될 것으로 생각하여 늦은 감이 있지만 아래와 같이 공유합니다. (-:



이 카테고리에는 본 블로그의 제목처럼 생각하는 웹을 만들기 위한 기술인 시멘틱 웹 관련 기술들을 지속적으로 포스팅하려 합니다.

많은 관심 바랍니다. 감사합니다.

안녕하세요. "생각의 웹"입니다.


기존의 기본 템플릿 기반으로 만든 블로그가 너무 구식이라는 절친의 지적이 있어 가장 빠르게 업데이트 하는 방법을 찾던 중, 마크쿼리 님이 만드신 스킨이 있어 이렇게 적용해 보았습니다. 설치 가이드는 아래와 같습니다.


티 스토리 반응형 스킨 설치 가이드 


가이드를 따라서 하면 크게 무리 없이 변경이 가능하나 몇 가지 직접 코드를 수정해 줘야 하는 사항이 있어 아래와 같이 정리합니다.


  1. 대문의 이미지(cover.jpg)와 메뉴 내용 수정 (사이드 메뉴에 마크쿼리 님의 템플릿 사이트가 올라오니 삭제 필요)
  2. 코드 꾸미기를 위해 사용했던 class tag 변경 (이전에는 설치형 beautifier를 사용했으나 이번엔 구글의 code priettify로 변경)
    • HTML를 제외한 코드 삽입 시 : <pre class="prettyprint linenums:1"> </pre>로 해당 코드를 둘러쌈.
    • HTML, XML 코드을 경우: <xmp class="prettyprint linenums:1"> </xmp>로 코들를 둘러쌈.
스킨을 바꾸니 수고가 많이 들기는 하나 왠지 새롭게 시작하는 느낌이 들어 색다르네요.

;-)


감사합니다.

+ Recent posts