In The Court Of The Crimson King

音声の再生について、プチノイズが出まくる件は解決したのだが、実はそれ以外の問題もある。これは言葉で表現するのが難しいのだが…再生の途中で瞬間的なスキップがけっこうちょくちょく発生する。時間をほんの一瞬だけ吹っ飛ばし…その時間内のこの世のものは全て消し飛ぶ。最終的に何か音が飛んだな?という結果だけが残る。

これはノイズというよりは要するにPCMデバイスにデータを叩き込むスケジューリングの問題に思える。しかしGHzでプロセッサがぶん回る時代にそんなことあるのか?

というわけでまたしてもarchlinuxのwikiを参照すると、なにやらPulseAudioの動作に伝統的な割り込み方式と新しいタイムベースのスケジューリングというものがあるらしく、後者で問題が起こるハードウェアもあるのだそうだ(前者で起こるハードウェアもある)。とりあえず/etc/pulse/default.pa

load-module module-udev-detect tsched=0

などと追加して割り込み(何の割り込み? PCMデータを突っ込んだ後のDMAの転送終了割り込みとか?)駆動を指定させたところ、だいぶマシになった。完全になくなったわけではないが…。

いやしかし、それにしても、intelチップセット内蔵のオーディオデバイスなんて最強にポピュラーなハードウェアなのになんでこんなちまちま設定を与えてやらないと上手く動かないのか。こういっちゃなんだけど、PulseAudioってちょっとポンコツなんじゃないの?

聞くところによるとubuntuではそろそろPulseAudioはobsoleteで、新しくPipeWireが音声と映像の再生を管理するようになるらしいので、そこでタナボタ式に解決したりしたら嬉しい。

Revive Window Placements

Chromeを起動し、ウィンドウを適当に配置し、一旦終了する。そして再度起動すると、各ウィンドウのタブ、位置、状態(通常か最大化かなど)が再現される、はずだ。

ところがこの新しいubuntuの環境ではこの動作が正しく行われないのである。

そして単に再現されないだけではなく、さらに謎のルールが付加されているように見える。右側のようなウィンドウのようなサイズだと、そのまま再現されるのだが、その奥のほぼ全画面のウィンドウは何やら「このウィンドウ、ほぼ全画面だから全画面で表示してあげるね!」的な配慮が働くのか、最大化状態に上書きされてしまう。

なんだこれは。

アプリケーションの起動時にウィンドウの状態を再現する処理というのは、一義的にはそのアプリケーション自身が行うはずだが、それはウィンドウマネージャーやらデスクトップ環境やらが何もしないということでもない。実際gnomeにも新しく開くウィンドウを中央に表示する云々のゆるやかに位置を指定するオプションがある。そういうわけで、このChromeの奇妙な動作が誰の仕業なのかはよく分からない。

しかしそれならば、Chromeの起動後に好きにすればいいわけで、Chromeの拡張を書き、独自にウィンドウの配置を覚えておき、起動後にそれを再現するようにしてみた。ウィンドウが最大化状態で表示された後でシュッと縮むような様子を目で確認できるような動作になるけど、まあしょうがない。

この拡張は割と使いでがあるような気もするが、公開の必要はあるだろうか。このChromeの変な動作が他の環境でもよくあることなのか、おま環なのかどうかもう少し調べてみたい。

  *
勝手に最大化はorg.gnome.mutter auto-maximizeで制御されるようだ。これをfalseにすると終了時の配置がその通り再現されるようになった。なんだよこのオプション!なんだよこのオプション!

Pop noise

前の投稿でも書いたが音声を再生すると妙にプチノイズが入る。これをなんとかしたい。

まず環境から確認しておくとIntelチップセット内蔵のオーディオデバイスがあり、snd_hda_intelカーネルモジュールが読み込まれている。またUSB DACを刺しているので、snd_usb_audioモジュールも読み込まれている。ただしUSB側はあくまで出力用のデバイスなのでオーディオデータの生成はあくまでチップセットが行う。

ちなみに内蔵スピーカーやらHDMI出力やらを担当するために?ALC269VBも載っていて認識されているがこれはまあ気にしなくていいだろう。

さてこの問題自体は割とFAQらしいのでみんな大好きarchlinuxのwikiにトラブルシューティングがまとまっている。要するにデバイスに省電力状態というものがあり、その状態が変わるときにプチノイズが発生するっぽいので状態が遷移するのを禁止しようというわけだ。

