tech.guitarrapc.cóm

Technical updates

2023年に買ってよかったもの、使ってよかったもの

2023年に買ってよかったもの、使ってよかったものです。2022年はこちら

オープンイヤーイヤホン

Float Run

WI-OE610(Float Run) - SONY

これまで骨伝導のOpenComm、軟骨伝導のATH-CC500BTを使っていたのですが、Float Runを使っている人の声が違和感なくよさそうだったので購入しました。使ってみると自分にバッチリあっていたので、買ってからは毎日仕事で愛用しています。

Float Runが好きなポイントは次の通りです。

  • 付け心地が抜群にいい
  • 音がいい
  • 約10時間の長時間利用
  • USB-C充電

一方で気になるところもあります。

  • マイクが周囲の音を拾いすぎる
  • 耳回りの被覆ラバーがはがれる
  • 音量は30-40%程度にしよう

好きなポイント

Float RunがOpenComm、ATH-CC500BTに対して圧倒的に優れているのが「付け心地」と「音」です。

  • 付け心地比較: Float Run >>>>> ATH-CC500BT > OpenComm
  • 音質比較: Float Run >>>>> ATH-CC500BT >>> OpenComm

Float Runは頭を一切締め付けないため、長時間つけていても耳回りやこめかみが痛くなることはありません。また、特徴的な見た目である「スピーカーが耳の前に浮いている」形状のおかげで、骨伝導・軟骨電動でよくある低音、爆音で震えてくすぐったくなることがありません。この相手の声で震えるという特性から、骨伝導は色々な声が混じるミーティングで使いにくいんですよね。

音は「スピーカーが耳の前にある」という謳い文句通りの聞こえ方です。AT-CC500BTはOpenCommに比べてとても音がよいのですが、Float Runはさらに音質良く驚きました。ただ、カナル型イヤホンやヘッドホンと比べると低音の響きが薄いので人によっては気になるでしょう。私は音楽、ミーティングのどちらにおいても満足しています。オープンイヤーといえば音量が気になりますよね。骨伝導・軟骨伝導と同様に音量を40%以上にすると周囲に漏れ始めますが、30%前後だと音漏れせずよく聞こえます。

バッテリーの持ちも良く、連続再生時間が10時間あるため一日つけていて充電が切れることはありません。USB-Cなのも便利でうれしいですね。

気になるポイント

マイクが弱いことと耐久性は弱点と言えます。Float Runのマイクは指向性マイクではないため、通話中に周囲の音をがっつり拾います。例えばミーティング中に自分の後ろでだれかしゃべっていると、ほかの人の声がマイクに混じって自分の声を相手に届けるのは難しいシーンが何度もありました。対策として、Krispなどソフトウェアノイズキャンセリングをマイクにあてることである程度改善されますが効果は限定的です。ハードウェアサポートがほしいですね。

耐久性は伸びしろの塊です。毎日8-10時間使っていたのですが、半年間経ったころに赤で囲った耳回りの割れ目から被覆ラバーがはがれ始めました。幸いはがれた部分は装着時に耳へ当たらないので問題なく使えるのですが、自然に直ることはないので修理に出しました。1毎日長時間使う人にとって耐久性は課題と言えます。

image

Float Runは今のところオープンエアーなイヤホンで一番体験がよく毎日愛用しているので、ぜひFloat Run2出てほしいです、買います!

ゲーミングイヤホン

image

WF-G700N(INZONE Buds) - SONY

完全無線イヤホンは4年前に使っていたのですがあまり体験が悪く、それ以来オーバーヘッドを使っていました。2とはいえ2023年は、完全無線でいいゲーミングイヤホン、INZONE Budsがあります。INZONE Budsはゲームに特化したイヤホンなのですが、毎日使っているぐらいには夢中です。PCやPS5でゲーム向けに完全無線イヤホンを欲しいならおすすめです。

好きなポイント

FPSゲームで重要な定位がきれいに取れ、専用ドングルをPCやPS5に差すと低遅延2.4GHzワイヤレス接続されるのが最高です。WindowsアプリのINZONE Hubを使うと、立体音響、音質、タッチコントロールのカスタマイズ、アプリ毎のプロファイル設定など、イヤホンを細かく設定できます。PS5にも対応3しておりPS5にドングルを差し直すと接続され、タッチコントロールも連動します。

image

片耳6.5gの軽量さに加え、耳にあまり押し込めないので長時間使っても疲れにくいです。長時間付けられるカナル型イヤホンはあまりないので好きなポイントです。

電池も12時間持つ上、5分の充電で約60分使えるので充電が切れることはありません。ケースを使えば24時間使用できるので、買ってから一度も充電が切れることはありません。

