Linux Kernel 5.11 をセルフビルドしたメモ

Linux Kernel 5.11 がリリースされました.

F2FSの圧縮周りもアップデートがあるようなので試してみたくなりました.ということでセルフビルドしたらこれまで出なかったエラーが出たのでメモしておきます.

Warning
Debian sid amd64の 5.10.0-3-amd64 環境でビルドしました.Linux 5.9はビルドしたことがあるけれど,Linux 5.10はビルドしたことのない環境です.

Linux 5.11 build時にエラー( BTF: .tmp_vmlinux.btf: pahole (pahole) is not available )

以下のようなエラーが発生しました.

$ make -j`nproc` bindeb-pkg
〜省略〜
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
〜省略〜
$ grep CONFIG_DEBUG_INFO_BTF ./.config
CONFIG_DEBUG_INFO_BTF=y

CONFIG_DEBUG_INFO_BTF を無効にすることも可能ですが, dwarves パッケージでDWARF utilitiesを導入するとこで解決しました.

$ sudo apt install dwarves

その他,DKMSでのVirtualBox moduleのビルドも失敗しました.これはVirtualBoxの対応待ちかなと思います.

ということで,以下のような感じで大丈夫そうです.

Linux 5.11のビルド

必要なパッケージの導入
$ sudo apt install build-essential linux-source bc kmod cpio flex libncurses5-dev libelf-dev libssl-dev dwarves
ソースの入手,確認と展開
$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.xz \
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.sign (1)
$ unxz ./linux-5.11.tar.xz (2)
$ gpg --verify ./linux-5.11.tar.sign (3)
gpg: assuming signed data in './linux-5.11.tar'
gpg: Signature made Mon 15 Feb 2021 06:11:32 PM JST
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" [unknown]
gpg:                 aka "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" [undefined]
gpg:                 aka "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E
$ tar tvf ./linux-5.11.tar | lv (4)
$ tar xf ./linux-5.11.tar (5)
$ cd linux-5.11
  1. sourceと署名を入手
  2. 解凍
  3. 署名確認(署名はこちらで確認)
  4. アーカイブ確認
  5. アーカイブ展開
configファイルの用意とビルド
$ cp /boot/config-`uname -r` ./.config (1)
$ yes "" | make oldconfig (2)
$ tar xf ../linux_5.10.9-1.debian.tar.xz debian/certs/ (3)
$ time make -j`nproc` bindeb-pkg (4)
  :
dpkg-deb: building package 'linux-libc-dev' in '../linux-libc-dev_5.11.0-1_amd64.deb'.
dpkg-deb: building package 'linux-image-5.11.0' in '../linux-image-5.11.0_5.11.0-1_amd64.deb'.
dpkg-deb: building package 'linux-image-5.11.0-dbg' in '../linux-image-5.11.0-dbg_5.11.0-1_amd64.deb'.
 dpkg-genbuildinfo --build=binary
 dpkg-genchanges --build=binary >../linux-5.11.0_5.11.0-1_amd64.changes
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build .
dpkg-buildpackage: info: binary-only upload (no source included)
$ ls -1s ../linux*.deb (5)
  7932 ../linux-headers-5.11.0_5.11.0-1_amd64.deb
728724 ../linux-image-5.11.0-dbg_5.11.0-1_amd64.deb
 52136 ../linux-image-5.11.0_5.11.0-1_amd64.deb
  1124 ../linux-libc-dev_5.11.0-1_amd64.deb
$ sudo apt install ../linux-image-5.11.0_5.11.0-1_amd64.deb ../linux-libc-dev_5.11.0-1_amd64.deb ../linux-headers-5.11.0_5.11.0-1_amd64.deb (6)
  1. 現在のkernel configをコピーする
  2. 新しい設定を既定値で設定
  3. Debianのkernel sourceから証明書をコピー(若しくは CONFIG_SYSTEM_TRUSTED_KEYS="" する)
  4. cpu数を指定してビルド開始
  5. 出来上がったパッケージの確認
  6. 出来上がったパッケージを導入
Machine Owner Key(MOK)で署名する(セキュアブートを有効にしている場合にのみ必要な処理)
$ sudo sbsign --key ~/MOK.priv --cert ~/MOK.pem /boot/vmlinuz-5.11.0 --output vmlinuz-5.11.0 (1)
$ sudo mv ./vmlinuz-5.11.0 /boot/vmlinuz-5.11.0
$ find /lib/modules/5.11.0/updates/dkms/ -type f | xargs -n1 sudo ./scripts/sign-file sha256 ~/MOK.priv ~/MOK.der (2)
  1. kernelに署名
  2. DKMSで作成したmoduleに署名

このあたりの処理は自動化できると思うんだけど未確認.
MOKの作成や,セキュアブートについては以下のページが参考になる.

環境

$ dpkg-query -W build-essential linux-source bc kmod cpio flex libncurses5-dev libelf-dev libssl-dev dwarves sbsign
tool
bc      1.07.1-2+b2
build-essential 12.9
cpio    2.13+dfsg-4
dwarves 1.20-1
flex    2.6.4-8
kmod    28-1
libelf-dev:amd64        0.183-1
libncurses5-dev:amd64   6.2+20201114-2
libssl-dev:amd64        1.1.1j-1
linux-source    5.10.13-1
sbsigntool      0.9.2-2
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -mr
5.10.0-3-amd64 x86_64
再起動後
$ uname -mr
5.11.0 x86_64

FirefoxとYoutube-dlでTVerの動画をダウンロードする

Tip
投稿時の2020-02-20時点のTVerと youtube-dl version 2021.02.10 では以下の手順は必要なく,youtube-dlで直接ダウンロードできるようになっています.
$ wget https://yt-dl.org/downloads/latest/youtube-dl
$ chmod u+x youtube-dl
$ ./youtube-dl $URL

先日TVerで見られる番組が見たくなりました.動画は再生途中で止まったりするのが嫌なので一旦ローカルにダウンロードしてから視聴することが多いです.

よく使うYoutube-DLではダウンロードできませんでした.

ERROR: Unsupported URL: https://tver.jp/episode/NNNNNNNN

siteのsourceを見るとbrightcoveを使っていて,brightcoveはyoutube-dlで対応しているようです.

ちなみにLinuxのChromiumで開くと推奨環境外と判定されて閲覧できません.Google ChromeやFirefoxだとそのまま,Chromimだとユーザーエージェントを変更することで閲覧できます.今回はFirefoxを利用しました.

推奨環境について
ご利用の環境はTVerの推奨環境ではございません。

推奨環境以外では、動画再生できないなど正常に動作しない場合がございます。
推奨環境でのご利用をお願い致します。

録画したいURLをFirefoxで開いて F12Ctrl + Shift + I 若しくは,メニューから「ウェブ開発」→「開発ツールを表示」で開発ツールを表示します.
Ctrl + f で検索ボックスを表示して data-account , data-video-id の値をメモします.

TVerDownload fx inspector

メモした値を以下のURLに埋め込みます.

後はこのURLを youtube-dl に渡してダウンロードできました.

