目次: Linux
プログラムの関数、変数の定義元や参照先に一瞬で飛べるタグジャンプ機能を使っている人は多いと思います。私もGNU globalを使ってタグを生成、vim/gvimでタグジャンプを利用していて、とても便利です。
今まではC/C++のコードを読むことが多かったため、global単体で事足りました。最近はPythonのコードを読むことも増えまして、Pythonもタグジャンプできるように環境を整えることにしました。global単体ではPythonに対応していないので、プラグインとしてpygmentsを使います。exuberant-ctagsのインストールもお忘れなく。
もっとも単純なセットアップ方法&使い方はこんな感じです。
$ sudo apt-get install global python-is-python3 python3-pygments exuberant-ctags $ gtags --gtagslabel=pygments
下記のテストプログラムを使って、タグが正しく作成されたか確認しましょう。
//// a.c
#include <stdio.h>
int cfunc_b(int b);
int cfunc_a(int a)
{
return cfunc_b(a) + 1;
}
int main(int argc, char *argv[])
{
int a = 5;
printf("%d\n", cfunc_a(a));
return 0;
}
//// b.c
int cfunc_b(int b)
{
return b + 2;
}
#### a.py
from b import pyfunc_b
def pyfunc_a(a: int):
return pyfunc_b(a) + 1
if __name__ == "__main__":
print(f"{pyfunc_a(5)}")
#### b.py
def pyfunc_b(b: int):
return b + 2
テストとして基本的な機能3つを確かめます。
#### Cの関数定義、参照個所を探す
$ global -x cfunc_b
cfunc_b 1 b.c int cfunc_b(int b)
$ global -rx cfunc_b
cfunc_b 3 a.c int cfunc_b(int b);
cfunc_b 7 a.c return cfunc_b(a) + 1;
#### Pythonの関数定義、参照個所を探す
$ global -x pyfunc_b
pyfunc_b 1 b.py def pyfunc_b(b: int):
$ global -rx pyfunc_b
pyfunc_b 1 a.py from b import pyfunc_b
pyfunc_b 4 a.py return pyfunc_b(a) + 1
#### grepモードでCもPythonも網羅的に探す
$ global -gx func
func 3 a.c int cfunc_b(int b);
func 5 a.c int cfunc_a(int a)
func 7 a.c return cfunc_b(a) + 1;
func 13 a.c printf("%d\n", cfunc_a(a));
func 1 a.py from b import pyfunc_b
func 3 a.py def pyfunc_a(a: int):
func 4 a.py return pyfunc_b(a) + 1
func 7 a.py print(f"{pyfunc_a(5)}")
func 1 b.c int cfunc_b(int b)
func 1 b.py def pyfunc_b(b: int):
参照個所を探す機能は地味に便利なので、CでもPythonでも動作してくれるのはありがたいですね。
こんなあっさり動けば苦労はないですが、実はDebian TestingでもUbuntu 24.04でも微妙に動きませんでした。あまり使われていないのかもしれない。悲しい。次回はトラブルシューティング編です。
この記事にコメントする
目次: ALSA
未だにPipeWireの音切れがなくなりません。結論から書いておくと音切れは解決できませんでした。もう飽きました。今回はサーバー側PipeWire PulseAudioモジュールのレイテンシ調整をしました。
以前の日記(2025年10月11日の日記参照)で紹介したとおり、pipewireそのものにはリモート音声再生する機能はなくて、PulseAudioのプロトコルを受け付けるpipewire-pulseモジュールを使います。
モジュール(pipewire-pulse)の動作をstraceで追うと、設定ファイルは下記の3つが有効みたいです。
このうち/usr/share/pipewire/pipewire-pulse.confしか存在していなかったので、/usr/shareの設定ファイルを使います。
pulse.properties = {
#...
pulse.min.req = 64/48000
pulse.default.req = 128/48000
pulse.min.frag = 128/48000
pulse.default.frag = 96000/48000
pulse.default.tlength = 96000/48000
pulse.min.quantum = 64/48000
#...
}
とりあえずこんな感じに設定してみました。PipeWireの設定と何が違うんでしょうねえ。
S ID QUANT RATE WAIT BUSY W/Q B/Q ERR FORMAT NAME S 30 0 0 --- --- --- --- 0 Dummy-Driver S 31 0 0 --- --- --- --- 0 Freewheel-Driver S 47 0 0 --- --- --- --- 0 Midi-Bridge R 51 8192 48000 1.2ms 1.2ms 0.01 0.01 0 S24_32 2 48000 alsa_output.platform-es8316-s R 74 23744 48000 252.6us 692.1us 0.00 0.00 0 F32LE 2 48000 + mpv S 52 0 0 --- --- --- --- 0 alsa_input.platform-es8316-so S 53 0 0 --- --- --- --- 0 alsa_output.platform-hdmi0-so S 55 0 0 --- --- --- --- 0 alsa_output.platform-hdmi1-so S 56 0 0 --- --- --- --- 0 alsa_input.platform-hdmiin-so
PulseAudioモジュール側のバッファサイズが24000に近づきましたが、微妙に値が違います。まだ何か設定が要るんです??
しかし困ったことに、PipeWireのドキュメントは本当に意味がわからないです。読んでも「そんなこと聞いてないんだけど?」状態になります。設定項目のブロック構造もわからんし、何の設定項目があって、どの範囲の値が指定できて、どの値で何が起きるのか、全然分かりません。もうイヤ。
これ以上PipeWireに関してやる気が起きません……。PipeWireで何かトラブったら、PipeWireを即削除してPulseAudioを入れ直しをオススメします。
この記事にコメントする
目次: ALSA
PipeWireに変えてから音切れがなくなりません。PulseAudioのときも音切れはしてましたが、PipeWireになってから頻度が段違いに多いです。なぜー?結論から書いておくと、音切れは多少はマシになった気がしますが、完全には解決できていません。今回はサーバー側PipeWireのレイテンシ調整をしました。
PipeWireの設定ファイルはいくつかの場所を認識するみたいです。straceで追ってみると、
この3つが認識されるみたいで、私の環境では/usr/share/pipewire/pipewire.confのみ存在していたので、/usr/share以下にあるファイルを変更します。
設定変更前の状態を再掲しておきます。
S ID QUANT RATE WAIT BUSY W/Q B/Q ERR FORMAT NAME S 30 0 0 --- --- --- --- 0 Dummy-Driver S 31 0 0 --- --- --- --- 0 Freewheel-Driver S 47 0 0 --- --- --- --- 0 Midi-Bridge R 51 2048 48000 594.1us 320.5us 0.01 0.01 1 S24_32 2 48000 alsa_output.platform-es8316-s R 56 8192 48000 245.6us 253.7us 0.01 0.01 1 S32LE 2 48000 + mpv S 52 0 0 --- --- --- --- 0 alsa_input.platform-es8316-so S 53 0 0 --- --- --- --- 0 alsa_output.platform-hdmi0-so S 54 0 0 --- --- --- --- 0 alsa_output.platform-hdmi1-so S 55 0 0 --- --- --- --- 0 alsa_input.platform-hdmiin-so
RATEがサンプリング周波数で、QUANT(※)がバッファサイズのようです。ALSAデバイス側は2048サンプル、PulseAudioモジュール(mpvの話し相手)は8192サンプルです。mpvはpulse-buffer=500を指定したので、500msつまり24000サンプルになるはずですが、なぜか8192です。
ローカル再生なら2桁msのバッファサイズ量で問題ないし、むしろレイテンシがデカすぎなくらいですが、リモート再生だと音がブチブチ切れまくって聞くに堪えません。仕方ないのでバッファを増量する設定を追加します。context.propertiesにある「default.clock.*」系の設定が効くっぽいです。
context.properties = {
#...
default.clock.rate = 48000
default.clock.allowed-rates = [ 48000 ]
default.clock.quantum = 64
default.clock.min-quantum = 32
default.clock.max-quantum = 8192
default.clock.quantum-limit = 48000
こんな感じにしてみました。大事なのはmax-quantum(デフォルト値2048)とquantum-limit(デフォルト値8192)でした。max-quantumはALSAデバイス側に使われるようで、quantum-limitはmpvから指定された値の上限になるみたいです。mpvから長いレイテンシを指定しても、quantum-limitまで切り詰められ意味がなかったのです。
S ID QUANT RATE WAIT BUSY W/Q B/Q ERR FORMAT NAME S 30 0 0 --- --- --- --- 0 Dummy-Driver S 31 0 0 --- --- --- --- 0 Freewheel-Driver S 47 0 0 --- --- --- --- 0 Midi-Bridge R 51 8192 48000 508.0us 1.2ms 0.00 0.01 160 S24_32 2 48000 alsa_output.platform-es8316-s R 54 22080 48000 233.0us 181.7us 0.00 0.00 0 F32LE 2 48000 + mpv S 52 0 0 --- --- --- --- 0 alsa_input.platform-es8316-so S 53 0 0 --- --- --- --- 0 alsa_output.platform-hdmi0-so S 55 0 0 --- --- --- --- 0 alsa_output.platform-hdmi1-so S 56 0 0 --- --- --- --- 0 alsa_input.platform-hdmiin-so
設定変更後、ALSAデバイス側は8192サンプル、PulseAudioモジュール(mpvの話し相手)は22080サンプルになりました。mpvはpulse-buffer=500を指定しているので、24000になってほしいんですけど。なぜこんな微妙な値になるの……??
この記事にコメントする
目次: ブラウザー/メーラー
LinuxデスクトップマシンのFirefox(140.3.1esr 64bit)をアップデートしたところ、アドレスバーの上下に黒い線が表示されるようになりました。何も害はないですが、目立つなあ。Windows版でこのような線は見たことがありません。
昨今のブラウザってシステムのデザインはガン無視で、オレオレGUIコンポーネントを描画してるはずで。それでもデザイン統一できないのはバグなのか、Linux版に何か特有の事情があるのか……?
この記事にコメントする
目次: ALSA
PipeWireに変えてから音切れがなくなりません。PulseAudioのときも音切れはしてましたが、PipeWireになってから頻度が段違いに多いです。なぜー?今回はサーバー側PipeWireのレイテンシ調整に備えて、設定反映方法と設定確認方法を紹介します。
設定を反映するにはpipewire-pulse.socket, pipewire-pulse.service, pipewire.socket, pipewire.service, wireplumber.serviceのうち設定を変更したサービスを再起動すれば良いはずです。良くわからないときは全部再起動しましょう。
$ systemctl --user daemon-reload $ systemctl --user restart pipewire.service #### もし何かおかしかったら下記もやってみると吉 $ systemctl --user restart pipewire.socket $ systemctl --user restart wireplumber.service $ systemctl --user restart pipewire-pulse.service $ systemctl --user restart pipewire-pulse.socket
デバッグ出力を見たければ、上記の5つのサービスを全部stopしてからPipeWireと仲間たちを直接起動すると良いでしょう。
#### サービスを全部止める $ systemctl --user stop pipewire.socket $ systemctl --user stop pipewire.service $ systemctl --user stop wireplumber.service $ systemctl --user stop pipewire-pulse.socket $ systemctl --user stop pipewire-pulse.service #### 直接起動する $ /usr/bin/pipewire -v $ /usr/bin/wireplumber $ /usr/bin/pipewire-pulse -v
ちなみにデバッグログを出すとわかりますが、めちゃくちゃ大量に出ます……私には意味がわかりません。
PipeWireは設定確認にはリモート音声再生している状態でpw-topコマンドを起動して確認すると便利です。
S ID QUANT RATE WAIT BUSY W/Q B/Q ERR FORMAT NAME S 30 0 0 --- --- --- --- 0 Dummy-Driver S 31 0 0 --- --- --- --- 0 Freewheel-Driver S 47 0 0 --- --- --- --- 0 Midi-Bridge R 51 2048 48000 594.1us 320.5us 0.01 0.01 1 S24_32 2 48000 alsa_output.platform-es8316-s R 56 8192 48000 245.6us 253.7us 0.01 0.01 1 S32LE 2 48000 + mpv S 52 0 0 --- --- --- --- 0 alsa_input.platform-es8316-so S 53 0 0 --- --- --- --- 0 alsa_output.platform-hdmi0-so S 54 0 0 --- --- --- --- 0 alsa_output.platform-hdmi1-so S 55 0 0 --- --- --- --- 0 alsa_input.platform-hdmiin-so
RATEがサンプリング周波数で、QUANT(※)がバッファサイズのようです。ALSAデバイス側は2048サンプル、PulseAudioモジュール(mpvの話し相手)は8192サンプルです。mpvはpulse-buffer=500を指定したので、500msつまり24000サンプルになるはずですが、なぜか8192です。
(※)QUANT = quantumのこと。バッファサイズを決めるための数値らしく、単位はサンプルだと思われます。PipeWireのドキュメントを見てもquantumについて説明している部分が見当たらなくて困りました。
この記事にコメントする
| < | 2025 | > | ||||
| << | < | 10 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | - | 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 | - |
25年10月6日
25年10月6日
25年9月29日
25年9月29日
20年8月24日
20年8月24日
16年2月14日
16年2月14日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
20年8月16日
20年8月16日
20年8月16日
20年8月16日
24年6月17日
24年6月17日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: