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で表示させてみました。

MPEG 2.5

MPEG 2.5と言う表記を見掛けたのだが、どういうものか理解できなかった。 /usr/pkgsrc/audio を以下のように検索すると、 /usr/pkgsrc/audio/libmad/DESCR に、MPEG-2 extension to Lower Sam...