2026/06/17(水)Forgejoを設置して公開するまでをやったログと長いあとがき

ここしばらくGitHubに思うところがありすぎて、GitHubを使い続けることに悩ましさを感じていたが、折角自宅サーバーの運用が軌道に乗ってきたのだし、それならGitHubもセルフホストしちゃおう!というのでやってみたログ。

あとがきに熱が入りすぎて異様な長さになってしまったので、この記事はあとがきが本体な可能性がある。

構築条件

  • Dockerを使わずバイナリ直運用
  • nginxからのリバースプロキシ
  • 内部か外部かを問わずIPv6を使用する
  • unixsocketを利用する
  • GitのSSH操作にForgejo組み込みのSSHを利用する

確認環境

Env Ver
Forgejo 11.0.15+gitea-1.22.0

やり方

基本は公式のインストールガイドの通り。

  1. バイナリの配置~デーモンの配置を行う

    # Forgejoバイナリの入手
    wget https://codeberg.org/forgejo/forgejo/releases/download/v11.0.15/forgejo-11.0.15-linux-amd64
    # Forgejoバイナリの配置
    sudo cp forgejo-11.0.15-linux-amd64 /usr/local/bin/forgejo
    sudo chmod 755 /usr/local/bin/forgejo
    rm forgejo-11.0.15-linux-amd64
    # gitとgit-lfsのインストール(gitは既に普通あると思うが)
    sudo apt update
    sudo apt install git git-lfs
    # Git操作用ユーザーの追加
    sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' \
      --group --disabled-password --home /home/git git
    # Forgejoディレクトリの作成
    sudo mkdir /var/lib/forgejo
    sudo chown git:git /var/lib/forgejo && sudo chmod 750 /var/lib/forgejo
    sudo mkdir /etc/forgejo
    sudo chown root:git /etc/forgejo && sudo chmod 750 /etc/forgejo
    # Systemdの入手と配置
    sudo wget -O /etc/systemd/system/forgejo.service https://codeberg.org/forgejo/forgejo/raw/branch/forgejo/contrib/systemd/forgejo.service
    # デーモンの開始(設定ファイルとかを作らせるためにしている)
    sudo systemctl daemon-reload
    sudo systemctl enable forgejo.service
    sudo systemctl start forgejo.service
    # 設定ファイルのパーミッションを変える
    sudo chmod 640 /etc/forgejo/app.ini
    
  2. /etc/systemd/system/forgejo.serviceを開き[service]セクションに以下を追記する
    RuntimeDirectory=forgejo
    RuntimeDirectoryMode=0755
    AmbientCapabilities=CAP_NET_BIND_SERVICE
    CapabilityBoundingSet=CAP_NET_BIND_SERVICE
    
    下二行はケイパビリティの設定で、これをしておくと22番ポートが使えるようになる
  3. nginxからリバプロする

    server {
      listen [::]:443 ssl;
      server_name  git.example.com;
    
      ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
      client_max_body_size 100M;
    
      location / {
        proxy_pass http://unix:/run/forgejo/forgejo.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
      }
    }
    
  4. /etc/forgejo/app.iniを開き、適当に設定を書く。設定系はConfiguration Cheat Sheetに全部書いてある。

    # Webページのタイトルの一部が変わる
    APP_NAME = Forgejo
    # Webページのタイトルの一部が変わる
    APP_SLOGAN = Beyond coding. We Forge.
    # 実行ユーザー
    RUN_USER = git
    # 本番
    RUN_MODE = prod
    # 実行パス
    WORK_PATH = /var/lib/forgejo
    
    [server]
    # unixsocketを使う
    PROTOCOL = http+unix
    # Forgejoを置いているドメイン
    DOMAIN = git.example.com
    # unixsocketのパス
    HTTP_ADDR = /run/forgejo/forgejo.sock
    # unixsocketのパーミッション
    # www-dataがアクセスできるように666にしているがwww-dataをgitグループに入れてもいいかも?
    UNIX_SOCKET_PERMISSION = 666
    # 組み込みSSHを起動する
    START_SSH_SERVER = true
    # IPv6でListenさせる
    SSH_LISTEN_HOST = ::
    
    [repository]
    # リポジトリを格納するルートパス
    ROOT = /var/lib/forgejo/data/forgejo-repositories
    
    # アップロード制限、とりあえず公式のコピペ
    [repository.upload]
    ; ; max size for files to the repo via web interface, in MB,
    ; ; defaults to 3 (this sets a limit of about 4GB)
    FILE_MAX_SIZE = 4095
    ; ; by default 5 files can be uploaded at once, increase to 20
    MAX_FILES = 20
    
    # Gitのタイムアウト制限、とりあえず公式のコピペ
    [git.timeout]
    ; Git operations default timeout seconds
    DEFAULT = 3600
    ; Migrate external repositories timeout seconds
    MIGRATE = 6000
    ; Mirror external repositories timeout seconds
    MIRROR = 3000
    ; Git clone from internal repositories timeout seconds
    CLONE = 3000
    ; Git pull from internal repositories timeout seconds
    PULL = 3000
    ; Git repository GC timeout seconds
    GC = 600
    
  5. デーモンの再起動
    sudo systemctl restart forgejo.service
    
  6. https://git.example.comにアクセスし適当に設定する
    基本的に初期設定そのままで大きな問題がないものばかりだった気がする

  7. SSH鍵を作成し、Forgejoで自分のアカウント設定ページを開き、公開鍵を登録する

  8. クライアントになる環境にSSHに繋ぐための設定(~/.ssh/config)を書く

    Host git.example.com
      HostName git.example.com
      IdentityFile /path/to/forgejo.sec
    
  9. 疎通確認。WindowsでもLinuxでも同じ
    ssh -T git@git.example.com
    

