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で動かしているアプリをスマホで……とも思ったのですが日本語入力などはちょっと面倒.もう少し様子見しようと思います.

IFTTTで過去に設定したアプレットを参照する

IFTTTからお知らせメールが届きました.(同じものが2通!)

Hey there,

As of today, your current IFTTT Standard plan no longer supports creating more than 3 Applets from scratch. You still have access to enable unlimited published Applets.

All but 3 of your recently active Applets have been archived. Sign in to view your Applets.

You may unarchive all of your archived Applets by upgrading to IFTTT Pro. Upgrading to Pro also unlocks our best tools for creators and unlimited Applet creation.

Upgrade

For more information, see What happens if I do not upgrade to Pro?

Or reply to this email and we’ll do our best to answer your questions.

—The IFTTT Team

無償アカウントの制限が始まったようです.

そんなに大事なものはもう無かったはずだけどと思いながら確認に行くとアプレットは3つだけしか操作できず,2つだけがアクティブで1つは非アクティブになっていました.非アクティブなアプレットは有効にすることが可能でした.

4つ目以降のアプレットはアーカイブされていてアーカイブページで一覧が確認でします.

しかし,タイトルくらいしか見えなくて中身が見えなくて内容が確認できません.

20201115 06:11:43 2814050

どうにか中が見えないかなと「Account settings」 → 「Export my data」でエクスポートを試してみました.

20201115 05:11:44 2769448

するとメールでjsonデータが飛んできました.
早速jqに食わせてみるとエラー.

$ jq . ~/Downloads/matoken.json
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 2, column 3

このメッセージは改行があったりするパターンぽいてことで削ってみます.また違うエラー.

$ cat ~/Downloads/matoken.json | tr -d '\n' | jq .
parse error: Invalid escape at line 1, column 18812

ファイルをよく見ると改行コードは \r\n で更にその後ろにスペースが入っているようです.

$ od -xc --endian=big ~/Downloads/matoken.json | lv
0001720    222c    226e    616d    6522    3a22    4946    5454    0d0a
          "   ,   "   n   a   m   e   "   :   "   I   F   T   T  \r  \n
0001740    2054    227d    7d2c    7b22    6465    7669    6365    5f74
              T   "   }   }   ,   {   "   d   e   v   i   c   e   _   t

てことでこんな感じでパースできました.

