お知らせ

現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。
投稿日:ソフトウェア::Mastodon

ハマったので残しておく。

前提条件

  1. GitHubにMastodon本家をForkしたリポジトリがあり、そこをベースに運用している。
  2. git remote -vの状態が以下の通りで、origin/mainが本番運用ブランチ。
    mastodon        https://github.com/mastodon/mastodon.git (fetch)
    mastodon        https://github.com/mastodon/mastodon.git (push)
    origin  https://github.com/Lycolia/lycodon.git (fetch)
    origin  https://github.com/Lycolia/lycodon.git (push)
    

やり方

  1. マージブランチを作る
    git checkout -b merge-latest
    
  2. 本家を取ってくる
    git fech mastodon
    
  3. マージブランチにマージする
    git merge mastodon/main
    
  4. セットアップする
    # swich user
    sudo su - mastodon
    # install
    bundle install
    yarn install
    # DBがアカンことがあるので叩いておく
    RAILS_ENV=production bundle exec rails db:migrate
    # いつものリビルド
    RAILS_ENV=production bundle exec rails assets:clobber
    RAILS_ENV=production bundle exec rails assets:precompile
    exit
    # 再起動
    sudo systemctl restart mastodon-web mastodon-sidekiq mastodon-streaming
    
  5. 動作確認OKならgit pushしてGitHub上で自分のところのmainにマージする。デフォルトでは本家に向くので注意
  6. もう一度、前述4番のセットアップコマンド一式を流し、問題なければ終わり

トラブルシュート

正常に動いていない場合

ジャーナルを見てエラー原因を特定する。新規要素がらみのパラメーターが出てたらDBが怪しいのでRAILS_ENV=production bundle exec rails db:migrateで直る可能性がある。

sudo journalctl -u mastodon-web -f

If the version you need is missing, try upgrading ruby-build.といわれる場合

以下のコマンドを叩いてruby-buildを更新するといける

cd  "$(rbenv root)"/plugins/ruby-build
git pull

なんか昔のやり方が使えなくなってたので調べたメモ。

確認環境

Env Ver
OS Ubuntu 24.04.3 LTS
Docker version 28.1.1, build 4eba377
Docker Compose v2.35.1
Mastodonのバージョン v4.5.0-alpha.2
Mastodonのコミットハッシュ 06803422da3794538cd9cd5c7ccd61a0694ef921

手順

DEVELOPMENT.md#dockerの手順通りにやると行ける。

docker compose -f .devcontainer/compose.yaml up -d
docker compose -f .devcontainer/compose.yaml exec app bin/setup
docker compose -f .devcontainer/compose.yaml exec app bin/dev

コンテナへのアタッチ方法

# 方法1
docker compose -f .devcontainer/compose.yaml exec app zsh

# 方法2
cd .devcontainer
docker compose exec app zsh

VSCodeがあるならDockerやRemoteほげほげ系の拡張を使い、devcontainer-appにAttach Shellしてもよい。

検証ユーザーの作成

  1. 次のコマンドでユーザーを作る
    ./bin/tootctl accounts create hoge --email hoge@example.com --confirmed
    
  2. ユーザーの承認を行い、必要に応じてパスワードを使いやすいものに変更する
    rails console
    user = Account.find_by(username: 'hoge').user
    user.approve!
    # PW変更ここから
    user.password = 'password'
    user.skip_confirmation!
    # PW変更ここまで
    user.save!
    quit
    

フロントエンドのビルドとサーバー起動

bin/rails assets:precompile
bin/dev

トラブルシューティング

localhostではアクセスできるが、マシンのホスト名やhoge.testのようなローカルドメインでアクセスできない

.env.developmentALTERNATE_DOMAINS=hoge.testの行を追加することで他のドメインでもアクセスできる。

この設定があるとMastodonを別環境で動かしててリモートからドメインアクセスする場合に便利。

ActiveRecord::PendingMigrationErrorなど、ActiveRecord関係のエラーが出る

コンテナの中でrails db:setupを叩くことで解決する。

Unable to load application: NameError: uninitialized constant LetterOpenerWebというエラーが出る

リポジトリルートにあるdocker-compose.ymlを使うと発生するので、.devcontainer/compose.yamlを使う事で解決する。

あとがき

検証用にバニラなMastodon環境が欲しくて作ってみたが昔と変わっていて地味にハマった…。

投稿日:言語::HTML言語::CSS

こんな感じにフォーカスが当たるとOS標準の枠が出て、矢印キーの左右で選択状態を切り替えられる<input type="radio" />要素の作り方。

大まかには<label><input type="radio" /></label>の構造にして、UI上はラベルを疑似要素的に表示し、ラジオボタン本体はUI上見えなくするが、display: none;にせず、画面に残すことによってタブ遷移できるフォーカス可能要素として設計する内容。

サンプルコード

デモページ

CSS

/* ラジオボタンを等間隔に整列し、左右に余計な空白を持たせない */
.radio-container {
    display: flex;
    column-gap: 0.25rem;
}

.hidden-radio {
    /* チェックを消す */
    appearance: none;

    /* 非推奨要素を使っているが、iOS Safari対策 */    
    position: absolute;
    clip: rect(0, 0, 0, 0);
    pointer-events: none;
    
    /* デフォルトマージンがチェックボックスの位置にあるので消す */
    margin: 0;
}

.radio-label {
    /* 文字列要素を綺麗に中央寄せする */
    display: flex;
    justify-content: center;
    align-items: center;

    /* 枠装飾、基本的にフォーカス枠が角丸であり、違和感がないようにborderも角丸にしておく */
    padding: 5px;
    border: 1px solid #60bce9;
    border-radius: 4px;

    /* 見かけ上ボタンなのでカーソルをボタン用にする */
    cursor: pointer;
}