環境
$ youtube-dl --version
2019.01.17
$ dpkg-query -W firefox
firefox 85.0.1-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

TTY TwitterクライアントのTTYtterからOysttyerに乗り換え

TTYtterというPerl製でcliで動作するTwitter clientがあります.自作Twitter投稿scriptがアカウントをBANされてAPI keyが使えなくなった後これを使って自動投稿などをしていたのですが,Debian busterから無くなっています.
開発元を見るとOysttyerというものが変わりに存在するようなのでそちらに乗り換えました.

TTYtterからOysttyerに乗り換えるには認証鍵などを作り直す必要があるようです.
-oauthwizard オプションで認証ができるようです.
既定値では認証情報は ~/.oysttyerkey に保存されますが,複数のTwitterアカウントで利用したいので -key=認証情報格納ファイル オプションを付けて区別します.

Note
-keyf のパスに ~ を使うとエラーになるようです.今回は代わりに $HOME を使いました.
$ oysttyer -keyf=$HOME/.oysttyerkey_kagolug_ml -oauthwizard (1)
-- using SSL for default URLs.
trying to find cURL ... /usr/bin/curl
-- Streaming API disabled (no -dostream) (oysttyer will use REST API only)
-- no version check performed (use /vcheck, or -vcheck to check on startup)

+------------------------------------------------------------------------------+
|| WELCOME TO oysttyer: Authorize oysttyer by signing into Twitter with OAuth ||
+------------------------------------------------------------------------------+
Looks like you're starting oysttyer for the first time, and/or creating a
keyfile. Welcome to the most user-hostile, highly obfuscated, spaghetti code
infested and obscenely obscure Twitter client that's out there. You'll love it.

oysttyer generates a keyfile that contains credentials for you, including your
access tokens. This needs to be done JUST ONCE. You can take this keyfile with
you to other systems. If you revoke oysttyer's access, you must remove the
keyfile and start again with a new token. You need to do this once per account
you use with oysttyer; only one account token can be stored per keyfile. If you
have multiple accounts, use -keyf=... to specify different keyfiles. KEEP THESE
FILES SECRET.

** This wizard will overwrite ~/.oysttyerkey_kagolug_ml
Press RETURN/ENTER to continue or CTRL-C NOW! to abort.
(2)
Request from https://api.twitter.com/oauth/request_token ... SUCCEEDED!

1. Visit, in your browser, ALL ON ONE LINE,

https://api.twitter.com/oauth/authorize?oauth_token=lfqqTgAAAAAAixnPABABd7YG56I (3)

2. If you are not already signed in, fill in your username and password.

3. Verify that oysttyer is the requesting application, and that its permissions
are as you expect (read your timeline, see who you follow and follow new
people, update your profile, post tweets on your behalf and access your
direct messages). IF THIS IS NOT CORRECT, PRESS CTRL-C NOW!

4. Click Authorize app.

5. A PIN will appear. Enter it below.

Enter PIN> 0901765 (4)

Request from https://api.twitter.com/oauth/access_token ... SUCCEEDED!
Written keyfile /home/mk/.oysttyerkey_kagolug_ml

Now, restart oysttyer to use this keyfile.
(To choose between multiple keyfiles other than the default .oysttyerkey,
tell oysttyer where the key is using -keyf=... .)
  1. 認証ファイルを指定して認証処理実行
  2. Enterで続行
  3. URLをコピーしてウェブブラウザにて認証したいTwitterアカウントで許可する
  4. ウェブブラウザに表示されるPINを入力してEnter

これで認証情報が指定ファイルに格納されます.

TTYtterではScript中から以下のようにして投稿を行っていました.

ttytter -keyf=/home/mk/.ttytterkey-kagolug_ml -location -lat=31.5775639 -long=130.6667937 -status="$MESSAGE"

Oysttyerのユーザガイドのコマンドラインオプションを確認するとそのまま使えそうです.

コマンドと認証鍵ファイルを変更するだけで動作しました.

$ oysttyer -keyf=/home/mk/.oysttyerkey_kagolug_ml -location -lat=31.5775639 -long=130.6667937 -status="投稿テスト📮"
-- using SSL for default URLs.
trying to find cURL ... /usr/bin/curl
test-login SUCCEEDED!
post attempt -- using lat/long: (31.5775639, 130.6667937)
SUCCEEDED!

Scriptも同様にコマンドと鍵ファイルを書き換えました.これでbuster以降でも大丈夫なはずです :)

環境
$ dpkg-query -W oysttyer chromium
chromium        88.0.4324.146-1~deb10u1
oysttyer        2.10.0-1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

小さな静的htmlのKanban boardのNullboardを少し試す

静的htmlでローカルで完結するBanban board の Nullboard を知ったので少し試してみました.

ローカルにcloneして開くか, https://nullboard.io/preview にアクセスして試せます.

はじめはマニュアルやTipsの書かれたボードが表示されます.右上のメニューから「Add new board…​」を選んで新しいボードを作ってみます.

nullboard01

ボードが出来たら次はボードタイトルの右のメニューから「+List」でリストを追加出来ます.

nullboard02

リストのメニューから「+Note」でノートを追加したり,リストの移動が出来ます.移動はドラッグ&ドロップでも可能です.

nullboard03

日本語や絵文字も大丈夫です.

nullboard04

右上のメニューからデータのエクスポート,インポートが可能です.

どうやってローカルでデータを保存しているんだろうと思ったら,Local Storageで実現しているようです.

Nullboardの機能では手動でデータエクスポート,インポートが可能ですが自動でできるといいなと思ってデータの場所を探してみました.chromiumでは ` ~/.config/chromium/Profile\ 1/Local\ Storage/leveldb/000485.ldb` というファイルの中にNullboardに書いたデータがありました.

恐らくLevelDBというもののようです.自動バックアップするようにすると安心そうです.

Kanbanbordは色々ありますがNullboardはオフラインでローカルのみでも動作するのが面白いです.ただ,データの保管場所がLocalStorageなのでデータが消えてしまうのが怖いのでコマ目にバックアップを取ったほうが安心そうです.

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

軽量TwitterフロントエンドのNitterをセルフホスト

NitterというTwitterのフロントエンドがあります.最近はTwitterが重くてなにか検索しようと思っても待ち長かったり画像読み込み失敗したりといったこともよくあります(PCのスペックと回線が細いせいも大きいですが).軽量ブラウザを使ったりもしてみましたがそうすると見た目や使い勝手がいまいち.

そして現在そういった軽量ブラウザは利用もできなくなりました.

This browser is no longer supported.
Please switch to a supported browser to continue using twitter.com. You can see a list of supported browsers in our Help Center.

そこで Nitter を試してみたところ軽くていい感じです.

現在ログイン機能はないので,投稿や非公開Tweetや非公開リストなどは使えませんが,イベントのハッシュタグを追ったり,過去のtweetを検索といったことをするのに便利です.

RSS形式での出力にも対応しています.

軽量で便利なのでロカールマシンでNitterを動かして外にURLを共有するときは https://nitter.net/ を利用していました.

