Linux memo 2025/05/15 プロキシ設定no_proxy編

● 結論
- 環境変数は小文字のみを使う
- wgetは使わない
- IPアドレス範囲はCIDRで記載する
- ドメイン部分マッチは「.example.com」形式にする

● 設定の具体例
私は /etc/profile.d/proxy.sh に記載することにしている
- export http_proxy="http://proxy.example.com:8080/"
- export https_proxy="http://proxy.example.com:8080/"
- export no_proxy="localhost,.example.com,192.168.0.0/16,10.0.0.0/8"

● 結論の説明
- wget はもはや環境変数解釈の変更が受け入れられるほどはメンテされていないのであきらめて curl を使う
- cURLは、Curl-v7.86 (2022/10/26)から明文化された https://github.com/curl/curl/issues/9773
- Dockerは、Go次第だが、明文化されている https://pkg.go.dev/golang.org/x/net/http/httpproxy
- gitは、curlをライブラリとして使っているため、curl次第となる
- Goだけが環境変数の大文字から探しに行くため、混乱避けるためにも、大文字環境変数は一切使わない、小文字環境変数のみにするべき
- アスタリスク(asterisk"*")は、「アスタリスクのみ」の場合だけ明文化されている('export no_proxy="*"')ため、これ以外は使わない
- 「no_proxy環境変数の解釈はツール次第だから注意必要」なのはその通りだが、現実的にno_proxyを使うのは上記くらいなので、あまり困らないと思う

● そもそもの前提
- HTTPプロキシが必要な環境の場合、毎回プロキシ指定するのはめんどいので、環境変数 http_proxy や https_proxy で設定することが多い
- LAN内サーバはプロキシなしアクセスする必要あるので、シームレスに使うために、no_proxy 環境変数に除外するものを設定することが多い
- これら環境変数はしょせんは各ツールが各ツールごとに解釈するという動きをする
- no_proxyの解釈がツールによりバラバラなので統一的な no_proxy の設定方法が定まらずみんな困っていた

● 記事
no_proxyを標準化する方法:お客様事例で徹底解説
https://about.gitlab.com/ja-jp/blog/2021/01/27/we-need-to-talk-no-proxy/
↑の記事の翻訳元の記事がこれ
We need to talk: Can we standardize NO_PROXY?
https://about.gitlab.com/blog/2021/01/27/we-need-to-talk-no-proxy/
no_proxy の設定方法が定まらない話を12年前に取りまとめた記事
no_proxy にネットワークアドレスとかワイルドカードを指定しても期待通りに動かない、でどうするかというお話 - 双六工場日誌
https://sechiro.hatenablog.com/entry/2013/08/06/no_proxy_%E3%81%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%A8%E3%81%8B%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92

● その他
今でも外部と通信するのにプロキシ必須としているような組織ってどのくらい残ってんだろ

自作PCを組んだ(2025年)

前に組んだのが2017年だからまる8年立つし、Windows10サポート切れが迫っている(2025年10月)し、という事情で久々にデスクトップ自作PCを組んだ。とはいえ面白みがほぼない普通すぎる構成で。パーツの詳細はこっちへ。

オーバクロックよりも省電力を優先して試行錯誤する。最近は電圧を下げるよりもLLC(CPU Load Line Calibration)を調整するのが流行りの模様。ということで試してみるも、Non-KシリーズのCPUだと相対的に上下幅が小さくなるので、そこまでの差はでない模様。一方で、電圧下げ(offsetでマイナスする)の方向も、最近のCPUはいよいよ上も下もピーキーにコントロールするので、特に低負荷からの立ち上がりで引っかかってしまうことが多い模様。というわけで、申し訳程度に電圧を下げてはみたものの、実際のとこ効果はかなり小さい。

ロード時の負荷管理という意味では、PL1/PL2の電力上限と期間を管理するほうがわかりやすい。PL1/PL2の考えのおかげで、オーバクロックの目的だけではなく、省電力志向もやりやすくなった。i5-14400でテストしてみた感じだと、ワットあたりのCinebenchスコアで計算すると、35W制限が一番効率よく、高効率を選ぶと35W-55Wくらい、定格TDPの65Wを包含しようとすると30W-65Wくらい、となった。ので、PL2を55W、PL1を45Wにしておいた。とはいえ、リテールのCPUクーラでも14400のOCのほぼ上限の85Wくらいで回し続けても十分に冷やせるんだけどね。

