matoken's meme https://matoken.org/blog Mon, 20 Jan 2025 09:02:33 +0000 ja hourly 1 https://wordpress.org/?v=6.7.1 鹿児島Linux勉強会 2025.01に参加 https://matoken.org/blog/2025/01/20/kagolug-2025-01/ https://matoken.org/blog/2025/01/20/kagolug-2025-01/#respond Sun, 19 Jan 2025 22:51:48 +0000 https://matoken.org/blog/?p=4403

鹿児島Linux勉強会 2025.01に参加しました.

鹿児島Linux勉強会は毎月集まってアンカンファレンス形式でネタのある人が発表してそれにツッコミを入れていくような形式で進んでいきます.
最近はさくらのVPSでセルフホストしたビデオカンファレンスソフトウェアのGalèneを利用して開催しています.(現地(鹿児島)参加者が何人か集まるようならハイブリッド開催もしたいところ)

今回の主な話題です.

  • 「fuse-archiveでいろんなアーカイブをマウント」,https://codeberg.org/matoken/kagolug-2025.01/src/branch/main/slide/slide.adoc

  • 「git 2.47.1.404.ge66fd72e97 の …​ が単語単位に分割される — memo 0 ドキュメント 」,https://kuma35-memo.readthedocs.io/ja/latest/git-docs-ja/asciidoc-back-quotes.html

  • 「Asciidoc 翻訳小ネタ集 — memo 0 ドキュメント 」,https://kuma35-memo.readthedocs.io/ja/latest/git-docs-ja/asciidoc-koneta.html

  • 「(相談事)Kernelが見つけるinitファイルとしてのHellow worldプログラムの作り方」(PS1Linuxでメモリカードにrootfsを置いて起動したい)

自分は最近便利に使っているfuse-archiveというユーザ権限でアーカイブを手軽にファイルシステムにマウントできるツールの紹介をしました.

懇親会タイムではまた様々な話題が.
参加者の中の2名がQiita Advent Calendar 2024で完走賞を受賞されていました.次回ぬいぐるみ見せてもらえそう.

次回は2025-02-16(日)開催です.興味のある方はこちらからどうぞ.

]]>
https://matoken.org/blog/2025/01/20/kagolug-2025-01/feed/ 0
Google検索をJavaScript無しで-Whoogle Search利用- https://matoken.org/blog/2025/01/18/whoogle-search/ https://matoken.org/blog/2025/01/18/whoogle-search/#respond Sat, 18 Jan 2025 09:22:01 +0000 https://matoken.org/blog/?p=4396

先日USER-AGENTによりJavaScript無しでGoogle検索が出来る記事を書きました.

自分だけならこれでいいのですが,他の人にこれをやってもらうのは大変.Startpageなんかを使ってもらえばとか思いましたが自分の環境では現在エラーが出て利用できません.
久々にGoogle検索のプロキシサーバ的なWoogle Searchを試してみました.

いくつか導入方法があります.Dockerやpipxなんかがお手軽そうです.
ここではsourceをcloneしてvenvに構築しました.

$ sudo apt install libcurl4-openssl-dev libssl-dev git python3-venv
$ git clone https://github.com/benbusby/whoogle-search.git
$ cd whoogle-search
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ ./run

これで http://localhost:5000/ で利用できます.
今のところうまく動いているようです.

NoScriptでJavaScriptを無効にしたFirefoxでも,

whoogle fx

w3mでも動作しています.

whoogle w3m 01
whoogle w3m 02

メモリ利用量は起動時で66MB程,数重検索したあとで90MB程でした.
共有サーバで動かすなどしておいても良さそうです.

また,Googleにこだわらないのであれば200以上の検索エンジンに基づいたメタ検索エンジンのSearXNGなども面白いかもしれません.

環境
$ git log --pretty=oneline -1
99ca67c90ec82acc5f9b7e826c20a5bd0662c48a (HEAD -> main, origin/main, origin/HEAD) Fix duckduckgo search parameter (#1201)
$ dpkg-query -W libcurl4-openssl-dev libssl-dev git python3-venv
git     1:2.47.1-1
libcurl4-openssl-dev:amd64      8.11.1-1+b1
libssl-dev:amd64        3.4.0-2
python3-venv    3.13.1-2
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2025/01/18/whoogle-search/feed/ 0
Debian sid環境でDocker Composeが動かなくなった https://matoken.org/blog/2025/01/18/docker-compose-stopped-working-in-debian-sid-environment/ https://matoken.org/blog/2025/01/18/docker-compose-stopped-working-in-debian-sid-environment/#respond Fri, 17 Jan 2025 20:48:00 +0000 https://matoken.org/blog/?p=4386

Note

バグ報告したところ,2025-01-19(JSTでは20日)にパッケージが更新され,docker-composeパッケージがPython 3.13でも動作するようになりました.v2対応はまだ.

I uploaded docker-compose 1.29.2-6.4 earlier today to fix that. (I
can’t help with packaging 2.x, though.)

  • Replace pipes with shlex for Python 3.13 compatibility (closes:
    ).

Debian sidを再起動したあと自動起動するようになっていたDocker Composeコンテナが動いていません.手動で起動しようとすると以下のようなエラー.

$ docker-compose -v
Traceback (most recent call last):
  File "/usr/bin/docker-compose", line 33, in <module>
    sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
             ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/bin/docker-compose", line 25, in importlib_load_entry_point
    return next(matches).load()
           ~~~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/importlib/metadata/__init__.py", line 179, in load
    module = import_module(match.group('module'))
  File "/usr/lib/python3.13/importlib/__init__.py", line 88, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 5, in <module>
    import pipes
ModuleNotFoundError: No module named 'pipes'

そういえば少し前にPythonのversionが上がったのでそれが関係していそうです.
pipes関連のパッケージはdocker.io/docker-composeパッケージの依存には見当たりません.apt-cache searchでさがしても見当たりません.
pipesはPython 3.11で廃止され,3.13で削除されたようです.そしてDebian sidのPythonは少し前に3.13に上がっています.

$ python3 --version
Python 3.13.1
$ dpkg-query -W python3
python3 3.13.1-2

DebianとしてはDocker Comose v1は廃止されているのでv2に上げたいけどgoなどの依存パッケージが欠如しているためv2のパッケージ化が止まっているようです.

という感じでPython 3.13にアップグレードしたDebian sidではdocker-composeパッケージは動かなくなっています.
恐らくDocker Compose v2が降りてくるまでは動かないのかなと.

ということでとりあえずはDocker謹製のものを導入して凌ぐ必要がありそうです.

Docker.com謹製Dockerを導入

以下のページを参考に導入しました.

Debianの関連パッケージを削除
$ sudo apt remove docker.io docker-cli docker-doc docker-compose podman-docker containerd runc
DockerのPGP鍵の登録
$ sudo apt install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo tee /etc/apt/keyrings/docker.asc
$ gpg --show-keys /etc/apt/keyrings/docker.asc
pub   rsa4096 2017-02-22 [SCEA]
      9DC858229FC7DD38854AE2D88D81803C0EBFCD88
uid                      Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
$ w3m -dump https://download.docker.com/linux/debian/dists/
Index of linux/debian/dists/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

../
bookworm/
bullseye/
buster/
jessie/
stretch/
wheezy/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  bookworm stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian   bookworm stable
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
$ docker --version
Docker version 27.5.0, build a187fa5
$ docker compose version
Docker Compose version v2.32.4
Note
trixie(testing), sid(unstable), experimentalのパッケージはないようなのでbookworm(stable)用を利用しました.
Docker動作確認
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
Docker Cmposeも動作するのを確認
$ cd $PATH_TO_COMPOSE
$ docker compose up
   :
]]>
https://matoken.org/blog/2025/01/18/docker-compose-stopped-working-in-debian-sid-environment/feed/ 0
Google検索をJavaScript無しで https://matoken.org/blog/2025/01/17/google-search-without-javascript/ https://matoken.org/blog/2025/01/17/google-search-without-javascript/#comments Thu, 16 Jan 2025 21:49:35 +0000 https://matoken.org/blog/?p=4379

Google検索がJavaScript offで動かなくなったと聞いてFirefox+NoScript環境で試してみると確かに駄目.
更に http://www.google.com/httpservice/retry/enablejs にリダイレクトされて検索キーワードが消えてとても不便.

GoogleSearch NoJS

View on Mastodon

しかしダメ元でテキストブラウザのw3mで試すと動きます.環境により判断されている?といくつかのJavaScript無しのウェブブラウザで試してみるとこんな感じ.

動く

w3m (w3m/0.5.3+git20230121)
lynx (Lynx/2.9.2 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/3.8.5)
NetSurf (Mozilla/5.0 (X11; Linux) NetSurf/3.11)

動かない

