2017年2月8日水曜日

ブートイメージからカーネル、rootfs、configを取り出す

image.ub ファイルからカーネル、rootfs、/proc/configを取り出す

SDSoC 2016.3に含まれる ZYBO 向け Software Platform からカーネル、 rootfs、/proc/config を取り出したかったので取り出した。

そもそも image.ub ってなんだ


ARMで使えるブートローダu-bootが扱うイメージフォーマットらしい。

$ mkimage -l image.ub
FIT description: PetaLinux arm uImage with single Linux kernel and FDT blob
Created:         Fri Nov 18 04:07:34 2016
 Image 0 (kernel@1)
  Description:  PetaLinux Kernel
  Created:      Fri Nov 18 04:07:34 2016
  Type:         Kernel Image
  Compression:  gzip compressed
  Data Size:    8747883 Bytes = 8542.85 kB = 8.34 MB
  Architecture: ARM
  OS:           Linux
  Load Address: 0x00008000
  Entry Point:  0x00008000
  Hash algo:    crc32
  Hash value:   252654ca
 Image 1 (fdt@1)
  Description:  Flattened Device Tree blob
  Created:      Fri Nov 18 04:07:34 2016
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    13962 Bytes = 13.63 kB = 0.01 MB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   66629950
 Default Configuration: 'conf@1'
 Configuration 0 (conf@1)
  Description:  PetaLinux Boot Linux kernel with FDT blob
  Kernel:       kernel@1
  FDT:          fdt@1


カーネルを取り出す


まずこのイメージからカーネルを取り出す。 mkimage -l の結果から gzip compressed であることがわかっているので、 magic を頼りに探すと 240バイト目から gzip データがあることがわかる。 mkimage の結果からファイルは 8747883 バイトであることがわかる。

$ grep -P -a -b  --only-matching $'\x1F\x8B\x08' image.ub
240:

なので

$ dd if=image.ub of=linux.bin.gz bs=1 skip=240 count=8747883
8747883+0 records in
8747883+0 records out
8747883 bytes (8.7 MB, 8.3 MiB) copied, 6.91697 s, 1.3 MB/s

$ file linux.bin.gz
linux.bin.gz: gzip compressed data, was "linux.bin",
  last modified: Thu Nov 17 19:07:33 2016, max compression, from Unix


カーネルの中から gzip データを取り出す


さらにこのアーカイブの中にrootfsが含まれている。cpioフォーマットで入っているかと思い、cpioフォーマットのヘッダである"070707"をgrepしたら発見... と思ったがハズレだった。これはcpioアーカイブじゃなくてcpioアーカイブを探すプログラムが参照している文字列っぽい。ということは...

$ grep -P -a -b  --only-matching $'\x1F\x8B\x08' linux.bin
6278680:
8588960:
9923536:

gzip のヘッダらしきものが3つ見つかった。まずひとつ目は...

$ dd if=linux.bin skip=6278680 bs=1 | gzip -dc > hoge

gzip: stdin: decompression OK, trailing garbage ignored

toor@gpusv:~/zynq7/extract_initramfs$ file hoge
hoge: Linux make config build file, ASCII text

ASCIIだと!?

$ head hoge
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm 4.6.0 Kernel Configuration
#
CONFIG_ARM=y
CONFIG_ARM_HAS_SG_CHAIN=y
CONFIG_MIGHT_HAVE_PCI=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_HAVE_PROC_CPU=y
CONFIG_NO_IOPORT_MAP=y

...config.gz だった。まあ、ついでなので保存。

$ mv hoge config


では次。

$ dd if=linux.bin skip=8588960 bs=1 | gzip -dc > hoge
gzip: stdin: decompression OK, trailing garbage ignored

toor@gpusv:~/zynq7/extract_initramfs$ file hoge
hoge: ASCII cpio archive (SVR4 with no CRC)

