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としてインポートしたいと考えています。

Certificate authorityの研究1 〜Certificate authorityをどう日本語に訳すか〜

先日、日本国のGPKIのルート証明書がMozillaのNSS/Firefoxに含まれていないことに気付いた。これを機会に、Certificate authority (Certification authorityとも言うらしい。以下CAと略す)について調べる気持ちになったので、その内容を記載していく。

まず、CAについては、どのように日本語訳を考えれば良いのだろうか? Wikipedia英語版のCertificate authorityからの、Wikipedia日本語版へのリンクは、認証局という項目になっているが、認証局という単語は、私にはあまりに一般的な用語であるように理解される。 英語のCertificate authorityという語自体も日本語の認証局に劣らず一般的な用語のように理解される。

ではどのような日本語訳が適切であるか、日本語を主に利用しているCAを探して、そこでの表記を調べてみることにする。

既に、日本ベリサインという会社はなくなって、Symantecの一部になっているようであるが、そこのCAの業務に関連すると思われる日本語のトップページを見てみた。シマンテックSSL情報センターというウェブページである。 ここで、認証局と言う単語が表示されているか検索してみると、全くそのような単語は表示されていないことが分かった。 SSLの概要というサブページには、認証局という単語が使用されている。 どうやら、SymantecはCAを認証局と訳しているようである。

日本の企業ということで、セコムトラストシステムズの用語を調べてみた。リポジトリウェブページからリンクされているセコムパスポート for Web SRサービス利用規程 (PDF)においても、セコム認証基盤共通 Certification Practice Statement (PDF)においても、CAは認証局と訳されている。

次に、CAの業界団体的なものがないか検索してみる。 すると、電子認証局会議というウェブサイトが見付かった。 電子認証局会議についてというページによると、英語名は、Certification Authority Conferenceと言うと分かる。 この団体では、CAは電子認証局と訳していることが分かる。 ちなみに、2016年11月28日現在、https://www.c-a-c.jp/ はApache httpdと思われるForbiddenの表示がされているのが興味深い。

次には、日本国の公的機関においては、どのような表記になっているか調べてみた。 まずは、GPKIについてである。 政府認証基盤(GPKI)についてというウェブページによると、CAは認証局と訳されている。 次にLGPKIについて見てみる。 地方公共団体組織認証基盤というウェブページによると、ここでも認証局と訳されている。 次に、独立行政法人情報処理推進機構のlPKI関連技術情報のウェブページによると、ここでもまたCAは認証局と訳されている。

以上より、CAは単に認証局と訳すのが日本においては一般的であると判断した。 よって、以下では、CAを日本語で表現する必要がある場合には、認証局という語を使用することとしよう。

Microsoft Update

いまだにWindows 7をセットアップする機会があるのだが、Internet Explorer 11を最新の状態にして、Windows Updateも最新の状態まで持って行った後に、Microsfot Updateを有効にしようと、Microsoft UpdateのウェブページをInternet Explorer 11で開いても、 『「スタート」メニューを使用して、更新プログラムを確認してください。Windows Updateはコントロールパネルの一部になりました。…』と表示されて有効化できない。互換表示設定にmicrosoft.comを追加した後に、操作するとMicrosoft Updateを有効化できた。有効化できたら、互換表示設定からmicrosoft.comは削除して良い。

SKYSEA Client ViewとFirefox addon

SKYSEA Client View 10.2というのがあって、まあ、企業で必要とするロギングはできるものなのであろう。ただ、Firefoxのアドオンを勝手に追加されるのは気に入らない。e10sとか阻害されても面白くないし。 と言うことで、試しに排除できるかやってみた。

SKYSEA Client View 10.2がFirefoxに対して何をしているかは、C:\Users\userID\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\extensions.ini を見ると分かる。以下のようにExtension5の行が強制的に追加される。


[ExtensionDirs]
Extension0=C:\Users\userID\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\extensions\itsalltext@docwhat.gerf.org
Extension1=C:\Users\userID\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\extensions\{e968fc70-8f95-4ab9-9e79-304de2a71ee1}.xpi
Extension2=C:\Users\userID\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\extensions\{8f8fe09b-0bd3-4470-bc1b-8cad42b8203a}
Extension3=C:\Users\userID\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\extensions\{ad0d925d-88f8-47f1-85ea-8463569e756e}.xpi
Extension4=C:\Users\userID\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\extensions\{53A03D43-5363-4669-8190-99061B2DEBA5}.xpi
Extension5=C:\Program Files\Sky Product\SKYSEA Client View\FxAddon
[MultiprocessIncompatibleExtensions]
Extension0=itsalltext@docwhat.gerf.org
Extension1={e968fc70-8f95-4ab9-9e79-304de2a71ee1}
Extension2={8f8fe09b-0bd3-4470-bc1b-8cad42b8203a}
Extension3={ad0d925d-88f8-47f1-85ea-8463569e756e}
Extension4={53A03D43-5363-4669-8190-99061B2DEBA5}
Extension5={3c255b38-0b4a-4c6e-b3d8-ab21d4a55eb3}
[ThemeDirs]
Extension0=C:\Program Files\Mozilla Firefox\browser\extensions\{972ce4c6-7e08-4474-a285-3208198ce6fd}.xpi

