Nextcloudでurl共有したpdfをwebに埋め込みたい

スライドやドキュメントを共有するのにSpeakerDeckやedockrを使っています.(SlideShareは無料アカウントで再アップロードができなくなってしまってから使わなくなりました.)
SpeakerDeckの無料での制限で100アップロードまででそろそろいっぱい,edockrはしばらくしたら消えてしまうということを最近知りました.

pdfファイルを共有するだけならNextcloudでのURL共有を使えばいいのですが,webに埋め込むことが出来ません.Nextcloudの機能やアプリにそういったものがあるといいのですが,セキュリティの問題から実装されていません.

とりあえず雑な方法ですが,こんな感じで実現してみました.

Nextcloud URL共有リンクからpdfファイルを出力する

Nextcloudの公開URLの内容をpdfとして出力します.実行権を付けてcgiとして設定します.

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use IO::Handle;
STDOUT->autoflush(1);

$ARGV[0] = "" unless defined $ARGV[0];
my $url = $ARGV[0];
if( $url !~ /\/download$/ ){
  $url = $url . "/download";
}
print "Content-Type: application/pdf\n\n";
getprint($url);

とりあえずこんな感じでcgiの後ろにNextcloud公開URLを付けてアクセスするとブラウザでpdfを見ることができるようになりました.

embedタグでwebに埋め込む

上で作ったcgiをobjectタグで埋め込んでみるととりあえず埋め込みが出来ました.このとき height% を指定してもサイズが変わらないようでした.(Debian sid amd64 の chromium 88.0.4324.146-1, firefox 86.0.1-1 で確認)

<embed src="http://cgi.example.com/pdf.cgi?http://nextcloud.example.com/index.php/s/XXXXXXXXXXXXXXX" type="application/pdf" width="640px" height="480px">

とりあえずそれっぽいことは出来ましたが,この方法ではpdfを読まなくてもページ読み込み時にpdfを全部読み込んでしまうようなのであまりよろしくない感じです.このあたりはSpeakerdeckなどはちゃんとしてていいですね.

とりあえずはリンクで共有かな?

Nextcloudの2要素認証が出来ないときに管理者が1度限りのワンタイムコードを発行できる「Two-Factor Admin Support」

Nextcloudユーザが2要素認証を出来ないときにNextcloud管理者が48時間有効な1度限りのワンタイムコードを作成することができる「Two-Factor Admin Support」を試してみました.

「Two-Factor Admin Support」install
$ sudo -u www-data php occ app:install twofactor_admin

occコマンドで導入しました.WebインターフェイスからでもOKです.

nextcloud towfactor admin01

導入後,管理者アカウントで「設定」→「管理」→「セキュリティ」の「Two-Factor Admin」が出来ています.この「User ID」のテキストボックスにワンタイムコードを発行したいユーザIDを入力して「Generate」を押すと48時間有効なワンタイムコードが発行されます.このコードをユーザに伝えてログインしてもらいます.

occコマンドでのワンタイムコードの発行
$ sudo -u www-data php occ twofactorauth:admin:generate-code $USERID
There is an existing code that will be overwritten.

Generated new one-time code for test01: 163929
This code is valid for 48 hours.

occコマンドでも発行できます.

nextcloud towfactor admin02

該当ユーザはユーザID/パスワードを入力した後の2要素認証で「Admin code」という選択肢が増えるのでそれを選びます.

nextcloud towfactor admin03

管理者に教えてもらったワンタイムコードを入力してログインします.

TOTPのデバイスを壊してしまったり家に忘れてきたとかいったときに便利そうです.(数が少なければ)

環境
$ sudo -u www-data php /var/www/files.matoken.org/occ app:list | grep twofactor_admin:
  - twofactor_admin: 3.0.0
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

Nextcloudのmailアプリのアップデートに失敗してNextcloudが使えなくなって困る

Nextcloudアプリのアップデートを行ったところmailの処理中にコケてしまったようです.

