autotrash でゴミ箱を自動清掃

ゴミ箱は便利ですがどんどん溜まっていくので定期的に捨てないといけません.気が向いたときにゴミ箱を空にするのでもいいのですがそれだと1月前にゴミ箱に入れて確実にゴミであろうファイルもさっきゴミ箱に入れたもしかしたら誤って削除したファイルも一緒に消すことになってしまい心配です.
autotrashを使うとゴミ箱に入れた日数やファイル名,空き容量が何GBより少なくなったなどの様々な条件によりゴミ箱内のファイルを削除することができます.crontabに登録しておくと自動化もできてお薦めです.

※以下はmanのexampleで日本語部分は間違っているかもしれません –dry-run と –verbose オプションを付けて動作確認をした上で使うようにしてください.

30日以上経過したファイルを削除
autotrash -d 30
          Purge any file that has been in the trash for more then 30 days.
ゴミ箱のファイルシステムの空き容量が1024MB(1GB)以下になるようファイルを削除.削除する場合30日以上経過したファイルが対象?
autotrash --max-free 1024 -d 30
          Only purge files from the trash if there is less than 1GB of space left on the trash filesystem. If so, only trash files that are older than 30 days.
ゴミ箱のファイルシステムの空き容量が2048MB(2GB)以下になるまで古いファイルから削除する?
autotrash --min-free 2048
          Purge files from trash, oldest first, till there is at least 2GB of space on the trash filesystem. There is no restriction on how old trashed files are.
ゴミ箱のファイルシステムの空き容量が2048MB(2GB)以下になるまでファイルを削除する.削除する場合はまず”*.bak”を削除して次に”\*.avi”その後は古いファイルから削除する?
autotrash --min-free 2048 -D '.*\.bak' -D '.*\.avi'
          Purge files from trash till there is at least 2GB of space on the trash filesystem. If we need to remove files, make sure we remove *.bak files first, then
          all *.avi files and after that the oldest to the newest. There is no restriction on how old trashed files can get. Please note that '.*\.bak' and '.*\.avi'
          are regular expressions and not glob patterns. Given that they are regular expressions, using -D '.*\.(png|gif|jpg|jpeg)' will match images with any of the
          given extensions.
ゴミ箱の容量が4000MBになるまでは何もしない,それ以上の場合は30日以上経過したファイルを削除し,ゴミ箱の容量が2048MB以下になるまで古いファイルから削除する?
autotrash --max-free 4000 --min-free 2048 -d 30
          Start  reading  the  trash  if there is less than 4000MB of free space, then start keeping an eye on. At that point, remove files older than 30 days and if
          there is less than 2GB of free space after that remove even newer files.

私は単純にゴミ箱に入れて33日経ったファイルを削除するようにしています.
この例では毎日02:08に優先度を下げて実行しています.vixie-cronの場合 @daily でもいいし, @reboot でシステム起動時に処理とかでもいいかもしれません.詳細は man 5 crontab を参照してください.

$ crontab -l|grep autotrash
8 2 * * *       nice -n 19 ionice -c 3 autotrash -d 33

ただ,これはゴミ箱を使っているユーザ毎に設定しないといけないのがちょっと面倒です.一人で使っているシステムならいいのですが,利用者が1000人だと /etc/crontab に1000行書くなどしないといけません.
autotrash 0.2.1 では -t オプションで全ユーザのチェックが出来るようです.(手元の環境では 0.1.5 なので未確認)

You can also make autotrash process all user trash directories (not just in your home directory) by adding this crontab entry:

@daily /usr/bin/autotrash -td 30
環境
$ dpkg-query -W autotrash
autotrash       0.1.5-1.1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

#sidだけどupstreamに追従してないですね><

KeePassXC の Steam TOTP を試す

Steam ガードというスマートフォンアプリを使ったValve独自TOTPな多要素認証があります.これは通常のTOTP(rfc6238)と違い独自実装で数字だけではなくアルファベットも利用しているのでOATH ToolkitやGoogle Authenticatorでは認証できません.

Steam ガードのTOTPはValve独自ですが一応いくつかの実装はあります.(未検証)