ASPMを有効にするのは引き続きアイドル時電力を下げる効果がそこそこあるのを確認した。

ただ、とはいえ自作PCを組む作業は世間一般的には本当に廃れた。特定の目的(ゲーム・動画編集・VTuberなど)があって高性能構成を用意するくらいで、一般的な用途だとちまたにあふれてる小型PCのほうが取り回し含めて十分だなぁとは思う。私も、今回はパーツ流用を考えたから組んだものの、電源やケースも買い替えとなったならば小型PCに走ったかなぁと思う。

あと、Windowsを使う優先度が下がった。旧来の設定を廃することの多いWindows11で、安定性にも疑問を抱くようなトラブルもちらほらとあり、Linuxを使う頻度も上がっている私の事情からすると、そう遠くない時期にWindowsはもう用意しなくてもいいやとなるのかもしれない。

Linux memo 2025/01/09 Yocto編

● ビルド関連
- ダウンロード時間の節約をがんばる
- ビルド並列数を適切にする
- sstate chaceを使う
- iceccを使う

● confパラメータ
- PARALLEL_MAKE ?= "-j 4 -l 12"
- BB_NUMBER_THREADS ?= "4"
--- 上記の掛け算になるので最大16並列になる
--- 1ジョブあたり1GiBくらいメモリを平気で使う
--- 過大な値が初期値に記載されてることが多いので要注意
--- よくばってもスワップで遅くなったりOOMで失敗したりする
--- 深さ優先ビルドのほうが効率良いのでPARALLEL_MAKEを大きくするのがよいと思う
--- "-l 12"でload average制限もつけておくと安全かもしれない
--- - ninjaの場合に -l も引き継ぐ場合と引き継がない場合とがある?(詳細未確認)
--- 「?=」で記載しとくとexportで環境変数で上書きできるので便利
--- - 実は引き継いでほしい変数を宣言しておかないといけない?
--- - 「export BB_ENV_PASSTHROUGH_ADDITIONS="SSTATE_DIR "」など?
- BB_NUMBER_PARSE_THREADS ?= "4" --- parse時はあまり負荷意識する必要ないので特に設定しなくてよいと思う
- PACKAGE_CLASSES ?= "package_ipk" --- rpmからipkにするとビルドは早くなるらしい
--- いまいち効果を確認できず。要追加検証。
- DL_DIR ?= "${TOPDIR}/downloads" --- 複数ツリーでダウンロードフォルダを共通化する
- SSTATE_DIR ?= "${TOPDIR}/sstate-cache" --- 複数ツリーでsstate cacheフォルダを共通化する
- SSTATE_MIRRORS ?= "file://.* http://someserver.tld/share/sstate/" --- リモートや複数PCでsstate cacheを共有する
- INHERIT += "own-mirrors"
- SOURCE_MIRROR_URL = "http://example.com/my-source-mirror"
--- DL_DIRになかったときはここも確認する、PREMIRRORSとほぼ同じだがPREMIRRORSよりも便利らしい
- BB_SERVER_TIMEOUT ?= "20" --- 仕事なくなったbitbake serverが終了するまでの待ち時間、bitbakeコマンドを頻繁に実行するなら大きめの方が良い?
- BB_PRESSURE_MAX_CPU = "200000" --- PSI(Pressure Stall Information)のCPUで追加job実行の制限をする
--- CPUの(論理)個数をNとして、N >> 2 だと仮定して、「2 * 1000000 / N"」 くらいか、と思う
--- 詳細はこのへんを見て
- BB_PRESSURE_MAX_MEMORY --- Pressure Stall(PSI)のmemoryはピーキーなので「スワップ発生中」判定くらいしか使いにくいと思う
- BB_PRESSURE_MAX_IO --- Pressure Stall(PSI)のioは負荷の程度を判断する目的では使い物にならないと思う
- INHERIT += "rm_work" --- 中間ファイルを消してくれるのでディスク容量節約になる

● bitbake基本
- bitbake -c taskname recipe-name
--- "taskname"で普段使うのはこのへんか?
--- fetch patch configure compile install deploy image
--- rm_work --- 中間ファイルを消す
--- clean --- outputを削除する
--- cleansstate --- build時に作ったsstate cacheも削除する
--- cleanall --- ダウンロードしたファイルも削除する
- -f --- 強制実行
- -s --- レシピ一覧
- bitbake -c cleansstate world --- すべてのレシピを指定
- bitbake -c populate_sdk recipe-name --- SDKを作る
- bitbake --runall=fetch recipe-name --- すべてのレシピのfetchのみ実行する
- bitbake -c menuconfig virtual/kernel --- menuconfig実行する

