Ubuntu 23.04への式年遷宮 トラブル録

普段はLTSしか使わないのだが、なんかやりたい気持ちになったので珍しく奇数系を入れてみた。

https://www.ubuntulinux.jp/News/ubuntu2304-ja-remix

をUSBメモリに焼いて(今はUbuntu公式でもEtcher使えって書いてるんですね、昔はUbuntuにUbuntuのイメージを焼くためのソフトウェアが付属していた気がするが)、PC再起動。

インストールの手順については、特に変化はなさそう。今回はLVM使用、ディスク暗号化をつけてみた。

gnome-text-editorで日本語入力できない

毎度の鬼門(と言いつつ、熱心な日本Ubuntuユーザーが結構情報を残してくれているので言うほどではない)。こちらのページが参考になった。

https://www.kkaneko.jp/tools/server/gnome_ja_input_method.html

注意点として、23.04では(正確には22.10から)はgeditに代わってgnome-text-editorというソフトウェアが入っている。こいつがfcitxとの相性が悪いのか、日本語変換が一切効かない(日本語入力モードに入れない)。シェルから開いてみるとこんなエラーメッセージが残されていた。

(gnome-text-editor:9858): Gtk-WARNING **: 03:13:56.134: No IM module matching GTK_IM_MODULE=fcitx found

意味はよくわからないのだが、fcitxを使えと言われているがgnome-text-editorがそれを理解できていないように見える。実際にはgnome-text-editorのリポジトリにこのようなエラーメッセージはなさそうなので、GTK自体に何らかの問題があるのかもしれない。

20230507追記

fcitxじゃなくてfcitx5を入れると問題が起きなかった。

vscodeで日本語入力時に確定するまで文字が表示されない

確定するまでは変換ボックスを見ないと入力中の文字が確認できず、Enterで確定すると一気にエディタ上に文字が追加される状態になった。これはUbuntu Softwareからデフォルトのsnapで入れていたのが悪いので、消してdebで入れ直したら直った。

bluetoothヘッドホンで音が鳴らない・途切れる・汚い

Linuxでbluetoothヘッドホンを使うのはコツがいる。僕が使ってるのはWH-1000XM4ね。

まず音が途切れるのはドライバのバッファリングが下手くそなせいなので、pavucontrol→出力デバイス→WH-1000XM4→高度な設定でLatency offsetを10msくらいにしてやる。ほんの少しでも設定してやるといい感じになる。

音が汚いのはコーデックがHSPになっているから。bluetoothヘッドホンの通信コーデックにはA2DPとHSPがあり、前者は聞く専用で高音質、後者はヘッドホンの付属マイクからの音声入力も可能だが音質は悪い。なのでA2DPに設定してやることで解決(これはbluemanからでも標準のbluetooth設定からでも、たぶんCLIからでもできる)。

音が鳴らないのは今回初めて遭遇した。HSPでの接続は可能だったがA2DPが選べなかったり、A2DPにすると音が鳴らなくなったりした。これは理由が不明だが、ペアリング直後にbluemanからA2DPに設定してやることで解決した。

ストレージデバイスのマウント

今回はなるべくGUIでやっちゃうのを目標にした。普段はストレージデバイスのマウントは/etc/fstabを手で編集してやっているが、今回は「ディスク」から。デバイス→パーティションを選択して、歯車マークのメニューから「マウントオプションを編集」でGUIからマウントを設定できる。ここで設定した内容がfstabに書き込まれていた。

やはり奇数系のUbuntuを使うのはエキサイティングだ。時間のあるときに限るが、楽しいんだこれが。

サーバーゼニ節約&kubernetes入門

ふと毎月のサブスク費用を確認したらAWSとさくらインターネットで月額5000円くらいかかっていて、いくらなんでも辛いのでこれを圧縮する。

原因は必要以上に多くのサーバーを稼働していること。現在稼働しているのは3つ。

さくらインターネット 2GB

  • 1738円/月
  • 2017年から借りており、中途半端な技術的挑戦の残骸が最も多い
  • 金額に対するスペックが良い

積載物

AWS EC2 t2.micro

  • 1544円/月

積載物

AWS EC2 t4g.micro

  • 1076円/月
  • AWS謹製のGravitonプロセッサなので安くて高性能。ただしArm。

積載物

  • gotosocialインスタンス

移行計画

どうしたものか…

とりあえずEC2は新世代ほど高コスパの原則があり、t2.microはt4g.microに移行すべき。自分の学習を考えるとさくらはやめてEC2に揃えたい。全部t4g.microに相乗りを狙ってみようか。

そしてどうせならkubernetesに全部載せてみたい。複数のアプリケーションを相乗りさせるときのトラフィック管理をこれまではjwilder/nginx-proxyでやっていたが、もうちょっとナウいやつに移行して監視とかも統一的にやりたい。

自分用ActivityPubインスタンスとしてGoToSocialを立てた

