saruboの書き溜め

いいこと書けないですけどこんな記事でよければ見ていってね

Cloudflare を使って X (旧twitter) のおすすめをブロックのメモ

注意

売る覚えなんかうまく行ったあとにうろ覚えの記憶で書いたメモ。この通りにはいかないかも。

VPN接続する

  • ブラウザ上でどうにかこうにかゴニョゴニョして証明書(certificates)をダウンロードできるように
    • アカウント作成して、Access controls > Policies > Reusable policies で add a policy をする
      • Selector: Emails, Value: <メアド> みたいにした
    • Traffic policies > Traffic settings > Certifications に Certification があればそれを使う。無ければ作成してABALABLE, IN-USEにするらしい。
      • IDをクリックすると詳細が出てくるので、More actions から証明書をダウンロードできる
  • 証明書(certificates)を入れてCloudflare Zero TurstをONにする
    • Arch Linux なら
      • sudo trust anchor <*.crtのpath> で証明書を反映する
      • aur の cloudflare-warp-bin をインストールする
      • warp-cliwarp-cli registration new <TEAM-NAME> を実行
      • https://<TEAM-NAME>.cloudflareaccess.com/warp みたいなものがcliに出て、ブラウザが開く
      • パスワードか何かで認証
      • guiが出てくるのでonにする
    • iOSなら
      • 証明書をファイルアプリのiPhone内のダウンロードフォルダに移動 (Firefoxなどの他の場所はだめ)
      • ダウンロードフォルダ内で開くと設定アプリに反映される
      • 設定アプリで 一般 > VPNとデバイス管理 で追加した構成プロファイルをインストール
      • 設定アプリで 一般 > 情報 > 証明書信頼設定 でルート証明書を全面的に信頼をON
      • Cloudflare One アプリでどうにかログインして、Cloudflare Zero TurstをONにする

多分VPN接続するようになるはず。

Xのおすすめをブロック

Traffic Policies > Firewall policies > Firewall policies > HTTP で add a policy する。 ポリシー名を決めて、

  • Selector: URL Path,
  • Operator: maches regex,
  • Value: ^.*/i/api/graphql/[^/]+/HomeTimeline\??.*
  • AND
  • Selector: Host
  • Operator: in
  • Value: x.com twitter.com
  • Select an action: Block

Traffic Policies > Traffic settings > Traffic settings で Proxy and inspection の Allow Secure Web Gateway to proxy traffic をONにした気がする。もがいていたので必須かはわかりません。

余談

スマホから Youtube Shortsを見られないようにする これをやりたかっただけ。

正規表現わからないので紆余曲折あって自分の書いた正規表現になっている。スライドの内容でもできるのかも?VPNが接続できていないのかブロックできていないのか区別できていなかったから色々いじってこうなった。

Firefox の新しいタブを透過させる

前提

userChrome.css で好みのいい感じの透過設定を既に作っている人。 自分は これ 使ってます。

結論

browser.tabs.allow_transparent_browsertrue にする。

経緯

今までも Linux 環境でそこかしこに透過が効くので userChrome.css をいじって Firefox を透過していました。 ですが、何をしても about:blank 、いわゆる、新しいタブのページそのものを透過できていませんでした。

久々に Linux を立ち上げて環境を整えていたところ、ふと「新しいタブもやっぱり透過したいな」と思い立ち、「firefox transparent background root」で検索したところ……

Firefox 128 will allow the main browser content background to be transparent という reddit の投稿を見つけました。開いてみるとなんと載っている画像の New Tab が透過しているではありませんか。

そこで、 browser.tabs.allow_transparent_browsertrue にすると、なんと貼った画像のようになりました。 すごく、いいですね。

terminal と firefox が透過しています。

蛇足

一般的なウェブページでも背景が透過する設定になっていると、透過してしまいます。総務省の一部ページ (画像参照) やFANZAの同人のページはスケスケです。えっち!

とても健全な総務省のページの背景が透けています。

Linux で Ly のような GNOME じゃない環境で VSCode の sign in

結論

  1. gnome-keyringlibsecret を入れます。
  2. /etc/pam.d/<使用しているdisplay manager (もしくはlogin manager)>で以下を有効にします。無いならば追記します。ly に pam_keyinit の部分はありませんでした。
auth       optional     pam_gnome_keyring.so
session    optional     pam_gnome_keyring.so auto_start
session    optional     pam_keyinit.so force revoke

環境

  • Linux Distribution: Arch Linux
  • Display Manager: Ly
  • Window Manager: CwC
  • VSCode: visual-studio-code-bin 1.105.1-1