$ sudo -u www-data php occ app:update --all
richdocuments new version available: 3.7.17
richdocuments updated
forms new version available: 2.2.1
forms updated
mail new version available: 1.9.2
An unhandled exception has been thrown:
Error: Call to undefined method OCA\Mail\Db\MessageMapper::findWithEmptyMessageId() in /var/www/files.matoken.org/apps/mail/lib/Migration/AddMissingMessageIds.
php:55
Stack trace:
#0 /var/www/files.matoken.org/lib/private/Repair.php(112): OCA\Mail\Migration\AddMissingMessageIds->run(Object(OC\Repair))
#1 /var/www/files.matoken.org/lib/private/legacy/OC_App.php(1042): OC\Repair->run()
#2 /var/www/files.matoken.org/lib/private/legacy/OC_App.php(979): OC_App::executeRepairSteps('mail', Array)
#3 /var/www/files.matoken.org/lib/private/Installer.php(206): OC_App::updateApp('mail')
#4 /var/www/files.matoken.org/core/Command/App/Update.php(116): OC\Installer->updateAppstoreApp('mail', false)
#5 /var/www/files.matoken.org/3rdparty/symfony/console/Command/Command.php(255): OC\Core\Command\App\Update->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 /var/www/files.matoken.org/3rdparty/symfony/console/Application.php(1000): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#7 /var/www/files.matoken.org/3rdparty/symfony/console/Application.php(271): Symfony\Component\Console\Application->doRunCommand(Object(OC\Core\Command\App\Update), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#8 /var/www/files.matoken.org/3rdparty/symfony/console/Application.php(147): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#9 /var/www/files.matoken.org/lib/private/Console/Application.php(215): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#10 /var/www/files.matoken.org/console.php(100): OC\Console\Application->run()
#11 /var/www/files.matoken.org/occ(11): require_once('/var/www/files....')
#12 {main}mk@www6073uo:/var/www/files.matoken.org

再度実行すると処理は進んだようですが,縮退モードのような感じになっています.この状態でNextcloudのWebにアクセスするとアップデートを求められて利用できません.

$ sudo -u www-data php occ app:update --all
Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
files_linkeditor new version available: 1.1.4
files_linkeditor updated

どうしたもんかととりあえず原因であろうmailをアップデートしようとするとすでに最新のようです.
次にmailを無効化してみました.するとNextcloud Webが利用できるようになりました.
一旦削除してインストールし直したほうが確実だろうなと思いつつmailを有効化するとNextcloudもmailも利用できるようになりました.

$ sudo -u www-data php occ app:update mail (1)
Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
$ sudo -u www-data php occ app:disable mail (2)
Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
mail 1.9.2 disabled
$ sudo -u www-data php occ app:enable mail (3)
mail 1.9.2 enabled
  1. mailアプリをアップデートしても反応はない
  2. mailアプリを無効化してNextcloud復旧
  3. mailアプリを有効化

occ app:disable mail の後 occ app:remove mail && occ app:install mail したほうが確実だと思います.

ちなみにNextcloud Hub以外のあまりメジャーでないアプリなどをインストールしてうまく動かないときにもNextcloudが動かなくなることがあります.そういうときも occ app:disable で復旧できるので覚えておくと助かります.

環境
$ sudo -u www-data php occ app:list | grep \ mail:
  - mail: 1.9.2
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

Nextcloudの電子メール2要素認証の「Two Factor e-mail provider」

Nextcloudアプリの「A Two-Factor-Auth Provider for e-mail」を試してみました.これはNextcloud認証時にユーザID/パスワードで認証した後設定されたメールアドレスにワンタイムトークンが届いて,それを使って2要素目の認証ができるようになるものです.

$ sudo -u www-data php occ app:install twofactor_admin
twofactor_admin 3.0.0 installed
twofactor_admin enabled

まずは導入.occ コマンドでインストールしました.WebIFからでもOKです.

nextcloud towfactor email01

2要素認証を有効にしたいユーザでNextcloud Webにログインして,「右上のアイコン」→「設定」→「個人情報」の「メール」に正しいメールアドレスが設定されているのを確認して,「セキュリティ」→「二要素認証」→「Email verification」の「Enable」を押して有効にします.

Note
電子メールアドレスが未登録だと以下のようなメッセージとなりました.
Could not generate a code: user hoge does not exist

nextcloud towfactor email02

するとトークンがNextcloudに設定したメールアドレスに送信されるのでメールを確認してトークンをテキストボックスに入力して,「Veryfi」を押して確認します.

nextcloud towfactor email03

うまく行きました.
一旦ログアウトしてログインしてみます.

nextcloud towfactor email04