アドオンをどのディレクトリーから読み込むかを制限することができる。 C:\Users\userID\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\prefs.jsで設定する。 詳細は、Mozillaの説明によると、 とりあえずuser_pref("extensions.enabledScopes", 0);を追加しておけば、SKYSEA Client View 10.2のディレクトリーに存在するアドオンは読み込まれない。

まあ、自分だけモニタリングされていないと目立つので、こんなことはしない方が良いだろう。

Mantis BTを、nginxとphp-fpmの環境で、サブディレクトリーで動かす

サブディレクトリーで動かす

nginxとphp-fpmでサブディレクトリーで動かす話なのだが、 Mantis BTに限らず、PHPなウェブアプリケーションは何であっても同じような話になるような気がする。 しかし、Mantis BTしか確かめていない。

ここでは、http://example.com/its/ のようなURLで動かす例を示す。


http {
    upstream php-handler {
        server 127.0.0.1:9000;
    }
(snip)
    server{
(snip)
        # Mantis BT
        location ^~ /its {
                alias /usr/pkg/share/mantis;
                index index.php index.html;

                location ~ \.php$ {
                        include fastcgi_params;
                        fastcgi_pass php-handler;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME $request_filename;
                }
        }
    }
}

Mantis BTは、/usr/pkgsrc/devel/mantisから、1.3.1を導入してある。

Mantis BTでユーザー認証をActive Directoryと連携する

はじめに

Mantis BTは、ユーザー認証をLDAPの情報を使って行なえるようになっている。 とある事情でActive DirectoryのLDAPの情報を使ってユーザー認証をしたい機会があったので、その設定を書いておく。 しかし、Admin Guideには、一般的なLDAPについて書かれているので、ちゃんと読まないとActive Directoryで使えるようにならない。

残念ながら、私はLDAPにもMantis BTにもさほど詳しい訳ではないので、最適解ではないかもしれないが、動く例として記載しておく。

Mantis BTは、pkgsrc/devel/mantisから導入したMantis BT 1.3.1であり、/usr/pkg/share/mantis 以下に配置されている。LDAP機能を使うため、pkgsrc/databases/php-ldapも追加でインストールしている。

Active Directoryでの認証の有効化方法

まず最初にやらないといけないのは、Active Directory認証に移行した後に使う管理者ユーザーの追加である。 Mantis BTのインストールをしたばかりの状態では、ユーザーID/パスワード = administrator/root でログインできる。ここで、Active Directoryに登録されているユーザーを管理者として登録しておく。 Active Directory認証を有効化した後には、administratorユーザーでログインすることはできないので、先に管理者ユーザーを作っておく必要がある。

Active Directoryについては、以下のような情報が与えられている。

Active Directoryサーバー
tetera-ad.tetera.org
ブラウジングするユーザーID/パスワード
aduser/aduser_password

これらに対して、/usr/pkg/share/mantis/config/config_inc.php の末尾に、以下のように追加する。


$g_login_method = LDAP;
$g_ldap_server = 'tetera-ad.tetera.org';
$g_ldap_port = '3268';
$g_ldap_root_dn = 'dc=tetera,dc=org';
$g_ldap_organization = '';
$g_ldap_uid_field = 'sAMAccountName';
$g_ldap_bind_dn = 'aduser@tetera.org';
$g_ldap_bind_passwd = 'aduser_password';
$g_use_ldap_email = OFF;
$g_use_ldap_realname = OFF;
$g_show_realname = OFF;
$g_ldap_protocol_version = 3;
$g_allow_signup = OFF;
$g_lost_password_feature = OFF;
$g_ldap_follow_referrals = OFF;

$g_use_ldap_realname = ON;にすることで、cnをユーザーの名称として使うことができるはずである。 しかし、今回の環境では、sAMAccountNameとcnは一緒なので、OFFにして各ユーザーが設定するようにした。

Google Static Mapsの代替としてのOpenStreetMap

はじめに

Google Mapsには、Google Maps Static API というものがあって、パラメーターを渡すと、PNG画像を返してくれる。 これを散布図グラフの背景に設定すれば、地図上に散布図で示した情報をマッピングできるので、便利である。 しかし、Google Static Mapsは、例えばイントラネットに閉じたサービスでは使用できない。 Open Street Mapは、Creative Commons Attribution-ShareAlike 2.0 Genericでライセンスされているので、 このような環境でも使用できるのだが、tile.openstreetmap.orgのAPIは、 Google Static Maps APIとは指定の方法が違うようで、Google Static Maps用のパラメーター計算の方法がそのまま使えない。