Firefox+NoScript (Mozilla/5.0 (X11; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0)
Dillo (Dillo/3.1.1)

Note
括弧内はUSEA-AGENT

Firefox + NoScript環境でさらにUSER-AGENTを詐称してlynxやw3mにすると動作します.
ということでさしあたりUSER-AGENTを詐称すれば良さそうですが,今回試した中ではDilloがそれを簡単にできません.(恐らくsourceを書き換えが必要)

そして,cliでGoogle検索をするのに便利なGooglerも試してみたところこんな感じで動かなくなっていました.

$ googler neko
No results.
If you believe this is a bug, please review https://git.io/googler-no-results before submitting a bug report.

sourceを見るとUA はSafariになっているようです.( USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' )これをw3mやlynxに書き換えてみましたが駄目でした.
debugオプションを使ってquery結果のhtmlを覗くと元のSafariでもw3mなどでも検索結果は取得できています.

$ googler -debug neko
[DEBUG] googler version 4.3.13
[DEBUG] Python version 3.13.1
[DEBUG] Platform: Linux-6.12.9-amd64-x86_64-with-glibc2.40
/usr/bin/googler:3548: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
  current_version = Version(_VERSION_)
/usr/bin/googler:3549: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
  latest_version = Version(latest_version_str)
[DEBUG] Connecting to new host www.google.com
[DEBUG] Opened socket to 172.217.25.164:443
[DEBUG] new_connection completed in 0.264s
[DEBUG] Fetching URL /search?ie=UTF-8&oe=UTF-8&q=neko+-site:bug&sei=pp_1MVyOQZyTluhTiFyP6A
[DEBUG] Cookie: AEC=AZ6Zc-WrVVC8RQohzvoaSzeVCDUEfTRTNYlYgZ_iymf0Dsf_sDtMmliRF3c
[DEBUG] fetch_page completed in 0.551s
[DEBUG] Response body written to '/tmp/googler-response-h4zgk7n0.html'.
[DEBUG] parse completed in 0.016s
No results.
[DEBUG] Fetching https://raw.githubusercontent.com/grassdionera/googler/master/info.json for project status...
If you believe this is a bug, please review https://git.io/googler-no-results before submitting a bug report.

googler dillo

これはこれまでと結果のhtmlが変更になりパースに失敗してGooglerでNo results.になっていそうです.
この検索結果のhtmlを解析してGooglerを書き換える必要がありそうです.でもこれまたいつ変わるかわからないのであまりやりたくないですね…….
とりあえずはw3mなどで検索するのが良さそうです.

もしくはDuckDuckGoなどの別の検索エンジンにを使う.私は以前よりDuckDuckGoをメインに利用しています.
ちなみにDuckDuckGoをJavaScript無しで利用する場合 www.duckduckgo.com で検索するとリダイレクトを挟んでちょっと面倒なので https://html.duckduckgo.com/html?q=クエリー のような感じで使っています.cliの場合Googlerのようなddgrというコマンドもあります.

環境
$ dillo --version
Dillo version 3.1.1
$ dpkg-query -W w3m lynx netsurf-gtk firefox
firefox 134.0.1-1
lynx    2.9.2-1
netsurf-gtk     3.11-2
w3m     0.5.3+git20230121-2.1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2025/01/17/google-search-without-javascript/feed/ 1
ParrotOS gpg key更新 https://matoken.org/blog/2025/01/14/parrotos-gpg-key-update/ https://matoken.org/blog/2025/01/14/parrotos-gpg-key-update/#respond Tue, 14 Jan 2025 10:08:21 +0000 https://matoken.org/blog/?p=4368

ParrotOSでapt update時にエラーが出るようになりました.

The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286AF0E81EE4A

フルメッセージは以下の通り
$ sudo apt update
Get:1 https://deb.parrot.sh/parrot lory InRelease [29.8 kB]
Get:2 https://deb.parrot.sh/direct/parrot lory-security InRelease [29.4 kB]
Get:3 https://deb.parrot.sh/parrot lory-backports InRelease [29.7 kB]
Err:1 https://deb.parrot.sh/parrot lory InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
Get:4 https://pkgs.tailscale.com/stable/ubuntu noble InRelease
Err:2 https://deb.parrot.sh/direct/parrot lory-security InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
Err:3 https://deb.parrot.sh/parrot lory-backports InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
Fetched 6578 B in 1s (5701 B/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://deb.parrot.sh/parrot lory InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://deb.parrot.sh/direct/parrot lory-security InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://deb.parrot.sh/parrot lory-backports InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
W: Failed to fetch https://deb.parrot.sh/parrot/dists/lory/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
W: Failed to fetch https://deb.parrot.sh/direct/parrot/dists/lory-security/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
W: Failed to fetch https://deb.parrot.sh/parrot/dists/lory-backports/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7A8286AF0E81EE4A
W: Some index files failed to download. They have been ignored, or old ones used instead.
日本語の場合
$ LC_ALL=ja_JP.UTF-8 sudo apt update
取得:1 https://pkgs.tailscale.com/stable/ubuntu noble InRelease
取得:2 https://deb.parrot.sh/parrot lory InRelease [29.8 kB]
取得:3 https://deb.parrot.sh/direct/parrot lory-security InRelease [29.4 kB]
取得:4 https://deb.parrot.sh/parrot lory-backports InRelease [29.7 kB]
エラー:2 https://deb.parrot.sh/parrot lory InRelease
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286AF0E81EE4A
エラー:3 https://deb.parrot.sh/direct/parrot lory-security InRelease
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286AF0E81EE4A
エラー:4 https://deb.parrot.sh/parrot lory-backports InRelease
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286AF0E81EE4A
95.5 kB を 2秒 で取得しました (45.2 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージはすべて最新です。
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://deb.parrot.sh/parrot lory InRe
lease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286AF0E81EE4A
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://deb.parrot.sh/direct/parrot lo
ry-security InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286AF0E81EE4A
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://deb.parrot.sh/parrot lory-back
ports InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286AF0E81EE4A
W: https://deb.parrot.sh/parrot/dists/lory/InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 7A8286
AF0E81EE4A
W: https://deb.parrot.sh/direct/parrot/dists/lory-security/InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした:
NO_PUBKEY 7A8286AF0E81EE4A
W: https://deb.parrot.sh/parrot/dists/lory-backports/InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUB
KEY 7A8286AF0E81EE4A
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

Parrotのblogに情報がありました.

しかしこのblogはJavaScriptが有効でないと本文が出てきません.電子署名された部分を以下に張っておきます.
この部分をファイルに保存して gpg –verify で検証しましょう.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

APT KEYRING ERROR

in case apt said that your gpg key is expired,
the solution is to download and install the
latest version of parrot-archive-keyring from our repository

https://deb.parrot.sh/parrot/pool/main/p/
parrot-archive-keyring/parrot-archive-keyring_2024.12_all.deb

once installed. the new key with id 7A8286AF0E81EE4A
will replace the expired key with id 823BF07CEB5C469B

once downloaded, the sha256 hash of the deb file should be
188c74cf726fad499ec416dc6b7dcd9718800aa7178290c10ef7040aea9b5272


this message is digitally signed with the team leader's personal gpg key
(f4c6b9a4), with the expired repository key and with the new one

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEzB4RdX9xx1hDf3ltLtvDE03BeQAFAmeBSI0ACgkQLtvDE03B
eQBm4w/9HLqPGa6P6c9vyPJXoUNYHXHIY+EgP5AyJnaCSoL7hMzUuawFyy1vA8P/
9+2UsJEfWCpXPItmwzXcWRlAMRZvTfKQSFqNl7Ue6j/ftYZCeJpGKZUb1CDspM6X
UowO5+Cx+1nErcV9Ctc+SLvSmd5w765bYAlRFvV3PqR5MISiytznY5T1s7VTLT8a
t80pAZzSROnpagSztxK8ut2X82rIytoq9GUPTyucu85bif9LQUgKQmNpf9e/WFCl
/Lv+5opOE2irUYxLLFGhVu/LJ5IOYSj0h1X5pULbzsc459yb+X4j+W3jpUwk7lLZ
3yN2wMQyEzM1Qhwpg6GJhXdLaDk3b6xxqIVyqgb0mHv0wPcEGbJDWSW+Ay0aJ0CS
Jk4kruHH6uByISY93s9qr0UsjbafPFFdRgVOTkBq7rnB37FuYOFqJqHtXljvUkON
u6gRzyBrl4kdzzxS2Co3LmFSi4NKh8cf/f1UICaof5uCR05PWMwYiz1p7v7gxCKG
2+KljsSyHovmcalohEVoR1cGtfLbNRm3Lj4pufaXzZ7ENGHWeHVsAwssO5uXitTJ
3PrH8lKoP37JsNJZtuCidX4xcx9QC3qc4kBwDpjS0Two1Ha2uARN8I1fD9+2aj7a
gArtQyqQZA92JZ9a1pF7tqPn7R7RIXOHZKvnZsUTzG1wZGOyHHqJAjMEAQEKAB0W
IQS3EYIjRlUuTZLaAt96goavDoHuSgUCZ4FIjgAKCRB6goavDoHuSqseD/4tQxSr
ia1rnu06cU8iYscfC0VubEuXAKqzftUV2ERmEjbAQu8euVNbzvfsMTD+ufSRzG8J
HZjlw74bhQCA6HqLDMjHygLjMGMdhGw3/p7/u+n3El40TEI/NjDjSYJzHuhlokTb
+eLnFPVJc4kNOxVFdHLhDzfVGiLBcFLriYiX0bdwqp1KUaLD+7R5ZSDd7ijUZX1r
hxXDUk5CHJ7Fcxn0VwgwSh81hWIPzXQ3DIaHxcErsGsKvFqG0eUksrca+xi6UN0m
4O5QMSSTtJtwvJafIXNnxoE1vd+gch/HeUFvTX8pYRccLSyLYwkdvZ4a6v9FOel0
acSSHgMZ8zge3pzSCYC1K++17XWg6utoGGLKiLIez24rS+2un3GY1EgdaNJSM3pq
aTtcBFSZOVWoCE6S2KKJNHFerKXWDXPeQpLX5Q4xqCPGPk6Y/36A3+AFEYQBg2r4
DLgGKTI2ZLDcd0ThOEj5xh/j9OohbQSZlfl49uDjGUqWO04VxnL+52pYTlzlbauw
+jc1+3xH118ZnUP8QDkwiLMoAyA3yEMIOAdKyQKzD/x8ymm0slMLvhv+Y31QE0+j
SW1zN+nprtvFc32y7oD7g2RsPelX8m1Sy8pw43sZHErZ9Zn/wN9T0B0Kuzpi+xp8
ziIg1WcLolkcMOHsGruRd4b+k3kcryCeOg9d2okCMwQBAQoAHRYhBItAYMppqXNW
stz1UYI78HzrXEabBQJngUiOAAoJEII78HzrXEabfpIP/1raezwqyHwyg5CeZFUe
GVT2oIEB6vwzcx45y37QgK5aEmPkU9R1Rob5JcTMi+MxhFHU8Ap7WIo0GleoY9Gk
mE4/ZRxD7yo5LIG05sYJ36VBYcXY3rBXbzIwis2luLXQ9+8zg+2uUDv9VHEp7ciK
U7ny6zebeH1AIlWG9E+r5bx0KzmeoE5w9EUY1Vr7/+hf0K+23UUYZ9vI6GN1o9k1
RBXZ3bYP3XOGPlFXEh6OSd+73mgGN5WAad61argGXDeGZOD7Kzwb0K6idyMsPRrf
aSTHW3ZLj2sOPb+jEEoIIJtb/mXiOg2rzw5swBCYNws31gKolOTfrNtxF1kI0kh1
LaFPWJcHfXaQsdW3kxLa0pnr+IeNrI6Erlgrrrfhrz/7S1Ai2J6FIF2emGyxI9J8
kLT5ozlht5wh8AfGE7LzZS9/GXBvriDv4j7b5TYMgdEFa+PI4NhV+m6vis3tIPXY
nZvODnrO9gygJRRS6JY3XKgoIZPDzMxFZCyJzLZUKzEhRKT9aCSybiIq1HPfCAxL
/FUuYHi20VL7GUaA2PFEWZauPjdArPEOKw9IDJ8sZ+WSWnuyT7iu/jlEc2UAfBQZ
ykZ3qhzX/PoNPxRKQSJj374AE4207+39dIywJs/m1KvrYS/Grv9i5mtN0qS11R3u
+YKCyNGmO2MbT0jW9a50xR1Q
=ZggF
-----END PGP SIGNATURE-----

GPG keyは以下で確認できそうです.

というとで内容はParrotが署名したもので間違い無さそうです.
新しいkeyring packageをダウンロードしてhash確認,インストールしてapt updateがうまく行くようになりました.

$ wget2 -c -v https://deb.parrot.sh/parrot/pool/main/p/parrot-archive-keyring/parrot-archive-keyring_2024.12_all.deb (1)
$ sha256sum ./parrot-archive-keyring_2024.12_all.deb (2)
$ sudo apt install ./parrot-archive-keyring_2024.12_all.deb (3)
$ sudo apt update (4)
  1. keyring packageをダウンロード

  2. hash確認

  3. package導入

  4. apt updateがうまく行くのを確認

環境
$ dpkg-query -W parrot-archive-keyring gpg apt
apt     2.6.1
gpg     2.2.40-1.1
parrot-archive-keyring  2024.12
$ lsb_release -dr
No LSB modules are available.
Description:    Parrot Security 6.1 (lorikeet)
Release:        6.1
$ arch
x86_64
]]>
https://matoken.org/blog/2025/01/14/parrotos-gpg-key-update/feed/ 0
nanotodon 0.5.0でSixel https://matoken.org/blog/2025/01/12/nanotodon-0-5-0/ https://matoken.org/blog/2025/01/12/nanotodon-0-5-0/#respond Sat, 11 Jan 2025 22:03:50 +0000 https://matoken.org/blog/?p=4365

CLI Mastodon clientのnanotodon 0.5.0がリリースされました.
Sixel対応のようです.

  • Sixelがある程度動くようになった

Sixelのつかいかた

Makefileを見てね!

ということでReleaseからsource archiveを入手したり,git cloneしてMakefileを見てみます.

$ wget2 -c -v https://github.com/taka-tuos/nanotodon/archive/refs/tags/0.5.0.tar.gz
$ tar tvf 0.5.0.tar.gz
$ cd nanotodon-0.5.0

or

$ git clone https://github.com/taka-tuos/nanotodon
$ cd nanotodon
$ git checkout -b 0.5.0

Sixel対応のため以下のように編集しました.(Webpはオプション)

$ git diff Makefile
diff --git a/Makefile b/Makefile
index 6332820..238c2ed 100644
--- a/Makefile
+++ b/Makefile
@@ -10,11 +10,11 @@ LDLIBS += -lcurl -lpthread -lm
 CFLAGS += -DSUPPORT_XDG_BASE_DIR

 # EXPERIMENTAL: sixel support
-#CFLAGS += -DUSE_SIXEL
+CFLAGS += -DUSE_SIXEL

 # EXPERIMENTAL: webp support
-#CFLAGS += -DUSE_WEBP
-#LDLIBS += -lwebp
+CFLAGS += -DUSE_WEBP
+LDLIBS += -lwebp

 # for pkgsrc
 #CFLAGS += -I/usr/pkg/include
Note

webpを無効にするとwebp形式の画像の表示に失敗します.画像は以下のものに差し替えられました.結構webpは多いので有効にしたほうが良さそうです.

err

View on Mastodon

buildします.

$ make

そしてnanotodonを実行.

$ ./nanotodon

アイコンや添付画像がSixelで表示されるようになりました :)

nanotodon sixel

Sixel対応端末については以下のページが参考になります.

今回はmltermの上でtmuxを動かし,その上でnanotodonを動かしました.
以下はtmuxの上の窓でnanotodon,下の窓でsayakaでMisskeyを表示しています.

nanotodonsayaka

楽しいです :)

環境
$ dpkg-query -W make gcc libcurl4t64 libblis64-4-pthread
gcc     4:14.2.0-1
libblis64-4-pthread:amd64       1.0-1+b1
libcurl4t64:amd64       8.11.1-1
make    4.4.1-1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2025/01/12/nanotodon-0-5-0/feed/ 0
シンプルな暗号化ツールのEncpipe https://matoken.org/blog/2025/01/06/encpipe/ https://matoken.org/blog/2025/01/06/encpipe/#respond Sun, 05 Jan 2025 21:46:41 +0000 https://matoken.org/blog/?p=4360

Minisignでファイルに署名,検証」のMinisignで紹介されていたEncpipeを少し試してみました.

build
$ git clone https://github.com/jedisct1/encpipe
$ cd encpipe
$ make
Usage
$ ./encpipe
Usage:
    encpipe -G
    encpipe {-e | -d} {-p <string> | -P <file>} [-i <file>] [-o <file>]

Options:
    -G, --passgen          generate a random password
    -e, --encrypt          encryption mode
    -d, --decrypt          decryption mode
    -p, --pass <password>  use <password>
    -P, --passfile <file>  read password from <file>
    -i, --in <file>        read input from <file>
    -o, --out <file>       write output to <file>
    -h, --help             print this message
ランダムなパスワードを生成
$ ./encpipe -G
208294fbcff996f8c859d54d1c8f7d8ac4c0c813a0867abb5b76830c2aa8ac1a
$ ./encpipe -G
311259951f2bfdf5464be05e7eedb88159bf23fdc066adbf89266effea2f9556
$ ./encpipe -G | wc -c
65
暗号化
$ ./encpipe --encrypt \ (1)
  -p 'fcfd940ac76997530341232fa3ee32f39a6b40a0477af1c138e6d21d921ae97a' \ (2)
  -i ./README.md \ (3)
  -o ./README.md.encpipe (4)
  $ cat ./README.md.encpipe | od -xc | head -4
0000000    0474    0000    fb09    d6fb    2524    8820    9261    b74c
          t 004  \0  \0  \t 373 373 326   $   %     210   a 222   L 267
0000020    fb04    c95f    0df6    218c    1ff5    4a4a    5272    685f
        004 373   _ 311 366  \r 214   ! 365 037   J   J   r   R   _   h
  1. 暗号化モード

  2. パスワード文字列指定

  3. 暗号化対象ファイル

  4. 暗号化出力ファイル

復号化
$ ./encpipe --decrypt \ (1)
  -p 'fcfd940ac76997530341232fa3ee32f39a6b40a0477af1c138e6d21d921ae97a' \ (2)
  -i ./README.md.encpipe \ (3)
  -o - | \ (4)
  head -6
![CodeQL scan](https://github.com/jedisct1/encpipe/workflows/CodeQL%20scan/badge.svg)

Encpipe
=======

The dum^H^H^Hsimplest encryption tool in the world.
  1. 復号化モード

  2. パスワード文字列

  3. 入力ファイル

  4. 出力ファイル(-で標準出力に)

パイプ経由で圧縮しつつ暗号化,パイプ経由で復号化しつつ展開
$ cat README.md | zstd | ./encpipe -e -p 'easy-pass' -i - -o - > README.md.zstd.encpipe
$ cat README.md.zstd.encpipe | ./encpipe -d -p 'easy-pass' -i - -o - | zstdcat | head -4
![CodeQL scan](https://github.com/jedisct1/encpipe/workflows/CodeQL%20scan/badge.svg)

Encpipe
=======
ネットワーク経路を暗号化
$ nc -l 6666 | ./encpipe -d -p 'pass' (1)
$ ./encpipe -e -p 'pass' -i ./README.md | nc 127.0.0.1 6666 (2)
  1. 受け取り側の準備,ncでtcp:6666で待ち受けて結果をEncpipeで復号

  2. 送信側,Encpipeで暗号化,ncに流し込み

速度比較
$ time dd if=/dev/zero bs=1M count=1024 2>/dev/null | ./encpipe -e -p `./encpipe -G` > /dev/null

real    0m53.818s
user    0m53.378s
sys     0m0.720s
$ time dd if=/dev/zero bs=1M count=1024 2>/dev/null | GPG_TTY=$(tty) gpg -e -r matoken@gmail.com > /dev/null

real    0m5.883s
user    0m5.574s
sys     0m0.644s

Encpipeは案外遅い

Note
このときのgpgの暗号方式はAES256.CFB.

なぜこのツールを作ったのかというとGnuPGやOpenSSLの利用方法を覚えるより使ったほうが速いからだそうです.たしかにこれらのツールはオプションが多く大変ですね…….

環境
$ git log --pretty=oneline -1
7156490a5fa8e0cd1da748451840dfed2d82fe4b (HEAD -> master, origin/master, origin/HEAD) Bump year
$ dpkg-query -W gcc make gpg zstd
gcc     4:14.2.0-1
gpg     2.2.45-2
make    4.4.1-1
zstd    1.5.6+dfsg-2
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2025/01/06/encpipe/feed/ 0
AndroidアプリのCan I Driveでお酒を飲んだあといつ頃運転できるか教えてもらう https://matoken.org/blog/2025/01/05/can-i-drive/ https://matoken.org/blog/2025/01/05/can-i-drive/#respond Sat, 04 Jan 2025 21:53:29 +0000 https://matoken.org/blog/?p=4356

ic launcher beer foreground
年末年始はアルコールを摂る機会が増える人が多いと思います.しかしアルコールを摂ると乗り物の運転ができなくなります.どのくらいでアルコールが抜けるかは個人差もありますが目安の計算式があります.でも計算するのは面倒.
ここではAndroidで動作する自分が接種したアルコール量で運転が可能かどうかの目安が簡単にわかるアプリケーションの Can I Drive の紹介をします.

Can I Driveは飲酒中に接種したアルコールをアプリ上で登録することでいつ頃運転できるようになるかの目安時間を計算して表示してくれます.

Can I DriveはF-Droidから入手が可能です,

Can I Driveを起動するとこんな画面が表示されます.まずは左下の人形のアイコンをタップします.

CanIDrive01

利用者の情報を登録します.

Weight

体重

sex

性別

Health

体調

Drive law

運転する法律の国

体重,性別は普通に.体調はその時の体調で調整,国は日本の場合日本を選ぶだけでいいですが,国によっては他にも職業ドライバーであるなどのチェックボックスが表示されたりします.職業ドライバーだと厳しくなるようです.
これらの情報を入力すると準備完了です.右下のチェックアイコンで完了します.

CanIDrive02

Can I Driveのメイン画面に戻ります.メイン画面の右下の+アイコンから接種したアルコールを登録します.

CanIDrive03

いくつかのアルコールプリセットが表示されます.ここから自分の接種したアルコールを登録します.Whenで規定値は現在ですが,過去に遡って登録もできます.

自分でアルコールをプリセットに登録することもできます.例えば以下のように「oyuwari」という名前の130mlアルコール度数10%のアルコールを登録したりできます.

CanIDrive04

アルコールを登録するとメイン画面に戻り,ステータスが表示されます.
以下の例では運転は不可,推定血中アルコール(0.63g/L),運転が可能になる時間(8:36),血中アルコール濃度が0になり酔が覚める時間(11:00)がわかります.

CanIDrive05

アルコールを摂るたびに登録していくとこれらのステータスは更新されていきます.
これにより運転が可能になる時間の目安がわかるようになります.登録してみると夜に飲み会に出て次の日の朝にはまだ運転できそうにないなとかいったことがわかります.

ただし,これはあくまで目安で個人差や体調などで大分変わるでしょう.でも手計算するよりは大文楽で便利です.

]]>
https://matoken.org/blog/2025/01/05/can-i-drive/feed/ 0
Minisignでファイルに署名,検証 https://matoken.org/blog/2025/01/04/minisign/ https://matoken.org/blog/2025/01/04/minisign/#comments Fri, 03 Jan 2025 21:55:47 +0000 https://matoken.org/blog/?p=4346

