bullseye – matoken's blog https://matoken.org/blog Is there no plan B? Wed, 06 Sep 2023 21:29:27 +0000 ja hourly 1 https://wordpress.org/?v=6.9.4 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg bullseye – matoken's blog https://matoken.org/blog 32 32 YoutubeをWebpageに変換するYoutube2Webpage https://matoken.org/blog/2023/09/07/youtube2webpage/ https://matoken.org/blog/2023/09/07/youtube2webpage/#respond Wed, 06 Sep 2023 21:28:36 +0000 https://matoken.org/blog/?p=3917

YoutubeをWebpage に変換する Youtube2Webpage を少し試してみました.

これは yt-dlp でYoutube から動画と文字起こしファイルを入手し,文字起こし部分のスクリーンショットを取得してWebpage にするというもののようです.

試しにオープンソースカンファレンスの動画を変換してみました.

$ sudo apt install yt-dlp ffmpeg (1)
$ git clone https://github.com/obra/Youtube2Webpage
$ cd Youtube2Webpage
$ ./yt-to-webpage.pl "【MTG】NetBSDのご紹介 2023-7-29 C-5" 'https://www.youtube.com/watch?v=TnviEtERcVw' (2)
$ python3 -m http.server --bind 127.0.0.1 --directory ./"【MTG】NetBSDのご紹介 2023-7-29 C-5" 8080 (3)
$ xdg-open http://127.0.0.1:8080/index.html (4)
  1. yt-dlp と ffmpeg を導入
  2. 任意のタイトルとYoutube URL を指定して実行
  3. httpd を起動
  4. ウェブブラウザで開く

youtube2webpage

変換されています.
眺めてみるとまず文字起こし翻訳ファイルで en のものが使われています.
そして元動画でWebPage を画面共有しているのであまりスクリーンショットから内容がよくわかりません.

まず文字起こしテキストは --sub-langs ja オプションを付けて日本語を利用するようにしました.

$ git diff ./yt-to-webpage.pl
diff --git a/yt-to-webpage.pl b/yt-to-webpage.pl
index 41b8acf..4174658 100755
--- a/yt-to-webpage.pl
+++ b/yt-to-webpage.pl
@@ -15,7 +15,7 @@ if (!$url || $url !~ m|^https://www.youtube.com|) {

 mkdir($slug);
 chdir($slug);
-my $video_file = `yt-dlp --console-title  --write-auto-subs --write-subs "$url" --print filename --no-simulate`;
+my $video_file = `yt-dlp --console-title  --write-auto-subs --write-subs --sub-langs ja "$url" --print filename --no-simulate`;
 chomp($video_file);
 my ($vtt) = glob('*.vtt');
 open(my $fh, "<", $vtt);

画像サイズについては,抜き出された画像群のサイズはそこそこ大きいです.css でサイズに制限がかかってるので大きくしました.

$ git diff ./styles.css
diff --git a/styles.css b/styles.css
index 156f994..8972e87 100644
--- a/styles.css
+++ b/styles.css
@@ -56,8 +56,8 @@ li {
 }

 li img{
-    max-width: 288px;
-    max-height: 216px;
+    max-width: 1280px;
+    max-height: 720px;
     transition: all 0.3s;
 }

これで再度コマンドを実行するとファイルがすでにあるというエラーに.一旦ディレクトリごと消して再度実行すると日本語文字起こしテキストかつサイズの大きい画像になりました.

後は文字起こしテキストの精度が悪いですね.(“NetBSD” が “Netflix” や “ネットビジネス” になってたり……)でもこれはYoutube のせいでこのscript の問題ではないです.自分の管理下の動画ならYoutube に任せずOpenAI のWhisper(.cpp) などで文字起こしして手直し後Youtube にアップロードして差し替えるのがいいんでしょうね.

]]>
https://matoken.org/blog/2023/09/07/youtube2webpage/feed/ 0
JSON Feed とWordPress Plugin https://matoken.org/blog/2023/07/31/json-feed-and-wordpress-plugin/ https://matoken.org/blog/2023/07/31/json-feed-and-wordpress-plugin/#respond Sun, 30 Jul 2023 19:50:07 +0000 https://matoken.org/blog/?p=3912

RSSやAtomのaltnativeとしてJSONのJSON Feed というものがあるようです.

そんなに普及していない感じですが,WordPress のPlugin もあるようなので導入してみました.

WordPress のURL の /feed/json 若しくは /?feed=json 以下にJSON Feed が出力されるようです.
このsite だとこちら https://matoken.org/blog/feed/json かこちら https://matoken.org/blog/?feed=json

jq に渡してみるとなんかエラーに

$ curl -s https://matoken.org/blog/feed/json | jq . | lv
parse error: Invalid numeric literal at line 1, column 4

頭にエラーが入っています.

$ curl -s https://matoken.org/blog/feed/json | head
<br />
<b>Notice</b>:  Undefined variable: max_page in <b>/var/lib/wordpress/wp-content/plugins/jsonfeed/feed-json-functions.php</b> on line <b>54</b><br />
{
    "version": "https://jsonfeed.org/version/1.1",
    "user_comment": "This feed allows you to read the posts from this site in any feed reader that supports the JSON Feed format. To add this feed to your reader, copy the following URL -- https://matoken.org/blog/feed/json -- and add it your reader.",
    "next_url": "https://matoken.org/blog/feed/json?paged=2",
    "home_page_url": "https://matoken.org/blog",
    "feed_url": "https://matoken.org/blog/feed/json",
    "language": "ja",
    "title": "matoken&#039;s meme",

とりあえず,変数をこんな感じで

/var/lib/wordpress/wp-content/plugins/jsonfeed/feed-json-functions.php.org
@@ -50,7 +50,7 @@
 }

 function get_json_feed_next_url() {
-       global $paged, $wp_query;
+       global $paged, $wp_query, $max_page;
        if ( ! $max_page ) {
                $max_page = $wp_query->max_num_pages;
        }

エラーは出なくなりました.
JSON Feed からTitle を抜き出してみました.

$ curl -s https://matoken.org/blog/feed/json | jq  '.items[].title'
"asciidoctor-reveal.js v5.0.1 の新機能いくつか"
"i3statusのフォントサイズを変更"
"GitWebでリポジトリが404になってしまう"
"TwitterクライアントのFritterの復活とFeedの削除と,Feedの使えるforkのQuacker"
"「鹿児島Linux勉強会 2023.05」に参加"
"鹿屋市に設置されるマイボトル向け給水機"
"OpenSSH ED25519 の Vanity Adress を探してみる"
"Logitech Webcam C310n を購入とC270との比較"
"Andorid の画面をPC に転送して操作も出来るScrcpy 2.0 でオーディオ転送にも対応"
"Flet’s ADSL のサービス終了"

しかし,長らく更新されていないので別のものを探したほうが良いかもしれないです.

Last activity: 7 years, 7 months ago

環境
$ dpkg-query -W wordpress php jq curl
curl    7.85.0-1~bpo11+1
jq      1.6-2.1
php     2:7.4+76
wordpress       5.7.8+dfsg1-0+deb11u2
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2023/07/31/json-feed-and-wordpress-plugin/feed/ 0
Tailscale にログインできなくて困る https://matoken.org/blog/2023/02/16/tailscale_login_failed/ https://matoken.org/blog/2023/02/16/tailscale_login_failed/#respond Wed, 15 Feb 2023 22:10:00 +0000 https://matoken.org/blog/?p=3841

最近使っていなかったホストのtailscale を利用しようとしたらセッションが切れていてログインするよう促されましたがログイン用のURLが404になってしまいます.

$ tailscale status
Logged out.
Log in at: https://login.tailscale.com/a/deadbeef

Error 400
unknown auth followup URL

tailscale404

tailscale login コマンドでも同じURL になりやはり404 です.

tailscale を最新にすることで別のURL が生成され,ログインできるようになりました.
この環境はDebian buster amd64 だったので, apt update && apt uprade で更新しました.

Unpacking tailscale (1.36.1) over (1.34.1) ...

tailscale ok

ということでtailscale が古かったのが良くなかったようです.

環境
$ tailscale version
1.36.1
  tailscale commit: 12fc975413493ea4c5b8bc87961d34eb52e9d61d
  other commit: 84afcfe6d7872304a956d8aa9f9cf63bfdd1cbe9
  go version: go1.19.4-tsdc0ce6324d
$ lsb_release -a
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
$ arch
x86_64
]]>
https://matoken.org/blog/2023/02/16/tailscale_login_failed/feed/ 0
Galene 0.6 と Android版クライアント https://matoken.org/blog/2022/09/12/galene-0-6-and-android-client/ https://matoken.org/blog/2022/09/12/galene-0-6-and-android-client/#respond Mon, 12 Sep 2022 14:51:48 +0000 http://matoken.org/blog/?p=3772

OSSのビデオミーティングソフトウェアの Galene 0.6 がリリースされたのでアップグレードしました.

$ cd <GALENEPATH> (1)
$ git pull (2)
$ git checkout galene-0.6 (3)
$ CGO_ENABLED=0 go build -ldflags='-s -w' (4)
$ rsync -acvP galene static data <REMOTESERVER>:~/ (5)
  1. Galeneのsourceディレクトリに移動
  2. リポジトリを最新に
  3. Galene 0.6 にチェックアウト
  4. ビルド
  5. リモートサーバにコピー

後はリモートサーバでGalene再起動でok

今回のバージョンでいくつかの修正が入り,Android版クライアントが動作するようになりました.

ただし,Android版クライアントはまだPoC版という感じで導入には自分で,apkを入手してインストールする必要があるし,起動してもホスト名やユーザ名を覚えてくれないし画面共有の機能しかありません.
画面共有の機能しか無いので,話をするには別のウェブブラウザでGaleneに参加して通話しつつAndroidクライアントで画面共有になりそうです.

それでもAndroidで画面共有できるのは助かります.

Galene Android

ビルド環境
$ PAGER=cat git log -1
commit c67a9307dae3bfce9c910c8cd35f3c916c70aaed (HEAD, tag: galene-0.6, origin/master, origin/HEAD)
Author: Juliusz Chroboczek <jch@irif.fr>
Date:   Sat Sep 10 14:27:58 2022 +0200

    Update CHANGES for 0.6.
$ dpkg-query -W golang
$ lsb_release -dr
Description:    Debian GNU/Linux bookworm/sid
Release:        unstable
$ arch
x86_64
ホスト環境
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ arch
x86_64
]]>
https://matoken.org/blog/2022/09/12/galene-0-6-and-android-client/feed/ 0
Stable Diffusion OpenVINOでIntel CPUでもAIに画像を生成してもらう https://matoken.org/blog/2022/09/07/get-ai-to-generate-images-with-stable-diffusion-openvino-even-with-intel-cpu/ https://matoken.org/blog/2022/09/07/get-ai-to-generate-images-with-stable-diffusion-openvino-even-with-intel-cpu/#comments Wed, 07 Sep 2022 11:29:36 +0000 http://matoken.org/blog/?p=3768

最近画像生成AIが流行りです.@shi3zさんの Memeplex.app で遊んだりしています.Memeplexはプロンプトのプリセットがあるし日本語を入力すると英語に翻訳してくれるので英語の出来ない自分でもとっつきやすいです.
ローカル環境でも試したいけどStable Diffusionはローカルで動かすにはGPUが必要.しかし手元にはないので出来ないな,クラウドを使ってみる?とか思っていたのですが,Intel CPU内蔵GPUで画像生成をしてくれる「stable_diffusion.openvino」を知ったので少し試してみました.

sd thumbnail

Stable Diffusion OpenVINO 動作要件確認

Stable Diffusion OpenVINOの要件は以下のようになっています.OpenVINOに対応したCPUだとOKのようです.

Requirements
Linux, Windows, MacOS
Python 3.8.+
CPU compatible with OpenVINO.

OpenVINOの要件は以下のページを見るとCore i 6世代目〜12世代目のようです.

CPU
Processors
6th to 12th generation Intel Core processors
1st to 3rd generation of Intel® Xeon® Scalable processors
Intel Atom® processor with Intel® Streaming SIMD Extensions 4.2 (Intel® SSE4.2)

手元の端末のCPUは以下のような感じで3世代目と6世代目.後者はぎりぎり対応していそうです.

$ lscpu | grep ^Model\ name:
Model name:                      Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz
$ lscpu | grep ^Model\ name:
Model name:                      Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz

Stable Diffusion OpenVINO 導入

端末の内蔵diskは狭く空き容量が少ないので外付けHDDのvirtualenvに導入することにします.

$ mkdir /media/matoken/export/sd (1)
$ cd /media/matoken/export/sd
$ virtualenv . (2)
$ source bin/activate (3)
$ git clone https://github.com/bes-dev/stable_diffusion.openvino (4)
$ cd stable_diffusion.openvino
$ pip install -r requirements.txt (5)
  1. HDDに作業ディレクトリ作成
  2. virtualenv で環境作成
  3. virtualenv環境反映
  4. stable_diffusion.openvinoをclone
  5. Install

初回実行時にダウンロードされるmodelが4GBほどあるのですが,10回ほど試してもタイムアウトで中断してしまうのでVPSでダウンロードしてコピーしました.規定値のホームディレクトリ以下に導入しようとしてdisk fullになったのでhddにシンボリックリンクを貼ってHDDに導入しました.オリジナルの場所は ~/.cache/huggingface 以下です.

