nixのhome-managerで入れたffmpegをAudacityで使う

Audacityでm4aなどを開きたくなったのでメモ。

Audacityでは、mp3やwav以外のファイルを開きたい場合はffmpegのライブラリ(具体的にはavformat-*.dylib)を使う必要がある。 しかし、普通にffmpegをhome-managerで入れると、ffmpegの実行バイナリしか出力されず、ライブラリが使えない。

解決

こう書く。

 home.packages = pkgs.lib.flatten (
    (with pkgs; [
    ffmpeg
    ffmpeg.lib
    ]));

こうすることで、ffmpegで使っているライブラリを~/.nix-profile/libで使うことができる。

Audacityの環境設定でffmpegの場所を手動で「~/.nix-profile/lib/」に設定する

余談

Nixで入れたAudacityはなぜか環境設定からffmpegライブラリの場所をえらべないので、brew caskなどで入れたもので設定するといい。

Nixで入れたAudacityの環境設定

brew casksで入れたAudacityの環境設定

NextcloudのジョブをGrafanaで監視できるようにする

こんにちは、id:taiseiueです。 この記事は、はてなエンジニア Advent Calendar 2025 - Hatena Developer Blogの45日目の記事です。

昨日の記事は、id:tunacookさんによるNaninovelのシナリオ文字カウントをするVSCode拡張を作った - ツナサンド定食でした。

今日の記事では、Nextcloudのジョブの状態を監視できるようにしてみます。

Nextcloudのジョブが実行されない問題

1年前くらいから、知人とDJスタジオを運営しており、その一環でDJプレイ中の録画を保管しておくためのNextcloudをRaspberry Pi 5で稼動しています。

普段の使用(アクティブユーザー>5くらい)までであれば問題なく動作するんですが、アクセスが集中したり、大容量の録画のプレビューを生成したりすると、上手くバックグラウンドジョブが実行されずに通知が送信されなかったり、管理画面で警告が表示されたりします。

そこで、今回はNextcloudのジョブの状態をGrafanaで監視できるようにすることをゴールにします。

Nextcloudのジョブはどう管理されているか

Nextcloudでジョブはoc_jobsテーブルで管理されています。 Nextcloud Version 32.0.3でのテーブルの構造はこんな感じでした。

MariaDB [nextcloud]> DESCRIBE `oc_jobs`;
+--------------------+---------------------+------+-----+---------+----------------+
| Field              | Type                | Null | Key | Default | Extra          |
+--------------------+---------------------+------+-----+---------+----------------+
| id                 | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| class              | varchar(255)        | NO   | MUL |         |                |
| argument           | varchar(4000)       | NO   |     |         |                |
| last_run           | int(11)             | YES  |     | 0       |                |
| last_checked       | int(11)             | YES  | MUL | 0       |                |
| reserved_at        | int(11)             | YES  |     | 0       |                |
| execution_duration | int(11)             | YES  |     | 0       |                |
| argument_hash      | varchar(64)         | YES  |     | NULL    |                |
| time_sensitive     | smallint(6)         | NO   | MUL | 1       |                |
+--------------------+---------------------+------+-----+---------+----------------+

last_runはそのジョブが最後に実行された Unix timestamp、execution_durationは直近実行時の処理時間が入っています。 この中のlast_runなどをメトリクスとしてPrometheusに送信できればいいわけですね。

ジョブの状態をPrometheusに送信する

作戦として、今回はexporterを自作するのではなく、cronで定期的にデータベースにジョブの状態を見に行ってテキストファイルに出力し、それをnode_exporterでPrometheusに送信するという素朴な方法を選んでみました。

cronでジョブの状態を見に行く

こんな感じのスクリプトを書いて、データベースにジョブの状態を引きに行ってprom形式で出力してあげます。

gist.github.com

あとはcronにスクリプトを毎分実行するように登録しておきます。

* * * * * /usr/local/bin/nc-jobs-textfile.sh 2>&1

これでしばらくたつと/var/lib/node_exporter/textfile/nextcloud_jobs.promにメトリクスが出力されてきます。

Prometheusに送る

sudo systemctl edit prometheus-node-exporterで/var/lib/node_exporter/textfileを収集するようにします。

[Service]
ExecStart=
ExecStart=/usr/bin/prometheus-node-exporter \
  --collector.textfile.directory=/var/lib/node_exporter/textfile

上手くいけばPrometheusにnextcloud_job_execution_duration_secondsなどのメトリクスが送られているはずです。

メトリクスの様子

Grafanaで眺める

ダッシュボードの様子

