Posts

Showing posts from 2018

NetBSD/amd64-current上でIntel Quick Sync Videoを使ってみる

この記事は、 NetBSD Advent Calendar 2018の10日目の記事です。 はじめに IntelのCPUに内蔵されているGPUには、Intel Quick Sync Video (QSV)というビデオのデコードとエンコードをする仕組みが入っています。 今回は、KabylakeなIntel Core i7なチップの搭載されているHP Spectre x360 ae019TUで、NetBSD/amd64 8.99.27上で、 H.264のビデオのデコードとエンコードをQSVでさせてみました。 エンコードには、pkgsrc/multimedia/ffmpeg4を使い、 デコードには、pkgsrc/multimedia/mpvを使います。 比較のためにfmpeg4でCPUを使ってH.264を利用しますが、 これには本来はライセンスが必要なはずです。 CPUを使ってH.264のデコード/エンコードをしてはいけないと思います。 Intel QSVを使用する準備 NetBSDでIntel QSVを使うためには、pkgsrc/multimedia/libva (VA API)を使うのが一番良いようです。 Intel Media SDKはもしNetBSDで使えたとしても相当苦労するのが明らかですし、 VDPAUは、2015年以降のコミットは2018年11月の2件のみです。 NetBSD/amd64 8.99.27で必要なものをpkgsrcからインストールします。 pkgsrc/multimedia/ffmpeg4も pkgsrc/multimedia/mpvもNetBSD/amd64 8.99.27ではpkgsrc/multimedia/libva に依存するのが既定値になっています。 本当に自分の環境でlibvaサポートが有効になるかを確認したい場合にが、 make show-optionsの出力にvaapiが含まれているかを確認すれば良いでしょう。 libvaからIntel QSVを使うには、pkgsrc/multimedia/intel-vaapi-driverが必要です。 また、libvaの動作確認をするには、pkgsrc/multimedia/libva-utilsがあると良いです。 # cd /usr/pkgsrc/multimedia/ffmp…

Amazon Web Service EC2のa1インスタンスでNetBSD/aarch64を動かしてみる

Image
この記事は、 NetBSD Advent Calendar 2018の9日目の記事です。 はじめにport-armメーリングリストに、 jmcneill@さんが、 NetBSD on AWS EC2 ARM instances と言う投稿をされました。 AmazonがAmazon Web Service (AWS) EC2にa1インスタンスという64ビットARM (aarch64)を追加していますが、 その上でNetBSD/evbarm64が動くという話です。 今回は、jmcneill@さんが、用意してくれたAMIを使って、a1.middleインスタンス を作り、pkgsrcを使ってみました。 AWS EC2 a1とは AWS EC2 a1は、Amazonの独自に開発した64ビットARM CPUである AWS Gravitation Processorで動くインスタンスのようです。 jmcneill@さんが、 us-east-1(N. Virginia)にAMIを用意してくれていますので、 us-east-1であれば何の苦もなくインスタンスを用意できるはずです。 今回は、a1.middleインスタンスを使ってみますが、これはCPU: 1基、RAM: 2GiBの インスタンスです。最大構成のa1.4xlargeですと、CPU: 16基、RAM: 32 GiBです。 a1.middleインスタンスを用意する a1インスタンスだからと言って、特に特別なことはありません。 普通にAWSのインスタンスを作成していきます。 まずは、Community版のAMIで、ami-0c7624c662581e8faを検索して 選択します。ログイン用のssh鍵も生成し、ダウンロードしておきます。

次には、EBSディスクを割り当ててインスタンスを起動させます。
a1.middleインスタンスへログインする ログインについては、NetBSD Wikiの記事に書かれている通りです。 生成したssh鍵の秘密鍵をダウンロードしてあると思います。それを使って、以下のようにログインします。 $ chmod 600 a1-privatekey.pem $ ssh -i a1-privatekey.pem root@aws-hostname-address a1.middleインスタンスの初期…

pkgsrcでのクロスコンパイル方法 2018年版

この記事は、 NetBSD Advent Calendar 2018の8日目の記事です。 はじめにpkgsrcには、今目の前にあるマシンとは違うアーキテクチャーの マシンで動くNetBSDのためのバイナリーパッケージを作る仕組みがあります。 基本的には、 pkgsrc/doc/HOWTO-use-crosscompile にあるようにすれば良い訳ですが、実際にやってみた経験のある方は 多くはないかもしれません。 今回はNetBSD/amd64 8.99.25で、 NetBSD/evbearmv7hf-el用 8.99.25のバイナリーパッケージを作成してみます。 クロスツールチェインを用意する NetBSDはクロスビルドをするためのツールチェインを簡単に作ることができます。 具体的には、以下のようにします。 $ cd /usr/src $ ./build.sh -U -T /usr/world/9/earmv7hf-el/tools -O /usr/world/9/earmv7hf-el/obj -D /usr/world/9/earmv7hf-el/destdir tools $ ./build.sh -U -T /usr/world/9/earmv7hf-el/tools -O /usr/world/9/earmv7hf-el/obj -D /usr/world/9/earmv7hf-el/destdir build これで、/usr/world/9/earmv7hf-el/tools以下にクロスコンパイラーなどが、 /usr/world/9/earmv7hf-el/destdir以下にユーザーランドが用意されます。 このクロスコンパイラーなどを使い、このユーザーランドにパッケージをインストールしつつ パッケージをビルドしていくことになります。 /etc/mk.confの設定pkgsrcの設定は、NetBSDがホストのであって別段bootstrap pkgsrcを 実行していない場合は、/etc/mk.confに設定を書くことになります。 ここでは、以下のように実行した場合にevbearmv7hf-el用に クロスビルドするようにしてみます。 $ cd /usr/pkgsrc/www/http-parser $ make USE_CROSS…