ケースから出すと自動的にPCに差したドングルとつながるので使い勝手もいいです。接続されるまでに5秒程度かかるのは気になりますが困ったことはないです。もちろんケースに入れると自動的に切れるので、ケースに入れるだけで接続&電源管理ができて便利です。

伸びしろ

イヤーチップが微妙に耳に合いにくいのが気になります。初期イヤーチップが大きかったので1つサイズを下げたのですが、まれに少し耳が痛いと感じます。これはイヤーチップのサイズというより、イヤーチップが薄目なので、本体ドライバー部分が引っかかっている感覚があります。レビューでも耳の痛みを訴える人を見かけるので、次のモデルでは改善されるといいですね。

マイク性能はそこそこで、インゲームチャットやDiscordでしか使わないので割り切っています。指向性マイクではあるものの周囲の音を拾うことがたびたびあるのはブームマイクがない以上は難しいんですかねー?後継ではよくなってほしいところです。

Bluetooth LEにしか対応していないので、iPhoneでBT接続はできません。幸いドングルがUSB-CなのでiPhoneに差せばつながるのですが、イヤホンを繋ぐとiPhoneの音量ボタンで音量変更できなくなるので使い心地が悪いです。音ゲーでも遅延しないので、iPhoneがBluetooth LEに対応してiPhoneアプリが出ればと良さそうです。

マウスパッド

image

ARTISAN NINJA FX ゼロ

デスクパッドを一年使った結果、毛羽だち安いファブリックな生地はマウスの滑りが悪すぎたのでマウスパッドに戻しました。今回はゲーミングマウスパッドを前提にいろいろ見てたんですが、ARTISANは滑り、止めがちょうどよく気に入っています。ただ、撚糸編みなので、汚れが残りやすいのは少し気になるところです。

ロジクールのマウスパッドは好みじゃないので、今のところARTISANがいいかなと思っています。

マウス

image

ロジクール MX Anywhere 3s

前回紹介した静音マウスです。普段仕事で使っているのですが、特に早朝、深夜はこの静かさが最高です。もしマウスを探してオススメはあるかと言われたら、MX Anywhere 3sかMX Master 3sを提案します。

遅延的にゲームにはあまり向いていないのですが、基本的にパッドでやっているので問題ないのでした。

ゲームパッド

image

Xbox Elite ワイヤレス コントローラー シリーズ 2

PCでSteamのゲームをするときに使っています。以前はStealSeriese Stratus Duoを使っていたのですが、ジョイスティックがあっという間にへたってエイムが厳しくなり、ZR/ZLボタンを押すときに擦れる音がし始めたのでやめました。PCでゲームパッドを探すなら、Xbox Eliteワイヤレス コントローラー シリーズ2(以降Xboxエリコン2)、PS5 DualSenseDualShock4 が定番、かつ使いやすい感じがします。ただ、SteamでPS系ボタン配置のコントローラーはSteamで設定してもゲームによって対応できてなかったりするので、個人的にはXbox系配置のコントローラーがおすすめです。4

Xboxエリコン2はデザインラボで買うと自分好みにコントローラーをデザインできます。長く使おうと思ったので悩みながらデザインし、キノピオをイメージしてレシピを組みました。世界中のユーザーがデザイン、共有したレシピをコミュニティギャラリーでみれるので、いろんなデザインを学べるのがいいですね。

image

エリコン2はハードの出来が際立って良いです。ジョイスティックの軸がメタルでまず壊れない、ABXYボタンも押し心地がよく、ZR・ZLのストロークを3段階で浅くでき背面パッドも装着可能です。できることだけ見ると隙がないですね。MicrosoftストアからXbox Accessoriesという管理ツールをインストールすると、キーボードやマウスの割り当てすらできます。有線と無線に対応しており、無線アダプタを使うと通信が安定するのでBTではなくアダプタで無線接続がオススメです。

難点は重めなこと、無線のアダプタが単品では売り切れだったり転売価格なことでしょう。私はアダプタ同梱のエリコンを買って無線アダプタを使ってます、なんて無駄!

オートディスペンサー

image

ビオレu 自動で出る!泡ハンドソープディスペンサー

コロナの流行が始まったなった2020年からオートディスペンサーを使い始め、今では欠かせないものになりました。オートディスペンサーは料理をするとき、帰ってきたとき、トイレのあとなどあらゆる手を洗うシーンで大活躍です。この3年間Umimileユミマイル ソープディスペンサーを使ってきたのですが、今のおすすめは2023年に発売されたビオレuのオートディスペンサーです。

