自分の投稿にあるタグの使用回数を知りたかったのでMastodonの本番DBを見る方法を調べた記録。
確認環境
Mastodon v4.5.4
やり方
postgresになってmastodon_productionを開くと見れる。
sudo su - postgres
psql mastodon_production
テーブル一覧は恐らくhttps://mstdn.example.com/pghero/で見れるものがそれだと思う。
DBスキーマ
有志が公開しているMastodonのER図を参考にさせてもらった。
今回打ったクエリ
自分が投稿しているタグの総数が知りたかったので、こんな感じにしてみた。たぶん自インスタンスのdomainはnullと思われる。適当なので知らんけど。
SELECT
tags.name
,COUNT(*) as post_count
FROM statuses
INNER JOIN statuses_tags
ON statuses.id = statuses_tags.status_id
INNER JOIN tags
ON statuses_tags.tag_id = tags.id
WHERE
statuses.account_id = (SELECT id FROM accounts WHERE username = 'Lycolia' AND domain IS NULL)
GROUP BY
tags.name
ORDER BY
post_count DESC;
クエリの結果
ゾンビランドサガと三宮に対する言及がめちゃくちゃ多いことがよく分かった。
| タグ名 | 使用回数 |
|---|---|
| ゾンビランドサガ | 225 |
| 三宮 | 205 |
| 神戸 | 123 |
| 兵庫 | 101 |
| 自炊 | 93 |
| 兵庫食材 | 72 |
| 交通 | 64 |
| サイト運営 | 32 |
| 神戸食材 | 25 |
| 鉄道 | 22 |
| 映画 | 15 |
| 映画館 | 14 |
| 買い物 | 9 |
| 姫路 | 7 |
| 災害 | 5 |
| 夜景 | 4 |
| 経県値 | 4 |
| lastfm | 3 |
| markov | 3 |
| web | 3 |
| 御影 | 2 |
| 明石 | 2 |
| 尼崎 | 2 |
| カメラ | 2 |
| ai | 2 |
| ui | 2 |
| せちまなと打って性格がわかるらしい | 1 |
| しなちくシステム無料ガチャ | 1 |
| 加古川 | 1 |
| 回線 | 1 |
| 眼鏡っ娘を見るとストレスが減るらしい | 1 |
| 気動車 | 1 |
| このタグをみた人は好きな天ぷらを答える | 1 |
| 阪神 | 1 |
| 山歩しよう | 1 |
| 児島 | 1 |
| shindanmaker | 1 |
| page42 | 1 |
| notestocklogincode | 1 |
| notestock | 1 |
| 土産 | 1 |
| 飯屋 | 1 |
| last | 1 |
| fediverseプロフ帳 | 1 |
| 無事下山 | 1 |
| ガルクラ | 1 |
| ガジェット | 1 |
| ガルクラタイプ診断 | 1 |
| ガルクラ総集編 | 1 |
| ソンビランドサガ | 1 |
| インターネット | 1 |
| ネットワーク | 1 |
| プロフィール帳 | 1 |
| プロフ帳 | 1 |
| ライフハック | 1 |
参考
一年ぶりくらいにGitHub Actionsを使ってnpmパッケージを更新しようとしたら何かこけたので、通るようにした時にやったこと。
事象
なんかこんな感じのエラーが出てnpm publishに失敗した。
npm notice 1.6kB package.json
npm notice Tarball Details
npm notice name: @lycolia/ts-boilerplate-generator-cli
npm notice version: 0.28.1
npm notice filename: lycolia-ts-boilerplate-generator-cli-0.28.1.tgz
npm notice package size: 14.8 kB
npm notice unpacked size: 79.1 kB
npm notice shasum: 2ba5920ab2b46695bd996e86bf67b6a7cdb980cd
npm notice integrity: sha512-YHU4X10pXE7HP[...]RKmFhCpP4Gnmw==
npm notice total files: 25
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and default access
npm notice Access token expired or revoked. Please try logging in again.
npm error code E404
npm error 404 Not Found - PUT https://registry.npmjs.org/@lycolia%2fts-boilerplate-generator-cli - Not found
npm error 404
npm error 404
npm error 404
npm error 404 Note that you can also install from a
npm error 404 tarball, folder, http url, or git url.
npm error A complete log of this run can be found in: /home/runner/.npm/_logs/2026-01-27T00_45_59_837Z-debug-0.log
Error: Process completed with exit code 1.
'@lycolia/ts-boilerplate-generator-cli@0.28.1' is not in this registry.
起きていたこと
- npmjsにあるAccess Tokensが全部消えてた
- Trusted publishing for npm packagesという話で、OIDC[1]を使ってGitHubと連携しないとGitHubなどのCI/CD、つまり自動化処理・バッチ処理から
npm publishできなくなっていた - これに対応するためにはnpm CLI version 11.5.1か、それ以降が必要
- またnpmjsのOIDC連携をするためには2FA認証が必須で、そのためにはパスキーが必要
- Access Tokenは最大90日までになり、無制限のものはなくなった
- Access Tokenで
npm publishを行う場合、2FAしていないとできない
- Access Tokenで
対応に必要なこと
- npmjsに2FA登録する。要パスキー
- npmjsからGitHubリポジトリへのOIDC連携
- GitHubリポジトリにある
npm publishしているyamlの修正 - npmのバージョンアップ
やったこと
- npmjsにパスキーを登録
- npmjsからGitHubリポジトリへのOIDC連携
- パッケージのSettingsタブを開き、Trusted publisherにリポジトリ情報を登録する
Enviroment nameは第三者向けの項目[2]なので、設定しなくていい

