NetBSD上のpkgsrc/www/firefoxで、複数のオーディオデバイスを切り替えてみよう

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

はじめに

標準のpkgsrc/www/firefoxをNetBSDで使うときは、標準ではSun audio backendを使うことになります。 ですが、私はpkgsrc/audio/pulseaudioを使っています。 その場合には、複数のオーディオデバイスを簡単に選べるようにしました。 pulseaudio-13.0nb9以降を使ってください。 ちなみに、WebRTCのオーディオ入力デバイスの切り替えにも便利です。 ただし、Bluetooth A2DP再生の場合には対応できていません(pad(4)は認識させていないため)。

複数のオーディオデバイスがある場合とはどのような場合かと言うと、例えばUSBオーディオデバイスが存在する場合です。 私の場合には、USB接続のヘッドセットを接続すると2つ目のオーディオデバイスが発生します。

PulseAudioとFirefoxをビルドする

PulseAudioを使うには、以下のようにpkgsrc/www/firefoxをビルドすると良いでしょう。

# cd /usr/pkgsrc/www/firefox-l10n
# make PKG_OPTIONS.firefox=pulseaudio install

ちなみに、少なくとも最近のpkgsrc/www/firefoxでは、英語(en_US)ロケールであってもpkgsrc/www/firefox-l10nをインストールしておくことをお勧めします。

オーディオ出力デバイスの切り替え

これは、Firefoxではなく、PulseAudioの方で設定します。 pkgsrc/audio/pulseaudioに含まれているpactlコマンドを使い、以下のようにすると良いでしょう。 私のローカルpkgsrcツリーでは、pkgsrc/audio/pulseaudioは14.0になっているので、module.versionは14.0になっています。 ここでは、/dev/audio0とそれへのシンボリックリンクである/dev/audio、/dev/audio1の2系統が存在していることが分かります。

$ pactl list
(snip)
Module #6
        Name: module-oss
        Argument: mmap=0 device=/dev/audio
        Usage counter: n/a
        Properties:
                module.author = "Lennart Poettering"
                module.description = "OSS Sink/Source"
                module.version = "14.0"

Module #7
        Name: module-oss
        Argument: mmap=0 device=/dev/audio0
        Usage counter: n/a
        Properties:
                module.author = "Lennart Poettering"
                module.description = "OSS Sink/Source"
                module.version = "14.0"

Module #8
        Name: module-oss
        Argument: mmap=0 device=/dev/audio1
        Usage counter: n/a
        Properties:
                module.author = "Lennart Poettering"
                module.description = "OSS Sink/Source"
                module.version = "14.0"
(snip)

それでは、/dev/audio1で再生するように切り替えてみましょう。以下のように実行します。

$ pactl set-default-sink oss_output.audio1

これで、USB接続ヘッドセットの方から音が出るようになりました。

Firefoxでのオーディオ入力デバイスの切り替え

FirefoxのWebRTCのオーディオ入力デバイスは、WebRTCがオーディオ入力を要求する場合の選択肢が複数になるので、そこで選択できるようになります。 /dev/audio1を選択する場合のポップアップの例を下図に示します。

これで、Firefox関連で自由にオーディオ入出力を設定できると思います。

NetBSD上のMerkaartorでOpenStreetMapを編集してみる

これは、NetBSD Advent Calendar 2020の22日目の記事です。

はじめに

いつもOpenStreetMapにはお世話にあっていますが、最近はなかなか貢献できていません。 ですが、自宅の近所の道が間違っているのは気になっていました。 今回は、NetBSD環境からOpenStreetMapの地図を修正してみました。 もちろん、ウェブブラウザー上でiDで修正できるのは把握していますが、今回はpkgsrc/geography/merkaartorを使ってみました。

pkgsrc/geography/merkaartorのインストール

pkgsrc/geography/merkaartorは、pkgsrc/x11/qt5-qtwebkitなど大きめのパッケージに依存しており、 一からビルドするには重量級のパッケージです。 ふじわらさんの14日目の記事を参考に、 バイナリーパッケージを使った方が良いかもしれません。

以下では、私の好みで全てソースコードからビルドする方法を示しておきます。

# cd /usr/pkgsrc/geography/merkaartor
# make install

pkgsrc/geography/merkaartorを起動させてみる

目的の場所をMerkaartorで開くには、www.openstreetmap.orgで目的の場所を開いて、そのURLをDownload時に指定すると簡単なようです。 下図では、東京の秋葉原駅付近の部分 https://www.openstreetmap.org/#map=18/35.69935/139.77226 を指定する画面です。

pkgsrc/geography/merkaartorで編集してみる

不足している歩行者専用の通路を追加してみました。 しばらく修正していないので、思い出すのには時間がかかりましたが、問題なく追加し、www.openstreetmap.orgにアップロードできました。

NetBSDでNode-REDを使ってみる

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

はじめに

IoT関係でのローコードプラットフォームとしてNode-REDというのがあります。 我が家にはIoTデバイスはないのですが、ウェブブラウザーでプログラミングできるというのは、いつでも面白いコンセプトです。 うまく行った例を私は知りませんが…。 今回はNetBSDでNode-REDを使ってみました。

Node-REDをインストールする

Node-REDは、Node.jsで書かれたプラットフォームです。 pkgsrcはNode.jsのパッケージを扱う定番のやり方を確立できていないので、pkgsrcのパッケージにはなっていません。 Node.jsとnpmはpkgsrcパッケージになっています。 以下のようにインストールして行きましょう。

# cd /usr/pkgsrc/lang/nodejs
# make install
# cd /usr/pkgsrc/lang/npm
# make install

ここまでで、Node.jsとnpmはインストールできました。 次にNode-REDをインストールします。

$ mkdir ~/nodered
$ cd ~/nodered
$ npm install --unsafe-perm node-red

これで、Node-REDをインストールできました。 次に起動させてみましょう。

$ cd ~/nodered
$ ./node_modules/.bin/node-red

ローカルホストのFirefoxで、http://localhost:1880/ を開くと、Node-REDの画面を開くことができます。 これは、http://localhost:1880/testにGETを発行すると、ステータスコード201を返すプログラムになっています。 Deployボタンを押して、実行してみましょう 。

$ telnet localhost 1880
Trying ::1...
telnet: Connect to address ::1: : Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test

HTTP/1.1 201 Created
X-Powered-By: Express
Access-Control-Allow-Origin: *
X-Content-Type-Options: nosniff
Content-Type: application/json; charset=utf-8
Content-Length: 2
ETag: W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
Date: Wed, 23 Dec 2020 10:48:59 GMT
Connection: close

{}Connection closed by foreign host.

Node-REDの一部の機能しか試していませんが、NetBSDでもNode-REDを実行し開発することは可能なようです。

NetBSDからumidi(4)機器としてAndroidスマートフォンを使ってみる

これは、NetBSD Advent Calendar 2020の21日目の記事です。

はじめに

Androidスマートフォンで、USB接続するとumidi(4)として認識される機能のあるものがあります。 これはどういう動作をするのか気になっていました。 今回は、この機能がMIDI入力とMIDI出力の両方として利用できるものだと分かったので、NetBSDから使ってみたいと思います。

Androidスマートフォンの準備

今回使ったAndroidスマートフォンは、Sony Xperia XZというAndroid 8の搭載された端末です。 普段は、自宅内のAsteriskの内線子機として使っている端末です。 これをUSBケーブルで、NetBSD端末につなげると、MIDIデバイスになるための接続を選択する画面が表示されます。 MIDIデバイスになる項目を選択しましょう。

どうやら、Androidスマートフォン単体ではMIDIデバイスにはなれないようです。 今回は、MIDIインプット機器とMIDIアウトプット機器のいずれにもなれる Dreamhound Studios製のMIDI Keyboardというアプリを 利用することにします。

このMIDI Keyboardアプリを起動させると、画面左上にMIDIメニューが表示されています。そこではInpiutとOutputについて、それぞれ指定できます。 標準ではいずれも(none)になっています。つまり、NetBSDとMIDI通信をすることができません。 これをいずれも「Android USB周辺機器ポート」に切り替えておきます。

NetBSDで録音・再生する

NetBSDには、midiplay(1)とmidirecord(1)というコマンドが標準で用意されており、それぞれMIDIファイルの再生、MIDIファイルへの録音ができます。 まずは、当該部分のdmesgを確認してみましょう。umidi1として認識されていることが分かりました。

umidi0 at uhub5 port 1 configuration 1 interface 1
umidi0: Sony (0x0fce) F8332 (0xc1e7), rev 2.00/3.18, addr 10
umidi0: (genuine USB-MIDI)
umidi0: out=1, in=1
midi1 at umidi0: <0 >0 on umidi0

以下のように実行した上で、MIDI Keyboardアプリの表示するキーボードで演奏してみます。 -d 1で、midi1を使うことを指定しています。

$ midirecord -d 1 test.mid

こうやって録音した演奏を以下のように再生してみます。 -d 1はmidirecordの場合と同様な意味です。

$ midiplay -d 1 test.mid

今回は、ピアノ音のみを扱うアプリでしたが、他の音源を扱えるアプリがあるかもしれませんので、探して試してみたいと思います。

最新のBitVisorをNetBSDでビルドし、最新のBitVisor上でNetBSD/amd64-currentを動かしてみる

これは、NetBSD Advent Calendar 2020の19日目の記事です。

はじめに

2018年にBitVisorをNetBSD上でビルドし、その上でNetBSD/amd64-currentを動かす話を 書いていました。 最新版のBitVisorがNetBSDでビルドできるか、NetBSDが動くか確認してみました。

BitVisorをビルドする

最新のBitVisorのソースコードは、sourceforge.netにあります。 hgを使っていて、BitBucketがhgサポートを終了してしまったので、sourceforge.netに移行されたようです。 以下のようにソースコードを入手します。

$ hg clone http://hg.code.sf.net/p/bitvisor/code bitvisor-code

ビルドには、mingw-w64のツールチェインが必要です。pkgsrc/cross/mingw-w64-x86_64-gccを利用すれば良いでしょう。 以下のようにインストールしておきます。 GNU make (gmake)も必要ですので、インストールしておきます。

$ cd /usr/pkgsrc/cross/mingw-w64-x86_64-gcc
$ make install
$ cd /usr/pkgsrc/devel/gmake
$ make install

/usr/pkg/cross/x86_64-w64-mingw32以下にx86_64のmingw-w64ツールチェインがインストールされます。

以下のように実行すれば、UEFIブートできるBitVisorがビルドできます。

$ cd bitvisor-code
$ PATH=/usr/pkg/cross/x86_64-w64-mingw32/bin:$PATH gmake -C boot/uefi-loader

インストールはUSBスティックに行なうことにします。 以下のように実行すれば良いでしょう。

# gpt destroy sd0
# gpt create sd0
# gpt add -t efi -s 200m sd0
# newfs_msdos /dev/rdk5
# mount_msdos /dev/dk5 /mnt
# mkdir -p /mnt/EFI/boot
# cp bitvisor-code/boot/uefi-loader/bsdriver.efi /mnt/EFI/boot
# cp bitvisor-code/boot/uefi-loader/loadvmm.efi /mnt/EFI/boot/bootx64.efi
# umount /mnt

作成したUSBスティックをNetBSD/amd64をUEFIインストールしてあるPCに挿してUSBスティックから起動すれば、 無事にBitVisor上でNetBSD/amd64 9.99.77を起動させることができました。

Super UEFIinSecureBoot Diskを使って、Secure Bootが有効化されたPCでNetBSD/amd64を起動させてみる

これは、NetBSD Advent Calendar 2020の15日目の記事です。

はじめに

UEFIな環境のPCでNetBSD/amd64を起動させる場合には、Secure Bootを無効にするようにBIOS設定画面で設定しておく必要があります。 ですが、Secure Bootを無効にしないで起動する方法はないかと思っていました。 GitHUb.comを見ていると、Super UEFIinSecureBoot Diskというのを 見つけました。 Red Hat社がFedore Linux用に用意しているSecure Bootに対応したブートローダーを利用した仕組みのようです。 既にSecure Boot無効な状態でインストール済みのPCで、Secure Bootを有効にし、起動できることを確認しました。 試したPCは、Dell XPS 13 9300です。

Super UEFIinSecureBoot Diskを入手する

現在のSuper UEFIinSecureBoot Diskのバージョンは3のようです。 https://github.com/ValdikSS/Super-UEFIinSecureBoot-Disk/releases/tag/3から、 Super-UEFIinSecureBoot-Disk_v3.zipファイルをダウンロードしました。 ですが、Super-UEFIinSecureBoot-Disk_minimal_v3.zipファイルでも問題ないかと思います。 以下のようにUSBスティックに書き込んでおきます。

$ unzip Super-UEFIinSecureBoot-Disk_v3.zip
Archive:  Super-UEFIinSecureBoot-Disk_v3.zip
 extracting: Super-UEFIinSecureBoot-Disk.img
# dd if=Super-UEFIinSecureBoot-Disk.img of=/dev/sd0d

ここで再起動し、BIOS設定画面に入り、Secure Bootを有効にしておきました。

このままNetBSD/amd64を起動させると、以下のようなエラーメッセージで起動できませんでした。 Secure Bootが有効になっていることが分かります。

Operating System Loader has no signature. Imcompatible with SecureBoot.

USBスティックから起動させます。 初回は、hashとkeyを登録するように求められますので、促されるようにインストールしておきます。

ブートセレクターが表示されたら、cを入力してコマンド入力画面に切り替えます。 その上で以下のように実行することで、NetBSD/amd64のブートローダーを起動でき、NetBSDを起動できました。

> insmod fat
> chainloader (hd1,gpt1)/efi/boot/bootx64.efi
> boot

NetBSD/alpha 9.99.77をqemu-system-alphaで動かしてみる

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

はじめに

NetBSD/alpha on qemu-system-alphaというport-alphaメーリングリスト への投稿を見て以来、qemuでNetBSD/alphaを動かしてみたいと思っていました。 Jason Thorpeさんありがとうございます。

furandon_pigさんの10日目の記事にもAnitaでもqemuで動くalphaの表示がされていました。 Anitaを使えば簡単なのだと思うのですが、手作業でqemu-system-alphaでNetBSD/alpha-currentをセットアップしてみました。 qemuは、pkgsrc/emulators/qemu-5.1.0nb10を使います。

