GNU coreutilsのcatで改行コードなどを確認する

最近知りました.

LC_MESSAGES=ja_JP.UTF-8のcat(1)
$ LC_MESSAGES=ja_JP.UTF-8 man cat | grep '\-A' -A25
       -A, --show-all           -vET と同じ

       -b, --number-nonblank
              空行以外に行番号を付ける。-n より優先される

       -e                       -vE と同じ

       -E, --show-ends
              行の最後に $ を付ける

       -n, --number
              全ての行に行番号を付ける

       -s, --squeeze-blank
              連続した空行の出力を行わない

       -t                       -vT と同じ

       -T, --show-tabs
              TAB 文字を ^I で表示

       -u     (無視)

       -v, --show-nonprinting
              ^ や M- 表記を使用する (LFD と TAB は除く)
LC_MESSAGES=Cのcat(1)
$ LC_MESSAGES=C man cat | grep '\-A' -A26
       -A, --show-all
              equivalent to -vET

       -b, --number-nonblank
              number nonempty output lines, overrides -n

       -e     equivalent to -vE

       -E, --show-ends
              display $ at end of each line

       -n, --number
              number all output lines

       -s, --squeeze-blank
              suppress repeated empty output lines

       -t     equivalent to -vT

       -T, --show-tabs
              display TAB characters as ^I

       -u     (ignored)

       -v, --show-nonprinting
              use ^ and M- notation, except for LFD and TAB
テストファイル作成
$ echo 'hoge
>       fuga
> ' | unix2dos > /tmp/test
odで中身確認
$ od -xc /tmp/test
0000000    6f68    6567    0a0d    6609    6775    0d61    0d0a    000a
          h   o   g   e  \r  \n  \t   f   u   g   a  \r  \n  \r  \n
0000017
普通にcat
$ cat /tmp/test
hoge
	fuga
-T でTABを ^I として表示
$ cat -T /tmp/test
hoge
^Ifuga
-v で\nやTABを除く制御コードを表示ここでは\rが^Mとして表示されている
$ cat -v /tmp/test
hoge^M
	fuga^M
^M
-t-vT と同じ
$ cat -t /tmp/test
hoge^M
^Ifuga^M
^M
-E で行末に$を表示.\rがあると頭に付いてしまうよう
$ cat -E /tmp/test
$oge
$	fuga
$
Note
追記 2020-02-10)
Debianでreportbugしたらpatchが :)
Debian 11 BullseyeやUbuntu 21.04に入るかな?
https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=982208;filename=cat—​show-ends.diff;msg=10
-A-vET と同じ
$ cat -A /tmp/test
hoge^M$
^Ifuga^M$
^M$
-n で行番号を表示
$ cat -n /tmp/test
     1	hoge
     2		fuga
     3
-An で行番号と記号
$ cat -An /tmp/test
     1	hoge^M$
     2	^Ifuga^M$
     3	^M$

vimでは :set list, :set number でだいたい同じ感じでしょうか.

vim
  1 hoge$
  2 ^Ifuga$
  3 $

vim

環境
$ cat --version
cat (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjorn Granlund and Richard M. Stallman.
$ dpkg-query -W coreutils
coreutils	8.32-4+b1
$ lsb_release -dr
Description:	Debian GNU/Linux bullseye/sid
Release:	unstable
$ uname -m
x86_64

素早く絵文字や顔文字を選択するSplatmoji

最近絵文字や顔文字を探すのにはMozcやemojを利用しています.

似たものとしてSplatmojiというものを見つけたので試してみました.

導入はsourceか,パッケージが利用できます.パッケージ利用の場合はReleasesページからrpm, debが利用可能です.

sourceから
$ sudo apt install rofi xdotool xsel jq (1)
$ git clone https://github.com/cspeterson/splatmoji (2)
$ cd splatmoji
$ ./splatmoji copy
  1. 必要なパッケージを導入
  2. Splatmojiをclone
debパッケージから
$ wget https://github.com/cspeterson/splatmoji/releases/download/v1.2.0/splatmoji_1.2.0_all.deb (1)
$ sudo apt install ./splatmoji_1.2.0_all.deb (2)
$ splatmoji copy
  1. .debファイルをダウンロード
  2. .debファイルをaptコマンドでインストール

splatmoji copy として実行するとコピーモードでSplatmojiが起動して,絵文字や顔文字を選択するとクリップボードに貼り付けられます.
emojと違い,GUIのポップアップメニューとして起動するのでSplatmojiをショートカットキーに設定しておくと便利そうです.SplatmojiのREADMEにいくつかの環境のショートカットキーの登録方法も載っています :)

awesome wmではこんな感じで設定ファイルに登録してみました.

~/.config/awesome/rc.lua
    -- Emoji(Splatmoji)
    awful.key({ modkey,  "Control" }, "e", function () awful.util.spawn("splatmoji copy") end),
追記)
i3 wmでも設定しました.
~/.config/i3/config
# Emoji(Splatmoji)
bindsym $mod+Ctrl+e exec "splatmoji copy"
動いている様子

環境
$ dpkg-query -W rofi xdotool xsel jq splatmoji
jq      1.6-2.1
rofi    1.5.4-1+b1
splatmoji       1.2.0
xdotool 1:3.20160805.1-4
xsel    1.2.0+git9bfc13d.20180109-3
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

オライリージャパンで公開されている「GNU Make 第3版」のpdfをダウンロードして1つのpdfファイルにまとめる

