NetBSD/amiga-current on WinUAE Amiga m68k emulator

この記事は、NetBSD Advent Calendar 2019の10日目の記事です。

はじめに

ウェブを検索してみると、NetBSD/amigaをWinUAEというm68kを搭載したAmigaというマシンでNetBSD/amigaを動かした記録が見付かります。 ですが、なかなか手元で再現させられる情報がまとまっていないように見えました。 折角、Amiga ForeverでAmigaマシンのROM (Kickstart ROMと呼ばれています)とWorkbenchというAmigaDOSのGUI環境を 購入したので、試行錯誤してみました。

Kickstart ROMとWorkbenchを入手する

Amiga ForeverでAmiga Forever Plus Editionを購入すると、以下の2つのファイルが手に入ります。

  • amiga-os-310-a3000.rom (Kickstart ROMのバージョン3.1で、A3000マシン用)
  • workbench-311.hdf (Workbench 3.1のHDDイメージ)
実際の手順は、NetBSD/amiga 7用のインストール手順書の通りに進めてみます。

Amigaマシンを設定する1

68030を搭載したA3000をベースに設定することにしました。 WinUAEのQuickstartでA3000を選択し、Set configurationボタンを押します。 . メモリーもZ3 Fastを適当に増やしておきます。

HDイメージを用意する

当面の目標としては、NetBSD/amigaの起動するSCSI-2接続のHDDイメージ(.hdfファイル)を作成することです。 ですが、私はSCSI-2接続のHDDディスクイメージをWorkbench 3.1のhdtoolboxコマンドで設定することができませんでした。 これは、私がAmigaDOSについて何も知らないためである可能性が高いです。 とりあえず、SCSI-2接続ではなく、UAE (uaehf.device)という接続にすることで解決できました。

.hdf HDDディスクイメージファイルを作成してしまえば、SCSI-2で接続し直すだけで良いです。 Wrokbench3.1アイコンから、Toolsアイコンを選択し、Toolsウィンドウの右端まで移動してHDToolBoxをダブルクリックすることで、 HDToolBoxを起動します。

次に、.hdfファイルを1GBの容量で作成します。1GBを超えるとHDToolBoxで正常に扱えないようです。 1GB以上で作成したいので、これについては、もっと追求すべきかもしれません。 その上で、HDToolBox上で、Define a New Drive TypeでRead Configurationを実行します。 .hdfファイルを接続し直した際にも、これをする必要がありますし、パーティション設定を初期化したい場合にもこれを実行すると良いようです。 Partitioning Driveを選択し、ルートファイルシステムとスワップ領域用のパーティションを作成します。 HDToolBoxの操作性が全く分からないので、既定値の500MBずつのまま進めました。 (ですが、最終的にスワップ領域を使えない状態になってしまっています。) UDH0をルートファイルシステム、UDH1をスワップ領域にします。 Advanced Optionにチェックし、Bootableにチェックし、Change...ボタンから下図のように設定する必要があります。 細かい設定値はインストール手順書に書かれています。 注意点としては、これもまた書かれていますが、Identifierを手入力した際に、Enterキーを押さないと、0x0になってしまうという点です。 また、Add/Update...ボタンから、事前にIdentifierを登録しておいて、それを選択して使うこともできるはずですが、 .hdf HDDディスクイメージファイルに書き込む際にエラーを発生してしまったので、避けた方が良いかもしれません。 (これもまた、私がAmigaDOSについて何も知らないからだと思いますが。)

その上で、WindowsホストのディレクトリーをVF:にマウントし、そこに、AmigaDOS用のxstreamtodevコマンドとminiroot.fs (これは事前に圧縮を解除しておきます)を 置いておき、以下のように実行し、スワップ領域にminiroot.fsを書き込み、インストーラーを起動させる準備をします。

cd VF:
xstreamtodev --input=miniroot.fs --rdb-name=UDH1
(書き込みの進捗状況が表示される。されない場合はターゲットのディスクの指定が間違っている。)

Amigaマシンを設定する2

まずはCPUを実機と同程度の速度に制限するのを止め、最速でエミュレートするようにします。 Fastest possibleを選択します。 また、MMUも必要ですので、MMUを有効にします。

チップセットはFullECSを選択しておきました。 これが一番画面が広いように感じたというだけです。

いろいろ試しましたが、Graphics boardとして、Picasso IV (Village Tronic)/Picasso IV (128k)を選択することで、NetBSD/amigaのブートメッセージを画面表示できるようになりました。 これは、NetBSD 8.0 on Amiga A3000 (WinUAE), Picasso IV graphicsを参考にしました。

ここで、UAE1:に接続されている.hdf HDDディスクイメージファイルをSCSI-2接続に変更します。 合わせて、NetBSD/amigaのインストールISOイメージをSCSI接続のCD-ROMドライブに挿入しておきます。

WinUAEを再起動したら、一息置いてマウスも右と左のボタンを同時に押します。 すると、Amiga Early Startup Control画面に入ることができます。 Boot Options...ボタンから、左側のペインでUDH1を選択し、Useボタンを押して元の画面に戻って、Bootボタンで起動すると、NetBSD/amigaのINSTALLカーネルが起動します。 ちゃんと.hdf HDDディスクイメージファイルをSCSI-2接続に変更しておけば、ルートファイルシステムが見付からないということはないはずです。

NetBSD/amigaのインストールは、インストーラーの促す通りです。 setsの展開には時間がたっぷりかかりますので、気長に進めるのが良さそうです。

最後に、AmigaNet (Hydra Systems)というEthernetアダプターを有効にし、ed(4)として認識された状態のdmesgを掲載しておきます。

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 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.20 (GENERIC) #0: Fri Dec  6 21:45:14 UTC 2019
        mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amiga/compile/GENERIC
total memory = 264 MB
avail memory = 255 MB
Amiga 3000 (m68030 CPU/MMU m68882 FPU)
memory segment 0 at 07800000 size 00800000
memory segment 1 at 40000000 size 10000000
memory segment 2 at 00000000 size 00200000
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
mainbus0 (root)
clock0 at mainbus0: CIA B system hz 100 hardware hz 709379
timecounter: Timecounter "CIA B" frequency 709379 Hz quality 100
Calibrating delay loop... 46/1024 us
a34kbbc0 at mainbus0
ser0 at mainbus0: input fifo 512 output fifo 32
par0 at mainbus0
kbd0 at mainbus0: CIA A type Amiga
ms0 at mainbus0
grfcc0 at mainbus0
grf0 at grfcc0: width 640 height 400 colors 4
ite0 at grf0: rows 0 cols 0 repeat at (30/100)s next at (10/100)s has keyboard
fdc0 at mainbus0: dmabuf pa 0x1e3658: dmabuf ka 0x727658
fd0 at fdc0 unit 0: 3.5dd 80 cyl, 2 head, 11 sec [9 sec], 512 bytes/sec
ahsc0 at mainbus0
scsibus0 at ahsc0: 8 targets, 8 luns per target
aucc0 at mainbus0
audio0 at aucc0: playback
audio0: slinear_be:16 2ch 28867Hz, blk 40ms for playback
spkr0 at audio0: PC Speaker (synthesized)
zbus0 at mainbus0: i/o size 0x00400000
grfcl0 at zbus0 pa 0x200000 man/pro 2167/21
grf3 at grfcl0: width 640 height 480 colors 16
ite3 at grf3: rows 60 cols 80 repeat at (30/100)s next at (10/100)s has keyboard
grfcl: 4MB Picasso IV being used
grfcl1 at zbus0 pa 0x400000 man/pro 2167/22
ite at grfcl1:  not configured
grfcl2 at zbus0 pa 0xea0000 man/pro 2167/23
ite at grfcl2:  not configured
ed0 at zbus0 pa 0xe90000 man/pro 2121/1ed0: Ethernet address 52:54:05:32:33:34
board at zbus0: pa 0xec0000 man/pro 2011/82 not configured
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
scsibus0: waiting 2 seconds for devices to settle...
cd0 at scsibus0 target 0 lun 0:  cdrom removable
sd0 at scsibus0 target 1 lun 0:  disk fixed
sd0: 1024 MB, 8322 cyl, 4 head, 63 sec, 512 bytes/sect x 2097152 sectors
4 views configured
root on sd0a dumps on sd0b
root file system type: ffs
kern.module.path=/stand/amiga/9.99.20/modules
WARNING: preposterous TOD clock time
WARNING: using filesystem time
WARNING: CHECK AND RESET THE DATE!

Amazon EC2 c5インスタンスでのNetBSD/amd64 9.0_RC1の利用

この記事は、NetBSD Advent Calendar 2019の5日目の記事です。 すっかり遅くなりすみません。

はじめに

昨年のNetBSD Advent Calendarの記事で、 Amazon Web Service EC2 c5インスタンスでNetBSD/amd64-currentを動かそうとした話を書きました。 その時には、ena(4)に関連したカーネルパニックで利用できる状態にはできませんでした。

その後、さいとうさん(msaito@)がxhci(4)と同様の方法で直してくださいました。 AMIを作って起動させるところまでは、 昨年のNetBSD Advent Calendarの記事と同様ですので、 今年度は、ena(4)が使えるようになった状態の報告と、 Get System Logでブートログを表示させる方法を書きたいと思います。 使うのは、先日リリースされたNetBSD/amd64 9.0RC1付近のnetbsd-9です。

ena(4)が使えるようになった状態

AWS EC2では、シリアルコンソールやVNCコンソールはありませんから、sshでログインできなければ操作できません。 ena(4)が使えないといけないのは、そのためです。

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 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.0_RC1 (GENERIC) #0: Mon Dec  2 15:08:52 UTC 2019
 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC
total memory = 3881 MB
avail memory = 3745 MB
cpu_rng: RDSEED
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
running cgd selftest aes-xts-256 aes-xts-512 done
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
Amazon EC2 c5.large
mainbus0 (root)
ACPI: RSDP 0x00000000000F8FA0 000014 (v00 AMAZON)
ACPI: RSDT 0x00000000BFFFE360 00003C (v01 AMAZON AMZNRSDT 00000001 AMZN 00000001)
ACPI: FACP 0x00000000BFFFFF80 000074 (v01 AMAZON AMZNFACP 00000001 AMZN 00000001)
ACPI: DSDT 0x00000000BFFFE3A0 0010E9 (v01 AMAZON AMZNDSDT 00000001 AMZN 00000001)
ACPI: FACS 0x00000000BFFFFF40 000040
ACPI: SSDT 0x00000000BFFFF6C0 00087A (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001)
ACPI: APIC 0x00000000BFFFF5D0 000076 (v01 AMAZON AMZNAPIC 00000001 AMZN 00000001)
ACPI: SRAT 0x00000000BFFFF530 0000A0 (v01 AMAZON AMZNSRAT 00000001 AMZN 00000001)
ACPI: SLIT 0x00000000BFFFF4C0 00006C (v01 AMAZON AMZNSLIT 00000001 AMZN 00000001)
ACPI: WAET 0x00000000BFFFF490 000028 (v01 AMAZON AMZNWAET 00000001 AMZN 00000001)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ioapic0 at mainbus0 apid 0: pa 0xfec00000, version 0x11, 24 pins
cpu0 at mainbus0 apid 0
cpu0: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz, id 0x50657
cpu0: package 0, core 0, smt 0
cpu1 at mainbus0 apid 1
cpu1: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz, id 0x50657
cpu1: package 0, core 0, smt 1
acpi0 at mainbus0: Intel ACPICA 20190405
acpi0: X/RSDT: OemId , AslId 
LNKD: ACPI: Found matching pin for 0.4.INTA at func 0: 11
acpi0: SCI interrupting at int 9
acpi0: fixed power button present
acpi0: fixed sleep button present
timecounter: Timecounter "ACPI-Safe" frequency 3579545 Hz quality 900
pckbc1 at acpi0 (KBD, PNP0303) (kbd port): io 0x60,0x64 irq 1
pckbc2 at acpi0 (MOU, PNP0F13) (aux port): irq 12
LPT (PNP0400) at acpi0 not configured
COM1 (PNP0501) at acpi0 not configured
ACPI: Enabled 16 GPEs in block 00 to 0F
pckbd0 at pckbc1 (kbd slot)
pckbc1: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard
pms0 at pckbc1 (aux slot)
pckbc1: using irq 12 for aux slot
wsmouse0 at pms0 mux 0
pci0 at mainbus0 bus 0: configuration mode 1
pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok
pchb0 at pci0 dev 0 function 0: vendor 8086 product 1237 (rev. 0x00)
pcib0 at pci0 dev 1 function 0: vendor 8086 product 7000 (rev. 0x00)
piixpm0 at pci0 dev 1 function 3: vendor 8086 product 7113 (rev. 0x08)
timecounter: Timecounter "piixpm0" frequency 3579545 Hz quality 1000
piixpm0: 24-bit timer
piixpm0: polling
iic0 at piixpm0 port 0: I2C bus
vga0 at pci0 dev 3 function 0: vendor 1d0f product 1111 (rev. 0x00)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
nvme0 at pci0 dev 4 function 0: vendor 1d0f product 8061 (rev. 0x00)
nvme0: NVMe 1.0
nvme0: for admin queue interrupting at msix0 vec 0
nvme0: Amazon Elastic Block Store, firmware 1.0, serial vol0f4f9afe33c64b139
nvme0: for io queue 1 interrupting at msix0 vec 1 affinity to cpu0
nvme0: for io queue 2 interrupting at msix0 vec 2 affinity to cpu1
ld0 at nvme0 nsid 1
ld0: 3072 MB, 1560 cyl, 64 head, 63 sec, 512 bytes/sect x 6291456 sectors
ena0 at pci0 dev 5 function 0: vendor 1d0f product ec20 (rev. 0x00)
pci0: Elastic Network Adapter (ENA)ena v0.8.1
ena0: initalize 2 io queues
ena0: for MGMNT interrupting at msix1 vec 0
isa0 at pcib0
com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, working fifo
attimer0 at isa0 port 0x40-0x43
pcppi0 at isa0 port 0x61
spkr0 at pcppi0: PC Speaker
wsbell at spkr0 not configured
midi0 at pcppi0: PC speaker
sysbeep0 at pcppi0
attimer0: attached to pcppi0
acpicpu0 at cpu0: ACPI CPU
acpicpu0: C1: HLT, lat   0 us, pow     0 mW
acpicpu1 at cpu1: ACPI CPU
ena0: link is UP
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
timecounter: Timecounter "TSC" frequency 3000119080 Hz quality 3000
ld0: GPT GUID: 8e7e8f6a-a91c-4a78-9bc3-c40c38ebbc9c
dk0 at ld0: "AWSROOT", 4194304 blocks at 34, type: ffs
dk1 at ld0: "AWSSWAP", 2097085 blocks at 4194338, type: swap
IPsec: Initialized Security Association Processing.
boot device: ld0
root on dk0 dumps on dk1
root file system type: ffs
kern.module.path=/stand/amd64/9.0/modules
ena0: device is going UP
ena0: for IO queue 0 interrupting at msix1 vec 1 affinity to 1
ena0: for IO queue 1 interrupting at msix1 vec 2 affinity to 0

