コグノスケ


2022年 5月 3日

GW の首都高

例年であれば GW は実家に帰省していて、GW の首都高の様子なんて興味もなければ知りもしませんでしたが、今年の GW は珍しく実家に帰らなかったんです。

しかも GW の初日の今日、間違えて湾岸線の「下り」に乗ってしまいました。当然ながらエラい渋滞にはまりましたが、併走する下道は空いているようで不思議でした。

高速道路の下りだけ渋滞!?

ちょっと訳あって朝、昼の 2回(高速上り、下り&高速上り、下道の下り)走ったためか、渋滞の傾向が良く見えました。首都高 1号と湾岸高速の下りだけ 1日中ずっと渋滞していました。湾岸線は北関東ナンバーの車で埋め尽くされていましたが、高速の上りや下道の R357、R15(第一京浜)は空いていました。

別の道、中央道と甲州街道を思い浮かべると、高速も下道もどちらも渋滞しそうなものです。たとえば R15(第一京浜)だって、首都高 1号や横羽線とほぼずっと併走していますし、渋滞していそうなものですがめちゃ空いていて意外でした。まあ、大田区から向こうは知らないですけど……。なぜ首都高だけ例外なんでしょう、不思議ですね。

どこから来るかにもよりますが、C2 や湾岸線下りの混雑を回避するなら、足立区辺りで降りて R4 → 都内 → R15 が下道ルートでしょうか?そうするとですね、

  • 中央道と甲州街道のように高速と下道がわかりやすく併走していない
  • 都内の面倒な道を抜けなければならない
  • 首都高の高速料金を 2回払うことになって高く付く

自分がもし北関東から来たお父さんホリデードライバーだとしたら、わざわざ降りるか?というと……まず降りませんね!普段運転しないならなおさら嫌です。都内の道なんか考えたくない、もし迷おうものなら家族のブーイングは必至。面倒です。

結論

というわけで「GW 初日の湾岸高速は下りのみ 2時間以上の渋滞、上りと、下りに併走する下道はがら空き」という役に立たないクソ知識を体得しました。

超どうでも良い!もう二度と使わなさそう!!

編集者: すずき(更新: 2022年 5月 26日 01:53)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする




2022年 5月 7日

都会と地方の永遠の課題

Twitter で見かけた神奈川から「独立」目指す 3政令市、黒岩知事「正直ピンとこない」…初の 4者同席協議 - 読売新聞という記事を読んで。

もし 3政令指定都市(横浜市&川崎市&相模原市)が抜けたとすると、神奈川県の人口と面積は下記のようになります。

  • 面積: 62%に減少(2416.17→1506.69km2)
  • 人口: 34%に減少(922→318万人)

面積もそこそこ減ります(相模原市が人口の割に広いため)が人口も激減します。記事にもある通り神奈川県は横浜市に離脱されると県税が激減するので、賛成する理由は皆無です。

特別市、特別自治市

記事にある「特別自治市」構想を知らなかったので Wikipedia を(特別自治市 - Wikipedia)見ると、最近言い始めたことではなくて 2010年から何度も出ては消えしていた議論のようです。

さらに古くは 1947年制定の地方自治法に定められた「特別市」制度(特別市 日本の場合 - Wikipedia、1956年に削除され、政令指定都市制度に変更)の頃から、大都市は県から独立したがっていました。お互いの言い分は色々ありましょうが、ざっくり言って「税金の取り合い」です。

  • 政令指定都市: 県に税金を吸われてる、返してくれ!
  • 県: 都市だけで税金を使わないで、地方に回してくれ!

市と県の言い分は完全に対立しており、何らかの強硬手段を用いない限り永遠に合意されることはありません。今回の神奈川県の場合も、話し合いだけならば流れて終わりでしょう……。お金持ちな都市と貧乏な地方の再配分問題が根底にあって、対立は根深いですね。

東京都の構造、世界の構造

大都市圏の地方自治にあたって、国 - 県 - 市という 3段ピラミッドのうち、1段抜かして 2段に変えるアイデア自体はさほど珍しくありません。やり方としては 2種類あるみたいです。

  • 特別市: 国 - 市(県を外す、日本では例なし)
  • 特別区: 国 - 県(市を外す、日本では東京23区)

特別区協議会の資料(諸外国の首都の比較 - 公益財団法人 特別区協議会)によると、特別区はロンドンが近い考え方で、ベルリンは1県 1市で県と市が合併してますね。特別市はパリが近い考え方でしょう。ワシントン D.C. は他のどの地域とも違いますね。国直轄の特別地域かな……?