/* ラジオチェック時にラベルの背景色を変化させる */
.radio-label:has(.hidden-radio:checked) {
    background-color: #60bce9;
}

/* ラジオフォーカス時にラベルのフォーカス枠を出す */
.radio-label:has(.hidden-radio:checked):focus-within {
    outline: auto;
}

HTML

<form>
    <div class="radio-container">
        <label class="radio-label">
            <input name="r2" type="radio" class="hidden-radio" value="1" checked />
            <span>道明寺</span>
        </label>
        <label class="radio-label">
            <input name="r2" type="radio" class="hidden-radio" value="2" />
            <span>長命寺</span>
        </label>
    </div>
</form>
投稿日:技術::AI

久々にPC構成を大刷新してから三ヶ月ほど経過しているが、ローカルLLMを叩いたときのパフォーマンスが前回と比べてどれほど上がるか計測してみた。

環境の現新比較

デバイス 前回 今回
CPU Intel Core i7 13700 Intel Core Ultra 7 265F
GPU GeForce RTX 4070 Ti GeForce RTX 5070 Ti
MEM Crucial Ballistix BL2K16G32C16U4B(DDR4-3200 16GB) * 4 Crucial CT2K16G56C46U5(DDR5-5600 16GB) * 4
M/B ASUS TUF GAMING Z790-PLUS D4 ASRock Z890 Pro RS

ベンチマーク結果

前回はストップウォッチで計測していたが、今回はOpenWebUIのメタ情報から確認した。

gpt-oss:20b

指標
response_token/s 120.74
prompt_token/s 255.92
total_duration 22796593800
load_duration 11155098300
prompt_eval_count 73
prompt_tokens 73
prompt_eval_duration 285245200
eval_count 1371
completion_tokens 1371
eval_duration 11355103800
approximate_total 22s
total_tokens 1444

今回新規で追加。なんかこいつが標準っぽいので測ってみた。

gemma3:27b

指標
response_token/s 10.65
prompt_token/s 39.72
total_duration 85295369100
load_duration 4291682600
prompt_eval_count 13
prompt_tokens 13
prompt_eval_duration 327282600
eval_count 859
completion_tokens 859
eval_duration 80674730800
approximate_total 1m25s
total_tokens 872

前回は出力に3分半程度かかっていたが、今回は一分半程度と、良好な結果となった。

lucas2024/mistral-nemo-japanese-instruct-2408:q8_0

指標
response_token/s 51.88
prompt_token/s 127.3
total_duration 14512642900
load_duration 2966192400
prompt_eval_count 17
prompt_tokens 17
prompt_eval_duration 133547400
eval_count 592
completion_tokens 592
eval_duration 11411474600
approximate_total 14s
total_tokens 609

前回は出力に1分程度かかっていたが、今回は14秒程度と、非常に良好な結果となった。

qwen3:30b

指標
response_token/s 27.49
prompt_token/s 57.74
total_duration 134732866900
load_duration 64763725000
prompt_eval_count 14
prompt_tokens 14
prompt_eval_duration 242451700
eval_count 1917
completion_tokens 1917
eval_duration 69724445400
approximate_total 2m14s

今回新規で追加。悪くない品質で、そこそこ早いのでこれは良さそうだ。

qwen3:32b

指標
response_token/s 5.66
prompt_token/s 18.49
total_duration 332234237600
load_duration 9168679700
prompt_eval_count 14
prompt_tokens 14
prompt_eval_duration 757307500
eval_count 1823
completion_tokens 1823
eval_duration 322305287600
approximate_total 5m32s
total_tokens 1837

今回新規で追加。流石に秒間5.66トークンは厳しい。

雑感

前回と比べるとかなり高速化されており、生成速度だけを見れば十分実用ラインに上がっていているように感じた。しかし回答の品質がそこまでよくなく、そのままでは使えないと感じた。恐らくRAGなどとして使えるようにカスタムしてやっと使えてくるみたいなところがあるのだろうか?

実用性で見ると、日本語文書作成ではgemma3:27bが一番よさそうに思えた。これはqwen3シリーズは単純な質問では結構いい感じなのだが、複雑な条件を付けると期待通りの結果を出してくれなかったからだ。lucas2024/mistral-nemo-japanese-instruct-2408:q8_0も、一見よさそうに見えるがよろしくない発言はできないように細工されているようで、微妙に感じた。

何はともあれ、現実的な速度でローカルLLMが動くようになったのはうれしい。

投稿日:ネットワーク::IPv6

確認環境

NICはともに一つのみ。

  • Windows 11 Pro 24H2
  • Ubuntu 24.04.3 LTS

Windows

NICのIPv6アドレス(GUA)を取得する

コントロールパネルから取得
  1. コントロールパネル→ネットワークと共有センターを開く
  2. イーサネット→詳細を開く
  3. IPv6アドレスと書かれているのがGUA
コマンドプロンプトで取得

ipconfigを叩き、「IPv6 アドレス」と書かれているものがGUA

Powershellで取得
(ipconfig | Select-String -Pattern "IPv6 アドレス(?: .)+: (.+)").Matches.Groups[1].Value

Ubuntu

# perl版
ip -6 addr | grep 'global dynamic' | perl -ale '$F[1] =~ /^([^\/]+)/; print $1;'

# awk版
ip -6 addr | grep 'global dynamic' | awk '{ split($2, a, "/"); print a[1] }'