Raspberry Pi OS/Debian/Ubuntuでの既定のPython切り替え

最近使うPythonアプリはPython3が多くなっています.Python2のEoLが迫っているので正しいのですが,手元の環境では python コマンドは python2 に向いています.python3 コマンドを叩けばいいのですが,これを python3 に向けられないかなと試してみました.

Raspberry Pi OS arm64(busterベース)でのPython確認してみます.python コマンドは python2.7 を呼ぶようになっています.

$ python --version
Python 2.7.16
$ ls -l `which python`
lrwxrwxrwx 1 root root 7  3月  5  2019 /usr/bin/python -> python2
$ ls -l `which python2`
lrwxrwxrwx 1 root root 9  3月  5  2019 /usr/bin/python2 -> python2.7
$ ls -l `which python3`
lrwxrwxrwx 1 root root 9  3月 26  2019 /usr/bin/python3 -> python3.7

update-alternatives で管理されてるのかな?と思いましたが設定がなさそうです.

$ update-alternatives --get-selections|grep -i ^python

update-alternatives を手動で設定してみます.
これで python コマンドが python3.7 を呼ぶようになりました.

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives: /usr/bin/python (python) を提供するために自動モードで /usr/bin/python2.7 を使います
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2
update-alternatives: /usr/bin/python (python) を提供するために自動モードで /usr/bin/python3.7 を使います
$ ls -l `which python`
lrwxrwxrwx 1 root root 24  7月 28 08:47 /usr/bin/python -> /etc/alternatives/python
$ python --version
Python 3.7.3
$ update-alternatives --query python
Name: python
Link: /usr/bin/python
Status: auto
Best: /usr/bin/python3.7
Value: /usr/bin/python3.7

Alternative: /usr/bin/python2.7
Priority: 1

Alternative: /usr/bin/python3.7
Priority: 2

切り替えたいときはこんな感じで選択肢なおせばok.

$ sudo update-alternatives --config python
alternative python (/usr/bin/python を提供) には 2 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/bin/python3.7   2         自動モード
  1            /usr/bin/python2.7   1         手動モード
  2            /usr/bin/python3.7   2         手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:

Debian asid amd64, Ubuntu 20.04 LTS amd64 でも設定してみました.

Debian sid amd64
$ update-alternatives --query python
Name: python
Link: /usr/bin/python
Status: auto
Best: /usr/bin/python3.8
Value: /usr/bin/python3.8

Alternative: /usr/bin/python2.7
Priority: 1

Alternative: /usr/bin/python3.7
Priority: 2

Alternative: /usr/bin/python3.8
Priority: 3
Ubuntu 20,04 LTS amd64
$ update-alternatives --query python
Name: python
Link: /usr/bin/python
Status: auto
Best: /usr/bin/python3.8
Value: /usr/bin/python3.8

Alternative: /usr/bin/python2.7
Priority: 1

Alternative: /usr/bin/python3.5
Priority: 2

Alternative: /usr/bin/python3.8
Priority: 3

てことで python コマンドが python3 になりました.しかしシステムワイドな設定なのでシステムのプログラムなどで問題が出るかもしれないですね.
問題が起こったらpython2に戻しましょう.

Rasoberry Pi OS amd64
$ dpkg-query -W python python3
python  2.7.16-1
python3 3.7.3-1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
aarch64
$ cat /proc/device-tree/model&&echo
Raspberry Pi 3 Model B Rev 1.2
Debian sid amd64
$ dpkg-query -W python python3 python3.7
python  2.7.17-2
python3 3.8.2-3
python3.7       3.7.7-1+b1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
Ubuntu 20.04 LTS amd64
$ dpkg-query -W python python3 python3.7
python  2.7.17-1
python3 3.8.2-0ubuntu2
python3.7
$ lsb_release -dr
Description:    Ubuntu 20.04.1 LTS
Release:        20.04
$ uname -m
x86_64

Sipeed Lichee Nanoでhello world

2020-07-23低レベル勉強会に参加しました.Zoom.usでの開催でした.

内容はLinux名刺的なものを開発しようという内容で,リファレンスとしてSDカードサイズの小さなLinuxの動作するarmコンピュータのSipeed Lichee Nanoを使いました.

欲しい場合は1000円ちょいくらいからで入手できそうです.

Lichee Nanoを持っていない人はリモートで触れるようにしてあったので持っていない私も楽しめました.

このリモート開発の仕組みはLichee NanoとRaspberry PiをUSB経由のUARTで接続し,Raspberry PiでGNU screenを起動,ssh経由でGNU screenに繋いで操作という感じです.
GNU screenをGotty等にするとウェブブラウザで参加できてちょっと便利かもと思ったりも.(GoTTYは開発止まってるように見えるから別のもののほうがいいかもしれない)

Lichee Nanoで何かを動かしたい.armだけどarmhf動くのかな?とりあえずなにか転送して動かしてみようと.

とりあえずDebianのarmhfバイナリをuuencodeしてコピペで転送してみます.これが動けばDebianのパッケージ群が利用できるかもだけど…….

まずは簡単そうなfortuneを試します.

Debian sidでfortune-modパッケージのarmhfバイナリパッケージをダウンロードして展開(add archtecture armhfしてある環境)
$ apt download -t armhf fortune-mod
$ unar fortune-mod_1.99.1-7+b1_armhf.deb
$ cd fortune-mod_1.99.1-7+b1_armhf
$ tar xf data.tar.xz
$ cd usr/games

Lichee Nanoはserialで接続されていて,Internetには繋がっていないのでバイナリファイルの転送にはuudecode/uuencodeを使いました.久々です.
手元のGNU sharutils 4.15.2のuudecodeにはbase64を使う -m, --base64 があるので良さそう.と思ったけどLichee Nanoの方はbusyboxのもので非対応でした.

ローカル端末で圧縮してuuencodeしてクリップボードへ
$ gzip -c fortune | uuencode fortune.gz > fortune.gz.uu
$ cat fortune.gz.uu | xclip
リモートで伸張して解凍
# cat | uudecode    #ここでクリップボードから貼り付け
# zcat fortune.gz > fortune
# rm fortune.gz

そして…​…​

# ./fortune
-sh: ./fortune: not found
# ldd ./fortune
checking sub-depends for 'not found'
checking sub-depends for '/lib/libc.so.6'
/lib/ld-linux.so.3 (0xb6fa0000)
librecode.so.0 => not found (0x00000000)
libc.so.6 => /lib/libc.so.6 (0x00000000)
/lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)

これを動かすのはダイナミックリンクされているものを用意してあげないといけないのでストレージの容量的に難しいですね.

ここではgzipで圧縮しましたが,Lichee Nanoのbusyboxにxzがありました.gzipよりxzにしたほうが小さくなりますね.試してみるとこんな感じでした.$ xz -c fortune | uuencode fortune.xz > fortune.xz.uu

サイズ比較
-rw-r--r-- 1 matoken matoken 22368 Jul 23 15:11 fortune #元ファイル
-rw-r--r-- 1 matoken matoken 30844 Jul 23 14:58 fortune.uu #uudecode
-rw-r--r-- 1 matoken matoken 14975 Jul 23 15:08 fortune.gz.uu #zip + uudecode
-rw-r--r-- 1 matoken matoken 13047 Jul 23 15:47 fortune.xz.uu #xz + uudecode

そういえばあまり有名ではないですがbasE91なんてものもあります.base64よりサイズが小さくなりますが導入からやらないといけないのでちょっと面倒.

Hello worldを試してみます.適当にプログラムを用意してスタティックリンクでコンパイルしてみます.

$ cat hello.c
#include <stdio.h>
int
main(void)
{
    printf("Hello, world!\n");
    return 0;
}
$ gcc -static ./hello.c
$ ./a.out
Hello, world!
$ ls -l a.out
-rwxr-xr-x 1 pi pi 571120 7月 23 16:18 a.out

でかい…​…​

とりあえずでかいのはおいといてこれだとarm64なので動くはずがない.ということでクロスコンパイル環境を用意します.

今回試したホストはDebian sid amd64/Ubuntu 20.04 LTS arm64/Raspberry Pi OS arm64です.いずれも同じ手順でOKでした.