他の国を調査したまとまった資料を見つける気力が無かったんですが、東京(特別区)は割と珍しい構造に見えます。特別市タイプを目指す「特別自治市」構想のやりたいことは世界や時流にも合っているのでしょう。たぶん。

編集者: すずき(更新: 2022年 5月 8日 10:14)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 10日

プロバイダ - まとめリンク

目次: プロバイダ - まとめリンク

一覧が欲しくなってきたので作りました。

編集者: すずき(更新: 2022年 5月 20日 00:57)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 13日

ゲームを買ったら遊びましょう

Steam と Epic Games と Nintendo Switch で買ったゲームプレイ時間の振り返りです。ゲーム名の左端にある数字は「何時間遊んだか?」、その右はゲームプラットフォームを示します。

23個買って、コンプやクリアは 7つ、相当遊んだ(ゲームプレイ時間 100時間超)と言えるのは 4つ(Cities, Dyson, the Hunter, スプラトゥーン 2)です。買って半数は最後まで遊ばず、3割は放置同然です。

子供の時はゲーム機が壊れるまで遊んでましたけど、PlayStation 2 以降はハードが壊れるより新機種が出る方が早くなりました。もうこの時点でゲーマーから陥落してたのかなあ。

今やゲームを買うが遊ばないという、子供時代の自分が聞いたら「もったいない!」と憤死しそうな、悪い大人になりました。自分の金だから得とか損とかそういう問題は気にしなくて良いんですけど、ゲームを作った人には申し訳ない……。

振り返り結果

傾向として、PC ゲームのアクション系(Battlefield, DAEMON X MACHINA)、Switch のシミュレーションゲーム(A 列車、コロニスト)は諦め率が高いです。アクションはそもそも得意ではないし目が痛くなって疲れるので……諦め率は高めです。むしろ一番苦手なジャンルといえる対戦アクションのスプラトゥーン 2 を 100時間近く遊んだことが奇跡的でした。

Switch のシミュレーションゲームは面白いんですが、画面が狭すぎ&操作しづらいなどゲームとして基本的な部分の出来の悪さに耐えられず嫌になってしまいました。

終わった(実績100%, コンプ or クリアなど)

  • 192.8: Steam: STATIONflow
  • 165.7: Steam: Transport Fever 2
  • 68.5: Steam: Mad Tower Tycoon
  • 35.0: Switch: DUNGEON ENCOUNTERS
  • 23.3: Switch: ぶきあつめ (The World is Your Wepon)
  • 10.0: Switch: Return of the Obra Dinn
  • 1.0: Switch: ごめんね、NPC です

たくさん遊んだ、明確なクリア条件がない、など。

  • 311.7: Steam: Cities: Skylines
  • 245.6: Steam: Dyson Sphere Program
  • 168.8: Steam: the Hunter: Call of the Wild
  • 95.0: Switch: スプラトゥーン 2

未クリア、飽きた、など。

  • 71.5: Steam: Surviving Mars
  • 55.0: Switch: Fire Emblem 風花雪月
  • 39.4: Steam: Timberborn
  • 21.5: Epic: DAEMON X MACHINA
  • 20.0: Switch: ザ・コロニスト
  • 10.0: Switch: マリオカート 8 デラックス
  • 10.0: Switch: A 列車で行こう はじまる観光計画

買ったけどほぼ遊んでいない。

  • 10.9: Steam: Asset Corsa
  • 4.5: Steam: OpneTTD
  • 4.0: Steam: shapez.io
  • 3.9: Steam: Battlefield V
  • 3.9: Steam: Kerbal Space Program

箱庭シミュレーション系が多いのは好みの問題です。

メモ: 技術系の話は Facebook から転記しておくことにした。Switch のゲームを集計に追加。

編集者: すずき(更新: 2022年 5月 14日 14:25)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 14日

スピードシューティングでガスガンの有効活用

目次: 射的 - まとめリンク

新たな趣味でスピードシューティングを始めました。いくつか大会があるそうですが、私が通い始めた TARGET-1 というお店(サイトへのリンク)では「JTSA アンリミテッド」という大会(サイトへのリンク)のルールを使っています。5月末にアンリミテッドの大会があるそうで、大会が終わった 6月からはリミテッドという大会(サイトへのリンク)のルールにするとも言っていました。

  • 全 5コース
  • 1コースあたり 5回の試技(上位 4回のタイムを採用)
  • 1回あたり 5枚の鉄板を撃つ