という話を以前オープンソースカンファレンス2020福岡内の鹿児島らぐのコマで発表しました.

しかし,最近は https://nitter.net/ がTwitterの制限に掛かって利用できないことが多くなってきました.なので自分のVPS上にホストしてみました.

Note
同じ手順で Raspberry Pi OS buster armhf や Debian sid(nimはDebinaパッケージのもの利用)でも動作しました.

Nitterのインストール環境の用意

Nitterが依存している Redislibsass を導入しておきます.

$ sudo apt install redis-server libsass-dev

Nitterを専用アカウントで動かしたいので nitter ユーザ,グループを作ってそのユーザで操作します.

$ sudo groupadd nitter (1)
$ sudo useradd -m -g nitter nitter (2)
$ sudo -iu nitter (3)
  1. nitter グループを作成
  2. nitter ユーザを作成
  3. nitter ユーザのシェルを開く

nimの用意

Nitterはnim-langで出来ています.Nitterのコンパイルにはnim 1.2.0以上が必要ですが,Debian busterのパッケージ版のnimは 0.19.4 でコンパイル出来ません.buster-backports も 1.0.4-1~bpo10+1 と対応していません.(bullseyeは1.4.2)

$ nimble build -d:release
  Verifying dependencies for nitter@0.1.0
       Tip: 2 messages have been suppressed, use --verbose to show them.
     Error: Unsatisfied dependency: nim (>= 1.2.0)
$ dpkg-query -W nim
nim     0.19.4-1

とりあえずnimの公式サイトのバイナリを利用してコンパイルすることにします.

$ wget https://nim-lang.org/download/nim-1.4.2-linux_x64.tar.xz \
https://nim-lang.org/download/nim-1.4.2-linux_x64.tar.xz.sha256 (1)
$ sha256sum -c ./nim-1.4.2-linux_x64.tar.xz.sha256 (2)
nim-1.4.2-linux_x64.tar.xz: OK
$ tar tvf nim-1.4.2-linux_x64.tar.xz | lv (3)
$ tar xvf nim-1.4.2-linux_x64.tar.xz (4)
  1. nimのバイナリをダウンロード
  2. hash確認
  3. アーカイブ確認
  4. アーカイブ展開

Nitterのコンパイル

Nitterのsourceをcloneしてさっきダウンロードして展開したnimでコンパイルします.

$ git clone https://github.com/zedeus/nitter
$ cd nitter
$ PATH=~/nim-1.4.2/bin:$PATH nimble build -d:release
$ PATH=~/nim-1.4.2/bin:$PATH nimble scss
$ mkdir ./tmp

Redis が起動しているのを確認して nitter を起動してみます.この状態で 8080 ポートにアクセスして Nitter が利用できるのを確認します.ポート番号などは nitter.conf で変更できます.

$ ps -ef|grep -i redis (1)
redis    11786     1  0 Feb11 ?        00:15:28 /usr/bin/redis-server 127.0.0.1:6379
$ ./nitter & (2)
$ w3m http://localhost:8080/ (3)
$ kill %1 (4)
$ exit (5)
  1. Redisが動いているのを確認
  2. Nitterを起動
  3. Nitterの動作を確認
  4. Nitterを終了
  5. nitter アカウントから抜ける

Nitterの起動設定

次にNitterに起動設定を行います.Systemd環境なので以下のようなサービスファイルを用意しました.

/etc/systemd/system/nitter.service
[Unit]
Description=Nitter (An alternative Twitter front-end)
After=syslog.target
After=network.target

[Service]
Type=simple

# set user and group
User=nitter
Group=nitter

# configure location
WorkingDirectory=/home/nitter/nitter
ExecStart=/home/nitter/nitter/nitter

Restart=always
RestartSec=15

[Install]
WantedBy=multi-user.target

サービスを有効にしてNitterを起動します.