以下のTweetで知ったので

読んでみようと以下のページからダウンロードしようとしたら章ごとにファイルが分割されていました.

ダウンロードしてpdftkで結合して1つのファイルにまとめてみました.

$ w3m -o display_link_number=1 https://www.oreilly.co.jp/library/4873112699/ | grep \\.pdf$ | grep -v catalog | cut -f2 -d\  | wget --wait=30 --random-wait -i - (1)
$ wget https://www.oreilly.co.jp/books/images/picture_large4-87311-269-9.jpeg (2)
$ convert ./picture_large4-87311-269-9.jpeg ./hyoushi.pdf (3)
$ ls *.pdf
appA.pdf  ato.pdf   ch03.pdf  ch06.pdf  ch09.pdf  ch12.pdf      index.pdf
appB.pdf  ch01.pdf  ch04.pdf  ch07.pdf  ch10.pdf  contents.pdf  mae.pdf
appC.pdf  ch02.pdf  ch05.pdf  ch08.pdf  ch11.pdf  hyoushi.pdf   maegaki.pdf
$ pdftk ./hyoushi.pdf ./mae.pdf ./maegaki.pdf ./contents.pdf ./ch01.pdf ./ch02.pdf ./ch03.pdf ./ch04.pdf ./ch05.pdf ./ch06.pdf ./ch07.pdf ./ch08.pdf ./ch09.pdf ./ch10.pdf ./ch11.pdf ./ch12.pdf ./appA.pdf ./appB.pdf ./appC.pdf ./index.pdf ./ato.pdf cat output "./GNU Make 第3版.pdf" (4)
$ pdfinfo ./GNU\ Make\ 第3版.pdf
Creator:        pdftk-java 3.1.1
Producer:       itext-paulo-155 (itextpdf.sf.net-lowagie.com)
CreationDate:   Tue Jan 26 07:56:56 2021 JST
ModDate:        Tue Jan 26 07:56:56 2021 JST
Tagged:         no
UserProperties: no
Suspects:       no
Form:           none
JavaScript:     no
Pages:          298
Encrypted:      no
Page size:      516 x 660 pts
Page rot:       0
File size:      20356655 bytes
Optimized:      no
PDF version:    1.6
$ rm ./hyoushi.pdf ./mae.pdf ./maegaki.pdf ./contents.pdf ./ch01.pdf ./ch02.pdf ./ch03.pdf ./ch04.pdf ./ch05.pdf ./ch06.pdf ./ch07.pdf ./ch08.pdf ./ch09.pdf ./ch10.pdf ./ch11.pdf ./ch12.pdf ./appA.pdf ./appB.pdf ./appC.pdf ./index.pdf ./ato.pdf
  1. pdfファイルをダウンロード
  2. 表紙画像をダウンロード
  3. 表紙画像をpdfに変換
  4. pdftkで全ファイルを結合
Oreilly GNU MAKE V3

pdftkはsnapでも導入できるそうです.

環境
$ dpkg-query -W pdftk imagemagick wget w3m
imagemagick     8:6.9.11.58+dfsg-1
pdftk   2.02-5+b1
w3m     0.5.3+git20210102-2
wget    1.21-1+b1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

デスクトップ/デスクトップアプリ共有ソフトのDeskreen

デスクトップ/デスクトップアプリ共有ソフトのDeskreenというものを知りました.

LinuxだとTopページには「🐧LINUX(.DEB)」となっていますが, OTHERS から飛ぶと,.rpmや.AppImageもあります.

今回は AppImage版で試しました.Linux x86_64環境なら大抵動くはずです.

ダウンロードして実行権限を付与して起動します.

$ wget https://github.com/pavlobu/deskreen/releases/download/v1.0.0/Deskreen-1.0.0.AppImage (1)
$ chmod u+x ./Deskreen-1.0.0.AppImage (2)
$ ./Deskreen-1.0.0.AppImage (3)
  1. ダウンロード(ウェブブラウザでダウンロードしてもOK)
  2. 実行権限付与(ファイラーで付与してもOK)
  3. 実行(ファイラーから起動してもOK)

起動すると同じネットワークで利用できる共有用のアドレスとQR codeが表示されます.画面を表示したいマシンのウェブブラウザでこれを開きます.

起動画面

20210125 00:01:08 583360

QR codeをクリックすると拡大されます.スキャンするときに便利.

QR code拡大

20210125 00:01:23 583735

スマートフォンで開くとこういう画面が表示されます.

スマートフォンで開いた画面

Screenshot 20210125 005010

Deskreen側で接続端末を確認して接続許可を与えます.

Deskreenで許可を与える

20210125 00:01:22 594120

次にDeskreenでスクリーンを共有するかアプリケーションウィンドウを共有するかを選択します.

フルスクリーン共有かアプリケーション画面共有かを選択する

20210125 00:01:31 594337

アプリケーションウィンドウを共有してみます.アプリケーションウィンドウの一覧が表示されるので共有したい画面を選択します.

アプリケーション選択画面

20210125 00:01:40 594581

共有する画面のプレビューが表示され,ここで「Confirm」を押すことで共有が開始されます.

最終確認画面

20210125 00:01:22 595609

Deskreenの共有中の画面です.「Connect New Device」を押すと現在の共有が切断され,新しい共有が開始されます.

共有中画面

20210125 00:01:46 596233

スマートフォンのGoogle Chromeで共有中の画面です.

共有された

Screenshot 20210125 005152

ビデオ画質が選択できます.