とりあえずmodinfoしてみると:

filename:       /lib/modules/5.15.0-47-generic/kernel/sound/pci/hda/snd-hda-intel.ko
description:    Intel HDA driver
license:        GPL
srcversion:     EB88CE4FDDC8DBA5650936E
(snip)
depends:        snd-hda-core,snd-hda-codec,snd-pcm,snd,snd-intel-dspcfg
retpoline:      Y
intree:         Y
name:           snd_hda_intel
vermagic:       5.15.0-47-generic SMP mod_unload modversions 
sig_id:         PKCS#7
signer:         Build time autogenerated kernel key
(snip)
parm:           index:Index value for Intel HD audio interface. (array of int)
parm:           id:ID string for Intel HD audio interface. (array of charp)
parm:           enable:Enable Intel HD audio interface. (array of bool)
parm:           model:Use the given board model. (array of charp)
parm:           position_fix:DMA pointer read method.(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO, 5 = SKL+, 6 = FIFO). (array of int)
parm:           bdl_pos_adj:BDL position adjustment offset. (array of int)
parm:           probe_mask:Bitmask to probe codecs (default = -1). (array of int)
parm:           probe_only:Only probing and no codec initialization. (array of int)
parm:           jackpoll_ms:Ms between polling for jack events (default = 0, using unsol events only) (array of int)
parm:           single_cmd:Use single command to communicate with codecs (for debugging only). (bint)
parm:           enable_msi:Enable Message Signaled Interrupt (MSI) (bint)
parm:           patch:Patch file for Intel HD audio interface. (array of charp)
parm:           beep_mode:Select HDA Beep registration mode (0=off, 1=on) (default=1). (array of bool)
parm:           dmic_detect:Allow DSP driver selection (bypass this driver) (0=off, 1=on) (default=1); deprecated, use snd-intel-dspcfg.dsp_driver option instead (bool)
parm:           power_save:Automatic power-saving timeout (in second, 0 = disable). (xint)
parm:           pm_blacklist:Enable power-management denylist (bool)
parm:           power_save_controller:Reset controller in power save mode. (bool)
parm:           align_buffer_size:Force buffer and period sizes to be multiple of 128 bytes. (bint)
parm:           snoop:Enable/disable snooping (bint)

なるほどとても親切だ。ところで件のwikiだとpower_saveだけを0にするか、さらにpower_save_controllerもオフにするか2つの選択肢を挙げているわけだが、前者に意味はあるのだろうか。power_saveを0にした場合(=disable)の動作の詳細が分からないが、デバイスが暇になった場合即省電力状態に入らせるということならプチノイズ回避にはならないのでは? いろいろ試してみよう。

まずpower_saveを0にしただけで様子を見たところ、10秒に一度プチ!が出る感じなのが20秒に一度くらいになったようだ。なるほど効果は少しはあるのか。次にpower_save_controllerに’N’を書き込んでみたところ、こちらは覿面にプチノイズがなくなった。なるほど。

というわけで、これを永続化した設定にするため/etc/modprobe.d/の下に適当なファイルを作って

options snd_hda_intel power_save=0 power_save_controller=N

という感じの内容で保存。wikiにも書いてあるがラップトップの場合電源状態によってこの辺の設定が再設定されうるので、そういう場合は/etc/pm/power.d/下にも何かいろいろと仕込む必要があるかもしれない。

ところで省電力機能というのは当然消費電力を通常より低くするのだろう。その代わり音質が犠牲になるトレードオフがあるのだとしたら、バッテリー駆動のときだけオーディオデバイスの省電力機能をオンにする…とかにすればいいと思うのだけど、なぜ常に省電力オンなのかはよく分からない。

