aws-sdk-go-v2でGCSを叩いた際のSignatureDoesNotMatchに対処する

Google Cloud Storage は実は S3 互換の API が生えていて、既存の S3 を使うコードのオブジェクトの保存先を簡単に GCS に向けることができるようになっています。 理想的にはエンドポイントやトークンを差し替えれば移行できるのですが、他の S3 互換を謳うオブジェクトストレージと同じように単純にいかないことも多々あります。 最も一般的なエラーは S3 でサポートされているエンドポイントを互換オブジェクトストレージがサポートしていないという問題だと思いますが、 今回細かい部分の仕様の差異で AWS SDK で GCS のエンドポイントが叩けないという問題があったので、そのときにとった方法をメモしておきます。 雑な対処なので全く良い方法ではないですが。 起こったことと原因 aws-sdk-go-v2 で

Mastodonのフロントエンドをカスタマイズしてみよう

この記事は「Cybozu Frontend Advent Calendar 2023」 13 日目の記事です。 一家に一台 Mastodon とはよく言ったもので1、今や Mastodon のサーバは人々の生活に必要不可欠なものになっています。(そんなことはない) そして、自分で Mastodon のサーバを立てると、Mastodon 自体を改造する必要に迫られたり、細かい不便を解消するために手を入れたくなったりしてくるものです2。 この記事では、私が Mastodon のフロントエンドに手を入れた際の知見を共有します。 ちなみに業務ではフロントエンドとはかなり遠い領域を触っていて、フロントエンドは何も分かりません。 Mastodon とは? (↑分かりやすいらしい動画。kofuk は真面目に見たことがないですが) Mastodon はオープンソースの分散型 SNS です

ISUCONに出た

「初めて蟹を見た kofuk」というふざけた名前のチームで @uta8a と ISUCON13 に出ました。 当日のリポジトリも公開しています。 GitHub - uta8a/isucon13q-2023-11-25: ISUCON 13 https://github.com/uta8a/isucon13q-2023-11-25 ISUCON 13. Contribute to uta8a/isucon13q-2023-11-25 development by creating an account on GitHub. パフォーマンスに詳しくない人がほとんど準備せずに行くとこういう景色になるという感じで、結果は褒められたものではなかったです。 ただ ISUCON は人それぞれのレベルで頑張れるイベントで知識が薄くても暇になるということはないという感じで、良いイベントだなーと思いました。 めちゃくちゃ楽しかったです。 ちなみにチーム名はこれ↓が元ネタです。 蟹を初めて見た上田晋也みたいなツイートを見て電車で大笑いしていてマジで恥ずかしい — kofuk (@man_2_fork) April 14, 2023 uta8a が詳しくブログに書いてくれました。 ISUC

Daidoquer2(Discord読み上げボット)を使った記録

Daidoquer2 (ddq2) という艮鮟鱇さんが作った読み上げボットをローカルのマシンで立ち上げ、 Discord のテキストチャンネルに書いた内容がボイスチャンネルで読み上げられるようにしたという記録です。 割と苦戦して、艮鮟鱇さんにヘルプ求めまくりながらやったところなんとか動くようになりました。 問題の原因はほとんど使っていた Docker イメージが古かっただけということもしなくもない。 TL; DR 的なサムシング 書いていたら思いの外前置きが長くなったので、(たぶん)順当に構築できた場合の手順との差分を最初に書いておきます。 docker-compose.yml が指しているイメージを最新にする ddq2 の images のところを書き換え ここを見て最新のやつを使ったほうが良さげ 他の人が喋っていたら音量を下げる機能

Arch Linuxでext4のrootfsをLUKSで暗号化する

既存のファイルシステムを暗号化もできるらしい。 とりあえず使い捨ての環境でやってみたのでメモしておく。使ってる環境でやるならバックアップ取ってからやった方がいいと思う。 まず、Arch のインストールメディアで起動する。 ここでは /dev/nvme0n1p2 に rootfs があって、それ以上は分割されていないものとする。 複数のパーティションを 1 つの暗号化パーティションに入れることができるかは分からない。 LUKS のヘッダ分のスペースを空けないといけないので、まず ext4 のファイルシステムを縮小する。 僕はデータが入り切る最小サイズまで縮小した。計算が得意な人はギリギリのサイズに縮小してもいいと思うけど、 ext4 だとデータはあんまりバラけてないはず(多分)なので

