KeePass を使う

パスワード管理はずっと Firefox のを使ってたんだけど、9月頃から KeePassXC を使い始めた。しばらく使ってみてそれなりに使えてるのでメモ。なお KeePass と KeePassXC の違いはよくわかってない。

KeePassXC はデータベースを開くためにパスワードだけじゃなくてキーファイルも必要とできるので、データベースファイルはクラウド上に置いて、キーファイルを Ubuntu やスマホのローカルに置くという構成にしてる。

Ubuntu 上で Firefox の abount:logins から「ログイン情報をエクスポート」で CSV で出力しておく。

KeePassXC のインストールと設定

Ubuntu で keepassxc をインストール:

% apt install keepassxc

アプリから KeePassXC を起動:

「CSVからインポートする」でエクスポートした CSV を選択。

データベース名を入力:

「データベースの資格情報」でパスワードを指定し、「保護を追加…」でキーファイルを追加する。キーファイルの追加はあとでもできる。

CSV フィールドの列の関連付けはこんな風にしたら良さそうな感じ?

ここで一旦 KeePassXC を終わらせる。ウィンドウを閉じただけだと終わってないので、メニューから「終了」を選ぶ。

Googleドライブ上にデータベースファイルを置く

Android でも使いたいので、データベースファイルを Google ドライブ上に置く。 Ubuntu で Google ドライブをマウントする方法はいくつかあるみたいだけど、rclone と systemd を使うのが一番良さそうだった。 rcloneでGoogleDriveとかDropBoxとかをお洒落にマウントする - おしゃれな気分でプログラミング を参考にした。というかそのまんま。

rclone をインストール:

% sudo apt install rclone

~/.config/systemd/user/home-tommy-gdrive.mount というファイルを次の内容で作成:

[Unit]
After=network-online.target
[Mount]
Type=rclone
What=drive:
Where=/home/tommy/gdrive
Options=vfs-cache-mode=full
[Install]
WantedBy=default.target

systemctl コマンドでマウントできる:

% systemctl --user start /home/tommy/gdrive

ちゃんとマウントできてる:

% mount | grep gdrive
drive: on /home/tommy/gdrive type fuse.rclone (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

マウントを解除するには systemctl で

% systemctl --user stop home-tommy-gdrive.mount

とやってもできるけど、umount の方が簡単:

% umount gdrive

自動的にマウントされるようにするには systemctl で:

% systemctl --user enable home-tommy-gdrive.mount

KeePassXC で作成したデータベースファイルをマウントしたディレクトリ配下にコピーして、次に KeePassXC を起動したときにそのファイルを指定すればOK。

スマホに Keepass2Android をインストール

Android 用の KeePass アプリはいくつかあるけど、Keepass2Android を使ってみた。

あらかじめ、上記で作ったキーファイルをどうにかして Android 上にコピーする。自分は家庭内NASがあるのでそれ経由でコピーした。Ubuntu と Android を USB ケーブルで接続してもコピーできると思う。 Google ドライブ使ってコピーしてもいいけど、データベースファイルとキーファイルが同じ場所に置いてあるとキーファイルを使ってる意味がないので、コピー後は Google ドライブ上から消しておくこと。

「ファイルを開く」から「Googleドライブ」を選択して、上で Google ドライブに置いたデータベースファイルを選択。

「マスターキーの種類を選択」で「パスワード+キーファイル」を選択し、パスワードとキーファイルを指定する。

Android の設定の「パスワードを管理」→「自動入力サービス」で Keepass2Android を選択する。

アプリでログインするときに Keypass2Android を使って自動入力できるようになる。

おわり

これでアカウントを Ubuntu から登録しても Android から登録しても両方から使えるようになった。ときどき Ubuntu から登録したアカウントが Android で見れないことがあるけっど、よくわかってない。データベースを開き直したら使える。

まだいまいち使い方がわかってないところはあるけど、なんとなく使えてるからまあいいかな〜。

Google ドライブが使えなくなるとパスワードが失われてしまうのはアレなので、定期的にローカルにバックアップするようにしてる。

年が明ける前に書いた。えらい!

ThinkPad T14 Gen3 のサスペンド問題

[2022-09-23 追記] BIOS アップデート(n3buj05w)で解決した! https://support.lenovo.com/jp/ja/downloads/ds557163-bios-update-utility-bootable-cd-for-windows-11-10-64-bit-thinkpad-t14-gen-3-p14s-gen-3-t16-gen-1-p16s-gen-1


前回の続き

ThinkPad T14 Gen3 の Ubuntu がサスペンドすると正常に復帰しない。

画面が消えたまま。10秒くらい待ってると点灯するけど数秒でまた消える…というのを繰り返し。 X が起動してると何もわからないので、コンソールでサスペンドを試すとこんなメッセージが出てた。

i915 0000:00:02.0: [drm] *ERROR* Failed to write source OUI
i915 0000:00:02.0: [drm] *ERROR* [ENCODER:235:DDI A/PHY A][DPRX] Failed to enable link training
i915 0000:00:02.0: [drm] *ERROR* Failed to read DPCD register 0x92
i915 0000:00:02.0: [drm] *ERROR* Failed to write source OUI
i915 0000:00:02.0: [drm] *ERROR* [ENCODER:235:DDI A/PHY A][DPRX] Failed to enable link training
i915 0000:00:02.0: [drm] *ERROR* Failed to read DPCD register 0x92
i915 0000:00:02.0: [drm] *ERROR* Failed to read DPCD register 0x92
i915 0000:00:02.0: [drm] *ERROR* Failed to write source OUI
〜以下繰り返し〜

一応、Alt + PrtSc + [R] [E] [I] [S] [U] [B]アレは効くので電源ボタンを長押ししなくても再起動は可能。

Ubuntu をセットアップしたのが 7/10 で、それ以降時間のあるときにググってみたり、Ubuntu mainlineに新しいカーネルが出てれば試してみたりしたんだけど、解決しなかった。

今日またいつものようにググってたら新しい情報をみつけた。

[ADL_P] Dual eDP support is missing, PPS state tracking gets confused, backlight does not work (#5531) · Issues · drm / intel · GitLab

Ubuntu じゃなくて Arch Linux だけど、ThinkPad T14 Gen3 Intel版でサスペンドが正常に働かずに画面がついたり消えたりする…というようなことが書かれてる。 ThinkPad T シリーズの BIOS にはバグがあって、HDMI ポートが存在しない eDP と共有しているとかなんとか(よくわかってない)。

i915 カーネルモジュールにパッチを当てて作り直せばいいっぽい。これは期待!

カーネルのバージョンが違うんで、パッチはそのままは適用できないけど、似たような処理を探してテキトーに。

i915.ko は linux-modules-extra-5.15.0-43-generic に含まれてる:

~% dpkg -S i915.ko
linux-modules-extra-5.15.0-43-generic: /lib/modules/5.15.0-43-generic/kernel/drivers/gpu/drm/i915/i915.ko

カーネルのソースをもってきて、該当ソースを改変:

~% mkdir /tmp/x
~% cd /tmp/x
/tmp/x% apt source linux-modules-extra-5.15.0-43-generic
...
/tmp/x% cd linux-5.15.0
/tmp/x/linux-5.15.0% vim ./drivers/gpu/drm/i915/display/intel_bios.c

差分。return; をコメントアウトしただけ:

/tmp/x/linux-5.15.0% diff -u ./drivers/gpu/drm/i915/display/intel_bios.c.orig ./drivers/gpu/drm/i915/display/intel_bios.c
--- ./drivers/gpu/drm/i915/display/intel_bios.c.orig  2022-07-24 17:09:36.000000000 +0900
+++ ./drivers/gpu/drm/i915/display/intel_bios.c   2022-07-24 17:11:26.940061516 +0900
@@ -1950,7 +1950,7 @@
        drm_dbg_kms(&i915->drm,
                "More than one child device for port %c in VBT, using the first.\n",
                port_name(port));
-      return;
+//     return;
    }
 
    sanitize_device_type(devdata, port);

パッケージバージョンを指定する。debian.master/changelog の先頭にテキトーに追加:

linux (5.15.0-43.99tmtms) jammy; urgency=medium

  * i915 patch

ABI check でエラーになるので無視するように設定:

/tmp/x/linux-5.15.0% touch debian.master/abi/amd64/ignore

deb パッケージを作成:

/tmp/x/linux-5.15.0% chmod +x scripts/*
/tmp/x/linux-5.15.0% debuild --no-lintian -uc -us -b
...
/tmp/x/linux-5.15.0% cd ..
/tmp/x% ls *.deb
linux-buildinfo-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-cloud-tools-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-cloud-tools-5.15.0-43_5.15.0-43.99tmtms_amd64.deb
linux-cloud-tools-common_5.15.0-43.99tmtms_all.deb
linux-doc_5.15.0-43.99tmtms_all.deb
linux-headers-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-headers-5.15.0-43_5.15.0-43.99tmtms_all.deb
linux-image-unsigned-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-libc-dev_5.15.0-43.99tmtms_amd64.deb
linux-modules-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-modules-extra-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-modules-iwlwifi-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-source-5.15.0_5.15.0-43.99tmtms_all.deb
linux-tools-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-tools-5.15.0-43_5.15.0-43.99tmtms_amd64.deb
linux-tools-common_5.15.0-43.99tmtms_all.deb
linux-tools-host_5.15.0-43.99tmtms_all.deb

一時間くらい掛かる。このうち必要なのは linux-modules-extra-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb だけなので、これだけ作る方法はないんかな…。

インストール:

/tmp/x% sudo dpkg -i linux-modules-extra-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
...

Linux を再起動。

無事サスペンドできるようになった。わーい 🎉🎉🎉

本体の HDMI が使えなかったのも同じ原因だったらしく、HDMI もちゃんと使えるようになった。わーい 👏👏👏

カーネルアップデートのたびにこれをやるのは面倒だし忘れそうだから、Lenovo さんは早く BIOS を修正して欲しい…。

[2022/9/23 追記] BIOS アップデート(n3buj05w)で解決した! https://support.lenovo.com/jp/ja/downloads/ds557163-bios-update-utility-bootable-cd-for-windows-11-10-64-bit-thinkpad-t14-gen-3-p14s-gen-3-t16-gen-1-p16s-gen-1

ThinkPad T14 Gen3 の Linux 化

ThinkPad T14 Gen3 Intel版を購入

2016年10月に買った ThinkPad T460s をずっと使ってたんだけど、6年前のPCだとさすがに処理が遅く感じることもあったんで、そろそろ新しいのが欲しくなったんで、ThinkPad T14 Gen3 を買った。

安かったんでAMD版にしたんだけど、Intel版との違いはCPUだけだと思ってたのに、AMD版はメモリが増設できないことを知って、キャンセルしてIntel版に変更した。 調べてみたら、AMD版とIntel版の違いは他にも、Intel版は USB Type-C が Thunderbolt4 対応なのに AMD版は USB 3.2 というのがあった。罠っぽい。同じ機種名でこういうのはやめてほしい。

6/16 に注文して、6/28 に出荷、7/5 に届いた。

イマイチだったのが、キーボード右側のキーが正方形じゃなくて縦長なこと。なんか見覚えあるな〜と思ったら、T460s の前に使ってた X220 の前に使ってた X61 がこんな感じだった。懐かしい。X61 と違って本体の横に余裕があるんだから、もうちょっとどうにかならなかったのかなぁ…。 Lenovo のサイトに日本語キーボードの写真がどこにも載ってなかったのもアレ。

あと、カタログ上は重量 1.21kg〜 となってたんだけど実測してみたら 1.42kg あった。「〜」が書いてあるとは言え 210g は増え過ぎでは? いったい何が詰まってるんだ…。

バッテリー容量によって重量が変わるという情報もあったけど自分のは容量が小さい 39.3Wh のやつなんだよなぁ。このブログの 52.5Wh の実測 1.37kg よりも重いのはなぜ…。

まあいいや。

起動すると Windows のセットアップが始まるんだけど、Microsoft アカウントが無いと先に進めないようになってた。やめてほしい…。まあアカウント持ってるからそれで進めたんだけども。

ちょっと後で気がついたんだけど、デスクトップやドキュメントが勝手に OneDrive に保存されるようになってた。ひどい。手動で解除。

Xubuntu をインストール

Ubuntu(Xubuntu)をインストールするために、PC 起動時に F12 を押して USBメモリから Xubuntu 22.04 をブート…できない。

まあ、これはよくあることなので、BIOS の設定で Secure Boot をオフにして USB からブート…できない。BitLocker 回復パスワードを入れろとかなんとか…。

ストレージを暗号化する BitLocker というのが有効になってるらしい。

一旦 Windows を起動して、BitLocker を無効化。「設定」→「プライバシーとセキュリティ」→「デバイスの暗号化」→「デバイスの暗号化」を「オフ」。

これで Xubuntu の USBメモリからブートできるようになった。

GParted を起動して、Windows のストレージ領域を小さくする。Windows は BIOS のアップデートや周辺デバイスの動作確認とかのために残しておくのだった。

空いた領域に Xubuntu をインストールする。特に問題はなかった。

今まで使ってた T460s からの移行は /home 配下を rsync でコピー。簡単。

T460s の dpkg -l の結果を元に同じパッケージをインストール。

これで普通に使えるようになった。

問題

新し目の Windows ノート PC を Linux で使うときのあるあるなんだけど、いくつか問題が。

  • サスペンドすると正常に復帰しない。十秒おきくらいに画面が表示されるんだけどすぐ消える。
  • HDMI に外部ディスプレイをつけても認識しない。USB Type-C 接続の外部ディスプレイは認識するし、USB Type-C アダプタ経由で HDMI も使える。本体の HDMI 端子に直接繋げるとダメ。
  • Bluetooth を認識しない。

サスペンドが正常に働かないとか Bluetooth が使えないとかはまれによくあるんだけど、HDMI が使えないのはめずらしい。

サスペンドが正常に働かないのは痛い。ノート PC の意味がない…。

次回「サスペンド解決編」に続く。

Ubuntu 22.04 でメールサーバーを作ったのでメモ

令和にもなって自分でメールサーバーを作ってみたのでメモ。

OS は Ubuntu 22.04。

パッケージ更新後に自動的に再起動

メールとは関係ないけど apt で再起動が必要な更新があった場合は自動的に再起動するようにした。

/etc/apt/apt.conf.d/50unattended-upgrades:

Unattended-Upgrade::Automatic-Reboot "true";

Lets Encrypt

TLS 証明書を作るために certbot をインストール。自分はさくらのクラウドのDNSを使ってるのでそれ用のモジュールも追加。

# apt install certbot python3-certbot-dns-sakuracloud

https://certbot-dns-sakuracloud.readthedocs.io/en/stable/ に従って /root/.secrets/certbot/sakuracloud.ini を作っておく:

dns_sakuracloud_api_token = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
dns_sakuracloud_api_secret = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

証明書作成:

# certbot certonly --dns-sakuracloud --dns-sakuracloud-credentials ~/.secrets/certbot/sakuracloud.ini -m hoge@example.com -d \*.example.com -d \*.example.net

証明書の期限が近づいたら自動的に更新するように cron に設定:

/etc/cron.weekly/letsencrypt:

#!/bin/bash
certbot renew

[追記] ↑ 自動的に /etc/cron.d/certbot が作られるからこれは不要だった。

Postfix

SMTP サーバーとして Postfix をインストール。

# apt install postfix postfix-policyd-spf-python

root 宛のメールは自分に転送するように設定。

/etc/aliases:

root: tommy
# newaliases

master.cf の submission(587ポート) と smtps(465ポート)のコメントを外して有効にする。

/etc/postfix/master.cf:

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

受信メールを SPF チェックする。

/etc/postfix/master.cf:

spfcheck  unix  -       n       n       -       0       spawn
  user=policyd-spf argv=/usr/bin/policyd-spf /etc/postfix-policyd-spf-python/policyd-spf.conf

main.cf はこんな感じで。そんなに特殊なことはしてないはず。

/etc/postfix/main.cf:

compatibility_level = 3.6
alias_maps = hash:/etc/aliases
myhostname = host.example.com
mydestination = $myhostname, $mydomain
home_mailbox = Maildir/
smtpd_relay_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 reject_unauth_destination
 check_policy_service unix:private/spfcheck
smtpd_helo_required = yes
mailbox_size_limit = 0
message_size_limit = 102400000
recipient_delimiter = +-
strict_rfc821_envelopes = yes
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
mua_client_restrictions =
mua_helo_restrictions =
mua_sender_restrictions =

IMAP は Dovecot を使うので SASL として Dovecot を使用するのと、SPF チェック用の設定 check_policy_service をしているくらい。

mua_*_restrictions は master.cf の submission と smtps に書かれてるので、設定しておかないと warning が出るので空で設定しておく。

Dovecot

IMAP サーバーとして Dovecot をインストール。

# apt install dovecot-imapd

143 ポートは使わないので無効化。

/etc/dovecot/conf.d/10-master.conf:

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }

Postfix 認証用の Socket ファイルを指定。

/etc/dovecot/conf.d/10-master.conf:

service auth {
〜〜
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
〜〜
}

メールボックスは各ユーザーのホーム直下の Maildir

/etc/dovecot/conf.d/10-mail.conf:

mail_location = maildir:~/Maildir

TLS 証明書は Lets Encrypt のやつ。

/etc/dovecot/conf.d/10-ssl.conf:

ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem

パスワードはデフォルトで OS のユーザーパスワードと同じものが使われるけど、外から叩かれるものなので OS のパスワードとは変えておきたい。

/etc/dovecot/conf.d/10-auth.confauth-system.conf.ext をコメントアウトして1行追加:

#!include auth-system.conf.ext
!include auth-hoge.conf.ext

専用の認証設定ファイルを作成。

/etc/dovecot/conf.d/auth-hoge.conf.ext:

passdb {
  driver = passwd-file
  args = scheme=SHA512-CRYPT username_format=%u /etc/dovecot/users
}

userdb {
  # <doc/wiki/AuthDatabase.Passwd.txt>
  driver = passwd
  # [blocking=no]
  #args = 

  # Override fields from passwd
  #override_fields = home=/home/virtual/%u
}

passdbauth-passwdfile.conf.ext から、userdbauth-system.conf.ext からコピー。

パスワードファイルの /etc/dovecot/users はこんな形式:

ユーザー名:{SHA512-CRYPT}$6$Gm.4X5ktmas.00pC$z9zEBRJvyyAtuczb81eyr26K/sdjkt9uZ.9mgQT1RR6s6JijHxdnyhQtDGnu70DV9v9Ijkn0bvWYFfkOFWZij0

ハッシュ文字列はこんな風にして作成できる:

# doveadm pw -s SHA512-CRYPT -p hogehoge
{SHA512-CRYPT}$6$Gm.4X5ktmas.00pC$z9zEBRJvyyAtuczb81eyr26K/sdjkt9uZ.9mgQT1RR6s6JijHxdnyhQtDGnu70DV9v9Ijkn0bvWYFfkOFWZij0

fail2ban

Postfix や Dovecot の認証が同じIPアドレスから複数回失敗したときにそのIPアドレスからの接続をブロックするために fail2ban をインストール。デフォルトで SSH 認証にも効くようになってる。

# apt install fail2ban

/etc/fail2ban/jail.d/postfix.conf:

[postfix-sasl]
enabled = true

/etc/fail2ban/jail.d/dovecot.conf:

[dovecot]
enabled = true

デフォルトでは10分以内に5回認証に失敗したら10分間ブロックする。

証明書更新時にサービスをリロードする

はてぶで、証明書更新時にサービスをリロードしないといけないのでは…という指摘があったので追記。

たしかにその通りでした 🙏

/etc/letsencrypt/renewal-hooks/post 配下に実行ファイルを置いておくと証明書が更新されたときに実行してくれるので、次のようなファイルを実行権つきで置いておく。

/etc/letsencrypt/renewal-hooks/post/postfix

#!/bin/bash
/usr/sbin/postfix reload

/etc/letsencrypt/renewal-hooks/post/dovecot

#!/bin/bash
/usr/sbin/dovecot reload

Postfix は証明書ファイルは smtpd プロセスが読み込んでて、smtpd プロセスはある程度動作したら自動的に再起動するので、この処理は実はやらなくてもいい。けどちゃんとやっといた方が安心感はある。

Dovecot は imap-login プロセスが TLS の処理をしてて、これは接続毎に起動されるんだけど、証明書ファイルの読み込みは config という別のプロセスがやっててこれは明に指示しないと再読込してくれないのだった。

DNS の設定

ちゃんと書いておいた方がいいかもしれないと思って追記。

上にも書いたけど DNS はさくらのクラウドのサービスを使ってる。1ゾーンあたり44円/月。安い。

メールサービスなので、MX と A と SPF(TXT) と PTR は必須。 こんな感じで設定:

@     MX   10 mx.example.com.
@     TXT  v=spf1 mx -all
mx    A    192.0.2.1
host  A    192.0.2.1

最後の host(host.example.com)は、Postfix の myhostname に書いたホスト名。これを PTR に設定しておく。 MTA によってはクライアントのIPアドレスを逆引きして正引きした結果がそのIPアドレスを含まないと接続を拒否されることがあるので。 PTR はサーバーのIPアドレスを管理してる業者じゃないと設定できない。業者によってやり方は異なる。 Oracle Cloud は無料で使えるんでそこにメールサーバー立てようかと思ってたんだけど、無料だと PTR を設定できないので断念した。

しかし大昔は自力で DNS サーバーも立ててたんだけど面倒くさくなってしまったな…。

AndroidスマホをLinux PCのカメラにする

自分の作業机は正面に27インチディスプレイを置いてノートPCはその脇に置いてるんだけど、Zoom とかのオンラインミーティングで顔出しする時にPCのカメラだと斜めからの映像になって良くないなーと思ってて、Webカメラつけるのもいいかと思ったんだけど今品薄だし、そういえばAndroidスマホをPCのカメラにできるというのをどっかで読んだ気がする。

…ということで、テキトーに「linux android webカメラ」とかでググると、ケータイWatchの記事が見つかった。

k-tai.watch.impress.co.jp

DroidCam という Android アプリを使えばできるらしい。

試してみたらできたんだけど、

  • フロントカメラが使えない
  • adb で繋ごうとすると Linux のクライアントアプリが落ちる

…ということでやめ。

Google Play で「linux webcam」で検索すると「IP Webcam」というのが見つかった。

play.google.com

起動すると設定画面が出てきて、一番下の「映像ストリーミング開始」をタップするとカメラが起動する。

カメラが動くと IPv4: https://192.168.10.100:8080 のように表示されてるので、ブラウザでそのURLにアクセスするとこんな画面が表示される。

f:id:tmtms:20200518014137p:plain

ブラウザでいろいろコントロールできる。結構高機能。

上の「ビデオレンダリング」の「JavaScript」とかを押すとブラウザ上にカメラ映像が表示される。

f:id:tmtms:20200518014922p:plain

で、肝心の PC のカメラにする方法は、ブラウザ画面上部の「ビデオチャットドライバー」から辿れる。Linux の場合は GitHub。

github.com

ドライバーと言ってもただの bash スクリプトで、変なアプリをインストールさせられるわけではない。

スマホが USB ケーブルでつながっていて Linux に adb がインストールされていれば adb を使用して通信するように動く。 ただし、スマホの「開発者向けオプション」で「USBデバッグ」を有効にしておく必要あり。

そうでなければネットワークで繋ごうとするので、スクリプト中の WIFI_IPPORT をスマホに表示されているものに書き換えておいた方がいい。 あと、WIDTHHEIGHT の比率がスマホの画面と合ってないと映像が太ったり痩せたりするので合わせておく。

GST_VIDEO_CONVERTER="ffmpegcolorspace" という行があるが、これは最近は videoconvert というものに変わったらしいので書き換えておく。 (https://stackoverflow.com/questions/44780991/no-element-ffmpegcolorspace-in-gstreamer)

スクリプトを実行すると、Debian, Ubuntu の場合は標準の apt リポジトリから必要な debパッケージ1が自動的にインストールされる。 うまくいくとこんなダイアログが表示される。

f:id:tmtms:20200518021734p:plain

この場合は /dev/video2 がカメラデバイスとなっている。

OK を押すと、端末に

Press enter to end stream

と表示されるので、そのまま放置しておく。Enter を押すと終了する。

これでカメラとして使えるようになってるはず。

なにかテキトーなアプリで動作確認する。

VLC は「メディア」→「キャプチャーデバイスを開く」→「ビデオデバイス名」に /dev/video2 を入力(メニューから選択)して、「再生」を押すと映像が表示される。

Zoom だと設定の「ビデオ」→「カメラ」のメニューに「Dummy video device (0x0000)」というのが増えてた。

スクリプトを終了しても adb が残ってるので、次に起動した時に

Your port 8080 seems to be in use: falling back to Wi-Fi. If you would like to use USB forwarding, please free it up and try again.

みたいな理不尽なことを言われるので、adb は kill しておいた方が良さそう。

いろいろ変更したけどローカルPCに置いておくと無くしそうなので、GitHub で fork して自分用のものを置いておく。

https://github.com/tmtm/ipwebcam-gst/blob/master/prepare-videochat.sh


  1. インストールされるパッケージは、bc, zenity, v4l2loopback-dkms, python-apport, gstreamer1.0-pluseaudio, v4l-utils, gstreamer1.0-tools

Ubuntu MATE で Win+P(Super+P)を無効化する

[追記]

Ubuntu MATE 20.04 で Win+P は無効になった。やったー 🎉

https://launchpad.net/ubuntu/+source/mate-settings-daemon/1.24.0-1

     + Drop 0001_new_video_key.patch. Rejected upstream.

Ubuntu 17.10 から Ubuntu MATE を使ってるんだけど、Ubuntu MATE 19.10 から Win+P(Super+P)キーで、ディスプレイの切り替わってしまうようになった。

マルチディスプレイ使用時にメインとサブが切り替わったり、1つだけになったり。それはまあいいんだけど、ちゃんと設定しておいたメインとサブの左右がリセットされたり位置がずれたりするのがいたい。

Win+P で切り替わるんじゃなくて、mate-display-properties (これ↓)が動くようになって欲しい。

f:id:tmtms:20200411192043p:plain
mate-display-properties

いろいろ調べてみても、このキーバインドを変更方法がわからず。ずっと放置してたんだけど、重い腰を上げて調べてみた。

まず誰が Win+P を処理してるのか。

Ubuntu MATE 19.10 のリリースノートの「MATE Desktop 1.22.2」に記述があったので、おそらく MATE 固有のもの。

https://github.com/mate-desktop/ 配下のリポジトリを手元に git clone して、grep したりしてみたところ、mate-settings-daemon/plugins/xrandr/ という怪しげなのを発見。

xrandr という名前がそのまんまだし、ソースを見たら Win+P に関する記述は見つからなかったけど、同じような動きをする XF86Display(ThinkPad では Fn+F7)キーに関する記述があった。

dconf-editor で /org/mate/settings-daemon/plugins/xrandr を見てみたが、キーに関する属性は無さそう。「このプラグインの有効化」という属性を見つけたのでオフにしてみる。

f:id:tmtms:20200411194033p:plain
dconf-editor

Win+P キーやFn+F7キーを押してもディスプレイには何の変化もない!やったー!

…と思ったのもつかの間、mate-display-properties での設定変更も効かなくなってしまった。

しかたないのでオンに戻して、もう一度ソースを見てみる。やはり Win+P に関する記述は見当たらない。

apt source mate-settings-daemon で Ubuntu MATE のパッケージのソースを取得。こっちに発見。(Mod4 = Super = Win)

#define VIDEO_KEYSYM    "XF86Display"
#define ROTATE_KEYSYM   "XF86RotateWindows"
#define NEW_VIDEO_KEYSYM    "p"
#define NEW_VIDEO_MODSYM    Mod4Mask

どうやら Ubuntu MATE 固有のキーバインドらしい。プログラムにハードコードされていて変更できそうにない。ひどい。

しかたないので、独自にパッチをあてて deb パッケージを作り直すことにした。

パッチ。キーイベントを拾ってるやつを全部無視するようにした。

バージョンを変更しないと apt upgrade で元のパッケージで上書きされてしまうのでテキトーにバージョンを変更。 はじめはどこでバージョンを指定するのかわからなかったんだけど、changelog に記述したものが使われるのね。面白い。

diff -ur mate-settings-daemon-1.22.1.orig/debian/changelog mate-settings-daemon-1.22.1/debian/changelog
--- mate-settings-daemon-1.22.1.orig/debian/changelog 2019-09-23 03:43:43.000000000 +0900
+++ mate-settings-daemon-1.22.1/debian/changelog  2020-04-11 15:14:52.577098106 +0900
@@ -1,3 +1,7 @@
+mate-settings-daemon (1.22.1-1tmtms) eoan; urgency=medium
+
+  * plugins/xrandr: disable key evnets.
+
 mate-settings-daemon (1.22.1-0ubuntu1) eoan; urgency=medium
 
   * New upstream release.
diff -ur mate-settings-daemon-1.22.1.orig/plugins/xrandr/msd-xrandr-manager.c mate-settings-daemon-1.22.1/plugins/xrandr/msd-xrandr-manager.c
--- mate-settings-daemon-1.22.1.orig/plugins/xrandr/msd-xrandr-manager.c  2020-04-11 15:13:27.000000000 +0900
+++ mate-settings-daemon-1.22.1/plugins/xrandr/msd-xrandr-manager.c   2020-04-11 15:14:14.505166359 +0900
@@ -2619,9 +2619,11 @@
         log_msg ("State of screen after initial configuration:\n");
         log_screen (manager->priv->rw_screen);
 
+/*
         gdk_window_add_filter (gdk_get_default_root_window(),
                                (GdkFilterFunc)event_filter,
                                manager);
+*/
 
         start_or_stop_icon (manager);
 
@@ -2675,9 +2677,11 @@
                 gdk_x11_display_error_trap_pop_ignored (display);
         }
 