GitHubのリポジトリを一括でForgejoに移行する方法

GITHUB2FORGEJOを使うとできる。

以下は移行のコマンド例。マニュアルが親切なのでマニュアルを読めばわかる。

一個でも外すとこのオプションどうする?と聞かれるが、何も指定しなければウィザードを流してくれるので、環境変数を指定せずに叩いても動く。

以下のコマンドではGitHubと決別し、完全にForgejoに移行する前提の設定としている。

wget https://github.com/PatNei/GITHUB2FORGEJO/archive/refs/heads/main.zip
unzip main.zip
rm main.zip
cd GITHUB2FORGEJO-main
GITHUB_USER=YourGitHubUserName \
    GITHUB_TOKEN=ghp_XXXXXXXXXXXXX \
    FORGEJO_URL=https://git.example.com/ \
    FORGEJO_USER=YourForgejoUserName \
    FORGEJO_TOKEN=XXXXXXXXXXXXXXXXX \
    STRATEGY=clone \
    MIRROR_DIRECTION=pull \
    PUSH_MIRROR_INTERVAL=8h \
    PUSH_MIRROR_SYNC_ON_COMMIT=no \
    MIGRATE_ARCHIVE_STATUS=yes \
    MIGRATE_FORKS=no \
    VISIBILITY=both \
    SORT=pushed \
    SORT_DIRECTION=desc \
    FORCE_SYNC=no \
    DRY_RUN=no \
    ./github-forgejo-migrate.sh

どうやらリポジトリ本体は持ってこれるもののIssueやWikiは持ってこれないようだ。

forgejo dump-repoというGitHub系サービスの中身をダンプするコマンドがあったので試してみたが、こちらは引っ張ってはこれるっぽいもののForgejoのDBやディレクトリ構造と合わないようで、移行用途では使えなかった。

gh repo list Lycolia --limit 1000 --json name --jq '.[].name' \
    | while read url; do
        echo sudo -u git forgejo dump-repo --git_service github --auth_token XXXXXXXXXXXXXXXXXX--clone_addr https://github.com/Lycolia/$url --config /etc/forgejo/app.ini --repo_dir /var/lib/forgejo/data/forgejo-repositories/lycolia/$url
    done

GitHubのアカウントエクスポートも試してみたが、中身が省略されているように見える.gitディレクトリの山がパッケージされており、ググった感じGitHub間のアカウント移行に使う物らしかったので、諦めた。

トラブルシュート

../ssh/ssh_graceful.go:25:listen() [F] Failed to start SSH server: listen tcp 0.0.0.0:22: bind: permission deniedというエラーが出る

/etc/systemd/system/forgejo.serviceを開き[service]セクションに以下を追記して再起動すれば治る。

AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

動作確認で起動と起動時のログ確認を同時にやりたい

動作確認時にデーモンの上げ下げしてジャーナル見るのが面倒なので、パッとやりたいときに便利なコマンド

sudo -u git /usr/local/bin/forgejo web --config /etc/forgejo/app.ini

あとがき

あとがきが長すぎて、実はこっちが記事の本体という可能性が…w

構築していて思ったこと

SSHの穴をあけるのは危険か?と思ったが組み込みのSSHであればgitユーザーが出来ること以外できないだろうし、任意のコマンドが実行されたところで、精々リポジトリの全消し以上のリスクはなさそうなので開けることにした。理由としてはHTTPはパフォーマンスが悪いらしいからだ。

構築していて思ったがForgejoのマニュアルは親切で比較的解り易く、構築が楽だったのが良かった。

unixsocketの利用について

積極的に使い始めたのはUbuntuのadiaryをlibfcgi-perlで動かす方法が初めてだが、unixsocketはTCP通信をしないのでポート管理が不要になるのが利点なのと、TCPのオーバーヘッドがない分処理が速いというのをどっかで見たので、使うことにした。

内部通信のポートが被らないように管理するのは地味に大変なのでアプリケーション間の通信は極力unixsocketに倒したいなと思った。

Forgejoを使おうと思った理由

GitHub周辺のセキュリティ事情の変化と、それに伴う対応

最大の理由は、ここ数年でGitHubやnpm周辺のサプライチェーンリスクを強く意識せざるを得なくなったからだ。

例えばSecrets漏れなどの事故はここ数年で非常に聞くようになったし、npmjsからGitHubのToken奪取などの問題もあったと思う。

そしてその関係でセキュリティが面倒なことになり、GitHub Actionsからnpm publish出来なくなってたのを対応したみたいなことをする羽目になったこともあり、非常に煩わしさを感じていた。