$ ls -Ss1 ~/.cache/huggingface/hub/models--bes-dev--stable-diffusion-v1-4-openvino/blobs/
合計 4169032
3357512 7655112cde3c5084c2709b2b89994834b24efc457f2c1b302bb3d7a056bfdb7a
 480740 b3f34c33d8c272f61c6780251a503911c7e7a448cdc10f8fb7d9bc59c3462951
 193328 456fd6d12ffab507af1ad6772b7b1922b35502272cd5be3708c8292252cd4c46
 133460 8732df1da0a3026da5ee6070df8899efbccf0d844821368214af8d95abeae467
   2952 a6514903a2875c318399e451c1f9ddaf4a3f7ba4
    460 dfb9780b4527132dfe9a19ccc7ce5c0d885cb2ae
    328 c0f568310ea3a649aea01772031087d324272780
    252 87adf22fe4160e26a799270b2f53c8c21c9d6cd0

プロンプトからの画像生成

ここまで来たら画像生成が出来ます.テキストの文字列でどんな画像を生成するか伝えます.この文字列をプロンプトといい基本的に英語,英語圏で通じる言葉で指示します.今回は「kawaii neko」としてみました.

$ python ./demo.py --prompt "kawaii neko"
Terminated

Terminatedと言われて処理が中断しました.どうもメモリが足りなそうです.実メモリは8GBです.disk swapでもう8GB追加して再度実行してみます.

メモリ不足なのでディスクスワップの追加

$ dd if=/dev/zero of=./swap.img bs=1M count=8096 (1)
$ sudo chown 0.0 ./swap.img
$ sudo chmod 600 ./swap.img
$ sudo mkswap ./swap.img (2)
$ sudo swapon `pwd`/swap.img (3)
$ python ./demo.py --prompt "kawaii neko" (4)
32it [13:14, 24.84s/it]
  1. 8GB程のディスクイメージの作成
  2. スワップとして初期化
  3. スワップを有効にする
  4. 再度画像生成

sd txt2img00

今度は15分程経って処理が終了し,output.png として画像が出来ました.何度か試すと10〜15分程で1枚出来ます.このときLoadAverageは10くらいまで上がって他の処理はあまりやりたくない感じに.寝ているときなどに処理する感じが良さそうです.

Note

他のCPUでの処理速度は以下にいくつか紹介されています.やはりGPUに比べると大分遅いですね.

Note

何度か動かすと数回に一回 Terminated が出ます.この環境に導入している nohung がkillしているようなので一時的に無効にすると安定して動作するようになりました.(一般的な環境には導入されていない)

$ sudo systemctl stop nohang-desktop.service
$ sudo systemctl stop nohang.service

次回以降起動時

shellを開いて以下のコマンドでStable Diffusionの環境を有効にします.

$ cd /media/matoken/export/sd/stable_diffusion.openvino (1)
$ source ../bin/activate (2)
$ sudo swapon `pwd`/swap.img (3)
  1. Stable Diffusion 作業ディレクトリに移動
  2. virtualenv環境反映
  3. disk swap反映

help

demo.py のhelpを見るとこんな感じ.色々できそうです.

$ python demo.py --help
usage: demo.py [-h] [--model MODEL] [--seed SEED] [--beta-start BETA_START] [--beta-end BETA_END] [--beta-schedule BETA_SCHEDULE]
               [--num-inference-steps NUM_INFERENCE_STEPS] [--guidance-scale GUIDANCE_SCALE] [--eta ETA] [--tokenizer TOKENIZER] [--prompt PROMPT]
               [--init-image INIT_IMAGE] [--strength STRENGTH] [--mask MASK] [--output OUTPUT]

optional arguments:
  -h, --help            show this help message and exit
  --model MODEL         model name
  --seed SEED           random seed for generating consistent images per prompt
  --beta-start BETA_START
                        LMSDiscreteScheduler::beta_start
  --beta-end BETA_END   LMSDiscreteScheduler::beta_end
  --beta-schedule BETA_SCHEDULE
                        LMSDiscreteScheduler::beta_schedule
  --num-inference-steps NUM_INFERENCE_STEPS
                        num inference steps
  --guidance-scale GUIDANCE_SCALE
                        guidance scale
  --eta ETA             eta
  --tokenizer TOKENIZER
                        tokenizer
  --prompt PROMPT       prompt
  --init-image INIT_IMAGE
                        path to initial image
  --strength STRENGTH   how strong the initial image should be noised [0.0, 1.0]
  --mask MASK           mask of the region to inpaint on the initial image
  --output OUTPUT       output image name

img2img

初期イメージを指定も試してみます. --init-image で適当な画像を指定してみました.ハンモックの画像にプロンプトで猫などを指定してみました.

$ python demo.py --seed ${seed} --prompt "sleep cat, campe site, hammock" --init-image=./hammock.jpg --output "${outfile}"

ハンモックに猫っぽいものが現れました.

元画像

sd original image

生成された画像

sd img2img01
sd img2img02

もう少し線画とかシンプルな画像のほうがいいかも?

同じSEEDとプロンプトで画像が固定されるのを確認

出来上がる画像は毎回同じプロンプトでも既定値ではSEEDがランダム生成されるので別の画像が生成されます.SEEDとプロンプトを固定して同じ画像が出力されるか見てみます.

Note
少し古いStable DiffusionだとSEEDを固定しても別の画像が出てくるようです.
$ python demo.py --seed 999999 --prompt "kawaii neko" --output "kawaii_neko-999999-01.png"
32it [09:47, 18.36s/it]
$ python demo.py --seed 999999 --prompt "kawaii neko" --output "kawaii_neko-999999-02.png"
32it [09:41, 18.18s/it]

見た目もチェックサムを比較しても同じ値になりました.

$ sha512sum ./kawaii_neko-999999-0?.png
3cd2fad521495571842d9f37f13113bd6a18195e120fd4cded40f7fcf59eb3807cdd9aa43ae4831dfd7e4b0228077bdcabd2a7a86947507e2863143a43d7cee9  ./kawaii_neko-999999-01.png
3cd2fad521495571842d9f37f13113bd6a18195e120fd4cded40f7fcf59eb3807cdd9aa43ae4831dfd7e4b0228077bdcabd2a7a86947507e2863143a43d7cee9  ./kawaii_neko-999999-02.png

sd kawaii neko seed same

ということは恐らく低解像度だと処理時間は短くなると思うので,低解像度でたくさん画像生成して気に入ったものを高解像度で作り直すといったことをすると効率が良さそう.でもまだ解像度指定は出来ないようです.

とりあえず解像度指定できるようになったときのために毎回SEEDを指定して,SEEDとプロンプトをexifに保存しておくことにしました.
SEEDの範囲は手元で試した感じでは2^32で 0〜4294967295 のようです.

seed=$( shuf -i 0-4294967295 -n 1 )
python demo.py --seed ${seed} --prompt "${prompt}" --init-image="${image}" --output "${outfile}"
exiftool -overwrite_original -comment="SEED:${seed}/PROMPT:${prompt}" "${outfile}"

SEEDで探索

MemeplexのDiscordでSEEDが近いと似た画像が生成されるというのを見たので試してみます.(そしてMemeplexにはSEED固定機能が追加された)

適当な画像のプロンプトは固定でSEEDを少しづつずらして画像生成を試してみます.

step 1

sd seed step1

step 10

sd seed step10

step 100

sd seed step100

step 1000

sd seed step1000

近いと似た傾向に画像になるような感じ?

strengthで探索

--strength オプションは0〜1で既定値は0.5のようです.これを変更してどうなるか見てみます.

まずはプロンプトとSEEDを固定して初期画像無しで—​strengthを0.1刻みで変更してみました.
見た目は変わらない?hashを比較すると別の画像になっています.

sd strength txt2img

次は猫画像を作成して,その画像を初期画像に指定してプロンプトに「dog」を指定,SEEDを固定しました.
段々と猫から犬になり,–strengthが1では顔の向きくらいしか残ってなさそうです.

sd strength img2img

初期画像に対するプロンプトの強さが変わる感じですね.

CPUを全部使うようにしてみる(速度は変わらない)

しばらく動かしてみていると4コア中2コアしか使っていないように見えます.以下のISSUEを参考に4コア使うようにしてみましたが,他の方と同じように特に速度は変わらなかったので元に戻し( $ git restore stable_diffusion_engine.py )ました.

$ git diff ./stable_diffusion_engine.py
diff --git a/stable_diffusion_engine.py b/stable_diffusion_engine.py
index f73541b..6c92198 100644
--- a/stable_diffusion_engine.py
+++ b/stable_diffusion_engine.py
@@ -27,6 +27,7 @@ class StableDiffusionEngine:
         self.scheduler = scheduler
         # models
         self.core = Core()
+        self.core.set_property("CPU", {"INFERENCE_NUM_THREADS": 4})
         # text features
         self._text_encoder = self.core.read_model(
             hf_hub_download(repo_id=model, filename="text_encoder.xml"),

プロンプト(呪文)の作り方

まずは他の方のプロンプトを真似させてもらうのがお手軽です.Memeplex.appだとギャラリーで気に入ったものをクリックするとプロンプトが表示されるのでそれをコピーしてカスタマイズするといいです.ちなみにMemeplexはプリセットが充実しているので便利です.SEEDや英語翻訳後のプロンプトも表示されるのでべつのStable Diffusionに指定することも出来ます.

The Ai Art も便利で,構図やフィルタなどの例がたくさん紹介されています.Cyberpunk styleを多用しがち…….

Twitterで「#StableDiffusion」などで検索するとたくさんの画像が出てきてプロンプトが記載されていることが多いです.

プロンプトの不明な画像は以下のsiteでプロンプトを推測してもらうことが出来ます.自分の生成した画像を入れてみましたが自分のプロンプトとはかけ離れたものが出てきました.あくまで推測ですね.

試した環境
$ git log -1
commit 294dd34234f0629f69d5af5b1190841560242969 (HEAD -> master, origin/master, origin/HEAD)
Author: Brian Foley <bpfoley@gmail.com>
Date:   Mon Sep 5 09:25:43 2022 -0400

    Update requirements.txt (#39)

    Add ftfy 6.1.1 to stop OpenAIGPTTokenizer's warning/fallback to  BERT BasicTokenizer.
$ dpkg-query -W python3
python3 3.9.2-3
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ lscpu | grep ^Model\ name:
Model name:                      Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
$ cat /proc/meminfo | grep MemTotal:
MemTotal:        8019112 kB
]]>
https://matoken.org/blog/2022/09/07/get-ai-to-generate-images-with-stable-diffusion-openvino-even-with-intel-cpu/feed/ 1
USB-HDDをスリープさせる(hd-idle) https://matoken.org/blog/2022/05/21/sleepe-the-usb-hdd-hd-idle/ https://matoken.org/blog/2022/05/21/sleepe-the-usb-hdd-hd-idle/#respond Sat, 21 May 2022 14:37:56 +0000 http://matoken.org/blog/?p=3643

最近USB接続のUSB HDDの熱が少し気になります.通常時は倉庫的に使っているのでアイドルです.アイドルが一定時間続いたらスリープするように設定できたよなと hdparm -S を叩いてみましたがコントローラーが非対応のようでエラーとなりました.

$ sudo hdparm -S 60 /dev/sdb

/dev/sdb:
 setting standby to 60 (5 minutes)
SG_IO: bad/missing sense data, sb[]:  70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

hd-idle を使うとスリープするように出来ました.

Debianパッケージで導入します.

$ sudo apt install hd-idle

/etc/default/hd-idle を編集して設定します.ここでは対象のディスクの /dev/sdb から sdb を,タイムアウト時間を 300 (秒) を指定しました.

$ sudo git -C /etc diff /etc/default/hd-idle
diff --git a/default/hd-idle b/default/hd-idle
index 57eb964..1c1bedb 100644
--- a/default/hd-idle
+++ b/default/hd-idle
@@ -9,7 +9,7 @@
 # and systemv scripts
 # properly update HD_IDLE_OPTS in order to star hd-idle

-HD_IDLE_OPTS="-h"
+HD_IDLE_OPTS="-i 0 -a sdb -i 300"

 # hd-idle command line options
 # Options are:

その後デバイス名(/dev/sdb)からuuidに変更しました.

$ lsblk -f /dev/sdb # sdbのuuidを確認
NAME                                        FSTYPE      FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sdb                                         crypto_LUKS 1           ac5b8484-4b26-4967-b336-f63c408bb17d                
└─luks-ac5b8484-4b26-4967-b336-f63c408bb17d ext4        1.0   export   95c61e04-e22b-4f0f-9af8-2c3d96b0b179    3.5G   100% /media/matoken/export
$ sudo git -C /etc diff /etc/default/hd-idle
diff --git a/default/hd-idle b/default/hd-idle
index 1c1bedb..73dbc52 100644
--- a/default/hd-idle
+++ b/default/hd-idle
@@ -9,7 +9,7 @@
 # and systemv scripts
 # properly update HD_IDLE_OPTS in order to star hd-idle
 
-HD_IDLE_OPTS="-i 0 -a sdb -i 300"
+HD_IDLE_OPTS="-i 0 -a 95c61e04-e22b-4f0f-9af8-2c3d96b0b179 -i 900"
 
 # hd-idle command line options
 # Options are:
起動します.
$ sudo service hd-idle start
$ ps -ef| grep -i hd-i
root     3468122       1  0 23:24 ?        00:00:00 /usr/sbin/hd-idle -i 0 -a sdb -i 300

これで5分対象のhddが利用されなかったらスリープ,そのご利用しようとしたら自動的にスピンアップしてきます.

環境
$ lsusb | grep ATA
Bus 001 Device 008: ID 1bcf:0c31 Sunplus Innovation Technology Inc. SPIF30x Serial-ATA bridge
$ dpkg-query -W hd-idle
hd-idle 1.05+ds-2
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/05/21/sleepe-the-usb-hdd-hd-idle/feed/ 0
yt-dlpでダウンロードしたYouTube動画を視聴履歴に https://matoken.org/blog/2022/04/20/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history-2/ https://matoken.org/blog/2022/04/20/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history-2/#respond Wed, 20 Apr 2022 11:57:45 +0000 http://matoken.org/blog/?p=3619