crossbuild-essential-<arch> パッケージで各種アーキテクチャの環境が導入できるようです.

$ apt-cache search crossbuild-essential-
crossbuild-essential-amd64 - Informational list of cross-build-essential packages
crossbuild-essential-arm64 - Informational list of cross-build-essential packages
crossbuild-essential-armel - Informational list of cross-build-essential packages
crossbuild-essential-armhf - Informational list of cross-build-essential packages
crossbuild-essential-i386 - Informational list of cross-build-essential packages
crossbuild-essential-powerpc - Informational list of cross-build-essential packages
crossbuild-essential-ppc64el - Informational list of cross-build-essential packages
crossbuild-essential-s390x - Informational list of cross-build-essential packages
crossbuild-essential-mips - Informational list of cross-build-essential packages
crossbuild-essential-mips64 - Informational list of cross-build-essential packages
crossbuild-essential-mips64el - Informational list of cross-build-essential packages
crossbuild-essential-mips64r6 - Informational list of cross-build-essential packages
crossbuild-essential-mips64r6el - Informational list of cross-build-essential packages
crossbuild-essential-mipsel - Informational list of cross-build-essential packages
crossbuild-essential-mipsr6 - Informational list of cross-build-essential packages
crossbuild-essential-mipsr6el - Informational list of cross-build-essential packages

沢山あります.今回はarmlf/armhfの crossbuild-essential-armel, crossbuild-essential-armhf を導入しました.

$ sudo apt install crossbuild-essential-armel crossbuild-essential-armhf

gccだけでいい場合はarmlfは gcc-arm-linux-gnueabi,armhfは gcc-arm-linux-gnueabihf だけでOKです.

まずは arm-linux-gnueabihf-gcc を使ってarmhfのバイナリを作ります.

$ /usr/bin/arm-linux-gnueabihf-gcc -static ./hello.c
$ strip a.out
$ xz -c a.out | uuencode a.out.xz > a.out.xz.uu

armhfは駄目そうです.

# cat | uudecode
^d
# xzcat ./a.out.xz > ./a.out
# chmod +x ./a.out
# ./a.out
Segmentation fault

次は gcc-arm-linux-gnueabi でarmlfのバイナリを作って試すと動きました.

$ /usr/bin/arm-linux-gnueabi-gcc -static ./hello.c
$ strip a.out
$ xz -c a.out | uuencode a.out.xz > a.out.xz.uu
# cat | uudecode
^d
# xzcat ./a.out.xz > ./a.out
# chmod +x ./a.out
# ./a.out
Hello, world!
# /usr/bin/time -f "%M KB" ./a.out
Hello, world!
2144 KB

この辺りで今回は時間切れ.次回の同じような感じになりそうです.興味のある方は以下のページから.

とりあえずarmelのバイナリが動くようなのがわかったので面白そうな小さなプログラムを試そうかなと思っています.cowsayとか好きなんだけどこれはPerlなので容量的に難しそう.とりあえずfortuneあたりかな?

以前PQI Air PenでやったようにSD cardを用意してそこにDebian armlf環境を展開してchrootとかもできそうです.

rsync 3.2.0の新機能を少し試す

ファイル同期にとても便利なrsyncの3.2.0がリリースされました.

バグフィクスや,いくつかの新機能が入ったようなので少し試してみました.

※1. この記事投稿時には 3.2.2 が出ています.
※2. 鹿児島Linux勉強会 2020.06で発表したものと同じ内容です.

導入例

Debian sid amd64 & Ubuntu 20.04 LTS amd64

$ sudo apt build-dep rsync
$ sudo apt install libxxhash-dev libzstd-dev liblz4-dev
$ wget -c \
https://download.samba.org/pub/rsync/rsync-3.2.0.tar.gz \
https://download.samba.org/pub/rsync/rsync-3.2.0.tar.gz.asc \
https://opencoder.net/WayneDavison.key
$ gpg2 --import ./WayneDavison.key
$ gpg2 --verify ./rsync-3.2.0.tar.gz.asc
$ tar tvzf ./rsync-3.2.0.tar.gz
$ tar xzf ./rsync-3.2.0.tar.gz
$ cd rsync-3.2.0
$ ./configure --help
$ ./configure
$ make
$ ./rsync --version
rsync  version 3.2.0  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append,
    ACLs, xattrs, iconv, symtimes, prealloc, SIMD
Checksum list:
    xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
Note
gpg鍵は次から入手できます.rsync download

Raspberri Pi OS amd64

Raspberry Pi OS arm64の場合 libzstd-dev のバージョンが 1.3.8+dfsg-3 と少し古くbuildに失敗します. ./configure --disable-zstd としてzstdを無効にするか,sourceから zstd 1.4.5 を導入することでbuild出来ました.

$ make
  :
token.c: In function ‘init_compression_level’:
token.c:73:40: warning: implicit declaration of function ‘ZSTD_minCLevel’; did you mean ‘ZSTD_maxCLevel’? [-Wimplicit-function-declaration]
   min_level = skip_compression_level = ZSTD_minCLevel();
                                        ^~~~~~~~~~~~~~
                                        ZSTD_maxCLevel
token.c: In function ‘send_zstd_token’:
token.c:685:2: error: unknown type name ‘ZSTD_EndDirective’; did you mean ‘ZSTD_DDict’?
  ZSTD_EndDirective flush = ZSTD_e_continue;
  ^~~~~~~~~~~~~~~~~
  ZSTD_DDict
token.c:685:28: error: ‘ZSTD_e_continue’ undeclared (first use in this function)
  ZSTD_EndDirective flush = ZSTD_e_continue;
                            ^~~~~~~~~~~~~~~
token.c:685:28: note: each undeclared identifier is reported only once for each function it appears in
token.c:701:3: warning: implicit declaration of function ‘ZSTD_CCtx_setParameter’ [-Wimplicit-function-declaration]
   ZSTD_CCtx_setParameter(zstd_cctx, ZSTD_c_compressionLevel, do_compression_level);
   ^~~~~~~~~~~~~~~~~~~~~~
token.c:701:37: error: ‘ZSTD_c_compressionLevel’ undeclared (first use in this function); did you mean ‘skip_compression_level’?
   ZSTD_CCtx_setParameter(zstd_cctx, ZSTD_c_compressionLevel, do_compression_level);
                                     ^~~~~~~~~~~~~~~~~~~~~~~
                                     skip_compression_level
token.c:751:13: error: ‘ZSTD_e_flush’ undeclared (first use in this function); did you mean ‘ZSTD_DCtx_s’?
     flush = ZSTD_e_flush;
             ^~~~~~~~~~~~
             ZSTD_DCtx_s
token.c:753:8: warning: implicit declaration of function ‘ZSTD_compressStream2’; did you mean ‘ZSTD_compressStream’? [-Wimplicit-function-declaration]
    r = ZSTD_compressStream2(zstd_cctx, &zstd_out_buff, &zstd_in_buff, flush);
        ^~~~~~~~~~~~~~~~~~~~
        ZSTD_compressStream
$ cd ..
$ sudo apt remove libzstd-dev
$ wget https://github.com/facebook/zstd/releases/download/v1.4.5/zstd-1.4.5.tar.gz \
https://github.com/facebook/zstd/releases/download/v1.4.5/zstd-1.4.5.tar.gz.sha256
$ sha256sum -c ./zstd-1.4.5.tar.gz.sha256
$ tar tvf ./zstd-1.4.5.tar.gz | lv
$ tar xf ./zstd-1.4.5.tar.gz
$ cd zstd-1.4.5
$ make
$ sudo make install
$ cd ../rsync-3.2.0
$ ./configure && make

Debian sid amd64

Debian sid amd64 環境にはすでに降ってきているのでパッケージから導入するだけでOKです.

$ sudo apt install rsync
$ rsync --version
rsync  version 3.2.0  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append,
    ACLs, xattrs, iconv, symtimes, prealloc, SIMD
Checksum list:
    xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
$ dpkg-query -W rsync
rsync   3.2.0-1

ってことで試せるようになりました.NEWSを見てみます.

BUG FIX

Avoid a hang when an overabundance of messages clogs up all the I/O buffers.

このバグ修正がちょっと気になります.fat32の制限に引っかかったときに帰ってこない問題もこれで解決してるかも?未確認.