ユーザID/パスワードで認証した後,「Email verification」の画面になります.メールが送信されているはずかので確認してそこに書かれているトークンを入力してログインします.

2要素認証ではTOTP以外にもSMS, Telegram, Signalなどもありますがそれぞれ設定が面倒です.電子メールであればユーザの設定は少ないので良さそうです.

環境
$ sudo -u www-data php occ app:list | grep previewgenerator:
  - previewgenerator: 3.1.1
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

Nextcloudのファイルプレビューを少しカスタマイズ

Nextcloudでは画像ファイル,MP3ファイルのカバー,テキストファイルのプレビューを生成できます.既定値ではこの機能は有効になっていて,アクセス時にプレビューが生成されます.
Nextcloudを軽く出来ないかと config/config.php ファイルに 'enable_previews' ⇒ false, を設定して無効にしてみましたが不便です.

nextcloud preview false

ということで再度プレビューを有効にしました.ついでにプレビューサイズを4096から1024に小さくしてプロバイダーを少し増やしてみました.

config/config.php
  'enable_previews' => true, (1)
  'preview_max_x'  =>  1024, (2)
  'preview_max_y'  =>  1024, (3)
  'preview_max_filesize_image'  =>  50, (4)
  'enabledPreviewProviders' => [ (5)
        'OC\Preview\PNG',
        'OC\Preview\JPEG',
        'OC\Preview\GIF',
        'OC\Preview\HEIC',
        'OC\Preview\BMP',
        'OC\Preview\XBitmap',
        'OC\Preview\MP3',
        'OC\Preview\TXT',
        'OC\Preview\MarkDown',
        'OC\Preview\OpenDocument',
        'OC\Preview\Krita',
        'OC\Preview\PDF',
        'OC\Preview\Postscript',
        'OC\Preview\SVG',
        'OC\Preview\TIFF',
        'OC\Preview\Font',
  ],
  1. プレビューを有効にする,既定値 true
  2. プレビュー横サイズ,既定値 4096
  3. プレビュー縦サイズ,既定値 4096
  4. プレビュー対象の最大ファイルサイズ,これ以上のサイズのファイルはプレビューが作られない,単位はMB,既定値 50
  5. プレビューファイルプロバイダー,既定値は '' で内容は,

edit 2021-03-17)
スマホ写真やpdfはあらかた1MBを超えるので preview_max_filesize_image は1MBから規定値の50MBに戻しました.

OC\Preview\BMP
OC\Preview\GIF
OC\Preview\HEIC
OC\Preview\JPEG
OC\Preview\MarkDown
OC\Preview\MP3
OC\Preview\PNG
OC\Preview\TXT
OC\Preview\XBitmap
OC\Preview\OpenDocument
OC\Preview\Krita

その他の既定値以外のプロバイダー

OC\Preview\Illustrator
OC\Preview\Movie
OC\Preview\MSOffice2003
OC\Preview\MSOffice2007
OC\Preview\MSOfficeDoc
OC\Preview\PDF
OC\Preview\Photoshop
OC\Preview\Postscript
OC\Preview\StarOffice
OC\Preview\SVG
OC\Preview\TIFF
OC\Preview\Font

そして Preview Generator というプレビューを事前生成してくれるアプリを試してみようとしましたが,暗号化を有効にしていると利用できませんでした.パスワード入力してプレビュー生成ができると便利かもですがなんにせよ自分以外のデータは触れないので微妙ですね.

Known issues
The app does not work with encryption enabled

— https://github.com/rullzer/previewgenerator#known-issues
$ sudo -u www-data php occ app:install previewgenerator (1)
previewgenerator 3.1.1 installed
previewgenerator enabled
$ sudo -u www-data php /var/www/files.matoken.org/occ | grep preview$ -A4 (2)
 preview
  preview:delete_old                      Delete old preview folder (pre NC11)
  preview:generate-all                    Generate previews
  preview:pre-generate                    Pre generate previews
  preview:repair                          distributes the existing previews into subfolders
$ sudo -u www-data php occ preview:generate-all (3)
Encryption is enabled. Aborted.
$ sudo -u www-data php occ app:remove previewgenerator (4)
previewgenerator disabled
previewgenerator 3.1.1 removed
  1. Preview Generatorをインストール
  2. usage
  3. 暗号化が有効だとプレビューの手動生成に失敗する
  4. Preview Generatorを削除