ビデオ画質選択

Screenshot 20210125 005202

歯車の右の四角いアイコンでフルスクリーンに出来ます.この画面にしておいておくと良さそうです.フルスクリーン解除は上にスワイプです.

フルスクリーン共有

Screenshot 20210125 005225

Deskreenの設定画面です.今のところほとんど設定変更は出来ません.

設定画面

20210125 00:01:36 602017

ダークモードにしてみました.

ダークモードを選択

20210125 00:01:41 602162

バージョン表記です.

version

20210125 00:01:53 602458

この手のソフトウェアは各種ありますが,最近よく使われているビデオミーティングの画面共有と同じような手順で操作(多分中身も)できるのでとっつきやすいかもしれません.クライアント側に専用アプリケーションを導入する必要がないのもいいですね.アドホックな利用には便利そうです.

固定の場所で毎日タブレットをサブモニタ代わりに使いたいと行った場合は毎回設定が必要なので少し面倒かもしれません.この辺はこれからのバージョンアップに期待したいです.

環境
$ ls -l ./Deskreen-1.0.0.AppImage
-rwxr--r-- 1 matoken matoken 82343060 Jan 21 21:48 ./Deskreen-1.0.0.AppImage
$ sha512sum ./Deskreen-1.0.0.AppImage
dccbe840f64cd335f13e12673ab12196ae52af14c64ae3fdbbcd3233cca988d6d663bf2bca622f32dca24571d2658737f965bca0006a34bb3d2758bcf9a9cb5e  ./Deskreen-1.0.0.AppImage
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

ミュートアンミュートスクリプトを修正

以前Awesome wmでボリュームコントロールをするのにscriptを書いてこれまで使っていました.

しかし,最近アンミュートにしても音が出なくなりました.

amixerではonになっているけど音が出ない
$ amixer -c 0 get Master
Simple mixer control 'Master',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback 0 - 87
  Mono: Playback 36 [41%] [-38.25dB] [on]

pavucontrolで見るとミュートになっています.

pavucontrol mute

これをアンミュートすると音が出ます.
scriptで制御できるようコマンドで試します. pactl set-sink-mute コマンドで制御できました.

$ pactl set-sink-mute
You have to specify a sink name/index and a mute action (0, 1, or 'toggle')
$ pactl set-sink-mute 0 1 (1)
$ pactl set-sink-mute 0 0 (2)
  1. ミュート
  2. アンミュート

ということでscriptに追記しました.動作も問題なさそうです.これでビデオチャット時にアンミュートしたのに音が聞こえない??とならないといいな.

$ git -C ~/.config/awesome/ diff ~/.config/awesome/bin/awesome-audio.sh
diff --git a/bin/awesome-audio.sh b/bin/awesome-audio.sh
index 440f399..9c30d3d 100755
--- a/bin/awesome-audio.sh
+++ b/bin/awesome-audio.sh
@@ -22,6 +22,7 @@ case "$1" in
       amixer -q -c 0 set Master unmute
       amixer -q -c 0 set Speaker unmute
       amixer -q -c 0 set Headphone unmute
+      pactl set-sink-mute 0 0
       xset b
       echo -e "🔊\nunmute!"
       amixer -c 0 get Master | tail -1 | cut -d '[' -f 2 | sed s/\]// | xargs notify-send -u low -t 500 -i '/usr/share/icons/ContrastHigh/scalable/status/audio-volume-high.svg' numute
環境
$ dpkg-query -W pulseaudio pulseaudio-utils pavucontrol alsa-utils
alsa-utils      1.2.4-1
pavucontrol     4.0-2
pulseaudio      14.2-1
pulseaudio-utils        14.2-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

Gnome ShellでBitbar, SwiftBar代替のArgosを使う

PodcastのRebuild.fm 292回でBitBar, SwiftBar というツールバーに任意のコマンドの結果を表示できるツールを知って

Linuxで動作するBitBar/SwiftBar Alternativeが無いかなと探して,Argos, Kargos, Margosというものを見つけました.

そして先日Margosを試してみたけどウィンドウ表示できなかったりと機能が少なかったです.

ということで今回はGnome Shell環境を用意してBitBarと互換性があるというArgosを試してみました.

ArgosはGnome shellの拡張機能として提供されています.
以下のページから入手できます.ブラウザから導入もしくは手動でダウンロードして展開します.

手動ダウンロード時はGnome shellのバージョンを求められるのでバージョンがわからない場合は以下のようなコマンドで確認できます.

Gnome Shellバージョン確認
$ gnome-shell --version
GNOME Shell 3.38.3

手動での導入の場合拡張機能ダウンロード後以下のような感じで展開します.

$ mkdir -p ~/.local/share/gnome-shell/extensions
$ unzip ./argospew.worldwidemann.com.v3.shell-extension.zip \
-d ~/.local/share/gnome-shell/extensions/argos@pew.worldwidemann.com/

このあとGnome Shell を Alt+F2 r↲ と操作して再起動して反映します.

ステータスバーにArgosは現れましたが,クリックしてもウィンドウが開きません.Gnome Shellが新しい(3.36以降?)とArgosはうまく動かないようです.

Gitリポジトリのmasterと以下のPRのpatchを利用して動作しました.

一旦Argosを削除して導入し直します.

旧バージョンを削除
$ gnome-extensions disable argos@pew.worldwidemann.com (1)
$ gnome-extensions uninstall argos@pew.worldwidemann.com (2)
  1. 拡張機能無効化
  2. アンインストール