ENHANCEMENTS

–checksum-choice=STR, –cc=STR

チェックサム形式を選べるようになったようです.現在選択できるのは xxh64/md5/md4 の3種類 or none or auto(既定値)

man(1)より
              o      auto (the default)
              o      xxh64 (aka xxhash)
              o      md5
              o      md4
              o      none

--version にも出力されます.

$ rsync --version | grep Checksum -A1
Checksum list:
    xxh64 (xxhash) md5 md4 none

configure option に --disable-xxhash がありました.

  --disable-xxhash        disable xxhash checksums

環境変数 RSYNC_CHECKSUM_LIST でも指定できます.オプション --checksum-choice がある場合はオプションのほうが優先なようです.

ちなみに --checksum-choice オプションに対応していない 3.1.3 に対して xxh64 を向けて叩いてみると以下のようなエラーになりました.(md4, md5 はok)

$ rsync --checksum-choice=xxh64 -avc ./* user@remote:/tmp/
unknown checksum name: xxh64
rsync error: requested action not supported (code 4) at checksum.c(73) [server=3.1.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.2.0]

時間がどのくらい変わるかちょうど転がっていたkernel source(小さいファイルが沢山)で試してみました.はじめ普通に同期した後,キャッシュクリアして md4, md5, xxh64 で試してみました.思ったより差が出ない感じ?

md4
$ find ./linux-5.6 | wc -l
82114
$ du -ms ./linux-5.6
1310    ./linux-5.6
$ rsync --checksum-choice=auto -ac ./linux-5.6 /tmp/
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md4 -ac ./linux-5.6 /tmp/
3

real    0m52.393s
user    0m5.051s
sys     0m12.246s
md5
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md5 -ac ./linux-5.6 /tmp/
3

real    0m57.716s
user    0m6.976s
sys     0m13.486s
xxh64
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=xxh64 -ac ./linux-5.6 /tmp/
3

real    1m5.520s
user    0m2.507s
sys     0m13.625s

大きめのファイルでも試してみました.4GB程のisoファイル1つです.md4, md5 はあまり代わりませんが,xxh64 はかなり高速ですね.

md4
$ ls -s ./Parrot-security-4.9.1_x64.iso*
3909164 ./Parrot-security-4.9.1_x64.iso  3909164 ./Parrot-security-4.9.1_x64.iso2
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md4 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x
64.iso2
3

real    0m23.276s
user    0m10.601s
sys     0m4.387s
md5
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md5 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x64.iso2
3

real    0m28.150s
user    0m16.945s
sys     0m4.399s
xxh64
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=xxh64 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x64.iso2
3

real    0m12.767s
user    0m1.375s
sys     0m4.060s

この辺の速度は環境により大分変わると思うので参考程度に.

–compress-choice=STR, –zc=STR

--compress オプション利用時の圧縮形式を指定できるようです.

圧縮形式はrsync 3.2.0 同士では zlibx 形式が zlib 形式よりも優先されるようです.
選択できるオプションは zstd, lz4, zlibx, zlib, none のようです.

man(1)より
              o      zstd
              o      lz4
              o      zlibx
              o      zlib
              o      none

rsync --version でも確認できます.

$ rsync --version | grep Compress -A1
Compress list:
    zstd lz4 zlibx zlib none

configure oprion に --disable-zstd, --disable-lz4 があります.

  --disable-zstd          disable zstd compression
  --disable-lz4           disable LZ4 compression

環境変数 RSYNC_COMPRESS_LIST でも指定できるようです.

未対応の 3.1.3 に対して指定すると unknown option と言われます.

$ time rsync --compress-choice=zstd --compress -a ./hoge mk@x201i.local:/tmp/
rsync: on remote machine: --compress-choice=zstd: unknown option
rsync error: syntax or usage error (code 1) at main.c(1596) [server=3.1.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.2.0]

こちらも簡単にベンチを.でもWi-Fi環境だし参考程度に.

zstd
$ ssh user@remote rm -rf ~/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zstd --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    4m38.921s
user    0m24.463s
sys     0m7.182s
lz4
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=lz4 --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    9m28.829s
user    0m4.878s
sys     0m6.177s
zlibx
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zlibx --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    5m21.702s
user    0m46.740s
sys     0m6.541s
zlib
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zlib --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    5m28.722s
user    0m45.861s
sys     0m6.381s
none
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=none -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    22m56.712s
user    0m1.848s
sys     0m7.323s

–debug=NSTR

チェックサムと圧縮の詳細を表示するオプションのようです.どのアルゴリズムを利用しているのかが確認できます.

–debug=NSTR を付けたときのの実行結果例
Client negotiated checksum: xxh64
Client compress: zstd (level 3)

–debug=OPTS, -M—​debug=OPTS

--debug=OPTS を使うとリモートのrsyncにデバッグオプションを送らなくなるようです.これによりクライアント側とサーバ側で異なるデバッグレベルを指定できるようになったそうです.
リモート側にオプションを送る場合には -M—​debug=OPTS

SIGINFO & SIGVTALRM

rsyncプロセスに SIGINFO & SIGVTALRM シグナルを送信することでステータスを表示できるようになったようです.Linuxは SIGINFO に対応していないので, SIGVTALRM を試しました.

rsyncを実行している状態で SIGVTALRM を送信
$ pkill -SIGVTALRM rsync
rsyncがステータスを表示
linux-5.6/arch/sparc/lib/lshrdi3.S
    114,384,392  81%  931.12kB/s    0:01:59 (xfr#21058, ir-chk=1030/23451)

–copy-as=USER[:GROUP]

指定ユーザ/グループ権限でファイルをコピーするようです.

コピー元に3ユーザのファイル
$ ls -Al /tmp/rsync-test/
total 0
-rw-r--r-- 1 matoken  matoken  0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 root     root     0 Jun 25 18:51 root
-rw-r--r-- 1 www-data www-data 0 Jun 25 18:51 www-data
普通にコピーするとユーザが引き継がれる
$ sudo ./rsync -a /tmp/rsync-test/ /tmp/rsync-test2
$ ls -lA /tmp/rsync-test2
total 0
-rw-r--r-- 1 matoken  matoken  0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 root     root     0 Jun 25 18:51 root
-rw-r--r-- 1 www-data www-data 0 Jun 25 18:51 www-data
--copy-as=matoken を指定するとすべてmatokenになる
$ sudo \rm -rf /tmp/rsync-test2
$ sudo ./rsync --copy-as=matoken -a /tmp/rsync-test/ /tmp/rsync-test2
$ ls -lA /tmp/rsync-test2
total 0
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:51 root
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:51 www-data

-V

--version の短いオプションとして -V が入りました.

$ ./rsync --help|grep -- -V
--version, -V            print the version + other info and exit
$ ./rsync --help|grep \-V
grep (GNU grep) 3.4
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://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.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

–ipv4, -4 / –ipv6, -6

ipv4, ipv6 を指定したいときに rsh='ssh -4' とするより便利な --ipv4, -4, --ipv6, -6 オプションが入りました.

ipv4しかない環境で -6 を指定して失敗する
$ rsync -avc6 ./ user@remote:/tmp/
ssh: Could not resolve hostname remote: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(235) [sender=3.2.1]

awesome wmでの壁紙変更設定を変更(crontabからDISPLAY番号取得)

awesome wm環境での壁紙自動変更にcrontab経由で feh コマンドを利用しています.

30分ごとに~/Pictures/wp/以下のファイルをダンダムに設定
*/30 * * * *    DISPLAY=:0 feh --bg-scale "$(find ~/Pictures/wp/ -type f | shuf -n 1)"

このときXのディスプレイ番号を固定で書いているのですがディスプレイ番号が変わることもあってその時エラーになってしまいます.
ウィンドウマネージャを変更したときもよくなさそう.

ということでcronからユーザのawesome wmのディスプレイ番号を探すようにしてみました.

まずは対象ユーザのawesome wmのプロセス番号を調べます.

$ pgrep -u $(id -u) awesome
2932

/proc/$PID/environ からDISPLAYを探します.