ここで、com0というのが、Get System Logに出力が表示されるシリアルポートです。 Get System Logに表示されるようにするには、/boot.cfgを以下のように修正します。

$ cat /boot.cfg
menu=Boot normally:rndseed /var/db/entropy-file;consdev com0;boot
menu=Boot single user:rndseed /var/db/entropy-file;boot -s
menu=Drop to boot prompt:prompt
default=1
timeout=5
clear=1
つまり、consdev com0を追加します。 これにより、Actions → Instance Settings → Get System Log で下図のようにブートメッセージを表示できます。

これで、Linuxのインスタンスと同様に動作させられたのではないでしょうか。

ラップトップのI2C接続なタッチスクリーンをキャリブレーションして快適に使う

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

はじめに

HP Spectre x360 13-inch ae019TUというラップトップを使っています。 このラップトップには、ペンと指の両方で操作できるタッチスクリーンが搭載されています。 このタッチスクリーンは、NetBSD-currentだと、ims(4)として認識されます。 しかし、画面の表示と一致させるにはキャリブレーションが必要です。

キャリブレーションの方法

NetBSD-currentでは、src/sys/dev/i2c/ims.c 1.2以降、 tpcalibの仕組みでキャリブレーションができるようになっています。 これは、wsmouse_calibcoords構造体に条件を設定してioctl(2)を発行すると実行できます。

その際に与えるべき値は、options DEBUGを指定してビルドしたカーネルで起動すると、ブートメッセージに表示されます。 HP Spectre x360 13-inch ae019TUの場合には、タッチスクリーンは、X方向は0から18344、Y方向は0から10544の値を出力します。

ioctl(2)の実際

ペンで操作する場合のタッチスクリーンは、/dev/wsmouse2に割り当てられています。 この場合の概略の処理は以下のようです。

struct wsmouse_calibcoords calibcoords;
memset(&calibcoords, 0, sizeof(calibcoords));

int fd = open("/dev/wsmouse2", O_RDWR);

/* calibcoords構造体を設定する。 */

ioctl(fd, WSMOUSEIO_SCALIBCOORDS, &calibcoords);
つまり、設定されたcalibcoords構造体を、/dev/wsmouse2に対して、設定(WSMOUSEIO_SCALIBCOORDS)することで、 キャリブレーションができます。

では、calibcoords構造体には何を与えたら良いのでしょうか。 src/sys/dev/wscons/tpcalib.csrc/sys/dev/wscons/mra.cを読むと、 calibcoords.samples[0]に中央の座標、 calibcoords.samples[1]に左上の座標、 calibcoords.samples[2]に左下の座標、 calibcoords.samples[3]に右下の座標、 calibcoords.samples[4]に右上の座標 を指定すれば良いことが分かりました。 今回は、mra.cの想定するようにゆがんだ四角形を画面に合わせるのではありませんが、 簡単ですので、5点を指定してみます。

int X = 18344;
int Y = 10544;
int dispX = 3840 - 1;
int dispY = 2160 - 1;

calibcoords.minx = 0;
calibcoords.maxx = dispX;
calibcoords.miny = 0;
calibcoords.maxy = dispY;

/* center */
calibcoords.samples[0].rawx = X / 2;
calibcoords.samples[0].rawy = Y / 2;
calibcoords.samples[0].x = dispX / 2;
calibcoords.samples[0].y = dispY / 2;

/* top left */
calibcoords.samples[1].rawx = 0;
calibcoords.samples[1].rawy = 0;
calibcoords.samples[1].x = 0;
calibcoords.samples[1].y = 0;

/* bottom left */
calibcoords.samples[2].rawx = 0;
calibcoords.samples[2].rawy = Y;
calibcoords.samples[2].x = 0;
calibcoords.samples[2].y = dispY;

/* bottom right */
calibcoords.samples[3].rawx = X;
calibcoords.samples[3].rawy = Y;
calibcoords.samples[3].x = dispX;
calibcoords.samples[3].y = dispY;

/* top right */
calibcoords.samples[4].rawx = X;
calibcoords.samples[4].rawy = 0;
calibcoords.samples[4].x = dispX;
calibcoords.samples[4].y = 0;
これで、calibcoords構造体は準備できました。

実際に使用する

これをCコンパイラーでコンパイルして、/dev/wsmouse2が開かれて利用されていない状態で実行します。 それによって、以降例えばX window systemを立ち上げると、キャリブレーションされた状態で利用できます。

pkgsrc/editors/xournalppで使ってみます。

必要ない時には、以下のように切り離しておくのが良さそうです。

# /usr/sbin/wsmuxctl -f /dev/wsmux0 -r wsmouse2

NetBSDとGoogle Chtomecast

この記事は、NetBSD Advent Calendar 2019の2日目の記事です。

はじめに

いつだったか忘れてしまいましたが安売りをしていた時に、Google Chromecastを購入していました。 ですが、スマートフォンやPCのGoogle Chromeから投影しないといけないので、 自立しているAmazon Fire TV Stickに比べて活躍の機会があまりありませんでした。

NetBSDラップトップから画面を投影できるのであれば、HDMIケーブルで接続しなくて良いかもしれません。 今回は、NetBSD環境の画面を投影してみました。

ライブラリーを剪定する

ウェブを検索してみると、以下の4つの方法が有望そうです。

後ろから2つはnode.jsのモジュールです。 これはpkgsrcではパッケージングしにくいので、上から2つを試してみました。

VLCのscreen://を試す

結果から言うと、依存しているlibmicrodnsがNetBSDに対応しておらず、ビルドできませんでした。 MCAST_JOIN_GROUPがヘッダーファイルで定義されていない場合のコードが、正しくないようです。 RFC3678を良く読まないといけないようなので、今回は断念しました。

pyChromecastを試す

pyChromecastは、pkgsrc/net/py-pychromecastに用意しました。 以下のようにインストールできます。

$ cd /usr/pkgsrc/net/py=pychromecast
$ make install
ただし、pyChromecast自体はライブラリーだけなので、サンプルプログラム等が付属する訳ではありません。 pyChromecastzeroconfというPythonのみで書かれたライブラリーのあかげで、無事に使うことができました。 pyChromecastのREADME.rstを参考に以下のようなファイルを作って実行してみました。 30秒のビデオが再生できました。
import time
import pychromecast

chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == "Living Room TV")
cast.wait()
print(cast.status)

mc = cast.media_controller
mc.play_media('https://www.ryoon.net/~ryoon/BigBuckBunny.mp4', 'video/mp4')
mc.block_until_active()
mc.play()
time.sleep(30)
mc.stop()
Chromecastへ映像を送る方法は分かりました。

次に画面をChromecastに送る方法を考えてみます。 自分のChromecastから見える場所にビデオストリームを置いてやれば良いはずです。 画面をキャプチャーするのは、ffmpegx11grabソースが一番手軽なように思います。 そして、ffmpegと組み合わせるとなると、一番簡単に使えるのはffserverです。 ffserverは、pkgsrc/multimediaffmpeg3を最後に削除されてしまいました。 そこで、今回はffmpeg4パッケージではなくffmpeg3を使うことにします。

さて、そもそも、Chromcastが再生できるビデオストリームとはのような仕様でしょうか? Supported Media for Google Castのページによると、 WebMコンテナーのVP8ビデオであれば再生できそうです。 解像度は、1980×1080も可能なようですが、1280×720で進めてみます。

このようなビデオを配信するffserver3の設定ファイルは以下のようになります。 サウンドは今回は配信しません。

Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 1000
MaxClients 200
MaxBandwidth 10000
CustomLog -

<:Feed screen.ffm>
File /tmp/screen.ffm
FileMaxSize 20M
<:/Feed>

<:Stream screen.webm>
Feed screen.ffm
Format webm
VideoCodec libvpx
VideoFrameRate 30
VideoSize 1280x720
VideoBitRate 512
VideoBufferSize 80
VideoGopSize 30
NoAudio
<:/Stream>
実行は以下のようにします。。
$ ffserver3 -f ffserver3-vp8.conf
これで、http://localhost:8090/screen.ffmffmpeg3コマンドでビデオを送信してやると、 http://10.81.0.117:8090/screen.webm (ここで、10.81.0.117はNetBSDラップトップのIPアドレス)でストリーミング配信されます。

これに画面の左上1280×720ピクセル分を流し込むには、以下のように実行します。

ffmpeg3 -f x11grab -r 30 -s 1280x720 -i :0.0 -vcodec vp8 -c:v libvpx -b:v 2M -threads 2 -s 1280x720 http://localhost:8090/screen.ffm

このストリーミング配信を再生するようにChromecastに指示するのは以下のようなファイルを用意します。

import time
import pychromecast

chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == "Living Room TV")
cast.wait()
print(cast.status)

mc = cast.media_controller
mc.play_media('http://10.81.0.117:8090/screen.webm', 'video/webm; codecs="vp8, vorbis"')
mc.block_until_active()
mc.play()
time.sleep(120)
mc.stop()
ファイル名をscreencast.pyとすると、以下のように実行します。2分間再生します。
$ python3.8 screencast.py

私の環境では、約5秒から15秒で遅れで配信することができました。 ffmpeg3コマンドのオプションを工夫することで、遅延は短くできるかもしれません。

インストールされていないOpenTypeやTrueTypeのフォントのプレビュー方法

以前からNetBSDとX.orgの環境で、OpenTypeやTrueTypeのフォントをfontconfigやXで使うようにしてからではなく、 プレビューしたいと考えていた。 Linux用のfont viewerを検索しても、依存関係が複雑だったり、利用できるようにしてからしかプレビューできなかったりして、 良いものが見つからなかった。 pkgsrc/graphics/libotfbin/otfviewの引数にotfファイルやttfファイルを与えれば良い。

C++のシンボルをdemangleする

なるべくならC++で書かれたプログラムに関わりたくないような気がしているのだが、 当然のようにそういう訳にもいかない。 C++のシンボルをdemangleする方法をメモしておく。

$ nm /usr/lib/libstdc++.so.9
(snip)
0000000000386d90 V _ZGVNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE
(snip)

$ nm -C /usr/lib/libstdc++.so.9
(snip)
0000000000386d90 V guard variable for std::__cxx11::time_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::id
(snip)
文字列として得られた場合には、c++filtが使える。
$ c++filt _ZGVNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE
guard variable for std::__cxx11::time_get&t;char, std::istreambuf_iterator&t;char, std::char_traits&t;char> > >::id
GCCとclangでは同じフォーマットになっているようなので、区分を気にしなくて良いはずである。

左手で操作するための有線接続マウスを選ぶ