toor@gpusv:~/zynq7/extract_initramfs$ cat hoge | cpio -it | head
cpio: Substituting `.' for empty member name
.
dev
dev/pts
etc
etc/opkg
etc/opkg/arch
etc/rpm
etc/rpm/sysinfo
etc/rpm-postinsts
etc/network

今回は間違いなくinitrdイメージだ。

$ mv hoge initrd


目的な達成したけど、3つめはなんじゃらほい。
dd if=linux.bin skip=9923536 bs=1 | gzip -dc > hoge
gzip: stdin has flags 0xce -- not supported


これは有効なgzipじゃなかった。"070707" 同様に gzip をデコードするルーチンが参照している定数かも。

2017年1月19日木曜日

Oculus Rift CV1 に近視レンズを組み込んだ


Oculus Rift CV1 用のレンズアダプターで近視レンズを組み込んだので、久々にブログにまとめようかと。

皆さんの VR ライフ満喫していますか?

実は... 私はあまり満喫できていませんでした。眼鏡男子の私にとって Oculus Rift CV1 の利用それほど手軽ではなかったからです。

普段、私は乱視矯正・近視矯正の両方が入った眼鏡をかけています。例外的に、冬にスノーボードを楽しむ時にはワンデータイプのコンタクトレンズを使っています。このため、 Oculus Rift CV1 で何か VR コンテンツを楽しむにあたっても、 Lucky's Tale 程度のコンテンツなら裸眼で問題ないとはいえ、 EVE: Valkyrie にょうな UI であったり、細かい文字を読み取らないといけないようなコンテンツではコンタクトレンズを装着しないと楽しめない状況でした。また、私が利用しているのはワンデータイプのコンタクトレンズです。ふらっと Oculus Rift で遊ぶときにワンデーコンタクトを消費するとなると、心理的なハードルはさらに高くなります。

CV1 用レンズアダプターを入手!

そんなことを思っていたら、Oculus Rift CV1 ヘッドセットにメガネ用のレンズを装着し近視矯正を可能にするアダプターの 3D モデルデータを見つけました。

このレンズアダプターは Oculus Rift CV1 にぴったりとはまるようにデザインされていて、レンズには、一般的な眼鏡用のレンズが利用できます。当初より公開されている、オリジナル版のアダプターでは、Zenni Optical の #450021 用に作られた、直径 40mm の円型の眼鏡用レンズを装着できます。

これをどこかでプリントしてもらうか、プリントしてもらうなら送料ケチるために複数オーダーしたほうがいいかなとか色々考えつつ、手を出せていなかったのですが……。もう半年以上前に見つけたこのレンズアダプターですが、最近 3D プリンターを購入したという知人がこのアダプターをプリントしてくれたので、ついに実物を手に入れることができました。


写真は見やすい白い樹脂でプリントしたものを掲載しましたが、実際に CV1 に取り付けたものは黒色のアダプターです。

レンズを入手するための方法は?

そして、次のチャレンジは、「眼鏡のレンズをどうするか」です。今回入手したアダプターは先のとおり Zenni Optical #450021 と互換性があります。このアダプターに対応するレンズを入手する方法として、まずは下記2パターンが考えられます。


  1. 同フレームのみ購入して、レンズは日本で作る
  2. 同フレームとあわせて、レンズも購入する

ずっと悩んでいたのですが、今回は結局、後者「レンズを購入したらフレームもついてくる」という形で入手することにしました。

はじめての通販眼鏡オーダー

次の問題は、いままで眼鏡購入は街のメガネ屋に依頼して作ってもらっていて、通販で眼鏡のレンズなんて買ったことがない、という点です。このため、過去に購入したコンタクトレンズや眼鏡のパラメータを参考にオーダーすることになります。

コンタクトレンズの度数でオーケー

先述のとおり、私は近視矯正用のコンタクトレンズを使用しているので、そのコンタクトレンズを見ることで自分が必要とする近視矯正のパラメータがわかります(というか何百回もコンタクトレンズを使っているので、近視の強さはもう憶えてしまっています)。手元のコンタクトレンズによる近視矯正のパラメータは下記のとおりでした。

  • 左目 -3.25
  • 右目 -2.75

私のコンタクトレンズは乱視矯正タイプではありません。コンタクトレンズは乱視矯正が入るとモノが分厚くなります。個人差がありますが、私の場合、装着感が悪くなり、外れやすくなります。コンタクトレンズを購入するにあたって色々相談したり試した結果、「乱視矯正をせず、近視矯正だけにする」ことにしました(ただし近視矯正を多少強めに入れています)。過去12年ほど、ずっと同じ度数でワンデータイプのコンタクトレンズを使っておりこのコンタクトレンズで遠くにいる仲間の姿、顔や、トラック、遠くの看板など、アウトドアで必要十分な視界が得られることがわかっており、CV1でも問題ありません。このコンタクトレンズと同じ度数の眼鏡レンズを CV1 に入れれば問題ないはずです。

IPDは、眼球と眼球の距離

IPDは左右の眼球の中心の距離を示すパラメータのようです。コンタクトレンズは眼球自体に装着するので IPD の値がわからないのですが、 Ocuus Rift CV1 のセッティングでは 62mm がもっともはっきりして見えるほか、定規で自分の眼球の距離を測ってみてもおよそ 65mm ぐらいでした。「指定できるIPDの値がジャストでない場合は狭い方の値を選べ」ということですし、 CV1 で 62mm という数値が出ていたので、今回は 62mm で作成することにしました。

眼鏡購入時の伝票やカルテからも、必要となる値はわかるはず

眼鏡を持っていても自分の左右の目の矯正パラメータを憶えていることはそうそう無いと思いますが、眼鏡を作ってもらったときの資料が残っていれば、そこに矯正のパラメータが書かれているので、確認することができます。もしくは、眼鏡を作った眼科やお店に問い合わせれば、カルテが残っているはずです。

私がオーダーしたレンズのパラメータは?

先述の近視矯正のみであれば、Zenni Optical の眼鏡オーダー時に下記のパラメータでオーダーすれば十分です。CYL、Axisは乱視矯正の場合のパラメータですので、近視矯正だけの場合はゼロで問題ないのだと思われます。



一般的に眼鏡のレンズは矯正がつよいほどレンズが分厚くなり、高価なレンズほど値段が安くなります。つまり安価なレンズで矯正を強くするとレンズが太くなります。今回、私は 1.57 Mid-Index Single Vision のレンズでオーダーしました。

Oculus Rift CV1への装着感、見え方など含めて、私の度数ではこの設定で特に問題はなさそうです。近視が私より大幅に強い人は、薄い購入レンズを選ぶか悩まれるかもしれません。

コーティングは下記のみにしました。どうせ VR 用ですし。
  • Anti‐Reflection Coating
  • Standard anti‐reflective coating

価格は?

レンズ(+フレーム)代金は14.90ドル、日本への送料が9.95ドルでした。クレジットカードへの最終的な請求金額は下記のとおり、3000円弱でした。



配達されてきた

オーダーしたレンズ(+フレーム)は香港で製造され、日本に向けて出荷されたようです。封筒に眼鏡ケースを入れて送られてきました。(写真は後でとったもので、レンズは取り外し済みです)



ちなみに常用している日本ブランドの眼鏡と比べると、ノーズパッドのは幅に大きな差があります。日本人は鼻が低いですもんねー。



出来上がった眼鏡の状態で見え方に問題がないかを確認しても、とくに問題はありませんでした。

重要! レンズを外す前に

レンズを外す前に、コーティングを痛めないようなメンディングテープや付箋をレンズにはり、上下がわかるようにしておくことをお勧めします。
  • 右目レンズか、左目レンズか
  • レンズのどの部分が上か(円形レンズなので方向がわからなくなる)
特に、乱視矯正レンズだと方向は絶対に大事なので、やはり方向がわからなくならないよう、特に注意してください。

実は、私の場合この眼鏡に対応できる精密ドライバーが手元になかったので、普段お世話になっている眼鏡ショップでレンズを外してもらいました(店舗によっては嫌がられるでしょうから、これが当たり前だとは思わないでください!)。この際、どちらが上であったか等を示す印をつけないまま外してもらった都合、購入時点でどの部分が上だったかは分からなくなっており、反省点です。(IPDがおかしいことになっているかも)

CV1への装着

まず、眼鏡のレンズ2枚を装着します。レンズアダプターに必要以上の力をかけないように注意しながらはめこみます。一度はめ込んでしまえば、アダプターからレンズがすぐにポロッと落ちることはないでしょう。少しゆるく感じるかもしれませんが、CV1に組み込めば、もっと安定します。

CV1の顔に当たるスポンジ部分は、その樹脂フレームと一緒に、Rift本体から分離できます。液晶側(スポンジがついていない方)からレンズアダプタの下のレール部分をはめこみます。

Thingverse に投稿されている写真より

そして、同パーツとレンズアダプタをOculus Rift CV1本体にはめ込めば取り付け完了です。

利用感

映像の見え方としてはバッチリです。

普段利用している眼鏡を外さないといけないのはまだまだ不便ではあるのですが、それでもコンタクトレンズなしで CV1 を装着すれば VR 内で表示された小さな文字まできちんと読めるので大変便利です。実はまだ Touch をオーダーしていないのですが、今後 Touch を入手するのが楽しみになりました。

まとめ

普段から視力矯正が必要な人が VR ヘッドセットをかぶるのはちょっと大変です。でも、 CV1 に今回紹介したレンズアダプター、そして安く作れるレンズを組み合わせることで、 VR ライフがより身近なものになります。

私のような、眼鏡を常用しており、結果として Oculus Rift CV1 から遠ざかってしまっているオーナーの方もいるかと思います。そんな方には本アダプターがとても役にたつかとと思います。

2016年11月20日日曜日

私家版PYNQ FAQ(購入前)

先日オープンソースカンファレンス2016東京でIkaLogを出展した際、PYNQ-Z1をIkaLogのデモ用ハードウェアに利用したのですが、その際に色々と質問されることがありました。今回はPYNQ-Z1がどのようなものなのかについて、私の偏った視点から紹介します。

PYNQって何ですか?


PYNQというのは、基板やLSIパッケージではなく、Xilinx社が提供する「Jupyter Notebookから使えるFPGAデモシステム」を指しています。以下はXilinx社が公開しているPYNQプロジェクトの概要を引用したものです。

PYNQ is an open-source project from Xilinx that makes it easy to design embedded systems with Zynq All Programmable Systems on Chips (APSoCs). Using the Python language and libraries, designers can exploit the benefits of programmable logic and microprocessors in Zynq to build more capable and exciting embedded systems. PYNQ users can now create high performance embedded applications with

  • parallel hardware execution
  • high frame-rate video processing
  • hardware accelerated algorithms
  • real-time signal processing
  • high bandwidth IO
  • low latency control

See the PYNQ webpage for an overview of the project, and find documentation on ReadTheDocs to get started.

PYNQ-Z1って何ですか?


PYNQ-Z1はDigilent社が販売するARM搭載FPGAボードであり、Xilinx社のPYNQに対応しています。以下はDigilentが紹介しているPYNQのスペックです。

ZYNQ XC7Z020-1CLG400C:
  • 650MHz dual-core Cortex-A9 processor
  • DDR3 memory controller with 8 DMA channels and 4 high performance AXI3 slave ports
  • High-bandwidth peripheral controllers: 1G Ethernet, USB 2.0, SDIO
  • Low-bandwidth peripheral controller: SPI, UART, CAN, I2C
  • Programmable from JTAG, Quad-SPI flash, and microSD card
  • Artix-7 family programmable logic
  • 13,300 logic slices, each with four 6-input LUTs and 8 flip-flops
  • 630 KB of fast block RAM
  • 4 clock management tiles, each with a phase-locked loop (PLL) and mixed-mode clock manager (MMCM)
  • 220 DSP slices
  • On-chip analog-to-digital converter (XADC)

Memory:
  • 512MB DDR3 with 16-bit bus @ 1050Mbps
  • 16MB Quad-SPI Flash with factory programmed globally unique identifier (48-bit EUI-48/64™ compatible).
  • MicroSD slot

Power:
  • Powered from USB or any 7V-15V source (see recommended products)
  • USB and Ethernet:
  • USB-JTAG Programming circuitry
  • USB-UART bridge
  • USB OTG PHY (supports host only)
  • Gigabit Ethernet PHY

Audio and Video:
  • Electret microphone with pulse density modulated (PDM) output
  • 3.5mm mono audio output jack, pulse-width modulated (PWM) format
  • HDMI sink port (input)
  • HDMI source port (output)

Switches, push-buttons, and LEDs:

  • 4 push-buttons
  • 2 slide switches
  • 4 LEDs
  • 2 RGB LEDs

Expansion Connectors:

  • Two standard Pmod ports
  • 16 Total FPGA I/O
  • Arduino/chipKIT Shield connector
  • 49 Total FPGA I/O
  • 6 Single-ended 0-3.3V Analog inputs to XADC
  • 4 Differential 0-1.0V Analog inputs to XADC

搭載されているはXC7Z020-1CLG400Cというもので、デュアルコアのARMプロセッサが搭載されたFPGAパッケージです。そこにLEDやスイッチ、Arduino互換のペンヘッダ(メス)、HDMI入出力、オーディオコーデック(コンピュータエンジニア的にはサウンド用DAC/ADCといったほうがピンときそう)、Digilentが提供する拡張基板が接続できるPMODヘッダなどが搭載されています。

SDカードスロットが搭載されており、ここからLinux環境をブートしてLinuxマシンとして利用できます。ARMプロセッサにイーサネットポートとUSBホスト用コネクタが接続されていますので、この部分は組み込みARMプロセッサとしても利用できます。

Raspberry Pi とのARMプロセッサの比較は?


CPU

  • ZYNQ: ARM7 2cores、650MHz
  • Raspberry Pi 3: Cortex A53、4 cores、1.2GHz

Memory

  • PYNQ: DDR3 512MB
  • Raspberry Pi 3: LPDDR2 512MB

GPU (Framebuffer)

  • PYNQ: なし
  • Raspberry Pi 3: あり

H.264/MPEG2ハードウェアエンコーダ/デコーダ

  • PYNQ: なし
  • Raspberry Pi3: H.264デコード、エンコード(追加オプション)、MPEG2(追加オプション)

ネットワーク

  • PYNQ: イーサネット
  • Raspberry Pi 3: イーサネット(有線、無線)


PYNQ向けの設計・開発に必要なソフトウェアは?


ロジックの設計Xilinx Vivado HL Design Design Suite(Eclipseのような設計環境)のWebPack Editionが無償で利用できます。最近は、無償ライセンスでも機能制限が緩くなっており、評価ボード上のXilinx FPGAパッケージ(最上位のVirtexを除く)を相手に開発する程度であれば不自由なく使えるようになりました。高位合成についてもVivado HLS が 2016.2 あたりから無料で利用できます。ただし、WebPack Editionはツール利用状況の統計情報がXilinx社に吸い上げられます。

Xilinx Vivado HL Design Suite によってFPGA向けのビットストリーム(コンピュータのバイナリファイルに相当)生成処理は非常に重いため、できるだけ高クロック多コアで快適な開発環境(Linuxを強く推奨、もしくはWindowsでも利用可能)が必要になります。Vivado HL Design Suiteはインストールにおよそ20GBの空き容量が必要です。

PYNQで提供されているビットストリームは現在バージョン2016.1向けになっています。より新しい2016.2、2016.3も提供されていますがPYNQのプロジェクトを実行できませんのでPYNQ前提でVivado Design Suiteをインストールするのであれば2016.1をインストールすることをオススメします。なおディスク容量があれば複数バージョンをインストールすることも可能です。


PYNQどこで買えるの?いくら?

Diglientのサイトから購入できます。
http://store.digilentinc.com/pynq-z1-python-productivity-for-zynq/

本稿執筆時点で通常価格229ドル、学生向けには65ドルで販売されており、一人一台までの制限があります。送料が5000円近くかかるそうなので購入時は複数の方でまとめてオーダーし小口数をまとめてもらおうとしている方々もいるようです。経験上オーダーを確定してから2〜3日で日本まで届きます。

購入する場合には、オシロスコープをお持ちでない方には、Analog Discovery 2の同時購入がをオススメしています。AD2はUSB接続し利用できるオシロスコープ/ロジック・アナライザなどとして利用でき、FPGAのほか各種電気回路を作ったときに波形を見るのにも使えるからです。アカデミック対象であれば割引がありますし、Analog Parts Kitは学生による同時購入に限り無料で販売してくれるようですのでぜひ入手してください(私は持っていません)。

オシロやロジアナ皆無でFPGAや電子回路をいじるのはprintfデバッグすら封印して一発で複雑なプログラムを完成させようとするようなものです。

私が持っているのは初代Analog Discoveryですが、実際持っているとすごい便利なのでとってもオススメです。


2016年10月16日日曜日

PYNQを買ったので遊んでいる(Project Inq)

久々にFPGAいじりをしています。

今回入手してしまったのはPYNQ。Xilinx Zynq7020シリーズを搭載した評価ボードで、あらかじめ用意されたイメージをSDカードに書き込んであげればJupiterからWebブラウザ経由でもいくらか操作を試せるというお手軽さがウリ。



届いたPYNQのパッケージ

秋葉原の職場に送ってもらったので、受け取ったら早々と部品やでヒートシンクと熱伝導シーツを調達。

SDカードにイメージを焼いて起動したら、当然とはいえ、普通にヘッドレスなARM7 Linuxマシンとして起動してきた。OSはUbuntu 15。 OpenCVは 3.1 で、FFmpegサポートも入った状態でコンパイルされている。……これは色々と便利なのでは?

試しにIkaLogでビデオファイルを解析させてみたら、あっけないほど簡単に動いた。

PYNQにはビデオキャプチャ利用を想定したHDMI Inputポートがあるので、これでキャプチャできるかは大変興味があるところ。Jupiter上でOpenCVの顔認識をするコードを途中まで実行したら、WiiUの画像がキャプチャできた。



ただしPYNQのbase.bitではDDCの応答内容に問題があるのかWiiUからビデオ信号が出てこない。このためHDMIマトリックススイッチやスイッチャーなどの機械を挟んでいる。また、720pだと色々安定していないような感じ……。過去に試していたとき、ZYBOではDigilentのdvi2rgbのEDIDを書き換えたらWiiUの信号を直接、安定して食えるようになったので、そのときの成果を持ってくれば解決するだろう。だいたい解決策は見えているので後回し。ちなみに以前ZYBOで実験していたときの写真がこちら。


Jupter で操作した内容を IkaLog の映像インプットとして使えるようクラスを追加して、とりあえずだけども対応完了。
https://github.com/hasegaw/IkaLog/commit/5b6b9ce55e1ae32e57c2dd6f05ae20aa00c9b3fd

HDMIのキャプチャは実現できたが、PYNQにはHDMI Outputもあるので、こちらにパススルーすると、PYNQがIkaLogマシン+ビデオキャプチャ+HDMIスプリッタを兼ねるという、いままでIkaLogを利用するにあたって必要となる3つのアイテムをワンボードで実現できることになる。

Pynqのドキュメンテーションを読んでいると、じつは上記の設定でHDMIパススルーも実現できていることがわかった。上記の設定を行うとOut側がIn側のバッファからデータを受け取るようなかたちでパススルーしてくれる(プロセッサは通していないと思う……フレームバッファは通しているかも?)

というわけで、数時間でできちゃったIkaLog+PYNQ(キャプチャ機能+映像のみスプリッタ機能)。

Pynqで動くIkaLog、Project Inqと命名。Pynqの利用用途として思いついてはいたけども、思った以上に簡単に実装できてしまった。ここまでの成果については下記 WIki ページを見ていただければ再現できるはず。
https://github.com/hasegaw/IkaLog/wiki/en_Installation_Pynq

これをしばらく動かしてみるといくつか課題が見えてくる。

一つ目の課題は、HDMI Outputから出力された映像がたまに縦にずれたりする。たぶんHDMI映像の伝送が、ARMのDDR3メモリに置かれたフレームバッファを介していて、IkaLogが走っているとメモリ帯域やバス幅が足りなくなるんじゃないかと疑っている。

二つ目の課題は、HDMIのスプリッタ機能といっても HDMI 信号を音無しの DVI 信号としてピクセル情報に落とし、それを DVI 信号として HDMI ポートから出しているだけなので、音が消えてしまう。もちろんレイテンシの問題もあるし、キャプチャ機能はそのまま使うとしても、 HDMI Input から入ってきた信号をできるだけ忠実に HDMI Output に出力するよう変更したい。

Xilinx FPGAなのでHDMIのシリアル信号をISERDESE2で受けて、出力するときはOSERDESE2で送信している(はず)。これらを直結すればナノ秒レベルのディレイでシリアル信号をそのまま伝達できるだろうけど、ビデオキャプチャ機能も必要なので、dvi2rgb IPと共存することは考えないといけない。

とりあえずPYNQについてきたbase.bitは忘れて、dvi2rgb -> rgb2dvi でパススルーするデザインを作ってみた。



WiiU の信号が直接映らないのは相変わらずだけども、画像がたまに縦に1ドット間延びするような現象は解決した。ARMプロセッサ側のDDR3メモリを介さずに、受け取った信号をそのまま送出しているからだろう。

でも、やはり音のデータは消えてしまっている。

手元に高速ビデオ・インターフェース HDMI&DisplayPortのすべて という書籍があった。


これを読み返してみると、オーディオ信号はVSYNC直後のブランク期間などに入っているとのこと。ここが現状どうなっているかを調べると、色々解決しそう。 dvi2rgb がブランク期間中の信号を捨ててしまっているのではないかという想像だ。もし信号が捨てられていない事が分かればラッキーで、今度は送出側 rgb2dvi が信号を捨てていると考えればよさそう。

Integrated Logic Analyzer を追加して信号を眺めてみる。





案の定 dvi2rgb がブランク期間中の信号をゼロでマスクしているようだ。この 000000 になっているところに、本当はオーディオ信号も乗っているはず。ここにあるはずの信号も含めて rgb2dvi の OSERDESE2 に流し込んであげれば、きっとオーディオ含めてスプリッタとして動作してくれるだろう。

とりあえずの調査はここまで。

2016年8月16日火曜日

買って良かったと思った家電製品ベスト3

度々まわりにお勧めしている便利な家電ベスト3を紹介してみる。持っていない人は是非トライ!

1. 超音波電動歯ブラシ ソニックケア




2004年の就職当時、職場の人から「長谷川くんはコーラ星人だね」っ て言われたことがあるほどにコーラというか炭酸飲料が好きだ。コーラを飲むとどうしてもカラメルが歯にこびりついてしまいネトネトするし、それが、歯並び が悪いせいで磨きづらい隙間にいっぱい残るので虫歯もできやすい。歯医者に教えてもらって知ったけど、唾がビヨ〜〜〜ンとのびるのは糖分が口の中にある証 拠だそうで。歯は綺麗な状態だったら触るとキュッキュッとなるけど、なかなかそこまで磨くのは手間がかかる。歯磨きが面倒で糖分を避けてみた時期があった けども、力が出なくなってしまったので、ある程度の甘い物は必要なんだなあと悟った。

ある日ソニックケアを購入したところ、歯磨きにあれだけ苦労していたのに、ソニックケアならコーラを飲んでもすぐに歯を綺麗な状態に磨けることに気づいた。ソニックケアは安いのなら1万円もしないし、効率と虫歯リスク減らせることを思えば即買うべきだと思う。

同僚にその話をしたところ「ボクは○○○○○o○の電動歯ブラシを使っていますよ」と言うけども、ソニックケアに買い換えさせたら、その後、使い始めてとても感動していた。まあ最終的にどれが合うかは人それぞれだろうけど、ソニックケアはお勧めだと思う。また何種類かあるけども、複数モデル使ってみたかんじ、自分は一番安い本体でも十分だったので無理に高い本体は買わなくてもいいと思う。

2. 乾燥機能付き洗濯機




2006年、社員寮(浴室乾燥つき)から追い出され、その直後に雨の日が続いて洗濯物が乾かず閉口し、わずか2年しか使っていない洗濯機を下取りに出して買い換えた。

購入したのは日立の白い約束 洗濯7kg/乾燥4kgのモデル。7kgは実家で家族4人の洗濯物をさばいていたサイズなので一人暮らしには相当おおきいように思えるけど、乾燥4kgの部分でサイジングした。洗濯機の設置場所がかなり狭くて、搬入出時には事前に物件のドア(木ネジで蝶番が固定されている)を外しておかないといけなかった。

乾燥機能つき洗濯機を買ってからはユニクロの下着や靴下、タオルなどは全て乾燥機能に任せている(寮時代も浴室乾燥に任せていたけど)。家事に時間をかけたくないし手間が大幅に減るので、社会人になる人には間違いなく乾燥機能つき洗濯機を購入してほしいと思う。

ただの温風ではなく、ちゃんと乾燥できるモデルを調べた上で購入しないと痛い目に合うかもしれないので、 2ch とかで購入時の乾燥機能付き洗濯機の最新機種をチェックしよう。一人暮らしなら、イニシャルコストと稼働頻度を考慮して、ヒートポンプ式でなくてもヒーター式水冷除湿タイプでいいと思う(私が持っているのは、このタイプ)。

3.ノイズキャンセリングヘッドホン




 2011年、出張ではじめて海外 に出たとき、ソルトレイクシティ(実際には隣のパークシティ)のアウトレットモールにあるBOSEの店舗にて QC-15 を購入。当時は円が非常に強くて90円をきっていた ので、日本円でたぶん2万5000円をきっていたように思う。少なくとも3万出した覚えはない。購入時は半信半疑だったけども、使い始めてコレがすごく便利なものだと判った。

このヘッドホンを使ってい ると、飛行機のなかで10時間とか過ごしていても騒音をかなり軽減してくれるので、ぐっすり眠れる。なぜか私はこのヘッドホンで L'arc-en-Ciel の曲を再生していると本当にぐっすり寝てしまうので、はじめての出張の帰路から飛行機での移動があまり苦痛に感じなくなった。サングラスやアイマスクと組 み合わせると完璧。

また、深夜バスで青森にスキーに行くときにも重宝する。バスの走行音が大幅に軽減される。21時 頃出発のバスが7時頃に青森につくので9時間はバス内で揺られることになり、昔は本当にこの時間が辛かったけども、 QC-15 を使うようになってからは移動時間のほとんどはぐっすり寝てしまうようになった。

QC-15 は二度断線して修理に出した。どちらも保証期間を過ぎていたので1万円ちょいの金額を支払うことで良品への交換をしてもらった(二度目は追加料金で現行モデルへの QC-25 にアップグレードしてもらったので、今使って居るのは QC-15 ではない。製品+このあたりのアフターケアも良いのでブランドバリューがあるんだなと思った)。

移動時間がとても快適になったので、長時間移動が多い人はノイズキャンセリングヘッドホンは是非もつべきだと思う。まあ、モデルによるけども、国内市場価格 3万円後半〜 4 万円後半は、私自身でも手は出せないかな……。海外にて、国内市場価格より安く手に入りそうだったら、検討すると良いと思う。

とある素晴らしいオンラインソフトウェアにおける、シェアウエアとしての形態

この記事はこのソフトウェアに対する文句とかではなくて、ただただ”ソフトウェア開発に費やしている技術も、それのマネタイズ の方法もうまいなぁ”と思って関心している、特定のオンラインソフトウェアの話で、別に作者を晒し上げようとか、そんなつもりは全くない。このソフトウェアは対価を支払う価値は十分にあるし、作者が下記のとおりに書いていないのは意図的だと思うから、特定のソフト名はここでは書かないことにした。

某 Slack でとあるシェアウエアがよく考えられているという話をした。

そのソフトウェアは、ビデオキャプチャデバイスと組み合わせて利用するもの。プレビューのほか録画機能も持っている(名前的にはそちらが主眼なのだろう)。ただ録画機能を持つソフトウェアだが、独自の突出したコーデック部分が別配布になっている。

メインの実行ファイルが入っているソフトウェアを実行するためには、別途配布されているコーデックもインストールしておく必要がある。技術的には、そのコーデックをインストールしておかなくてもメインの実行ファイルは動作するはずだ。でも、コーデックがないと実行できないよ、とエラーを表示して、終了する。

そうするとユーザーはコーデックとして配布されているパッケージをインストールしようとする。そのコーデックは有償で、数千円と、けっこういい値段が付けられているソフトウェアだ。コーデックはシェアウエアの形態なのでレジストしなくても利用できるが、未レジストの場合にはウォーターマークが表示される仕様だ。

私は2012年にこのソフトを見つけて使い始めたけども、この作者はほんと凄いなぁと関心した。技術的にもよくできているし、稼ぎ方もうまく考えているなぁと思ったから。

過去に bt878 のテレビチューナーを使ったときはソフトウェアスタックが本当にダメだったし、 2012年に購入してから IkaLog 開発にまで活躍してきた DC-HD1 でも、ドライバがおかしいんじゃないのって死に方をよくする。今時の Windows ってそう簡単にブルースクリーンなんて出ないけど、キャプチャまわりをいじっていると、けっこう死ぬ。キャプチャまわりは絶対的にユーザ数が少ないので QA が十分にできていないんだろうなぁと推測している。 Webcam の利用数は相当数あるだろうし、そっちの問題は比較的少ないと思うと、やっぱりチップセット側のドライバの問題なんだろう。

で、ちょっと操作した瞬間にドライバが OS を道連れにするような実装が度々あるキャプチャデバイス群を使って映像を取得し、リアルタイム表示もわりと低遅延でがんばっていて、画像処理もまじめにやっていて、さらにはコーデックまで独自に提供してしまうソフトウェアがあるわけだけど、これが、コーデック以外の部分は事実上フリーソフトとして使えるようになっている。

独自形式で録画時・再生時に使うコーデック以外の機能も充実しているのでコーデック部分に課金するのはチャンスロスが大きいんじゃないかと思う人は度々いるはずだけど、これがなかなか良く考えられていると思う。なぜなら、キャプチャデバイスとの相性で起動できなかったり、映らなかったり、 OS を道連れにしてしまうような部分では課金していないのだから。課金対象は、 DirectShow 向けのコーデックとして、 OS から渡された画像データをエンコードしたり、デコードしたりして OS に返す部分だけ。ここはハードウェアが絡まないので相性問題などは発生しづらい。なので、課金したユーザが「金払っているのになんなんだコレは」と言っても、買ったのはコーデックであってキャプチャデバイスを制御するソフトウェアではない、というカラクリ。

 購入サイトには直近のレジスト数の情報がでていて、一日に10ライセンス以上、どんどん売れているように見える。このペースだと下手なコンピュータエンジニアの月給を超える副収入が生じているはず。開発者の収入は給料の倍になっているかもしれないし、そのソフトウェアの出来を思うと、本職では余裕でもっと稼いでいる人かもしれない。

巧いなあと思いつつも、ちょっとずるい気もする。なぜなら有償のコーデックを使わないと動かないような文面がサイトにあって、それがインストールされていないと、それ以外の部分も利用できない点。文面を素直にとると、多くの人は、そのソフトウェアを動かすためには有償のコーデックを買わないといけないように理解するだろう。実際にはコーデックにレジストしても、録画時のウォーターマークが消えるだけだ。録画を主眼に置いていない人はコーデックにレジストしなくても十分に使えてしまうし、他のコーデックを組み合わせて使えば回避はできる。

私も実際コーデックを買わないと使えないのかと思ったけど、とりあえずレジストせずに動かしてみて、この仕組みを理解して、ちょっと感動した。

このソフトウェア(の事実上フリーな部分)は DirectShow のほか Direct3D をはじめ各種マルチメディア系の API を駆使しているのは見ればすぐにわかるし、開発には相当時間がかかっているのがわかる。キャプチャデバイスをいっぱい持っていて、リリースにあたっては動作検証やドライバ不具合との戦いも色々しているのだと思う。また、有償提供されているコーデックも、これはこれで動かしてみるとすごい。 確証はないけど、とあるユーザの手元でにある Core2 Duo のマシンですら IkaLog を動かしながら録画ができてしまうのは、たぶんコイツのおかげなんだと思う。

ところで時々”どうして IkaLog で金を取らないのか”と聞かれるけども、 IkaLog もキャプチャデバイスと組み合わせて使うものでソフトウェアの実装レベルで互換性を全て吸収できるようなものでもないし、仕組み的に環境依存で動かないことも考えられるので、そのような場合にはサポートしきれない、また画像認識というアプローチ上100%の精度は出せないという気持ちがあった。下手にマネタイズしたら怒られるかもしれないというのも。

 Web カメラ対応をまじめに考えていたときは、高品質な Web カメラの代わりにスマートフォンに付いている高品質 CCD カメラを使え、IkaLogに画像を送信するだけの「イカログカメラ」は有償化しようと思っていた。結局、Webカメラベースでの画像認識はチャレンジが多かったので、それ自体を無くしてしまったけど。

2016年6月15日水曜日

ルータがPPPoEで取得しているIPアドレスが変わったらRoute 53のレコードを更新するスクリプト

リモートから自宅のネットワークに接続できるようにしている方も多いと思いますが、ウチも出先からリモートアクセスしたりしています。

これまで外部の Dynamic DNS サービスに頼っていたのですが、利用していたサービスに変更があったのをきっかけに自前の仕組みに置き換えました。今回は、その仕組みについて紹介します。

私の自宅では RTX1100 が上流ネットワークとの PPPoE 接続を行っており、 pp 1 インターフェイスが外側のアドレスを持っています。このインターフェイスのアドレスを、自分が Amazon Web Services の Route 53 上で管理するゾーンのAレコードとして登録します。

ちょっと面倒だったのが RTX1100 の外側 IP アドレスの取得をどうするか、です。最初は 「SNMP クライアントでつっつけば出てくるじゃろ?」と適当に snmpwalk してみたのですが、よくわからなかったので、結局 telnet で調べるローテクで実装しています。

使っているコードのうち自宅依存部分を取り除いたものを https://github.com/hasegaw/route53update に Push してあります。


この中には3つのファイルが含まれています。

  • rtx1x00_show_status_pp_1.exp …… RTX1100 と telnet して IP アドレスを取得する
  • route53update.py …… 取得したアドレスを R53 に反映する
  • run.sh …… 実行方法

rtx1x00_show_status_pp_1.exp

RTX1100 に telnet して IP アドレスを取得します。このスクリプトは実際には RTX1100 と通信して、その内容を標準出力に書き出すまでです。実行には expect が必要です。引数としてホスト名とパスワードをとります。



route53update.py

上記 Except スクリプトを実行し、ルータからの出力を実際にパースし、 Route 53 のレコード内容と比較してみて、必要なら反映するのがこちらのスクリプトです。ファイル内にいくつか設定項目があります。(レコード名、 ゾーン名、ルータのホスト名とパスワードなど)
おまけで Slack にも対応しています。


 run.sh

route53update.py を実行する方法の例です。 AWS の API キーを設定しスクリプトを叩いています。手元ではこのスクリプトを cron に仕掛けています。


定期的にこのしくみが実行されることにより、Route 53 上の A レコードが常に自宅のルータに向くようになります。また、 Slack に新しい IP アドレスが通知されるため、ネットワークの不調に気づきやすかったり、などのメリットがあるかもしれません。