$ cat ~/Downloads/matoken.json | tr -d '\r\n ' | jq . | head
{
  "data": {
    "me": {
      "login": "matoken",
      "email": "matoken@gmail.com",
      "id": "126299",
      "profile_image_url": "https://fastly.4sqi.net/img/user/220x220/2608683-JGYT1JCMXPVUF2KL.jpg",
      "profile_username": "KenichiroMatohara",
      "timezone": "Osaka",
      "bio": null,

しかしWebから見るよりはいいけど詳細は載っていないようです.例えばアプレットの利用するモジュール名などはわかるけど,その詳細はわからない感じです.
でもだいたい何をやっていたかはわかるかな?

というのはIFTTTに止められる前にやるべきでしたね…….

環境
$ dpkg-query -W jq coreutils lv
coreutils       8.32-4+b1
jq      1.6-1
lv      4.51-7
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

GNU Bashのbracketed pasteの設定

Debian sid amd64環境で最近Bashにテキストを貼り付けると貼り付けた文字列が反転して即時反映されないようになっていました.
何らかの操作をすると反転は解除されて反映されます.改行の含まれた文字列を貼り付けて誤って実行されるというようなことが抑制できていい感じです.でも貼り付けただけで実行されたつもりになってしまうこともあったり.

便利だけどこれなんだろうと確認してみました.

Changelogを見てみます.
/usr/share/doc/bash/changelog.Debian.gz は殆どUpstreamへの追従.
/usr/share/doc/bash/changelog.gz を見るとそれらしいものが載っていました.

bash-4.4-alpha, bash-4.3-release.から Bracketed paste mode が入ったようです.
そしてbash-5.1-alpha, bash-5.0-releaseから既定値になたようです.(そして気づいた)

bash-4.4-alpha, bash-4.3-release.

b. There is a new bindable variable, `enable-bracketed-paste’, which enables
support for a terminal’s bracketed paste mode.

bash-5.1-alpha, bash-5.0-release.

h. Bracketed paste mode is enabled by default.

infoを見ると enable-bracketed-paste という項目で設定できるようです.

info bash
enable-bracketed-paste (On)
       When set to On, readline will configure the terminal in a way that will enable it to insert each paste into the editing buffer as a single string of characters, instead of treating
       each character as if it had been read from the keyboard.  This can prevent pasted characters from being interpreted as editing commands.
info bash
Readline Variables
    Readline has variables that can be used to further customize its behavior.  A variable may be set in the inputrc file with a statement of the form
       set variable-name value
or using the bind builtin command (see SHELL BUILTIN COMMANDS below).

実際に叩いてみます.こんな感じでoff/onできました.

$ bind 'set enable-bracketed-paste off'
$ bind 'set enable-bracketed-paste on'

~/.bashrc 辺りに書いておくと次回のbash起動時に反映されます.

その他
  • byobu-screenでは enable-bracketed-paste on しても利用できない?
  • tmuxでのCtrl+b Ctrl + ] での貼付け時には無視される?
  • Ubuntu 20.10 amd64の5.0-6ubuntu2では既定値で無効になっているけど enable-bracketed-paste on で有効に出来る
環境
$ dpkg-query -W bash
bash    5.1~rc2-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

Byobu tmuxでファンクションキーを無効にする

アドホックに切り替える

Ctrl+b shift + F12 でトルグ

設定ファイルに設定する

~/.byobu/keybindings.tmux の1行目に
source /usr/share/byobu/keybindings/f-keys.tmux.disable を追記.

Byobu tmuxを起動し直すか,Ctrl+b : :source-file ~/.byobu/keybindings.tmux で反映する.

Byobu GNU screenの場合はこちら

環境
$ dpkg-query -W byobu tmux
byobu   5.133-1
tmux    3.1b-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

DebianでVSCodiumがアップデートできなくなって困る

VSCodeのMicroSoftのバイナリブロブ等を除外したVSCodiumを使うのに以下のリポジトリを利用しています.Debianだとamd64, i386, arm64, armhfのArchtectureに対応していて便利です.

しかし最近アップデートに失敗します.

apt update に失敗する
Err:7 https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/repos/debs vscodium InRelease
  429  Too Many Requests [IP: 192.168.1.102 3142]
  :
  :
W: Failed to fetch https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/repos/debs/dists/vscodi
  :
  :

apt-cacher-ng を挟んでいるのでそこのキャッシュがおかしいのかなとか思いましたが https なのでキャッシュしていません.念の為デーモンを再起動しても変わらず.
直にアクセスしても同じステータスです.

proxyなしで直にアクセス
$ HTTP_PROXY='' w3m -dump_head https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/repos/debs/dists/vscodium/InRelease | grep ^HTTP
HTTP/1.1 429 Too Many Requests

429 Too Many Requests ってことはサーバ側の問題かな?少し待てば復旧する?と思ったけど1日経っても状況は変わらず.

てことでsiteを見に行くと導入手順のsource.listのurlが変わっているようです.

Add the repository:

echo 'deb [signed-by=/etc/apt/trusted.gpg.d/vscodium-archive-keyring.gpg] https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs/ vscodium main' | sudo tee /etc/apt/sources.list.d/vscodium.list

これに合わせて自分のsource.listを書き換えました.( /etc/apt/sources.list, /etc/apt/sources.list.d/codium.list 等)

apt edit-sources <sourcefile>
-deb https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/repos/debs/ vscodium main
+deb https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs/ vscodium main

鍵は変わっていないようでurlを書き換えてupdate&&upgradeを行うとOKでした.

apt updateが成功
Get:8 https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs vscodium InRelease [3,828 B]

最新になりました :)

$ codium --version
1.48.1
3dd905126b34dcd4de81fa624eb3a8cbe7485f13
x64

アイコンも変わったようです.

vscodium old 100vscodium 100

そいてこの記事を書くためにsiteを見直すと以下の記述に気づきました.はじめからこれを見ていれば…….

Warning: repository migrated to Gitlab Pages, update your configs

環境
$ dpkg-query -W codium apt dpkg
apt     2.1.10
codium  1.48.1-1598037458
dpkg    1.20.5
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

basE91で少し効率よくバイナリをテキストに変換

バイナリを利用できない環境でのデータ転送時にUNIX環境では古くは uudecode, uuencode が,日本のパソコン通信では ish などが使われていました.近頃は base64 がよく使われているように感じます.

これらのツールではバイナリをASCIIで表現するためサイズが大きくなってしまいます.でも全てのASCIIを使っていません.

今回見つけたbasE91はASCIIの0x21-0x7Eのうち -, \, ' を除いた91文字を使ってデコードすることで効率よくするもののようです.

早速試してみます.Debianパッケージがないかなと探しましたがありませんでした.

sourceを貰ってきてmakeします.
※hashは「 basE91 – Browse /basE91/0.6.0 at SourceForge.net 」で確認できる.

$ wget http://downloads.sourceforge.net/base91/base91-0.6.0.tar.gz
$ md5sum base91-0.6.0.tar.gz
e227841d900cc463a162bd79775aeb54  base91-0.6.0.tar.gz
$ sha1sum base91-0.6.0.tar.gz
00cfd573ec8b3d0160dbf53e2c7a49b99a1aa720  base91-0.6.0.tar.gz
$ tar tvf base91-0.6.0.tar.gz
-rw-r--r-- 0/0             575 2005-06-25 00:00 base91-0.6.0/AWK/README
-rwxr-xr-x 0/0             727 2006-11-02 05:13 base91-0.6.0/AWK/b91dec.awk
-rw-r--r-- 0/0             932 2006-09-04 03:00 base91-0.6.0/PHP4/README
-rw-r--r-- 0/0            1513 2006-11-02 05:13 base91-0.6.0/PHP4/base91.php
-rw-r--r-- 0/0             149 2006-09-04 03:00 base91-0.6.0/test/Makefile
-rw-r--r-- 0/0            4265 2006-11-02 05:13 base91-0.6.0/test/test.sh
-rw-r--r-- 0/0             332 2006-08-25 17:00 base91-0.6.0/DOS-asm/readme.txt
-rw-r--r-- 0/0            3487 2006-11-02 05:13 base91-0.6.0/DOS-asm/b91enc.asm
-rw-r--r-- 0/0            5034 2006-11-02 05:13 base91-0.6.0/Java/b91cli.java
-rw-r--r-- 0/0            3297 2006-11-02 05:13 base91-0.6.0/Java/basE91.java
-rw-r--r-- 0/0            1526 2006-11-02 05:13 base91-0.6.0/Java/license.txt
-rw-r--r-- 0/0             793 2006-11-02 05:13 base91-0.6.0/Java/readme.txt
-rw-r--r-- 0/0             112 2006-09-04 03:00 base91-0.6.0/Java/manifest.mf
-rwxr-xr-x 0/0             178 2006-11-02 05:13 base91-0.6.0/Java/build_jar.sh
-rw-r--r-- 0/0            7502 2006-11-02 05:13 base91-0.6.0/cli.c
-rw-r--r-- 0/0            5066 2006-11-02 05:13 base91-0.6.0/base91.c
-rw-r--r-- 0/0            1501 2006-11-02 05:13 base91-0.6.0/LICENSE
-rw-r--r-- 0/0             561 2006-11-02 05:13 base91-0.6.0/base91.h
-rw-r--r-- 0/0            2360 2006-11-02 05:13 base91-0.6.0/README
-rw-r--r-- 0/0            1762 2006-11-02 05:13 base91-0.6.0/base91.1
-rw-r--r-- 0/0             903 2006-09-04 03:00 base91-0.6.0/Makefile
-rw-r--r-- 0/0            2330 2006-11-02 05:13 base91-0.6.0/NEWS
$ tar xf base91-0.6.0.tar.gz
$ cd base91-0.6.0
$ make
$ ./base91 -h
Usage: base91 [OPTION]... [FILE]
basE91 encode or decode FILE, or standard input, to standard output.

  -d, --decode          decode data
  -m SIZE               use SIZE bytes of memory for buffers (suffixes b, K, M)
  -o, --output=FILE     write to FILE instead of standard output
  -v, --verbose         verbose mode
  -w, --wrap=COLS       wrap encoded lines after COLS characters (default 76)
  --help                display this help and exit
  --version             output version information and exit

With no FILE, or when FILE is -, read standard input.

encodeしてdecodeしてみます.
当たり前ですが,encode, decodeしてもdiffもhashも同じです.

$ ./base91 ./base91 -o ./base91.base91
$ ./base91 -d ./base91.base91 -o ./base91.tmp
$ diff ./base91 ./base91.tmp
$ sha512sum ./base91
bc903be7c5b694841a9d0303351846f80f4798ad8848e8f298cf2c4818c68a2270b065db495b969503b25cdf672632e1cced18094f935fed47b75718c3c3e976  ./base91
$ ./base91 ./base91 | ./base91 -d | sha512sum
bc903be7c5b694841a9d0303351846f80f4798ad8848e8f298cf2c4818c68a2270b065db495b969503b25cdf672632e1cced18094f935fed47b75718c3c3e976  -

basE91, base64, base32, uudecode で変換してみます.
basE91 が一番小さいですね

$ ls --block-size=1 -s ./base91
16384 ./base91
$ ./base91 ./base91 | wc -c
17340
$ base64 ./base91 | wc -c
19615
$ uuencode ./base91 - | wc -c
20024
$ base32 ./base91 | wc -c
23538

圧縮すると大分小さくなります.圧縮のほうがずっと効きますね.

$ xz -c ./base91 | wc -c
4528
$ xz -c ./base91 | ./base91 | wc -c
5640
$ xz -c ./base91 | base64 | wc -c
6120
$ xz -c ./base91 | uuencode - | wc -c
6260
$ xz -c ./base91 | base32 | wc -c
7344

他のファイルも試してみます./usr/bin 以下のファイルを適当に見繕って比較x5です.

#!/bin/bash

XZ=`mktemp`
for i in `seq 1 5`
do
  CMD=`find /usr/bin -type f | shuf -n 1`
  echo $CMD
  echo -n "raw  "
  stat -c %s $CMD
  xz -9 -c $CMD > $XZ
  echo -n "xz "
  stat -c %s $XZ
  echo -n "xz.uu  "
  uuencode $XZ - | wc -c
  echo -n "xz.base64  "
  base64 $XZ | wc -c
  echo -n "xz.base91  "
  base91 $XZ | wc -c
done
rm $XZ
$ bash ./bin2ascii.bash | column -t
/usr/bin/lxc-snapshot
raw                          27632
xz                           6756
xz.uu                        9328
xz.base64                    9127
xz.base91                    8418
/usr/bin/dh_installtmpfiles
raw                          3263
xz                           1540
xz.uu                        2144
xz.base64                    2084
xz.base91                    1917
/usr/bin/pbmtogo
raw                          10384
xz                           3164
xz.uu                        4380
xz.base64                    4276
xz.base91                    3942
/usr/bin/chartread
raw                          3966528
xz                           772956
xz.uu                        1064980
xz.base64                    1044169
xz.base91                    963047
/usr/bin/spamassassin
raw                          29898
xz                           9608
xz.uu                        13258
xz.base64                    12981
xz.base91                    11971

おまけ?armelでstatic linkなバイナリを作ってみました.Sipeed Lichee Nano で動かないかな?と.

$ git diff HEAD~~ Makefile
diff --git a/Makefile b/Makefile
index 246aede..129acff 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
-CFLAGS = -Wall -W -O2
-LDFLAGS = -s
+CFLAGS = -static -Wall -W -O2
+LDFLAGS = -static -s

-CC = gcc
+CC = arm-linux-gnueabi-gcc
 INSTALL = install
 INSTALL_DATA = $(INSTALL) -m 444
 INSTALL_PROGRAM = $(INSTALL) -m 555

qemu-arm-static では動くのを確認したけど実機では未確認です.

$ file ./base91
./base91: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=88ec4ccbf69c4bb41640b5de63b6b5373b7e5365, for GNU/Linux 3.2.0, stripped
$ ldd ./base91
        not a dynamic executable
$ echo 😺 | qemu-arm-static ./base91 | pee cat "qemu-arm-static ./base91 -d"
=~m6xHA
😺

以下にバイナリとuuencodeしたものが置いてあります.

blog元のmemo

環境
$ dpkg-query -W gcc-10-arm-linux-gnueabi qemu-user-static gcc coreutils sharutils
coreutils       8.32-3
gcc     4:10.1.0-1
gcc-10-arm-linux-gnueabi        10.2.0-3cross2
qemu-user-static        1:5.0-13
sharutils       1:4.15.2-5
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64