$ sudo systemctl enable --now nitter.service
$ systemctl status nitter
● nitter.service - Nitter (An alternative Twitter front-end)
   Loaded: loaded (/etc/systemd/system/nitter.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-02-17 01:13:07 JST; 34s ago
 Main PID: 19702 (nitter)
    Tasks: 1 (limit: 4696)
   Memory: 3.6M
   CGroup: /system.slice/nitter.service
           └─19702 /home/nitter/nitter/nitter
$ w3m http://localhost:8080/

外に公開せず,ローカルで動作させる場合はここまでの手順でOKです.

ドメインとSSL証明書の用意

※この手順はローカルで動かす場合は必要ありません.

今回はサブドメインを用意しました.DNSを設定して nitter.matoken.org を用意しました.設定ミスしたときにリカバリしやすいようにTTlを短く設定してうまく行ったらいつもの長さにします.

証明書はcertbotを使いLet’s encryptで作成しました.

$ sudo certbot certonly -d nitter.matoken.org

apache httpdの用意

※この手順はローカルで動かす場合は必要ありません.

Nitterをそのまま外に公開するのはセキュリティ的に良くないということで,apache httpdでhttpdの処理をしてNitterの8080に転送するようにしました.

Nitter用のapache httpd設定ファイルを用意します.

/etc/apache2/sites-available/nitter.matoken.org.conf
<VirtualHost *:80>
        ServerName nitter.matoken.org
        Redirect permanent / https://nitter.matoken.org/
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName nitter.matoken.org
        ServerAdmin webmaster@matoken.org

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:8080/ nocanon
        ProxyPassReverse / http://127.0.0.1:8080/
        AllowEncodedSlashes On

        ErrorLog ${APACHE_LOG_DIR}/error.nitter.matoken.org.log
        CustomLog ${APACHE_LOG_DIR}/access.nitter.matoken.org.log combined

        SSLCertificateFile /etc/letsencrypt/live/nitter.matoken.org/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/nitter.matoken.org/privkey.pem

</VirtualHost>
</IfModule>

設定を有効にしてテスト後反映します.

$ sudo a2ensite nitter.matoken.org.conf (1)
$ sudo apache2ctl configtest (2)
$ sudo systemctl reload apache2 (3)
  1. 設定ファイルを有効にする
  2. 設定ファイルのテスト
  3. apache httpdの設定反映

この状態で http://nitter.matoken.org/ 及び https://nitter.matoken.org/ にアクセスしてみて Nitter が利用できたらOKです.

とりあえず一般公開しておきますが,今の https://nitter.net みたいにアクセス制限がしょっちゅうかかるようになったら制限するかもしれません.

環境

$ git -C ~nitter/nitter log -1
commit f392b6ca37e66c7c759aa98db23e0bdc62b39c3d (HEAD -> master, origin/master, origin/HEAD)
Author: Lukas Winkler <github@lw1.at>
Date:   Sun Feb 14 12:49:09 2021 +0100

    run optipng -o 9 on all images (#337)
$ dpkg-query -W apache2 redis* libsass-dev certbot
apache2 2.4.38-3+deb10u4
certbot 0.31.0-1+deb10u1
libsass-dev:amd64       3.5.5-4
redis-server    5:5.0.3-4+deb10u2
redis-tools     5:5.0.3-4+deb10u2
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

小江戸らぐ 2月のオフな集まり(第223回)への参加と「DroidCamでもスマホをWebCamにする」を発表

2021-02-13(土)に小江戸らぐ 2月のオフな集まり(第223回)に参加しました.開催はZoom.usを利用したオンライン開催で参加者は20人ほどでした.

次のような発表がありました.

次回の開催は03/13(土)でオンライン開催です.

以下はその時発表したスライドをhtmlで書き出したものです.

DroidCamでもスマホをWebCamにする

USB port死にかけ?

  • スマホや2.5インチHDDを繋ぐと勝手に切れてしまう
  • スマホは数秒毎に充電ランプが付いたり消えたり
  • Webcamがビデオチャット中に使えなくなったり
  • 自己給電の3.5インチHDDは調子がいいような?
  • しばらく放置したり再起動すると直ったり?
  • USB周りのリセッタブルヒューズとかコンデンサとかが死にかけている?

正攻法

  • 端末買い替え
  • USB portを増設
    • PCI Express/PC Card/Express Card

懐が寂しい&増設できないマシン(◞‸◟)

そういえばネットワーク経由でUSBが共有できたはず

+--------+        +------------+       +---------------------+
| WebCam +------->+ USB HostPC |       | USB ClientPC        |
| C270   |  USB   |------------+       +---------------------+
+--------+        | USB/IP     |------>| USB/IP              |
                  +------------+ 1GbE  +--+------------------|
                                       |  +-->UVC/UAC        |
                                       +-------+-------------|
                                       |       +-->Video APP |
                                       +---------------------+

USB/IP少し試してみて

  • 設定してしまえばローカルとほとんど変わらない使用感
  • 別マシンが必要
  • UVCを使うならそこそこ太い回線が必要(1Gbpsあれば安心)

帯域がもったいない,エンコードするとずっと細い回線で高画質にできるよね
バックアップもほしい

スマートフォンの利用

スマートフォンを有線,ネットワーク経由でWebCamとして利用

  • Iriun Webcam
    • Android/iOS → Linux/macOS/Windowsへ
  • DroidCam
    • Android/iOS → Linux/Windowsへ

!

このときはDroidCamは専用kernel moduleが必要でめんどくさそうなので標準moduleが利用できるIriun Webcamを選択

それから約10ヶ月

Iriun Webcamの問題

  • Debianパッケージがsidで依存関係が解決できなくなっている
    • 手動で依存関係を解決してパッケージを展開してバイナリを実行することは可能
  • Video のみ(Audio機能がない)
  • closed source
  • 問い合わせ窓口が見当たらない

DroidCam

  • Android/iOS → Linux/Windowsへ共有
  • Video/Audio対応
  • 専用moduleが必要だったがv1.6+で通常のv4l2loopbackが利用できるようになった
  • 専用モジュールもDKMS使えばそう不便でもない?

導入

sourceを入手してインストールスクリプトを実行する(※amd64以外は要セルフビルド)

$ git clone https://github.com/dev47apps/droidcam/
$ cd droidcam
$ sudo ./install-client (1)
$ sudo ./install-dkms (2)
$ sudo ./install-video (3)
$ sudo ./install-sound (4)
  1. DroidCam Clientアプリとアンインストールスクリプト( /opt/droidcam-uninstall )導入
  2. droidcam module DKMS設定 ※オプション
  3. droidcam module設定 ※オプション
  4. サウンドモジュール設定(snd-aloop module自動読み込み) ※オプション

v4l2loopback利用時

$ cat /etc/modules-load.d/v4l2loopback.conf
v4l2loopback (1)
$ cat /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback exclusive_caps=1 video_nr=6,7,8 card_label="Virtual Camera,v4l2loopback-7,v4l2loopback-8" (2)
  1. モジュール自動読み込み
  2. ビデオ形式をGStreamer caps指定,複数デバイス対応(オプション)

DroidCam v4l2loopback利用時

$ cat /etc/modules-load.d/droidcam.conf (1)
videodev
v4l2loopback_dc
$ cat /etc/modprobe.d/droidcam.conf (2)
options v4l2loopback_dc width=1920 height=1080 video_nr=9 card_label="DroidCam"
  1. モジュール自動読み込み
  2. 解像度,ビデオデバイス番号,ラベル指定

ビデオデバイス番号はv4l2loopbackより大きくするとOBS利用時にはまらない

SecureBoot

MOKを作成して署名しないとモジュールが利用できない
$ sudo modprobe -v  v4l2loopback
insmod /lib/modules/5.10.0-3-amd64/updates/dkms/v4l2loopback.ko exclusive_caps=1 video_nr=6,7,8 card_label="Virtual Camera,v4l2loopback-7,v4l2loopback-8"
modprobe: ERROR: could not insert 'v4l2loopback': Operation not permitted

Android側設定

koedo2020102 Dev47Apps

Androidアプリ起動

  • カメラ,マイク切り替えや設定あり

koedo2020102 DroidCam01

PC側でdroidcam起動

$ droidcam

koedo2020102 DroidCam GUI 01

カメラの操作も可能 :)

koedo2020102 DroidCam GUI 02

cliもある

$ droidcam-cli
Usage:
 droidcam-cli -l <port>
   Listen on 'port' for connections (video only)

 droidcam-cli [options] <ip> <port>
   Connect via ip

 droidcam-cli [options] adb <port>
   Connect via adb to Android device

 droidcam-cli [options] ios <port>
   Connect via usbmuxd to iDevice

Options:
 -a          Enable Audio
 -v          Enable Video
             (only -v by default)

 -size=WxH   Specify video size (when using the regular v4l2loopback module)
             Ex: 640x480, 1280x720, 1920x1080

Enter '?' for list of commands while streaming.

sound

  • Linux側でDroidCamを起動後, snd_aloop moduleとPulseAudioを紐付ける
$ pacmd load-module module-alsa-source device=hw:Loopback,1,1 \
        source_properties=device.description=droidcam_audio

!

+--------+        +------------+                 +------------+
|Android +------->+ DdoidCam   +---------------->+ Video APP  |
|DroidCam|  WiFi  +---+--------+  v4l2loopback   +------------+
+-----+--+   USB      |            snd_aloop     | Zoom.us    |
      ^               |                          | Discord    |
      +---------------+                          | Jitsi Meet |
        Camera Coltrole                          | :          |
                                                 +------------+

OBS Studio update

  • 26.1からLinux/macOSに仮想カメラ機能が標準機能に(v4l2loopback利用)
    • ディストリビューションのバージョンが古い場合snapで導入が便利
    • droidcamのmoduleと競合して不具合が起こることがあるのでその場合はdroidcamのデバイス番号を後ろに
    • ※以前からある仮想カメラプラグインのobs-v4l2sinkは出力デバイスを選択できる
  • Wayland対応もうすぐ

DroidCam OBS

!

+------------+        +------------+                   +------------+
|Android     +------->+ OBS Studio +------------------>+ Video APP  |
|DroidCam OBS|  WiFi  |------------+   v4l2loopback    +------------+
+------------+   USB  | text       |    snd_aloop      | Zoom.us    |
                      | Picture    |                   | Discord    |
                      | Video      |                   | Jitsi Meet |
                      | Desktop    |                   | :          |
                      | Camera     |                   +------------+
                      | <Filters>  |
                      +------------+

まとめ

  • USBポートを使わなくても USB/IP や スマートフォンでWebCam & Audio を利用できるようになった
  • どちらも毎回少し設定が必要なのが面倒
  • 安定度はUSB/IPの方が安定している
  • 画質はスマートフォンの方が上(Logitch C270とRakuten miniでの比較)
  • スマートフォンで直に参加という手も……でも画面小さいかな

AndroidスマートフォンをLinuxデスクトップのスピーカーにしてビデオ会議中に離席しても話に付いていけるようにする

以下の記事で「AudioRelay」というアプリを知りました.

ちょっと飲み物を取ってくるとかいうときなどに便利そう.
しかしこれはWindowsからAndroidへ転送するもので他の環境では動作しません.Linuxでも動作するものを探してみました.

「SoundWire」

SoundWireはWindow若しくはLinux x64_64(64bit)/x86(32bit),Raspberry Pi OSからAndroidへオーディオを転送してくれるようです.

バイナリが配布されているので対応するそれを入手して展開,実行してAndroidアプリから接続すればオーディオが転送されます.デスクトップファイルやアイコンも同梱されているので必要に応じて登録すると便利そうです.

$ tar tvf SoundWire_Server_linux64.tar.gz (1)
drwxrwxrwx Georgie/None      0 2020-01-26 21:22 SoundWireServer/
-rwxrwxrwx Georgie/None   2913 2020-01-16 09:00 SoundWireServer/INSTALL.txt
-rwxrwxrwx Georgie/None   1393 2020-01-16 08:46 SoundWireServer/license.txt
-rwxrwxrwx Georgie/None   2235 2014-09-16 09:08 SoundWireServer/opus_license.txt
-rwxrwxrwx Georgie/None   1583 2014-09-16 09:09 SoundWireServer/readerwriterqueue_license.txt
-rwxrwxrwx Georgie/None   6915 2020-01-26 21:22 SoundWireServer/README.txt
-rwxrwxrwx Georgie/None    448 2019-12-31 11:00 SoundWireServer/SoundWire-Server.desktop
-rwxrwxrwx Georgie/None 1611672 2020-01-16 11:55 SoundWireServer/SoundWireServer
-rwxrwxrwx Georgie/None  237351 2012-11-22 17:28 SoundWireServer/sw-icon.xpm
$ tar xf SoundWire_Server_linux64.tar.gz (2)
$ clamscan SoundWireServer/SoundWireServer (3)
$ ha512sum SoundWireServer/SoundWireServer
a0c1da0afad9e94aef82e19b2555ccf33494ec56fdbd6193a838beae31cec58ca75cae1949f520db84c6793bab13c9c3283b519416bebb1c54bbd66b5c489676  SoundWireServer/SoundWireServer
$ SoundWireServer/SoundWireServer (4)
  1. アーカイブの確認
  2. アーカイブの展開
  3. 念の為手動でもウィルス確認
  4. 実行

ソースは公開されていないようです.

ファイアウォールを利用している場合は,UDP:59010, 59011 を開放する必要があるようです.(起動オプションや環境変数でカスタマイズ可能)
その他, -nogui オプションでX無しでも動作します.

SoundWire PC

SoundWire Android

「WifiAudio」

「WifiAudio」はWindows若しくはLinux x86_64(64bit)からAndroidへオーディオを転送してくれるようです.

PC側は以下のページでバイナリが配布されているのですが,ダウンロードするにはフォーラムに登録が必要のようです.登録には氏名,メールアドレス,生年月日などを求められます.

$ clamscan ./wifiaudio_linux (1)
$ sha512sum ./wifiaudio_linux
6c78f47066ad550b988468c74e9bd56e099393a61a11ffffeda31fc181c60cbd5209763e80da9000d6453fef5cc829b9329b26d46993cc3f00c0bb76ffc81864  ./wifiaudio_linux
$ chmod u+x ./wifiaudio_linux (2)
$ ./wifiaudio_linux (3)
  1. 念の為手動でもウィルス確認
  2. 実行権付与
  3. 実行
$ lsof -i | grep wifiaudio
wifiaudio 1818239 matoken   12u  IPv4 15191466      0t0  UDP *:32000

利用ポートを確認すると UDP:32000 のようなのでファイアウォールを利用している場合は開放しておきます.

WiFiAudio PC
WiFiAudio Android

「ffmpegとVLC」

クローズドソースのものしか見当たらないなということで例によってffmpegで試してみます.
アプリケーションの音声をキャプチャしてmp3形式でスマートフォンのipアドレスに配信します.

$ pactl list short sources (1)
0       alsa_output.pci-0000_00_1b.0.analog-stereo.monitor      module-alsa-card.c      s16le 2ch 44100Hz       RUNNING
1       alsa_input.pci-0000_00_1b.0.analog-stereo       module-alsa-card.c      s16le 2ch 48000Hz       RUNNING
2       alsa_input.pci-0000_00_1b.0.analog-stereo.echo-cancel   module-echo-cancel.c    float32le 1ch 32000Hz   RUNNING
3       alsa_output.pci-0000_00_1b.0.analog-stereo.echo-cancel.monitor  module-echo-cancel.c    float32le 1ch 32000Hz   RUNNING
4       alsa_input.hw_Loopback_1_0      module-alsa-source.c    s16le 1ch 16000Hz       RUNNING
$ ffmpeg -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -ac 2 -acodec libmp3lame -f rtp rtp://10.42.0.90:1234/ (2)
  1. PulseAudioのデバイスを確認
  2. ffmpegでAndroidのIPに対してmp3形式で配信

この状態でVLC等で rtp://@:1234 を再生するとLinuxDesktopの音が流れてきます.

ffmpegのオプションについてはこのあたりを.

AndroidでmDNSが使えればいいのですが,使えなさそうなのでIPアドレスを確認するのがちょっとめんどうですね.固定IPにしたりマルチキャスト配信してしまってもいいかもしれません.

とりあえずはarpでごまかしてみました.

#!/bin/bash

MONITOR=`pactl list short sources | grep analog-stereo.monitor | cut -f2 -d'    '`
PHONE_MAC=18:d6:1c:00:00:00
PHONE_IP=`arp -i wlp3s0 | grep ${PHONE_MAC} | cut -f1 -d' '`
PORT=1234

ffmpeg -f pulse -i ${MONITOR} -acodec libmp3lame -ar 22050 -f rtp rtp://${PHONE_IP}:${PORT}/

VLC Android

「ffmpegとicecast2」

Wi-Fiの届く自宅内であればこれまでのものでいいですが,長丁場でご飯買いにコンビニまで行ってこようというような時には使えません.

外のサーバーに投げてストリーミングしてみます.今回はicecast2を利用しています.

$ ffmpeg -f pulse -i alsa_output.platform-snd_aloop.0.analog-stereo.monitor -loglevel 31 -stats -f adts -content_type audio/aac icecast://$USER:PASS@example.com:8000/stream

Androidでicecast2のurlを開くとLinuxデスクトップの音が聞こえてきます :)
ffmpegの部分をOBS StudioにするとGUIなのでとっつきやすいかもしれませんね.