Arch Linuxを暗号化したディスクにインストールする

Arch Linux を LVM on LUKS の root filesystem にインストールしたのでメモ。 LVM を使うこと自体は完全にオプションで、LUKS の上に ext4 のファイルシステムを作っても別に良い(はず)。 これがどういう構成かというと、物理パーティションの上に LUKS で暗号化したパーティションを作り、 その上の LVM2 の LV の上の ext4 のパーティションに rootfs を作るというもの(オフチョベットしたテフをマブガッドしてリットにしてそうな説明)。 (意外にもとハマらずにできたので情報としての価値は低めです。) インストールガイド に従ってパーティションを切るところまでやる。 パーティションはこんな感じで切った。 ディレクトリ 範囲 説明 /boot 1 MiB–1 GiB ブートローダとか諸々用 / 残り全部 残りのディレクトリ用

LinuxのLVMに入門したのでいろいろメモ

LVMというのは抽象化したレイヤーを通して物理的なストレージにアクセスするというやつ(適当)。 物理的なストレージを直接使うよりもいろいろ変なことができるので嬉しいらしい。 雑に概念を説明 LVM には PV(Physical Volume)、VG(Volume Group)、LV(Logical Volume) という概念がある。 まず、PV というのは物理的なストレージに一対一で対応する概念で、SATA 接続のストレージだと /dev/sda1 で一個、 /dev/sda2 で一個みたいになる。 SSD をパーティションで区切っていない場合は /dev/sda で一個の PV とか。 次に、VG というのは、普通にストレージを使っているときは 1 個のストレージデバイスに対応する概念(のような気

Ubuntuの/tmpをtmpfsにする方法

systemd のデフォルトでは /tmp は tmpfs でマウントされるようになっている。 でも Ubuntu では /tmp で tmpfs を使わないようにしてある。何度か /tmp を tmpfs にする試みはあったらしい1が……。 まあどうでもいいといえばどうでもいいが、Ubuntu の /tmp を tmpfs にする方法。 $ sudo systemctl enable /usr/share/systemd/tmp.mount $ sudo reboot これだけ。 通常、systemd では /tmp は tmp.mount でマウントされる。 Ubuntu でもこのファイルは /usr/share/systemd にインストールされるようになっていて、ユーザの好みに合わせて使える。 ただし、ここはユニットファイルの検索パスに入っていないので普通に指定すると有効化できない。 というわけで、フルパスを指定して mount unit を有効化することで、直接使えるようにしている。 起動中に /tmp をマウントし直すと中に置いてあるファ

Emacsのマグカップを買った

FSF のショップにある Emacs のマグカップを買ってみました。 テカテカで映り込みそうなのであんまり写真は上げていないんですが、なかなか良いです。 ロゴの色は FSF のページの写真よりちょっと青っぽいですね。これは個体差なんでしょうか。 これを注文したのは 11/29 とかだったのですが、届いたのは年が明けて 1/25 とかでした。 箱に何故か中国郵政のステッカーが貼ってあったので、誤配送で中国を経由してしまった説はあります。 (一番安い配送オプションを選んだせいもあると思います。) 1 ヶ月後に控えた引っ越しに間に合うかとビクビクしていたんですが、何もメールが来なかったのは FSF に登録しているメールアドレスを 更新し忘れていたせいだと後で気づきました

Linuxのreadとrecvは何が違うのか

man 2 recv [Enter]ターン The only difference between recv() and read(2) is the presence of flags. With a zero flags argument, recv() is generally equivalent to read(2) (but see NOTES). (適当な訳) recv() と read(2) の違いは flags の有無のみです。flags が 0 のとき、recv() はほとんどの場合 read(2) と等価になります。 おわり というのもアレなので Linux kernel のソースを読んでどうなっているのか見てみることにしました。 僕は Linux ニワカなので見当違いなことを言っている可能性もあるのでまあそういうつもりで読んでいただけると……。 Linux のソースコードはたまたま手元にあったやつなので超適当ですが、よく見たら 2020 年のやつでした(思ったより古かった) Linux のシステムコールは SYSCALL_DEFINEn みたいなマクロで定義するので、適当に grep します。 すると read は fs/read_write.c recv は net/compat.c にあることが分かりま