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. フォントの確認

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

センサーのログをNextcloudのSensorloggerで記録してみる

この記事は 日本Androidの会秋葉原支部ロボット部 Advent Calendar 2020 の20日分の記事です.
日本Androidの会秋葉原支部ロボット部は現在月に一回勉強会を行い様々な話題で盛り上がっています.
次の勉強会はちょうど今日(20日)です.興味のある方は覗いてみてください.

センサーのログなどをアップロードするのに色々なwebサービスを使ったり,Googleスプレッドシートに書いたりしています.
便利なんだけどロックインになるのは嫌だなって思ったりします.

Nextcloudというファイル共有サービス+αなOSSがあります.アプリケーションを追加して機能を増やすことが出来ます.例えばテレビ電話や,オンラインオフィスとか,マップサービスとか様々なアプリがあります.
これを個人的に立てて便利に使っています

この中のアプリを眺めているとSensorloggerというセンサーのログを保存できそうなものを見つけたので試してみました.

まずNextcloudですが,とりあえず試すだけならsnapを利用するのがお手軽です.Raspberry Pi + Raspberry Pi OSなどでもOKです.

Debian sid amd64/Ubuntu 20.04 LTS/Raspberry Pi OS armhfでは以下の手順でOKでした.

$ sudo apt update && sudo apt upgrade   (1)
$ sudo apt install snapd    (2)
$ sudo snap install nextcloud   (3)
  1. システムのパッケージを最新にする
  2. snapを使えるように snapd パッケージを導入
  3. snapでnextcloudを導入

10分位待つと導入が終わります.ウェブブラウザにIPアドレスを入力するとセットアップ画面が表示されるので管理者ID/PASSWORDを設定します.

これでとりあえず使えるようになったと思います.

この後Sensorloggerを導入します.
管理者権限のアカウントでNextcloudの右上のメニューから「アプリ」を開きます.

20201219 20:12:45 2014278

次に上の検索バーに「Sensorlogger」とかの文字列で検索して「有効」ボタンを押して導入します.

20201219 20:12:42 2017785

Tip
Nextcloudのアプリケーションはコマンドラインから導入することも出来ます.
$ sudo -u www-data occ app:install sensorlogger #通常導入した場合
$ sudo /snap/bin/nextcloud.occ app:install sensorlogger #snapで導入した場合

ここからは一般ユーザでOKです.

Nextcloudの上部から「Sensorlogger」のアイコンをクリックするとSensorloggerの画面が表示されます.

20201219 20:12:03 2021911

はじめはデータがないのでまっさらです.「Device」辺りでデバイスの登録をするのかな?と思いましたが出来ません.
「Read SensorLogger Wiki Devices」と書かれているのでWikiを参照してみます.

データを送ると自動的にデバイスが出来るようです.Simple, Complexの2種類のデータタイプがあるようです.Simpleは温度,湿度のようでとりあえずこれを試してみます.

以下の辺りから post.php を持ってきて使います.このscriptはダミーのランダムな温度と湿度データを作ってSensourloggerにデータを投げます.

何箇所か書き換えます.
* $url = ` を自分のNextcloudのURLに変更します.
* `$array = array("deviceId" ⇒
uuidgen コマンドなどで生成したUUIDに変更します.
* $username = をNextcloudの自分のユーザーに変更します.
* $token = に「設定」「セキュリティ」ページの「デバイスとセッション」の一番下の「新しいアプリパスワードを作成」で作成したトークンに修正します.

そしてphpとphp-curlが必要なので導入します.

Debian sid amd64/Ubuntu 20.04 LTS/Raspberry Pi OS armhfでの例
$ sudo apt install php-cli php-curl

この状態で post.php を実行して成功すると以下のようなメッセージが帰ってきます.

$ php ./post.php
{"success":true,"message":"Sensor Log successfully stored","data":null}

Sensorloggerのページの List を見るとエータがアップロードされているのが解ります :)

手動で実行するのは大変なのでcrontabにこんな感じで登録してみます.5分に一回データを送信します.

$ crontab -e (1)
$ crontab -l | grep post.php (2)
*/5 * * * *     php ~/tmp/post.php 2&>1 > ~/tmp/post.php.log
  1. crontabの編集
  2. crontabに登録されたか確認

同様にRaspberry Piの温度も送ってみます.温度の $temperature を以下のような感じで書き換えて,UUIDも書き換えるとOK.これもcrontabに登録します.

    $temperature = system( '/opt/vc/bin/vcgencmd measure_temp | awk -F "[=\']" \'{print $2 }\' | tr -d \'\n\'' );

しばらく動かしてからダッシュボードを設定するとこんな感じのチャートが表示できました.