ビオレuのディスペンサーの良さは、泡のキメがものすごく細かくふわふわで気持ちいいことです。Umimileユミマイルを使っているときは気にならなかったのですが、ビオレuのディスペンサーを使ってからは、泡が粗いことに驚きました。泡の質感が全然違うので、2台目もビオレuのディスペンサーに入れ替えたところです。残量が見えにくいのは残念ですが、おおむね使い勝手もよくいい感じです。ちなみにオートディスペンサーは電池がいいなぁと思っており、ビオレuは電池です、ヨシ。5

オートディスペンサーっていろいろあるのですが、ビオレuやキレイキレイなど「ものによって使えたり使えなかったりする」のが大変ですよね。食器洗剤はハンドソープよりも濃度が高いため詰まりやすく、洗剤を薄めずに投入・使える製品は限られます。今回のビオレuのディスペンサーも事実上ビオレu専用なのですが、ハンドソープ用のオートディスペンサーとして出来がいいのでオススメできます。


  1. 幸い保証期間以内だったので無償修理でした。
  2. Anker SoundCore Life Q35やWH-1000XM4をここしばらく使っていました。
  3. PlayStation Linkには対応していないので、PS5だけを考えるならPULSE Exploreもよさそうですね。
  4. Steamの対応だけじゃなく、ゲーム側のコントローラにも気を払う必要がある現状では仕方ない。
  5. 食器洗剤に充電式ディスペンサーを使っているのですが、水回りに配置しているので使いながら充電って厳しいんですよね。電池でも半年持つことを考えると充電は使いにくさが勝ると感じます。

静音化したMxAnywhere 3sマウス

仕事道具のキーボードやマウスに求めるものは、どんどん変化していっていると感じます。その最たる変化の1つが静音がうれしくなったことです。以前書いた 静音マウスと M650 SIGNATUREワイヤレスマウス でM650シグネチャマウスは求めていた静音マウスであると書きました。M650を使った結果、それまで使っていたMxAnywhere3や2sのクリック音がいかに大きいかを意識するようになったのを覚えています。

静音性を待ち望んでいたMxAnywhereですが、MxAnywhere 3sでついに静音化されました! 購入してから7カ月使った今、期待通りの出来だったので記事に起こします。1

MXAnywhere 3S ワイヤレス Bluetooth マウス |ロジクール

tl;dr;

左右ミドルのクリック音を静かになったことで、静音マウスになってることがよくわかります。サイドボタンは静音化していませんが、MxAnywhere3より静かになっています。M650やMxAnywhere3に比べて乗り換える価値があったことを挙げます。

  • MxAnywhere 3sはDarkfield高精度センサーなので、ガラス面や起毛デスクパッドでも認識します
  • ラバーグリップがM650より柔らかく、持っていて気持ちがいいです
  • LogiBoltに対応しています[^2]

一方で、MxAnywhere 3sを買う場合に注意点があります。

  • LogiBoltのレシーバーがつきません2
  • LogiBoltでつないでいると、時々マウスの認識が暴れます3

MxAnywhere 3s

MxAnywhereシリーズの最新作で2023年6月に発売されました。MxAnywhere 3sはMxAnywhere 3と見た目は全く同じですが、静音化されています。静音マウスで知られるM650シグネチャマウスを使っていたのですが満足できるおすすめマウスです。

image

M650の課題

M650は静音マウスとして優秀ですが、2つ伸びしろがあります。

1つ目はトラッキングです。M650のトラッキングは「ロジクール アドバンス オプティカル トラッキング」といい、毛羽立ったファブリックなデスクパッドで認識が不安定です。ガラス面ではより厳しいです。

2つ目はスクロールです。M650のスクロールは「スマートホイール」といい、1行毎のスクロールと、高速スクロールが両立できます。これもいいスクロールなのですが、MxAnywhereの「MagSpeedスマートシフト」には敵わないというのが正直なところです。MxAnywhereを触ってなければ満足していたのに、よりよく感じるものがあるので伸びしろに感じてしまいます。

MxAnywhere 3sとM650の比較

サイズ

MxAnywhere3sは1サイズだけです。M650で同じ程度のサイズがいいならMを選ぶといいです。

もしもMxシリーズで大きなマウスがほしいなら、静音化したMxMaster 3sを検討するといいでしょう。

グリップ

MxAnywhere 3sはシリコンでさらさらしています。m650はラバーグリップですが、1年半たってもべたつくことなく使えています。

電池

MxAnywhere 3sは充電式でUSB-C接続、1回の充電で70日持ちます。M650は単三電池1つで24か月持ちます。

充電か電池かの影響は頻度より重量で気づきます。MxAnywhere 3sは比較すると軽く取り回しがよい一方で、M650は電池な分だけ重いです。

静音