$ cat /proc/2932/environ 2> /dev/null | tr '
$ cat /proc/2932/environ 2> /dev/null | tr '\0' '\n' | grep ^DISPLAY=:
DISPLAY=:1
' '\n' | grep ^DISPLAY=: DISPLAY=:1

カレントユーザのawesome wmのディスプレイ番号が :1 なのが解りました :)

これを組み合わせてこのようにしてみました.これでディスプレイ番号が変わっても大丈夫で,awesome以外のウィンドウマネージャを使ったときには何もしないはず( xargs --no-run-if-empty )です.
同じユーザでawesomeを複数起動した場合は先に起動した方しか反映されないはずですが,あまりそういったことはしないと思うので大丈夫かなと.

*/30 * * * *    cat /proc/$(pgrep -u $(id -u) awesome)/environ 2> /dev/null | tr '
*/30 * * * *    cat /proc/$(pgrep -u $(id -u) awesome)/environ 2> /dev/null | tr '\0' '\n' | grep ^DISPLAY=: | xargs --no-run-if-empty -I{} sh -c '{} feh --bg-scale "$(find ~/Pictures/wp/ -type f | shuf -n 1)"'
' '\n' | grep ^DISPLAY=: | xargs --no-run-if-empty -I{} sh -c '{} feh --bg-scale "$(find ~/Pictures/wp/ -type f | shuf -n 1)"'

2020-07-17 ADD
fehに -z, --randomize と言うオプションがありました.これを使うとコマンドが2つ減って少しわかりやすく……あまり変わらないか.

*/30 * * * *    cat /proc/$(pgrep -u $(id -u) awesome)/environ 2> /dev/null | tr '
*/30 * * * *    cat /proc/$(pgrep -u $(id -u) awesome)/environ 2> /dev/null | tr '\0' '\n' | grep ^DISPLAY=: | xargs --no-run-if-empty -I{} {} feh --bg-scale -z ~/Pictures/wp/
' '\n' | grep ^DISPLAY=: | xargs --no-run-if-empty -I{} {} feh --bg-scale -z ~/Pictures/wp/
環境
$ dpkg-query -W awesome feh procps findutils grep
awesome 4.3-4
feh     3.4.1-1
findutils       4.7.0-1
grep    3.4-1
procps  2:3.3.16-5
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

snapでNextcloudを導入して手軽にGoogleDocぽく使う(snap版Nextcloud + OnlyOffice)

Nextcloud導入が面倒?snapを使うとこれだけでGoogleDocみたいなことができます(Debian sid amd64/Ubuntu 20.04 LTSで確認済み).

$ sudo apt update && sudo apt upgrade
$ sudo apt install snapd
$ sudo snap install nextcloud
$ sudo /snap/bin/nextcloud.occ app:install documentserver_community
$ sudo /snap/bin/nextcloud.occ app:install onlyoffice

snap nextcloud 20200610 00:06:05 415116

簡単に説明していきます.

OSの状態を最新にしておきます.
$ sudo apt update && sudo apt upgrade
snapを使うためにsnapdを導入します(最近のUbuntuだと標準で入ってると思います).
$ sudo apt install snapd
snapでNextcloudを検索してみます.
$ snap find nextcloud
Name                       Version                    Publisher         Notes  Summary
nextcloud                  18.0.4snap3                nextcloud✓        -      Nextcloud Server - A safe home for all your data
spreedme                   0.29.5snap1                nextcloud✓        -      Spreed.ME audio/video calls and conferences feature for the Nextcloud Snap
onlyoffice-desktopeditors  5.5.1                      onlyoffice✓       -      A comprehensive office suite for editing documents, spreadsheets and presentations
qownnotes                  20.6.2                     pbek              -      Plain-text file markdown note taking with Nextcloud / ownCloud integration
nextcloud-port8080         1.01                       arcticslyfox      -      Nextcloud Server
nextcloud-snap-abacao      11.0.3snap4                abacao            -      Nextcloud Server
nextcloud-nextant          11.0.0snap3                rmescandon        -      Nextcloud Server + search support
nextcloud-abacao           11.0.3snap4                abacao            -      Nextcloud Server
cashbox-nextcloud          11.0.2snap2                cashbox           -      Nextcloud Server for www.cashBOX.plus
nextcloudsnap              12.0.4snap1                oscarbrolin       -      Nextcloud Server - A safe home for all your data
ghostcloud                 0.9.5                      beidl             -      A modern cross-platform client for Nextcloud, ownCloud, WebDav.
htxucloud                  12.0.3snap7                htxu              -      Nextcloud Server
carnet                     0.22.1                     alexandre-roux-m  -      Powerful note taking app with sync, online editor and android app
opentodolist               3.23.0                     mhoeher           -      Todo list and note taking application
solr                       0.1                        rmescandon        -      Starts up solr as forking daemon
mdns-hostname              0.0.1                      welike            -      mDNS mini-daemon to published hostname.local
nextcloud-stondino         15.0.10snap3+git1.ff25cb9  zmusselman        -      Nextcloud Server - A safe home for all your data
vmcloud-nextcloud          1.0.0                      victoriususm      -      Nextcloud 16.0.3 Optimized-Boosted
feedreader                 0+git.9ac478f7             ken-vandine       -      RSS client for various webservices
test003-nc                 13.0.4.snap1               reinism           -      Nextcloud Server - A safe home for all your data
$ snap info nextcloud
name:      nextcloud
summary:   Nextcloud Server - A safe home for all your data
publisher: Nextcloud*
store-url: https://snapcraft.io/nextcloud
contact:   https://github.com/nextcloud/nextcloud-snap
license:   unset
description: |
  Where are your photos and documents? With Nextcloud you pick a server of
  your choice, at home, in a data center or at a provider. And that is where
  your files will be. Nextcloud runs on that server, protecting your data and
  giving you access from your desktop or mobile devices. Through Nextcloud
  you also access, sync and share your existing data on that FTP drive at
  school, a Dropbox or a NAS you have at home.
commands:
  - nextcloud.disable-https
  - nextcloud.enable-https
  - nextcloud.export
  - nextcloud.import
  - nextcloud.manual-install
  - nextcloud.mysql-client
  - nextcloud.mysqldump
  - nextcloud.occ
services:
  nextcloud.apache:          simple, enabled, active
  nextcloud.mdns-publisher:  simple, enabled, active
  nextcloud.mysql:           simple, enabled, active
  nextcloud.nextcloud-cron:  simple, enabled, active
  nextcloud.nextcloud-fixer: simple, enabled, inactive
  nextcloud.php-fpm:         simple, enabled, active
  nextcloud.redis-server:    simple, enabled, active
  nextcloud.renew-certs:     simple, enabled, active
snap-id:      njObIbGQEaVx1H4nyWxchk1i8opy4h54
tracking:     latest/stable
refresh-date: yesterday at 21:53 JST
channels:
  latest/stable:    18.0.4snap4               2020-06-08 (21413) 264MB -
  latest/candidate: ^
  latest/beta:      18.0.4snap4+git5.31f0acd  2020-06-09 (21469) 264MB -
  latest/edge:      master-2020-06-10         2020-06-10 (21487) 267MB -
  18/stable:        18.0.4snap4               2020-06-08 (21413) 264MB -
  18/candidate:     ^
  18/beta:          ^
  18/edge:          18-2020-06-10             2020-06-10 (21482) 265MB -
  17/stable:        17.0.6snap1               2020-05-03 (20616) 229MB -
  17/candidate:     ^
  17/beta:          17.0.6snap1+git10.8f765f8 2020-06-09 (21474) 249MB -
  17/edge:          17-2020-06-10             2020-06-10 (21483) 250MB -
  16/stable:        16.0.11snap1              2020-06-08 (21459) 225MB -
  16/candidate:     ^
  16/beta:          ^
  16/edge:          ^
  15/stable:        15.0.14snap1              2020-01-20 (18374) 216MB -
  15/candidate:     ^
  15/beta:          ^
  15/edge:          ^
  14/stable:        14.0.10snap1              2019-05-04 (13208) 202MB -
  14/candidate:     ^
  14/beta:          ^
  14/edge:          ^
  13/stable:        13.0.12snap1              2019-05-03 (13155) 193MB -
  13/candidate:     ^
  13/beta:          ^
  13/edge:          ^
  12/stable:        12.0.13snap1              2019-01-07 (10632) 206MB -
  12/candidate:     ^
  12/beta:          ^
  12/edge:          ^
  11/stable:        11.0.8snap1               2018-05-10  (6942) 202MB -
  11/candidate:     ^
  11/beta:          ^
  11/edge:          ^