帯域が気になる場合はビットレートを落とすといいと思います.このままだと128kbps程ですが, -ar 22050 として 64kbps, -ar 11025 をつけると32kbpsになります.
32kbpsはちょっと音が悪い感じなので,64kbps以上は欲しいかな?

icecast2などはこのあたりでも

ちなみに,VPSなどのサウンドカードのない計算機の場合以下のようにダミーデバイスを読み込むことで同じことが出来て便利です.
帯域が細かったりPCのスペックが足りないけど音声だけでも聞きたいといったときなどに使えます.

$ sudo modprobe -v snd-dummy
insmod /lib/modules/4.19.0-14-amd64/kernel/sound/drivers/snd-dummy.ko

終わりに

SoundWireとWifiAudioではLinuxではSoundWireの方がいいかなという感じです.しかしffmpeg+VLCでいいのではという感じも.
PC側の操作ですが,ボリュームは反映されず音量0でも配信されますが,ミュートすると聞こえなくなるので注意が必要です.
再生デバイスに迷った場合は pavucontrol などで Recordicg タブでプルダウンメニューからデバイスを順番に試していくといいと思います.音は出るけどノイズが多い場合はスピーカーからの音を拾っているマイクデバイスを選んで要る可能性があります.

そして現在自宅のWi-Fiは去年の台風時に壊れてNotePCをAPにしていて部屋を出ると電波が届かず実際は家の中ではどれも使えないという問題が.家を出て少し行くとmobile回線使えるんですけどね…….