KeepassXC にも TOTP(KeePassXC 2.2.0以降)と Steam ガードの TOTP(KeePassXC 2.3.0以降)がサポートされています.今回これを試してみました.

a generator for time-based one-time passwords (TOTP)
Add support for Steam one-time passwords [#1206]

しかし,これらを試すにはSteam Guard Mobile Authenticatorを設定したスマートフォンの中からTOTPの秘密鍵を入手する必要があります.以前のAndroidではadb backup するだけで鍵の書かれたファイルが入手できていたらしいのですが現在は暗号化されていてこの手順では入手できないようです.
GitHubにAPKにpatchするscriptが公開されていたのでまずはこれを試してみました.

これがうまく行けば以前のようにadb backupが出来るようになるはずです.しかし,バージョンの問題か失敗しました.

別の方法としてAndroidのroot取得済み端末にSteam Guard Mobile Authenticatorを導入してこちらの端末を有効にして秘密鍵を取得しました.

rooted端末から設定ファイルを抜き出してトークン取得
$ adb shell #Android shellを起動してファイル名を確認
1|shell@MK16i:/ $ su
root@MK16i:/ # ls -l /data/data/com.valvesoftware.android.steam.community/files/
-rw-rw---- u0_a59   u0_a59        448 2018-08-31 22:25 Steamguard-76561198085918260
root@MK16i:/ # exit
root@MK16i:/ $ exit #AndroidからexitしてPCに戻る
$ adb root  #rootになる
$ adb pull /data/data/com.valvesoftware.android.steam.community/files/Steamguard-76561198085918260  #ファイル取得
$ adb kill-server  #adb server終了
$ file Steamguard-76561198085918260
Steamguard-76561198085918260: ASCII text, with very long lines, with no line terminators
$ lv Steamguard-76561198085918260
$ jq .uri Steamguard-76561198085918260 | sed -e 's/^.*=\(.*\)&.*$/\1/'  #鍵表示
OXYBZQLEOB7KKFAPERMN8EGNOLJWEDYZ
$ shred -uz Steamguard-76561198085918260  #ファイル消去

取得した鍵をKeePassXCに登録してみます.
Steamの設定上で右クリック,「タイムベースワンタイムパスワード」→「TOTP の設定…」から「キー」に設定します.
登録した後Steamの設定上で右クリック,「タイムベースワンタイムパスワード」→「TOTP を表示」でトークンが表示できます.
29467671377 1a01b3ce35

Androidスマートフォンアプリと見比べてみると同じトークンが表示され,Steamにもloginできます :)

43687930524 4260e0f2a6

