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から開放される。

    Firefox for WindowsでWindows Certificate Storeの電子証明書を利用する

    Firefox for Windowsは、あくまでNSSを使っていて、Windows Certificate Storeに 登録されている電子証明書を利用することはできない。 security. enterprise_roots=trueという設定も、 私の求めているWindows Certificate Store内のpersonal certificatesを 使いたいという用途には無関係の設定であるようだ。

    そのためには、 A pkcs11 implementation on top of win32 (or win64) capi を使えば良い。 Firefox for WIndows x86_64であれば、w64用のDLLをダウンロードして セキュリティーデバイスとしてFirefoxに登録すれば良い。

    しかし、エクスポートが無効化されたpersonal certificateをFirefoxから利用できる ようにはならなかった。 エクスポートが無効化されたpersonal certificateを使うには、Internet Explorerや Chromiumベースになる前のMicrosoft Edge、Google Chromeを使う必要があった。 ChromiumベースのMicrosoft Edgeでも使えるだろう。

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

    左手で操作するための有線接続マウスを選ぶ という記事を書いたことがあり、同様のことのできる無線接続のマウスを探していた。

    つまり、マウスの左右のボタンを入れ替えた設定をマウス本体内に保存しておけて、 他のマシンに接続した際にもマウスボタンの左右を交換する操作をしなくて良いマウスを 探していた。

    結局、 左手で操作するための有線接続マウスを選ぶ で購入したLogicool G-PRD-001r Pro Heroマウスの系統である Logicool G304 という機種がリーズナブルな価格でこの機能を実現していた。

    また、Logicool G-PRD-001r Pro Heroマウスとは違い、七色に光ることがない のも好印象だ。

    不満なことは、このマウスはLIGHTSPEEDという独自の無線接続規格を使っていて、 既存のLogicool/LogitechのUnifyingとは互換性がないことだ。 私は、単にマウス本体内に設定を保存しておける無線接続なマウスが欲しいだけだったので、 ゲーミングに適したというLIGHTSPEEDではなくUnifyingの方が良かった。 Unifying接続で同様の機能のある機種を探すことができなかったのだが、 あったのだろうか?

    Realforce S / R2S-US3-BKを購入した

    Realforce S / R2S-US3-BK を購入した、 これまでは、 FILCO Majestouch Convertible 2 (FILCKBT2-33)を使っていたのだが、 音がうるさいのと、USB端子を接続しただけでは起動せず、 何かのキーを押して2秒程度待たないといけないのがストレスになっていた。 また、Bluetooth機能は結局一度も使わなかった。

    R2S-US3-BKは、キー荷重が30 gのモデルである。 FILCO Majestouch Convertible 2と比較して、 良い点、悪い点を書いておきたい。

    まず良い点としては、圧倒的に打鍵音が静かである。 また、専用の設定ツールを使うと、テンキー部分についているNum Lockキーを 無効にすることができる(他にも任意のキーを無効化できる)。 このツールは、Windows用しかないように見えるが、 まあ、一度設定してしまえば変えることはないので、 そこまで気にしなくて良さそうだ。

    テンキー付きのフルキーボードで、Num Lockキーなど押したいことがある訳がないので、 これは非常に有用な機能だと思う。

    また、同じツールでNum Lock、Caps Lock、Scroll Lock、 Key Lock (Num Lockを無効化するのに使ったこのキーボードの機能の有効か無効かを 示すランプ)については、点灯する色を換えることや、消灯することもできる。

    一方、悪い点としては、まずは重量が非常に重いというのがある。 FILCO Majestouch Convertible 2より重い。 また、横幅はFILCO Majestouch Convertible 2より広く、私の通常利用している ロッカーには入らなかった。 でも、普通は毎日ロッカーにしまうような運用はしなくて良いはずなので、 気にしなくて良いであろう。

    あとは、私の選択のミスなのだが、キー荷重30 gは私には軽過ぎたかもしれない。 通常打鍵している分には、このキー荷重で全く問題がないのだが、キーボードの上に 間違って手を乗せて勝手に入力されてしまう確率は高くなった気がする。

    また。私は、キーセンサーの種類によるストロークの違いなどはあまり気になる 方ではないことも分かった。 ちゃんとしたキーボードであれば、どれにも比較的短時間で慣れられるようだ。 まあ、ラップトップのキーボードを同時並行で使っても大丈夫なので分かっていた 話ではあるのだが。

    Firefoxのアドレス欄でhttp://が省略されないようにする

    Firefoxではデフォルトではアドレス欄のhttp://が省略される。 表示させるには、about:configbrowser.urlbar.trimURLstrueからfalseに 変更すれば良い。 Firefoxの再起動は不要なようだ。

    Symantec Endpoint ProtectionとGoogle Chrome

    いつものようにMicrosoft Windows 10と古いバージョンのSymantec Endpoint Protectionの ある環境で仕事をせざるを得ない。 このSymantec Endpoint Protectionのバージョンは14.0.xxxである。 すると、例えばGoogle Chrome 80のRenderer Code Integrity機能と競合して、 Google Chromeが一切のウェブページと設定画面のページの描画に失敗する。

    回避するには、 Endpoint Protection を使用していると Google Chrome バージョン 78.0.x で "このウェブページの表示中に問題が発生しました" エラーが発生するの ウェブページに記載があるように、レジストリーを編集するか、 --disable-features=RendererCodeIntegritychrome.exe の引数として渡して起動させるしかない。 つまり、 Google Chromeの起動アイコンの「リンク先」を以下のようにすれば良い訳である。

    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-features=RendererCodeIntegrity
    
    この問題は、Symantec Endpoint Protection 14.2以降では発生しないらしい。 いつになったら最新のSymantec Endpoint Protectionを使うようになるのか分からないので、 対処法を書いておく。

    VLC 3.0.8のウェブUIをNetBSDで使う

    NetBSDでは、pkgsrc/multimedia/vlc-3.0.8nb4以降であればウェブUIを使うことができる。 ウェブUIというのは、起動しているVLCの操作UIのことで、ウェブUI内に画像を再生するようなものではないらしい。 起動は以下のようにする。

    $ vlc --extraintf=http --http-host 0.0.0.0 --http-port 8080 --http-password 'password'
    
    これをhttp://127.0.0.1:8080/で開いてみると、Basic認証のユーザーIDとパスワードの入力ウィンドウが表示される。 このとき、ユーザーIDは入力しない。パスは引数に設定した値(上例だとpassword)である。

    英語のpredeterminer

    predeterminerというのは、allとかonceとかが例としてあって、 all this timeと言う時のallや、half an hourと言う際のhalf、 once a dayと言う際のonceなどと言えば分かるように思う。 だが、predeterminerの日本語での定訳というのはないのかもしれない。 ちゃんと文法書を見たのではなく、ウェブ検索しただけだが、 以下のような訳語が見られた。

    • 前限定辞
    • 前決定詞
    • 前置決定詞
    • 前置限定詞

    pkgsrcのmake patchでfuzzを許容する方法

    pkgsrcのパッケージをアップデートしようとすると、そういう人はPKG_DEVELOPER=YESを設定しているはずなので、 make patchでfuzzが発生してpatchesディレクトリー内の パッチファイルの適用がエラーになることがある。 これはpkgsrcを利用する場合には望ましいのだが、 アップデート作業をするという視点で考えると、fuzzは 気にしないで、できる範囲でパッチファイルを適用してもらいたい場合もある。 この場合には、PATCH_FUZZ_FACTOR=-F2make コマンドに与えれば良い。具体的には以下のようである。

    $ make PATCH_FUZZ_FACTOR=-F2 patch
    

    EmEditorの実装を選択する

    普段Windowsで扱うファイルのサイズが数GBと大きいので、開くのにEmEditorを使っている。 「テキストの編集」にこだわりが凝縮!定番エディタ「EmEditor」はなぜ他のエディタと違うのか? によると、EmEditorのバイナリーは、SSE2(ee128.exe)や AVX-256(ee256.exe)、 AVX-512(ee512.exe)とそれぞれ対応したものに分かれているらしい。 私の通常利用しているマシンは、AVX-512には対応していないが、AVX-256には 対応しているはずである。

    EmEditor.exeを実行すると、実行環境のCPUがサポートする範囲内で、 最も性能が高いものが選択されるようだ。 どれが利用されているかの確認は、taskmgr.exeのプロセスタブで、 EmEditorの行を右クリックしてプロパティーを選択して表示されるファイル名で分かる。 私のマシンでは予想通りee256.exeが実行されていた。

    ケーブルの脱着できるUSB 3.0ハブ

    ケーブルを外せないUSBハブは、どうやってもケーブルが断線してしまって長く使い続けられなかった。 J5 create JUH340は、 ケーブルが外せるので長持ちしている。セルフパワーUSBハブであるのも良い。 日本で売られているものは、3Aと4AのACアダプターの両方の場合がある。

    pkgsrc/print/mupdfでPDFファイルで使用されているフォントを一覧する

    これまでPopplerのpdffontsでPDFファイルが使用しているフォントを一覧していたのだが、 pkgsrc/print/mupdfを使うようになったのでmupdfでフォント一覧を見たいと思っていた。 mutool info -Fを使えば良かった。

    $ mutool info -F target.pdf
    target.pdf:
    
    PDF-1.4
    Info object (4075 0 R):
    <</CreationDate(D:20090605190151-05'00')/Author(Gregory Brown)/Creator(XSL Formatter V4.3 R1 \(4,3,2008,0424\) for Linux)/Producer(Antenna House PDF Output Library 2.6.0 \(Linux\))/ModDate(D:20090609120839-04'00')/Title(Ruby Best Practices)/Trapped/False>>
    Pages: 330
    
    Retrieving info from pages 1-330...
    Fonts (9):
            3       (5 0 R):        Type1 'QXKOAR+MyriadPro-SemiboldCond' (1988 0 R)
            5       (9 0 R):        Type0 'QXKOAR+Birka-SemiBoldItalic' Identity-H (1997 0 R)
            5       (9 0 R):        Type0 'QXKOAR+Birka-Italic' Identity-H (1998 0 R)
            6       (27 0 R):       Type0 'QXKOAR+Birka' Identity-H (2003 0 R)
            7       (32 0 R):       Type0 'QXKOAR+ArialUnicodeMS' Identity-H (2006 0 R)
            15      (298 0 R):      Type1 'QXKOAR+TheSansMonoCd-W5Regular' (2012 0 R)
            15      (298 0 R):      Type1 'QXKOAR+TheSansMonoCd-W7Bold' (2014 0 R)
            15      (298 0 R):      Type1 'QXKOAR+TheSansMonoCd-W5RegularItalic' (2013 0 R)
            329     (1979 0 R):     Type0 'QXKOAR+Birka-Bold' Identity-H (2017 0 R)
    

    VLC for iPadOS/iOS/FireでSMBで共有されたビデオファイルを再生する

    ビデオファイルがいくつかあるのだが、VLC for iPadOS/iOS/Fireでローカルネットワーク経由で再生する際にどのような方法で ファイルを共有すれば良いのか迷っていたが、SambaでSMBで共有すれば途中からも再生もできた。 Windowsからファイルを格納するのにも便利なので、SMBで良いようだ。

    VLC for iPadOSでネットワークのサーバーに接続の保存された設定を削除する方法

    私がiPadOS/iOSに慣れていないだけだと思うのだが、VLC for iPadOSで「ネットワーク」メニュー内の「サーバーに接続」の保存された接続設定を削除する方法に迷ってしまった。 左にスワイプすれば赤い削除のボタンが表示されるので、それをタップすれば良い。

    Microsoft Visual Studio community 2019でのデバイスドライバーの開発

    Microsoft Visual Studio Community 2019は、個人ではどのようなアプリケーションを作成するのにも利用できるようだ。

    マイクロソフト ソフトウェア ライセンス条項 MICROSOFT VISUAL STUDIO COMMUNITY 2019より:
    a. 個人ライセンス。お客様は、販売またはその他の目的でお客様独自のアプリケーションを開発している個人である場合、本ソフトウェアを使用して、当該アプリケーションを開発およびテストすることができます。
    組織では、利用できる用途は限定されているようだが、その利用できる用途にはデバイスドライバーの開発が含まれている。
    マイクロソフト ソフトウェア ライセンス条項 MICROSOFT VISUAL STUDIO COMMUNITY 2019より:
    お客様のユーザーは、人数に制限なく、本ソフトウェアを使用して、Windows オペレーティング システムのデバイス ドライバーを開発およびテストすることができます。
    ここで、個人はWindowsオペレーティングシステムのデバイスドライバーを開発およびテストすることができるかというのが気になった。 以下の文章を読むと、「アプリケーション」には「Windowsオペレーティングシステムのデバイスドライバー」が含まれているように思える。
    マイクロソフト ソフトウェア ライセンス条項 MICROSOFT VISUAL STUDIO COMMUNITY 2019より:
    お客様がエンタープライズである場合、お客様の従業員および契約社員は本ソフトウェアを使用して、お客様のアプリケーションを開発またはテストすることはできません。ただし、上記で許可されている (i) オープンソース、(ii) Visual Studio の拡張機能、(iii) Windows オペレーティング システムのデバイス ドライバー、(iv) SQL Server の開発、および (v) 教育目的の場合を除きます

    PEMファイルの中身をダンプする

    PEM形式のファイルの中身を確認するには、以下のようにすれば良い。

    $ openssl x509 -in isrgrootx1.pem.txt -noout -text
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1
            Validity
                Not Before: Jun  4 11:04:38 2015 GMT
                Not After : Jun  4 11:04:38 2035 GMT
            Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    RSA Public-Key: (4096 bit)
                    Modulus:
                        00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c:
                        87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7:
                        75:c2:a2:fe:f5:6a:6e:f6:00:4f:28:db:de:68:86:
                        6c:44:93:b6:b1:63:fd:14:12:6b:bf:1f:d2:ea:31:
    (snip)
    

    Windows 10 1909で、ローカルのDNSキャッシュを消去する

    Windows 10 1909で、ローカルのDNSキャッシュを消去するには、コマンドプロンプトで以下のように実行すれば良い。

    > ipconfig /flushdns
    

    Windows 10 1909で、IPv6が有効な時に、IPv4のDNSを優先する

    自宅のネットワークでは、IPv4でしかDNSサーバーを運用していない。これは、ISC DHCPDとBINDを組み合わせて 動的にホスト名を割り当てるようにしている。 IPv6は、IPoEな接続をそのまま使っているので、IPoE接続側は自宅外のDNSサーバーを配って来る。 こういう環境では、Windows 10 1909は、IPv6の自宅外のDNSサーバーを優先して使ってしまうため、 自宅内の動的に割り当てたホスト名で他のマシンにアクセスできない。 IPv6のDNSサーバーに以下のように手動登録すれば、IPv4のDNSサーバーを優先できる。

    ffff::192.168.0.1
    

    The pkgsrc guideとEPUB

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

    はじめに

    ちょっと目を離した隙に、Jupyter NotebookがNetBSD/amd64-currentで動かなくなってしまっていたので、 The pkgsrc guideのEPUB版を作る話を書きたいと思います。

    以下で作成したEPUBファイルの動作は、iPad Pro上のApple BooksアプリのEPUBビューアー機能で確認しました。

    EPUB版The pkgsrc guideを作成する前提条件の確認

    2019年1月4日12:15 (UTC)くらい以降のpkgsrcツリーのpkgsrc/doc/guideディレクトリーで作業する必要があります。 distinfoファイルに、pkgsrc-guide/htdocs-share-20200104.tar.gzファイルが登録されていれば大丈夫です。

    The pkgsrc guideの生成

    The pkgsrc guidleは、以下の形式で作成することができます。 括弧内は、OUTPUTS変数に設定することで生成対象にするときの名前です。

    • 1つのHTMLファイル (html)
    • 章毎に分かれたHTMLファイル (html-split)
    • PDFファイル (pdf)
    • プレインテキストファイル (ascii)
    • EPUBファイル (epub)

    標準では、EPUBファイルは生成されません。明示的にEPUBファイルを生成するようにOUTPUTS変数に指定する必要があります。 つまり以下のように実行します。

    $ cd /usr/pkgsrc/doc/guide
    $ make OUTPUTS=epub
    
    こうすると、${WRKSRC}/pkgsrc.epubとしてEPUB版のThe pkgsrc guideが生成されます。

    今後について

    The NetBSD guideも少しの修正でEPUB版を生成できるはずですので、 試してみたいと思います。

    NetBSDでゲームパッドを使ってシューティングゲームをしてみる

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

    はじめに

    NEC PC-9801全盛の時代に、Bio_100%のMarkadiaという縦スクロールシューティングゲームをしたことがありました。 それ以来、ゲームというものには手を出していなかったのですが、久し振りにやってみたいと思いました。 ですが、手元のラップトップは、ゲームでキーボードを酷使して問題ないようには見えません。 ここでゲーミングキーボードを買って来るという選択肢もありましたが、USB接続のゲームパッドを使ってみることにしました。 USB接続のLogicool製のGamepad F310というのを選びました。

    ゲームを選ぶ

    pkgsrc/games以下には、450以上のゲームが登録されていますが、縦スクロールシューティングゲームに近いものは多くはないようです。 以下が候補になりました。

    • KoboDeluxe
    • naev
    • astromenace
    • chromium-bsu
    • taisei
    • xkobo

    今回は、chromium-bsuをやってみることにします。 taiseiも試したのですが、NetBSDでゲームパッドを使うには何か修正が必要なようですので、今回はパスします。

    chromium-bsuをインストールする

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

    # cd /usr/pkgsrc/games/chromium-bsu
    # make install
    
    ここで、chromium-bsuはバージョン0.9.16.1nb1以降を使うようにします。 このバージョンから、SDL2経由でゲームパッドを利用できます。

    ゲームパッドを接続する

    Logicool Gamepad F310には2つのモードがあります。XモードとDモードです。 背面のスライドスイッチで切り替えが可能です。 Xモードでは、USB Product ID = 0xc21d、Dモードでは、USB Product ID = 0xc216と、モード毎に別々のIDが割り振られています、 スライドスイッチを切り替えると、一度抜き差ししたのと同じような挙動をします。

    (Dモードで接続)
    uhidev0 at uhub2 port 1 configuration 1 interface 0
    uhidev0: Logicool (0x46d) Logicool Dual Action (0xc216), rev 2.00/4.14, addr 6, iclass 3/0
    uhid0 at uhidev0: input=8, output=7, feature=0
    (Xモードへ切り替え)
    uhid0: detached
    uhidev0: detached
    uhidev0: at uhub2 port 1 (addr 6) disconnected
    uhidev0 at uhub2 port 1 configuration 1 interface 0
    uhidev0: Logicool (0x46d) Gamepad F310 (0xc21d), rev 2.00/40.14, addr 7, iclass 255/93
    uhid0 at uhidev0: input=20, output=6, feature=0
    

    XモードかDモードか

    Dモードは旧来のモード、Xモードはより新しいモードであるようです。 SDL2のBSD用のjoystickサポートは、Dモードを前提としているようです。 Xモードのサポートは、Linuxのevdevを前提としているようにも見えます。 実際、XモードのF310では、キャリブレーションをしても使えるようになりませんでした。 NetBSDのUSB HID関連のカーネルソースコードを見ると、XBox用のゲームパッドのサポートコードがあります。 同様にカーネルでのサポートが必要なのかもしれません。

    chromium-bsuで遊んでみる

    Gamepad F310をUSB接続してDモードに切り替えてから、chromium-bsdを起動させてみると、 正しいキーバインディングで利用できているようです。 しかし、初めてゲームパッドというものを使ったので、良い成績を残すには相当の慣れが必要そうです。

    chfs(4)とnandemulator(4)

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

    はじめに

    CHFSを使ってみたいと思っていましたが、 サポートするハードウェアが分からないし、おそらく手元に存在しないので試せないと考えていました。 CHFS (CHFS flash file system)は、フラッシュメモリー用のファイルシステムです。

    しかし、NANDフラッシュメモリーデバイスについては、nandemulator(4)というエミュレートする仮想的なデバイスが用意されていて、 RAMから割り当てて揮発性のNANDフラッシュメモリーデバイスを作成することが可能でした。 これにより、NetBSD/amd64でもCHFSを試してみることができそうです。

    nandemulator(4)のソースコードであるsys/dev/nand/nandemulator.cを読むと、エミュレートされるNANDフラッシュメモリーの サイズは32MBでハードコードされてしまっていますが、CHFSを試してみるという視点では、32MBでも良さそうです。

    CHFSを使う準備

    カーネル設定ファイルに以下のように追記して、カーネルを作り直しても良さそうですが、最も簡単なのはロード可能なカーネルモジュールを使う方法のように思います。
    file-system     CHFS
    pseudo-device   nandemulator
    

    以下のようにして、カーネルモジュールを読み込みます。

    # modload nandemulator
    # modload chfs
    
    これらを実行すると、カーネルブートメッセージに以下のように出力されます。
    nandemulator0: NAND emulator
    nand0 at nandemulator0: ONFI NAND Flash
    nand0: vendor: NETBSD, model: NANDEMULATOR
    nand0: manufacturer id: 0x00 (Unknown), device id: 0x00
    nand0: page size: 2048 bytes, spare size: 64 bytes, block size: 131072 bytes
    nand0: LUN size: 256 blocks, LUNs: 1, total storage size: 32 MB
    nand0: column cycles: 2, row cycles: 3, width: x16
    nand0: scanning for bad blocks
    flash0 at nand0: partition, size 32 MB, offset 0
    flash0: erase size 128 KB, page size 2048 bytes, write size 2048 bytes
    
    仮想的なNANDフラッシュメモリーデバイスは、/dev/flash0に割り当てられたようです。

    CHFSを使ってみる

    mount_chfs(8)のマニュアルページによると、CHFSなフラッシュメモリーデバイスは、 初回マウント時に自動的にnewfs(8)相当のことが実施されるようです。

    The file system will be created during the first mount.
    ですので、newfs_chfsコマンドはありません。

    以下のようにして、/mntにマウントしてみます。

    # mount_chfs /dev/flash0 /mnt
    
    状況を確認してみます。
    $ mount
    /dev/flash0 on /mnt type chfs (local)
    
    $ df -h
    /dev/flash0               31M         0B        30M   0% /mnt
    
    どうやら普通に使えそうです。

    CHFSは、LinuxやeCosで利用できるJFFS2を意識して作られたようなので、機会があったら比較してみたいと思います。

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

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