続いてGit版ArgosのmasterとPRのファイルを適用します.

$ git clone https://github.com/p-e-w/argos (1)
$ cd argos
$ cp -r ./argos@pew.worldwidemann.com \
~/.local/share/gnome-shell/extensions/ (2)
$ wget https://raw.githubusercontent.com/p-e-w/argos/c4663d9d3e29ef33b7e9123ef0c095811c91cf5b/argos%40pew.worldwidemann.com/menuitem.js \
-O ~/.local/share/gnome-shell/extensions/argos@pew.worldwidemann.com/menuitem.js (3)
  1. リポジトリclone
  2. 拡張機能コピー
  3. Gnome Shell 3.36+向けの修正を適用

Alt+F2 r↲ でGnome Shellを再起動して反映してGnome Shell 3.38.3でも動作するようになりました.

Argosのデフォルトプラグインを確認してみます.

ステータスバーにArgosが現れているはずです.文字列をクリックでウィンドウが表示されます.最下部の argos.sh をクリックすると規定値のテキストエディタで開かれてそのまま編集できて便利です.

argos argos

Argos Pluginは結構簡単に書けます.

~/.config/argos/実行可能プラグラムやスクリプトを置くと即実行されます.プログラムの出力結果1行目がバーに表示され,--- の後がウィンドウ内に表示されます.インターバルはファイル名で制御します.
例えば hoge.3s+.sh の場合は3秒毎に実行され, fuga.10m+.py は10分毎に実行されます.
その他色を付けたりアイコンを設定したり色々できるようです.詳しくはBitBar, Argosのドキュメントを参照してください.

試しに簡単なPluginを作ってみます.

まずは定番の天気表示をwegoコマンドで試します.
天気をバーに表示してクリックすると2日分の天気予報を表示されるようにしてみました.罫線は崩れちゃいました.

argos wego

~/.config/argos/wego.1h+.sh
#!/bin/bash

STR=`wego -d 2 -f emoji`
echo "`echo "${STR}" | head -4 | tail -1`"
echo "---"
echo "${STR}" | awk 1 ORS="\\\\n"
echo " | font=monospace"

次にCPUの温度とtopを表示するものを書いてみました.1分毎にCPUの温度をバーに表示して,クリックするとtopコマンドの上の方をを表示します.手元のPCはよくCPU温度が上がってサーマルスロットリングされてしまうのでこれは結構実用的です.

argos cputhermal

~/.config/argos/cputhermal.1m+.sh
#!/bin/bash

THERMAL=`acpi -t | awk '{print $4}'`
COLOR="white"

if [ `echo "${THERMAL} >= 80" | bc` == 1 ] ; then
        COLOR="red"
fi

#echo "<span color='${COLOR}' weight='normal'><tt>🌡${THERMAL}℃ </tt></span>"
echo "🌡${THERMAL}℃  | color=${COLOR}"
echo "---"
if [ "${ARGOS_MENU_OPEN}" == "true" ]; then
        TOP_OUTPUT=$(top -b -n 1 | head -n 20 | awk 1 ORS="\\\\n")
        echo "${TOP_OUTPUT} | font=monospace bash=top"
else
        echo "Loading..."
fi

本当は80度を超えていたらバーの文字列を赤くしたいのですがうまく行っていません.Argosのバグらしく,ワークアラウンドとして絵文字を表示すればOKというのを見かけましたがこれもうまく動いていません.(ちなみにエスケープシーケンスでの色変更は効くようです.)

次にArgosはBitBarと互換性があるということでBitBar Pluginを利用できるか試してみます.

ただし,PluginによりAPI keyや座標を記述したりと行った少しの修正は必要(これはBitBarでも),更にBitBarはmacOS用なのでシステム周りのPluginは動かなかったりPATHが違ったりするので修正しなうと動かなかったりします.

そのまま動きそうなものとしてHackserNewsを表示するプラグインを試してみました.リポジトリをcloneしてシンボリックリンクを貼ると動作しました :)

$ git clone https://github.com/matryer/bitbar-plugins
$ cd bitbar-plugins
$ ln -s `pwd`/Web/HackerNews/hacker_news.1m.rb ~/.config/argos/

argos hackernews

という感じでArgosはBitBarと互換性があるしShell Scriptなどをちょっと書くだけでステータスバーにいろいろな情報を表示来てとても便利です.Gnome Shell環境の方はぜひためしてみてください.

しかし,解像度が低いと表示領域が狭く一部しか表示されなくて視認性が悪くなるので大画面のモニタがほしいところです…….

ということでMargos, Argosを試して残りはKDE Plasma向けのKargosですが,WebのREADMEを見るとちょっと古そうなので試すのをためらっています.

A Plasma port of Argos and BitBar plugins to fast create custom plasmoids.

Note: This is an alpha project. By now, it only was tested on Kubuntu 16.04 LTS.

環境1
$ git -C ~/src/argos log | head -1
commit fcb475140bd9d0b4b95279ce56c4c28f36fb29d6
$ dpkg-query -W gnome-shell gnome-shell-extensions
gnome-shell     3.38.3-1
gnome-shell-extensions  3.38.2-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
環境2
$ git -C ~/src/argos log | head -1
commit fcb475140bd9d0b4b95279ce56c4c28f36fb29d6
$ dpkg-query -W gnome-shell gnome-shell-extensions
gnome-shell     3.38.2-1ubuntu1
gnome-shell-extensions  3.38.2-1
$ lsb_release -dr
Description:    Ubuntu Hirsute Hippo (development branch)
Release:        21.04
$ uname -m
x86_64