環境

PC環境
$ SoundWireServer/SoundWireServer -nogui
    :
SoundWire Server v3.0
    :

$ dpkg-query -W ffmpeg lsof
ffmpeg  7:4.3.1-8
lsof    4.93.2+dfsg-1.1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
Android環境
SoundWire (free)
Version 3.0
WiFiAudio
Version 2.0
VLC
Version 3.3.4
本体
Rakuten mini(C330)
Android
9(セキュリティ アップデート:2020年12月5日)

Nextcloud 18 -> 19 アップグレード時のセキュリティ&セットアップ警告を解決

Nextcloud 18 がEoL になっていたので,Nextcloud 18.0.14 から Nextcloud 19.0.7 にアップグレードしました.

表 1. Maintenance and Release Schedule · nextcloud/server Wiki
release date end of life current version next version

20

2020-10-03

2021-10

20.0.7 (2021-02-02)

20.0.8 (2021-02-25)

19

2020-06-03

2021-06

19.0.8 (2021-01-27)

19.0.9 (2021-02-25)

18

2020-01-16

2021-01

18.0.14 (2021-01-27)

End of Life

$ sudo -u www-data php $NEXTCLOUDPATH/occ app:update --all
$ sudo -u www-data php $NEXTCLOUDPATH/updater/updater.phar
$ sudo -u www-data php $NEXTCLOUDPATH/occ app:update --all

以前実行したときと比べて「セキュリティ&セットアップ警告」の内容が違っていたのでメモしておきます.

警告を解決

警告メッセージ全体
セキュリティ&セットアップ警告
サーバーのセキュリティとパフォーマンスにとって重要なことは、すべてが正確に設定されていることです。あなたの助けとなるよう、Nextcloudでは一部の自動チェックを行っています。詳細な情報は、リンク先のドキュメントを参照してください。

セットアップに関して警告がいくつかあります。
PHPのメモリ制限が推奨値の512MB以下です。
"Strict-Transport-Security" HTTPヘッダが最低でも "15552000" 秒に設定されていません。セキュリティを強化するには、セキュリティTips ↗で解説しているHSTSを有効にすることを推奨します。
Webサーバーは適切にホスト名 "/.well-known/caldav" が引けるように設定されていません。より詳しい情報については、ドキュメントを参照ください。
Webサーバーは適切にホスト名 "/.well-known/carddav" が引けるように設定されていません。より詳しい情報については、ドキュメントを参照ください。
メモリキャッシュが設定されていません。可能であれば、パフォーマンスを向上するため、memcacheを設定してください。より詳しい情報はドキュメントで参照できます。
データベースにいくつかのインデックスがありません。 大きなテーブルにインデックスを追加すると、自動的に追加されないまでに時間がかかる可能性があるためです。 "occ db:add-missing-indices"を実行することによって、インスタンスが実行し続けている間にそれらの欠けているインデックスを手動で追加することができます。 インデックスが追加されると、それらのテーブルへのクエリは通常はるかに速くなります。
テーブル "oc_calendarobjects_props"のインデックス "calendarobject_calid_index"が見つかりません。
テーブル "oc_schedulingobjects"のインデックス "schedulobj_principuri_index"が見つかりません。
テーブル "oc_properties"のインデックス "properties_path_index"が見つかりません。
データベースにはオプションのカラムがいくつかありません。大きなテーブルにカラムを追加するには時間がかかるため、オプションのカラムは自動的に追加されませんでした。"occ db:add-missing-columns"を実行することで、不足しているカラムはインスタンスの実行中に手動で追加することができます。カラムが追加されると、応答性や使い勝手が改善される可能性があります。
テーブル "oc_comments" にオプションのカラム "reference_id" が存在しません。
このインスタンスには推奨されるPHPモジュールがいくつかありません。 パフォーマンスの向上と互換性の向上のために、それらをインストールすることを強くお勧めします。
intl
bcmath
gmp
データベース内のいくつかの列で、big intへの変換が行われていません。 大きなテーブルでカラムタイプを変更すると時間がかかることがあるため、自動的には変更されませんでした。 'occ db:convert-filecache-bigint'を実行することによって、それらの保留中の変更は手動で適用できます。 この操作は、インスタンスがオフラインの間に行う必要があります。 詳細についてはこれに関するドキュメントページを読んでください。
filecache_extended.fileid
mounts.storage_id
mounts.root_id
mounts.mount_id
インストールガイド ↗を再確認して、 ログ にあるすべてのエラーや警告を確認してください。

「このインスタンスには推奨されるPHPモジュールがいくつかありません。」

php

このインスタンスには推奨されるPHPモジュールがいくつかありません。 パフォーマンスの向上と互換性の向上のために、それらをインストールすることを強くお勧めします。
intl
bcmath
gmp

該当パッケージを導入してhttpdを再読込します.

$ sudo apt install php-intl php-bcmath php-gmp (1)
$ sudo service apache2 reload (2)
  1. 対応パッケージの導入
  2. apache httpd 再読込

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

データベースにいくつかのインデックスがありません。

db index