ツイッターがいよいよヤバそうなのでActivityPubのインスタンスを立てたくなった。まずMastodonを検討したが、リソースの要求が高いので諦めた。不慣れなRoRだしTypeScriptじゃないし構成も複雑なので個人で管理・改造するのは負担が大きいというのもある。

改めてActivityPub実装の中で軽量なものを探したところGoToSocialが良さそうだったので立てた。AWS EC2のt4g.microで現状問題なく稼働している。と言ってもまだフォローが少ないからかもしれない。ActivityPub、というか分散型SNSという仕組み上フォロー関係が増えると加速度的に通信が増大していくはず。

GoToSocial

GoToSocialはGoで書かれている。シングルバイナリで吐かれるアプリケーションとsqliteで動き、公式に提供されるdocker-compose.ymlを少し調整してリバースプロキシとしてnginxを立てるだけで動かすことができた。

現段階ではアルファリリースという位置づけであるが、大部分の基本的な機能に問題はない。今自分が把握している問題は以下の2つだ。

  • 動画が表示されない
  • notestockが利用できない
    • 利用を開始するためのnotestockのbotアカウントへのメッセージ送信がエラーで失敗する
    • mastodonには送れるのでnotestock側に何か問題があるのではと思っているが、notestockのソースコードは公開されていないので詳細不明

フロントエンドをほとんど持たず、サードパーティのクライアントから叩かれるAPIサーバーに専念している。推奨されているクライアントはpinaforeだが、pinaforeは2023年1月に開発の停止が発表された。webクライアントに限ればこれが最も盛んに開発されていたので先行きが不安だ(しかし作者自身が述べているようにpinaforeもだいぶ技術スタックが尖っていて将来性は怪しかった…)。ActivityPubデビューする人は最初にサーバーに登録してからクライアントを導入するだろうが、GoToSocialはユーザー登録用のフロントエンドも持っていないので一般に公開するにはハードルが高めかなと思う。自分はdockerコンテナに入ってCLIからアカウントを作成した。

自分でちょっとした改造を試みたときにdocker buildが大量のメモリを食ってEC2が落ちた(2GBでは足りなかった)。Dockerfileからswagger関連の処理をゴリッと消してやると直る。

3/9~3/15 スパゲッティ時代の到来/Haskellすき/サーバーめっちゃ攻撃されてた/休暇の予定/コロナ相場

スパゲッティ時代の到来

今週はスパゲッティをよく食べた。スパゲッティは既製品の味が豊富で飽きにくいのがよい。欠点は野菜の摂取が難しいことと、7分という長くも短くのない待ち時間だ。

沸騰したお湯に麺を投入するとき、捻ってパッと手を離すことで麺が360度きれいに分散するテクニック、あれがかなり上手くなった。きれいに分散すると麺どうしの摩擦が小さくなるので、そのまま放っておいても麺の下部の湯に浸かっている部分が柔らかくなるに従って沈み込んで麺の全体が湯の中に収まる。言葉で説明すると何を言っているのか意味不明だろうが…

Haskellすき

Haskellの本を読み始めている。記法が大胆で、なるべく値ではなく関数(関係)を組み合わせていくというスタイルが気持ちいい。一方でどんな富豪的実装なんだ…と驚くような機能もある。パフォーマンスはどうなんだろう。

サーバーめっちゃ攻撃されてた

ある理由で新しくサーバーを借りてWebサイトを公開したのだが、ログを見てみるとすごい勢いで攻撃(ご挨拶程度のものだが)されまくってて笑ってしまった。

まずnginxのログ。うっかりまずいファイルが公開されてしまっていることを狙ってアドレス決め打ちで大量のアクセスがあり、全部404NotFoundを返していた。nginxのルーティングをミスするとこういう攻撃を食らうのだろう。攻撃元は海外。

sshdのログもすごかった。ユーザー名rootでランダムなポートに向けて大量のアクセスあり。しかしパスワード認証は当然切ってるしrootログインは禁止しているうえにポートもデフォルトの22から変えているので突破はされていない。これも攻撃元は海外。IPアドレスを調べるとあちこちに攻撃を仕掛けている有名人(?)で笑ってしまった。

これらのログを毎日catしてtailして読むのは大変なのでlogwatchを導入した。crontabで1日1回、/var/log下の各種ログファイルをサマライズしてメールで送ってくれる。素晴らしい(postfixの設定が必要でそれはそれで大変だった)。

思った以上に頻繁に攻撃されてビビってるのでchao.tokyoのセキュリティも一新したい(というかサーバーの構成をなるべくAnsibleにしてしまいたい)。

そう、Ansible。とても便利で重宝しているが、Ansibleだと逆に手間になってしまうような処理(冪等にするのが難しい)もあって悩ましい。たとえばnginxをhttps化する作業は、Ansibleで書くとかなりややこしいことになるが、sudo certbot --nginxを実行すれば一瞬で終わる。