yt-dlpで動画をダウンロードすると既定値では視聴履歴に残りません.視聴履歴を残すようにしてみました.

yt-dlp -h を見ると以下のあたりで実現できそうです.

    --cookies FILE                   Netscape formatted file to read cookies
                                     from and dump cookie jar in
    --no-cookies                     Do not read/dump cookies from/to file
                                     (default)
    --cookies-from-browser BROWSER[+KEYRING][:PROFILE]
                                     The name of the browser and (optionally)
                                     the name/path of the profile to load
                                     cookies from, separated by a ":". Currently
                                     supported browsers are: brave, chrome,
                                     chromium, edge, firefox, opera, safari,
                                     vivaldi. By default, the most recently
                                     accessed profile is used. The keyring used
                                     for decrypting Chromium cookies on Linux
                                     can be (optionally) specified after the
                                     browser name separated by a "+". Currently
                                     supported keyrings are: basictext,
                                     gnomekeyring, kwallet
    --no-cookies-from-browser        Do not load cookies from browser (default)

YouTubeにログイン済のブラウザのcookie情報を利用

--cookies-from-browser を利用してYouTubeにログイン済のウェブブラウザのcookie情報からYouTubeに閲覧情報を残します.ローカルPCで使う場合に便利です.

対応ウェブブラウザは,brave, chrome, chromium, edge, firefox, opera, safari, vivaldi となっています.
複数プロファイルを利用している場合でも引数で指定可能です.
今回はFirefoxでYouTubeというプロファイルで試します.

Note
$ firefox --ProfileManager (1)
$ firefox -P YouTube (2)
$ firefox --profile  ~/.mozilla/firefox/$( grep YouTube ~/.mozilla/firefox/installs.ini | cut -f2 -d= )/ (3)
  1. プロファイルの確認のためにプロファイルマネージャの起動
  2. YouTube というプロファイルで起動
  3. Youtube の含まれているプロファイル名で起動