データベースにいくつかのインデックスがありません。 大きなテーブルにインデックスを追加すると、自動的に追加されないまでに時間がかかる可能性があるためです。 "occ db:add-missing-indices"を実行することによって、インスタンスが実行し続けている間にそれらの欠けているインデックスを手動で追加することができます。 インデックスが追加されると、それらのテーブルへのクエリは通常はるかに速くなります。
テーブル "oc_calendarobjects_props"のインデックス "calendarobject_calid_index"が見つかりません。
テーブル "oc_schedulingobjects"のインデックス "schedulobj_principuri_index"が見つかりません。
テーブル "oc_properties"のインデックス "properties_path_index"が見つかりません。

メッセージの通りoccコマンドでインデックスを作成します.メッセージそのままコピーすると:がマルチバイト文字になっているので注意しましょう.

$ sudo -u www-data php $NEXTCLOUDPATH/occ db:add-missing-indices
Check indices of the share table.
Check indices of the filecache table.
Check indices of the twofactor_providers table.
Check indices of the login_flow_v2 table.
Check indices of the whats_new table.
Check indices of the cards table.
Check indices of the cards_properties table.
Check indices of the calendarobjects_props table.
Adding calendarobject_calid_index index to the calendarobjects_props table, this can take some time...
calendarobjects_props table updated successfully.
Check indices of the schedulingobjects table.
Adding schedulobj_principuri_index index to the schedulingobjects table, this can take some time...
schedulingobjects table updated successfully.
Check indices of the oc_properties table.
Adding properties_path_index index to the oc_properties table, this can take some time...
oc_properties table updated successfully.

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

「データベースにはオプションのカラムがいくつかありません。」

db collum

データベースにはオプションのカラムがいくつかありません。大きなテーブルにカラムを追加するには時間がかかるため、オプションのカラムは自動的に追加されませんでした。"occ db:add-missing-columns"を実行することで、不足しているカラムはインスタンスの実行中に手動で追加することができます。カラムが追加されると、応答性や使い勝手が改善される可能性があります。
テーブル "oc_comments" にオプションのカラム "reference_id" が存在しません。

メッセージの通りoccコマンドでカラムを追加します.メッセージそのままコピーすると:がマルチバイト文字になっているので注意しましょう.

$ sudo -u www-data php $NEXTCLOUDPATH/occ db:add-missing-columns
Check columns of the comments table.
Adding additional reference_id column to the comments table, this can take some time...
Comments table updated successfully.

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

「データベース内のいくつかの列で、big intへの変換が行われていません。」

db big init

データベース内のいくつかの列で、big intへの変換が行われていません。 大きなテーブルでカラムタイプを変更すると時間がかかることがあるため、自動的には変更されませんでした。 'occ db:convert-filecache-bigint'を実行することによって、それらの保留中の変更は手動で適用できます。 この操作は、インスタンスがオフラインの間に行う必要があります。 詳細についてはこれに関するドキュメントページを読んでください。
filecache_extended.fileid
mounts.storage_id
mounts.root_id
mounts.mount_id

メッセージの通りoccコマンドでbig intへの変換をします.メッセージそのままコピーすると:がマルチバイト文字になっているので注意しましょう.
途中時間がかかる旨のメッセージが表示されます.y を指定することで処理を続行します.siteの規模や利用状況によって実行時間を考えましょう.

$ sudo -u www-data php $NEXTCLOUDPATH/occ db:convert-filecache-bigint
Following columns will be updated:

* filecache_extended.fileid
* mounts.storage_id
* mounts.root_id
* mounts.mount_id

This can take up to hours, depending on the number of files in your instance!
Continue with the conversion (y/n)? [n] y

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

「PHPのメモリ制限が推奨値の512MB以下です。」

php memory

PHPのメモリ制限が推奨値の512MB以下です。

phpの memory_limit の値を /etc/php/7.4/apache2/php.ini を編集して修正します.その後httpdの再読込を行います.

$ sudo vim /etc/php/7.4/apache2/php.ini (1)
$ sudo git -C /etc diff /etc/php/7.4/apache2/php.ini (2)
diff --git a/php/7.4/apache2/php.ini b/php/7.4/apache2/php.ini
index ef89b713..407ee04d 100644
--- a/php/7.4/apache2/php.ini
+++ b/php/7.4/apache2/php.ini
@@ -406,7 +406,7 @@ max_input_time = 60

 ; Maximum amount of memory a script may consume (128MB)
 ; http://php.net/memory-limit
-memory_limit = 128M
+memory_limit = 512M

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Error handling and logging ;
$ php --php-ini /etc/php/7.4/apache2/php.ini -i | grep memory_limit (3)
memory_limit => 512M => 512M
$ sudo service apache2 reload (4)
  1. vimで設定ファイルを修正
  2. 編集内容確認
  3. 設定確認
  4. apache httpd を再読込

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

「”Strict-Transport-Security” HTTPヘッダが最低でも “15552000” 秒に設定されていません。」

hsts

"Strict-Transport-Security" HTTPヘッダが最低でも "15552000" 秒に設定されていません。セキュリティを強化するには、セキュリティTips ↗で解説しているHSTSを有効にすることを推奨します。
$ sudo vi /etc/apache2/sites-available/nextcloud.conf (1)
$ sudo git -C /etc diff /etc/apache2/sites-available/nextcloud.conf (2)
diff --git a/apache2/sites-available/nextcloud.conf b/apache2/sites-available/nextcloud.conf
index 2844232c..4a064d52 100644
--- a/apache2/sites-available/nextcloud.conf
+++ b/apache2/sites-available/nextcloud.conf
@@ -135,6 +135,10 @@
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0

+               <IfModule mod_headers.c>
+                       Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
+               </IfModule>
+
        </VirtualHost>
 </IfModule>

$ sudo apache2ctl configtest (3)
Syntax OK
$ sudo service apache2 reload (4)
  1. apacheの該当のサイト設定修正
  2. 設定確認
  3. 文法チェック
  4. apache httpd再読込

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

「Webサーバーは適切にホスト名が引けるように設定されていません。」

well known

Webサーバーは適切にホスト名 "/.well-known/caldav" が引けるように設定されていません。より詳しい情報については、ドキュメントを参照ください。
Webサーバーは適切にホスト名 "/.well-known/carddav" が引けるように設定されていません。より詳しい情報については、ドキュメントを参照ください。

専用のドメインではなくサブディレクトリ( nextcloud )で運用しているNextcloud なので,ドメインのドキュメントルートに以下のような .htaccess ファイルを用意します.caldav/carddavだけでなく一緒に他のものも設定しました.専用の(サブ)ドメインならこの問題は出ないと思います.

$ sudo -u www-data vi $HTTPROOTPATH/.htaccess (1)
$ cat $HTTPROOTPATH/.htaccess (2)
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^\.well-known/host-meta /nextcloud/public.php?service=host-meta [QSA,L]
  RewriteRule ^\.well-known/host-meta\.json /nextcloud/public.php?service=host-meta-json [QSA,L]
  RewriteRule ^\.well-known/webfinger /nextcloud/public.php?service=webfinger [QSA,L]
  RewriteRule ^\.well-known/carddav /nextcloud/remote.php/dav/ [R=301,L]
  RewriteRule ^\.well-known/caldav /nextcloud/remote.php/dav/ [R=301,L]
