mono製InlineHtmlImagesでhtml+画像の複数ファイルを単一の画像埋め込みhtmlに変換する

npm の html-inline を試しましたが途中でコケてしまいます.

mono製の InlineHtmlImages を試すとうまくいきました :)

画像作成
$ convert pango:"<span font=\"/Library/Fonts/NotoColorEmoji\" size=\"24576\">😺</span>" cat.jpg
html作成
$ cat << __EOF__ > cat.html
> <html>
> <body>
> <img src="cat.jpg">
> </body>
> </html>
> __EOF__
画像埋め込み
$ mono ~/Downloads/inlinehtmlimages-mono.exe -in ./cat.html -out ./cat_inline.html
埋め込まれているのを確認
$ cat cat_inline.html
<html>
<body>
<img src="data:image/png;base64,
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAmACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1jV/EEllqzWqSpEEUH5o9wYkZ554qS38TMSUktvNcDh4D8uffPT8zWX4p0xptegkwRFNH8x916/piokurKK5WxSeBZwuRBvG7HrjrXx+Kx+MoYqpGMtE9t9D2I0aEqMXbVo1P+EubZ5n2D5PM8v8A13Of++aluPErAhIrfymIyWnPH4Y6/mKwvsB8gR+YOJvMzj36U97qymuGsGnhacrkw7xvx6461zrOMbJNKX4L/IuWGw6asvzNbR/EEl7qotWlSUMpOVj27SPTnmiqHhXTWh1y4kPMcUeFPqW6foDRX0eT1KtTDKdV3bb+44MdGEKtqfZE3ifWbC01a2gurgQMsTcyqVQ5K9GI2np2NcUvhJp/GK6/Hfxvas4mAXlicYwD0x/Tiuv8aR3E06Q219dvcld0Vja2ysxHQszsCFH1wOK871K58QaJDBe2NpHdxhNlxZyZYoQThgU2noeQO46Vw46hUhipSpyUXUVtdtvTTY1oNTpK6b5ex0Qudd/4TQ2P2i3/ALO8vz8bPm2dNvrnP+e1Uh4SNt4xfX5b9FtQ5mKtwwJGME9Mc/0rHbxlqAt/tY8LWf2jZt/4/wBy+OuNuc/hmpdLn1/V7W5vb+2jtxKgS3s4wVz8wJY79xzxgZ/SuSWGq4ePMpxSa5Xbrf5fidDjzNKUJX3V1Y9J8L6zYXeqXUFrcCcmNDuiUsgwWzlgNo6jvRUPgyO4hlkguL66W5C7prG6tkRlHRWV1ADD3GRzRX0WAoeww8ab6f538jy68+eo2drWTf6BZag5kZWilPWSM4J+o6GiiuirRp1Y8tRXREKkqbvB2Zl/8IXF5m77Yf8Av0M/nmtWw0Gy09xIitJKOkkhyR9OwoornpZfhqUuaENfv/M2ni61RWlLQ1aKKK7DnP/Z" alt='cat.jpg' >
</body>
</html>
画像ファイルを削除しておく
$ rm ./cat.jpg
ウェブブラウザで確認
$ xdg-open ./cat_inline.html

20190811 02 08 14 32387

他にもLinuxネイテイブなものがありそうな気がします.(shell script + base64 コマンドでも多分行ける?)

環境
$ mono ~/Downloads/inlinehtmlimages-mono.exe -help|head -6|uniq

InlineHtmlImages v1.7
 Build:  3/31/2018
 Author: Dennis Lang
 Web:    home.comcast.net/~lang.dennis
$ dpkg-query -W mono-runtime chromium imagemagick libpango-1.0-0
chromium        76.0.3809.100-1
imagemagick     8:6.9.10.23+dfsg-2.1
libpango-1.0-0:amd64    1.42.4-7
libpango-1.0-0:i386     1.42.4-7
mono-runtime    5.18.0.240+dfsg-3
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

電源管理ソフトウェアTLP のGUI なTLPUI を試す

暑くなってきました.明け方でも室内で30度とかに.メインPCのウェブブラウザを開きっぱなしにしていたりたまにElectronなアプリが暴走してるとCPU温度が酷いことに.

$ acpi -t
Thermal 0: ok, 101.0 degrees C

この状態で放置しているとCritical温度に達して勝手に再起動してしまったりします.(現在の設定は105℃)

$ sensors coretemp-*
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +78.0°C  (high = +87.0°C, crit = +105.0°C)
Core 0:        +78.0°C  (high = +87.0°C, crit = +105.0°C)
Core 1:        +78.0°C  (high = +87.0°C, crit = +105.0°C)

Operaのバッテリーセーバーを使うと改善されないだろうかと試してみましたがあまり変わらないような感じ?

Linuxの電源管理を行うTLPというものがあります.NotePCなどで便利です.
これ経由でCPU のgovernor をpowersave に変えて発熱量を下げてみます.