Value-DomainでcertbotのDNS Challengeをやるスクリプトを書き直した理由の一つも、npmjsから手を引きたい思いが実はあり、そもそも別にリポジトリから拾えばいいじゃんと思い、パッケージ化しなかったというのもある。だって別にPerlでもnpmレジストリに入れることはできるからね。

そして昨日npmjsのアカウントを消そうと思い立ちログインしようとしたらロックアウトされてしまった。私はホビープログラマとしてやっているだけなので、こういった変化についていくのに疲れてしまった。

GitHub離れの加速

例えば最近GitHub離れが進んでいることも理由の一つだ。

理由にはいろいろあると思う、例えばここ最近GitHubは不安定で、GitHub Actionsが失敗する、Webページが開けない、APIがダウンしているのは最早日常といってもいいだろう。少なくとも私はそう思っている。

他にもCopilotなどのAI化の推進や、UXの悪いPR、行儀の悪いソフトウェアの排除もある。

CopilotなどのAI化の推進についてはGitHubのWebページ上でコミットを打つと解るのだが、LLMによって勝手にコミットメッセージが補完される。あのメッセージに意図などなく、変更内容を文字列にしただけだ。これを避けるためにはAIが書き切るより早く書き起こしてコミットするか、或いは書き終わるのを待って上書きするか、何も考えず即座にコミットボタンを押しUpdate hoge.mdのようなメッセージにするかしかない。個人的にはこれが非常に煩わしく、避けたいと思っている。

そして、もしこれを回避する設定があるとしてもGitHubの設定は既に増えすぎており、もう探す気も起きない。

UXの悪いPRについては、PRを作ったときにベースリポジトリに更新が走ると更新するボタンが出てくるが、これを押すと中身のない空のマージコミットが作られることや、GitHubのバグとしか思えないよく解らない差分が出ることがあるのも挙げられる。こうやってやらなくていいことを増やすだけのシステムはUXが悪いと思う。

そして行儀の悪いソフトウェアの排除だ。行儀の悪いソフトウェアとは何かというと、もっぱら権利侵害を目的に利用されているのではないかと疑われているようなものである。

かつてGitHubでホスティングされていたyoutube-dlというソフトウェアがDMCA侵害でGitHubから消されることがあり、当時は結構騒がれた話だったと思う。その後、紆余曲折ありyoutube-dlは現在は再公開されているが、最近はほとんど更新されていない。恐らくフォークであるyt-dlpに開発が移ったと思われる。

そして今年に入ってからFAKKU, LLC大規模なDMCAを通告した。これによりGitHubから多くのダウンローダー系ツールが削除されて祭りとなった。

この対応を受け、gallery-dlはCodebergへの移行を決めた

個人的にはTwitterの画像を落とすのにHitomi-Downloaderをよく使っていたのだが、これもDMCAに含まれており削除の憂い目にあった。Hitomi-DownloaderはTwitterがXになり、APIが有料化してからもTwitterのメディアをバルクで落とせるので重宝していた人が多くいたと思う。なおHitomi-Downloaderについては移転したとかはなく、単に消えてそうだ。バイナリはググれば出てくるが、APIが変わってるので、もう動かないと思う。余談だが、現在Twitterの画像をバルクで落とせる無料のソフトウェアはgallery-dlくらいだと思う。

また前述したGitHubの不安定さや、AIの存在を理由にGitHubを離れたものとしてプログラミング言語のZigがある。ZigはGitHubの現状に失望し、痛手を負ってでもCodebergに移行した。現在のGitHubは更新されておらず、移行のメッセージが残されている

また玄人向けのLinuxディストリとして知られるGentoo LinuxもGitHubのLLM方針に反発し、Codebergへの移行を発表している。

Gentooの2025年振り返りでは、「Goodbye Github, welcome Codeberg」という言葉も見られ、Planet Gentooでは開発者からLLMに対する鬱憤ともいえる批判が多く寄せられている。

個人的に強く共感したものには次のものがある。

They start using LLMs because they don’t want to maintain their code anymore. Software turns into slop, which burns out even more people.
(ja: 彼らは、もうコードのメンテナンスをしたくないという理由で、LLMを使い始める。その結果、ソフトウェアはずさんなものとなり、さらに多くの人々が燃え尽きてしまう。)

LLMを使う理由はコードを書きたくないから、メンテしたくないから、動いている風に見えればよいからだというのは私も思う。バイブコーディングで出てきたものがまともに動く保証はない。

公私ともにLLMを使ってコーディングしているが、本当にそう思うし、仕事ではLLMに毒されすぎたのか判断能力を失ってしまった人も見かける。

Gentoo aims to be made by humans

