2018년 9월 18일 화요일

HD Wallets

HD Wallets

(Hierarchical deterministic wallets, 참고1-잘못된 정보에 주의, 참고2)

  • 정의

    • BIP(Bitcoin Improvement Proposals) 32 (BIP 0032) 에 정의되어 있는 Bitcoin 류의 blockchain의 계정 묶음(wallet)을 생성하는 방법에 대한 표준이다.
    • 특정한 키 생성 방법과 체계를 가지고 있어, 특정 코인 주소 대신 seed를 사용해 여러 개의 코인 주소를 추출해 낼 수 있도록 되어있다.

  • 주소 식별 체계

    • HD Wallet은 wallet 내의 주소를 구분하기 위해 m/44'/0'/0'/0 과 같은 형식을 따르고 있으며 통상 아래와 같은 규칙으로 사용된다. (참고1, 참고2)
      • m / purpose' / coin_type' / account' / chains / address_index
      • m: 최초 시드(master seed)로 부터 생성된 마스터 노드(master node)
      • purpose: 통상 44 값이 쓰이는데, BIP44(다중 HD wallet 계정)를 뜻한다.
      • coin_type: 코인의 종류를 나타내며 대표적으로 아래와 같은 코드가 쓰인다.
        • 0: Bitcoin
        • 1: Testnets
        • 2: Litecoin
        • 60: ETH
        • 61: ETC (Ledger의 경우 표준을 부분적으로만 따르기 때문에 60을 사용)
        • 194: EOS
        • 2018: EOS Classic
        • 더 많은 정보는 SLIP 0044 문서를 참조
      • account: 계정 번호이며 사용자가 용도에 따라 임의로 정할 수 있다. 가족 구성원 또는 코인의 사용처 별로 구분해 사용하는 시나리오를 생각해볼 수 있다.
      • chains: 0 또는 1만 쓰인다. 0은 외부 keypair chain을 나타내며 새로운 공개키를 생성할 때 사용된다. 1은 내부 keypair chain을 나타내며, 새로운 거래를 위해 내 wallet안의 계정에 소속된 코인을 옮겨담을 때 중개 역할을 한다 (TODO: 추가 참고자료 필요).
      • ※주 index' = 0x80000000 + index

  • 특징

    • Public key seed를 사용하면 public key만 생성할 수 있으며, private key는 오직 private key seed로 부터만 생성될 수 있다. 
    • Master seed는 복구의 용이성 때문에 통상 mnemonic(BIP39) 으로 부터 생성된다.

  • 장점

    • Wallet을 복구할 수 있다면, wallet으로부터 생성된 모든 계정을 복구할 수 있다.
    • 이 표준을 따르게 되면 Wallet 소프트웨어의 종류에 상관 없이 계정 복구가 가능하다.

  • 단점

    • Master seed의 보안이 무엇보다 중요하다!

2018년 9월 17일 월요일

WinUSB Device

WinUSB Device


  • Microsoft에서는 Windows 8 이후 부터 제조사에서 inf 파일 없이 WinUSB 드라이버를 사용할 수 있도록 지원하고 있다.
  • WinUSB Device란? (참고)
    • WinUSB device란 Microsoft 사의 OS feature descriptor를 사용하는 USB 장치를 의미한다. 이때 descriptor는 호환 가능 ID가 "WINUSB(USB/MS_COMP_WINUSB)"로 설정되어야 한다.
    • 반대로 자동으로 설치되는 드라이버를 사용하지 않으려면, 장치를 WinUSB device 로 설정하지 않은 상태에서 INF 파일에 hardware ID를 정의해야 한다. 
    • Microsoft 사에서는 WinUSB device에 대한 Winusb.inf 설치 파일을 기본으로 제공하고 있다. (WinUSB 장치에 대해서 자동 적용됨)
    • Windows 8이전의 OS에서 WinUSB 드라이버를 사용하기 위해서는 WinUSB (Winusb.sys) Installation 문서를 참고하여 GUID 설정 및 필요한 파일 복사 등의 작업을 수행해야 한다. -- Windows Update를 통해서 WinUSB.inf가 설치되는 경우는 신경을 쓸 필요가 없을 듯 --
    • WebUSB의 경우 WinUSB device를 기본으로 동작하므로, WinUSB device의 요건과 일치한다. Arduino Leonardo에 WebUSB Firmware를 설치한 경우 아래와 같은 속성을 확인할 수 있다.
  • Device description
    • WinUSB device의 경우 device description은 inf 파일에서 정보를 가지고 오지 않고, 장치에서 보고된 iProduct 문자열을 사용해서 표기된다. 이런 규칙은 Windows 8 이전에는 적용되어 있지 않기 때문에 이전 버전의 Windows에서는 WinUSB.inf를 사용해 설치된 장치는 모두 이름이 USBDevice로 표기된다.
  • Microsoft OS Descriptors (참고)
    • WinUSB device의 확장기능(extended feature - UX 개선 등에 사용할 수 있다)을 사용하기 위해서는 Microsoft OS Descriptor를 사용해야한다. String Descriptors 필드의 0xEE인덱스의 문자열을 지정함으로써 이 기능을 구현할 수 있다. WinUSB를 지원하는 TREZOR model T 제품의 descriptor를 확인해보면 구현 예를 찾을 수 있다.
  • 아울러 "DeviceInterfaceGUID"를 지정하는 Property를 가지고 있어야한다. (참고)
    • 해당 Property는 registry에서 확인할 수 있다. 
    • Cypress FX chipset을 사용해 개발하는 경우 참고: https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/automatic-installation-of-winusb
  • Arduino WebUSB프로젝트 또한 WinUSB device 표준을 기본으로 하고 있기 때문에 이 소스코드를 보는 것이 WinUSB device를 이해하는데 큰 도움을 줄 수 있다.
    • https://github.com/webusb/arduino.git