TLPは基本的に設定ファイルを編集して設定します.設定ファイルの場所を Debian sid amd64/Ubuntu 19.10 amd64 で確認すると /etc/default/tlp です.

$ man tlp | grep FILES -A3
FILES
       /etc/default/tlp
              System-wide configuration file containing all power saving settings.

先ず,tlp を未導入の場合は導入

$ sudo apt install tlp tlp-rdw

Thinkpad の場合はこの辺りのKernel module も入れておきましょう.これは両方ともバッテリーのものでSandy Bridge 以降では acpi-call-dkms を,それより前では tp-smapi-dkms を導入します.よくわからない場合は両方を入れても大丈夫そうです.

Sandy Bridge 以降向け

$ sudo apt install acpi-call-dkms

Sandy Bridge より前向け

$ sudo apt install tp-smapi-dkms

/etc/default/tlp の以下の辺りでAC電源とバッテリー電源時の療法を powersave に変えます.

CPU_SCALING_GOVERNOR_ON_AC=powersave
CPU_SCALING_GOVERNOR_ON_BAT=powersave

tlp start で反映させます.

$ sudo tlp start
TLP started in AC mode.

とりあえずこれで暫く試すと70℃くらいで安定しています.
cpufreq で温度によってgovernor を変化させるともっとCPUを使うことも可能です.
( /etc/cpufreqd.confCPU Too hot! 辺り )

とりあえずこれでOKなのですが,GUI のツール無いかなと探してみると TLPUI というものを見つけたので試してみました.

TLPUI の関連パッケージを導入します.

$ sudo apt install python3-gi git python3-setuptools python3-stdeb

アドホックにインストールせず実行,

$ git clone https://github.com/d4nj1/TLPUI
$ cd TLPUI
$ python3 -m ./tlpui

若しくはTLPUI のsource を入手してpkg を作成してインストールして実行します.

$ git clone https://github.com/d4nj1/TLPUI
$ cd TLPUI
$ python3 setup.py --command-packages=stdeb.command bdist_deb
$ sudo dpkg -i ./deb_dist/python3-tlpui_0.1-1_all.deb
$ which tlpui
/usr/bin/tlpui
$ tlpui

20190808 17 08 04 20549
20190808 17 08 08 20640

一般ユーザで実行すると裏の端末で設定反映時に認証が走るのですが,認証に成功しても設定ファイルの書き換えがうまく行きませんでした.

20190808 17 08 12 20759

sudo で実行すると問題無さそうです.

$ sudo tlpui

Software still in Beta status ということで未だβですがお手軽で便利そうです.
でもβなので設定ファイルのバックアップは取っておいたほうが良さそうです.

試した環境1(Debian sid amd64)
$ git show|head -1
commit 372463ba033df12dfa5c6c918f0b65c148f1ffac
$ dpkg-query -W acpi lm-sensors tlp tlp-rdw acpi-call-dkms python3-gi git python3-setuptools python3-stdeb python3-all
acpi    1.7-1.1
acpi-call-dkms
git     1:2.23.0~rc1-1
lm-sensors      1:3.5.0-3
python3-all     3.7.3-1
python3-gi      3.32.2-1
python3-setuptools      41.0.1-1
python3-stdeb   0.8.5-3
tlp     1.2.2-1
tlp-rdw 1.2.2-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
試した環境2(Ubuntu 19.10 development amd64)
$ git show|head -1
commit 372463ba033df12dfa5c6c918f0b65c148f1ffac
$ dpkg-query -W acpi lm-sensors tlp tlp-rdw tp-smapi-dkms python3-gi git python3-setuptools python3-stdeb python3-all
acpi    1.7-1.1
git     1:2.20.1-2ubuntu1
lm-sensors      1:3.5.0-3ubuntu1
python3-all     3.7.3-1
python3-gi      3.32.0-1
python3-setuptools      41.0.1-1
python3-stdeb   0.8.5-3
tlp     1.2.2-1
tlp-rdw 1.2.2-1
tp-smapi-dkms   0.43-1
$ lsb_release -dr
Description:    Ubuntu Eoan Ermine (development branch)
Release:        19.10
$ uname -m
x86_64

Ubuntu 19.10 の initramfs-tools から dm-crypt 領域が見つからずエラーとなる

Ubuntu 19.10 amd64 環境でapt upgrade でエラーになります.
新しいKernel が降りてきてinitramfs のところでdm-crypy 領域が見つからない感じのようです.

initramfs-tools (0.133ubuntu9) のトリガを処理しています ...
update-initramfs: Generating /boot/initrd.img-5.2.0-8-generic
cryptsetup: ERROR: Couldn't resolve device
  /dev/disk/by-uuid/805938be-2c29-4a53-9ed2-36fb233d76ea
cryptsetup: ERROR: Couldn't resolve device
  UUID=31145c5b-93fc-4fe0-9e46-3a68bfcadeae
W: initramfs-tools configuration sets RESUME=UUID=31145c5b-93fc-4fe0-9e46-3a68bfcadeae
W: but no matching swap device is available.
処理中にエラーが発生しました:

エラーメッセージで検索すると以下のページを発見.

The problem is that cryptsetup is not supported in the /etc/initramfs-tools/initramfs.conf configuration anymore.

The new location for loading dm-crypt during boot is /etc/cryptsetup-initramfs/conf-hook

CRYPTSETUP=y

you’ll see it in the conf-hook file commented out, just set it as above and it will work again.

If you build a system with encryption, I believe this gets changed at some point, but the live builds are systems that are not built like this, and there isn’t a lot to go on to direct you to make this change.

When you set that and re-make your iso image, you’ll be able to do encrypted persistence again. Worked for me on latest Kali January 2019. :-)

なるほど,この環境はいつも development branch にしているのでこの問題に当たったようですね.

/etc/cryptsetup-initramfs/conf-hookCRYPTSETUP=y と編集して,

$ sudo vi /etc/cryptsetup-initramfs/conf-hook
$ sudo git diff HEAD /etc/cryptsetup-initramfs/conf-hook
diff --git a/cryptsetup-initramfs/conf-hook b/cryptsetup-initramfs/conf-hook
index 8a6a474..fdd7920 100644
--- a/cryptsetup-initramfs/conf-hook
+++ b/cryptsetup-initramfs/conf-hook
@@ -15,7 +15,7 @@
 # cryptsetup initramfs integration.
 #

-#CRYPTSETUP=
+CRYPTSETUP=y

 #
 # KEYFILE_PATTERN: ...

apt でfix-broken を掛けると正常にinitramfs が通り,再起動して新しいkernal で起動しました :)

$ sudo apt install -f
環境
$ dpkg-query -W cryptsetup* initramfs-tools*
cryptsetup      2:2.1.0-5ubuntu2
cryptsetup-bin  2:2.1.0-5ubuntu2
cryptsetup-initramfs    2:2.1.0-5ubuntu2
cryptsetup-run  2:2.1.0-5ubuntu2
initramfs-tools 0.133ubuntu9
initramfs-tools-bin     0.133ubuntu9
initramfs-tools-core    0.133ubuntu9
$ lsb_release -dr
Description:    Ubuntu Eoan Ermine (development branch)
Release:        19.10
$ uname -m
x86_64

sshuttle がエラーになる

SSH VPN がお手軽に利用できる sshuttle を久々に使おうとしたら失敗します.いくつかのremotehostを試してもうまくいかない.

Debian sid 環境でのエラー

$ sshuttle -v -r user@remotehost 0/0
Starting sshuttle proxy.
firewall manager: Starting firewall with Python version 3.7.4
firewall manager: ready method name nat.
IPv6 enabled: False
UDP enabled: False
DNS enabled: False
User enabled: False
TCP redirector listening on ('127.0.0.1', 12300).
Starting client with Python version 3.7.4
c : connecting to server...
Host key fingerprint is SHA256:kUoWT4bCu7+HiegN9R5tYqO5nnvpQPobzSk46T8WEwU
+---[ECDSA 256]---+
|   .E...o        |
|    o o= .       |
|     +o +        |
|    oo . .       |
|    oo. S        |
|   *++ o         |
|  *.+=X+o        |
| ..=+X*=.        |
| .o+%B+o         |
+----[SHA256]-----+
Enter passphrase for key '/home/matoken/.ssh/id_ed25519':
Authenticated to nnn.nnn.nnn.nnn ([nnn.nnn.nnn.nnn]:nn).
-c:3: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
Starting server with Python version 3.7.3
 s: latency control setting = True
c : Connected.
 s: auto-nets:False
firewall manager: setting up.
>> iptables -t nat -N sshuttle-12300
>> iptables -t nat -F sshuttle-12300
>> iptables -t nat -I OUTPUT 1 -j sshuttle-12300
>> iptables -t nat -I PREROUTING 1 -j sshuttle-12300
>> iptables -t nat -A sshuttle-12300 -j RETURN --dest 127.0.0.1/32 -p tcp
>> iptables -t nat -A sshuttle-12300 -j REDIRECT --dest 0.0.0.0/0 -p tcp --to-ports 12300 -m ttl ! --ttl 42
firewall manager: undoing changes.
>> iptables -t nat -D OUTPUT -j sshuttle-12300
>> iptables -t nat -D PREROUTING -j sshuttle-12300
>> iptables -t nat -F sshuttle-12300
>> iptables -t nat -X sshuttle-12300
c : fatal: server died with error code 255

最後の行のエラーメッセージで検索すると以下のIssue を見つけました.

参考にして -x remotehostip で使えるようになりました.-x は除外オプションで接続先のip を指定して除外するとOKのようです.

  • NG $ sshuttle -r user@remotehost 0/0

  • OK $ sshuttle -r user@remotehost 0/0 -x remotehostip

VPN 対象のサブネットと同様 -x にも複数のサブネット/ip の指定ができます.