経緯

Arch Linux で AUR 経由で VSCode を入れた。 設定が面倒で sign in して設定を同期させようと思ったが、以下の警告ポップアップが出てきた。

You're running in a GNOME environment but the OS keyring is not available for encryption. Ensure you have gnome-keyring or another libsecret compatible implementation installed and running.

一旦 microsoft 公式の指示 に従うが、 gnome-keyring を入れてだめだった。

Arch LinuxwikiGNOME Keyring の記事 を見ると次のように。

When using a display manager, the keyring works out of the box for most cases. GDM, LightDM, LXDM, and SDDM already have the necessary PAM configuration. For a display manager that does not automatically unlock the keyring edit the appropriate file instead of /etc/pam.d/login as mentioned below.

When using console-based login, edit /etc/pam.d/login:

Add auth optional pam_gnome_keyring.so at the end of the auth section and session optional pam_gnome_keyring.so auto_start at the end of the session section.

#%PAM-1.0

auth       required     pam_securetty.so
auth       requisite    pam_nologin.so
auth       include      system-local-login
auth       optional     pam_gnome_keyring.so
account    include      system-local-login
session    include      system-local-login
session    optional     pam_gnome_keyring.so auto_start

If using the greetd login manager, the file that needs to be modified is /etc/pam.d/greetd, instead of /etc/pam.d/login.

/etc/pam.d/ly に書いて再起動して反映してみても sign in できない。

解決策を調べるのが面倒になったので chat-gpt に聞けばとりあえず gnome-keyring を入れろと。 言われて知った下記コマンドで gnome-keyring-daemon が動いているか調べるが、普通に元気に動いている。

ps aux | grep gnome-keyring-daemon

これに対し、 chat-gpt は「GNOME_KEYRING_CONTROLXDG_RUNTIME_DIR がアプリ実行時に設定されていないと接続不可になる」と言う。

確かに XDG_RUNTIME_DIR は設定されているものの、 GNOME_KEYRING_CONTROL は設定されていなかった。

以下を試してアプリを立ち上げろと言うが、結果 sign in はできなかった。

eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export SSH_AUTH_SOCK
export GNOME_KEYRING_CONTROL

「アプリが keyring の D-Bus サービス (org.freedesktop.secrets) にアクセスできていない」説を提示してきた。下記コマンドで調べると普通に org.freedesktop.secrets は出てきた。アクセスできている。

busctl --user list | grep secrets

残る可能性として「アプリの実行環境が D-Bus セッションに接続していない」を提示してきた。 echo $DBUS_SESSION_BUS_ADDRESS は空じゃなくて正常な状態だったのでこれでもない。

そうすると libsecret がリンクされていない説を挙げてきた。流石にないだろうが、一応調べようとする。すると secret-tool なるものの話が出てきた。これを調べると、 secret-tool が動かないみたいな記事 が出てきた。

この記事の最後の方にこんなコメントがあった。

Now I have found that on Ubuntu pam configuration contains:

# Create a new session keyring.
session    optional   pam_keyinit.so force revoke

Arch doesn't contain or doesn't use this pam_keyinit module, I think this can be a reason why on Ubuntu gh auth login can use keyring and on Arch can't.

From man 8 pam_keyinit:

pam_keyinit - Kernel session keyring initialiser module

The pam_keyinit PAM module ensures that the invoking process has a session keyring other than the user default session keyring.

What means it's the Kernel keyring that is attached to every process or thread. I don't know if libsecret can use this Kernel keyring if Gnome keyring isn't available but it looks like it can be it. I didn't find any other systemd units or anything else that can provide keyring, only this pam_keyinit module. But I only spent a few minutes on it, took me much longer to write this reply. 🙂

I tried to enable pam_keyinit on Arch and it didn't help, secret-tool store --label='test1' a1 v1 still prints the same error. I'm confused. 😁 It could still have something to do with the dbus.

あれ?これでは?となった。早速 /etc/pam.d/ly に追記する。

# Create a new session keyring.
session    optional   pam_keyinit.so force revoke

再起動すると…… これだった!!! ありがとう。コメントを書いてくれた方!

pacman メモ

タイムアウトがやだなぁとなったとき

sudo pacman -Syu --disable-download-timeout

諸刃の剣なので注意

以前の update から間が空いたら

-Syu の前に

sudo pacman -S archlinux-keyring

-Sy のほうがいいとか見かけた。 困ったら検討。

Scala の初学者が見る文書で `Seq()` を使わないで欲しい派の主張

注意