2018년 9월 16일 일요일

Web-USB Tryout

[Draft] WebUSB 테스트

  1. WebUSB 기능을 지원하는 것으로 알려진 Arduino Lenardo 보드를 입수했다. Full size board와 Pro-micro 보드를 모두 테스트해보기로 한다. 두 보드 모두 arduino IDE에서는 그냥 Leonardo 보드로 인식되며, 정확히 같은 동작을 한다.
  2. 가이드를 따라 펌웨어를 올려본다.
    1. 기본적으로 호환이 검증된 조합 (Arduino Leonardo + Arduino IDE)을 사용해 테스트를 한다면 한단계 씩 가이드를 따라하면 어렵지않게 기본 동작을 확인할 수 있다.
      • https://github.com/webusb/arduino
    2. 하지만 펌웨어를 적용한 arduino 보드가 Web-USB 장치로 인식이 되지 않는 경우가 발생할 수 있다. (WebUSB 보안문제로 인해 지원에 문제가 있을 것 같더니... 지원이 종료가 염려되기도 한다.)
      1. 펌웨어 문제인지도 확인해보아야 한다.
        1. Web-USB를 지원하는 장비는 GUID가 {3408b638-09a9-47a0-8bfd-a0768815b665} 이어야한다.
          • 해당 GUID는 USB TreeViewer에서 Platform Capabilities Descriptor 라는 항목에서 찾을 수 있다.
      2. 가이드에 명시되어 있는 내용으로 부터 알 수 있듯, USB 2.1을 지원하는 장치만 사용할 수 있다고 하는데, 호스트(PC)가 USB 2.1을 지원하는 지도 확인해보아야 한다.
        • Bingo! 위와 같은 구성에서는 WebUSB 인식이 잘 되고 있다.
        • Arduino Lenardo 까지 이르는 장치 트리에서 USB 2.0 노드가 없는 것을 볼 수 있다.
        • 참고로, USB 2.1을 지원하는 호스트라면, USB 장치에서 다음과 같이 Binary Object Store (BOS) Descriptor를 확인할 수 있어야 한다.
      3. 차후에 WebUSB 인식 문제 생긴다면 아래 글도 참고해보아야 할 것 같다.
        1. WebUSB를 지원하도록 설계되지 않은 다른 클래스 장치는 (보안 문제로 인해) 필터링이되었다.
        2. Web-platform feature라는 것을 활성화해야 동작할 것이라는 의견이 있지만, 특정 chrome version의 경우에만 해당되는 것 같다. 
          • chrome://flags/#enable-experimental-web-platform-features
          • Flag 세팅 없이 동작 하는 것을 확인 (Windows 10 64bit / Chrome version 68.0.3440.106) 했으니 최신 버전에서는 문제가 없다고 보아야겠다.
      4. 어떤 경우에는 WebUSB demo에서 아래와 같은 아래의 에러 메시지가 발생하기도 하는데, 딱히 장치 인식과 관계는 없다.
  3. Demo
    1. 스펙을 보면 WebUSB는 HTTPS 페이지에서만 사용할 수 있기 때문에 로컬에서 서버를 실행해 테스트하려면 self-signed 인증서를 사용하고, 크롬에서 인증서 체크 옵션을 설정하는 등 무척 번거롭다.
      1. 따라서 샘플 페이지를 활용하는 것이 효율적일것: 
        • https://webusb.github.io/arduino/demos/
      2. 프로젝트 보안이 문제가 안된다면 GitHub Pages를 활용하는 것이 좋은 방법이다.
    2. 조금더 복잡한 예제는 다음을 참조
      1. https://github.com/edwinm/WebUSB