● bitbake応用
- bitbake -e recipe-name --- すると変数名が出る?
- bitbake-layers show-layers --- レイヤー一覧を表示
- bitbake-layers show-recipes --- レシピ一覧を表示
- bitbake-layers show-appends --- bbappend一覧を表示
- oe-pkgdata-util find-path /lib/libc.so.6 --- ファイルを提供するレシピを探す
- bitbake-getvar -r recipe-name VARIABLE --- 変数を参照する箇所をデバッグ表示する
- bitbake -g -u recipie-name target-name --- 依存を調査するためのグラフィカルツール
- bitbake -c devshell recipie-name --- ビルドエラーなどのデバッグ用のdevshellを立ち上げる
--- buildhistory-diff
- bitbake-layers create-layer -p PRIORITY LAYER
--- レイヤーは理解できてないのでこれあまり以上書けない、、

● レシピ基本
- PACKAGES --- レシピが提供するパッケージ名、test.bbがあると「"test-dbg test-staticdev test-dev test-doc test-locale test"」が提供される
- PROVIDERS --- レシピが提供するプロバイダ名、要はbbが提供する成果物のこと、test.bbがあると「test 」が提供される
- DEPENDS --- このレシピのビルドのために先にビルドする必要がある依存パッケージを書く
- RDEPENDS --- このレシピの実行のために必要となる依存パッケージを書く
- SRC_URI --- 「file://」「https://」 あたりを使う、sshの場合は「protocol=ssh;」を追加する形になる?
- SRCREV --- git sha1とかを入れる、「SRCREV = "${AUTOREV}"」でブランチ名オンリーにできるが毎回fetchして最新の変更を追随してしまうので推奨されていない

● レシピ変数
ほぼ下記ここからパクった、、
https://qiita.com/rg125_suzuki/items/702e90084e12e0fdf6de#%E3%81%9D%E3%81%AE%E4%BB%96
- ${S} --- ソースコードの展開先
--- gitの場合明示的に「S = "${WORKDIR}/git"」とする必要がある
- ${BPN} --- 基本レシピ名、zlib-native-1.2.11-r0の場合、zlib
- ${PN} --- fixつきレシピ名、zlib-native-1.2.11-r0の場合、zlib-native
- ${PV} --- バージョン、zlib-native-1.2.11-r0の場合、1.2.11
- ${PR} --- リビジョン、zlib-native-1.2.11-r0の場合、r0
- ${BP} --- ${BPN}-${PV}、zlib-native-1.2.11-r0の場合、zlib-1.2.11
- ${PF} --- ${PN}-${PV}-${PV}、zlib-native-1.2.11-r0の場合、zlib-native-1.2.11-r0
- ${TOPDIR} --- ビルドトップディレクトリ、pock/buil dなど
- ${TMPDIR} --- ${TOPDIR}/tmp
- ${WORKDIR} --- レシピの作業ディレクトリ、poky/build/tmp/work/x86_64-linux/zlib-native/1.2.11-r0 など
- ${D} --- ${WORKDIR}/image
- ${B} --- このレシピを処理するときの一時インストール先?デフォルトは ${S} と同じ?
--- ${S}がsrc、${B}がconfigureしたときのobj、${D}がインストール先、という関係?

● レシピ拡張
- レシピを書き換えるのではなくてレイヤーで重ねるべき、とドキュメントに書かれてる
- bbappendはバージョン固有であるべき、とドキュメントに書かれてる
- example_1.0.bb を example_1.0.bbappend で拡張する
- example_1.%.bbappendは、example_1.0.bb にも example_1.1.bb にも効く
- パッチファイルなどを足すときは.bbappendにこんなのを書く
--- FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
--- SRC_URI += " file://custom-modification-0.patch "
- タスクを拡張するときは.bbappendにこんなのを書く
--- do_install:append() {
--- install -d ${D}${sysconfdir}
--- }

● 仮想パッケージ
- PROVIDES = "virtual/libgl" --- 複数レシピが同じ仮想名を提供できる
- PREFERRED_PROVIDER_virtual/libgl = "mesa" --- 仮想パッケージを選ぶ?
- PREFERRED_VERSION_linux-yocto = "5.14%" --- 特定バージョンを選択する、%はワイルドカード

