自分用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関連の処理をゴリッと消してやると直る。

Raspberry Pi Zero WHで気温センサBME280を動かすときの罠

前提

https://github.com/SWITCHSCIENCE/samplecodes/tree/master/BME280/Python27 を動かすときに。

最初に結論

  • 依存パッケージはsudoで入れよ
    sudo pip install -r requirements.txt
  • I2Cを有効化せよ
    sudo raspi-config
  • プログラムはsudoで実行せよ
    sudo python bme280_sample.py

以下は蛇足。どういう経緯で結論に至ったか。

ImportError: No module named smbus2

pip install -r requirements.txt

すれば済む話に見えるが、実は

sudo pip install -r requirements.txt

の方がいい。理由は後述。

OSError: [Errno 2] No such file or directory: '/dev/i2c-1'

pip install requirements.txt
python bme280_sample.py

するとこうなる。

理由はデフォルトでI2Cが無効化されているからで、解決策は Check! Raspberry Pi で I2C を使いたい(トラブルシューティング)にある通り

sudo raspi-config

だ。なお上記記事は2016年のもので、2020年現在(Raspberry Pi OS 5.4.79+)では若干違う。I2Cの設定は 3 Interface Options の中にある。

さて、I2Cを有効化して改めて

python bme280_sample.py

するとどうなるかというと、こうなる

OSError: [Errno 13] Permission denied: '/dev/i2c-1'

じゃあsudoにすりゃいいんだろと思って

sudo python bme280_sample.py

すると

ImportError: No module named smbus2

になる。

pythonのモジュールシステムにはあまり詳しくないが、sudoで起動するpythonは別の場所から依存パッケージを探してるのかな?というわけで

sudo pip install -r requirements.txt

すると動くようになった。

20200426

食事

朝なし昼スパゲッティ夜カレー

住居とは

外出をしない土日だった。自宅にこもっていても生存できる、それはつまり、この狭い部屋に人間が生きるために必要な機能を密集させ、さらにそのために必要なリソースを逐一引いてきているということだ。想像するだけですごい手間だ。共通化が禁じられたプログラミングのようなものだ。

そこまでやらなくてもいいんじゃないかと思う。たとえば風呂とトイレを集約するだけで配管と掃除の手間は激減するのではないか。その代わり排泄と入浴のタイミングが完全に自由ではなくなるが、それほど重大なこととは思わない。家賃が安くなるのならばそうしてほしい。

ScalaでDBを使いたい

温度管理サーバーは現状データをCSVに保存しているが、ダサいのと勉強のためにちゃんとDBを使いたい。ということでslickを導入しようとしている。今はチュートリアルをやっている。

たぶんapplication.confのurlを適切に設定すれば自分が用意したDBに接続できるはずで、docker-composeとかで用意すればいいかな。

同時に開発環境も整備した。これまではdockerコンテナの中で動かしていたが、それをやめてマシン上にJavaとsbtを入れた。このとき両者のバージョンを正確にこれまでのものと合わせないと依存関係が解決できずvscodeのmetals拡張が壊れる。sdkmanを使うと楽。

iceiceiceのDota2

今日はBTS Pro Series: Southeast AsiaというDota2の大会の決勝があった。名前の通り東南アジアのプロチームが参加する大会だ。決勝戦はFnatic vs TNC。僕はFnaticのiceiceiceのプレーを見ていた。

決勝戦第3試合の彼のNature's Prophetの動きが素晴らしかった。Nature's Prophetは一切の下準備なしにマップの任意の場所にテレポートするスキルを持つ、ある意味Dota2のルールを逸脱したヒーローだ。iceiceiceはこのヒーローの性能をフル活用してマップを縦横無尽に移動して支配し、チームを勝利に導いた。

人間性能も凄い。攻撃動作によって透明状態を解除しようとしたときに敵が視界に入り、瞬時に反応して攻撃動作をキャンセルするシーンがあった。iceiceiceは29歳、プロゲーマーとしてはかなり年長なのだがすごい反応速度だ。

20200414

食事

朝なし
昼我流ペペロンチーノ
夜レーズンパン・カントリーマアム・ヨーグルト

house-temperature-core

Github Actionsによる自動デプロイが完成した。

https://github.com/chao7150/house-temperature-core/blob/master/.github/workflows/main.yml

  1. docker build & docker push
  2. docker-compose.ymlをscp
  3. sshしてdocker-compose up

という3段構成になっている。リモート側のディレクトリのオーナーがなぜかrootになっていてscpの書き込みに失敗し、しかもそれがエラーメッセージからわかりにくかったのですこし手間取ってしまった。

Scala+Playのproduction buildは速い

https://github.com/chao7150/house-temperature-core の話。

以前droneで自動テスト(sbt test)を試みたときはScalaやsbtのダウンロードでとんでもない時間(30分以上)がかかってしまって実用的ではなかったのだが、今回Github Actionsでsbt distを実行したところ1分くらいで終わった。何も調べてはいないが、とりあえず経験知の共有として。

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/18~2/24 在宅勤務/過剰な健康への不安