いくつかでてきますが,Publisherが nextcloud になっている公式のstableを使います.ちなみにこのコマンドを叩いた時点で19.0.0や18.0.5が出ていてこの記事執筆時点で18.0.6が出ています.ちょっと反映が遅いみたいですね.

snap版Nextcloudを導入
$ sudo snap install nextcloud

しばらく時間がかかりますが,これでNextcloudと関連のApache httpd/PHP/MySQL等が設定済みの状態で導入されます.

$ ps aux | grep -i nextcloud
root     17628  0.0  0.0   1872   196 ?        Ss   00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/delay-on-failure mdns-publisher nextcloud
root     17615  0.0  0.1   1872  1168 ?        Ss   00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/nextcloud-cron
root     17657  0.0  0.1   1872  1200 ?        Ss   00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/renew-certs
root     17681  0.0  0.1   1872  1272 ?        Ss   00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/start-php-fpm
root     17712  0.0  0.1   1872  1216 ?        Ss   00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/start-redis-server
root     17765  0.0  0.6 258120  6008 ?        Sl   00:10   0:00 mdns-publisher nextcloud
root     17987  0.0  0.1   1872  1200 ?        Ss   00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/run-httpd -k start -DFOREGROUND
root     18069  0.1  0.1   1872  1168 ?        Ss   00:10   0:01 /bin/sh /snap/nextcloud/21169/bin/start_mysql
root     18111  0.0  0.1   1872  1100 ?        S    00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/mysqld_safe --datadir=/var/snap/nextcloud/21169/mysql --pid-file=/tmp/pids/mys
ql.pid --lc-messages-dir=/snap/nextcloud/21169/share --socket=/tmp/sockets/mysql.sock
root     18128  0.9 22.0 1815000 210060 ?      Sl   00:10   0:08 /snap/nextcloud/21169/bin/mysqld --basedir=/snap/nextcloud/21169 --datadir=/var/snap/nextcloud/21169/mysql --plu
gin-dir=/snap/nextcloud/21169/lib/plugin --lc-messages-dir=/snap/nextcloud/21169/share --log-error=error.log --pid-file=/tmp/pids/mysql.pid --socket=/tmp/sockets/mysql.sock
root     18196  0.0  2.1 200580 21712 ?        Ss   00:10   0:00 php-fpm: master process (/snap/nextcloud/21169/config/php/php-fpm.conf)
root     18980  0.0  0.1   1872  1276 ?        S    00:10   0:00 /bin/sh /snap/nextcloud/21169/bin/httpd-wrapper -k start -DFOREGROUND
root     19017  0.0  0.0   6168  0280 ?        S    00:10   0:00 httpd -d /snap/nextcloud/21169 -k start -DFOREGROUND
root     19018  0.0  0.1 1211772 1612 ?        Sl   00:10   0:00 httpd -d /snap/nextcloud/21169 -k start -DFOREGROUND
root     19019  0.0  0.1 880108  1668 ?        Sl   00:10   0:00 httpd -d /snap/nextcloud/21169 -k start -DFOREGROUND
root     19020  0.0  0.1 1080512 1656 ?        Sl   00:10   0:00 httpd -d /snap/nextcloud/21169 -k start -DFOREGROUND
root     19221  0.0  0.0 1716012 0292 ?        Sl   00:10   0:00 httpd -d /snap/nextcloud/21169 -k start -DFOREGROUND

これでもうデーモンも起動しているので対象マシンのホスト名やipアドレスをウェブブラウザに入力して任意の管理者ユーザのユーザ名とパスワードを入力して登録します.同じネットワークだと誰でも繋いで設定できてしまうので注意しましょう.

管理者ユーザ登録画面

snap nextcloud 20200609 22:06:09 329531

「推奨アプリをインストール」にチェックを入れておくと便利な推奨アプリが導入されます.時間がかかるので後でもいいかもしれません.

これでとりあえずNextcloudが利用できるようになりました.実はここまでは snapパッケージが amd64以外にも arm64. armhf, i386, ppc64el に対応しているので armhf/arm64 な Raspberry Pi などでも動作します.

続いて OnlyOffice, community edition の server版を導入します.

Nextcloudのウェブからも導入できるのですが,300MB程とサイズが大きく回線によってはタイムアウトしてしまいます.

snap nextcloud 20200606 19:06:50 477356

その場合は occ コマンドで導入します.(snapなので nextcloud.occ コマンドを使います)

$ sudo /snap/bin/nextcloud.occ app:install documentserver_community

これでも失敗することがあります.その場合は手動でGitHub からアーカイブを入手して手動で展開して有効化します.(この方法だとamd64以外でも導入はできちゃいますが動かないので注意)

$ COUNT=1; while :;do wget https://github.com/nextcloud/documentserver_community/releases/download/v0.1.6/documentserver_community.tar.gz && break; c=$(( $c + 1 )) ;sleep 10; done;echo $COUNT
$ sudo tar xvf ./documentserver_community.tar.gz -C /var/snap/nextcloud/current/nextcloud/extra-apps/
$ sudo chown -R root.root /var/snap/nextcloud/current/nextcloud/extra-apps/documentserver_community
$ sudo /snap/bin/nextcloud.occ app:enable documentserver_community

CollaboraはAppImageを使っていたのでファイル数は少なかったですがこちらは普通にディレクトリに展開されるようでたくさんあります.

$ sudo find /var/snap/nextcloud/current/nextcloud/extra-apps/documentserver_community | wc -l
12935

続いてOnlyOfficeアプリも導入します.

これはOnlyOffice Serverに繋いでやり取りするものです.Nextcloud のアプリ画面若しくは以下のコマンドで導入します.

$ sudo /snap/bin/nextcloud.occ app:install onlyoffice

これでNextcloudに戻って対応ドキュメントを開いたり新規作成するとOnlyOfficeが起動して編集できるはずです :)

snap nextcloud 20200609 23:06:12 405447
snap nextcloud 20200610 00:06:05 415116

アプリが導入されているけどうまく行かない場合はOnlyOfficeアプリを導入し直すとうまく行くかもしれません.(OnlyOfficeアプリがServerより先に導入されるとうまく行かない)

$ sudo /snap/bin/nextcloud.occ app:remove onlyoffice
$ sudo /snap/bin/nextcloud.occ app:install onlyoffice

とりあえずこれでお試しは出来る感じです.実際に運用するにはhttps化したりバックアップを定期的に取るようにしたりなど設定したほうがいいですがパスやコマンド以外は通常のNextcloudと同じだと思います.
主なパスやコマンドはこうなっています.

  • 設定ファイル /var/snap/nextcloud/current/nextcloud/config/config.php
  • Nextcloudデータ,ログ /var/snap/nextcloud/common/
  • 関連アプリ格納 /var/snap/nextcloud/current/
  • occ /snap/bin/nextcloud.occ
  • mysql-client /snap/bin/mysql-client
  • mysqldump /snap/bin/nextcloud.mysqldump

dbのアカウント情報は設定ファイルに載っています.

$ sudo grep db /var/snap/nextcloud/current/nextcloud/config/config.php
  'dbtype' => 'mysql',
  'dbname' => 'nextcloud',
  'dbhost' => 'localhost:/tmp/sockets/mysql.sock',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'dbuser' => 'nextcloud',
  'dbpassword' => 'wdwYevflNhziZDUxxG2OXJs6el4zThtkmX20Bijih7Zh_4XU58OkZs3TAt7TCJjt',

設定ファイルを編集してデーモンを再起動したい場合はこんな感じで再起動できます.

$ sudo snap restart nextcloud

てことでsnap版Nextcloudはお試しにはおすすめです.
OnlyOfficeは今のところamd64環境しか提供されていませんがRaspberry Pi などでも動くようにしたいと言っているのでこれも期待です.

Nextcloud 19 だと先日紹介したCollaboraも同様にWebから導入できるのでおすすめです.