[

Steam Guard Mobile Authenticatorは同時に1端末しか登録できず,2台目を設定すると1台目の端末の鍵が無効にされます.なのでKeePassXCを利用する場合はroot端末と併用するか,root端末から消してKeePassXCのみで運用するしかなさそうです.

複数の携帯電話で Steam アカウントを認証できますか?
いいえ、ひとつのアカウントで一度に有効化できる認証機器はひとつだけです。

もう一つ問題が.KeePassXCにはcli版が同梱されているのですが,バージョン2.3.4時点ではTOTPのオプションが見当たりません.GUIのみの利用となりそうです.

$ keepassxc-cli -h
Usage: keepassxc-cli [options] command
KeePassXC command line interface.

Available commands:
add            Add a new entry to a database.
clip           Copy an entry's password to the clipboard.
diceware       Generate a new random diceware passphrase.
edit           Edit an entry.
estimate       Estimate the entropy of a password.
extract        Extract and print the content of a database.
generate       Generate a new random password.
locate         Find entries quickly.
ls             List database entries.
merge          Merge two databases.
rm             Remove an entry from the database.
show           Show an entry's information.


Options:
  -h, --help     Displays this help.
  -v, --version  Displays version information.

Arguments:
  command        Name of the command to execute.
$ keepassxc-cli -v
2.3.4
環境
$ dpkg-query -W keepassxc
keepassxc       2.3.4+dfsg.1-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

Google Chrome 69 でURLのサブドメインが表示されなくなったのを表示する

<追記>
69.0.3497.92 で修正された

chrome://flags/#omnibox-ui-hide-steady-state-url-scheme-and-subdomains を「Default」に戻してもサブドメインが省略されないのを確認 :)
</追記>

Google Chrome 69 で アドレスバーの表示が変わりました.例えば www.matoken.org で www が見えなくなり,matoken.org と表示されるようになりました.
更に,www.hoge.www.matoken.org は hoge.matoken.org に見えるというおそらくバグであろう挙動も><

42739367390 9acbb565de

Workaround として,chrome://flags/#omnibox-ui-hide-steady-state-url-scheme-and-subdomains を Disabled にすると以前の挙動になります.

30678044578 41d01a41ff

Chromium 69.0.3497.81-3 は既定値で以前と同じ動作のようです.

環境
$ dpkg-query -W google-chrome-stable chromium
chromium        69.0.3497.81-3
google-chrome-stable    69.0.3497.81-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

Google Chrome からエクスポートしたパスワードリストを KeepassXC にインポート

人に説明するのに手元で試したのですがせっかくなのでblogに

Google Chrome のパスワードマネージャは使っているけれど,汎用的なKeepassXC に移行なメモです.

Google Chrome からパスワードのエクスポート

「設定」→「パスワードとフォーム」→「パスワードを管理」
若しくは chrome://settings/passwords にアクセス.

「︙」を押して「パスワードをエクスポート」から「パスワードをエクスポート…」から適当な場所にパスワードを保存します.

42595980870 d5446a65ee

30536920508 8d62cb50bd

KeepassXC へのインポート

KeepassXC を起動して,「CSVからインポート」を選びます.

43503758335 aa7e31c143

列のレイアウトを以下のようにしてインポートします.

  • Title : 列1

  • Username : 列3

  • Password : 列4

  • URL : 列2

44404975011 57f063d488

ウェブブラウザへの拡張機能の導入

利用するウェブブラウザに拡張機能を導入する.

KeepassXC の「ツール」→「設定」の「ブラウザー統合」で利用するウェブブラウザを有効にする.

42603172110 1770a7e23f

後はよしなに.

環境
$ dpkg-query -W keepassxc google-chrome-stable
google-chrome-stable    68.0.3440.106-1
keepassxc       2.3.1+dfsg.1-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

Debian sid に Ubuntu の source.list から JOSM を導入

以前は OpenStreetMap 編集ツールの JOSM を wget で定期的に取得していましたが,更新されてないときも取得したりとかがいまいちでした.

<追記>

今試すと以前はJOSMサーバでは --timestamping option が効かなかったと思うのですが今は効くようになっていました.

$ wget -SN https://josm.openstreetmap.de/josm-latest.jar
--2018-09-08 00:21:26--  https://josm.openstreetmap.de/josm-latest.jar
josm.openstreetmap.de (josm.openstreetmap.de) をDNSに問いあわせています... 78.47.65.34, 2a01:4f8:c17:2906::2
josm.openstreetmap.de (josm.openstreetmap.de)|78.47.65.34|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 
  HTTP/1.1 304 Not Modified
  Date: Fri, 07 Sep 2018 15:21:29 GMT
  Server: Apache/2.4.18 (Ubuntu)
  Connection: Keep-Alive
  Keep-Alive: timeout=5, max=100
  ETag: "ca0f12-57529dee345c4"
ファイル `josm-latest.jar' はサーバ側で変更されていませんでした。ダウンロードを省略します。

</追記>

JSOM 公式で Ubuntu のパッケージを配布しているので,これを借りてみます.

Ubuntu の dists はこんな感じです.とりあえず近くて LTS な bionic(18.04 LTS)を使います.(alldist)でも良かったかも.

$ w3m -dump 'https://josm.openstreetmap.de/apt/dists/'|grep "^\[DIR\]"|awk {' print $2 '}
alldist/
artful/
bionic/
cosmic/
lucid/
natty/
oneiric/
precise/
quantal/
raring/
saucy/
trusty/
utopic/
vivid/
wily/
xenial/
yakkety/
zesty/

こんな感じで導入しました.

$ wget -q https://josm.openstreetmap.de/josm-apt.key -O- | sudo apt-key add - #鍵導入
$ sudo apt edit-sources josm  #source.list作成内容は以下のもの
$ cat /etc/apt/sources.list.d/josm.list
deb https://josm.openstreetmap.de/apt bionic universe
$ sudo apt update #パッケージ情報を最新に
$ sudo apt install josm-latest  #josm-latestを導入

起動して,以下のようにフォントにアンチエイリアスが効いていなくて汚い場合は,

42536121640 71d60ae6aa

環境変数 `_JAVA_OPTIONS=’-Dawt.useSystemAAFontSettings=lcd’ ` を設定するときれいになります.

43627752894 854fe912f8

とりあえず最低限のプリセットや,

43628727264 425999a29a

プラグインを設定.

43628723984 a3dbce049f

てことでこれで普通に使えそうです.

(新しいGPSロガーほしいですね)

awesome WM の設定内で ホームディレクトリを指定する

awesome WM での設定ファイルは Lua で書かないといけないのですが,Lua がよくわからずホームディレクトリのパスを指定するのに ~`や `${HOME} が利用できないので /home/USER な感じでフルパスで書いていたのですが,いつもと違うアカウント名の環境に clone していろいろと動かなくなりました.
またパスを書き換えるのもなーということでちゃんと確認してみると,os.getenv(HOME) が使えそうです.

os.getenv (varname)
Returns the value of the process environment variable varname, or nil if the variable is not defined.

ということで,こんな感じで別アカウントでも動作するようになりました :)
これで /home/* だろうが /export/home/* だろうがへっちゃらです!

rc.lua
diff --git a/rc.lua b/rc.lua
index 817937a..a564559 100644
--- a/rc.lua
+++ b/rc.lua
@@ -11,6 +11,8 @@ local naughty = require("naughty")
 local menubar = require("menubar")
 local hotkeys_popup = require("awful.hotkeys_popup").widget

+local home = os.getenv("HOME")
+
 -- Load Debian menu entries
 require("debian.menu")

@@ -276,14 +278,14 @@ globalkeys = awful.util.table.join(

     -- bind PrintScrn to capture a screen
-    awful.key({                   }, "Print", function () awful.util.spawn("/home/mk/.config/awesome/bin/ss-root.sh", false)   end),
-    awful.key({ "Mod1"            }, "Print", function () awful.util.spawn("/home/mk/.config/awesome/bin/ss-window.sh", false) end),
-    awful.key({ "Shift"           }, "Print", function () awful.util.spawn("/home/mk/.config/awesome/bin/ss-area.sh", false)   end),
+    awful.key({                   }, "Print", function () awful.util.spawn(home .. "/.config/awesome/bin/ss-root.sh", false)   end),
+    awful.key({ "Mod1"            }, "Print", function () awful.util.spawn(home .. "/.config/awesome/bin/ss-window.sh", false) end),
+    awful.key({ "Shift"           }, "Print", function () awful.util.spawn(home .. "/.config/awesome/bin/ss-area.sh", false)   end),

     -- Audio Controle
環境
$ dpkg-query -W awesome*
awesome 4.2-5
awesome-doc     4.2-5
awesome-extra   2018041201
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

awesome WM で Light を利用して輝度調整する

以前は awesome WM での輝度調整は xbacklight を利用していたのですが,動作しなくなっていました.

$ xbacklight -get
No outputs have backlight property

最近まで ThinkPad が1台だけになって持ち運びをしなくなっていたのもあり,以下のような感じで /sys/class/backlight/intel_backlight/brightness に投げていました.

$ echo 800 | sudo tee /sys/class/backlight/intel_backlight/brightness
800

しかし,最近 T430s/X201i のジャンクを入手して補修して持ち運べる ThinkPad が出来ました :)
そうなると場所により明るさが変わったり,輝度を下げてバッテリー持ちを良くしたりしたいという感じでこまめに起動調整がしたくなりました.
他のwmのpower managerを使うと一応輝度調整できるけどあまり嬉しくないなということでちょっと探してみると, Light というものを見つけました.

Arch Linux, Fedora にはパッケージがあるようです.今回はsourceからUbuntuとDebianに導入しました.

導入
$ git clone https://github.com/haikarainen/light
$ cd light
$ ./autogen.sh
$ ./configure
$ make
$ sudo checkinstall

とりあえずそのまま既定値でbuildしました.

実行例
$ light -G  #輝度取得
56.34
$ light -A 10 #輝度 10 Up
$ light -U 10 #輝度 10 Down

問題なく動きました.他にもオプションはありますが,とりあえずこれだけ動けば問題ありません.
awesome WM の ~/.config/awesome/lua.rc に書いてみます.

rc.lua
diff --git a/rc.lua b/rc.lua
index f9a7467..9f461b9 100644
--- a/rc.lua
+++ b/rc.lua
@@ -289,8 +289,12 @@ globalkeys = awful.util.table.join(

     -- Brightness Controle
---    awful.key({         }, "XF86MonBrightnessDown", function () awful.util.spawn("xbacklight - 5") end),
 --    awful.key({         }, "XF86MonBrightnessUp",   function () awful.util.spawn("xbacklight + 5") end),
+--    awful.key({         }, "XF86MonBrightnessDown", function () awful.util.spawn("xbacklight - 5") end),
+    -- 以下の light を利用
+    -- "haikarainen/light: GNU/Linux application to control backlights" https://github.com/haikarainen/light
+    awful.key({         }, "XF86MonBrightnessUp",   function () awful.util.spawn("light -A 10") end),
+    awful.key({         }, "XF86MonBrightnessDown", function () awful.util.spawn("light -U 10") end),

     -- lock screen
     awful.key({ "Mod1"  }, "l", function () awful.util.spawn( "xscreensaver-command -activate",false) end),

awesome WM の restart をして,輝度調整ボタンを押すとちゃんと輝度がUp/Downするようになりました.
これで外出先でも困りません :)

環境1
$ $ dpkg-query -W awesome*
awesome 4.2-4
awesome-doc
awesome-extra   2017110501
$ lsb_release -d
Description:    Ubuntu 18.04.1 LTS
$ uname -m
x86_64
環境2
$ dpkg-query -W awesome*
awesome 4.2-5
awesome-doc     4.2-5
awesome-extra   2018041201
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

SteamにWineの機能が加わったらしいので少し試す

ゲーミングプラットホームのSteamにLinux版のクライアントもあります.これにWindows版のゲームが遊べるようになる機能がベータ版に加わったらしいです.これはWindows互換レイヤーのWineにSteamを作っているValveSoftwareがゲーム向けの機能に手を加えたProtonというものを組み込んで実現しているようです.
今の所Wineで動作するものという括りではなく,Valveが指定したタイトルだけが動作するようです.
#設定で全てのゲームで有効にすることが可能だった.
動作するゲームのリストは以下のアナウンスページで確認できます.今の所27タイトルのようです.(これを知っていれば先日のセールでDOOMを……)

ということでベータを有効にして試してみました.

ベータへの参加を有効にします.

44213791731 9a4cd08d09.jpg
43495999044 c67b4a40fd.jpg

Steamの再起動を行います.

43308073705 9bf75145b2.jpg

ベータ版がダウンロードされ,起動します.

42405873910 5bceb6c319.jpg

対応のDOOMのデモ版を試してみようと思いましたが,デモの方はまだ対応していないようで駄目でした.

44213916001 0ef30bab4a.jpg

対応リストの中の「Doki Doki Literature Club!」は無料のようなのでこれで試してみます.

ページを開くとアイコン上はWindows/Macのみの対応ですが,「ゲームをプレイ」ボタンが有効になっています.そのまま通常の導入手順でダウンロードとインストールが始まり正常終了しました.

44213925501 18fd9a3b74.jpg

ライブラリに登録されました.見た目はネイティブのものと同じです.

44184862972 207d8776b3.jpg

そして普通に起動します.
起動中のプロセスを確認すると特にwineやprotonと名前の付いたプロセスは見当たらずSteamに組み込まれているように見えます.

追記)
「Doki Doki Literature Clug!」にはもともと`~/.steam/steam/steamapps/common/Doki\ Doki\ Literature\ Club/DDLC.sh`というshell scriptがあり,Steam Play を通さなくてもLinuxで動作するようです.
「FSteam:Fallout Shelter」で試すと,以下のようにそれらしいプロセス経由で動作しています.(うまく起動しないけど)

$ pstree -n 31976
bash─┬─bash───steam─┬─22*[{steam}]
     │              ├─steam───sh───steamwebhelper.───steamwebhelper─┬─21*[{steamwebhelper}]
     │              │                                               ├─steamwebhelper─┬─steamwebhelper───13*[{steamwebhelper}]
     │              │                                               │                └─steamwebhelper───12*[{steamwebhelper}]
     │              │                                               └─steamwebhelper───6*[{steamwebhelper}]
     │              └─SteamChildMonit───sh───python2.7───wineserver
     └─tee
$ ps aux| grep -i wine
matoken   1842  0.0  0.0   4240   940 pts/5    S+   15:25   0:00 grep -i wine
matoken   3005  0.2  0.0  55596 13052 ?        Ss   14:53   0:04 /home/matoken/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin/wineserver
matoken   3012  0.0  0.2 2078348 37364 ?       Sl   14:53   0:00 C:\windows\system32\winedevice.exe
matoken   3028  0.3  0.2 2144476 39268 ?       Sl   14:53   0:06 C:\windows\system32\winedevice.exe
matoken   9450  0.0  0.2 1947276 35808 ?       Sl   14:30   0:00 C:\windows\system32\winedevice.exe
matoken   9464  0.3  0.2 2013404 37772 ?       Sl   14:30   0:10 C:\windows\system32\winedevice.exe
matoken  22254  0.0  0.2 2078348 38144 ?       Sl   14:40   0:00 C:\windows\system32\winedevice.exe
matoken  22270  0.3  0.2 2144476 39424 ?       Sl   14:40   0:08 C:\windows\system32\winedevice.exe
matoken  32709  0.0  0.1  45432 25808 ?        S    15:23   0:00 /home/matoken/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin//wineserver -w
$ ps aux| grep -i proton
matoken   1916  0.0  0.0   4240   936 pts/5    S+   15:25   0:00 grep -i proton
matoken   3005  0.2  0.0  55596 13052 ?        Ss   14:53   0:04 /home/matoken/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin/wineserver
matoken  32707  0.0  0.1  41048 24736 ?        S    15:23   0:00 /bin/sh -c '/home/matoken/.local/share/Steam/steamapps/common/Proton 3.7'/proton waitforexitandrun '/home/matoken/.local/share/Steam/steamapps/common/Fallout Shelter/FalloutShelter.exe'
matoken  32708  0.0  0.0  52044 14352 ?        S    15:23   0:00 python2.7 /home/matoken/.local/share/Steam/steamapps/common/Proton 3.7/proton waitforexitandrun /home/matoken/.local/share/Steam/steamapps/common/Fallout Shelter/FalloutShelter.exe
matoken  32709  0.0  0.1  45432 25808 ?        S    15:23   0:00 /home/matoken/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin//wineserver -w

少し遊んだ感じでは特に違和感なく遊べています.(が,1時間ほどしか遊んでいないところでSSDが壊れてそれ以上は試せていません><)

43308551205 e4f9cf42a5.jpg

なお,「Doki Doki Literature Clug!」は英語版しかありませんが,有志による日本語化パッチが提供されているので日本語化して遊んでも良さそうです.

43496726104 221e9b9f27.jpg

追記)
以下の「Enable Steam Play for all titles」でWindows用のタイトルが全てProtonで起動できるようにできました.ただし実際に動作するかどうかはゲーム次第です.いくつか試してみましたが,Lutris経由のWine Steamで遊べるゲームでも動かなかったりしました.(Montaroとか)
20180826_07:08:32-9123

環境
20180826_14:08:02-28740

$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

今回のSteamベータで対応していないものでWineで動作するゲームはLitrisでWine Steamを使うのもお手軽でおすすめです.

GNU coreutils の dd に プログレスオプションがあった

dd の進捗は SIGUSR1 を投げると覚えていたのですが,man を眺めていると status=progress というオプションがあるのに気づきました.

manより
status=LEVEL
       The LEVEL of information to print to stderr; 'none' suppresses
       everything but error messages, 'noxfer' suppresses  the  final
       transfer  statistics,  'progress' shows periodic transfer sta‐
       tistics

2015-07-03 の GNU coreutils 8.24 で入ったようです.

dd accepts a new status=progress level to print data transfer statistics
on stderr approximately every second.

これまでも独自パッチでddにプログレスを出すようにするものなどはありましたがGNU ddに導入されていたんですね.気づきませんでした.

てことで試してみます.まずは従来の方法から.

dd開始
$ dd if=/dev/urandom of=/dev/null count=99999 &
[1] 19386
killコマンドで USER1 シグナルを投げる
$ kill -USR1 19522
2294+0 レコード入力
2293+0 レコード出力
2404384768 bytes (2.4 GB, 2.2 GiB) copied, 11.0258 s, 218 MB/s
killallコマンドでpidではなくプロセス名を指定
$ killall -USR1 dd
15648+1 レコード入力
15647+1 レコード出力
16407664896 bytes (16 GB, 15 GiB) copied, 76.1063 s, 216 MB/s

※pkillを使うと部分一致になるので意図しないプロセスにシグナルを送ってしまうことがあるので注意

$ pgrep dd
2
70
3937
$ ps 2 70 3937
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
   70 ?        I<     0:00 [ipv6_addrconf]
 3937 pts/9    R      0:13 dd if=/dev/urandom of=/dev/null bs=1M count=99999
watchコマンドで定期的に実行
$ watch killall -USR1 dd
98448+3 レコード入力
98447+3 レコード出力
103231407040 bytes (103 GB, 96 GiB) copied, 487.072 s, 212 MB/s
 :
ddコマンド実行時にpvコマンドを挟む
$ cat /dev/urandom | pv | dd of=/dev/null bs=1M count=99999
1.06GiB 0:00:06 [ 182MiB/s] [     <=>                                        ]
pvコマンドでファイル出力
$ pv /dev/urandom | dd of=/dev/null bs=1M count=99999
 502MiB 0:00:03 [ 170MiB/s] [  <=>                                           ]
ddの status=progress オプションを利用
$ dd if=/dev/urandom of=/dev/null bs=1M count=99999 status=progress
1910505472 bytes (1.9 GB, 1.8 GiB) copied, 9 s, 212 MB/s

流石に純正だけあっていい感じですね.問題はいざ使うときに思い出せるかという…….pvが覚えやすくて便利なんですよね.

そもそもdd使わずGNU ddrescue を使う?まあ大抵の用途ではそっちのほうが良いかもです.

試した環境
$ dd --version
dd (coreutils) 8.28
Copyright (C) 2017 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Paul Rubin、 David MacKenzie、および Stuart Kemp。
$ dpkg-query -W coreutils
coreutils       8.28-1
pv      1.6.6-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

コンソールでモダンなウェブが閲覧できる Browsh を試す

browsh-header
最近HTML5, CSS3, JS, videoなども閲覧可能な端末上でブラウジング出来るBrowshというものを知りました.

BrowshのバックエンドはFirefoxで,その画面を変換して表示しているようです.キーボード,マウスで操作できます.

Firefox -> VNC -> Browsh -> Termina/http

各種環境の単一のバイナリ(別途Firefoxが必要)や,docker imageが提供されています.arm版も用意されていますが,Firefox 57移行が必要なのでRaspberry PiのRaspbianではひと工夫要りそうです.

また,sshで体験できるようにもなっています.まずはこれで体験してみるのがお手軽で良いと思います.

$ ssh brow.sh

しかし,今日試したところ混んでいるようで繋がりませんでした(◞‸◟)

All of Browsh's servers are currently busy. Please try again soon.
Shared connection to brow.sh closed.

導入

手元で試してみます.今回は Linux Static: x64 を試しました.ちなみにv1.2.3の時はうまく動作しませんでしたが,現在のv1.3.3では動作するようになりました :)

BroushにはFOrefox 57以降が必要です.もし導入していない場合はFirefoxを導入します.そして対応バイナリを入手してchecksumを確認,実行権を付与します.

$ sudo apt install firefox
$ wget https://github.com/browsh-org/browsh/releases/download/v1.3.3/browsh_1.3.3_linux_amd64 https://github.com/browsh-org/browsh/releases/download/v1.3.3/browsh_1.3.3_checksums.txt
$ sha256sum -c browsh_1.3.3_checksums.txt 2>/dev/null | grep -v 'FAILED open or read'
browsh_1.3.3_linux_amd64: OK
$ chmod u+x browsh_1.3.3_linux_amd64

実行(TTY)

端末上で実行します.ヘッドレスでFirefoxが起動してからBrowshが利用できるようになります.

$ ./browsh_1.3.3_linux_amd64

以下のショートカットとマウス操作が可能です.

  • キーボード・ショートカット
    F1 : ドキュメント( https://www.brow.sh/docs/introduction/ )の表示
    カーソルキー,PgUp/PgDn : 画面スクロール
    CTRL+q : Browshの終了
    CTRL+l : URLバーにフォーカス
    BACKSPACE : 前の画面に移動
    CTRL+r : ページ再読込
    CTRL+t : 新しいタブ
    CTRL+w : タブを閉じる
    CTRL+TAB : 次のタブに移動
    ALT+SHIFT+p : スクリーンショットの取得(動作しない?)
    ALT+m : モノクロモードトルグ
    ALT+u : ユーザエージェントデスクトップ,モバイル切り替え

マウス操作はリンククリックだけだと思います.リンククリックもキーボードで出来ると良いのですが今のところ出来ません.issueで上がっているので出来るようになるかもしれません,

以下は手元で動かした時の表示例です.表示が崩れる場合は端末ソフトを変えるとましになったりします.
手元ではsakuraはしましまになってしまいました.以下のスクリーンショットはgnome-terminalのものです.

20180714_21:07:42-1367220180714_21:07:50-13839

残念ながら現在日本語などのワイド文字には未対応です.Issueに上がっているのでそのうち直ると思います.

http-server機能を使う

-http-server オプションを使うとBrowshをhttp proxyのように他のウェブブラウザで表示結果を利用できます.この場合多少崩れますが日本語も表示できます.細い回線だけでなく古い機械のウェブブラウザや,性能の低いマシンでアクセスするのにも良さそうです.

$ ./browsh_1.3.3_linux_amd64 --help 2>&1 | grep http-server$ -A1
  -http-server
        Run as an HTTP service
$ ./browsh_1.3.3_linux_amd64 -http-server -http-server-bind 127.0.0.1

既定値では,4333ポートで利用できます.
http://127.0.0.1:4333/
任意のURLを開く場合はこのURLの後ろにアクセスしたいURLを付与します.
http://127.0.0.1:4333/https://duckduckgo.com/

Chromeでアクセス
20180714_21:07:35-18304
20180714_21:07:55-18562

w3mでアクセス
20180714_21:07:31-18905

2011年発売のAndroid端末のAndroidブラウザでアクセス
image%3A52713

ちょっと崩れるけどいい感じです :)
ただ,何故かGoogle+にアクセスするとBrowshのページになってしまいます(TTYだとOK)

テキストブラウザはelinksやw3mなどありますが,最近のリッチな環境には追従できていません(JavaScript機能の入ったw3mは以前あった).フューチャーフォン時代はそちらのページを利用したりしていましたが最近はスマートフォン対応でそういったページも無くなってきています.ということでBroushのこれからに期待です.

余録

仕組みなどがやはり端末でリモートデスクトップが利用できるtexttopに似ているなと思ってGitHubにアクセスしてみるとBroushに転送されました.同じ人が作ったもので途中からBrowshに変わったようです.

環境

Browsh : Linux Static: x64 v1.3.3

$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64
$ dpkg-query -W firefox
firefox    61.0-2