環境
$ sudo -u www-data php occ app:list | grep previewgenerator:
  - previewgenerator: 3.1.1
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

Nextcloudで画像ファイルをURL共有してWebに埋め込んで利用したい

NextcloudでURL共有した画像をblogなどに埋め込む方法のメモです.今回はNextcloud 20.0.8ですが,Nextcloud 13.0.0から可能になった機能のようです.
共有単位は画像ファイル単体はOKですが,画像ファイルを含むディレクトリ共有ではうまく動かないようです.

20210311 18:03:55 252379

共有したい画像を共有

20210311 18:03:42 228558

「URLで共有」の右の「+」で共有

20210311 18:03:55 228828

URL共有されてURLがコピーされる

20210311 18:03:19 229349

既定値では共有有効期限が1週間に設定されているのでずっと公開したい場合は「有効期限を設定」のチェックを外す

20210311 18:03:02 234008

共有されたURLを開くとプレビューになる

画像をクリックすると,画像が開ける.
若しくは共有URLに /preview を追加する.
拡張子がないとうまく動作しないsiteなどの場合は,/preview?dummy.jpg などのように /preview の後ろにさらにそれらしい文字列を追加すると開けたりする.

https://files.matoken.org/index.php/s/bsaAdtxp8WgXLXE (1)
https://files.matoken.org/index.php/s/bsaAdtxp8WgXLXE/preview (2)
https://files.matoken.org/index.php/s/bsaAdtxp8WgXLXE/preview?/dummy.jpg (3)
  1. 共有URL(プレビューURL)
  2. URL末尾に /preview をつけると画像が表示される
  3. /preview の後ろにダミーファイル名をつける

後は普通に静的画像URLのようにして使えます.

$ wget -o /dev/null -O - https://files.matoken.org/index.php/s/bsaAdtxp8WgXLXE/preview | pee "file -" display
/dev/stdin: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, comment: "CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90", baseline, precision 8, 512x342, components 3
preview

blogに貼り付けもできる :)

環境
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

ページャーのlv, less, moreからエディタを起動する

ページャーの lv でファイルを見ているときに猫がなにかキーを押してvimが起動しました.どうも何かのキーバインドで lv からvimが起動できるようです.

manを見ると v でエディタが起動するようです.

man lvより
v:     Launch the editor defined by option -E

そして -E オプションでエディタのコマンドがカスタマイズできるようです.

man lvより
-E'<editor>' (default 'vi -c %d')
       Editor name (default 'vi -c %d')
       ``%d'' means the line number of current position in a file.

しかし,lv起動時にこのオプションを指定するのは面倒.環境変数 EDITOR は効くかなと試すと効くようです.こちらで設定したほうがいいかもしれませんね.

$ EDITOR=ed lv ~/.bashrc

lvは環境依存が大きいのでもう少し汎用的なlessでも確認すると同じように v でviか,環境変数 EDITOR で指定されたものが起動するようです.

man lessより
v      Invokes an editor to edit the current file being viewed.  The editor is taken from the environment variable VISUAL if defined, or  EDITOR  if
       VISUAL is not defined, or defaults to "vi" if neither VISUAL nor EDITOR is defined.  See also the discussion of LESSEDIT under the section on
       PROMPTS below.

追記 2021-03-10)
moreコマンドも同様に v でエディタが起動します :)

man moreより
v         Start  up an editor at current line.  The edi‐
          tor is taken  from  the  environment  variable
          VISUAL  if defined, or EDITOR if VISUAL is not
          defined, or defaults to vi if  neither  VISUAL
          nor EDITOR is defined.
環境
$ dpkg-query -W lv less vim ed util-linux
ed      1.17-1
less    551-2
lv      4.51-8
util-linux      2.36.1-7
vim     2:8.2.2434-3
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

Twitterクライアントsayakaちゃんの最新版(3.5.0)をLinuxでビルドする

追記2021-03-09)
Raspberry Pi OS buster armhf 及び Ubuntu 21.04 (development branch) amd64でも同様にビルドできました :)

ターミナルで動作するTwitterクライアントとしてsayakaちゃんというものがあります.NetBSDの入ったSHARP X68030でも動作するという軽量なクライアントで,SIXELで画像が表示できたりストリームモードがあってハッシュタグなどを垂れ流すのに便利に使っています.

