text.Baldanders.info
tag:text.Baldanders.info,2024-03-17:/
2024-03-17T10:19:01+00:00
帰ってきた「しっぽのさきっちょ」
https://text.baldanders.info/images/avatar.jpg
https://text.baldanders.info/images/avatar.jpg
不自由な ICOCA
tag:text.Baldanders.info,2024-03-17:/remark/2024/03/icoca-for-persons-with-disabilities/
2024-03-17T10:18:49+00:00
2024-03-17T10:19:01+00:00
本当にバスカードの代替でしかないんだな。
Spiegel
https://baldanders.info/profile/
<p>松江市内の路線バス料金は(現金以外は)長いことペラペラのバスカードでの決済だったのだが,2021年から ICOCA が導入され始め,昨年(2023年)には高齢者割引も ICOCA 決済が既定になった。
ただ身障者については対応が遅れていて,今月に入ってようやく身障者用 ICOCA が配布された。
バスカード全面廃止期限(2024年3月末)に間に合わないかと思ったよ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./ICOCA.jpg"><img src="./ICOCA.jpg" srcset="./ICOCA.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="身障者用 ICOCA 来た!" loading="lazy"></a><figcaption><div><a href="./ICOCA.jpg">身障者用 ICOCA 来た!</a></div></figcaption>
</figure>
<p>見た目は普通の ICOCA カードなのだが,どうも市内路線バスにしか使えないっぽい。
モバイル ICOCA にもできないし,チャージもするなと同封の説明書に書いてあった。
本当にバスカードの代替でしかないんだな。
まぁええけど。
どう考えても身障者用 ICOCA はイレギュラー運用だろうし,この辺が精一杯なんだろう。</p>
<p>なんで今頃こんな話をしているかというと,今日は自転車じゃなくてバス移動だったのよ。
天気予報が「午後からにわか雨が降るかも」などと脅してくるもんで(笑) 結局,にわか雨どころか,午後から晴れてきたけどね。
身障者用 ICOCA がちゃんと機能するか試してみるまでドキドキだったよ。</p>
<p>用事の合間に城山公園に登ってみる。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53592850205/"><img src="./53592850205_d948458ef6_e.jpg" srcset="./53592850205_d948458ef6_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の松江城 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53592850205/">今日の松江城 | Flickr</a></div></figcaption>
</figure>
<p>そういや,月末に花見をするとか言ってたな。
今はどんな感じかな。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53592849435/"><img src="./53592849435_ae92e77bda_e.jpg" srcset="./53592849435_ae92e77bda_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="もうすぐ開花(松江城) | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53592849435/">もうすぐ開花(松江城) | Flickr</a></div></figcaption>
</figure>
<p>おー。
かなり蕾が膨らんでる木があるな。
今年の予想通り,来週末に開花宣言で,月末頃に満開って感じだろうか。</p>
<p>楽しみなことである。</p>
<h2>参考</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B08L4WKDZ7?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41MZe0XgHdL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B08L4WKDZ7?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Canon コンパクトデジタルカメラ PowerShot ZOOM 写真と動画が撮れる望遠鏡 PSZOOM</a></dt>
<dd>キヤノン (Release 2020-12-10)</dd>
<dd>エレクトロニクス</dd>
<dd>B08L4WKDZ7 (ASIN), 4549292179675 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">望遠鏡型コンパクトデジカメ。メモリと充電器(要 Power Delivery)は別に用意する必要がある。使い勝手はまぁまぁ。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-12-04">2022-12-04</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- PowerShot ZOOM -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51au0wo+jpL._SL160_.jpg" width="112" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">群論への第一歩 集合、写像から準同型定理まで</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2024-03-02 (Release 2024-03-02)</dd>
<dd>Kindle版</dd>
<dd>B0CR18XWZW (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">タイトルにあるように「群論」へ至る道を指し示す良書。学生時代に読みたかった orz</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 群論への第一歩 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CKGZ68P9?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51HYEz55zlL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CKGZ68P9?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">LETTER☆彡</a></dt>
<dd>白上フブキ (メインアーティスト)</dd>
<dd>cover corp. (Release 2023-10-06)</dd>
<dd>MP3 ダウンロード</dd>
<dd>B0CKGZ68P9 (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://www.youtube.com/watch?v=LEeFwC4wvpI">100万再生突破</a>おめでとう。正しくアイドル曲で可愛らしい曲。 mora で<a href="https://mora.jp/package/43000066/PA00124218-0-2/">高解像度版</a>が買える。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-13">2024-03-13</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 白上フブキ LETTER☆彡 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B008BR7OM6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/614099rA2HL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B008BR7OM6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">アニソン・コレクションVol.1</a></dt>
<dd>永井ルイ (アーティスト)</dd>
<dd>ストレンジ・デイズ 2012-07-13 (Release 2012-07-14)</dd>
<dd>CD</dd>
<dd>B008BR7OM6 (ASIN), 4562392610015 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">アニメ「THE ビッグオー」のOP曲「BIG-O! Show Must Go On」が収録されてるというので衝動買い。他にあの名曲「乙女のポリシー」とかもある。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-13">2024-03-13</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 永井ルイ ビッグオー BIG-O!Show Must Go On -->
お散歩カメラ 2024-04-16
tag:text.Baldanders.info,2024-03-16:/remark/2024/03/16-osanpo-camera/
2024-03-16T13:25:09+00:00
2024-03-17T10:19:01+00:00
冬インナーを脱ごう / 玉造温泉に行こう / 史跡出雲玉作跡 / 昼飯→定点観測 / 今日の宍道湖(夕景)
Spiegel
https://baldanders.info/profile/
<h2>冬インナーを脱ごう</h2>
<p>松江はここのところ晴天続きで,朝方は放射冷却でそこそこ寒いが,昼間は結構暖かい。
今日の最高気温なんて20℃超えですやん。</p>
<p>というわけで,いよいよ<a href="https://text.baldanders.info/remark/2023/11/base-layer-for-winter/" title="冬用インナー(Base Layer)買うた">冬用インナー</a>を脱ぐときが来た。</p>
<p>冬の間は大変お世話になりました <abbr class="emoji-chars" title="ペコン">🙇</abbr> お陰様で真冬に凍えることもなく快適なサイクリングを楽しめた。
唯一のミスは,<a href="https://text.baldanders.info/remark/2023/11/base-layer-for-winter/" title="冬用インナー(Base Layer)買うた">買った</a>当時はお腹周りに少し贅肉が残ってたので,ワンサイズ上を選択したのだが,冬の間に服が伸びたのか私が痩せたのか,ただの長Tになっちゃって(笑) 次の冬までには買い直さなきゃ。
ちなみに下半身は適正サイズを買ってたので冬の間ほどよい締めつけ感でいい感じに過ごせた。</p>
<h2>玉造温泉に行こう</h2>
<p>暖かくなったら行こうと思ってたところがあるのですよ。
<a href="https://www.tama-yuuyu.com/" title="玉造温泉ゆ~ゆ|島根県松江市玉湯町">玉造温泉ゆ~ゆ</a>。
うちの親も日帰りで気軽に行ける温泉施設と言ってたので気にはなっていたのだが,松江市内からだと宍道湖沿いを通るか<ruby><rb>布志名</rb><rp> (</rp><rt>ふじな</rt><rp>) </rp></ruby>峠を越えるかしないといけないのね。
宍道湖沿いの9号線は車の量が多くて自転車に優しくないエリアがあるのでパス。
んで,布志名峠って確かアップダウンが結構あったよなぁ,と忌避していたのだ。</p>
<p>まぁ,でも,<a href="https://www.kumanokan.jp/" title="八雲温泉ゆうあい熊野館">八雲温泉</a>行くよりは近いし,布志名峠コースを挑戦してみるか,となった。
コースは<a href="https://text.baldanders.info/remark/2023/07/cyclocomputer/" title="サイクルコンピュータ買うた(お散歩カメラ 2023-07-29)">ナビ先生</a>におまかせ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590508713/"><img src="./53590508713_701fd4ce07_e.jpg" srcset="./53590508713_701fd4ce07_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="玉造温泉へGo | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590508713/">玉造温泉へGo | Flickr</a></div></figcaption>
</figure>
<p>まずは松江バイパスの側道を西進する。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590510198/"><img src="./53590510198_d92435452d_e.jpg" srcset="./53590510198_d92435452d_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="乃木二子塚古墳 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590510198/">乃木二子塚古墳 | Flickr</a></div></figcaption>
</figure>
<p><a href="https://maps.app.goo.gl/2fR7ruLZhfGJ2gDF7">乃木二子塚古墳</a>は個人的に松江バイパスの側道を通るときのランドマークにしている。
ここから西に向かい,浜乃木湯町線(県道263)に入る。</p>
<p>おっと,トンネル。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53589432917/"><img src="./53589432917_26d047e6d6_e.jpg" srcset="./53589432917_26d047e6d6_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="仙石トンネル | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53589432917/">仙石トンネル | Flickr</a></div></figcaption>
</figure>
<p>トンネル2つ目。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53589434052/"><img src="./53589434052_18fb80d5da_e.jpg" srcset="./53589434052_18fb80d5da_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="花仙トンネル | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53589434052/">花仙トンネル | Flickr</a></div></figcaption>
</figure>
<p>ぐはっ。
左車線は歩道がない。
流石にトンネルの車道を自転車で通りたくないので反対車線に渡らなきゃ。</p>
<p>で,ここまで来て気がついた。
あれ? 布志名峠は? そうか。
布志名峠って旧道だから今の浜乃木湯町線なら全然楽勝で走れるぢゃん。
ちゃんと調べずに今まで忌避してた私って <code>orz</code></p>
<p>そんなこんなで玉造温泉に到着。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590856535/"><img src="./53590856535_11df4ffe1d_e.jpg" srcset="./53590856535_11df4ffe1d_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="玉湯川 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590856535/">玉湯川 | Flickr</a></div></figcaption>
</figure>
<p>玉造温泉はこんな感じに玉湯川を挟んで温泉旅館が建ち並んでいる。
でも,今回は旅館じゃなくてここ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590755180/"><img src="./53590755180_358ababda5_e.jpg" srcset="./53590755180_358ababda5_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="玉造温泉ゆ〜ゆ | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590755180/">玉造温泉ゆ〜ゆ | Flickr</a></div></figcaption>
</figure>
<p>自転車を停めるところはないかとキョロキョロしてたら奥の方にあった。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590408776/"><img src="./53590408776_d5604a8745_e.jpg" srcset="./53590408776_d5604a8745_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="玉造温泉ゆ〜ゆ 駐輪場 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590408776/">玉造温泉ゆ〜ゆ 駐輪場 | Flickr</a></div></figcaption>
</figure>
<p>ありがたや。
駐輪場があるなら安心して通えるな。
それにしても温泉むすめ?</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590410416/"><img src="./53590410416_b89635a981_e.jpg" srcset="./53590410416_b89635a981_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="温泉むすめ? | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590410416/">温泉むすめ? | Flickr</a></div></figcaption>
</figure>
<p><a href="https://onsen-musume.jp/" title="温泉むすめ公式サイト">そんなん</a>あるのか。
まぁ,いいや。
気を取り直して…</p>
<p><a href="https://www.tama-yuuyu.com/" title="玉造温泉ゆ~ゆ|島根県松江市玉湯町">玉造温泉ゆ~ゆ</a>は1階が売店,3階が会議室,4階が多目的室,5階が大浴場となっている。
今回の目的は5階の大浴場である。
ちなみに4階も覗いてみたがマッサージ室になっていた。
自由に寛げる空間ならここで読書とか考えていたのだが,無理かな。</p>
<p>初めての場所なので受付の方にシステムを訊く。
ふむふむ。
入浴料は600円(税込),ボディシャンプー等は備え付け,タオルは持参か別途購入,と。
さっそく入浴タイム&湯上がりのコーヒー牛乳。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590629724/"><img src="./53590629724_be0dd69ee3_e.jpg" srcset="./53590629724_be0dd69ee3_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="温泉上がりのコーヒー牛乳 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590629724/">温泉上がりのコーヒー牛乳 | Flickr</a></div></figcaption>
</figure>
<p>やっぱ風呂上がりの一杯は<a href="https://www.kisuki-milk.co.jp/" title="木次乳業">木次乳業</a>のコーヒー牛乳だよね。</p>
<p>折角なので温泉街を少し歩いてみることにした。
あわよくばどっかで昼飯をと考えたが,食堂とか開いてるかよく分からん感じだったのでパスした。
飯を食うなら市内まで戻ったほうがいいな<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<h2>史跡出雲玉作跡</h2>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590859675/"><img src="./53590859675_fdd4a44834_e.jpg" srcset="./53590859675_fdd4a44834_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="史跡公園があるのか | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590859675/">史跡公園があるのか | Flickr</a></div></figcaption>
</figure>
<p>おっ,史跡公園があるのか。
登ってみよう。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590425751/"><img src="./53590425751_45095d74ca_e.jpg" srcset="./53590425751_45095d74ca_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="史跡出雲玉作跡 解説 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590425751/">史跡出雲玉作跡 解説 | Flickr</a></div></figcaption>
</figure>
<p>どうやらこの辺りは古代の「玉」の工房があったらしい。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590626213/"><img src="./53590626213_23fcba7486_e.jpg" srcset="./53590626213_23fcba7486_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="玉作工房跡 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590626213/">玉作工房跡 | Flickr</a></div></figcaption>
</figure>
<p>しかし,なんで古代遺跡って丘や山の上にあるのかね。
「馬鹿と煙と権力者は高いところへ上る」ってやつ? 近くに資料館もあったが,丘に登って微妙に疲れたので,今回はパスした。
次回次回。</p>
<h2>昼飯→定点観測</h2>
<p>では市内に戻りますか。
空腹に負けて途中のコメダで昼食。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590871870/"><img src="./53590871870_9c223a1c34_e.jpg" srcset="./53590871870_9c223a1c34_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="コメダで昼食 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590871870/">コメダで昼食 | Flickr</a></div></figcaption>
</figure>
<p>お腹が落ち着いたら,いつもの定点観測。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590926825/"><img src="./53590926825_5575a5aa8d_e.jpg" srcset="./53590926825_5575a5aa8d_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の宍道湖 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590926825/">今日の宍道湖 | Flickr</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590486501/"><img src="./53590486501_f406c361d8_e.jpg" srcset="./53590486501_f406c361d8_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の松江城 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590486501/">今日の松江城 | Flickr</a></div></figcaption>
</figure>
<p>今日も快晴ではあったのだが,花粉か黄砂か,春霞。
おかげで松江城から大山は視認できなかった。</p>
<p>松江城のある城山公園は桜のころにお城まつりがあるのだが,着々と準備が進んでいるようだ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53589612022/"><img src="./53589612022_c7b632b667_e.jpg" srcset="./53589612022_c7b632b667_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="花見の準備OK | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53589612022/">花見の準備OK | Flickr</a></div></figcaption>
</figure>
<p>このあとは<a href="https://www.library.pref.shimane.lg.jp/" title="島根県立図書館">県立図書館</a>やら喫茶店やらで夕方まで読書。</p>
<h2>今日の宍道湖(夕景)</h2>
<p>夕方になったので移動。
まず<a href="https://maps.app.goo.gl/p5CjNcoySbBfARus8">松江大橋</a>から<a href="https://maps.app.goo.gl/tHtD38EUdh52HXRY9">宍道湖大橋</a>越しに夕日を撮ろうと思ったのだが</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53589857442/"><img src="./53589857442_b4c9ca5af5_e.jpg" srcset="./53589857442_b4c9ca5af5_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="宍道湖大橋(夕景) | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53589857442/">宍道湖大橋(夕景) | Flickr</a></div></figcaption>
</figure>
<p>ありゃ,思ったより北寄りだったな。
撮るなら2月末か3月頭にすべきだったか。
まぁ2月末は仕事で死にそうになってたので,どっちみち無理か。
次のチャンスは秋(10月?)だな。</p>
<p>じゃあ,宍道湖に移動するか。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53590732106/"><img src="./53590732106_fc0c65542f_e.jpg" srcset="./53590732106_fc0c65542f_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の宍道湖(夕景) | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53590732106/">今日の宍道湖(夕景) | Flickr</a></div></figcaption>
</figure>
<p>む。
日没は無理だが,夕日はぎりぎり撮れたな。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53591050834/"><img src="./53591050834_b906ba9535_e.jpg" srcset="./53591050834_b906ba9535_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="夕日 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53591050834/">夕日 | Flickr</a></div></figcaption>
</figure>
<p>春霞と低空の薄曇りでいい感じに夕日が撮れました。</p>
<p>これから更に日没時刻が遅くなるので夕日を撮りにくくなるなぁ。
夏至あたりなら仕事帰りにちょっと宍道湖沿いに寄るとかしても面白いかもしれないが。</p>
<p>ほんじゃあ帰りますか。</p>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B08L4WKDZ7?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41MZe0XgHdL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B08L4WKDZ7?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Canon コンパクトデジタルカメラ PowerShot ZOOM 写真と動画が撮れる望遠鏡 PSZOOM</a></dt>
<dd>キヤノン (Release 2020-12-10)</dd>
<dd>エレクトロニクス</dd>
<dd>B08L4WKDZ7 (ASIN), 4549292179675 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">望遠鏡型コンパクトデジカメ。メモリと充電器(要 Power Delivery)は別に用意する必要がある。使い勝手はまぁまぁ。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-12-04">2022-12-04</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- PowerShot ZOOM -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0BLNFPWTQ?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41YvUM53eFL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0BLNFPWTQ?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">trimm ROLLIN サイクルコンピュータ GPS 自転車 速度計 ワイヤレス ナビゲーション ANT+センサー対応 Bluetooth 心拍数 高度計 2.7インチ スピードセンサー(device only)</a></dt>
<dd>Trimm</dd>
<dd></dd>
<dd>B0BLNFPWTQ (ASIN), 8809748020286 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">韓国企業だけどモノは made in Chaina って書いてあった。ナビ機能付きで2万円以下というのは安い。スマホアプリと連携させて操作する。モノクロ液晶だがバッテリ消費は少なめ。各種センサーやスマートウォッチと連携可能。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2023-07-29">2023-07-29</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- trimm ROLLIN サイクルコンピュータ -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51au0wo+jpL._SL160_.jpg" width="112" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">群論への第一歩 集合、写像から準同型定理まで</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2024-03-02 (Release 2024-03-02)</dd>
<dd>Kindle版</dd>
<dd>B0CR18XWZW (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">タイトルにあるように「群論」へ至る道を指し示す良書。学生時代に読みたかった orz</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 群論への第一歩 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B005SY3GS6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/317g8kNr-4L._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B005SY3GS6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">おたふく手袋 冬用インナー 長袖 ハイネック [保温 吸汗速乾 コンプレッション メンズ] JW-170 ホワイト L</a></dt>
<dd>おたふく手袋(Otafuku Glove)</dd>
<dd>Tools & Hardware</dd>
<dd>B005SY3GS6 (ASIN), 4970687608683 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">主に通勤で使うので白を選択。カタログで指定されているサイズよりワンサイズ上を着ている。着ている間はそれほどの締めつけ感はないし(スポーツ用なので当たり前だが)動きを阻害しない。寒くない。自転車を漕いでいても,いい感じに汗を排出している感じ。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2023-11-15">2023-11-15</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- インナー base layer 上 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0044W4MYU?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/31ihKoaN1-L._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0044W4MYU?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">おたふく手袋 冬用インナー ロングタイツ [保温 吸汗速乾 コンプレッション メンズ] JW-162 ブラック M</a></dt>
<dd>おたふく手袋(Otafuku Glove)</dd>
<dd>Tools & Hardware</dd>
<dd>B0044W4MYU (ASIN), 4970687608522 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">主に通勤用に使っている。着ている間はそれほどの締めつけ感はないし(スポーツ用なので当たり前だが)動きを阻害しない。寒くない。自転車を漕いでいても,いい感じに汗を排出している感じ。前とじで「社会の窓」は空いてないので注意。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2023-11-15">2023-11-15</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- インナー base layer 下 タイツ -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CKGZ68P9?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51HYEz55zlL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CKGZ68P9?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">LETTER☆彡</a></dt>
<dd>白上フブキ (メインアーティスト)</dd>
<dd>cover corp. (Release 2023-10-06)</dd>
<dd>MP3 ダウンロード</dd>
<dd>B0CKGZ68P9 (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://www.youtube.com/watch?v=LEeFwC4wvpI">100万再生突破</a>おめでとう。正しくアイドル曲で可愛らしい曲。 mora で<a href="https://mora.jp/package/43000066/PA00124218-0-2/">高解像度版</a>が買える。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-13">2024-03-13</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 白上フブキ LETTER☆彡 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B008BR7OM6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/614099rA2HL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B008BR7OM6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">アニソン・コレクションVol.1</a></dt>
<dd>永井ルイ (アーティスト)</dd>
<dd>ストレンジ・デイズ 2012-07-13 (Release 2012-07-14)</dd>
<dd>CD</dd>
<dd>B008BR7OM6 (ASIN), 4562392610015 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">アニメ「THE ビッグオー」のOP曲「BIG-O! Show Must Go On」が収録されてるというので衝動買い。他にあの名曲「乙女のポリシー」とかもある。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-13">2024-03-13</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 永井ルイ ビッグオー BIG-O!Show Must Go On -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>後で親に聞いたら,温泉街の奥の方,玉造温泉行バスの終点の更に奥に食べ物屋さんがあるらしい。次に行く機会があればちょいと寄ってみるか? <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
渡し守 hyuki さんによる『群論への第一歩』
tag:text.Baldanders.info,2024-03-10:/remark/2024/03/first-step-into-group-theory/
2024-03-10T12:02:43+00:00
2024-03-10T22:52:38+00:00
少なくともプログラマ(を目指す)なら群論もしくは群論の考え方は絶対に必要なのよ。
Spiegel
https://baldanders.info/profile/
<p>今朝は放射冷却で氷点下まで下がったけど,よいお天気だったので,いつものように <a href="https://www.kumanokan.jp/" title="八雲温泉ゆうあい熊野館">八雲温泉</a>でひとっ風呂 → 宍道湖・松江城定点観測 → <a href="https://www.library.pref.shimane.lg.jp/" title="島根県立図書館">県立図書館</a>で読書三昧 というコース。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53577137362/"><img src="./53577137362_6db5084321_e.jpg" srcset="./53577137362_6db5084321_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の大山 from 松江城 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53577137362/">今日の大山 from 松江城 | Flickr</a></div></figcaption>
</figure>
<p>まぁ,この辺は特筆するようなこともなかったのでさらっと流すとして,今回は最近読んでいる本の紹介など。</p>
<h2>群論に至る智慧もしくは彼岸への渡し船</h2>
<p>私は宗教関係者ではなく,うろ覚えで申し訳ないのだが,仏教用語の「般若(prajna)」は「悟りに至る智慧」みたいな意味らしい。
そこから転じて彼岸へ渡る渡し船のようなイメージができ,更に「船」から女性的なイメージができたみたいな話を聞いたことがある(真偽は不明)。</p>
<p>とするなら『<a href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1" title="群論への第一歩 集合、写像から準同型定理まで | 結城 浩 | 数学 | Kindleストア | Amazon">群論への第一歩</a>』は群論に至る智慧もしくは彼岸への渡し船と言っていいだろう。
それじゃあ著者の<a href="https://www.hyuki.com/" title="結城浩 / Hiroshi Yuki / The Essence of Programming / プログラミングのエッセンス">結城浩</a>さんは,さしずめ彼岸(=群論)への渡し守かな(笑)</p>
<p>群論で挫折する人の話はたまに聞くが,私も例にもれず学生時代に群論に挫折した口でして。
いや「丸覚え」するなら単位は取れるのよ。
でもそれじゃあ理解したって言えないぢゃん。
それに暗記が壊滅的に苦手な私では,丸覚えしてもすぐ忘れるし。</p>
<p>まだ巡回群あたりを読んでいるところなのだが,この本を読んだ最初の感想は「学生時代に読みたかった <code>orz</code>」である。
これって書籍版の「<a href="https://www.hyuki.com/pub/books#girl">数学ガール</a>」シリーズを読んだときにも思ったな。</p>
<p>授業で習う群論の何が難しいって,それまで刷り込まれた「読み書き算盤」をベースにした古典数学からのギャップを感じるからなんだよね。
んで「慣れる」前に授業としては終わってしまったりするの。
そして「日常生活で使うわけじゃないし,いっかぁ」みたいな感じで諦める。</p>
<p>でもね。
少なくともプログラマ(を目指す)なら群論もしくは群論の考え方は絶対に必要なのよ。
何故ならプログラミングは論理のコード化だから。
これは,この業界に入って歳をとるほどに痛切に感じるようになった。</p>
<p>何より(数学を含めた)理学とは「真理の探求」であり,それを駆動する好奇心こそが人たらしめるのよ。</p>
<figure>
<blockquote>
<q>理学は、真理の探究であり、工学は善の実現である。そして、藝術は美の表現である--これで所謂「真美善」が揃う</q>
</blockquote>
<figcaption><div><q><a href="https://www.amazon.co.jp/dp/4344980158?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">はやぶさ―不死身の探査機と宇宙研の物語</a></q>より</div></figcaption>
</figure>
<h2>読んでる途中なのに読書感想文</h2>
<p>というわけで『<a href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1" title="群論への第一歩 集合、写像から準同型定理まで | 結城 浩 | 数学 | Kindleストア | Amazon">群論への第一歩</a>』の感想文。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53562362934/"><img src="./53562362934_25f491f454_e.jpg" srcset="./53562362934_25f491f454_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="『群論への第一歩』配信されてた | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53562362934/">『群論への第一歩』配信されてた | Flickr</a></div></figcaption>
</figure>
<p>ラノベ・漫画や軽い読み物ならともかく,こういう真面目な本は自宅だと(他に目移りするものが沢山あるので)なかなか読み進められないのね。
なので,週末の図書館の学習室とかでチマチマと読んでたりする。</p>
<p>前述したように群論に「慣れる」には,如何にして「読み書き算盤」の此岸からスムーズに渡って行けるかにかかっている。
その点で『<a href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1" title="群論への第一歩 集合、写像から準同型定理まで | 結城 浩 | 数学 | Kindleストア | Amazon">群論への第一歩</a>』は抜群に上手いと思う。</p>
<p>他の『<a href="https://www.amazon.co.jp/dp/B079JLW5YN?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラマの数学</a>』や『<a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門</a>』にはなかったと思うんだけど「ちょっと一言」というミニコラムみたいなものがかなりの頻度で(しかも煩くない程度に)差し込まれているのね。
ミニコラムというか著者によるミニブログみたいな感じ。
こういうのって今風だなぁと思ったのだが,どうだろう。</p>
<p>あと,<a href="https://www.hyuki.com/" title="結城浩 / Hiroshi Yuki / The Essence of Programming / プログラミングのエッセンス">結城浩</a>さんの他の著書と同じく,この本でも章ごとに演習問題(と解答&解説)が載ってるんだけど,演習だからとうっかり読み飛ばしたりすると,後の章に</p>
<figure>
<blockquote><ul>
<li><strong>なぜ</strong>、 $(S_3,\circ)$ が <span style="border:solid 1px;border-radius:5px;">G1</span> を満たすといえるのですか<br>
<strong>なぜなら</strong>、写像の合成は結合律を満たすからです(p. 59 の問題 2-3)。</li>
</ul>
</blockquote>
<figcaption><div><q><a href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">『群論への第一歩』p.76</a></q>より</div></figcaption>
</figure>
<p>とか書いてあって「おぅふ」となり慌ててページを戻ったり。
実に<del>鬼畜</del>上手い。
まぁ,これで演習問題も丁寧に読もうという気になるんだけどね。</p>
<p>これを読めば富士山の5合目くらいの高さまでは行けるだろうか。
仕事と違って締切はないので,ゆっくり読み込んでいくことにしよう。</p>
<h2>参考</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51au0wo+jpL._SL160_.jpg" width="112" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CR18XWZW?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">群論への第一歩 集合、写像から準同型定理まで</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2024-03-02 (Release 2024-03-02)</dd>
<dd>Kindle版</dd>
<dd>B0CR18XWZW (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">タイトルにあるように「群論」へ至る道を指し示す良書。学生時代に読みたかった orz</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 群論への第一歩 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B079JLW5YN?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51QDhrqqEtL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B079JLW5YN?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラマの数学 第2版</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2018-01-16 (Release 2018-02-08)</dd>
<dd>Kindle版</dd>
<dd>B079JLW5YN (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">タイトル通りプログラマ必読書。第2版では機械学習に関する章が付録に追加された。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2018-03-19">2018-03-19</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラマの数学 第2版 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
github.com/goark/mt/v2 をリリースした
tag:text.Baldanders.info,2024-03-09:/release/2024/03/goark-mt-v2/
2024-03-09T11:45:42+00:00
2024-03-09T11:45:46+00:00
Mersenne Twister 疑似乱数生成器を実装した拙作のパッケージを math/rand/v2 に対応することにした
Spiegel
https://baldanders.info/profile/
<p><a href="https://go.dev/">Go</a> 1.22 で <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand - pkg.go.dev"><code>math/rand/v2</code></a> パッケージが登場したため, <a href="http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html" title="Mersenne Twister: A random number generator (since 1997/10)">Mersenne Twister</a> 疑似乱数生成器を実装した拙作の <a href="https://github.com/goark/mt" title="goark/mt: Mersenne Twister; Pseudo Random Number Generator, Implemented by Golang"><code>github.com/goark/mt</code></a> パッケージも <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand - pkg.go.dev"><code>math/rand/v2</code></a> に対応することにした。</p>
<p>まずはバージョンを v2 に上げて,以下のインポート・パスに変更した。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">"github.com/goark/mt/v2"</span>
</span></span></code></pre></div><p>また <code>go.mod</code> も同様に</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">require github.com/goark/mt/v2 v2.0.1
</span></span></code></pre></div><p>とする。</p>
<p>例として <a href="https://github.com/goark/mt" title="goark/mt: Mersenne Twister; Pseudo Random Number Generator, Implemented by Golang"><code>github.com/goark/mt/v2</code></a> パッケージと <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand - pkg.go.dev"><code>math/rand/v2</code></a> パッケージを組み合わせて標準正規分布する値を1万個生成してみる。
こんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s">"fmt"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"math"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"math/rand/v2"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="s">"github.com/goark/mt/v2/mt19937"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">rnd</span> <span class="o">:=</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="nx">mt19937</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="nx">rand</span><span class="p">.</span><span class="nf">Int64</span><span class="p">()))</span>
</span></span><span class="line"><span class="cl"> <span class="nx">points</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">float64</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">max</span> <span class="o">:=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"> <span class="nx">min</span> <span class="o">:=</span> <span class="mf">1.0</span>
</span></span><span class="line"><span class="cl"> <span class="nx">sum</span> <span class="o">:=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="k">range</span> <span class="mi">10000</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">point</span> <span class="o">:=</span> <span class="nx">rnd</span><span class="p">.</span><span class="nf">NormFloat64</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">points</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">points</span><span class="p">,</span> <span class="nx">point</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">min</span> <span class="p">=</span> <span class="nx">math</span><span class="p">.</span><span class="nf">Min</span><span class="p">(</span><span class="nx">min</span><span class="p">,</span> <span class="nx">point</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">max</span> <span class="p">=</span> <span class="nx">math</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="nx">max</span><span class="p">,</span> <span class="nx">point</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">sum</span> <span class="o">+=</span> <span class="nx">point</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">n</span> <span class="o">:=</span> <span class="nb">float64</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">points</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ave</span> <span class="o">:=</span> <span class="nx">sum</span> <span class="o">/</span> <span class="nx">n</span>
</span></span><span class="line"><span class="cl"> <span class="nx">d2</span> <span class="o">:=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">p</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">points</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">d2</span> <span class="o">+=</span> <span class="p">(</span><span class="nx">p</span> <span class="o">-</span> <span class="nx">ave</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nx">p</span> <span class="o">-</span> <span class="nx">ave</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">" minimum: "</span><span class="p">,</span> <span class="nx">min</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">" maximum: "</span><span class="p">,</span> <span class="nx">max</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">" average: "</span><span class="p">,</span> <span class="nx">ave</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"standard deviation: "</span><span class="p">,</span> <span class="nx">math</span><span class="p">.</span><span class="nf">Sqrt</span><span class="p">(</span><span class="nx">d2</span><span class="o">/</span><span class="nx">n</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>これを実行するとこんな感じになる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go run sample.go
</span></span><span class="line"><span class="cl"> minimum: -4.465497509270884
</span></span><span class="line"><span class="cl"> maximum: 4.409945906326592
</span></span><span class="line"><span class="cl"> average: 0.010399867661332784
</span></span><span class="line"><span class="cl">standard deviation: 1.0027323703801945
</span></span></code></pre></div><p>まぁまぁ妥当な感じ?</p>
<p><a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> および <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand - pkg.go.dev"><code>math/rand/v2</code></a> パッケージのトップレベル関数群の疑似乱数生成器が ChaCha8 になったおかげで seed を与えるのがめっちゃ楽になった。
これだけでもありがたい。
ともかくこれで,乱数生成周りの調査と対応は一通り完了かな。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://text.baldanders.info/release/mersenne-twister-by-golang/">疑似乱数生成器 goark/mt</a></li>
<li><a href="https://text.baldanders.info/golang/pseudo-random-number-generator-v2/">Go 1.22 における疑似乱数生成器</a></li>
<li><a href="https://zenn.dev/spiegel/articles/20240309-golang-math-rand-v2">Go 1.22 の math/rand/v2 を使ってみる</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/416Stewy0NS._SL160_.jpg" width="123" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語Go</a></dt>
<dd>アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)</dd>
<dd>丸善出版 2016-06-20 (Release 2021-07-13)</dd>
<dd>Kindle版</dd>
<dd>B099928SJD (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想は<a href="https://text.baldanders.info/remark/2016/07/go-programming-language/" >こちら</a>。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-05-22">2021-05-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語Go -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CFL1DK8Q?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51BmDUG6D0L._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CFL1DK8Q?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ</a></dt>
<dd>Teiva Harsanyi (著), 柴田 芳樹 (著)</dd>
<dd>インプレス 2023-08-18 (Release 2023-08-18)</dd>
<dd>Kindle版</dd>
<dd>B0CFL1DK8Q (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://book.impress.co.jp/books/1122101133">版元</a>で PDF 版を購入可能。事実上の Effective Go とも言える充実の内容。オリジナルは敢えてタイトルに “tips” という単語を入れるのを避けたのに邦題が「100 Tips」とかなっていて,原作者がお怒りとの噂(あくまで噂)</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2023-08-18">2023-08-18</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Go言語 100Tips -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4814400535?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41+ew2wl2jL._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4814400535?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">効率的なGo ―データ指向によるGoアプリケーションの性能最適化</a></dt>
<dd>Bartłomiej Płotka (著), 山口 能迪 (翻訳)</dd>
<dd>オライリー・ジャパン 2024-02-24</dd>
<dd>単行本(ソフトカバー)</dd>
<dd>4814400535 (ASIN), 9784814400539 (EAN), 4814400535 (ISBN)</dd>
</dl>
<p class="description">ついに Effective Go のタイトルを冠した本の邦訳が出た。<a href="https://www.oreilly.co.jp/books/9784814400539/">版元</a>で Ebook を買える。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-02-22">2024-02-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 効率的なGo : Effective Go -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B00I8AT1FO?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41353H+BzFL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B00I8AT1FO?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">数学ガール/乱択アルゴリズム</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2011-02-25 (Release 2014-03-12)</dd>
<dd>Kindle版</dd>
<dd>B00I8AT1FO (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">工学ガール,リサちゃん登場!</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-04-19">2015-04-19</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 数学ガール/乱択アルゴリズム -->
Go 1.22 における疑似乱数生成器
tag:text.Baldanders.info,2024-03-07:/golang/pseudo-random-number-generator-v2/
2024-03-07T13:20:40+00:00
2024-03-09T06:48:01+00:00
時代は math/rand/v2 かな
Spiegel
https://baldanders.info/profile/
<p><a href="https://go.dev/">Go</a> 1.22 の <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> パッケージと追加された <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> パッケージを眺めている。</p>
<p>おそらく <a href="https://go.dev/">Go</a> 1.22 における疑似乱数関連の最大のトピックは ChaCha8 がランタイムに組み込まれ,疑似乱数生成器の既定アルゴリズムになったことだろう。</p>
<ul>
<li><span><a href="https://cr.yp.to/snuffle/salsafamily-20071225.pdf">The Salsa20 family of stream ciphers <sup><i class="far fa-file-pdf"></i></sup></a></span> : これがベースになる論文かな</li>
<li><a href="https://en.wikipedia.org/wiki/Salsa20">Salsa20 - Wikipedia</a></li>
<li><a href="https://github.com/C2SP/C2SP/blob/main/chacha8rand.md">C2SP/chacha8rand.md at main · C2SP/C2SP · GitHub</a></li>
<li><a href="https://convto.hatenablog.com/entry/2024/02/26/121013">つくって理解するストリーム暗号 ChaCha20 - ちりもつもればミルキーウェイ</a> : <a href="https://go.dev/">Go</a> でサンプルコードを書いておられる。ありがたや</li>
</ul>
<p>ChaCha はストリーム暗号の一種で,簡単に言うと,疑似乱数を生成してそれを平文と XOR するというものらしい。
このうちの疑似乱数を生成する部分を切り出しているようだ。
ストリーム暗号に使うものなので,暗号技術的にセキュアでかつ速いというのが特徴になるだろうか。
ちなみに ChaCha の後ろについている 20 とか 8 とかはラウンド数を示しているそうな。</p>
<p>ChaCha は OpenSSL だか OpenSSH だかでも見かけたような(うろ覚え)。
もし結城浩さんが『<a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1" title="Amazon.co.jp: 暗号技術入門 第3版 秘密の国のアリス eBook : 結城 浩: Kindleストア">暗号技術入門</a>』の第4版を出される機会があれば,付録でいいので是非 ChaCha にも言及して欲しい。</p>
<h2>ランタイムに ChaCha8 疑似乱数生成器を組み込む</h2>
<p>ChaCha8 疑似乱数生成器のアルゴリズムは <a href="https://pkg.go.dev/internal/chacha8rand" title="chacha8rand package - internal/chacha8rand - Go Packages"><code>internal/chacha8rand</code></a> パッケージに実装されている。
中身については割愛させてもらう。
Internal パッケージなので,サードパーティのパッケージからは直接参照できない。</p>
<p>まずは <a href="https://pkg.go.dev/runtime" title="runtime package - runtime - Go Packages"><code>runtime</code></a> パッケージに組み込んでいる部分を見てみる。
ちょっと長いけどご容赦。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// OS-specific startup can set startupRand if the OS passes
</span></span></span><span class="line"><span class="cl"><span class="c1">// random data to the process at startup time.
</span></span></span><span class="line"><span class="cl"><span class="c1">// For example Linux passes 16 bytes in the auxv vector.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">var</span> <span class="nx">startupRand</span> <span class="p">[]</span><span class="kt">byte</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// globalRand holds the global random state.
</span></span></span><span class="line"><span class="cl"><span class="c1">// It is only used at startup and for creating new m's.
</span></span></span><span class="line"><span class="cl"><span class="c1">// Otherwise the per-m random state should be used
</span></span></span><span class="line"><span class="cl"><span class="c1">// by calling goodrand.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">var</span> <span class="nx">globalRand</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">lock</span> <span class="nx">mutex</span>
</span></span><span class="line"><span class="cl"> <span class="nx">seed</span> <span class="p">[</span><span class="mi">32</span><span class="p">]</span><span class="kt">byte</span>
</span></span><span class="line"><span class="cl"> <span class="nx">state</span> <span class="nx">chacha8rand</span><span class="p">.</span><span class="nx">State</span>
</span></span><span class="line"><span class="cl"> <span class="nx">init</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">readRandomFailed</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// randinit initializes the global random state.
</span></span></span><span class="line"><span class="cl"><span class="c1">// It must be called before any use of grand.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">randinit</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">lock</span><span class="p">(</span><span class="o">&</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">lock</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">globalRand</span><span class="p">.</span><span class="nx">init</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">fatal</span><span class="p">(</span><span class="s">"randinit twice"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">seed</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">seed</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">startupRand</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">c</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">startupRand</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">seed</span><span class="p">[</span><span class="nx">i</span><span class="o">%</span><span class="nb">len</span><span class="p">(</span><span class="nx">seed</span><span class="p">)]</span> <span class="p">^=</span> <span class="nx">c</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nb">clear</span><span class="p">(</span><span class="nx">startupRand</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">startupRand</span> <span class="p">=</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nf">readRandom</span><span class="p">(</span><span class="nx">seed</span><span class="p">[:])</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">seed</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// readRandom should never fail, but if it does we'd rather
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// not make Go binaries completely unusable, so make up
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// some random data based on the current time.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">readRandomFailed</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="nf">readTimeRandom</span><span class="p">(</span><span class="nx">seed</span><span class="p">[:])</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">globalRand</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Init</span><span class="p">(</span><span class="o">*</span><span class="nx">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">clear</span><span class="p">(</span><span class="nx">seed</span><span class="p">[:])</span>
</span></span><span class="line"><span class="cl"> <span class="nx">globalRand</span><span class="p">.</span><span class="nx">init</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="nf">unlock</span><span class="p">(</span><span class="o">&</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">lock</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// readTimeRandom stretches any entropy in the current time
</span></span></span><span class="line"><span class="cl"><span class="c1">// into entropy the length of r and XORs it into r.
</span></span></span><span class="line"><span class="cl"><span class="c1">// This is a fallback for when readRandom does not read
</span></span></span><span class="line"><span class="cl"><span class="c1">// the full requested amount.
</span></span></span><span class="line"><span class="cl"><span class="c1">// Whatever entropy r already contained is preserved.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">readTimeRandom</span><span class="p">(</span><span class="nx">r</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Inspired by wyrand.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// An earlier version of this code used getg().m.procid as well,
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// but note that this is called so early in startup that procid
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// is not initialized yet.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">v</span> <span class="o">:=</span> <span class="nb">uint64</span><span class="p">(</span><span class="nf">nanotime</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nb">len</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p">></span> <span class="mi">0</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">v</span> <span class="p">^=</span> <span class="mh">0xa0761d6478bd642f</span>
</span></span><span class="line"><span class="cl"> <span class="nx">v</span> <span class="o">*=</span> <span class="mh">0xe7037ed1a0b428db</span>
</span></span><span class="line"><span class="cl"> <span class="nx">size</span> <span class="o">:=</span> <span class="mi">8</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p"><</span> <span class="mi">8</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">size</span> <span class="p">=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p"><</span> <span class="nx">size</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">^=</span> <span class="nb">byte</span><span class="p">(</span><span class="nx">v</span> <span class="o">>></span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="nx">i</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span> <span class="p">=</span> <span class="nx">r</span><span class="p">[</span><span class="nx">size</span><span class="p">:]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">v</span> <span class="p">=</span> <span class="nx">v</span><span class="o">>></span><span class="mi">32</span> <span class="p">|</span> <span class="nx">v</span><span class="o"><<</span><span class="mi">32</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/runtime">runtime/rand.go</a></q></div></figcaption>
</figure>
<p>これは疑似乱数生成器の状態(主に seed)を管理してる部分かな。
最初の seed は乱数デバイスから取ってるんだね。
これに失敗すると時刻から生成する,と。
ユーザ側は明示的に seed を指定する必要がなくなるということやね。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// readTimeRandom stretches any entropy in the current time
</span></span></span><span class="line"><span class="cl"><span class="c1">// into entropy the length of r and XORs it into r.
</span></span></span><span class="line"><span class="cl"><span class="c1">// This is a fallback for when readRandom does not read
</span></span></span><span class="line"><span class="cl"><span class="c1">// the full requested amount.
</span></span></span><span class="line"><span class="cl"><span class="c1">// Whatever entropy r already contained is preserved.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">readTimeRandom</span><span class="p">(</span><span class="nx">r</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Inspired by wyrand.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// An earlier version of this code used getg().m.procid as well,
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// but note that this is called so early in startup that procid
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// is not initialized yet.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">v</span> <span class="o">:=</span> <span class="nb">uint64</span><span class="p">(</span><span class="nf">nanotime</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nb">len</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p">></span> <span class="mi">0</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">v</span> <span class="p">^=</span> <span class="mh">0xa0761d6478bd642f</span>
</span></span><span class="line"><span class="cl"> <span class="nx">v</span> <span class="o">*=</span> <span class="mh">0xe7037ed1a0b428db</span>
</span></span><span class="line"><span class="cl"> <span class="nx">size</span> <span class="o">:=</span> <span class="mi">8</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p"><</span> <span class="mi">8</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">size</span> <span class="p">=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p"><</span> <span class="nx">size</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">^=</span> <span class="nb">byte</span><span class="p">(</span><span class="nx">v</span> <span class="o">>></span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="nx">i</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span> <span class="p">=</span> <span class="nx">r</span><span class="p">[</span><span class="nx">size</span><span class="p">:]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">v</span> <span class="p">=</span> <span class="nx">v</span><span class="o">>></span><span class="mi">32</span> <span class="p">|</span> <span class="nx">v</span><span class="o"><<</span><span class="mi">32</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// bootstrapRand returns a random uint64 from the global random generator.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">bootstrapRand</span><span class="p">()</span> <span class="kt">uint64</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">lock</span><span class="p">(</span><span class="o">&</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">lock</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">!</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">init</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">fatal</span><span class="p">(</span><span class="s">"randinit missed"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">globalRand</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Next</span><span class="p">();</span> <span class="nx">ok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">unlock</span><span class="p">(</span><span class="o">&</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">lock</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">x</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">globalRand</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Refill</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// bootstrapRandReseed reseeds the bootstrap random number generator,
</span></span></span><span class="line"><span class="cl"><span class="c1">// clearing from memory any trace of previously returned random numbers.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">bootstrapRandReseed</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">lock</span><span class="p">(</span><span class="o">&</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">lock</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">!</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">init</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">fatal</span><span class="p">(</span><span class="s">"randinit missed"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">globalRand</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Reseed</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nf">unlock</span><span class="p">(</span><span class="o">&</span><span class="nx">globalRand</span><span class="p">.</span><span class="nx">lock</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// rand32 is uint32(rand()), called from compiler-generated code.
</span></span></span><span class="line"><span class="cl"><span class="c1">//go:nosplit
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">rand32</span><span class="p">()</span> <span class="kt">uint32</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nb">uint32</span><span class="p">(</span><span class="nf">rand</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// rand returns a random uint64 from the per-m chacha8 state.
</span></span></span><span class="line"><span class="cl"><span class="c1">// Do not change signature: used via linkname from other packages.
</span></span></span><span class="line"><span class="cl"><span class="c1">//go:nosplit
</span></span></span><span class="line"><span class="cl"><span class="c1">//go:linkname rand
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">rand</span><span class="p">()</span> <span class="kt">uint64</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Note: We avoid acquirem here so that in the fast path
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// there is just a getg, an inlined c.Next, and a return.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// The performance difference on a 16-core AMD is
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// 3.7ns/call this way versus 4.3ns/call with acquirem (+16%).
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">mp</span> <span class="o">:=</span> <span class="nf">getg</span><span class="p">().</span><span class="nx">m</span>
</span></span><span class="line"><span class="cl"> <span class="nx">c</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">mp</span><span class="p">.</span><span class="nx">chacha8</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Note: c.Next is marked nosplit,
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// so we don't need to use mp.locks
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// on the fast path, which is that the
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// first attempt succeeds.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">x</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">c</span><span class="p">.</span><span class="nf">Next</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">ok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">x</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mp</span><span class="p">.</span><span class="nx">locks</span><span class="o">++</span> <span class="c1">// hold m even though c.Refill may do stack split checks
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">c</span><span class="p">.</span><span class="nf">Refill</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mp</span><span class="p">.</span><span class="nx">locks</span><span class="o">--</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// mrandinit initializes the random state of an m.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">mrandinit</span><span class="p">(</span><span class="nx">mp</span> <span class="o">*</span><span class="nx">m</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kd">var</span> <span class="nx">seed</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="kt">uint64</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">seed</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">seed</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="nf">bootstrapRand</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nf">bootstrapRandReseed</span><span class="p">()</span> <span class="c1">// erase key we just extracted
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">mp</span><span class="p">.</span><span class="nx">chacha8</span><span class="p">.</span><span class="nf">Init64</span><span class="p">(</span><span class="nx">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mp</span><span class="p">.</span><span class="nx">cheaprand</span> <span class="p">=</span> <span class="nf">rand</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/runtime">runtime/rand.go</a></q></div></figcaption>
</figure>
<p><code>mrandinit()</code> 関数でランタイムを初期化して,それを使って実際に乱数を取得してるのが <code>rand()</code> 関数だね。
ふむふむ。</p>
<h2>math/rand パッケージのトップレベル関数群にランタイムの ChaCha8 を組み込む</h2>
<p>それじゃあ <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> パッケージの方を見てみよう。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//go:linkname runtime_rand runtime.rand
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">runtime_rand</span><span class="p">()</span> <span class="kt">uint64</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand">math/rand/rand.go</a></q></div></figcaption>
</figure>
<p><code>go:linkname</code> ディレクティブの説明は割愛する。
こうやってリンクしてるということで飲み込んでいただければ(笑) そうそう。
<code>go:linkname</code> ディレクティブは <a href="https://pkg.go.dev/unsafe" title="unsafe package - unsafe - Go Packages"><code>unsafe</code></a> パッケージを要求するので,真似するときは要注意だよ。</p>
<p>ともかく,この <code>runtime_rand()</code> 関数を使って <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>rand</code></a><code>.Source</code> インタフェース互換の構造体 <code>runtimeSource</code> を定義している。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// runtimeSource is an implementation of Source64 that uses the runtime
</span></span></span><span class="line"><span class="cl"><span class="c1">// fastrand functions.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">runtimeSource</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// The mutex is used to avoid race conditions in Read.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">mu</span> <span class="nx">sync</span><span class="p">.</span><span class="nx">Mutex</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="o">*</span><span class="nx">runtimeSource</span><span class="p">)</span> <span class="nf">Int63</span><span class="p">()</span> <span class="kt">int64</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nb">int64</span><span class="p">(</span><span class="nf">runtime_rand</span><span class="p">()</span> <span class="o">&</span> <span class="nx">rngMask</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="o">*</span><span class="nx">runtimeSource</span><span class="p">)</span> <span class="nf">Seed</span><span class="p">(</span><span class="kt">int64</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nb">panic</span><span class="p">(</span><span class="s">"internal error: call to runtimeSource.Seed"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="o">*</span><span class="nx">runtimeSource</span><span class="p">)</span> <span class="nf">Uint64</span><span class="p">()</span> <span class="kt">uint64</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nf">runtime_rand</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand">math/rand/rand.go</a></q></div></figcaption>
</figure>
<p><code>Seed()</code> メソッドを呼び出したら panic 吐くとか容赦ないな(笑) <code>runtimeSource</code> はこんな風に使う。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// globalRandGenerator is the source of random numbers for the top-level
</span></span></span><span class="line"><span class="cl"><span class="c1">// convenience functions. When possible it uses the runtime fastrand64
</span></span></span><span class="line"><span class="cl"><span class="c1">// function to avoid locking. This is not possible if the user called Seed,
</span></span></span><span class="line"><span class="cl"><span class="c1">// either explicitly or implicitly via GODEBUG=randautoseed=0.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">var</span> <span class="nx">globalRandGenerator</span> <span class="nx">atomic</span><span class="p">.</span><span class="nx">Pointer</span><span class="p">[</span><span class="nx">Rand</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">randautoseed</span> <span class="p">=</span> <span class="nx">godebug</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">"randautoseed"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// globalRand returns the generator to use for the top-level convenience
</span></span></span><span class="line"><span class="cl"><span class="c1">// functions.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">globalRand</span><span class="p">()</span> <span class="o">*</span><span class="nx">Rand</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">r</span> <span class="o">:=</span> <span class="nx">globalRandGenerator</span><span class="p">.</span><span class="nf">Load</span><span class="p">();</span> <span class="nx">r</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">r</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// This is the first call. Initialize based on GODEBUG.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kd">var</span> <span class="nx">r</span> <span class="o">*</span><span class="nx">Rand</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">randautoseed</span><span class="p">.</span><span class="nf">Value</span><span class="p">()</span> <span class="o">==</span> <span class="s">"0"</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">randautoseed</span><span class="p">.</span><span class="nf">IncNonDefault</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span> <span class="p">=</span> <span class="nf">New</span><span class="p">(</span><span class="nb">new</span><span class="p">(</span><span class="nx">lockedSource</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span><span class="p">.</span><span class="nf">Seed</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span> <span class="p">=</span> <span class="o">&</span><span class="nx">Rand</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">src</span><span class="p">:</span> <span class="o">&</span><span class="nx">runtimeSource</span><span class="p">{},</span>
</span></span><span class="line"><span class="cl"> <span class="nx">s64</span><span class="p">:</span> <span class="o">&</span><span class="nx">runtimeSource</span><span class="p">{},</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">!</span><span class="nx">globalRandGenerator</span><span class="p">.</span><span class="nf">CompareAndSwap</span><span class="p">(</span><span class="kc">nil</span><span class="p">,</span> <span class="nx">r</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Two different goroutines called some top-level
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// function at the same time. While the results in
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// that case are unpredictable, if we just use r here,
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// and we are using a seed, we will most likely return
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// the same value for both calls. That doesn't seem ideal.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// Just use the first one to get in.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">return</span> <span class="nx">globalRandGenerator</span><span class="p">.</span><span class="nf">Load</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">r</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand">math/rand/rand.go</a></q></div></figcaption>
</figure>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Seed uses the provided seed value to initialize the default Source to a
</span></span></span><span class="line"><span class="cl"><span class="c1">// deterministic state. Seed values that have the same remainder when
</span></span></span><span class="line"><span class="cl"><span class="c1">// divided by 2³¹-1 generate the same pseudo-random sequence.
</span></span></span><span class="line"><span class="cl"><span class="c1">// Seed, unlike the [Rand.Seed] method, is safe for concurrent use.
</span></span></span><span class="line"><span class="cl"><span class="c1">//
</span></span></span><span class="line"><span class="cl"><span class="c1">// If Seed is not called, the generator is seeded randomly at program startup.
</span></span></span><span class="line"><span class="cl"><span class="c1">//
</span></span></span><span class="line"><span class="cl"><span class="c1">// Prior to Go 1.20, the generator was seeded like Seed(1) at program startup.
</span></span></span><span class="line"><span class="cl"><span class="c1">// To force the old behavior, call Seed(1) at program startup.
</span></span></span><span class="line"><span class="cl"><span class="c1">// Alternately, set GODEBUG=randautoseed=0 in the environment
</span></span></span><span class="line"><span class="cl"><span class="c1">// before making any calls to functions in this package.
</span></span></span><span class="line"><span class="cl"><span class="c1">//
</span></span></span><span class="line"><span class="cl"><span class="c1">// Deprecated: As of Go 1.20 there is no reason to call Seed with
</span></span></span><span class="line"><span class="cl"><span class="c1">// a random value. Programs that call Seed with a known value to get
</span></span></span><span class="line"><span class="cl"><span class="c1">// a specific sequence of results should use New(NewSource(seed)) to
</span></span></span><span class="line"><span class="cl"><span class="c1">// obtain a local random generator.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">Seed</span><span class="p">(</span><span class="nx">seed</span> <span class="kt">int64</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">orig</span> <span class="o">:=</span> <span class="nx">globalRandGenerator</span><span class="p">.</span><span class="nf">Load</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// If we are already using a lockedSource, we can just re-seed it.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">if</span> <span class="nx">orig</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">orig</span><span class="p">.</span><span class="nx">src</span><span class="p">.(</span><span class="o">*</span><span class="nx">lockedSource</span><span class="p">);</span> <span class="nx">ok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">orig</span><span class="p">.</span><span class="nf">Seed</span><span class="p">(</span><span class="nx">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Otherwise either
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// 1) orig == nil, which is the normal case when Seed is the first
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// top-level function to be called, or
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// 2) orig is already a runtimeSource, in which case we need to change
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// to a lockedSource.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// Either way we do the same thing.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span> <span class="o">:=</span> <span class="nf">New</span><span class="p">(</span><span class="nb">new</span><span class="p">(</span><span class="nx">lockedSource</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="nx">r</span><span class="p">.</span><span class="nf">Seed</span><span class="p">(</span><span class="nx">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">!</span><span class="nx">globalRandGenerator</span><span class="p">.</span><span class="nf">CompareAndSwap</span><span class="p">(</span><span class="nx">orig</span><span class="p">,</span> <span class="nx">r</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Something changed underfoot. Retry to be safe.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nf">Seed</span><span class="p">(</span><span class="nx">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand">math/rand/rand.go</a></q></div></figcaption>
</figure>
<p>つまり,環境変数 <code>GODEBUG</code> で明示的に指定(<code>randautoseed=0</code>)するか最初に <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>rand</code></a><code>.Seed()</code> 関数を呼び出すかしない限りランタイムに組み込んだ ChaCha8 疑似乱数生成器が有効になるっちうわけだ。
ちなみに <code>lockedSource</code> は <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> パッケージに従来からある疑似乱数生成器で,名前の通り,ちゃんと mutex で排他処理している。</p>
<h2>math/rand/v2 パッケージにおける Source インタフェースの定義</h2>
<p>では,いよいよ <a href="https://go.dev/">Go</a> 1.22 で追加された <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> パッケージを見てみよう。</p>
<p><a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> パッケージと <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> パッケージとの大きな違いは <code>rand.Source</code> インタフェースが非互換になっていることだろう。</p>
<p><a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> パッケージの <code>Source</code> インタフェースの定義は以下の通り。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// A Source represents a source of uniformly-distributed
</span></span></span><span class="line"><span class="cl"><span class="c1">// pseudo-random int64 values in the range [0, 1<<63).
</span></span></span><span class="line"><span class="cl"><span class="c1">//
</span></span></span><span class="line"><span class="cl"><span class="c1">// A Source is not safe for concurrent use by multiple goroutines.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">Source</span> <span class="kd">interface</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">Int63</span><span class="p">()</span> <span class="kt">int64</span>
</span></span><span class="line"><span class="cl"> <span class="nf">Seed</span><span class="p">(</span><span class="nx">seed</span> <span class="kt">int64</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// A Source64 is a [Source] that can also generate
</span></span></span><span class="line"><span class="cl"><span class="c1">// uniformly-distributed pseudo-random uint64 values in
</span></span></span><span class="line"><span class="cl"><span class="c1">// the range [0, 1<<64) directly.
</span></span></span><span class="line"><span class="cl"><span class="c1">// If a [Rand] r's underlying [Source] s implements Source64,
</span></span></span><span class="line"><span class="cl"><span class="c1">// then r.Uint64 returns the result of one call to s.Uint64
</span></span></span><span class="line"><span class="cl"><span class="c1">// instead of making two calls to s.Int63.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">Source64</span> <span class="kd">interface</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Source</span>
</span></span><span class="line"><span class="cl"> <span class="nf">Uint64</span><span class="p">()</span> <span class="kt">uint64</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand">math/rand/rand.go</a></q></div></figcaption>
</figure>
<p>これに対して <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> ではこう定義されている。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// A Source is a source of uniformly-distributed
</span></span></span><span class="line"><span class="cl"><span class="c1">// pseudo-random uint64 values in the range [0, 1<<64).
</span></span></span><span class="line"><span class="cl"><span class="c1">//
</span></span></span><span class="line"><span class="cl"><span class="c1">// A Source is not safe for concurrent use by multiple goroutines.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">Source</span> <span class="kd">interface</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">Uint64</span><span class="p">()</span> <span class="kt">uint64</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand/v2">math/rand/v2/rand.go</a></q></div></figcaption>
</figure>
<p>どえらシンプル! <code>Seed()</code> メソッドがなくなったのは大きいね。
これによって <code>runtimeSource</code> やトップレベル関数群が参照する <code>globalRand</code> の定義もめっさシンプルになった。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// globalRand is the source of random numbers for the top-level
</span></span></span><span class="line"><span class="cl"><span class="c1">// convenience functions.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">var</span> <span class="nx">globalRand</span> <span class="p">=</span> <span class="o">&</span><span class="nx">Rand</span><span class="p">{</span><span class="nx">src</span><span class="p">:</span> <span class="o">&</span><span class="nx">runtimeSource</span><span class="p">{}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//go:linkname runtime_rand runtime.rand
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">runtime_rand</span><span class="p">()</span> <span class="kt">uint64</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// runtimeSource is a Source that uses the runtime fastrand functions.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">runtimeSource</span> <span class="kd">struct</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="o">*</span><span class="nx">runtimeSource</span><span class="p">)</span> <span class="nf">Uint64</span><span class="p">()</span> <span class="kt">uint64</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nf">runtime_rand</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand/v2">math/rand/v2/rand.go</a></q></div></figcaption>
</figure>
<p>うんうん。
シンプルが一番だね。</p>
<h2>ChaCha8 を rand.Source にする</h2>
<p>ChaCha8 疑似乱数生成器を疑似乱数の <code>Source</code> として明示的に組み込む場合は, <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>rand</code></a><code>.NewChaCha8()</code> 関数を使って生成する。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">"internal/chacha8rand"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// A ChaCha8 is a ChaCha8-based cryptographically strong
</span></span></span><span class="line"><span class="cl"><span class="c1">// random number generator.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">ChaCha8</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">state</span> <span class="nx">chacha8rand</span><span class="p">.</span><span class="nx">State</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// NewChaCha8 returns a new ChaCha8 seeded with the given seed.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">NewChaCha8</span><span class="p">(</span><span class="nx">seed</span> <span class="p">[</span><span class="mi">32</span><span class="p">]</span><span class="kt">byte</span><span class="p">)</span> <span class="o">*</span><span class="nx">ChaCha8</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">c</span> <span class="o">:=</span> <span class="nb">new</span><span class="p">(</span><span class="nx">ChaCha8</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">c</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Init</span><span class="p">(</span><span class="nx">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">c</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Seed resets the ChaCha8 to behave the same way as NewChaCha8(seed).
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><span class="nx">ChaCha8</span><span class="p">)</span> <span class="nf">Seed</span><span class="p">(</span><span class="nx">seed</span> <span class="p">[</span><span class="mi">32</span><span class="p">]</span><span class="kt">byte</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">c</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Init</span><span class="p">(</span><span class="nx">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Uint64 returns a uniformly distributed random uint64 value.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><span class="nx">ChaCha8</span><span class="p">)</span> <span class="nf">Uint64</span><span class="p">()</span> <span class="kt">uint64</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">x</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">c</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Next</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">ok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">x</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">c</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nf">Refill</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand/v2">math/rand/v2/chacha8.go</a></q></div></figcaption>
</figure>
<p>ランタイムに組み込まれているものと違って,こちらは排他処理を行っていない。
並行的に安全(concurrency safe)ではないわけだ。
なので平行処理下で <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> の ChaCha8 を扱う場合は要注意である。
つか,平行処理下で ChaCha8 疑似乱数生成器を使うならトップレベル関数群を使うべきだろう。</p>
<h2>PCG を rand.Source にする</h2>
<p><a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> にはもうひとつ疑似乱数生成器が用意されている。
PCG (Permuted Congruential Generator) というそうな。</p>
<figure lang="en">
<blockquote class="nobox"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// A PCG is a PCG generator with 128 bits of internal state.
</span></span></span><span class="line"><span class="cl"><span class="c1">// A zero PCG is equivalent to NewPCG(0, 0).
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">PCG</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">hi</span> <span class="kt">uint64</span>
</span></span><span class="line"><span class="cl"> <span class="nx">lo</span> <span class="kt">uint64</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// NewPCG returns a new PCG seeded with the given values.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">NewPCG</span><span class="p">(</span><span class="nx">seed1</span><span class="p">,</span> <span class="nx">seed2</span> <span class="kt">uint64</span><span class="p">)</span> <span class="o">*</span><span class="nx">PCG</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="o">&</span><span class="nx">PCG</span><span class="p">{</span><span class="nx">seed1</span><span class="p">,</span> <span class="nx">seed2</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://pkg.go.dev/math/rand/v2">math/rand/v2/pcg.go</a></q></div></figcaption>
</figure>
<p>PCG は線形合同法(LCG)のバリエーションなんだそうで, LCG の統計学上の欠点を改善したものらしい。
2014年に発表された比較的新しいアルゴリズムのようだが,今のところは欠点のようなものは特に指摘されてないとか。
当然ながら暗号技術分野では使えない。</p>
<ul>
<li><a href="http://www.pcg-random.org/index.html">PCG, A Family of Better Random Number Generators | PCG, A Better Random Number Generator</a></li>
<li><a href="https://en.wikipedia.org/wiki/Permuted_congruential_generator">Permuted congruential generator - Wikipedia</a></li>
<li><a href="https://ja.wikipedia.org/wiki/Permuted_congruential_generator">Permuted congruential generator - Wikipedia</a> : 日本語</li>
</ul>
<p>こちらも並行的に安全ではないのでご注意を。</p>
<h2>これから math/rand を使う理由はないかな</h2>
<p>今までは <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> で用意されている疑似乱数生成器は暗号技術的にセキュアではない(要件である「予測困難性」を満たさない)ため使いどころを考えなければならなかったが <a href="https://go.dev/">Go</a> 1.22 から <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a>, <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> ともに ChaCha8 が既定の疑似乱数生成器なったため用途を選ばずカジュアルに使えるようになるだろう。
そうなると,これから疑似乱数生成器を使おうというとききに,わざわざ <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> を使う理由はないかな。
<a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> って無駄に複雑になってる感じだもんなぁ。</p>
<p>ちなみに <a href="https://pkg.go.dev/math/rand/v2" title="rand package - math/rand/v2 - Go Packages"><code>math/rand/v2</code></a> では <code>Read()</code> 関数もなくなっているが, <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>math/rand</code></a> でも <a href="https://pkg.go.dev/math/rand" title="rand package - math/rand - Go Packages"><code>rand</code></a><code>.Read()</code> 関数は Deprecated になってるし,<a href="https://go.dev/doc/go1.22#math_rand_v2" title="Go 1.22 Release Notes - The Go Programming Language">リリースノート</a>を見ると, <code>Read()</code> 関数が使いたきゃ <a href="https://pkg.go.dev/crypto/rand" title="rand package - crypto/rand - Go Packages"><code>crypto/rand</code></a> パッケージを使え,みたいなことが書いてあるので,まぁそういうことなんだろう。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://go.dev/doc/go1.22">Go 1.22 Release Notes - The Go Programming Language</a></li>
<li><a href="https://tools.ietf.org/html/rfc4086">RFC 4086 - Randomness Requirements for Security</a> (<a href="https://www.nic.ad.jp/ja/tech/ipa/RFC4086JA.html" title="セキュリティのための乱雑性についての要件">日本語訳</a>)</li>
<li><a href="https://text.baldanders.info/golang/pseudo-random-number-generator/">Go の疑似乱数生成器は並行的に安全ではないらしい(追記あり)</a></li>
<li><a href="https://zenn.dev/spiegel/articles/20240309-golang-math-rand-v2">Go 1.22 の math/rand/v2 を使ってみる</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/416Stewy0NS._SL160_.jpg" width="123" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語Go</a></dt>
<dd>アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)</dd>
<dd>丸善出版 2016-06-20 (Release 2021-07-13)</dd>
<dd>Kindle版</dd>
<dd>B099928SJD (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想は<a href="https://text.baldanders.info/remark/2016/07/go-programming-language/" >こちら</a>。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-05-22">2021-05-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語Go -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CFL1DK8Q?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51BmDUG6D0L._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CFL1DK8Q?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ</a></dt>
<dd>Teiva Harsanyi (著), 柴田 芳樹 (著)</dd>
<dd>インプレス 2023-08-18 (Release 2023-08-18)</dd>
<dd>Kindle版</dd>
<dd>B0CFL1DK8Q (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://book.impress.co.jp/books/1122101133">版元</a>で PDF 版を購入可能。事実上の Effective Go とも言える充実の内容。オリジナルは敢えてタイトルに “tips” という単語を入れるのを避けたのに邦題が「100 Tips」とかなっていて,原作者がお怒りとの噂(あくまで噂)</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2023-08-18">2023-08-18</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Go言語 100Tips -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4873118468?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51pUKQajnaL._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4873118468?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Go言語による並行処理</a></dt>
<dd>Katherine Cox-Buday (著), 山口 能迪 (翻訳)</dd>
<dd>オライリージャパン 2018-10-26</dd>
<dd>単行本(ソフトカバー)</dd>
<dd>4873118468 (ASIN), 9784873118468 (EAN), 4873118468 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://www.oreilly.co.jp/books/9784873118468/">Eブック版もある</a>。感想は<a href="https://text.baldanders.info/remark/2018/11/concurrency-in-go/">こちら</a>。 Go 言語で並行処理を書くならこの本は必読書になるだろう。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2020-01-13">2020-01-13</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Go言語による並行処理 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4814400535?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41+ew2wl2jL._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4814400535?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">効率的なGo ―データ指向によるGoアプリケーションの性能最適化</a></dt>
<dd>Bartłomiej Płotka (著), 山口 能迪 (翻訳)</dd>
<dd>オライリー・ジャパン 2024-02-24</dd>
<dd>単行本(ソフトカバー)</dd>
<dd>4814400535 (ASIN), 9784814400539 (EAN), 4814400535 (ISBN)</dd>
</dl>
<p class="description">ついに Effective Go のタイトルを冠した本の邦訳が出た。<a href="https://www.oreilly.co.jp/books/9784814400539/">版元</a>で Ebook を買える。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-02-22">2024-02-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 効率的なGo : Effective Go -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B00I8ETG96?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51bXS7crIjL._SL160_.jpg" width="117" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B00I8ETG96?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">赤ずきんチャチャ 1 (りぼんマスコットコミックスDIGITAL)</a></dt>
<dd>彩花みん (著)</dd>
<dd>集英社 1993-02-15 (Release 2014-02-25)</dd>
<dd>Kindle版</dd>
<dd>B00I8ETG96 (ASIN)</dd>
</dl>
<p class="description">そういえばコミックは読んでないかな。「リボン」は読まなかったからなぁ...</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-07">2024-03-07</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 赤ずきんチャチャ -->
スマホで高解像度音楽ファイルを鳴らしてみる
tag:text.Baldanders.info,2024-03-05:/remark/2024/03/high-resolution-audio/
2024-03-05T03:46:15+00:00
2024-03-05T09:31:44+00:00
違いが分からん orz
Spiegel
https://baldanders.info/profile/
<p><a href="https://text.baldanders.info/remark/2024/03/ktai-and-music/" title="スマホと音楽">前回</a>の続き。</p>
<p>スマホの <a href="https://www.jp.onkyo.com/support/hfplayer/" title="オーディオ&ビジュアル製品情報:Onkyo HF Player">Onkyo HF Player</a> アプリと USB-DAC + BOSE 卓上スピーカーの構成で高解像度版の音楽ファイルを鳴らしたらどうなるか気になったので,以下の2つの方法を試してみた。</p>
<ol>
<li><a href="https://mora.jp/" title="音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~">mora</a> で購入した音楽ファイルと Amazon で購入した MP3 のファイルを比較してみる</li>
<li><a href="https://mora.jp/" title="音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~">mora</a> で購入した音楽ファイルと CD からリッピングしたファイルを比較してみる</li>
</ol>
<h2>高解像度版(High Resolution)音楽ファイル</h2>
<p>知ってる人には今更な話だが,音楽データの場合 CD が基準になっていて,それ以上の解像度のデータを「ハイレゾ(High Resolution)」と呼んでいるらしい。
解像度を示すパラメータは2つあって,ひとつはサンプリングレート,もうひとつは量子化ビット数である<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。
ものすごく端折って言うと,サンプリングレートは時間に対する分解能で,量子化ビット数はダイナミックレンジを決める値と考えてよい。
CD の場合は $44.1\,\mathrm{kHz}$ / $16\,\mathrm{bits}$ の解像度である<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。
そして,サンプリングレートまたは量子化ビット数がCDより大きければ「ハイレゾ」なんだそうな。</p>
<p>「ハイレゾ」か否かの指標にはもうひとつあって,それがデータの圧縮方法である。
MP3 ファイルは非可逆圧縮方式なので元に戻した際にどうしても情報落ちが発生する。
このため MP3 ファイルは数値上の解像度に関わらず「ハイレゾ」とは見なされないようだ。</p>
<p>一方,可逆圧縮方式で普及している(大抵のメジャーな音楽配信サービスで対応している)のが FLAC (Free Lossless Audio Codec) である。
つまり FLAC ファイルで $44.1\,\mathrm{kHz}$ / $16\,\mathrm{bits}$ 以上の解像度であれば「ハイレゾ」と言えるわけだ。</p>
<p>とまぁ,話を単純化したところで早速比べてみよう。</p>
<h2>アップサンプリング</h2>
<p>少し前に MindaRyn さんの「<a href="https://www.amazon.co.jp/dp/B0CPM8V21D?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">HIBANA</a>」を Amazon で購入したので,同じタイトルを <a href="https://mora.jp/" title="音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~">mora</a> でも購入してみた。</p>
<ul>
<li><a href="https://mora.jp/package/43000100/LAXX24518B00Z_96/">HIBANA/MindaRyn|音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~</a></li>
</ul>
<p>ここで買える音楽ファイルは FLAC で解像度は $96.0\,\mathrm{kHz}$ / $24\,\mathrm{bits}$ である。
さっそく聴き比べてみたのだが… 違いが分からん <code>orz</code></p>
<p>実は <a href="https://www.jp.onkyo.com/support/hfplayer/" title="オーディオ&ビジュアル製品情報:Onkyo HF Player">Onkyo HF Player</a> 有料版の機能に「アップサンプリング機能」ってのがあって USB-DAC を繋いだ状態だと最大で $384\,\mathrm{kHz}$までレートを上げてくれる(レートの最大値は USB-DAC の性能による。意図的に低めに設定することも可能)。
実際に Amazon で買った MP3 版は $352.8\,\mathrm{kHz}$, <a href="https://mora.jp/" title="音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~">mora</a> で買った FLAC 版は $384\,\mathrm{kHz}$ になっていた。
ここまでくると私ごときの耳では聴き分けられないわけだ。</p>
<h2>「組曲 惑星」をリッピングしてみる</h2>
<p>今度は,以前に CD で買った「<a href="https://www.amazon.co.jp/dp/B0009N2VDM?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">組曲 惑星</a>(小澤征爾さんの指揮)」をリッピングして FLAC ファイルに落としてみる。
Ubuntu では昔に<a href="https://text.baldanders.info/remark/2019/06/ripping-cd-music-in-ubuntu/" title="Ubuntu で音楽 CD のリッピング">紹介</a>した <a href="http://www.littlesvr.ca/asunder/">Asunder</a> が FLAC に対応している。</p>
<figure style='margin:0 auto;text-align:center;'><a href="asunder-settings.png"><img src="./asunder-settings.png" srcset="./asunder-settings.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="Asunder settings" loading="lazy"></a><figcaption><div><a href="asunder-settings.png">Asunder settings</a></div></figcaption>
</figure>
<p>早速これを使って FLAC ファイルを作成してみる。
でも,これって CD 以上の解像度にはならないよね,多分。</p>
<p><a href="https://mora.jp/" title="音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~">mora</a> でも「組曲 惑星」を探してみたのだが,こちらは小澤征爾さんの指揮によるものはなくて,以下のものを購入した。</p>
<ul>
<li><a href="https://mora.jp/package/43000069/8555776h/">ホルスト: 組曲「惑星」/神秘のトランペッター Op. 18(スコティッシュ・ナショナル管/ロイド=ジョーンズ)/ロイヤル・スコティッシュ・ナショナル管弦楽団/デイヴィッド・ロイド=ジョーンズ(指揮)|音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~</a></li>
</ul>
<p>こちらは $44.1\,\mathrm{kHz}$ / $24\,\mathrm{bits}$ の解像度。
トータルで1GBもあるよ。
ファイルサイズがデカくなるから意図的にサンプリングレートを落としてるのか? まぁいいや。</p>
<p><a href="https://www.jp.onkyo.com/support/hfplayer/" title="オーディオ&ビジュアル製品情報:Onkyo HF Player">Onkyo HF Player</a> で聴くと,両者とも $352.8\,\mathrm{kHz}$ にアップサンプリングされた。
やっぱり違いは分からず。</p>
<p>アップサンプリング機能を外して比較することも考えたが,わざとスペックを落として比較することに意義を感じなかったので止めた。
要するに MP3 だろうが FLAC だろうが <a href="https://www.jp.onkyo.com/support/hfplayer/" title="オーディオ&ビジュアル製品情報:Onkyo HF Player">Onkyo HF Player</a> から USB-DAC 経由で BOSE の卓上スピーカーで聴く限り,少なくとも私の耳では,違いは分からんということだ。</p>
<p>まぁ,でも,折角 <a href="https://mora.jp/" title="音楽ダウンロード・音楽配信サイト mora ~WALKMAN®公式ミュージックストア~">mora</a> にサインアップしたし,可逆圧縮の FLAC で曲が手に入るなら,これからは FLAC を優先して調達してもいいかなぁ。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://av.watch.impress.co.jp/docs/topic/1068831.html">「ハイレゾ」の基本をおさらい。DSDやFLAC、MQAなどの違いとは? - AV Watch</a></li>
<li><a href="https://pc.watch.impress.co.jp/docs/column/ubuntu/1486550.html">【Ubuntu日和】【第23回】ハイレゾは?Spotifyは?LDACは?Ubuntuで音楽を聴くあれこれ - PC Watch</a></li>
<li><a href="https://mikajabana.medium.com/bluetooth-sbc%E3%82%B3%E3%83%BC%E3%83%87%E3%83%83%E3%82%AF%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E9%9F%B3%E8%B3%AA%E3%81%8C%E6%82%AA%E3%81%84%E3%81%AE%E3%81%8B-64ef74727bad">Bluetooth SBCコーデックは本当に音質が悪いのか - 謝花ミカ - Medium</a></li>
</ul>
<h2>参考</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B00CD1PTF0?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41Msfl5WSZL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B00CD1PTF0?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Bose Companion 2 Series III multimedia speaker system [並行輸入品]</a></dt>
<dd>BOSE(ボーズ)</dd>
<dd>エレクトロニクス</dd>
<dd>B00CD1PTF0 (ASIN), 7123290434782 (EAN), 0017817602853 (EAN), 4969929233370 (EAN), 0667562762502 (EAN), 7887117126884 (EAN), 017817602853 (UPC), 667562762502 (UPC)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">頑張ったご褒美に購入。特に低音が素晴らしい。流石 BOSE といったところか。入力はオーディオ端子が2系統ある。デジタルの入力ポートはない。電力は AC アダプタから。卓上スピーカーとしては上々。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- BOSE Conpanion 2 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0BL76SJL6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/415qeo-Mn+L._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0BL76SJL6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">【VGP2023SUMMER金賞】iBasso Audio DC03PRO アイバッソ Type C タイプC USB DAC ポータブル 小型 アンプ 3.5mm ケーブル着脱式 ハイレゾ HD ロスレス android ゲーム 音楽【国内正規品】 (ブルー)</a></dt>
<dd>iBasso Audio</dd>
<dd></dd>
<dd>B0BL76SJL6 (ASIN), 6971585541216 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">スマホや PC の USB から入力する Digital Analog Converter。低音から高音までくっきりはっきり。PCM なら 384kHz/32bits, DSD なら 11.2MHz/1bit までのネイティブ再生に対応している。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- USB-DAC -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B09TVLHJ1X?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/31S-IHi04IL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B09TVLHJ1X?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">ミニサイズ Shokz OpenRun Mini 骨伝導イヤホン 公式ストア正規品 ワイヤレス 急速充電 驚きの通話品質 IP67防塵防水 bluetooth5.1 2 30日間返品無料 コズミックブラック</a></dt>
<dd>Shenzhen Shokz Co., Ltd.</dd>
<dd>エレクトロニクス</dd>
<dd>B09TVLHJ1X (ASIN), 4512223694288 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">以前のものはマルチファンクションキーが利かなくなったので Black Friday の安売りのタイミングで買い替え。私のように頭の小さい人向け(笑) 値段並みの音質はある,と思う。耳が自由って素晴らしい。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-12-04">2022-12-04</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Shokz OpenRun Mini 骨伝導ヘッドセット -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CPM8V21D?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41vb70KpmlL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CPM8V21D?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">HIBANA</a></dt>
<dd>MindaRyn (メインアーティスト)</dd>
<dd>Lantis 2024-01-11 (Release 2024-01-11)</dd>
<dd>MP3 ダウンロード</dd>
<dd>B0CPM8V21D (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">アニメ「戦国妖狐 世直し姉弟編」の OP 曲。 MindaRyn さんはよい。高解像度版を <a href="https://mora.jp/package/43000100/LAXX24518B00Z_96/">mora</a> で購入できる。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-02-23">2024-02-23</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- HIBANA : MindaRyn -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0009N2VDM?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51w7ejZMH4L._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0009N2VDM?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">ホルスト:組曲(惑星)</a></dt>
<dd>小澤征爾 (アーティスト)</dd>
<dd>Universal Music 2005-06-21 (Release 2005-06-22)</dd>
<dd>CD</dd>
<dd>B0009N2VDM (ASIN), 4988005392589 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="3"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://text.baldanders.info/remark/2022/07/neck-speaker/">衝動買いしたネックスピーカー</a>の評価用音源として購入。以前持ってたのは引越し時に処分してしまったので実質的には買い戻しになるのかな。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-08-12">2022-08-12</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- ホルスト 組曲 惑星 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B09V3D51LF?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/417Cyb1E-oL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B09V3D51LF?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">ビッグブリッヂの死闘(FFPR Ver.)</a></dt>
<dd>植松 伸夫 (メインアーティスト)</dd>
<dd>スクウェア・エニックス ミュージック 2022-03-17 (Release 2022-03-17)</dd>
<dd>MP3 ダウンロード</dd>
<dd>B09V3D51LF (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">神曲。高解像度版を <a href="https://mora.jp/package/43000021/SQEX-50142-2/">mora</a> で購入できる。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-05">2024-03-05</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- ビッグブリッヂの死闘 -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>この記事では PCM (Pulse Code Modulation) を前提に書いている。これとは別に DSD (Direct Stream Digial) というのもあるのだが,仕組みが全然違うので割愛する。 DSD の音楽ファイルは <code>.dff</code> とか <code>.dsf</code> とかいった拡張子になることが多い。また,音楽配信サービスで売っている DSD ファイルは最初から高解像度になるようパラメータが選ばれているため,無条件で「ハイレゾ」だと思っていいだろう。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>アナログレコードのダイナミックレンジが概ね $65\,\mathrm{dB}$ ほどで CD は計算から $16\,\mathrm{bits}\times6=96\,\mathrm{dB}$ と言われている。人間の耳で苦痛なく知覚できるダイナミックレンジは $120\,\mathrm{dB}$ 程度と言われているが,音の感受性についてはリニアではなく,実際には量子化ビット数は $16\,\mathrm{bits}$ もあれば十分という<a href="https://qiita.com/keiya/items/c994c200e8b38b6c7935" title="なぜハイレゾは「バカげている」のか #DSP - Qiita">主張</a>もある。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
もうすぐ春ですね(お散歩カメラ 2024-03-04)
tag:text.Baldanders.info,2024-03-04:/remark/2024/03/04-osanpo-camera/
2024-03-04T11:00:17+00:00
2024-03-04T11:58:45+00:00
いつものように八雲温泉 / 定点観測→帰宅 / 【おまけ】ハッシュタグ名は重要?
Spiegel
https://baldanders.info/profile/
<p>いや,暦上は既に春なんだけどね(笑)</p>
<h2>いつものように八雲温泉</h2>
<p>折角の5連休なのだが,日中確実に晴れると予報している日が今日しかなくて。
温泉行くなら今日しかない! というわけで,いつものように<a href="https://www.kumanokan.jp/" title="八雲温泉ゆうあい熊野館">八雲温泉</a>へ。
今回は低血糖にならないよう,こまめに栄養補給したり。</p>
<p>ようやく周りの景色を楽しむ余裕ができたというか。
目には映ってるのに視認してないものもあって,たとえば<a href="http://www.kumanotaisha.or.jp/" title="出雲國一之宮 熊野大社">熊野大社</a>の鳥居の横にある水車小屋とか。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566316831/"><img src="./53566316831_1cf7febc91_e.jpg" srcset="./53566316831_1cf7febc91_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="水車 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566316831/">水車 | Flickr</a></div></figcaption>
</figure>
<p>そんなことより,お風呂行こうお風呂。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566636149/"><img src="./53566636149_af7bb8f3f1_e.jpg" srcset="./53566636149_af7bb8f3f1_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="風呂上がりの一杯 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566636149/">風呂上がりの一杯 | Flickr</a></div></figcaption>
</figure>
<p>温泉のある<a href="https://www.kumanokan.jp/" title="八雲温泉ゆうあい熊野館">熊野館</a>は火曜日が定休日だそうで。そのせいなのか,自販機のコーヒー牛乳が売り切れてたですよ。
いや,普通の牛乳も好きなのでいいけどね。
<a href="https://www.kisuki-milk.co.jp/" title="木次乳業">木次乳業</a>の牛乳は美味い。</p>
<p>食堂も月曜がお休みなので(田舎はねー)食べるところもないのだが,昼食のために市内にとって返す前に<a href="http://www.kumanotaisha.or.jp/" title="出雲國一之宮 熊野大社">熊野大社</a>に詣でておこう。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566803765/"><img src="./53566803765_916c9ee87c_e.jpg" srcset="./53566803765_916c9ee87c_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="熊野大社 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566803765/">熊野大社 | Flickr</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566554643/"><img src="./53566554643_f4d842b756_e.jpg" srcset="./53566554643_f4d842b756_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="おみくじ in 熊野大社 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566554643/">おみくじ in 熊野大社 | Flickr</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566555578/"><img src="./53566555578_1966cda08f_e.jpg" srcset="./53566555578_1966cda08f_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="餌くれ | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566555578/">餌くれ | Flickr</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566684614/"><img src="./53566684614_40c0f66069_e.jpg" srcset="./53566684614_40c0f66069_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="梛の木 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566684614/">梛の木 | Flickr</a></div></figcaption>
</figure>
<p><ruby><rb>梛</rb><rp> (</rp><rt>なぎ</rt><rp>) </rp></ruby>の木は縁結びの御利益のある木なんだってさ。
境内にポツンとあって目立ってたので,つい撮ってしまった。
まぁ,いまさら縁結びとか興味ないね(by クラウド)。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566812510/"><img src="./53566812510_8cec94c249_e.jpg" srcset="./53566812510_8cec94c249_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="もうすぐ春ですね | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566812510/">もうすぐ春ですね | Flickr</a></div></figcaption>
</figure>
<p>だんだん景色に色が付いてくるというか春が近づいてる感じ。</p>
<h2>定点観測→帰宅</h2>
<p>では昼飯を食いに市内に移動しますかね。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566466031/"><img src="./53566466031_d658ef0436_e.jpg" srcset="./53566466031_d658ef0436_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="意宇川 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566466031/">意宇川 | Flickr</a></div></figcaption>
</figure>
<p>本当は JR 松江駅付近で昼食を食べるつもりだったけど,途中でギブアップしてコメダで飯を食いました。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566786359/"><img src="./53566786359_ddfff51c0d_e.jpg" srcset="./53566786359_ddfff51c0d_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="コメダで昼食 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566786359/">コメダで昼食 | Flickr</a></div></figcaption>
</figure>
<p>では,移動していつもの定点観測でもするか。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566784668/"><img src="./53566784668_c7e14f8a23_e.jpg" srcset="./53566784668_c7e14f8a23_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の宍道湖 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566784668/">今日の宍道湖 | Flickr</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53567028845/"><img src="./53567028845_8d5d529a0e_e.jpg" srcset="./53567028845_8d5d529a0e_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の松江城 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53567028845/">今日の松江城 | Flickr</a></div></figcaption>
</figure>
<p>うう。
だんだん曇ってきた。
今日は松江城から大山は見えず。</p>
<p>今日は<a href="https://www.library.pref.shimane.lg.jp/" title="島根県立図書館">県立図書館</a>も休館日なので,そのまま松江駅付近に移動して用事を済ませる。
用事が済んだら,天気も悪くなってるみたいだし,帰ろうかね。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53566879928/"><img src="./53566879928_3270944257_e.jpg" srcset="./53566879928_3270944257_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="今日の宍道湖(夕景) | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53566879928/">今日の宍道湖(夕景) | Flickr</a></div></figcaption>
</figure>
<p>一度衰えた筋力と体力はなかなか元に戻らない。
まぁ,地道にフィットネスバイクから始めよう。</p>
<h2>【おまけ】ハッシュタグ名は重要?</h2>
<p>最近 Bluesky がハッシュタグに対応したようで,早速<a href="https://github.com/goark/toolbox" title="goark/toolbox: A collection of miscellaneous commands">自作ツール</a>でも対応して<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>,写真<a href="https://text.baldanders.info/remark/2023/07/crawler/" title="Mastodon と Bluesky でボット運用はじめました">ボット</a>投稿に <code>#photography</code> のタグを追加した。
したら,ちょっとリアクションが増えたのね。
ハッシュタグで追跡してる人が結構いるということなのかねぇ。</p>
<p>個人的にはハッシュタグがずらずら並んでる投稿は鬱陶しいと感じてしまうので,自投稿でもあまり付けないようにしてるのだが「注目の搾取」という意味ではちゃんと意味があるんだなぁと思った。
勉強になりました。</p>
<p>だからといってハッシュタグをずらずら並べるような真似は,これからもしないけどね。</p>
<h2>参考</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B08L4WKDZ7?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41MZe0XgHdL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B08L4WKDZ7?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Canon コンパクトデジタルカメラ PowerShot ZOOM 写真と動画が撮れる望遠鏡 PSZOOM</a></dt>
<dd>キヤノン (Release 2020-12-10)</dd>
<dd>エレクトロニクス</dd>
<dd>B08L4WKDZ7 (ASIN), 4549292179675 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">望遠鏡型コンパクトデジカメ。メモリと充電器(要 Power Delivery)は別に用意する必要がある。使い勝手はまぁまぁ。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-12-04">2022-12-04</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- PowerShot ZOOM -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B08VMWL13F?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51yZmqxxGTL._SL160_.jpg" width="120" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B08VMWL13F?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">VAAM(ヴァーム) 明治 ヴァーム(VAAM) アスリート 顆粒 栄養ドリンク風味 4.7g×10袋</a></dt>
<dd>明治 (Release 2021-03-16)</dd>
<dd>ヘルスケア&ケア用品</dd>
<dd>B08VMWL13F (ASIN), 4902705035614 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">運動時に脂肪をエネルギーに変えやすくする働きがあるらしい。お試しで買ってみた。とりあえず1時間以上自転車に乗る場合に服用している。水に溶かさず飲むと書いてあるが,水と一緒に飲まないと大変なことになるので注意(経験済み)</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-11-04">2022-11-04</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- VAAM -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B09JNPGVVZ?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/412R54k8bJL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B09JNPGVVZ?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">POW BAR パウバー お試し4味4本セット 【トレイルランニング トレラン ランニング 補給食 ビーガン オーガニック エナジーバー 砂糖不使用】</a></dt>
<dd>Camcom</dd>
<dd></dd>
<dd>B09JNPGVVZ (ASIN), 4580623990620 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">しっとり食感で旨し。口の中の水分をもっていかれないのは素晴らしい。腹持ちもいいので1本で当分保つ。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2023-10-28">2023-10-28</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- POW BAR -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B01721ECA8?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/61TVUMXImML._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B01721ECA8?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">GOLDEN☆BEST キャンディーズ コンプリート・シングルコレクション</a></dt>
<dd>キャンディーズ (メインアーティスト)</dd>
<dd>Sony Music Direct(Japan)Inc. 2011-06-08 (Release 2015-11-04)</dd>
<dd>MP3 ダウンロード</dd>
<dd>B01721ECA8 (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">今さら昭和時代のアイドルを美化するつもりはないけれど,あのとき(生物年齢的にも)子供だった私にとって彼女らは間違いなく憧れのアイドルだったのですよ。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2019-04-29">2019-04-29</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- キャンディーズ -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>ハッシュタグ対応の実装は <a href="https://github.com/mattn/bsky" title="mattn/bsky: A cli application for bluesky social"><code>github.com/mattn/bsky</code></a> がとても参考になった。つか,ほぼ丸写し(笑) ありがたや。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
スマホと音楽
tag:text.Baldanders.info,2024-03-04:/remark/2024/03/ktai-and-music/
2024-03-04T00:43:38+00:00
2024-03-05T03:56:54+00:00
何事も身の丈に合わせた「ほどほど」が大事ってことか。
Spiegel
https://baldanders.info/profile/
<p>学生時代にオーディオ小僧だった黒歴史の反動かオーディオ環境にはあまりこだわらないようにしている。
スマホで聴く音楽だって Amazon MP3 で購入してるものだしプレイヤーも少し前まで Amazon 製のアプリで聴いていた。
アプリの方はあまりの<a href="https://text.baldanders.info/remark/2023/04/22-osanpo-camera/#music" title="【おまけ】 Onkyo HF Player を導入した(お散歩カメラ 2023-04-22)">使い勝手の悪さ</a>に ONKYO のアプリに入れ替えたけど 。</p>
<ul>
<li><a href="https://www.jp.onkyo.com/support/hfplayer/">オーディオ&ビジュアル製品情報:Onkyo HF Player</a></li>
</ul>
<p>そこから前回の「<a href="https://text.baldanders.info/remark/2024/03/tabletop-speaker/">頑張ったご褒美に BOSE の卓上スピーカー買うたった</a>」の話である。
やっぱスマホからの音がどう聴こえるか気になるよね。
というわけで USB-DAC をもうひとつ購入して繋いでみた。</p>
<p><a href="https://www.jp.onkyo.com/support/hfplayer/" title="オーディオ&ビジュアル製品情報:Onkyo HF Player">Onkyo HF Player</a> で USB-DAC を認識させると以下の表示が出る。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./usb-dac.jpg"><img src="./usb-dac.jpg" srcset="./usb-dac.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="Onkyo HF Player" loading="lazy"></a><figcaption><div><a href="./usb-dac.jpg">Onkyo HF Player</a></div></figcaption>
</figure>
<p>おー。
384kHz まで行けるのか。
でも聴いてるのは Amazon で買った MP3 ファイルだけどね。
それでも USB-DAC 経由で BOSE の卓上スピーカーから音を出すと低音から高音まで綺麗に出る。
今までスマホの音楽は Shokz の骨伝導スピーカーで聴いてたのでとても新鮮である。
「この曲ってこういう音だったんだ!」って感じ。
デジタル音源を聴く際には DAC の性能が決定的に重要だというのはよく分かった。</p>
<p>こうなると高解像度の音源ファイルを鳴らすとどう聴こえるか,めがっさ気になる。
と思って <a href="https://www.e-onkyo.com/music/" title="ハイレゾ音源配信サイト【e-onkyo music】">e-onkyo music</a> のサイトに行ってみたのだが</p>
<figure>
<blockquote><p>現在e-onkyo musicは、新サービス「Qobuz(コバズ)」へのサービス切り替えの準備を進めております。</p>
<p><code>[...]</code></p>
<p>なおe-onkyo musicにてご購入いただいた作品、並びに4/25をもって配信終了となる一部音源フォーマットにつきましては、e-onkyo music上での再ダウンロードが可能ですが、「Qobuz」へのサービス移行後は、販売が終了した作品、並びに販売が終了した音源フォーマットは再ダウンロードいただけません。</p>
</blockquote>
<figcaption><div><q><a href="https://www.e-onkyo.com/news/3627/">【重要なお知らせ】一部音源フォーマットの配信終了につきまして - ハイレゾ音源配信サイト【e-onkyo music】</a></q>より</div></figcaption>
</figure>
<p>とか書いてある。
えー。
じゃあ,サービス移行までは下手に近寄らないほうがいいか? 保留だな,これ。</p>
<p>もし私がオーディオ小僧のまま大人になってたら絶対に ONKYO か YAMAHA あたりのプリメインアンプのカタログをかき集めるところから初めてたな。
そもそもオーディオ小僧が卓上スピーカーで満足する筈がないけど(笑)</p>
<p>カメラも沼<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> だけどオーディオも沼だよなぁ。
何事も身の丈に合わせた「ほどほど」が大事ってことか。</p>
<h2>参考</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B00CD1PTF0?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41Msfl5WSZL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B00CD1PTF0?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Bose Companion 2 Series III multimedia speaker system [並行輸入品]</a></dt>
<dd>BOSE(ボーズ)</dd>
<dd>エレクトロニクス</dd>
<dd>B00CD1PTF0 (ASIN), 7123290434782 (EAN), 0017817602853 (EAN), 4969929233370 (EAN), 0667562762502 (EAN), 7887117126884 (EAN), 017817602853 (UPC), 667562762502 (UPC)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">頑張ったご褒美に購入。特に低音が素晴らしい。流石 BOSE といったところか。入力はオーディオ端子が2系統ある。デジタルの入力ポートはない。電力は AC アダプタから。卓上スピーカーとしては上々。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- BOSE Conpanion 2 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0BL76SJL6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/415qeo-Mn+L._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0BL76SJL6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">【VGP2023SUMMER金賞】iBasso Audio DC03PRO アイバッソ Type C タイプC USB DAC ポータブル 小型 アンプ 3.5mm ケーブル着脱式 ハイレゾ HD ロスレス android ゲーム 音楽【国内正規品】 (ブルー)</a></dt>
<dd>iBasso Audio</dd>
<dd></dd>
<dd>B0BL76SJL6 (ASIN), 6971585541216 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">スマホや PC の USB から入力する Digital Analog Converter。低音から高音までくっきりはっきり。PCM なら 384kHz/32bits, DSD なら 11.2MHz/1bit までのネイティブ再生に対応している。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- USB-DAC -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B09TVLHJ1X?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/31S-IHi04IL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B09TVLHJ1X?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">ミニサイズ Shokz OpenRun Mini 骨伝導イヤホン 公式ストア正規品 ワイヤレス 急速充電 驚きの通話品質 IP67防塵防水 bluetooth5.1 2 30日間返品無料 コズミックブラック</a></dt>
<dd>Shenzhen Shokz Co., Ltd.</dd>
<dd>エレクトロニクス</dd>
<dd>B09TVLHJ1X (ASIN), 4512223694288 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">以前のものはマルチファンクションキーが利かなくなったので Black Friday の安売りのタイミングで買い替え。私のように頭の小さい人向け(笑) 値段並みの音質はある,と思う。耳が自由って素晴らしい。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-12-04">2022-12-04</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Shokz OpenRun Mini 骨伝導ヘッドセット -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B07QH9YVZ3?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/61X877YfNXL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B07QH9YVZ3?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Anything Goes!(『仮面ライダーオーズ/OOO』挿入歌)</a></dt>
<dd>大黒摩季 (メインアーティスト)</dd>
<dd>avex trax 2019-05-01 (Release 2019-04-26)</dd>
<dd>MP3 ダウンロード</dd>
<dd>B07QH9YVZ3 (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">2022年は<a href="https://maki-ohguro.com/">大黒摩季</a>30周年だったんだそうで。でも私が知ってて唄える曲ってこれしかないんだよな(笑) 仕事中に聴くとテンションが上がる。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-03-29">2022-03-29</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Anything Goes!(『仮面ライダーオーズ/OOO』) -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>カメラも銀塩一眼レフを数台所持(主に天体写真用)するくらいにはハマってたが,すっぱり捨てて,今はトイカメラ以上のものはものは持たないことにしている。ちなみにスマホのカメラ機能もコンデジも,私から見ればトイカメラの範疇である。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
Go 1.22 にアップデートする(セキュリティ・アップデートの追記あり)
tag:text.Baldanders.info,2024-03-03:/release/2024/03/go-1_22_0-is-released/
2024-03-03T02:25:30+00:00
2024-03-07T13:20:46+00:00
仕事の忙しさにかまけて色々と放っぽり出してたので,少しずつ回復中。
Spiegel
https://baldanders.info/profile/
<p>仕事の忙しさにかまけて色々と放っぽり出してたので,少しずつ回復中。</p>
<p>さて今更だが,先月 2024-02 に <a href="https://go.dev/">Go</a> 1.22.0 が予定通りリリースされた。</p>
<ul>
<li><a href="https://groups.google.com/g/golang-announce/c/TpowDYVBMoY">Go 1.22.0 is released</a></li>
<li><a href="https://go.dev/blog/go1.22">Go 1.22 is released! - The Go Programming Language</a></li>
<li><a href="https://go.dev/doc/go1.22">Go 1.22 Release Notes - The Go Programming Language</a></li>
</ul>
<p>変化点の解説はページ末のブックマークを参照してもらうとして,とりあえず自機の環境をアップデートしてしまおうそうしよう。</p>
<p><a href="https://www.ubuntu.com/" title="The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu">Ubuntu</a> の APT で管理している <a href="https://go.dev/">Go</a> コンパイラは古いので,<a href="https://go.dev/dl/" title="Downloads - go.dev">ダウンロードページ</a>からバイナリ(<a href="https://go.dev/dl/go1.22.1.linux-amd64.tar.gz"><code>go1.22.1.linux-amd64.tar.gz</code></a>)を取ってきてインストールすることを推奨する。
以下は完全手動での作業例。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ cd /usr/local/src
</span></span><span class="line"><span class="cl">$ sudo curl -L "https://go.dev/dl/go1.22.1.linux-amd64.tar.gz" -O
</span></span><span class="line"><span class="cl">$ cd ..
</span></span><span class="line"><span class="cl">$ sudo unlink go # 以前の Go が入っている場合
</span></span><span class="line"><span class="cl">$ sudo tar xvf src/go1.22.1.linux-amd64.tar.gz
</span></span><span class="line"><span class="cl">$ sudo mv go go1.22.1
</span></span><span class="line"><span class="cl">$ sudo ln -s go1.22.1 go
</span></span><span class="line"><span class="cl">$ go version # /usr/local/go/bin にパスが通っている場合
</span></span><span class="line"><span class="cl">go version go1.22.1 linux/amd64
</span></span></code></pre></div><p>Windows はインストールパッケージを取ってきて直接インストールする。
<a href="https://scoop.sh/">Scoop</a> 経由でも OK</p>
<p>複数バージョンの Go コンパイラを扱いたい場合は</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go install golang.org/dl/go1.22.1@latest
</span></span><span class="line"><span class="cl">$ go1.22.1 download
</span></span><span class="line"><span class="cl">$ go1.22.1 version
</span></span><span class="line"><span class="cl">go version go1.22.1 linux/amd64
</span></span></code></pre></div><p>てな感じに導入できる。</p>
<h2>【2024-03-06 追記】Go 1.22.1 のリリース【セキュリティ・アップデート】</h2>
<p>予定通り <a href="https://go.dev/">Go</a> 1.22.1 がリリースされた。
ついでに <a href="http://google.golang.org/protobuf"><code>google.golang.org/protobuf</code></a> パッケージにもアップデートのアナウンスがあった。
gRPC などを操ってる方は要注意である。</p>
<ul>
<li><a href="https://groups.google.com/g/golang-announce/c/5pwGVUPoMbg">[security] Go 1.22.1 and Go 1.21.8 are released</a></li>
<li><a href="https://groups.google.com/g/golang-announce/c/ArQ6CDgtEjY">[security] Vulnerability in google.golang.org/protobuf</a></li>
</ul>
<p>脆弱性の内容は以下の通り(面倒になったので CVSS 評価は端折る)。</p>
<ul>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/CVE-2024-24783">CVE-2024-24783</a> <code>crypto/x509</code>: Verify panics on certificates with an unknown public key algorithm</p>
</li>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/CVE-2023-45290">CVE-2023-45290</a> <code>net/http</code>: memory exhaustion in <code>Request.ParseMultipartForm</code></p>
</li>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/CVE-2023-45289">CVE-2023-45289</a> <code>net/http</code>, <code>net/http/cookiejar</code>: incorrect forwarding of sensitive headers and cookies on HTTP redirect</p>
</li>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/CVE-2024-24785">CVE-2024-24785</a> <code>html/template</code>: errors returned from <code>MarshalJSON</code> methods may break template escaping</p>
</li>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/CVE-2024-24784">CVE-2024-24784</a> <code>net/mail</code>: comments in display names are incorrectly handled</p>
</li>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/CVE-2024-24786">CVE-2024-24786</a> Version v1.33.0 of the <a href="http://google.golang.org/protobuf"><code>google.golang.org/protobuf</code></a> module fixes a bug in the <a href="https://pkg.go.dev/google.golang.org/protobuf/encoding/protojson"><code>google.golang.org/protobuf/encoding/protojson</code></a> package which could cause the Unmarshal function to enter an infinite loop when handling some invalid inputs.</p>
</li>
</ul>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://future-architect.github.io/articles/20240129a/">Go 1.22リリース連載始まります & ループの変化とTinyGo 0.31 | フューチャー技術ブログ</a></li>
<li><a href="https://future-architect.github.io/articles/20240130a/">Go 1.22 リリース連載 slicesのマイナーアップデート | フューチャー技術ブログ</a></li>
<li><a href="https://future-architect.github.io/articles/20240131a/">Go 1.22リリース連載 archive/tar, archive/zip, bufio, io | フューチャー技術ブログ</a></li>
<li><a href="https://future-architect.github.io/articles/20240201a/">Go 1.22 リリース連載 encoding, encoding/json | フューチャー技術ブログ</a></li>
<li><a href="https://future-architect.github.io/articles/20240202a/">Go1.22 リリース連載 HTTPルーティングの強化 | フューチャー技術ブログ</a></li>
<li><a href="https://future-architect.github.io/articles/20240205a/">Go 1.22リリース連載 vet, log/slog, testing/slogtest | フューチャー技術ブログ</a></li>
<li><a href="https://future-architect.github.io/articles/20240206a/">30種類のプログラミング言語で、ループ処理を書いてみた | フューチャー技術ブログ</a></li>
<li><a href="https://future-architect.github.io/articles/20240214a/">Go 1.22リリース連載 net, net/http, net/netip | フューチャー技術ブログ</a></li>
<li><a href="https://zetamatta.hatenablog.com/entry/2024/02/07/235657">Go 1.22 でも残る、“syscall” を使わないといけないケース(ソース付き) - 標準愚痴出力</a></li>
<li><a href="https://zetamatta.hatenablog.com/entry/2024/02/19/095251">既存パッケージ(uncozip) を Go1.22 の rangefunc 対応に - 標準愚痴出力</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/416Stewy0NS._SL160_.jpg" width="123" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語Go</a></dt>
<dd>アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)</dd>
<dd>丸善出版 2016-06-20 (Release 2021-07-13)</dd>
<dd>Kindle版</dd>
<dd>B099928SJD (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想は<a href="https://text.baldanders.info/remark/2016/07/go-programming-language/" >こちら</a>。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-05-22">2021-05-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語Go -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4814400047?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41dClAl3WKL._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4814400047?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド</a></dt>
<dd>Jon Bodner (著), 武舎 広幸 (翻訳)</dd>
<dd>オライリージャパン 2022-09-26</dd>
<dd>単行本(ソフトカバー)</dd>
<dd>4814400047 (ASIN), 9784814400041 (EAN), 4814400047 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">2021年に出た “<a href="https://www.oreilly.com/library/view/learning-go/9781492077206/">Learning Go</a>” の邦訳版。私は<a href="https://www.oreilly.co.jp/books/9784814400041/">版元</a>で PDF 版を購入。 Go 特有の語法(idiom)を切り口として Go の機能やパッケージを解説している。 Go 1.19 対応。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-10-11">2022-10-11</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 初めてのGo言語 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0CFL1DK8Q?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51BmDUG6D0L._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0CFL1DK8Q?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ</a></dt>
<dd>Teiva Harsanyi (著), 柴田 芳樹 (著)</dd>
<dd>インプレス 2023-08-18 (Release 2023-08-18)</dd>
<dd>Kindle版</dd>
<dd>B0CFL1DK8Q (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://book.impress.co.jp/books/1122101133">版元</a>で PDF 版を購入可能。事実上の Effective Go とも言える充実の内容。オリジナルは敢えてタイトルに “tips” という単語を入れるのを避けたのに邦題が「100 Tips」とかなっていて,原作者がお怒りとの噂(あくまで噂)</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2023-08-18">2023-08-18</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Go言語 100Tips -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4814400535?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41+ew2wl2jL._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4814400535?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">効率的なGo ―データ指向によるGoアプリケーションの性能最適化</a></dt>
<dd>Bartłomiej Płotka (著), 山口 能迪 (翻訳)</dd>
<dd>オライリー・ジャパン 2024-02-24</dd>
<dd>単行本(ソフトカバー)</dd>
<dd>4814400535 (ASIN), 9784814400539 (EAN), 4814400535 (ISBN)</dd>
</dl>
<p class="description">ついに Effective Go のタイトルを冠した本の邦訳が出た。<a href="https://www.oreilly.co.jp/books/9784814400539/">版元</a>で Ebook を買える。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-02-22">2024-02-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 効率的なGo : Effective Go -->
頑張ったご褒美に BOSE の卓上スピーカー買うたった
tag:text.Baldanders.info,2024-03-02:/remark/2024/03/tabletop-speaker/
2024-03-02T05:49:38+00:00
2024-03-04T00:49:59+00:00
USB-DAC との組み合わせは最高!
Spiegel
https://baldanders.info/profile/
<p>いやぁ,今回はしんどかった。
三六協定ぶっちぎる勢いで残業やら休日出勤やらしまくりで,こんなの三十路の頃以来だよ。
というわけで何とか終わらせたので,今日から週末を含め5連休をいただくことになった。</p>
<p>実は私は BOSE スピーカーのファンでして。
貧乏学生時代にバイトで稼いだお金で組んだオーディオコンポのスピーカーが BOSE の 101MMG だったのよ。
以来,アンプやプレイヤーは買い替えながらもスピーカーは 101MMG を使い続けていた。
それも<a href="https://text.baldanders.info/remark/2018/12/i-am-a-sunday-programmer/" title="どうも,日曜プログラマの Spiegel です">広島を離れる</a>際に一切合切処分してしまったのだけど。</p>
<p>それからはなるべくコンパクトな生活を心がけてきたけれど,少しずつ安定してくると気になってくる。</p>
<div class="center"><strong>音がしょぼい!!</strong></div>
<p>分かってますよ。
PC 用の卓上スピーカーや骨伝導ヘッドセットなんてそんなもんだから諦めろ,と。
でも,見ちゃったんスよ。
Amazon で BOSE の卓上スピーカー売ってるの。
値段も今回稼いだ残業代で軽く買えるぢゃん。</p>
<div class="center"><strong>これって「頑張った自分へのご褒美」として買えっちうことなんちゃうん?</strong></div>
<p>というわけで,無事に到着した。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53562485939/"><img src="./53562485939_8f390b44b5_e.jpg" srcset="./53562485939_8f390b44b5_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="頑張ったご褒美 | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53562485939/">頑張ったご褒美 | Flickr</a></div></figcaption>
</figure>
<p>早速開けてみる。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53562765825/"><img src="./53562765825_03375644db_e.jpg" srcset="./53562765825_03375644db_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="これどうやって取り出すの? | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53562765825/">これどうやって取り出すの? | Flickr</a></div></figcaption>
</figure>
<p>これ,どうやって開けたらいいんだ? 15秒位悩んだよ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53562515683/"><img src="./53562515683_2ae4018eab_e.jpg" srcset="./53562515683_2ae4018eab_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="開梱してみた | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53562515683/">開梱してみた | Flickr</a></div></figcaption>
</figure>
<p>ようやく開梱できた。</p>
<p>背面を見ると,入力用のオーディオ端子が2系統ある。
ACアダプタが同梱されていて電源はそこからとるようだ。</p>
<p>まずは PC の LINE OUT から直接繋いで音を出してみる。
うんうん。
ちゃんと聴こえるな。</p>
<p>聞くところによると USB-DAC を間に咬ませると音が格段に良くなるらしい。
というわけで,今回はスマホ用の USB-DAC も買ってみた。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://www.flickr.com/photos/spiegel/53562516923/"><img src="./53562516923_aef45a45a2_e.jpg" srcset="./53562516923_aef45a45a2_e.jpg 500w" sizes="(min-width:600px) 500px, 80vw" alt="USB-DACも買うた | Flickr" loading="lazy"></a><figcaption><div><a href="https://www.flickr.com/photos/spiegel/53562516923/">USB-DACも買うた | Flickr</a></div></figcaption>
</figure>
<p>サバ缶じゃないっスよ(笑) Ubuntu の設定で見ると,こんな感じで認識するようだ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./sound-output.png"><img src="./sound-output.png" srcset="./sound-output.png 652w" sizes="(min-width:600px) 500px, 80vw" alt="USB-DACも買うた | Flickr" loading="lazy"></a><figcaption><div><a href="./sound-output.png">USB-DACも買うた | Flickr</a></div></figcaption>
</figure>
<p>これを咬ませて聴いてみると,なるほど全然違う。
下から上まで音がクリアに聴こえる。
私のようなシロートでも分かる変化だよ。
ガチのアンプは置く場所がなかったので安く上げてしまったが,十分な性能だろう。</p>
<p>うし! じゃあなんか音楽をかけてみよう。</p>
<figure style='margin:0 auto;text-align:center;'>
<div style="position: relative; margin: 0 2rem; padding-bottom: 56.25%; padding-top: 30px; height: 0; overflow: hidden;">
<iframe class="youtube-player" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" allowfullscreen frameborder="0" src="https://www.youtube-nocookie.com/embed/Ir2qhw8umRI" allowfullscreen></iframe>
</div>
<figcaption><div><a href="https://www.youtube.com/watch?v=Ir2qhw8umRI">【北斗の拳 OP Full】愛をとりもどせ!!/クリスタルキング【ベースカバー】【Hokuto No Ken OP】Ai wo torimodose/Crystal King【Bass Cover】 - YouTube</a></div></figcaption>
</figure>
<p>おー。
ベースがくっきりはっきり聴こえる。
素晴らしい!</p>
<p>そだ。
これでゴジラのテーマ聴いたらええんちゃうん?</p>
<figure style='margin:0 auto;text-align:center;'>
<div style="position: relative; margin: 0 2rem; padding-bottom: 56.25%; padding-top: 30px; height: 0; overflow: hidden;">
<iframe class="youtube-player" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" allowfullscreen frameborder="0" src="https://www.youtube-nocookie.com/embed/75J7zgTMwEw" allowfullscreen></iframe>
</div>
<figcaption><div><a href="https://www.youtube.com/watch?v=75J7zgTMwEw">【 シンゴジラ 】よりゴジラのテーマ/悲劇 Shin Godzilla エレクトーン演奏 - YouTube</a></div></figcaption>
</figure>
<p>おー。
ゴジラが泣いている。</p>
<p>それにしても USB-DAC の威力凄いな。
オーディオ入力がもう1系統使えるし,スマホ用にもうひとつ買うかな。</p>
<p>というわけで本棚から CD を引っ張り出して,小澤征爾さんの指揮による「惑星」を聴きながら,この記事を書いてみたり。
小澤征爾さんって先月<a href="https://www.njp.or.jp/news/8062/" title="【訃報】小澤征爾氏(桂冠名誉指揮者)ご逝去について | [公式]新日本フィルハーモニー交響楽団—New Japan Philharmonic—">亡くなられた</a>んだよね。
合掌…</p>
<p>今回の買い物は当たりだった。
うんうん</p>
<h2>参考</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B00016AWEC?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41qEqMSfKwL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B00016AWEC?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Bose 101MMG スピーカーシステム</a></dt>
<dd>BOSE(ボーズ)</dd>
<dd>エレクトロニクス</dd>
<dd>B00016AWEC (ASIN), 4969929000057 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">大昔,オーディオ小僧だった頃から愛用していた。帰郷する際に処分してしまったけど。いいスピーカーでした。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- BOSE 101MMG -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B00CD1PTF0?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41Msfl5WSZL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B00CD1PTF0?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Bose Companion 2 Series III multimedia speaker system [並行輸入品]</a></dt>
<dd>BOSE(ボーズ)</dd>
<dd>エレクトロニクス</dd>
<dd>B00CD1PTF0 (ASIN), 7123290434782 (EAN), 0017817602853 (EAN), 4969929233370 (EAN), 0667562762502 (EAN), 7887117126884 (EAN), 017817602853 (UPC), 667562762502 (UPC)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">頑張ったご褒美に購入。特に低音が素晴らしい。流石 BOSE といったところか。入力はオーディオ端子が2系統ある。デジタルの入力ポートはない。電力は AC アダプタから。卓上スピーカーとしては上々。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- BOSE Conpanion 2 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0BL76SJL6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/415qeo-Mn+L._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0BL76SJL6?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">【VGP2023SUMMER金賞】iBasso Audio DC03PRO アイバッソ Type C タイプC USB DAC ポータブル 小型 アンプ 3.5mm ケーブル着脱式 ハイレゾ HD ロスレス android ゲーム 音楽【国内正規品】 (ブルー)</a></dt>
<dd>iBasso Audio</dd>
<dd></dd>
<dd>B0BL76SJL6 (ASIN), 6971585541216 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">スマホや PC の USB から入力する Digital Analog Converter。低音から高音までくっきりはっきり。PCM なら 384kHz/32bits, DSD なら 11.2MHz/1bit までのネイティブ再生に対応している。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2024-03-02">2024-03-02</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- USB-DAC -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B0009N2VDM?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51w7ejZMH4L._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B0009N2VDM?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">ホルスト:組曲(惑星)</a></dt>
<dd>小澤征爾 (アーティスト)</dd>
<dd>Universal Music 2005-06-21 (Release 2005-06-22)</dd>
<dd>CD</dd>
<dd>B0009N2VDM (ASIN), 4988005392589 (EAN)</dd>
<dd>評価<abbr class="rating fa-sm" title="3"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description"><a href="https://text.baldanders.info/remark/2022/07/neck-speaker/">衝動買いしたネックスピーカー</a>の評価用音源として購入。以前持ってたのは引越し時に処分してしまったので実質的には買い戻しになるのかな。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-08-12">2022-08-12</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- ホルスト 組曲 惑星 -->