フォントワークスのOFL-1.1 LicenseのフォントをLinuxデスクトップで利用する

ライセンスは著作権表示などを行なうことで商用/非商用を問わず無料で利用可能な「SIL Open Font License 1.1」。Google Fontsへの提供に伴い、GitHubでもフォントの公開を開始している。

この記事を書いている現在はまだGoogle Fontsでは公開されていないようです.

GitHubからは.ttfが入手できるので試してみます.

$ wget \ (1)
https://github.com/fontworks-fonts/Klee/raw/master/fonts/ttf/KleeOne-Regular.ttf \
https://github.com/fontworks-fonts/Klee/raw/master/fonts/ttf/KleeOne-SemiBold.ttf \
https://github.com/fontworks-fonts/Train/raw/master/fonts/ttf/TrainOne-Regular.ttf \
https://github.com/fontworks-fonts/Stick/raw/master/fonts/ttf/Stick-Regular.ttf \
https://github.com/fontworks-fonts/RocknRoll/raw/master/fonts/ttf/RocknRollOne-Regular.ttf \
https://github.com/fontworks-fonts/Reggae/raw/master/fonts/ttf/ReggaeOne-Regular.ttf \
https://github.com/fontworks-fonts/Rampart/raw/master/fonts/ttf/RampartOne-Regular.ttf \
https://github.com/fontworks-fonts/DotGothic16/raw/master/fonts/ttf/DotGothic16-Regular.ttf
$ mkdir -p ~/.local/share/fonts/fontworks (2)
$ mv *.ttf ~/.local/share/fonts/fontworks/ (3)
$ fc-cache -fv (4)
$ fc-list | grep -i fontworks (5)
/home/matoken/.local/share/fonts/fontworks/Stick-Regular.ttf: ステッキ,Stick:style=Regular
/home/matoken/.local/share/fonts/fontworks/DotGothic16-Regular.ttf: ドットゴシック16,DotGothic16:style=Regular
/home/matoken/.local/share/fonts/fontworks/TrainOne-Regular.ttf: トレイン One,Train One:style=Regular
/home/matoken/.local/share/fonts/fontworks/RampartOne-Regular.ttf: ランパート One,Rampart One:style=Regular
/home/matoken/.local/share/fonts/fontworks/KleeOne-Regular.ttf: クレー One,Klee One:style=Regular
/home/matoken/.local/share/fonts/fontworks/KleeOne-SemiBold.ttf: クレー One,Klee One,Klee One SemiBold:style=SemiBold,Regular
/home/matoken/.local/share/fonts/fontworks/RocknRollOne-Regular.ttf: ロックンロール One,RocknRoll One:style=Regular
/home/matoken/.local/share/fonts/fontworks/ReggaeOne-Regular.ttf: レゲエ One,Reggae One:style=Regular
  1. 利用したいフォントをダウンロード(ここではすべて)
  2. フォント格納ディレクトリ作成
  3. ダウンロードしたフォントを移動
  4. フォントが使えるようにキャッシュファイルを更新
  5. フォントが登録されているか確認
Note
システムワイドの場合は /usr/share/fonts/ 以下にフォントを配置します.
$ sudo mkdir /usr/share/fonts/truetype/fontworks
$ sudo mv *.ttf /usr/share/fonts/truetype/fontworks

早速試してみます.LibreOffice Writerで表示したところです.普通に使えていそうです :)

fontworks

さて,ライセンス的には著作権表示をすれば商用,非商用問わず無料で利用できるようなのですが,記憶力に自信がないのでしばらくすると著作編表示を忘れて使ってしまいそうです.ということで一旦消しておきます…….

$ rm -r ~/.local/share/fonts/fontworks
$ fc-cache -fv
$ fc-list | grep -i fontworks
環境
$ dpkg-query -W fontconfig
fontconfig      2.13.1-4.2
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

追記 2021-02-07

Debian sid adm64にDebianパッケージとして提供されました.

apt installで簡単に導入できるようになりました :)

パッケージでの導入例
$ sudo apt update (1)
$ apt-cache search fontworks (2)
fonts-dotgothic16 - TrueType font based on the old 16x16 Gothic bitmap
fonts-klee - script font handwritten by pencil or pen
fonts-rampart - unique outline shadow font made in the image of 3-D blocks
fonts-reggae - display font often used in Japanese boys' magazines and digital content
fonts-rocknroll - pop-style font
fonts-stick - font designed with straight lines, wide versatility for use
fonts-train - gothic-style typeface made with an outer and inner line
$ sudo apt install fonts-dotgothic16 fonts-klee fonts-rampart fonts-reggae fonts-rocknroll fonts-stick fonts-train (3)
$ dpkg-query -W fonts-dotgothic16 fonts-klee fonts-rampart fonts-reggae fonts-rocknroll fonts-stick fonts-train  (4)
fonts-dotgothic16       1.000-20210120-2
fonts-klee      1.000-20210121-2
fonts-rampart   1.000-20210120-2
fonts-reggae    1.000-20210120-2
fonts-rocknroll 1.000-20210120-2
fonts-stick     1.000-20210120-2
fonts-train     1.000-20210120-2
$ fc-list | grep -i fontworks (5)
/home/matoken/.local/share/fonts/fontworks/Stick-Regular.ttf: ステッキ,Stick:style=Regular
/home/matoken/.local/share/fonts/fontworks/DotGothic16-Regular.ttf: ドットゴシック16,DotGothic16:style=Regular
/home/matoken/.local/share/fonts/fontworks/TrainOne-Regular.ttf: トレイン One,Train One:style=Regular
/home/matoken/.local/share/fonts/fontworks/RampartOne-Regular.ttf: ランパート One,Rampart One:style=Regular
/home/matoken/.local/share/fonts/fontworks/KleeOne-Regular.ttf: クレー One,Klee One:style=Regular
/home/matoken/.local/share/fonts/fontworks/KleeOne-SemiBold.ttf: クレー One,Klee One,Klee One SemiBold:style=SemiBold,Regular
/home/matoken/.local/share/fonts/fontworks/RocknRollOne-Regular.ttf: ロックンロール One,RocknRoll One:style=Regular
/home/matoken/.local/share/fonts/fontworks/ReggaeOne-Regular.ttf: レゲエ One,Reggae One:style=Regular
  1. パッケージ情報の更新
  2. フォントの検索
  3. フォントパッケージの導入
  4. フォントパッケージの確認
  5. フォントの確認