ポエム、あるいは思想です。 私が完全に正しいとは思っていません。 そして、私は未だに Seq("foo", "bar", "baz") がどのようにして実体を List[String] として持っているのか理解していません。 という前提で話をグダグダしていきます。

主張

そんなに Seq が使いたいなら、こうすればいいのに!

val seq: Seq[String] = List("foo", "bar", "baz")

検索して見かけるもの

Scalaの記事でたまに見かけるものに

val seq = Seq("foo", "bar", "baz")

のようなものがあると思います。

あなたは初学者なので Seq が何か調べてみることもあるでしょう。 では、公式ドキュメントをあたりましょう。 次のうちのどれかか、全てを参照しました。

ここで驚くべきことに気付きます。 Seq は、なんと trait あるいは object なのです。 あなたはざっくりと、 trait がいわゆる interface のように使われると聞いていたのに、 interface をコンストラクタのように使っているのを見かけてしまったのです。 object は何かそういうことが出来るのかも知れませんが、しかし、 class Doginterface Animal を実装した何かであるとしたら、 interface AnimalAnimal である「何か」を作っているように見えるのです。 めちゃくちゃです。

さて、この疑問にあなたはさらに調べを進めていくこともあるでしょう。 object の方を読んでいたら

This object provides a set of operations to create Seq values. The current default implementation of a Seq is a List.

という記述を見つけるかも知れませんし、コマンドライン

$ scala

と叩いて、REPLを立ち上げ、次のように Seq の実体がどうなっているか調べるかも知れません。

scala> Seq("foo", "bar", "baz")
val res0: Seq[String] = List("foo", "bar", "baz")

あるいは

で同様の記述を見つけるかも知れません。

ともあれ、 SeqList であるようでした。 List について確認してみましょう。

Listclass です。 Seq の実体の正体に辿り着きました。

extends, with あたりを追って行けば、 ListSeq の関係が分かりますし、

の図を見ても関係性は直ぐに分かるでしょう。

いやいや、interface AnimalAnimal である「何か」を作っているように見えるのは変わらないじゃないですか!

思うこと

val seq = Seq("foo", "bar", "baz")

初学者には厳しい

  • なぜ「 Seq のコンストラクタで呼び出した実体がデフォルト実装で List である」という 暗黙知 を前提に記事を読まねばならないのか?
    • 初学者でなかったとしても Library のデフォルト実装を知っていようというのは筋肉な思想では?
  • trait ってそのまま実体として呼び出せるのか?」と誤解させ得る example code は良くはないでしょう?

この感覚を持って欲しいのです。

さらに面白いことをしてみましょう。 厳密には違うでしょうが、 Seq()Seq.apply() と同じであると聞いたことにしましょう。 REPLで遊んでみると?

scala> Seq.apply
-- [E178] Type Error: ----------------------------------------------------------
1 |Seq.apply
  |^^^^^^^^^
  |missing argument list for method apply in class Delegate
  |
  |  override def apply[A](elems: A*): CC[A]
  |
  | longer explanation available when compiling with `-explain`
1 error found

なんと class Delegate であると言うのです。もう分かんないですね。

そんなに Seq が使いたいなら、次のようにすれば、少し冗長ですが、実態に即しており、明確で誰も困らないものと思います。

val seq: Seq[String] = List("foo", "bar", "baz")

Tips

ちなみに以下の様に Seq よりも抽象的な trait でも同じように List が実体となっています。ワオ。

scala> Iterable("foo", "bar", "baz")
val res1: Iterable[String] = List(foo, bar, baz)

scala> Traversable("foo", "bar", "baz")
there was 1 deprecation warning; re-run with -deprecation for details
1 warning found
val res2: Iterable[String] = List(foo, bar, baz)

アニメ中の犬歯っていいかも

映画を一気に2つ観てきたのでネタバレの感想をここに置いておく。

機動戦士Gundam GQuuuuuuX

クリックして表示 ファーストは見てないので登場人物とか話にはちょっとついて行けない。THE ORIGINは見たことあるから許してください。 前半パートの「もしシャア・アズナブルガンダムに乗ったら」って拗らせちゃった中学生男子かよ!って思った。やるなぁ。 後半パートの目が見えない中での戦闘って天パが「たかがメインカメラをやられただけだ!」って言っていた噂が思い浮かんだ。 ガンダムが喋っているって、水星でもそんな話あったなぁ。ねぇシャア・アズナブルさん。

全体的に「ニュータイプだから (説明省略)」みたいなノリ。それでいいのか?って思ったけど二次創作だからいいか。

Plazmaかなり良い。印象に残る。後半パートの曲は現代的だなぁと思ったらツミキさん挿入歌やってたんだ。