● レシピ応用
- .bbclass --- レシピのルールのテンプレートみたいなやつ、わざわざ自分でカスタム.bbclassを作るケースはほぼないかと
- base.bbclass kernel.bbclass autotools.bbclass cmake.bbclass meson.bbclass useradd.bbclass などがある
- inherit

● 変数代入
- "=" --- 変数を使用するときに展開(makeと同じ?)
- ":=" -- - 即座に展開(makeと同じ?)
- "+=" --- 後置スペースあり追加
- "=+" --- 前置スペースあり追加
- ".=" --- 後置スペースなし追加
- "=." --- 前置スペースなし追加
- "?=" --- 未割り当てのときに割り当てる
- "??=" --- 未割り当てのままのときにのみ反映されるデフォルト値、ややこしいので使わないほうがいいと思う
- VARIABLE:override = "some_value"
--- 変数展開時に先頭に追加する
--- 「VARIABLE_override」という書き方があったが古い構文なので今後は使わない
- IMAGE_INSTALL:append = " dropbear" --- 末尾にスペースなし追加
- FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" --- 先頭にスペースなし追加
- IMAGE_INSTALL:remove = "i2c-tools" --- 変数内のすべての出現を削除
- KERNEL_DEVICETREE:beaglebone = "am335x-bone.dtb"
--- OVERRIDES内に「beaglebone」があるときのみ代入される
--- 優先代入されるので「beaglebone」がある場合は「KERNEL_DEVICETREE = ""」は無視される

● 変数フラグ
- 主にタスクに条件を足すことができる
- do_compile[dirs] = "${B}" --- タスクを実行する前に生成されるべきディレクトリ
- do_settime[noexec] = "1" --- タスクの実行を無効にする
- do_menuconfig[nostamp] = "1" --- タスク実行時にstampファイルを作らない、のでタスクが常に実行される
- do_patch[depends] = "quilt-native:do_populate_sysroot" --- タスク間の依存を追加

● イメージ作成
- IMAGE_INSTALL --- イメージに入れる
- IMAGE_BASENAME --- イメージファイル名
- IMAGE_FSTYPES --- イメージタイプ、ext4 squashfs などに処理できる?

● FAQ
- Q: DEPENDS と RDEPENDS の違いがわからん
--- A: DEPENDSはビルド時依存、RDEPENDSは実行時依存(だからIMAGE_INSTALLにも効く?)
- Q: ビルドエラーログってどこ?
--- A: モジュール毎の temp/ 以下の "log.do_compile"、"run.do_compile"はそのまま実行可能、どちらもsymlink
- Q: include と require の違いは?
--- A: includeはファイルがなくてもエラーじゃない、requireはパースエラー
- Q: ちょっと変更しただけなのにモジュールやファイルがないというビルドエラーが出る
--- A: 既存のレシピで依存やinstallの記載漏れがあるせいと思われる、bitbakeレシピはチェックが厳格なのでこういうのが起こりやすい

● 参考サイト
Yocto build 時間を10時間から10分に高速化した話 - Qiita
https://qiita.com/naohikowatanabe/items/868eefed28cefec20ff8
【yocto】レシピ内変数の早見表 - Qiita
https://qiita.com/rg125_suzuki/items/702e90084e12e0fdf6de
lockfileでdo_compileをシリアライズするという裏技
https://stackoverflow.com/questions/71885775/mutually-exclusive-bitbake-recipes-tasks

● ドキュメント
12 Variables Glossary / The Yocto Projec
https://docs.yoctoproject.org/ref-manual/variables.html
Yocto Project and OpenEmbedded system development training (PDF注意)
https://bootlin.com/doc/training/yocto/yocto-slides.pdf
このへんにサンプルレシピの具体的な例のURLもぜひほしい

● 所感
Yoctoなにもわからない
Yoctoはプログラマ向けではなくてディストリビュータ向けなので開発には向かないと思う
追加のハマりどころがあれば追記する予定
2025/1/31(Fri): 便利そうなコマンド類を追記、誤字脱字訂正

「Binary Hacks Rebooted」読んだ

Amazonアフィへのリンク

約17年前に発売された「Binary Hacks」の名前を冠する続編本。一般的に「低レイヤー」と呼ばれることの多い、コンピュータソフトウェアの中でも特にOSやCPUに近い部分の技術を、章ごとに1つずつ紹介するという内容になっている。