Lutrisを使ってLinuxでもEpic Gamesで遊ぶ

Epic Games というゲームプラットホームがあります.定期的にゲームを無料配布してくれるのでたまに貰っています.

しかしこのプラットホームは Stream や itch などと違い PC/Mac のみの対応で Linux には対応していません.

Epic Games Storeはどのプラットフォームに対応していますか?
Epic Games Storeは、現在PCとMacに対応しています。各タイトルのプラットフォームとの互換性については、製品ページの「ゲームについて」で確認することができます。

無料で貰っても遊ばないと意味がないです.
そういえば Lutris 経由で動かないかな?と思いつきました.Lutris はLinux 環境で各種プラットホームのゲーム環境を管理できて,複数のWine 環境を簡単に導入設定できたりして便利です.ここで貰ったゲームが出てきたらお手軽に遊べそうです.

Lutris についての詳細は以下のスライドもどうぞ.

ゲームの前に Lutris で Epic Games で検索すると Epic Games が出てきました.「Install」ボタンを押してウィザードに従うだけで簡単に導入できました.

lutris epic 20200606 03:06:59 18609

後は Epic Games でゲームをインストールしてみると起動しました :)

lutris epic 20200606 08:06:45 150593

lutris epic 20200606 08:06:24 148344
lutris epic 20200606 08:06:15 147780

思ったより手軽に遊べそうです.
しかし暖かくなって排熱が追いつかない感じでちょっと辛い今日この頃です.

//

環境
$ apt show lutris
Package: lutris
Version: 0.5.6
Priority: optional
Section: games
Maintainer: Mathieu Comandon <strider@strycore.com>
Installed-Size: 4,035 kB
Depends: python3-evdev, python3-gi, python3-requests, python3-yaml, python3:any, python3-pil, python3-setproctitle, python3-distro, gir1.2-gtk-3.0, gir1.2-gnomedesktop-3.0, gir1
.2-webkit2-4.0, gir1.2-notify-0.7, psmisc, cabextract, unzip, p7zip, curl, fluid-soundfont-gs, x11-xserver-utils, mesa-utils
Recommends: gvfs-backends, libwine-development, winetricks, libc6-i386, lib32gcc1
Suggests: gamemode
Homepage: https://lutris.net
Download-Size: 1,690 kB
APT-Manual-Installed: yes
APT-Sources: http://download.opensuse.org/repositories/home:/strycore/Debian_Unstable  Packages
Description: open source gaming platform
 Lutris goal is to make gaming on Linux as easy as possible by taking care of
 installing and setting up the game for the user. The only thing you have to do
 is play the game. It aims to support every game that is playable on Linux.

$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

LibreOffice Impress の HTML WebCast 書き出しで遠隔プレゼン機能を試す

add 2020-06-05

該当しそうなBug

オンラインでプレゼンテーションをするとき一般的には画面共有すると思いますが,スライドファイルを前もって配布しておいてお互いそれを見ながらプレゼンも出来ます.
その間くらいの機能でスライドのページめくりをプレゼンターと視聴者で同期するサービスが欲しいなと思っています.
以下のようなサービスがあるようですが自分が何度か試した限りでは「ログイン/新規登録」が出来ず使えていません.

LibreOffice Impress のHTML 書き出し機能にWebCast 機能を見つけたので試してみました.
しかし紹介しておいてなんですがこの機能は長らくメンテされていないようなのであまり使わないほうがいいかもしれません.(Perl cgi環境も用意しにくいだろうし)

ヘルプもざっくりとした説明しかありません.

HTML 形式で保存するプレゼンテーションを開きます。

ファイル → エクスポート を行ないます。

ファイル書式 を HTML ドキュメント (LibreOffice Impress) (.html;.htm) に設定します。

ファイル名 を入力して、エクスポート をクリックします。

HTML エクスポート ウィザードの指示に従います。

てことでメモがてら.

LibreOffice Impress で書き出したいスライドを開きます.

「ファイル」→「エクスポート」でエクスポートウィドウが開きます.

LibreOffice WebCast01

書き出し先のディレクトリ(複数のファイルが書き出されるので新しいディレクトリを用意したほうが良い)を指定し,任意のファイル名を指定します.
「ファイル形式」に「HTML ドキュメント (Impress) (.html;.htm)」を選択して「エクスポート」ボタンを押します.

LibreOffice WebCast02

「デザインの割り当て」は初回は「新規デザイン」しか選べません.「次へ」ボタンを押します.

LibreOffice WebCast03

「発表方法」に「WebCast」を選択し,右側の「WebCast」では「Perl」を選択します(ASPは未検証).テキストボックスは規定値のままで構いません.「次へ」ボタンを押します.

LibreOffice WebCast04

「名前を付けて画像を保存」(原文は Save Image As なので訳が間違っていそう)で画像形式を,「モニターの解像度」でスライドの解像度を指定します.「作成」ボタンで書き出されます.
書き出し時にHTMLデザインの保存ウィンドウが表示されますがキャンセルも出来ます.

LibreOffice WebCast05

書き出したディレクトリを見ると,スライドの画像といくつかの.htmlファイルや.plなども出力されています.これらのファイルをcgiの動くsiteにコピーします.
今はcgiの動く場所がとても限られているのでこれが一番難しいかもしれないですね.

$ ls -w 80 ./slide_dir
common.pl    img15.png  img24.png  img33.png  img42.png  img51.png  img7.png
currpic.txt  img16.png  img25.png  img34.png  img43.png  img52.png  img8.png
editpic.pl   img17.png  img26.png  img35.png  img44.png  img53.png  img9.png
img0.png     img18.png  img27.png  img36.png  img45.png  img54.png  index.html
img1.png     img19.png  img28.png  img37.png  img46.png  img55.png  picture.txt
img10.png    img2.png   img29.png  img38.png  img47.png  img56.png  poll.pl
img11.png    img20.png  img3.png   img39.png  img48.png  img57.png  savepic.pl
img12.png    img21.png  img30.png  img4.png   img49.png  img58.png  show.pl
img13.png    img22.png  img31.png  img40.png  img5.png   img59.png  slide.html
img14.png    img23.png  img32.png  img41.png  img50.png  img6.png   webcast.pl

今回は自宅の適当なApache httpdの動いている環境にコピーしました.

$ scp -r ./slide_dir user@host:~/public_html/cgi-bin/

この環境は .cgi しかcgiとして動かないので,.htaccess を作成して .pl もcgiとして動くようにしました.

$ echo 'AddHandler cgi-script .pl' > ./.htaccess
$ cat ./.htaccess
AddHandler cgi-script .pl

次に *.pl ファイルに実行権を付与します.httpdのユーザが実行できる権限にします.