Debian sid 環境
$ dpkg-query -W sshuttle
sshuttle        0.78.5-1
$ hostnamectl|grep -E 'Operating System|Architecture'
  Operating System: Debian GNU/Linux bullseye/sid
	  Architecture: x86-64

Raspbian Buster 環境でのエラー

ちなみに sshuttle を Raspbian Buster で試すとまた違うこんなエラーに.でもやっぱり -x で解決しました.

Raspbian Buster での error message
 :
client: Connected.
packet_write_wait: Connection to 192.168.1.102 port 22: Broken pipe
Traceback (most recent call last):
  File "/usr/bin/sshuttle", line 11, in <module>
	load_entry_point('sshuttle==0.78.5', 'console_scripts', 'sshuttle')()
  File "/usr/lib/python3/dist-packages/sshuttle/cmdline.py", line 82, in main
	opt.sudo_pythonpath)
  File "/usr/lib/python3/dist-packages/sshuttle/client.py", line 787, in main
	seed_hosts, auto_hosts, auto_nets, daemon, to_nameserver)
  File "/usr/lib/python3/dist-packages/sshuttle/client.py", line 547, in _main
	ssnet.runonce(handlers, mux)
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 598, in runonce
	h.callback(s)
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 488, in callback
	self.flush()
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 439, in flush
	wrote = _nb_clean(os.write, self.wsock.fileno(), self.outbuf[0])
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 79, in _nb_clean
	return func(*args)
BrokenPipeError: [Errno 32] Broken pipe
Raspbian Buster の環境
$ dpkg-query -W sshuttle
sshuttle        0.78.5-1
$ lsb_release -d
Description:    Raspbian GNU/Linux 10 (buster)
$ uname -m
armv6l
$ cat /proc/device-tree/model ;echo
Raspberry Pi Model B Rev 2

Ubuntu 18.04 LTS 環境(OK)

Ubuntu 18.04 LTS のsshuttle でも試してみましたがこれは -x を付けなくても問題なしでした.sshuttle 0.78.4 〜 0.78.5 の間の修正での影響でしょうか?

error の出なかった環境
$ dpkg-query -W sshuttle
sshuttle        0.78.3-1ubuntu1
$ lsb_release -d
Description:    Ubuntu 18.04.2 LTS
$ uname -m
x86_64

Firefox のマウス,タッチパッド等でのズーム機能を無効にする

精度の悪いタッチパッドを使っていると2本指でスクロールしたつもりが拡大,縮小になってしまうことがあります.スクロールのつもりなので操作量も多く一気に拡大されたり縮小されたり…….

Firefox でこの機能を無効にしてみました.
以下の手順ではポインティングデバイスでのズーム機能は無効化されますが,キーボード・ショートカットでのズームは利用できます.

about:config で設定(GUI)

Firefox のアドレスバーに about:config を入力して開き, zoom.maxPercent, zoom.minPercent をそれぞれ 100 に書き換える.
この手順の場合即時反映される.

20190710 22 21 33 001

設定ファイルで設定

Firefox の対象のプロファイルのあるディクトリに user.js ファイルを作成し起動すると反映される.

プロファイルのあるディレクトリは ~/.mozilla/firefox/profiles.ini を確認する.
以下の例では,~/.mozilla/firefox/4dx27pta.default/ になる.

~/.mozilla/firefox/profiles.ini
[Install4F96D1932A9F858E]
Default=4dx27pta.default

[Profile0]
Name=default
IsRelative=1
Path=4dx27pta.default
Default=1

[General]
StartWithLastProfile=1
Version=2

user.js を以下の内容で作成する.既に存在する場合は追記する.

~/.mozilla/firefox/4dx27pta.default/user.js
user_pref("zoom.maxPercent", 100);
user_pref("zoom.minPercent", 100);

環境

$ dpkg-query -W firefox
firefox 68.0+build3-0ubuntu0.18.04.1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu 18.04.2 LTS
      Architecture: arm64

apt-cacher-ng で https リポジトリを直接アクセスするようにする

apt-cacher-ng で各種リポジトリをキャッシュしているのですが,https の場合エラーになってしまいます.

error message
$ sudo apt update
Err:1 https://updates.signal.org/desktop/apt xenial InRelease              Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]                                                      Err:2 https://deb.opera.com/opera-stable stable InRelease
  Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]
 :
W: Failed to fetch https://deb.opera.com/opera-stable/dists/stable/InRelease  Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]
W: Failed to fetch https://updates.signal.org/desktop/apt/dists/xenial/InRelease  Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]
W: Some index files failed to download. They have been ignored, or old ones used instead.

Debian wiki に解決方法が載っていました.https の場合はキャッシュせずに直接見に行かせる設定が出来るようです.

HTTPS repositories
apt-cacher-ng will obviously fail to serve HTTPS repositories. There are many solutions upstream but I have found the simplest solution to be to simply tunnel HTTPS connections directly on the proxy, by putting this in /etc/apt-cacher-ng/acng.conf:

PassThroughPattern: .*

This is, as far as I can tell, the only way to avoid doing a special configuration on the clients for HTTPS repositories. The downside is that HTTPS content is not cached.

/etc/apt-cacher-ng/acng.confPassThroughPattern: .* を設定してデーモンを再起動することで直接アクセスしてエラーを出さなくなりました.

以下のページのように source.list を書き換えてhttps であってもキャッシュする方法もあるようですが今回はなしで.

apt-cacher-ng環境
$ dpkg-query -W apt-cacher-ng
apt-cacher-ng   3.1-1build1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu 18.04.2 LTS
      Architecture: x86-64
apt実行環境
$ dpkg-query -W apt
apt     1.8.2
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux bullseye/sid
      Architecture: x86-64

Linux でDiscord のchat log をbackup する

先日Discord のtext chat で勉強会をしてみました.ログはいつまで残るのかよくわからないし保存できないかなと探してみると DiscordChatExporter というものを見つけました.

早速DL してみると.exe のようです.GUI版,Cli版があるのでどちらかがWine で動かないかな?と試してみるとmono ライブラリを求められました.てことはmono があれば動くのでは?と試したら動きました.てか,GitHub のWiki ページにWindows, macOS, Linux各種環境での使い方も載っていました.

(Wine とmono どちらでも動くけど,圧倒的にmono のほうが軽かったのでmono で動かしましょう)

導入方法はここに載っています.このページのDebian 9 の例ではmono のリポジトリを追加していますが,Debian sid 環境ではパッケージ版のままで動きました.

Debian sid amd64でのmonoの導入
$ sudo apt install mono-devel

release ページから最新版を入手.今回はCli版の最新の2.14を入手した.

DiscordChatExporter.CLI の入手と展開
$ wget https://github.com/Tyrrrz/DiscordChatExporter/releases/download/2.14/DiscordChatExporter.CLI.zip
$ unzip -l DiscordChatExporter.CLI.zip
$ mkdir DiscordChatExporter.CLI
$ cd DiscordChatExporter.CLI
$ unzip ../DiscordChatExporter.CLI.zip
usage
$ mono ./DiscordChatExporter.Cli.exe
DiscordChatExporter 2.14
Copyright (c) Alexey Golub
ERROR(S):
No verb selected.

  export         Export channel.

  exportdm       Export all direct message channels.

  exportguild    Export all channels within a given guild.

  channels       Get the list of channels in the given guild.

  dm             Get the list of direct message channels.

  guilds         Get the list of accessible guilds.

  help           Display more information on a specific command.

  version        Display version information.

# To get user token:
 1. Open Discord
 2. Press Ctrl+Shift+I to show developer tools
 3. Navigate to the Application tab
 4. Select "Local Storage" > "https://discordapp.com" on the left
 5. Press Ctrl+R to reload
 6. Find "token" at the bottom and copy the value

# To get bot token:
 1. Go to Discord developer portal
 2. Open your application's settings
 3. Navigate to the Bot section on the left
 4. Under Token click Copy

# To get guild ID or guild channel ID:
 1. Open Discord
 2. Open Settings
 3. Go to Appearance section
 4. Enable Developer Mode
 5. Right click on the desired guild or channel and click Copy ID

# To get direct message channel ID:
 1. Open Discord
 2. Open the desired direct message channel
 3. Press Ctrl+Shift+I to show developer tools
 4. Navigate to the Console tab
 5. Type "window.location.href" and press Enter
 6. Copy the first long sequence of numbers inside the URL

次はトークンとチャンネルIDを入手します.手順は以下のページを参考に.

トークンの入手
  • Discord のDesktop版を開いた状態で,「Ctrl+Shift+I」を押しデベロッパーツールを表示する.

  • Application tab に移動する.

  • Ctrl+R を押して再読込を行う

  • 「Storage」の「Local Storage」から「https://discordapp.com」を選択.

  • 「token」を探してその値をコピーする.

※Discord Web版でもChrome系なら同じ手順でOK
(多分この方法はお行儀が悪い方法.なのでbot のtoken を使う手順のほうがいい.でもうまく行かない?)

20190718 20 07 11 2325

次に,チャンネルID を入手します.

チャンネルID の入手
  • Discordアプリのユーザー設定を開く.

  • 「テーマ」タブから詳細設定の「開発者モード」をOn に移動する.

  • 設定画面を閉じて,入手したいチャンネルで右クリックを押し「IDをコピー」で入手する.

※Discord Web版の場合は,該当チャンネルを開いたときのURLの最後の部分.

20190718 20 07 49 1205
20190718 20 07 17 1824

入手したトークンとチャンネルIDで書き出しを試します.
以下の例では,
トークンが,MzU0NTM6MEg5NDAzNjQ2OTU0.XEhoGd.9h5f9dguNp-xSqbIwa8mNL1DU4D`で,チャンネルIDが`999999999999999999 だったときの例です.