pkgsrcでGo言語で書かれたソフトウェアをパッケージにする方法

この記事は、NetBSD Advent Calendar 2018の7日目の記事です。 はじめにpkgsrcのパッケージは、オフラインでビルドできることが求められています。 ですので、ビルドの準備段階や最中に依存するソースコードをダウンロードするのは 避けなくてはいけません。 今日はGo言語で書かれたソフトウエアであるHugo と言うスタティックサイトジェネレーターを例にして、Go言語で書かれたソフトウエアの場合の buildlinkの仕組みを体験してみたいと思います。 依存するソフトウエアの準備方法pkgsrcでは、configureステージ(典型的には GNU autoconfのconfigureスクリプトを実行する段階で、ビルドの1つ前の段階)の前に WRKSRC(デフォルトではそのパッケージのディレクトリー内にwork ディレクトリー)以下に、依存するパッケージのヘッダーファイルやライブラリファイルを用意して おきます。 このような処理をする場合には、例えば以下のように パッケージのMakefileから buildlink3.mkファイルをインクルードしておきます。 (snip) .include "../../devel/go-locker/buildlink3.mk" .include "../../www/go-toml-burntsushi/buildlink3.mk" .include "../../www/go-urlesc/buildlink3.mk" .include "../../devel/go-purell/buildlink3.mk" .include "../../textproc/go-chroma/buildlink3.mk" (snip) ヘッダーファイルやライブラリーファイルをWRKSRC以下に配置すると 書きましたが、Go言語の場合には、ちょっと事情が異なり、ソースコードとスタティックライブラリーが 配置されます)。 実際に依存先のソースコードとスタティックライブラリーが格納されるのは、 work/.buildlink/gopkgディレクトリー以下です。 pkgsrc/www/hugoの場合の中身を少し確認してみ…

NetBSD/amd64-current on HP Spectre x360 ae019TU (デスクトップ環境構築編)

Image
この記事は、NetBSD Advent Calendar 2018の6日目の記事です。 前回の補足前回のインストール編で 書き忘れていた点が2点ありました。 最近のNetBSD/amd64-currentだと、acpibat(4)の認識のところで止まってしまいます。ですので、boot -cで起動させて、disable acpibatを入力してやるか、事前に/boot.cfgファイルを書き換えて、userconf disable acpibatを足しておく必要があります。附属の可視光/赤外線用のビデオカメラの認識の際にカーネルパニックします。PR kern/53734が正しいかは分かりませんが、uvideo(4)を無効にするか、このPRのパッチを当てておく必要があります。はじめに 前回インストールしたNetBSD/amd64 8.99.26では、以下の機能が使えます。 オーディオ出力Synaptics製タッチパッドmicroSDカードリーダー無線LANNVMe SSDストレージIntel製内蔵GPUによるアクセラレーションUSB Aコネクター経由でのUSB 3デバイスの利用 以下の機能は、パッチを当てれば使えます。 タッチスクリーンのペンによる操作 以下の機能は使えません。 内蔵の可視光/赤外線のウェブカメラタッチスクリーンの指による操作指紋認証USB Type-Cコネクター経由でのUSB 3デバイスの利用ディスプレイの輝度調整ACPIで電源を切る(shutdown -p nowが働かない)ACPIで内蔵バッテリーのステータスを取得するハードウェアボタンによるオーディオ音量調整 細かい所は不便ですが、生活するのに困るほどではありません。 ここでは、快適にFirefoxウェブブラウザー(pkgsrc/www/firefox)で ウェブブラウジングができるようにする、Blender(pkgsrc/graphics/blender)で3Dモデリングができるまでを説明して行きます。 必要なパッケージのインストール 快適なX Window Systemの環境を容用意するには、残念ながらxsrcから 生成されたXでは不十分なことは前回も触れました。 ここでは、pkgsrcでも不十分ですので、lpkgsrc-wip も利用します。 pkgsrc-wipは、pkgsrc…

NetBSD/amd64-current on HP Spectre x360 ae019TU (インストール編)