調べてみると、staticmapliteというのが、Google Static Maps APIに類似のAPIで、 tile.openstreetmap.orgから画像を取得できるようだ。 特にズームの値の指定が一緒なのが大変助かる。 しかし、インストール方法も書かれていないのが難点だった。

後からよく調べてみると、 staticMapLiteExtと言うものもあって、こちらの方が高機能であるようだ。しかもインストール方法もちゃんと書かれている。 新規で導入するのであれば、こちらの方が良いかもしれない。

インストールの事前準備

今回は、nginxとphp-fpmを使って動かすことにしたため、 pkgsrc/www/nginxpkgsrc/www/php-fpmpkgsrc/www/php-curlpkgsrc/graphics/php-gd、 をインストールしておく。私の場合は、既にnginxでウェブサイトを構築しているため、新規にインストールはしなかった。 導入したPHPは、5.6.25である。 php-curlとphp-gdは、staticmapliteの動作に必要である。

php-fpmの設定

php-fpmは、localhostからのみ接続できるように、/usr/pkg/etc/php-fpm.confに

listen.allowed_clients = 127.0.0.1

を追加した。

nginxの設定

以下のような設定を/usr/pkg/etc/nginx/nginx.confに追加した。


http {
        upstream php-handler {
            server 127.0.0.1:9000;
        }
}
server {
        location /osm-staticmap/staticmaplite {
                root /home/YOUR_NAME/osm;
        }
        location ~ ^(.+?\.php)(/.*)?$ {
                root /home/YOUR_NAME/osm;
                try_files $1 =404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_pass php-handler;
        }
}


このように設定した上で、php-fpmとnginxをrestartさせておく。

staticmapliteの配置

staticmapliteは~/osm/osm-staticmap/staticmaplite/staticmaplite.phpとして配置するので、 以下のようにgithubからcloneしておく。

$ mkdir -p ~/osm/osm-staticmap
$ cd ~/osm/osm-staticmap
$ git clone git@github.com:dfacts/staticmaplite.git

動作確認

https://deuterium.ryoon.net/osm-staticmap/staticmaplite/のように表示されたら、正常に使用開始できている。

おまけ

デバッグメッセージの表示

標準ではエラーメッセージが表示されないので、動作確認中は、以下のように変更しておくと良いかもしれない。

diff --git a/staticmap.php b/staticmap.php
index a9855e5..118c399 100644
--- a/staticmap.php
+++ b/staticmap.php
@@ -25,8 +25,8 @@
  *
  */

-error_reporting(0);
-ini_set('display_errors', 'off');
+error_reporting(1);
+ini_set('display_errors', 'on');

 Class staticMapLite
 {

右下のattributionの画像の変更

標準では、「(c) OpenStreetMap contributors」ではないので、使いにくい。 osm_logo.pngを置き換えてやれば良い。 画像の右下同士を合わせるので、ピクセル数を変えてもstaticmaplite.php等の変更は必要ない。

HTTPプロキシーの使用

イントラネットからインターネットに出るのに、HTTPプロキシーサーバーを経由しないといけない場合もあると思う。 staticmapliteは、php-curlを使っているので、curl_setoptのCURLOPT_HTTPPROXYTUNNEL等を設定してやれば良い。 例えば、認証が必要なHTTPプロキシーサーバーを経由する場合には、以下のようにする。


diff --git a/staticmap.php b/staticmap.php
index a9855e5..4851575 100644
--- a/staticmap.php
+++ b/staticmap.php
@@ -339,6 +345,12 @@ Class staticMapLite
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0");
         curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
+        curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
+        curl_setopt($ch, CURLOPT_PROXYPORT, '8080');
+        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
+        curl_setopt($ch, CURLOPT_PROXY, 'http://PROXYSERVER');
+        curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'USERNAME:PASSWORD');
         $tile = curl_exec($ch);
         curl_close($ch);
         if ($tile && $this->useTileCache) {

jwmのタスクバーに年月日も表示する

jwmでのタスクバーの時刻表示を24時間制にするで、24時間制で時刻を表示するようにしたが、使っていると日付も表示して欲しいと思うようになった。以下のように変更することで、2016-08-18 21:36のように表示できた。


--- /usr/pkg/share/examples/jwm/system.jwmrc    2016-08-05 00:30:50.000000000 +0900
+++ .jwmrc      2016-08-18 21:27:42.149972917 +0900
@@ -58,7 +58,7 @@
         <TaskList maxwidth="256"/>

         <Dock/>
-        <Clock><Button mask="123">exec:xclock</Button></Clock>
+        <Clock format="%Y-%m-%d %R"><Button mask="123">exec:xclock</Button></Clock>

     </Tray>
 

ibus-skkのデフォルトで全角になっている記号を半角で入力するようにする

uim-skkとibus-skkをきまぐれに行き来して使っているのだが、 操作性としては、Ctrj-jの動作がより自然なisus-skk 1.4.2が使いやすい。 しかし、細かい入力規則の設定方法が分からず、クエスチョンマークやコロン等が全角で入力されてしまうのを放置していて、非常に面倒だった。

ふと、/usr/pkg/share/libskk/rules ディレクトリーを見ると、libskkの設定ファイルを書くことで変更できるようなので、やってみた。

しかし、入力規則は、Defaultを変更は一般ユーザー権限ではできず、自分独自の入力規則を作成することで、カスタマイズするらしい。 以下のように操作して、記号類を半角にできた。

$ mkdir ~/.config/libskk/rules
$ cd ~/.config/libskk/rules
$ cp -r /usr/pkg/share/libskk/rules/default hankakusymbols
$ vi metadata.json
$ diff -u /usr/pkg/share/libskk/rules/default/metadata.json metadata.json
--- /usr/pkg/share/libskk/rules/default/metadata.json   2016-08-05 05:24:16.000000000 +0900
+++ metadata.json       2016-08-13 08:20:46.044465179 +0900
@@ -1,4 +1,4 @@
 {
-    "name": "Default",
-    "description": "Default typing rule"
+    "name": "Hankaku Symbols",
+    "description": "Default typing rule with hankaku symbols"
 }
$ vi rom-kana/default.json
$ diff -u /usr/pkg/share/libskk/rules/default/rom-kana/default.json rom-kana/default.json
--- /usr/pkg/share/libskk/rules/default/rom-kana/default.json   2016-08-05 05:24:16.000000000 +0900
+++ rom-kana/default.json       2016-08-13 08:21:47.733380728 +0900
@@ -232,9 +232,9 @@
             "zyo": ["", "じょ" ],
             "zyu": ["", "じゅ" ],
             "-": ["", "ー" ],
-            ":": ["", ":" ],
-            ";": ["", ";" ],
-            "?": ["", "?" ],
+            ":": ["", ":" ],
+            ";": ["", ";" ],
+            "?": ["", "?" ],
             "[": ["", "「" ],
             "]": ["", "」" ]
         }