ファイルの署名や検証にはPGP署名がよく使われますがZigではMinisignが使われています.たまにしか使わないので少し調べてみました.

検証に使う

Zigのダウンロードページには以下のように公開鍵が用意されていて,ダンロードファイルにそれぞれ署名ファイルが用意されています.

Files are signed with minisign using this public key:

RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U

MinisignはDebianパッケージがあるのでこちらを導入して使いました.

$ sudo apt install minisign
$ apt show minisign
Package: minisign
Version: 0.11-1
Priority: optional
Section: misc
Maintainer: Josenilson Ferreira da Silva <nilsonfsilva@hotmail.com>
Installed-Size: 49.2 kB
Depends: libc6 (>= 2.34), libsodium23 (>= 0.7.0)
Homepage: https://jedisct1.github.io/minisign/
Download-Size: 16.7 kB
APT-Manual-Installed: yes
APT-Sources: http://ftp.jp.debian.org/debian sid/main amd64 Packages
Description: Dead simple tool to sign files and verify signatures
 Minisign is a dead simple tool to sign files and verify signatures.
 It is portable, lightweight, and uses the highly secure Ed25519
 public-key signature system. Signature files include an untrusted
 comment line that can be freely modified, even after signature
 creation. They also include a second comment line, that cannot be
 modified without the secret key. Trusted comments can be used to add
 instructions or application-specific metadata (intended file name,
 timestamps, resource identifiers, version numbers to prevent
 downgrade attacks).
usage
$ minisign
Usage:
minisign -G [-f] [-p pubkey_file] [-s seckey_file] [-W]
minisign -R [-s seckey_file] [-p pubkey_file]
minisign -C [-s seckey_file] [-W]
minisign -S [-l] [-x sig_file] [-s seckey_file] [-c untrusted_comment]
            [-t trusted_comment] -m file [file ...]
minisign -V [-H] [-x sig_file] [-p pubkey_file | -P pubkey] [-o] [-q] -m file

-G                generate a new key pair
-R                recreate a public key file from a secret key file
-C                change/remove the password of the secret key
-S                sign files
-V                verify that a signature is valid for a given file
-H                require input to be prehashed
-l                sign using the legacy format
-m <file>         file to sign/verify
-o                combined with -V, output the file content after verification
-p <pubkey_file>  public key file (default: ./minisign.pub)
-P <pubkey>       public key, as a base64 string
-s <seckey_file>  secret key file (default: ~/.minisign/minisign.key)
-W                do not encrypt/decrypt the secret key with a password
-x <sigfile>      signature file (default: <file>.minisig)
-c <comment>      add a one-line untrusted comment
-t <comment>      add a one-line trusted comment
-q                quiet mode, suppress output
-Q                pretty quiet mode, only print the trusted comment
-f                force. Combined with -G, overwrite a previous key pair
-v                display version number
対象ファイルと,ペアの署名ファイルを入手
$ ls zig-linux-x86_64-0.1* -1
zig-linux-x86_64-0.13.0.tar.xz (1)
zig-linux-x86_64-0.13.0.tar.xz.minisig (2)
  1. 検証対象ファイル

  2. 署名ファイル

検証
$ minisign -V -P 'RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U' -m zig-linux-x86_64-0.13.0.tar.xz
Signature and comment signature verified
Trusted comment: timestamp:1717729444   file:zig-linux-x86_64-0.13.0.tar.xz     hashed
-V

検証

-P

公開鍵を文字列として指定

-m

検証対象ファイル(対象ファイル名.minisigという署名ファイルも必要)

自分用の鍵ペアを作る

-G オプションで鍵ペアを作ってみます.

鍵ペアの作成
$ minisign -G
Please enter a password to protect the secret key.

Password:
Password (one more time):
Deriving a key from the password in order to encrypt the secret key... done

The secret key was saved as /home/matoken/.minisign/minisign.key - Keep it secret!
The public key was saved as minisign.pub - That one can be public.

Files signed using this key pair can be verified with the following command:

minisign -Vm <file> -P RWThG1FeVewlpdqVHzH7T3qK6edFtP+lhSNQeXYat3+3wTdrZViImFnY

秘密鍵は ~/.minisign/minisign.key として,公開鍵は ./minisign.pub として保存されます.

鍵ペアファイル
$ ls ~/.minisign/ (1)
minisign.key
$ ls ./minisign.pub (2)
./minisign.pub
$ mv ./minisign.pub ~/.minisign/ (3)
$ cat ~/.minisign/minisign.key (4)
untrusted comment: minisign encrypted secret key
RWRTY0IyBLVcWBdD5v/ArFX7ojiwAJZD61u4Boh/zbWwDBNirL8AAAACAAAAAAAAAEAAAAAA2X06cJ9r2gcu90CflCMhe+uz2Qj2q4mdPpsAcTVkvl5OqUuHUG3vrKvlkRwT94SyOudc8GdiodD2JEFUVVawfZEWVovOSLmmnW2xvXXBdhLYHCcuz9CO9IxAGi7+o5vWy+cdFr8UNoA=
$ cat ~/.minisign/minisign.pub (5)
untrusted comment: minisign public key A525EC555E511BE1
RWThG1FeVewlpdqVHzH7T3qK6edFtP+lhSNQeXYat3+3wTdrZViImFnY
  1. 秘密鍵は ~/.minisign/minisign.key に保存される

  2. 公開鍵はminisignを実行したカレントディレクトリの minisign.pub に保存される

  3. 公開鍵も秘密鍵と同じ場所においておく

  4. 秘密鍵の内容※実際は公開してはいけない

  5. 公開鍵の中身

自分の鍵で署名してみる

$ minisign -S -s ~/.minisign/minisign.key -c 'elephant-in-snake cow(untrasted comment)' -t 'trasted comment' -m ./testfile
Password:
Deriving a key from the password and decrypting the secret key... done
-S

署名

-s

秘密鍵ファイルの指定

-c

信頼されないコメント(オプション)

-m

対象ファイル

Note

-c で指定する信頼されないコメントは書き換え可能,書き換えても検証に影響しない.

$ cat ./testfile.minisig (1)
untrusted comment: elephant-in-snake cow(untrasted comment)
RUThG1FeVewlpUvYukMYnjZAkVoSYf/e4FN3g9B7F7rDVeiQ1u47BuVoyGc7yQGvTOS8CegqC92yDPLFLI6Lxptha+hlurTexwE=
trusted comment: trasted comment
sdud1fIcQSEslt0Rndls7wOlzH4+mjKVQ8Smgh1790pwjsKdGOcBHWkxSa6VxlAqivKOkkAYf3qQPn4Deji+Bw==
$ minisign -V -p ~/.minisign/minisign.pub -m ./testfile (2)
Signature and comment signature verified
Trusted comment: trasted comment
$ minisign -V -P 'RWThG1FeVewlpdqVHzH7T3qK6edFtP+lhSNQeXYat3+3wTdrZViImFnY' -m ./testfile (3)
Signature and comment signature verified
Trusted comment: trasted comment
  1. 署名ファイルの中身

  2. 公開鍵で検証

  3. 公開鍵をコマンド指定して検証

パスワードの変更

$ minisign -C ~/.minisign/minisign.key (1)
Password: (2)
Deriving a key from the password and decrypting the secret key... done

Please enter a password to protect the secret key.

Password: (3)
Password (one more time): (4)
Deriving a key from the password in order to encrypt the secret key... done

Password updated.
  1. -C オプションで秘密鍵のパスワードを変更

  2. 変更前のパスワード

  3. 新パスワード

  4. 新パスワード

秘密鍵から公開鍵の作成

-R オプションで秘密鍵から公開鍵ファイルの再生成
$ minisign -R -s ~/.minisign/minisign.key -p ~/.minisign/minisign-new.pub
Password:
Deriving a key from the password and decrypting the secret key... done
$ diff ~/.minisign/minisign.pub ~/.minisign/minisign-new.pub

終わりに

PGPに比べると使い方は限定的だけど便利そうです.
Minisignは署名だけですが,暗号化についてはEncpipeageが紹介されています.ageはSSH鍵で暗号化復号化ができて便利です.Encpipeも試してみようと思います.

環境

$ dpkg-query -W minisign
minisign        0.11-1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2025/01/04/minisign/feed/ 1
Portsproofで全TCPポートを開けて攻撃者を迷わせる https://matoken.org/blog/2025/01/03/portsproof/ https://matoken.org/blog/2025/01/03/portsproof/#respond Thu, 02 Jan 2025 22:20:51 +0000 https://matoken.org/blog/?p=4342

mastodonのTLに流れてきて気になったPortsproof


面白そうです.ローカル環境で少し試してみました.

Portsproofをbuild
$ git clone https://github.com/drk1wi/portsproof
$ cd portsproof
$ ./configure
$ make
iptableでTCP全ポートをPortsproofの4444に向ける
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 1:65535 -j REDIRECT --to-ports 4444
Portsproofを起動
$ ./src/portspoof -1vd
-> Generating fuzzing payloads internally!
-> Verbose mode on.
-> Syslog logging disabled.
nmapでtcp 1-22をスキャン,元々は22番しか起動していないが1-22全てopenになる
$ nmap -p 1-22 192.168.0.23
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-03 06:50 JST
Nmap scan report for raspberrypi.AirPort (192.168.0.23)
Host is up (0.013s latency).

PORT   STATE SERVICE
1/tcp  open  tcpmux
2/tcp  open  compressnet
3/tcp  open  compressnet
4/tcp  open  unknown
5/tcp  open  rje
6/tcp  open  unknown
7/tcp  open  echo
8/tcp  open  unknown
9/tcp  open  discard
10/tcp open  unknown
11/tcp open  systat
12/tcp open  unknown
13/tcp open  daytime
14/tcp open  unknown
15/tcp open  netstat
16/tcp open  unknown
17/tcp open  qotd
18/tcp open  msp
19/tcp open  chargen
20/tcp open  ftp-data
21/tcp open  ftp
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 1.19 seconds
このときのPortsproofのlogの一部
 new conn - thread choosen: 0 -  nr. of connections already in queue: 0
 new conn - thread choosen: 0 -  nr. of connections already in queue: 1
 new conn - thread choosen: 0 -  nr. of connections already in queue: 2
 new conn - thread choosen: 0 -  nr. of connections already in queue: 3
OSスキャンをしてみると46分も掛かる(Portsproofを起動しない場合 0m43.604s で終わる)
$ time sudo nmap -AO 192.168.0.23
  :
real    46m1.292s
user    0m0.085s
sys     0m0.017s
このときのPortsproofのログを見ると適当なsignatureが出力されている
---
Thread nr.0 for port 17
signature sent -> \4c\d8\1a\6d\75\7b\1c\51\89\5d\4\f1\83\ec\e7\e8\3b\b5\1d\2b\36\8f\e2\ad\da\75\e1\ac\ec\96\27\b8\ee\41\a5\65\3c\42\36\c5\9f\3b\b8\a3\28\20\8c\e2\56\aa\8d\8c\3a\71\3a\15\e6\9c\42\53\33\69\c\a2\2b\b1\8\67\73\3e\ad\14\f8\e5\b7\a0\6\c3\84\5c\6e\91\68\28\3\a3\bd\69\bf\00
---

という感じで面白いです.Tarpit的にも使えそう?

環境
$ git log --pretty=oneline -1
89d5ecc6b681037865a4557ec8c374286302b840 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #51 from AbelLykens/patch-1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ grep ^Model /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2025/01/03/portsproof/feed/ 0
Debian sid環境でGhosttyをbuild https://matoken.org/blog/2025/01/02/ghostty-build-in-debian-sid/ https://matoken.org/blog/2025/01/02/ghostty-build-in-debian-sid/#respond Wed, 01 Jan 2025 22:08:00 +0000 https://matoken.org/blog/?p=4336

com.mitchellh.ghostty

最近1.0.0がリリースされ話題になっているGhosttyというターミナルエミュレータがあります.最近Debian sid amd64環境のAlacrittyの上でNeovim+iBus Mozcで日本語入力時に遅延して?日本語が入力されて使い物にならないのもあり試してみようと思いました.(mltermだと大丈夫)

Debianで次回に動くバイナリは提供されていません.Ubuntuについては第三者がパッケージを提供されています.(apt sourcesは無い)

恐らくUbuntu版はDebianでも動作すると思いますがsourceからBuildしてみました.少し嵌ったのでメモしておきます.

手順は以下に書かれています.

関連パッケージの導入
$ sudo apt install libgtk-4-dev libadwaita-1-dev git
zigの導入
$ wget2 -c -v https://ziglang.org/download/0.13.0/zig-linux-x86_64-0.13.0.tar.xz \
              https://ziglang.org/download/0.13.0/zig-linux-x86_64-0.13.0.tar.xz.minisig