インストール方法

インストール用のメモリーディスクを内蔵したカーネルを起動することで、sysinst(8)でインストールすることにします。 以下のように実行することで、インストール可能です。 base.tgzなどは、http経由でnycdn.NetBSD.orgからフェッチして利用することにします。

$ qemu-img create -f qcow2 netbsd-10.qcow2 3G # 3GBのqcow2ディスクイメージを作成します。
$ ftp http://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/202012121510Z/alpha/installation/instkernel/netbsd.gz # インストール用カーネルを取得します。
$ unzip netbsd.gz
$ qemu-system-alpha -kernel netbsd -hda netbsd-10.qcow2

これにより、qemuのuser networkが利用されます。ネットワークインターフェイスはwm0になります。 後は、普通にsysinst(8)でwd0に割り当てられたハードディスクイメージにインストールします。 私が引っ掛かったのは以下の2点でした。

  • dhcpcd(8)でにIPアドレスをwm(4)に割り当てるのが自動的にはされませんでした。シェルに移行して、dhcpcd wm0を 事前に実行しておく必要がありました。
  • そもそもインストール用カーネルがあるのに気付きていませんでした(上の手順には反映済みです)。

インストール後の起動方法

インストール後にqemuを起動させる際に、ルートファイルシステムを指定しておく必要がありました。 以下のように起動するのが良いでしょう。

$ ftp http://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/202012121510Z/alpha/binary/kernel/netbsd-GENERIC.gz
$ gunzip netbsd-GENERIC.gz
$ qemu-system-alpha -kernel netbsd-GENERIC -hda netbsd-10.qcow2 -append 'root=wd0a'

最後にdmesgを掲載しておきます。

consinit: not using prom console
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
    2018, 2019, 2020 The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 9.99.77 (GENERIC) #0: Sat Dec 12 15:06:11 UTC 2020
	mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/alpha/compile/GENERIC
6600 family, unknown model variation 0x1400, 250MHz, s/n QEMU
8192 byte page size, 1 processor.
total memory = 128 MB
(120 KB reserved for PROM, 127 MB used by NetBSD)
avail memory = 113 MB
entropy: no seed from bootloader
timecounter: Timecounters tick every 0.976 msec
Kernelized RAIDframe activated
mainbus0 (root)
cpu0 at mainbus0: ID 0 (primary), 21264A-0 (EV67)
cpu0: Architecture extensions: 0x1307<PMI,PAT,MVI,CIX,FIX,BWX>
qemu0 at mainbus0: Qemu virtual machine services
timecounter: Timecounter "Qemu" frequency 1000000000 Hz quality 3000
tsc0 at mainbus0: 21272 Core Logic Chipset, Cchip rev 0
tsc0: 2 Dchips, 1 memory bus of 16 bytes
tsc0: arrays present: 0MB, 0MB, 0MB, 0MB, Dchip 0 rev 0
tsp0 at tsc0
tsp0: window 0: 0/base 0/mask 0 reinitialized
tsp0: window 1: 0/base 0/mask 0 reinitialized
pci0 at tsp0 bus 0
pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok
vga0 at pci0 dev 1 function 0: Cirrus Logic CL-GD5446 (rev. 0x00)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation)
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
wm0 at pci0 dev 2 function 0: Intel i82540EM 1000BASE-T Ethernet (rev. 0x03)
wm0: interrupting at dec 6600 irq 12
wm0: 32-bit 33MHz PCI bus
wm0: 64 words (6 address bits) MicroWire EEPROM
wm0: Ethernet address 52:54:00:12:34:56
wm0: 0x200402<LOCK_EECD,IOH_VALID,WOL>
makphy0 at wm0 phy 1: Marvell 88E1011 Gigabit PHY, rev. 0
makphy0: Failed to access EADR. Are you an emulator?
makphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
cmdide0 at pci0 dev 3 function 0: CMD Technology PCI0646 (rev. 0x07)
cmdide0: bus-master DMA support present
cmdide0: primary channel configured to native-PCI mode, channel non-independant
cmdide0: using dec 6600 irq 16 for native-PCI interrupt
atabus0 at cmdide0 channel 0
cmdide0: secondary channel configured to native-PCI mode, channel non-independant
cmdide0: secondary channel ignored (disabled)
sio0 at pci0 dev 7 function 0: Intel 82378ZB System I/O (rev. 0x03)
isa0 at sio0
com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, 1-byte FIFO
com1 at isa0 port 0x2f8-0x2ff irq 3: ns16550a, 1-byte FIFO
pckbc0 at isa0 port 0x60-0x64
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pms0 at pckbc0 (aux slot)
pckbc0: using irq 12 for aux slot
wsmouse0 at pms0 mux 0
attimer0 at isa0 port 0x40-0x43
fdc0 at isa0 port 0x3f0-0x3f7 irq 6 drq 2
mcclock0 at isa0 port 0x70-0x71: mc146818 compatible time-of-day clock
tsciic0 at tsc0
iic0 at tsciic0: I2C bus
entropy: WARNING: extracting entropy too early
Using the Qemu CPU alarm for 50 Hz hardclock.
timecounter: Timecounter "clockinterrupt" frequency 50 Hz quality 0
aes: BearSSL aes_ct
chacha: Portable C ChaCha
adiantum: self-test passed
aes_ccm: self-test passed
blake2s: self-test passed
fd0 at fdc0 drive 0: 1.44MB, 80 cyl, 2 head, 18 sec
fd1 at fdc0 drive 1: 1.44MB, 80 cyl, 2 head, 18 sec
wd0 at atabus0 drive 0
wd0: <QEMU HARDDISK>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 3072 MB, 6241 cyl, 16 head, 63 sec, 512 bytes/sect x 6291456 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(cmdide0:0:0): using PIO mode 4, Ultra-DMA mode 2 (Ultra/33) (using DMA)
cgd: self-test aes-xts-256
cgd: self-test aes-xts-512
cgd: self-test aes-cbc-128
cgd: self-test aes-cbc-256
cgd: self-test 3des-cbc-192
cgd: self-test blowfish-cbc-448
cgd: self-test aes-cbc-128 (encblkno8)
cgd: self-tests passed
root on wd0a dumps on wd0b
root file system type: ffs
kern.module.path=/stand/alpha/9.99.77/modules
entropy: WARNING: consolidating less than full entropy

NetBSDでdevpubd(8)を使ってみる

これは、NetBSD Advent Calendar 2020の12日目の記事です。

はじめに

USB接続のEthernetアダプター(cdce(4))を使っています。 これをUSBレセプタクルに挿した時に、自動的にIPv6のユニークローカルアドレスを割り当ててくれると大変助かると考えていました。 どうやら、devpubd(8)というデーモンを使うと、うまく行くのかもしれないと考えて試してみました。

devpubd(8)を実行してみる

devpubd(8)をフォアグラウンドで動かしてみて、cdce(4) USB Ethernetアダプターを挿した際にどのように動作するのか確認してみましょう。

# devpubd -f
devpubd_eventloop: event='device-attach', device='uhub4'
devpubd_eventloop: event='device-attach', device='uhub5'
devpubd_eventloop: event='device-attach', device='cdce0'

これで、イベントはdevice-attachで、 デバイスはcdce0であることが分かりました。

devpubd(8)が実行するスクリプトを用意する

devpubd(8)には 1つ目のcdce(4)であるcdce0が認識された時にだけ実行して欲しいので、 以下のようなスクリプトを/libexec/devpubd-hooks/03-cdce-ipv6 に置くことにしました。

#!/bin/sh
#
# $NetBSD$
#
# Assign IPv6 address for local connection when cdce0 is detected.
#

event="$1"
shift
devices=$@

for device in $devices; do
	case $device in
	cdce0)
		case $event in
		device-attach)
			ifconfig $device inet6 fd00:5100::1/64 
			;;
		device-detach)
			;;
		esac
		;;
	esac
done

これで、cdce(4)デバイスを最初に挿した際に自動的に設定がされて非常に便利になりました。

NetBSDでJupyter Notebookを使ってみる

これは、NetBSD Advent Calendar 2020の11日目の記事です。

はじめに

Jupyter Notebookを利用するのは、NetBSDに限定された話ではありませんが、実施に利用している話を私は聞いたことがありませんでした。 おそらくGPUを利用した機械学習などはサポートされていないと思いますが、基本的な機能を利用しているので、それについて書きたいと思います。

Jupyter Notebookをインストールする

Jupyter Notebookは、pkgsrc/www/py-notebookとしてpkgsrcのパッケージになっています。ちょっと分かりにくい名前です。 以下のようにインストールします。 ウェブインターフェイスを利用しますので、pkgsrc/www/firefoxもインストールしておきます。

# cd /usr/pkgsrc/www/py-notebook
# make install
# cd /usr/pkgsrc/www/firefox-l10n
# make install

併用するパッケージも追加でインストールする

私は、数式処理とグラフの表示をしたいので、 pkgsrc/math/py-sympyと pkgsrc/graphics/py-matplotlibを追加でインストールしました。 以下のようにインストールします。

# cd /usr/pkgsrc/math/py-sympy
# make install
# cd /usr/pkgsrc/graphics/py-matplotlib
# make install

Jupyter Notebookを起動してみる

pkgsrcのPythonモジュールのパッケージは、各バージョンのPython毎にインストールされるようになっています。 ですので、標準的にはjupyter-notebook-3.8のように3.8の部分に利用するPythonのバージョン が追加されたコマンドとしてインストールされます。

ですので、一般的なJupyter Notebookの起動コマンドでは起動できません。 以下のようになってしまいます。

$ jupyter notebook
sh: jupyter: not found

正解は、利用するPythonのバージョンを付けて、以下のように起動します。

$ jupyter-3.8 notebook-3.8

あるいは、以下のように起動しても良いでしょう。

$ jupyter-notebook-3.8

いずれの方法でもhttp://localhost:8888/ のウェブインターフェイス画面が自動的にFirefoxで開かれます。

NetBSDでネットワークスキャナーを使ってみる

これは、NetBSD Advent Calendar 2020の9日目の記事です。

はじめに

IPP Everywhereに対応したEPSON EW-M752Tというカラーインクジェットプリンターと書いていましたが、 正確にはスキャナー機能もついた複合機です。 このスキャナー機能も、独自のスキャナーデバイスドライバーを利用せずにApple AirScanやWSDという仕組みでスキャンできるようです。 今回は、pkgsrc/graphics/sane-airscanを使ってスキャンしてみます。

pkgsrc/graphics/sane-airscanをインストールする

以下のようにインストールします。 sane-airscanは、SANE (pkgsrc/graphics/sane-backends)というUnix-like OSで一般的なスキャナーを扱う仕組みのバックエンドです。

# cd /usr/pkgsrc/graphics/sane-airscan
# make install

スキャナーを認識させる

scanimageコマンドでスキャナーを一覧表示させることができます。 以下のように認識されました。 avahiデーモンも起動しておく必要があります。

# /etc/rc.d/avahidaemon start
$ scanimage -L
device `epson2:net:10.81.0.149' is a Epson PID flatbed scanner
device `airscan:e1:EPSON EW-M752T Series' is a eSCL EPSON EW-M752T Series ip=10.81.0.149

airscanというのが今回利用しようとしているデバイスです。これで利用できるオプションも調べておきましょう。

$ scanimage --help -d airscan
Usage: scanimage [OPTION]...

Start image acquisition on a scanner device and write image data to
standard output.

Parameters are separated by a blank from single-character options (e.g.
-d epson) and by a "=" from multi-character options (e.g. --device-name=epson).
-d, --device-name=DEVICE   use a given scanner device (e.g. hp:/dev/scanner)
    --format=pnm|tiff|png|jpeg  file format of output file
-i, --icc-profile=PROFILE  include this ICC profile into TIFF file
-L, --list-devices         show available scanner devices
-f, --formatted-device-list=FORMAT similar to -L, but the FORMAT of the output
                           can be specified: %d (device name), %v (vendor),
                           %m (model), %t (type), %i (index number), and
                           %n (newline)
-b, --batch[=FORMAT]       working in batch mode, FORMAT is `out%d.pnm' `out%d.tif'
                           `out%d.png' or `out%d.jpg' by default depending on --format
                           This option is incompatible with --output-file.    --batch-start=#        page number to start naming files with
    --batch-count=#        how many pages to scan in batch mode
    --batch-increment=#    increase page number in filename by #
    --batch-double         increment page number by two, same as
                           --batch-increment=2
    --batch-print          print image filenames to stdout
    --batch-prompt         ask for pressing a key before scanning a page
    --accept-md5-only      only accept authorization requests using md5
-p, --progress             print progress messages
-o, --output-file=PATH     save output to the given file instead of stdout.
                           This option is incompatible with --batch.
-n, --dont-scan            only set options, don't actually scan
-T, --test                 test backend thoroughly
-A, --all-options          list all available backend options
-h, --help                 display this help message and exit
-v, --verbose              give even more status messages
-B, --buffer-size=#        change input buffer size (in kB, default 32)
-V, --version              print version information