$ yt-dlp \
    --cookies-from-browser firefox:YouTube \ (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. firefoxのYouTubeというプロファイルのcookieを利用
  2. 適当なYouTube URL

プロファイルが1つしかなかったり,デフォルトの場合はプロファイルを書く必要はありません.

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

ウェブブラウザからYouTubeのcookieを書き出して利用

--cookies-from-browser は便利ですが,リモートやヘッドレス環境だとGUIが必要になり面倒です.ウェブブラウザから該当ページのcookie をファイルに書き出し,--cookies オプションで利用します.

まず,YouTubeにログインしているウェブブラウザにcookieを書き出すための cookies.txt という拡張機能を導入します.

次にYouTubeのページを開いた状態で,拡張機能のアイコンをクリックして,「Current Site」を選び,cookieをファイルに保存します.

Fx cookies.txt

保存したcookieファイルを --cookies オプションに指定して実行します.

$ yt-dlp \
    --cookies ./YouTube-cookie.txt (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. 保存したcookieファイルを指定
  2. 適当なYouTube URL

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

cookieファイルを持っていけば別の端末でも利用可能です.セッションが切れたらcookieファイルは再度作成する必要があると思います.

ユーザ名,パスワードをnetrcファイルに書いて認証(失敗)

netrcファイルにYouTubeのユーザ名,パスワード(2要素認証を有効にしているのでアプリケーションパスワードを生成)を登録してみましたが,この手順だと認証エラーになりうまく行きませんでした.
恐らくreCAPTCHAで引っかかっているのではないかと思います.
お手軽なんですが残念.

環境

$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W firefox-esr ffmpeg
ffmpeg  7:4.3.3-0+deb11u1
firefox-esr     78.15.0esr-1~deb11u1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/04/20/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history-2/feed/ 0
yt-dlpでダウンロードしたYouTube動画を視聴履歴に https://matoken.org/blog/2022/04/14/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history/ https://matoken.org/blog/2022/04/14/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history/#respond Wed, 13 Apr 2022 22:19:23 +0000 http://matoken.org/blog/?p=3597

yt-dlpで動画をダウンロードすると既定値では視聴履歴に残りません.視聴履歴を残すようにしてみました.


yt-dlp -h を見ると以下のあたりで実現できそうです.

    --cookies FILE                   Netscape formatted file to read cookies
                                     from and dump cookie jar in
    --no-cookies                     Do not read/dump cookies from/to file
                                     (default)
    --cookies-from-browser BROWSER[+KEYRING][:PROFILE]
                                     The name of the browser and (optionally)
                                     the name/path of the profile to load
                                     cookies from, separated by a ":". Currently
                                     supported browsers are: brave, chrome,
                                     chromium, edge, firefox, opera, safari,
                                     vivaldi. By default, the most recently
                                     accessed profile is used. The keyring used
                                     for decrypting Chromium cookies on Linux
                                     can be (optionally) specified after the
                                     browser name separated by a "+". Currently
                                     supported keyrings are: basictext,
                                     gnomekeyring, kwallet
    --no-cookies-from-browser        Do not load cookies from browser (default)
  Authentication Options:
    -u, --username USERNAME          Login with this account ID
    -p, --password PASSWORD          Account password. If this option is left
                                     out, yt-dlp will ask interactively
    -2, --twofactor TWOFACTOR        Two-factor authentication code
    -n, --netrc                      Use .netrc authentication data
    --netrc-location PATH            Location of .netrc authentication data;
                                     either the path or its containing
                                     directory. Defaults to ~/.netrc
    --video-password PASSWORD        Video password (vimeo, youku)
    --ap-mso MSO                     Adobe Pass multiple-system operator (TV
                                     provider) identifier, use --ap-list-mso for
                                     a list of available MSOs
    --ap-username USERNAME           Multiple-system operator account login
    --ap-password PASSWORD           Multiple-system operator account password.
                                     If this option is left out, yt-dlp will ask
                                     interactively
    --ap-list-mso                    List all supported multiple-system
                                     operators

==

youTubeにログイン済のブラウザのcookie情報を利用

--cookies-from-browser を利用してYouTubeにログイン済のウェブブラウザのcookie情報からYouTubeに閲覧情報を残します.ローカルPCで使う場合に便利です.

対応ウェブブラウザは,brave, chrome, chromium, edge, firefox, opera, safari, vivaldi となっています.
複数プロファイルを利用している場合でも引数で指定可能です.
今回はFirefoxでYouTubeというプロファイルで試します.

Note
$ firefox --ProfileManager (1)
$ firefox -P YouTube (2)
$ firefox --profile  ~/.mozilla/firefox/$( grep YouTube ~/.mozilla/firefox/installs.ini | cut -f2 -d= )/ (3)
  1. プロファイルの確認のためにプロファイルマネージャの起動
  2. YouTube というプロファイルで起動
  3. Youtube の含まれているプロファイル名で起動
$ yt-dlp \
    --cookies-from-browser firefox:YouTube \ (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. firefoxのYouTubeというプロファイルのcookieを利用
  2. 適当なYouTube URL

プロファイルが1つしかなかったり,デフォルトの場合はプロファイルを書く必要はありません.

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

ウェブブラウザからYouTubeのcookieを書き出して利用

--cookies-from-browser は便利ですが,リモートやヘッドレス環境だとGUIが必要になり面倒です.ウェブブラウザから該当ページのcookie をファイルに書き出し,--cookies オプションで利用します.

まず,YouTubeにログインしているウェブブラウザにcookieを書き出すための cookies.txt という拡張機能を導入します.

次にYouTubeのページを開いた状態で,拡張機能のアイコンをクリックして,「Current Site」を選び,cookieをファイルに保存します.

Fx cookies.txt

保存したcookieファイルを --cookies オプションに指定して実行します.

$ yt-dlp \
    --cookies ./YouTube-cookie.txt (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. 保存したcookieファイルを指定
  2. 適当なYouTube URL

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

cookieファイルを持っていけば別の端末でも利用可能です.セッションが切れたらcookieファイルは再度作成する必要があると思います.

ユーザ名,パスワードをnetrcファイルに書いて認証(失敗)

netrcファイルにYouTubeのユーザ名,パスワード(2要素認証を有効にしているのでアプリケーションパスワードを生成)を登録してみましたが,この手順だと認証エラーになりうまく行きませんでした.
恐らくreCAPTCHAで引っかかっているのではないかと思います.
お手軽なんですが残念.

環境

$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W firefox-esr ffmpeg
ffmpeg  7:4.3.3-0+deb11u1
firefox-esr     78.15.0esr-1~deb11u1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/04/14/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history/feed/ 0
mltermでTwemoji利用 https://matoken.org/blog/2022/04/08/use-twemoji-with-mlterm/ https://matoken.org/blog/2022/04/08/use-twemoji-with-mlterm/#respond Thu, 07 Apr 2022 15:06:08 +0000 http://matoken.org/blog/?p=3582

最近端末ソフトウェアをmltermに切り替えようと設定しています.今回は絵文字にTwitter EmojiのTwemojiを使ってみました.

3.4.2で入ったようで,このときはgemojiを使っていたようですが,今見ると画像が見当たりません.

[Mlterm-dev-en mlterm 3.4.2 released]

以下のページを参考にTwemojiを使ってみました.

$ git -C ~/src/ clone --depth 1 https://github.com/twitter/twemoji.git (1)
$ ln -s ~/src/twemoji/assets/72x72 ~/.mlterm/emoji (2)
  1. 適当な場所にTwemojiをclone
  2. ~/.mlterm/emoji にシンボリックリンク

この状態でmltermを新規に起動してみると絵文字がTwemojiになりカラフルになりました :)

mlterm emoji

環境
$ dpkg-query -W mlterm*
mlterm  3.9.0-1
mlterm-common   3.9.0-1
mlterm-im-ibus  3.9.0-1
mlterm-tools    3.9.0-1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/04/08/use-twemoji-with-mlterm/feed/ 0
sndcpyでAndroidのサウンドをUSB経由でPCに転送 https://matoken.org/blog/2022/03/30/transfer-android-sounds-to-pc-via-usb-with-sndcpy/ https://matoken.org/blog/2022/03/30/transfer-android-sounds-to-pc-via-usb-with-sndcpy/#comments Wed, 30 Mar 2022 10:26:44 +0000 http://matoken.org/blog/?p=3564

AndroidのオーディオをPCに転送して視聴ということをよくやるのですが,昔は3.5mmオーディオミニジャックで最近はBluetooth A2DP sourceで転送しています.
今回USBで転送できる sndcpy を試してみました.

Tip

sndcpy はAndroid 10以降が必要です.別途クライアントPCにVLCも必要です.導入していない場合は導入しておきましょう.

$ sudo apt install vlc

sndcpyのReleasesから最新を入手します.現在は v1.1 が最新でLinux版(sndcpy-v1.1.zip)とWindows版(sndcpy-with-adb-windows-v1.1.zip)があります.
今回Linuxなので sndcpy-v1.1.zipとチェックサムとその署名ファイルをダウンロードして確認します.

$ wget https://github.com/rom1v/sndcpy/releases/download/v1.1/sndcpy-v1.1.zip \
https://github.com/rom1v/sndcpy/releases/download/v1.1/SHA256SUMS.txt \
https://github.com/rom1v/sndcpy/releases/download/v1.1/SHA256SUMS.txt.asc
$ sha256sum -c ./SHA256SUMS.txt
sndcpy-v1.1.zip: 完了
$ gpg --verify ./SHA256SUMS.txt.asc

適当なディレクトリに展開します.

$ unzip -l ./sndcpy-v1.1.zip
Archive:  ./sndcpy-v1.1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    95591  2021-11-30 07:13   sndcpy.apk
      799  2021-11-30 07:13   sndcpy
     1028  2021-11-30 07:13   sndcpy.bat
---------                     -------
    97418                     3 files
$ mkdir ./sndcpy
$ cd sndcpy
$ unzip ../sndcpy-v1.1.zip

準備が出来たのでAndroid端末をUSB接続した状態で実行します.

$ ./sndcpy
Waiting for device...
* daemon not running; starting now at tcp:5037
* daemon started successfully
Performing Streamed Install
Success
28200
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.rom1v.sndcpy/.MainActivity }
Playing audio...
VLC media player 3.0.16 Vetinari (revision 3.0.13-8-g41878ff4f2)
[00005616cdcf65e0] dummy interface: using the dummy interface module...
[00007f5a800015c0] main stream error: connection error: Connection refused
[00007f5a94000c80] main input error: ES_OUT_SET_(GROUP_)PCR  is called too late (pts_delay increased to 0 ms)
[00007f5a94000c80] main input error: ES_OUT_SET_(GROUP_)PCR  is called too late (pts_delay increased to 1 ms)

この状態でAndroid側で音を再生してみるとPC側から聞こえます.このときAndroid側はミュートでもOKで,音量を上げるとAndroid/PC両方から音が出ました.

ということで簡単に動作したのですが問題が.かなり音が悪いです.音質はいいけど細かく途切れる感じです.以下のIssueが近いかな?

ということで一旦使うのをやめることにします.sndcpyはAndroidにsndcpy.apkをインストールするのでこれを削除します.

$ adb uninstall com.rom1v.sndcpy
Success

これで元に戻ったはずです.

sndcpy は現段階では環境を選ぶ(Android 10以降)し音もいまいちなのでこれからに期待です.とりあえずはこれまで通りBluetooth A2DPで繋ごうと思います.(これはこれで2台同時に接続できないという問題があります)

sndcpy a2dp source

環境
$ dpkg-query -W adb
adb     1:10.0.0+r36-7
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/03/30/transfer-android-sounds-to-pc-via-usb-with-sndcpy/feed/ 1
snap版scrcpyでAndroidデバイス画面をビデオデバイスに出力 https://matoken.org/blog/2022/03/29/output-android-device-screen-to-video-device-with-snap-version-scrcpy/ https://matoken.org/blog/2022/03/29/output-android-device-screen-to-video-device-with-snap-version-scrcpy/#comments Tue, 29 Mar 2022 11:20:37 +0000 http://matoken.org/blog/?p=3559

Androidアプリの画面をsnap版のscrcpyでビデオデバイスに流し込もうとしたら少しハマったのでメモしておきます.

Debian Bullseye amd64のscrcpyでAndroidの画面をビデオデバイスに出力してみようと --v4l2-sink オプションを指定したところバージョンが古く未対応でした.

$ /bin/scrcpy --v4l2-sink /dev/video8
/bin/scrcpy: unrecognized option '--v4l2-sink'

Debian sidの 1.23-1 だと存在するオプションなのですがそれを入れると依存関係がおかしくなりそうなので避けたいところ.

Androidアプリの画面をsnap版のscrcpyでビデオデバイスに流し込もうとしたら少しハマったのでメモしておきます.


Debian Bullseye amd64のscrcpyでAndroidの画面をビデオデバイスに出力してみようと --v4l2-sink オプションを指定したところバージョンが古く未対応でした.

$ /bin/scrcpy --v4l2-sink /dev/video8
/bin/scrcpy: unrecognized option '--v4l2-sink'

Debian sidの 1.23-1 だと存在するオプションなのですがそれを入れると依存関係がおかしくなりそうなので避けたいところ.

$ rmadison scrcpy
scrcpy     | 1.17-1        | stable         | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable       | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable-debug | source

snapを確認すると1.23のようなのでこれを導入してみました.

$ snap find scrcpy
Name       Version  Publisher   Notes  Summary
scrcpy     v1.23    sisco311    -      Display and control your Android device
guiscrcpy  v4.9.0   srevinsaju  -      An opensource graphical user interface for Android screen mirroring
$ snao install scrcpy
$ snap info scrcpy
name:      scrcpy
summary:   Display and control your Android device
publisher: sisco311
store-url: https://snapcraft.io/scrcpy
contact:   https://github.com/sisco311/scrcpy-snap/issues
license:   Apache-2.0
description: |
  This application provides display and control of Android devices connected on USB (or over
  TCP/IP). It does not require any root access.

  This is an unofficial snap. The code of scrcpy can be found at:
  https://github.com/Genymobile/scrcpy
commands:
  - scrcpy.adb
  - scrcpy
snap-id:      M7yvgnqOvyQj64bolfpawIAEwHv7dQ5G
tracking:     latest/stable
refresh-date: today at 01:27 JST
channels:
  latest/stable:    v1.23             2022-03-03 (379)  87MB -
  latest/candidate: ↑
  latest/beta:      v1.23-2-gadbe7908 2022-03-02 (376)  87MB -
  latest/edge:      v1.21-2-g5704ec6  2021-12-07 (358) 101MB -
installed:          v1.23                        (379)  87MB -

1.23です.

$ which scrcpy
/snap/bin/scrcpy
$ scrcpy --version
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>

Dependencies (compiled / linked):
 - SDL: 2.0.8 / 2.0.8
 - libavcodec: 57.107.100 / 57.107.100
 - libavformat: 57.83.100 / 57.83.100
 - libavutil: 55.78.100 / 55.78.100
 - libavdevice: 57.10.100 / 57.10.100
 - libusb: - / 1.0.21

早速使おうと思いましたがエラーとなってしまいました.

$ scrcpy --v4l2-sink /dev/video8
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
INFO: Video orientation is locked for v4l2 sink. See --lock-video-orientation.
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 6.8 MB/s (41123 bytes in 0.006s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: Renderer: opengl
INFO: OpenGL version: 3.0 Mesa 20.0.8
INFO: Trilinear filtering enabled
INFO: Initial texture: 1080x2400
ERROR: Failed to open output device: /dev/video8
ERROR: Could not open frame sink 1
ERROR: Could not open decoder sinks
ERROR: Could not open packet sink 0
ERROR: Could not open demuxer sinks
WARN: Device disconnected
WARN: Killing the server...

このデバイスは存在するし,別のアプリケーションから動画を流し込むと動作します.

issueを検索すると以下のコメントを見つけました.

以下のコマンドでsnapのscrcpyにビデオデバイスを接続する必要があるようです.

$ snap connect scrcpy:camera

認識させたあと実行するとうまく行きました.

$ scrcpy --v4l2-sink /dev/video8 --lock-video-orientation --max-size=720 -N
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 10.6 MB/s (41123 bytes in 0.004s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: v4l2 sink started to device: /dev/video8

scrcpy snap2video

環境
$ snap info scrcpy | grep installed:
installed:          v1.23                        (379)  87MB -
$ dpkg-query -W snap v4l2loopback-dkms v4l2loopback-source v4l2loopback-utils
snap
v4l2loopback-dkms       0.12.5-1
v4l2loopback-source     0.12.5-1
v4l2loopback-utils      0.12.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ uname -a
Linux yoga-260 5.16.15-le9 #10 SMP PREEMPT Sat Mar 19 01:52:06 JST 2022 x86_64 GNU/Linux
$ arch
x86_64
$ rmadison scrcpy
scrcpy     | 1.17-1        | stable         | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable       | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable-debug | source

snapを確認すると1.23のようなのでこれを導入してみました.

$ snap find scrcpy
Name       Version  Publisher   Notes  Summary
scrcpy     v1.23    sisco311    -      Display and control your Android device
guiscrcpy  v4.9.0   srevinsaju  -      An opensource graphical user interface for Android screen mirroring
$ snao install scrcpy
$ snap info scrcpy
name:      scrcpy
summary:   Display and control your Android device
publisher: sisco311
store-url: https://snapcraft.io/scrcpy
contact:   https://github.com/sisco311/scrcpy-snap/issues
license:   Apache-2.0
description: |
  This application provides display and control of Android devices connected on USB (or over
  TCP/IP). It does not require any root access.

  This is an unofficial snap. The code of scrcpy can be found at:
  https://github.com/Genymobile/scrcpy
commands:
  - scrcpy.adb
  - scrcpy
snap-id:      M7yvgnqOvyQj64bolfpawIAEwHv7dQ5G
tracking:     latest/stable
refresh-date: today at 01:27 JST
channels:
  latest/stable:    v1.23             2022-03-03 (379)  87MB -
  latest/candidate: ↑
  latest/beta:      v1.23-2-gadbe7908 2022-03-02 (376)  87MB -
  latest/edge:      v1.21-2-g5704ec6  2021-12-07 (358) 101MB -
installed:          v1.23                        (379)  87MB -

1.23です.

$ which scrcpy
/snap/bin/scrcpy
$ scrcpy --version
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>

Dependencies (compiled / linked):
 - SDL: 2.0.8 / 2.0.8
 - libavcodec: 57.107.100 / 57.107.100
 - libavformat: 57.83.100 / 57.83.100
 - libavutil: 55.78.100 / 55.78.100
 - libavdevice: 57.10.100 / 57.10.100
 - libusb: - / 1.0.21

早速使おうと思いましたがエラーとなってしまいました.

$ scrcpy --v4l2-sink /dev/video8
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
INFO: Video orientation is locked for v4l2 sink. See --lock-video-orientation.
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 6.8 MB/s (41123 bytes in 0.006s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: Renderer: opengl
INFO: OpenGL version: 3.0 Mesa 20.0.8
INFO: Trilinear filtering enabled
INFO: Initial texture: 1080x2400
ERROR: Failed to open output device: /dev/video8
ERROR: Could not open frame sink 1
ERROR: Could not open decoder sinks
ERROR: Could not open packet sink 0
ERROR: Could not open demuxer sinks
WARN: Device disconnected
WARN: Killing the server...

このデバイスは存在するし,別のアプリケーションから動画を流し込むと動作します.

issueを検索すると以下のコメントを見つけました.

以下のコマンドでsnapのscrcpyにビデオデバイスを接続する必要があるようです.

$ snap connect scrcpy:camera

認識させたあと実行するとうまく行きました.

$ scrcpy --v4l2-sink /dev/video8 --lock-video-orientation --max-size=720 -N
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 10.6 MB/s (41123 bytes in 0.004s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: v4l2 sink started to device: /dev/video8

scrcpy snap2video

環境
$ snap info scrcpy | grep installed:
installed:          v1.23                        (379)  87MB -
$ dpkg-query -W snap v4l2loopback-dkms v4l2loopback-source v4l2loopback-utils
snap
v4l2loopback-dkms       0.12.5-1
v4l2loopback-source     0.12.5-1
v4l2loopback-utils      0.12.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ uname -a
Linux yoga-260 5.16.15-le9 #10 SMP PREEMPT Sat Mar 19 01:52:06 JST 2022 x86_64 GNU/Linux
$ arch
x86_64
]]>
https://matoken.org/blog/2022/03/29/output-android-device-screen-to-video-device-with-snap-version-scrcpy/feed/ 2
scrcpyを使ってAndroidスマートフォンの動画をPCで視聴する https://matoken.org/blog/2022/03/29/watch-videos-on-your-android-smartphone-on-your-pc-using-scrcpy/ https://matoken.org/blog/2022/03/29/watch-videos-on-your-android-smartphone-on-your-pc-using-scrcpy/#comments Mon, 28 Mar 2022 22:20:14 +0000 http://matoken.org/blog/?p=3555

今日最終回でしたが,マンガUp!というアプリで他のsiteより12時間早く配信されているのに気づきました.でもモバイルアプリでないと視聴できません.手元ではスマートフォンしか無いので画面が小さい.

そういえば以前試したscrcpyだと画面キャプチャ禁止のアプリでも大丈夫だったのでこれでPCに画面転送してそちらで視聴すればいつもの画面で視聴できるのではと試してみました.

Note
音声についてはscrcpyのaudioブランチを自分でbuildして --forward-audio オプションを利用することで転送できそう ですが私は未確認で現在はBluetooth A2DP-source でPCに転送しています.3.5mm Audio cableなどでも良さそうです.

まずは以前試したページを参考にscrcpyを使えるようにします.

さくっと動いたのですが,スマートフォンとPCのアスペクト比が違うので黒枠が出来ていまいちです.

$ /bin/scrcpy
INFO: scrcpy 1.17 <https://github.com/Genymobile/scrcpy>
/usr/share/scrcpy/scrcpy-server: 1 file pushed. 5.7 MB/s (34015 bytes in 0.006s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: Renderer: opengl
INFO: OpenGL version: 4.6 (Compatibility Profile) Mesa 20.3.5
INFO: Trilinear filtering enabled
INFO: Initial texture: 2400x1080

scrcpy bar

PCの解像度は 1366×720 でスマートフォンは 2480×1080 なのでスマートフォン画面を真ん中だけくり抜くと良さそうです. --crop オプションを使ってみます.

$ scrcpy --crop=1080:1920:0:$(( (2480-1920)/2 )) \ (1)
    --encoder OMX.google.h264.encoder \ (2)
    --max-size=1366 \ (3)
    --fullscreen (4)
INFO: scrcpy 1.17 <https://github.com/Genymobile/scrcpy>
/usr/share/scrcpy/scrcpy-server: 1 file pushed. 7.2 MB/s (34015 bytes in 0.005s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: Renderer: opengl
INFO: OpenGL version: 4.6 (Compatibility Profile) Mesa 20.3.5
INFO: Trilinear filtering enabled
INFO: Initial texture: 1360x768
  1. --crop で真ん中をくり抜き
  2. エンコーダにPCでハードウェア対応しているH.264を利用
  3. サイズをPCに合わせて制限
  4. フルスクリーン表示

うまくいきました :)

scrcpy crop

他のPCでは動かないけどスマートフォンでは動くものでも応用が効きそうです.

環境
$ dpkg-query -W scrcpy adb
adb     1:10.0.0+r36-7
scrcpy  1.17-1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/03/29/watch-videos-on-your-android-smartphone-on-your-pc-using-scrcpy/feed/ 1
Debian bullseyeでPipeWireに切り替えてPulseAudioに戻したらA2DPが使えなくなった https://matoken.org/blog/2021/12/16/debian-bullseye-can-no-longer-use-a2dp/ https://matoken.org/blog/2021/12/16/debian-bullseye-can-no-longer-use-a2dp/#respond Thu, 16 Dec 2021 13:40:56 +0000 http://matoken.org/blog/?p=3440

Debian BullseyeのサウンドサーバのPipeWireですが,experimentalだとかBullseyeのPipeWireは現在の状態を表すものではないとか書かれています.でもちょっと試したいことがあってDebian Wikiを見ながらPulseAudioからPipeWireに切り替えてみました.少し試したあと元のPuleAudioに戻したのですが,以前使えていたBluetooth A2DPに切り替えできなくなりました.

Bluetoothプロファイルの切り替えにいつもはblueman-managerやpavuctrlを使っていますがどちらでもHSP/HFPかoffしか設定できずA2DPに切り替えようとするとうまく行きません.
pacmdではこんなメッセージ.

$ pacmd set-card-profile 4 a2dp_sink
Failed to set card profile to 'a2dp_sink'

ヘッドセットのペアリング設定を削除して設定し直ししても動作変わらず.
以下のページを見て同じ常用でGDMが掴んでしまうことがあるよう.GDM3を使っているけどプロセスは残ってないし関係なさそう.でも一応設定して動作変わらず.

以前遭遇した以下の設定も試してみましたが動作変わらず.

プロセスを見るとPipeWireのものが残っています.
これのせいかな?とPipeWireのプロセスを止めたあとPulseAudioを再起動してBluetoothヘッドセットを接続するとA2DPでつながるようになりました.

$ systemctl --user stop pipewire.service pipewire.socket
$ systemctl --user restart pulseaudio

PipeWire pkgを消してしまおうと思ったがGnomeなどが依存しているようなのでそのままにして次ログイン以降も大丈夫なようにPipeWireを無効化しました.

$ systemctl --user disable pipewire pipewire-pulse

追記)
再起動したらPipeWireのプロセスが起動してきました./etc/systemd/user の下にシステムワイドの設定があるのでこれも削除して再起動して起動してこなくなるんのを確認しました.

$ sudo rm /etc/systemd/user/sockets.target.wants/pipewire.socket \
/etc/systemd/user/default.target.wants/pipewire.service
環境
$ bluetoothctl info 00:18:09:FF:FF:FF
Device 00:18:09:FF:FF:FF (public)
        Name: MDR-ZX330BT
        Alias: MDR-ZX330BT
        Class: 0x00240404
        Icon: audio-card
        Paired: yes
        Trusted: yes
        Blocked: no
        Connected: yes
        LegacyPairing: no
        UUID: Headset                   (00001108-0000-1000-8000-00805f9b34fb)
        UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
        UUID: Advanced Audio Distribu.. (0000110d-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
        UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
$ dpkg-query -W pipewire* pulseaudio* bluetooth* blueman* pavucontrol
blueman 2.1.4-1+b1
bluetooth       5.55-3.1
pavucontrol     4.0-2
pipewire:amd64  0.3.19-4
pipewire-bin    0.3.19-4
pulseaudio      14.2-2
pulseaudio-module-bluetooth     14.2-2
pulseaudio-module-jack  14.2-2
pulseaudio-module-zeroconf
pulseaudio-utils        14.2-2
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2021/12/16/debian-bullseye-can-no-longer-use-a2dp/feed/ 0
Zoomで着信ビデオを無効にしてリソースを節約する https://matoken.org/blog/2021/12/16/disable-incoming-videos-in-zoom/ https://matoken.org/blog/2021/12/16/disable-incoming-videos-in-zoom/#respond Wed, 15 Dec 2021 22:42:25 +0000 http://matoken.org/blog/?p=3437

ビデオミーティングソフトウェアのZoomのクライアント 5.8.0ですべての参加者のビデオを非表示に出来るようになったようです.

着信ビデオの停止
ミーティングの出席者は、すべての着信ビデオを画面上で非表示にできるようになりました。 着信ビデオを停止することで、光に敏感な出席者が複数のビデオ参加者の表示による過剰な刺激を回避し、画面共有に関する帯域幅も保持できるようになります。

回線やマシンスペックが低いときなどに良さそう.と思って設定を試そうと思ったらやり方がよくわかりません.
以下の記事では「ビデオ会議ウィンドウ右上にある[表示]ボタンからのメニューから利用可能だ。」と書かれていますがそのような項目は見当たりません.

もしかしてLinuxは未実装なのだろうかとも思いましたがLinuxのリリースノートにも書かれています.

September 22, 2021 versionC (16)

–snip–

  • Meeting/webinar features
    • Stop incoming video
      Users in a meeting can easily disable all incoming video through in-meeting controls. This may be done to preserve bandwidth for shared content, or to avoid mental fatigue from viewing multiple, active video participants. The account owner and admins can enable this for use in meetings at the Account-, Group-, and User-level web settings. Once enabled through web settings, users must then enable it for use in the Desktop client’s Video settings.

という感じで設定初期化したら出てくるかな?とか思っていましたが放置していました.

その後11月の小江戸らぐの雑談でこの話をしたらやり方を教えてもらいました.

「設定⚙」→「ビデオ」の下の方の「[着信ビデオを停止]機能を有効にする」にチェックをつけることでこの機能が使えるようになります.

zoom video stop 01

ミーティング中にビデオ会議ウィンドウ右上にある[表示]ボタンからのメニューに現れるようになり.「着信ビデオを停止」をチェックすることでビデオを無効にできました.
この状態で画面共有がされた場合画面共有画面は表示されます.

zoom video stop 02

ちなみにWeb版でも「着信ビデオを停止」は可能でした.

zoom web video off
環境
$ dpkg-query -W zoom
zoom    5.8.6.739
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2021/12/16/disable-incoming-videos-in-zoom/feed/ 0
LinuxのRAMを制限するメモ https://matoken.org/blog/2021/07/17/linux-ram-limit/ https://matoken.org/blog/2021/07/17/linux-ram-limit/#respond Fri, 16 Jul 2021 21:25:29 +0000 http://matoken.org/blog/?p=3310

LinuxでRAMの少ない状態のテストをしたいなと思ってコマンドラインオプションにメモリ制限のオプションをつけて試してみました.

物理RAMモジュールが制限したい容量に刺し直すことができればいいのですが,都合の良いサイズのRAMモジュールがあるとは限りません.Linuxの起動オプションで制限できそうだったので試してみました.

Linuxマシンを起動して,GRUBのメニューで編集したいエントリを矢印上下キーで選択して, e ボタンを押して編集メニューに入ります.
linux /vmlinuz〜 といった行に移動して末尾に追加の起動オプションを追記します.今回はメモリを2GBに制限したいので, mem=2048m を指定します.(実メモリ以上にも設定できるようですがそこを使おうとしたときにクラッシュしそうですね)

linux /vmlinuz-5.13.2-mptcp+le9 root=/dev/mapper/yoga—​260—​vg-root ro
linux /vmlinuz-5.13.2-mptcp+le9 root=/dev/mapper/yoga—​260—​vg-root ro mem=2048m

Ctrl + x を押してこのオプションで起動します.

起動したら確認してみます.

$ cat /proc/cmdline (1)
BOOT_IMAGE=/vmlinuz-5.13.2-mptcp+le9 root=/dev/mapper/yoga--260--vg-root ro mem=2048m
$ head -1 /proc/meminfo (2)
MemTotal:        2032968 kB
$ free (3)
               total        used        free      shared  buff/cache   available
Mem:         2032968     1575032       70032      161360      387904      139588
Swap:              0           0           0
  1. コマンドラインオプションの確認
  2. メモリの確認
  3. メモリの確認

2GBに制限できたようです :)

詳細はKernelドキュメントを

linux-5.13/Documentation/admin-guide/kernel-parameters.txt
        mem=nn[KMG]     [KNL,BOOT] Force usage of a specific amount of memory
                        Amount of memory to be used in cases as follows:

                        1 for test;
                        2 when the kernel is not able to see the whole system memory;
                        3 memory that lies after 'mem=' boundary is excluded from
                         the hypervisor, then assigned to KVM guests.

                        [X86] Work as limiting max address. Use together
                        with memmap= to avoid physical address space collisions.
                        Without memmap= PCI devices could be placed at addresses
                        belonging to unused RAM.

                        Note that this only takes effects during boot time since
                        in above case 3, memory may need be hot added after boot
                        if system memory of hypervisor is not sufficient.

今回の手順はアドホックな手順で再起動すれば元に戻ってしまいます.もし永続化したいのであれば, grub.cfg を書き換えればOKなはずです.今回のDebian Bullseye の場合は, /etc/grub.d/10_linux を編集して sudo update-grub2 の実行で /boot/grub/grub.cfg が更新されます.

環境
$ dpkg-query -W grub2* linux-image-`uname -r` procps
grub2
grub2-common    2.04-19
linux-image-5.13.2-mptcp+le9    5.13.2-mptcp+le9-3
procps  2:3.3.17-5
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2021/07/17/linux-ram-limit/feed/ 0
Debian環境でacpidのログをsyslogに出力する2(acpi event & action) https://matoken.org/blog/2021/07/12/output-acpid-log-to-syslog-part-2-acpi-event-action/ https://matoken.org/blog/2021/07/12/output-acpid-log-to-syslog-part-2-acpi-event-action/#respond Sun, 11 Jul 2021 15:07:13 +0000 http://matoken.org/blog/?p=3301

acpidのイベントをすべてログに出力できるよう設定しました.

しかしちょっと冗長です.ACアダプタの状況だけをロギングするよう設定してみました.

まずACアダプタの抜き差し時のログを確認します.

ACアダプタ切断時
Jul 11 23:05:51 yoga-260 acpid: completed netlink event "ac_adapter ACPI0003:00 00000080 00000000"
ACアダプタ接続時
Jul 11 23:05:55 yoga-260 acpid: received netlink event "ac_adapter ACPI0003:00 00000080 00000001"

manのEXAMPLE を確認します.

man acpidより

EXAMPLE
This example will shut down your system if you press the power button.

Create a file named /etc/acpi/events/power that contains the following:
event=button/power
action=/etc/acpi/power.sh "%e"
Then create a file named /etc/acpi/power.sh that contains the following:
/sbin/shutdown -h now "Power button pressed"
Now,  when  acpid  is  running,  a  press  of  the power button will cause the rule in /etc/acpi/events/power to trigger the script in
/etc/acpi/power.sh.  The script will then shut down the system.

このEXAMPLEを真似してこんなファイルを作成しました.acpidから ac_adapter のイベント実行時にaction に指定されたscript を実行するようにしています.

/etc/acpi/events/ac_event_logging
event=ac_adapter
action=/etc/acpi/ac_event_logging.sh %e

そして呼び出されるscript として以下のファイルを用意.

/etc/acpi/ac_event_logging.sh
#!/bin/sh
case "$4" in
        00000000)
                echo 'AC offline'
                logger -t acpid AC offline
                ;;
        00000001)
                echo 'AC online'
                logger -t acpid AC online
                ;;
esac

このscriptには実行権も付与します.

$ sudo chmod +x /etc/acpi/ac_event_logging.sh

動作を確認するために acpid を再起動します.

$ sudo service acpid restart

この状態でACアダプタを抜き差しするとこんな感じのログが出力されます.

$ sudo tail -f /var/log/syslog | grep acpid:
Jul 11 23:51:10 yoga-260 acpid: received netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 23:51:10 yoga-260 acpid: 0 total rules matched
Jul 11 23:51:10 yoga-260 acpid: completed netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 23:51:10 yoga-260 acpid: received netlink event "ac_adapter ACPI0003:00 00000080 00000000" (1)
Jul 11 23:51:10 yoga-260 acpid: rule from /etc/acpi/events/ac_event_logging matched (2)
Jul 11 23:51:10 yoga-260 acpid: executing action "/etc/acpi/ac_event_logging.sh ac_adapter ACPI0003:00 00000080 00000000" (3)
Jul 11 23:51:10 yoga-260 acpid: AC offline (4)
Jul 11 23:51:10 yoga-260 acpid: action exited with status 0 (5)
Jul 11 23:51:10 yoga-260 acpid: 1 total rule matched
Jul 11 23:51:10 yoga-260 acpid: completed netlink event "ac_adapter ACPI0003:00 00000080 00000000"
Jul 11 23:51:11 yoga-260 acpid: received netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 23:51:11 yoga-260 acpid: 0 total rules matched
Jul 11 23:51:11 yoga-260 acpid: completed netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 23:51:11 yoga-260 acpid: received netlink event "thermal_zone LNXTHERM:00 00000081 00000000"
Jul 11 23:51:11 yoga-260 acpid: 0 total rules matched
Jul 11 23:51:11 yoga-260 acpid: completed netlink event "thermal_zone LNXTHERM:00 00000081 00000000"
Jul 11 23:51:12 yoga-260 acpid: received netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 23:51:12 yoga-260 acpid: 0 total rules matched
Jul 11 23:51:12 yoga-260 acpid: completed netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 23:51:13 yoga-260 acpid: received netlink event "ac_adapter ACPI0003:00 00000080 00000001"
Jul 11 23:51:13 yoga-260 acpid: rule from /etc/acpi/events/ac_event_logging matched
Jul 11 23:51:13 yoga-260 acpid: executing action "/etc/acpi/ac_event_logging.sh ac_adapter ACPI0003:00 00000080 00000001"
Jul 11 23:51:13 yoga-260 acpid: AC online
Jul 11 23:51:13 yoga-260 acpid: action exited with status 0
Jul 11 23:51:13 yoga-260 acpid: 1 total rule matched
Jul 11 23:51:13 yoga-260 acpid: completed netlink event "ac_adapter ACPI0003:00 00000080 00000001"
Jul 11 23:51:13 yoga-260 acpid: received netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 23:51:13 yoga-260 acpid: 0 total rules matched
Jul 11 23:51:13 yoga-260 acpid: completed netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 23:51:13 yoga-260 acpid: received netlink event "thermal_zone LNXTHERM:00 00000081 00000000"
Jul 11 23:51:13 yoga-260 acpid: 0 total rules matched
Jul 11 23:51:13 yoga-260 acpid: completed netlink event "thermal_zone LNXTHERM:00 00000081 00000000"
  1. ACアダプタ切断のログ
  2. ACアダプタ用のeventを見つける
  3. ACアダプタロギング用のscriptを%e を使って引数を渡しつつ実行
  4. ロギング用のscriptでログを出力
  5. action終了

うまく行ったようです :)

ということで他のイベントログを要らないので, /etc/default/acpid を編集して引数を消します.

--- a/default/acpid
+++ b/default/acpid
@@ -1,7 +1,7 @@
 # Options to pass to acpid
 #
 # OPTIONS are appended to the acpid command-line
-OPTIONS="-l"
+#OPTIONS="-l"

 # Linux kernel modules to load before starting acpid
 #

反映するために acpid を再起動します.

$ sudo service acpid restart
$ ps aux | grep [/]sbin/acpid
root     3990040  0.0  0.0   2352   780 ?        Ss   23:59   0:00 /usr/sbin/acpid

再度ログを確認しながらACアダプタの抜き差しをしてログが必要なものだけ出力されているのを確認しました.

sudo tail -f /var/log/syslog | grep acpid:
Jul 12 00:00:04 yoga-260 acpid: AC offline
Jul 12 00:00:07 yoga-260 acpid: AC online

良さそうです :)
サスペンドレジュームも設定してみようかな?