これでより快適に生活できるようになった。

jwmでのタスクバーの時刻表示を24時間制にする

長らくopenmotif/motifのmwm (Motif Window Manager)をX11環境のWindow Managerとして使用していたのだが、 さすがに近代的なものに変えたいと考えていた。

sloppy focusであって欲しく、軽量なものを探していたところ、JWM ((Joe's Window Manager)がデフォルトでsloppy focusで、全画面表示を正しく扱える等の近代的なものであったので、 乗り換えることにした、

しかし、LANG=ja_JP.UTF-8なロケールである場合、12時間制で時刻が表示されているのが気になっていた。 以下のパッチのように~/.jwmrcを変更することで変更できた、


--- /usr/pkg/share/examples/jwm/system.jwmrc    2016-08-05 00:30:50.000000000 +0900
+++ .jwmrc      2016-07-14 00:08:47.813229150 +0900
@@ -58,7 +58,7 @@
         <TaskList maxwidth="256"/>

         <Dock/>
-        <Clock><Button mask="123">exec:xclock</Button></Clock>
+        <Clock format="%R"><Button mask="123">exec:xclock</Button></Clock>

     </Tray>


これで快適に生活できる。

Adobe Flash Playerのオフラインインストール

通常は、Adobe Flash Playerが必要になることは、Amazon Prime Musicのプライムラジオくらいしかない。その場合には、Google Chromeを使っている。

しかし、Mozilla FirefoxでAdobe Flash Playerが必要になり、かつAdobe Flash Playerの通常のブートストラップ型のインストーラーが必ず失敗する環境がある。 自動アップデートは成功するのだが、自動アップデートが必要な時に表示されないので、最新のAdobe Flash Playerを使い続けることができない。

結果として、FirefoxがAdobe Flash Playerが古くなったら、オフラインインストーラーで手動でインストールし直さないといけない。

オフラインインストーラーは、だんだんとAdobeのウェブサイトから入手しにくくなっているのだが、Windows 7用のものは、2016年7月2日現在では、Flash Player / Installation problems | Flash Player | Windows 7 and earlierの最下部にあるFlash Player for Firefox - NPAPIからダウンロードすれば良い。

早くAdobe Flash Playerを使わなくて良いようにならないかな…。

株式会社コスミックの腕時計のコマ調整

とある事情で、株式会社コスミックの4-TM116L-WH/G0という腕時計を購入した。 買ったお店の都合で、株式会社コスミックの時計サービスセンターに送らないと、バンドの長さ調整をしてもらえない。 調整には最長で2週間かかるらしい。

と言うことで、どのように調整できるのか試してみた。

結果から言うと、http://www.10keiya.com/site/tips/tips_sizing.htmlで解説されているもので言うと、ピンタイプで、割りピンが使われていた。

と言うことで、ハンマーと細い精密ドライバーを使って調整できた。

ストリーミングを録音する

某所のwmaファイルに書かれているURLで流れてくるストリーミング音声を録音する方法を書いておく。

ストリーミングにしていると言うことは、録音して欲しくないと考えていることは理解するのだが、常にネットワークにつながっている訳ではない事情から、仕方がないと思うことにする。

ダウンロードしたwmaファイルは、XMLファイルである。httpなURLが書かれているので、以下のように実行すれば良い。mplayerは、pkgsrc/multimedia/mplayerからインストールしておく。


$ mplayer 'http://example.com/example.wma?xxx' -dumpstream -dumpfile example.wma

STM32F4 DiscoveryでeCos 3.0を動かす

eCosはSTM32F4 DiscoveryというARM Cortex-M4の評価ボードで動く。 昨年の10月に試していて、無事に動作させることができたのだが、 きちんと再現できるように書いておかなかったので、再現に苦労してしまった。

NetBSD/amd64 7.99.29と7.0_STABLE (2016-05-06時点)で確認したが、別にNetBSDに限るものではないと思う。

ツールの導入

BinutilsとGCCの導入

pkgsrcより、pkgsrc/cross/arm-none-eabi-gcc5をmake installで導入すると、 Binutils 2.26とGCC 5.3.0が導入される。

依存するパッケージの導入

GUIツールであるconfigtoolとコマンドラインツールであるecosconfigは、 TclとTk、wxGTK28、wxGTK28-contribを必要としているので、 pkgsrcから以下をインストールしておく。

  • pkgsrc/lang/tcl
  • pkgsrc/x11/tk
  • pkgsrc/x11/wxGTK28
  • pkgsrc/x11/wxGTK28-contrib

eCosのソースツリーの取得

eCosのソースツリーは公式にはAnonymous CVSで取得できるが、 私は自分でGitリポジトリーに変換している。 ecosmasterブランチをデフォルトのブランチとして管理している。 以下のように取得しておく。


$ cd ~/rtos/ecos
$ git clone git@github.com:ryoon/eCos.git

依存するライブラリーの導入

cyginfraとlibcdlというライブラリーがeCosの一部として提供されている。 設定ツールが使用するので、用意しておく。


$ ~/rtos/ecos/eCos/host/infra/configure --prefix=/home/ryo_on/rtos/ecos/tools
$ gmake install
$ ~/rtos/ecos/eCos/host/libcdl/configure --prefix=/home/ryo_on/rtos/ecos/tools --with-infra=/home/ryo_on/rtos/ecos/tools --with-tcl=/usr/pkg --with-tcl-version=8.6
$ gmake install

eCosの設定ツールの導入 (コマンドライン)

コマンドラインの設定ツールであるecosconfigコマンドをビルドする。 Autotoolsを使っていないので、pkgsrc/devel/gmakeよりGNU Make 4.1を導入して、 gmakeコマンドを使わないといけない。

以下のようにmakefileを編集した上で、gmakeコマンドを実行する。


$ cat makefile
COMPILE := ../common/ecosconfig.cxx ../common/cdl_exec.cxx ../../common/common/build.cxx ../../common/common/flags.cxx
OBJECTS := $(COMPILE:.cxx=.o)
INCLUDE_PATH := -I../../common/common -I$(ECOS)/include -I$(TCL)/include
CXX := g++

ecosconfig: $(OBJECTS)
 $(CXX) $^ -L$(ECOS)/lib -L$(TCL)/lib -lcdl -lcyginfra -ltcl86 -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -o $@

%.o: %.cxx
 $(CXX) -c -g -O2 -I$(dir $<) $(INCLUDE_PATH) -o $@ $<

clean:
 rm ecosconfig $(OBJECTS)

$ gmake ECOS=/home/ryo_on/rtos/ecos/tools TCL=/usr/pkg
$ cp ecosconfig ~/rtos/ecos/tools/bin

eCosの設定ツールの導入 (GUI)

http://github.com/ryoon/eCos では、GUI設定ツールであるconfigtoolは、 中途半端にAutotools化してあるので、以下のようにインストールする。


$ ~/rtos/ecos/eCos/host/tools/configtool/standalone/wxwin/configure --prefix=/home/ryo_on/rtos/ecos/tools --with-wxconfig-path=/usr/pkg/bin/wx-config
$ gmake install

eCosのOS(ライブラリー)のビルド

eccファイルの用意

ecosconfigでベースとなるecos.eccを用意し、configtoolで編集し、メモリーマップをJTAGからROMに変更する。


$ mkdir ~/rtos/ecos/stm32f4d
$ cd ~/rtos/ecos/stm32f4d
$ ECOS_REPOSITORY=/home/ryo_on/rtos/ecos/eCos/packages ~/rtos/ecos/tools/bin/ecosconfig new stm32f4discovery
$ cd ~/rtos/ecos # ここで、cdしておかないとconfigtoolがsegfaultする。
$ ~/rtos/ecos/tools/bin/configtool &
; ~/rtos/ecos/stm32f4d/ecos.ecc を開く。
; CYG_HAL_STARTUPをJTAGからROMに変更する。
; ecos.eccを保存する。

ビルド用ツリーを生成し、OS (ライブラリー)をビルドする

makefile等を生成し、OSをビルドする。


$ cd ~/rtos/ecos/stm32f4d
$ ECOS_REPOSITORY=/home/ryo_on/rtos/ecos/eCos/packages ~/rtos/ecos/tools/bin/ecosconfig tree
$ gmake

これによって、~/rtos/ecos/stm32f4d/installに静的ライブラリーとヘッダーファイルが生成される。

アプリケーションをリンクしてOSのバイナリーを生成する

OSであるライブラリーをリンクしたELFバイナリーを生成し、 プレーンなbinary形式に変換する。 これがSTM32F4 Discoveryに書き込む対象になる。 今回ではa.binを書き込むこととなる。


$ cd ~/rtos/ecos/application
$ cat hello.c
#include <cyg/infra/diag.h>
int main(void)
{
        diag_printf("hello world\n");
        return 0;
}

$ /usr/pkg/cross-arm-none-eabi/bin/arm-none-eabi-gcc -g -I../stm32f4d/install/include -L../stm32f4d/install/lib -Ttarget.ld -nostdlib hello.c -O0 -mcpu=cortex-m3 -mthumb
$ /usr/pkg/cross-arm-none-eabi/bin/arm-none-eabi-objcopy -O binary a.out a.bin

バイナリーの書き込み

書き込みプログラムの準備

stlinkというツールで書き込むことにする。 OpenOCDでも書き込まれるが、今回は書き込みはstlinkで書き込むことにする。 pkgsrc/cross/stlinkをインストールすれば良い。

バイナリーの書き込み

以下のようにして、flashの0x0800000に書き込みする。 0x08000000は0x00000000にマッピングされるらしい。 つまり、0x00000000から実行されることとなる。


$ cd ~/rtos/ecos/application
$ st-flash write a.bin 0x08000000

実行と確認

診断用シリアルコンソールの接続

http://ecos.sourceware.org/ecos/boards/stm32f4discovery.htmlによると、 PC10ピンに診断用の出力がされるので、PC10ピンを3.3VのRXに接続する。 私は、秋月のTTL-232R-3V3のRXD (黄色)に接続した。 eCos for STM32F4 Discoveryでは、診断用シリアルコンソールは、 標準では115200 bpsになっているので、cu(1)で接続しておく。


$ cu -l /dev/ttyU0 -s 115200

OpenOCDのインストールと実行

pkgsrc/devel/openocdをインストールする。 これによって、電源供給をしているUSB mini Bケーブルを抜き挿ししなくてもプログラムを再実行できるようになる。


$ openocd -f /usr/pkg/share/openocd/scripts/board/stm32f4discovery.cfg
$ telnet localhost 4444
> reset init
> reset run
> reset run

このように実行することで、cu(1)の出力として、hello worldが表示される。

OLEDBのドライバーを列挙する

WindowsにおけるOLEDBの良い所は、ODBCのようにあらかじめODBCデータソースに登録しておく必要がないことだと思う。 しかし、事前に明示的に登録する作業がないせいで、OLEDBのドライバーがインストールされているかが分かりにくいように感じている。 PowerShellを使うとOLEDBドライバーを列挙できる。

> (New-Object data.oledb.oledbenumerator).getElements()

例えばOracle Provider for OLE DBがあるかは、OraOLEDB.Oracleがあるかで分かる。


SOURCES_NAME        : OraOLEDB.Oracle
SOURCES_PARSENAME   : {3F63C36E-51A3-11D2-BB7D-00C04FA30080}
SOURCES_DESCRIPTION : Oracle Provider for OLE DB
SOURCES_TYPE        : 1
SOURCES_ISPARENT    : False
SOURCES_CLSID       : {3F63C36E-51A3-11D2-BB7D-00C04FA30080}

ADO+OLEDBでTNSをJScriptから直接指定してOracle Databaseにアクセスする

WindowsにおけるOLEDBの良い所は、あらかじめODBCデータソースを設定しておかなくて良いというところだと思う。これは特に複数のクライアントPCにからデータベースにアクセスしなくてはいけない状況で、そのクライアントPCのユーザーがODBCのことを理解していない場合には、重要であると思う。ODBCデータソースに自動登録するスクリプトも書けるものだとは思うが。

しかし、Oracle Databaseにアクセスする場合には、インスタントクライアントのインストールが必要であるのは仕方がないとしても、tnsnames.oraを配置するのは面倒である。

ADOとOLEDBの組み合わせで、TNSの文字列をそのままサーバー名として与えることで、tnsnames.oraに追記する必要はないことが分かったので例を示しておく。

ADOをWindows Scripting Host (WSH)のJScriptから使った場合でまとめておく。


/*
 * テーブルをTSVファイルにダンプする
 * Copyright (c) 2016 Ryo ONODERA, All rights reserved.
 * License: 2-clause BSD
 */

var bTable = "table1";

// Define columns
var columns = ["column1", "column2", "column3", "column4", "column5", "column6", "column7", "column8", "column9", "column10", "column11", "column12"];

// Start
main();

// YYYYMMDDhhmm
function getNow()
{
 var date = new Date();
 //date = new Date(2016, 1, 3);
 var dateString = ("" + date.getFullYear()
  + ("0" + (date.getMonth() + 1)).slice(-2)
  + ("0" + (date.getDate())).slice(-2)
  + ("0" + (date.getHours())).slice(-2)
  + ("0" + (date.getMinutes())).slice(-2)
 );

 // debug
 //var Wsh = WScript.CreateObject("WScript.Shell");
 //Wsh.Popup(dateString);

 return dateString;
}

// Concatenate array with ", "
function concatColumns(columns, delimiter)
{
 var columnsString = "";
 for (var i = 0; i < columns.length - 1 ; i++) {
  columnsString = columnsString + columns[i] + delimiter + " ";
 }
 columnsString = columnsString + columns[columns.length - 1];

 return columnsString;
}

// Get CSV string
function getCsvLine(recordSet, delimiter)
{
 var csvLine = "";
 for (var i = 0; i < recordSet.Fields.Count - 1; i++) {
  csvLine = csvLine + recordSet.Fields(i) + delimiter + " ";
 }
 csvLine = csvLine + recordSet.Fields(recordSet.Fields.Count - 1);

 return csvLine;
}

// Main function
function main() {
 // For Popup
 var Wsh = WScript.CreateObject("WScript.Shell");
 
 var serverName = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = serviceName)))";
 var userName = "username";
 var password = "password";

 // Connect to Oracle DB
 var ADOConn = WScript.CreateObject("ADODB.Connection");
 ADOConn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=" + serverName + ";User ID=" + userName + ";Password=" + password + ";";
 ADOConn.Open();

 var SQLString = "select " + concatColumns(columns, ",") + " from " + bTable;
 //Wsh.Popup(SQLString);
 var rs = ADOConn.Execute(SQLString);

 // Popup debug
 //Wsh.Popup(rs(columns[0]) + rs(columns[1]));

 // Write CSV file
 var outputFileName = "D:\\tmp\\dump\\" + bTable + "-"+ getNow() + ".tsv";
 var fso = WScript.CreateObject("Scripting.FileSystemObject");
 var outputCsvFile = fso.CreateTextFile(outputFileName, true, true);
 outputCsvFile.WriteLine(concatColumns(columns, "\t"));
 while (!rs.EOF) {
  var rsLine = getCsvLine(rs, "\t");
  outputCsvFile.WriteLine(rsLine);
  rs.MoveNext();
 }

 // Finish notification
 //Wsh.Popup("Finished");
}