thumbnails on Nautilus

  • webpのサムネイル
    $ sudo apt install webp
    $ vim ~/.local/share/thumbnailers/webp.thumbnailer

    [Thumbnailer Entry]
    Exec=/usr/bin/dwebp %i -scale %s %s -o %o
    MimeType=image/x-webp;image/webp;
  • 動画のサムネイル
    $ sudo apt install ffmpegthumbnailer
  • サムネイルキャッシュの更新
    $ rm ~/.cache/thumbnails/fail/gnome-thumbnail-factory/*
    $ nautilus -q
  • 音声を再生する際プチノイズが入ることがある: サウンドデバイスが省電力モードになっているのが原因、かもしれない
    $ echo '0' | sudo tee /sys/module/snd_hda_intel/parameters/power_save

Some dconf settings

  • 端末等のカーソルの点滅が10秒後が止まるのを抑制する(以前も設定した
    org.gnome.desktop.interface "cursor-blink-timeout"
  • Nautilusにおいてデフォルトのソート順
    org.gnome.nautilus.preferences "default-sort-order"
  • Nautilusにおいてソート順を逆順にする
    org.gnome.nautilus.preferences "default-sort-in-reverse-order"

素のgnomeにおいては、dconfには設定項目があるのにGUIからはいじれないものが多いようだ。tweaksを入れるか、extensionを入れるか、dconfを直接いじる必要がある。

X has gone away

長いことXubuntuを使ってきたのだけど、思うところがあり素のUbuntuに乗り換えた。この際新しいSSDにクリーンインストールしたので諸々の事柄を設定しなおしとなった。とても面倒であった…。

で、あらかた旧環境の再現が終わってはいるのだが、まだskk周りが残っている。旧環境ではfcitx(4)+fcitx-skkだったのだが、fcitx5+fcitx-skkになった。ここで問題があり…

明らかに壊れている

まず以前から辞書ツールが壊れているのだが、依然として壊れている。まあ壊れているのはボタンのアイコンだけで、機能自体に問題はないっぽい、たぶん。ちなみにボタンは上から追加、削除、上へ、下へ、リロードという感じ。

また、fcitx-skkが参照するdictionary_listの位置が~/.config/fcitx/skk/dictionary_listから~/.local/share/fcitx5/skk/dictionary_listに変わっているようだ。$FCITX_CONFIG_DIRが実際にどこなのかをこのダイアログに表示してくれるととっても嬉しいのだが。現在fcitx-skkを誰が作っているのか、libskkを誰が作っているのか、結局よく知らないので提案できない。

Wanna suspend a usb device

見ないといいつつまた地上波テレビチューナーについて。

以前も書いたがこのチューナー(PX-S1UD)、長時間稼動させるととたんに動作が不安定になる。柔らかcasの導入もましになった程度で根本的な解決には至っていない。つまるところ熱にすんごく弱いんじゃないのかしらこのハードウェア。

現状、このチューナーを通してテレビを見るために使っているプログラムはrecdvbというものだ。指定の時間分、あるいは垂れ流し状態で地上波テレビの動画をデコードし、ファイルか、任意のポート(udp)か、あるいはhttpサーバとして振る舞いhttpリクエストの応答として出力することができる。

で、現状はそれをhttpサーバとして常駐させて、vlcからhttp://127.0.0.1:8080/13 みたいな感じのURLで開いて見ているのだが、見終わった後もチューナーは熱いままなのである。もしかしたら見終わった(vlcを閉じた)ということがrecdvbに伝わらないまま、延々デコードして、データは捨てている状態になっているのかもしれない。

ということは、httpサーバとして使用するのではなく、視聴のたびにrecdvbを起動し、見終わったらrecdvbも終了させる方がよいのかもしれない。そういうやり方だとhttpサーバとして動作させる意味もあまりないのでudpで吐き出させる方がいいかな。とりあえずそんな感じの構成にしてみたのでしばらくこれで様子を見たい。

ちなみに、USBデバイスなので自動でサスペンドに入るモードがないのかpowertopで調べてみたが、tunableではないようだ。また、/sys/bus/usb/…/power/controlにautoを書き込んでも自動でサスペンドに入ったりはしないようだ。廉価な製品はそういうものなのかもしれない。

Prevent Apache from AH00144

たまにApache2がタイトルのエラーで起動に失敗することがあるのに対処した。何が原因でどうするかはApache が AH00144 で落ちる件の通り。

複数の対処方が述べられているが /etc/systemd/logind.conf.d/の下のファイルでRemoveIPC=noとする方法を採った。すでにこのディレクトリに、ラップトップのスクリーンを閉じても特に何もしないようにする設定のファイルを置いていたので。

それぞれの設定内容は以下の通り:

[Login]
RemoveIPC=no
[Login]
HandleLidSwitch=ignore

Jammy Jellyfish⁠ is approaching fast

xubuntu 22.04.1になった。

  • xfce4-terminalで太字属性が正しく太字で描画されるようになった。これが気になっていたので一時期mltermとかに移行してみたのだが、困ったことに若干不安定だったり背景の透明化が効かなかったり常用にはちょっと厳しかった
  • パネルからなぜかdatetimeプラグインが消えてしまった。入れ直せばまた入る
  • Thunarでサムネイル表示させてると割と不安定だったのが直っている…かもしれない
  • Firefoxがsnapアプリケーションになった。なんか事前の情報だとけっこうダメダメな出来だと聞いていたが上手く動いている気がする
  • Chromeで動画を再生する際にハードウェアアクセラレーションが効かなかったのでいろいろググってあらかた試したのだが全然だった。今回ふと確認してみたら普通に効いてた
  • xfce4-terminalにはドロップダウンモードというものがあり、つまりいつでもどこでもショートカットキーひとつで呼び出せる端末として振る舞う。これはけっこう便利なのだが、しばらく使っていると呼び出しても反応しなくなる。不思議なことに、マウスポインタをパネルの上に乗せると即反応する。なんだこれは。今のところそれが直っている気がする

特にトラブルとかなかった。16→18のときは盛大に問題続出だったのを振り返ると成熟あじがある。

22.04と関係ないのだけど、地上波テレビを見るためにいわゆる柔らかいアレを導入しているのだがシステムのlibpcsclite.soを置き換えるというワイルドな手段をとっていたためwifiが使えなくなる(wpa_supplicantがスマートカードからの読み込み機能を持っているらしいので)という不具合があった。そこで、件のライブラリを置き換えずに済むような感じにlibarib25.soのビルドを変更。まあそもそもマジで地上波テレビ見ないからどうでもいいといえばいいのだが。たまに何か見るときもありますしね。

Blocking something

今日のwwwでは、広告は貼られることが当然のものになっている。しかし広告がページの閲覧をどの程度邪魔するかとか、どの程度リソースを消費できるかとか、そういったものを規制する統一された基準は特にないように思える。ないので、やりようによっては全画面広告だとかいきなり動画が再生される広告とかマシンパワーをやたら横取りする広告とかなんでもできうる。

もちろんそんなことを勝手にされたらたまらないわけで、PCのブラウザでは広告ブロッカー拡張を導入するユーザーが少なくない。いやwebサイトの維持に広告収入が重要なのはよく分かるのですが。しかし広告をブロックするとページの読み込みが何倍も速くなってついでにバッテリーも保つんだからしょうがないよね。全然しょうがない。

などと言いつつうちではその手のブロッカーは入れていない。というのは、ブロッカーってブロックのためのリストを内包してるわけだが、ページを読むたびに何万件ものリストと照合するのそれはそれで無駄にメモリやCPUパワーを使ってないですか? と思うからだ。その代わりにjavascriptの実行自体をブロックする拡張を入れている。

javascriptの実行自体をブロックする拡張と言えば有名なのはNoscriptというやつなのだが、これは基本的に常にjavascriptの実行を禁止するが許可リストに登録されたサイトだけは例外扱いとするスタイルである。これだと知らないサイトに行くとだいたい動かない→許可リストに登録→リロードという作業を強いられるのでけっこうというかかなりうざったい。怪しげなサイトだろうが全うなサイトだろうがどこでもjavascriptでドライブされるのが前提である今時のwwwに適合していない。

そこで、NoscriptではなくScriptBlockという拡張を入れている。これはもうちょっとマイルドなルールでブロックするか否かを決めているらしく、たいていの場合そういうめんどくさい作業をしなくても済むようになっている。ただそのルールの詳細がよく分からないのと、あとページのあらゆる要素にdata-ssなんちゃらという属性を嵌めまくるのが若干胃がムカつく。つまるところ、広告をブロックしたい!という要件に対して満足するソリューションを見付けられていないのである。

  • 同一ドメイン上のスクリプトは実行を許可する
  • 有名所のCDNなんかのスクリプトなんかも許可する
  • ブラウジングコンテキストのドメインと異なる場所から読み込まれるスクリプトは明示的に許可されていない限りブロックする

くらいのシンプルな拡張があればいいのだけど。そういうのないかな。