NetBSD上のFirefoxからVMware ESXi 6.0u2または6.5のウェブクライアントを使う

この記事は、NetBSD Advent Calendar 2016の12日目の記事です。 Qiita上で代わりに投稿できるのを見付けてしまったので、勝手に投稿します。 すみません。

はじめに

普通は、NetBSD/amd64-currentをラップトップで使っているのですが、 pkgsrcの検証等のために、それ以外の環境も必要です。 386またはamd64については、VMware ESXiを使って仮想マシンを動かしています。

今は、先日インストールしたVMware ESXi 6.5を使っています。 VMware ESXi 6.0u2以降は、Windowsで動く管理コンソールソフトウェアである VMware vSphere Clientではなく、ウェブクライアントが無料で 使えるようになりました。

ですが、NetBSD/amd64-currentで動くFirefox (pkgsrc/www/firefox)では、 コンソールウィンドウで無限にキーリピートされてしまい、 まともに操作できませんでした。 ですので、インストールはVMware vSphere Clientでしなくてはいけませんでした。

ですが、VMware ESXi 6.5からは、どうやらVMware vSphere Clientが 提供されなくなってしまいました。 どうにかして、キーリピートの問題を解決しなくてはいけなくなりました。

キーリピートを調整する設定を追加してみる

これまで、この問題についてGoogleで検索したことさえなかったので 検索してみました。すると、 Repeated characters when typing in remote console (196) と言う同じような問題を解決するためのサポート記事が見付かりました。 ですが、ウェブクライアント用の内容ではないように見えます。 ですが、まずは試してみました。 仮想マシンは終了させておきます。 Edit→VM Options→Advanced→Configuration Parameters→Edit Configuration... を選択し、keyboard.typematicMinDelayの行を追加し、 2000000 (2秒を意味する)に設定しました。 その上で、仮想マシンを起動してみましたが、 効果はありませんでした。

他の環境ではどうなのか?

Windows 10 Pro 64ビットなマシンも持っています。 Firefoxの問題かどうか確認するため、Firefox 50.1.0 for Windowsでも 試してみました。 キーリピートには問題はありませんでした。 NetBSD/amd64-currentにpkgsrc/wip/chromium-newからChromium 54をインストールして やってみましたが、こちらはキーリピートの問題が発生しました。

どうやら、ウェブブラウザーの問題ではないようです。

解決法

私は、日本語入力にはSKKを使っていて、 FirefoxやChromium上ではibus-skk (pkgsrc/inputmethod/ibus-skk)を使っています。 ibusは、Shift+SpaceでSKKとEnglish (US)を切り替えられるようにしています。 いつもは、SKKのASCII入力モードとひらがな入力を切り替えて使っており、 VMware ESXiのウェブクライアントでは、SKKのASCII入力モードで 入力していました。

これをEnglish (US)に変えて試してみたところ、キーリピートの問題は解決しました。 これで快適にWindowsなしで仮想マシンを管理できます。

検証してはいませんが、NetBSD独自の問題ではないかもしれません。 ibus-skkを使っていて、VMware ESXiのウェブクライアントの異常なキーリピートで 困っている方は、English (US)もお試しいただければと思います。

The pkgsrc guideをEPUB3の電子書籍にしてみる

この記事は、NetBSD Advent Calendar 2016の20日目の記事です。

はじめに

The pkgsrc guideを スマートフォンでオフラインで読みたいと思っていました。 今回は、The pkgsrc guideをEPUB3形式に変換することで、 スマートフォン上でも快適に読めるようにしました。

The pkgsrc guideはどのように書かれているのか

The pkgsrc guideは、pkgsrc/doc/guide/files以下にXMLファイル として管理されています。pkgsrc.xmlと言うファイルを見ると、 最初に以下のように書かれています。


