20260614 経年劣化

数日前に最悪な事件があって、何かというと捨てたはずのキシリトールガムが狙いを外れてカーペットの上に落ち、それを椅子のキャスターが丹念にローラーすることでカーペットの毛に強く巻き込まれて終わった。見て見ぬふりが可能ならそうしたかったのだが、足の裏にくっつくのでそうもいかず(博士号じゃねんだぞ)、粘り強くアルコールティッシュで除去した。

しかしだ、冷静に考えると今床一面に敷いてあるカーペットは就職したときに買ったものだからもう7年2ヶ月使っていることになる。洗っていない(そもそも様々な重量家具の下敷きになっているので取り外せない)ので様々な汚れが染み込んでいる。友人がワインをこぼしたシミとか、サーキュレーターを傾けたら隙間からこぼれ落ちてきた謎の茶色い粉とか(マジで何)。

就職したタイミングで新調した諸々のモノが、だんだん古くなってきているということだ。先述のサーキュレーターももう8年選手になっていて、首を触れなくなっていたし、ACモーターで電力消費が大きい(もちろんエアコンに比べれば微々たるものだが、俺はつけっぱなしにするので月数百円くらいのインパクトはある)ので、DCモーターの最新モデルに買い替えた。もう一つ怖いのはロフトベッドだよなあ。急に壊れて寝台が落ちてきたら俺死ぬと思うし、俺が落ちても死ぬかもしれないし、死ななくてもロフトベッド下に密集しているPC関連機器が破損したら悲しい。

まあ話を戻すと、カーペットを新調する計画を立てている。巨大一枚布のカーペットだと家具の下にも入れなければならず、床保護の意味はあっても掃除が出来ないしホコリも溜まりまくる。これを避けるために、次世代のカーペットはタイルカーペットとする予定だ。東リという会社が良いらしい(これフルネーム?)。裏面がPVCでいいのか、いやそれはコンクリ打ちっぱなしに接着する前提で、賃貸のフローリングに敷くなら不織布の方が良い、表面はループパイルで…みたいなことを調べている。業務用の製品・情報が多い界隈でなかなか難しい。

そういう文脈があり、今日は赤羽のホームセンターを見に行った。ああいう店、全部欲しくなっちゃうよね。物理店舗に行って、欲しいと思っていなかったものを欲しいと思い始める体験も悪くない。残念ながら条件に合う商品は売ってなかったが、実物を見てイメージが固められたので、そのホームセンターの通販で買うことにした。

赤羽は乗り換えではよく使うが、街に降り立った記憶はない。今日が初めてだったかもしれない。川口が東京に最も近い埼玉としてお上品に整えられている一方で、赤羽は東京の端としてかなり猥雑な雰囲気がまだ残っている感じがした。駅の北側に数分歩くだけで、歩道に立ち飲み席がある飲み屋があったりする。

帰り道、せっかく降り立った赤羽で、初めての飲食店に入ってみたいと思い、大阪王将の赤羽チャーハンセットを食べた。ワンプレートに焼豚炒飯+唐揚げ+餃子というバカの極みみたいなセット。意外にも一番うまいのは中華スープだった。中華の油の風味がちゃんと乗っている。どうでもいいただの塩水なら飲まずに済んだのに…

最近の趣味はスレスパ1のディフェクトA10。アイクラやサイレントのA10は数回の挑戦で突破できたが、ディフェクトは多分1ヶ月くらい足止めを食っている。Dota2はもうええでしょ。ああいう他人と幸福の総量を奪い合うタイプのゲーム(これは嘘で、勝っても味方と喧嘩してるので幸せにならない)はもういい。

プログラミングは、相変わらずAIに適当なものを作らせている。前提として僕はAI御三家の中ではgeminiを中心に使っている(最近のgeminiはchatgptみたいな軽薄な性格にチューニングされてきていてウザいが)。gemini cliはお亡くなりになったが、正直悲しくもなんともない。金払ってるのにflashですら10分応答が返ってこないコーディングエージェントなんか使えるわけないだろ。それに呆れてopencode goを契約してしまった後で、gemini cliが死んでantigravity cliに移行したのだが、こちらはちゃんと返事が返ってくる。そうは言ってもgeminiはコーディングが下手という伝統はしっかりと受け継がれていて、単純に文法的に正しいプログラムを書くことに時々失敗したりする。