zig-linux-x86_64-0.1 100% [============================================================================================================================================>]     325     --.-KB/s
zig-linux-x86_64-0.1 100% [============================================================================================================================================>]   44.90M  761.78KB/s
                          [Files: 2  Bytes: 44.90M [553.07KB/s] Redirects: 0  Todo: 0  Errors: 0
$ minisign -Vm ./zig-linux-x86_64-0.13.0.tar.xz -P 'RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U'
Signature and comment signature verified
Trusted comment: timestamp:1717729444   file:zig-linux-x86_64-0.13.0.tar.xz     hashed
zigをfuse-archiveでmount(もしくはtar xfで展開)
$ fuse-archive ./zig-linux-x86_64-0.13.0.tar.xz
Ghosttyのsource入手
$ git clone https://github.com/ghostty-org/ghostty
$ cd ghostty
Note

fontなんかも同梱されていて結構サイズが大きく --depth=1 でもcloneに失敗するのでリモートでcloneしてrsyncしました.releasesのsource archiveから入手してもいいかもしれません.

zigにPATHを通してGhosttyのbuild
$ PATH=~/Downloads/zig-linux-x86_64-0.13.0/zig-linux-x86_64-0.13.0/:$PATH \
  zig build -Doptimize=ReleaseFast
$ ls zig-out/bin/ghostty
zig-out/bin/ghostty
Note

build時に以下のメッセージで数時間経っても進まなくなりました.Ctrl+cで中断して再度実行することで進みました.恐らく回線の問題.

Compile Build Script
└─ [53/46] Fetch Packages
   ├─ wuffs
   └─ iterm2_themes
Ghosttyを実行…… Segmentation fault
$ zig-out/bin/ghostty
info: ghostty version=1.0.2-main+60611b8
info: ghostty build optimize=ReleaseFast
info: runtime=apprt.Runtime.gtk
info: font_backend=font.main.Backend.fontconfig_freetype
info: dependency harfbuzz=8.4.0
info: dependency fontconfig=21402
info: renderer=renderer.OpenGL
info: libxev backend=main.Backend.io_uring
info(os): setlocale from env result=ja_JP.UTF-8
info(gtk): GTK version build=4.16.7 runtime=4.16.7
info(config): creating template config file: path=/home/matoken/.config/ghostty/config
warning(config): error creating template config file err=error.FileNotFound
info(config): default shell source=env value=/bin/bash
warning(sentry): crash report written to disk path=/home/matoken/.local/state/ghostty/crash/68ce5038-f588-4d61-ef88-4217099bbfc4.ghosttycrash
EGL API version 1.5 found
 - Vendor: Mesa Project
 - Version: 1.5
 - Device: /dev/dri/renderD128, 226 128
 - Client APIs: OpenGL OpenGL_ES
 - Extensions:
        EGL_ANDROID_blob_cache
        EGL_ANDROID_native_fence_sync
        EGL_ANGLE_sync_control_rate
        EGL_CHROMIUM_sync_control
        EGL_EXT_buffer_age
        EGL_EXT_config_select_group
        EGL_EXT_create_context_robustness
        EGL_EXT_image_dma_buf_import
        EGL_EXT_image_dma_buf_import_modifiers
        EGL_EXT_pixel_format_float
        EGL_EXT_query_reset_notification_strategy
        EGL_EXT_surface_compression
        EGL_EXT_swap_buffers_with_damage
        EGL_IMG_context_priority
        EGL_KHR_cl_event2
        EGL_KHR_config_attribs
        EGL_KHR_context_flush_control
        EGL_KHR_create_context
        EGL_KHR_create_context_no_error
        EGL_KHR_fence_sync
        EGL_KHR_get_all_proc_addresses
        EGL_KHR_gl_colorspace
        EGL_KHR_gl_renderbuffer_image
        EGL_KHR_gl_texture_2D_image
        EGL_KHR_gl_texture_3D_image
        EGL_KHR_gl_texture_cubemap_image
        EGL_KHR_image
        EGL_KHR_image_base
        EGL_KHR_image_pixmap
        EGL_KHR_no_config_context
        EGL_KHR_reusable_sync
        EGL_KHR_surfaceless_context
        EGL_KHR_swap_buffers_with_damage
        EGL_KHR_wait_sync
        EGL_MESA_configless_context
        EGL_MESA_drm_image
        EGL_MESA_gl_interop
        EGL_MESA_image_dma_buf_export
        EGL_MESA_query_driver
        EGL_MESA_x11_native_visual_id
        EGL_NOK_texture_from_pixmap
        EGL_WL_bind_wayland_display
 - Selected fbconfig: R8G8B8A8, depth 0, stencil 0
          high depth: none
Creating EGL context version 3.2 (debug:no, forward:no, legacy:no, es:no)
Using OpenGL backend EGL
info(gtk): libadwaita version build=1.6.2 runtime=1.6.2
error(gtk): Read method failed: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface “org.freedesktop.portal.Settings” on object at path /org/freedesktop/portal/desktop
Creating EGL context version 3.2 (debug:no, forward:no, legacy:no, es:no)
OpenGL version: 4.6 (core)
GLSL version: 4.60
Max texture size: 16384
Enabled features (use GDK_GL_DISABLE env var to disable):
    debug: ✓
    unpack-subimage: ✓
    half-float: ✓
    sync: ✓
    base-instance: ✓
    buffer-storage: ✓
OpenGL version: 4.6 (core)
GLSL version: 4.60
Max texture size: 16384
Enabled features (use GDK_GL_DISABLE env var to disable):
    debug: ✓
    unpack-subimage: ✓
    half-float: ✓
    sync: ✓
    base-instance: ✓
    buffer-storage: ✓

(ghostty:3475525): Gtk-WARNING **: 02:44:03.441: GtkImage 0x31a0b830 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.441: GtkImage 0x31a09b60 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.441: GtkImage 0x319c7740 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.442: GtkImage 0x31a79170 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.442: GtkImage 0x31a754f0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.442: GtkImage 0x31a7b370 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.443: GtkImage 0x318aed70 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.443: GtkImage 0x31a812a0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.443: GtkImage 0x31a80400 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.444: GtkImage 0x31a83150 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.444: GtkImage 0x319bb340 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.455: GtkImage 0x33e3da10 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.
Creating EGL context version 3.3 (debug:no, forward:no, legacy:no, es:no)
OpenGL version: 4.6 (core)
GLSL version: 4.60
Max texture size: 16384
Enabled features (use GDK_GL_DISABLE env var to disable):
    debug: ✓
    unpack-subimage: ✓
    half-float: ✓
    sync: ✓
    base-instance: ✓
    buffer-storage: ✓
info(grid): loaded OpenGL 4.6
info(io_exec): found Ghostty resources dir: /home/matoken/src/ghostty/zig-out/share/ghostty
info(io_exec): shell integration automatically injected shell=termio.shell_integration.Shell.bash
warning(gtk): unimplemented action=apprt.action.Action.Key.cell_size
warning(gtk): unimplemented action=apprt.action.Action.Key.size_limit
info(io_exec): started subcommand path=/bin/sh pid=3475569
info(io_exec): subcommand cgroup=-
error(gtk): Read method failed: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface “org.freedesktop.portal.Settings” on object at path /org/freedesktop/portal/desktop

(ghostty:3475525): Gtk-WARNING **: 02:44:03.490: GtkImage 0x33e52760 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x31a7b370 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x342b77c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x342b84c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x31a7f490 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x31a80400 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.499: GtkImage 0x31a821f0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a7b370 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x342b77c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x342b84c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x33e52760 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a7f490 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a80400 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a821f0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x33e3da10 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.509: fb setup not supported (8cd6)

(ghostty:3475525): Gtk-WARNING **: 02:44:03.524: fb setup not supported (8cd6)

(ghostty:3475525): Gtk-WARNING **: 02:44:03.550: fb setup not supported (8cd6)

(ghostty:3475525): GLib-GObject-CRITICAL **: 02:44:03.634: g_object_ref: assertion 'G_IS_OBJECT (object)' failed

(ghostty:3475525): GLib-GObject-CRITICAL **: 02:44:03.634: g_object_ref: assertion 'G_IS_OBJECT (object)' failed
Segmentation fault

Segmentation faultになってしまいます.エラーメッセージで検索して以下のIssueを見つけました.

Dupe, best guess currently is a GTK bug. Please search to find similar discussions (not issues).

GTKのbugではとのことですがUbuntu版があるのでそちらではどうなってるのだろうと.debを入手して試してみます.

Ubuntu向けGhosttyの.debを入手してarchiveをmountして実行
$ wget2 -c -v https://github.com/mkasberg/ghostty-ubuntu/releases/download/1.0.1-0-ppa1/ghostty_1.0.1-0.ppa1_amd64_24.10.deb (1)
0 files                0% [<=>                                                                                                                                                                                          ]       0          B/s
                          [Files: 0  Bytes: 0  [0 B/s] Redirects: 1  Todo: 0  Errors: 1
$ fuse-archive ghostty_1.0.1-0.ppa1_amd64_24.10.deb (2)
fuse-archive: Created mount point 'ghostty_1.0.1-0.ppa1_amd64_24.10'
$ fuse-archive ghostty_1.0.1-0.ppa1_amd64_24.10/data.tar.zst ~/fuse/tmp (3)
fuse-archive: Using existing mount point '/home/matoken/fuse/tmp'
$ /home/matoken/fuse/tmp/usr/bin/ghostty (4)
  1. 一番環境の近そうなUbuntu 22.10 amd64版を入手

  2. fuse-archiveでmount(もしくはunarコマンドなどで展開)

  3. fuse-archiveで適当な場所にdata.tarをmount(もしくはtar xfなどで展開)

  4. Ghosttyを実行

Ubuntu向けGhosttyは起動しました.
debian/patchesを覗くと1つpatchがありますが関係が無さそう.試しに 000-libbz2.patch を適用してみましたがやはり起動できません.
https://github.com/mkasberg/ghostty-ubuntu/tree/main/debian/patches

resetしてもとに戻して今度は debian/rules を参考に zig build を試しましたがこれも動作変わらず.
https://github.com/mkasberg/ghostty-ubuntu/blob/main/debian/rules

GhosttyのIssueを探すとまさにDebian sid amd64での回答がありました.
最近のpangoの更新で引っかかるようになったようです.以下のbuild optionを指定することで回避できるようです.

Upd: just build with -fsys=fontconfig parameter

-fsys=fontconfig を付与してbuildし直し
$ PATH=~/Downloads/zig-linux-x86_64-0.13.0/zig-linux-x86_64-0.13.0/:$PATH \
  zig build -Doptimize=ReleaseFast -fsys=fontconfig
$ zig-out/bin/ghostty

動作するようになりました :)

ghostty debian sid

適当なPATHの通っている場所にcpしておく
$ rsync -av zig-out/* ~/usr/
$ which ghostty
/home/matoken/usr/bin/ghostty

ということで最近のDebian sid amd64環境などではしばらくはbuildオプションに -fsys=fontconfig を付けてあげる必要がありそうです.

$ zig build -Doptimize=ReleaseFast

$ zig build -Doptimize=ReleaseFast -fsys=fontconfig
環境
$ zig-out/bin/ghostty --version
Ghostty 1.0.2-main+60611b8

Version
  - version: 1.0.2-main+60611b8
  - channel: tip
Build Config
  - Zig version: 0.13.0
  - build mode : builtin.OptimizeMode.ReleaseFast
  - app runtime: apprt.Runtime.gtk
  - font engine: font.main.Backend.fontconfig_freetype
  - renderer   : renderer.OpenGL
  - libxev     : main.Backend.io_uring
  - GTK version:
    build      : 4.16.7
    runtime    : 4.16.7
  - libadwaita : enabled
    build      : 1.6.2
    runtime    : 1.6.2
  - libX11     : enabled
$ dpkg-query -W libgtk-4-dev libadwaita-1-dev git
git     1:2.45.2-1.3
libadwaita-1-dev:amd64  1.6.2-1
libgtk-4-dev:amd64      4.16.7+ds-1
$ dpkg-query -W libpango* gir1.2-pango-1.0 | grep -v i386
gir1.2-pango-1.0:amd64  1.55.0+ds-3
libpango-1.0-0:amd64    1.55.0+ds-3
libpango1.0-dev:amd64   1.55.0+ds-3
libpango1.0-doc
libpangocairo-1.0-0:amd64       1.55.0+ds-3
libpangoft2-1.0-0:amd64 1.55.0+ds-3
libpangomm-1.4-1
libpangomm-1.4-1v5:amd64        2.46.4-1+b2
libpangomm-1.4-dev:amd64        2.46.4-1+b2
libpangomm-2.48-1
libpangomm-2.48-1t64:amd64      2.54.0-1
libpangoxft-1.0-0:amd64 1.55.0+ds-3
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2025/01/02/ghostty-build-in-debian-sid/feed/ 0
Happy New Year 2025 https://matoken.org/blog/2025/01/01/happy-new-year-2025/ https://matoken.org/blog/2025/01/01/happy-new-year-2025/#respond Tue, 31 Dec 2024 20:57:56 +0000 https://matoken.org/blog/?p=4321

HappyNewYear2025

$ aptitude moo
このプログラムにはイースターエッグ (隠し機能) はありません。
$ aptitude moo -v
このプログラムには本当にイースターエッグはありませんよ。
$ aptitude moo -vv
このプログラムにイースターエッグはないって言わなかったかい?
$ aptitude moo -vvv
やめてくれ!
$ aptitude moo -vvvv
わかった、わかった。あんたにイースターエッグをあげればどっか行ってくれるかい?
$ aptitude moo -vvvvv
わかったよ。あんたの勝ちだ。

                               /----\
                       -------/      \
                      /               \
                     /                |
   -----------------/                  --------\
   ----------------------------------------------
$ aptitude moo -vvvvvv
これが何なのか? もちろんウワバミに食べられた象だよ。
]]>
https://matoken.org/blog/2025/01/01/happy-new-year-2025/feed/ 0
Bufferを経由してold TwitterへWordPress投稿を通知 https://matoken.org/blog/2024/12/31/wp-to-buffer/ https://matoken.org/blog/2024/12/31/wp-to-buffer/#respond Tue, 31 Dec 2024 09:18:53 +0000 https://matoken.org/blog/?p=4315

このweblogをold Twitterへの投稿をTwitter API利用がBANされてIFTTTに切り替え,Twitterの規約変更からIFTTT有料化でseleniumを使って投稿するように.しかし回線のせいか失敗することのほうがが多いです.ということで最近はBufferを利用しています.

Bufferのwebインターフェイスを起動して投稿をするのに回線が細いと数分かかり面倒.拡張機能を使うと2回目以降キャッシュが利いていると結構さくっと投稿できていい感じです.

更に楽にするようAPIを叩いてBufferに渡すコマンドを書こうかと思いましたがどうも2019年にBuffer APIの受付は終わってしまったようです.
そこで「WP to Buffer」というWordPress pluginを試してみました.

WordPress pluginページからWP to Bufferを導入,有効化,自動更新も有効化しました.
WP to Bufferの「Settings」の「Authentication」でBufferと連携します.
「投稿」→「Defaults」の「Publish」の右上の「Enabled」にチェックが付いている状態で投稿内容を設定します.とりあえず規定値のままで.
「Publish」の右隣の「Update」の「Enabled」はチェックを外してblog更新時には投稿しないようにしました.

投稿タブ左側にBuffer連携済のSNSが表示されるので,連携したいSNSを押して「Account Enabled」にチェックを付けます.

WP to Buffer

これで恐らく投稿時にチェックを付けたSNSにBuffer経由で投稿されるようになったと思います.
このエントリがテストです,

WP to Bufferに課金してProにUpgradeすると便利な機能が色々と使えるようになるようです.

しかしここ1月のt.coからのアクセスを確認してみると2件なのでそもそもTwitter連携をする意味はあまりない気がしてきました…….

追記)

こんな感じでBufferのQueueに登録され,順次投稿されるようです.WP to BufferをProにするとこの辺りの投稿タイミングも指定できそうです.(未確認)

Buffer Queue
Buffer to Twitter

]]>
https://matoken.org/blog/2024/12/31/wp-to-buffer/feed/ 0
細い回線でgit cloneに失敗 https://matoken.org/blog/2024/12/30/git-clone-fails-on-thin-line/ https://matoken.org/blog/2024/12/30/git-clone-fails-on-thin-line/#comments Sun, 29 Dec 2024 15:07:27 +0000 https://matoken.org/blog/?p=4307

細めの回線でgit cloneに失敗することがよくあります.
例えばこんな.

$ git clone https://github.com/ergochat/ergo
Cloning into 'ergo'...
remote: Enumerating objects: 26435, done.
remote: Counting objects: 100% (620/620), done.
remote: Compressing objects: 100% (163/163), done.
error: RPC failed; curl 18 transfer closed with outstanding read data rem
aining
error: 3971 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

とかこんな

$ git clone https://github.com/ghostty-org/ghostty --depth=1
Cloning into 'ghostty'...
remote: Enumerating objects: 914, done.
remote: Counting objects: 100% (914/914), done.
remote: Compressing objects: 100% (833/833), done.
error: RPC failed; curl 56 GnuTLS recv error (-9): Error decoding the received TLS packet.
error: 3243 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

git configで以下のような設定で多少ましになりますがそれでも同じリポジトリでも成功したり失敗したりと安定しません.

http.version=HTTP/1.1
http.postbuffer=524288000

clone時に --depth 1 を指定して fetch で段階的に取得することでうまく行くこともありますが面倒.更に試行錯誤で結構データ量も消費してしまいます.

$ git clone http://example.com/large-repository --depth 1 (1)
$ cd large-repository
$ git fetch --depth=64 (2)
$ git fetch --depth=128
$ git fetch --depth=192
$ git fetch --depth=256
   :
$ git fetch --unshallow (3)
  1. 最新1世代だけclone

  2. 最新から64世代clone

  3. 残り全てclone

でも安定しないし毎回試行錯誤が必要なので手元の環境では結局リモートのVPS等で取得してrsyncなどで同期するのが確実です.

oracleの無料なCloud Free TierのVPSでgit cloneしてrsync
$ ssh oracle-arm "git -C /tmp/ clone https://github.com/ergochat/ergo" && \
  ssh rsync -avcP /tmp/ergo . && \
  ssh oracle-arm "rm -r /tmp/ergo"

もしくは太い回線のある場所に移動してclone.自分の場合は自宅の隣のmobile cellやJoyfullです.

ちなみにこの症状の出る回線は最大7Mbpsほどのモバイル回線で,MVNOを使っているのも利いていそうです.
LTE]

StarLinkも気になりますが山に囲まれ散るのでうまく電波を掴めるかが不安です.30日以内なら返品可能なようですが…….

30 DAY TRIAL
If not satisfied, return Starlink for a full refund.

Starlink
環境
$ git version
git version 2.45.2
$ dpkg-query -W git
git     1:2.45.2-1.3
$ lsb_release -dr
Description:	Debian GNU/Linux trixie/sid
Release:	n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2024/12/30/git-clone-fails-on-thin-line/feed/ 1
Merry X-mas https://matoken.org/blog/2024/12/25/merry-x-mas/ https://matoken.org/blog/2024/12/25/merry-x-mas/#respond Tue, 24 Dec 2024 22:35:54 +0000 https://matoken.org/blog/?p=4302

Merry X-mas.
pretty Termial trees.

]]>
https://matoken.org/blog/2024/12/25/merry-x-mas/feed/ 0
go install時に勝手に新しいgoがダウンロードされる?(Go Toolchains) https://matoken.org/blog/2024/12/24/go-toolchains/ https://matoken.org/blog/2024/12/24/go-toolchains/#respond Tue, 24 Dec 2024 09:39:59 +0000 https://matoken.org/blog/?p=4299

Go製のアプリをgo installで導入したところ新しいバージョンのgoが自動的にダウンロードされて使われました.これは何だろうと少し調べてみました.

go install でnostr clientのalgiaをインストールしました.途中でgo 1.23.4がダウンロードされています.

$ go install github.com/mattn/algia@latest
go: downloading github.com/mattn/algia v0.0.84
go: github.com/mattn/algia@v0.0.84 requires go >= 1.23.0; switching to go1.23.4
go: downloading go1.23.4 (linux/arm) (1)
go: downloading github.com/mdp/qrterminal/v3 v3.2.0
go: downloading github.com/nbd-wtf/go-nostr v0.38.1
go: downloading github.com/urfave/cli/v2 v2.27.4
go: downloading github.com/btcsuite/btcd/btcec/v2 v2.3.4
go: downloading github.com/btcsuite/btcd/btcutil v1.1.6
go: downloading github.com/gobwas/httphead v0.1.0
go: downloading github.com/gobwas/ws v1.4.0
go: downloading github.com/mailru/easyjson v0.7.7
go: downloading github.com/puzpuzpuz/xsync/v3 v3.4.0
go: downloading github.com/tidwall/gjson v1.18.0
go: downloading github.com/fiatjaf/eventstore v0.11.0
go: downloading golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
go: downloading github.com/graph-gophers/dataloader/v7 v7.1.0
go: downloading rsc.io/qr v0.2.0
go: downloading github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0
go: downloading github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.5
go: downloading github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1
go: downloading github.com/gobwas/pool v0.2.1
go: downloading github.com/josharian/intern v1.0.0
go: downloading github.com/tidwall/match v1.1.1
go: downloading github.com/tidwall/pretty v1.2.1
go: downloading github.com/fiatjaf/generic-ristretto v0.0.1
go: downloading github.com/decred/dcrd/crypto/blake256 v1.1.0
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading github.com/golang/glog v1.2.2
  1. go 1.23.4がダウンロードされている

gup checkで確認すると今回のalgiaはgo1.23.4でbuildされていて,他のはgo1.22.1です.

$ gup check
check binary under $GOPATH/bin or $GOBIN
[1/8] github.com/mattn/algia (Already up-to-date: v0.0.84 / go1.23.4) (1)
[2/8] github.com/darkhz/bluetuith (current: v0.2.2, latest: v0.2.3 / go1.22.1)
[3/8] github.com/mattn/bsky (current: v0.0.61, latest: v0.0.67 / go1.22.1)
[4/8] github.com/bloznelis/typioca (current: v0.0.0-20240403160848-1c6a0ac60a1a, latest: v0.0.0-20241028092943-0f1ec70f7d95 / go1.22.1)
[5/8] github.com/mikuta0407/misskey-cli (current: v0.0.0-20230730142608-ab80e8e6583c, latest: v0.3.1 / current: go1.19.8, installed: go1.22.1)
[6/8] github.com/nao1215/gup (Already up-to-date: v0.27.5 / go1.22.1)
[7/8] github.com/maaslalani/nap (Already up-to-date: v0.1.1 / go1.22.1)
[8/8] github.com/sqshq/sampler (Already up-to-date: v1.1.0 / go1.22.1)

If you want to update binaries, run the following command.
           $ gup update bluetuith bsky typioca misskey-cli
  1. algiaだけgo1.23.4が使われている

インストールされているgoを確認するとgo1.22.1です.

$ which go
/usr/bin/go
$ go version
go version go1.22.1 linux/arm

$GOPATHの下を見るとgo1.23.4があります.

$ ~/go/pkg/mod/golang.org/toolchain\@v0.0.1-go1.23.4.linux-arm/bin/go version
go version go1.23.4 linux/arm
$ du -Hs ~/go/pkg/mod/golang.org/toolchain\@v0.0.1-go1.23.4.linux-arm
243424  /home/matoken/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.4.linux-arm

go.modのこの辺りが効いていそうです.

$ head go/pkg/mod/github.com/mattn/algia@v0.0.84/go.mod
module github.com/mattn/algia

go 1.23.0

toolchain go1.23.1

require (
        github.com/fatih/color v1.17.0
        github.com/mdp/qrterminal/v3 v3.2.0
        github.com/nbd-wtf/go-nostr v0.38.1

これは何だろうとgo toolchainとかで検索してみるとgo 1.21からの機能で必要なバージョンのgoを指定することで自動的に必要なgoをダウンロードして使ってくれるようです.便利ですね.

でも容量結構食うし今回の環境のようなRaspberry Pi環境ではちょっと辛い.クロスビルドとかするといいんでしょうがちょっとツールを試すだけだと面倒…….ビルド後に掃除する感じがいいんですかね.

環境
$ dpkg-query -W golang-1.19 golang-1.22 golang
golang:armhf    2:1.19~1
golang-1.19     1.19.8-2
golang-1.22     1.22.1-1~bpo12+1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
]]>
https://matoken.org/blog/2024/12/24/go-toolchains/feed/ 0
apt updateで表示される未サポートアーキテクチャのメッセージを出ないように修正 https://matoken.org/blog/2024/12/22/corrected-so-that-the-message-about-unsupported-architecture-displayed-by-apt-update-does-not-appear/ https://matoken.org/blog/2024/12/22/corrected-so-that-the-message-about-unsupported-architecture-displayed-by-apt-update-does-not-appear/#respond Sun, 22 Dec 2024 10:55:26 +0000 https://matoken.org/blog/?p=4296

apt update時に一部のリポジトリで以下のようなメッセージが出ていました.特に問題はないので放置していましたが直してみました.

$ sudo apt update
  --snip--
Notice: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://brave-browser-apt-release.s3.brave.com stable InRelease' doesn't support architecture 'i386'
Notice: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://download.vscodium.com/debs vscodium InRelease' doesn't support architecture 'i386'
  --snip--

この端末はamd64環境ですが,一部i386も使いたいのでdpkg –add-architectureでi386 architectureを追加してあります.でも該当リポジトリにはi386が無いのでメッセージが出されているようです.

$ dpkg --print-architecture
amd64
$ dpkg --print-foreign-architectures
i386

該当のsource.listを見るとアーキテクチャが書かれていません.

deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main

apt edit-sourcesコマンドで以下のようにアーキテクチャを追加しました.この状態でapt updateを実行するとメッセージが消えました :)

$ sudo git -C /etc diff /etc/apt/sources.list.d/brave-browser-release.list
diff --git a/apt/sources.list.d/brave-browser-release.list b/apt/sources.list.d/brave-browser-release.list
index 7150b62..63ac6ba 100644
--- a/apt/sources.list.d/brave-browser-release.list
+++ b/apt/sources.list.d/brave-browser-release.list
@@ -1 +1 @@
-deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main
+deb [arch=amd64,signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main

他のsource.listも同様に修正.

$ sudo git -C /etc diff /etc/apt/sources.list.d/vscodium.list
diff --git a/apt/sources.list.d/vscodium.list b/apt/sources.list.d/vscodium.list
index f3193db..d29fd21 100644
--- a/apt/sources.list.d/vscodium.list
+++ b/apt/sources.list.d/vscodium.list
@@ -1 +1 @@
-deb [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://download.vscodium.com/debs vscodium main
+deb [ arch=amd64,signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://download.vscodium.com/debs vscodium main

deb822スタイルに直してしまってもいいかもしれません.

/etc/apt/sources.list.d/brave-browser-release.sources
Types: deb
URIs: https://brave-browser-apt-release.s3.brave.com/
Suites: stable
Components: main
Architectures: amd64
Signed-By: /usr/share/keyrings/brave-browser-archive-keyring.gpg
環境
$ dpkg-query -W apt dpkg
apt     2.9.18
dpkg    1.22.11
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ dpkg --print-architecture
amd64
$ dpkg --print-foreign-architectures
i386
]]>
https://matoken.org/blog/2024/12/22/corrected-so-that-the-message-about-unsupported-architecture-displayed-by-apt-update-does-not-appear/feed/ 0
fuse-archiveでいろいろなアーカイブをfuse mount https://matoken.org/blog/2024/12/22/fuse-mount-various-archives-with-fuse-archive/ https://matoken.org/blog/2024/12/22/fuse-mount-various-archives-with-fuse-archive/#respond Sat, 21 Dec 2024 22:40:57 +0000 https://matoken.org/blog/?p=4291

アドベントカレンダーの時期ですね.本来のクリスマスに向けカレンダーを日に日にめくりお菓子が出てくる感じのものとは別に近年技術者向けの記事をクリスマスまで公開してくアドベントカレンダーもあります.
その中のFreeBSDアドベントカレンダーを見ていて以下の記事が気になりました.

FreeBSD 14からtarアーカイブをファイルシステムにマウントするtarfs(4)が入ったそうです.Linuxでfuse-zipとかは使ったことがあるけど他にもないかなと探してfuse-archiveを試してみました.

fuse-zipはFilesystem in Userspace(FUSE)経由でzipアーカイブをマウントできるものです.Debianパッケージもあるので導入や管理が楽です.

fuse-archiveはたくさんのアーカイブに対応した同じようなもののようです.

fuse-archiveのインストール

今回もDebian sid amd64環境に導入しました.
インストール方法は INSTALL.md に詳しいです.
ここではインストール時に DESTDIR を設定してホームディレクトリ以下にインストールしています.

$ sudo apt install libboost-container-dev libfuse-dev libarchive-dev \
                  g++ pkg-config make pandoc \
                  python3 (1)
$ git clone https://github.com/google/fuse-archive.git (2)
$ cd fuse-archive
$ make (3)
$ make check
$ DESTDIR=~/ make install (4)
install -D "out/fuse-archive" "/home/matoken//usr/bin/fuse-archive"
install -D -m 644 fuse-archive.1 "/home/matoken//usr/share/man/man1/fuse-archive.1"
$ which fuse-archive
/home/matoken/usr/bin/fuse-archive
  1. 関連パッケージの導入

  2. sourceのclone

  3. build

  4. DESTDIRを指定してインストール

fuse-archiveの利用

$ fuse-archive linux-6.8.2.tar.xz (1)
fuse-archive: Created mount point 'linux-6.8.2' (2)
$ mount | grep linux (3)
fuse-archive on /home/matoken/Downloads/linux-6.8.2 type fuse.fuse-archive (ro,nosuid,nodev,relatime,user_id=1000,group_id=1000)
$ grep linux /etc/mtab
fuse-archive /home/matoken/Downloads/linux-6.8.2 fuse.fuse-archive ro,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
$ ls linux-6.8.2/linux-6.8.2/ (4)
COPYING  Documentation  Kconfig   MAINTAINERS  README  block  crypto   fs       init      ipc     lib  net   samples  security  tools  virt
CREDITS  Kbuild         LICENSES  Makefile     arch    certs  drivers  include  io_uring  kernel  mm   rust  scripts  sound     usr
$ head linux-6.8.2/linux-6.8.2/README (5)
Linux kernel
============

There are several guides for kernel developers and users. These guides can
be rendered in a number of formats, like HTML and PDF. Please read
Documentation/admin-guide/README.rst first.

In order to build the documentation, use ``make htmldocs`` or
``make pdfdocs``.  The formatted documentation can also be read online at:

$ touch linux-6.8.2/linux-6.8.2/Makefile (6)
touch: cannot touch 'linux-6.8.2/linux-6.8.2/Makefile': Read-only file system
$ fusermount -u linux-6.8.2 (7)
$ grep linux /etc/mtab
$ ls linux-6.8.2* (8)
linux-6.8.2.tar.xz
  1. fuse-archiveで適当なアーカイブをマウント(マウント時にはキャッシュに読み込むため少し時間がかかる)

  2. 拡張子を除いたファイル名のディレクトリがマウントポイントとして作成されマウントされた

  3. mountされているのを確認

  4. アーカイブ内のファイルにアクセス

  5. ファイルの中を確認

  6. 書き込みはできない

  7. unmount

  8. マウントポイントのディレクトリも消える

大きなアーカイブの利用
$ ls -s Qubes-R4.2.3-x86_64.iso
6748400 Qubes-R4.2.3-x86_64.iso
$ fuse-archive Qubes-R4.2.3-x86_64.iso (1)
fuse-archive: Cannot write to cache: No space left on device
$ fuse-archive -o nocache Qubes-R4.2.3-x86_64.iso (2)
fuse-archive: Created mount point 'Qubes-R4.2.3-x86_64'
$ ls Qubes-R4.2.3-x86_64
EFI  Packages  boot  images  repodata
  1. 大きなアーカイブだと容量不足で失敗することがある

  2. -o nocache オプションでキャッシュを無効にして舞うとすることが可能,ただし速度は大幅に低下する

アーカイブ内のアーカイブのマウント
$ mktemp -d
/tmp/tmp.ZJ1Sil9byy
$ fuse-archive Qubes-R4.2.3-x86_64/Packages/zlib-1.2.12-5.fc37.x86_64.rpm /tmp/tmp.ZJ1Sil9byy
fuse-archive: Using existing mount point '/tmp/tmp.ZJ1Sil9byy'
$ ls /tmp/tmp.ZJ1Sil9byy/
usr
パスワード付きzipファイル
$ find . -iname "*.txt" | zip -e -r -@ /tmp/test.zip
$ fuse-archive /tmp/test.zip
The archive is encrypted.
What is the passphrase that unlocks this archive?
> Got it!
fuse-archive: Created mount point '/tmp/test'

まとめ

fuse-archiveはこれまで試した類似ツールと比べて多くのファイル形式に対応していて高速です.アーカイブの中のファイルを確認するのにとても便利そうです.
ディストリビューションパッケージにあると便利ですが,DebianのWNPPを見ると無さそうです.RFPを投げるといいかもしれません.

環境

$ fuse-archive --version
fuse-archive version: 1.5
libarchive version: libarchive 3.7.4
bzlib version: 1.0.8, 13-Jul-2019
liblz4 version: 1.9.4
liblzma version: 5.6.3
libzstd version: 1.5.6
zlib version: 1.3.1
FUSE library version: 2.9.9
fusermount3 version: 3.14.0
using FUSE kernel interface version 7.19
$ dpkg-query -W libboost-container-dev libfuse-dev libarchive-dev g++ pkg-config make pandoc python3 git
g++     4:14.2.0-1
git     1:2.45.2-1.2
libarchive-dev:amd64    3.7.4-1.1
libboost-container-dev:amd64    1.83.0.2+b2
libfuse-dev:amd64       2.9.9-9
make    4.4.1-1
pandoc  3.1.11.1+ds-2
pkg-config:amd64        1.8.1-4
python3 3.12.7-1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2024/12/22/fuse-mount-various-archives-with-fuse-archive/feed/ 0
Gadgetbridgeのデータ移行 https://matoken.org/blog/2024/12/21/gadgetbridge-data-migration/ https://matoken.org/blog/2024/12/21/gadgetbridge-data-migration/#respond Fri, 20 Dec 2024 21:19:09 +0000 https://matoken.org/blog/?p=4287

ここ2年ちょっとAndroidアプリのGadgetbridgeでスマートウォッチを利用しています.Android本体をリプレースしたのですが,データ移行が面倒で旧Android端末との連携のままでしたが今回データ移行をしました.

基本的に旧端末でデータをエクスポートして,新端末でGadgetbridgeをセットアップしてデータをインポートするだけです.

旧端末での操作

まず旧端末でGadgetbridgeのデータをエクスポートします.

バックアップの前にデータが更新されないようBluetoothをoffにしておきます.

Gadgetbridgeを起動し,の左上の「☰」でメニューを表示,「データの管理」でデータ管理画面に遷移します.

Gadgetbridge export 01

Gadgetbridge export 02

「Backup and Restore」から「Export zip」でデータをエクスポートします.

Gadgetbridge export 03

新端末のセットアップ

Gadgetbridgeの導入

F-DroidからGadgetbrisgeを導入します.

更に旧端末で連携していたアプリケーションがあったらそのアプリも導入してセットアップしておきます.
自分はQuickWeatherやOpenTracksを導入しました.

Gadgetbridgeデータインポート

Gadgetbridgeを起動し,の左上の「☰」でメニューを表示,「データの管理」,「Backup and Restore」から「Import zip」でデータをインポートします.

Gadgetbridge export 04

Gadgetbridgeアプリ下部の「デバイス」→「+」でスマートバンドを追加します.

確認

過去のデータを確認すると表示されます.問題なさそうです.

Gadgetbridge export 05

まとめ

めんどくさそうだなと後回しにしていたGadgetbridgeのデータ移行ですが,実際やってみると簡単でした.もっと早くやっておくんでした.
このスマートウォッチはXiaomi Mi スマートバンド5 日本語版で2年前の11月に購入したものです.2年と少し経ちましたがまだバッテリーも10日以上持ちますしヘタった感じもなく使えています.もう少し高機能なものや薄いものを見るといいなと思ったりしますがまだ使えそうなので使い続けようと思います.

]]>
https://matoken.org/blog/2024/12/21/gadgetbridge-data-migration/feed/ 0
hydroxideを使い無料アカウントのProton MailでもIMAP/SMTPを使う https://matoken.org/blog/2024/12/19/use-imap-smtp-with-hydroxide-and-proton-bridge-with-a-free-account/ https://matoken.org/blog/2024/12/19/use-imap-smtp-with-hydroxide-and-proton-bridge-with-a-free-account/#respond Wed, 18 Dec 2024 21:26:33 +0000 https://matoken.org/blog/?p=4279

Proton MailでOSSのメールブリッジを使うことで無料アカウントでもIMAP/SMTPが利用できたのでメモしておきます.

ProtonMailというスイスの会社のメールサービスがあります.コードはOSSで公開されており,自動的にPGP鍵を作成してE2EEを使えたりします.

現在はオンラインストレージ,VPN,カレンダー,パスワードマネージャーなどのサービスも開始しています.無料でも使えますし,脱gmailな向きには勧めやすいサービスです.

しかし,無料ではIMAP/SMTPが利用できないため好みのMUAが利用できずウェブインターフェイスしか利用できません.€4.99よりの有料プランにアップグレードすることでProton Mail Bridgeというプログラムを利用してIMAP/SMTPが利用できるようになり,好みのMUAが使えるようになります.

 Email client support (via IMAP/SMTP)
Proton Mail supports desktop clients such as Outlook, Apple Mail, Thunderbird, etc. via Proton Mail Bridge.

無料アカウントでProton Mail Bridgeを試すとアップグレードを勧められて使えません.

Proton Mail Bridgeの起動画面
無料アカウントでは利用できない

hydroxideを使う

hydroxideはGo製MITライセンスのProton bridgeです.IMAP/SMTPの他にCardDAVにも対応しています.
Proton Mail Bridgeと違い,GUIは提供されていません.

hydroxideのインストール

ビルドとインストール
$ git clone https://github.com/emersion/hydroxide.git (1)
$ cd hydroxide
$ go build ./cmd/hydroxide (2)
$ install ./hydroxide ~/bin/ (3)
$ which hydroxide
/home/matoken/bin/hydroxide
  1. sourceのclone

  2. build

  3. 好みの場所にインストール

help
$ hydroxide --help
usage: hydroxide [options...] <command>
Commands:
        auth <username>         Login to ProtonMail via hydroxide
        carddav                 Run hydroxide as a CardDAV server
        export-secret-keys <username> Export secret keys
        imap                    Run hydroxide as an IMAP server
        import-messages <username> [file]       Import messages
        export-messages [options...] <username> Export messages
        sendmail <username> -- <args...>        sendmail(1) interface
        serve                   Run all servers
        smtp                    Run hydroxide as an SMTP server
        status                  View hydroxide status

Global options:
        -debug
                Enable debug logs
        -api-endpoint <url>
                ProtonMail API endpoint
        -app-version <version>
                ProtonMail application version
        -smtp-host example.com
                Allowed SMTP email hostname on which hydroxide listens, defaults to 127.0.0.1
        -imap-host example.com
                Allowed IMAP email hostname on which hydroxide listens, defaults to 127.0.0.1
        -carddav-host example.com
                Allowed SMTP email hostname on which hydroxide listens, defaults to 127.0.0.1
        -smtp-port example.com
                SMTP port on which hydroxide listens, defaults to 1025
        -imap-port example.com
                IMAP port on which hydroxide listens, defaults to 1143
        -carddav-port example.com
                CardDAV port on which hydroxide listens, defaults to 8080
        -disable-imap
                Disable IMAP for hydroxide serve
        -disable-smtp
                Disable SMTP for hydroxide serve
        -disable-carddav
                Disable CardDAV for hydroxide serve
        -tls-cert /path/to/cert.pem
                Path to the certificate to use for incoming connections (Optional)
        -tls-key /path/to/key.pem
                Path to the certificate key to use for incoming connections (Optional)
        -tls-client-ca /path/to/ca.pem
                If set, clients must provide a certificate signed by the given CA (Optional)

Environment variables:
        HYDROXIDE_BRIDGE_PASS   Don't prompt for the bridge password, use this variable instead

認証

authオプションでProton Mailとhydroxideの間での認証と,hydroxideとMUAの間で使うパスワードの生成を行います.
Proton Mailとの認証後に表示されるブリッジパスワードはMUAとの認証に使います.保存しておきましょう.

$ hydroxide auth <username>

認証情報は ~/.config/hydroxide/ 以下のファイルに保存されます.

hydroxideの起動

  • SMTP

smtpオプションでSMTPのブリッジが起動します.

$ hydroxide smtp
port

1025

セキュリティ

なし

user

Proton Mailと同じ

password

authオプションで表示されたブリッジパスワード

  • CardDav

carddavオプションでCardCadのブリッジが起動します.httpsリバースプロキシを起動して利用するようですが未検証.

$ hydroxide carddav
  • IMAP

imapオプションでIMAPのブリッジが起動します.

$ hydroxide imap
port

1143

セキュリティ

なし

user

Proton Mailと同じ

password

authオプションで表示されたブリッジパスワード

Warning
IMAPのサポートは進行中らいいです.とりあえず数時間使った程度だと普通に使えていそうです.
  • serveオプションで複数のサービスの起動

hydroxideを複数起動しないようにとの注意がREADME.mdにあります.複数のサービスを起動したい場合はserveオプションで全てのサービス(SMTP, CardDav, IMAP)が起動します.

$ hydroxide serve

3つのサービスのうち2つだけを起動したい場合はserveオプションの他に-disable-サービス名のオプションを指定します.以下はCardDavを無効にしてSMTPとIMAPが起動します.

$ hydroxide -disable-carddav serve

MUAの設定

hydroxideを起動した状態で好みのMUAに設定を行います.
TLSなどには非対応なので注意.

あとは普通に利用できます.
Proton Mailに作られたたものではない自分のPGP鍵を使うこともできます :)

hydroxideの自動起動とアクセス制限

はじめRaspberry Piでhydroxideを起動してLaptopのMUAから繋ごうと思っていましたが,既定値ではTLSが利用されず通信が平文で行われるのでリモートで動かすのはやめてlocalhostで動かすことにしました.

MUAでメールを送受信するときにはhydroxideが起動している必要があります.
デスクトップ環境の自動起動機能や,crontabの@rebootなどやMUAの起動scriptに加えたりすると良さそうです.

そしてそのままだとリモートから繋ぐこともできるのでlocalhostからしか受け付けないようnftableなどで制限を掛けたほうが良さそうです.

おわりに

ということでhydroxideを利用し,無料アカウントでProton MailのIMAP/SMTPを使えるようにして自分好みのMUAを利用できるようになりました.これでウェブブラウザを起動しなくてもメールの送受信ができたり自分の作成したPGP鍵を利用できます.
ただ,hydroxideもProtonのAPIを叩いているようなのでProton BrisgeのようにProton側で無料アカウントに対してアクセス制限をするようになると使えなくなると思います.そのためいつまで利用できるかわからない方法です.それが嫌なら有料アカウントにアップグレードするか別のサービスを使うしかなさそうです.

環境

$ git log –pretty=oneline -1
c964219ad4996d90b34d730b98a8c736b9bc9921 (HEAD -> master, tag: v0.2.29, origin/master, origin/HEAD) Support BODY and TEXT in search

$ dpkg-query -W golang
golang:amd64    2:1.23~2
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
環境2(Raspberry Pi OS bookworm armhf)
$ git log --pretty=oneline -1
c964219ad4996d90b34d730b98a8c736b9bc9921 (HEAD -> master, tag: v0.2.29, origin/master, origin/HEAD) Support BODY and TEXT in search
$ dpkg-query -W golang
golang:armhf    2:1.19~1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
]]>
https://matoken.org/blog/2024/12/19/use-imap-smtp-with-hydroxide-and-proton-bridge-with-a-free-account/feed/ 0
KSMBDでSMB共有 https://matoken.org/blog/2024/12/13/smb-share-with-ksmbd/ https://matoken.org/blog/2024/12/13/smb-share-with-ksmbd/#respond Thu, 12 Dec 2024 15:48:18 +0000 https://matoken.org/blog/?p=4274

AndroidスマートフォンからLinux Boxのファイルにアクセスしたい.AndroidからだとSMBがいいのかな?でも今回に用途にsambaは大袈裟な感じということで久々にKSMBDを設定したメモです.

ホストはRaspberry Pi bookworm armhfとDebian sid amd64で確認しました.
KSMBDはLinux KernelベースのSMBサーバー実装です.Linux kernel 5.11以降に含まれています.

sambaの停止

sambaを動かしている場合停止します.

$ sudo systemctl stop smbd nmbd winbind samba-ad-dc

ksmbd-toolsの導入

KSMBD自体はkernel moduleですが,ユーザランドのksmbd-toolsというツールが別途必要なので導入します.

Debianでは ksmbd-tools というパッケージです.

$ sudo apt install ksmbd-tools
$ dpkg -L ksmbd-tools
/.
/etc
/etc/ksmbd
/etc/ksmbd/ksmbd.conf.example
/usr
/usr/lib
/usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/system/ksmbd.service
/usr/libexec
/usr/libexec/ksmbd.tools
/usr/sbin
/usr/share
/usr/share/doc
/usr/share/doc/ksmbd-tools
/usr/share/doc/ksmbd-tools/PFIF.txt
/usr/share/doc/ksmbd-tools/README.Debian
/usr/share/doc/ksmbd-tools/README.md.gz
/usr/share/doc/ksmbd-tools/changelog.Debian.gz
/usr/share/doc/ksmbd-tools/copyright
/usr/share/doc/ksmbd-tools/examples
/usr/share/doc/ksmbd-tools/examples/ksmbd.conf.example
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/ksmbd.conf.5.gz
/usr/share/man/man5/ksmbdpwd.db.5.gz
/usr/share/man/man8
/usr/share/man/man8/ksmbd.addshare.8.gz
/usr/share/man/man8/ksmbd.adduser.8.gz
/usr/share/man/man8/ksmbd.control.8.gz
/usr/share/man/man8/ksmbd.mountd.8.gz
/usr/sbin/ksmbd.addshare
/usr/sbin/ksmbd.adduser
/usr/sbin/ksmbd.control
/usr/sbin/ksmbd.mountd

設定ファイルの用意

次に設定ファイルを用意します.

最低限の設定を書いたり.
$ echo '[global]

[share]
  path=/tmp
' | sudo tee /etc/ksmbd/ksmbd.conf
既存のsmb.confを流用したり,
$ sudo cp -p /etc/samba/smbd.conf /etc/ksmbd/ksmbd.conf
ksmbd-toolsに付属のksmbd.conf.exampleをコピーして使ったり,
$ sudo cp -p /etc/ksmbd/ksmbd.conf.example /etc/ksmbd/ksmbd.conf

smb.confとだいたい同じようにかけますが,[homes]のような特殊な共有名や,path = %Hpath = /home/%u のような環境変数はうまく動かない感じです.以下のようなissueがあるので恐らく未実装かなと.

詳細はKSMBD.CONF(5)を.

$ man ksmbd.conf

SMB共有のユーザ,パスワードの設定

ksmbd-tools付属のksmbd.adduserコマンドで共有にアクセスするためのユーザ名とパスワードを設定します.

$ sudo ksmbd.adduser -a <KSMBDアクセス用ユーザ名>

パスワードファイルは /etc/ksmbd/ksmbdpwd.db で, ID:passwordhash のような形式で保存されるようです.

KSMBDモジュールの読み込み

KSMBDモジュールを読み込みます.モジュールがない場合kernel sourceからmenuconfigなどでKSMBDモジュールを有効にします.

$ modinfo ksmbd
filename:       /lib/modules/6.6.64-v7+/kernel/fs/smb/server/ksmbd.ko.xz
softdep:        pre: crc32
softdep:        pre: gcm
softdep:        pre: ccm
softdep:        pre: aead2
softdep:        pre: sha512
softdep:        pre: sha256
softdep:        pre: cmac
softdep:        pre: aes
softdep:        pre: nls
softdep:        pre: md5
softdep:        pre: hmac
softdep:        pre: ecb
license:        GPL
description:    Linux kernel CIFS/SMB SERVER
version:        3.4.2
author:         Namjae Jeon <linkinjeon@kernel.org>
srcversion:     615D8D4CE63537A48C03456
depends:        nls_ucs2_utils,cifs_arc4
intree:         Y
name:           ksmbd
vermagic:       6.6.64-v7+ SMP mod_unload modversions ARMv7 p2v8
$ sudo modprobe -v ksmbd
$ lsmod | grep ksmbd
ksmbd                 249856  1
cifs_arc4              12288  1 ksmbd
nls_ucs2_utils         12288  1 ksmbd

ksmbd.mountdの起動

ユーザー空間用のデーモンを起動します.

$ sudo ksmbd.mountd

共有にアクセス

適当なファイラーや,smbclientなどからアクセス出来るのを確認します.

$ smbclient //192.168.0.23/home
Password for [WORKGROUP\matoken]:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Tue Nov 17 06:17:29 2020
  ..                                  D        0  Mon May 20 18:03:24 2024
  nitter                              D        0  Mon Nov 23 23:14:29 2020
  huginn                              D        0  Sat Oct 24 16:03:31 2020
  pi                                  D        0  Mon Aug 12 06:12:17 2024
  matoken                             D        0  Thu Dec 12 22:39:12 2024
  gitea                               D        0  Fri Nov 13 09:43:48 2020

                29948557 blocks of size 4096. 2499637 blocks available

設定の再読込

設定ファイルを編集した場合,設定を反映するために再読込をします.

$ sudo ksmbd.control --reload

KSMBD停止

$ sudo ksmbd.control -s
[ksmbd.control/30908]: INFO: Terminated ksmbd.mountd
[ksmbd.control/30908]: INFO: Killed ksmbd
$ sudo modprobe -r ksmbd

永続化

動いたので次回起動時以降に起動してくるよう永続化します.

sambaの無効化
$ sudo systemctl disable smbd nmbd winbind samba-ad-dc
モジュールの自動読み込み
$ echo ksmbd | sudo tee -a /etc/modules
ksmbdデーモンの自動起動
$ sudo systemctl enable ksmbd

再起動して動作確認.

Androidからのアクセス

まずSMBに対応した動画プレイヤーのVLCで動画再生を試みました.問題なく動作します.

次にPDFを読めるか試そうと思ったのですが,FilesアプリなどではSMBにアクセスできなそうです.F-DroidからCIFS Documents Providerというアプリケションを導入することでSMB内のファイルにアクセスできました.PDFファイルも読めます.しかし一旦ダウンロードしないと読めないようで少し待ち時間が必要でした.探せばストリーミングに対応したアプリはありそうです.

家庭内の個人用ファイルサーバーなんかだとKSMBDが向いているかもしれません.

環境

サーバー1
$ uname -a
Linux raspberrypi 6.6.64-v7+ #1829 SMP Tue Dec 10 20:04:50 GMT 2024 armv7l GNU/Linux
$ apt list ksmbd-tools
Listing... Done
ksmbd-tools/stable,now 3.4.7-1 armhf [installed]
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ grep "^Model" /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
サーバー2
$ uname -a
Linux tp-l13 6.11.10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.11.10-1 (2024-11-23) x86_64 GNU/Linux
$ apt list ksmbd-tools
ksmbd-tools/unstable,now 3.5.2-3 amd64 [installed]
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
クライアント(Android)
$ adb shell pm list packages --show-versioncode | grep -e vlc -e cifs
package:com.wa2c.android.cifsdocumentsprovider versionCode:29
package:org.videolan.vlc versionCode:13050749
$ adb shell getprop ro.build.version.release
14
$ adb shell getprop ro.product.model
moto g24
]]>
https://matoken.org/blog/2024/12/13/smb-share-with-ksmbd/feed/ 0
NDL古典籍OCR-LiteをLinux laptopで試す https://matoken.org/blog/2024/11/29/try-ndlkotenocr-lite-on-linux-laptop/ https://matoken.org/blog/2024/11/29/try-ndlkotenocr-lite-on-linux-laptop/#respond Thu, 28 Nov 2024 22:39:39 +0000 https://matoken.org/blog/?p=4264

YomiTokuという日本語に特化したAI 文章画像解析エンジンを知りました.OCRだけでなく,レイアウト解析機能を持っていて複雑なレイアウトの画像でも解析してOCRしてくれるようです.(CPUでも動きそうなのでこれも試したいところです.)

国立国会図書館でも似たようなのがあったけどGPU専用だったよなとリポジトリを見に行くとやはりCUDA対応のNVIDIA GPUが必要そうです.

やはり駄目かと思いながらなんとはなしにndl-labを眺めてみるとndl-kotenocr-liteという新しいリポジトリが出来ていました.
GPUがなくても動作する古典籍資料のOCRが出来るツールのようです.古典は読まないのですが面白そうと思い試してみました.

NDL古典籍OCR-Liteは、江戸期以前の和古書、清代以前の漢籍といった古典籍資料のデジタル化画像からテキストデータを作成するOCRです。
GPUを必要としないOCR処理に特徴があり、ノートパソコン等の一般的な家庭用コンピュータやOS環境において高速に実行可能です。
Windows(Windows 10)、Intel Mac(macOS Sequoia)及びLinux(Ubuntu 22.04)環境において動作確認しています。

GUI版の利用

Windows, macOS,Linux(amd64のみ)のGUI版バイナリがreleasesにあるので最新版を入手しましょう.今回はLinux版の
ndlkotenocr-lite_v1.0.1_linux.tar.gzを利用しました.

Note
README.mdにはIntel Mac(macOS Sequoia)とありますが,ndlkotenocr-lite_v1.0.1_macos_m1.tar.gzというものもあるのでarm版macOSでも動くのかもしれません.(未確認)
$ wget2 -v -c https://github.com/ndl-lab/ndlkotenocr-lite/releases/download/1.0.1/ndlkotenocr-lite_v1.0.1_linux.tar.gz (1)
$ tar tvf ndlkotenocr-lite_v1.0.1_linux.tar.gz
$ tar xf ndlkotenocr-lite_v1.0.1_linux.tar.gz (2)
$ file linux/ndlkotenocr_lite
linux/ndlkotenocr_lite: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=dbd9936c296625a7a1083220c253758069687d53, for GNU/Linux 3.2.0, not stripped
$ linux/ndlkotenocr_lite (3)
  1. Linux版をreleasesからダウンロード

  2. 展開

  3. ndlkotenocr_liteの起動

画面はシンプルです.対象の画像もしくはディレクトリと,結果の出力ディレクトリを指定してOCRボタンを押すだけです.

元画像では全然読めませんが,OCR結果を見るとなんとなくわかるので面白いです.

ndlkotenocr lite

今回10コマ(20ページほど)を処理しましたがThinkPad L13(CPU Intel® Core™ i7-10510U/RAM DDR4 16GB)で30秒ほどで完了しました.出力結果として対象画像毎にOCRの処理結果のテキストファイル,JSONファイル,XMLファイルが作られます.また,「認識箇所の可視化画像を保存する」にチェックを付けているとどの部分を認識したかの画像ファイルも保存されます.

認識箇所が青枠で囲まれている

ndlkotenocr lite viz

シンプルな画像だとテキストファイルだけで良さそうですが,複雑な順番がわからないようなものはOCRされたテキストがどの部分のものか分かりづらいので,座標情報の含まれるJSONファイルやXMLファイルを参照したほうが良いかもしれません.とはいえ分かりづらいので文字部分にマウスカーソルを移動するとポップアップするようなビュワーを作ると便利かもしれません.

cli版

コマンドラインからも操作できます.Python 3.10以降が必要です.
sourceをcloneしてPythonの依存パッケージを導入する必要があります.

$ git clone https://github.com/ndl-lab/ndlkotenocr-lite (1)
$ cd ndlkotenocr-lite
$ python3 -m venv venv (2)
$ source venv/bin/activate (3)
$ pip install -r requirements.txt (4)
$ cd src
  1. sourceのclone

  2. venvでPython仮想環境を設定

  3. venvの環境に入る

  4. 依存パッケージを導入

Note
このときのclone時にMNVOのモバイル回線だとpostバッファサイズを増やしていても失敗を繰り返しました.結局リモートのVPSでcloneしてそのディレクトリをrsyncしてきました.
Note
Raspberry Pi OS bookworm armhfでも試したところonnxruntimeのarmhf版が無いようで導入に失敗しました.自分でbuildすれば動かせるかもしれません.
コマンドライのプション確認
$ python3 ./ocr.py --help
usage: ocr.py [-h] [--sourcedir SOURCEDIR] [--sourceimg SOURCEIMG] --output OUTPUT [--viz VIZ] [--det-weights DET_WEIGHTS]
              [--det-classes DET_CLASSES] [--det-score-threshold DET_SCORE_THRESHOLD] [--det-conf-threshold DET_CONF_THRESHOLD]
              [--det-iou-threshold DET_IOU_THRESHOLD] [--rec-weights REC_WEIGHTS] [--rec-classes REC_CLASSES] [--device {cpu,cuda}]

Arguments for NDLkotenOCR-Lite

options:
  -h, --help            show this help message and exit
  --sourcedir SOURCEDIR
                        Path to image directory
  --sourceimg SOURCEIMG
                        Path to image directory
  --output OUTPUT       Path to output directory
  --viz VIZ             Save visualized image
  --det-weights DET_WEIGHTS
                        Path to rtmdet onnx file
  --det-classes DET_CLASSES
                        Path to list of class in yaml file
  --det-score-threshold DET_SCORE_THRESHOLD
  --det-conf-threshold DET_CONF_THRESHOLD
  --det-iou-threshold DET_IOU_THRESHOLD
  --rec-weights REC_WEIGHTS
                        Path to parseq-tiny onnx file
  --rec-classes REC_CLASSES
                        Path to list of class in yaml file
  --device {cpu,cuda}   Device use (cpu or cuda)

早速利用してみます.–sourcedirか—​sourceimgで処理対象ディレクトリか処理対象ファイルを指定,–outputで結果の出力先を指定,–viz Trueで可視化画像を有効にして実行します.

ベータですが,もしCUDAに対応したGPUの利用できる環境であれば—​deviceでcudaを指定すると速くなると思います.(未確認)

$ python3 ./ocr.py --sourceimg ./digidepo_12282447_0001-000.png --output . --viz True
['./digidepo_12282447_0001-000.png']
[INFO] Intialize Model
[INFO] Inference Image
[INFO] Saving result on ./viz_digidepo_12282447_0001-000.png
$ ls -ltrA
合計 21964
drwxr-xr-x 2 matoken matoken     4096 11月 29 05:40 config
drwxr-xr-x 2 matoken matoken     4096 11月 29 05:40 model
-rw-r--r-- 1 matoken matoken    35776 11月 29 05:40 ndl_parser.py
-rw-r--r-- 1 matoken matoken     2988 11月 29 05:40 parseq.py
-rw-r--r-- 1 matoken matoken     8911 11月 29 05:40 ocr.py
-rw-r--r-- 1 matoken matoken     5744 11月 29 05:40 rtmdet.py
drwxr-xr-x 6 matoken matoken     4096 11月 29 06:10 reading_order
drwxrwxr-x 2 matoken matoken     4096 11月 29 06:10 __pycache__
-rw-rw-r-- 1 matoken matoken 11209450 11月 29 06:12 digidepo_12282447_0001-000.png
-rw-rw-r-- 1 matoken matoken 11131912 11月 29 06:13 viz_digidepo_12282447_0001-000.png
-rw-rw-r-- 1 matoken matoken    13917 11月 29 06:13 digidepo_12282447_0001-000.xml
-rw-rw-r-- 1 matoken matoken     3635 11月 29 06:13 digidepo_12282447_0001-000.txt
-rw-rw-r-- 1 matoken matoken    46375 11月 29 06:13 digidepo_12282447_0001-000.json

普通に動作します.
GUI版と速度を比較してみようと同じものを処理してみると,10コマでGUI版30秒,CLI版32秒あまり変わらないので恐らく誤差だと思います.

GUI版のほうがダウンロードして展開するだけで使えて容量も小さいので試しに使うにはGUI版のほうが良さそうです.CLI版はCUDA対応環境だったり,プログラムから呼んで一括処理や前処理後処理などをしたいときに便利そうです.

Note
GUI版の容量は展開時で258MB程,CLI版の容量は依存パッケージ導入後で520MB程でした.

参考URL

国立国会図書館デジタルコレクションの蔵書の入手方法は以下が参考になると思います.

国立国会図書館デジタルコレクションの蔵書は大抵pdfでダウンロードしますが,pdfは今回のNDL古典籍OCR-Liteに対応していないので画像に変換する必要があります.pdfから画像に変換するのには以下の記事が参考になると思います.

環境

$ dpkg-query -W python3 python3-venv wget git poppler-utils
git     1:2.45.2-1.2
poppler-utils   24.08.0-3
python3 3.12.7-1
python3-venv    3.12.7-1
wget    1.24.5-2+b1
 lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
$ grep -m1 ^model\ name /proc/cpuinfo
model name      : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
$ head -1 /proc/meminfo
MemTotal:       15992648 kB
]]>
https://matoken.org/blog/2024/11/29/try-ndlkotenocr-lite-on-linux-laptop/feed/ 0
i3 wm環境でmpvを任意の場所に https://matoken.org/blog/2024/11/28/i3-mpv-anywhere-in-wm-environment/ https://matoken.org/blog/2024/11/28/i3-mpv-anywhere-in-wm-environment/#respond Wed, 27 Nov 2024 21:04:56 +0000 https://matoken.org/blog/?p=4259

最近PC作業中に動画をウィンドウ表示,最前面に表示しています.
i3 wm環境でファイラーからmpvで動画を再生,フローティングウィンドウ表示に切り替え,サイズ調整,位置調整,全てのワークスペースで表示としていますが毎回これをやるのが面倒なので設定しました.

実際の操作は以下のような感じ.たくさんの動画を一度に開けばまだいいですが,1つの動画を何度も再生するには面倒です.

  • Mod4+shift+spaceでフローティングウィンドウに切り替え

  • Mod4+rでリサイズモードに, jkl;でサイズ調整,escでリサイズモード解除

  • Mod4+shift+j k l ;で位置調整

  • Mod4+shift+wで全てのワークスペースで表示

Note

全てのワークスペースに表示はこの設定を使っています.

i3 wmでの設定

まずi3 wmの設定でmpvをフローティングウィンドウで起動,スティッキーを有効にして全ワークスペースで表示されるようにします.

$ grep mpv ~/.config/i3/config
for_window [class="mpv"] floating enable
for_window [class="mpv"] sticky enable

Mod4+shift+rで設定反映して,mpvを起動して動作確認します.

mpvの設定

次にmpvの設定ファイルでウィンドウサイズや位置を設定します.
mpvの設定ファイルはパッケージに含まれているものをベースにしました.すでにある場合はそれを利用しましょう.

$ ls ~/.config/mpv/mpv.conf
ls: cannot access '/home/matoken/.config/mpv/mpv.conf': No such file or directory
$ mkdir ~/config/mpv
$ zcat /usr/share/doc/mpv/mpv.conf.gz > ~/.config/mpv/mpv.conf

次に好みのテキストエディタで~/.config/mpv/mpv.confを開いて編集します.
#geometry=50%:50% の行をコメントを消し以下のように設定しました.

geometry=45%-50-80

geometryのオプション形式は以下のようになっています.

[W[%][xH[%]]][{+-}X[%]{+-}Y[%]] | [X[%]:Y[%]]

ここではWを45%にして画面の45%のサイズに,-50で右下から50pix左に,-80で右下から80pix上に配置しています.

はじめWxHは動画に対する設定だと思い100%を超える設定がうまく行かないと悩んでしまいました.
こういうときコマンドラインから実行するとわかりやすいです.

$ mpv --geometry=120%
Option geometry: invalid geometry: '120%'
Valid format: [W[%][xH[%]]][{+-}X[%]{+-}Y[%]] | [X[%]:Y[%]]
Error parsing option geometry (option parameter could not be parsed)
Setting commandline option --geometry=120% failed.
Exiting... (Fatal error)

環境

$ dpkg-query -W mpv i3
i3      4.24-1
mpv     0.38.0-1+b1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2024/11/28/i3-mpv-anywhere-in-wm-environment/feed/ 0
scrcpy v3.0で仮想ディスプレイを使う https://matoken.org/blog/2024/11/25/using-virtual-display-with-scrcpy-v3-0/ https://matoken.org/blog/2024/11/25/using-virtual-display-with-scrcpy-v3-0/#respond Sun, 24 Nov 2024 21:56:51 +0000 https://matoken.org/blog/?p=4256

scrcpyの導入

例によってメインデスクトップ環境のDebian sid amd64に導入します.
Linux環境への手順は doc/linux.md に書かれています.GitHubではこちら.

ここではgit経由のsourceから導入します.

$ sudo apt install ffmpeg libsdl2-2.0-0 adb wget \
                 gcc git pkg-config meson ninja-build libsdl2-dev \
                 libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \
                 libswresample-dev libusb-1.0-0 libusb-1.0-0-dev (1)
$ git clone https://github.com/Genymobile/scrcpy (2)
$ cd scrcpy
$ ./install_release.sh (3)
$ which scrcpy (4)
/usr/local/bin/scrcpy
$ scrcpy --version (5)
scrcpy 3.0 <https://github.com/Genymobile/scrcpy>

Dependencies (compiled / linked):
 - SDL: 2.30.9 / 2.30.9
 - libavcodec: 61.19.100 / 61.19.100
 - libavformat: 61.7.100 / 61.7.100
 - libavutil: 59.39.100 / 59.39.100
 - libavdevice: 61.3.100 / 61.3.100
 - libusb: - / 1.0.27
  1. 必要なパッケージの導入

  2. sourceのclone

  3. インストールスクリプトの実行

  4. scrcpyの場所を確認

  5. バージョンの確認

仮想ディスプレイを試す

scrcpy v3.0が入ったので早速仮想ディスプレイを試してみます. --new-display オプションに好みで解像度を指定できます.

$ scrcpy --new-display=720x1608
scrcpy 3.0 <https://github.com/Genymobile/scrcpy>
INFO: ADB device found:
INFO:     -->   (usb)  ZT322L25CF                      device  moto_g24
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed, 0 skipped. 147.9 MB/s (90224 bytes in 0.001s)
[server] INFO: Device: [motorola] motorola moto g24 (Android 14)
INFO: Renderer: opengl
INFO: OpenGL version: 4.6 (Compatibility Profile) Mesa 24.2.7-1
INFO: Trilinear filtering enabled
INFO: Texture: 720x1608
[server] INFO: New display: 720x1608/237 (id=3)

一部のアプリケーションが配置されています.寂しいですね.

scrcpy v3.0 vd 01

scrcpyに --start-app= オプションを指定することで好みのアプリケーションが起動できます.その前に list-apps オプションで起動したいアプリケーションを確認します.ここではニコニコ動画を起動しています.

$ scrcpy list-apps | grep nico
 - ニコニコ動画                         jp.nicovideo.android
 - ニコニコ生放送                        jp.co.dwango.nicocas
$ scrcpy --new-display=1608x720 --start-app=jp.nicovideo.android

scrcpy v3.0 vd 02

普通に視聴できました.
このときAndroid本体はディプレイは消えたままです.ロックを解除して別のアプリを使うこともできます.
仮想ディスプレイで実行中のアプリを起動するとアプリは本体側に移り,仮想ディスプレイにはデスクトップが表示されました.
仮想ディスプレイでニコニコ動画を再生しつつ本体でYouTube動画を再生してみると,両方の音声がPC側から出ました.

これまでも本体画面を消灯して使うといったことはできましたが,通知が来て別のアプリをちょっと確認したいみたいなときなどアプリを切り替える必要があり面倒でした.この仮想ディスプレイは別のディスプレイ扱いでそういうときにも2つの画面が同時に使えて便利です.
それに画面ロックを解除する必要がないのも便利です.(これは選べると嬉しいけど)

scrcpyと組み合わせて使うのにAndroidベースのTV StickやTV Boxのようなものが欲しくなります.

環境

PC環境
$ scrcpy -v
scrcpy 3.0 <https://github.com/Genymobile/scrcpy>

Dependencies (compiled / linked):
 - SDL: 2.30.9 / 2.30.9
 - libavcodec: 61.19.100 / 61.19.100
 - libavformat: 61.7.100 / 61.7.100
 - libavutil: 59.39.100 / 59.39.100
 - libavdevice: 61.3.100 / 61.3.100
 - libusb: - / 1.0.27
 $ dpkg-query -W ffmpeg libsdl2-2.0-0 adb wget \
                 gcc git pkg-config meson ninja-build libsdl2-dev \
                 libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \
                 libswresample-dev libusb-1.0-0 libusb-1.0-0-dev
adb     1:34.0.5-3
ffmpeg  7:7.1-3
gcc     4:14.2.0-1
git     1:2.45.2-1.2
libavcodec-dev:amd64    7:7.1-3
libavdevice-dev:amd64   7:7.1-3
libavformat-dev:amd64   7:7.1-3
libavutil-dev:amd64     7:7.1-3
libsdl2-2.0-0:amd64     2.30.9+dfsg-1
libsdl2-dev:amd64       2.30.9+dfsg-1
libswresample-dev:amd64 7:7.1-3
libusb-1.0-0:amd64      2:1.0.27-1+b1
libusb-1.0-0-dev:amd64  2:1.0.27-1+b1
meson   1.6.0-1
ninja-build     1.12.1-1
pkg-config:amd64        1.8.1-4
wget    1.24.5-2+b1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
Android環境
$ adb shell dumpsys package com.nextcloud.client | grep versionName=
    versionName=3.29.2
$ adb shell getprop ro.build.version.release
14
$ adb shell getprop ro.build.version.sdk
34
$ adb shell getprop ro.build.id
UTA34.82-90
$ adb shell getprop ro.product.model
moto g24
]]>
https://matoken.org/blog/2024/11/25/using-virtual-display-with-scrcpy-v3-0/feed/ 0
ローソンでpovo2.0のデータ容量が無料でもらえるpovo Data Oasisを試す https://matoken.org/blog/2024/11/22/povo-data-oasis/ https://matoken.org/blog/2024/11/22/povo-data-oasis/#respond Thu, 21 Nov 2024 21:59:47 +0000 https://matoken.org/blog/?p=4249

povo2.0というKDDI,沖縄セルラーのNVMOサービスがあります.低速で待受専用に使うと維持費がとても安く済むので助かっています.
このpovo2.0は色々とユニークなプランやサービスを実施するのですが,最近ローソンに行くとデータが無料でもらえるサービスを始めたとのことで試してみました.

KDDI、沖縄セルラーは2024年11月19日から、povo2.0において、ローソン店舗への来店で、もれなくデータが無料でもらえる「povo Data Oasis」(ポヴォデータオアシス)の提供を開始します。ローソン店舗へ来店し、お手持ちのスマートフォンから特設サイトにアクセスいただくと、1回の来店につき0.1GB、最大で月10回(合計1GB)まで、データを無料でもらうことが可能です。

とのことでローソンの駐車場で試しました.

先ずはpovo2.0アプリを起動,「ローソンへの来店で最大1GB/月データ容量をチャージ」のバナーをタップ.
povo lawson01

ウェブブラウザが起動して https://povo.jp/lawson/ に遷移します.ここで「データ容量をチャージする」をタップ.
povo lawson02

「ログイン」します.(2日後に試したときもログインが必要でした)
povo lawson03

「popo Data Oasis」の「チャージ追加する」をタップ.
povo lawson04

位置情報の利用と,利用規約に同意して「データをチャージする」
povo lawson05

利用規約はOCRしたものを以下に貼っておきました.

利用規約

第1条(本規約)
お客さまがKDDI株式会社及び沖縄セルラー電話 株式会社(以下併せて「当社」といいます。) の提供する、「povo Data Oasis」(以下「本 サービス」といいます。)を利用する条件等 は、この利用規約(以下「本規約」といいま す。)に定めるとおりとします。本サービスの ご利用に際しては、本規約に同意いただく必要 があります。

第2条(本サービスの内容)
1. 本サービスは、当社通信サービス 「povo2.0」をご契約のお客さまご本人の端末 (本サービスに対応する別途当社が指定するス マートフォン等のお客さまの端末をいいま す。)の位置情報 (GPS等で測定した緯度経 度)を、ウェブブラウザ (他社が提供するウェ ブサイトで閲覧可能なアプリケーションのうち 当社が指定するものをいいます。)を通じて取 得することにより、株式会社ローソンの運営す るコンビニエンスストア「ローソン」のうち当 社が指定する店舗へのご来店を確認できた場合 に、データ付与等を行うサービスです。
2. データ追加の利用回数には上限がございます。
3. 本サービスの内容及びご提供条件の詳細は、 当社ウェブサイトをご確認ください。

第3条(変更、終了等)
当社は、次の各号の一に該当する場合、本規約 を当社の判断により変更することができるもの とします。当社は、本規約を変更する場合、変 更後の本規約の施行時期及び内容を当社ウェブ サイト上での掲示その他の適切な方法により周 知又は通知します。この場合、本サービスの提 供条件は変更後の本規約によるものとします。
(1)当該変更が利用者の一般の利益に適合すると き
(2)当該変更が本サービスの提供の目的に反する ものではなく、かつ、変更の必要性、変更後の 内容の相当性、その他の変更にかかる事情に照 らして合理的であるとき。

第4条(本規約の掲載等)
1. 本規約は、当社が別途指定するウェブサイト 上に掲載するものとし、本規約の変更は、変更 後の本規約が利用契約者に閲覧可能な状態で当 該ウェブサイト上に掲載された時点より効力を 生じるものとします。
2. 当社が当社ウェブサイト上で掲載する本サー ビスに関するご提供条件及びルールは、本規約 の一部を構成するものとします。
3. 本規約の内容と、前項のご提供条件及びルー ルその他の本規約外における本サービスの説明 等とが異なる場合は、本規約の規定が優先して適用されるものとします。

第5条(お客さまに関する情報の取扱い)
1. お客さまは、本サービスを利用するに際し、 ウェブブラウザを通じた位置情報 (GPS等で測 定した緯度経度)の利用を許諾する必要があり ます。
2. 当社は、前項に基づき取得した位置情報 (GPS等で測定した緯度経度)を本サービスの 運営、管理のために必要な範囲 (当社の業務委 託先であるKDDI Digital Life株式会社(以下、 KDL) 及びCircles Asia Pte. Ltd. (以下 「Circles.Life」 ) へ提供する場合を含みま す。)で利用します。お客さまの同意なく位置 情報(GPS等で測定した緯度経度)を第三者へ 提供することはございません。
3. 第1項に定めるほか、当社は、本サービスの 提供に際し取得したお客さまの個人情報につい て、当社が別に公表する 「povo2.0通信サービ ス契約約款」及び「プライバシーポリシー」に 従って適切に取り扱うものとします。

第6条(本サービスの料金)
本サービスの料金は無料です。但し、本サービ スの利用に際して発生した通信料は、お客さま の負担となります。

第7条(遵守事項)
お客さまは、本サービスを利用するにあたり、次の各号で定める義務を遵守するものとしま す。万一、お客さまが次の各号で定める義務に 違反し、第三者との間で紛争が生じた場合は、 お客さまの責任と費用負担で当該紛争を処理、 解決するものとします。
(1)第6条第1項に基づき設定した内容に虚偽 若しくは不備がないこと。
(2)第三者のプライバシー並びにその他の権利及 び利益を侵害し、又はその虞がある態様で本 サービスを利用しないこと。
(3)本サービスを営利目的で利用(お客さまが本 サービスを手段として直接に金銭その他の商業 的利益を求めることをいいます。)しないこと
(4) 本サービス又は本サービスで使用されている ソフトウェア、ドキュメント、データ、画像、 ロゴ等(以下、本サービス等といいます。)に 係る製品表示、著作権表示、その他の注意文 言、又は財産権に基づく制限事項を削除又は変 更しないこと
(5)本サービス等の複製、頒布、公衆送信、改 変、翻訳、翻案又は二次的著作物の作成をしな いこと
(6)当社の書面による事前承諾なく、本サービス 等を第三者に移転、販売、譲渡その他の処分を しないこと
(7)当社の書面による事前承諾なく、本サービス 等の再使用許諾、貸与その他方法の如何を問わ ず、第三者に使用させないこと
(8)本サービス等のリバースエンジニアリング、 逆コンパイル、又は逆アセンブルをしないこと
(9)エミュレータその他の非純正ソフトウェアを 用いてデータ改ざん等を行い、本サービスを利 用しないこと
(10) 当社による本サービスの運営を妨害し若し くは当社の信用を毀損し又はそれらの慮がある 行為をしないこと
(11)法令若しくは公序良俗に違反し、又はその 虞がある行為を行わないこと。
(12) 当社が定める本規約その他の本サービスに 関するルールに抵触する行為を行わないこと
(13) 前各号の他、当社若しくは第三者の権利を 侵害、制限、妨害し又はその虞がある行為をし ないこと
(14)本規約上の地位又は本規約に基づく権利若 しくは義務を第三者に移転又は譲渡しないこと

第8条(使用上の注意・警告)
1. お客さまは、本規約の内容を理解した上で、 本サービスのご利用を、お客さま自身の責任で 行うものとします。 2. 本サービスの提供及びその内容は、お客さま への通知なしに変更されることがあります。 3. 当社は、以下のいずれかに該当する場合に 当社の判断により、お客さまへの通知なく 本サービスの全部又は一部の提供を一時停止又 は中断することができます。
(1)本サービスに係るシステムの点検又は保守作 業を緊急に行う場合
(2) コンピューター、通信回線等の障害、ご操 過度なアクセスの集中、不正アクセス、 ハッキング等により本サービスの運営ができなくなった場合 14187%
(3)天災地変等の不可抗力により本サービスの運 営ができなくなった場合
(4)その他、当社が一時停止又は中断を必要と合理的に判断した場合

第9条(知的財産権)
1. 本サービス等に係るすべての知的財産権その 他一切の権利は、当社又は第三者に帰属するも のとします。
2. お客さまは、前項の権利を侵害することな く、本サービスを利用しなければならないもの とします。

第10条(本サービスの利用の停止、提供の中止)
当社は、お客さまが本規約に違反した場合、お 客さまに対する本サービスの提供を停止するこ とができるものとし、当該停止の日以降、お客 さまは本サービスを利用してはならないものとします。

第11条(当社の免責)
1. 当社が、本サービスについて、その正確性、 利便性、有用性及び完全性等を何ら保証するも のではないことについて、お客さまは予め承諾 するものとします。
2. 当社は、本サービスに関連して発生したお客 さまの損害について、当社の故意又は過失がない限り、本規約にて明示的に定める以外一切責 任を負わないものとします。
3. 当社は、本サービスの提供にあたり、お客さ まの専用端末等に保存されているデータの喪 失、毀損又は改変等に起因する損害について、 当社の故意又は過失がない限り、一切その責任 を負わないものとします。
4. 当社は、不可抗力その他当社の責めに帰すべ からざる事由により発生したお客さまの損害に 対し、いかなる責任も負わないものとします。
5. 当社は、本サービスの継続的提供を約束する ものではなく、当社の都合により、お客さまへ の予告又は通知をすることなく、本サービスの 一部又は全部を終了することができるものと し、お客さまは予めこれを承諾するものとしま す。
6. 当社は、本サービスの提供の中止、利用の停 止及び終了したことに起因するお客さまの損害 等について、当社の故意又は過失がない限り、 一切その責任を負わないものとします。

第12条(秘密保持)
お客さまは、本サービスの提供に関連して当社 がお客さまに対して秘密に取り扱うことを求め て開示した非公知の情報について、当社の事前 の書面による承諾がある場合を除き、秘密に取 り扱わなければならないものとします。

第13条(連絡/通知)
当社からお客さまに対する本サービスに関する 連絡又は通知は、povo2.0のご契約に係る契約者連絡先に基づき行う方法その他当社の定める 方法により行うものとします。

第14条(準拠法)
本規約に関する準拠法は、日本国法とします。

第15条(合意管轄)
本規約又は本サービスに関連して生じた紛争に ついては、東京地方裁判所を第一審の専属的合意管轄裁判所とします。

以上

プログレスが表示されつつ,位置情報の仕様を許可します.
povo lawson06

サイド位置情報の仕様を許可.(なぜ2回?)
povo lawson07

位置情報からローソン店舗に居るか確認するようです.
povo lawson08

これで0.1GBが追加されました.
povo lawson09

容量が0.00GBから0.10GBになりました.
povo lawson10

povo2.0アプリに戻るとこちらも0.10GBになりました.
povo lawson11

結構面倒です.
現在povo2.0アプリではpovo Data Oasisは使えずウェブ経由で認証が必要なのが面倒です.
2回試しましたが,2回めも認証が必要でした.
povo2.0アプリにpovo Data Oasisの機能が組み込まれてさっとデータがもらえるようになって欲しいところです.

]]>
https://matoken.org/blog/2024/11/22/povo-data-oasis/feed/ 0