$ mono ./DiscordChatExporter.Cli.exe export -t 'MzU0NTM6MEg5NDAzNjQ2OTU0.XEhoGd.9h5f9dguNp-xSqbIwa8mNL1DU4D' -c '999999999999999999'
Exporting channel [999999999999999999]... 23.8 %
                                          44.3 %
                                          64.5 %
                                          90.0 %
                                          100.0 %
                                          Completed ✓

うまく行けば.html ファイルが書き出されます.
ただし,このhtml ファイルには画像が含まれていません.一旦ウェブブラウザで開いて保存すると画像も保存できるのでアーカイブに使うはそうしておいたほうが良さそうです.

環境
$ dpkg-query -W mono-devel wine chromium discord
chromium        76.0.3809.62-1
discord 0.0.9
mono-devel      5.18.0.240+dfsg-3
wine    4.0-2
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux bullseye/sid
      Architecture: x86-64

Debian 10 Buster testing をリリース後に apt update するとエラーになる

2019-07-06 に Debian Buster 10 がリリースされました.

Debian 10 Buster testing 環境でリリース後に apt update をするとエラーになってしまいます.

$ sudo apt update
Get:1 http://security.debian.org/debian-security buster/updates InRelease [39.1 kB]
Get:2 http://deb.debian.org/debian buster InRelease [118 kB]
N: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Version' value from '' to '10'
E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'testing' to 'stable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Do you want to accept these changes and continue updating from this repository? [y/N]
N: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Version' value from '' to '10.0'
E: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'stable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Do you want to accept these changes and continue updating from this repository? [y/N]
Reading package lists... Done
E: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease
E: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease
E: Some index files failed to download. They have been ignored, or old ones used instead.

--allow-releaseinfo-change を指定してAPT にリリースを情報を確認したことを教えます.

$ sudo apt --allow-releaseinfo-change update

次からはオプション無しで実行してもエラーが出なくなります.

$ sudo apt update
Hit:1 http://deb.debian.org/debian buster InRelease
Hit:2 http://security.debian.org/debian-security buster/updates InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
3 packages can be upgraded. Run 'apt list --upgradable' to see them.

ちなみに stable でなく testing 環境を使い続けたい場合は /etc/apt/sources.list を現在の Debian testing の bullseye に修正すればいいはず.

環境
$ dpkg-query -W apt
apt     1.8.2
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux 10 (buster)
      Architecture: x86-64

physlock で Linux をロックする

Debian で vlock を検索したときに一緒に出てくる physlock というものが気になったので試してみました.