静音マウスというとどの程度静かなのか気になりますが、MxAnywhere 3sとM650は同程度に静かです。どのクリック音もMxAnywhere3までのカチカチ甲高い音ではなく耳に響きにくくなっていて満足です。改めて各ボタンのクリック音を並べてみましょう。

  • 左右クリック: 静音 (鈍く小さくカチッ音。深夜だと使用者は気づく程度)
  • ミドルクリック: 静音 (左右より小さく鈍いカチっ音。深夜でもほぼ聞こえない。)
  • サイドクリック: 若干静音(左右よりカチっ音がする。日中でも気づく程度)

静音の程度はYouTubeで適当に探すとイメージしやすいでしょう。逆に店舗では周りがうるさい分、静かな自宅で聞くのとはイメージがずれることもあるでしょう。

ホイール

MxAnywhere 3sはMagSpeedスマートシフトなので、高速スクロール時のフリースピンがかかります。比べてしまうと、M650のスマートホイールよりも快適度が違いますね。 水平スクロールはMxAnywhere 3、M650ともに同じサイドボタンを押しながらスクロールです。

接続

MxAnywhere 3s、M650ともにLogi BoltかBluetoothが利用できます。Bluetoothも可能ですが、マウスのBT接続はPCが高負荷時に困るのでLogi Boltで利用しています。

Logi Bolt、嫌いじゃないですがマウスの認識が暴れるのってもしかしてLogi Boltなのか、とちょっと疑っています。

MxAnywhere 3sの課題

使っていて気になる所はほぼなかったのですが、数か月使っているといくつか出てきました。

  • サイドボタンの静音が弱いのでもっと静かになってほしいです
  • 時々マウス認識が暴れるので解消すると嬉しいです
  • クリック遅延が12ms程度と報告されているので、もう少し早いといいですね。

いろんなマウス触っていると形状にも伸びしろありそうですね。MxAnywhere 4で形状が変わるか期待しています。

まとめ

より快適になったMxAnywhere 3sは静音マウスとしておすすめです。MxAnywhere 3sはMxAnywhere 3と見た目は全く同じですが、静音化されているのが決定的で、音の小ささに魅力を感じる人には乗り換える価値があります。

静音程度からするとM650もいい感じなので、お求めやすいM650シグネチャマウス、多少お高いが認識精度やスクロールが神なMxAnyhwere 3sと選択が広がってよかったですね。


  1. この記事は2023年6月16日に書いていたのですが、2024年1月に公開した謎。
  2. Unifyingは死んだ。仕方ない。
  3. Logi Boltを持っていない場合はBluetooth接続が使えます。でもLogi BoltはUnifying同様にPCが高負荷でも安定するのでいいんですよね。

GitHub Actions でスパースチェックアウトを使ってモノレポの一部だけをチェックアウトする

モノレポをCIでビルドするにあたり、最初にして最大の課題がチェックアウトです。先日GitHub Actionsのactions/checkoutでスパースチェックアウトできるようになったので、これを使ってモノレポのチェックアウトを高速化しました。

今後のモノレポチェックアウトの定番になるであろう、スパースチェックアウトを使ったモノレポのチェックアウトを紹介します。

tl;dr;

  • CIのチェックアウトは早いが正義、早ければ早いほどよい
  • スパースチェックアウトなら、モノレポのビルドでも特定のパスだけをチェックアウトしてビルド時間を短縮できる
  • シャロークローン(shallow-clone) とスパースチェックアウト (sparse checkout) を併用するとモノレポで最速のチェックアウトができる
  • actions/checkoutでスパースチェックアウトがサポートされたので、GitHub Actionsでスパースチェックアウトを気軽に使えるようになった
  • actions/checkoutはデフォルトでシャロークローン (depth=1) なのでスパースチェックアウトを簡単に併用できる

GitHub Actionsでのスパースチェックアウトの例を含んだリポジトリを用意しました。参考にしてください。

https://github.com/guitarrapc/githubactions-lab

GitHub Actions のチェックアウト

GitHub Actionsのチェックアウトは、 actions/checkout を使うのが定番です。特に理由がないなら、自分でチェックアウトするのではなくactions/checkoutを使うことで、シャロークローンがデフォルトで有効になったり、サブモジュールやLFSのサポートもされます。

しかし唯一actions/checkoutに足りていなかったのが、スパースチェックアウトでした。

スパースチェックアウトとは

Bring your monorepo down to size with sparse-checkout | The GitHub Blog が分かりやすい上に詳しいのでまずはこの記事をみるのをおすすめします。

簡単にいうと、スパースチェックアウトはチェックアウトするファイル(パス)を指定することで、特定のファイルだけをチェックアウトできる機能です。 Git 2.25.0からgit sparse-checkoutコマンドで使えるようになりました。