全コースの合計タイムがスコアとなり(スコアが少ない=早い方が良い成績)ます。銃によりスピードシューティング向き、不向き(※)はあるものの、基本的には好きな銃+ホルスターで参加して構わないです。

個人競技ですから、タイムが遅くても早くても特に誰も迷惑しないのです。個人競技万歳。

(※)いただいたアドバイスによれば、

  • 不向き: ベレッタ、SIG のような初弾ダブルアクション
  • 上級者: M1911 のようなコック&ロックのシングルアクション
  • 初心者: グロックのような(ほぼ)シングルアクション

とのこと。

メモ: 技術系の話は Facebook から転記しておくことにした。いくつか追記。

編集者: すずき(更新: 2022年 5月 16日 17:35)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 15日

携帯電話事業者の栄枯盛衰

楽天モバイルが有料化するというニュースが話題になっていました。無料攻勢を続けていましたが、シェアは 2%程度でかなり苦戦しているそうです。

携帯電話と言えば今も昔もドコモが強いイメージですが、果たしてその認識は合っているのでしょうか?電気通信事業者協会のデータを元に 1996年〜2014年までの契約者数をグラフにしてみました(グラフとまとめたデータは Google スプレッドシートにしておきました)。ウィルコムとアステルのデータはなぜか 1996/06 からしか取れないため、グラフがやや変になっています。ご了承ください。


携帯電話事業者ごとの契約者数

見事にドコモが強いです。ドコモが絶対王者なのはずっと変わらないんですが、

  • 〜2001: ドコモ爆売れ時代
  • 〜2007: au の追撃時代
  • 〜2014: ソフトバンクの追撃時代

という具合でしょうか。

たしか国際電信電話(KDD)、第二電電(DDI)、日本移動通信(IDO)の三社合併で KDDI となったのが 2000年で、ブランドスローガン au by KDDI を言い始めたのが 2000年か 2001年だった気がします。KDDI がドコモを撃ち落とす覚悟の表れだったのかもしれません。

ソフトバンクに目を向けると、ソフトバンクが Vodafone を買収したのが 2006年で、ソフトバンクの猛追はそこから始まったんだろうな〜などと想像するとなかなか面白いグラフですね。

編集者: すずき(更新: 2022年 5月 20日 04:40)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 16日

日本語がおかしいフィッシング詐欺メール

海外から日本語がおかしいスパムやフィッシング詐欺のメールが来ることは多いですが、今回来たメールは桁違いに単語がおかしいです。


日本語がおかしいフィッシング詐欺メール(テキスト表示)

一例を挙げれば、

  • Amazこれをon安全センター
  • 第三ほっとし者
  • 自かりの動的に
  • 設定されがりました
  • ご正常的な仕様に影ンが響
  • シスなたにテム
  • ユーランザーいませ管理いでくセンあなたター
  • 発いとき行元
  • 株えてす式会社
  • Ammsdfazon!?

わざとやっているのではないか?と思うほどにおかしいです。

HTML だとどうなる?

メールヘッダを見ると Content-Type が text/html となっていたので、これはもしかして HTML 表示の場合のみまともに見えるタイプなのでは?と疑って、普段使っているテキスト表示から、 HTML 表示に変更したところ、


日本語がおかしいフィッシング詐欺メール(HTML 表示)

割とまともに表示されました。日本語としてはイマイチですが、完全におかしい単語はなりを潜めています。

テキスト表示の際に多数出てきたおかしな単語の役割もわかりましたね。表示されないようにした意味の無い文字を紛れ込ませ、テキストしか見ないメールクライアントのスパムフィルターに引っかかる事態を回避していると思われます。うまくやっているつもりなんでしょうけど、普段から HTML 表示を無効にしている人には、意味の無い文字が全て見えて逆に不審度が Max になる諸刃の剣です。

余計なことばかり工夫する暇があるなら、その頭をもっと役に立つことに使えば良いのにね……。

編集者: すずき(更新: 2022年 5月 17日 22:52)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 18日

BIGLOBE 光からの勧誘

目次: プロバイダ - まとめリンク

携帯に突然 BIGLOBE 光から電話が掛かってきて、ドコモ光から切り替えないか?と勧誘されました。KDDI はどこから私の電話番号と、ドコモ光を契約していることを知ったのでしょうか……?