「Binary Hacks」はそれなりに反響のあった本だったため、その名前を冠するだけで、それ相応に注目を集めることになる。本を読んだ限りでは、名前に恥じることのない程度には濃い内容に仕上がっている。まぁ逆に、こんな内容の濃い本を好き好んで読もうと思うような人がいったいどれだけいるのかというあたりにも疑問を持つ。20年ほど前と比べると、今やこの日本でこういった内容のソフトウェア技術を必要とする仕事やらは本当に減ってしまったなというのが個人的な印象だ。

低レイヤーは技術の進化が早いわけではないとはいえ、20年近くも時代が進むとそれ相応に変わっていくわけで、その内容を雑多的に情報として知れるというのは実際のとこ個人的には非常にありがたい。書籍として出版されることが減ってきているという時代に、しかも需要がどんどん減ってる日本語での技術情報提供でというあたり、儲かりもしないのにこれだけのレベルでまとめ上げてくれた各位には本当に感謝したい。

著者らは「*年後にさらにこの本の続編が出ることを期待して」のような記載を残している。これこそ、こういう領域に熱意を持って力を注ぎこむような人が今後も続くのかどうか、もっと言えば、こんな領域のソフトウェア技術開発を未来の時代に行っているほど日本(なのか日本語なのか)がグローバルに競争力を維持できているのかどうか、という話なのかなと思う。

前作と比べるとページ数が約1.5倍になっている。改めて前作を斜め読みするに、あまり細かく丁寧に説明するような文章にはなっていなくて、それに対し本作は文章をかなり丁寧に書いている事が多いので、その分がページ数の差なのかなと感じた。600ページ超えとなるともはや大型本よね。「サクッと読む」には少々重いというのが若干残念なところか。

というわけで、低レイヤー技術を対象に日本語で書かれた非常にレアな本で、その領域に片足を突っ込んでる人は迷わず買っておけというところ。逆に、低レイヤーに興味がない人には全くささらないと思う。

下記は本の内容で気になったところをメモがてらに。

HACK#6 共有ライブラリの検索の実例
P39「AT_SECUREタグを持つエントリが含まれていた場合」
今まではsuなどのときにLD_LIBRARY_PATHが無効になる条件がわからなかったけど、補助ベクトルが効いていることを知れてよかった。
過去の記事のどこかに「わからない」と自分で書いた記憶があるんだけど、探しても見つからなかったので、訂正ができない。。

HACK#10 TLSのしくみを理解する
P58「TLSアクセスモデル」
gdbでattachしている最中にThread Local Storageな変数へアクセスする方法がいつもわからずに苦労していた。このあたりの記載を頼りに調査すれば、今どきのgdbからのアクセス方法を確立できそう。

HACK#17 LIEFを使ってELFバイナリを書き換える
P92あたり
まさに最近はシンボルの書き換えがクソめんどいから、こういう専用のツールがあることを知れてよかった。ただPython製というのはどうなんだろ。特にクロス環境にて、いずれにしてもlibelfに依存することを考えれば、Pythonに追加対応させるためのツール整備も最近なら大した事ない?

HACK#38 cgroupでプロセスのリソースを管理する
P248 「IOCOST」
I/O Schedulerで制御することしか知らなかった私からすると、こんな他の手段もあるんだなぁと知れてよかった。けど、本書での紹介っぷりからすると、必ずしも思い通りにI/O量を制御できるわけではなさげ?I/O Schedulerでも制御が難しいし、やっぱりI/O制御は難しいという話なのか?

HACK#43 /proc/PID/rootからコンテナ内のファイルに直接アクセスする
docker内のファイルへ外から簡単にアクセスする方法、ずっとこれのやり方が知りたかった。わからなかったので、わざわざdocker cp使って毎回中から外へ大量のコピーをしてしまっていた。