</IfModule>
  1. NextcloudのhttpdのROOT直下の .htaccess ファイルを編集
  2. 編集内容を確認.

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

「メモリキャッシュが設定されていません。」

memcache

メモリキャッシュが設定されていません。可能であれば、パフォーマンスを向上するため、memcacheを設定してください。より詳しい情報はドキュメントで参照できます。
A memcache is not required and you may safely ignore the warning if you prefer.

この設定は必須ではなさそうですが,RAMは余っているので設定します.

いくつか種類があるようですが,今回はAPCuを設定しました.

$ sudo apt install php-apcu (1)
$ sudo -u www-data vim $NEXTCLOUDPATH/config/config.php (2)
$ sudo git --git-dir=/var/git/nextcloud --work-tree=. diff config/config.php (3)
diff --git a/config/config.php b/config/config.php
index f62133e..62d137d 100644
--- a/config/config.php
+++ b/config/config.php
@@ -41,4 +41,5 @@ $CONFIG = array (
   array (
   ),
   'mail_sendmailmode' => 'smtp',
+  'memcache.local' => '\OC\Memcache\APCu',
 );
  1. APCuのパッケージを導入
  2. Nextcloudの設定ファイルを編集して設定を追加
  3. 設定確認

「セキュリティ&セットアップ警告」ページを再読込して警告が消えるのを確認します.

「すべてのチェックに合格しました。」

ok

:)

環境

今回のホストの環境はUbuntu 20.04 LTS amd64のapache httpd 2.4, mysql server 8, php 7.4です.

$ dpkg-query -W php7.4-common php7.4-apcu apache2 mysql-server
apache2 2.4.41-4ubuntu3.2
mysql-server    8.0.23-0ubuntu0.20.04.1
php7.4-apcu
php7.4-common   7.4.3-4ubuntu2.4
$ lsb_release -dr
Description:    Ubuntu 20.04.2 LTS
Release:        20.04
$ uname -m
x86_64

Git学習ゲームの「Oh My Git!」

git game01

先週あったFOSDEM 2021のライトニングトーク(といっても1コマ20分)で知ったのですが,「Oh My Git!」というGit学習ゲームがあるそうです.

マルチプラットホームでWindows/macOS/Linux版が用意されています.バイナリはitch.ioで入手できます.

Note
itch.ioについてはこのあたりを.

ゲーミングプラットホームのitch – Speaker Deck

お題が出てきて,それにあった操作のカードを切ってgitの操作をしていきます.実際のコマンド内容も表示され,リポジトリも実際にローカルマシンに作られます.

git game02

ツリーがグラフィックで表現されてわかりやすいしキーボードに慣れていない人でもカードで操作だし入門に良さそうな感じです.後はローカライズされると勧めやすくなるかな.

Google Chrome/Chromium/Braveの履歴のタイムスタンプ形式を調べて1日分の履歴を手に入れる

たまに以前ウェブで見た情報が欲しくなることがあります.履歴に残っていればいいけど消えてしまっているかも.ウェブブラウザのアクセス履歴のタイトルとURLだけでもテキストファイルに残しておくと便利かもしれません.

履歴はHistoryファイルをsqlite3で叩くと取れるのですが,タイムスタンプがよくあるUNIX timeでもなくとても大きな値です.

$ sqlite3 ~/.config/chromium/Default/History "SELECT \"[\" || group_concat(json_object('timestamp', last_visit_time, title, url)) || \"]\" FROM urls;" | jq . | grep timestamp | sort
 -n | tail -1
    "timestamp": 13256542361632384,
UNIX timeの例
$ date +%s
1612703645

検索するとこのようなページを見つけました.

This timestamp format is used in web browsers such as Apple Safari (WebKit), Google Chrome and Opera (Chromium/Blink). It’s a 64-bit value for microseconds since Jan 1, 1601 00:00 UTC. One microsecond is one-millionth of a second.

このTimestampはUTC 1601-01-01からのマイクロセカンド秒らしいです.試してみます.

まずはUNIX timeの1601-01-01からの秒数に10^6を掛けてUNIX timeとの差を求めます.(GNU coreutilsのdateって1970-01-01より前の時間も計算できるんだ!)

UTC 1601-01-01のUNIX time?に10^6
$ echo "$( date --utc --date 1601-01-01 +%s ) * 10^6" | bc
-11644473600000000

Chrome時間とUNIX timeの差を引いてUNIX timeに変換します.

$ echo "( 13256542361632384 -11644473600000000 ) / 1000000" | bc
1612068761

UNIX timeを人間が読めるように変換

$ date --date="@1612068761"
Sun 31 Jan 2021 01:52:41 PM JST

1行にまとめる

$ date --date="@`echo "(13256542361632384/10^6-11644473600)"|bc`"
Sun 31 Jan 2021 01:52:41 PM JST

逆に今の時間をChromeのtimestampに変換

$ echo "(`date +%s`+11644473600)*10^6" | bc
13257218080000000

1日前のChrome時間

$ echo "(`date -d '1day ago' +%s`+11644473600)*10^6" | bc
13257336413000000

chrometime

ということで1日分Chrome/ChromiumのHistoryはこんな感じで取得できそうです.

$ sqlite3 /tmp/History "SELECT \"[\" || group_concat(json_object('timestamp', last_visit_time, title, url)) || \"]\" FROM urls WHERE last_visit_time >= $(((`date -d '1 day ago' +%s` +11644473600)*1000000));"
Note
該当プロファイルを利用中の場合このようなエラーになります.
Error: database is locked
ブラウザを終了するか,Historyファイルを適当な場所にコピーしてそちらを使います.
$ cp /home/matoken/.config/google-chrome/Default/History /tmp/

History ファイルは既定値ではこの辺にあります.

Chromium
~/.config/chromium/Default/History
Google Chrome
~/.config/google-chrome/Default/History
Brave Brouser
/.config/BraveSoftware/Brave-Browser/Default/History

既定値以外の場合はこんな感じで検索? ~/.config 以外にもできるけどその場合はパスがわかっていると思います.

$ find ~/.config/chromium/ ~/.config/google-chrome/ ~/.config/BraveSoftware/Brave-Browser -name History -print

Operaは買収されてから使っていないのですが,古いプロファイルを見るとこの辺のようです.現在は変わっている可能性があります.

Opera
~/.config/opera/History

Safariは環境がないので未確認ですがArchiveBoxのscriptを見ると既定値は恐らくこのあたりです.

Safari
~/Library/Safari/History.db
環境
$ dpkg-query -W bc google-chrome-stable chromium brave-browser coreutils sqlite3
bc      1.07.1-2+b2
brave-browser   1.19.92
chromium        88.0.4324.146-1
coreutils       8.32-4+b1
google-chrome-stable    88.0.4324.150-1
sqlite3 3.34.1-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64