- Set up connectionボタンを押して連携する
- パッケージのSettingsタブを開き、Trusted publisherにリポジトリ情報を登録する
- GitHub Actionsのワークフローを直す
permissionsの部分を足し、npm publishのenvは不要なので削除name: npm publish on push to main on: push: branches: - main +permissions: + id-token: write + contents: read jobs: publish-to-npm: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache: npm cache-dependency-path: package-lock.json registry-url: 'https://registry.npmjs.org' - name: npm continuous install run: npm ci - name: npm build run: npm run build - name: run publish run: npm publish - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH }}
.nvmrcのNode.jsのバージョンをv24.13.0にした- このバージョンにすると自動的にnpmのバージョンが適合したため
- この後、GitHub Actionsを使って
npm publishに成功すると、パッケージページやバージョン履歴ページには次のような表示が出るようになる


パスキー使いたくない問題
パスキーは端末依存で環境間共有の面倒さやGoogle縛りになるのが嫌などで入れたくない人も少なくないだろう。私もそう思う。正直パスキーありきのサービスは困る。
取り敢えず私の場合はEdgeを使っていて、Android Edgeへのパスキー共有はできないものの、いったんpublishするだけなら問題ないので、Edgeのパスキーを使うことにした。
どうしてもパスキーを使いたい、ほかの環境でも同期したいが、Googleに頼りたくない場合はKeePassXCというOSSを使うのが一つの手だ。
KeePassXCは暗号化されたデータベースファイルにIDとパスワードや、パスキーを記録するソフトウェアだ。複数環境への同期はNASなりSSHなり、クラウドストレージなどに鍵DBを保存して、それぞれの環境から読み書きすることで実現できる。
KeePassXCにはEdgeの拡張もあり、PCの中でKeePassXCを起動していればEdgeの拡張と同期してIDパスワードやパスキーを上手く管理してくれるようだった。ただ拡張機能が起動する前にKeePassXCが起動していないと手動で接続しないといけないなど、地味に面倒だった。
ただ調べた限りKeePassXCには公式のAndroidアプリがなく、サードパーティーアプリは毎回鍵ファイルを読みに行く実装のようで、オフライン時にも使うことのあるスマホでは運用に厳しさを感じた。逆に完全オフライン版もあるが、これはこれでAndroid側でDBを更新した時に別環境に飛ばすのが手間になるだろうからイマイチだ。
もう一つの選択肢としてはBitwardenを使う方法もある。こちらは公式がAndroidアプリを出しているほか、同期用のストレージを自前で用意する手間もかからない。
Bitwardenは、いわば1Passwordの無料版みたいな感じと言えるだろう。なお、BitwardenにはOSS版もあるので、セルフホスト運用もできるようだが、詳しくは調べていない。
私はBitwardenを軽く試してみたが、Edgeの自動入力機能に干渉しており、EdgeのパスワードDBを消し去らないとEdgeとBitwarden両方のパスワード入力補助が出てきて非常に邪魔だったことや、アニメーション設定をOFFにしても入力フィールドが飛び跳ねるアニメーションが出てきて嫌だったので、結局諦めた。せめて独立して動いてほしかった。
トラブルシューティング
Edgeで2FA認証しようとしたらパスキーがこけた
画像のような状態になった場合、何度かやり直すといけた。
「Two-factor authentication or granular access token with bypass 2fa enabled is required to publish packages.」と言われる
パスキーを使った2FAを登録することで解決した。
「npm error code EOTP」と言われる
npm notice Publishing to https://registry.npmjs.org/ with tag latest and default access
npm error code EOTP
npm error This operation requires a one-time password from your authenticator.
npm error You can provide a one-time password by passing --otp=<code> to the command you ran.
npm error If you already provided a one-time password then it is likely that you either typoed
npm error it, or it timed out. Please try again.
このようなエラーが出る場合、GitHub ActionsのWorkflowsのyamlファイルのルートに以下の記述が足りないので足す。
permissions:
id-token: write # Required for OIDC
contents: read
「npm error code ENEEDAUTH」と言われる
npm error code ENEEDAUTH
npm error need auth This command requires you to be logged in to https://registry.npmjs.org/
npm error need auth You need to authorize this machine using `npm adduser`
このようなエラーが出る場合、npmのバージョンが古いので11.5.1以上にすることで解決する。
あとがき
正直npmjsを利用するのはもうやめようかと思う。ぶっちゃけもうNode.jsと積極的に関わりたくないし、代替技術を探したいと感じた。少なくともプライベートではそう思う。
TypeScriptに限界を感じてきたでも書いたが、Node.jsのエコシステム周りには甚だうんざりしてきており、今回の件でより、さらに、もっと嫌になった。
取り敢えず静的解析とかそういうのは欲しいし、テストもしたい、ほんでLinuxフレンドリーで、Windowsでも動いてくれるとなおよい。簡単なツールを書くことが多いのもありコンパイル言語よりはインタプリタ言語のほうが好ましい。
そう考えるとやはり浮かんでくるのはPHPになってくるあたり、21年前に触れた私の初めてのプログラミング言語との出会いに戻ってくるあたりが面白い。PHPerはPHPerから逃れられない宿命でもあるのかもしれない。
今は肩書上フロントエンドエンジニアとかいうのを仕事にしているが、そこまで性に合っていない気もしてきているし、Web系のバックエンドではPHPの仕事もまだまだあるので、これを機にPHPに戻るのも一つありだとは思った。
関係ない話、何ならadiaryのせいでTypeScriptよりPerlの方が好感を持ててきているまであるので、私はたぶんどうかしているのだと思う。
投稿日:
何かしらの理由でAnthropicのアカウントをBANされて復活ができなくなった場合にClaude Codeを使う方法。
結論
poe-codeを使う。
poe-codeがあると、AnthropicのアカウントがなくてもClaude Codeを使うことができる。
確認環境
| Env | Ver |
|---|---|
| OS | Ubuntu 24.04.3 LTS |
| Node.js | v24.10.0 |
| Claude Code | 2.1.45 |
| poe-code | 3.0.60 |
やり方
- Claude Codeをインストールする
curl -fsSL https://claude.ai/install.sh | bash - Poeのアカウントを作る
- Poeの設定からPoeのサブスクリプションを契約する。最安は700円
- PoeのAPIキーを取得する
- poe-codeをインストールし、Claude Codeをインストールする
npm i -g poe-code # ここでAPIキーを入れ、モデルを選ぶ poe-code configure claude-code # このコマンドを叩くとpoe用のClaude Codeがインストールされる poe-code install claude-code # このセッションでは普通にclaudeを叩くと使えるようになる claude

