アジョブジ星通信

進捗が出た頃に更新されるブログ。

Xvfbのスクリーンサイズを変更する

Xvfb といえば、以前(主人公の好感度問題 完結編)、仮想環境に X Window System のディスプレイを用意するのに使ったツールです。使い方は Xvfb :0 -screen 0 1280x720x24 みたいな感じなのですが、 Xvfb を起動した後に、指定したサイズから変更したいときはどうしたらいいのでしょうか?

TL;DR

最初に指定したサイズ以下への変更なら xrandr --fb 1000x700 でできます。初回はエラーになるけど気にしてはいけません。

ただし、 X サーバーはすべてのクライアントが切断されると、状態をリセットしてしまうので、何かしらのクライアントが常に接続された状態(例えばウィンドウマネージャ―が動いている)で実行する必要があります。

続きを読む

私、ValueTaskは限定的でって言ったよね!

メリークリスマス! みなさんは、見てないアニメをネタにするなんてしてませんよね? 私は「俺を好きなのはお前だけかよ」しか見てません。

さて、並行並列プログラミングを愛し、スレッドプールに日々感謝を捧げているみなさんは、 ValueTask を活用しているでしょうか? 私は .NET Core 2.1 以降の ValueTask が大嫌いです。この嫌いという気持ちを、歴史を紐解きながら解説していきたいと思います。

続きを読む

比較的安全に Docker で Pleroma サーバーを建てる

みんな大好き「やってみた」、今回は Pleroma サーバー構築をやってみました!

以前 Kubernetes で隔離 Mastodon 環境を作ったりして、 ActivityPub のデバッグ環境を整えたりしていましたが、 ActivityPub をしゃべるサーバーを自作するという夢に挑む時間とやる気は残っていないということで、 Pleroma で妥協しようということにしました。みんな大好きやってみたはいくらでもやってる人がいると思うので、ドキュメントにあんまり書いてないようなことを重点的に書いていきます。

お品書き

  • Docker を使って構築する
  • SSRF 対策をする
  • フロントエンドを改造する
  • reCAPTCHA を導入する
続きを読む

バタフライ図も行列も見たくない人のための高速フーリエ変換

高速フーリエ変換FFT)を実装しようと思って、まず理論を知らねばと調べたところ、まったくチンプンカンプンだったのですが、とりあえず、なんとか証明を追うことができました。というわけで、バタフライ演算の図を見てもなんもわからん人が FFT を実装するための資料として、この記事を書き残したいと思います。

参考にした資料は、富永氏による GNU Scientific Library に関するドキュメントの翻訳の「FFT アルゴリズム」の「基数2の時間空間法」です。周波数空間については追っていません(どっちでやっても計算量は同じなので)。

続きを読む

いまさら使う TPL Dataflow

みなさん、並列処理、書いてますか? つらい、つらいよね、わかるよ。

ある部分は高速化のために並列で実行し、ある部分は整合性を取るために直列で実行し、入力ジョブのキューが膨大にならないように流量を調節しながらジョブを入力して……。こんなプログラムをバグなく書くなんて、それはもう大変で、コーナーケースからぼろが出てくる出てくるって感じになります。

さて、そんな面倒な並列プログラミングを支えてくれるライブラリが、結構前(2014 年の NuGet パッケージが存在している。概念自体は 2011 年からある?)から提供されています。名前だけはご存知(個人的な感想) System.Threading.Tasks.Dataflow、通称 TPL Dataflow です。 .NET Core では標準で含まれていますし、そうでない環境では NuGet からダウンロードできます。強いですね。

公式ドキュメントも比較的しっかり書かれています。日本語翻訳がまともかというと何とも言えないですが、翻訳が崩壊しているページよりはまともです。

今まで、イマイチ使いどころがわからない & 複雑で学習コストが高そうだと感じ、避けてきたのですが、触ってみたらかなり便利ということがわかったので、各種オプションによってどのような挙動をするのかをまとめて、今後使うときのメモとしておこうというのが、この記事の目的です。前半では、この目的通り、使い方を説明します。後半では、同じく TPL(Task Parallel Library) という枠で提供されている Parallel クラスや、似たような概念を提供する Reactive Extensions、System.Threading.Channels との比較を行います。