今日オープンソースカンファレンス2021 Online/Spring 2日目があって @ebijunさんの「NetBSDのご紹介」 を視聴していたのですが,新しいバージョンの 3.5.0 がリリースされたとのことで試してみました.

twitter クライアント sayaka ちゃん version 3.5.0 (2021/03/03)
ターミナルに特化した twitter クライアントです。

フィルタストリームの垂れ流しが出来ます。
フィルタストリームによる疑似ホームタイムラインが表示できます。
mlterm などの SIXEL 対応ターミナル用です。
X68030/25MHz、メモリ12MB でも快適(?)動作。
更新履歴
3.5.0 (2021/03/03) … C++ に移行し vala 版廃止。 画像は現在のところ JPEG, PNG のみ対応。 ターミナル背景色の自動取得を実装。 --protect、--support-evs オプション廃止。 --noimg オプションを廃止 (--no-image に変更)。 userstream 時代の録画データの再生機能廃止。

watchしてたけどメール届いていないようです?

sayaka watch

現在のバーションを確認してみます.1つ前のバージョンぽいですね.

$ sayaka --version
sayaka.vala 3.4.6 (2020/11/10)

ビルドを試みます.

$ git clone https://github.com/isaki68k/sayaka/ (1)
$ cd sayaka
$ git checkout 3.5.0
HEAD is now at 958f630 ver 3.5.0 (2021/03/03)
$ ./configure (2)
  1. sayakaのsourceをclone
  2. configure

足りないものがパッケージ名で表示されて助かります :)

configure: error: *** mbedtls not found.
        On Ubuntu, sudo apt install libmbedtls-dev
configure: error: *** mbedtls not found.
        On Ubuntu, sudo apt install libmbedtls-dev

./configure が通ったらmake……失敗です.

$ make
(cd src; make all)
make[1]: Entering directory '/home/matoken/src/sayaka/src'
Makefile:3: *** missing separator.  Stop.
make[1]: Leaving directory '/home/matoken/src/sayaka/src'
make: *** [Makefile:2: all] Error 2

必要なものをよく見ると,GNU makeではなく BSD make が必要となっていました.(3.4.6を確認するとこのときはGNU makeなので今回変わったようです)

必要なもの
C++17 compiler
jpeg (libjpeg)
libpng
mbedtls (2.9.0 or later?)
BSD make (not GNU make)

BSD makeを導入してGNU makeではなくBSD makeを使います.

$ sudo apt install bmake (1)
$ bmake sayaka (2)
$ src/sayaka --version (3)
sayaka version 3.5.0 (2021/03/03)
$ install src/sayaka ~/bin/ (4)
  1. BSD makeを導入
  2. BSD makeでsayakaをmake
  3. 出来上がったsayakaを叩いてみる
  4. sayakaを適当な場所( ~/bin )にコピーにinstall

ということでsayaka 3.5.0 にできました :)

私はmlterm等のSIXEL対応端末で検索したいキーワードを繋げていってデスクトップの横においておくといった感じで使っています.

環境
$ sayaka --version
sayaka version 3.5.0 (2021/03/03)
$ ldd src/sayaka | cut -f1 -d"(" | cut -f3 -d" " | xargs -n1 apt-file search | cut -f1 -d: | uniq | xargs dpkg-query -W | grep amd64
libbsd0:amd64   0.11.3-1
libc6:amd64     2.31-9
libgcc-s1:amd64 10.2.1-6
libjpeg62-turbo:amd64   1:2.0.6-2
libmbedcrypto3:amd64    2.16.9-0.1
libmbedtls12:amd64      2.16.9-0.1
libmbedx509-0:amd64     2.16.9-0.1
libmd0:amd64    1.0.3-3
libpng16-16:amd64       1.6.37-3
libstdc++6:amd64        10.2.1-6
zlib1g:amd64    1:1.2.11.dfsg-2
$ dpkg-query -W bmake build-essential
bmake   20200710-7
build-essential 12.9
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

ZSTD 1.4.9でLong Modeが速くなったらしいので少し試す

ZSTD 1.4.9がリリースされていました.

今回 --long 利用時に最大2倍の高速化が売りのようです.それはすごいってことで少し試してみました.