マウスを操作する時には、左手を使っている。 左利きではないのだが、右手は忙しいので、左手に分担させている。

Windowsでは、マウスの左右のボタンを交換して動作させる機能があって、 そうすれば、左手であれば、右クリックが右手操作時の左クリックに、 左クリックが右手操作時の右クリックと、左右対称になって操作しやすい。 ただし、これには欠点もあって、リモートデスクトップ越しに操作する場合、 リモートでもマウスの左右のボタンを交換する設定をしないといけない。 いつでも同じ環境からリモート接続するとは限らないし、 タッチパッドを使う際には、右手で操作するので、うまく行かない。 また、いつもと違うマシンを使う際にも、いちいちマウスの設定をしないといけないのは 面倒である。

いろいろなマウスを試す中で、やっと左手操作用の設定をマウスに記憶させて、 どんな環境でも左右のボタンが逆になるマウス見つけることができた。 Logicool G-PPD-001r Pro Heroゲーミングマウス である。 これは、左右対称な形状をしているので、左手で持っても右手で持っても違和感がない。

これは、Windows上で設定ソフトウエアにより左右ボタンを交換した設定を マウス本体内に保存すると、設定ソフトウエアのないマシンでも、 WindowsでなくNetBSDであっても、左右ボタンを交換した設定で動作する。 これにより、上述したような問題は全て回避できる。

ただ、不満もあって、LEDが光るのをしない設定にしても、マウスをUSBポートに接続した直後は 七色に光ってしまう。

次は、無線接続で同様なものを導入したいが、それはどれだろうか?

ちなみに、Microsoft Classic IntelliMouseを同時期に手に入れたのだが、 これは全く駄目だった。 と言うのは、設定ソフトウエアでの左右のボタンの切り替えは、Windowsの左右ボタン交換設定への ショートカットになっていて、つまりはマウス本体内に左右ボタンの交換設定を保存することは できないし、リモートデスクトップでの問題も発生する。 また、右手に最適化した左右対称ではない形状なので、左手で利用するのには困難がある。

JRubyで利用しているJDKのバージョンを確認する

Oracleデータベースに接続するプログラムを書きたいが、 NetBSDでも動くようにしたいと考えると、JDBCを使うしかないように思っている。 Javaを直接は書きたくないので、JRubyを使っている。

Oracle JDKにはお金がかかるようになってしまい、OpenJDKを使うようになったので、 OpenJDKのオフィシャルな配布物を使おうとすると、自分でパスやJAVA_HOMEを設定しないといけない。 そうすると、複数のOpenJDKがディスク内に存在しているので、ちゃんとJRubyが狙いの JDKを使って動いているか確認したくなる。

確認するには、irbで以下のように実行すれば良い。

> ENV_JAVA['java.version']

Bloggerでcode-prettifyを使う

Google code-prettifyblog.onodera.asiaでは利用している。 ここはBloggerを使っているので、HTMLは用意されているテーマを元に生成される。 当然、Google code-prettifyは、Bloggerの用意するテーマでは使うようにはなっていない。 以下のようにheadタグ内に追記すれば、行番号を振る場合には毎行に付加するようにしてGoogle code-prettifyを利用できる。

<script src='https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js'/>
<style>
  .prettyprint ol.linenums > li { list-style-type: decimal; }
</style>

ウェブアプリなプレゼンテーションツールは何を使うべきか?

はじめに

私は、いつもオンラインである訳ではないので、実際にはLibreOfficeを pkgsrcからインストールして、プレゼンテーション資料を作るのが良いと いうことになってしまうのだが、Google Slides等のオンラインの ツールについて気になっていた。

Google SlidesとMicrosoft Office OnlineのPowerPoint、 iCloudのApple Keynoteの3つを使ってみたので感想を書いておく。 ウェブブラウザーはMozilla Firefoxを使った。

Google Slides

感想を一言で言うと普通に使えるということである。 テーマも無難なものが揃っているし、サードパーティーのテーマも提供されている。 フォントには、日本語のフォントが見当たらないように見えたのだが、 どうせゴシック体しか使わないので、気にならなかった。 欧文フォントについては、非常に多く用意されている。 こんなフォント使うかな…と思うようなものも多い気がするが。 テキストボックスの挙動としては、テキストボックスから行があふれても フォントサイズを小さくするのではなく、はみ出していくだけの挙動になっている。 オートシェイプ的なものは、基本的なものは揃っており、私は困ることはなかった。 特に利用制限はないようなので、ビジネスにも利用できるのではないかと思う。

Microsoft Office OnlineのPowerPoint

Microsoft PowerPointを忠実に再現しているような印象を持った。 PowerPointに慣れているのであれば、ベストなサービスのように思う。 テキストボックスの挙動や、オートシェイプの種類もPowerPointを踏襲している。 Microsoft Office 365の契約をしていないと商用利用権がないので、 ビジネスには利用できないが、個人的なプレゼンテーションをするには利用できる。 テーマは数多いが、PowerPointのWindowsアプリ同様にあまり使えるものはない ような気がする。

iCloudのApple Keynote

はっきり言うと、使い物にならない。 何をするにも気が利かないので、手作業で微調整しないといけない。 良い所としては、クリップアートに良い物が多い点がある気がする。 これまでmacOSのKeynoteを使ったことがなかったのだが、 まさかiCloud版と同様に使いにくいことはないはずと思うので、 今度機会を作って使ってみたい。 iCloudの規約を読む限りでは、Microsoftの商用利用権的なものの 設定はないようなので、ビジネスでも利用できると思われる。

notmuch Emacs clientで、日本語の電子メールを送る

おそらく、LANG環境変数を見てうまく設定してくれているものだとは思うのだが、 notmuch Emacs clientで日本語の電子メールを書くには、以下の設定をしておく のが良さそうだ。 US-ASCIIでまかなえる場合にはUS-ASCIIで送信したいので、 最初にus-asciiを指定している。