勧誘の人は 1,000円/月くらい安くなるはず、今なら工事費を無料で切り替えられる、キャッシュバックの分だけ得、とまくし立ててきます。しかし過去に電話勧誘で契約して良かったことがない(ドコモ光に変えた時とか)ので、契約しませんでした。

料金を確認すると今使っているドコモ光(タイプ A)は 4,400円/月、BIGLOBE 光は 4,378円/月で、ほとんど変わりません。しかも BIGLOBE 光は 3年縛りで、解約の機会がさらに限られます(違約金は 11,900円も取られる)。ドコモ光の 2年縛りだって最悪なのに 3年縛り……悪化させてどうするんでしょう。

適当ばっかり言いやがって、これだから電話勧誘は嫌いなんだ。

編集者: すずき(更新: 2022年 5月 20日 00:56)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 20日

alsa-lib dmix のバグを直した

目次: ALSA - まとめリンク

先日送った alsa-lib へのパッチ(2022年 4月 29日の日記参照)がマージされました(該当するコミットへのリンク)。3週間くらい何も反応が無かったので、送り先を間違ったかな……?と思い始めたところでした。やー良かった良かった。

バグの発見(2014年 7月 9日の日記参照)から直るまでに 8年も空きました。ALSA のような有名な OSS だと利用者数も半端ないので、バグを年単位で放っておくと他の人が同じバグに気づいて直すことが多いです。ところが、このバグは割と発生条件が変わっているのもあり、誰もバグに気づかなかったか、わざわざ直す価値を感じなかったのでしょう。有名 OSS では割と珍しいケースですよね。

編集者: すずき(更新: 2022年 5月 23日 00:34)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 23日

ほとんど見かけない SI 接頭辞デカ(da)

何かの量を表すときは数字+単位(例: 100m)で表します。余りにも桁が多くなり見づらい場合は適切な接頭辞を付けて数字の桁を減らして表すことが多いです(例: 100000m → 100km)。接頭辞は SI(国際単位系)で定義されており、1/1000 を表すミリ(m)や 1000倍を表すキロ(k)などがあります。これらは良く見かける接頭辞だと思います。

しかし SI 接頭辞として定義されているものの、あまり使われない接頭辞もあります。顕著な物はデシ(d)、ヘクト(h)やデカ(da)辺りでしょう。デシとヘクトは少ないながらも見かけますが、デカは使われているところを見たことがありません。

ルールとしては SI 単位であれば、どの SI 接頭辞を付けても間違いではない(ヘクトメートル hm も正しい)ですが、非 SI 単位は SI 接頭辞を付けてはいけない場合があります。良く見かける組み合わせを表にしてみました。

接頭辞 m g PaHzB L a
k(x1000)
h(x100)
da(x10)
d(x1/10)
c(x1/100)
m(x1/1000)

各単位の簡単な解説です。

  • m: メートル、長さの SI 基本単位
  • g: グラム、質量の SI 基本単位(正確には kg が SI 基本単位)
  • Pa: パスカル、圧力の SI 組立単位
  • Hz: ヘルツ、周波数の SI 組立単位
  • B: ベル、比を表す単位
  • L: リットル、体積の非 SI 単位、1000cm^3
  • a: アール、面積の非 SI 単位(a は廃止され、ha のみが残っている)、100m^2

デカを良く使う単位があれば、是非お目に掛かりたいところです……。

編集者: すずき(更新: 2022年 5月 25日 00:25)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 26日

glibc のスレッドとスタック

目次: C 言語と libc - まとめリンク

誰も興味ない glibc の話シリーズ、スレッドのスタックはどうやって確保するのか?を追います。

ソースコードは glibc-2.35 を見ています。pthread_create() の実体はいくつかありますが、2.34 以降ならば __pthread_create_2_1() という関数が実体です。

pthread_create の実体

// glibc/nptl/pthread_create.c

versioned_symbol (libc, __pthread_create_2_1, pthread_create, GLIBC_2_34);
libc_hidden_ver (__pthread_create_2_1, __pthread_create)
#ifndef SHARED
strong_alias (__pthread_create_2_1, __pthread_create)
#endif

主要な関数としては、スタックを確保する allocate_stack() と clone() を呼ぶ create_thread() です。スレッド属性も見てますが、今回は特に使わないので無視します。

スレッド作成に関わる関数の呼び出し関係
__pthread_create_2_1
  allocate_stack
    get_cached_stack
  create_thread

スレッドのスタックは 2通りの確保方法があります。1つはキャッシュ、もう 1つは mmap() です。