この記事は、 NetBSD Advent Calendar 2018の5日目の記事です。 はじめに 2018年7月のJapan NetBSD Users' GroupのBoFの際には、いろいろ動かないものばかり だったのだが、2018年12月現在では、HP Spectre x360 13-inch ae019TUも多くの 機能がちゃんと動くようになっている。 今日から2日間は、HP Spectre x360 13-inch ae019TUで、快適にNetBSDデスクトップを 使用する方法について書いていきたい。 ちなみにこの記事は、おおしまさんのU-EFI bootで起動するNetBSD USBメモリを作ってみるの記事を 読んだ方にはほぼ不要だと思います。 NetBSDのインストール このマシンには、当然のようにDVDドライブなどは内蔵されていない。 それにUEFIな環境で使用したい。 と言うことで、今日の時点で最新なNetBSD-8.99.26-amd64-uefi-install.img.gz をnycdn.NetBSD.orgから ディスクイメージをダウンロードして USBスティックに書き込み、インストールに使用することにする。 NetBSDの環境があれば、そこでddコマンドで書き込むのが良いのだが、 今回は、Windows 10 Proの環境で書き込んでみた。rawrite32.exeを使う。 rawrite32.exeは、a href="https://www.netbsd.org/~martin/rawrite32/"> lNetBSD.orgにあるmartin@のウェブページからダウンロードすることができる。 ちなみに、既にGPTなパーティショニングがされていると、rawrite32.exeでは どうやってもエラーになってディスクイメージを書き込めないことがある。 どうにかしたいのだが、何も行動できていない。 実際のインストールは、インストーラーであるsysinstは使用しなかった。 おそらくsysinstは、GPTパーティショニングな環境へのインストールに まだ対応していないのではないかと思う。これについても何もできていない。 今回は、sysinstが起動したら、すぐにCtrl-Cを押して シェルに移行し、そこ…

pkgsrc/security/acmeshでLet's EncryptのTLS/SSL証明書を使う

この記事は、NetBSD Advent Calendar 2018の4日目の記事です。 自分のウェブサイトをLet's EncryptでTLS/SSL化したいと思っていて、 過去にはpkgsrc/security/py-certbotを試すために pkgsrc/sysutils/py-psutilのNetBSDへの移植に 取り組んだこともあったのだが、なかなか継続的に利用し続けるのは大変だった。 NetBSD blogの Using acme.sh for Let's Encrypt certificates on pkgsrc.org servers を読んで、acme.sh を試したいと思ったのだが、そもそもpkgsrcには収録されていないし、DNSによる認証は ちょっと遠慮したいので、そのまま適用はできないでいた。 やっと重い腰を上げてpkgsrcに追加して設定した話を書きたい。 ちなみに、ワイルドカード証明書が発行できるようになっているが、今回はワイルドカード証明書 は発行を受けない。 インストール インストールは、pkgsrc/security/acmeshを使えば良い。 # cd /usr/pkgsrc/security/acmesh # make install 以上のように実行すれば良い。このようにインストールすると、 ▽usおそらくHTTPでの認証で ウェブサーバーをインストールしないでもTLS/SSL証明書を発行できるように pkgsrc/net/socatもインストールされる。 今回はsocatは使わないがインストールされてしまう。 TLS/SSL証明書の発行を受ける TLS/SSL証明書の発行を受けようというサーバーのホスト名はwww.example.com であることにしよう。 このFQDNでアクセスできるようにDNSを設定しておくのが必要なのは言うまでもない。 私は、このサーバーでpkgsrc/www/nginx-develをhttpdとして 使用する予定なので、TLS/SSL証明書の発行を受ける際にも、これを使用することにする。 以下のようにインストールし、設定しておく。 # cd /usr/pkgsrc/www/nginx-devel # make install # vi /usr/pkg/etc…

OpenGLのサポート状況を確認する

HP Spectre x360のIntel Kabylake Refreshな環境で、NetBSD/amd64-currentを使うと OpenGLも有効になって、Blenderも使えて嬉しく思っていたのだが、 OpenGLのサポートするバージョンを確認する方法が分かっていなかった。 Debian wikiのMesaのページを 見ていたら書かれていた。 glxinfoコマンドは、pkgsrc/graphics/MesaDemosから glxinfo_mesademosを使う。 $ glxinfo_mesademos|grep "OpenGL core profile version string" OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.2.0 以上のようだと、OpenGL 4.5に対応している。

ffmpegのx11grabデータソースから30 fpsで取得する

自分の作業を記録しておくのに、スクリーンの内容をビデオとしてキャプチャーしておきたいと思った。 しかし、今使用しているHP Spectre x360 qe019TUは、USB Type-Cによる ビデオ出力はあるはずだが、NetBSDでは動かない。 調べてみると、ffmpegのx11grabデータソースでビデオキャプチャーできることが分かった。 とりあえず、以下のようにすると、30 fpsでMP4ビデオにできた。 $ ffmpeg4 -f x11grab -r 30 -s 1920x1080 -i :0.0+0,24 -vcodec libx264 capture.mp4 ここで、ffmpeg4コマンドは、pkgsrc/multimedia/ffmpeg4を xcbオプションを有効にしてビルドしたバージョン4.1である。

mupdfでPDFファイルをPostScriptファイルに変換する

PDFファイルをNetBSD上で読むのに、長らくMotifベースのxpdf (pkgsrc/print/xpdf)を使ってきたが、文字化けしてしまうPDFファイルがあるのが悩みだった。 思い切ってmupdf (pkgsrc/print/mupdf)に乗り換えてみた。 これまでにmupdfで文字化けしてしまうPDFファイルには遭遇していない。 PostScriptプリンターで印刷するには、PDFファイルからPostScriptファイルに変換する必要がある。 mupdfでもPDFファイルをPostScriptファイルに変換できるはずと思って試してみた。 具体的には、pkgsrc/print/mupdfパッケージに含まれているmutoolコマンドが使用できた。 実際の操作は以下のようである。 $ mutool convert -o output.ps input.pdf ビューアーとコンバーターの挙動が違うとトラブルの元なので、この方法を使って行きたい。