Grafanaで、最後のジョブからの経過時間を可視化できるようにしてみました。 Nextcloudのジョブは基本的に5分おきに走るので、最後のジョブからの経過時間が5分を越えると遅れ気味だというわけです。 min(time() - nextcloud_job_last_run_timestamp_seconds)というPromQLで取得しています。

ついでにいつ、どのジョブが走っているかも見れるようにしています。

走っているジョブの様子
こうして見ると毎回実行されるジョブもあればアップロード後に走ってそうなのもあっておもしろいですね。

おわりに

いかがでしたか。これを期に身の周りのジョブを可視化してみたくなりましたか。 この記事は、はてなエンジニア Advent Calendar 2025 - Hatena Developer Blogの45日目の記事でした。 明日(1月14日)はid:masayosuさんです。よろしくお願いします。

YAPC::Fukuoka 2025 に行きました

id:taiseiueです。11/14〜15に九州は福岡工業大学で開催されていた「YAPC::Fukuoka 2025」に参加しました。

yapcjapan.org

参加にあたっては、学生旅費支援で宿泊費と旅費を支援していただきました。 このような機会をくださった運営の方々に感謝しています。

blog.yapcjapan.org

以下は懇親会で楽しそうなid:taiseiue と仲間達です。

インフルでした

帰って早々インフルになっていました。ブログを書くのがだいぶ遅れたのはこれです..

トーク&踊り場

ここからは、聴講させていただいたトークや参加した踊り場の感想を書いていきます。

2025年秋のPerl by charsbar

speakerdeck.com

今ドキの最新Perlの話でした。all/any演算子が入って便利に使えそう。use feature 'all'ではなくてuse feature 'keyword_all'と書くのは全機能を有効化してしまいそうな感じがするからでしょうか。あと、:readerと:writerが個人的便利そう。

大規模OSSに一人で立ち向かうには by Sosuke Suzuki

speakerdeck.com

いい話でした。何かに莫大な情熱を持っている人をエミュレートするには、「時間を可能な限り捻出して、可能な限り集中して使うこと」。この点が言語化されて実感が持てました。他にも、「手を動かしてメンタルモデルを得ること」、「教科書を読むこと」は日常生活の中でも役立ちそうです。

とりあえず散歩に行きます。

「バイブス静的解析」でレガシーコードを分析・改善しよう by hitode909

speakerdeck.com

id:hitode909 さんの発表には特有の凄みがあると思います。何か自然に場の空気を支配される感じ。 今まで画面越しに見ていたそれを生でみられてよかったです。

静的解析をLLMに助けてもらう、確かにVibeCodingよりも相当安心感がありますね。うちのプロジェクトもデッドコードを削除するところからやってもらおうかな。

Perl ブートキャンプ by Takafumi ONAKA

speakerdeck.com

Perlって何??となったので。manみたいにperldocが整備されているの、当たり前に思ってるけど良いですね。 「非常に高い後方互換性」について、確かに互換性を失なった先は狂気ではあるけどバグとの兼ね合いが難しすぎる...という気持ちになっていました。 私もしがないプログラミング言語をメンテナンスしているので、ここは気持ちがわかる気がします。

これは何度も言っているのですが、データにパッケージを紐付けてオブジェクトとするの、原野的な感じがしてすごくいい(語彙力)。

SREのためのテレメトリー技術の探究 — モニタリングSaaS開発からAIOps・AIインフラまで by yuuk1

speakerdeck.com

時系列基盤モデル、初めて聞いた概念だったのですがなかなか便利そう。MackerelでChatOpsから入って、AIOpsへと時代とともに要求が難しくなっていく のにはヒエエとなりました。基盤モデルを作ろうにもデータセットを得るのが難しい、そりゃそうやなとなりました。

OSS開発者なら学生たくさん連れてこれる説 by id:moznion

つれてこられました。尊敬する OSS 開発者の皆さんが横に並んでいて迫力がありました。 OSSコントリビュートするノウハウや継続するコツなど、様々な話が聞けてよかったです。

教科書では知れない令和最新 Perl ワード解説バトル by id:rokuokun

バトルですね。激闘でした。

slidoで素朴なPerlの疑問を賢者の方々に投げかけれるのかなりよかったです。 CPAN Testersが有志でCI(のようなもの)を周してくれている様子には迫力がありました。 Mojoliciousが最近は良いと聞いたので、何かつくるときに使ってみます。

id:rokuokun は司会おつかれさまです!

キーノート by P山

speakerdeck.com

スライドが良かったです。章立てされていて、セクションごとに画像は入っている感じは洋書に近いものを感じました。