HACK#49 ftraceを使ってカーネル内で起こっていることをトレースする
P341あたり、
KernelShark trace-cmd、あたりは過去に使ってみたことはあるんだけど、これ、目的を定めて使わないと逆に迷走するなと感じた。GUIで可視化すると一部のエライ幹部に受けが良くて、かえって性能改善活動のジャマになって(以下略

セキュリティの大章は全般的にツールを使った力技的な話が多くて「HACKしている」感があまりしないと感じた。数値表現の大章はいわゆる数値計算の分野だというイメージが強くて「まぁ知らなくてもいいかな」と読み飛ばし気味になってしまった。

● いきなり結論
dtorは可能な限り noexcept を明示的につける。

● 参考サイト
非自明なデフォルトのデストラクタは暗黙にnoexcept
https://faithandbrave.hateblo.jp/entry/20120322/1332399681
C++ の noexcept specifier のちょっとややこしい仕様
https://zenn.dev/mafafa/articles/a8ae1e546f7634

● 仕様の要点だけを抽出
- 派生クラスのdtorが例外を出すなら、dtorは暗黙にnoexcept(false)である
- 基底クラスのdtorがvirtualかつ例外を出すなら、dtorは暗黙にnoexcept(false)である
- = deleteと定義したら、dtorのnoexceptは翻訳対象から外れ考慮外になる
- 上記に当てはまらなかったら暗黙にnoexcept(true)である
上記のルールにより、declareとdefineとでnoexcept(true|false)が入れ替わるということが起こり得る

● ハマった点
Effective Modern C++ 項目22: Pimpl イディオムを用いる際は特殊メンバ関数を定義する
のルールに則ると、
- a.hpp に class A で virtual ~A(); とdeclare する
- a.cpp に class A で A::~A() = default; と define する
という具合になると思う。
が、このように書くと、バカマジメに仕様を解釈しようとするやつ(某静的解析ツール)は、
- declare と define とで noexcept のprototypeが異なるかもしれない
みたいなことを言い出す。
回避するためには、基本的に noexcept(true) であると明示した方が良いとなる。
- a.hpp に class A で virtual ~A() noexcept; とdeclare する
- a.cpp に class A で A::~A() noexcept = default; と define する

● 所感
C++マジ闇。。マリカしょ。。

Linux memo 2024/05/23 録画サーバ編

● 概要
「Mirakurun + EPGStationで録画サーバを作ってみた」みたいな記事はもはやそこら中に溢れてるし、手順通りやると構築するだけなら難しくないので、ここではそういうのに書かれてなさそうな点を中心にメモしておく。

● パソコン
TRIGKEY G4 N95にした(Amazonアフィ)
ライセンスの怪しいWindowsは使わない、技適が怪しいBluetooth/WiFiは使わない。
以前にも書いたけど、BIOSで「Advacnced→Power→GT→RC6」を「Enable」にするとGPU消費電力を抑えやすい。あとは、PL1/PL2制限をキツめにし、Ethernetを100Base-TXに制限し、不要なUSBは接続しない(キーボード・マウス)、不必要なHDMIを接続しない、systemctlでbluetoothdを止める、/sys/devices/system/cpu/cpufreq/policy0以下で「energy_performance_preference = balance_power」「scaling_governor = powersave」「scaling_max_freq = 1500000」とかしておけば、idle時で5W前後にはなるはず。WiFiドライバやBluetoothドライバをrmmodしても特に変化は見られなかった。

● チューナ
PLEX PX-W3U4(Amazonアフィ)
px4_drv.git(@nns779)という非公式ドライバがあるが、メンテが止まっちゃっているので、forkしたこっち(@tsukumijima)のほうがいいかもしれない。Ubuntu-24.04LTSで試すと、UBSANのオーバラン誤検出でdmesgが汚れて困ったので、パッチ(0001-change-usage-for-variable-array.txt)作った。が、同じようなパッチを作った人がすでにいた(px4_drv_chrdev20240521.patch)

● ICカードリーダ
SCR3310/v2.0(Amazonアフィ)
可能なら、ICカードリーダはPX-W3U4に内蔵のを使ってみたかったが、Windowsで実際に動かしてUSBバスのダンプを取って...みたいなリバースエンジニアリングする気力までは出なかった。

● Mirakurun(チューナサーバ)
docker拾い食いに抵抗がないなら、docker-mirakurun-epgstation.gitが楽だと思う。recpt1を自分でコンパイルして準備し、tuners.ymlとchannels.ymlを整える必要はあるが、逆にそれだけ行えばもう動いてしまう。後述するが、私はEPGStationは自前で立てることにしたので、docker-compose.ymlでそのへんをごまかした。

● EPGStation(録画視聴サーバ)
Ubuntu-24.04LTSのaptで取れるffmpegでも、vaapiとIntelプロプラドライバを整えれば、QSVによるハードウェアエンコードができるということがわかったので、Ubuntuホストのffmpegを使うためにも、EPGStationはdocker板ではなくて自分で立てることにした。とはいえ公式のレポジトリから持ってきて手順通り動かすだけだけど。ffmpegをvaapiのh264で動かすために、config.ymlenc.jsを変更した。QSVを使うとN95の1.5GHzでもh264エンコードは余裕だった。まぁソフトエンコでも-threads対応だから200-300%くらいでリアルタイムでも回るんだけど。改めてN95/N100シリーズってすげぇ。

● サスペンド
いくら省電力とはいえ、何もやっていないときにも動かしっぱなしにするのはなにかもったいない。ということで、スケジュールをチェックしてサスペンドするsuspendd.plのPerlスクリプトを書いた。次の録画予約、3日に1回EPGデータ巡回、重要なプログラム(sshログイン・Sambaアクセス中・recpt1使用中)、をチェックして空いていたらサスペンドする(rtcwake -m mem -s 3600)ようにしてみた。注意点として、EPGStationは公式にはサスペンドをサポートしていないので、起き上がってきたらresettimer(curl -X POST "http://127.0.0.1:8888/api/recording/resettimer")をしてタイマーのイベントドリブンを再スケジュールする必要がある。しなかったらタイマーイベントがずれて録画予約に失敗する。

● その他
マジメに使い倒すならばデータ置き場をHDDにしたりもいいんだけど、まぁ遊びだから、たぶんこのくらいまでにとどめておくことになるんじゃないかなと思う。暇があれば、生のMPEG2-TSからパケットパースしてschedule EITやpf EITをひろってきて番組表を自力で作る、なんてのもいいのかもしれない。

Amazonアフィリンク

鉄道業界が社会や地域へ貢献できなくなっている具体例を示して問題点を指摘する本。地方赤字路線の廃止を主題にしつつも、鉄道存続そのもののみを議論しても意味がなく、交通を介し地域や自治体が自身を今後どのように運営するべきかを考えないといけない、と説いている点が特徴となる。

趣味のジャンルで活動する人が多い鉄道系YouTuberの分野で、社会問題の観点で語るYouTubeチャネルを運営する鐵坊主氏の著作。元旅行代理の経歴から鉄道を切り口に地域や自治体のあり方を考える動画をカナダから投稿する、というなかなか類のない活動を行っている。自治体や会議体の公表する資料を読み解きながらていねいに根拠を積み上げて議論する、という点も著者の強みとなっている。

鉄道事業は固定費が重く、また関東ですら今後人口減を迎えるため、それを踏まえ各社は長期計画を立てて運営していたが、それが新型コロナの登場で短期計画がすべて吹っ飛ぶほどの赤字になり経営が揺れ動いた。このため、各社により温度差はあるものの、どこも人口減を見据えた長期計画を前倒しで始めざるを得なくなった。これが、特にJRで、地方の赤字鉄道路線を維持するのはこれ以上はムリだとして廃線に向けて議論を加速したい動きになっている。方や地元自治体は、従来通りの廃線反対な声を上げるだけの例が未だに多い。議論を単に先延ばしにするだけではダメで、人口減の速度と社会情勢を踏まえた地域交通のあり方を真剣に考えなければいけない、と著者は説いている。

私も素人ながら地域や都市機能と交通とのあり方をおぼろげながら考えることがあったけど、著者のYouTubeチャネルを見始めてから、かなりマジメに考えるようになった。特に、ここ25年ほどは一貫して、(新幹線を除き)鉄道路線の整備よりも高速道路網の整備が優先され続けてきていて、それにより、高速バスがJRの特急に勝つ方面が増えた、という点をきちんと理解できていなかったと反省している。是非はともかく、JR分割民営化により、大都市部と新幹線以外はもう諦めて手を抜くんだという国交省の方針の成れの果てが今なんだと思い知らされた。これでは、未だに「国鉄」の認識と変わらない主張をするような自治体とは議論がかみ合わないわけで。

新聞や銀行と並び、もはや斜陽だと言われることもある鉄道業界の現状を知るうえでの良本。特に、鉄道を主人公に語るのではなくて、自治体や社会のあり方に踏み込んで考えている点がよい。逆に、現在の議論が停滞している状況を一変させるアイディアを語っているわけではない点には、現実的になかなかいい案があるわけではないとはいえ、仕方がないのかもしれない。

アイテム

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0