+/*
         gdk_window_remove_filter (gdk_get_default_root_window (),
                                   (GdkFilterFunc) event_filter,
                                   manager);
+*/
 
         if (manager->priv->settings != NULL) {
                 g_object_unref (manager->priv->settings);

パッケージ作成&インストール。

% apt source mate-settings-daemon
% patch -p0  < tmp/mate-settings-daemon-1.22.1.patch
% cd mate-settings-daemon-1.22.1 
% debuild -uc -us -b
% cd ..
% sudo dpkg -i mate-settings-daemon_1.22.1-1tmtms_amd64.deb mate-settings-daemon-common_1.22.1-1tmtms_all.deb

うまくいった。しかしキーバインドがハードコーディングというのはやめてほしいなー。


deb パッケージを作るのに参考にしたもの。

Ubuntu で Postfix の SMTP AUTH を設定して fail2ban で認証に失敗したIPアドレスをブロックする

Ubuntu 18.04 の Postfix で次のようにして SMTP AUTH を有効にしました。

/etc/postfix/master.cf

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

/etc/postfix/main.cf

smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous

/etc/postfix/sasl/smtpd.conf

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

/etc/default/saslauthd (変更部分のみ)

START=yes

設定反映

# systemctl reload postfix

で、 fail2ban というパッケージをインストールすると、SMTP AUTH に何回か失敗するとそのクライアントの IPアドレスがブロックされるようになります。10分経つとブロックが解除されます。

/etc/fail2ban/jail.d/postfix.conf (作成)

[postfix-sasl]
enabled = true

設定反映

# systemctl reload fail2ban

回数やブロック解除までの時間等は /etc/fail2ban/jail.conf で指定できます。

# "bantime" is the number of seconds that a host is banned.
bantime  = 10m

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 10m

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

ログは /var/log/fail2ban.log に出力されます。こんな感じ。

2019-01-14 23:29:00,987 fail2ban.filter         [1566]: INFO    [postfix-sasl] Found x.x.x.x - 2019-01-14 23:29:00
2019-01-14 23:29:14,921 fail2ban.filter         [1566]: INFO    [postfix-sasl] Found x.x.x.x - 2019-01-14 23:29:14
2019-01-14 23:29:29,230 fail2ban.filter         [1566]: INFO    [postfix-sasl] Found x.x.x.x - 2019-01-14 23:29:29
2019-01-14 23:29:39,035 fail2ban.filter         [1566]: INFO    [postfix-sasl] Found x.x.x.x - 2019-01-14 23:29:39
2019-01-14 23:29:39,189 fail2ban.actions        [1566]: NOTICE  [postfix-sasl] Ban x.x.x.x
2019-01-14 23:39:40,070 fail2ban.actions        [1566]: NOTICE  [postfix-sasl] Unban x.x.x.x

なお fail2ban をインストールするだけで sshd についても有効になります。

/etc/fail2ban/jail.d/defaults-debian.conf

[sshd]
enabled = true

これを false にするかコメントアウトすれば sshd について無効にできます。

Ubuntu 18.04

最近は Ubuntu MATE をデスクトップで使ってます。Ubuntu 18.04 が出たので、アップグレードしました。

日本語環境は https://www.ubuntulinux.jp/japanese にはまだ 18.04 の情報が無かったんですが、https://www.ubuntulinux.jp/sources.list.d/bionic.list があったので、/etc/apt/sources.list.d/ubuntu-ja.list に置いて apt update && apt upgrade しました。これでいいのかどうかわからないけど、特に問題は起きてないです。

アップグレード後、パネルに通知エリアがなくなってたので、「インジケーターアプレット完全版」を追加。

あとはいつものようにキーマップを変更。

tmtms.hatenablog.com

アップグレードしてみたけど、デスクトップ環境としては今までとほとんど変わってません。

ls コマンドの出力が少し変わってて、ファイル名に空白が含まれる場合に ' で括られるようになってました。 標準出力が端末でない場合に --quoting-style=shell-escape オプションと同じ振る舞いをするようになったっぽい。

% ls
'0 1 2'   a   b   c

% ls | cat
0 1 2
a
b
c

Firefox 以外のアプリでも色付き絵文字が表示できるようになりました。fonts-noto-color-emoji がインストールされてます。

xremap の代わりに xkeysnail を使ってみる

前にこんな記事を書きましたが、

tmtms.hatenablog.com

たしかにCtrl-Nで新しいウィンドウが開くことはなくなったんですけど、Webページによっては Ctrl-N を押しても何も反応がないことがあります。原因は調べてません。まあウィンドウが開くことがないだけでもいいかと思ってたんですけど、xkeysnail というのがあると教えてもらいました。

qiita.com

Python製のツールみたいです。Pythonは全然わかんないんですけど、書かれてる通りにインストールしました。 pip3 は Ruby の gem コマンドみたいなもんなのかしら。

% sudo apt install python3-pip
% sudo pip3 install xkeysnail

example/config.py はたくさん設定されててなんかこわいので Ctrl-N と Ctrl-K だけにしてみました。Pythonわからないんでテキトーです。

# -*- mode: python, coding: utf-8 -*-

import re
from xkeysnail.transform import *

# [Global modemap] Change modifier keys as in xmodmap
define_modmap({
    Key.CAPSLOCK: Key.LEFT_CTRL
})

define_keymap(lambda wm_class: wm_class in ("Firefox"), {
    K("C-k"): [K("Shift-end"), K("C-x"), set_mark(False)],
    K("C-n"): with_mark(K("down")),
}, "Firefox")

/dev/uinput とかを使うので root で実行する必要があるんですけど、常に root で動かしとくのもアレなので、この記事を参考に専用ユーザーを作って見ました。

qiita.com

自動起動はこういうスクリプトを作って、デスクトップの設定の「自動起動するアプリ」で起動するようにしました。バックグラウンド実行するようにしとかないとログイン処理が止まってキー入力が一切効かなくなって電源切るしかなくなっちゃったので注意。

~/bin/xkeysnail.sh:

#!/bin/sh
exec >> $HOME/tmp/xkeysnal.log 2>&1
xhost +SI:localuser:xkeysnail
sudo -u xkeysnail DISPLAY=$DISPLAY /usr/local/bin/xkeysnail $HOME/etc/xkeysnail.conf

今のところ期待通りに動いているようです。

Firefox 57 のテキスト入力時に Ctrl-N で新規ウィンドウが開くようになってしまったが xremap で事なきを得た

Emacs 使いなので、デスクトップのキーバインドも Emacs にしていて、Firefox のテキスト入力欄でも Emacs ぽく入力していたのですが、Firefox 57 でなぜか Ctrl-N で新規ウィンドウが開くようになってしまいました。Ctrl-B, Ctrl-F, Ctrl-P はちゃんとカーソル移動として動くのに Ctrl-N だけなぜ…。

原因はともかく、これでは使い物にならないので、xremap を入れて対処しました。

k0kubun.hatenablog.com

インストール

% git clone https://github.com/k0kubun/xremap
% cd xremap
% make
% cp xremap $HOME/bin

設定 [$HOME/bin/xremap.config]

window class_only: 'Navigator' do
  remap 'C-b', to: 'Left'
  remap 'C-f', to: 'Right'
  remap 'C-p', to: 'Up'
  remap 'C-n', to: 'Down'

  remap 'M-b', to: 'Ctrl-Left'
  remap 'M-f', to: 'Ctrl-Right'

  remap 'C-a', to: 'Home'
  remap 'C-e', to: 'End'

#  remap 'C-k', to: ['Shift-End', 'Ctrl-x']

  remap 'C-d', to: 'Delete'
  remap 'M-d', to: 'Ctrl-Delete'
end

C-k を無効にしてるのはMozcでカタカナに変換するためのキーだからです。

実行

$HOME/bin/xremap $HOME/bin/xremap.config

xremap すばらしい。

[追記]

Twitterで何故かマップしているキーが動かなくなってたので、結局 C-n だけ有効にしました。

Ubuntu Mate 17.10

Ubuntu 17.10 が出たので、Xubuntu を 17.10 にしてみた。

あんまり代わり映えしなかったので、GNOME ベースになったという Ubuntu を使ってみた。

% sudo apt install ubuntu-desktop

あいかわらず、アプリのメニューバーがアプリのウィンドウ内ではなく、画面上部に表示されて使いにくかったのでやっぱりやめた。日本語入力もうまくできなかったけど、調べてない。

次に Ubuntu Mate を試してみた。

% sudo apt install ubuntu-mate-desktop

結構良かった。ウィンドウマネージャに Compiz も選択できるのが良い。しばらく使ってみる。

起動時のSplash画面が Xubuntu のままなので、Mate に変更。(参考)

% sudo update-alternatives --config default.plymouth
% sudo update-initramfs -u

GTKアプリのキーバインドをEmacsに変更する。(gtkrc - How to get Emacs keybindings in Firefox using Mate? - Ask Ubuntu, mateconftool-2 not found on Ubuntu Mate 17.04 install : mate)

% dconf write /org/mate/desktop/interface/gtk-key-theme "'Emacs'"

あとは、日本語キーボードのキーマップを英語キーボード風にしたり、壁紙のイメージが定期的に変わるように variety をインストールしたり。

追記

調子に乗って会社のPCも Ubuntu Mate にしてみた。

mount.cifs がエラーになったが、-o vers=1.0 をつけたらうまくいった。

サスペンド&レジューム後に bluetooth マウスが接続されないことがあったので調べてみたら Ubuntu 17.10 not detecting bluetooth mouse - Ask Ubuntu というのを見つけたので設定してみた。

echo "options iwlwifi bt_coex_active=0"|sudo tee --append /etc/modprobe.d/iwlwifi.conf

WindowsからRDPで接続できなかったので /etc/X11/Xwrapper.configallowed_user=anybody を設定。(XRDP – HowTo install on Ubuntu Gnome 17.04 – easy way – Griffon's IT Library)

ログイン時等に何故かキーボードのバックライトが点灯するので、それを無効にする(https://ubuntu-mate.community/t/keyboard-light-keeps-turning-on-after-login-and-or-unlock/6914/12)。

/etc/dbus-1/system.d/org.freedesktop.UPower.conf の KbdBacklight の行を allow から deny に変更。

ZIP中のファイル名の文字化け

こんな記事がありました。

gihyo.jp

これはMacユーザー用の書籍の宣伝記事らしいのですが、「Windowsを使ってる人のためにMac側がひと手間かけてあげよう」なんて殊勝なことをマカーが言うとは時代も変わったもんです。([追記] はてブのコメントを見たらさすがマカーという意見が並んでて安心しました)

まあ私はWindowsユーザーでもMacユーザーでもないのでどうでもいいのですが、文字化けなネタなので食いついてみます。

記事中に、「付物出稿.zip」というファイルを開いた時の画像が載ってます。

文字の並びからして、UTF-8文字列をシフトJIS(CP932)とみなして表示してしまった文字列でしょう(「繧ォ繝上y繝シ繝輔か繝ォ繧ソ繧・」の元の文字は「カバーフォルダ」で、「蟶ッ繝輔か繝ォ繧ソ繧・」は「帯フォルダ」)。

つまり、Macはファイル名をUTF-8でZIPに書き込み、WindowsはそれをシフトJIS(CP932)と思って開いているということです。

ZIPフォーマット中のファイル名は文字コード情報を持っていません。なので、MacとWindowsのようにファイル名の文字コードが異なるシステム同士でZIPをやりとりすると、このように文字化けしてしまうのです。

手元にMacが無いので確かめてはいないのですが、どうやらWindowsで作ったZIPファイルをMacで開く分には問題ないらしいです。 Macのファイル名の文字コードは昔はシフトJISだったようなので、互換性を考慮してUTF-8で文字化けする場合はシフトJISとみなして開いてくれるのかもしれません。

2007年にZIPフォーマットは拡張されてファイル名がUTF-8であることを示すフラグが追加されました。 ということは、現代においてはZIP作成時にファイル名の文字コードをUTF-8にしてこのフラグを立てれば文字化けはしないはずなのです。

実はWindowsはZIPを作成するときにはCP932でファイル名を書くのですが、ZIPを開くときにはちゃんとこのフラグを見てくれます(Windows 8 あたりから)。 なのにMacで作られたZIPのUTF-8のファイル名が文字化けするということは、MacのZIPはこのフラグを立ててないということなのでしょう。

WindowsがZIP作成時にUTF-8にしないのはおそらく過去の互換性を重視しているからでしょう。 MacはせっかくUTF-8なんだからフラグを立ててくれればいいんですけどね。惜しい。

まあ、それぞれ自分のロケールに従った文字コードでZIPを書いてるという点ではお互い様です。

ちなみにUbuntuはZIP作成時にちゃんとUTF-8フラグを立ててUTF-8で作ります。なのでWindowsでも問題なく開けますし、Macはこのフラグを見てるかどうかは知りませんが、文字コードがUTF-8だからおそらく問題なく開けるでしょう。

UbuntuでのZIP展開時には、UTF-8フラグが立っていたらそのままUTF-8のファイル名として扱い、フラグが立っていない場合は、現在のロケール(LC_ALL, LANG環境変数等)を見て文字コード変換を行います。 jaロケールの場合はCP932からUTF-8への変換を行います。

ですので、UbuntuとWindowsの間では問題になることはないでしょう。

ということでMacをやめてUbuntu使えば解決ですね!

ThinkPad T460s Ubuntu でトラックパッドを無効化

5ヶ月ほど ThinkPad T460s を Ubuntu(Xubuntu) で使ってます。

ちょっと前に さよならMac | めがねをかけるんだ という ThinkPad をdisった記事が話題になりましたが、自分はあんまり不満はありません。 ノートPCでLinuxを使う時の鬼門だった無線LANやサスペンドもまったく問題ありません。 当然トラックパッドは無効にしています。

唯一の不満がこのトラックパッド無効化です。

トラックパッドを無効にしようとBIOSで無効に設定しても無効になりません。

しょうがないので、Xubuntu の設定の「マウスとタッチパッド」でタッチパッドの設定を無効化します。

f:id:tmtms:20170218135347p:plain

これでトラックパッドが無効になってめでたしめでたし。

…と思ったのですが、しばらく使ってると、時折トラックポイントのボタンをクリックしても効かないことがあります。

どうやらトラックパッドに触れているとボタンのクリックイベントを取りこぼすようでした。 トラックパッドを無効にしていたので、それが原因だとなかなか気がつきませんでした。

トラックパッドに二本以上の指が触れているとかなりの確率でボタンのクリックイベントを取りこぼしてしまいます。

どうやら psmouse ドライバのインストール時に proto=bare を指定するとトラックパッドを完全に無効化できるようです。 というより proto=bare ではトラックパッドを扱えないというだけな気がします。

# modprobe -r psmouse
# modprobe psmouse proto=bare

これでトラックパッドに触れていてもボタンクリックを取りこぼすことはなくなりました。

…が、もうひとつ問題が。

proto=bare ではトラックポイントの感度と速度の調整ができません。

proto=bare を指定しない時は、次のようにして感度と速度を調整できました。

# echo 200 > /sys/devices/platform/i8042/serio*/serio*/sensitivity
# echo 200 > /sys/devices/platform/i8042/serio*/serio*/speed

proto=bare で psmouse をインストールした時は、この sensitivity, speed ファイル自体ありません。

色々試行錯誤したところ、proto=bare をつけずに psmouse をインストールして、感度と速度を調整した後に proto=bare をつけて psmouse を再インストールすると感度と速度が保持されたままになることがわかりました。

とりあえず、簡単なシェルスクリプトを作って、電源ON時やサスペンドからの復帰時に走らせてます。

#!/bin/bash
DIR=/sys/devices/platform/i8042
SPEED=200
SENSITIVITY=200

# echo が刺さることがあるので1秒でタイムアウトさせる
sub() {
    (echo $1 > $2) &
    pid=$!
    (sleep 1; kill $pid) &
    pid2=$!
    wait $pid
    kill $pid2
}

modprobe -r psmouse
modprobe psmouse proto=any
while :; do
    sleep 0.3
    speed=$DIR/serio*/serio*/speed
    test -f $speed || continue
    sens=$(dirname $speed)/sensitivity
    test -f $sens || continue
    sub $SPEED $speed
    test "$(cat $speed)" -eq $SPEED || continue
    sub $SENSITIVITY $sens
    test "$(cat $sens)" -eq $SENSITIVITY || continue
    break
done
modprobe -r psmouse
modprobe psmouse proto=bare

Firefoxで絵文字が白黒で表示される

Firefox 50 で絵文字に色がつきました。

次のようなテキストファイルを表示すると

🍣と🍺

次のように表示されるようになりました。

f:id:tmtms:20161123163111p:plain

ですが、Ubuntu で次のファイルを表示すると

🐭🐮🐯🐰🐲🐍

次のように「🐭」と「🐮」だけ白黒で表示されてしまいました。

f:id:tmtms:20161123163115p:plain

どうやら、OSのフォントに該当する文字があればそれが優先されるようです。

Dejavu Sans フォントに該当するフォントが入ってるようなので、それを読ませないようにすればいいようです。

% sudo apt purge fonts-dejavu-core

ちゃんと色付きで表示されるようになりました。

f:id:tmtms:20161123163119p:plain

なお、fonts-dejavu-core を削除すると、合わせて xubuntu-core や xubuntu-desktop も削除されてしまいますが、これらはメタパッケージなので特に問題ありません。 それが嫌な場合は、要するにフォントファイルを見せなければいいので、次のようにするだけでも良いようです。

% sudo chmod 000 /usr/share/fonts/truetype/dejavu

[追記]

font-manager を使って Dejavu Sans のチェックボックスを外すことで無効に出来ます。 そのユーザーだけに影響してシステムには影響しないため、上記の方法よりも望ましいと思います。

どのフォントファイルに定義されているのかを調べる

「🐭」と「🐮」がどのフォントファイルで定義されているか調べるのにいくつかツールを使ってみました。

gnome-font-viewer

特定の文字しか表示されないのでダメでした。

fontforge

UIが使いづらかったのでやめました。

gnome-specimen

そのフォントに定義されていない文字はデフォルトのフォントで表示されるようなので使えませんでした。

font-manager

これで見つけることができました。

waterfall

ちょっと使いにくかったですが、これでも見つけられました。

スクロールバーの矢印を表示する

最近は Xubuntu を使ってますが、テーマによるのかもしれませんが、スクロールバーの端の矢印が表示されなくなってて不便なので表示する方法を調べました。

Gtk3

$HOME/.config/gtk-3.0/gtk.css を次の内容で作成

.scrollbar {
    -GtkScrollbar-has-backward-stepper: 1;
    -GtkScrollbar-has-forward-stepper: 1;
}

Gtk2

個人ごとに設定する方法はわかりませんでした。

/usr/share/themes/テーマ名/gtk-2.0/gtkrc の内容を変更

        GtkScrollbar            ::has-backward-stepper                  = 1
        GtkScrollbar            ::has-forward-stepper                   = 1
...
        GtkScrollbar::stepper-size      = 13