環境
$ dpkg-query -W acpid rsyslog systemd bsdutils
acpid   1:2.0.32-1
bsdutils        1:2.36.1-7
rsyslog 8.2102.0-2
systemd 247.3-5
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
$ sudo lshw | grep -E '^\ \ \ \ product:|^\ \ \ \ version:'
    product: 20FEA02WJP (LENOVO_MT_20FE_BU_Think_FM_ThinkPad Yoga 260)
    version: ThinkPad Yoga 260
]]>
https://matoken.org/blog/2021/07/12/output-acpid-log-to-syslog-part-2-acpi-event-action/feed/ 0
Debian環境でacpidのログをsyslogに出力する https://matoken.org/blog/2021/07/11/output-acpid-log-to-syslog/ https://matoken.org/blog/2021/07/11/output-acpid-log-to-syslog/#comments Sat, 10 Jul 2021 22:06:39 +0000 http://matoken.org/blog/?p=3298

ThinkPadの電源プラグのOn/Offで以前はイベントがlogに残っていたのですが,電源管理デーモンが動いていて電源の状態が取得できる状態でもいつの頃からか記録されなくなりました.停電した時間がわかって便利だったのでログ期記録できないか確認してみました.

acpitool で電源アダプタの状態を取得
$ acpitool | grep AC
  AC adapter     : online