We banned LLM contributions two years ago, and never regretted it. We didn’t “wait and see”, we took decisive action, and if we got left behind, it’s only for the better. I can’t give you a 100% guarantee that no tainted code slipped through, but we’re doing our best to stay vigilant. In the end, it’s all about trust, and trusting one another is what builds our community.
(ja: 私たちは2年前にLLMによる投稿を禁止しましたが、その決断を後悔したことは一度もありません。「様子を見る」のではなく、断固たる措置を講じました。もし他者に遅れをとったとしても、それはむしろ良いことなのです。不適切なコードが混入していないことを100%保証することはできませんが、私たちは警戒を怠らないよう最善を尽くしています。結局のところ、すべては信頼にかかっており、互いを信頼し合うことこそが、私たちのコミュニティを築き上げるのです。)

この人間らしさには非常に共感した。特に「もし他者に遅れをとったとしても、それはむしろ良いことなのです。」の部分だ。誰かより早くある必要はない、誰かと比べて遅れていても問題ではない。何故なら競技ではないし、そもそもベクトルが違うと私は思う。

他にもAutodesk Fusion 360 for Linuxも同様の理由でCodebergへの移行を行い、GitHubは既にアーカイブされている。

GitHubでホストする意味がなかった

lycolia.info、つまりサイトトップを触っていて思ったのだが、自分が作ったソフトウェアを見てもらうのに外部サイトにアクセスしないといけないというのが癪だと思った。

ソフトウェアの配布なら最悪自分のサイト上でzip配布でもすりゃあいいじゃんという話だ。

ただまぁ事はそう単純でもなく、リポジトリをWebサイトに置いておくと、出先でちょろっといじりたいとか、テキストとして転がして置き、会社のPCでコピペしたい[1]みたいな絶妙な需要を満たせるので、セルフホストでかつ、GitHubの様な機能を満たせるものというところでForgejoを採用したのである。

勿論、先述したようなGitHubへの信頼性問題もあるが、私がDMCAでどうにかなる可能性は今のところないので、まぁ宗教みたいな話ではある。

そういえば以前WSL2のUbuntu 20.04にGiteaを生やすという記事を書いたし、Giteaにはコントリビュートしたこともあるが、GiteaのフォークであるForgejoでこんなことを始めるとは夢にも思わなかったので、めぐりあわせだなぁと思うのであった。

GitHubの個人用アカウントと業務用アカウントがどうのこうのを解決する糸口として

業務用と個人用でGitHubの無料アカウントを分けるは、このブログで二番目にアクセスの多い記事だが、Forgejoに完全に移行すれば、こういったことも解消できる。

なお現状ではGitHubのアカウントそのものはOSSのコントリに使うことが稀にあるため保持しておくつもりだが、いつ消し去っても良いくらいの温度感では持っておきたい所存である。

Forgejoに対する思い

分散型という諸刃の剣

Forgejoは、その構造上、各ホスト上でアカウントを作らないとコントリビューションができないと思うので、特定のプラットフォームからの支配や思想を回避できるのが利点だが、同時に欠点だとも感じている。

端的に言うとそれぞれのForgejoサーバーには何ら繋がりがない。あるForgejoサーバーでアカウントを作ったとしても、別のForgejoサーバーでは使えない。これはForgejoサーバーが増えれば増えるほど難しくなっていく問題かもしれない。私の様なサーバーでは問題にならないので別にいいが…。

但しFediverseにあるActivityPubのようにオープンプロトコルを作り連合を作る計画はあるようで、将来的には各ホスト同士での疎通が実現するかもしれない。

とはいえ、連合は連合で問題である。Fediverseも連合制をとっていて様々なサーバーが連合しているがMastodonとMisskeyには互換性の問題があるし、連合は数が増えれば増えるほど負荷が大きくなる問題もある。例えばA Forgejoサーバーの変更が10の連合先に伝播し、そこから更に各サーバーの先にある10に連合…となれば伝播する時間もリソースも無駄になってくる。

設計次第ではあるものの相互に繋がった数千のサーバーがやり取りを始めたらDoS攻撃に匹敵する負荷が発生するかもしれないし、様々な分散サーバーに同一の情報が保存されるのはストレージの無駄である。

この辺りはMisskeyの開発者であるsyuiloさんや、.ioの運営者である村上さんも話しているし、連合のコストについてはfedibird管理人ののえるさんも話している

分散型はプラットフォーマの支配を受けず、独自性を出しやすい代償に、スケールしづらいのだ。ただ、DMCAの通報がされるようなソフトウェアにとってはそっちの方が都合がいいかもしれない。とはいえ、GitHubにBANされなくとも、次はAWSやVPSからBANされたり、ドメインが差し押さえられたり、自宅サーバーであってもISPから契約解除されるなどのリスクはあるので、程度問題ではある。

そういえば、この手の話をまさにしているスレッドがRedditにあったので、記録に残しておく

今回設置した物体が見れる場所

エクスプローラー - LycoGit: Lycolia's Git Hostingで公開リポジトリの一覧が見れる。

ドメイン直下にアクセスすると「自分で立てる、超簡単 Git サービス」という強めのおもしろアピールが出てくる。

今のところはGitHubのリポジトリを丸ごと移しただけなので、中身的には同じものである。


  1. こうしておくと変なセキュリティにかからず、情報漏洩にもならず仕事で合法的に自分が過去に書いたコードを使えるのだ

2026/06/16(火)今日のサイト改築の話 第四話

投稿日:

今日のサイト改築の話とかadiary改造の話とかの続き。5日ぶりの更新。

トップページのスリム化

単純比較するための画像をとってなかったので、画像では前回と今回の比較となっている。

トップページのバナーリンクからページ説明を削除

改修前 改修後

前のレイアウトではバナーリンクの下に説明文を書いていたが、別に自明だなと思ったので消した。

これによってSPビューで1画面に出せるリンクの数が1.3倍くらいになったのでだいぶ良かった。

トップページから更新履歴を削除

改修前 改修後

「このサイトの歴史」の部分を削除した。削除したものは後述する「更新履歴ページ」に移設している。

このサイトについてページの作成

このサイトについてページを作成した。内容的にはこのブログにある「このサイトについて」と大差ない内容だ。

比較的シンプルなページであることもあり、それなりにスタイリングしている。今後はこのスタイリングをベースに全体展開していきたい感じだが、まだ詰め切れていないので一旦仮である。

更新履歴ページの作成

こんな感じの更新履歴ページを作成した。

内容的にはトップページ下部にあった「このサイトの歴史」にある更新履歴ボックスの中身の移植だが、以前は<pre>を使ったプレーンテキストだったのを<section>, <h3>, <ul>, <dl>などを使うことでセマンティックなものに変更している。ほぼ手動で移植しているので、微妙に壊れている可能性がある。

スタイリングはほぼ皆無だが、全体方針が決まったら当てていきたい。それなりの構造にはしてあるので、比較的容易に反映できると思う。

更新履歴を別ページに分離するアイデアはフィーネ・ラグザスさんのFeathery Instrumentのサイトの作りから着想を得ている。

余談だがFeathery Instrumentは古のサイト探究~駄文同盟のID上位100サイトを巡り、今までのネット人生や自サイトの過去を振り返ってみるでは以下の状態で、消滅サイトの側のカウントだったが、現在は精力的に更新されている。

ID 駄文同盟ID存在 バナーファイル存在 サイト存在 サイト更新有
72

サイトリンクバナーの更新

旧バナー 新バナー

今までフォントサイズの都合で正式なサイト名をフルで入れられてなかったのだが、フルで入るようにレイアウトの見直しを行った。

ブログリンクバナーの更新

旧バナー 新バナー

同時にほぼ同じデザインだったブログ側のバナーも変えた。

Apacheの廃止

変更前の構成 新しい構成

HTTPDからApacheを排除し、nginxに一本化した。

一本化した主な理由は以下の通り。

  • nginx→Apacheのリバプロをしている時にApache側でリダイレクトされるとTLS証明書がエラーになることがある
  • FluentBitでログをパースしてると複数行エラーが別のログ扱いで分割してLokiに入ってくるのですごく読みづらい
  • 設定ファイルの管理に疲れた
  • 動かしてるものが増えるほど脆弱性も増えるので減らすに越したことがない
  • try_filesに慣れすぎてModRewrite書きたくなくなった

あとがき

サイトレイアウトやコンテンツ配置的にちぐはぐな部分が多く残るが、いったん大まかな整理としてはこのくらいとして、細かい部分は気が向いたときにちまちま直していければと思う。

次に何をしていくかについては決まり切っていないが、大きく次のうちのどれかをやっていくと思う。

  • 溜まりすぎているブログネタの消化
  • Webalizerに代わるサーバーログ集計ツールの作成
  • adiaryの置き換えになるCMSの作成

2026/06/14(日)Xperia 1 VIIIを買った話

投稿日:

これまでXperia 1 VIを使っていたが2年経ったし買い替えるかというのでXperia 1 VIIIを買った話。

開封の儀

左がXperia 1 VIの箱、右がXperia 1 VIIIの箱だが、なんかしょぼくなった気がする。税込み272,910円もする製品の箱とは思えないレベルだが、エコロジーの観点からみると妥当かもしれない。

開けてみても見事に何の変哲もない箱である。

裏面はカメラの配置が1 VI, 1 VIIと異なり、1VIIIではiPhone的な配置になっている。

使ってみた感想

正直特に変わりはわからないレベル。望遠レンズがよくなっただけあって望遠撮影時の画質が良くなった気はするが、元々ズームをあんまり使っていなかったので違いはよく分からない。

AIカメラアシスタントというのも撮影時にプリセットのエフェクトの加工案を出してくるだけで、AIでも何でもない。邪魔なUIが増えただけに近い。

音はよくなったような気もするが、これも錯覚かもしれない。

SIM/SDカードトレイは尋常ではない頑丈さになり、爪で開けなくなった。つまようじがへし折れるレベル。開けるには精密マイナスドライバーが必要だった。

撮ってだしの写真たち

写真モード、ウルトラHDRオフ。

一枚目が写真モードでウルトラHDRオフ、二枚目がオン。二枚目の方が人間が見た色に近い。

一枚目が写真モードでウルトラHDRオン、二枚目がプロ写真で蛍光灯+ウルトラHDR+コンピュテーショナルフォト。二枚目のほうが人間が見た色に近い。

カメラアプリの使い方はこれまでとあまり変わらなさそうな気配を感じた。