Nextcloudが Internal Server Error を返すようになって困った

NextcloudのWeb版にアクセスすると Internal Server Error が帰ってくるようになっていました.

20210119 00:01:55 1076844

Internal Server Error

The server encountered an internal error and was unable to complete your request.
Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
More details can be found in the server log.

別のユーザで試すとログイン画面は表示されて認証機能は動作します.しかしログイン後同じように Internal Server Error このときAndroid版アプリでは普通に利用できていそうです.

よくあるのがサポート対象外になったレガシーなアプリを導入すると同じような状態になることがあります.
しかし,前回利用できていたときと現在の間に特にディストリビューション, Nextcloud, Nextcloudアプリ共にアップデートはしていないはずです.

ログを確認するとhttpdのaccess/errorのlogは特に問題なさそう.
nextcloud.logでそれらしいのは file_put_contents failed でしょうか?

logはNextcloudの設定ファイルの config.php で確認できる.
$ grep log config/config.php
  'log_type' => 'file',
  'logfile' => '/var/log/nextcloud.log',
  'loglevel' => 0,
$ tail -f /var/log/nextcloud.log | jq .
errorっぽいところ?
{
  "reqId": "DVQsgBekfOCY3dvjYO6w",
  "level": 3,
  "time": "2021-01-18T14:59:53+00:00",
  "remoteAddr": "180.131.110.140",
  "user": "matoken",
  "app": "core",
  "method": "GET",
  "url": "/index.php/apps/files/",
  "message": {
    "Exception": "OCP\\Files\\GenericFileException",
    "Message": "file_put_contents failed",
    "Code": 0,
    "Trace": [
      {

まずは手動でファイルとデータベースのバックアップを取っておきます.

バックアップ例
$ sudo -u www-data php /var/www/files.matoken.org/occ maintenance:mode --on (1)
$ sudo -u www-data tar cvf - ${NEXTCLOUD_PATH} | xz > ${BACKUP_PATH}/nextcloud-`date +%F_%T`.tar.xz (2)
$ sudo -u www-data tar cvf - ${NEXTCLOUD_DATA_PATH} | xz > ${BACKUP_PATH}/nextcloud-data-`date +%F_%T`.tar.xz (3)
$ mysqldump --opt --all-databases --events | xz > ${BACKUP_PATH}/nextcloud-`date +%F_%T`.sql.xz (4)
$ sudo -u www-data php /var/www/files.matoken.org/occ maintenance:mode --off (5)
1 メンテナンスモードにする
2 Nextcloud自体のバックアップ
3 Nextcloudデータのバックアップ
4 データベースのバックアップ
5 メンテンスモードを終了

occmaintenance:repair コマンドを試します.

$ sudo -u www-data php ${NEXTCLOUD_PATH}/occ maintenance:repair
 - Repair MySQL collation
     - All tables already have the correct collation -> nothing to do
 - Repair mime types
  : 以下略

コマンド終了後webを再読込するとエラーは解消されました. :)

しかしファイルの一覧が表示されません.最新ファイルは表示されるのでそのファイルを確認すると表示されます.

次に occ files:scan を試してみました.

$ sudo -u www-data php ${NEXTCLOUD_PATH}/occ files:scan --all
Starting scan for user 1 out of 7 (user1)
  : ※省略
+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 20752   | 34164 | 00:04:33     |
+---------+-------+--------------+

これでは変わらなかったようです.多分必要なかった.

次に occ files:scan-app-data を試します.

$ sudo -u www-data php ${NEXTCLOUD_PATH}/occ files:scan-app-data
Scanning AppData for files

+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 84      | 97    | 00:00:01     |
+---------+-------+--------------+

これが当たりだったようで復活しました!

ログを見るとこの問題が発生している間も他のNextcloudアプリは動作していたようだし,Androidアプリ版ではファイルの自動アップロードも動いていたようなので恐らくNextcloud Web版の部分が壊れていたのではないかと思います.

しかし治ったのはいいけどなぜこれが起こったかが謎なのが気持ち悪いです…….

環境
$ sudo -u www-data php /var/www/files.matoken.org/occ -V
Nextcloud 20.0.5
$ dpkg-query -W php mariadb-server
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

Nextcloud 20.0.4のセキュリティ&セットアップ警告に対応

先日 Nextcloud 19.0.6 から 20.0.4 にアップデートしました.
すると「セキュリティ&セットアップ警告」画面にいくつか警告が出てきたのでその対応メモです.

20201227 19:12:04 2470200

セキュリティ&セットアップ警告
サーバーのセキュリティとパフォーマンスにとって重要なことは、すべてが正確に設定されていることです。あなたの助けとなるよう、Nextcloudでは一部の自動チェックを行っています。詳細な情報は、リンク先のドキュメントを参照してください。

セットアップに関して警告がいくつかあります。
The old server-side-encryption format is enabled. We recommend disabling this. For more details see the documentation.
データベースにいくつかのインデックスがありません。 大きなテーブルにインデックスを追加すると、自動的に追加されないまでに時間がかかる可能性があるためです。 "occ db:add-missing-indices"を実行することによって、インスタンスが実行し続けている間にそれらの欠けているインデックスを手動で追加することができます。 インデックスが追加されると、それらのテーブルへのクエリは通常はるかに速くなります。
テーブル "oc_cards"のインデックス "cards_abiduri"が見つかりません。
The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running "occ db:add-missing-primary-keys" those missing primary keys could be added manually while the instance keeps running.
Missing primary key on table "oc_federated_reshares".
Missing primary key on table "oc_systemtag_object_mapping".
Missing primary key on table "oc_comments_read_markers".
Missing primary key on table "oc_collres_resources".
Missing primary key on table "oc_collres_accesscache".
Missing primary key on table "oc_filecache_extended".
データベース内のいくつかの列で、big intへの変換が行われていません。 大きなテーブルでカラムタイプを変更すると時間がかかることがあるため、自動的には変更されませんでした。 'occ db:convert-filecache-bigint'を実行することによって、それらの保留中の変更は手動で適用できます。 この操作は、インスタンスがオフラインの間に行う必要があります。 詳細についてはこれに関するドキュメントページを読んでください。
federated_reshares.share_id
filecache_extended.fileid
share_external.id
share_external.parent
インストールガイド ↗を再確認して、 ログ にあるすべてのエラーや警告を確認してください。

データベースにいくつかのインデックスがありません。

データベースから修正していきます.まあ書いてあるコマンドを叩くだけですが.

$ sudo -u www-data php ${NEXTCLOUDPATH}/occ db:add-missing-indices
Check indices of the share table.
Check indices of the filecache table.
Check indices of the twofactor_providers table.
Check indices of the login_flow_v2 table.
Check indices of the whats_new table.
Check indices of the cards table.
Adding cards_abiduri index to the cards table, this can take some time...
cards table updated successfully.
Check indices of the cards_properties table.
Check indices of the calendarobjects_props table.
Check indices of the schedulingobjects table.
Check indices of the oc_properties table.

The database is missing some primary keys.

The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running “occ db:add-missing-primary-keys” those missing primary keys could be added manually while the instance keeps running.
Missing primary key on table “oc_federated_reshares”.
Missing primary key on table “oc_systemtag_object_mapping”.
Missing primary key on table “oc_comments_read_markers”.
Missing primary key on table “oc_collres_resources”.
Missing primary key on table “oc_collres_accesscache”.
Missing primary key on table “oc_filecache_extended”.

$ sudo -u www-data php ${NEXTCLOUDPATH}/occ db:add-missing-primary-keys
Check primary keys.
Adding primary key to the federated_reshares table, this can take some time...
federated_reshares table updated successfully.
Adding primary key to the systemtag_object_mapping table, this can take some time...
systemtag_object_mapping table updated successfully.
Adding primary key to the comments_read_markers table, this can take some time...
comments_read_markers table updated successfully.
Adding primary key to the collres_resources table, this can take some time...
collres_resources table updated successfully.
Adding primary key to the collres_accesscache table, this can take some time...
collres_accesscache table updated successfully.
Adding primary key to the filecache_extended table, this can take some time...
filecache_extended table updated successfully.

データベース内のいくつかの列で、big intへの変換が行われていません。

データベース内のいくつかの列で、big intへの変換が行われていません。 大きなテーブルでカラムタイプを変更すると時間がかかることがあるため、自動的には変更されませんでした。 ‘occ db:convert-filecache-bigint’を実行することによって、それらの保留中の変更は手動で適用できます。 この操作は、インスタンスがオフラインの間に行う必要があります。

$ sudo -u www-data php ${NEXTCLOUDPATH}/occ db:convert-filecache-bigint
Following columns will be updated:

* federated_reshares.share_id
* filecache_extended.fileid
* share_external.id
* share_external.parent

This can take up to hours, depending on the number of files in your instance!
Continue with the conversion (y/n)? [n] y

The old server-side-encryption format is enabled. We recommend disabling this.

ここはE2EEで使うサーバサイドの暗号化形式で古い形式が有効になっているのを無効にしたほうがいいよって警告のようです.

The old server-side-encryption format is enabled. We recommend disabling this. For more details see the documentation.

古い形式が使われているかを確認します.

$ sudo -u www-data php ${NEXTCLOUDPATH}/occ encryption:scan:legacy-format
Scanning all files for legacy encryption
Scanning all files for matoken
Scanning all files for hoge
  :

encryption:scan:legacy-format

古い形式は使われていなかったので設定( ${NEXTCLOUDPATH/config/config.php )で明示的に無効にしてしまいます.

-  'encryption.legacy_format_support' => false,
+  'encryption.legacy_format_support' => true,

もし古い形式が残っていて移行したいでもマスターキーを設定していないという場合は該当ファイルの所持ユーザーにデータをコピーし直してもらう必要がありそうです.あまりやりたくない作業ですね.(以下のページを見るとクライアントがアップロードし直しをしてくれるのかもしれない)

これで再読込するとすべてのチェックに合格しました :)

20201227 19:12:47 2533788

環境
$ sudo -u www-data php /var/www/files.matoken.org/occ -V
Nextcloud 20.0.4
$ dpkg-query -W php mariadb-server
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -vm
#1 SMP Debian 4.19.160-2 (2020-11-28) x86_64

v4l2loopbackモジュールで作られるビデオデバイスへの名前の付け方

v4l2loopback moduleを利用して仮想カメラなどを利用しています.

このモジュールを呼び出すときにオプションを指定して複数のデバイスにしたり,それぞれにデバイスに名前をつけたり出来ます.

If you need several independent loopback devices, you can pass the “devices” option, when loading the module; e.g.

# modprobe v4l2loopback devices=4
Will give you 4 loopback devices (e.g. /dev/video1 …​ /dev/video5)

You can also specify the device IDs manually; e.g.

# modprobe v4l2loopback video_nr=3,4,7
Will create 3 devices (/dev/video3, /dev/video4 & /dev/video7)

# modprobe v4l2loopback video_nr=3,4,7 card_label=”device number 3″,”the number four”,”the last one”
Will create 3 devices with the card names passed as the second parameter:

/dev/video3 → device number 3
/dev/video4 → the number four
/dev/video7 → the last one

お手本通りモジュールを呼び出すと,

$ sudo modprobe v4l2loopback video_nr=3,4,7 card_label="device number 3","the number four","the last
one"

想定通りに設定されました.(最後のIntegrated Cameraは内蔵カメラでこのモジュールとは無関係)

$ v4l2-ctl --list-devices
device number 3" (platform:v4l2loopback-000):
        /dev/video3

"the number four" (platform:v4l2loopback-001):
        /dev/video4

"the last one (platform:v4l2loopback-002):
        /dev/video7

Integrated Camera: Integrated C (usb-0000:00:1a.0-1.6):
        /dev/video0
        /dev/video1
        /dev/media0

しかしこの設定を永続化しようと,
/etc/modprobe.d/v4l2loopback.conf
というファイルを用意してこの設定を書いて呼び出すとおかしなことになります.

$ sudo rmmod v4l2loopback (1)
$ echo 'options v4l2loopback video_nr=3,4,7 card_label="device number 3","the number four","the last one"' | sudo tee /etc/modprobe.d/v4l2loopback.conf (2)
options v4l2loopback video_nr=3,4,7 card_label="device number 3","the number four","the last one"
$ sudo modprobe -v v4l2loopback (3)
insmod /lib/modules/5.10.0-1-amd64/updates/dkms/v4l2loopback.ko video_nr=3,4,7 card_label="device number 3","the number four","the last one"
$ v4l2-ctl --list-devices | grep v4l2loopback -A1 (4)
device number 3" (platform:v4l2loopback-000):
        /dev/video3
--
"the number four" (platform:v4l2loopback-001):
        /dev/video4
--
"the last one (platform:v4l2loopback-002):
        /dev/video7
  1. モジュールのアンロード
  2. 設定ファイルへ書き込み
  3. モジュールの再読込
  4. デバイス名の確認

ダブルクオーテーションの扱いが変わってしまうようです.更に名前自体にダブルクオーテーションが含まれてしまいます.

とりあえず全体を1セットのダブルクオーテーションで囲むと大丈夫なようです.

$ echo 'options v4l2loopback video_nr=3,4,7 card_label="device number 3,the number four,the last one"' | sudo tee /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback video_nr=3,4,7 card_label="device number 3,the number four,the last one"
$ sudo modprobe -v v4l2loopback
insmod /lib/modules/5.10.0-1-amd64/updates/dkms/v4l2loopback.ko video_nr=3,4,7 card_label="device number 3,the number four,the last one"
$ v4l2-ctl --list-devices | grep v4l2loopback -A1
device number 3 (platform:v4l2loopback-000):
        /dev/video3
--
the number four (platform:v4l2loopback-001):
        /dev/video4
--
the last one (platform:v4l2loopback-002):
        /dev/video7

ちなみにダブルクオーテーションなしだとこうなりました.

$ sudo modprobe -v v4l2loopback
insmod /lib/modules/5.10.0-1-amd64/updates/dkms/v4l2loopback.ko video_nr=3,4,7 card_label=device number 3,the number four,the last one
$ v4l2-ctl --list-devices | grep v4l2loopback -A1
device (platform:v4l2loopback-000):
        /dev/video3
--
Dummy video device (0x0001) (platform:v4l2loopback-001):
        /dev/video4
--
Dummy video device (0x0002) (platform:v4l2loopback-002):
        /dev/video7

最近リリースされた OBS Studio 26.1でLinux版, macOS版にも仮想カメラ機能が入りました.
これも v4l2loopback を利用しているのですが,ダブルクオーテーションが含まれる場合うまく動かないようです.

環境
$ dpkg-query -W v4l2loopback-* v4l-utils
v4l-utils       1.20.0-2
v4l2loopback-dkms       0.12.5-1
v4l2loopback-modules
v4l2loopback-utils      0.12.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -mv
#1 SMP Debian 5.10.4-1 (2020-12-31) x86_64