サーバーやミドルウェアをいじるのは楽しい。フロントエンド中心の仕事と変化がつくのがいいのかも。

休暇の予定

金曜日から長大な休暇を取るがいまだ予定はない。静岡に寄りつつ適当に関西をぶらつくか。遠くに行かなくても適当な温泉地でグータラするのもよい。

コロナ相場

確定拠出年金がすごい勢いで溶けてて笑ってる。

適当にパソコンをポチポチしていた

2/1(土)

していたら土曜日が終わった。

OpenToonzの1.4.0が出たのでLinuxでビルドしてみた。ドキュメント通りで特に問題なし。

動画サイトの再生エリアのスクショをワンクリックで撮れるようにしたくて調べていたんだけど、ざっくりMDNを読んだ感じセキュリティ上の理由でクライアント側だけではどうにもならないっぽい。

その他、寝たり起きたり鍋作ったりDota2したりしてたら1日が終わってた。僕は休日は無計画に浪費する方が好きだ。あまり褒められたことではないが…。

お得な情報を2つ

1/21(火)

スマホFTJ161BはBluetoothを有効にしているとwifiが断続的にしか通信できなくなる。

Ubuntu18.04+GTX1060でKrita4.2.8を動かすとき、ドライバのバージョンは440だとキャンバスのグラフィックアクセラレーションが効かず、ズームや回転がカクカクになる。435に戻すと直った。

生姜湯と化したちゃお/LinuxでDetroit: Become Humanできそう

1/5(日)

ランチに少し歩いたところの家系ラーメンに。味が濃く、魚介の風味もあった。ライスはおかわりはできないので最初に大森で頼むべきだった。銭湯はしょうが湯。早い時間に行ったので混んでいてあまりゆっくりできなかった。

今日が正月休暇の最終日だ。今年は帰省もせず、のんびりとしていた。悪くはなかったが退屈でもあったので、同じ退屈なら帰省してもよかったかもしれない。

法律上今年度中にあと2日休暇を取らねばならない。それとは別に繰り越せない休暇も2日ある。適当な祝日に合わせてどこかでまた9連休を生成することになりそうだ。

LinuxでWindows向けのゲームをやりたいときはLutrisというソフトを使う。Lutrisがなんであるかというのを説明するのは難しいのだが(公式にはgaming platformを名乗っている)、ゲームごとにどのバージョンのwineをどんな設定で使うかというのを管理できるソフトだ。

Detroit: Become HumanのPC版が12月に出ていたらしい。ぜひプレイすべきと勧められていたのと、新年で安くなっていたので購入し、Lutrisでのプレイを試みた。ダイアログに求められるまま依存パッケージをインストールし、d9vkをセットアップした。その結果起動には成功した。FPSも良好だ。しかしWASD移動ができない。キー入力が死んでいるわけではないのだが、ゲーム中に移動だけができない。不思議だ。しかしもう一歩だ。

droneで自動デプロイする

12/22(日)

masterにマージするだけでデプロイされてほしかったので。

結論

  • Docker Pipelineでビルドが通るか確認し、OKならSSH PipelineでサーバーにSSH接続してgit clone→docker build→docker runしている。
  • SSH Pipelineはデフォルトでは/tmp下に適当なディレクトリを作ってcloneしてstepを実行していくのだが、サーバーに置いている設定ファイルを使いたい都合でそのデフォルトの挙動を無効にし、cd /home/satoru/workして手動でcloneしている。
  • SSH認証関連の情報はdroneのsecretsに保存してある
    • セキュリティ上の理由で、デフォルトではPRをトリガーにPipelineが実行されるときはsecretsを読み込めないので注意

VPS上でdroneを動かした

12/21(土)

CI環境ほしいので作った。基本的にはこれを読みながら進めるだけ。

結論

  • 単純にドキュメンテーションのdocker runのオプションをdocker-compose.ymlの形式に落とし込んだだけ
  • .env.sampleを.envにコピーして中身を埋める
  • common_linkはVPS上で動かしているnginx-proxyに接続するためのものなので気にしなくていい

パソコンが壊れた(7ヶ月2回目)

11/29(金)

たぶんこのブログを始めてからは2回目で合ってる。

今度のは理由がよくわかっていない。久々にPCを再起動したら起動時にログインできなくなった。ユーザーを選択すると認証エラーと表示され、直後にフリーズする。ユーザーを選択せずにCtrl+Alt+F3でCUIからログインすることはできる。ログ見てググった感じNVIDIAのドライバが悪そうな感じがあるが、Linuxがわかりそうな同僚を召喚しても直せなかったので諦めて再インストールした。

Ubuntuのインストール時にもエラーが出て困った。これは使っていたisoイメージが壊れていたのが原因だった。割と壊れたイメージをつかまされることがあるので、ちゃんとチェックサムを確認しよう。ストレージ用HDDを外してUbuntuをインストールし、あとからマウントすることでほとんどのデータは残せた。