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

たくさん時間のずれた写真の時計合わせ

DP1M0538

先日ポタリングに行ったのですが,その時持っていったカメラの時計が初期化されてしまっていてオフセットが6年半以上ありました.
(予備バッテリーが死んでバッテリー充電中に情報が初期化されてしまう)

これを正確な撮影時間に変更します.いつもはexiv2で設定していたのですが,今回これではうまく行かなかったのでexiftimeコマンドで設定しました.

先ずカメラ内時計と実際の時計の差分を求めます.正確な時間を撮影(今回はNICTのJST Clockを撮影)した結果はこんな感じでした.

$ ls --full-time DP1M0608.JPG
-rw-r--r-- 1 mk mk 9043186 2012-01-02 10:27:01.000000000 +0900 DP1M0608.JPG

写真に写った時間 -> 2018-07-17 07:32:00

それぞれUNIX EPOCに変換して引き算をすると差分は206312699秒でした.

$ date +%s -d '2012-01-02 10:27:01'
1325467621
$ date +%s -d '2018-07-17 07:32:00'
1531780320
$ expr 1531780320 - 1325467621
206312699

いつも使っているexiv2コマンドにこの秒を指定して修正しようとしたら日付がおかしくなってしまいました.

$ cp -p ./DP1M0608.JPG /tmp/DP1M0608.JPG
$ exiv2 -a +206312699 /tmp/DP1M0608.JPG
$ exiftime /tmp/DP1M0608.JPG
exiftime: field count mismatch (DateTime)
exiftime: field count mismatch (DateTimeOriginal)
exiftime: field count mismatch (DateTimeDigitized)
exiftime: field count mismatch (ImageUniqueID)
/tmp/DP1M0608.JPG: no timestamps available
$ exif /tmp/DP1M0608.JPG|grep -i date
Date and Time       |25548:01:17 21:27:01
Date and Time       |2012:01:02 10:27:01
Date and Time (Origi|25548:01:17 21:27:01
Date and Time (Digit|25548:01:17 21:27:01

manを確認すると,秒だけの指定は駄目でちゃんと計算して指定しないといけないようです.そして日またぎ以上は指定できないような感じです.これまではせいぜい数秒から数分しかずれなかったので気づきませんでした…….

       -a time
              Time  adjustment  in  the  format  [-]HH[:MM[:SS]]. This option is only used with the 'adjust' action. Examples: 1 adds one
              hour, 1:01 adds one hour and one minute, -0:00:30 subtracts 30 seconds.
 

計算するのが面倒なので差分を秒で指定できるツールはないだろうかと探してみると,exiftags packageのexiftimeが使えそうです.

              If val is numeric, one of either y, m, w, d, H, M, or S must be used to specify which part of the date is to be adjusted.
 

実際に試してみます.

念の為ファイルを/tmpにコピーして先ずはこれで試します.

$ cp -p ./DP1M0608.JPG /tmp/DP1M0608.JPG
$ exiftime /tmp/DP1M0608.JPG
exiftime: field count mismatch (ImageUniqueID)
Image Created: 2012:01:02 10:27:01
Image Generated: 2012:01:02 10:27:01
Image Digitized: 2012:01:02 10:27:01

-vでオフセットを指定します.今回は+206312699Sで206312699秒進めます.

$ exiftime -v +206312699S /tmp/DP1M0608.JPG
exiftime: field count mismatch (ImageUniqueID)
Image Created: 2018:07:17 07:32:00
Image Generated: 2018:07:17 07:32:00
Image Digitized: 2018:07:17 07:32:00

大丈夫そうです.
-vだけでは実際は書き換わりません-wで実際にexifを書き換えます.

$ exiftime -v +206312699S -w /tmp/DP1M0608.JPG
exiftime: field count mismatch (ImageUniqueID)
adjust time created in /tmp/DP1M0608.JPG from
  2012:01:02 10:27:01 to 2018:07:17 07:32:00? (y/n [n]) y
Image Created: 2012:01:02 10:27:01 -> 2018:07:17 07:32:00
adjust time generated in /tmp/DP1M0608.JPG from
  2012:01:02 10:27:01 to 2018:07:17 07:32:00? (y/n [n]) y
Image Generated: 2012:01:02 10:27:01 -> 2018:07:17 07:32:00
adjust time digitized in /tmp/DP1M0608.JPG from
  2012:01:02 10:27:01 to 2018:07:17 07:32:00? (y/n [n]) y
Image Digitized: 2012:01:02 10:27:01 -> 2018:07:17 07:32:00
$ exiftime /tmp/DP1M0608.JPG
exiftime: field count mismatch (ImageUniqueID)
Image Created: 2018:07:17 07:32:00
Image Generated: 2018:07:17 07:32:00
Image Digitized: 2018:07:17 07:32:00

exiftoolコマンドでファイルのタイムスタンプも修正します.

$ exiftool "-FileModifyDate<DateTimeOriginal" /tmp/DP1M0608.JPG
Warning: Bad PrintIM size - /tmp/DP1M0608.JPG
    1 image files updated
$ ls --full-time /tmp/DP1M0608.JPG
-rw-r--r-- 1 mk mk 9043186 2018-07-17 07:32:00.000000000 +0900 /tmp/DP1M0608.JPG

OKそうです.

本番のファイルを一気に書き換えてみます.
確認メッセージが出ないようexiftimeに-fオプションを付けています.

$ exiftime -v +206312699S -w -f ./*.JPG
./DP1M0537.JPG:
exiftime: field count mismatch (ImageUniqueID)
Image Created: 2012:01:01 08:46:51 -> 2018:07:16 05:51:50
Image Generated: 2012:01:01 08:46:51 -> 2018:07:16 05:51:50
Image Digitized: 2012:01:01 08:46:51 -> 2018:07:16 05:51:50
 
./DP1M0538.JPG:
exiftime: field count mismatch (ImageUniqueID)
Image Created: 2012:01:01 08:55:16 -> 2018:07:16 06:00:15
Image Generated: 2012:01:01 08:55:16 -> 2018:07:16 06:00:15
Image Digitized: 2012:01:01 08:55:16 -> 2018:07:16 06:00:15
 
   :
$ exiftime -v +206312699S -w -f ./*.X3F
   :

更に,gpscorrelateでジオタグを埋め込みます.

$ gpscorrelate -g ./2018-07-16鹿屋ポタ.gpx -z +9 -n *.JPG
$ gpscorrelate -g ./2018-07-16鹿屋ポタ.gpx -z +9 *.JPG

最後にファイルのタイムスタンプを修正します.

$ exiftool "-FileModifyDate<DateTimeOriginal" ./*

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

環境

$ dpkg-query -W exiv2 exiftags exif
exif    0.6.21-2
exiftags        1.01-6build1
exiv2   0.25-3.1ubuntu0.18.04.1
$ lsb_release -d
Description:    Ubuntu 18.04.1 LTS
$ uname -m
x86_64

Tails のUSBメモリが起動しなくなった

tails-installer を使って Tails の USB メモリを「Upgrade」したのですが,正常終了したのに起動しなくなりました.「Reinstall (delete all data)」を試しても駄目でした.

20180803_05:08:39-13917

wipefs を行いファイルシステムの情報を削除した後再度 tails-installer を試すとうまく行きました.

$ sudo wipefs -a /dev/sdz1
/dev/sdz1: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdz1: calling ioctl to re-read partition table: 成功です

Screenshot from 2018-08-01 10-54-43

原因は不明ですがとりあえず復旧できました.

  • 環境
$ dpkg-query -W tails-installer
tails-installer 5.0.8+dfsg-0ubuntu1~bionic
$ lsb_release -d
Description:    Ubuntu 18.04.1 LTS
$ uname -m
x86_64

HDDのS.M.A.R.Tから温度を取得して表示してくれるhddtemp

hddtempというコマンドを知りました.熱いし熱が気になる時期だしお手軽に温度を知れるのは良さそうと試してみました.

導入

$ sudo apt install hddtemp

help

$ hddtemp -h
 Usage: hddtemp [OPTIONS] [TYPE:]DISK1 [[TYPE:]DISK2]...
 
   hddtemp displays the temperature of drives supplied in argument.
   Drives must support S.M.A.R.T.
 
  TYPE could be SATA, PATA or SCSI. If omitted hddtemp will try to guess.
 
  -b   --drivebase   :  display database file content that allow hddtemp to
                        recognize supported drives.
  -D   --debug       :  display various S.M.A.R.T. fields and their values.
                        Useful to find a value that seems to match the
                        temperature and/or to send me a report.
                        (done for every drive supplied).
  -d   --daemon      :  run hddtemp in TCP/IP daemon mode (port 7634 by default.)
  -f   --file=FILE   :  specify database file to use.
  -F   --foreground  :  don't daemonize, stay in foreground.
  -l   --listen=addr :  listen on a specific interface (in TCP/IP daemon mode).
  -n   --numeric     :  print only the temperature.
  -p   --port=#      :  port to listen to (in TCP/IP daemon mode).
  -s   --separator=C :  separator to use between fields (in TCP/IP daemon mode).
  -S   --syslog=s    :  log temperature to syslog every s seconds.
  -u   --unit=[C|F]  :  force output temperature either in Celsius or Fahrenheit.
  -q   --quiet       :  do not check if the drive is supported.
  -v   --version     :  display hddtemp version number.
  -w   --wake-up     :  wake-up the drive if need.
  -4                 :  listen on IPv4 sockets only.
  -6                 :  listen on IPv6 sockets only.
 
Report bugs or new drives to <hddtemp@guzu.net>.
hddtemp version 0.3-beta15

デバイスを指定すると温度が取得できます./dev/sd[a-z]とか/dev/sd?とかも使えました.
/dev/sdd, /dev/sdeはS.M.A.R.Tを使えないUSBアダプタ経由で繋いでいるので取得できませんでした.

$ sudo hddtemp /dev/sda
/dev/sda: VB0250EAVER: 37°C
$ sudo hddtemp /dev/sda /dev/sdb
/dev/sda: VB0250EAVER: 38°C
/dev/sdb: Hitachi HDS5C3030ALA630: 39°C
$ sudo hddtemp /dev/sd?
/dev/sda: VB0250EAVER: 37°C
/dev/sdb: Hitachi HDS5C3030ALA630: 37°C
/dev/sdc: WDC WD30EZRX-00MMMB0: 40°C
/dev/sdd: WDC WD30EZRX-00DC0B0: S.M.A.R.T. not available
/dev/sde: TOSHIBA DT01ACA300: S.M.A.R.T. not available

デーモン化もできます.tcp 7634にアクセスると値が取得できます.

$ sudo hddtemp -d /dev/sda
$ nc localhost 7634
|/dev/sda|VB0250EAVER|37|C|

停止

$ pgrep hddtemp
11832
$ sudo kill 11832

複数デバイスも行けるけどそのままでは見にくいですね.

$ sudo hddtemp -d /dev/sd?
$ nc localhost 7634
|/dev/sda|VB0250EAVER|38|C||/dev/sdb|Hitachi HDS5C3030ALA630|39|C||/dev/sdc|WDC WD30EZRX-00MMMB0|41|C||/dev/sdd|WDC WD30EZRX-00DC0B0|NA|*||/dev/sde|TOSHIBA DT01ACA300|NA|*|
$ nc localhost 7634|sed -e 's/||/|\n|/g'
|/dev/sda|VB0250EAVER|37|C|
|/dev/sdb|Hitachi HDS5C3030ALA630|38|C|
|/dev/sdc|WDC WD30EZRX-00MMMB0|40|C|
|/dev/sdd|WDC WD30EZRX-00DC0B0|NA|*|
|/dev/sde|TOSHIBA DT01ACA300|NA|*|

S.M.A.R.Tの値を元にしているのでこのツールを使わず大抵の環境で入っているsmartctlでも良い気もします.

$ sudo smartctl -a /dev/sda|grep -i temp
190 Airflow_Temperature_Cel 0x0022   063   056   045    Old_age   Always       -       37 (Min/Max 31/43)
194 Temperature_Celsius     0x0022   037   044   000    Old_age   Always       -       37 (0 11 0 0 0)

環境

$ lsb_release -d
Description:    Ubuntu 16.04.4 LTS
$ uname -m
x86_64
$ dpkg-query -W hddtemp smartmontools
hddtemp 0.3-beta15-52
smartmontools   6.4+svn4214-1

コンソールでモダンなウェブが閲覧できる 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

Mailmanのban_listを画像にする

最近Mailmanにbotからであろう登録が沢山やってくるようになりました.登録メールアドレスは大抵メジャーなフリーメールアドレスで生きているようなのですが,quotaや転送量のエラーとなって帰ってきます.これらのエラーメールでメールボックスがあふれて辛いです.

Mailmanにcaptchaか何かを設置できるプラグインとか無いかなと探してみたのですが,公式ではないようです.sourceを修正してGoogleのReCaptchaを実装している人は居ますが,バージョンアップのたびにパッチするのは面倒です.最近もセキュリティホールが見つかっていますし放置するわけにも生きません.

該当メールを見ると幸いメールアドレスは使い回しでバリエーションは多くありません.とりあえずMailmanのban_listにこれらのメールアドレスを登録してmailqに溜まっている該当メールはdropしました.1週間くらいしたらリモートからのエラーメールも無くなって静かになると良いなと思っています.
ban_listに登録しましたが,もしかしたらbotではなく普通に登録しようとしてメールボックスがあふれている人も居るかもしれません.それが解るようにban_listを申し込みページに表示することにしました.そのまま表示するのは良くない気がするので画像にしてノイズを散らして波型変形をかけてみました.
Mailmanのconfig_listコマンドで設定を出力してban_listをファイルに書き出し,Imagemagickのconvertコマンドでノイズと波型変形のフィルタをかけて画像を生成しました.
こんな感じの画像になります.これを申し込みページに説明と一緒に載せます.(ノイズのせいで容量が大きく……)

image

cronに登録しました.

$ sudo -u list crontab -l|grep ban_list
39 * * * *      /usr/lib/mailman/bin/config_list -c -o /dev/stdout users|grep ^ban_list |sed -e 's/^.*\[\|\]\|'\''\|'\ '//g'|sed -e 's/\@/ at /g'|tr -s ',' '\n' | sort -n > /var/lib/mailman/lists/users/ban_list && convert -size 1024x600 -background '#FFFFFF' -density 36 -gravity Center -fill black -font SetoFont label:"users ban_list `stat -c \%y /var/lib/mailman/lists/users/ban_list|cut -f1 -d.`\n\n`cat /var/lib/mailman/lists/users/ban_list`" -attenuate 5 -noise 7 +noise Gaussian -wave 15x`expr \( 100 + $((RANDOM \% 100)) \)` /var/lib/mailman/archives/public/users/ban_list.jpg

……長いですね.それに画像サイズ固定なのでlistが増えると文字サイズが小さくなってしまいます.てことでscriptに.

#!/bin/sh
 
LISTNAME='users'
FONT='SetoFont'
BANLIST='/var/lib/mailman/lists/users/ban_list'
IMAGE='/var/lib/mailman/archives/public/users/ban_list.jpg'
 
# ban_listを抽出してファイルに書き出し
/usr/lib/mailman/bin/config_list -c -o /dev/stdout ${LISTNAME} | grep ^ban_list | sed -e 's/^.*\[\|\]\|'\''\|'\ '//g' | sed -e 's/\@/ at /g' | tr -s ',' '\n' | sort -n > ${BANLIST}
 
# ban_listの行数によって画像高さを計算
BANWC=`wc -l ${BANLIST} | cut -d\  -f1`
HIGHT=`expr \( ${BANWC} \* 60 + 120 \)`
 
# 画像に書き出す文字列を作成
LABEL="users ban_list `stat -c \%y ${BANLIST} | cut -f1 -d.`\n\n`cat ${BANLIST}`"
 
# 波型変形の波の深さを計算
WAVEX=`expr \( 10 + $((RANDOM % 10)) \)`
WAVEY=`expr \( 100 + $((RANDOM % 100)) \)`
 
# 画像作成
convert -size 1024x${HIGHT} -background '#FFFFFF' -density 36 -gravity Center -fill black -font ${FONT} label:"${LABEL}" -attenuate 5 -noise 7 +noise Gaussian -wave ${WAVWX}x${WAVEY} ${IMAGE}
 

てことでとりあえずの対処療法ですが…….

環境

$ lsb_release -d
Description:    Debian GNU/Linux 9.4 (stretch)
$ uname -m
x86_64
$ dpkg-query -W mailman
mailman 1:2.1.23-1+deb9u2
$ dpkg-query -W imagemagick
imagemagick     8:6.9.7.4+dfsg-11+deb9u4

マルチUSB書き込みツールのPopsicle

USBメモリなどにOSイメージなどを書き込む時GUIだとEtcherやUNetBootinなどのツールを使ったりしますが,同時に複数の媒体への書き込みに対応していません.同時に書き込みたい場合私はteeコマンドとddコマンドを利用したりしていましたが,PodsicleというツールがGUI/CUIで同時書き込みに対応しているようなので試してみました.Rust製MITライセンスです.

導入

$ git clone https://github.com/pop-os/popsicle
$ cd popsicle
$ make
$ sudo make install

make installだとGUT/CUIの療法が導入されます.make install-gtkだとGTK(GUI)のみ,make install-cliだとCLIのみです.

GUI利用

popsicle-gtkを起動すると書き込みイメージの選択画面になります.ここでイメージを指定すると読み込みチェックが走りしばらく待たされます.(CUIではチェックしないことも出来る)
20180708_08:07:50-31395

次に書き込み先のデバイス選択です.書き込みたいデバイスをチェックします.この画面になってからUSBメモリの抜き差しをしても反映されるので便利です.ちなみに内蔵SD cardの/dev/mmcblk0`はここにはでてきませんでした(CUIでは利用できます).
#SD-USB変換でUSB経由だとSD card書き込み可能です.

20180708_09:07:39-21924

書き込み中画面です.複数デバイスの場合はそれぞれプログレスが表示されます.

20180708_09:07:54-30224

書き込み完了.

20180708_09:07:17-32223

CUI利用

CUIはpopsicleコマンドです.

$ popsicle -h
popsicle_cli 0.1.5
USB Flasher
 
USAGE:
    popsicle [FLAGS] <IMAGE> [DISKS]...
 
FLAGS:
    -a, --all        Flash all detected USB drives
    -c, --check      Check written image matches read image
    -h, --help       Prints help information
    -u, --unmount    Unmount mounted devices
    -V, --version    Prints version information
    -y, --yes        Continue without confirmation
 
ARGS:
    <IMAGE>       Input image file
    <DISKS>...    Output disk devices

イメージファイルと書き込み先のデバイスを指定して実行すると書き込めます.GUIでは/dev/mmcblk0は出てきませんでしたが,CUIでは書き込めました.

$ sudo popsicle ~/Downloads/2018-06-27-raspbian-stretch.img /dev/sdc /dev/sdd /dev/mmcblk0

ちなみにddで書き込む時は圧縮イメージファイルを展開しながら書き込むことが多い(zcat image.gz|pv|sudo dd of=/dev/sdz bs=4M)のですが,そういったことは出来なさそうです.

$ zcat ~/Downloads/2018-06-27-raspbian-stretch.zip | popsicle -u - /dev/mmcblk0 
popsicle: error with image at '-': image could not be opened: No such file or directory (os error 2)
$ zcat ~/Downloads/2018-06-27-raspbian-stretch.zip | popsicle -u /dev/stdin /dev/mmcblk0 
popsicle: error with image at '/dev/stdin': image was not a file
$ mkfifo zip.img
$ zcat ~/Downloads/2018-06-27-raspbian-stretch.zip > ./zip.img  &
$ sudo popsicle ./zip.img /dev/mmcblk0
popsicle: error with image at './zip.img': image was not a file

関連

端末上で遊べる障害物避けゲームのascii runner

端末上で遊ぶ障害物をスペースバーでジャンプして避けるゲーム.自キャラの4本足の生き物の動きがコミカルです.でも案外難しい.
macOS/Linux のamd64 だったらバイナリやパッケージがあるのでそれを使うのが良いです.
buildする場合はこんな感じで(結構時間掛かった)

$ sudo apt install haskell-stack $ git clone https://github.com/smallhadroncollider/ascii-runner $ cd ascii-runner $ stack build $ stack install $ runner 

端末での操作をSVG形式で記録する termtosvg

ttyrec/playみたいに端末操作を録画出来るアプリケーション.再生はウェブブラウザなどでできます.

導入はpipで

$ pip3 install termtosvg
$ termtosvg -h
usage: termtosvg [output_file] [--font FONT] [--theme THEME] [--help] [--verbose]
Record a terminal session and render an SVG animation on the fly

positional arguments:
  output_file    optional filename of the SVG animation; if missing, a random
                 filename will be automatically generated

optional arguments:
  -h, --help     show this help message and exit
  --font FONT    font to specify in the CSS portion of the SVG animation
                 (DejaVu Sans Mono, Monaco...). If the font is not installed
                 on the viewer's machine, the browser will display a default
                 monospaced font instead.
  --theme THEME  color theme used to render the terminal session (circus,
                 classic-dark, classic-light, dracula, isotope, marrakesh,
                 material, monokai, solarized-dark, solarized-light, zenburn)
  -v, --verbose  increase log messages verbosity

See also 'termtosvg record --help' and 'termtosvg render --help'

導入後実行するとそのまま端末に戻ってexitするまでの操作を記録してくれる.exitするとSVGを書き出してそのファイル名を教えてくれる.

mk@T430s:~ (551)$ termtosvg
Recording started, enter "exit" command or Control-D to end
mk@T430s:~ (554)$ cowsay -f duck "hello termtosvg!"
 __________________
< hello termtosvg! >
 ------------------
 \
  \
   \ >()_
      (__)__ _
mk@T430s:~ (555)$ cowsay -f duck "hello termtosvg!"|lolcat
 __________________
< hello termtosvg! >
 ------------------
 \
  \
   \ >()_
      (__)__ _
mk@T430s:~ (556)$ exit
Recording ended, SVG animation is /tmp/termtosvg_vpd7hh0z.svg

出来上がったファイルはSVGなので中を見てコピペとか出来なくはない.

$ xmllint --format /tmp/termtosvg_vpd7hh0z.svg|head
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="full" height="408" version="1.1" width="640">
  <defs>
    <style type="text/css"><![CDATA[* {font-family: "DejaVu Sans Mono", monospace; font-style: normal; font-size: 14px}
text {dominant-baseline: text-before-edge}
.bold {font-weight: bold}
.background {fill: #002b36}]]></style>
    <g id="1">
      <text fill="#93a1a1" lengthAdjust="spacingAndGlyphs" textLength="144" x="0">mk@T430s:~ (554)$ </text>
      <text fill="#002b36" lengthAdjust="spacingAndGlyphs" textLength="8" x="144"> </text>

以下にexampleがある

サーバにアップロードして共有だとasciinemaが便利だけどこれはこれでファイル一個なので便利そうです.
Python製でライセンスはBSD 3-Clause Licenseです.