$ cat ~/.emacs
(snip)
(setq mm-coding-system-priorities '(us-ascii iso-2022-jp utf-8))
(snip)
今となっては、ISO-2022-JPをUTF-8に優先する必要があるかは分からない気はする。

JJY以外の時刻配信

日本ではJJYで日本標準時を得ることができる訳だが、JJY Simulatorについて調べていると。 DCF77やWWVBという単語も同時に使われていた。

DCF77というのは、ドイツにおける長波による時刻配信のことを言うようだ。 WWVBは、アメリカ合衆国における時刻配信のようだ。

また、英国ではMSFというサービスがあるようだ。

JJY Simulator for iOSの周辺のこと

JNUGの2019年の運営委員会の際に、 藤原さんが電波時計をiPhoneで合わせているのを見せていただき、どういう仕組みなのか 調べておきたいと思っていたのだが、できていなかった。

お使いになっていたのはJJY SImulatorだったのではないかと思う。 音量を最大にして、イヤホンで再生すると、周囲にJJY互換の電波が発生すると言うものであった。 調べてみると、同様の使い方の別作者によるAndroid版 (JJYEmulator)もあるようである。

原理は、 http://www.starstonesoft.com/jjy_simulator.htmに記載されていた。 音量を最大にすることで矩形波に近い波形を実現し、発生する高調波を利用しているそうだ。

これを常時使うのは難しいかもしれないが、うまく使えばいつもずれている電波時計を 合わせられそうだ。

Windows Server 2012 R2で、エラーコード 80244022で更新のダウンロードに失敗する場合

Windows Server 2012 R2のWindows Updateを、 HTTPプロキシーサーバー経由でMicrosoftのサーバーからダウンロードして実行しようと するのだが、エラーコード0x80244022でダウンロードが失敗してしまい先に進めない マシンが2台ある。 どちらの物理サーバーにインストールされている。 Hyper-V上で仮想マシンにインストールされている同様の環境ではこのエラーは発生しないが、 Hyper-Vが関係するかは分からない。 これらのサーバーはドメインに参加している。またWSUSは存在するがクライアント専用なので これらのマシンでは利用するようには設定されていない。 これは、gpedit.mscで 「イントラネットのMicrosoft更新サービスの場所を指定する」が未構成になっているので 確かである。 また、C:\Windows\Windowsuodate.logファイルにも、80244022であることしか記載されておらず、 ダウンロードしようとしているURLをInternet Explorerで開くと普通にダウンロードできる。

これら2台とも、「Windows Update」サービスを再起動した上で、 「Background Intelligent Transfer Service」サービスを再起動し、 直後にWindows Updateを実行すればダウンロードも進み、インストールも成功することが分かった。 2つのサービスの再起動の順番は、この順序でなくてはならず、逆ではいけない。 また、「インストールの準備をしています」のまま長時間を過ぎても進まない場合には、 再起動した直後にこれら2つのサービスを再起動すれば、すぐにダウンロードに進む。

どう考えてもこれらのマシンに特有な問題だと思うのだが、これらをしばらくお守りする必要があるので、 忘れないように書いておく。

Jabra MOVE Wirelessのイヤークッションの交換

ここ数年間Jabra MOVE Wirelessを使っているのだが、段々とイヤークッションが 劣化して、ボロボロになって来てしまった。 バッテリーを含めその他の部分には大きな問題はないので、イヤークッションのみ 購入しようとしたが純正品は、1,500JPYとリーズナブルな値段ではあるものの、 送料が700 JPYかかり、新品のJabra MOVE Wirelessが4,000 JPY以下であるので、 なかなか購入しがたいと思っていた (今見ると、そもそも純正品は欠品しているようだが)。

互換品がAmazon.co.jpで1,400 JPY(送料込)で売っていた ので、購入してみたが、内側にR/Lの表示がない以外は全く問題なく使えた。

Internet Explorer 11でJavaScript Promiseを使う時

なぜ今になってInternet Explorer 11を使わなくてはいけないのかと思わなくも ないのだが、どうにも仕方がない。 Internet Explorer 11のJavaScriptでは、Promiseがサポートされていないし、 Babelでもshimを使うのを前提としていて、transpileしてくれない。

では、どんなshimを使ったら良いのかと言うと、Internet Explorer 11以外との 互換性を考えると、 es6-promise polyfill が良いようだ。

NetBSDからマイナンバーカードの証明書を使ってsshログインする

はじめに

個人番号カード(マイナンバーカード)を早い段階で入手していたので、 OpenSSHでログインするために利用したいと思っていたのだが、 NetBSD上でのOpenSCなどの使い方が理解できずに放っておいてしまっていた。

ICカードリーダーを確定申告でしか使わないのはもったいないので、再度挑戦して、それなりに使えたので書いておく。 使っているICカードリーダーは、Gemalto (VID: 0x08e6)の接触式SmartCard Reader PC USB-TR (PID: 0x0307)である。

また、NetBSDは、NetBSD/amd64 9.99.8である。

ソフトウェアの準備

pkgsrcを使って以下のようにインストールする。

# cd /usr/pkgsrc/security/opensc
# make install
# cd /usr/pkgsrc/security/ccid
# make install
過去に試した際にはsecurity/ccidをインストールしていなかったので、pcscdでICカードを認識させられなかったようだ。 他にはNetBSD baseのssh-keygensshコマンドを利用する。

公開鍵の抽出とログイン

マイナンバーカードでSSHするの記事には、あまり詳しい操作方法が書かれたいないのだが、 man pageなどを読んでみると、pcscdを起動しておくことが必要だと分かった。 ただし、初回はpkgsrc/security/ccidをインストールしていなかったので、/etc/rc.d/pcscdから起動させても メッセージを見ることができないのもあって、状況が把握できなかった。 infoレベルでメッセージを出しつつ、フォアグラウンドでpcscdを実行してみた。 ICカードリーダーを接続した上で、以下のように起動させる。

# /usr/pkg/sbin/pcscd -f --info
その上で個人番号カードを ICカードリーダーに挿入すると、以下のように認識された。
00000124 Card ATR: 3B E0 00 FF 81 31 FE 45 14
元記事によると、以下のように実行することで利用者証明電子証明書の公開鍵をOpenSSHで使える形式で抽出できるはずであった。
$ pkcs15-tool --read-ssh-key 1 > id_rsa.pub
だが、以下のようにデコードすべきデータが取得できないためかエラーとなり抽出できない。
$ pkcs15-tool --read-ssh-key 1 > id_rsa.pub
Using reader with a card: Gemalto PC Twin Reader (6C55990E) 00 00
Public key enumeration failed: Required ASN.1 object not found
同じことをDebian GNU/Linux 10のOpenSCで試しても同じエラーになるし、Debian GNU/Linux 10で同じpkgsrcのOpenSCを使っても同じエラーになるので、 私の個人番号カードがそういう仕様なのか、OpenSCの方が変わったのかもしれない。 検索してみると、ssh-keygenコマンドもSmartCardを扱えるようなので、以下のように実行してみた。 これによって、4行のテキストファイルとして、OpenSSH形式の公開鍵を抽出できた。
$ ssh-keygen -D /usr/pkg/lib/opensc-pkcs11.so > mynum.pub
Enter PIN for 'User Authentication PIN (JPKI)':
Enter PIN for 'Digital Signature PIN (JPKI)':
私は電子署名用の鍵は使う予定はないのだが、なぜかそれ用のパスワードも入力させられてしまった。 この4つの公開鍵のうち、利用したいものは1行目のみであったので、それをログイン先の~/.ssh/authorized_keysに追記しておく。 その上で以下のように実行すれば良い。
$ ssh -I /usr/pkg/lib/opensc-pkcs11.so REMOTEHOST
Enter PIN for 'User Authentication PIN (JPKI)':
Enter PIN for 'Digital Signature PIN (JPKI)':
やはり、電子署名用の鍵のパスワードも必要になってしまう。

Intel Quick Sync Videoの効果

以前、Intel Quick Sync VideoをNetBSD/amd64-currentで使ってみていたが、 その際には、明確な効果を実感できなかった気がする。 Blender Sintelのビデオは、4Kの物も公開されている。 これをmpvで再生してみると、HP Spectre x369 13-inch ae019TUでは、CPUのみではスムースに再生できない。 mpv --hwdec=vaapi --vo=vaapi Sintel.2010.4k.mkvとすると、スムースに再生できた。 これで、Intel Quick Sync Videoを使うことの利点が明確になったように思う。

Stanford Puffer

スタンフォード大学が、アメリカのニュースチャンネルをウェブ上で再送信するPufferという 研究のためのウェブサイトを公開したのだが、利用規約を読むと、アメリカ合衆国内からしかアクセスしてはいけないとのことだ。 残念だが試せない。

2mを越えた長さの細めのHDMIケーブル

3m程度の長さの細めのHDMIケーブルを購入したいと考えていたのだが、なぜか1.8から2m程度のものしかなくて、 きっと信号の減衰の関係で長いものは実現できないか、規格として定められていないのだろうと考えていた。

バッファローBSHD3Sシリーズというのが、 簡単に手に入るものでは細めで3mのものとしては唯一のもののようだ。 リピーターが内蔵されているもので、極性があってつなぐ向きが決まっているようだ。 ケーブル直径が3.7mmというのは、 エレコムDH-HDP14SS10BKのような3.2mmと比べると結構太い気もする。 5mだと直径4.4mmだそうなので、あまり細いという気はしない。

VMware ESXiでのVMXNET 2のサポート

VMware ESXi 6.7では、VMXNET 3を使っているのだが、VMXNET 2は提供されているのか把握していなかった。 ESXi 6.5仮想マシンでは、VMXNET 2 (Enhanced)というのがサポートされているようだ。 ESXi 6.7仮想マシンでは、VMXNET 3はサポートされているが、VMXNET 2はサポートされていないようだ。

CorvusSKK 2.7.6で.gzな辞書ファイルが利用できる

CorvusSKK 2.7.6で.gzな辞書ファイルに対応していた。 SKK辞書のページでは、gzipで圧縮された.gzファイルでダウンロードできる。 圧縮されていないファイルもダウンロードはできるのだが、自分で編集するものではないので、.gzファイルのままで利用できれば便利だと思っていた。 CorvusSKKは奇をてらっていないMicrosoft Windows用のSKKの実装として便利に利用させてもらっている。

LLVM/clangでビルドできるNetBSD-current

http://releng.NetBSD.org/builds/HEAD-llvm/によると、LLVM/clangでビルドを試みることができる NetBSD-currentは、以下のアーキテクチャーのようだ。

  • evbarm-earm
  • evbppc
  • macppc
  • sparc
  • x86_64
  • i386
  • sparc64
evbarm-earmが、earmv6やearmv7に最適化したものに対応しているのか、earmだけなのかは確認しておきたい。

notmuch Emacs clientでGnuPS 2でPGP/MIMEな電子署名をする方法

notmuch Emacs clientでは、メッセージを書いているバッファーで、C-c C-m (つまりRET) s pと入力することで、PGP/MIMEな電子署名を付与することができる。

notmuch Emacs clientでPGP暗号化されたメッセージがDecryption Errorになる場合、または、GnuPG 2.2.16であらかじめパスフレーズをキャッシュしておく方法

IMAP4を利用することにして、Mewからnotmuch Emacs clientに乗り換えたのだが、なかなか機能の全容が分からず、電子メールの消化が進まなかった。

PGPで暗号化されたメッセージを受信した場合に、紫色のDecryption Errorが表示されて、復号できずに困っていたので、 どのようにすれば良いか書いておく。

まず前提としてGnuPG 2を使っている。 notmuch Emacs clientはGnuPG 2を使うのが標準のようなので、特に追加の設定はしていない。 Decryption Errorの意味は、GnuPG 2がパスフレーズを知らない状態を示しているようだ。 もしかしたら、~/.gnupg/gpg-agent.confpinentry-program /usr/pkg/bin/pinentry-ttyではなく、 pinentry-program /usr/pkg/bin/pinentry-emacsを設定しておけば良いのかもしれないが、 今回の話はpinentry-ttyを使っている場合である。

pinentry-ttyは、GnuPG 2から呼ばない場合には、どうやら使えないようである。 また、gpg-agentコマンドも--allow-preset-passphraseコマンドライン引数か、 allow-preset-passphrase~/.gnupg/gpg-agent.confに設定しておく必要があった。 私はzshをログインシェルにしているので、~/.zloginに、以下のように設定した。 現在はevalはしないで良いような気もするのだが、確認していないので、従前の設定を踏襲してある、

eval `gpg-agent -s --daemon --allow-preset-passphrase`

次に、パスフレーズをキャッシュしておく。 パスフレーズをキャッシュするには、/usr/pkg/libexec/gpg-preset-passphraseを使うのだが、 このコマンドにはkeygripという値を引数で指定する必要があるので、まずkeygripを確認する。

$ gpg2 --with-keygrip -K
(snip)
sec   rsa4096 2004-07-12 [SC]
      82A2DC9176E0A10A8ABBFD1BF40427FAC7D115F3
      Keygrip = keygrip1keygrip1keygrip1keygrip1keygrip1
uid           [ultimate] Ryo ONODERA 
uid           [ultimate] Ryo ONODERA 
uid           [ultimate] Ryo ONODERA 
uid           [ultimate] Ryo ONODERA 
ssb   rsa4096 2004-07-12 [E]
      Keygrip = keygrip2keygrip2keygrip2keygrip2keygrip2
(snip)

ここで使うのは、keygrip2keygrip2keygrip2keygrip2keygrip2の方のkeygripの値である。 keygrip1keygrip1keygrip1keygrip1keygrip1ではないので注意しなくてはいけない。 これを使って、以下のように実行する。

$ /usr/pkg/libexec/gpg-preset-passphrase --preset keygrip2keygrip2keygrip2keygrip2keygrip2
INPUT_YOUR_PASSPHRASE[enter key]
これによって、パスフレーズがキャッシュされた。

こうしておくことで、notmuch Emacs clientでも復号できる。 Emacsにうまく統合するのが正しいのだろうが、事前にキャッシュするのは、これはこれでできて欲しい操作ではあると思うので書いておく。

NetBSD上のwpa_supplicantで、WPA-EAPなWi-Fiアクセスポイントに接続する

とある所のWPA-EAPなWi-Fiアクセスポイントに接続する機会があって、NetBSDをインストールしたラップトップを使ってみた。 このラップトップには、NetBSD/amd64 8.99がインストールされていて、iwm(4)なデバイスを使っている。

まず、以下のような内容のテキストファイルを用意する。ここでは、wpa-eap.confと言うファイル名にしておく。 ユーザーIDとパスワードを使って認証するので、そのようにしている。

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
        scan_ssid=1
        ssid="WIFIAPNAME"
        key_mgmt=WPA-EAP
        eap=PEAP
        identity="USERNAME@DOMAINNAME"
        password="PASSWORD"
        phase1="peaplabel=0"
        phase2="auth=MSCHAPV2"
        priority=0
}
これを、以下のようにして実行する。
$ sudo wpa_supplicant -d -i iwm0 -c wpa-eap.conf

この設定値がどこでも正しい訳ではないはずだが、とある所のものはこれで動く。

PuTTY 0.71とECDSA秘密鍵の組み合わせのバグ

Windowsを使わないとけない状況があって、当然のようにNetBSDな環境にログインできないと面倒で仕方がない事というのはあって、 PuTTYを使ってSSHでログインしている。 しばらく前に、PuTTY 0.71にした時に、ECDSAな鍵をログイン先のNetBSDで追加しようとするとエラーになって足せないと言う問題があった。 PuTTY bug pageant-ecdsa-assert-failに 掲載されているバグのようだった。 PuTTYのSnapshot版では直っているので、pageant.exeのみ入れ替えて使っている。 Windowsには、当然のようにSSHの秘密鍵はNetBSD環境にログインするためだけのものしか置いていないので、 記載されているようにpagenant.exeの起動時に秘密鍵を指定することはできないので、こうするしかないようだ。

PostgreSQLのODBCドライバーをバッチファイルで登録する

PostgreSQLにはOLE DBドライバーのFLOSSな64ビット版がないようなので、ODBCを使わざるを得ないように思う。 そうなると、ODBCデータソースを設定しておかないといけない。 開発しているのは、都合があって64ビット版Microsoft Windows 10上でMicrosoft Excelであり、 利用者は64ビットWindows 10上の32ビット版のExcelを使っている。

利用者はスキル的にODBCドライバーの設定など正しくしてもらえそうではないので、バッチファイルを管理者権限で実行してもらう くらいにおさめたい。 64ビットWindows 10上で、32ビットExcelと64ビットExcelのそれぞれ用にODBCデータソースを作成するバッチファイルは以下のようである。

rem 32-bit OS/32-bit Office
C:\Windows\System32\odbcconf.exe /A {CONFIGSYSDSN "PostgreSQL Unicode" "DSN=dsnname|DATABASE=databasename|SERVER=servername|PORT=5432|UID=postgres|PWD=password"}

rem 64-bit OS/64-bit Office:
C:\Windows\System32\odbcconf.exe /A {CONFIGSYSDSN "PostgreSQL Unicode(x64)" "DSN=dsnname|DATABASE=databasename|SERVER=servername|PORT=5432|UID=postgres|PWD=password"}

rem 64-bit OS/32-bit Office:
C:\Windows\SysWOW64\odbcconf.exe /A {CONFIGSYSDSN "PostgreSQL Unicode" "DSN=dsnname|DATABASE=databasename|SERVER=servername|PORT=5432|UID=postgres|PWD=password"}

Microsoft ExcelのVisual Basic for Applicationsで、Excelが32ビットか64ビットか判定する

いまだに、Microsoft Office 2010を使わされているのである。 だからと言う訳ではないが、Visual Basic for Applications (VBA)を使うことがある。 その場合には、OLE DBを使ってデータベースにアクセスして取得したレコードセットを操作することが多い。

そこで問題になるのが、データベースサーバーがPostgreSQLの場合である。 公式のOLE DBライブラリーがWin64用には存在しないのである。 となると、ODBCドライバーをインストールし、バッチファイルでシステムデータソースを設定するしかない。 しかも、32ビットと64ビットでODBCドライバーの名前は異なるので、VBA内で切り替えなくてはいけない。

そういう場合に役立つのが、条件付きコンパイルである。 以下のように、定数Win64が真であるかどうかで判別すれば良い。

#If Win64 Then
  ' 64ビットMS Office用の処理
#else
  ' 32ビットMS Office用の処理
#end if

VBAでは何をするにも面倒なので、JavaScriptでもPythonでも良いので使えるようになって欲しい。

qemuのオーディオ機能をHelenOSで確認する

NetBSD上のqemuでオーディオ機能がちゃんと動くか確認しようと思っていたのだが、なかなかできなかった。 HelenOS 0.9.1 for IA32がSound Blaster 16とIntel HD Audioをサポートしているようで、 これらはqemuがエミュレートしてくれるデバイスでもあるので試してみた。 オーディオ出力は、PulseAudioを使うことにする。

pkgsrc/devel/SDL2をpulseaudioオプションを有効にしてインストールした上で、pkgsrc/emulators/qemuをインストールしてある。

$ cd /usr/pkgsrc/devel/SDL2
$ make PKG_OPTIONS.SDL2=pulseaudio install
$ cd /usr/pkgsrc/emulators/qemu
$ make install
ホストは、NetBSD/amd64 8.99.42である。 SDL2がPulseAudioを使うようにするには、以下のように環境変数を設定しておく。
$ set SDL_AUDIODRIVER=pulseaudio
$ export SDL_AUDIODRIVER
Sound Blaster 16の場合には、以下のようにする。
qemu-system-i386 -cdrom HelenOS-0.9.1-ia32.iso -audiodev id=sdl,driver=sdl -soundhw sb16
Intel HD AUdioの場合には、以下のようにする。
qemu-system-i386 -cdrom HelenOS-0.9.1-ia32.iso -audiodev id=sdl,driver=sdl -soundhw hda