スレッドのスタックを確保する処理

// glibc/nptl/pthread_create.c

static int
allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
		void **stack, size_t *stacksize)
{

  //...

      /* Try to get a stack from the cache.  */
      reqsize = size;
      pd = get_cached_stack (&size, &mem);
      if (pd == NULL)    //★★キャッシュがなければこの if 文が成立して mmap でメモリ確保★★
	{
	  /* If a guard page is required, avoid committing memory by first
	     allocate with PROT_NONE and then reserve with required permission
	     excluding the guard page.  */
	  mem = __mmap (NULL, size, (guardsize == 0) ? prot : PROT_NONE,
			MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);

  //...

    retval = create_thread (pd, iattr, &stopped_start, stackaddr,
			    stacksize, &thread_ran);

  //...

この get_cached_stack() が NULL を返す=失敗=キャッシュからスタックを確保できなかった、という意味です。確保できない場合は mmap() を呼んでカーネルから匿名ページを確保し、スタック領域として使います。

キャッシュに追加する人は誰?

キャッシュからスタックを確保できる場合は何か?というと、既に終了したスレッドのスタック領域がキャッシュにある場合です。スレッドの回収 pthread_join() が終わった後のスレッドのスタックにアクセスしてはいけません。つまり誰もアクセスしない領域です。

スタック領域をカーネルに返しても良いですが、カーネルからメモリを確保したり解放するのは一般的に遅い処理のため、別のスレッドのスタックとして再利用してカーネルからのメモリ確保&解放の回数を減らし、効率を上げる仕組みと思われます。

まずは読み出す側である get_cached_stack() 関数のコードから見ます。ちなみにコード内に頻出する tcb という単語は Thread Controll Block の略だそうです。

キャッシュからスタックを確保する処理

// glibc/nptl/allocatestack.c

static struct pthread *
get_cached_stack (size_t *sizep, void **memp)
{
  size_t size = *sizep;
  struct pthread *result = NULL;
  list_t *entry;

  lll_lock (GL (dl_stack_cache_lock), LLL_PRIVATE);

  /* Search the cache for a matching entry.  We search for the
     smallest stack which has at least the required size.  Note that
     in normal situations the size of all allocated stacks is the
     same.  As the very least there are only a few different sizes.
     Therefore this loop will exit early most of the time with an
     exact match.  */
  list_for_each (entry, &GL (dl_stack_cache))    //★★キャッシュのリストを全部調べる★★
    {
      struct pthread *curr;

      curr = list_entry (entry, struct pthread, list);
      if (__nptl_stack_in_use (curr) && curr->stackblock_size >= size)
	{
	  if (curr->stackblock_size == size)    //★★一致するサイズのスタックがあれば使う★★
	    {
	      result = curr;
	      break;
	    }

	  if (result == NULL
	      || result->stackblock_size > curr->stackblock_size)
	    result = curr;
	}
    }

  //...

カギを握るのは dl_stack_cache というスタック領域をキャッシュするリストのようです。先程も言いましたが、このリストに要素が追加されるタイミングの 1つは pthread_join() です。pthread_join() からコードを追います。

pthread_join() からスタックをキャッシュに追加する処理まで

// glibc/nptl/pthread_join.c

int
___pthread_join (pthread_t threadid, void **thread_return)    //★★pthread_join() の実体★★
{
  return __pthread_clockjoin_ex (threadid, thread_return, 0 /* Ignored */,
				 NULL, true);
}
versioned_symbol (libc, ___pthread_join, pthread_join, GLIBC_2_34);


// glibc/nptl/pthread_join_common.c

int
__pthread_clockjoin_ex (pthread_t threadid, void **thread_return,
                        clockid_t clockid,
                        const struct __timespec64 *abstime, bool block)
{
  struct pthread *pd = (struct pthread *) threadid;

  //...

  void *pd_result = pd->result;
  if (__glibc_likely (result == 0))
    {
      /* We mark the thread as terminated and as joined.  */
      pd->tid = -1;

      /* Store the return value if the caller is interested.  */
      if (thread_return != NULL)
	*thread_return = pd_result;

      /* Free the TCB.  */
      __nptl_free_tcb (pd);    //★★これ★★
    }
  else
    pd->joinid = NULL;

  //...


// glibc/nptl/nptl_free_tcb.c

void
__nptl_free_tcb (struct pthread *pd)
{
  /* The thread is exiting now.  */
  if (atomic_bit_test_set (&pd->cancelhandling, TERMINATED_BIT) == 0)
    {
      /* Free TPP data.  */
      if (pd->tpp != NULL)    //★余談 TPP = Thread Priority Protect だそうです★
        {
          struct priority_protection_data *tpp = pd->tpp;

          pd->tpp = NULL;
          free (tpp);
        }

      /* Queue the stack memory block for reuse and exit the process.  The
         kernel will signal via writing to the address returned by
         QUEUE-STACK when the stack is available.  */
      __nptl_deallocate_stack (pd);    //★★これ★★
    }
}
libc_hidden_def (__nptl_free_tcb)


// glibc/nptl/nptl-stack.c

void
__nptl_deallocate_stack (struct pthread *pd)
{
  lll_lock (GL (dl_stack_cache_lock), LLL_PRIVATE);

  /* Remove the thread from the list of threads with user defined
     stacks.  */
  __nptl_stack_list_del (&pd->list);

  /* Not much to do.  Just free the mmap()ed memory.  Note that we do
     not reset the 'used' flag in the 'tid' field.  This is done by
     the kernel.  If no thread has been created yet this field is
     still zero.  */
  if (__glibc_likely (! pd->user_stack))
    (void) queue_stack (pd);    //★★これ★★
  else
    /* Free the memory associated with the ELF TLS.  */
    _dl_deallocate_tls (TLS_TPADJ (pd), false);

  lll_unlock (GL (dl_stack_cache_lock), LLL_PRIVATE);
}
libc_hidden_def (__nptl_deallocate_stack)


/* Add a stack frame which is not used anymore to the stack.  Must be
   called with the cache lock held.  */
static inline void
__attribute ((always_inline))
queue_stack (struct pthread *stack)
{
  /* We unconditionally add the stack to the list.  The memory may
     still be in use but it will not be reused until the kernel marks
     the stack as not used anymore.  */
  __nptl_stack_list_add (&stack->list, &GL (dl_stack_cache));  //★★キャッシュのリストに追加★★

  GL (dl_stack_cache_actsize) += stack->stackblock_size;
  if (__glibc_unlikely (GL (dl_stack_cache_actsize)
			> __nptl_stack_cache_maxsize))
    __nptl_free_stacks (__nptl_stack_cache_maxsize);
}

やっとリスト dl_stack_cache にスタック領域を追加している場所まで来ました。もっとあっさりかと思いましたが、意外と呼び出しが深かったです……。

編集者: すずき(更新: 2022年 5月 27日 20:39)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 5月 27日

PulseAudio で簡易リモート再生

目次: ALSA - まとめリンク

遠くの部屋にある PC で再生した音声を手元のスピーカーで聞きたい場合、スピーカーの線を延々と伸ばすよりリモート再生したほうが楽です。

リモート再生の方法はいくつかありますが、最近の Linux ディストリビューションであれば大抵は PulseAudio がインストールされていると思うので、PulseAudio の TCP 送信機能を使うのが楽でしょう。

サーバー側

サーバー側は音声を受け取ってスピーカーなどに送る役目を果たします。私はスピーカーの横に Raspberry Pi を置いてサーバーにしています。PulseAudio の設定は簡単で、

PulseAudio の設定ファイルを変更
# vi /etc/pulse/default.pa 

load-module module-native-protocol-tcp

既に PulseAudio が起動している場合があるので、一度終了させます。

PulseAudio の終了、起動
$ pacmd

Welcome to PulseAudio 12.2! Use "help" for usage information.

>>> exit

# PulseAudio の再起動をします。

$ pulseaudio -D

PulseAudio の設定テストを行う場合は -D なし(フォアグラウンド実行)すると良いです。Crtl-C で終了できますので、起動&終了が素早くできて楽です。

クライアント側

クライアント側は MP3 などをデコードし、音声をサーバーに送る役目を果たします。使い方は環境変数 PULSE_SERVER を指定して再生するだけです。

クライアント側で音声再生
$ export PULSE_SERVER=192.168.1.10    # ★★PulseAudio サーバー側の IP アドレス★★
$ mplayer --no-video test.mp3

本当は module-zeroconf-discover を正しく設定すれば環境変数をいちいち設定する必要はなく、PulseAudio の設定 GUI から出力先の一つとして選択できるようになるはずです。が、どうも私の環境だとうまく動いてくれなくて挫折しました……。

編集者: すずき(更新: 2023年 1月 23日 14:10)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報