個人的に日中の屋外は写真モード、室内や夜間はプロ写真で蛍光灯というのをXperia 1 VIだとよくやっていた。更にLED電光板や星空を撮るときはシャッタースピードを調整する感じ。

この使い方は1 VIIIでも変わることはなさそうだなと思った。

一枚目が写真モードでウルトラHDRオン、二枚目がプロ写真で蛍光灯+ウルトラHDR+コンピュテーショナルフォト。

写真モードは白飛びが酷くて使い物にならない。

これはプロ写真で蛍光灯+ウルトラHDR+コンピュテーショナルフォト。

普通に夜景を撮影する分には基本的に白飛びするのでXperia 1 VIからの進歩は特にないように感じた。

最後にプロ写真で蛍光灯+ウルトラHDR+コンピュテーショナルフォト+140mm。

明るい時に撮らないと何とも言い難い感じだ…。

価格コムのレビューを見る感じ、広角はレンズやセンサーのスペックは変わらないもののノイズが減っているらしい。望遠も色味が良くなってるのかな?

ケースについて

本製品のケースはその多くが凹凸にあるものとなっており、机の上に置くとガタガタして使いづらいと思う。SpigenのXperia 1 VIIIケースでさえ凹凸がある。これだと、ちょっと今回は避けたい感じだ。

私は昔はZEROSHOCKを使っていたのだが、HUAWEI P30 ProにZEROSHOCKが対応しなかったため、それからはSpigenを買っていた。しかし今回はZEROSHOCKが対応している上、Xperia 1 VIII用のZEROSHOCKは背面の凹凸が少なめになっていることので、これを選ぶことにした。

この写真はヨドバシ梅田に展示されていたXperia 1 VIII用のZEROSHOCK実物を見て確認してきたものだ。

Spigenのケースは頑丈に作られているがZEROSHOCKほど極端な防御構造を持たないため、角を強く打つと本体に凹みや傷が入ることがあり、そこがイマイチだと思っていたので、今回ZEROSHOCKに変えられるのも良い部分だとは思っている。

過去の実績だと京阪京橋駅の階段を数十段転げ落ちても何ともなかった実績があるので、私はZEROSHOCKを信用している。また、フロントバンパーもSpigenより厚みがあるので、表面を下にして落とした時もSpigenより画面にダメージが入りづらいといえる。

そして何よりSpigenのケースはAmazonにしかないが、ZEROSHOCKは他にもあることだ。

例えばSpoigenのケースはAmazonだと「6月20日-7月16日にお届け」となっており、この期間裸で運用するとなるとつらいものがある。同様にZEROSHOCKもAmazonでは6月24日-7月17日となっていて厳しさを感じるし、ヨドバシでも品切れになっているのいるだが、なんとビックカメラには在庫がある。つまりすぐに手に入れられるのは強みだ。

といっても実店舗だと北海道と新潟と福岡と鹿児島くらいにしかないので通販で買うしかないのだが、それでも今のところ三日以内に出荷となっているので、かなり現実的な選択肢だ。

とはいえその間裸で運用するのも厳しいので、ラスタバナナの1100円くらいのケースを買って糊口を凌ぐこととした。安いケースでも画面とカメラ周りには高台がついており、机の上でこすった時などに付く傷を防げるので十分有用だ。流石に地面に落としたら一貫の終わりだろうが、通常のユースケースではこれでも十分だろう。

しかしXperia 1 VIIIのケースはググってもAmazonで検索してもSpigenもZEROSHOCKもまともに引っかからず、ZEROSHOCKについては、エレコムの公式サイトにもECにも載ってない有様なので。何とも探しづらい商品になっていてXperia 1 VIIIの置かれている状況の厳しさを感じた。

しかしZEROSHOCKをつけた場合胸ポケットに入るのかや、お風呂スマホケースに入るのかがやや心配だ。もし無理だったらSpigenに変えることも考えておこう…。

あとがき

ここ数年のAndroidスマホ全般を見るに、お世辞にもまともにスペックアップしているとは思えないので、次の買い替えは四年後でもいいかなと思った。

ひとまずXperia 1 VIIIはこれまでとデザインが大きく変わり、所有欲を満たしてくれるという意味ではよいと思う。しかし1 VIと比べたときに大きな進歩があるわけでもないどころか、使い勝手は微妙になった気さえするので、特に理由がなければ買い替える必要はないと思った。

ただイヤホンジャックとSDカードトレイがある機種は貴重だし、Samsungのように削除不能な変な翻訳ソフトや、奇妙なふるまいをするSamsungブラウザはついてないし、PixelのようにGoogleにロックインされることもない、日本メーカー製なのでFeliCaがついているなどのこだわりがあり、好きな人にはハマる端末だとは思うので、これまでXperiaを使ってこなかったけど使ってみたい人には悪くない端末だと思う。

他にもベゼルが残っており、カメラのパンチホールが気にならないといったポイントもあり、Xperiaシリーズのこだわりは語れば限がないほどだ。単に1 VIから大きな進歩がないというだけで、端末の出来自体は決して悪くない。1 VIの初期[1]にあった暗所での画面のちらつきも1 VIIIでは当然起きてないし、物理シャッターボタンがあり、押せば即座にカメラが使えるなど、便利なところも数多くある。