劇場版プロジェクトセカイ 壊れたセカイと歌えないミク

クリックして表示 ソシャゲアニメ、良くも悪くも徹頭徹尾ソシャゲアニメ。 ミクの映画ですって評価はまぁそうかもしれないけど、どちらかと言えばプロセカの映画だなって思う。 ゼルダの伝説におけるゼルダが今回のミクで、実際活躍するのはリンクだしみたいな気持ち。 このリンクが一人ではなく "みんな" なので、"みんな" でどうにかしようの部分とそのための布石で時間を取っていて、どうしても全体的に薄味。難しいね。

しかし、まぁ、クリプトンのキャラとプロセカのキャラがアニメーションで動くということは大変素晴らしい。 映画の歌っている描写とアフターライブの出来の差を感じるくらいには良い表現だった。

これは妄想だけれど、「壊れたセカイ」ってそもそもセカイですらない、なりそこないだったんじゃないんですかね? どんなセカイって聞かれたときに答えられなかったし、セカイが不完全なのでセカイの制約が緩くてそこのミクは他のセカイに行けちゃうし、みんなを呼び出すことも出来ちゃう。最後に会えなくなる故にお別れを言うのも完成したからって事情に見えた。

3週目6日目 (水曜日) なのだけど比率として若い女性がかなり多い。メインターゲットなんだろうなぁと。その上特典を開けるのに躊躇がなさすぎる。歴戦の猛者の風貌。若い女性にはお金がそんなにあるはずないのに (偏見)、どれだけこのコンテンツにお金使ってるんだろうと思った。推しという言葉で隠したところに人の好きだとという気持ちがあって、それを利用する商売なので、ホストに貢ぐこととさほど変わらないと認識した上でコンテンツにお金を使って欲しいなぁと思った。身体に悪いと自覚しながらお酒を飲むように。

後は雑多なもの。

  • 野良猫に餌をやるな。許さん。命に責任を持て。タバコ吸う描写よりもよっぽど影響があって良くない。
  • セカイに出現するときってそう出現するんだって思った。あとPCからもセカイに行けるんだ。
  • 追加ユニット可能性はないわけじゃないように見えた。
  • 映画内に埋め込まれた各楽曲やボカロPの名前は是非ニコニコでみんなでコメントしながら見たいね (叶わぬ願い)
  • ???「そうかな?そうかも」私「そういうこという人いるんだ」
  • 電気かじった人間からすると、わけわからん停電は東京電力経産省は頭抱えるだろうなぁと。

アニメーションで新たにあるいは強く認識した願望 (下劣)

クリックして表示

  • 桃井愛莉の犬歯舐めたい。
  • 類と寧々は結婚しろ。子を成せ。
  • 草薙寧々の後ろ髪に顔を埋めたい。類が埋めているところを見るのでもいい。

追伸

街中に行ったという人みんな献血行こうね。

SolidStart の proxy で websocket を使う target を指定する

結論

SolidStart の proxy で websocket を使う target を指定するためには

  • vite.server.proxy を通常通り指定
  • server.experimental.websocket = true にする

結果、 app.config.ts (app.config.js) は以下のようになる。 ("/websocket": "http://localhost:3001" のあたりなんかは都合よく置き換え)

import { defineConfig } from "@solidjs/start/config";

export default defineConfig({
  server: {
    experimental: {
      websocket: true,
    },
  },
  vite: {
    server: {
      proxy: {
        "/api": "http://localhost:3001",
        "/websocket": "ws://localhost:3001",
      },
    },
  },
});

追記 2024/12/30

proxy 経由だと WebSocket.onmessage が動かないので注意。どうしよう

補足

websocket の機能を ON にする設定と、 target の設定は離れたところにある。

意図された動作かは不明だが、以下の記述は SolidStart においては何の効果もなかった。 vite の config には以下のように ws: true とすべきであるように書いてあるが SolidStart には関係ないようだ。

      proxy: {
        "/api": "http://localhost:3001",
        "/websocket": {
          target: "http://localhost:3001",
          ws: true,
        },
      },

環境

2024/12/29 時点の SolidStart の最新版で再現可能のはず。

package.json の特に動作環境に関わる部分は以下

  "dependencies": {
    "@solidjs/meta": "^0.29.4",
    "@solidjs/router": "^0.15.0",
    "@solidjs/start": "^1.0.10",
    "solid-js": "^1.9.2",
    "vinxi": "^0.4.3"
  },
  "overrides": {
    "vite": "5.4.10"
  },
  "engines": {
    "node": ">=18"
  },