中低モデルハンターとしては、GLMがアツい。僕は仮説として、AIが長い作業を破綻なく続けられるための能力として、自分がやっていること、今からやろうとしていることを簡潔かつ正確な言葉で記述できること、つまりコーディング能力以前の国語能力が重要であろうと考えている。この観点でGLMとqwenは優れている。コストを考えるとqwen3.7 plusのコスパは圧倒的だ。数ヶ月前は中華モデルはベンチ番長という印象が拭えなかったが、最近は使用感も向上している。

巷ではMythosだのFableだの提供停止だのとかまびすしいが、正直僕は一般開発者にそのレベルのAIは必要ないと考えている。僕らが必要とするレベルのAIはすでにコモディティ化している。AnthropicやOpenAIが頑張っている(Googleは頑張っているとは認めない)のは一位であることと、それによってソフトウェア世界の核兵器的な立ち位置を確保することに政治的な意味があるからであって、俺達のことなんか考えてないと思うんだよな。

20260315 くら寿司遇機待ち/琴櫻の体格優位

久々にくら寿司に行った。数少ない僕の娯楽のレパートリー。最近の回転寿司は個別配送レーンのみで回転しないところも多い中、ここは由緒正しい回転レーンと個別配送の併設。回転レーンは食べたいものが流れているとは限らないし、上流の客の行動に影響されるし、古くなって乾燥しているし、はっきり言ってスループット以外良いところがない。悲しいことにくら寿司でも「食品ロス対策で回転レーンに流すメニューを調整中」というポップが回転させられていた。食品ロス対策と言われると確かに仕方ない気がする。しかし「調整中」という絶妙なワーディングで回転レーンはもうオワコンなんです…という本音をコーティングされるのも、どこか潔さが足りない。

最近『アカギ』がマイブームだったので「遇機待ち」を気取って回転レーンに流れてくるやつをいくつか適当に食べてみたのだが、まあやはり乾燥している。そして、めずらしくそんなことをした日に限って上流にも同類がおり、流れてくるラインナップが限られている。凡人ゆえ回転レーンの「偶」に身を委ねることができず、食べたいものは個別注文もしてしまう。すると個別注文が届くまでのタイムラグで回転レーンからも取ってしまい、食べすぎてしまった。すぐ手に入る報酬は価値が高いが、現代人には満腹に至るまでにどこまで味覚を満足させるかという別の制約条件があるのだ。これを退廃と呼ぶ。

江戸のファストフードだった寿司。それが大衆路線と高級路線に分岐し、大衆路線の中でもレジャーとしての回転レーンと効率を追求した個別配送が生まれている。自分が食べたいものを食べたいだけ食べられる、そんな時代になっても僕は玉子で始まりバッテラ、イカ、しらす、そして最後は甘味で終えるルーティンから逃れられない。自由は自由ではない。そこに生まれる豊かな文化的悲哀を思うと、あながちコマーシャリズムというのも悪いものではない。

たくさん食べたので思ったより高くついてしまった。それもまた「粋」。

帰って相撲を見た。食べたいものを食べたいだけ食べることが許されない人たち。大関琴櫻は最近では体格をもっぱら防御に活用し、耐えて下がりながら小技で8勝する力士になりつつある。昨日の藤ノ川戦では別人のような積極性を見せたが、僕としてはこれほどの体格差があって初めて積極的に戦えるのかよ…とちょっと冷えた感想を持った。そして今日の平戸海戦。平戸海も幕内では小さい方なので昨日のように戦えるのかな?と思ったら全然そんなことなく、いいところなく敗北。そんな負け方するくらいなら、小柄な相手にだけ強気で戦う汚さでもいいから、スピリットを持っていてほしかったわね。

20251111 失敗の連鎖

ポッキーを食べそこねた(プリッツは論外である)。電池も買わなかった。