開いたqemuのウィンドウ内のHelenOSのターミナルで、以下のように実行すればデモ用のwavファイルを再生できた。 あまりデモ向きの音ではないような…。

/ # wavplay demo.wav

Git bash for Windowsのフォントサイズを変更する方法

Git for Windowsを使っているのだが、標準ではGit bashのウィンドウのフォントが小さ過ぎるように感じている。 タイトルを右クリックし、Textを選択し、Fontの部分でフォントのサイズや種類を変更できる。

GNU troff (groff)で、UTF-8なファイルを処理する

groff 1.22.4では、UTF-8な入力ファイルを扱えるようになったという噂を聞いていたように思う。 私は、以前からgroffで日本語の含まれたPDFファイルを出力したかったのだが、groffでどこまでできるか試してみた。 だが、結論としては、groff 1.22.4で日本語の文字の含まれたPDFファイルを出力することはできなかった。 PostScriptファイルも同様に駄目である。 テキストファイルを出力する場合には、正しく動く。 HTMLファイルを出力する場合には、日本語の文字は数値実体参照になってしまい、1文字ごとにホワイトスペースも入ってしまい使えない。 でも、UTF-8なテキストファイルを出力できるだけでも、例えば日本語のman pagesを出力するには十分であり、 役に立つように思う。

msマクロの場合では、以下のようにすれば良い。

groff -Kutf8 -Tutf8 -ms test.roff > test.txt
man pagesで使われるmdocマクロの場合では、以下のようにすれば良い。
groff -Kutf8 -Tutf8 -mdoc test.1 | less -R
ここで、less -Rは、lessコマンドでエスケープシーケンスを反映させて表示すると言うことである。

Google G Suite MailとK-9 Mail for Android、Notmuch Emacs clientでスターを共有する

長年、POP3を常用してきたのでEmacs上のMewを使ってきたのだが、あまりに未読の電子メールを溜めてしまうので、 IMAP4であれば各端末間で未読既読等のステータスを共有し、時間を見付けて未読の電子メールを既読にできるのではないかと考えた。 最初は、muとそのEmacsフロントエンドであるmu4eを使おうとしたのだが、NetBSD上では日本語の電子メールを正しく扱えないようである。 あるいは、私の環境設定が間違っているのかもしれないが…。 いずれにしても、私では日本語の電子メールを扱うことができなかった。

そこで、同じようであると言うNotmuchを試してみた。これは、日本語も正しく扱える。いろいろ設定は必要だったが、 それについては機会を改めて書きたい。

最初の未読の電子メールを既読にする話に戻ると、既読にして行くと、対応が必要なものも既読になってしまう。 そこで、スターを付けておくことを考えた。Notmuchは自由にタグを付けることができるのだが、 G Suite Mailのウェブ画面とK-9 Mailで共有されるのが分かっているスターは、 Notmuchでそれがスター表示になるのまでも分かったのだが、Notmuchでスターを付けたり外したりする方法が 分からなかった。

Notmuch Emacs clientは、?キーを押すことで、その場面に適切なヘルプメッセージが表示されるのだが、 なかなかスターについて分からなかった。 結論としては、flaggedというタグがG Suite MailやK-9 Mailのスターを指しているタグだった。 なので、電子メールの一覧画面や電子メールメッセージの閲覧画面で、+flaggedと入力することでスターを付けることができ、 -flaggedと入力することでスターを外すことができた。

対応しないといけない電子メールで古いものを見付けてしまいがっかりしているが、それは別の話である。

Windowsでメニュー付きのDVDを再生したい場合

Microsoft Windows 10には、DVDを再生するソフトウェアは附属していない。 しかし、自分で作ったメニュー付きのDVD-Rに記録されたDVD-Videoを再生したい場合に、 何を使えば良いのか試してみた。 mpvとsmplayer、VLC 3を試して、VLC3だけがメニューから選択して再生できた。

Authoritative name serverをNSDをマスターにしてknot DNSをスレイブで構成する

Authoritative name serverをマスターもスレイブもNSDで構成していたのだが、同じ実装で揃えるのはいけないと思い直して、 スレイブをknot DNSに変更していた。 後ほど参照する必要がありそうなことを書いておく。 NSDとknot DNSのいずれもpkgsrcからインストールしている。

#
# nsd.conf -- the NSD(8) configuration file, nsd.conf(5).
#
# Copyright (c) 2001-2011, NLnet Labs. All rights reserved.
#
# See LICENSE for the license.
#

# This is a comment.
# Sample configuration file
# include: "file" # include that file's text over here.  Globbed, "*.conf"

# options for the nsd server
server:
 # Number of NSD servers to fork.  Put the number of CPUs to use here.
 server-count: 1

 # uncomment to specify specific interfaces to bind (default are the
 # wildcard interfaces 0.0.0.0 and ::0).
 # For servers with multiple IP addresses, list them one by one,
 # or the source address of replies could be wrong.
 # Use ip-transparent to be able to list addresses that turn on later.
 # ip-address: 1.2.3.4
 # ip-address: 1.2.3.4@5678
 # ip-address: 12fe::8ef0
 ip-address: xxx.xxx.xxx.xxx
 ip-address: xxxx::xxxx

 # Allow binding to non local addresses. Default no.
 # ip-transparent: no

 # use the reuseport socket option for performance. Default no.
 # reuseport: no

 # enable debug mode, does not fork daemon process into the background.
 # debug-mode: no

 # listen on IPv4 connections
 # do-ip4: yes
 do-ip4: yes

 # listen on IPv6 connections
 # do-ip6: yes
 do-ip6: yes

 # port to answer queries on. default is 53.
 # port: 53
 port: 53

 # Verbosity level.
 # verbosity: 0
 verbosity: 0

 # After binding socket, drop user privileges.
 # can be a username, id or id.gid.
 # username: nsd
 username: nsd

 # Run NSD in a chroot-jail.
 # make sure to have pidfile and database reachable from there.
 # by default, no chroot-jail is used.
 # chroot: "/usr/pkg/etc/nsd"
 #chroot: "/usr/pkg/etc/nsd"

 # The directory for zonefile: files.  The daemon chdirs here.
 # zonesdir: "/usr/pkg/etc/nsd"
 zonesdir: "/usr/pkg/etc/nsd"

 # the list of dynamically added zones.
 # zonelistfile: "/var/nsd/zone.list"
 zonelistfile: "/usr/pkg/etc/nsd/zone.list"

 # the database to use
 # if set to "" then no disk-database is used, less memory usage.
 # database: "/var/nsd/nsd.db"
 database: "/usr/pkg/etc/nsd/nsd.db"

 # log messages to file. Default to stderr and syslog (with
 # facility LOG_DAEMON).  stderr disappears when daemon goes to bg.
 # logfile: "/var/log/nsd.log"
 logfile: "/usr/pkg/etc/nsd/nsd.log"

 # File to store pid for nsd in.
 # pidfile: "/var/run/nsd/nsd.pid"
 pidfile: "/usr/pkg/etc/nsd/nsd.pid"

 # The file where secondary zone refresh and expire timeouts are kept.
 # If you delete this file, all secondary zones are forced to be 
 # 'refreshing' (as if nsd got a notify).  Set to "" to disable.
 # xfrdfile: "/var/nsd/nsd-xfrd.state"
 xfrdfile: "/usr/pkg/etc/nsd/nsd-xfrd.state"

 # The directory where zone transfers are stored, in a subdir of it.
 # xfrdir: "/tmp"
 xfrdir: "/usr/pkg/etc/nsd"

 # don't answer VERSION.BIND and VERSION.SERVER CHAOS class queries
 # hide-version: no
 hide-version: yes

 # version string the server responds with for chaos queries.
 # default is 'NSD x.y.z' with the server's version number.
 # version: "NSD"

 # identify the server (CH TXT ID.SERVER entry).
 # identity: "unidentified server"

 # NSID identity (hex string, or "ascii_somestring"). default disabled.
 # nsid: "aabbccdd"

 # Maximum number of concurrent TCP connections per server.
 # tcp-count: 100
 tcp-count: 100

 # Maximum number of queries served on a single TCP connection.
 # By default 0, which means no maximum.
 # tcp-query-count: 0
 tcp-query-count: 100

 # Override the default (120 seconds) TCP timeout.
 # tcp-timeout: 120
 tcp-timeout: 120

 # Preferred EDNS buffer size for IPv4.
 # ipv4-edns-size: 4096
 ipv4-edns-size: 4096

 # Preferred EDNS buffer size for IPv6.
 # ipv6-edns-size: 4096
 ipv6-edns-size: 4096

 # statistics are produced every number of seconds. Prints to log.
 # Default is 0, meaning no statistics are produced.
 # statistics: 3600
 statistics: 0

 # Number of seconds between reloads triggered by xfrd.
 # xfrd-reload-timeout: 1
 
 # log timestamp in ascii (y-m-d h:m:s.msec), yes is default.
 # log-time-ascii: yes

 # round robin rotation of records in the answer.
 # round-robin: no

 # check mtime of all zone files on start and sighup
 # zonefiles-check: yes
 zonefiles-check: yes
 
 # write changed zonefiles to disk, every N seconds.
 # default is 0(disabled) or 3600(if database is "").
 # zonefiles-write: 3600


# Remote control config section. 
remote-control:
 # Enable remote control with nsd-control(8) here.
 # set up the keys and certificates with nsd-control-setup.
 # control-enable: no
 control-enable: yes

 # what interfaces are listened to for control, default is on localhost.
 # control-interface: 127.0.0.1
 # control-interface: ::1
 control-interface: 127.0.0.1
 control-interface: ::1

 # port number for remote control operations (uses TLS over TCP).
 # control-port: 8952
 control-port: 8952

 # nsd server key file for remote control.
 # server-key-file: "/usr/pkg/etc/nsd/nsd_server.key"
 server-key-file: "/usr/pkg/etc/nsd/nsd_server.key"

 # nsd server certificate file for remote control.
 # server-cert-file: "/usr/pkg/etc/nsd/nsd_server.pem"
 server-cert-file: "/usr/pkg/etc/nsd/nsd_server.pem"

 # nsd-control key file.
 # control-key-file: "/usr/pkg/etc/nsd/nsd_control.key"
 control-key-file: "/usr/pkg/etc/nsd/nsd_control.key"

 # nsd-control certificate file.
 # control-cert-file: "/usr/pkg/etc/nsd/nsd_control.pem"
 control-cert-file: "/usr/pkg/etc/nsd/nsd_control.pem"


# Secret keys for TSIGs that secure zone transfers.
# You could include: "secret.keys" and put the 'key:' statements in there,
# and give that file special access control permissions.
#
# key:
 # The key name is sent to the other party, it must be the same
 #name: "keyname"
 # algorithm hmac-md5, or hmac-sha1, or hmac-sha256 (if compiled in)
 #algorithm: hmac-sha256
 # secret material, must be the same as the other party uses.
 # base64 encoded random number.
 # e.g. from dd if=/dev/random of=/dev/stdout count=1 bs=32 | base64
 #secret: "K2tf3TRjvQkVCmJF3/Z9vA=="
key:
 name: "key"
 algorithm: hmac-sha256
 secret: "SECRETSTRING"


# Patterns have zone configuration and they are shared by one or more zones.
# 
# pattern:
 # name by which the pattern is referred to
 #name: "myzones"
 # the zonefile for the zones that use this pattern.
 # if relative then from the zonesdir (inside the chroot).
 # the name is processed: %s - zone name (as appears in zone:name).
 # %1 - first character of zone name, %2 second, %3 third.
 # %z - topleveldomain label of zone, %y, %x next labels in name.
 # if label or character does not exist you get a dot '.'.
 # for example "%s.zone" or "zones/%1/%2/%3/%s" or "secondary/%z/%s"
 #zonefile: "%s.zone"
 
 # If no master and slave access control elements are provided,
 # this zone will not be served to/from other servers.

 # A master zone needs notify: and provide-xfr: lists.  A slave
 # may also allow zone transfer (for debug or other secondaries).
 # notify these slaves when the master zone changes, address TSIG|NOKEY
 # IP can be ipv4 and ipv6, with @port for a nondefault port number.
 #notify: 192.0.2.1 NOKEY
 # allow these IPs and TSIG to transfer zones, addr TSIG|NOKEY|BLOCKED
 # address range 192.0.2.0/24, 1.2.3.4&255.255.0.0, 3.0.2.20-3.0.2.40
 #provide-xfr: 192.0.2.0/24 my_tsig_key_name
 # set the number of retries for notify.
 #notify-retry: 5

 # uncomment to provide AXFR to all the world
 # provide-xfr: 0.0.0.0/0 NOKEY
 # provide-xfr: ::0/0 NOKEY

 # A slave zone needs allow-notify: and request-xfr: lists.
 #allow-notify: 2001:db8::0/64 my_tsig_key_name
 # By default, a slave will request a zone transfer with IXFR/TCP.
 # If you want to make use of IXFR/UDP use: UDP addr tsigkey
 # for a master that only speaks AXFR (like NSD) use AXFR addr tsigkey
 #request-xfr: 192.0.2.2 the_tsig_key_name
 # Attention: You cannot use UDP and AXFR together. AXFR is always over 
 # TCP. If you use UDP, we higly recommend you to deploy TSIG.
 # Allow AXFR fallback if the master does not support IXFR. Default
 # is yes.
 #allow-axfr-fallback: yes
 # set local interface for sending zone transfer requests.
 # default is let the OS choose.
 #outgoing-interface: 10.0.0.10

 # if compiled with --enable-zone-stats, give name of stat block for
 # this zone (or group of zones).  Output from nsd-control stats.
 # zonestats: "%s"

 # if you give another pattern name here, at this point the settings
 # from that pattern are inserted into this one (as if it were a 
 # macro).  The statement can be given in between other statements,
 # because the order of access control elements can make a difference
 # (which master to request from first, which slave to notify first).
 #include-pattern: "common-masters"