$ acpitool | grep AC
  AC adapter     : off-line

ThinkPadのFANを制御する方法を調べて思い出したのでacpidのmanやオプションを確認すると, -l, --logevents オプションを使うとすべてのイベントをログに出力してくれるようです.

$ /sbin/acpid -h 2>&1 | grep '\-l,'
  -l, --logevents    Log all event activity.
$ man acpid | grep -i logevents -A1
       -l, --logevents
                   This option tells acpid to log information about all events and actions.

/etc/default/acpid ファイルを編集して,acpid の起動オプションに -l を追加します.

diff --git a/default/acpid b/default/acpid
index c651a78..a6a7add 100644
--- a/default/acpid
+++ b/default/acpid
@@ -1,7 +1,7 @@
 # Options to pass to acpid
 #
 # OPTIONS are appended to the acpid command-line
-#OPTIONS=""
+OPTIONS="-l"

 # Linux kernel modules to load before starting acpid
 #

acpid を再起動してオプションがついているのを確認します.

$ sudo service acpid restart
$ sudo service acpid status
● acpid.service - ACPI event daemon
     Loaded: loaded (/lib/systemd/system/acpid.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-07-11 05:57:54 JST; 44s ago
TriggeredBy: ● acpid.socket
             ● acpid.path
       Docs: man:acpid(8)
   Main PID: 2830732 (acpid)
      Tasks: 1 (limit: 9336)
     Memory: 288.0K
        CPU: 6ms
     CGroup: /system.slice/acpid.service
             └─2830732 /usr/sbin/acpid -l

Jul 11 05:57:54 yoga-260 systemd[1]: Started ACPI event daemon.
Jul 11 05:57:54 yoga-260 acpid[2830732]: starting up with netlink and the input layer
Jul 11 05:57:54 yoga-260 acpid[2830732]: 1 rule loaded
Jul 11 05:57:54 yoga-260 acpid[2830732]: waiting for events: event logging is on
$ ps aux | grep [/]sbin/acpid
root     2830732  0.0  0.0   2352   684 ?        Ss   05:57   0:00 /usr/sbin/acpid -l

acpid に -l オプションのついている状態でsyslogをtailしながら電源を抜き差ししてみると少し可読性が悪いですがログが出力されるのがわかりました.

$ sudo tail -f /var/log/syslog | grep acpid:
Jul 11 05:59:22 yoga-260 acpid: received netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 05:59:22 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:22 yoga-260 acpid: completed netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 05:59:23 yoga-260 acpid: received netlink event "ac_adapter ACPI0003:00 00000080 00000000"
Jul 11 05:59:23 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:23 yoga-260 acpid: completed netlink event "ac_adapter ACPI0003:00 00000080 00000000"
Jul 11 05:59:23 yoga-260 acpid: received netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 05:59:23 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:23 yoga-260 acpid: completed netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 05:59:23 yoga-260 acpid: received netlink event "thermal_zone LNXTHERM:00 00000081 00000000"
Jul 11 05:59:23 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:23 yoga-260 acpid: completed netlink event "thermal_zone LNXTHERM:00 00000081 00000000"
Jul 11 05:59:26 yoga-260 acpid: received netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 05:59:26 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:26 yoga-260 acpid: completed netlink event "battery PNP0C0A:00 00000080 00000001"
Jul 11 05:59:26 yoga-260 acpid: received netlink event "ac_adapter ACPI0003:00 00000080 00000001"
Jul 11 05:59:26 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:26 yoga-260 acpid: completed netlink event "ac_adapter ACPI0003:00 00000080 00000001"
Jul 11 05:59:26 yoga-260 acpid: received netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 05:59:26 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:26 yoga-260 acpid: completed netlink event "ibm/hotkey LEN0068:00 00000080 00006030"
Jul 11 05:59:26 yoga-260 acpid: received netlink event "thermal_zone LNXTHERM:00 00000081 00000000"
Jul 11 05:59:26 yoga-260 acpid: 0 total rules matched
Jul 11 05:59:26 yoga-260 acpid: completed netlink event "thermal_zone LNXTHERM:00 00000081 00000000"

すべてのイベントが出力されるので,ボリュームや,輝度の調整でもこのように書き出されます.

Jul 11 06:01:12 t430s acpid: received input layer event "button/volumeup VOLUP 00000080 00000000 K"
Jul 11 06:01:12 t430s acpid: rule from 1840013[0:0] matched
Jul 11 06:01:12 t430s acpid: notifying client 1840013[0:0]
Jul 11 06:01:12 t430s acpid: 1 total rule matched
Jul 11 06:01:12 t430s acpid: completed input layer event "button/volumeup VOLUP 00000080 00000000 K"
Jul 11 06:01:13 t430s acpid: received input layer event "button/volumedown VOLDN 00000080 00000000 K"
Jul 11 06:01:13 t430s acpid: rule from 1840013[0:0] matched
Jul 11 06:01:13 t430s acpid: notifying client 1840013[0:0]
Jul 11 06:01:13 t430s acpid: 1 total rule matched
Jul 11 06:01:13 t430s acpid: completed input layer event "button/volumedown VOLDN 00000080 00000000 K"
Jul 11 06:01:16 t430s acpid: received input layer event "video/brightnessdown BRTDN 00000087 00000000 K"
Jul 11 06:01:16 t430s acpid: rule from 1840013[0:0] matched
Jul 11 06:01:16 t430s acpid: notifying client 1840013[0:0]
Jul 11 06:01:16 t430s acpid: 1 total rule matched
Jul 11 06:01:16 t430s acpid: completed input layer event "video/brightnessdown BRTDN 00000087 00000000 K"
Jul 11 06:01:16 t430s acpid: received input layer event "video/brightnessup BRTUP 00000086 00000000 K"
Jul 11 06:01:16 t430s acpid: rule from 1840013[0:0] matched
Jul 11 06:01:16 t430s acpid: notifying client 1840013[0:0]
Jul 11 06:01:16 t430s acpid: 1 total rule matched
Jul 11 06:01:16 t430s acpid: completed input layer event "video/brightnessup BRTUP 00000086 00000000 K"

以前よりログが冗長で可読性が悪いですがとりあえず動作しました.これで停電が発生したときに停電発生時間や,短い停電であれば停電間隔が確認できます.

環境1(実際はsid)
$ dpkg-query -W acpid rsyslog systemd
acpid   1:2.0.32-1
rsyslog 8.2102.0-2
systemd 247.3-5
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
$ sudo lshw | grep -E '^\ \ \ \ product:|^\ \ \ \ version:'
    product: 23533KJ (LENOVO_MT_2353)
    version: ThinkPad T430s
環境2
$ dpkg-query -W acpid rsyslog systemd
acpid   1:2.0.32-1
rsyslog 8.2102.0-2
systemd 247.3-5
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
$ sudo lshw | grep -E '^\ \ \ \ product:|^\ \ \ \ version:'
    product: 20FEA02WJP (LENOVO_MT_20FE_BU_Think_FM_ThinkPad Yoga 260)
    version: ThinkPad Yoga 260
]]>
https://matoken.org/blog/2021/07/11/output-acpid-log-to-syslog/feed/ 1
speedtest-cli が crontab で動作しなくて困る https://matoken.org/blog/2021/07/06/trouble-with-speedtest-cli-not-working-with-crontab/ https://matoken.org/blog/2021/07/06/trouble-with-speedtest-cli-not-working-with-crontab/#comments Mon, 05 Jul 2021 21:18:14 +0000 http://matoken.org/blog/?p=3287

インターネット速度計測サイトのSpeedtest.net というサイトがあります.

世界中にあるサーバのうち自分のアドレスから近いであろうサーバを選んで速度計測をしてくれるサービスです.

このサービスをcli で実行できるPython製 speedtest-cli というApache 2.0ライセンスのサードパーティのツールがあります.Debianだとパッケージもあるので導入も簡単です.

$ sudo apt install speedtest-cli
$ speedtest-cli -h
usage: speedtest-cli [-h] [--no-download] [--no-upload] [--single] [--bytes] [--share] [--simple] [--csv] [--csv-delimiter CSV_DELIMITER]
                     [--csv-header] [--json] [--list] [--server SERVER] [--exclude EXCLUDE] [--mini MINI] [--source SOURCE] [--timeout TIMEOUT]
                     [--secure] [--no-pre-allocate] [--version]

Command line interface for testing internet bandwidth using speedtest.net.
-------------------------------------------------------------------------- https://github.com/sivel/speedtest-cli

optional arguments:
  -h, --help            show this help message and exit
  --no-download         Do not perform download test
  --no-upload           Do not perform upload test
  --single              Only use a single connection instead of multiple. This simulates a typical file transfer.
  --bytes               Display values in bytes instead of bits. Does not affect the image generated by --share, nor output from --json or
                        --csv
  --share               Generate and provide a URL to the speedtest.net share results image, not displayed with --csv
  --simple              Suppress verbose output, only show basic information
  --csv                 Suppress verbose output, only show basic information in CSV format. Speeds listed in bit/s and not affected by --bytes
  --csv-delimiter CSV_DELIMITER
                        Single character delimiter to use in CSV output. Default ","
  --csv-header          Print CSV headers
  --json                Suppress verbose output, only show basic information in JSON format. Speeds listed in bit/s and not affected by --bytes
  --list                Display a list of speedtest.net servers sorted by distance
  --server SERVER       Specify a server ID to test against. Can be supplied multiple times
  --exclude EXCLUDE     Exclude a server from selection. Can be supplied multiple times
  --mini MINI           URL of the Speedtest Mini server
  --source SOURCE       Source IP address to bind to
  --timeout TIMEOUT     HTTP timeout in seconds. Default 10
  --secure              Use HTTPS instead of HTTP when communicating with speedtest.net operated servers
  --no-pre-allocate     Do not pre allocate upload data. Pre allocation is enabled by default to improve upload performance. To support systems
                        with insufficient memory, use this option to avoid a MemoryError
  --version             Show the version number and exit
matoken@t430s:/media/matoken/rootfs/home/matoken/Videos$

出力オプションで,csvやjsonで書き出すことも可能です.

$ speedtest-cli (1)
Retrieving speedtest.net configuration...
Testing from freebit (203.0.113.0)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by OpenGW (Shizuoka) [64.23 km]: 82.301 ms
Testing download speed................................................................................
Download: 1.51 Mbit/s
Testing upload speed......................................................................................................
Upload: 0.95 Mbit/s
$ speedtest-cli --simple (2)
Ping: 68.211 ms
Download: 8.11 Mbit/s
Upload: 0.84 Mbit/s
$ speedtest-cli --list | grep -i japan | grep -Ei 'kagoshima|miyazaki|kumamoto|ooita|fukuoka|saga|hitoyoshi' (3)
 8407) Allied Telesis Capital Corporation (Sagamihara, Japan) [175.03 km]
35106) yoshis.jp (KDDI-NET) (Fukuoka, Japan) [687.23 km]
38134) NousagiNetwork(@_0rze) (Fukuoka, Japan) [687.23 km]
38947) Rikimoto (Fukuoka, Japan) [687.23 km]
18709) extride inc (Hitoyoshi, Japan) [705.48 km]
$ speedtest-cli --simple --server 18709 (4)
Ping: 122.31 ms
Download: 6.01 Mbit/s
Upload: 0.81 Mbit/s
$ speedtest-cli --csv-header (5)
Server ID,Sponsor,Server Name,Timestamp,Distance,Ping,Download,Upload,Share,IP Address
$ speedtest-cli --csv (6)
42842,Mamireimu Net Work's,Nara,2021-06-23T09:15:44.814808Z,177.32698372902544,86.096,8215354.331324884,1350756.2707027544,,203.0.113.0
$ speedtest-cli --json | jq . (7)
{
  "download": 7961762.454176666,
  "upload": 1054738.8634894243,
  "ping": 73.207,
  "server": {
    "url": "http://speedtestooklaserverjapannagoyashizuoka.baobivawpvojawvianoipwqnpibvbqoubwuvbqasciboabowbcacacwcqcqx001.bar:8080/speedtest/upload.php",
    "lat": "34.9756",
    "lon": "138.3827",
    "name": "Shizuoka",
    "country": "Japan",
    "cc": "JP",
    "sponsor": "OpenGW",
    "id": "42413",
    "host": "speedtestooklaserverjapannagoyashizuoka.baobivawpvojawvianoipwqnpibvbqoubwuvbqasciboabowbcacacwcqcqx001.bar:8080",
    "d": 64.2282382602239,
    "latency": 73.207
  },
  "timestamp": "2021-06-23T09:19:28.880310Z",
  "bytes_sent": 1515520,
  "bytes_received": 10101900,
  "share": null,
  "client": {
    "ip": "203.0.113.0",
    "lat": "34.733",
    "lon": "137.7439",
    "isp": "freebit",
    "isprating": "3.7",
    "rating": "0",
    "ispdlavg": "0",
    "ispulavg": "0",
    "loggedin": "0",
    "country": "JP"
  }
}
  1. 既定値で実行すると自分のipアドレスのgeoipで近いサーバにpingを打って近そうなサーバを探して速度テストする.(物理的には鹿児島だけどgeoipでは静岡扱いなのでその周りが使われる)
  2. シンプルな表示
  3. 物理的に近そうな九州内のサーバを探す
  4. 物理的に一番近いサーバを指定
  5. csvヘッダを表示(計測はしない)
  6. csv形式で出力
  7. json形式で出力(して jq で整形)