夕食を外食することにしたのだが、食べたいものが思いつかなかった。21時をすぎるとチェーン店は夜間割増が付く店が多いので行けず…駅前のエスカレーターが工事中でエレベーターで降りようとしたら扉に挟まれた。行きつけのあんまり美味しくない中華料理屋で麻婆丼を食べた。麻婆丼は、「鈍」料理である。丼料理というのは米の弾力・粘りと具材の味わい・汁気の絶妙なバランスによって、具も美味しい、米も美味しいという共存共栄を果たすところに美点がある。しかしながら麻婆丼にはそのようなよさがない。ただ米の上に麻婆豆腐を盛り、一緒に食べているだけだ。ねこまんまと同じだ。豆腐+片栗粉を米と一緒に食うことに何のシナジーがあるのか。そして麻婆豆腐はトロトロがその本体であるがゆえに、どうしても丼料理のアンチパターンであるところの汁気過剰に陥る。いっそのこと麻婆粥を名乗ってくれた方がまだ納得感がある。

気難しい独身おじさんのよくなさ、なんだよな。大変申し訳ない。

ブログを書こうと思ったらwordpressにアクセスできなかった。はてさて、原因はなんだろう。リバースプロキシは正常に動いていて、アップストリームがエラーを返している。そしてコンテナのログを見るとDBアクセスが失敗している。同じサーバーで動いている複数のサービスで同じ状態だ。ということは問題は各サービスではなくインフラレイヤーにある。ふと思いついてdfしてみると、果たして100%であった。さらにdu -hで調べてみると/var/lib/docker/overlay2がバカでかい。なるほどな。過去のdocker imageが大量に溜まっていてストレージを圧迫していたのでたくさん消した。

人生がかなりおしまいに近づいている。眠れないし、気持ちが落ち込むし、ジムに行く気も起きない。孤独で、することもない。楽しくなる方法がわからない。仕事も達成感がある部分は全部AIに持っていかれて、めんどいしんどい気を遣う部分だけが残されている。それも仕事の一部であることは認めるが、そこだけ残されるのは話が違う。

20251106 餃子の王将『ラーサイメン』

度重なる値上げにより外食の時代の終わりを感じさせてくれる王将。しかし今日は王将の近くに用事があったので行った。行くとなれば期間限定メニューを頼みたくなるのが俺。いや、無難に餃子が美味いことは知っているんだが、もう無難に美味いものを提供するのでは許されない価格帯になってるんだよ。そういうわけで期間限定のラーサイメンを頼んでみたのだが、まあ食べる価値はなかった。なんだろう、まず異様に食べにくいのが気になったな。おそらく箸の種類・麺の質・麺の太さ・麺と他の具の大きさの関係だと思うのだが、まったく箸で麺を掴むことができない。味も中途半端に酸味系に寄せた担々麺という感じで、さりとてさっぱり感があるわけでもなく、何を主張しているのかよくわからなかった。

ツイッターのアカウントが凍結された。まあもう信頼も何もないサービスだったのでツイッターに預けてある情報はほぼエクスポート済みで、最近はブログ更新告知しかツイートしてなかったのでアカウントを作り直す気もない。ツイッターでしかつながっていなかった、特にやりとりはしないけど生存は確認している人のつながりもpreciousではあったのだが、ツイッターがそういう基盤的なあり方を捨てたいという意思もずっと感じていたので、さようならだ。エヴァ最終回だよ。

足元暖房が最近ホットの話題だ。電気代が高い。エアコンは部屋全体を暖めるが、冷静に考えて僕は90%の時間をデスクに座って過ごしているので、デスク周辺だけピンポイントで暖めればよくない?という発想である。頭寒足熱の原則に従い、足元をパネルヒーターで暖める計画を最初は立てた。しかし近所の電気屋で電気カーペットで足裏だけ暖めるプランもあるなと思い直し、安かろう悪かろうの電気カーペットを買ってきた。結論としてこのプランは失敗で、足裏だけ暖まってもあまり嬉しくない。ちゃんとしたパネルヒーターを買うつもりだ。

生活リズムは、いまだに良くはない。入眠も遅いしジムに行くのも遅い。仕事も多い。ただ、よい生活を嬉しいと感じる感情は少し戻ってきたように思う。マインクラフトは消した(一旦クリエだけと思って戻したのだが、クリエの才能のなさに直面して引退の決意が固まった)。

Twitter終了

Twitterのアカウント @chao7150 が凍結されたので、Twitterでの活動を終了します。

生活が破綻している(n年ぶりm回目)

生活が破綻している。夜眠れない。眠ろうという意思が起きない。どちらかと言えば眠りたくない。眠らずにしたいことがあるかと言われると、まあなくもないが、面倒なのでしない。つまり謎に意味なく起きている。