# Fixed zone entries.  Here you can config zones that cannot be deleted.
# Zones that are dynamically added and deleted are put in the zonelist file.
#
# zone:
  # name: "example.com"
  # you can give a pattern here, all the settings from that pattern
  # are then inserted at this point
  # include-pattern: "master"
  # You can also specify (additional) options directly for this zone.
  # zonefile: "example.com.zone"
  # request-xfr: 192.0.2.1 example.com.key
zone:
 name: zzz.zzz
 zonefile: onodera.net.zone
 notify: yyy.yyy.yyy.yyy key
 notify-retry: 5
 provide-xfr: yyy.yyy.yyy.yyy key
 outgoing-interface: xxx.xxx.xxx.xxx
# This is a sample of a minimal configuration file for Knot DNS.
# See knot.conf(5) or refer to the server documentation.

key:
  - id: key
    algorithm: hmac-sha256
    secret: SECRETSTRING

server:
    rundir: "/var/run/knot"
    user: root:wheel
    listen: [ 0.0.0.0@53, ::@53 ]

log:
  - target: syslog
    any: info

remote:
#  - id: slave
#    address: 192.168.1.1@53
#
  - id: master
    key: key
    address: xxx.xxx.xxx.xxx@53

acl:
#  - id: acl_slave
#    address: 192.168.1.1
#    action: transfer

  - id: acl_master
    address: xxx.xxx.xx
    key: key
    action: notify

template:
  - id: default
    storage: "/usr/pkg/etc/knot"
    file: "%s.zone"

zone:
#    # Master zone
#  - domain: example.com
#    notify: slave
#    acl: acl_slave

    # Slave zone
  - domain: zzz.zzz
    master: master
    acl: acl_master

nsd-config notifyでスレイブに反映できる。force_transferなのかと思ったが、notifyでないといけなかった。

od(1)の逆をするプログラム

od(1)hexdump(1)で例えば16進数ダンプできるが、これを戻すコマンドはNetBSDにはないように見える。 Linuxのman pageを見ると、xxdというコマンドが紹介されている。 これは、vimの一部であるようだ。pkgsrcでは、pkgsrc/editors/vim-shareに含まれている。

GlobalSignの個人向けコードサイニング証明書

個人向けのコードサイニング証明書について調べていたのだが、GlobalSignの個人向けコードサイニング証明書は、2018年12月10日をもって販売終了していたようだ。

wpa_supplicantへのパッチの提出方法

wpa_supplicantにpatchを送る際のガイドラインを読まなくてはいけなかったので、試訳を書いておく。

hostap.gitへの貢献

このソフトウエアは、いかなるプロジェクトでもオープンソースかプロプライエタリーかを問わずに 利用できるパーミッシブなオープンソースライセンスの下で配布されています。 プロジェクトへの貢献は歓迎されていますが、貢献が正しくライセンスされていることを明確に記録する ことが重要です。 これを助けるために、次の手順が用います。