>2x Faster Long Distance Mode
Long Distance Mode (LDM) --long just got a whole lot faster thanks to optimizations by @mpu in #2483! These optimizations preserve the compression ratio but drastically speed up compression. It is especially noticeable in multithreaded mode, because the long distance match finder is not parallelized.

現在のzstdのバージョンは1つ前の1.4.8でした.

$ zstd -V
*** zstd command line interface 64-bits v1.4.8, by Yann Collet ***

1.4.9をsourceからbuildします.

$ sudo apt build-dep zstd (1)
$ git clone https://github.com/facebook/zstd (2)
$ cd zstd
$ git checkout v1.4.9 (3)
$ make (4)
$ ./zstd -V (5)
*** zstd command line interface 64-bits v1.4.9, by Yann Collet ***
  1. zstdビルドに必要なパッケージの導入
  2. sourceのclone
  3. 1.4.9に切り替え
  4. make
  5. バージョン確認
ZSTD(1)
       •   --long[=#]:  enables long distance matching with # windowLog, if not # is not present it defaults to 27. This increases the window
           size (windowLog) and memory usage for both the compressor and decompressor. This setting is designed to  improve  the  compression
           ratio for files with long matches at a large distance.

           Note: If windowLog is set to larger than 27, --long=windowLog or --memory=windowSize needs to be passed to the decompressor.

--long は 31までのようです.32を指定するとこういうエラーになります.

zstd: error 11 : Parameter is out of bound

ちょうど大きめのtarがあったのでこれで試します.

$ ls -l ../linux-5.11.tar
-rw-r--r-- 1 matoken matoken 1064212480 Feb 15 18:18 ../linux-5.11.tar
$ grep -m1 ^"model name" /proc/cpuinfo (1)
model name      : Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz
$ nproc (2)
4
$ /bin/time -f"\treal\t%e" zstd -q -T`nproc` -1 --long=31 ../linux-5.11.tar -o /dev/null (3)
        real    8.10
$ /bin/time -f"\treal\t%e" ./zstd -q -T`nproc` -1 --long=31 ../linux-5.11.tar -o /dev/null (4)
        real    5.27
$ /bin/time -f"\treal\t%e" zstd -q -T`nproc` --long=31 ../linux-5.11.tar -o /dev/null (5)
        real    8.36
$ /bin/time -f"\treal\t%e" ./zstd -q -T`nproc` --long=31 ../linux-5.11.tar -o /dev/null (6)
        real    5.76
$ /bin/time -f"\treal\t%e" zstd -q -T`nproc` -19 --long=31 ../linux-5.11.tar -o /dev/null (7)
        real    388.15
$ /bin/time -f"\treal\t%e" ./zstd -q -T`nproc` -19 --long=31 ../linux-5.11.tar -o /dev/null (8)
        real    318.08
$ /bin/time -f"\treal\t%e" zstd -q -T1 --long=31 ../linux-5.11.tar -o /dev/null (9)
        real    11.81
$ /bin/time -f"\treal\t%e" ./zstd -q -T1 --long=31 ../linux-5.11.tar -o /dev/null (10)
        real    7.89
  1. CPUは Intel® Core™ i5-3320M CPU @ 2.60GHz
  2. プロセッサ数
  3. 圧縮レベル1(最低)の1.4.8で8.10s
  4. 圧縮レベル1(最低)の1.4.9で5.27s
  5. 圧縮レベル3(デフォルト)の1.4.8で8.36s
  6. 圧縮レベル3(デフォルト)の1.4.9で5.76s
  7. 圧縮レベル19(最高)の1.4.8で388.15s
  8. 圧縮レベル19(最高)の1.4.9で318.08s
  9. スレッド数を1にしたときの圧縮レベル3(デフォルト)の1.4.8で11.81s
  10. スレッド数を1にしたときの圧縮レベル3(デフォルト)の1.4.8で7.89s

2倍とまでは行きませんが速くなっているようです :)
マルチスレッドで聞きそうなことが書かれていますが,スレッド数を1にしてもあまり割合変わらない?

この環境はよくサーマルスロットリングしているので参考程度に…….

環境
$ ./zstd -V
*** zstd command line interface 64-bits v1.4.9, by Yann Collet ***
$ zstd -V
*** zstd command line interface 64-bits v1.4.8, by Yann Collet ***
$ dpkg-query -W zstd
zstd    1.4.8+dfsg-2.1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