<!DOCTYPE book PUBLIC "-//NetBSD//DTD DocBook XML V4.5-Based DocBook Extension//EN" [
DocBook XML 4.5と規格に沿って書かれていると言うことのようです。

DocBook XMLのファイルを、www.NetBSD.org の仕組みと同じものを利用して、HTML等に変換しています。

DocBook XSL 1.79.1には、DocBook XMLをEPUB3に変換するスタイルシートが 含まれています。 しかし、pkgsrc/textproc/docbook-xslでは、 DocBook XMLをEPUB3に変換するのに必要なファイルはインストールされません。

pkgsrcはpkgsrc-2016Q4ブランチに向けてフリーズ中で変更はできませんので、 今回はpkgsrcの枠組みの外でEPUB3形式のファイルを作成してみたいと思います。

XSLTプロセッサーとしては、pkgsrc/textproc/libxsltに 含まれているxsltprocコマンドを使用します。

バラバラになっているXMLファイルを1つにまとめる

The pkgsrc guideは、複数のXMLファイルに分かれています。 最初にこれを1つにまとめないといけません。


$ ls -F files
CVS/                creating.xml        getting.xml         pkgsrc.xml
Makefile            debug.xml           gnome.xml           platforms.xml
binary.xml          devfaq.xml          infr.design.xml     plist.xml
build.xml           editing.xml         introduction.xml    porting.xml
buildlink.xml       examples.xml        logs.xml            regression.xml
bulk.xml            faq.xml             makefile.xml        share/
chapters.ent        files.xml           options.xml         submit.xml
components.xml      fixes.xml           pkginstall.xml      tools.xml
configuring.xml     ftp-layout.xml      pkgsrc.ent          using.xml
手作業で、xsltprocコマンドで処理しても良いのですが、 この作業はpkgsrc/doc/guideでHTMLファイルを生成する中で 既に行われていますので、その成果を流用してしまうことにします。 以下のようにHTML版等のThe pkgsrc guideを作成し、その作業中の ファイルを流用します。

$ cd /usr/pkgsrc/doc/guide
$ make
こうすると、${WRKSRC}/default.xmlとして1つのXMLファイルに内容が 集約されます。 ${WRKSRC}が自分の環境でどうなっているか確認するには、 以下のようにします。

$ cd /usr/pkgsrc/doc/guide
$ make show-vars VARNAMES=WRKSRC
/usr/tmp/pkgsrc/doc/guide/work/pkgsrc-guide-20161221
私は/etc/mk.confでカスタマイズしているので、 最下行のようになりました。 ですので、必要なファイルは、 /usr/tmp/pkgsrc/doc/guide/work/pkgsrc-guide-20161221/default.xml です。

EPUB3の中身を生成してみる

docbook-xsl-1.79.1.tar.bz2を入手します。 普通のpkgsrcユーザーは既に持っているはずです。


$ ls `make show-vars VARNAMES=DISTDIR`/docbook-xsl*
/usr/distfiles/docbook-xsl-1.79.1.tar.bz2
これをどこか適当な場所に展開しておきます。

$ mkdir ~/tmp
$ cd ~/tmp
$ tar zxvf /usr/distfiles/docbook-xsl-1.79.1.tar.bz2
これで、~/tmp/docbook-xsl-1.79.1/epub3/以下に、 DpcBook XMLをEPUB3に変換するファイルが用意できました。

実際にEPUB3の中身を生成してみます。


$ xsltproc --stringparam base.dir ebook1/ ./docbook-xsl-1.79.1/epub3/chunk.xsl /usr/tmp/pkgsrc/doc/guide/work/pkgsrc-guide-20161221/default.xml
Writing ebook1/OEBPS/bk01-toc.xhtml for book(the-pkgsrc-guide)
Writing ebook1/OEBPS/ch01s02.xhtml for sect1(overview)
Writing ebook1/OEBPS/ch01s03.xhtml for sect1(terminology)
Writing ebook1/OEBPS/ch01s04.xhtml for sect1(typography)
Writing ebook1/OEBPS/ch01.xhtml for chapter(introduction)
Writing ebook1/OEBPS/ch02s02.xhtml for sect1(uptodate)
(snip)
Writing ebook1/OEBPS/docbook-epub.css for book(the-pkgsrc-guide)
Generating EPUB package files.
WARNING: wrong metadata date format: '$NetBSD: pkgsrc.xml,v 1.30 2016/06/11 18:14:42 rillig Exp $' in element bookinfo/pubdate. It must be in one of these forms: YYYY, YYYY-MM, or YYYY-MM-DD.
Generating image list ...
Writing ebook1/OEBPS/package.opf for book(the-pkgsrc-guide)
Writing ebook1/OEBPS/../META-INF/container.xml for book(the-pkgsrc-guide)
Writing ebook1/OEBPS/../mimetype for book(the-pkgsrc-guide)
Generating NCX file ...
Writing ebook1/OEBPS/toc.ncx for book(the-pkgsrc-guide)
警告はありましたが、エラーはなく無事に生成できました。 成果物は、ebook1ディレクトリー内にできています。

$ find ebook1
ebook1
ebook1/OEBPS
ebook1/OEBPS/docbook-epub.css
ebook1/OEBPS/package.opf
ebook1/OEBPS/toc.ncx
ebook1/OEBPS/bk01-toc.xhtml
ebook1/OEBPS/ch01s02.xhtml
ebook1/OEBPS/ch01s03.xhtml
ebook1/OEBPS/ch01s04.xhtml
ebook1/OEBPS/ch01.xhtml
ebook1/OEBPS/ch02s02.xhtml
ebook1/OEBPS/ch02.xhtml
ebook1/OEBPS/ch03s02.xhtml
ebook1/OEBPS/ch03s03.xhtml
ebook1/OEBPS/ch03.xhtml
ebook1/OEBPS/ch04s02.xhtml
ebook1/OEBPS/using.html
ebook1/OEBPS/ch05s02.xhtml
(snip)
ebook1/OEBPS/apb.xhtml
ebook1/OEBPS/apcs02.xhtml
ebook1/OEBPS/apcs03.xhtml
ebook1/OEBPS/apcs04.xhtml
ebook1/OEBPS/apcs05.xhtml
ebook1/OEBPS/apc.xhtml
ebook1/OEBPS/apds02.xhtml
ebook1/OEBPS/apd.xhtml
ebook1/OEBPS/index.xhtml
ebook1/META-INF
ebook1/META-INF/container.xml
ebook1/mimetype

EPUB3ファイルにする

EPUB3形式のファイルは、この生成された内容をZIPアーカイブファイルに したものです。ZIpアーカイブファイルにするにも、いろいろ細かい仕様が あった気がしますが。今回は普通にZIPアーカイブファイルにしてみます。


$ cd ebook1
$ zip -r -X the-pkgsrc-guide.epub mimetype META-INF OEBPS
ここでできたthe-pkgsrc-guide.epubが最終成果物です。 www.NetBSD.orgの自分の領域に置いておきましたので、ご参考になさってください。 Android用のMoon+ Readerでは快適に読めました。 いずれ、The NetBSD guideも含め、PDFファイルやHTMLと同様に生成されるようにできればと思います。

NetBSD/amd64を使っているマシンのCPUのマイクロコードをアップデートする

この記事は、NetBSD Advent Calendar 2016の18日目の記事です。

はじめに

これまで、購入したマシンは、WindowsなりmacOSなりはすぐに消してしまっている ので、BIOS的なもののアップデートもしていませんでした。 BIOS的なものくらいは、起動可能なUSBメモリー用のイメージ等で配布して欲しいものです。 昔はフロッピーディスクで起動させて更新したこともあった気がします。 ああ言うオペレーティングシステムによらない更新が望ましい気がします。

IntelのCPUは、マイクロコードをロードすることができます。 この作業は、NetBSDでも、pkgsrc/sysutils/intel-microcode-netbsdで実施する ことができます。 これまで一度も試したことがありませんでしたが、常用のラップトップである 東芝dynabook R63/PSで試してみました。

pkgsrc/sysutils/intel-microcode-netbsdをインストールする

2016年12月18日現在のintel-microcode-netbsdのバージョンは、20161104です。 以下のようにインストールします。


$ cd /usr/pkgsrc/sysutils/intel-microcode-netbsd
$ make install
$ make clean-depends clean

/usr/pkg/share/examples/rc.d/intel-microcodeと言う起動スクリプト もインストールされます。 以下のようにして、インストールし、再起動時に実行されるように設定します。


# cp /usr/pkg/share/examples/rc.d/intel-microcode /etc/rc.d
# echo "microcode=YES" >> /etc/rc.conf

ロードしてみる

ロードする前には、現在の状況を確認しておきましょう。


# cpuctl identify 0
のように実行して、最終行に表示されるのが、マイクロコードのリビジョンです。

cpu0: highest basic info 00000014
cpu0: highest extended info 80000008
cpu0: "Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz"
cpu0: Intel Core M-5xxx, 5th gen Core (Broadwell) (686-class), 2394.64 MHz
cpu0: family 0x6 model 0x3d stepping 0x4 (id 0x306d4)
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features2 0x2c100800
cpu0: features3 0x121
cpu0: xsave features 0x7
cpu0: xsave instructions 0x1
cpu0: xsave area size: current 832, maximum 832, xgetbv enabled
cpu0: enabled xsave 0x7
cpu0: I-cache 32KB 64B/line 8-way, D-cache 32KB 64B/line 8-way
cpu0: L2 cache 256KB 64B/line 8-way
cpu0: L3 cache 4MB 64B/line 16-way
cpu0: 64B prefetching
cpu0: ITLB 64 4KB entries 8-way, 2M/4M: 8 entries
cpu0: DTLB 64 4KB entries 4-way
cpu0: L2 STLB 1536 4KB entries 6-way
cpu0: L1 1GB page DTLB 4 1GB entries 4-way
cpu0: Initial APIC ID 0
cpu0: Cluster/Package ID 0
cpu0: Core ID 0
cpu0: SMT ID 0
cpu0: DSPM-eax 0x77
cpu0: DSPM-ecx 0x9
cpu0: SEF highest subleaf 00000000
cpu0: SEF-main 0x21c27ab
cpu0: SEF-main 0x21c27ab
cpu0: microcode version 0x19, platform ID 6
最終行にあるように、リビジョンは0x19です。

では、再起動してみましょう。(再起動しなくても、スクリプトを実行するだけで 良いはずですが)

ロード後の様子

では、どう変わったか確認してみましょう。


# cpuctl identify 0
cpu0: highest basic info 00000014
cpu0: highest extended info 80000008
cpu0: "Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz"
cpu0: Intel Core M-5xxx, 5th gen Core (Broadwell) (686-class), 2394.64 MHz
cpu0: family 0x6 model 0x3d stepping 0x4 (id 0x306d4)
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features2 0x2c100800
cpu0: features3 0x121
cpu0: xsave features 0x7
cpu0: xsave instructions 0x1
cpu0: xsave area size: current 832, maximum 832, xgetbv enabled
cpu0: enabled xsave 0x7
cpu0: I-cache 32KB 64B/line 8-way, D-cache 32KB 64B/line 8-way
cpu0: L2 cache 256KB 64B/line 8-way
cpu0: L3 cache 4MB 64B/line 16-way
cpu0: 64B prefetching
cpu0: ITLB 64 4KB entries 8-way, 2M/4M: 8 entries
cpu0: DTLB 64 4KB entries 4-way
cpu0: L2 STLB 1536 4KB entries 6-way
cpu0: L1 1GB page DTLB 4 1GB entries 4-way
cpu0: Initial APIC ID 0
cpu0: Cluster/Package ID 0
cpu0: Core ID 0
cpu0: SMT ID 0
cpu0: DSPM-eax 0x77
cpu0: DSPM-ecx 0x9
cpu0: SEF highest subleaf 00000000
cpu0: SEF-main 0x21c27ab
cpu0: SEF-main 0x21c27ab
cpu0: microcode version 0x24, platform ID 6
マイクロコードのリビジョンが0x24になっています。

維持するには

intel-microcode-netbsdを一度実行したところで、CPU内のマイクロコードが 書き替わる訳ではないようです。 毎回、起動時にロードし直してやる必要があります。 ですので、intel-microcode-netbsdパッケージを忘れずインストールして おかないといけません。 私は、自分用のメタパッケージに追加しておきました。

おわりに

今のところ、特別動作が速くなったとの実感はないです…。

VMwareの仮想マシンでNetBSDとopen-vm-toolsを使ってみる

この記事は、NetBSD Advent Calendar 2016の17日目の記事です。

はじめに

VMware Workstation PlayerやVMware ESXiを使って、 いろいろなオペレーティングシステムを試すことができるのはありがたいです。 NetBSDには、OpenBSDに由来するvmt(4)というデバイスドライバーがあって、 電源関連の処理とホストへのIPアドレスの報告、ホストとゲストの時刻の同期を してくれます。

open-vm-toolsはvmt(4)の機能に加えて、以下のようなことができます。

  • 複数のIPアドレスをホストに報告できます
  • VMware Workstation Playerの場合に、ホストとゲスト間でテキストの コピー・アンド・ペーストができます
  • 共有フォルダー機能が使用できます
もしかしたら、ドラッグ・アンド・ドロップもできるかもしれませんが、 それを実現するためのゲストであるNetBSDの要件が良く分かりません。

と言いますか、基本的には、vmt(4)で十分です。 私のように 、事情があってVMware toolsかopen-vm-toolsを 使わないといけない人向けかもしれません。

open-vm-toolsのインストール

2016年12月17日現在、pkgsrcには、pkgsrc/sysutils/open-vm-toolsとして 10.0.7が収録されています。HGFS FUSE (共有フォルダー関係) は、pho@さんが NetBSD側も含め有効にしてくださいました。ありがとうございます。

インストールは、以下のようにします。


$ cd /usr/pkgsrc/sysutils/open-vm-tools
$ make install
$ make clean-depends clean
ホストとゲスト間でのテキストのコピー・アンド・ペーストをしたい場合には、 x11オプションを有効にするのを忘れないでください。標準では有効になっています。

手元には、最新版である10.1.0のアップデートを持っていますので、 この記事を投稿した後にコミットしておきます。

open-vm-toolsの使い方

実際に、各機能ごとに、使用方法を説明します。 基本的には、NetBSDでの場合に限定されるような内容ではないと思いますが…。

電源関係と時刻同期

VMwareのホスト側でシャットダウンまたは再起動を指示した場合に、 shutdown(8)コマンドを実行するのは、/usr/pkg/bin/vmtoolsdの 仕事です。 vmtoolsdは、ホストとゲスト間の時刻の同期もしています。 NetBSDで使う場合には、vmt(4)を無効化しておかないといけません。 ブートローダーで、以下のようにして無効化しておきます。 永続的に無効にする場合には、カーネル設定ファイルから取り除いてください。


> boot -c
> disable vmt
> quit
その上で、NetBSDが起動したら、自動的にvmtoolsdが起動するように設定します。 今回は手動で起動しておきます。

# cp /usr/pkg/share/examples/rc.d/vmtoold /etc/rc.d
# echo "vmtoolsd=YES" >> /etc.rc.conf
# /etc.rc.d/vmtoolsd start
VMware ESXiでもVMware Workstation Playerでも動作可能です。

ホストとゲスト間でのテキストのコピー・アンド・ペースト

コピー・アンド・ペーストは、/usr/pkg/bin/vmware-user-suid-wrapper が実現しています。 ですが、ゲスト側はX Window System上のみが対象です。 また、ホスト側がVMware Workstation Playerでない場合(ESXiの場合)は確認していません。 ここまで書いて気付きましたが、/var/run/vmblockを自分で事前に 作っておかなくてはいけないようです。 事前に、X Window Systemを起動しておいてください。


# mkdir /var/run/vmblock
$ startx
$ /usr/pkg/bin/vmware-user-suid-wrapper
テキストをホストとゲストの間でコピー・アンド・ペーストできるようになります。

共有フォルダー

共有フォルダーは、HGFSと呼ばれています。 これも、VMware Workstation Playerでのみ動作確認しています。

まずホスト側で、共有するフォルダーを先に指定しておきます。 例えば、あるWindows上のフォルダーをsharedと言う名前で共有しておくとします。


# mkdir /mnt/hgfs
# /usr/pkg/bin/vmhgfs-fuse /mnt/hgfs
# ls /mnt/hgfs
shared
ホスト側で共有設定できるフォルダーは複数設定可能です。 ですので、それらがマウントしたディレクトリーの中に現れて来る 仕組みになっています。

おわりに

このパッケージは53個もNetBSD向けのパッチを持っています。 明らかにメンテナンスできなくなる未来が見えています。 Contributor Agreementを良く読んだ上で、NetBSDサポートの必要性を アピールし、open-vm-toolsプロジェクトにパッチを取り込んでもらえるように できればと思っています。

他にもopen-vm-toolsには機能があるかもしれません。 NetBSD/amd64 7.99.51で確認しましたので、動かない機能がありましたら 教えてください。

NetBSDでディジタルカメラのRAWデータを扱ってみる

この記事は、NetBSD Advent Calendar 2016の16日目の記事です。

はじめに

個人的には、あまり写真を撮ることには興味がないのですが、画像ファイルの扱いには興味があります。

最近の良いディジタルカメラでは、RAW形式で写真を取り、撮影後にソフトウェアで コントラストや色調などを調整し現像するようです。 このRAW形式は、基本的にはディジタルカメラを製造する各社の独自の フォーマットのようです。

私はそんな高級なディジタルカメラは持っていませんので、 今回は、ウェブで公開されているRAW形式の画像ファイルをNetBSDで扱ってみました。

今回試したRAW形式の画像ファイルは、インプレスのやじうまPC Watchの記事のものを使用しました。

darktableを使ってみる

最初に、pkgsrc/graphics/darktableを使ってみることにします。 ですが、2016年12月17日現在のpkgsrc/graphics/darktableは、 NetBSD/amd64 7.99.51では、darktableのソースコードに誤りがあるために ビルドできません。

この記事を書き終えましたら、最新版(2.2.0rc3)にアップデートしておきますので、 そちらをお試しください。

インストールは以下の通りです。


$ cd /usr/pkgsrc/graphics/darktable
$ make install

上述したウェブページにあるRAW形式の画像ファイルのうち、 PanasonicのディジタルカメラのRAW形式である拡張子がrw2であるファイルは、 darktableでは扱えない機種のディジタルカメラの生成したもののようです。 Panasonic DMC-GM1Sという機種のようです。 ホワイトバランスが読み込めないとのエラーでdarktableの機能は試せませんでした。

上述したウェブページには一つだけ、Canon性のディジタルカメラで撮った 拡張子がcr2のものがあります。これについては、無事に現像できました。

UFRawを使ってみる

他にもRAW形式の画像ファイルを扱うものと言うと、UFRawが思い付きます。 pkgsrcでは、pkgsrc/graphics/gimp-ufrawから使用することが できます。gimp-ufrawとなっているのは、ufrawコマンドだけではなく、 Gimpのプラグインとしても動くようになっているためのようです。

GimpのUFRawプラグインでは、Gimpで開く前に現像ができるようになって いました。rw2ファイルも、cr2ファイルも無事に扱えました。

おわりに

darktableを紹介しましたが、GTK+ 3にしたのに、ちゃんとGTK+ 3の作法に 従わずに作られているようで、ちゃんとプログラムの終了ができません。 何らかの方法でkillしてやる必要があります。

残念ながら、私も今は時間がないので、貢献できないのですが…。

NetBSDでMTPデバイスをマウントしてみる

この記事は、NetBSD Advent Calendar 2016の13日目の記事です。

はじめに

6日目の記事で、 gphoto2を使って、NetBSDからMTPデバイスの中身を普通のディスクにコピーしてくることは できるようになりました。

しかし、やはりmtools的な操作では使い勝手が良くありません。 動作確認のとれたgphotos2を使ったFUSEモジュールであるpkgsrc/filesystems/fuse-gphotosを試してみました。

fuse-gphotofsのインストール

gphotofsは、既にpkgsrcに取り込まれていました。 ですので、以下のように簡単にインストールすることができます。


$ cd /usr/pkgsrc/filesystems/fuse=gphotofs
$ make install
$ make clean-depends clean
準備はできました。

マウントしてみよう

NetBSD/amd64 7.99.51では、特にエラーもなく pkgsrc/filesystems/fuse-gphotofsはインストールできました。 実際にマウントしてみます。 6日目の記事の反省を踏まえ、Xperia Z Ultraはロック状態ではない状態に しておきます。 /usr/pkg/share/doc/fuse-gphotofs/READMEによると、 マウントは以下のように実行すれば良いようです。


# gphotofs /mnt/usbssd
複数のMTPデバイスをつないでいる場合が不安になりますが、 今は1つしかデバイスがないので試せていません。 無事にマウントできると以下のようになります。

$ mount
$ mount
(snip)
/dev/puffs on /mnt/usbssd type puffs|refuse:gphotofs (nodev, nosuid)
写真をImageMagickのdisplayコマンドで表示してみます。

$ ll /mnt/usbssd/store_00010001/DCIM/100ANDRO/DSC_0001.JPG
-rw-r--r--  1 root  wheel  1576203 Oct 27 06:15 /mnt/usbssd/store_00010001/DCIM/100ANDRO/DSC_0001.JPG
$ display /mnt/usbssd/store_00010001/DCIM/100ANDRO/DSC_0001.JPG
無事に写真が表示されました。待ち時間もほとんどありませんでしたので、 これであれば快適に作業できそうです。

マウントはどう解除するか

Windowsですと、MTPデバイスはUSB大容量記憶装置とは違い マウントを解除することなくケーブルを抜けば良いですが、 今回はそう楽観的にはなれません。 /usr/pkg/share/doc/fuse-gphotofs/READMEに書いてある方法を試してみます。


# fusermount -u /mnt/usbssd
fusermount: Not enough command line arguments
Usage: fusermount [-c] [-d name] [-h] [-p] [-u] [-x] mountpoint...
        -c      use kernel cache
        -d name use name in mount information
        -h      print help information
        -p      check file permissions
        -u      unmount mount point(s)
        -x      allow access to mortal (non-root) users
マウントを解除できません。 普通にumountを実行してみたらどうでしょうか。

#o umount /mnt/usbssd
umount: /mnt/usbssd: Device not configured
エラーにはなりましたが、マウントは無事に解除されたようです。

おわりに

MTPデバイスについては、pkgsrc/filesystems/fuse-gphotofsを使う ことで、快適に操作できることが分かりました。

libmtpは、libusb 1.x系列を使用しています。 Felicaにアクセスするためのlibpafeもlibusb 1.x系列を使用していますが、 同様にNetBSDではうまく動きません。 また、OpenSCもlibusb 1.x系列でやはりうまく動きません。 もしかしたら、libusb 1.x系列に何か問題があるかもしれないという気もします。 いずれ解明できればとは思っています。

NetBSDの新しいOSSを使ってみる

この記事は、NetBSD Advent Calendar 2016の9日目の記事です。 どうも忙しくていけません…。

はじめに

pkgsrc/www/firefoxは先日までpkgsrc/audio/pulseaudioに依存していましたが、 それはOSS (Open Sound System)サポートでは、一つのプログラムが オーディオデバイスを占有してしまい、複数のプログラムからオーディオ出力 できないためでした。 (今は、pkgsrc-currentのpkgsrc/www/firefoxは、pkgsrc/audio/alsa-lib経由で OSSとpulseaudioを選べるようになっています。)

最近の nat@のオーディオサブシステムの変更によって、一つのプログラムが オーディオデバイスを占有することはなくなったようですので、試してみました。

カーネルをビルドする

NetBSD/amd64-currentで試してみようと思います。 そのためには、カーネルのソースツリーを最新にして、ビルドし直す必要があります。 NetBSD-currentを追い掛けている方には、当たり前の内容ですが、 簡単に書いておきます。 詳細は、Tracking NetBSD-current を参照してください。 カーネルモジュールだけ作っても良いのですが、ここではユーザーランド全体を更新してしまいます。


$ cd /usr/src
$ cvs update -dP
$ ./build.sh -U -O /usr/world/7.99/amd64/obj -T /usr/world/7.99/amd64/tools -D /usr/world/7.99/amd64/destdir -u -j4 tools
$ ./build.sh -U -O /usr/world/7.99/amd64/obj -T /usr/world/7.99/amd64/tools -D /usr/world/7.99/amd64/destdir -u -j4 kernel=GENERIC
$ ./build.sh -U -O /usr/world/7.99/amd64/obj -T /usr/world/7.99/amd64/tools -D /usr/world/7.99/amd64/destdir -u -j4 build
# cd /usr/src
# cp /usr/world/7.99/amd64/obj/sys/arch/amd64/compile/GENERIC/netbsd /
# ./build.sh -U -O /usr/world/7.99/amd64/obj -T /usr/world/7.99/amd64/tools -D /usr/world/7.99/amd64/destdir -u -j4 install=/
# etcupdate
# reboot

実際に試してみよう

何かオーディオを再生できるプログラムが必要です。 ここでは、pkgsrc/multimedia/mplayerを使ってみます。 以下のようにしてインストールします。


# cd /usr/pkgsrc/multimedia/mplayer
# make install

ホームディレクトリーにある適当なmp3ファイルを再生してみます。 AO: [oss]と表示されれば、OSSで再生できています。


$ mplayer -ao oss ~/test1.mp3
MPlayer 1.3.0-5.4.0 (C) 2000-2016 MPlayer Team
224 audio & 451 video codecs

Playing /home/ryo_on/test1.mp3.
libavformat version 57.56.100 (external)
Audio only file format detected.
Load subtitles in /home/ryo_on/
==========================================================================
Requested audio codec family [mpg123] (afm=mpg123) not available.
Enable it at compilation.
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
libavcodec version 57.64.101 (external)
AUDIO: 44100 Hz, 2 ch, floatle, 128.0 kbit/4.54% (ratio: 16003->352800)
Selected audio codec: [ffmp3float] afm: ffmpeg (FFmpeg MPEG layer-3 audio)
==========================================================================
AO: [oss] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   0.8 (00.7) of 55.0 (55.0)  0.2%
他の仮想ターミナルでも同様にしてみます。

$ mplayer -ao oss ~/test2.mp3
MPlayer 1.3.0-5.4.0 (C) 2000-2016 MPlayer Team
224 audio & 451 video codecs

Playing /home/ryo_on/test2.mp3.
libavformat version 57.56.100 (external)
Audio only file format detected.
Load subtitles in /home/ryo_on/
==========================================================================
Requested audio codec family [mpg123] (afm=mpg123) not available.
Enable it at compilation.
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
libavcodec version 57.64.101 (external)
AUDIO: 44100 Hz, 2 ch, floatle, 128.0 kbit/4.54% (ratio: 16003->352800)
Selected audio codec: [ffmp3float] afm: ffmpeg (FFmpeg MPEG layer-3 audio)
==========================================================================
AO: [oss] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   0.8 (00.7) of 55.0 (55.0)  0.2%
いずれもデバイスがビジーであるとのエラーもなく再生できました。 音もちゃんと重なっています。

おわりに

最近コミットされたオーディオサブシステムへの変更を試してみました。 これは便利そうです。

NetBSDでAndroidスマートフォンのBluetoothテザリングを利用する

この記事は、NetBSD Advent Calendar 2016の7日目の記事です。 現実に戻って来るのが遅くなったので、日付を大幅に越えてしまいました…。

はじめに

Andoridなスマートフォンには、Bluetoothテザリングと言う機能があります。 私の使っているXperia Z Ultraでは、Wi-Fiで接続されている時に、 Bluetoothテザリングすると、Wi-FiからBluetoothへの変換器のように 動作します。 これを、NetBSDからやってみます。

Bluetooth PAN

前述したBluetoothでのテザリングは、Androidなスマートフォンが NAP (Network Access Point)として動作していると言うことになります。
NetBSDで、Bluetooth PANを扱う際に必要なのは、btpand(8): Bluetooth PAN daemonです。 基本的には、btpand(8)のマニュアルページに書かれているようにやれば良いはずです。
まず、Bluetooth PANで使うネットワークインターフェイスを用意します。 仮想Ethernetデバイスであるtap(4)を使います。 自分の使っているカーネルがtap(4)を有効にしているかカーネル設定ファイルで 確認しておきましょう。 おそらく多くの人が使っているであろうGENERICカーネルには、 標準で含まれています。

pseudo-device tap
がカーネル設定ファイルに含まれていれば大丈夫です。 続いて、tap0ネットワークインターフェイスは、btpand(8)が自動的に 作成してくれますので、心配いりません。
Bluetoothデバイスを用意しておく必要もあります。 普通のラップトップには、Bluetoothレシーバーが 内蔵されているのではないかと思うのですが、 私の使っている東芝dynabook R63/PSには、ACPIの先につながっているようで、 NetBSD/amd64 7.99.43からは使えません。 ですので、今回は、プラネックスコミュニケーションズのBT-Micro3E1Xという USB接続のBluetooth 3.0+EDRなレシーバーを接続してみます。 以下のように認識されます。

ubt0 at uhub0 port 1
ubt0: Cambridge Silicon Radio Bluetooth USB Adapter, rev 2.00/52.76, addr 3
ubt0のように認識されない場合には、カーネル設定ファイルでBluetooth関連の項目が 定義されているか確認します。 それでも認識されない場合には、ubt(4)等のデバイスドライバーで対処する必要が あるかもしれません。
準備として、そもそもBluetoothサポートを有効にする必要があります。 /etc/rc.confに以下のように追加します。

bluetooth=YES
その上で、有効化します。以下のように実行すれば良いです。

# /etc/rc.d/bluetooth start
以下のように表示されれば、問題ありません。

configuring Bluetooth controllers: ubt0.
starting Bluetooth Link Key/PIN Code manager
starting Bluetooth Service Discovery server

次に、自分のAndroidなスマートフォンに名前を付けておきます。 AndroidなスマートフォンでBluetoothを有効にします。 続けて、Bluetoothテザリングも有効にします。

$ btconfig ubt0 inquiry
これによって、Bluetoothデバイスのアドレスが取得できます。 以下のような結果ですと、btaddrの右隣の値がアドレスです。 仮にXX:XX:XX:XX:XX:XXとしておきます。

Device Discovery from device: ubt0 ... 1 response
  1: bdaddr XX:XX:XX:XX:XX:XX
   : name "Xperia Z Ultra"
   : class [0x5a020c] Smart Phone   
        
   : page scan rep mode 0x01
   : clock offset 19236
   : rssi 0

次に、/etc/bluetooth/hostsに以下のように記載します。 ここで、XX:XX:XX:XX:XX:XXはさきほど確認したアドレスです。

bc:6e:64:a0:ba:c1	xperia

次に、Xperia Z UltraがちゃんとNAPを提供してくれているか、 念のため確認しておきましょう。 以下のようであれば無事にNAPを提供しています。

$ sdpquery -a xperia search NAP
ServiceRecordHandle: 0x00010007
ServiceClassIDList:
    Network Access Point
ProtocolDescriptorList:
    L2CAP (PSM 0x000f)
    BNEP (v1.0; IPv4, ARP)
BrowseGroupList:
    Public Browse Root
LanguageBaseAttributeIDList:
    en.UTF-8 base 0x0100
BluetoothProfileDescriptorList:
    Network Access Point, v1.0
ServiceName: "Android Network Access Point"
ServiceDescription: "NAP"
SecurityDescription: Service-level Security
NetAccessType: 100Mb Ethernet
MaxNetAccessRate: 1250000
どうやらIPv6は使えないようです。
どんなスマートフォンとつながってしまっても良いのでは困ります。 PIN (暗証番号)を設定し、それを使って認証します。 ここでは、さきほど設定した名称xperiaに対して、4桁のPINを設定します。

$ btpin -d ubt0 -a xperia -r -l 4
PIN: ZZZZ
ここで表示された数字4桁がPINです。
では、早速Bluetooth PAN接続してみましょう。

# btpand -d ubt0 -a xperia -s NAP
btpand[25264]: Searching for NAP service at XX:XX:XX:XX:XX:XX
btpand[25264]: Found PSM 15 for service NAP
btpand[25264]: Opening connection to service 0x1116 at YY:YY:YY:YY:YY:YY
btpand[25264]: channel_open: (fd#5)
btpand[25264]: Using interface tap0 with addr 00:1b:dc:06:1d:05
btpand[25264]: channel_open: (fd#6)
のように実行すると、Xperia Z Ultra側でPINを入力するようにうながされます。 さきほどの4桁のPINを入力します。 dhcpcd(8)コマンドで、IPアドレス他を取得します。

# dhcpcd tap0

これで、もしXperia Z UltraがWi-Fiでインターネットに接続されているので あれば、そのインターネット接続をBluetoothで使えるようになっています。 どうやらあまり広帯域ではないようですが。

NetBSDからMTPデバイスを使う

この記事は、NetBSD Advent Calendar 2016の6日目の記事です。

はじめに

AndroidなスマートフォンはMTP (Media Transfer Protocol) で 内蔵ストレージや挿し込まれたmicroSDカード等の中身をPCから見ることができます。 私の使っているXperia Z Ultraで言うと、どうやら内蔵ストレージは MTPでしか見ることができないようです。

と言うことで、NetBSDな常用ラップトップから、Xperia X Ultraの内蔵ストレージと microSDカードの中身を扱う方法を書いてみます。

libmtpを使う

一番簡単なのは、昔のMS-DOSのFAT領域を扱うmtoolsのような仕組みを使う方法です。 このようなツールは、一つは、pkgsrc/devel/libmtpで提供されています。 Xperia Z UltraをMTPモードに設定して、NetBSD/amd64なラップトップに接続してみます。 カーネル的にはデバイスドライバーはありませんので、ugen(4)として認識されます。


ugen0 at uhub0 port 5
ugen0: Sony C6833, rev 2.00/2.32, addr 11

libmtpをインストールして、Xperia Z Ultraが認識されるか試してみます。


$ cd /usr/pkgsrc/devel/libmtp
$ make install
$ mtp-detect
libmtp version: 1.1.12

Listing raw device(s)
Device 0 (VID=0fce and PID=019c) is a SONY Xperia Z Ultra MTP (ID3).
   Found 1 device(s):
   SONY: Xperia Z Ultra MTP (ID3) (0fce:019c) @ bus 0, dev 16
Attempting to connect device(s)
Android device detected, assigning default bug flags
Error 1: Get Storage information failed.
USB low-level info:
   Interface has a kernel driver attached.
   bcdUSB: 512
   bDeviceClass: 0
   bDeviceSubClass: 0
   bDeviceProtocol: 0
   idVendor: 0fce
   idProduct: 019c
   IN endpoint maxpacket: 512 bytes
   OUT endpoint maxpacket: 512 bytes
   Raw device info:
      Bus location: 0
      Device number: 16
      Device entry info:
         Vendor: SONY
         Vendor id: 0x0fce
         Product: Xperia Z Ultra MTP (ID3)
         Vendor id: 0x019c
         Device flags: 0x18008106
Configuration 0, interface 0, altsetting 0:
   Interface description contains the string "MTP"
   Device recognized as MTP, no further probing.
Device info:
   Manufacturer: Sony
   Model: C6833
   Device version: 1.0
   Serial number: CB5A253C8R
   Vendor extension ID: 0x00000006
   Vendor extension description: microsoft.com: 1.0; android.com: 1.0; microsoft.com/WPDNA: 1.0;sonyericsson.com/SE: 1.0; sony.net/MRLN: 1.0;microsoft.com/DeviceServices:1.0;
   Detected object size: 64 bits
   Extensions:
        microsoft.com: 1.0
        android.com: 1.0
        microsoft.com/WPDNA: 1.0
        sonyericsson.com/SE: 1.0
        sony.net/MRLN: 1.0
        microsoft.com/DeviceServices: 1.0
Supported operations:
   1001: Unknown(1001)
   1002: Unknown(1002)
   1003: Unknown(1003)
   1004: Unknown(1004)
   1005: Unknown(1005)
   1006: Unknown(1006)
   1007: Unknown(1007)
   1008: Unknown(1008)
   1009: Unknown(1009)
   100a: Unknown(100a)
   100b: Unknown(100b)
   100c: Unknown(100c)
   100d: Unknown(100d)
   1014: Unknown(1014)
   1015: Unknown(1015)
   1016: Unknown(1016)
   1017: Unknown(1017)
   101b: Unknown(101b)
   9801: Unknown(9801)
   9802: Unknown(9802)
   9803: Unknown(9803)
   9804: Unknown(9804)
   9805: Unknown(9805)
   9806: Unknown(9806)
   9808: Unknown(9808)
   9810: Unknown(9810)
   9811: Unknown(9811)
   95c1: Unknown(95c1)
   95c2: Unknown(95c2)
   95c3: Unknown(95c3)
   95c4: Unknown(95c4)
   95c5: Unknown(95c5)
   9301: Unknown(9301)
   9302: Unknown(9302)
   9303: Unknown(9303)
   9304: Unknown(9304)
   9305: Unknown(9305)
   9306: Unknown(9306)
   9307: Unknown(9307)
   9308: Unknown(9308)
   9309: Unknown(9309)
   930a: Unknown(930a)
   9185: Unknown(9185)
   9186: Unknown(9186)
   9187: Unknown(9187)
   9188: Unknown(9188)
   9189: Unknown(9189)
   9191: Unknown(9191)
   9194: Unknown(9194)
   9196: Unknown(9196)
   9197: Unknown(9197)
   940c: Unknown(940c)
   940d: Unknown(940d)
   9407: Unknown(9407)
   9408: Unknown(9408)
   9409: Unknown(9409)
Events supported:
   0x4002
   0x4003
   0x4004
   0x4005
   0x4006
   0xc350
   0xc35a
Device Properties Supported:
   0xd401: Synchronization Partner
   0xd402: Friendly Device Name
   0xd405: Device Icon
   0x5003: Image Size
   0x5001: Battery Level
   0xd120: Unknown property
   0xd302: Unknown property
   0xd303: Unknown property
Playable File (Object) Types and Object Properties Supported:
   3000: Undefined Type
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   300a: MS AVI
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      de97: Scan Depth UINT16 data type enumeration: 0, 1, 2, 3, 6, 7,  GET/SET
      de9b: Video Four CC Codec UINT32 data type enumeration: 875967048, 1395937357, 842289229, 844313677, 859189832,  GET/SET
      de9c: Video Bit Rate UINT32 data type range: MIN 1, MAX 34816000, STEP 1 GET/SET
      de9d: Frames Per Thousand Seconds UINT32 data type range: MIN 1, MAX 30000, STEP 1 GET/SET
      dea1: Encoding Profile STRING data type GET/SET
      dc87: Width UINT32 data type range: MIN 1, MAX 4096, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 2160, STEP 1 READ ONLY
      de93: Sample Rate UINT32 data type range: MIN 1, MAX 96000, STEP 1 GET/SET
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de99: Audio WAVE Codec UINT32 data type enumeration: 41222,  GET/SET
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 384000, STEP 1 READ ONLY
   3001: Association/Directory
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   3004: Text
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   3005: HTML
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   3008: MS Wave
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc9b: Album Artist STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc8c: Genre STRING data type READ ONLY
      dc96: Composer STRING data type READ ONLY
      de99: Audio WAVE Codec UINT32 data type enumeration: 1, 2, 3,  GET/SET
      de92: Bit Rate Type UINT16 data type enumeration: 1, 2,  READ ONLY
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 1536000, STEP 1 READ ONLY
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de93: Sample Rate UINT32 data type range: MIN 8000, MAX 48000, STEP 1 GET/SET
   3009: MP3
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc9b: Album Artist STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc8c: Genre STRING data type READ ONLY
      dc96: Composer STRING data type READ ONLY
      de99: Audio WAVE Codec UINT32 data type enumeration: 80, 85,  GET/SET
      de92: Bit Rate Type UINT16 data type enumeration: 1, 2,  READ ONLY
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 320000, STEP 1 READ ONLY
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de93: Sample Rate UINT32 data type range: MIN 8000, MAX 48000, STEP 1 GET/SET
   3801: JPEG
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc87: Width UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
   3802: TIFF EP
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc87: Width UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
   3804: BMP
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc87: Width UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
   3807: GIF
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc87: Width UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
   3808: JFIF
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc87: Width UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
   380b: PNG
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc87: Width UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
   380d: TIFF
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc87: Width UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 32767, STEP 1 READ ONLY
   b902: OGG
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      de97: Scan Depth UINT16 data type enumeration: 0, 1, 2, 3, 6, 7,  GET/SET
      de9b: Video Four CC Codec UINT32 data type enumeration: 875967048, 1395937357, 842289229, 844313677, 859189832,  GET/SET
      de9c: Video Bit Rate UINT32 data type range: MIN 1, MAX 96000, STEP 1 GET/SET
      de9d: Frames Per Thousand Seconds UINT32 data type range: MIN 1, MAX 30000, STEP 1 GET/SET
      dea1: Encoding Profile STRING data type GET/SET
      dc87: Width UINT32 data type range: MIN 1, MAX 4096, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 2160, STEP 1 READ ONLY
      de93: Sample Rate UINT32 data type range: MIN 1, MAX 96000, STEP 1 GET/SET
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de99: Audio WAVE Codec UINT32 data type enumeration: 80, 85,  GET/SET
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 1500000, STEP 1 READ ONLY
   b903: AAC
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc9b: Album Artist STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc8c: Genre STRING data type READ ONLY
      dc96: Composer STRING data type READ ONLY
      de99: Audio WAVE Codec UINT32 data type enumeration: 41222,  GET/SET
      de92: Bit Rate Type UINT16 data type enumeration: 1, 2,  READ ONLY
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 384000, STEP 1 READ ONLY
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de93: Sample Rate UINT32 data type range: MIN 1, MAX 48000, STEP 1 GET/SET
   b982: MP4
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      de97: Scan Depth UINT16 data type enumeration: 0, 1, 2, 3, 6, 7,  GET/SET
      de9b: Video Four CC Codec UINT32 data type enumeration: 875967048, 1395937357, 842289229, 844313677, 859189832,  GET/SET
      de9c: Video Bit Rate UINT32 data type range: MIN 1, MAX 139264000, STEP 1 GET/SET
      de9d: Frames Per Thousand Seconds UINT32 data type range: MIN 1, MAX 30000, STEP 1 GET/SET
      dea1: Encoding Profile STRING data type GET/SET
      dc87: Width UINT32 data type range: MIN 1, MAX 4096, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 2160, STEP 1 READ ONLY
      de93: Sample Rate UINT32 data type range: MIN 1, MAX 96000, STEP 1 GET/SET
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de99: Audio WAVE Codec UINT32 data type enumeration: 41222,  GET/SET
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 393216, STEP 1 READ ONLY
   b984: 3GP
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc48: Description array of UINT16 data type ANY 16BIT VALUE form READ ONLY
      de97: Scan Depth UINT16 data type enumeration: 0, 1, 2, 3, 6, 7,  GET/SET
      de9b: Video Four CC Codec UINT32 data type enumeration: 875967048, 1395937357, 842289229, 844313677, 859189832,  GET/SET
      de9c: Video Bit Rate UINT32 data type range: MIN 1, MAX 20480000, STEP 1 GET/SET
      de9d: Frames Per Thousand Seconds UINT32 data type range: MIN 1, MAX 30000, STEP 1 GET/SET
      dea1: Encoding Profile STRING data type GET/SET
      dc87: Width UINT32 data type range: MIN 1, MAX 4096, STEP 1 READ ONLY
      dc88: Height UINT32 data type range: MIN 1, MAX 2160, STEP 1 READ ONLY
      de93: Sample Rate UINT32 data type range: MIN 1, MAX 96000, STEP 1 GET/SET
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de99: Audio WAVE Codec UINT32 data type enumeration: 41222, 1935764850,  GET/SET
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 384000, STEP 1 READ ONLY
   ba03: Abstract Audio Album
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc9b: Album Artist STRING data type READ ONLY
   ba05: Abstract Audio Video Playlist
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   ba10: WPL Playlist
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   ba11: M3U Playlist
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   ba14: PLS Playlist
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   ba82: XMLDocument
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
   b906: FLAC
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      dc46: Artist STRING data type READ ONLY
      dc9a: Album Name STRING data type READ ONLY
      dc9b: Album Artist STRING data type READ ONLY
      dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
      dc89: Duration UINT32 data type range: MIN 0, MAX -1, STEP 1 READ ONLY
      dc8c: Genre STRING data type READ ONLY
      dc96: Composer STRING data type READ ONLY
      de99: Audio WAVE Codec UINT32 data type enumeration: 1, 2, 3,  GET/SET
      de92: Bit Rate Type UINT16 data type enumeration: 1, 2,  READ ONLY
      de9a: Audio Bit Rate UINT32 data type range: MIN 5000, MAX 1500000, STEP 1 READ ONLY
      de94: Number Of Channels UINT16 data type enumeration: 0, 1, 2,  GET/SET
      de93: Sample Rate UINT32 data type range: MIN 1, MAX 48000, STEP 1 GET/SET
   b102: Unknown(b102)
      dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
      dc03: Protection Status UINT16 data type enumeration: 0, 1, 32770, 32771,  READ ONLY
      dc04: Object Size UINT64 data type READ ONLY
      dc07: Object File Name STRING data type GET/SET
      dc09: Date Modified STRING data type DATETIME FORM READ ONLY
      dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
      dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
      dc44: Name STRING data type GET/SET
      dce0: Display Name STRING data type READ ONLY
      dc4e: Date Added STRING data type DATETIME FORM READ ONLY
      dc4f: Non Consumable UINT8 data type enumeration: 0, 1,  READ ONLY
      d920: Unknown property array of UINT64 data type GET/SET
Special directories:
   Default music folder: 0xffffffff
   Default playlist folder: 0xffffffff
   Default picture folder: 0xffffffff
   Default video folder: 0xffffffff
   Default organizer folder: 0xffffffff
   Default zencast folder: 0xffffffff
   Default album folder: 0xffffffff
   Default text folder: 0xffffffff
MTP-specific device properties:
   Friendly name: Xperia Z Ultra
   Synchronization partner: (NULL)
   Battery level 86 of 100 (86%)
libmtp supported (playable) filetypes:
   Audio Video Interleave
   Folder
   Text file
   HTML file
   RIFF WAVE file
   ISO MPEG-1 Audio Layer 3
   JPEG file
   BMP bitmap file
   GIF bitmap file
   JFIF file
   Portable Network Graphics
   TIFF bitmap file
   Ogg container format
   Advanced Audio Coding (AAC)/MPEG-2 Part 7/MPEG-4 Part 3
   MPEG-4 Part 14 Container Format (Audio+Video Emphasis)
   Abstract Album file
   Abstract Playlist file
   XML file
   Free Lossless Audio Codec (FLAC)
OK.
inep: usb_get_endpoint_status(): Bad file descriptor
outep: usb_get_endpoint_status(): Bad file descriptor

この次には、以下のように実行すると、ls相当のことができるはずです。


$ mtp-files
libmtp version: 1.1.12

Device 0 (VID=0fce and PID=019c) is a SONY Xperia Z Ultra MTP (ID3).
mtp-files: Successfully connected
PTP_ERROR_IO: failed to open session, trying again after resetting USB interface
LIBMTP libusb: Attempt to reset device
LIBMTP PANIC: failed to open session on second attempt
Unable to open raw device 0
OK.

最後にOKと出力されましたが、全くOKではありません。 何度か試しましたが、どうやらこのままでは動かないようです。

gPhoto2を使う

私の知っているもう一つのMTP実装は、gPhoto2 (pkgsrc/graphics/gphoto2とpkgsrc/deve/libgphoto2)です。 これもmtools的なツールです。


$ cd /usr/pkgsrc/graphics/gphoto2
# make install
$ gphoto2 -a
Abilities for camera             : SONY Xperia Z Ultra MTP (ID3)
Serial port support              : no
USB support                      : yes
Capture choices                  :
                                 : Capture not supported by the driver
Configuration support            : no
Delete selected files on camera  : yes
Delete all files on camera       : no
File preview (thumbnail) support : no
File upload support              : yes

どうやらエラーはなさそうですので、期待が持てそうです。 lsに相当することをしてみます。


$ gphoto2 -L
There is no file in folder '/'.
There are 2 files in folder '/store_00010001'.
#1     customized-capability.xml  rd     1 KB application/x-unknown
#2     default-capability.xml     rd     2 KB application/x-unknown
There is 1 file in folder '/store_00010001/.HhTjqSRo6dybqDAV2ImUSREmnZU='.
#3     .nomedia                   rd     1 KB application/x-unknown
There is no file in folder '/store_00010001/.android'.
There is 1 file in folder '/store_00010001/.android/.secure'.
#4     925bee4023f985f3c92c620ced45ca4700aa188drd     1 KB application/x-unknown
(snip)
#918   track77.cdda.wav.mp3       rd   590 KB audio/mpeg
#919   track78.cdda.wav.mp3       rd   634 KB audio/mpeg
#920   track79.cdda.wav.mp3       rd   704 KB audio/mpeg
#921   track80.cdda.wav.mp3       rd   603 KB audio/mpeg
#922   track81.cdda.wav.mp3       rd   835 KB audio/mpeg

複数回繰り返しても、2回目以降エラーになることもないようです。 次にファイルを取り出してみます。最後のファイル#922を取り出してみます。


$ gphoto2 -p 922
Saving file as track81.cdda.wav.mp3

なぜかXperia Z Ultraを操作中には、成功するようです。 そのまま置いておくと、失敗しました。 mtools的な操作で、機動性には欠けますが、MTPでしか接続できないデバイスからも無事にファイルを取得できそうです。

今後の課題

FUSEを使ってmountできるようになれば便利そうですが、MTPはそもそもPOSIXがファイルシステムへ要求する仕様を満足していないそうですので、あまり使いやすくないかもしれません。

Chromium browserをNetBSDで使う計画の経過報告

日付が変わってしまいましたが、NetBSD Advent Calendar2016の2日目の記事です。

はじめに

Chromium browserは、Google Chromeのopen source版のような位置付けのウェブブラウザーです。 WebkitのforkであるBlinkというレンダリングエンジンを搭載しており、私の愛用しているFirefoxよりも軽快に動作すると言う話です。

これまでの経緯

Chromium browserについては、2016年7月頃にバージョン51をNetBSD/amd64 currentで動かそうと試みていました。 しかし、以下の理由で積極的には使用できない状態でした。

  • PR kern/49691に該当してしまい、頻繁にkernel panicを引き起こしてしまう。
  • Googleアカウントによるサインインができず、ブックマークの同期等ができない。
しかし、2016年11月8日にchristos@がhttp://mail-index.netbsd.org/source-changes/2016/11/08/msg078942.htmlでPR kern/49691で提案されていた修正をコミットしたので、安心してChromiumを試すことができるようになりました。

今回の取り組み

Chromium 51は、FreeBSD Portsのパッチをベースに、NetBSD向けに修正して行く形で進めました。 今回も、Chromium 54に対するFreeBSD向けのパッチをベースにしました。 ですが、公式なFreeBSD Portsのツリーには収録されていませんでしたので、https://github.com/gliaskos/freebsd-chromiumにあるパッチをベースにしました。

ですがこのパッチは、*BSD向けとしてFreeBSDのみに該当するような内容を含めている箇所が数多くありました。 NetBSDとFreeBSDは、同じと考えられない部分も多いですので、ここでされているような対処は行き過ぎだと考えています。

ですので、NetBSDで動かす際には、なるべくFreeBSDでも動くと考えられるようにしつつ、NetBSDに対応するように変更しました。 最終的には、FreeBSDの環境でも試すべきですが、そこまではできていません。

移植し結果は、 pkgsrc/wip/chromium-newとして公開しました。

関門1

ビルドを開始して最初に気付いたのは、51の頃に使われていたGYPがもう十分にメンテナンスされていないようだと言うことです。 私の記憶では、GYPはGenerate Your Projectsの略で、mozcのビルドにも使われていました。 ですが、少なくともChromium 54では、GN (Generate Ninjaの略らしい)を使うのが良いようです。ですが、GYPで実現されていた内容が全てバージョン54のGNで実現されているのではありません。

また、GNで*BSDを認識する変数として、is_bsdと言う変数が定義されていますが、これがFreeBSD用に使われるようになっていて、NetBSD特有な処理をさせることができないという問題がありました。 https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=blob;f=chromium-new/patches/patch-tools_gn_bootstrap_bootstrap.py;h=f74016c0fc743b1cba38ccf2ca7fa76026eb83cf;hb=HEADや、https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=blob;f=chromium-new/patches/patch-tools_gn_args.cc;h=b8daf3aee96f157d8c3232351a78f97dc2975cd0;hb=HEADのように、is_netbsdを定義する必要がありました。

関門2

関門2と書きましたが、関門は1つしかありません。 あえて言うのであれば、私のラップトップでは一回のビルドに4から5時間を要するので、試行錯誤が難しいという点があります。 他は良くあるNetBSD向けのプログラムの移植と言う感じです。

実際にChromuium 54を使ってみよう

http://www.pkgsrc.org/wip/に記載の手順に従ってpkgsrc-wipをcloneしましょう。 具体的には、以下のようにします。


$ cd /usr/pkgsrc/devel/git-base
$ make update
$ cd /usr/pkgsrc
$ git clone git://wip.pkgsrc.org/pkgsrc-wip.git wip

既にpkgsrc-wipを/usr/pkgsrc/wipにclone済みの方は、最新の状態に更新してください。 具体的には、以下のようにします。


$ cd /usr/pkgsrc/wip
$ git pull
CVSの時代のpkgsrc-wipのままの場合には、ローカルでの変更をバックアップした上で、ggit cloneし直してください。

それでは、Chromium 54をビルドしてインストールします。 具体的には、以下のようにします。


$ cd /usr/pkgsrc/wip/chromium-new
$ make update
これで約5時間待つと完了します。 自動的にsudoを使ってパッケージのインストールをするようにしていない場合には、適宜進捗を確認してrootのパスワードを入力してください。

この際、以下の内容を/etc/mk.confに足しておくことをお勧めします。


.if exists(/usr/pkg/bin/sudo)
SU_CMD=/usr/pkg/bin/sudo /bin/sh -c
.endif

残された課題

/usr/pkgsrc/wip/chromium-new/TODOにも書いていますが、以下のような問題が残っています。

  • オーディオ出力がされない。
  • Passwords cryptographer error was encountered:というエラーが発生する。
後者は、私の使う範囲では実害はないようなのですが、何かうまく行っていないのは確かです。

おわりに

普通にウェブサイトを見て回るような用途では、問題なく使用できます。 オーディオが出力されない問題については、大きな問題ですので、良いアイディアがあれば教えてください。 それが解決すれば、pkgsrc/www/chromiumとしてインポートしたいと考えています。

pkgsrc/mail/dkimproxyを使ってみたが、受信時の動作は、現在の用途には合わないようだった

とある過去に利用者のいたドメインを所有しているのだが、相当に雑な運用だったようで、いまだにSPAM以外の電子メールが来るし、 そのドメインの存在しないアカウントを装った電子メールが多く送信されているようだった。 しばらく、キャッチオール設定をして受信してみて気付いた...