$ chmod o+x ./*.pl

次にページ管理ファイルの currpic.txt に読み書き権を付与します.httpdのユーザが読み書きできる権限にします.

$ chmod o+rw ./currpic.txt

これは恐らくサーバの環境依存でやらなくても動く環境のほうが多いと思うので一旦スキップして動かなかったら設定してください.editpic.pl, editpic.pl, savepic.pl, show.pl ファイルの require "common.pl"; 行を require "./common.pl"; に書き換えます.

- require "common.pl";
+ require "./common.pl";

この状態でウェブブラウザで視聴者は index.html を,プレゼンターは slide.html (html書き出し時のファイル名)を開けばOKなはずです.

以下今回試したサンプルです.多分すぐに消します.

仕組みとしてはプレゼンターがページめくり操作をすると,ページ番号の保存されている currpic.txt ファイルにページ番号を格納.
視聴者側のブラウザでは1秒毎に cgi を呼び出していて,呼び出された cgi 側では現在のページ番号が保存されている currpic.txt の内容から該当のページを表示する.といったことをしているようです.
そのためプレゼンターが操作してから実際に視聴者のページが更新されるまで数秒掛かる感じです.

中を見ると解りますがライブラリも同梱の小さな独自ライブラリ1つだけで行数も少なくとてもプリミティブです.これは誰も使わず埋もれて何年も放置されていそうです.
出来ることなら最近のギジュとで書き直されてほしいけどこれまでの放置っぷりから難しそうですね.

とりあえずはWebに公開して口頭でページめくりを指示するのが現実的そうです.
(それか普通に画面共有)

LibreOffice環境
$ dpkg-query -W libreoffice
libreoffice     1:6.4.4-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
WebServer環境
$ dpkg-query -W apache2 perl
apache2 2.4.41-4ubuntu3
perl    5.30.0-9build1
$ lsb_release -dr
Description:    Ubuntu 20.04 LTS
Release:        20.04
$ uname -m
x86_64

Linuxマルチモニタ環境のウェブブラウザでスクリーン共有を行うとすべてのスクリーンが共有されてしまう問題がChromiumで解決

例えばモニタの設定がこうなっている状態で

Linux multimonitor 20200526 22:05:26 3278321

ウェブブラウザでJitsi MeetやZoomなどでスクリーン共有しようとすると複数のスクリーンがすべて一緒になって1つの画面として共有されてしまいます.

Chromium 81.0.4044.92 built on Debian bullseye/sid, running on Debian bullseye/sid

Linux multimonitor 20200526 22:05:20 3267188

Mozilla Firefox 76.0.1(Debian sid amd64 package版)

Linux multimonitor 20200526 22:05:47 3311507

例えばLibreOffice でプレゼンテーションモードでセカンダリモニタにスライドをフルスクリーン表示させてそれを共有したいといったことがスクリーン共有で出来ませんでした.フルスクリーン表示の後そのウィンドウを共有することは出来ますが,途中で別のウィンドウを見せたい場合ウィンドウ共有をやり直さなければいけないのでとても面倒です.

これについて調べてみるとChromium では最近修正されたようです :)

以下からChromium のsnapshots binary を入手して試してみました.

試したバージョンは Chromium 85.0.4157.0 でした.

$ wget 'https://download-chromium.appspot.com/dl/Linux_x64?type=snapshots' -O ./chrome-linux.zip
$ unzip -l ./chrome-linux.zip | lv
$ unzip ./chrome-linux.zip
$ $ ./chrome-linux/chrome --version
Chromium 85.0.4157.0
$ ./chrome-linux/chrome --temp-profile --user-data-dir=`mktemp -d`

この環境で Jitsi Meet に接続して画面共有を試してみると Screen 1, Screen 2 とスクリーンごとに共有できるようになっていました :)

Linux muitimonitor 20200526 22:05:57 3299122

Stable に降りてくるのは暫く先でしょうが便利になりそうです.

ちなみにFirefox も少し調べてみましたが,以下のあたりでしょうか?未だ直ってなさそう?古いbugなので他にも上がってそちらで議論されていそうです.

環境
$ dpkg-query -W chromium firefox
chromium        81.0.4044.92-1
firefox 76.0.1-2
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

LibreOffice Hackfest Online #2 に参加して LibreOffice をbuildした

最近毎週水曜日に開催されている「LibreOffice Hackfest Online #2」に参加してみました.
今回は#2で#0から始まったので3回目.

Jitsi Meet で集まってYoutubeLive での配信も行っていました.配信された動画はアーカイブされていて以下で公開されています.

今回はLibreOffice のビルドをする回でした.自分は確か以前LOOLを試すためにbuildして以来で2,3年ぶりかな?デスクトップ版は初めてです.
いつも使っている環境はLinuxのDebian sid amd64 環境なのでここでbuildすることに.

当日だけだとsourceをとってくるだけで終わってしまうだろうと前日までに source の clone と build-dep でbuild に必要なパッケージを導入しておきました.

$ git clone git://anongit.freedesktop.org/libreoffice/core
$ sudo apt build-dep libreoffice

そして当日は autogen.sh を実行して依存関係に失敗,以下のあたりを追加で導入しました.

$ sudo apt install git ccache junit4 gstreamer1.0-libav libkrb5-dev nasm graphviz libpython3-dev

その後,再度 autogen.sh を実行.

$ ./autogen.sh

makeを掛けるとHackfest に利用しているJitsi Meets に影響が出そうです.てことで影響が出たら中断するつもりでこんな感じで優先度を下げて実行しました.問題なさそうなのでそのまま放置しておきました.

$ time nice -n 19 make -j1

Hackfest が終わってもまだ終わる気配はなかったのでそのままおいときます.
そして翌朝やっと終了していました.

make は20:06:23〜翌日の06:29:35 まで掛かっていました.優先度を下げていたとはいえかなり時間がかかりました.
時間がかかったのはCPUの温度が上がってCPUスロットリングが効いて0.8GHzとかにクロックが落ちていたのが大きそうです.

早速実行すると起動して利用できそうです.

$ instdir/program/soffice

LibOBuild1 20200507 12:05:26 2204368

しかしUI言語がUSAしか選べません.

LibOBuild2 20200507 19:05:56 2517755

恐らく autogen.sh の実行時にオプションがなかったせいだと思います.

$ ./autogen.sh --help|grep -i with-lang -A 13
  --with-lang="es sw tu cs sk"
                          Use this option to build LibreOffice with additional
                          UI language support. English (US) is always included
                          by default. Separate multiple languages with space.
                          For all languages, use --with-lang=ALL.
  --with-locales="en es pt fr zh kr ja"
                          Use this option to limit the locale information
                          built in. Separate multiple locales with space. Very
                          experimental and might well break stuff. Just a
                          desperate measure to shrink code and data size. By
                          default all the locales available is included. This
                          option is completely unrelated to --with-lang.

                          Affects also our character encoding conversion
                          tables for encodings mainly targeted for a
                          particular locale, like EUC-CN and EUC-TW for
                          zh, ISO-2022-JP for ja.

                          Affects also our add-on break iterator data for
                          some languages.

                          For the default, all locales, don't use this switch at all.
                          Specifying just the language part of a locale means all matching
                          locales will be included.

ということで --with-lang=ALL--with-locales="en es pt fr zh kr ja" で多国言語対応と,--with-package-format='deb' でDebian package 書き出し,それに依存して --enable-epm を付けてみました.

$ ./autogen.sh --with-package-format='deb' --enable-epm --with-lang=ALL --with-locales="en es pt fr zh kr ja"

そして make

今回は結果をTwitterに投稿するようにしてみました.

$ /bin/time -o /tmp/time -f "%E 位掛かりました" nice -n 19 make -j1 && echo "SAYAKAによる自動投稿: LibreOfficeのbuildが正常に 終わった みたいです.$(echo ;cat /tmp/time)" || echo "SAYAKAによる自動投稿: LibreOfficeのbuildが失敗したみたいです($?)$(echo ;cat /tmp/time)" | sayaka --post

しかし6時間46分程してから失敗><

SAYAKAによる自動投稿: LibreOfficeのbuildが失敗したみたいです(2)
Command exited with non-zero status 2
6:46:38 位掛かりました

logを見るとtranslationsのcloneをずっとやっていて回線が不安定になったかタイムアウトかそんな感じで途中でcloneに失敗して転けていました.

Cloning into '/home/matoken/src/core/translations'...
error: RPC failed; curl 56 GnuTLS recv error (-9): Error decoding the received TLS packet.

再度実行してみると正常終了しました.

SAYAKAによる自動投稿: LibreOfficeのbuildが正常に 終わったみたいです.
6:36:46 位掛かりました

起動してみると日本語も選べます :)

$ /instdir/program/soffice

libodevalpha0

せっかくbuildできたのでこのLibreOfficeDev 7.0.0.0.alpha0+ の Impress でスライドを作ってみました.60ページほどのスライドをざっと書いてみましたが特に問題なく普通にかけてしまい拍子抜けしてしまいました.

VPSサーバでもbuild

ローカルのDebian sid amd64環境ではうまく行ったけど回線やPCの問題で時間がかかります.VPSサーバでbuildしてからバイナリパッケージをダウンロードしたほうが早いのではと試してみました.
このサーバはドイツのニュルンベルクでホストされているContabo社のVPS300です.スペック(CPU 2Core/RAM 4GB/HDD 300GB)の割のとても安い(€3.99/月)けど回線が細い感じのサーバです.

OSはDebian 10(buster) amd64を導入してあります.依存関係が少し手間取りましたが後はスムーズに&手元のPCよりずっと速く終わりました.

必要なパッケージの導入
$ sudo apt build-dep libreoffice
$ sudo apt install libperl-dev libarchive-zip-perl javacc gperf python-dev bison flex ant doxygen ccache gstreamer1.0-libav libkrb5-dev nasm
sourceの入手
$ time git clone git://anongit.freedesktop.org/libreoffice/core
   :
real    35m26.954s
user    8m5.441s
sys     1m1.694s
autogen(--with-locales も`ALL` にしてみた)
$ time ./autogen.sh --with-package-format='deb' --enable-epm --with-lang=ALL --with-locales=ALL
make
$ time make -j$(nproc)
  :
real    137m3.246s
user    59m6.001s
sys     25m13.390s

その後も git pull && make とかして 7.0.0.0.alpha1+ にすることも出来ました.

buildしたDebianパッケージはいつまでかわからないけどここで公開しています.

てことでどうにかビルドできました.build後のsource ディレクトリ以下は20GB近く.build-depでも1GB以上消費しました.ディスクも結構食いますね.

相談しながら引っかかったら聞くという場があるのは助かりますね.今回の機会がなかったら自分でbuildしなかったと思います.

次回の「LibreOffice Hackfest Online #3」は05/13(Wed)に開催で以下のページから申し込みが出来ます.jitsi Meetでの開催で,YoutubeLiveでの配信も行われる予定です.

YoutubeLiveを音声のみで視聴する試み

Youtubeの動画には音声のみのストリームがあるのでこれをダウンロードしてpodcast的に聞いたりすることがあるのですが,YoutubeLiveには音声のみのストリームはないようです.

Youtube動画
$ youtube-dl --ignore-config -F https://www.youtube.com/watch?v=PNWQvqUUHbQ
[youtube] PNWQvqUUHbQ: Downloading webpage
[youtube] PNWQvqUUHbQ: Downloading MPD manifest
[info] Available formats for PNWQvqUUHbQ:
format code  extension  resolution note
251          webm       audio only DASH audio    3k , webm_dash container, opus @160k (48000Hz)
139          m4a        audio only DASH audio   49k , m4a_dash container, mp4a.40.5@ 48k (22050Hz)
140          m4a        audio only DASH audio  130k , m4a_dash container, mp4a.40.2@128k (44100Hz)
278          webm       256x144    DASH video   95k , webm_dash container, vp9, 30fps, video only
160          mp4        256x144    DASH video  108k , mp4_dash container, avc1.4d400b, 30fps, video only
242          webm       426x240    DASH video  220k , webm_dash container, vp9, 30fps, video only
133          mp4        426x240    DASH video  242k , mp4_dash container, avc1.4d400c, 30fps, video only
243          webm       640x360    DASH video  405k , webm_dash container, vp9, 30fps, video only
134          mp4        640x360    DASH video  463k , mp4_dash container, avc1.4d401e, 30fps, video only
244          webm       854x480    DASH video  752k , webm_dash container, vp9, 30fps, video only
135          mp4        854x480    DASH video 1155k , mp4_dash container, avc1.4d4014, 30fps, video only
247          webm       1280x720   DASH video 1505k , webm_dash container, vp9, 30fps, video only
136          mp4        1280x720   DASH video 2007k , mp4_dash container, avc1.4d401f, 30fps, video only
18           mp4        640x360    360p  494k , avc1.42001E, 30fps, mp4a.40.2@ 96k (44100Hz), 1.34MiB
22           mp4        1280x720   720p 1788k , avc1.64001F, 30fps, mp4a.40.2@192k (44100Hz) (best)
YoutubeLive
$ youtube-dl --ignore-config -F https://www.youtube.com/watch?v=XXXX-XXXXXX 2>/dev/null
[youtube] XXXX-XXXXXX: Downloading webpage
[youtube] XXXX-XXXXXX: Downloading m3u8 information
[youtube] XXXX-XXXXXX: Downloading MPD manifest
[info] Available formats for XXXX-XXXXXX:
format code  extension  resolution note
91           mp4        256x144    HLS  197k , avc1.42c00b, 30.0fps, mp4a.40.5@ 48k
92           mp4        426x240    HLS  338k , avc1.4d4015, 30.0fps, mp4a.40.5@ 48k
93           mp4        640x360    HLS  829k , avc1.4d401e, 30.0fps, mp4a.40.2@128k
94           mp4        854x480    HLS 1380k , avc1.4d401f, 30.0fps, mp4a.40.2@128k
95           mp4        1280x720   HLS 2593k , avc1.4d401f, 30.0fps, mp4a.40.2@256k (best)

これをリモートサーバでaudioのみに変換してしまうと細い回線で音声だけ聞くことが出来るのではと試してみました.
(屋外移動中などに聞くのを想定)

YoutubeLiveのダウンロードには youtube-dl ,変換には ffmpeg を利用しました.

youtube-dl についてはこのあたりを参考にしてください.

以下ではyoutube-dlで最低画質の動画(フォーマットコード91)の144p/48kな動画をダウンロードして標準出力に渡して,パイプでffmpegで受け取って音声だけ切り出して udp:1234 に配信しています.音質をあげたい場合は360pで128k,720pで256kのようなので対応の動画を選ぶと良いですね.

$ youtube-dl -f 91 $YOUTUBELIVEURL -o - | ffmpeg -i - -c:a copy -vn -f adts udp://127.0.0.1:1234

この状態で ffplay で受信して再生できました :)

$ ffplay udp://127.0.0.1:1234

リモートのVPSサーバとかでこれをやると外出先でMVNOの低速モードでの受信も問題なさそうです.
自分だけで聞く分にはこれでいいのですが,自分の配信したYoutubeLiveを多人数に音声を配信して聞いてもらいたいなどの場合には使えません.(他の人のものを勝手に不特定配信は駄目)

そこで Icecast2 に流すのも試してみました.
ほほ同じようにして流せました.PCとAndroid端末でモバイル回線の低速モードでも試してみたところ同時に視聴できました :)

$ youtube-dl --ignore-config -f 91 $YOUTUBELIVEURL -o - | ffmpeg -i - -c:a copy -vn -f adts -content_type audio/aac iceca
st://source:password@icecast2.example.org:8000/youtubelivetest
peeでデータを2つに分けてモニタしながらとかも
$ youtube-dl --ignore-config -f 91 $YOUTUBELIVEURL -o - | pee "ffplay -" "ffmpeg -i - -c:a copy -vn -f adts -content_type audio/aac iceca
st://source:password@icecast2.example.org:8000/youtubelivetest"

youtubelive2icecast2

$ mpv http://icecast2.example.org:8000/youtubelivetest.m3u

Playing: http://icecast2.example.org:8000/youtubelivetest
 (+) Audio --aid=1 (aac 2ch 48000Hz)
AO: [pulse] 48000Hz stereo 2ch float
A: 00:00:02 / 00:00:10 (24%) Cache: 7.9s/139KB
File tags:
 icy-title:
A: 00:00:22 / 00:00:30 (75%) Cache: 7.1s/126KB

YoutbeLive,Icecast2と間にサービスを挟むと遅延はどんどん大きくなるので余裕があったらYoutubeLiveに流すのと同じマシンで直接icecast2に流したほうがいいでしょうね.

懸念点としてはYoutubeのシステム的にこの視聴方法で視聴者数や視聴時間に貢献できるのかというところ.とりあえずは家に帰ったらウェブブラウザ等で視聴し直したり,リモートサーバでウェブブラウザを起動してYoutubeLiveを再生してその音声を取り込んだりするか…….そうなってくるとOBS Studio等を使ったほうがわかりやすいかもしれないですね.

しかし,値段だけ考えると特定のサービスで容量を消費しないカウントフリー,エンタメフリーオプション等でYoutubeに対応したSIMを使うという手も使えそうです.
自分は意思が弱く利用サービスがカウントフリーのものに偏ったりしそうだし,通信を見られるのが嫌なので今のところ使う予定はないです.

クライアント環境
$ youtube-dl --version
2020.05.03
$ dpkg-query -W ffmpeg mpv
ffmpeg  7:4.2.2-1+b1
mpv     0.32.0-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
Icecast2環境
$ youtube-dl --version
2020.05.03
$ dpkg-query -W ffmpeg icecast2
ffmpeg  7:4.1.4-1~deb10u1
icecast2        2.4.4-1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64