これをcrontabに設定して定期的に実行し,速度の変化を見てみようと思いました.

crontabに */30 * * * * speedtest-cli --csv >> ~/log/speedtest.csv を設定して30分毎に速度テストをして ~/log/speedtest.csv に書き出してみます.

$ mkdir ~/log (1)
$ speedtest-cli --csv-header > ~/log/speedtest.csv (2)
$ crontab -e (3)
$ crontab -l | grep speedtest-cli (4)
*/30 * * * *    speedtest-cli --csv >> ~/log/speedtest.csv
  1. ログ格納ディレクトリ作成
  2. csvヘッダをログファイルに書き込み
  3. crontab -e で以下の行を追加
  4. crontabに登録されているのを確認

しかし,手動で実行時には失敗した頃がないのにcrontab 経由だとほぼ全てが失敗します.まれに成功することもありますが,10回に1回も成功しません.

以下のエラーが出力されます.

ERROR: Unable to connect to servers to test latency.

crontabでだけエラーとなるので,コマンドをshell script fileにしてそれを呼ぶようにしたり,リダイレクト方法を変更してみたり,sourceを見るとサーバリストの取得に失敗しているようなのでサーバを指定するようにしてみたけどサーバを指定してもサーバリストを取得するので意味がなかったりということを試していました.

もしかして毎0分,30分の実行するのが良くないのではと,crontabを以下のように書き換えて6分と36分に実行されるよう変更たところろ動作するようになりました.

$ crontab -l | grep speedtest-cli (1)
6,36 * * * *    speedtest-cli --csv >> ~/log/speedtest.csv

手動でも0分丁度に実行するとエラーになることを確認しました.

$ speedtest-cli
Retrieving speedtest.net configuration...
Testing from freebit (180.131.110.140)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
ERROR: Unable to connect to servers to test latency.

ということでとりあえずきりのいい時間からずらすと動くようになりました.

実はSpeedTest公式のCLI ツールもありこれだと今回の問題は起こらないようです.
バイナリしか提供されていませんが,macOS/Windows/Linux/FreeBSD版が提供されていて,Linuxはi386, x86_64, armlf, armhf, arm64 が提供されています.