睡眠薬はこの状況で意味がない。睡眠薬を飲んだとて倒れるように眠れるわけではなく、結局布団に入っていなければ眠れない。眠りたくないので布団には入らない。だから眠れない。眠れるはずがない。

生活には明らかに影響が出ている。部屋は汚いし勉強会も出ていない。ジムも行ってない。かろうじて働いている。以前日記を書いていた頃は規則正しい生活に価値を認めていた。そう生活することが嬉しかったのでそうしていた。今は別に嬉しくない。そうしたいと思わない。なぜそうしていたのかわからない。改善の意思がない。面倒が勝る。ので改善しない。

こういう思考に行き着いていること自体が異常であり改善が必要であることは明白なのだが、改善しようという意思と活力が湧いてこない状態を改善することは、論理的に不可能だ。思えばこうしてずるずる夜中にずれこんでいく生活は大学院時代もそうだった。人生で一番嫌な時期だ。

困ったなあ。なんとかなってほしい。助かりたい。

20251006 ホームパイ


ようやくマイクラの世界から規則正しい生活に復帰しつつある。マイクラは5回くらい引退しました。

メンタルもかなり終わってたけどホームパイ1袋どか食いして復活しました。

苦しみながらマインクラフトをしている

最近、友人たちと一緒にマインクラフトをやっている。以前も少しやっていたことがあるが、このゲームは悪魔的に面白い。

最初マインクラフトの世界に降り立ったとき、僕たちを出迎えるのは美しい自然だ。ローポリではあるが、一貫性のあるアルゴリズムによって生成され、インタラクション可能でどこまでも広がるこの世界は、無限の可能性、ときめきを与えてくれる。僕はいつまでもその美しさを感じていたいと思い、自然と調和した生活、最小の介入での生活を試みる。

しかし次第に心は変わり始める。たまたま見つけた鉄で作った斧の切れ味を知ってしまったら、もう木の斧には戻れない。様々な先進的な道具が鉄で作れるとわかり、僕たちの中の暴力的なフロンティア精神が目を覚ます。鉄や希少鉱物を求めて岩盤に届くまで地面を掘り続ける。山を丸裸にする。そこには自然との調和という思いはもうない。

重要な位置づけの自動化装置としてゴーレムトラップがある。非常に用途が多い鉄を無限生産するただ一つの手段だ。アイアンゴーレムはNPCが敵対NPCに襲われたときに召喚する守護者で、死亡時に鉄を落とす。この性質を利用し、敵対するNPCたちを同じ部屋に閉じ込めて継続的にアイアンゴーレムを生み出させ、それを水流で捕えてマグマで焼き殺して鉄を得るのがアイアンゴーレムトラップだ。

ゲームの表現にとやかく言うつもりはないが(言います)、世界の原住民の感情を支配し、恐怖から生み出される自衛のためのゴーレムをシステマチックに殺して資源を手に入れる仕組みは、どの程度意識して作っていたのかわからないが、現実の搾取のあり方にも通じるものがありグロテスクだ。ゲームの世界だとわかっていても、生み出されて直後に焼き殺されるゴーレムがプレイヤー(僕)を見つめてくる感情のない目を見ていると、間違ったことをしているという気持ちになる。

僕はこのゲームを心底楽しんでいる。すごいゲームだと思う。何もやれと言われないのにやりたいことがなくならないゲームというのはそうそう作れるものじゃない。そしてまた、このゲームが教育にも役立つというのも間違いない。高度な自動化装置をYouTubeの解説動画やwikiで仕様を見ながら自分の手で組み立てていくことで技術の楽しさに目覚める子供は多いだろう(僕が『電子ブロック』でひたすら遊んでいたように)。説明を聞き、手を動かし、仕組みを理解し、さらに発展させる。これでどんどん上達していくし、抽象的な仕組みを考える力もつくだろう。

それでもなお、僕はこのゲームをプレイするのが苦しい。自分の中にある人間の欲望・向上心、それと表裏一体の調和を乱す性質に向き合うことを強制されるからだ。本当に優れたゲームは自分自身の人間性を浮き彫りにし、それと向き合わせてくれる。よくできたゲームだからこそ楽しく、そして苦しい。悪魔的というのはそういうことだ。

そしてこのゲームをプレイするまだ純粋(?)な子どもたちは、この世界に何を思うのだろう。

20250923 Ubuntu24.04+nerdctl+vscode devcontainers 研究2