店頭で買おうとすると店員から「正気ですか?やめたほうがいいですよ!」とか言われてしまうほどの端末だが、だからこそ買う価値があるともいえる、それがXperiaだ。


  1. ファームウェアアップデートで改善されているため今は起きない。元々は明るさ自動調整機能がへぼかったせいで起きてた

2026/06/11(木)今日のサイト改築の話とかadiary改造の話とか

更新日:
投稿日:

昨日に引き続き、今日もサイト改築をしていた話の続き。

本体サイトの改築

自己紹介ページのSNSリンクの縦のがたつきを修正

昨日時点だと縦軸にがたつきが出ているが、これを修正した。深いことを考えずやっているので表示が崩れるパターンもありそうだが、気にしないでおく。

昨日時点 本日の修正後

トップページのバナーにマウスオーバーしたときに色が変わるように

地味だがこっちのがUXはよい。

他にも地味だが、外枠が黒なのは強調が強すぎると思ったので、ついでに枠の色を薄くしたほか、枠と中身のpaddingに当たり判定がなかったので、全体に当たり判定が出るように埋めた。

リンクページでもバナーホバーで色が変わるように

画像バナーだとこんな感じ。

テキストバナーだとこんな感じ。

サイト編集が楽になるように実装コードを修正

lycolia.info配下はすべてPerl CGIで実装しているが、ヒアドキュメントにシンタックスハイライトが効かずtypoに気づきづらい問題があった。

しかしヒアドキュメントの文字をHTMLにするとハイライトが効くことに気づいたので直した。

HTMLでも'HTML'でもどちらでも効くのがありがたい。しかし'HTML1'とかにするとダメになるのがイマイチだ。HTML1はいけるのに…。

試してみたところ、このテクニックはPHPでも有効だった。

どうでもいいが、この画像の実装はPerl CGIにする前のものなので今は使っていない。

adiaryの改造

前々からadiaryに情報バナーがないのが不満だったので、これを実装することにした。

切っ掛けとしてはLatitude 7350のCPUクーラーマウンタ用のネジ穴とラズパイクーラーのネジ穴メモの記事を書くときに使いたかったのがある。

実はこの手の表示自体は過去記事にも存在するのだが、記事ごとにHTMLを手書きしていてよくなかった。手書きだと毎回スタイルが変わってしまうし、一元的な変更もできないからだ。

adiaryには記法タグという、記法を拡張できる機能があるのを知っていたため、これを使うことにした。

そこでまずadiary本家の記法タグを定義するを真面目に読むことにした。実はこのページは過去に何度か読んでいるのだが、意味が理解できていなかった。

まず記法タグの定義の基本はこれだが、これは忘れていい。

google  = Google検索,       UTF-8,  http://www.google.co.jp/search?lr=lang_ja&ie=utf-8&oe=utf-8&q=
keyword = はてなキーワード, EUC-JP, http://d.hatena.ne.jp/keyword/

意味的にはこんな感じである。

TAG = 説明文, 文字コード, URL

今回使うのはこっちだ。

mtex = mimeTeX, ASCII, 1, <img src="$0mimetex/mimetex.cgi?$1" alt="$1" class="tex">
test = block-tag-sample, ASCII, 2, block:
<table>
<tr><th>#1</th><td>#2</td></tr>
</table>

こちらの意味はこんな感じである。

TAG = 説明文, 文字コード, 引数の数, URL | HTML | block:
  • TAGは記法に使うタグの名前だ。例えばhogeとした場合、[hoge:]となる
  • 説明文はタグの説明文だが、画面上に出てくるものではないので意味が分かるものを適当に書いておけばいいだろう
  • 文字コードは値をURLエンコード時に使われるものらしいのでURLエンコードしないなら何でもよいと思う
  • 引数の数は渡す引数の数だ。[hoge:aaa]なら1[hoge:aaa:bbb]なら2になる
  • 最後のURL | HTML | block:は置換に使う文字列なのだが、<で始まればHTML置換として、そうでなければURL置換としてアンカータグを出力するっぽい?
    • block:を指定した場合は複数行書くことができる。但しこれは可読性のためであって、実際のHTML出力は一行になるようだ
    • また実際に渡す引数そのものには一行しか指定できないと思われる

というので、以下の記法を定義してバナーを出せるようにした。

info = 情報バナー, UTF-8, 1, block:
<div class="notice_banner info">
    <div><svg width="25" viewBox="0 0 24 24" aria-label="fontSize small"><path d="M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8"></path></svg></div>
    <div class="message">#1</div>
</div>

warn = 警告バナー, UTF-8, 1, block:
<div class="notice_banner warn">
    <div><svg width="25" viewBox="0 0 24 24" aria-label="fontSize small"><path d="M12 5.99 19.53 19H4.47zM12 2 1 21h22zm1 14h-2v2h2zm0-6h-2v4h2z"></path></svg></div>
    <div class="message">#1</div>
</div>