こちらを使うと毎0分,30分に実行しても動作しました. csv, tsv, json, jsonl, json-pretty` での出力に対応しているしこちらを使うのもありかもしれません.ただsourceも無いし2019年のリリースからバージョンが上がっていないのでメンテされているのかちょっと不安です.

環境
$ dpkg-query -W speedtest-cli
speedtest-cli   2.1.3-2
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2021/07/06/trouble-with-speedtest-cli-not-working-with-crontab/feed/ 1
「Life is Strange」をLinuxでも日本語で遊ぶ https://matoken.org/blog/2021/06/29/play-life-is-strange-in-japanese-on-linux/ https://matoken.org/blog/2021/06/29/play-life-is-strange-in-japanese-on-linux/#respond Mon, 28 Jun 2021 22:26:20 +0000 http://matoken.org/blog/?p=3284

回線の調子が悪いので,久々に少しゲームを遊んでみようかと思いLinux版Steamを起動して「Life is Strange 2」の冒頭を遊んでみましたが,「Life is Strange – Episode 1」も無料のようなのでこれを先に遊んだほうがいいかな?と起動すると2で使えていた日本語が選べないようです.
Winows版の言語パックはあるようなのでどうにかならないかなと試してみました.

「Steam:Life is Strange – Episode 1」のページを見ると以下のような記述があります.

お知らせ: 日本国内のお客様にお知らせ:Life Is Strangeの日本語化DLC配信中!エピソード1またはコンプリート・シーズンをご購入後、無料のDLCをダウンロード及びインストールすることで日本語版をお楽しみいただけます。

以下のページがそれで,DLCとして日本語パックが提供されているようです.しかし実際にアクセスしてみるとWindows用のようでLinux版は日本語パックが導入できません.

展開してファイルを入れ替えたりしてどうにかならないかな?とも思いましたが,Steam Linux版にはProtonというWindows互換レイヤーを使ってWindows版のゲームを動かす仕組みがあるのでそれを試してみるとうまくいきました.

手順は以下のとおりです.

  • 「ライブラリ」の「Life is Strange」を右クリック,「プロパティ」,「互換性」,「特定のSteam Play互換ツールの利用を強制する」にチェックを付けてプロパティウィンドウを閉じる.
    Life is Strange01
  • 「プレイ」ボタンを押すと,Windows版がダウンロードされる.
  • ダウンロードが終わったらプレイせずに一旦キャンセル.
  • Life is Strange™ – Japanese Language Pack のページに移動して,「ダウンロード」ボタンを押して日本語パックを導入する.
  • 日本語で起動するようになっている.

Life is Strange02
Life is Strange03

テキストだけでなくボイスも日本語になっています.とりあえずEpisode 1 を一通りクリアしましたが問題なく動作しました.続きのEpisode 2〜5 もこのDLCで日本語化されるようです.
(回線を使いたくなかったのに結局ダウンロードしてますね🤔)

しかしなんでWindows版だけの対応なんだろう.検証するリソースが足りないのかな?とか思ったのですが,以下のレビューによるとWindows版とそれ以外ではパブリッシャーが違うようです.そのため扱いが違うので非対応ということのようです.

ストアページをよく見るとちゃんとパブリッシャー書いてありますね.

パブリッシャー: Square Enix, Feral interactive (Mac), Feral Interactive (Linux)

2はどうなっているかな?と見ると同じ状態です.でも何もしなくてもLinux版で日本語で遊べているので1でも対応してほしいなと思ったり.

パブリッシャー: Square Enix, Feral Interactive (Mac), Feral Interactive (Linux)

環境

Life is Strange steam

$ dpkg-query -W steam*
steam
steam-launcher  1:1.0.0.70
steam64
steamos-base-files
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
$ lspci | grep -i graphic
00:02.0 VGA compatible controller: Intel Corporation Skylake GT2 [HD Graphics 520] (rev 07)
$ lscpu | grep ^Model
Model:                           78
Model name:                      Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
]]>
https://matoken.org/blog/2021/06/29/play-life-is-strange-in-japanese-on-linux/feed/ 0
Discordの画面共有をなるべく低画質にして帯域を節約する(2021-06-21) https://matoken.org/blog/2021/06/21/discord-screen-sharing-with-low-quality/ https://matoken.org/blog/2021/06/21/discord-screen-sharing-with-low-quality/#respond Mon, 21 Jun 2021 14:24:46 +0000 http://matoken.org/blog/?p=3277

Discord Linux版での画面共有時の設定メモです.
※この設定は今の所ウェブアプリ版では出てこないので使えないと思います.

スライドの共有などのあまり画質やフレームレートの必要ないものの画面共有時には規定値の設定より低くしても問題なさそうです.

現時点(2021-06-21)での最低解像度,最低フレームレートの設定メモです.

解像度の設定

画面共有時には以前の480pから720pが最低になっています.

Discord resolution01

しかし,一旦画面共有を行った後に配信設定の「配信画質」→「解像度」から「480p」が選択できます.

Discord resolution02

フレームレートの設定

画面共有時のフレームレートでの設定は「15FPS」が最低ですが,配信設定のプルダウンメニューから「より読みやすいテキスト」を選択することで「5FPS」になるようです.

Discord fps01
Discord fps02

環境
$ /opt/local/Discord/Discord --version 2>&1 | head -1
Discord 0.0.15
~$ /opt/local/DiscordPTB/DiscordPTB --version 2>&1 | head -1
DiscordPtb 0.0.25
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2021/06/21/discord-screen-sharing-with-low-quality/feed/ 0
AWK製FPSゲームの「TERMMAZE3D」 https://matoken.org/blog/2021/06/14/termmaze3d/ https://matoken.org/blog/2021/06/14/termmaze3d/#comments Sun, 13 Jun 2021 15:20:14 +0000 http://matoken.org/blog/?p=3265

TERMMAZE3D という端末上で動作するAWK製のFPSゲームを見つけたので遊んでみました.

まずは依存コマンドを導入します.

Requirements
gawk or awk (except mawk)
GNU coreutils or equivalent BSD command (dd, echo, sleep, stty)

Linux環境ではGNU Coreutils + GNU awk,*bsd環境ではdd, echo, sleep, stty + nawk あたりでしょうか.今回はDebian bullseye 環境なのでこんな感じで.GNU Coreutils, GNU awk とリポジトリをclone するためにgit を導入します.

$ sudo apt install coreutils gawk git

source をclone します.

$ git clone https://github.com/mikkun/termmaze3d (1)
$ cd termmaze3d
$ ./termmaze3d.awk (2)
  1. TERMMAZE3Dをclone
  2. 実行

もし,実行時に真っ黒な画面になってしまう場合はawkが mawk に向いていると思うので次のページを参考にgawkに切り替えるか, $ gawk -f ./termmaze3d.awk のように gawk コマンドを直に叩くといいです.
端末サイズは80×22と比較的小さいのでフォントサイズを調整するといい感じになります.

ゲームは毎回自動生成されるマップの中を歩き回ってタイムアップする前に宝物を5つ集めるとクリアです.赤い敵が出てきますが当たるとタイムが減っていきます. k keyで攻撃したり逃げましょう.

以下プレイ動画です.


(backup)

awkでできたゲームといえば以前 awkaster というものもありました.同作者のテトリスライクなAWKTCもAWK製です.興味のある方はこれらも遊んでみるといいかもしれません.

環境1
$ git log --oneline
16e844a (HEAD -> main, tag: v1.0.0, origin/main, origin/HEAD) :tada: Initial co
$ dpkg-query -W gawk coreutils git
coreutils       8.32-4+b1
gawk    1:5.1.0-1
git     1:2.30.2-1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
環境2
$ git log --oneline
16e844a (HEAD -> main, tag: v1.0.0, origin/main, origin/HEAD) :tada: Initial co
$ dpkg-query -W gawk coreutils git
coreutils       8.30-3
gawk    1:4.2.1+dfsg-1
git     1:2.20.1-2+deb10u3
$ lsb_release -dr
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
$ arch
armv7l
]]>
https://matoken.org/blog/2021/06/14/termmaze3d/feed/ 1
Barrierで装飾キーがロックされるのを解除する https://matoken.org/blog/2021/05/29/barrier/ https://matoken.org/blog/2021/05/29/barrier/#respond Sat, 29 May 2021 06:41:43 +0000 http://matoken.org/blog/?p=3247

Barrierというマルチプラットホームのキーボードマウス共有ソフトを常用しています.1台の端末のキーボードマウスで複数のマシンを操れます.Synergyのフォークです.
最近1台の端末をDebian Bullseye + i3wm にしてみたのですが,どうもキーボードがおかしくなります.CtrlやSuperが押しっぱなしになります.
以前から別のマシンでこの症状は出ていましたが今回は頻度がとても多くまともに動くことのほうが少ないです.これまでXorgを再起動して解決していましたが面倒すぎます.

ISSUEを探すと出てきました.未解決のようです(◞‸◟)
でもワークアラウンドがあったので試してみました.

The only thing that I’ve found to “reset” this (without leaving X) is the following …​ and it’s not ideal (at all):

#!/usr/bin/env bash

setxkbmap -layout us
xdotool keyup Shift_L Shift_R Control_L Control_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R Caps_Lock 204 205 206 207

なるほど.
キーボード入力がおかしいのでリモートのssh経由で叩いてみます.

Note
もしコマンドが見つからない場合は, x11-xkb-utils, xdotool パッケージを入れてください.
$ sudo apt install x11-xkb-utils xdotool
$ DISPLAY=:0 setxkbmap -layout us
$ DISPLAY=:0 xdotool keyup Shift_L Shift_R Control_L Control_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R Caps_Lock 204 205 206 207

使えるようになりました :)

確かに理想的ではありませんがとりあえずXorgの再起動が必要なくなったのでとても助かります.
バグが治るまではこれで凌ごうと思います.(もしくはrkvmに移行?)

環境
$ dpkg-query -W barrier xdotool x11-xkb-utils i3 xorg
barrier 2.3.3+dfsg-1.1
i3      4.19.1-1
x11-xkb-utils   7.7+5
xdotool 1:3.20160805.1-4
xorg    1:7.7+22
]]>
https://matoken.org/blog/2021/05/29/barrier/feed/ 0
vnStatでネットワークトラフィックを集計する https://matoken.org/blog/2021/05/28/vnstat/ https://matoken.org/blog/2021/05/28/vnstat/#comments Fri, 28 May 2021 14:17:09 +0000 http://matoken.org/blog/?p=3243

以下のエントリでipコマンドでネットワーク通信量が確認できました.

端末を起動してからの通信量は確認できますが,再起動したりするとデータ量はクリアされてしまいます.MRTGやZabbixなどを使うのは大げさな感じがします.
もう少しお手軽なものがないかなと少し探してvnStatというものを見つけたので今回試してみました.

Debianでは vnstatvnstati というパッケージが提供されています.vnstat が本体で, vnstati はイメージ出力のコマンドです.

まずは本体の vnstat を導入します.

$ sudo apt install vnstat

導入するとvnStatのデーモンが起動します.

$ sudo service vnstat status
● vnstat.service - vnStat network traffic monitor
     Loaded: loaded (/lib/systemd/system/vnstat.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-04-30 00:46:09 JST; 5min ago
       Docs: man:vnstatd(8)
             man:vnstat(1)
             man:vnstat.conf(5)
   Main PID: 2045411 (vnstatd)
      Tasks: 1 (limit: 18935)
     Memory: 808.0K
        CPU: 184ms
     CGroup: /system.slice/vnstat.service
             └─2045411 /usr/sbin/vnstatd -n

Apr 30 00:46:10 t430s vnstatd[2045411]: Interface "virbr0" added with 1000 Mbit bandwidth limit.
Apr 30 00:46:10 t430s vnstatd[2045411]: Interface "nm-br1" added with 1000 Mbit bandwidth limit.
Apr 30 00:46:10 t430s vnstatd[2045411]: Interface "anbox0" added with 1000 Mbit bandwidth limit.
Apr 30 00:46:10 t430s vnstatd[2045411]: Interface "lxcbr0" added with 1000 Mbit bandwidth limit.
Apr 30 00:46:10 t430s vnstatd[2045411]: Interface "docker0" added with 1000 Mbit bandwidth limit.
Apr 30 00:46:10 t430s vnstatd[2045411]: -> 7 new interfaces found.
Apr 30 00:46:10 t430s vnstatd[2045411]: Limits can be modified using the configuration file. See "man vnstat.conf".
Apr 30 00:46:10 t430s vnstatd[2045411]: Unwanted interfaces can be removed from monitoring with "vnstat --remove".
Apr 30 00:46:10 t430s vnstatd[2045411]: Info: vnStat daemon 2.6 started. (pid:2045411 uid:149 gid:165 64-bit)
Apr 30 00:46:10 t430s vnstatd[2045411]: Info: Monitoring (7): wlp3s0 (1000 Mbit) virbr0 (1000 Mbit) nm-br1 (1000 Mbit) lxcbr0 (1000 Mbit) enp0s2>

はじめはデータがないのでこんな感じの寂しい表示です.

$ vnstat                                                                                                            [169/1082]

                      rx      /      tx      /     total    /   estimated
 anbox0: Not enough data available yet.
 docker0: Not enough data available yet.
 enp0s25: Not enough data available yet.
 lxcbr0: Not enough data available yet.
 nm-br1: Not enough data available yet.
 virbr0: Not enough data available yet.
 wlp3s0: Not enough data available yet.

数分経ってから実行するとデータが記録されてログが出てきます.

$ vnstat

                      rx      /      tx      /     total    /   estimated
 anbox0: Not enough data available yet.
 docker0: Not enough data available yet.
 enp0s25: Not enough data available yet.
 lxcbr0: Not enough data available yet.
 nm-br1: Not enough data available yet.
 virbr0: Not enough data available yet.
 wlp3s0:
       2021-04     21.10 MiB  /    3.70 MiB  /   24.80 MiB  /   22.25 MiB
         today     21.10 MiB  /    3.70 MiB  /   24.80 MiB  /  673.77 MiB

ネットワークインターフェイスが複数あって,特定のインターフェイスの情報だけを確認したい場合は -i オプションでインターフェイスが指定できます.

$ vnstat -i wlp3s0
Database updated: 2021-04-30 00:53:40

   wlp3s0 since 2021-04-30

          rx:  21.10 MiB      tx:  3.70 MiB      total:  24.80 MiB

   monthly
                     rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
       2021-04     21.10 MiB |    3.70 MiB |   24.80 MiB |       82 bit/s
     ------------------------+-------------+-------------+---------------
     estimated     19.78 MiB |    2.47 MiB |   22.25 MiB |

   daily
                     rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
         today     21.10 MiB |    3.70 MiB |   24.80 MiB |   64.60 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated    573.38 MiB |  100.39 MiB |  673.77 MiB |

複数のインターフェイスの合計を指定する場合は, + でインターフェイスをつなげて指定します.

$ vnstat -i usb0+wlp3s0

vnStatインストール時に存在しなかったインターフェイスは監視されません.

$ vnstat -i usb0
Error: Interface "usb0" not found in database.

新しいネットワークインターフェイスを追加します.ここでは usb0 を登録しました.

$ sudo vnstat --add -i usb0 (1)
Adding interface "usb0" for monitoring to database...

Restart the vnStat daemon if it is currently running in order to start monitoring "usb0".
$ sudo service vnstat restart   (2)
$ vnstat -i usb0 -d (3)

 usb0  /  daily

          day        rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
     2021-04-30     2.03 MiB |    8.18 MiB |   10.21 MiB |   12.90 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated     26.57 MiB |  107.12 MiB |  133.70 MiB |
  1. usb0 インターフェイスを登録
  2. 反映のためにvNstatを再起動する.
  3. 暫く待ってからカウントされているのを確認.

インターフェイスが切断されているときは disabled の表示になりますが,再接続されるとまたカウントされます.

$ vnstat | grep :
 usb0 [disabled]:
 wlp4s0:

情報の確認はいくつかの表示ができます.サマリー,5分毎,1時間毎,日毎,月毎,年毎,トップなど.
既定値がサマリーのようです.

-5 で5分毎(ここではwlp3s0を5分x6表示)
$ vnstat -i wlp3s0 -5 6

 wlp3s0  /  5 minute

         time        rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
     2021-05-24
         14:35      1.43 MiB |    1.27 MiB |    2.70 MiB |   75.52 kbit/s
         14:40      7.11 MiB |    1.44 MiB |    8.55 MiB |  238.96 kbit/s
         14:45      1.60 MiB |    1.28 MiB |    2.87 MiB |   80.34 kbit/s
         14:50      1.12 MiB |    1.17 MiB |    2.29 MiB |   63.94 kbit/s
         14:55      1.49 MiB |    1.50 MiB |    2.99 MiB |   83.47 kbit/s
         15:00    748.04 KiB |    1.18 MiB |    1.91 MiB |   53.41 kbit/s
     ------------------------+-------------+-------------+---------------
-h で1時間毎(ここでは1時間x3表示)
$ vnstat -h 3

 wlp4s0  /  hourly

         hour        rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
     2021-05-24
         05:00      3.28 MiB |  623.99 KiB |    3.88 MiB |    9.05 kbit/s
         17:00    510.09 MiB |    7.29 MiB |  517.38 MiB |    1.21 Mbit/s
         18:00    286.84 MiB |    8.32 MiB |  295.16 MiB |    1.65 Mbit/s
     ------------------------+-------------+-------------+---------------
-d で日毎(ここでは1日x3表示)
$ vnstat -d 3

 wlp3s0+enp0s25+usb0  /  daily

          day        rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
     2021-05-23   936.47 MiB |  820.25 MiB |    1.72 GiB |  170.56 kbit/s
     2021-05-24     1.56 GiB |  300.01 MiB |    1.85 GiB |  183.94 kbit/s
     2021-05-28   483.40 MiB |  372.19 MiB |  855.60 MiB |   83.07 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated    642.75 MiB |  494.88 MiB |    1.11 GiB |

estimated も表示されます.これはこの調子で使い続けるとこのくらいという推測のようで利用時間や利用量が少なかったり,利用状況が変わる場合信頼できない値になります.

-m で月毎
$ vnstat -m

 wlp3s0+enp0s25+usb0  /  monthly

        month        rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
       2021-04      1.54 GiB |  571.46 MiB |    2.09 GiB |    6.94 kbit/s
       2021-05     19.13 GiB |    4.53 GiB |   23.66 GiB |  303.40 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated     76.48 GiB |   18.12 GiB |   94.60 GiB |
-y で年毎
$ vnstat -y

 wlp4s0  /  yearly

         year        rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
          2021     47.48 GiB |    3.16 GiB |   50.64 GiB |   34.07 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated    117.29 GiB |    7.81 GiB |  125.09 GiB |
-t でtop(ここではTop3)
$ vnstat -t 3

 wlp4s0  /  top 3

    #      day          rx      |     tx      |    total    |   avg. rate
   -----------------------------+-------------+-------------+---------------
    1   2021-05-19     7.76 GiB |    1.52 GiB |    9.29 GiB |  923.28 kbit/s
    2   2021-05-27     8.01 GiB |  373.46 MiB |    8.37 GiB |  832.45 kbit/s
    3   2021-05-18     5.66 GiB |  165.91 MiB |    5.83 GiB |  579.24 kbit/s
   -----------------------------+-------------+-------------+---------------
開始( -b ),終了( -e )期間指定(ここでは2021-05-18〜2021-05-25を指定)
$ vnstat -i usb0 -b 2021-05-18 -e 2021-05-25
Database updated: 2021-05-24 05:09:40

   usb0 [disabled] since 2021-05-17

          rx:  5.84 GiB      tx:  1.03 GiB      total:  6.87 GiB

   monthly
                     rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
       2021-05      5.84 GiB |    1.03 GiB |    6.87 GiB |   29.41 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated      7.80 GiB |    1.37 GiB |    9.17 GiB |

   daily
                     rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
     2021-05-23     3.24 GiB |  756.16 MiB |    3.98 GiB |  395.74 kbit/s
     2021-05-24    45.06 MiB |   10.71 MiB |   55.78 MiB |   25.18 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated    210.01 MiB |   49.92 MiB |  259.93 MiB |
-hg, --hoursgraph で1時間ごとのグラフ
$ vnstat -hg
 eth0                                                                     22:15
  ^                                                                     t
  |                                                                     t
  |                                                                     t
  |                                                                     t
  |                                                                     t
  |                                                                     t
  |                                                                     t
  |                                                                     t
  |                                                                    rt  t
  |                                                              rt r  rt rt
 -+--------------------------------------------------------------------------->
  |  23 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

 h  rx (MiB)   tx (MiB)  ][  h  rx (MiB)   tx (MiB)  ][  h  rx (MiB)   tx (MiB)
23        0.0        0.0 ][ 07        0.0        0.0 ][ 15        0.0        0.0
00        0.0        0.0 ][ 08        0.0        0.0 ][ 16        0.0        0.0
01        0.0        0.0 ][ 09        0.0        0.0 ][ 17        0.0        0.0
02        0.0        0.0 ][ 10        0.0        0.0 ][ 18        3.3        9.1
03        0.0        0.0 ][ 11        0.0        0.0 ][ 19       27.0       19.4
04        0.0        0.0 ][ 12        0.0        0.0 ][ 20       25.0       14.6
05        0.0        0.0 ][ 13        0.0        0.0 ][ 21       31.0      150.8
06        0.0        0.0 ][ 14        0.0        0.0 ][ 22       20.3       37.2
-l でリアルタイム(^cで終了,統計が表示される)
$ vnstat -l
Monitoring wlp4s0...    (press CTRL-C to stop)

   rx:     7.39 Mbit/s   632 p/s          tx:   234.20 kbit/s   306 p/s^C


 wlp4s0  /  traffic statistics

                           rx         |       tx
--------------------------------------+------------------
  bytes                   241.31 MiB  |       10.07 MiB
--------------------------------------+------------------
          max            8.33 Mbit/s  |   322.19 kbit/s
      average          322.69 kbit/s  |    13.47 kbit/s
          min                0 bit/s  |         0 bit/s
--------------------------------------+------------------
  packets                     187533  |           92295
--------------------------------------+------------------
          max                716 p/s  |         382 p/s
      average                 29 p/s  |          14 p/s
          min                  0 p/s  |           0 p/s
--------------------------------------+------------------
  time                104.55 minutes

機関の指定もできるようですが,使い方が悪いのか機関によってはうまく使えません.ここではサマリ表示で指定していない期間の2021-05-24も表示されていて, -h 表示でデータが出てこない.

$ vnstat -i usb0 --begin "2021-05-23 13:00" --end "2021-05-23 20:00"
Database updated: 2021-05-24 05:09:40

   usb0 [disabled] since 2021-05-17

          rx:  5.84 GiB      tx:  1.03 GiB      total:  6.87 GiB

   monthly
                     rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
       2021-05      5.84 GiB |    1.03 GiB |    6.87 GiB |   29.41 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated      7.80 GiB |    1.37 GiB |    9.17 GiB |

   daily
                     rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
     2021-05-23     3.24 GiB |  756.16 MiB |    3.98 GiB |  395.74 kbit/s
     2021-05-24    45.06 MiB |   10.71 MiB |   55.78 MiB |   25.18 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated    210.01 MiB |   49.92 MiB |  259.93 MiB |
$ vnstat -i usb0 --begin "2021-05-23 13:00" --end "2021-05-23 20:00" --hours

 usb0 [disabled]  /  hourly

         hour        rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
                            no data available
     ------------------------+-------------+-------------+---------------

vnstati も試してみます.
これは vNstat の画像出力コマンドです.Debianではvnstatとは別パッケージの vnstati に分かれているのでこれを導入します.

$ sudo apt install vnstati

範囲などのオプションは vnstat と共通です.

$ vnstati -i usb0 -h 7 -o /tmp/today.png

vnstati

環境1
$ dpkg-query -W vnstat vnstati
vnstat  2.6-3
vnstati 2.6-3
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
環境2
$ dpkg-query -W vnstat vnstati
vnstat  2.6-3
vnstati 2.6-3
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
環境3
$ dpkg-query -W vnstat
vnstat  2.6-1
$ lsb_release -dr
Description:    Ubuntu 20.04.2 LTS
Release:        20.04
$ arch
x86_64
]]>
https://matoken.org/blog/2021/05/28/vnstat/feed/ 1