pkgsrcのpLaTeX (pkgsrc/print-platex)で作ったdviファイルをdvipdfmxでPDFファイルに変換する

本当に久しぶりにLaTeXでPDFファイルを作成したくなって、pkgsrcに日本語対応のLaTeXがあるか探してみたところ、 pkgsrc/print/tex-platexというのが 収録されていた。 pkgsrc/print/tex-jsclassesを使ってDVIファイルを作ってみて、pkgsrc/print/dvipdfmxで PDFファイルに変換しようとすると、以下のようなエラーになってPDFファイルを生成できない。 current-situation-of-coal-industry-in-the-world.dvi -> current-situation-of-coal-industry-in-the-world.pdf [1 kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+359/600 --dpi 959 rml /usr/pkg/bin/mktexpk: gsftopk: not found mktexpk: don't know how to create bitmap font for rml. mktexpk: perhaps rml is missing from the map file. kpathsea: Appending font creation commands to missfont.log. dvipdfmx:warning: Could not locate a virtual/physical font for TFM "rml". dvipdfmx:warning: >> There are no valid font mapping entry for this font. dvipdfmx:warning: >> Font file name "rml" was assumed but failed to locate that font. dvipdfmx:fatal: Cannot proceed without .vf or "physical" font for PDF output... Output file removed. …

RubyのURI.parseでプロキシーサーバーを設定する際にパスワードとして使えない文字

ユーザー認証付きのHTTPプロキシーサーバーを経由しないと、どこにも行けないネットワークで生活しないといけないことがある。 そんな環境でもRubyスクリプト(実際にはJRubyで動かすことが多い)でWWWにアクセスしなくてはいけないことがある。 RubyのURI.parseが呼ばれると、 URI::InvalidURIError: bad URI(is not URI?) とエラーになってそもそもWWWにアクセスしに行かないことがある。 これは、ユーザー認証付きのHTTPプロキシーサーバーのパスワードに使えないはずの文字が設定されているためである。 私の環境の場合にはWindowsのActive Directoryの認証情報と連携しているので、Windowsのログオンパスワードとして 良かれと思って記号を使っていると、遭遇してしまうことがある。 では、どのような文字をパスワードとして使用するのを避ければ良いのだろうか? RFC2396であるUniform Resource Identifiers (URI): Generic Syntaxによると、 以下のように書かれている。 The user information, if present, is followed by a commercial at-sign "@". userinfo = *( unreserved | escaped | ";" | ":" | "&" | "=" | "+" | "$" | "," ) つまり、セミコロン、コロン、アンパサンド、イコール、プラス、ダラー、カンマ以外は使えないようだ。 いまいちescaped = % hex hexの場合がどうなるのか分からないが…。 とりあえずは、これら以外の記号は避けてActive Directoryにパスワード登録するのが良さそうだ。

NetBSD/amd64上で動かすFirefox 61.0.2でのDNS over HTTPSを使う

オーディオやウェブカメラをFirefoxから使うと言う話ではないので、 NetBSDだからと言って特別な事はあるはずもないのだが、 DNS over HTTPSをmozilla wikiのTrusted Recursive Resolverを参考に設定して使ってみた。 Firefoxのprofileディレクトリーにあるprefs.jsに以下のように設定されるように、about:configで 設定すれば良い。Firefoxを再起動することなく、設定直後から反映される。 user_pref("network.trr.bootstrapAddress", "1.1.1.1"); user_pref("network.trr.mode", 3); // DNS over HTTPSしか使わない。通常のDNSにfallbackする場合には2にする。 user_pref("network.trr.uri", "https://mozilla.cloudflare-dns.com/dns-query");

仮想マシンハードディスクイメージファイルの形式

仮想マシンのハードディスクイメージファイルについて、いつもどれがどれか分からなくなってしまうので、その種類を書いておく。 Appleのdmg形式は除いている。 RAW物理ディスクのダンプqcow昔のqemuの形式qcow2今のqemuの形式FVD (Fast Virtual Disk)IBMの開発したqemu用の形式QEDqemu用だが既に互換性のためだけに残っている状態。VDI (Virtual Disk Image)VirtualBoxの形式VMDK (Virtual Machine Disk)VMwareの形式VHD (VIrtual Hard Disk)Microsoft Virtual PCの形式VHDX (Virtual Hard DIsk v2)Microsoft Hyper-Vの形式bochsBochsのbximageコマンドで作る形式 他にもあるだろうが、普段目にするのはこの程度なように思う。

NetBSDのpkgsrcから導入したXでAccelMethodを設定する

FreeBSDのX.orgでCaps lockキーをCtrlにするで書いたことと基本的に同じではあるのだが、 NetBSD上でpkgsrcから導入したmodular-xorg-server-1.20.1を導入した場合の設定例を書いておく。 やりたいことは、Toshiba dynabook R63/PSというIntel Broadwell世代のラップトップでIntelのinternal GPUのアクセラレーション方式をSNAからUXAに切り替えるということである。 以下のようにすれば良い。 ; まず/etc/X11/xorg.conf.dディレクトリーがないので作成する。 # mkdir /etc/X11/xorg.conf.d ; 以下のような内容を用意する。 # cat /etc/X11/xorg.conf.d/20-intel.conf Section "Device" Identifier "Intel GPU" Driver "intel" Option "AccelMethod" "UXA" # Option "NoAccel" "True" # アクセラレーションを無効にする場合 EndSection

JRubyのRestClientで、認証付きHTTPプロキシーサーバーを経由してアクセスする方法

いつの頃か覚えていないのだが、とある認証付きHTTPプロキシーサーバーを経由して、 JRubyのRestClientを使ったプログラムが動いていたはずである。 プロキシーサーバーの情報は、この環境は、Windows 10の環境であるから、 > set http_proxy=http://username:password@serveripaddress:portnumber のように設定してある。 しかし、何かが変わったようで、今日になると404 Proxy Authentication Requiredの エラーが、net/httpから返されて認証付きプロキシーサーバーを越えることができない。 パスワードは英数字のみで構成されているので、パスワードの値が問題ではないはずである。 いろいろ試した結果、 RestClient.proxy = ENV['http_proxy'] を書いておくことで解消できた。 net/httpの仕様がいまいち理解できず気持ちが悪いが、 いずれまた、はまりそうな気がするので書いておく。

FreeBSDのX.orgでCaps lockキーをCtrlにする

最近のX.orgでは、xorg.confは用意しておかなくても良いのだが、その時にctrl:nocapsを指定する方法を書いておく。 FreeBSDでPortsからxorg-server-1.18.4_9,1を導入した時に使用している。 $ cat /usr/local/etc/X11/xorg.conf.d/10-capslock.conf Section "InputClass" Identifier "keyboard0" Driver "kbd" MatchIsKeyboard "on" Option "XkbOptions" "ctrl:nocaps" EndSection

PowerShellのSend-MailMessageで外部コマンドの標準出力を電子メールを送る際に改行を維持する

PowerShellを使うと良い所は、電子メールを簡単に送付できるSend-MailMessageと言う命令があるところである。 これを使って、外部コマンドの標準出力を電子メールとして送るとすると、以下のようになる。 ## 管理者権限のPowerShellコンソールで、Set-ExecutionPolicy remotesignedを実行しておく必要がある。 ## 使い方: ## powershell -NoProfile -ExecutionPolicy Unrestricted .\send-notification-email.ps1 # 送信する電子メールの本文はUTF-8にする。 $utf8 = ([System.Text.Encoding]::UTF8) # 差出人 $fromaddress = "fromuser@example.com" # 宛先として2つの電子メールアドレスを設定する。 $toaddress1 = "touser1@example.jp" $toaddress2 = "touser2@example.jp" # 電子メールのSubject $subject = "件名です" # 本文は外部コマンドの標準入力から受け取る $body = C:\jruby-9.2.0.0\bin\jruby.exe .\output-to-stdout.rb if ($LASTEXITCODE -ne 0) { $email = @{ From = $fromaddress To = "$toaddress1","$toaddress2" Subject = $subject Body = $body -join "`r`n" SMTPServer = "smtp.example.com" Encoding = $utf8 } send-mailmessage @email } ここで、外部コマンドの標準出力が複数行存在する場合には注意が必要である。 つまり、-join "`r`n"を付けてお…

NetBSD 8 on さくらのVPS V4

お名前VPSをずいぶんと長く使って来たのだが、我慢できないほどにディスクアクセスが遅くなってしまい、他に乗り換えることにした。 最近のVPSサービスは、ディスクがSSDであまり容量の大きくないものばかりなので、手頃な価格で200 GB程度のディスク容量のものとなると、 さくらのVPSくらいしかなさそうだった。 さくらのVPSは、ブートセクターが壊れることはあるとか言う話を聞いたことがあって心配していたのだが、私の使うことにした石狩データセンター収容のV4の仮想マシンは、 とりあえず初回からNetBSDが起動しないと言うことはなかった。 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 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 8.0 (GENERIC) #0: Sat Jul 21 13:49:48 JST 2018 xxx@xxx.xxx:/usr/world/amd64/8/obj/sys/arch/amd64/compile/GENERIC total memory = 2047 MB avail memory = 1964 MB rnd: seeded with 128 bits 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 QE…

Log-structured File System (LFS) について書かれている文献

Log-structured File System (LFS)というファイルシステムがあって、NetBSDもサポートしている。 しかし、私の知る限りNetBSDではちゃんと動いたことはないように思う。 それでも、どうにかして動かしたいと思う人は私以外にもいるようで、時折何かの修正がコミットされている。 もうHDDにストレージのアクセス速度を求める時代ではないのかもしれないが、SSDにも応用できる考え方はあるのではないかとも思う。 mount_lfs(8)のmanページと、英語版Wikipediaの参考文献にあげられている文書を書いておく。 Wikipediaの方はリンクがあるが、mount_lfs(4)の方はそうではないので、後で読む時にはここからたどるようにしたい。 mount_lfs(8)のmanページよりBeating the I/O Bottleneck: A Case for Log-Structured File SystemsThe Design and Implementation of a Log-Structured File SystemFile System Performance and Transaction SupportAn Implementation of a Log-Structured File System for UNIX英語版WikipediaのLog-structured file systemの記事より mount_lfs(8)のmanページの分と重複する物は割愛した。 Log-Structured File SystemsDon't stack your Log on my Log 最初は教科書の一章であるLog-Structured File Systemsを読むのが分かりやすそうだ。

LLVM/clangでビルドできるNetBSDのアーキテクチャー

LLVM/clangでビルドできる(試みることのできる)アーキテクチャー(MACHINE_ARCH)をちゃんと把握しておかないといけないと思っていた。 src/share/mk/bsd.own.mkによると、以下の各MACHINE_ARCHであるようだ。 aarch64aarch64ebearm*i386powerpcpowerpc64sparcsparc64x86_64 また、LLVM/clangでビルドしたNetBSDを用意するには、/etc/mk.confに以下のように書いておけば良いはずである。 MKGCC=no MKLLVM=yes HAVE_LLVM=yes しかし、build.shにこれを自動的に設定してくれるオプションがないのが不便だ。

FreeBSD Portsで、オプションを選択するダイアログボックスを逐次出さないようにする

FreeBSDを使うことがあるので、そこではFreeBSD Portsを使いたいと思う。だが、いつもオプションを選ぶダイアログボックスでビルドが途中で止まってしまい、 いつまで経っても目的を達せないので、あきらめてpkgsrcを使っていた。 以前、FreeBSD Workshopに出席した際に、最初に指定しておくことのできるmakeターゲットがあると聞いたので、やっとports(7)のman ページを読んでみた。 config-recursiveというのが、それだった。 # cd /usr/ports/x11-wm/jwm # make config-recursive (ここで必要なオプションを設定する) # make install のようにすることで、目的は達成できた。 私としては、デフォルトのオプションから変えることは基本的にないと思うので、デフォルトの値を自動的に設定するmakeターゲットがあると便利なのだが、 ports(7)には記載されていないようだった。一度、ports/Mk以下をちゃんと読まないといけないように思う。

NetBSD上でのBitVisorのビルドと、BitVisor上でのNetBSDの起動

はじめにこの記事は、Japan NetBSD Users' Group BoF 2018で発表した内容を整理し直したものです。NetBSDでBitVisorをビルドしてみる話と言う 記事があって、ここでは、NetBSD上でBitVisorのUEFIブートローダーはビルドできなかったという結果が掲載されている。 最近は、UEFIブートローダーも含め、一式をちゃんとNetBSD上でビルドできるようになっているので、このことについて書いておく。 また、私は、BitViorをUEFIな環境で既に構築されているNetBSDを起動させるために使用するので、NetBSD/amd64l-current (8.99.24)以外でのビルドは試していない。 準備 最初に述べたように、NetBSD/amd64 8.99.24でビルドするので、x86_64用のCコンパイラーはGCC 6.4.0が既に用意されている。 これにより、UEFIブートローダー以外のものはビルドができる。 UEFIブートローダーは、mingw-w64によるx86_64用のクロスコンパイラーが必要となる。 まずはこのクロスコンパイラーをpkgsrcからインストールする。以下のように実行すれば良い。 $ cd /usr/pkgsrc/cross/mingw-w64-x86_64-gcc $ make install ここで、mingw-w64-x86_64-gcc-bootstrapというパッケージもインストールされるが、 これはmingw-w64-x86_64-gccをビルドするために一時的に必要になるパッケージなので、 mingw-w64-x86_64-gccが正常にインストールされたら、make deinstallしてかまわない。 GNU makeも必要なので、pkgsrc/devel/gmakeをインストールしておくことになるが、 このパッケージをインストールしていない人はいないだろう。 ビルドする 以下のように実行することで、bitvisor.elfとbitvisor/boot/uefi-loader/loadvmm.dll、 bitvisor/boot/uefi-loader/loadvmm.efiを生成できる。 $ cd ~/ $ hg clone ssh://hg@bitbucket.o…

「増補改訂版 図解でわかる はじめてのデジタル画像処理」山田 宏尚 著

疑似輪郭または疑似エッジ
https://www.jfpi.or.jp/webyogo/index.php?term=3168
http://www.fujitsu.com/downloads/JP/archive/imgjp/jmag/vol49-3/paper10.pdf

XYZ表色系
http://www.dic-color.com/knowledge/xyz.html

ITU-R BT.709
ハイビジョン(2K)放送でのXYZ表色系で表現できる色の範囲の規格
https://en.wikipedia.org/wiki/Rec._709
https://www.itu.int/rec/R-REC-BT.709/en

ITU-R BT.2020
4Kまたは8K放送でのXYZ表色系で表現できる色の範囲の規格
https://en.wikipedia.org/wiki/Rec._2020
https://www.itu.int/rec/R-REC-BT.2020/en

L*a*b*表色系
http://w3.kcua.ac.jp/~fujiwara/infosci/lab.html
http://www.daicolor.co.jp/rd/color/system/index.html
カラーマネジメントシステムで使用されることが多い。

ディープカラー
24ビットを越えた濃度値による

YIQ信号
NTSCで使用されていたカラーをモノクロに変換する方式
Y: 輝度信号
IとQ: 色差信号

平滑化 (ノイズ除去)
ごま塩ノイズ
移動平均フィルター … ぼけやすい
加重平均フィルター … 移動平均フィルターよりは良いがまだぼけやすい
メディアンフィルター … 処理に時間がかかるが品質が良い

エッジ抽出フィルター
輪郭線を抜き出す
カラー画像の場合にはモノクロに変換してから処理する
輪郭を求めるには微分をすれば良いが、離散データでは微分できないので、代わりに差分の絶対値を計算する
どの方向の差分を計算するかで結果が変わる
単純に縦、横、斜め等で計算するのではなく、Robertsのエッジ検出オペレーター、Prewittのエッジ検出オペレーター、Sobelのエッジ検出オペレーターなどを使うのが有効
2次微分(ラプラシアン)をすることでエッジを検出するのも有効
2次微分も離散データではできない…

NetBSD 8.0のnpf(7)の設定例

NetBSD/amd64 8.0でnpf(7)を使っている。npfは、NetBSD packet filterのことである。 あまり設定例が公開されていないようなので、備忘のために書いておく。 xennet0インターフェイスで、TCPの80番・443番・25番・22番・8080番・53番ポートとUDPで53番ポートを通過させ、ログをnpfd(8)で取得する設定である。 #set bpf.jit off $ext_if = { ifaddrs(xennet0) } $services_tcp = { http, https, smtp, ssh, 8080, domain } procedure "log" { log: npflog0 } group default { pass in final family inet6 proto ipv6-icmp all pass in final family inet4 proto icmp all pass stateful out final all pass stateful in final proto tcp to $ext_if port $services_tcp apply "log" pass stateful in final proto udp to $ext_if port domain apply "log" pass final on lo0 all block all apply "log" }

FreeBSDのconsoleのkeymapの変更

FreeBSD/amd64 11.2-RC3を使っているのだが、NetBSDで/etc/wscons.confにencoding us.swapctrlcapsと指定するのと同じ設定が必要だった。 このNetBSDの設定では、CAPS lockキーと左Ctrlキーを入れ替えるのだが、以下のFreeBSDの設定では、CAPS lockが左Ctrlキーになる。 私としては、その方が望ましい。 # vi /etc/rc.conf keymap="us.ctrl" us.ctrlの部分は、/usr/share/vt/keymapsにあるファイル名から.kbdを取ったものを指定する。

AndroidのGmailアプリのExchange and Office 360アカウントのMobile device ID

AndroidのGmailアプリでは、Exchange and Office 365アカウントを追加することはできる。この際に、Mobile device IDというのが表示される。 これは、電子メールアドレスを入力してNextボタンを押下すると表示されるのだが、これは、1つ前の画面で入力した電子メールアドレスに無関係であった。 つまり、違う電子メールアドレスを入力しても、同じMobile device IDが表示される。

東京大学のOCWについて

東京大学のOCWには以下の問題があるようである。 1つ目は、Adobe Flashでビデオ配信されていることである。これ自体は、現状では問題ないのだが、今のメンテナンス状態を考えると、Adobe Flash Playerが提供されなくなった後に、HTML5等で更新されることもなさそうに思えるので、残念なことになってしまうかもしれない。 2つ目は、iiionline.iii.u-tokyo.ac.jpというウェブサイトへのリンクになっているビデオがあるということである。このウェブサイトが今はもう動いていないようである。ocw.u-tokyo.ac.jpにちゃんとまとめておかなかったのは失敗だろう。おもしろそうな講義もあったので残念である。

OCW「ビッグデータ時代の人工知能学と情報社会のあり方」(東京大学)

ビッグデータ時代の人工知能学と情報社会のあり方は、コースの半分近くのビデオは非公開になってしまっている。公開されているビデオは、人工知能に関する概論的な講義である。 私は、人工知能について学んで来なかったのだが、深層学習が人工知能の研究においてどのような意味を持つかを解説した第9回第10回は特におもしろかった。

OCW「情報工学概論A」(東京大学)

東京大学の「情報工学概論A」は、インターネットを実現する技術についての講義であった。 インターネットの運営に関することから、イーサネット等からHTTP等までのネットワークの技術、暗号化技術について、解説している。 内容は、基礎的なものであるので、2018年の今でも視聴する価値はあると感じた。しかし、実例として触れられているものは、古くなってしまっている。

OCW「データベース」(上智大学)

大学の公開している日本語の講義はいろいろあるのだが、内容が一部だけではなく役に立つものと言うと、あまりないように思える。 また、そのような講義がまとめられている物も見つけられない。 上智大学理工学部「データベース」は、 データベースとSQLについて全く知らなかった時期に、SQL ゼロからはじめるデータベース操作を 読むのと同時に視聴して大変役に立った。

スウェーデンとElsevier

Sweden ends contract with science publisher Elsevier, moving for open access for scientific articlesによると、 2018年6月30日から、スウェーデンの研究者は、Elsevierの学術雑誌に投稿したり、論文を閲覧したりできなくなるらしい。 商業的な学術雑誌ももう少しリーズナブルな価格になって欲しい。 オープンアクセスであれば、確かに私は助かるが、継続性があるのか良く分からないので。

Windowsマシンのuptimeを知る方法

どうやら、uptime(1)コマンドにそっくりなものは、Windowsの標準機能にははないようだ。 その代わり、以下のようにすると、起動時刻を知ることができる。 > net statistics server \\client1 のサーバー統計情報 統計情報の開始日時 2018/05/15 6:43:10 受け付けたセッション 1 タイムアウトしたセッション 0 エラーが発生したセッション 0 送信バイト数 (KB) 0 受信バイト数 (KB) 0 平均応答時間 (ミリ秒) 0 システム エラー 0 アクセス許可違反 0 パスワード違反 0 アクセスしたファイル 0 アクセスした COM デバイス 0 スプールした印刷ジョブ 0 バッファーのオーバーフロー回数 ビッグ バッファー 0 リクエスト バッファー 0 コマンドは正常に終了しました。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#7

セマフォ

前節の排他制御の方式は、現実のシステムには適用しにくい。また適用するにしてもビジーウェイティングを使っているので、ごく短いクリティカルセクションへの利用に限定されるべきである。

より一般的な排他制御として、セマフォを導入する。

セマフォはプロセス間通信の伝達に使われる整数型の変数である。

セマフォは、0と1以外の値も取ることができ、より多くの情報を伝達できる。

セマフォは一般に、イベント変数と呼ばれるプロセス間の共通変数の一種である。

セマフォの変数へのアクセスも排他制御が必要である。

プロセス間で伝達されるイベントには以下が含まれる。
(1) プロセスがクリティカルセクションに入った。
(2) プロセスがクリティカルセクションから出た。
(3) 新しいプロセスが始まった。
(4) 入出力操作が始まった。
(5) 入出力操作が完了した。
(6) メッセージを受け取った。
(7) リソースを受け取った。
(8) リソースを開放した。

イベント変数は、
(1) イベントの履歴を記録するデータ構造(整数型の変数)。
(2) イベント変数の待ち条件が満たされるのを待っているプロセスの待ち行列。
からなる。

セマフォにはP命令(wait命令)とV命令(signal命令)が定義される。

P命令は、引数SについてS≧1が満たされるまでプロセスを一時停止させるのが役割である。もし、S≧が満たされていればSを1減らしてプロセスは継続する。

V命令は、引数Sのセマフォの待ち行列で待っているプロセスの中から1つが選ばれ、実行可能状態に移行させる。ディスパッチャーは実行可能プロセスから1つを選び実行する。もし、Sのセマフォの待ち行列が空であった場合には、Sは1増加させられVを実行したプロセスは続行される。

P命令とV命令は、セマフォを提唱したダイクストラの母語であるオランダ後のPasseren(パスを許す)とVerhoog(起こす)に由来する。

P命令とV命令はそれぞれ分割不可能でなくてはならない。つまり、ひとときにはある1つのセマフォに対して、1つのPまたはVしか実行できない。

P、V、ディスパッチャーは、いずれも共通データである待ち行列を操作するので、排他制御を必要とする。

pkgsrc/www/firefoxがNetBSDではすぐにクラッシュする件について

multiprocess windowの有効なpkgsrc/www/firefoxがすぐにクラッシュのは、 そださんの報告されている PR 53273 が原因とのこと。 Chromiumも同じような問題があったように思うので、どうにかして直して欲しい。 browser.tabs.remote.autostartを無効化しておけば(falseにしておけば)、multiprocess windowは無効にできる。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#6

並列プロセス

プロセスがCPUディスパッチャーにより同時実行されると、互いに作用し干渉し合う。例えば主記憶やI/Oを取り合うかもしれないし、同一のファイルに同時に書き込もうとするかもしれない。

相互作用や干渉は、意図的/偶発的、協調的/競合的に起こり得る。

プロセス間の相互干渉は、正しい制御化におかないと好ましくない状況を招く。

プロセス間の相互干渉は、
* プロセス間通信
* プロセス同期
* プロセス統合
などとして研究されている。

プロセス間の相互交渉は3種に分類できる。
(1) 協調
    複数のプロセスが相互に情報交換を行いながら、共通の目的のために処理を進める。
(2) 競合
    リソースを取り合うといったように互いに他のプロセスの存在を意識しなくてはいけないが、自分の処理のためには他のプロセスは不要な場合。
(3) 干渉
    相手のプロセスの中断など、はっきりと他のプロセスに影響を与える場合。

例えば、整合性を保ってクリティカルセクションまたはクリティカルリージョンは、分割不可能にする必要がある。

クリティカルセクションは混合して実行されることがないようにする。これにより、共通変数の読み書きは1つのプロセスしか実行できないようになる。

共通変数へのアクセスを同時に1つのプロセスに限ることを排他制御または相互排除と言う。

2つのプロセスがメッセージをやりとりする機構を、メッセージ転送またはメッセージ交換と言う。

タイムシェアリングシステムでもマルチプログラミングシステムでも、他のプロセスを一時停止させる必要が生じることがある。例えばメモリーコンパクション(主記憶内の小さな空き領域を大きな空き領域にするために、主記憶内でプログラムを動かすこと)や、スワップアウトする場合である。

排他制御はプロセスの競合を正しく行うのに必要であり、次の3つの要求を満たさなくてはならない。
(1) クリティカルセクションを実行しているプロセスが1つもない時、クリティカルセクションに入る要求をしたプロセスは、ただちに許可を与えられなければならない。
(2) 2つ以上のプロセスがクリティカルセクションに入ろうと争っているR時、その選択は無期限に延期されてはならない(デッドロック防止)。
(3) いかなるプロセスも、あるプロセスがそのクリティカルセクションに入るのを無期…