error = エラーバナー, UTF-8, 1, block:
<div class="notice_banner error">
    <div><svg width="25" viewBox="0 0 24 24"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m3.59-13L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41z"></path></svg></div>
    <div class="message">#1</div>
</div>

出てくるバナーはこんな感じ。

で、標準であった方が便利だろうというので私以外誰も使っていないであろうadiary-extendsの標準機能として取り込んだ。

なお、この時すでにwarnが記法として組み込まれていたため削除している。

あとがき

今日は他所事に手が伸びてしまい、これまでのように大きな対応は出来なかったが、締め切りがあるわけでもなければ、一応最低限は見れるので、改築はのんびりやっていこうと思う。

あとadiary-extendsは結構手を入れていて、個人的には本家より便利になっていると思う。

特にコピペで画像をアップロード可能にしたり、Markdownの脚注書式に対応したり、アップロードを許可する拡張子にapngとwebpを追加を追加したりしているので、これだけでもだいぶ使いやすくなっているはずだ。他にも個人的に欲しいと思った機能をそこそこ入れてるので便利になっていると思う。詳細はGitHubにあるadiary-extendsの主な変更点にも書いてあるが、現状の対応は以下のような感じである。

閲覧画面

  • [v0.1.0] RSSアイコンの画像を80x15ブリリアントバナーにした
  • [v0.3.0]テーブルが記事幅を超えた時に横スクロールできるようにした
  • [v0.5.0] OGPのメタタグがUAによらず無条件で出力されるようにした
  • [v0.6.0] Syntax HightlightをPrism.jsにした
  • [v0.9.0] 画像に代替テキストを設定していない場合(画像ファイル名そのままの場合)、代替テキストを出力しないようにした(alt, titleを空文字設定)
  • [v0.9.0] Lightbox2をFancybox v3.5.7に置き換えた
  • [v0.13.0] 投稿日と更新日を両方出せるようにした
  • [v0.21.0] IPv6のコメントのホスト名が不正になる問題の対応(例えばOCNからなのにawsのホスト名になったりする)
  • [v0.25.0] 作成した記事のIDが500, 600, 700などでキリがいいときに、一つ前の記事への参照リンクが生成されない問題の修正

編集画面

  • [v0.1.0] クリップボードから画像をアップロードできるようにした
  • [v0.2.0] 任意の画像をOGPに設定可能にした
  • [v0.22.dev-1] デフォルトでアップロードを許可する拡張子にapngとwebpを追加

Markdown

  • [v0.1.0] Markdownで2スペースインデントでリスト記法が機能するようにした
  • [v0.7.0] Code spansで連続したバックスラッシュが正常に表示されるようにした
  • [v0.8.0] [text](<https://example.com/hoge_()>)が機能するようにした
  • [v0.9.2] Markdown記法でthとtdの最終要素のスペースがトリムされず、そのまま出てくる不具合の修正
    • Prettierなどで自動整形しているMarkdownの場合、|_hoge________|のようになる(現時点でのadiaryの都合で半角スペース連続がトリムされたためアンダースコアで半角スペース表現を代替している)が、この後ろにあるスペースが全部HTMLのtdに出てきて、文字列を選択するときに不便だったため
  • [v0.16.0] Markdownの脚注書式に対応
  • [v0.23.0] Markdown記法で->が含まれているときにパースが壊れる問題の対応

特殊記法

  • [v0.26.0] 情報・警告・エラーの三種類のバナー記法を実装
    [info:これはお知らせです。]
    [warn:これは警告です。]
    [error:これはエラーです。]
    
  • [v0.26.0] 元々存在していたwarn記法の削除。↑の記法と衝突していたため

デザイン

  • [v0.4.1] テンプレート変数でHTTPリファラを使えるようにした
  • [v0.6.2] lycoテーマの追加
  • [v0.24.0] HTTPS->HTTPのリバースプロキシ時にOGのURIスキーマがHTTPSにならない問題を対応

その他

  • [v0.15.0] RSSフィードのURLにハッシュリンクがつかないようにした
    • ブログ村で同一記事が複数登録されることがあったため

あとがきのあとがき

しかし今月は記事を出す勢いが激しすぎて、まだ6月11日だというのに、この記事を含め23記事も書いてしまっている。一日二記事を超えるペースだ。

この調子で行くと月間執筆数過去最高の2025年3月の35記事を超えてしまいそうである。

2026/06/11(木)Latitude 7350のCPUクーラーマウンタ用のネジ穴とラズパイクーラーのネジ穴メモ

投稿日:

この記事は素人が測定したメモ書きなので参考にして何かあっても知りません。

図面に書いてある図形の位置や大きさと実際の位置と大きさには相関がない。どこまでの距離かを解りやすくするために適当においてるだけ。

Latitude 7350のCPUクーラーマウンタのネジ穴とネジ穴からヒートスプレッダまでの距離

この部分の寸法。

GeeekPi ICE Tower Plus Cooler Raspberry Pi 5 アルミニウム アクティブクーラーのネジ穴と周辺の寸法

この部分の寸法。

あとがき

R86S U1を冷やそうとした作業の残渣もそうなのだが、測ったはいいものの、クーラーを取り付けるマウンタをどう作るかが問題なんだよな…。