なぜ「特定のファイルだけをチェックアウトできる」ことが嬉しいのか、先のブログの図を使って簡単に説明します。

モノレポのディレクトリ構造をイメージした次の図を見てください。このモノレポでは、1つのリポジトリで写真ストレージと共有サービスのコードが管理されています。 ディレクトリは、クライアント(client)、サーバーサイドロジック(service)、フロントのウェブ(web) のようにマイクロサービスごとに分かれています。

image

https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ より引用

さて、このリポジトリのAndroidクライアントだけをGitHub Actionsでビルドしたいと考えたときに、どうすればよいでしょうか?

シャロークローン

スパースチェックアウトがない場合、シャロークローンを使って最新のコミットを取得してからビルドするのが定番です。 シャロークローンは履歴を最新N件に絞ることで取得するデータ量が大幅に減らし、フルクローンに比べてチェックアウトが数倍高速化します。

image

https://github.blog/jp/2021-01-13-get-up-to-speed-with-partial-clone-and-shallow-clone/ より引用

しかしシャロークローンでは、Androidビルドをしたいだけにも関わらずビルドに不要な他クライアント、サーバー、Webのコードが含まれてしまっておりチェックアウト時間が長くなります。

# シャロークローンで最新のコミットを取得しているが、不要なコードもチェックアウトしてしまっている
git clone --depth=1 <repository_url>

image

スパースチェックアウト

client/androidのファイルだけをチェックアウトできれば、他のコードを取得しないため高速にチェックアウトできそうです。 そこでスパースチェックアウトを使えば、必要なファイルだけチェックアウトできます! 例えばclient/androidにあるファイルだけをチェックアウトするなら次のようなコマンドでできます。

# スパースチェックアウトで client/android だけチェックアウトする。
# git clone に --depth 1 をつければシャロークローンと併用もできる。
git clone --filter=blob:none --no-checkout --sparse <repository_url>
cd <repository_name>
git sparse-checkout set client/android
git sparse-checkout init
git checkout

シャロークローンを使うだけだとできなかった、必要なファイルだけをチェックアウトできました。

image

https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ より引用

スパースチェックアウトはシャロークローンと併用もできるので、最新1件の履歴のうち、必要なファイルだけチェックアウトできます。まさに最速のチェックアウトです。

image

GitHub Actions でスパースチェックアウトを使う

モノレポでスパースチェックアウトを使いたい理由が分かったところで、GitHub Actionsでスパースチェックアウトを使う方法を紹介します。

これまでactions/checkoutはスパースチェックアウトのサポートがありませんでしたが、2023/6/15現在actions/checkout@v3で利用できます。もし手元のチェックアウトがactions/checkout@v2ならv3に更新するだけでスパースチェックアウトが使えるようになります。

Add support for sparse checkouts by dscho · Pull Request #1369 · actions/checkout

スパースチェックアウトでチェックアウトするパスを指定する

スパースチェックアウトを使うには、sparse-checkoutにチェックアウトするパスを列挙します。 例えばsrcディレクトリだけをチェックアウトする場合は次のようになります。

name: git sparse-checkout
on:
  pull_request:
    branches: ["main"]
jobs:
  sparse-checkout:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          sparse-checkout: |
            src

一見スパースチェックアウトをしているだけですが、actions/checkoutはデフォルトがシャロークローン (depth=1) なので併用されてチェックアウトが最速になります。簡単、便利で最高の体験です。

除外指定とコーンモード

actions/checkoutのスパースチェックアウトはデフォルトがコーン(cone) モードなので、 !を使った除外指定ができません。

除外指定をするには、sparse-checkout-cone-mode: falseでコーンモードを無効にする必要があります。コーンモードを無効にした場合、sparse-checkoutにはパス形式で指定する必要があります。