2018년 9월 14일 금요일

Arduino MKR Vidor 4000

Arduino MKR Vidor 4000

Arduino MKR


  • Arduino 시리즈 중 IoT 타겟으로 만들어진 제품군이다.
  • GSM/WiFi 등 인터넷 기능을 기본으로 탑제하고 있는 경우가 대부분이며 IoT 타겟 제품인 만큼 크기가 작은편이다. LiPo 포트(충전/배터리 모듈 소켓)를 포함한 것도 많다.

Arduino MKR Vidor 4000



  • Arduino 보드 중 FPGA를 내장한 최초 모델로, HDMI/MIPI 포트를 탑재하여 실시간 영상 감시에 적합하게 만들어졌다. WiFi/LiPo 단자를 가지고 있기 때문에 무선으로 완전히 독립된 장치 구성도 가능하다. Mini PCI-e 포트를 가지고 있는 것이 특이한데, 이는 이 규격의 소켓을 구하기 쉬울 뿐만 아니라 솔더링이 쉬운 구조를 가지고 있기 때문이라고 한다.
  • 동작 전압: 3.3V
    • USB/VIN을 제외한 핀에 3.3V 외의 전압이 인가되지 않도록 주의!
  • MIPI Camera 커넥터
    • Vidor 보드는 Raspberry Pi 카메라로 알려진 Omnivision OV5647를 기본적으로 지원하는데, 다른 종류의 MIPI 카메라와도 호환이 가능할 것이라고 한다. Flat cable로 연결되기 때문에 case를 제작했을 때 높은 일체감을 줄 수 있다.
  • NINA-W102 WiFi
    • 금속재질의 커버로 싸여있는데, 이 금속 커버가 안테나 역할을 하며 회로를 보호한다.
  • FPGA
    • Intel Cyclon 10CL016 칩셋을 사용한다. 다소 높은 사양이지만 가벼운 영상 처리 기능을 구현하는데는 적합할 것으로 보인다.
    • Arduino 재단에서 다양한 용도로 사용할 수 있는 유용한 기능을 구현해 라이브러리 형태로 제공하고 있다. (Vidor 키워드로 검색)
  • MCU
    • SAMD21 프로세서는 USB 통신과 회로를 제어하는 역할을 한다.
  • USB
    • USB 포트는 전원공급과 Serial 통신을 위해 사용된다.
    • 좌/우에 각각 사용자 정의(BUILTIN_LED, 붉은 색), 전원(녹색) LED가 있다.
  • GPIO
    • MKR 보드 호환 핀들은 FPGA를 경유하도록 설계가 되어있어 MKR 실드 보드들을 다양한 방법으로 활용할 수 있도록 해준다.

주) FPGA에 구현된 기능이 복잡해지면 다소 열이 날 수 있다고 한다.

참고: https://www.arduino.cc/en/Guide/MKRVidor4000

2018년 9월 13일 목요일

WebUSB

WebUSB

  • Chrome 61 version 부터 지원하기 시작한 https 웹페이지에서 USB 장치를 사용할 수 있도록 만들어진 표준(안)이다. 현재 Chrome과 Opera 브라우저만 지원한다.
    • 참고
      • https://github.com/WICG/webusb
      • https://wicg.github.io/webusb/
      • https://developer.mozilla.org/en-US/docs/Web/API/USB
  • Arduino Micro 또는 Leonardo 보드를 이용해 테스트해 볼 수 있다.
  • Phishing 위험 때문에 chrome에서 '한시적인' 지원 종료를 선언했었다. 아마도 아래와 같은 보고서 때문이 아닌가 싶다.
    • WebUSB - How a website could steal data off your phone
      • https://labs.mwrinfosecurity.com/blog/webusb/
    • 기본적으로 U2F와 같은 보안키가 위협에 노출되었다는 것이 가장 큰 이유가 될 것이다.
      • https://www.yubico.com/support/security-advisories/ysa-2018-02/
    • 기술적으로 web에서 USB를 접근하게 할 때 어떤 위협이 있는지 알아보는 것도 좋을 것 같다.