インタラクティブバイナリエディタのGNU pokeをbuild

gnu poke

インタラクティブで拡張可能なバイナリエディタのGNU pokeの1.0がリリースされました.とりあえずビルドして使えるようにしてみました.

$ sudo apt install libgc-dev libreadline-dev build-essential (1)
$ wget https://ftp.gnu.org/gnu/poke/poke-1.0.tar.gz https://ftp.gnu.org/gnu/poke/poke-1.0.tar.gz.sig (2)
$ gpg2 --verify ./poke-1.0.tar.gz.sig (3)
gpg: assuming signed data in './poke-1.0.tar.gz'
gpg: Signature made Fri 26 Feb 2021 06:59:30 PM JST
gpg:                using RSA key BDFA5717FC1DD35C2C3832A23EF90523B304AF08
gpg: Good signature from "Jose E. Marchesi <jemarch@gnu.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: BDFA 5717 FC1D D35C 2C38  32A2 3EF9 0523 B304 AF08
$ tar tvf ./poke-1.0.tar.gz | lv
$ tar xf ./poke-1.0.tar.gz (4)
$ cd poke-1.0
$ mkdir build (5)
$ cd build
$ ../configure --help
$ ../configure (6)
$ make (7)
$ make check (8)
  1. 必要なパッケージの導入
  2. ソースファイルダウンロード
  3. 署名確認
  4. source展開
  5. ビルドディレクトリ作成
  6. configure
  7. make

必要パッケージについてはここではDebianで必要最小限の物です.その他の関連パッケージや環境は DEPENDENCIES に書かれています.

$ poke/poke ${FILE}
     _____
 ---'   __\_______
            ______)  GNU poke 1.0
            __)
           __)
 ---._______)

Copyright (C) 2019-2021 The poke authors.
License 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.

Powered by Jitter 0.9.258.
Perpetrated by Jose E. Marchesi.

For help, type ".help".
Type ".exit" to leave the program.
(poke) .help TOPIC
Available help topics:

Commands:
        dump - display the contents of a range in the current IO space.
        copy - Copy a range of memory.
        save - Save a range of an IO space to a file.
        extract - Extract the contents of a mapped value to a mem IOS.
        scrabble - Scrabble part of an IO space based on patterns

To access the poke manual, type ".doc TOPIC".
(poke) dump
76543210  0011 2233 4455 6677 8899 aabb ccdd eeff  0123456789ABCDEF
00000000: 4d5a 7146 7044 3d27 0a00 0010 00f8 0000  MZqFpD='........
00000010: 0000 0000 0001 0008 4000 0000 0000 0000  ........@.......
00000020: 0000 0000 4a54 0000 0000 0000 0000 0000  ....JT..........
00000030: 0000 0000 0000 0000 0000 0000 500a 0000  ............P...
00000040: b240 eb00 eb14 9090 eb06 4883 ec08 31d2  .@........H...1.
00000050: bd00 00eb 05e9 a313 0000 fc0f 1f87 3ee0  ..............>.
00000060: bf00 7031 c98e c1fa 8ed7 89cc fb0e 1fe8  ..p1............
00000070: 0000 5e81 ee72 00b8 0002 5050 0731 ffb9  ..^..r....PP.1..
(poke) .exit

ちょっと起動してみましたが使い方がよくわからない……..docを読まないとかな?

$ sudo checkinstall \
--install=no \
--fstrans=no \
--maintainer='matoken@example.com' \
--pkgname='poke' \
--pkgversion='1.0' \
--pkgaltsource='http://www.jemarch.net/poke' \
make install
$ sudo apt install ./poke_1.0-1_amd64.deb

動くようなのでcheckinstallで一旦.debを作ってInstallしました.
活用できるといいな.

ちなみにいつもはbviを使うことが多いです.

環境
$ poke --version
GNU poke 1.0

Copyright (C) 2019-2021 The poke authors.
License 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.

Powered by Jitter 0.9.258.
Perpetrated by Jose E. Marchesi.
$ dpkg-query -W libgc-dev libreadline-dev build-essential poke
build-essential 12.9
libgc-dev:amd64 1:8.0.4-3
libreadline-dev:amd64   8.1-1
poke    1.0-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64