GXemul 0.6.0.1のエミュレートする環境

GXemul 0.6.0.1でエミュレートしているマシンの情報がGoogleで検索してもうまく出て来ないので、gxemul -Hの結果を掲載しておく。

改めて見てみると、知らないアーキテクチャーも含めて本当に多くをエミュレートしている。


Available template machines:

  testm88k      Experimental M88K machine.
  testmips      Experimental MIPS machine.

--------------------------------------------------------------------------

The following applies to the LEGACY modes only:

Available CPU types:

        Alpha:
            21064        21066        21164        21164A-2     
            21164PC      21264        21364        
        ARM:
            ARM3         ARM610       ARM610       ARM620       ARM700       
            ARM710       ARM710A      ARM720T      ARM740T4K    ARM740T8K    
            ARM7500      ARM7500FE    ARM810       ARM920T      ARM922T      
            ARM940T      ARM946ES     ARM966ES     ARM966ESR1   ARM1020E     
            ARM1022ES    ARM1026EJS   ARM1136JS    ARM1136JSR1  SA110        
            SA1100       SA1110       TI925T       IXP1200      80200        
            PXA210       PXA210A      PXA210B      PXA210C      PXA250       
            PXA250A      PXA250B      PXA250C      PXA27X       IXP425_255   
            IXP425_400   IXP425_533   80219_400    80219_600    80321_400    
            80321_400_B0 80321_600    80321_600_B0 80321_600_2  
        M88K:
            88100        88110        
        MIPS:
            R2000     R2000A    R3000     R3000A    R6000     R4000     
            R4000PC   R10000    R4200     R4300     R4100     VR4102    
            VR4181    VR4121    VR4122    VR4131    R4400     R4600     
            R4700     R4650     R8000     R12000    R14000    R5000     
            R5900     TX3920    TX7901    VR5432    RM5200    RM7000    
            RM7900    RM9000    RC32334   4Kc       4KEc      5Kc       
            5KE       BCM4710   BCM4712   AU1000    AU1500    AU1100    
            SB1       SR7100    Allegrex  
        PPC:
            PPC405GP  PPC601    PPC603    PPC603e   PPC604    PPC620    
            MPC7400   PPC750    G4e       PPC970    
        SH:
            SH7708R   SH7750    SH7750R   SH7751R   