例えば、 srcディレクトリを除外して、それ以外をチェックアウトする場合は次のようになります。 コーンモードが有効な↑の例ではsrcと指定しましたが、コーンモードを無効にしたので!src/*/*とパス形式で指定しているのがポイントです。

name: git sparse-checkout (exclude)
on:
  pull_request:
    branches: ["main"]
jobs:
  sparse-checkout:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v3
        with:
          sparse-checkout: |
            !src/*
            /*
          sparse-checkout-cone-mode: false # required for ! entry to work

スパースチェックアウトでどの程度改善するのか

手元のモノレポの1つでは、シャローンクローンを使ってもチェックアウトに1m20sかかっていたのが、スパースチェックアウトを併用することで1s~15sに改善しました。 1sは.githubなど最低限必要なパスだけをスパースチェックアウトした場合で、15sはビルドに必要なパスだけをスパースチェックアウトした場合でした。

一日に何度もCIが回り、複数のジョブで何度もチェックアウトしていたので、CIの回転時間が大幅に改善されました。なにより、 actions/checkoutが高速に終わるので利用をためらわなくなったのが最高です。

意識しにくいですが、Billable minutesも大幅に減っているのでコスト管理的にも嬉しいですね! 財布に優しく、高速にCIを回せる、スパースチェックアウトは大好きです。

他のCI でもスパースチェックアウトを使いたい

残念ながらCircleCI、AzureDevOps、Jenkinsのいずれにおいても、標準的に利用されているチェックアウト方法ではスパースチェックアウトはサポートされていません。

使いたい人向けに、参考までにactions/checkoutにスパースチェックアウトが来るまで使っていた方法をおいておきます。

name: git sparse-checkout
on:
  pull_request:
    branches: ["main"]
jobs:
  sparse-checkout:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: sparse checkout
        run: |
          git clone --filter=blob:none --no-checkout --depth 1 --sparse "https://${{ env.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git" .

          echo "git sparse-checkout set exclude directory"
          git sparse-checkout set --no-cone "${{ env.SPARSECHECKOUT_DIR }}"

          echo "git sparse-checkout without cone" # cone not allow pattern filter, therefore don't use cone.
          git sparse-checkout init

          echo "git sparse-checkout list"
          git sparse-checkout list

          echo "git checkout"
          git checkout "${GITHUB_SHA}"

          # if you have submodules in Private Repo, use PAT instead of secrets.GITHUB_TOKEN
          if [[ -f ./.gitmodules ]]; then
            echo "replace submodule url"
            sed -i -e "s|https://github.com|https://${{ env.GITHUB_TOKEN }}@github.com|g" ./.gitmodules

            echo "submodule update"
            git submodule update --init --recursive
          fi

          echo "git reset"
          git reset --hard "${GITHUB_SHA}"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SPARSECHECKOUT_DIR: "src/*"

参考

Docker ComposeでローカルマシンにRedisClusterを構築する

ずっとRedis Cluster を使っているものの、ローカル環境を作るのが面倒で数年来避けてきました。 今回 Redis 7.0 の Shared Pub/Sub をしたくなったので、重い腰を上げてローカル環境に Docker Compose で Redis Cluster を構築したメモです。

tl;dr;

ローカルでも Redis Cluster が組めるのは、ElastiCache for Redis Cluster や MemoryDB が VPC外部からのアクセスが原則制約ある点を踏まえてもうれしいですね。

  • 従来めんどくさかった Redis Cluster 構築も Docker Compose で簡単に行えるようになった
  • 今後 Redis Cluster で Pub/Sub するなら、Global Pub/Sub から Shared Pub/Sub に変えていきたいところ

gist おいておきます。

https://gist.github.com/guitarrapc/2c6625acfab1c771f1543d917e3a6dd9

Redis Cluster を起動する Docker Compose

次の compose.yaml を用意して、 docker compose up -d 1 で起動すれば Redis Cluster がローカル環境で触れるようになります。 コツは、 bitnami/redis-cluster を使うことです。 bitnami の redis イメージは公式に追随しつつ扱いやすいように env 対応されていたりといい感じなのでよいです、おすすめ。

services:
  redis-node-0:
    image: docker.io/bitnami/redis-cluster:7.0
    environment:
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'

  redis-node-1:
    image: docker.io/bitnami/redis-cluster:7.0
    environment:
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'

  redis-node-2:
    image: docker.io/bitnami/redis-cluster:7.0
    environment:
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'

  redis-node-3:
    image: docker.io/bitnami/redis-cluster:7.0
    environment:
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'

  redis-node-4:
    image: docker.io/bitnami/redis-cluster:7.0
    environment:
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'

  redis-node-5:
    image: docker.io/bitnami/redis-cluster:7.0
    depends_on:
      - redis-node-0
      - redis-node-1
      - redis-node-2
      - redis-node-3
      - redis-node-4
    environment:
      - 'REDIS_PASSWORD=bitnami'
      - 'REDISCLI_AUTH=bitnami'
      - 'REDIS_CLUSTER_REPLICAS=1'
      - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'
      - 'REDIS_CLUSTER_CREATOR=yes'
    ports:
      - 6379:6379

  redis:
    image: bitnami/redis:7.0
    environment:
    - ALLOW_EMPTY_PASSWORD=yes

Redis Cluster のコマンドを試す

Redis 7.0 から、Redisの Pub/Sub にSharded Pub/Subを行うためのコマンド SSUBSCRIBESPUBLISH が追加されました。従来の グローバルPub/Sub に使う SUBSCRIBEPUBLISH には、Redis Cluster で Pub/Sub するとクラスター内部にメッセージが伝搬するためスケール問題を起こすことが知られています。この問題はShared Pub/Sub で改善されるので、Pub/Sub を使うRedis Cluster も水平スケール可能になります。

ということで、Shard Pub/Sub を先ほどDocker Compose で構築したRedis Cluster で試しましょう。

see: Redis 7 の Sharded Pub/Sub まとめ - Qiita

Pub/Subなので、まずは SSUBSCRIBE します。適当にマスターノードにつなぐと指定したキー sfoo を管理するシャードにredis-cliが自動的にリダイレクトされます。2

$ docker compose exec redis /bin/bash
$ redis-cli -h redis-node-5 -a bitnami -c
redis-node-5:6379> ssubscribe sfoo
Reading messages... (press Ctrl-C to quit)
-> Redirected to slot [13887] located at 172.18.0.3:6379
Reading messages... (press Ctrl-C to quit)
1) "ssubscribe"
2) "sfoo"
3) (integer) 1

別シェルで sfoo キーに SPUBLISH すると、自動的に同じシャードにリダイレクトされてメッセージが発行されます。

$ docker compose exec redis /bin/bash
$ redis-cli -h redis-node-5 -a bitnami -c
redis-node-5:6379> spublish sfoo 1
-> Redirected to slot [13887] located at 172.18.0.3:6379
(integer) 1
172.18.0.3:6379> spublish sfoo 2
(integer) 1

すると、先ほど SSUBSCRIBE した側で購読されます。いい感じですね。

1) "smessage"
2) "sfoo"
3) "1"
1) "smessage"
2) "sfoo"
3) "2"

別のキー sbar にしても同様です。キーを変更してSSUBSCRIBE します。

172.18.0.3:6379> ssubscribe sbar
Reading messages... (press Ctrl-C to quit)
-> Redirected to slot [2668] located at 172.18.0.2:6379
Reading messages... (press Ctrl-C to quit)
1) "ssubscribe"
2) "sbar"
3) (integer) 1

sbar キーに SPUBLISH します。

172.18.0.3:6379> spublish sbar hogemoge
-> Redirected to slot [2668] located at 172.18.0.2:6379
(integer) 1

意図通り、SSUBSCRIBE している側で購読されます。

1) "smessage"
2) "sbar"
3) "hogemoge"

以前、Redis Cluster にグローバルPub/Sub しかないときにPub/Subを組んだ時はノードを増やしても性能がスケールしなかったのですが、Shared Pub/Sub で改善しそうなので使っていけるか負荷かけたりして判断していきたいです。

ElastiCache for Redis は NLBを介することで外部からアクセスできます。しかし、Shared Pub/Sub はシャード管理しているノードへ接続がリダイレクトされるため、同手法は使えないと予想されます。開発環境の ElastiCache につなげないなら、代わりにローカルでRedis Cluster を使いたくなるでしょうから、今回のDocker Compose 手法が役立つでしょう。3

(余談) StackExchange.Redis の Shared Pub/Sub 対応

C# で Redis を扱う場合、StackExchange.Redis が事実上のデファクトスタンダードです。しかし、Missing Commands in StackExchange.Redis · Issue #2055 · StackExchange/StackExchange.Redis を見ると、SSUBSCRIBE/SPUBLISH のサポートはされていません。実装を探してもまだも見つからないので、使うには自前拡張がいる感じです。

image

(余談2) Grokzen/docker-redis-cluster は使うのは難しい

Redis Cluster の Docker イメージとしては Grokzen/docker-redis-cluster もあり、これを使うとRedis Cluster が1コンテナで起動してくれます。簡便ではあるものの構成上の副作用として、この Redis Cluster は外部から個別ノードへの接続を考慮しておらず4、同コンテナに exec してローカルホストからつな具必要があります。 コンテナの外から試せないので、適当に LinqPad や VS からRedis Cluster 試すのは難しく、利用ケースが限られてしまいますね。


  1. あるいは docker-compose up -d
  2. ElastiCache ならクラスターエンドポイントにつなげば同じことができます。
  3. できればDocker Compose 使わずもっと楽に起動したい気持ちがあります。現時点ではいい方法が思いつかないので仕方ない。
  4. 127.0.0.1 にすべてのノードが起動、通信しあっているので外部からノードにアクセスできない。

ASRok X670E Steel Legend のVRAM点滅とメモリ相性

以前紹介した現在の Windows マシン (Windows 11 Professional マシンを構成する 参照) は、マザーボードにASRok X670E Steel Legend、メモリを128GB 搭載しています。

PCは Sycom の BTOで組んだのですが、PC電源投入時に ASRok X670E Steel Legend の ポストステータスチェッカーVRAM が点滅で止まる問題がありました。ようやく解決したようなのでメモしておきます。

tl;dr;

  • ASRok X670E Steel Legend のポストステータスチェッカー でVRAM点滅から進まない問題がある (恐らくメモリ相性)
  • BIOSドライバーバージョンを 1.21 以上にすると 1.18 で問題があったメモリでも問題なく起動できるよう1 になった
  • BIOSフラッシュバックで BIOS更新すると、Windows 11 マシンは以前のPIN が使えなくなるがサインイン画面からPINの初期化が行えるので安心して更新できる

構成

環境に触れておきます。

  • マザーボード: ASRok X670E Steel Legend (ドライバーバージョン 1.18)
  • メモリ: 128GM (32GB×4枚) DDR5-4800 JEDEC準拠品 - Zen4制約で4枚装着時の動作クロックは DDR5-3600

BTO提供メモリで特定メーカーのものではないため、メモリ相性問題を踏みやすいのは否めません。BTO側も出荷前の動作確認していますが、必ず発生する問題ではないため検知は難しいでしょう。そんなものです、しかたない。

症状

BIOS起動時にメモリ4枚装着していると、ポストステータスチェッカー VRAM 点滅から起動しなくなる。 CMOSクリア後のメモリ初期化による初期化待ち (128GB なら5分超え) ではなく、VRAMチェッカーが点滅して2-3分で電源が落ちる。

一度起動するとしばらく安定するが、Windows 再起動でまれに再発したりする。

解消方法 - 対処療法

メモリ4枚での起動にこだわるなら、メモリ1枚/2枚差しに切り替えて起動、シャットダウン後に CMOSクリア (ボタン電池外して10分程度放置) 後に、1枚差しで起動してから4枚差しに切り替え。2

メモリ1枚、2枚でいいなら、メモリを減らして起動すりと問題なく起動することが多い。3

解消方法 - 抜本解決

BIOSのドライバーバージョンを 1.21 にすることで、4枚装着でも問題なく起動するようになったので、様子を見ています。 ASRok X670E Steel Legend のドライバー一覧を見ると、1.21 は Improve memory compatibility が記載されており、メモリ相性問題がある認識のようです。

image

BIOS更新方法

ASRok X670E Steel Legend の BIOS バージョンは、 Instant FlashBIOS Flashback という方法で更新ができます。

参照: ASRok X670E Steel Legend ユーザーガイド

私は、UEFIからの Instant Flash でドライバーが見つけられなかったので BIOS Flashback を使って更新したので手順をみておくといいでしょう。

参照: https://www.asrock.com/support/QA/FlashbackSOP.jp.pdf

ドライバーをダウンロードしたUSBメモリをフラッシュバック用のUSBポートに差してフラッシュバックボタンを押すと、BIOSドライバーが更新します。便利!

BIOS更新が完了するまで時間がかかるので注意です。4

Windows 11 でのフラッシュバックによるBIOS更新

Windows 11 は TPM2.0 を使っており、BIOSフラッシュバックで BIOS更新するとWindows 11 で Windows Hello認証などで設定した以前のPINが無効になります。 PIN が無効になっても↓の案内にしたがってサインインオプションをクリックすると、MicrosoftアカウントのPIN初期化サイトに遷移してPIN初期化できます。初期化後は元通りログインできるになるのでフラッシュバックで困ることはありませんでした。

フラッシュバック後の Windows ログイン画面で出るメッセージは次の通りでした。

日本語OSは次の通りです。

このデバイスのセキュリティ設定が変更されたため、セットアップした暗証番号(PIN)が使えなくなりました。クリックして暗証番号 (PIN) をもう一度設定してください。

英語OSは次の通りです。

Your PIN is no longer available due to a change to the security settings on this device. Click to set up your PIN again.

教訓

BTO のBIOSバージョンは新しい保障がないので最新バージョンに更新しよう。とはいえ、BIOS はそういえば忘れてがちです。

到着時の手元試験で確認できたのですが、ここまで放置したのは反省です。

類似ケース

似たケースがないか探して時に見つけたのですが、この記事は同じ問題に見えますね?

【自作PC】DRAM点滅で動作しない【ASRock X670E STEEL LEGEND】 | UEDAX


  1. 48/24GB メモリを使うなら 1.24.AS02 が必須。私は 1.18 から 1.24 にして経過観察中。
  2. 成功率は低く、全然起動できない場合は4,5回やってもだめですが、繰り返していると起動します。(半日つぶれます)
  3. メモリ枚数によって装着スロットが決まっているので注意。1 DIMM なら B2チャンネル、2 DIMM なら A2 と B2。
  4. 私は10分程度待ちました。