$ apt-cache search vlock
physlock - lightweight Linux console locking tool
vlock - Virtual Console locking program
$ apt show physlock
Package: physlock
Version: 13-1
Priority: optional
Section: utils
Maintainer: Michael Prokop <mika@debian.org>
Installed-Size: 42.0 kB
Depends: libc6 (>= 2.14), libpam0g (>= 0.99.7.1), libsystemd0
Homepage: https://github.com/muennich/physlock
Download-Size: 11.6 kB
APT-Manual-Installed: yes
APT-Sources: http://ftp.jp.debian.org/debian sid/main amd64 Packages
Description: lightweight Linux console locking tool
 physlock is an alternative to vlock, it is equivalent to
 `vlock -an'. It is written because vlock blocks some Linux
 kernel mechanisms like hibernate and suspend and can therefore
 only be used with some limitations. physlock is designed to be
 more lightweight and it does not have a plugin interface.

N: There is 1 additional record. Please use the '-a' switch to see it

vlock だとコンソール全部ロックは出来るけど仮想コンソール全部ロックとかは出来ないのですが,physlock はX の端末で起動してもX も使えなくなるし,console への移動も出来ないです.
-s で sysrq の無効化も出来て,-m でkernel message の抑制も出来ます.(何らかの理由でphyslock を解除できないって場合はsshdが起動していればリモートログインは出来るのでkillすればok)

$ physlock -s -m -p "lock!"

今はX では xscreensaver を使ってるけどこれはスクリーンセーバー起動中でもコンソールに移動して利用できちゃうのでphyslock に切り替えるのも良いかもしれません.

気になるのはスクリーンセーバーでは電源管理して一定以上の時間が経つと画面をスリープするなどをやっているのですが,physlock ではそういった機能がありません.

physlock 起動後にスクリーンセーバーを起動するのも試してみましたがうまく行きませんでした.

60秒後にスクリーンセーバーを起動するようにしておいてphyslockを起動(NG)
$ sleep 60 && xscreensaver-command -activate &
$ physlock
60秒後に画面をスタンバイするようにしておいてphyslockを起動(NG)
$ sleep 60 && xset dpms force standby &
$ physlock

physlock のGitHub を覗くとphyslock 実行前後に任意のコマンドを実行できるというPR がありました.これを使えばどうだろうと試してみました.

環境を整えてsourceを入手してPR のpatch を当ててbuild
$ sudo apt-get build-dep physlock
$ git clone https://github.com/muennich/physlock
$ cd physlock
$ wget https://github.com/muennich/physlock/pull/79.patch
$ patch -p1 < ./79.patch
$ make
$ sudo chown root.root ./physlock
$ sudo chmod u+s ./physlock
$ ./physlock -h
usage: physlock [-dhLlmsbanv] [-p MSG]
-b, -a, -n のオプションが増えている
$ git diff README.md
diff --git a/README.md b/README.md
index bc25ca3..563e734 100644
--- a/README.md
+++ b/README.md
@@ -57,6 +57,9 @@ The following command-line arguments are supported:
     -l       only lock console switching
     -L       only enable console switching
     -m       mute kernel messages on console while physlock is running
+    -b CMD   execute CMD before the password prompt
+    -a CMD   execute CMD after successfully authenticating
+    -n       don't actually authenticate: just execute commands
     -p MSG   Display MSG before the password prompt
     -s       disable sysrq key while physlock is running
     -v       print version information and exit

しかしこれもうまく行きませんでした.画面は書き換えできなくなってるみたいです.

physlock の前にスクリーンセーバーを起動(NG)
$ ./physlock -b 'xscreensaver-command -demo 8'
physlock の前に画面をスリープ(NG)
$ ./physlock -b 'xset dpms force standby'

近いところでコンピュータ自体をサスペンドはOKでした.持ち運びPCなんかではいい感じかもしれません.

physlock の前にサスペンド
$ ./physlock -b 'systemctl suspend'
-b オプションのないパッケージ版でも同じようなことは可能
$ systemctl suspend && physlock

画面のスリープだけでもできれば嬉しいんですがこの辺はトレードオフになるのかな?

<ADD 2019-07-10>
Ubuntu 18.04 LTS ARM64 環境でpackage から導入した physlock では physlock: /dev/console: VT_GETSTATE: Inappropriate ioctl for device というエラーで動きませんでした.

$ physlock
physlock: /dev/console: VT_GETSTATE: Inappropriate ioctl for device
$ dpkg-query -W physlock
physlock        11-1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu 18.04.2 LTS
      Architecture: arm64

以下のバグのようです.

commit 4f131cc2c8c05279886464d3093dd56b1331e98d で修正されている(release だと12)ようなので,source から導入してみると動作しました.

$ sudo apt-get build-dep physlock
$ sudo apt install lib
$ git clone https://github.com/muennich/physlock
$ cd physlock
$ make
$ sudo make install
$ /usr/local/bin/physlock -v
physlock v13

</ADD>

環境
$ git log -1
commit d4091fe3396f6c63e42ea165797062f6032779eb (HEAD -> master, tag: v13, origin/master, origin/HEAD)
Author: Bert Münnich <ber.t@posteo.de>
Date:   Mon Jan 28 19:46:20 2019 +0100

    Stable version 13
$ dpkg-query -W physlock xscreensaver xorg x11-xserver-utils git git-hub
git     1:2.20.1-2
git-hub 1.0.1-1
physlock        13-1
x11-xserver-utils       7.7+8
xorg    1:7.7+19
xscreensaver    5.42+dfsg1-1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu Eoan Ermine (development branch)
  Architecture: x86-64

ThinkPad T430s の BIOS を USB メモリ経由でアップデートする

以前ジャンクで入手したThinkPad T430s ですが,外部キーボードを使ったり,壊れたX220 の部品を使ったりで現在メインマシンとして利用しています.
今NVIDIA Optimus が利用できないかと試していますが,うまく行っていません.BIOS Update で治ったという事例を見つけたのでUpdate しました.Update イメージはCD に書き込んでそこから起動しないといけませんが,USBメモリでもうまく行ったのでメモを残しておきます.

※失敗するとマシンが動かなくなる可能性があります.

まずはBIOS のversion を確認します.date が2012年とかなので古そう.

現在のBIOS version 確認
$ sudo dmidecode -t bios|grep -E "Version:|Release Date:"
		Version: G7ET60WW (2.02 )
		Release Date: 09/11/2012
$ sudo lshw | grep "\-firmware" -A10|grep -E "version|date"
		  version: G7ET60WW (2.02 )
		  date: 09/11/2012

Lenovo のページでBIOSを確認すると, 26 Jun 2019 の Version 2.75 というものが最新のようです.
Windows用の実行ファイルと,起動CD用のisoファイル,それとそれぞれのリリースレターが用意されています.Linux マシンなのでisoファイルの方を入手します.

ダウンロードしたら,チェックサムを確認します.

webpage より

Checksum Tips

MD5:aa9846fb15114ef18770cc0812188418

SHA1:ace55c1a1fa87f3ca5140ef67d565ff9f863020a

SHA-256:623dc5d0442b3b0e105186901dc403c911717d4f7998223593b93e66afdbcd93

sha256sum で確認
$ sha256sum ~/Downloads/g7uj28us.iso
623dc5d0442b3b0e105186901dc403c911717d4f7998223593b93e66afdbcd93  /home/matoken/Downloads/g7uj28us.iso
isoinfo で少し中を覗く
$ isoinfo -d  -i ./g7uj28us.iso
CD-ROM is in ISO 9660 format
System id:
Volume id: G7ETB5US
Volume set id:
Publisher id:
Data preparer id:
Application id: NERO BURNING ROM
Copyright File id:
Abstract File id:
Bibliographic File id:
Volume set size is: 1
Volume set sequence number is: 1
Logical block size is: 2048
Volume size is: 16566
El Torito VD version 1 found, boot catalog is in sector 20
Joliet with UCS level 3 found
NO Rock Ridge present
Eltorito validation header:
    Hid 1
    Arch 0 (x86)
    ID 'NERO BURNING ROM'
    Key 55 AA
    Eltorito defaultboot header:
        Bootid 88 (bootable)
        Boot media 4 (Hard Disk Emulation)
        Load segment 7C0
        Sys type 6
        Nsect 1
        Bootoff 1B 27
$ isoinfo -l  -i ./g7uj28us.iso

Directory listing of /
d---------   0    0    0            2048 Jun 13 2019 [     21 02]  .
d---------   0    0    0            2048 Jun 13 2019 [     21 02]  ..

この iso ファイルを CD に書き込んで起動すればいいはずですが,メディアが手元にありません.

iso ファイルによってはUSBメモリに書き込むだけで起動USBメディアになるものもあるので試してみましたが起動できませんでした.

どうにかならないかなーと探すと以下の記事を見つけました.

geteltorito というPerl Script でイメージを変換した後,USBメモリに書き込むことで ThinkPad の BIOS Update ができるようです.
この記事中ではScript 開発者のページから入手していますが,Debian では genisoimage pkg に含まれているのでこれを使いました.

geteltorito の含まれている genisoimage pkg の導入
$ apt-file search geteltorito
genisoimage: /usr/bin/geteltorito
genisoimage: /usr/share/doc/genisoimage/README.geteltorito
genisoimage: /usr/share/man/man1/geteltorito.1.gz
$ sudo apt install genisoimage
usage
$ geteltorito

/usr/bin/geteltorito [-hv] [-o outputfilename] cd-image
Script will try to extract an El Torito image from a
bootable CD (or cd-image) given by <cd-image> and write
the data extracted to STDOUT or to a file.
   -h:        This help.
   -v:        Print version of script and exit.
   -o <file>: Write extracted data to file <file> instead of STDOUT.
USBメモリを接続してデバイスをdmesg やfdisk で確認して,wipefs でパーティション情報をクリアしておく
$ sudo dmesg -He|tail
$ sudo fdisk -l /dev/sdb
$ sudo wipefs -a /dev/sdb
geteltorito でイメージ変換しながら USBメモリへの書き込み
$ geteltorito ./g7uj28us.iso | sudo dd of=/dev/sdb bs=1M oflag=dsync status=progress
Booting catalog starts at sector: 20
Manufacturer of CD: NERO BURNING ROM
Image architecture: x86
Boot media type is: harddisk
El Torito image starts at sector 27 and has 65536 sector(s) of 512 Bytes
[sudo] password for matoken:
33218560 bytes (33 MB, 32 MiB) copied, 10 s, 3.2 MB/sImage has been written to stdout ....

9+178 records in
9+178 records out
33554432 bytes (34 MB, 32 MiB) copied, 10.3254 s, 3.2 MB/s

Debian pkg に含まれているScript のversion とsite で配布されているversion は0.5 と0.6 と少し違ったので念の為両方で変換を掛けて比較してみましたが結果は同じでした.

念の為siteで配布されているものでも変換してイメージを比較してみると同じものだった
$ wget http://userpages.uni-koblenz.de/~krienke/ftp/noarch/geteltorito/geteltorito/geteltorito
$ chmod u+x ./geteltorito
$ ./geteltorito -v
Version: 0.6
$ ./geteltorito -o ./g7uj28us.img ./g7uj28us.iso
$ geteltorito -o ./g7uj28us.img-pkg ./g7uj28us.iso
$ diff -s ./g7uj28us.img ./g7uj28us.img-pkg
Files ./g7uj28us.img and ./g7uj28us.img-pkg are identical

ということで,書き込んだUSBメモリで起動してBIOS update はうまく行きました.

Version が上がっているのを確認
$ sudo dmidecode -t bios|grep -E "Version:|Release Date:"
        Version: G7ETB5WW (2.75 )
        Release Date: 06/10/2019

忘れがちだけど結構脆弱性の修正やmicrocode のアップデートも入っていたのでちゃんと当てないといけないですね…….

環境
$ dpkg-query -W genisoimage coreutils util-linux dmidecode lshw
coreutils       8.30-3
dmidecode       3.2-1
genisoimage     9:1.1.11-3+b2
lshw    02.18.85-0.2
util-linux      2.33.1-0.1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux 10 (buster)
      Architecture: x86-64