全ての貢献は、以下に示す修正BSDライセンスでライセンスされることが求められる。 Signed-off-byタグをコミットログメッセージの最後に含めることで、 これを受け入れたことを示します。 このタグはThe Developer Certificate of Origin version 1.1 (以下を参照; http://developercertificate.org/l でも入手可能) に合意したことを示します。

hostap.gitへの貢献の現在の要求事項

Developer's Certificate Origin 1.1へ合意したことを示すため、 このプロジェクトへのそれぞれの貢献のコミットメッセージの最後に以下の行を含めてください。

Signed-off-by: Your Name &t;your@email.example.org>
正しい名前を使ってください。偽名や匿名による貢献は、残念ながら受け入れられません。

プロジェクトへの望ましい貢献の提出方法は、 以下のhostapメーリングリストへ電子メールを送ることです。

hostap@lists.infradead.org
このメーリングリストはモデレーションなしでメッセージを配信するには、 事前に購読しておく必要があります。 以下で購読手続きができます。

http://lists.infradead.org/mailman/listinfo/hostap

パッチは全てを1つのパッチにまとめるのではなく、論理的に分割する方が良いです。 言い換えると、コードの整理と新機能、バグ修正は、それぞれのパッチに分けてください。 全てのパッチには変更を修正したコミットログが必要です(変更により何が修正されたか、 どんな機能が追加されたか、なぜこの修正が有用かなど)

プロジェクトで仕様されているコーディングスタイルに従うようにしてください。

一般的には、成形されたパッチを生成する最良の方法は、gitリポジトリーをクローンし、 そこへ変更をコミットしてgit format-patchを使うことです。 パッチはgit send-emailなどで送信できます。

(以下省略)

Microsoft Windowsでのバッチファイルからバッチファイルを呼び出す方法

最近のMicrosoft Windowsであれば何でもPowerShellで良いのかと思うと、 標準入出力を使うと文字コードがおかしかったりして、 追求する時間もないのでMS-DOSの時代からあるバッチファイル(.bat)を使うことになってしまう。

バッチファイルからバッチファイルを呼ぶには、3通りの方法があって挙動が全て違うのだが、 いつも分からなくなってしまうので、まとめておく。

callを使う

以下のように2つのバッチファイルを用意する。 call.batからsubroutine.batを呼び出している。

>type subroutine.bat
@echo off
echo Subroutine is called.
>type call.bat
@echo off
echo Before call
call subroutine.bat
echo After call
結果は以下のようである。
>call.bat
Before call
Subroutine is called.
After call
つまり、バッチファイルからバッチファイルをサブルーチン的に呼び出す方法は、このcallを使う方法である。

startを使う

以下のように2つのバッチファイルを用意する。 start.batからsubroutine.batを呼び出している。

>type subroutine.bat
@echo off
echo Subroutine is called.
>type start.bat
@echo off
echo Before start
call subroutine.bat
echo After start
結果は以下のようである。 まず、start.batを実行したコマンドプロンプトウィンドウでは以下のように表示される。
>start.bat
Before start
After start
同時に、以下のような内容を表示する新しいコマンドプロンプトウィンドウも新しく開かれる。
Subroutine is called.
>

バッチファイルをそのまま実行する

以下のように2つのバッチファイルを用意する。 direct.batからsubroutine.batを呼び出している。

>type subroutine.bat
@echo off
echo Subroutine is called.
>type direct.bat
@echo off
echo Before direct call
call subroutine.bat
echo After direct call
結果は以下のようである。
>direct.bat
Before direct call
Subroutine is called.
つまり、バッチファイルからバッチファイルを呼んでいるが、呼ばれたバッチファイルが終わっても呼び出し元のバッチファイルには戻らない。

HP ProBook 450 G3/G5のMicrosoft Windows 10でのscroll lockキー

Microsoft Windows 10で使っているHP ProBook 450 G3とG5があるのだが、このマシンの内蔵キーボードにはscroll lockキーがない。 しかし、何らかのタイミングでscrool lockキーが押されてしまう現象があった。 試してみると、Fn+Cでscroll lockをトグルできるようだ。Ctrl+Cと隣りあってているキーバインドでscroll lockキーを割り当てているのは良くないのではないだろうか?

qemuのuser mode networkingで母艦のNFSサーバーに接続する

qemuuser mode networkingで NetBSDをゲストとして利用し、NetBSDホストがNFSでエクスポートするディレクトリーをmountする場合、以下のように/etc/export-noresvport,noresvmntを 設定しておく必要がある。qemuのuser mode networkingでは、ゲストはNATを経由してホストに接続することになるためであろう。

/export -mapall=username -noresvport,noresvmnt -alldirs

Microsoft Windowsのping.exeで、タイムスタンプ付きで結果を出力する

Microsoft Windows 10しか手元のターミナルがない環境でping.exeを長時間に渡って実行しておきたいのだが、 いつ応答がなかったり遅かったりするのか時刻が一緒に表示されていて欲しい。

PowerShellで、以下のように実行すれば良い。以下は8.8.8.8というホストにpingを送る例である。

ping -t 8.8.8.8 | %{(Get-Date).ToString() + " $_"}
最初と最後にごみが入るが、問題ないだろう。

Microsoft WindowsでIPv6が優先されている時に、IPv4なDNSサーバーを優先して使いたい場合

自分で自宅のLANではIPv4なIPアドレスを配布し、配布結果をDNSサーバーに登録するようにdhcpdを運用しているが、 Microsoft Windows 10ではNTTから貸与されるひかり電話対応のルーターをIPv6なIPアドレスを持つDNSサーバーを優先して使用してしまう。 NetBSDとdhcpcdの組み合わせでは、そもそもひかり電話ルーターをDNSアドレスとして認識しないのだが、これはこれでおかしいような気もする。 DHCPv6で配布されている情報を使っていないような気がする。

とりあえずLAM内では自分のDNSサーバーを優先して参照してもらわないと、見えないホストが存在することになっておもしろくない。 IPv6のDNSサーバーとして、IPv4なIPアドレスを指定するには、以下のようにすれば良かった。 ここで、IPv4なIPアドレスは、10.0.0.2であるとする。

ffff::10.0.0.2

自分のDNSサーバーはAAAAレコードも返すようにしているので、これでも問題ないだろう。

Windows 10のプロダクトキーはどこに格納されているのか?

Windows 10がプリインストールされたラップトップを、デバイスマネージャーを見たらWindowsを消してNetBSD/amd64をインストールして使っている訳だが、 ラップトップを修理に出す際には、Windowsに戻すしかない。

その際に、Windows 10をMicrosoftの配布するISOイメージから再インストールしたのだが、プロダクトキーを入力するのを求められなかったし、 Windows 7を10に無料期間中にアップグレードしたマシンのように後でオンラインで認証するような表示もなかった。

どうやら、ACPIのMSDMエントリーにプロダクトキーが書き込まれているらしい。NetBSD/amd64では以下のように確認できた。 HP Spectre x360 13-inch ae019TUでプロダクトキーがXXXXX-XXXXX-XXXXX-XXXXX-XXXXXの場合である。

# acpidump -cdt
(snip)
/*
  MSDM: Length=85, Revision=3, Checksum=222,
        OEMID=HPQOEM, OEM Table ID=SLIC-MPC, OEM Revision=0x1,
        Creator ID=HP, Creator Revision=0x10013

        Data={
         MSDMU.....HPQOEM SLIC-MPC....HP   ................ ........XXXXX-XX
         XXX-XXXXX-XXXXX- XXXXX
        }
 */
(snip)

OpenBSD Problem Reports

https://www.openbsd.org/report.htmlの OpenBSD Problem Reportsを読んだので、訳を試みておく。

OpenBSDの問題の報告

リリース済みのバージョンに関する問題の報告

リリース済みのバージョンについて、バグや問題を報告する前には、以下のチェックリストを確認してください。

  1. まず、このリリースについてのパッチと正誤表を確認してください。
  2. 次に、より新しいバージョンさリリースされていないか確認してください。
  3. 最後に、各バージョン間の変更履歴を確認してください。
もしどれにもあなたの問題が含まれていなかった場合には、バグを報告する前にsendbug(1)コマンドについて学んでください。

currentの問題の報告

-releaseでも-stableでもなく、-currentのソースツリーにあなたの問題がある場合には、以下を確認してください。

  1. 少なくとも2回、その問題をテストしてください。その時のソースコードは数日離れたものにしてください。
  2. ソースツリーがコンパイルできないという問題は、それが長く続くのでなければ報告しないでください。この種の問題はあなたのミスであるか、作業中のソースツリーを利用してしまっていることがほとんどです。プロジェクトで働いている人は、少なくとも1日に1回はmake buildを実行しています。普通は異なるアーキテクチャーで1日に等も実行しています。
  3. AnonCVSサーバーは、実際の作業中のソースツリーが反映されるのに数時間かかることを覚えておいてください。
  4. 各バージョン間の変更履歴に既に掲載されていないか確認してください。
  5. スナップショットを作る際には、十分に注意していますが、時にはミスをすることもあります。その場合は謝罪します。バグ報告を送るより、メーリングリストで話をする方が適切です。

問題報告

常にできる限り多くの情報を提供するようにしてください。問題をピンポイントに絞り込むようにしてください。問題を再現できる明確な手順を教えてください。なるべく正確で混乱を生まないよ言葉を使うようにしてください。このことは、特に再現の難しい問題の場合には重要です。問題を説明するのに「クラッシュする」や「私の組み立てたマシンで奇妙な割り込みの問題が起きた」といった文は役に立ちません。 (メーリングリストやその他の知識のある人の集まるフォーラムにおいて)他の人とコミュニケーションするには、あなたの抱える問題が新しいもので、できれば再現性のあるものであると分かってもらわなくてはなりません。壊れていたりサポートされていないハードウェアを使っていたり、ソフトウェアでサポートされていないビルドオプションを使っていたりすることによって生じる自分にしか関係しない問題ではないことを確認するようにしてください。

多くの労力の必要な修正を、問題が明確になり、良く理解するより前に開始しないでください。特にリリース作業中は主要なコードを変更することは禁止されています。もし多量のコードを書こうとする時は、メーリングリストに投稿して、他の人が既にその問題に対して作業していないか確認してください(重複する作業を避けるためです)。

以下の事項を全てのバグ報告に含めるようにしてください。

  1. 問題を再現するのに必要な起動時からの正確な一連の作業を教えてください。これはその一連の作業の説明で完結するようにしてください。コマンドライン引数やデータの提供なしに、コマンド名だけ報告するのでは不十分です。バグを再現するのに特定の出来事の発生が必要であれば、それらを列挙してください。送ろうとする情報を最も単純にするようにしてみてください。しかしこれは必須ではありません。もしバグに再現性があるのであれば、他の状況でも問題になるはずです。
  2. あなたの見たアウトプットを教えてください。単に「動かなかった」や「失敗した」と伝えるのは止めてください。エラーメッセージが表示されたのであれば、もしその内容が理解できなかったとしても、それを提示してください。もし、OpenBSDが特定のエラーでパニックしたのであれば、それを提示してください。あなたがテストした時には、プログラムがクラッシュしたり、他の明らかな不具合が発生したりしていても、プロジェクトのテスト環境では再現しないかもしれません。一番簡単なのは、可能であればターミナルからアウトプットをコピーして提示することです。
    2の補足
    注意: 致命的なエラーの場合には、エラーメッセージには全ての情報が含まれているかもしれません。このような場合には、システムログファイルへの出力も見てください。これは/var/logディレクトリーに格納されています。また、アプリケーションソフトウェアは、httpdのように自分自身でログを記録しているかもしれません。そちらのログにエラーが記録されていないかも確認してください。
  3. OpenBSDカーネルのアウトプットを教えてください。これがdmesgコマンドで取得できます。もしdmesgコマンドの出力が全ての情報を含んでいない場合には、/var/run/dmesg.bootファイルの内容も確認してください。この場合には、dmesgのアウトプットと/var/run/dmesg.bootの両方を含めてください。OpenBSDカーネルのアウトプットは全てのバグ報告で必須です。
  4. サードパーティーのソフトウェアを動かしていて、それがバグに関連している場合、そのバージョンも教えてください。もし、スナップショットを使っているのであれば、その旨を書いた上で、日時も教えてください。
  5. カーネルパニックからのバックトレース結果を教えてください。もし、カーネルがパニックしてddb(4)プロンプトに移行した場合、パニックメッセージと一緒にtraceコマンドの実行結果とpsコマンドの実行結果を含めることをおすすめします。マシンがハングしているのであれば、sysctl ddb.console=1をハングするより前で設定し、Ctrl+Alt+Escをキーボードで入力し、DDBに移行してください(この時はXの画面であってはいけません)。シリアルコンソールの場合には、BREAKを送信してください。パニックメッセージは見えない時には、show panicコマンドで再表示されることができます。これは可能であれば、いつでも含めるようにしてください。パニックメッセージとtraceコマンドの実行結果、psコマンドの実行結果のないカーネルパニックの報告は無意味です。show registerコマンドの実行結果も役に立ちます。boot dumpコマンドで再起動すれば、カーネルイメージはsavecore(8)によって保存され、crash(8)のマニュアルページに説明されているように、後でデバッグすることができます。
  6. X.orgサーバーを使っているアーキテクチャーで、X window systemに関連する問題を報告する場合には、/var/log/Xorg.0.logファイルの内容をdmesg.bootファイルの内容と合わせて教えてください。
バグ報告が長くなっても気にしないでください。そういうものです。最初に全てを報告してしぼり込んでいく方が良いです。しかし、あなたの使っている入力ファイルがとても大きい容量であれば、誰かが興味を持って見てくれるか、最初に聞くことも許されます。

バグ報告を送る

可能であれば、sendbug(1)コマンドをバグ報告を作成するのを助けるために使用してください。sendbug(1)コマンドは、自動的にハードウェアに関する有用な情報を取得してくれます。この情報は多くの問題を診断するのに役立ちます。このツールを使うには、あなたのマシンが適切に電子メールを送ることができることが必要です。もし正常に動くOpenBSDマシンでsendbug(1)コマンドを使うことができないならば、バグ報告をbug@OpenBSD.orgへ送ってください。

バグ報告ではなく、新機能の要望を送ることもあるかもしれません。新機能についても受け付けます。新機能を実装したコードがあれば歓迎します。

問題によっては、デバッグするのにハードウェアが必要になる場合があります。OpenBSDプロジェクトのリソースは限られているのを覚えておいてください。ハードウェアを寄付することが可能です。

「リーダブルコード」より、「コードの欠陥にコメントをつける」

リーダブルコードを読んでいて、以下の表は覚えておきたいと思ったので抜粋しておく。

記法 典型的な意味
TODO: あとで手をつける
FIXME: 既知の不具合があるコード
HACK: あまりキレイじゃない解決策
XXX: 危険! 大きな問題がある

TODO:は大きな問題に使って、小さな問題にはtodo:やmaybe-later:を使うという場合もあるかもしれない

HelenOSのよくある質問と答え

HelenOSについて興味があるのだが、日本語の情報がない。 FAQを読んでみたので記載しておく。 2019年1月18日時点のhttp://www.helenos.org/wiki/FAQの内容である。

基礎的な概念

マイクロカーネルとは何か?

マイクロカーネルオペレーティングシステムでは、 デバイスドライバーやファイルシステム、ネットワーキングなどの機能は、 カーネルスペースからユーザースペースへと追い出されている。 カーネルの外のコードは、通常のユーザープロセスとして実行される。 マイクロカーネル自体は、ユーザープロセスが実行と通信できる最低限の機能のみを提供する。 これは、伝統的なモノリシックなオペレーティングシステムが、これらのほとんどを カーネル内部に持っているのと対照的である。 マイクロカーネル設計に従ってオペレーティングシステムを構築する根拠は、 オペレーティングシステムのポリシーのほとんどをユーザースペースへと追い出し、 マイクロカーネル自体を可能な限りポリシーから自由にし、より大きな 拡張性を実現することである。 このことにより、マイクロカーネルは異なるオペレーティングシステムとしての性格を 提供することもできる。 これは同時に複数の性格を1つのマイクロカーネルの上に構築することさえ論理的には可能とする。 これにより、オペレーティングシステムカーネルに機能をハードコードするのではなく、 簡単に機能を変更できるようになる。 マルチサーバーマイクロカーネルにより、限定的なフォールトトレラントな利用も可能となる。 モノリシックなオペレーティングシステムのカーネルドライバーにバグがあった場合、 通常はシステム全体がクラッシュする。 しかし、マイクロカーネルオペレーティングシステムのユーザースペースドライバーにバグがあっても、」 ドライバーを実行するユーザープロセスがシステム全体をクラッシュさせることはない。

マルチサーバーとは何か?

マイクロカーネルオペレーティングシステムの視野の範囲内では、 マルチサーバーは、複数のユーザープロセスにまたがってオペレーティングシステムの機能が 広がっていることを指す。 これは、全ての機能が1つのユーザープロセスに集約されているシングルサーバーマイクロカーネル とは異なる。 システムをマルチサーバーにしようという動機は、 シングルサーバーシステムにおける唯一のサーバープロセスという単一障害点をなくしたい と言うことである。 マルチサーバーシステムのもう1つの利点は、明示的なインターフェイスを通してのみ通信できる 小さくてシンプルなコンポーネントの集まりにできるということである。 小さくてシンプルなコンポーネントの集まりにすることで、考慮すべきことを分離でき、 1つのことをよく実行でき、理解することも容易になる。 明示的なインターフェイスにより、コンポーネントは交換可能となり、 コンポーネントの粒度レベルでのシステムの正しさも分かりやすくなる。 同時に、コンポーネントを間違った方法で利用することも難しくなる。

マイクロカーネルベースのシステムは根源的に遅いのではないか?

遅くはないが、モノリシックカーネルと比較して、多くのコンテクストスイッチやアドレス空間の スイッチが必要であり、性能上不利ではある。 しかし文献が 示すように、しかるべき配慮をしてシステムを実装すれば、この不利は6%程度まで小さくできること が分かっている、 この不利は、マイクロカーネルベースのシステムから得られる利点の妥当な対価であると考えられる。 これは、例えるならば、快適に高級言語を使うために、いくらかの性能を犠牲にすることに似ている、

HelenOS一般に関する質問

HelenOSとは何か?

HelenOSは、一から書かれたオープンソースのマイクロカーネルベースの マルチサーバーオペレーティングシステムである。 IA-32やx86-64、SPARC V9、IA-64、PowerPC、ARM、MIPSのそれぞれ異なるCPUアーキテクチャー で動く。 HelenOSは、移植性、モジュール化、クリーンな設計、コーディングスタイルを誇りとしている。

HelenOSは何に利用されているか?

HelenOSを単に趣味として扱っている人もいるし、オペレーティングシステムの研究といった分野での 職業的な目標を成し遂げるために使っている人もいる。 HelenOSは、プラハのカレス大学のFaculty of Mathematics and Physicsにおいて、 オペレーティングシステムの講義の宿題のためのプラットフォームとして利用されているし、 学士の卒業論文や修士論文、チームのソフトウエアプロジェクトのプラットフォームとしても 利用されている。

この点に関して、私たちがHelenOSを研究開発のためだけに役立つとは考えていない。 実用できるまであと一歩のところへ来ている、

エンドユーザーとして何ができるか?

私たちがコマンドラインと単純がグラフィカルユーザーインターフェイスを持っており、 ファイルを操作したり、アプリケーションを実行したり、ファイルシステムを ディスクやディスクイメージからマウントしたりすることができる。 テトリスで遊ぶことも、テキストファイルを編集することもできる。 HelenOSは、UCS (つまりUnicode)を利用して、多国語テキストをサポートしている。 ネットワーク機能もあり、単純なウェブサーバーをHelenOS上で動かすこともできるし、 HelenOSをネットワーク経由で制御することもできる。 HelenOSは音楽を再生することもできる。 GCCやbinutils、Python、pccといったサードパーティーの開発ツールも移植してある。

HelenOSで何をしようとしているか?

主に3つある。 1つ目は、完全な役に立つオペレーティングシステムを作ることである (つまり、少なくともいくつかの毎日のタスクを実行するにに利用できるシステムである。 ルーターとしてやサーバーとして、PDAとして、デスクトップとしてなど)。 2つ目は、新しいアイディアやアプローチを実際に使えるオペレーティングシステムの設計を実装で 実験することである。 最後は、それだけではないが、HelenOSを開発する目的は楽しむことである。

HelenOSの開発体制は?

HelenOSの開発はコミュニティー主導であり、長期的な開発者であるコアチームと、 コントリビューターのゆるやかな集まりで構成されている。 全ての開発者とコントリビューターの主なコミュニケーション媒体は development mailing listである。 現在のところ、ほとんどの長期的な開発者がプラハ(またはその近郊)にいるため、 私たちは開発者ミーティングを毎月1回プラハで開催している。 議事録は、通常はメーリングリストで公開される。 HelenOSコミュニティーの意思決定プロセスは、オープンで合意を共同で決定すると言うものであり、 実力主義でもある。 動くコードの重さは千の言葉より重いが、コードは意図が明確で、良い設計がされ、十分に 文書化されていなくてはならない。

HelenOSのソースコードはどこにあるか?

HelenOSのソースコードは、現在は Gitで管理されており、 開発者はhttps://github.com/HelenOS のリポジトリーをcloneすることで、GitHub上に 開発ブランチをホストしておくことが勧められている。

HelenOSに貢献するに当たってどこから始めたら良いか?

私たちはWiki上にに将来のコントリビューターを助け導くためにいくつかのページを用意している。 summary for contributorsと、 tips for (not only) students (本当に学生だけを対象にしているのではない)と、 これらのページからリンク先を注意深く読んで欲しい。 どんなコントリビューターにも最初に必要なことは、HelenOSをソースからコンパイルできるように なることである。 しかし、単にHelenOSを試してみるだけであれば、ソースコードからHelenOSをビルドする 必要はない(ビルド済みのサポートされたHelenOSイメージを簡単に実行できる)。

もし、バグを報告することによって貢献したいならば、バグの報告の仕方についてを読んで欲しい。 また、このFAQを読み終えるようにもして欲しい。FAQではHelenOSの大きな将来像について説明されている。

他のシステムとの比較

HelenOSはUNIXとどう違うか?

HelenOSとUNIX-likeシステムの設計の違いについて、私たちのページで説明しているので読んで欲しい。

HelenOSはGNU Hurdとどう違うか

GNU Hurdは、UNIXをMachマイクロカーネル上で マルチサーバーとして再実装しようとしている。 バージョン0.7の時点で、Hurdはシングルプロセッサーのia32システムで動く。 amd64への移植は作業中である。 Hurdのコンポーネントには、ext2fsファイルサーバーやpfinet ネットワーキングサーバーのように太古のバージョンのLinuxから拾って来たものもあるが、 オリジナルのものもある。 ネットワーキングスタックは、シングルプロセスアーキテクチャーである。 NICとディスクドライバーはLinuxから取り込まれているが、カーネルモードのMachの一部として 動いている。 DDE互換レイヤーと通し、ユーザーモードでLinux 2.6.xのネットワーキングとディスクの ドライバーを動かそうという実験的なバージョンが存在する。 Hurnのハードウェアサポートは限られている。 バージョン0.7の時点では、USBやサウンド機能をサポートしていない。 しかし、rumpカーネルを使ってUSBとサウンド機能をサポートしようという実証用の 実験的な実装は存在している。 Hurdはマルチユーザーシステムであり、特権を持たないユーザーが、 ある種のタスク(信頼されない/実験的なファイルシステムをファイルシステムの名前空間内で アクセス可能にすることなど)を管理者の特権をなしに行えるようにする方法を構築することに重点が 置かれている。 Hurdは動的な構成の変更について、トランスレーターメカニズムを通して大きなフレキシビリティーを 与えている。 ユーザーはIPCサーバーを任意のファイルシステムノードと関連付ける(トランスレーターを設定する) ことにより、そのファイルシステムノードを訪れた際にシステムの挙動を変更することができる。 GNU Hurdのディストリビューションは2つある。Debian GNU/HurdとArch Hurdである。 前者はDebianのパッケージの80%が対応しており、何万ものパッケージが良い状態にある。

一方HelanOSは、他のレガシーシステムの何かを再実装しようとするマルチサーバー環境ではない。 HelenOSはSPARTANと呼ばれる独自のマイクロカーネルを持っている。 またia32以外にamd64やarm32、ia64、mips32、ppc32、sparc64をそれぞれの度合で サポートしており、マルチプロセッサーをサポートしているアーキテクチャーもある。 ファイルシステムやネットワーキングスタック、デバイスドライバー、GUIといったほとんどの HelenOSのコンポーネントは、HelenOSのために独自に実装されており、 互換レイヤーやグルーといった余計なものは実施のところ導入されていないし、 サードパーティーのコンポーネントをサポートする手間もない。 ネットワークスタックは、いくつかのプロセスに分離されており、 IPやTCP、UDPといったスタックの部分ごとに実装されている。 基本的に全てのHelenOSのデバイスドライバーはユーザーモードで動く。 例外はデバッグ目的のものとタイマーと割り込みコントローラーのドライバーだけである。 HelenOSは、USBもサウンド(Sound Blaster 16とIntel HDA)をサポートしている。 HelenOSはシングルユーザーのオペレーティングシステムであるが、 マルチユーザーサポートのための実験的な作業も行われて来ている。 トランスレーターメカニズムに最も近いのは、ロケーションファイルシステムにサービスを 割り当てる機能である。 システムの構成は、あるIPCプロトコルを実装しそれぞれに積み重ねられたユーザースペース のサービスをspawnしたりkillしたりすることで、動的に変更可能である。 HelenOSは、現在のところあまり多くのユーザーアプリケーションをサポートしていない。 主にサブシステムやフレームワーク。ドライバーに注力しているためである。 いくつかの標準的な開発ツール(例えば、binutils、gcc、pythonなど)をHelenOS上で動かす 非常に限定されたサポートが存在する。

HelenOSはMINIX 3とどう違うのか?

MINIX 3 は、独自のマイクロカーネルコアサービス、NetBSDのユーザーランドを持った マルチサーバーシステムである。 マイクロカーネルはマルチスレッドをサポートしていない。 バージョン3.3.0の時点で、MINIXはシングルプロセッサーのia32とarm32システムで動く。 マルチプロセッサーをサポートするコードは存在するが、バージョン3.1.x以降メンテナンス されていない。 MINIX 3は2つのネットワーキングスタックを持っている。 独自のinetサーバーとlwIPネットワーキングスタックベースのlwip サーバーである。 lwIPは実験的なIPv6サポートを含んでいるが、両方のサーバー共にIPv4のみである。 lwipサーバーのIPv6サポートは作業中である。 inetlwipのいずれもモノリシックなアーキテクチャーで IPとUDP、TCPは1つのプロセスである。 ネットワーキングスタックをモジュール化する研究も行われている。 ファイルシステムとほとんどのデバイスドライバーはMINIX独自で開発されている。 バージョン3.3.0の時点で、MINIXはUSBハブとUSBマスストレージ、MUSB OTGコントローラー (いくつかのSoCには搭載されている)をサポートしている。 DDE互換レイヤー内でLinux 2.6.29のUSBドライバーを使う開発版のMINIX 3が存在する。 MINIX 3の売りは、信頼性である。 MINIX 3は、ある場合に動く復活サービスを含んでおり、 これによりクラッシュしたり正しく動かなくなっているサービスを再起動させる。 MINIX 3の開発版は、動いているサービスのライブアップデートをサポートしている。 NetBSDユーザーランドのおかげでMINIX 3は何千ものパッケージを持っている。

繰り返しを避けるため、1つ前の質問に対する答えも見て欲しい。 それに加えて、HelenOSカーネルはカーネルスレッドを実装している。 HelenOSのモジュール化されたネットワーキングスタックは、IPv4とIPv6の両方をサポート している。HelenOSのUSBスタックは、UHCIとOHCI、EHCI、XHCIをサポートしている。 USBハブとヒューマンインターフェイスデバイス(つまり、マウスとキーボード)、 マスストレージデバイスのドライバーが利用可能である。 HelenOSは復活サービスもライブアップデートも持たない。

HelenOSはGenodeとどう違うか?

Genode はマルチサーバー環境において多くのサードパーティーのコンポーネントを 利用しやすくするオペレーティングシステムコンポーネントフレームワークである。 Genodeは、いくつかの異なるマイクロカーネル(とLinuxといったモノリシックカーネルさえも) を、多くのオリジナルまたはラップされたユーザースペースコンポーネント(例えば、DDE互換レイヤー でラップされた外部由来のデバイスドライバーやrumpカーネル)と組み合わせることを サポートしている。 ユーザースペースのコンポーネントの粒度は様々であり、細かいものから大きくモノリシックな ものまである。 もちろん、全ての理論的なコンポーネントの組み合わせが、Genodeで動く訳ではないし、 機能セットも異なる。 Genodeはコンポーネントをツリー状の階層構造に保持する再帰的なシステム構造を使っている。 親コンポーネントは子コンポーネントを完全に制御下におき、同時に子コンポーネントに 開始時にRAMといったリソースを与える。 Genodeコンポーネントと特にルートのcoreコンポーネントは、 提供するサービスに対するリソースの割り当てを要求することで、効率的なリソースの管理を 強制している。 Genodeコンポーネントは、特別なリソースの取り引きプロトコルを使い、 リソースの消費を動的に調整している。

Genodeと比べて、HelenOSは一貫して移植性の高いマイクロカーネルと、 きめ細かくHelenOSネイティブに設計されビルドされたマルチプラットフォームなユーザーランド を組み合わせている。 私たちは、外部のコンポーネントを他のオペレーティングシステムからインポートして それを冗長な互換レイヤーでラップするよりも、独自のコンポーネントを設計して 実装するのを強く志向しており、特にHelenOSのクリティカルなコアコンポーネントについては、 そうである。 HelenOSは基本的なリソース管理をサポートしているが、現在はGenodeのように精巧なものではない。 Genodeのコンポーネントとは異なり、HelenOSのコンポーネントは、厳密な階層構造ではなく、 システム全体の構造はよりフラットである。

HelenOSはL4Reとどう違うか?

L4Reは、Fiasco.OCマイクロカーネル上に構築されたマルチサーバーの オペレーティングシステムフレームワークである。 カーネルはケーパビリティーベースで、リアルタイム機能を持っている。 2017年10月のr75リリース時点では、L4Reはamd64とarm32、ia32、mips32、mips64の プロセッサーアーキテクチャーで動く。 SMPをサポートし、仮想化を特徴とする。 マイクロカーネルは、数個のカテゴリーに分類されるユーザースペースのコンポーネントを 実行する。 カテゴリーは、ネイティブL4Reコンポーネント(例えば、ルートとinitタスク、I/Oマネージャー、 ドライバー、GUIウィンドウマネージャー、仮想マシンモニター)と、準仮想化VM(L4linux)、 完全仮想化VM、デモンストレーション目的のサードパーティーコンポーネントがある。 実行時のシナリオは、ほとんどは(これには限定されないが)、initタスクとI/Oマネージャーを 2つのLuaスクリプトで静的にセットアップされる。 L4ReはPOSIXインターフェイスを提供し、多くのコントリビュートされたパッケージの利用が 可能になっている。 L4Reはまたネイティブとサードパーティーのデバイスドライバーとサーバーコンポーネントを混在して 利用している。 特に、サードパーティーのコンポーネントは、歴史的にLinux 2.6.29からインポートされた ものをDDEフレームワークを利用して有効化されている。 これにより、互換性のあるLinuxデバイスドライバーの再利用が可能になっている。 より最近では、L4ReはL4linuxを利用し、さらにデバイスドライバーOSとして 完全仮想化VMも利用している。 L4linuxはサーバーコンポーネントとしても利用可能である。 過去にリリースされたバージョンは、Linux NICドライバーとDDEとlwIPネットワーキングスタックを 組み合わせたネットワーキングサーバーの痕跡を含んでいる。 しかし、r72リリースでは、無効化され壊れているとマーキングされている。

一方で、HelenOSは、いくらか違うプロセッサーアーキテクチャーをサポートしている。 、あた、いくつかの実験的な修士論文の結果として、現在は約束はできない。 HelenOSのカーネルはリアルタイム機能を提供しない。 HelenOSのコネクション志向のIPCは、基本的には単一の種類のカーネルオブジェクト (非同期IPCでHelenOSではanswerboxとして知られている)のための粗い粒度のケーパビリティー システムである。 HelenOSは一般性があり動的でシングルユーザーな汎用システムを、多数きめ細やかなコンポーネントから 作ることを目的としている。 HelenOSは、ほとんど全て独自のドライバーやフレームワーク、GUI、ネットワーキング、 ファイルシステムを展開する。

ツールチェインに関する質問

なぜclangを主なコンパイラーとして使わないのか?

実際、いくつかのアーキテクチャー)ia32とamd64では、代替のコンパイラーとしてclangを サポートしている。 しかし、今の所、clangはHelenOSのサポートするCPUアーキテクチャーの全てをサポートは していない。 そのためデフォルトではGCCがHelenOSをビルドするのに利用される。

RISC OSがApache License Version 2.0になったので

RISC OSがApache License 2.0で公開される と言うニュースを見ていたのだが、具体的にどういう風に変更されたのか把握していなかった。 RISC OSのソースコードはCVSで管理されているのだが、 castleというディレクトリー がapacheというディレクトリーに改名されて、 LICENSEというファイルでApache License Version 2.0が 置かれるようになった。各ソースファイルにもApache License Version 2.0の 適用される旨のヘッダーが含まれるようになったのだが、 どうやらそれはCVSのリポジトリーを直接編集したように見える。

NetBSD/amiga-current on WinUAE Amiga m68k emulator

この記事は、 NetBSD Advent Calendar 2019 の10日目の記事です。 はじめに ウェブを検索してみると、NetBSD/amigaをWinUAEというm68kを搭載したAmigaというマシンでNetBSD/amigaを動かした記録が見付かります。...