トラブルシューティング
claudeを叩くとコマンドが見つからない
本家Claude Codeが必要なため、インストールすることで解消する。
poe-codeによるclaudeは本家のラッパーとして機能しているため、本家がないと動かない。
備考
Poeは従量課金制だが、標準だと自動課金になっていないためPoeの設定から自動チャージを有効にすると勝手に止まることがなくなって便利。
レートリミットは恐らくないので無限に使うことができる反面、放置してると無限に請求されるので気を付けたほうがいい。
またpoe-codeでは、Claude Codeに限らずCodexやOpenCode、Kimiも使えるようだ。Poeは殆ど大抵のLLMがレートリミットなしで無限に使えるため、色々試してみるのも悪くないだろう。
投稿日:
こういうことを書くとやらなくなる気がしないでもないが、一応書いておく。
主に自宅サーバー環境の拡充、特に監視面と、adiaryを置き換えるブログシステムの開発を行っていきたいと考えている。
自宅サーバー環境の拡充
監視体制の強化
去年はOpenWrtによる自作ルーターの作成や、Mastodonの運用を開始したり、今ではApacheやMantisBTを運用するなど自宅サーバーはマルチテナントになってきたが、監視体制が足りていないので、これを作っていく。
ログやメトリクスを集めてアラートを出したり、ある程度は自動復旧できる機能が作れたり、パフォーマンス改善に生かせるとよいと思う。
権威DNSの作成
現在はValueDomainの権威DNSを利用してドメインを運用しているが、色々めんどくさいのでローカルでやりたい気持ちがある。このため自前でのDNS運用もやりたいと考えている。
何が面倒かというとValueDomainのAPIはDNSレコードを塊で渡してくるので操作するためにパースが必要だとか、特定条件下でTTLが3600秒に固定設定されるだとか面倒なのだ。
それに権威DNSを持つことが出来れば、出来ることが増えるかもしれないので、是非やっていきたい。
現状の知識としては権威DNSサーバーとしてはBINDが有名だが、BINDが過去のものになりつつある噂を見るくらいの状態だ。
adiaryを置き換えるブログシステムの開発
adiaryの改造に関しては過去何度か挑戦し、上手くいった事柄もあれば、いかなかった事柄もあり、今でも運用でカバーして苦労している部分が多い。
そこでadiaryの代わりになるブログシステムを作りたいと考えている。
重要視しているのは書式互換性と、データ移行の容易さだ。
私は過去に非常に多岐にわたるCMSの移行を経験していて、その都度やたら苦労している。
例えば直近ではWordPress→はてなブログ→WordPress→adiaryと移り変わっているが、はてなブログのWPインポート機能はイマイチ使い物にならず、手動で記事データの移行をする羽目になり、画像が多い記事など、アップロードやパス変換が手間である記事を中心に、多くの記事が失われたし、WordPressに戻るときも同様に失ったので、この二回だけで半数ほどの記事を失っている。
WordPressからadiaryに移行するときは手動と目検の気合で全ての記事を移し替えたが、手作業のミスや、adiaryが非対応の書式があるなどで書式が破綻している記事が今でも何個かあった気がする。先日重い腰を上げてadiaryのMarkdownパーサーを脚注記法に対応させたので、大半はマシになっているはずだが、記事によってはどうにかしようとして変なことをしたような気もしている。
古い過去でいえばMobavleType→Blogn→BlognPlus→SereneBatch→Sb→NuclearCMS→BlognPlus→WordPress→BlognPlus→BlognPlus→WordPressという壮絶な移行をしているが、この時は以降の都度過去を切り捨てていたように感じる。このブログに2018年以前のデータがないのはそういう関係もある。
というので、ブログシステムを移り変わるごとにやたら苦労しているので、次は苦労しないようにしたい。幸いadiaryはシンプルに見えるのでDBスキーマと添付ファイルの構造さえ一致させていれば行ける気はするので、そこまで苦労はしないだろう。きっと。そうだと思いたい(フラグ)
今構想している内容として、仕様面ではadiaryより大分簡素にする予定で、複数ブログ管理やマルチユーザーとかは想定せず、一人のユーザーが一つのブログを運用するという、至ってシンプルな方式にする予定だ。認証認可やパスワードリセットなど、機能のシンプルさはadiaryをリスペクトしていくつもりだ。
技術スタックとしてはPHP + SQLiteくらいの軽さで行こうと考えていて、レンタルサーバーでもキビキビ動くものにしたいと考えている。ライブラリは依存地獄の問題があるので、adiary同様に極力自力で実装していきたい。幸い今はLLMとかいう便利な道具があるので、これは比較的容易にできるのではないかと思ってる。あとPHPは標準機能が便利なので、恐らく広範にカバーできるだろう。
現時点では一旦DBスキーマだけ軽く作っているので、ここから表示部を作りこんでいき、Markdownやadiaryにある書式のパーサーを組み込んでいき、最終的に形にできればと思っている。
まずは動くものが欲しいので、デザイン調整UIとかは後回しにすると思う。
出費を抑える
去年は移動の連続やグッズ購入などが多く、出費が非常に嵩んでしまったので、今年はそれらをぐっと抑えていきたい。今年は年初からメインモニタが逝っていきなり金が飛ぶとかいう事故もあったが、特に何もなければ派手な消費は控え、質素に平穏にやっていきたいところだ…。
重い腰を上げてadiaryのMarkdownパーサーを脚注記法に対応させたでadiary-extendsのロゴを作ったが、SVGの中の文字をtextで書いていたため環境によってフォントが変わり上手く表示できない問題と、あと微妙に中央寄せになっていない問題があったので、それらを解決することにした。
作業にはInkscape 1.3.2 (091e20e, 2023-11-25, custom)を利用した。かなり古いが昔入れてそのままのやつだろう。
やったこと
- まずはInkscapeでSVGを開く