コンテナからのインターネット制限(ドメインホワイトリスト)ですが、失敗しました。ホストのnftablesで開発コンテナからのリクエストであることを判別する方法が難しく、最後は開発コンテナを別のユーザーから立てることまでやったのだが、そうすると今度はファイルマウントの所有権がぐちゃぐちゃになってしまい、終わった。

ブラウザ上での動作確認を別の隔離コンテナに封じ込めることは簡単にできた。

# compose.yml
version: '3.8'

services:
  app:
    image: watch-duty-manager-app:latest
    build:
      context: .
      dockerfile: ./ContainerFile
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges
    pids_limit: 512
    tmpfs:
      - /tmp:rw,noexec,nosuid,nodev
      - /var/tmp:rw,noexec,nosuid,nodev
    environment:
      - TZ=Asia/Tokyo
      - NPM_CONFIG_IGNORE_SCRIPTS=true
      - SSH_AUTH_SOCK=""
      - SECRET=dummy
    networks:
      - dev-net
    command: sleep infinity
    volumes:
      - ..:/workspaces:cached

  browser:
    image: kasmweb/chrome:1.14.0
    ports:
      - "6901:6901" 
    shm_size: '512m'
    environment:
      - VNC_PW=password
    networks:
      - dev-net
  db:
    container_name: watch-duty-manager-db-with-app
    image: mysql:8.0.27
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: watch-duty-manager
      MYSQL_USER: xxxx
      MYSQL_PASSWORD: xxxx
    volumes:
      - db-data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./mysql/log:/var/log/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
    networks:
      - dev-net

networks:
  dev-net:
    driver: bridge

volumes:
  db-data:
# devcontainer.json
{
    "name": "Node.js & TypeScript with Secure Browser",
    "dockerComposeFile": "./compose.yml",
    "service": "app",
    "workspaceFolder": "/workspaces",
    "postCreateCommand": "rm -rf /tmp/vscode-ssh-auth-* && npm ci --ignore-scripts",
    "remoteUser": "node"
}
# vite.config.json
  server: {
    allowedHosts: ["app"],
    host: true,
    port: 5173,
    https: {
      key: fs.readFileSync("./.devcontainer/key.pem"),
      cert: fs.readFileSync("./.devcontainer/cert.pem"),
    },
    hmr: { host: "app", protocol: "wss", clientPort: 5137 }
  },

まず、devcontainerはcomposeもいける。それを使って開発用DBと動作確認用ブラウザコンテナを同時に立てる。動作確認用ブラウザコンテナはkasmweb/chromeを使うと、ホストからブラウザアクセスでコンテナ内でGUIでブラウザを操作でき、そのブラウザ内で https://app:5173 にアクセスすることで動作確認ができる。localhost以外からアプリケーションにアクセスするのでhost(0.0.0.0)が必要。httpsにしないとsecure付きcookieが死んでしまうので、鍵セットを自前で作ってappのvite.config.jsで読み込んでいる。

20250922 Ubuntu24.04+nerdctl+vscode devcontainers 研究

昨日今日は集中的にdevcontainerを研究していた。というのはnpmの汚染がなんかすごい感じになっていて(曖昧)とりあえずnpmからダウンロードしたパッケージに悪さをされることはもう避けられないっぽいので、それでも耐えられる環境づくりがテーマだ。

もうひとつ、nerdctl(rootless)でやるというのも裏テーマ。僕の私物PCにはdockerの代わりにnerdctlしか入ってないからだ。特に深い理由はないが、なんかdockerはそろそろ標準じゃなくなるっぽいという話を数年前に聞いて以降そうしている。

AIに手伝わせながら作ったのがこんな感じだ。

{
    "name": "Node.js & TypeScript",
    "build": {
        "dockerfile": "ContainerFile"
    },
    "postCreateCommand": "rm -rf /tmp/vscode-ssh-auth-* && npm ci --ignore-scripts",
    "containerEnv": {
        "TZ": "Asia/Tokyo",
        "NPM_CONFIG_IGNORE_SCRIPTS": "true",
        "SSH_AUTH_SOCK": "",
        "SECRET": "dummy"
    },
    "runArgs": [
        "--cap-drop=ALL",
        "--security-opt", "no-new-privileges",
        "--pids-limit", "512",
        "--tmpfs", "/tmp:rw,noexec,nosuid,nodev",
        "--tmpfs", "/var/tmp:rw,noexec,nosuid,nodev",
    ]
}
FROM mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm

RUN usermod -aG root node

--cap-drop=ALLとかno-new-privileges、--pids-limit、/tmp潰しとかは基本らしいのだがSSH_AUTH_SOCKの周りは結構調査が必要だった。vscodeが作るdevcontainerはデフォルトでホストのssh-agentのソケットをコンテナ内にマウントして露出してしまい、これを止めるオプションはない。コンテナ内のsshはSSH_AUTH_SOCK経由でソケットファイルの場所を知るので、それを上書きしてしまえば良い…とAIは言うが、ソケットの置き場は/tmpで名前も明らかにそれとわかる感じなので名前だけ隠してもコンテナ内で悪意あるプログラムが動きうるという前提なら何も隠せてない。なのでpostCreateCommandでrmしている。

ContainerFileでusermodしているのはこうしておかないとホストとコンテナ内のファイルパーミッションが合わず、コンテナ内からファイルに書き込めないから。

nerdctlが正式サポートされていないのである程度コツが必要だった。AppArmorがユーザー名前空間の利用を制限している問題は、エラーログに解決法が書いてあり、その通りにこれを実行したら直った。

cat <<EOT | sudo tee "/etc/apparmor.d/usr.local.bin.rootlesskit"
# ref: https://ubuntu.com/blog/ubuntu-23-10-restricted-unprivileged-user-namespaces
abi <abi/4.0>,
include <tunables/global>

/usr/local/bin/rootlesskit flags=(unconfined) {
  userns,

  # Site-specific additions and overrides. See local/README for details.
  include if exists <local/usr.local.bin.rootlesskit>
}
EOT
sudo systemctl restart apparmor.service

rootlesskitとbuildkitは必要。runコマンドの--sig-proxyオプションも必要なのでnerdctlのバージョンはv2.0.0以上。

以下のように、ローカルのイメージをベースにして更にイメージをビルドしようとすると失敗することがある。devcontainerも何らかの差分ビルドをやっているのか、こういうエラーが起きることがあった。これはbuildkitをcontainerdを使うように設定すると直った

chao@chao-home:~/nerdctl-test$ nerdctl build -f Dockerfile.B .
[+] Building 1.1s (2/2) FINISHED                                                                                                                        
 => [internal] load build definition from Dockerfile.B                                                                                             0.0s
 => => transferring dockerfile: 107B                                                                                                               0.0s
 => ERROR [internal] load metadata for docker.io/library/my-test-image:latest                                                                      1.1s
------
 > [internal] load metadata for docker.io/library/my-test-image:latest:
------
Dockerfile.B:1
--------------------
   1 | >>> FROM my-test-image:latest
   2 |     RUN echo "This is image B" > /image-b.txt
   3 |     
--------------------

error: failed to solve: my-test-image:latest: failed to resolve source metadata for docker.io/library/my-test-image:latest: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed

FATA[0001] no image was built

秘密鍵はコンテナにマウントしたくないのでgit pushはdevcontainerの外で行うことにするが、git commitは悩みどころだ。commit hookで様々なnpmスクリプトが動くことを考えるとコンテナ内にしたいが、CIを勝手に回されるリスクを避けるためにはcommit署名を使うべきで、署名鍵はコンテナ内に入れたくないので、commitはコンテナ外ですることになる。結局commitをコンテナ内でやりつつ署名用gpg鍵のパスフレーズをホスト側で毎回要求することで解決した。

# ~/.gnupg/gpg-agent.conf
default-cache-ttl 1
max-cache-ttl 5

この設定だと、コンテナ内でgpg鍵を使おうとしたときに、毎回ホストマシン側にパスフレーズ入力ダイアログが現れる。vscodeはgpg-agentも勝手にコンテナ内にフォワーディングしているのでこれ以外の設定は不要。

次の段階としてインターネットアクセスもドメインで制限したいのだが、--cap-drop=ALLをつけているためコンテナからiptablesを操作できず、かなり面倒な形になりそうだ。そこまでしなくてもいいかなあ。でもここまで来たならやりたいよな。あとはnodeのpolicyとか、ビルド成果物のチェック、動作確認用のブラウザもサンドボックス内で実行とかもやっていきたい。