環境は、 .NET Core 2.2 を想定しています。 System.Threading.Tasks.Dataflow の古いバージョンでは、存在しない機能があるかもしれません。

  • TPL Dataflow の使い方
    • インターフェイスの紹介
    • 最初の例: 入力データに対して処理を直列に行う
    • データを変換する TransformBlock とリンク
    • 完了、キャンセル、例外の伝搬
    • ブロック中の SynchronizationContext
    • 並列化
    • 出力データの順番
    • バッファー上限と SendAsync
    • 複数のブロックに同じデータを送信する
    • 入力データをまとめて配列にする BatchBlock
    • 最短一致モード、最長一致モード
  • ちょっと大規模なサンプル: マネージドキューサービスからジョブを取り出し、実行するワーカー
    • 経緯
    • マネージドキューサービスのモデル
    • データフローブロックを組んでいく
    • 完成形
  • 類似品との比較
    • Parallel, PLINQ
    • Reactive Extensions
    • System.Threading.Channels
  • まとめ
続きを読む

Kubernetesで隔離Mastodonネットワークを作った

はじめに

前回、 k3s の紹介をしましたが、もともと Kubernetes に興味を持ったのは Docker のネットワークが、簡単だけれど細かい設定ができないという問題を抱えていたからです。細かく設定したネットワーク環境を使って何がやりたかったかというと、 Mastodon をはじめとする、 ActivityPub サーバーを隔離環境で動かし、他人のサーバーに迷惑をかけずに通信を眺めたかったのです。さらに、それを使って ActivityPub サーバーを自作するところまで行きたいのですが、正直もう体力と時間がないので、他に作っている方の動向だけ眺めていることにします……。

というわけで、要件はこんな感じです。

  • Mastodon サーバーを 2 つ立ち上げ、相互に通信できるようにする
    • 実環境に近くするため HTTPS で通信する
    • サーバー名として「mastodon1.fediverse.local.azyobuzi.net」、「mastodon2.fediverse.local.azyobuzi.net」を割り当て、解決できるようにする
  • 隔離ネットワーク外のサーバーにアクセスできないようにする
  • Mastodon サーバー間の通信内容を簡単に覗き見ることができるようにする

KubernetesMastodon を構築した!といった記事は星の数ほどあると思いますので、この記事のポイントを挙げると、ローカル限定の隔離ネットワークであるところと、サーバー間の通信を監視できる UI を用意したところです。

先に完成品をお見せしておきます。トゥートしたりふぁぼったりすると、相手サーバーにリクエストが飛んでいることが確認できます。

ここまでできて、とりあえずやりきった感が強く、飽きたので、あとはこれを読んだみなさんが、より強いシステムを作って、 ActivityPub サーバーの開発に役立てていただけると幸いです。

このブログ記事では、構成要素や、 k3s での構築について書き残しておきたいと思います。 k3s に限らない構築方法については、 GitHub に置いておきます。

続きを読む

k3s の中身とメモリ使用量の調査

コンテナに対するあらゆる需要に応えるソリューションこと Kubernetes が流行りですね(雑なはじめかた)。僕も何度かこのビッグウェーブに乗ろうとしましたが、新しい概念の多さと、ズボラ運用には厳しいメモリ使用量で断念してきました。動かしたい環境というのが、メモリ 1GB の VPS だったり、メモリ 1GB の ARM シングルボードコンピュータなわけで……。

そんなところに颯爽と登場したのが k3s です。公式の謳い文句から解説しているページは「k3s kubernetes」で検索すれば無限に出てくると思うので、そちらにおまかせして、じゃあ実際どうやってあの馬鹿でかい Kubernetes をコンパクトにパッケージングしたのかについて見ていきたいと思います。

シングルバイナリ?ホンマか?

シングルバイナリと聞くと、ぱっと思いつくのは BusyBox のように、すべてのプログラムをまとめてコンパイルして、起動時のコマンド名で実行するプログラムを切り替えるスタイルですが、 k3s ではどうでしょうか? 答えは、半分そうで、半分違います。

続きを読む