"Hacker"であり続けるために、継続的に、よく考えつづける必要があると思いました。精進します。

牛すき鍋御膳を食べた

今宮通を北大路から堀川まで歩いた。行き先は堀川今宮のすき家に行くためだ。 例年この時期のすき家は牛すき鍋御膳を販売してくれる。平たく言えばすき焼き鍋セットである。

このシーンはちょうど2年前の今頃にもあった。あの頃は確か大学入試の願書だったかをギリギリまで書いていて、提出先の大学の配送担当の北郵便局に持って行ったのを覚えている。あの頃から無計画性はあまり変わらないようだ。

提供を待っていると、あのころ歩きながら聴いていた曲が有線から流れてきたのには驚いた。驚いただけで何の関連もない。

beautiful glider

beautiful glider

セットが来た。 自分なりのおすすめの食べ方は、まず伸びる前早々にうどんを小皿へと退避させ、煮切れそうになったらコップの水を入れて冷ます。こうすることで長いこと楽しめる。ああ、卵はふたつ頼んでおくといい。猫舌に鍋は熱すぎるから。

前回ここに来た頃からするといくらか美味しくなった気がする。それは多分体感の問題だ。あの頃は(当時の自分からすると)失意の地底から上がってきてすぐだったから。 次来たときはもっと美味しく感じられるといいなあ。

食後、調子に乗ってSukiシェイクも頼んでしまった。バニラ味。この手のものはバニラ味が一番、牧歌的で美味しい。

今、まだシェイクをすすりながらこれを書いている。

そんな私です。

MacBookを初期化した

今日、手元のMacBookを初期化した。2024年の春から使っていて、ちょうど1年半。 それなりに思い入れや愛着も湧いてきていたが、HomebrewやMacPortsなど、様々なパッケージマネージャーを試したり、種々のドライバ、ソフトウェアをインストールしてきたことで、ジャンクファイルでいっぱいになり挙動も怪しくなったからだ。

ついでにOSも最新のmacOS Tahoeにアップデートしておいた。 この過程で、当然macOSのセットアップを行ったわけだが、ここにこそコンピューターと向き合うことの"楽しさ"があることを思い出した。 コンピューターを手にして、それを自分好みにカスタマイズすること、これからコンピューターを使ってできる無限の可能性が、セットアップという手順に凝縮されている。

これから私は、また (愚かにも) このマシンを使い倒し、様々なソフトウェアをインストールし、環境を肥大化させていくだろう。 しかし、それはそれでよかろう。なぜなら、私はそうやってコンピューターと一体化していくことが好きだからだ。 使えば使うほど、コンピューターは自分の行動に即した提案をしてくれ(時に行動を補完することすらあるが)、今に自分自身の思考に最も近くなる。

先日、情報学を学んではいるが、コンピューターと仲良くなれない、という友人と話す機会があった。 できれば私のように、コンピューターと一体化していく体験をしてほしいと思う。

Git Hooksでmainへのコミットを防止するアレと付き合っていく

Git Hooksでmainへのコミットを防止するアレとの上手い付き合い方を思いしついたのでメモ。

GitHubの無料Organizationだとprivateリポジトリに対してBranch protection rulesが設定できないので、運用でカバーするしかなかった。そこで、GitHooksを使って、コミット前にmainっぽいリポジトリへのコミットを防ぐように設定したけど、リポジトリごとにGitHooksを書いて周るのはやや面倒なので、グローバルにhooksを設定するようにした。

ところが、ブランチを切って作業するほどでもないリポジトリでもコミットが弾かれてやや面倒。そこで、git config --local pre-commit.allow-mainpushがtrueなら確認せずにコミットを通すようにした。これで、「俺がここにmainにpushしても止めてくれるな!!」という場合にも対応できる。

「これでmainにpushしちゃった」事故は根絶できるだろう。

実際のコード↓ github.com

Pythonのbytes型に対するインデックスアクセスはintを返す

M5StackでBLE通信をしようとMicroPythonを書いてたところ気付いたのでメモ。

str型みたいにインデックスアクセスすると、長さ1のbytesが返ってくると思ったらintが返ってきた。

text = "Hello"
data = text.encode()

print(type(text))  # 当然str
print(type(data))  # もちろんbytes

print(type(text[0])) # <class 'str'>
print(type(data[0])) # <class 'int'>

そういえばPython多倍長整数でもint型になるし、整数->int、浮動小数点数->floatという区別しかないので、1バイトがintになってもいいかと思った。 (とはいえ1バイトでも多倍長整数でも同じ型になるのは内部でどう扱ってるんだろう)