2018년 9월 6일 목요일

FPGA 시작하기

  1. FPGA란?

    • TODO: 인터넷의 글들을 참고해서 나만의 FPGA 기술에 대한 정의를 내려보자.
    • 참고글: http://www.ni.com/white-paper/6983/ko/
  2. 어떤 FPGA가 나에게 맞을까?

    • 우리의 수준:
      1. FPGA를 이용해 개발하는 개발자들을 옆에서 본 경험이 있고,
      2. 어떤 용도로 사용하는지 약간의 지식이 있으며,
      3. C/C++은 익숙하게 사용하지만 Verilog는 어렵지만,
      4. 새로운 지식과 기술을 받아들일 준비가 되어있다.
      5. 눈으로 확인할 수 있는 간단한 프로젝트를 진행하며 공부를 해보고 싶다.
      6. 여가시간에 진행할 것이기 때문에 어려운 프로젝트는 진행이 불가능
  3. 선택이 가능한 옵션:

    1. TinyFPGA

      • 장점
        • 초보자에게 적합한 튜토리얼이 제공된다.
        • 프로그래밍에 JTAG이 필요 없다.
        • 모든 툴이 무료로 배포된다.
        • 튜토리얼 및 예제 프로젝트: https://tinyfpga.com/bx/guide.html
        • 보드 가격이 저렴하고, 국제 배송이 가능!
      • 단점
        • 로직 합성 효율이 떨어질 것으로 예상된다.
        • 크라우드펀딩을 통해 제작되는데, 재고 보유분이 적어 예약주문을 해놓고 몇 주 정도 기다려야한다. 2018년 9월 10일 예약주문 -> 9월 27 결제요청
      • 참고
    2. Cmod A7-35T

      • 장점
        • 국내에서 구입이 가능하며, 좀더 신뢰성이 높은 칩셋을 사용(Xilinx)한다.
      • 단점
        • 저가형 칩셋을 사용함에도 불구하고 보드 가격이 비싸다(12만원 이상)
        • 초보자를 위한 가이드가 없다.
        • 로직 업로드를 위해 JTAG이 필요한 듯 하다.
      • 참고: 쇼핑몰, 단품 칩셋 정보
    3. BeagleWire

      • 장점
        • BeagleBone 보드의 에드온으로 개발되어 활용폭이 넓다.
      • 단점
        • 칩셋의 사양이 높지 않아 소규모 프로젝트용 프로토타입 개발 플랫폼용으로는 적합(Embedded system 통합) 하지만 스터디용으로는 부적합
      • 참고
    4. AWS FPGA Developers AMI

      • 장점
        • 본격적인 FPGA 제품화 계획이 있다면 스케일러블하게 서버를 구성해 제품 수준의 로직을 합성할 수 있다.
      • 단점
        • 별도의 하드웨어 셋업이 필요하며, 돈이 든다 (Xilinx).
        • 칩 단품이 우리의 용도에 맞지 않을 것으로 보인다 (오버스펙)
      • 참고
        • https://aws.amazon.com/marketplace/pp/B06VVYBLZZ
    5. Arduino MKR Vidor 4000

      • 장점
        • Arduino 재단에서 지원하는 보드인만큼 교육 지원이 잘 되어있고,
        • 사용성이 좋은 Arduino IDE로 개발할 수 있다.
        • IO가 무척 다양하고(HDIM/MIPI카메라/WIFI 등) 실용적인 프로젝트에 바로 쓸 수 있을 정도로 구성이 잘되어 있다.
      • 단점
        • FPGA 칩이 다소 오버스펙이며 단가가 매우 비싸다.
        • 만들어진 지 오래되지 않아 사용자 층이 얇고 국내 판매가 안되어 해외 구매를 해야한다.
        • 앞서와 같은 이유로 샘플코드도 폭발적으로 늘어나지 않을 가능성이 높다.
      • 참고
        • https://www.arduino.cc/en/Guide/MKRVidor4000
  4. 어떻게 시작해볼까?

    • TinyFPGA + Arduino MKR Vidor 4000 샘플 프로젝트로부터 시작!
    • Arduino MKR 보드가 수급에 유리하여 먼저 입수될 가능성이 높다!

[Scrap] Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD

Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD https://cv-tricks.com/object-detection/faster-r-cnn-yo...