Most of the CPU types are bogus, and not really implemented. The main effect of
selecting a specific CPU type is to choose what kind of 'id' it will have.

Available machine types (with aliases) and their subtypes:

        Algor evaluation board [MIPS] ("algor")
            - P4032 ("p4032")
            - P5064 ("p5064")
        Alpha [Alpha] ("alpha")
            - AlphaBook 1 ("alphabook1")
            - AlphaServer 4100 ("alphaserver4100")
            - DEC 3000/300 ("3000/300")
            - EB164 ("eb164")
        ARC [MIPS] ("arc")
            - Acer PICA-61 ("pica-61", "acer pica", "pica")
            - Jazz Magnum ("magnum", "jazz magnum")
        Artesyn's PM/PPC board [PPC] ("pmppc")
        CATS evaluation board [ARM] ("cats")
        Cobalt [MIPS] ("cobalt")
        DECstation/DECsystem [MIPS] ("decstation", "decsystem", "dec")
            - DECstation 3100 (PMAX) ("pmax", "3100", "2100")
            - DECstation 5000/200 (3MAX) ("3max", "5000/200")
            - DECstation 5000/1xx (3MIN) ("3min", "5000/1xx")
            - DECstation 5000 (3MAXPLUS) ("3maxplus", "3max+")
            - DECsystem 58x0 ("5800", "58x0")
            - DECsystem 5400 ("5400")
            - DECstation Maxine (5000) ("maxine")
            - DECsystem 5500 ("5500")
            - DECstation MipsMate (5100) ("5100", "mipsmate")
        Dreamcast [SH] ("dreamcast")
        Generic "bare" ARM machine [ARM] ("barearm")
        Generic "bare" M88K machine [M88K] ("barem88k")
        Generic "bare" MIPS machine [MIPS] ("baremips")
        Generic "bare" PPC machine [PPC] ("bareppc")
        Generic "bare" SH machine [SH] ("baresh")
        Handhelp ARM (HPCarm) [ARM] ("hpcarm")
            - Ipaq ("ipaq")
            - Jornada 720 ("jornada720")
            - Jornada 728 ("jornada728")
        Handhelp MIPS (HPCmips) [MIPS] ("hpcmips")
            - Casio Cassiopeia BE-300 ("be-300", "be300")
            - Casio Cassiopeia E-105 ("e-105", "e105")
            - Agenda VR3 ("agenda", "vr3")
            - IBM WorkPad Z50 ("workpad", "z50")
            - NEC MobilePro 770 ("mobilepro770")
            - NEC MobilePro 780 ("mobilepro780")
            - NEC MobilePro 800 ("mobilepro800")
            - NEC MobilePro 880 ("mobilepro880")
        Handhelp SH (HPCsh) [SH] ("hpcsh")
            - Jornada 680 ("jornada680")
            - Jornada 690 ("jornada690")
        Intel IQ80321 [ARM] ("iq80321")
        Iyonix [ARM] ("iyonix")
        Landisk [SH] ("landisk", "usl-5p")
        Macintosh [PPC] ("macppc")
            - MacPPC G3 ("g3")
            - MacPPC G4 ("g4")
            - MacPPC G5 ("g5")
        MIPS evaluation boards (evbmips) [MIPS] ("evbmips")
            - Malta ("malta")
            - Malta (Big-Endian) ("maltabe")
        MVME88K [M88K] ("mvme88k")
            - MVME187 ("mvme187old")
            - MVME188 ("mvme188")
            - MVME197 ("mvme197")
        MVMEPPC [PPC] ("mvmeppc")
            - MVME1600 ("mvme1600")
            - MVME2100 ("mvme2100")
            - MVME5500 ("mvme5500")
        NetWinder [ARM] ("netwinder")
        Playstation 2 [MIPS] ("playstation2", "ps2")
        PowerPC Reference Platform [PPC] ("prep")
            - IBM 6050/6070 ("ibm6050", "ibm6070")
            - MVME2400 ("mvme2400")
        QEMU MIPS [MIPS] ("qemu_mips")
        SGI [MIPS] ("silicon graphics", "sgi")
            - IP12 ("ip12")
            - IP19 ("ip19")
            - IP20 ("ip20")
            - IP22 ("ip22", "indy")
            - IP24 ("ip24")
            - IP27 ("ip27", "origin 200", "origin 2000")
            - IP28 ("ip28")
            - IP30 ("ip30", "octane")
            - IP32 ("ip32", "o2")
            - IP35 ("ip35")
        Test-machine for ARM [ARM] ("testarm")
        Test-machine for M88K [M88K] ("oldtestm88k")
        Test-machine for MIPS [MIPS] ("oldtestmips")
        Test-machine for PPC [PPC] ("testppc")
        Test-machine for SH [SH] ("testsh")

Most of the machine types are bogus too. Please read the GXemul documentation
for information about which machine types that actually work. Use the alias
when selecting a machine type or subtype, not the real name.


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

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