在宅勤務

すでに発表されている通り弊社は在宅勤務期間中だ。僕はソフトウェアエンジニアの一般社員なので仕事に占めるコミュニケーションの割合が低く、在宅勤務でもそこまで不便を感じていない。エンジニア職以外の事情はよくわからないし、エンジニアでもリーダー級以上になるとミーティングが多くあるのでなかなか大変なところがあるのではと思う。

あえて不便なところを挙げると、オフィスが使えない分自宅の環境に左右されるところか。自宅のPCデスクはかなりリソースを投じて強化してきたので問題ないどころか会社以上に快適。だがネット回線は時間帯によって不安定でイライラする。自宅の周りに飲食店がないので食事に変化がなくなるし(自炊のレパートリーが少ない)、運動不足にもなる。通勤が不要なぶん1日あたり80分くらい時間が浮いてるので、その時間を使って散歩でもすればいいのか。でも花粉のシーズンだからなあ。

過剰な健康への不安

先週の虫歯の処置以降、なんでもない歯の感覚がどれも虫歯の兆候なのではと思えてしまって不安だ。歯医者では処置した歯以外は問題ないと言われているが、それもあまり信用できない気分。一般論として医者は信用すべきなんだが。

もともと僕は健康を損ないたくない、特に永続的にダメージが残るような病気にはなりたくないという心配が強すぎる。年齢的に考えればこれから健康は失っていく一方だというのに、バカバカしい。

ちゃおネイキッドプロジェクトの進展

自動デプロイ

Spotify機能のためにredisを立ててdocker-composeで連携するようにした。これに伴いデプロイの手順が変わったので.drone.ymlを調整した。docker runに複雑なオプションを載せまくるよりもdocker-compose.ymlに書いてしまう方が楽だし1コンテナでもdocker-composeを使うべきなのかもしれない。

CSSレイアウトのお勉強

Spotifyで聴いている曲を表示できるようになったので、画像・タイトル・アーティストをいい感じにレイアウトしたくてCSSのお勉強をした。MDNのドキュメントが大変参考になった。というかCSS系の情報はググってもノイズが多すぎる。

勉強のためにstyled-componentsでCSSをTSの中で記述してみた。ファイルの中身がカオスになる感覚は否めないが、コンポーネントとスタイルの結びつきが強くなるのは使いどころによっては便利なのだろう。特にwebpackを弄らずとも導入できるのはよい。

bundleサイズ削減

bundle analyzerで見てみるとmomentのタイムゾーンとかlocaleのファイルがすごい容量食っててビビったのでググって削減した。効果が数字で見えるのは楽しいのだが、webpack.config.jsがどんどん複雑になっていくのはつらい。

今後の野望

  • 監視・ロギングの強化
  • 様々な自動投稿機能がついたTwitterタイムラインのようなサービスにしていきたい

SpotifyAPI実装記

2/11(火)

自宅にこもってSpotifyNowPlayingをホームページに表示する機能を作っていた。

Spotifyのaccess_tokenをredisで保持することにしたのだが、そうすると本番環境にもredisを用意せねばならない。docker-composeで連携させることになるだろうが、デプロイフローをまるごと変えなければならないので大変だ。

クライアントとサーバーのアプリケーションをどういうリポジトリ構成で管理するかも難しい問題だ。クライアントはReact、サーバーはexpressなので両方ともTypeScriptであり、型の共有などのメリットは活用したいが、両者を近づけていくとビルド周りの設定が煩雑になりそうだ。

既にサーバー側のビルドがなぜかクライアント側の型エラーで落ちる現象が起きている。おそらくtsconfigを共有しているせいでクライアント側のコードまでincludeしてしまっているからだろう。

OAuth認証も難しい。僕のSpotifyアカウントでリソースへのアクセスを許可する必要があり、これはブラウザからしかできない。よってその工程までは手作業で行ってからaccess_codeをconfに記入し、アプリケーションを起動することになる。

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

2/1(土)

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

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

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

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

A/2=

1/28(火)

仕事が全然進まずつらい。帰りに同僚とラーメン。銀座のラーメンはお上品でどうも物足りない。ラーメンは野蛮なほうが好きだ。

とても寒い。自宅から出なくていいなら天気はハチャメチャになってくれたほうが楽しいのだが、会社員の身ではそうも言っていられない。寒いのも靴が濡れるのも嫌だ。

30日OS本はのんびり5日目の文字の描画をやっている。ピクセルデータをVRAMに投入していくだけなので簡単と思いきや、妙に小さく潰れた「A」が表示された。QEMUに解像度の設定などを渡す必要があるのかと思って精査してみると、単に上半分しか描画できてないだけだった。


Aが表示されるはずと思いこんで見るとAじゃないですかこれ?


これが本物のA

Aの上半分もAに見えるの、フラクタルだ。