Options specific to device `airscan':
  Standard:
    --resolution 100|200|300|600|1200dpi [300]
        Sets the resolution of the scanned image.
    --mode Color|Gray [Color]
        Selects the scan mode (e.g., lineart, monochrome, or color).
    --source Flatbed [Flatbed]
        Selects the scan source (such as a document-feeder).
  Geometry:
    -l 0..215.9mm [0]
        Top-left x position of scan area.
    -t 0..297.18mm [0]
        Top-left y position of scan area.
    -x 0..215.9mm [215.9]
        Width of scan-area.
    -y 0..297.18mm [297.18]
        Height of scan-area.
  Enhancement:
    --brightness -100..100% (in steps of 1) [0]
        Controls the brightness of the acquired image.
    --contrast -100..100% (in steps of 1) [0]
        Controls the contrast of the acquired image.
    --shadow 0..100% (in steps of 1) [0]
        Selects what radiance level should be considered "black".
    --highlight 0..100% (in steps of 1) [100]
        Selects what radiance level should be considered "white".
    --analog-gamma 0.0999908..4 [1]
        Analog gamma-correction
    --negative[=(yes|no)] [no]
        Swap black and white

Type ``scanimage --help -d DEVICE'' to get list of all options for DEVICE.

List of available devices:
    epson2:net:10.81.0.149 airscan:e1:EPSON EW-M752T Series

特に、スキャンモードはカラーがグレースケールしかないので注意してください。

スキャンしてみる

TIFFファイルにカラーでスキャンしてみるには、以下のようにします。

$ scanimage --format=tiff -d airscan --mode Color > color-scanned.tiff

TIFFファイルにグレースケールでスキャンしてみるには、以下のようにします。

$ scanimage --format=tiff -d airscan --mode Gray > grayscale-scanned.tiff

スキャンした画像も、素直な感じなので常用できそうです。

NetBSDからcups経由で印刷する (3/3)

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

はじめに

PDFファイル出力をする仮想プリンター、PostScriptプリンターをcupsから使う方法を 説明して来ました。 今日は、IPP Everwhere対応のEPSON EW-M752Tというカラーインクジェットプリンターを へ印刷してみたいと思います。

IPP Everywhereとは

IPP Everywhereとは、スマートフォンから印刷するために用意されている仕組みである ようです。 独自のプリンタードライバーなしで印刷できる仕組みです。 長年GhostScriptが対応していないと、NetBSDから印刷できず苦労して来た訳です。 独自のプリンタードライバーなしにできるのだったら、もっと早く対応して欲しかったと 思わないではいられません…。 共通フォーマットの画像ファイルをHTTPベースのプロトコルで送って印刷するようです。

CUPSは、IPP Everwhereの対応を内蔵しています。 ですので、このシリーズの初日の記事 に加えてインストールする必要はありません。 ちなみに、今回利用している環境では、cups-baseのavahiオプションは有効にしていません。

Bonjourを利用するか、ippのURIを直接指定するか

mdnsdを起動させていれば、IPP Everywhere対応のプリンターは自動的に認識され、アプリケーションの印刷指示画面 に表示されます。 しかし、今回試した範囲では、うまくプリンターが準備完了状態と認識されませんでした。 ですので、ipp://で始まるURIを直接指定してプリンターを手動で追加することにしました。

IPP EverywhereのプリンターのURIを調べる

mdnsdを起動させた上で、ippfindを実行することで、IPP Everywhere対応のプリンターのURIに近いものを 表示させることができます。今回は、ipp://EPSON5D53C1.local:631/ipp/printという結果が得られました。 しかし、このままのEPSON5D53C1.localと言うホスト名では参照できませんので、IPアドレスまたは名前解決できるホスト名に 読み替えておきます。 今回は、LAN内でDDNS設定がされている環境なので、ipp://EPSON5D53C1.elements.tetera.org:631/ipp/print と読み替えました。 /ipp/printの部分を把握するのが肝心ですから、 pkgsrc/sysutils/avahiをインストールし、avahidaemonを起動した上で、avahi-browse -r -aを実行して確認するのでも良いかもしれません。 rp=ipp/printの部分を見れば良いようです。

# /etc/rc.d/mdnsd onestart
$ ippfind
ipp://EPSON5D53C1.local:631/ipp/print
# /etc/rc.d/avahidaemon onestart
$ avahi-browse -r -a
=  cdce0 IPv4 EPSON EW-M752T Series                         _ipp._tcp
 local
   hostname = [EPSON5D53C1.local]
   address = [10.81.0.149]
   port = [631]
l=http://EPSON5D53C1.local.:80/PRESENTATION/BONJOUR" "priority=30" "mopria-certified=2.0" "URF=CP1,PQ4-5,OB9,OFU0,RS360,SRGB24,W8,DM3,IS1-18,V1.4,MT1-3-5-8-11-12" "PaperMax=legal-A4" "kind=document,envelope,label,photo,postcard" "Fax=F" "Scan=T" "Duplex=T" "Color=T" "qtotal=1" "rp=ipp/print" "pdl=application/octet-stream,image/pwg-raster,image/urf,image/jpeg,application/vnd.epson.escpr" "product=(EPSON EW-M752T Series)" "usb_MDL=EW-M752T Series" "usb_MFG=EPSON" "ty=EPSON EW-M752T Series" "txtvers=1"]

プリンターを追加する

以下のような手順で、プリンターを追加して行きます。

http://localhost:631/ を開き、Administrationリンクから管理画面を開きます。Add Printerボタンをクリックします。

INternet Pronting Protocol (ipp)のラジオボタンを選択し、Continueボタンをクリックします。

Connection欄にさきほど求めておいたURIを入力します。今回は、ipp://EPSON5D53C1.elements.tetera.org:631/ipp/printです。その上でContinueボタンをクリックします。

Name、Description、Locationを入力します。

MakeとしてEPSONを選択し、Continueボタンをクリックします。

ModelとしてIPP Everywhereを選択しAdd Printerボタンをクリックします。

オプションは提案されたままにしました。Set Default Optionsボタンをクリックします。

これでプリンターを追加できました。

印刷してみる

今回は、pkgsrc/www/firefoxから印刷してみました。 無事にカラー印刷できました。

おわりに

これで、PDFファイル出力の仮想プリンター、PostScriptプリンター、 IPP Everwhere対応のプリンターをCUPSから使えるプリンターとして登録することが できました。 IPP Everwhereに対応できたことで、NetBSDから年賀状を印刷することもできそうです。

NetBSDからcups経由で印刷する (2/3)

これは、NetBSD Advent Calendar 2020の4日目の記事です。

はじめに

昨日は PDFファイルを生成する仮想プリンターを使えるようにしました。 今日は、同じcups環境で、Lexmark MS314dnというモノクロPostScriptレーザープリンターを 使えるようにしていきます。

cupsのインストールは、昨日で完了していますので、引き続き設定していきます。 追加でインストールするパッケージはありません。

プリンターを追加する

以下のような手順でプリンターを追加していきます。

http://localhost:631/ をcupsdの起動しているのと同じホストのpkgsrc/www/firefoxで開き、Administrationリンクをクリックした上で、Find New Printersボタンをクリックします。

Lexmark MS310dnであることを確認した上で、Add This Printerボタンをクリックします。

設定を変更する必要はないので、Continueボタンをクリックします。Localtionは変えておいた方が良かったかもしれませんが…。

MakeとしてGenericを選択して、Continueボタンをクリックします。 PPDファイルがLexmarkから提供されていますが、バージョン1.2も1.4も今回の環境では利用できません。

Modelとして、Generic PostScript Printerを選択し、Add Printerボタンをクリックします。

既定値を設定しておきます。変更する必要はないでしょう。

これでプリンターを追加できました。

印刷してみる

今回はpkgsrc/misc/libreofficeのlowriterから印刷してみました。

エラーになる場合には、印刷時のlowriterの用紙サイズがプリンターにセットされている用紙 サイズと一致していることを確認すると良いかもしれません。

NetBSDからcups経由で印刷する (1/3)

これは、NetBSD Advent Calendar 2020の3日目の記事です。

はじめに

2017年に購入したLexmark MS314dnというPostScriptプリンターがあります。 NetBSDでは、これまではlpd(8)とlp(1)を使って印刷して来ました。 また、最近、IPP Everywhereに対応したエプソンEW-M752Tも購入しました。

ですが、さすがに最近はcups経由で印刷するものだと思います。 ここから3回に分けて、cupsをNetBSDで使って印刷する記事を書きたいと思います。

今回は、まずはcups経由で印刷してPDFファイルを生成する仮想プリンターを使ってみます。 ただし、LibreOfficeもFirefoxもPDFファイルを生成する機能はありますので、 あまり有用ではないかもしれません。

必要なパッケージをインストールする

cupsの設定は、http://localhost:631/ にアクセスして実施します。 その前に、以下を実施しておく必要があります。

  • pkgsrc/print/cups-baseをインストールします。このパッケージにcupsdデーモンであるcupsdが含まれています。
  • pkgsrc/print/cups-filtersをインストールします。これにより、PostScriptファイルを入力ファイルとすることができます。
  • pkgsrc/print/cups-pdfをインストールします。これにPDFファイルを出力する仮想プリンターが含まれています。
  • cupsdを起動させます。

pkgsrc/print/cups-baseをインストールする

まずは、pkgsrc/print/cups-baseをインストールし、rcスクリプトも 配置します。 以下のように実行すれば良いでしょう。

# cd /usr/pkgsrc/print/cups-base
# make install
# cp /usr/pkg/share/examples/rc.d/cupsd /etc/rc.d

その上で、cupsデーモンをブート時に起動するように設定します。

# vi /etc.rc.conf
(略)
cupsd=YES
(略)

pkgsrc/print/cups-filtersをインストールする

以下のように実行すればインストールできます。 特に設定はないようです。

# cd /usr/pkgsrc/print/cups-filters
# make install 

pkgsrc/print/cups-pdfをインストールする

以下のように実行すればインストールできます。 cups-pdf-3.0.1より前のバージョンはインストールされたモジュールのパーミッションの関係で 正常に動かないようです。

# cd /usr/pkgsrc/print/cups-pdf
# make install 

cupsdを起動させる

既にブート時にcupsdは起動するようになっていますが、手動で起動させてます。

# /etc/rc.d/cupsd start
Starting cupsd.

cupsのウェブインターフェイス画面で設定する

以下のような手順で設定していきます。

http://localhost:631/ をcupsdの起動しているのと同じホストのpkgsrc/www/firefoxで開きます。

AdministrationリンクをクリックしAdd Printerボタンをクリックします。

Local PrintersにCUPS-PDFが表示されていることを確認して、ラジオボタンで選択し、Continueボタンをクリックします。

次の画面では、特に変更する必要はないので、そのままContinueボタンをクリックします。

Makeでは、Genericを選択しContinueボタンをクリックします。

Modelでは、Generic CUPS-PDF Printer (no option)を選択し、Add Printerボタンをクリックします。

既定値の設定をしますが、A4紙サイズ、出力300 DPIで設定し、Set Default Optionsボタンをクリックします。

この画面まで来たら、仮想プリンターの追加は完了です。

生成されたPDFファイルを確認する

PDFファイルは、/var/spool/cups-pdf/自分のユーザー名 に生成されます。 ここでは、Firefoxで印刷してみました。

$ ls -la /var/spool/cups-pdf/ryoon
total 1064
drwx------  2 ryoon  users     512 Dec  4 20:03 .
drwxr-xr-x  4 root   wheel     512 Nov 26 18:58 ..
-rw-------  1 ryoon  users  519728 Dec  4 20:03 NetBSD_Advent_Calendar_2020_-_Qiita.pdf

pkgsrc/print/mupdfで表示させてみました。

SONY DSC-RX100M3で撮影したMTSビデオファイルをiPhoneで再生できる.mp4ファイルに変換する

SONY DSC-RX100M3と言うコンパクトデジタルカメラでビデオを撮影すると、SDカードに.MTSというビデオファイルが生成される。 これをApple iPhoneにiTunes for Windowsでインポートしようとすると、再生できない形式であると言われてインポートできない。 .MTSファイルは、MPEG-TSコンテナーのようなのでiPhoneの標準機能で再生できないのは当然かもしれない。 .mp4ファイルに変換すれば何でも再生できるかと言うと、そういう訳でもないようだ。 最良の方法かどうかは分からないが、以下のようにすればiPhoneの標準機能で再生できた。

$ ffmpeg4 -i 00002.MTS -c:v h264 -profile:v baseline -level:v 3.1 00002.mp4

ImageGlass for Windowsで.HEIC(HEIF)画像ファイルを表示する

ImageGlassという画像ビューアーをWindows 10で使っている。 これはApple iPhoneで撮影した.HEIC画像ファイル(HEIF形式の画像ファイル)を表示できた。

PowerShellのStart-Processの-RedirectStandardOutputで標準出力をファイルにリダイレクトするパフォーマンスが悪い

Microsoft PowerShellで記述したいバッチ処理があって、標準出力に大量のデータを出力するプログラムで標準出力をファイルにリダイレクトする処理を途中で起動させたい。 PowerShell内では、Start-Processでコマンドを起動させ、その際に-RedirectStandardOutputで標準出力をファイルにリダイレクトすることができる。 しかし、MS-DOSバッチファイル(.batファイル)中で実行すれば数分間で終了する処理が、-RedirectStandardOutputを利用すると1時間経っても終わらなかった。 いろいろ試したが、-RedirectStandardOutputは非常にパフォーマンスが悪いようだ。 結局& command.batのように、リダイレクト処理をする.batファイルを起動することで、数分間で終わるようにする戻すことができたが、必要なファイルが2つになってしまうのが 残念だった。

Windows 10 2004で接続しているWi-Fiの周波数帯を確認する

2.4 GHz帯のWi-Fiが使いものにならない環境にいることが多いのだが、 デバイスドライバーの方で5 GHz帯を優先して使っているので、自分自身は問題にならないことが多い。 しかし、2.4 GHz帯を使っているかどうか確認したい状況は存在する。 Windows 10 2004では、タスクトレイのWi-Fiのアイコンから、接続しているWi-Fiアクセスポイントの「プロパティ」リンクをクリックし、 設定プログラムのプロパティウィンドウを開けば確認できる。


タスクトレイのWi-Fiアイコンから「プロパティ」リンクの表示


設定プログラムのWi-Fiアクセスポイントの詳細表示

Widowsのファイル共有の仕様

CIFSやSMBの仕様について、参照したい時があるので、参照先を書いておく。

CIFS
[MS-CIFS]: Common Internet File System (CIFS) Protocol
SMB
[MS-SMB]: Server Message Block (SMB) Protocol
SMB2、3
[MS-SMB2]: Server Message Block (SMB) Protocol Versions 2 and 3
SMB Direct
[MS-SMBD]: SMB2 Remote Direct Memory Access (RDMA) Transport Protocol

DBeaverとPostgreSQLのテーブル表示でのデータ編集

Oracle SQL Developerを 利用することがあるのだが、Oracle Databaseのテーブルと違い、 PostgreSQLのテーブルについては、データをスプレッドシート的に編集することができなかった。

Apache License 2.0でリリースされているDBeaver を使うと、PostgreSQLのテーブルもスプレッドシート的に編集することができた。 Microsoft Excelからの複数セルのコピー・アンド・ペーストも可能だった。 プライマリーキーの変更も対応していた。

DBeverをWindows 10でOpenJDK 15と一緒に使うためには、以下のようにOpenJDK 15の パスをdbeaver.iniファイルに設定する必要があった。

-startup
plugins/org.eclipse.equinox.launcher_1.5.700.v20200207-2156.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1100.v20190907-0426
-vm
C:\opt\jdk-15\bin\server\jvm.dll
-vmargs
-XX:+IgnoreUnrecognizedVMOptions
--add-modules=ALL-SYSTEM
-Xms64m
-Xmx1024m

ここで追加したのは、以下の2行の部分である。

-vm
C:\opt\jdk-15\bin\server\jvm.dll

EasyRTCのGitHubリポジトリーがなくなっていた

https://github.com/priologic/easyrtcで公開されていた EasyRTCというWebRTCをウェブブラウザーで使うライブラリーのリポジトリーがなくなっていた。 フォークしたhttps://github.com/open-easyrtc/open-easyrtcというのを後継 として使うことになりそうだ。

Dell XPS 13 (9300)を修理してもらった

2020年8月16日日曜日 15:30ころ

到着から8日目で起動しなくなってしまい、何度か電源ボタンを押していると、電源ステータスLEDが橙色が2回、白色が3回点滅するのを確認した。マニュアルによると、メモリー異常の場合であるらしい。修理窓口に電話すると、BIOSリカバリーやLCDのチェック、マザーボードのチェックの手順を教えてもらい、マザーボードの交換が必要という結論になった。購入時の保証でオンサイト修理をしてもらえるらしい。ただ、マザーボードの在庫はないそうで、数日以内に送付されて来るとのことだった。届いたパーツは開梱してはいけないとのことだった。電子メールアドレスへのテスト送信をしてもらい、電子メールアドレスの確認もされた。 電話は50分間程度かかった。 直後に電話で話しをした担当の方から、これからの進め方について電子メールをもらった。

2020年8月17日月曜日 20:10ころ

担当の方から2020年8月20日にパーツが到着予定になっているとの電子メールでの連絡があった。

2020年8月18日火曜日 11:40ころ

交換部品を出荷した旨の電子メールが来た。

2020年8月18日火曜日 12:34ころ

エンジニアの訪問日時を調整する電話が来た。 交換部品は明日2020年8月19日 08:00-09:00に自宅に配達されて来るとのこと。開梱しないで保管しておいて欲しいとのこと。 訪問日時の調整に入ったが、先方はお盆明けで忙しく、なかなか双方の都合が合う時間帯が見つからなかった。少し時間はあいてしまうが、2020年8月22日土曜日13:00-14:00にエンジニアが自宅に到着し、1時間強の作業をしてもらうこととした。必要な作業スペースとしては、60cm×60cmの作業用マットを展開できる机などが必要であり、作業前に免責のサインが必要とのことであった。

2020年8月22日土曜日 13:00ころ

エンジニアの方が訪問され、免責のサインをiPad上で実施した。その後すぐに修理開始された。

2020年8月22日土曜日 14:30ころ

修理完了し動作確認をさせてもらった。その後、修理完了のサインをiPad上で実施した。すぐに修理報告の電子メールが送られて来た。

NetBSDのudl(4)を2つ目のwsdisplay(4)/wscons(4)として利用する

はじめに

udl(4)として認識されるI-O DATAのUSB-RGBを持っているが、 NanoPi NEOのようなグラフィカルなコンソールの存在しないマシンでしか利用していなかった。 https://wiki.netbsd.org/users/rkujawa/notes/によると、 wsdisplay1を利用する方法があるとのことだったので、試してみた。

wsdisplay1にスクリーンを追加する

wsdisplay1で認識されるコンソールは、/dev/ttyF*として認識されるらしい。 NetBSD/amd64 9.99.72では、/dev/ttyF*は既に存在していた。

$ ll /dev/ttyF*
crw-------  1 root  wheel  47, 256 Sep  6 05:37 /dev/ttyF0
crw-------  1 root  wheel  47, 257 Aug 22 21:33 /dev/ttyF1
crw-------  1 root  wheel  47, 258 Aug 22 21:33 /dev/ttyF2
crw-------  1 root  wheel  47, 259 Aug 22 21:33 /dev/ttyF3
crw-------  1 root  wheel  47, 260 Aug 22 21:33 /dev/ttyF4
crw-------  1 root  wheel  47, 261 Aug 22 21:33 /dev/ttyF5
crw-------  1 root  wheel  47, 262 Aug 22 21:33 /dev/ttyF6
crw-------  1 root  wheel  47, 263 Aug 22 21:33 /dev/ttyF7
crw-------  1 root  wheel  47, 511 Aug 22 21:33 /dev/ttyFcfg
crw-------  1 root  wheel  47, 510 Aug 22 21:33 /dev/ttyFstat

udl(4)をUSBソケットに差し込むと、以下のように認識される。

udl0 at uhub13 port 1
udl0: DisplayLink (0x17e9) I-O DATA USB-RGB (0x0150), rev 2.00/0.03, addr 4
wsdisplay1 at udl0 kbdmux 1
wsmux1: connecting to wsdisplay1

これだけでは、コンソールとしては使うことができない。 以下のようにスクリーンを追加する必要がある。

# wsconscfg -f /dev/ttyFcfg 0

このように実行すると、以下のように表示される。

wsdisplay1: screen 0 added (default, vt100 emulation)

コンソールとして使うには、以下のように設定しておく必要がある。

# cat /etc/ttys
console "/usr/libexec/getty Pc"         wsvt25  off secure
constty "/usr/libexec/getty Pc"         wsvt25  off secure
ttyE0   "/usr/libexec/getty Pc"         wsvt25  on secure
ttyE1   "/usr/libexec/getty Pc"         wsvt25  on secure
ttyE2   "/usr/libexec/getty Pc"         wsvt25  on secure
ttyE3   "/usr/libexec/getty Pc"         wsvt25  on secure
ttyF0   "/usr/libexec/getty Pc"         wsvt25  on secure
tty00   "/usr/libexec/getty std.9600"   unknown off secure
tty01   "/usr/libexec/getty std.9600"   unknown off secure
tty02   "/usr/libexec/getty std.9600"   unknown off secure
tty03   "/usr/libexec/getty std.9600"   unknown off secure
tty04   "/usr/libexec/getty std.9600"   unknown off secure
tty05   "/usr/libexec/getty std.9600"   unknown off secure
tty06   "/usr/libexec/getty std.9600"   unknown off secure
tty07   "/usr/libexec/getty std.9600"   unknown off secure

# /etc/rc.d/ttys restart

これで、USBキーボードを接続すると、/dev/ttyF0で入力できる。

Adobe Acrobat Reader DCのオフラインインストーラーを入手する

Adobe Acrobat Reader DCのオフラインインストーラーは、 基本的には、ftp://ftp.adobe.com/pub/adobe/reader/win/AcrobatDC/ からダウンロードできるのだが、全てのバージョンに対してインストーラーが用意されている訳ではないので、サブディレクトリーの中を見て回らないと いけないのが問題である。

https://get.adobe.com/reader/otherversions/から選択すると、最新のリリースではない ものの、最新のインストーラーファイルをダウンロードできる。 なので、インストールしたら必ずアップデートがあるか確認する必要がある。

Google Chrome for Windowsのオフライン(スタンドアロン)インストーラーを入手する

普通、https://www.google.com/chrome/からダウンロードできる Google Chromeのインストーラーは、本体をダウンロードするためのダウンローダーでしかない。 オフラインでインストールできるインストーラーは、このインストーラーの実行が失敗すると案内される、 https://www.google.com/chrome/?standalone=1のウェブページから ダウンロードできる。 ただし、Google Chromeのサポートしているプラットフォームのユーザーエージェントを持ったウェブブラウザーである必要がある。 そうでない場合には、Windows/x86_64用であればhttps://www.google.com/chrome/?standalone=1&platform=win64からダウンロードできる。

Dell XPS 13 (9300)を購入して届くまで

2020年7月27日(月曜日) 04:00頃

BTOで注文した。 納期は2020年8月16日と表示されていた。納期は13営業日ということである。 即納品では不要なMicrosoft Officeが必須になっているし、即納でないのであればキーボードもUS配列にしておきたいので、仕方がない。

以下によると、14営業日で届くのが標準的なスケジュールのようだ。 https://www.dell.com/learn/jp/ja/63/campaigns/delivery-info-consumer これを信じるのであれば、2020年8月17日着になるはずであり、そう考えると2020年8月16日着というのは標準的なスケジュールより1日早い。

2020年7月27日(月曜日) 11:00頃

受注手続き完了の電子メールが来て、生産開始にステータスが変更になった。 この時点で納期が2020年8月12日に変更になり、4日間(2営業日)短縮になった。 この時点で届くまでにかかる日数は11営業日(16日)である。

2020年7月28日(火曜日)

ウェブサイトを確認しても変化はない。

2020年7月29日(水曜日) 夕方

ウェブサイトで確認すると、「出荷済み - 国内配送センターへ輸送中」のステータスに変更になっていた。

国際輸送は7営業日かかるとDellのウェブサイトには記載されていたので、明日2020年7月30日から7営業日というと2020年8月7日には国内に入って来るのではないかと考えた。そうすると、国内輸送に2営業日かかるとDellのウェブサイトには記載されていたので、2020年8月12日には手元に届くかもしれないと考えた。こう考えると予定通りである。

オーダーウォッチサービスに登録していなかったので、登録した。

2020年7月30日(木曜日)

ウェブサイトを確認しても変化はない。

2020年7月31日(金曜日)

ウェブサイトを確認しても変化はない。

2020年8月1日(土曜日)

ウェブサイトを確認しても変化はない。

2020年8月2日(日曜日)

ウェブサイトを確認しても変化はない。

2020年8月3日(月曜日)

ウェブサイトを確認しても変化はない。

2020年8月4日(火曜日)

ウェブサイトを確認しても変化はない。

2020年8月5日(水曜日)

ウェブサイトを確認しても変化はない。

2020年8月6日(木曜日)

ウェブサイトを確認しても変化はない。

2020年8月7日(金曜日) 14:55頃

ふと確認すると、国内配送センターへ輸送中のステータスのままだが、佐川急便の配達番号が付与されていた。ただし、佐川急便のトラッキングシステムではまだ番号未登録の状態だった。どこから出荷されるのかはまだ分からないが、明日2020年8月8日に配達されて来ると期待できそうだ。

2020年8月7日(金曜日) 15:33頃

デル オーダーウォッチサービスで、国内物流拠点から出荷した電子メールが来た。

2020年8月7日(金曜日) 23:15頃

ふと確認すると、佐川急便のトラッキングシステムで検索できるようになっていた。それによると、東京の城東営業所が集荷営業所で、14:00に取り扱って輸送中であることが表示された。 これであれば、明日配達されるかもしれない。

2020年8月8日(土曜日) 15:20頃

自宅に配達された。結局12日間で納品された。

Dell XPS 13 9300でNetBSD/amd64を使う

仕様については、以下に記載されている。 https://www.dell.com/support/manuals/jp/ja/jpdhs1/xps-13-9300-laptop/xps-13-9300-setup-and-specifications/specifications-of-xps-13-9300?guid=guid-7c9f07ce-626e-44ca-be3a-a1fb036413f9&lang=en-us

NetBSD/amd64 9.99.70を利用している。 このラップトップは、UEFIブートモードしかサポートされていない。 インストール時は、いろいろ問題があったのだが、自分の持っている接続USB stickやUSB-Ethernetアダプターの問題であったりしたので、基本的には問題ないはずである。

サポート状況概要

ビデオ
DRM/KMSのサポートはされていない。genfb(4)を使うことになる。genfb(4)で4K LCD表示可能。OpenGLは、LLVMpipeが使えるので10 fpsくらいでの描画は可能。genfb(4)ではUSB Type-Cコネクター経由での外部ディスプレイへの出力はできない。
Bluetooth
ubt(4)として認識されるが、ファームウェアを読み込む必要があるホストコントローラーであるようで、利用不可。
Wi-Fi
サポートされていない。OpenBSDのiwx(4)デバイスドライバーを移植すれば動くかもしれない。
オーディオ
hdaudio(4)でサポートされている。しかし、ヘッドセットジャック接続の再生でノイズが激しい、ヘッドセットジャック接続のマイク入力が認識されない、と言う問題がある。
タッチパッド
pms(4)のSynapticsサポートで問題なく利用できる。
microSDカードリーダー
rtsx(4)で認識されるのだが、カードを挿入するとsdmmc(4)で有効化エラーが出て利用できない。2020-08-26追記: microSDカードが壊れていたようで、正常なmicroSDカードを挿入すれば問題なく利用できる。
ウェブカメラ
可視光も赤外線も両方とも利用できない。uvideo(4)がいけないのではなく、xhci(4)がアイソクロナス転送がサポートされていないのが問題であるようだ。
USB Type-C
左右でxhci host controllerが別々になっているが、両方とも問題なく利用できる。
指紋センサー
認識されない。
タッチスクリーン
認識されない。dwiic(4)が認識されないが、単純にPCI vendor ID/product IDを追加しても動作しなかった。
Intel Quick Sync Video
genfb(4)を使っている時は利用できないようだ。
Thunderbolt
利用できるハードウェアを持っていないので確認できない。

設定

BIOSで以下の設定をする必要があった。

  • MVMeの接続について、SATAの設定でRAID onになっているのをAHCIにすることが必要だった。AHCIに変更することで、nvme(4)とld(4)として利用可能になった。
  • Secure Bootを無効化する。
  • 内蔵ウェブカメラはBIOSで無効化できるので、どうせ利用できないので無効化しておいた。

Windows 10で以下の設定をする必要があった。

  • プリインストールされたWindows 10のDell Power Managemenrtアプリケーションで、サーマル管理画面で「超高パフォーマンス」に設定した。しかし、これでもCPUの最大動作周波数は3.5 GHzになっているように見える。CPUの仕様上はIntel Core i7-1065G7なので3.9 GHzなのだが、そこまでは上がらないように制御されているようだ。

課題

日常で使うには、以下ができるとうれしい。

  • Wi-Fiアダプターをサポートする。
  • Bluetoothホストコントローラーをubt(4)でサポートする。
  • タッチスクリーンをサポートする。
  • Intel統合CPU用のLinuxのデバイスドライバーを移植し、ハードウェアアクセラレーションを有効にする。
  • オーディオについて、ヘッドセットジャックでの音声出力のノイズ発生を解消する。
  • オーディオについて、ヘッドセットジャックでの音声入力ができるようにする。

おわりに

BIOSにもいろいろな設定があって、細かく設定できる良いラップトップであると思う。 画面も綺麗な表示で良いと思う。 キーボードは、home/end/pageup/pagedownが独立していないの以外は、タイプする感覚も良いように感じた。

Firefox on NetBSDで、Microsoft Teamsの会議機能は利用できない

いくつかのオンライン会議システムが、Firefox on NetBSDで使えるか試している。ZoomとCisco Webexも試しているので、別途書いておくつもりだが、 まずはMicrosoft Teamsについて書いておきたい。

2020年8月13日の時点では、ウェブブラウザーからの会議参加は、Microsoft Edge (EdgeHTML、Chromium)と、Google Chromeしか対応していないとのメッセージが出ていた。 User Agent StringをGoogle Chrome for Windowsのものに変更しても、会議を開始することはできなかったので、Firefox for NetBSDから参加はできないと考えて良さそうだ。

HP Spectre x360 13-inch ae019TU上のNeBSD/amd64-currentのNVMMでMicrosoft Windows 10 x86_64 2004を動かす

私の常用していたHP Spectre x360 13-inch ae019TUというラップトップでは、 これまでNVMMを使ったqemu上でWindows 10を起動させることができなかった。

しばらく試していなかったのだが、2020-05-27時点のNetBSD/amd64-currentのNVMMで試したところ、 問題なくWindows 10 x86_64 2004を起動させ、インストールし、利用することができた。

Mozilla Firefoxのuser agent switcherアドオン

Mozilla Firefoxのuser agent stringを変更するアドオンで以下のような機能があるものを探していた。

  • 有名なウェブブラウザーのuser agent stringのプリセットが用意されていること。
  • ドメイン名ごとにデフォルトのuser agent stringを設定できること。
  • 簡単に素のuser agent stringに戻せること。

addons.mozilla.orgには数多くのuser agent stringを変更するアドオンがあり、しかも皆名前が一緒なので困ってしまうのだが、 User-Agent Switcherというのが、私のニーズには合っていた。

タッキングできるマックス製ホッチキスHD-10NXを買った

180度開いて画鋲代わりに針を打ち込むのをタッキングと言うらしい。 これをやりたくて、マックス製ホッチキスHD-10NXとNo.10 1Mステンレス針 (MS91194)を購入した。 これで固定はできるようになった。

Google Domainsでドメイン名を管理し、Gmailからの独自ドメインでの電子メール送信を設定する

はじめに

独自ドメインで電子メールを送受信したいと思っていたのだが、現代の基準に合うようなSMTPサーバーを立ち上げて維持するのは、 それほど頻度がない電子メールの送受信を実現する対価としては、割に合わないと感じていた。

そのドメイン名をGoogle Domainsで管理していると、 @gmail.comのGmailアカウントで電子メールの送受信ができるということなので試してみた。

また、G Suiteのアカウントでは、この機能は利用できないようである。そもそも、Google Accountページで App passwordを設定できない。

Google Domainsへドメイン名を移管する

今回利用するドメイン名は、お名前.comで取得していた。お名前.comでの1年間の料金は、直近は1,280円であったが、Google Domainsでは1,540円である。 だが、privacy protectionやGmailと連携した電子メールの取り扱いの対価と考えると、差額は納得できると考えた。

お名前.comから移管する際に、移管元に支払う料金は存在しない。管理画面でAuth codeを取得しておき、Google Domainsで移管を申し込みすれば良い。 Google Domainsから移管の申し込みをすると、10分後くらいにお名前.comから移管を承認するかの確認電子メールが来る。 電子メール中のリンクから移管を承認すれば、間も無くGoogle Domainsに移管が完了する。 Google Domainsでの移管申し込み時には、4日後の日付が完了予定日として提示されているが、1時間もかからずに完了できた。

電子メール転送の設定をする

Google DomainsのEmailメニューより、Email forwardingの設定をする。 今回は、*@example.comから、example@gmail.comへの転送ルールを追加した。 これにより、アットマークより前の部分は何であってもexample@gmail.comへ転送されるようになる。

続いて、DNS MXレコードの設定をする。 私の場合には権威DNSサーバーは独自に運用しているので、bindのzoneファイルで言うと、以下のような内容を追加した。 この内容は、Google DomainsのDNSメニューのEmail forwardingの箇所に記載されている。

@       IN      MX      5       gmr-smtp-in.l.google.com.
        IN      MX      10      alt1.gmr-smtp-in.l.google.com.
        IN      MX      20      alt2.gmr-smtp-in.l.google.com.
        IN      MX      30      alt3.gmr-smtp-in.l.google.com.
        IN      MX      40      alt4.gmr-smtp-in.l.google.com.

ここで、info@example.comに電子メールを出して、Gmailのinboxに配送されることを確認した。

次に、info@example.comから電子メールを発信する設定をしていく。 基本的には、Send an email from your alias in Gmailの Google Domainsのサポートページの内容の通りである。 注意点としては、@gmail.comの電子メールアカウントで実施する必要があるということである。

おおまかな流れは以下のようになる。

  • GmailのGoogleアカウントで2-step verificationを有効にする。
  • App passwordでEmailのパスワード(16桁)を生成する。
  • Gmailの設定画面で16桁のパスワードを使いanother email addressを追加する。
  • info@example.comの電子メールのverificationに対応する。
  • まず、Googleアカウントが2要素認証を有効にしている必要がある。有効にすると、App passwordの設定が可能になる。 appとしてMailを、deviceとしてOtherを、Nameとしてexample.comと入力して、16桁のパスワードを生成する。 このパスワードはDoneをクリックすると再表示できないようだったので、必ずコピーして保存しておく。

    Gmailの設定画面のAccounts and Importタブより、Send mail asの部分でAdd another email addressをクリックして送信者を追加する。 ここで、Treat as an aliasのチェックボックスをチェックするのを忘れないようにするようにサポートページには書かれているのだが、効果が分からなかった。 SMTP serverはsmtp.gmail.comに、usernameは自分のGmailの電子メールアドレス、パスワードはさきほど生成した16桁のパスワードを 設定し、電子メールアドレスのverificationに対応すれば完了である。

    電子メールを送る際に、From電子メールアドレスを選択できるようになる。

    Windows 10 64-bit 2004にChromiumベースなMicrosoft Edge 84.0.522.52が自動的にインストールされた

    2020年8月6日の深夜に、Windows 10 64-bit 2004にChromiumベースなMicrosoft Edge 84.0.522.52が自動的にインストールされた。 随分前にWindows 10には展開されると予告されていたが、やっと展開されて来た。

    ActalisのS/MIME電子証明書を取得してみる

    年々、無料で取得できるS/MIME用の電子証明書は少なくなっているような気がする。 継続して提供されるサービスとなると、尚更である。

    イタリアのActalisという電子認証局が発行している S/MIME電子証明書を取得してみた。

    取得までの作業は非常に簡単で、流れは以下のようである。

  • Free Email Certificateのページから 電子メールアドレスを入力し、SEND VERIFICATION EMAILボタンを押して、その電子メールアドレスにverification codeを送信してもらう。
  • 電子メールアドレスに送られてきたverification codeを入力し、captchaも入力し、Step 2の規約類に同意した上で、2つの質問でI do not consentを選択する。 その上で、SUBMIT REQUESTボタンを押す。
  • 画面に表示されたpfx電子証明書ファイル用のパスワードを確認し、保存しておく。
  • 電子メールアドレスにzipアーカイブファイルに入ったpfx電子証明書ファイルが送られてくるので、先程のパスワードを使ってインポートする。
  • こうしてActalisから取得したS/MIME電子証明書はpersonal useに限定されている。またCommon Nameには電子メールアドレスが指定されている。有効期間は1年間だった。

    Git for Windows 2.28.0で日本語文字がパスに入っている場合に、quotepath=falseにしても文字化けする問題への対策

    Unicode filenames does not display correctly in 2.27.0 in status command #2734 という問題が報告されていて、Git for Windowsで日本語文字がパスに入っている場合に、MinTTY上ではquotepath=falseにしても文字化けする問題が、2.27.0以降で発生している。 Git for WindowsのGit本体ではなく、MinTTYコンソールの問題らしい。

    この報告では明示されていないように見えるのだが、experimental featureであるPseudo console supportを有効にすれば、手元のWindows 10 1903の環境では問題はなくなった。

    私的なNetBSDのfeature requests

    はじめに

    しばらくNetBSDを使っているのだが、あくまでユーザーで、自分が使う環境を整備する程度しかNetBSDには貢献できていないように思う。 pkgsrcも自分で使うプログラムをパッケージングするというのを越えて取り組めていないような気もする。

    NetBSDに興味を持ってくれる人は少ないように思うが、そもそも魅力がないとか興味がないとかいうのを除けは、どういう課題があるのか分からないから 参入しようという人が少ないという面も少なからずあるのかもしれないと思う。

    私のアイデアリストから、こういうものが実現されていてくれたらおもしろいのに、と思っているものを挙げておきたい。 まあ、本当は自分で取り組めは良いのだが、知識も経験も不足しているので、すぐには無理であろう。 誰か取り組んでもらえないかな…。

    feature requests

    順不同で記載する。 まあ、重要度などという指標は全く考慮していない。 どれも、私が実現されたら面白いな、私の役に立つなと思ったものを挙げているだけである。

    • Linuxの最新のDRM/KMSドライバーをNetBSDl-currentに移植する。--- Intel/Nvidia/AMDのGPUを少なくともサポートして欲しい。
    • xhci(4)でアイソクロナス転送をサポートする。--- uaudio(4)などを使うのに欲しい。
    • Video4Linux2サポートを最新のLinuxに追従する。--- FirefoxやChromiumでのWebRTCサポートがより新しいV4L2を前提としてvideo captureできないので。
    • libmで不足している関数を完備する。
    • VMware Workstation Playerの共有フォルダー機能をゲストとして使うファイルシステムをサポートする。
    • VMware ESXiで使われていvmfsファイルシステムをサポートする。
    • VIrtualBoxの共有フォルダー機能をゲストとして使うファイルシステムをサポートする。
    • VirtualBoxのホストとしてNetBSD/amd64をサポートする。
    • cramfsをサポートする。--- LinuxにあるCompressed Rom File System
    • NTFSを読み込み、書き込みできるようにサポートする。
    • exFATをサポートする。--- 特許の問題はある。
    • USB 3.0 debug portのホスト側のサポートを書く。
    • efiboot (bootloader)でuftdi(4)やuplcom(4)をサポートする。--- 新しいRS-232Cの内蔵されていないPCでもシリアルコンソールをbootloader時点から使いたい。
    • NetBSD/evbriscv32 --- 32ビットのRISC-V CPUを搭載した評価ボードのポート。qemu-system-riscv32に移植することから始められるのではないか。
    • NetBSD/evbriscv64 --- 64ビットのRISC-V CPUを搭載した評価ボードのポート。qemu-system-riscv64に移植することから始められるのではないか。
    • NetBSD/microblaze --- XilinxのMicroBlaze CPUを搭載した評価ボードのポート。qemu-system-lmicroblazeに移植することから始められるのではないか。
    • NetBSD/evbxtensa --- TensilicaのXtensa CPUを搭載した評価ボードのポート。qemu-system-xtensaに移植することから始められるのではないか。
    • NetBSD/evbor1k --- OpenRISC 1000を搭載した評価ボードのポート。qemu-system-or1kに移植することから始められるのではないか。
    • qemuのNVDIMMをsupportする。 --- 不揮発性DIMM
    • evdevをサポートする。 --- LinuxやFreeBSDにあるevdevのサポートをwscons(4)を並列してして欲しい。
    • wscons(4)で、マルチタッチをサポートする。 --- Microsoft Precision TouchPadやUSB touchscreenではmulti touchの信号を出力できる。
    • VMware PVSCSIをサポートする。--- 仮想化ストレージデバイス
    • NetBSD/s390 --- IBM System/390 (32ビット)のポート。Herculesに移植することから始められるのでないか?
    • NetBSD/s390x --- IBM System/390x (64ビットzSeries)のポート。Herculesに移植することから始められるのでないか?
    • NetBSD/evbnios2 -- Altera Nios 2 CPUを搭載した評価ボードのポート。qemu-system-nios2に移植することから始められるのではないか。
    • Apple APFSをサポートする。--- APFSなディスクを読み書きしたい。
    • L4NetBSDを実現する。 --- L4LinuxのNetBSD版。
    • JFFS2ファイルシステムをサポートする。
    • Wi-Fi Directを使えるようにする。 --- 最終的にがMiracastを使って画面を送受できるようにしたい。
    • 複数のwsdisplay(4)をサポートする。 --- udl(4)をNetBSD/amd64なラップトップに接続して両方でwscons(4)コンソールを使いたい。
    • USB Attached SCSIなUSB mass storage deviceをサポートする。 --- qemuにUASなmass storageがあるので実物は不要。
    • ipheth(4)をFreeBSDから移植し、iPhoneでテザリングできるようにする。--- iPhone/iPadでUSBテザリングしたい。
    • Thunderboltのホットプラグをサポートする。 --- PCIのホットプラグということなのか?
    • vnd(4)でqcow2の読み書きをサポートする。 --- qemuのqcow2形式のディスクイメージを読み書きしたい。
    • NFSv4をサポートする。 --- NFSv4以降を読み書きできるようにして欲しいし、NFSv4サーバーにもなって欲しい。そうすることで、WindwosからもNFSマウントできるようになるはず。
    • Toshiba/dynabookに内蔵されているACPI Bluetooth host controllerをサポートする。 --- USB接続ではないBluetooth host controller。FreeBSDはサポートしているように見える。
    • Hyper-Vのvideo driverのDRM/KMSをサポートする。 --- Hyper-V環境をデスクトップ環境として使うために。
    • Oracle Cloudでvioscsiなディスクが認識されないのを直す。 --- Free tierのあるOracle Cloudでvioscsi(4)接続なディスクが見えない。
    • ZFSをroot file systemにできるようにする。 --- mfsを使うことなくZFSをroot file systemにできるようにしたい。
    • pms(4)のSynapticsサポートでPanasonic Let’s NoteのTouchPadが上手く動かないのを解消させる。
    • SMB2をサポートする。 --- SMB1をmountする機能は削除されてしまった。
    • センサー用のフレームワークを用意する。 --- ラップトップやWindwosタブレットにもセンサーは搭載されているので、それをサポートするフレームワークが欲しい。

    HP Spectre x360 13-inch ae019TUの思い出

    HP Spectre 260 13-inch ae019TUというラップトップをここ2年強使っていた。 しかし、このラップトップはいろいろとNetBSDl/amd64を使うには不便であった。 極めつけは、8から10カ月ごとにバッテリーが膨らんでしまうということである。 おそらく、HPの設計ではCPU負荷100%で、pkgsrcのビルドをし続けるのを想定してはいなかったのであろう。

    ACPIとUSB Type-Cなxhci、ubt(4)にあった問題はついに直すことはできなかった。 特にACPIはバッテリーのステータスを取得できないし、電源ボタンを押したことやlidを閉じたことを認識しないし、 xhciでUSB Type-Cを使うことはNetBSDの標準の設定ではできなかった。 ubt(4)は、firmwareのロードが必要なモデルで、FreeBSDはサポートしているようだったら、移植するまで進められなかった。

    次は、このHP Spectre x360 13-inch ae019TUを買う時に迷っていたDell XPS 13の最新モデルである9300を使うことにした。 次のマシンでは、i915drmkms(4)は動かなそうなので、genfb(4)とxf86-video-wsfbを使うしかないようだ。 xhciやACPIがちゃんと動いてくれれば良いと願っている。

    TouchPadはおそらくi2c接続のMicrosoft Precision TouchPad準拠のデバイスのようであり、OpenBSDのimt(4)のようなことを しないといけないように思う。 Wi-FiもKIller Wi-Fi AX1650というもので、OpenBSDのiwx(4)でサポートされていないようだ。 Bluetooth (ubt(4))は、HP Spectre x360 13-inch ae019TUと同じ、firmwareのロードの必要なものではないかと想定しているので、 次こそ使えるようにしたい。

    Dell XPS 13 (9300)が無事に使えるマシンであることを祈っている。

    Windows To GoがWindows 10 2004で消えてしまった

    Microsoft Windows 10をMay 2020 (2004)にアップデーしたら、Windows To Goがコントロールパネルになくなってしまった。 廃止されてしまったらしい。 BIOSを更新するために使っていたので不便になってしまうが、仕方がない。 幸運なことに、NetBSDを現在利用しているラップトップはWindowsを起動させなくてもBIOSを更新できるので、大きな問題にはならずに済みそうだが。

    WindowsからNetBSD/Linuxに中断/再開をサポートしてファイル転送する

    WindowsからNetBSDへ巨大なファイルを転送したい。しかし、その間に転送を中断しないといけない時間帯がある。 NetBSDやLinux同士であればrsyncを使うのだが、Windowsネイティブな良いrsyncはないような気がする。 まして、PuTTYと組み合わせようとすると、どうにもできなかった。

    良く考えてみると、PuTTYにもsftpを実現するコマンドとしてpsftp.exeというのがあった。 これでreputコマンドを使えばファイル転送を再開できた。

    MetabaseでMetabase自身のバックエンドデータベースをPostgreSQLにする

    Metabaseをjava -jar metabase.jarで実行すると、特に設定していなければH2データベースがバックエンドとして利用される。 環境変数に指定した上で起動すれば、PostgreSQLも利用できる

    export MB_DB_TYPE=postgres
    export MB_DB_DBNAME=metabase
    export MB_DB_PORT=5432
    export MB_DB_USER=metabase_user
    export MB_DB_PASS=metabase_password
    export MB_DB_HOST=localhost
    java -jar metabase.jar
    

    ここで利用するユーザーとデータベースは以下のように用意しておく。 初回起動時にテーブルの作成等は自動的に実施されるので、ユーザーとパスワード、データベースの作成だけしておけば良い。

    $ sudo -u pgsql /usr/pkg/bin/createuser metabase_user
    $ sudo -u pgsql /usr/pkg/bin/createdb metabase
    $ sudo -u pgsql psql -U metabase_user -d metabase
    metabase=> alter user metabase_user with password 'metabase_password';
    ALTER ROLE
    \q
    

    Metabaseで数字8桁で記録された日付を扱う

    COBOL派生の環境から移行された情報システムを利用していると、日付が8桁の数字 (例: 20200621) で日付を格納していることがあると思う。 Metabaseでは、画面から日付をdatepickerで入力して検索条件等に利用できるのだが、それは当然のように数字8桁で格納された日付とは一致や比較できない。 データベースはOracle Databaseなので、dateparse()で数字8桁を日付データに変換できると思ったのだが、エラーになってできなかった。 逆に、Metabaseの与える日付を数字8桁に変換することで一致や比較ができるようになったので、例を書いておく。

    select
    	*
    from
        table1
    where
    	column1 = 'DATA'
    	[[and StartDate <= to_char({{TODAY}}, 'yyyymmdd')
    	  and EndDate >= to_char({{TODAY}}, 'yyyymmdd')]]
    

    ここで、TODAYがMetabaseが与える変数である。

    MetabaseでActive Directory認証する

    Metabaseを利用するにあたって、Active Directoryと認証を連携しておきたい。 Metabaseは比較的自由に設定できるのだが、自由であるが故に分かりにくいようにも感じたので、書いておく。

    私の環境では、以下のように設定すれば良かった。 LDAP認証の設定である。

    サーバーホスト名
    tetera-ad1.tetera.org
    LDAPポート
    3268
    LDAPセキュリティ
    None
    ユーザーネームまたはDN
    domainusername@tetera.org
    パスワード
    domainusernameユーザーのパスワード
    ユーザー検索ベース
    dc=tetera,dc=org
    ユーザーフィルター
    (&(sAMAccountName={login}))
    これにより、Active Directoryのユーザー名をMetabaseへのログイン名として利用できる。
    グループスキーマ
    無効
    今回はグループについては利用しないため。
    メール属性
    mail
    これにより、電子メールアドレスがアカウントに自動設定できるようだ。
    名の属性
    givenName
    姓の属性
    sn

    注意としては以下がある。 設定画面に行くには、初回はLDAPではなく電子メールアドレスでログインする必要がある。しかし、その場合にAcrive Directoryのmailアトリビュートと同じ電子メールにすると、 電子メールアドレスでもユーザー名でも、LDAP以前のパスワードでもLDAPのパスワードでもログインできるアカウントができてしまう。 それで良いという考えもあるかもしれないが、これを避けるためにはLDAPに存在しない電子メールアドレスで初回ログインをしておくのが良いようだ。 別に電子メールが送られるという訳でもないので、任意の電子メールアドレスで良いと考えられる。

    Metabaseを使ってみる

    良く実行するSQLを保存しておけて、ウェブブラウザーから結果を参照しておけるものが欲しいと考えていた。 RedashMetabaseか、似たような他のものを候補にしていた。 私の用途の場合には、Oracle Databaseに接続できることが条件だったし、 サーバーOSはWindows ServerでもLinuxでもなかったので、Java Virtual Machineで動くMetabaseしか最終的には目的を逹することはできなかった。 MetabaseはJDBCでOracle Databaseに接続できるので、NetBSDやFreeBSDのサーバーでも問題なく動かすことができた。

    ただ、Business Intelligence (BI)ツールとして使おうとすると、まだ機能不足があるようにも感じた。 しかし、当初の目的である良く使うSQLを保存しておけて、ウェブブラウザーから結果を参照する用途は満足できたと感じた。 変数の扱いがもう少し柔軟だと良いのだが…。

    How to use Google G suite OAuth2 with mbsync (from isync) and msmtp on NetBSD

    Google will remove Less Secure app Access (LSA) from Gmail of G Suite. And I want to continue to use Gmail from NetBSD laptop with mbsync (isync) and msmtp. However I cannot find any successful report about mbsync with XOAuth2.

    I do not understand OAuth2 and its derivatives at all. This post is for reporting how to use mbsync and msmtp for Gmail without LSA, not for understanding OAuth2.

    Prerequiestics

    I am a NetBSD desktop user. I will use pkgsrc as a package management system. The pkgsrc is portable for almost all POSIX system. You can bootstrap pkgsrc on non-NetBSD POSIX-like operating system that you are using.

    I should install the following pkgsrc packages.

  • pkgsrc/mail/isync (isync-1.3.1nb2 or later)
  • pkgsrc/security/cyrus-sasl-xoauth2
  • pkgsrc/mail/msmtp
  • Be sure to use isync-1.3.1nb2 or later. isync-1.3.1nb1 has short buffer (80 bytes) for an output of PassCmd.

    Generate client ID and client secret on Google CLoud Platform console

    Goole Cloud Platform console is very complicated. I will not show how to generate clinet ID and client secret step by step.

    I should follow Google Cloud Platform console -> API&Services -> Credentials -> OAuth 2.0 Client IDs.

    Get my Access Token and Refresh Token with Google's oauth2.py

    With my client ID and client secret, I can get my (temporal) Access Token and Refresh Token with Google's oauth2.py commandline tool. I can get oauth2.py tool from https://raw.githubusercontent.com/google/gmail-oauth2-tools/master/python/oauth2.py. This oauth2.py is for Python 2.7 not for Python 3. Be sure to execute the tool with python2.7 command from pkgsrc/lang/python27.

    And I must have modern web browser like pkgsrc/www/firefox to access Google's webpage.

    An outline of my steps is as follows.

    1. Execute oauth2.py with my client ID and client secret.
    2. I can get a URI of Google's webpage and open the webpage with my Firefox.
    3. I can get a code and input the code to oauth2.py.
    4. I can get the access token and refresh token.

    I will use the refresh token to renew the access token. Do not discard my refresh token.

    I will execute oauth2.py as follows.

    $ python2.7 /opt/share/oauth2.py \
    --user=MY_GSUITE_EMAIL_ADDRESS \
    --client_id=MY_CLIENT_ID.apps.googleusercontent.com \
    --client_secret=MY_CLIENT_SECRET  \
    --generate_oauth2_token
    

    Create a script to generate a access token from the refresh token

    My access token will expire in 3600 seconds. I will regenerate my access token every e-mail send/fetch. Google's oauth2.py has no special mode to output refresh access token only. I will create the following script as /opt/bin/get_teteraorg_token.sh.

    #! /bin/sh
    /usr/pkg/bin/python2.7 /opt/share/oauth2.py \
    --user=MY_GSUITE_EMAIL_ADDRESS \
    --client_id=MY_CLIENT_ID.apps.googleusercontent.com \
    --client_secret=MY_CLIENT_SECRET \
    --generate_oauth2_token \
    --refresh_token=MY_REFRESH_TOKEN | \
    awk -F" " '{if(NR==1)print $3}'
    

    Do not ferget to execute chmod 700 /opt/bin/get_teteraorg_token.sh.

    My ~/.mbsyncrc

    My .mbsyncrc is very simple. PassCmd and AuthMechs are special.

    IMAPAccount gmail
    Host imap.gmail.com
    User MY_GSUITE_EMAIL_ADDRESS
    #AuthMechs LOGIN
    AuthMechs XOAUTH2
    PassCmd "/opt/bin/get_teteraorg_token.sh"
    SSLType IMAPS
    CertificateFile /etc/openssl/certs/ca-certificates.crt
    
    IMAPStore gmail-remote
    Account gmail
    
    MaildirStore gmail-local
    Path ~/.maildir/teteraorg-gmail/
    Inbox ~/.maildir/teteraorg-gmail/inbox
    
    Channel gmail-inbox
    Master :gmail-remote:
    Slave :gmail-local:
    
    Channel gmail-trash
    Master :gmail-remote:"[Gmail]/Trash"
    Slave :gmail-local:trash
    
    Channel gmail-sent
    Master :gmail-remote:"[Gmail]/Sent Mail"
    Slave :gmail-local:sent
    
    Channel gmail-archive
    Master :gmail-remote:
    Slave :gmail-local:
    Patterns "Arch*"
    
    Group teteraorg
    Channel gmail-inbox
    Channel gmail-sent
    Channel gmail-trash
    Channel gmail-archive
    

    My ~/.msmtprc

    For msmtp, no special patch is reaquired. msmtp has no XOAuth2 support (it seems that XOauth2 support is removed already). Use auth oauthbearer instead.

    defaults
    
    account teteraorg
    tls on
    tls_certcheck off
    tls_starttls off
    host smtp.gmail.com
    port 465
    protocol smtp
    auth oauthbearer
    from MY_GSUITE_EMAIL_ADDRESS
    user MY_GSUITE_EMAIL_ADDRESS
    passwordeval "/opt/bin/get_teteraorg_token.sh"
    
    account default: teteraorg
    

    NetBSD上で、isyncのmbsyncコマンドとmsmtpコマンドでOAuth2を使いGoogle G SuiteのGmailの電子メールを送受信する

    はじめに

    どうやら延期になっているようだが、Google G SuiteのGmailでLess Secure App Access (LSA)を継続使用できないと言うお知らせが来ていた。 私は、NetBSD上でpkgsrc/mail/isyncのmbsyncコマンドを使って電子メールを受信しており、pkgsrc/mail/msmtpを使って電子メールを送信している。 これらができなくなると困ったことになってしまう。

    Oauth2アクセストークンの取得方法について把握し、 mbsyncコマンドに必要なパッチを用意し、mbsyncとmsmtpでアクセストークンの更新を自動的に実施するように設定したので書いておく。

    クライアントIDとクライアントシークレットの生成

    Google CLoud Platformコンソールについては、完全に理解しているとは言えないので、概要だけ書いておく。 https://console.cloud.google.com/より、 API&Service内のCredentialsを選択し、 OAuth 2.0 Client IDsに新規登録して、client IDとclient secretを生成しておく必要がある。

    アクセストークンとリフレッシュトークンの取得

    アクセストークンとリフレッシュトークンを取得するためには、以下のような手順に従う必要がある。 ここでは、github.com/google/gmail-oauth2-toolsoauth2.pyを利用する。ただし、これはPython 2.7用のスクリプトのようなので、Python 3.8では実行できなかった。

  • oauth2.pyにclient IDとclient secretを与え実行する。
  • 表示されたURLにFirefoxでアクセスし、確認用のコードを入手する。
  • 確認用コードをoauth2.pyに入力する。
  • refresh tokenとaccess tokenを入手する。
  • ここで、入手できたaccess tokenの有効期限は3600秒のようである。 refresh tokenは、access tokenの再生成に必要なトークンで、有効期間はないようだ。

    実際に利用したコマンドは以下のようである。

    $ python2.7 /opt/share/oauth2.py \
    --user=MY_GSUITE_EMAIL_ADDRESS \
    --client_id=MY_CLIENT_ID.apps.googleusercontent.com \
    --client_secret=MY_CLIENT_SECRET  \
    --generate_oauth2_token
    

    リフレッシュトークンを使ってアクセストークンを再生成するスクリプトを作成する

    アクセストークンは3600秒で有効期限を迎えてしまうので、リフレッシュトークンを使って再生成をする必要がある。 どうやら、毎回リフレッシュトークンを使って再生成要求をしても問題なさそうなので、 実行すると有効なアクセストークンを標準出力に出力するコマンドを用意することにした。 mbsyncにはPassCmd、msmtpにはpasswordevalという設定があり、動的にアクセストークンを与えることができるので、 それに対応するために使う。

    oauth2.pyは、アクセストークンのみを表示させるモードはないようなので、以下のような内容のコマンドを /opt/bin/get_teteraorg_token.shとして用意した。

    #! /bin/sh
    /usr/pkg/bin/python2.7 /opt/share/oauth2.py \
    --user=MY_GSUITE_EMAIL_ADDRESS \
    --client_id=MY_CLIENT_ID.apps.googleusercontent.com \
    --client_secret=MY_CLIENT_SECRET \
    --generate_oauth2_token \
    --refresh_token=MY_REFRESH_TOKEN | \
    awk -F" " '{if(NR==1)print $3}'
    

    XOAUTH2 SASLプラグインの導入

    https://github.com/moriyoshi/cyrus-sasl-xoauth2/の プラグインを利用することした。 Issue 3より後のリビジョンであれば利用できることが分かった。

    pkgsrc/security/cyrus-sasl-xoauth2として用意しているので、以下のように導入しておく。

    # cd /usr/pkgsrc/security/cyrus-sasl-xoauth2
    # make install
    

    isyncのmbsyncコマンドの設定

    まず、pkgsrc/mail/isyncを導入しておく。 必要なパッチが当てられているisync-1.3.1nb2以降である必要がある。

    必要なパッチというのは、PassCmdを実行した結果を保持するバッファーのサイズが80バイトなのを拡張するというものである。 G Suiteのアクセストークンは170バイト強になるようなので、80バイトでは不足し途中で切られてしまうため、正常にログインできない。

    ~/.mbsyncrcでの設定内容は以下のようになる。

    IMAPAccount gmail
    Host imap.gmail.com
    User MY_GSUITE_EMAIL_ADDRESS
    #AuthMechs LOGIN
    AuthMechs XOAUTH2
    PassCmd "/opt/bin/get_teteraorg_token.sh"
    SSLType IMAPS
    CertificateFile /etc/openssl/certs/ca-certificates.crt
    
    IMAPStore gmail-remote
    Account gmail
    
    MaildirStore gmail-local
    Path ~/.maildir/teteraorg-gmail/
    Inbox ~/.maildir/teteraorg-gmail/inbox
    
    Channel gmail-inbox
    Master :gmail-remote:
    Slave :gmail-local:
    
    Channel gmail-trash
    Master :gmail-remote:"[Gmail]/Trash"
    Slave :gmail-local:trash
    
    Channel gmail-sent
    Master :gmail-remote:"[Gmail]/Sent Mail"
    Slave :gmail-local:sent
    
    Channel gmail-archive
    Master :gmail-remote:
    Slave :gmail-local:
    Patterns "Arch*"
    
    Group teteraorg
    Channel gmail-inbox
    Channel gmail-sent
    Channel gmail-trash
    Channel gmail-archive
    

    msmtpコマンドの設定

    pkgsrc/mail/msmtpからmsmtp-1.8.11を導入した。 msmtpは、XOAuth2には現状では対応していないようであり、 oauthbearerを使うように設定する必要があった。 msmstpはSASLプラグインを利用している訳ではないようだ。

    # cd /usr/pkgsrc/mail/msmtp
    # make install
    

    ~/.msmtprcでの設定内容は以下のようである。

    defaults
    
    account teteraorg
    tls on
    tls_certcheck off
    tls_starttls off
    host smtp.gmail.com
    port 465
    protocol smtp
    auth oauthbearer
    from MY_GSUITE_EMAIL_ADDRESS
    user MY_GSUITE_EMAIL_ADDRESS
    passwordeval "/opt/bin/get_teteraorg_token.sh"
    
    account default: teteraorg
    

    Amazon Music FreeとAmazon Prime Music

    Amazon Music Freeというサービスが Amazon Prime会員でなくても利用できるものとして始まったという報道を、しばらく前に見ていた。 どうやら、このAmazon Music Freeとうサービスは、Amazon Prime会員では利用できないようだ。

    https://www.amazon.co.jp/music/free にアクセスしても、Amazon Music Unlimitedの案内のページになってしまう。 Amazon.co.jpからログアウトしてアクセスすると、Amazon Music Freeのウェブページが表示されるので、 Amazon Prime会員では利用できないと考えて良さそうだ。

    HTMLからWindowsの共有ファイルサーバー上のファイルやフォルダーを開く

    Windows上の共有ファイルサーバー上のリソースをHTMLから参照するようなことは、全くお勧めできないことのように思うのだが、 そうしたいという人がいるのも理解はできる。Internet Explorer 11でローカルイントラネットとして認識されている ウェブサイトからは参照可能だった。

    以下のように、file://///server/path/to/folder/or/file.suffixのように書けば、 Internet Explorer 11で開くことができた。 ただし、以下のようなHTMLの置いてあるウェブサイトが「ローカル イントラネット」のウェブサーバーとして 設定されている必要がある。 Mozilla FirefoxやGoogle Chromeではウェブサーバー上のHTMLからは開くことはできなかった。 ローカルのファイルシステム上のHTMLを開いた場合には開くことができた。

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="utf-8" />
    <title>UNC link test</title>
    </head>
    <body>
    <p>
    <a href="file://///ruthenium/c/ryo/AND9352JP-D.PDF">
    LINK to file
    </a>
    </p>
    <p>
    <a href="file://///ruthenium/c/ryo">
    LINK to folder
    </a>
    </p>
    </body>
    </html>
    
    フォルダーを開く方は、Internet ExplorerではWindows Explorerでそのフォルダーが開いたが、 ローカルのHTMLから開いた場合のFirefoxとGoogle Chromeではブラウザー内のファイル参照画面で表示された。

    源泉徴収税額の納付届出書をe-Taxで提出する

    源泉徴収税額の納付届出書をWindows用のe-Taxソフト(国税電子申告・納税システム利用者ソフトウェア)で提出する場合の操作が分かりにくかったので書いておく。
    1. 追加インストールで、「申請」の「納税関係」をインストールする。「源泉所得税」ではないので注意が必要。
    2. 「作成」メニューから「申告・申請等」を選択し「新規作成」を選択する。表示されたポップアップウィンドウで「申請・届出」を選択し、税目として「納税関係」を選択し、「次へ」ボタンをクリックし、「還付金関係手続」より「源泉徴収税額の納付の届出」を選択し、さらに「源泉徴収税額の納付届出書」にチェックを入れて「次へ」ボタンをクリックする。
    3. あとは、通常の申告や申請と同様に作成し、電子署名し、送信すれば良い。

    源泉徴収税額の納付届出書は、「未納付の源泉徴収税額の納付されたとき」に提出することになっているので、源泉徴収された金額が支払われたらすぐに申請するものなのだろう。

    楽天モバイル版のOPPO A5 2020で電子コンパスが真逆を指す問題が修正された

    2020年5月25日に配信されて来た楽天モバイル版OPPO A5 2020のColorOS 6 (Android 9)CPH1943EX-11_A.51のファームウェアで、 電子コンパスが南北逆を指し示す問題は解消されていた。」だが、ディスプレイに表示されるアップデートの要旨にはこのことは書かれていなかった。

    Fusion SMARTalk 2回線とひかり電話をpkgsrc/comms/asterisk16で収容してみる

    はじめに

    楽天モバイル(Fusion) SMARTalkの電話番号が2つあって、これを固定電話で利用したいと考えていた。 もちろん、SIPに対応した固定電話機を購入すれば、2回線を収容するものはそこまで 高くはない。 だが、使わなくなったYamaha RT58iというRJ11で電話機を接続できるルーターを 持っているので、これのSIPクライアント機能を使いたいと思っていた。

    また、フレッツ光ネクストのひかり電話を使っているが、微妙に使い勝手の悪い位置に 固定電話機を設置しなくてはいけないのも気に入らなかった。

    使わなくなったAndroidのスマートフォンでこれらをまとめて使うことができれば 便利になると考えた。 Androidには標準のSIPクライアント機能は存在しているし、サードパーティーの ソフトフォンのアプリも数多くあるので、それを組み合わせれば 良いと考えて試してみた。 しかし、これはそれぞれ以下のような理由でうまく行かなかった。

    1. ひかり電話については、我が家のホームゲートウェイであるPR-500MI (ファームウェアバージョン07.00.0010)では、 Androidスマートフォンの標準電話アプリのSIPクライアント機能でもZoiPerでも、 flets.comで推奨されているAGEphoneでも、着信が安定してできなかった。
    2. SMARTalkの公式クライアントは、1回線しか収容できない。
    3. SMARTalkは固定電話機にもAndroidスマートフォンと同時に着信して欲しかった。

    と言うことで、NetBSDサーバーにAsterisk 16.10.0を導入して、そこに対して Yamaha RT58iとAndroidスマートフォンのZoiPerを接続することで解決させた。 しかし、PR-500MIでの内線通話は安定して実現はできなかった。 これはソフトフォンの種類やAsteriskの導入の有無によらないので、 PR-500MIに問題があるのかもしれない。あまり使う機能ではないので気にしないことにする。

    ウェブを検索してみると、Asteriskの標準であるchan_sipドライバー では、ひかり電話のホームゲートウェイには接続できないらしい。 Asterisk 13以降で標準で提供されるpjsipドライバーであれば 問題なく接続できるらしい。 SMARTalkの方は、chan_sipで接続できるようだ。

    そこで、以下のような方針で構築することにした。

    • ひかり電話のためのホームゲートウェイとの接続はpjsipを利用する
    • SMARTalkとの接続はchan_sipを利用する
    • Yamaha RT58iとZoiPerとの接続はchan_sipを利用する
    それぞれ、なるべく最小限の設定ファイルにすることを目指したが、 冗長になった部分もあるかもしれない。

    Asterisk 16.10.0は、以下のようにインストールした。

    # cd /usr/pkgsrc/comms/asterisk16
    # make install
    

    ひかり電話接続用の設定

    pjsipの設定ファイルは、/usr/pkg/etc/asterisk/pjsip.conf であるので、既存のファイルをバックアップして以下のように作成した。 ここで、10.XX.0.1はホームゲートウェイのLAN側のIPアドレスであり、 ホームゲートウェイの内線3番を事前に有効化してある。その内線3番への接続パスワードが PASSWORDである。

    [transport-udp]
    type = transport
    protocol = udp
    bind = 0.0.0.0:5070 ; 5060 portはchan_sipと競合する。
    
    [hikari-denwa]
    type = registration
    transport = transport-udp
    outbound_auth = hikari-trunk
    server_uri = sip:10.XX.0.1
    client_uri = sip:3@10.XX.0.1 ; 内線3番
    retry_interval = 60
    
    [hikari-trunk]
    type = auth
    auth_type = userpass
    username = 0003 ; 内線3番
    password = PASSWORD
    
    [hikari-trunk]
    type = aor
    contact = sip:10.XX.0.1
    
    [hikari-trunk]
    type = endpoint
    transport = transport-udp
    context = default
    disallow = all
    allow = ulaw
    outbound_auth = hikari-trunk
    aors = hikari-trunk
    direct_media = no
    from_user = 3 ; 内線3番
    from_domain = 10.XX.0.1
    dtmf_mode = inband
    
    [hikari-trunk]
    type = identify
    endpoint = hikari-trunk
    match = 10.XX.0.1
    

    SMARTalk 2回線接続用の設定

    chan_sipの設定ファイルは、 /usr/pkg/etc/asterisk/sip.confである。 既存のファイルはバックアップして、以下のように作成した。 ここで、5XXXXXXX5YYYYYYYが 2回線分のユーザーIDであり、電話番号の050を除いた部分と一致する。 それぞれのパスワードがpassword1password2である。

    [general]
    match_auth_username=yes ; 同じsmart.0038.netに複数のアカウントを持っているので。
    ; 着信のため
    register => 5XXXXXXX:password1@fusion1/5XXXXXXX
    register => 5YYYYYYY:password2@fusion2/5YYYYYYY
    
    ; 外線
    [fusion1]
    type=friend
    username=5XXXXXXX
    fromuser=5XXXXXXX
    secret=password1
    host=smart.0038.net
    fromdomain=smart.0038.net
    context=default
    insecure=port,invite
    canreinvite=no
    dtmfmode=inband
    qualify=yes
    allow=!all,ilbc,g729,gsm,g723,ulaw,alaw
    allowguest=no
    host=dynamic
    
    [fusion2]
    type=friend
    username=5YYYYYYY
    fromuser=5YYYYYYY
    secret=password2
    host=smart.0038.net
    fromdomain=smart.0038.net
    context=default
    insecure=port,invite
    canreinvite=no
    dtmfmode=inband
    qualify=yes
    allow=!all,ilbc,g729,gsm,g723,ulaw,alaw
    allowguest=no
    host=dynamic
    
    これにはYamaha RT58iとZoiPer用の設定も追加していく。

    内線電話機接続用の設定

    内線電話機であるYamaha RT58iとZoiPerから接続を受けるために、 /usr/pkg/etc/asterisk/sip.confに以下のように追加した。 それぞれ、ユーザーIDはandroidrt58iであり、 パスワードはそれぞれpassword3password4である。

    ; 電話機との接続
    [android] ; Androidスマートフォン
    type=friend
    username=android
    secret=password3
    context=default
    canreinvite=no
    host=dynamic
    dtmfmode=rfc2833
    qualify=no
    
    [rt58i] ; Yamaha RT58i
    type=friend
    username=rt58i
    secret=password4
    context=default
    canreinvite=no
    host=dynamic
    dtmfmode=rfc2833
    qualify=no ; Yamaha RT58iから接続するのに必須。
    

    発着信の設定

    発着信の設定は、/usr/pkg/etc/asterisk/extensions.confに設定する。 既存ファイルはバックアップして、新規に以下の内容で作成した。
    [default]
    
    ; 着信
    ;; 内線
    exten => 1290,1,Playback(demo-congrats) ; 動作チェック用の自動音声。内線で1290へ掛けるとお祝いのメッセージを聞ける。動作確認済み。
    exten => 101,1,Dial(SIP/android,20,rt) ; 内線番号は設定しただけで動作確認していない。
    exten => 102,1,Dial(SIP/rt58i,20,rt) ; 内線番号は設定しただけで動作確認していない。
    
    ;; 外線
    exten => 5XXXXXXX,1,Dial(SIP/android&SIP/rt58i,20,rt) ; SMARTalkの2回線はYamaha RT58iとZoiPerに着信する、
    exten => 5YYYYYYY,1,Dial(SIP/android&SIP/rt58i,20,rt)
    exten => s,1,Dial(SIP/android) ; ひかり電話はZoiPerにのみ着信する (実際にはホームゲートウェイに直結された固定電話機にも着信する)。
    
    
    ; 発信
    ;; SMARTalk1の場合には9で発信する。
    exten => _9.,1,Set(CALLERID(num)=${MYNUMBER})
    exten => _9.,n,Set(CALLERID(name)=${MYNUMBER})
    exten => _9.,n,Dial(SIP/${EXTEN:1}@fusion1,120,T) ; 最初に9をダイアルした場合に9を取って外線へ回す。
    
    ;; SMARTalk2の場合には8で発信する。
    exten => _8.,1,Set(CALLERID(num)=${MYNUMBER})
    exten => _8.,n,Set(CALLERID(name)=${MYNUMBER})
    exten => _8.,n,Dial(SIP/${EXTEN:1}@fusion2,120,T) ; 最初に7をダイアルした場合に8を取って外線へ回す。
    
    ;; ひかり電話の場合には7で発信する。
    exten => _7.,1,Set(CALLERID(num)=${MYNUMBER})
    exten => _7.,n,Set(CALLERID(name)=${MYNUMBER})
    exten => _7.,n,Dial(PJSIP/${EXTEN:1}@hikari-trunk) ; 最初に7をダイアルした場合に7を取って外線へ回す。
    

    起動させ使用開始する

    これで、Asteriskを以下のように起動すれば、それぞれ使えるようになる。

    # cp /usr/pkg/share/examples/rc.d/asterisk /etc/rc.d
    # echo asterisk=YES >> /etc/rc.conf
    # /etc/rc.d/asterisk start
    
    問題はめったにこれら3回線を利用する機会がないということだ。

    楽天モバイルのRakuten UN-LIMITのネットワークを確認する

    修理に出していたOPPO A5 2020 (CPH1943) は、そのまま返却されて来た。 電子コンパスが真逆になる不具合は、ハードウェアではなく搭載している ColorOS (Android)の不具合であるようで、次回のファームウェア更新時に 修正されるらしい。

    とりあえず端末が手元に戻って来たので、楽天モバイルRakuten UN-LIMITの 提供するネットワークについて書いておく。

    まず、モバイルネットワークが楽天モバイルの回線であるか、パートナー回線である auの回線であるかだが、モバイルネットワークコード44011が存在する場所なので、 楽天モバイルの自社ネットワークが使えていると考えて良さそうだ。

    OPPO A5 2020に標準で設定されているアクセスポイント(SPN名: rakuten.jp)は、 APNプロトコル、APNローミングプロトコルともにIPv4/IPv6に設定されているので、 IPv4とIPv6の両方を利用することができる。 IPv4のIPアドレスは、10.xxx.yyy.zzzが割り当てられている。 xxxの値は、同じ物理的な場所にあっても変化するようだ。 IPv6は240bで始まるIPアドレスが割り当てられる。 Androidでは標準機能ではサブネットマスクを把握する方法はなさそうなので、 サブネットマスクは分からない。 また、USBテザリングでもパーソナルホットスポットでもIPv4に加えIPv6を利用できる。 USBテザリングを有効にしたままで、パーソナルホットスポットに接続をすると、 パーソナルホットスポット接続側ではIPv6のアドレスは割り振られなかった。 端末の仕様なのか、Androidの仕様なのか分からないが。

    また、IPv4の場合には、楽天モバイル所有の133.106.148.27が表に出るIPv4アドレスになった。 これは、今回試した範囲では変化しなかったが、さすがに1つと言うことは ないだろうから、大きく場所や時間が変われば変化するのかもしれない。 ちなみに、133.106.148.27はホスト名を逆引きできなかった。

    利用できる帯域幅については、Windows 10 64-bitのマシンに接続し、fast.comで計測すると 早朝の時間帯で、 USBテザリングの場合でダウンロード48 Mbps、 アップロード10 Mbps パーソナルホットスポットへ接続の場合でダウンロード37 Mbps、 アップロード11 Mbpsとなった。

    あと調べておきたいとするとRCSでの通話音質だが、調べる知識も機材もないので止めておく。

    楽天モバイルのRakuten UN-LIMITを申し込んでみる

    楽天モバイルのUN-LIMITは一年間月額費用が無料で、 その月額費用の中に国内通話無料のプランが含まれている。 VoIPの設定をするのに通話料金を払うのももったいないと思って、VoIP環境を 適当にして来ていたので、VoIPの設定を進めるためにも申し込んでみた。 注意する項目もあったので、経過を書いておきたい。

    2020年5月1日 06:10ころにSIMカードとOPPO A5 2020を申し込みした。 2020年5月2日に機材が配達されてくる予定になっていた。 この時点では、PCから申し込んだので、本人確認書類の運転免許証は スキャナーで取り込んだ画像を利用していた。 また、3つの電話番号から利用するものを選択できた。

    このタイミングで、正式契約をするボタンを押していたらしい。 契約した意識はあったが、ボタンの存在は覚えていなかった。 後に正式契約処理をするように促す電子メールが来たので、 ここで正式契約をしていなかったのかと思っていたのだが、 正式契約をしていてもこの督促電子メールは送られて来るようだ。

    2020年5月1日12:17にスキャンされた本人確認書類は使えない旨の連絡が電子メールで来た。 写真撮影が求められていることが分かったので、Androidで撮影して申し込みを再度完了させた。 そもそもPCから申し込みするワークフローは考慮されていないのかもしれない。 この時点で、2020年5月3日に機材が配達されている予定になっていた。

    2020年5月2日12:30に、最初に記載した正式契約手続きをして欲しい言う旨の電子メールが来た。 だが、含まれていたURIを開いても正式契約の画面には行けないし、 再度注文をする画面しか表示されない。 しばらく正式契約ボタンを探したが、あきらめて放置して様子を見ることにした。

    2020年5月2日23:10に、発送完了した旨の連絡が来た。 つまり、正式契約は事前にしてあったと言うことであろう。

    2020年5月3日に機材は到着した。

    開封してOPPO A5 2020を利用開始するのは簡単だった。 SIMカードを挿して、Rakuten Linkとmy楽天モバイルの2つのアプリケーションを インストールして楽天IDでログインするだけで良い。 Rakuten Linkアプリから通話、SMSの送信をするのだが、規定の電話アプリケーションにも 規定のメッセージングアプリケーションにも設定できないので面倒だ。

    同時に購入したOPPO A5 2020は、楽天モバイルブランドなのでOPPOのロゴの 次に楽天モバイルのスプラッシュスクリーンが表示される。 初期設定の段階で気付いた事項として、 Android 9のはずなのだが言語設定が複数設定できなかったり、指紋が1種類しか登録 できなかったり、製品情報の中にスクリーンの解像度が表示されなかったり、 ステップモニターが確認しにくかったりということがあったが、 まあどうにか我慢できるレベルであるとは思う。 顔認識は目を閉じていると認証されないように設定できるし、ちゃんと機能するのが 良い点であると思う。

    だが、電子コンパスの南北が逆に認識されるという致命的な不具合があった。 初期不良としてOPPOのサポート窓口に連絡して発送してしまったので、 ネットワークの情報等は返送されて来てから確認したい。

    VLC for Fireでステレオ音声の片側のチャンネルだけ再生する方法がない

    Amazon Fire 7で、VLC for Fireを使っていて、ステレオ音声の片側のチャンネルだけ再生する方法を探していたのだが、少なくともVLC 3.2.12にはそういう機能はないようだ。 二カ国語を収録する場合にもステレオ音声の左右のチャンネルにそれぞれ主音声と副音声を収録することはあるはずなので、こういう機能にはニーズはあるはずと思うのだが…。 どこに機能リクエストを出せば良いのか調べて出しておきたい。

    Android: add option to change audio channel / stereo settingと言うのが feature requestのチケットのようだが、5年以上前から変わっていないようだ。

    NETGEAR AX1800 RAX20のアクセスポイントモードが不安定

    W-Fiアクセスポイントとして使いたくて、 NETGEAR AX1800 RAX20という NETGEARのローエンドなWi-Fi 6に対応した機器を購入した。 RAX20にはルーターになるモードと、アクセスポイントになるモードがある。 自分のネットワークでは、ルーターになってもらう必要はないので、 アクセスポイントにモードを切り替えて利用していた。

    しかし、頻繁にAndroidでno internet connectionと言う表示が出て来る。 そして、そうなると少なくとも自分のネットワークの外には出て行けなくなってしまう。 そう言えば、自分のネットワークの内部にアクセスできるかは確認していなかった。 いずれにしても使い物にならない。

    アクセスポイントモードだと、黄色のinternetと書いてあるルーターモードの場合には WAN側のEthernetポートにスイッチングハブからのUTPケーブルを挿すことになっているので、 ポートを有効活用できるという利点があるのだが、この状況では使いものにならない。 2020-04-22時点で最新のファームウェアに書き換えても状況は変わらないので、 アクセスポイントモードは使うのを止めた。

    ルーターモードで、DHCPサーバー機能を無効にし、スイッチングハブからのUTPケーブルを 黄色のintetrnetポート以外に挿すことで、RAX20の有線・無線ともにRAX20の配下ではなく 自宅のネットワークに直接つながるようになるので、そのようにして使っている。 こうすると黄色のinternetポートは使えずに無駄になるのだが仕方ない。 少なくともルーターモードであれば安定して使えるようだ。

    auブックパスとFirefox for NetBSD

    KDDIのauブックパスは、NetBSD/amd64上のFirefoxでは「本を開けません。電波の良いところでご利用ください。」と エラーが表示されて電子書籍の内容を閲覧することはできない。 User Agent StringをLinux上のFirefoxのものに変更すれば、問題なく閲覧できる。 Mozillaのオフィシャルビルドかどうかを気にしているのかもしれない。

    ApacheTomcatでsecretRequired="false"が必要になる場合

    Apache TomcatのフロントエンドにApche httpdを設置している環境がある。 Apache httpdとApache Tomcatの間は、AJP接続をしている。 Apache Tomcatを9.0.34にアップデートしたとこと、以下のようなエラーになってAJP接続できなくなった。

    Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.

    これは、Apache Tomcat 9.0.31のリリースノート にある、以下の箇所の変更の影響のようだ。

    Rename the requiredSecret attribute of the AJP/1.3 Connector to secret and add a new attribute secretRequired that defaults to true. When secretRequired is true the AJP/1.3 Connector will not start unless the secret attribute is configured to a non-null, non-zero length String. (markt)

    以下のようにserver.xmlsecretRequired="false"を追加すれば、従前通りの動作にはなるようだ。

        <!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector protocol="AJP/1.3"
                   address="::1"
                   secretRequired="false"
                   port="8009"
                   redirectPort="8443" />
    

    ドメインネットワーク内のドメインコントローラーを一覧する

    自分がexample.comドメインに所属しているとしたら、 以下のようにすれば良い。

    nltest /dclist:example.com
    ドメイン 'example.com' の DC 一覧を '\\DC1.example.com' から取得します。
            ad2.example.com        [DS] サイト: Default-First-Site-Name
            ad1.example.com [PDC]  [DS] サイト: Default-First-Site-Name
            DC1.example.com        [DS] サイト: Default-First-Site-Name
            DC2.example.com        [DS] サイト: Default-First-Site-Name
            DC3.example.com        [DS] サイト: Default-First-Site-Name
    コマンドは正常に完了しました
    

    今回のログオンで利用したドメインコントローラーを確認する

    自分がexample.comドメインに所属しているとしたら、 以下のようにすれば良い。 DC1.example.comが今回のログオンで利用したドメインコントローラーである。

    > nltest /dsgetdc:example.com
               DC: \\DC1.example.com
          アドレス: \\10.1.1.1
    ドメイン GUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
       ドメイン名: example.com
      フォレスト名: example.com
     DC サイト名: Default-First-Site-Name
    本サイト名: Default-First-Site-Name
            フラグ: GC DS LDAP KDC TIMESERV WRITABLE DNS_DC DNS_DOMAIN DNS_FOREST CLOSE_SITE FULL_SECRET WS DS_8 DS_9 DS_10
    コマンドは正常に完了しました
    

    Windows Certificate Storeのエクスポート不可に設定されたクライアント証明書をFirefox for Windowsから使う

    Internet Explorerを使う前提のウェブサイトを使っている。 そこには、アクセスするのにクライアント証明書を必要とする部分が存在している。 そして、そのクライアント証明書はエクスポート可能ではないので、 Internet ExplorerやGoogle Chrome、Microsoft Edge (EdgeHTML)でしか使えない と思っていた。

    少なくとも、Firefox 75.0 for Windowsでは security.osclientcerts.autoloadtrueにすると、 そのようなクライアント証明書も利用することができた。 これは、標準ではfalseになっていた。

    これでやっとGoogle Chromeから開放される。

    Audible (www.audible.co.jp)のオーディオブックをNetBSD/amd64上のFirefox 87.0で再生する

    Audible というAmazonのやっているウェブサービスがあって、 当然のようにその音声データはWidevine CDMがないNetBSD/amd64上のFirefoxでは再生できないと思っていたのだが、 実際に試してみると再生できる。 その際、"...