20201219 20:12:13 2035392

密集してよくわからない部分はマウスドラッグで矩形選択するとその部分がズームされます.

20201219 22:12:30 2180945

という感じでとりあえず動きました.ドキュメントが未だ充実していな買ったり使い勝手も悪いですが最低限の機能はあるかなという感じです.
興味があったら試してみてください.
若しくはおすすめのアプリやサービスを教えてください.

PCでAndroid端末の画面転送と操作が出来るscrcpy

Debian sid amd64環境ではパッケージがあるので簡単です,armhf/amd64/i386環境ではsnap版が存在します.その他幾つかのLinuxディストリビューションではパッケージがあったり,WindowsやmacOSでも動作するようです.

手元ではDebian sid amd64で動作しました.(Raspberry Pi OS armhfにsnap版を入れた環境ではエラーが発生.内容は未だ未確認)

Debian sid amd64環境だと以下のような感じで導入できました.このときAndroid端末は「開発者向けオプション」が有効になっていて,「USBデバッグ」が有効になっている状態でUSB接続されている必要があります.

Debian sid amd64環境での導入例
$ sudo apt install adb scrcpy (1)
$ lsusb (2)
  :
Bus 002 Device 013: ID 05c6:9024 Qualcomm, Inc. SDM439-MTP _SN:472BF8D8
  :
$ echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="05c6" ATTR{idProduct}=="9024", MODE="0660", GROUP="plugdev", SYMLINK+="android%n"' \
| sudo tee -a /etc/udev/rules.d/51-android.rules (3)
$ sudo udevadm control --reload (4)
$ adb devices (5)
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
976d6a56        device
  1. 必要パッケージの導入
  2. AndroidのVID/PIDを確認(ここでは 05c6:9024 )
  3. adbコマンドが利用できるようにAndroid端末をudev roureに登録
  4. udev ruleを反映する
  5. adbコマンドで認識出来るのを確認

この状態で,scrcpy を実行することでAndroidの画面転送が出来ました.普通に操作も出来ます.
スリープ状態のときは画面が真っ黒ですが,マウス右クリックで解除されます.

$ scrcpy
INFO: scrcpy 1.14 <https://github.com/Genymobile/scrcpy>
/usr/share/scrcpy/s...93 bytes in 0.008s)
[server] INFO: Device: TINNO C330 (Android 9)
INFO: OpenGL shaders: ENABLED
INFO: Created renderer: opengl
INFO: Renderer: opengl
INFO: OpenGL version: 3.0 Mesa 20.2.4
INFO: Trilinear filtering enabled
INFO: Initial texture: 720x1280

20201210 21:12:59 2112960.resized20201210 21:12:31 2113779.resized20201210 21:12:30 2115127.resized

導入も簡単だしこれは便利.しかしメイン端末ではPCにUSB接続するとすぐに充電しなくなってしまうので長時間は使えません.

adb のワイヤレス接続の設定をすると別の端末や充電器で充電しながら利用できそうなので試してみました.

対象のAndroid端末をPCにUSB接続した状態で tcpip コマンドでリモート接続できるようにします.

$ adb tcpip 5555
restarting in TCP mode port: 5555

この状態でPCからAndroid端末を取り外し,Wi-Fi接続のIPアドレスを確認します.

PCでadbコマンドでAndroid端末に接続します.

$ adb connect <ANDROID_IP>>:5555

この状態で scrcpy コマンドを実行すると画面が表示され操作できます.充電器などに接続した状態でも利用できます :)

scrcpy には幾つかオプションがあります.便利そうなものとしては最大解像度を指定する -m, --max-size value で解像度を下げて表示できます,
-n, --no-control で表示だけで操作できなくします.
-r, --record file で画面を録画します.
-w, --stay-awake でscrcpyを実行中Android画面をロック,消灯しません.
-S, --turn-screen-off Android端末のスクリーンを消したまま操作できます.

ショートカットでは
Ctrl + h, マウス中キー でホームボタン,
Ctrl + r でAndroid画面回転,
Ctrl + s でアプリケーション切り替え,
辺りが便利そうです,

Ctrl + c でクリップボードのコピーなのですが,一旦Android側でコピーした後に Ctrl + c でPCへのクリップボードコピーのようです,Ctrl + v の貼り付けもAndroid感での貼り付けで,PCからAndroidのクリップボード貼り付けは Ctrl + Shift + v でした.

詳細は scrcpy --help を参照してください.

これでElectronアプリでPCで動かしているアプリをスマホで……とも思ったのですが日本語入力などはちょっと面倒.もう少し様子見しようと思います.