- 次にtextオブジェクトを選択し、メニューから「パス」を開き、「オブジェクトをパスへ」でパスに変換する。この作業でtextはパスに変換され、環境依存が解除される

- 次にはみ出ている「x」の右下の先っちょを削除する。
背景のrectと「x」が入っているtext2を選択した状態でメニューから「パス」を開き、「分割」する

- すると、こんな感じに分割される

- はみ出ている「x」の右下の先っちょを選択しDeleteキーを押下して削除する。

- 削除してきれいにまとまった図

- 最後にメインロゴの「a」を上下左右中央寄せするために「整列と配置」から基準を「ページ」に設定する

- 赤枠のボタンを押して左右中央寄せにする

- 保存する
- 出力されたSVGに大量のゴミが入っているので消す。
具体的にはSVGの表示に関係ないメタ情報や、元のSVGにあったフォントスタイル情報などを根こそぎ消す


できたもの
そして微調整後のPNGロゴとSVGコードが出来た。
<svg
viewBox="0 0 64 64"
width="64"
height="64"
xmlns="http://www.w3.org/2000/svg">
<path
d="m 33.767578,47.558594 c -0.618815,0.0061 -1.26569,0.2028 -1.939453,0.591797 -2.291357,1.322915 -2.73401,3.378215 -1.330078,6.164062 l 6.955078,-4.015625 C 36.35768,48.458753 35.128971,47.545259 33.767578,47.558594 Z"
fill="#899aff" />
<path
d="M 12,0 C 5.3520066,0 0,5.3520066 0,12 v 40 c 0,6.647993 5.3520066,12 12,12 h 40 c 6.647993,0 12,-5.352007 12,-12 v -4.310547 l -3.515625,2.03125 -6.660156,-3.064453 -0.728516,7.330078 -4.681641,2.703125 1.478516,-11.28125 -10.445312,-4.435547 4.925781,-2.84375 6.550781,3.001953 0.703125,-7.189453 4.695313,-2.710937 L 54.828125,42.394531 64,46.269531 V 12 C 64,5.3520066 58.647993,0 52,0 Z m 23.636719,43.931641 c 2.516946,0.111435 4.679689,1.732138 6.486328,4.861328 l 0.84375,1.460937 -11.109375,6.414063 c 1.99292,3.035172 4.679592,3.57617 8.0625,1.623047 1.768133,-1.020833 3.176063,-2.687757 4.222656,-5 l 0.148438,-0.08594 2.078125,3.599609 c -1.651207,2.035856 -3.409979,3.593752 -5.277344,4.671875 -2.940875,1.697915 -5.58565,2.292801 -7.935547,1.785157 -2.349897,-0.507645 -4.285809,-2.078733 -5.806641,-4.712891 -1.510415,-2.616116 -1.967927,-5.094297 -1.371093,-7.435547 0.591625,-2.350271 2.17313,-4.267579 4.74414,-5.751953 1.765878,-1.01953 3.403895,-1.496549 4.914063,-1.429687 z"
fill="#899aff" />
<path
d="m 50.067085,46.621735 -9.386449,1.655084 -0.819402,-4.647062 q -3.682702,4.488942 -6.228128,5.889732 -2.509225,1.426138 -5.555974,1.963362 -4.677837,0.824829 -8.287158,-1.648494 -3.614749,-2.504099 -4.455857,-7.274261 -1.063595,-6.031948 2.912289,-9.937943 4.006658,-3.911423 18.489236,-7.258394 L 36.56742,24.409727 q -0.591489,-3.354502 -3.165531,-4.455501 -2.574042,-1.100999 -7.898159,-0.162213 -3.631478,0.640327 -9.913646,4.60393 l -0.338528,0.05969 -1.318641,-7.478384 q 6.835972,-2.982363 12.621718,-4.002546 9.017146,-1.589966 13.533445,0.628236 4.541649,2.182001 5.659509,8.521701 z M 39.150362,39.5982 37.565822,30.61183 q -9.158461,2.408185 -11.209774,4.451688 -2.05674,2.012727 -1.552075,4.874824 0.537224,3.046749 2.379945,3.959379 1.842722,0.91263 5.320324,0.299434 3.662254,-0.645754 6.64612,-4.598955 z"
fill="#ffffff" />
<path
d="m 35.636719,43.931639 c -1.510168,-0.06686 -3.148185,0.410157 -4.914063,1.429687 -2.57101,1.484374 -4.152515,3.401682 -4.74414,5.751954 -0.596834,2.34125 -0.139322,4.819431 1.371093,7.435547 1.520832,2.634159 3.456744,4.205247 5.806641,4.712892 2.349897,0.507644 4.994672,-0.08724 7.935547,-1.785157 1.867365,-1.078123 3.626137,-2.63602 5.277344,-4.671876 l -2.078125,-3.599609 -0.148438,0.08594 c -1.046593,2.312243 -2.454523,3.979167 -4.222656,5 -3.382908,1.953124 -6.06958,1.412126 -8.0625,-1.623047 l 11.109375,-6.414063 -0.84375,-1.460938 c -1.806639,-3.12919 -3.969382,-4.749893 -6.486328,-4.861328 z m -1.869141,3.626953 c 1.361393,-0.01333 2.590102,0.900159 3.685547,2.740235 l -6.955078,4.015625 c -1.403932,-2.785847 -0.961279,-4.841148 1.330078,-6.164063 0.673763,-0.388997 1.320638,-0.585736 1.939453,-0.591797 z"
fill="#001382" />
<path
d="m 64,46.269531 -9.171875,-3.875 1.494141,-11.164062 -4.695313,2.710937 -0.703125,7.189453 -6.550781,-3.001953 -4.925781,2.84375 10.445312,4.435547 -1.478516,11.28125 4.681641,-2.703125 0.728516,-7.330078 6.660156,3.064453 L 64,47.689453 Z"
fill="#001382" />
</svg>
以前のtextだった時のものと比べるとパスデータになった関係でだいぶコードが増えているが、やむを得ない。以下は以前のSVGコード。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
<rect x="0" y="0" width="64" height="64" rx="12" ry="12" fill="#899aff"></rect>
<text x="18" y="52" transform="rotate(-10, 25, 62)" font-family="Meiryo, serif" font-size="64" font-weight="bold" fill="#fff">
a
</text>
<text x="25" y="55" transform="rotate(-30, 50, 50)" font-family="Meiryo, serif" font-size="32" font-weight="bold" fill="#001382">
ex
</text>
</svg>


