/ 最近 .rdf 追記 設定 本棚

脳log[2026-01-10~]



2026年01月10日 (土)

最終更新: 2026-01-11T20:55+0900

[BAD BOY] 後ろブレーキが V から油圧ディスクになった

 経緯

  1. ペダルを踏み込むと勝手に変速することがあって強く踏めない
  2. フリクション式のシフターがリアディレイラーのバネとの綱引きに負けてるのかな?

    渋めに調整してもあんまり

  3. スプロケットがぐらぐらしてる!
  4. スプロケットの台座であるフリーボディがぐらぐらしてる!

    実は以前からハブ周辺を洗ってもすぐに赤茶色の錆が湧いてくる状態だった

    直近では乗り出し直後に限ってだけどフリーのツメが引っかからなくて順方向に漕いだペダルが空転していた

  5. フリーボディ交換?
  6. 驚いたことに 14 年前の 2011 年に組まれたホイールに使われていた後輪ハブ (SHIMANO FH-M775) のフリーボディがパーツ番号で普通に購入できた
  7. マニュアルもあった (SI-3CZ0A-002-ENG.pdf)
  8. でも 17 mm ハブスパナと 5 mm アーレンキーで外す反フリー側のキャップが、外せないままネジ穴(六角)をなめて詰み
  9. 新しいホイール (SHIMANO WH-RX010)

    • 黒色
    • フレームリヤエンド幅 135 mm に対応
    • ディスクブレーキ対応
    • HGスプラインL なので HGスプラインM よりスプロケット台座が長いが付属のスペーサーで対応可能
    • 9mm 軸のクイックリリース仕様 (E スルーアクスルにはフレームが対応していない)
    • リムは 700x25C から 38C のタイヤサイズに対応 (26C と 28C のタイヤしか履かないし今のリムより幅広になるけど範囲内)
    • リムブレーキ非対応!!!

      一応書くと、ホイールは中心からハブ-スポーク-ニップル-リム-タイヤといった部分で構成されていて、V ブレーキはリムを挟んで止めるリムブレーキの一種。ブレーキシューの当たり面の銀色がリム側面になかった

  10. ホイールをゴミにするか後ろブレーキをディスクブレーキにするか

    前ブレーキは 2014 年にすでに V ブレーキから油圧ディスクにしているが、後ろをディスクにする積極的な理由が何もないまま 11 年が過ぎていたのだった

 パーツ

  • レバー (SHIMANO DEORE XT BL-M8100L)
  • キャリパー (SHIMANO DEORE XT BR-M8100)
  • ホース (SHIMANO SM-BH90 1700mm)
  • パッド (フィン付きメタルパッド J04C) ※フロントで使っているものと同じ

以上のものがセットになってオイルも充填済みのものがシマノから出荷されているらしい。J-kit とかいうのがそう?

  • ディスクブレーキマウントアダプタ (SHIMANO SM-MA90R160P/S)

160 mm ローター用。軽量タイプ。

フレームのディスクブレーキ台座が IS (インターナショナルスタンダード) なので、ポストマウント式のキャリパーを取り付けるためにあいだに挟む。

  • ディスクローター (BBB BBS-121 160mm センターロック仕様) ※ロックリングは付属しません!

フロントでは同じものの 180mm を使っている。シマノの3層構造のローターがよく鳴いてうるさかったので交換したら良かったので、後ろも同じに。

  • ロックリング (シマノパーツナンバー Y8K198010) 内セレーションタイプ

ローターもスプロケットもハブの両サイドで同じようなロックリングで固定されるけど、ローター用のものはスプロケットのロックリングより径が大きく厚みもあるので、スプロケットのロックリングが余っていても代わりにはならない。ならなかったんです。単体で買うと千数百円もする。とても高い。たぶんシマノのローターにはロックリングが付属していたはずで、それが今フロントで使われているのだけど、まさかこれがないために完成が一週間以上遅れるとは思わなかった。外セレーションタイプのロックリングもあって、ローターにどのタイプのロックリングが付属しているべきかわからないところもある。でもじゃあホイールかハブにロックリングが付属していてもいいんじゃないでしょうか!

 ディーラーマニュアル 油圧式ディスクブレーキ (DM-MADBR01-06-JPN.pdf)

 フリーストローク調整

フロントのブレーキは SHIMANO SLX のレバー (BL-M675B) とキャリパー (BR-M675-MF) が付いている。2014 年当時最も安価で導入できる油圧ディスクブレーキとして SLX グレードが人気だったように記憶していて、それにならったのだった。

相対的に前より重要ではないリヤブレーキに前よりお金をかけるのはもったいないのだけど、SLX のレバーにはないフリーストローク調整というものを試してみたかった。

SLX と DEORE XT のどちらのレバーにもあるのが握り幅調整というもので、指で回せる大きなネジでレバーとハンドルのあいだの距離(初期位置)を調整する。たとえばパッドが減ってくるとオイルを補充しない限りレバーをより大きく引かなければいけなくなる。オイルを補充するとパッド交換のときにピストンを押し戻すと補充した分のオイルがあふれることになるので、オイルは補充せずに済ませたい。そうするとレバーの初期位置をハンドルから遠ざけることで、レバーを大きく引いてもレバーとハンドルのあいだに指が挟まることがないようにすることになる。これが握り幅調整。だけどね、レバーの位置は手の大きさによって決まる一定の位置が最適です。フリーストローク調整というものでパッドの減りに伴う引き代の増加に対応してみたかった。

試しにいじってみたところでは、ものすごく微妙な変化が、あるようなないようなという感じ。それに自分は効き始めが早い方が好みなので、一番締め込んである初期状態が一番良い。そこからの調整は引き代が大きくなる調整しかできない。まあべつにいいよ。


2026年01月05日 (月)

最終更新: 2026-01-08T15:56+0900

なにか.

 「\xHH が使えない」は不正確

エディタの内部文字コードに対応して \x20\x00 というパターンでスペースが検索できる。

 \c が特別なのは \c. \c$ というパターンがあるから

覚えてないけどそうすべき理由を改めて調べた結論。消されてますけども。

 パターン+マッチ情報の分離 (CPattern)

 @brief Perl互換正規表現 BREGEXP.DLL をサポートするクラス

	DLLの動的ロードを行うため、DllHandlerを継承している。

	CJreに近い動作をさせるため、バッファをクラス内に1つ保持し、
	データの設定と検索の2つのステップに分割するようにしている。
	Jreエミュレーション関数を使うときは入れ子にならないように注意すること。

	本来はこのような部分は別クラスとして分離すべきだが、その場合このクラスが
	破棄される前に全てのクラスを破棄する必要がある。
	その安全性を保証するのが難しいため、現時点では両者を1つのクラスに入れた。

このコメントに応える動きかなと思う。

しかし温存された CBregexp と一部の役割(検索手段とマッチ結果へのアクセス)が重複していることと、新しく生えた CBregexp::GetPattern が CBregexp を形骸化させていることが気になる。CBregexp の存在意義が曖昧。

include を見ると CBregexp.h と CBregOnig.hpp が循環依存していることからも現状はいびつ。

DLL ファイルとしての側面から生の公開関数と実装補助を提供していた CBregexpDll2 (あらため CBregOnig) に対して、CBregexp は正規表現 API の側面から DLL の差異を吸収する統一メソッドを実装していた。パターン+マッチ情報クラスという、正規表現寄りで高レベル・一般性のあるものを生やすなら CBregexp の方では? なんで「CBregexp::CPattern を CBregOnig に移動」したのかはわかりませんが。


2026年01月03日 (土) [AtCoder] 今日は ABC439(Promotion of AtCoderJobs) があった。幸先の悪い新年の始まり。■A 問題 2^n - 2*n。やります。■B 問題 Happy Number。やります。概ね減少するけどループがないとわからなかったので BFS で。■C 問題 2026。間に合うように解けません。■D 問題 Kadomatsu Subsequence。瞬殺だと思ったんだけど、7の因子と5の因子と3の因子が共存できないと勘違いして排他で処理を書いたらサンプルの3で答えが足りなかった。書いた時間の2倍以上をデバッグに使った。■E 問題 Kite。ずっと DP をやろうとしていた。y=0 と y=1 に対応した2系統の DP 列で答えを出そうとして、最終的にうまくいかないことがわかった。じゃあどうやったらうまくいくか、改めて考えると LIS が見えてくるのにそんなに時間はかからなかった。そこから立て続けにペナルティ2つ。同じ地点の競合がうまく処理できなかった。逆順では解決しないと思ったから回りくどい書き方をしたけど、やっぱり逆順でいけるんじゃないか? 余談。DP から LIS への頭の切り替えでちょっと苦労したギャップは、LIS では求めるものが明示的に値として記録されていないというあたり。作業配列の長さという形で LIS の長さが求まる。重層的な記録をインクリメンタルに更新する処理の進め方からは、LIS も DP の一種に見えるけど、ここでは区別した。■時間いっぱいの最遅 ABDE 4完。ということは最速 ABCD 4完と同等のパフォーマンスになるのかな、嬉しくないが。自分のすべての提出。■■■C 問題。組み合わせ全探索が許されていたんだね。y の上限が N のルートまでだから、2つの組み合わせはおよそ2乗でだいたい N。……という見積もりができなかったんだなあ。■■■F 問題 Beautiful Kadomatsu。終了後にちらっと読んでわかんないと思ってたんだけど、AtCoder Problems で水 diff だと見えたのでなめて取りかかってみた。提出 #72258562 (AC)。3つの状態に対応して3本の BIT を持った。状態というのは、点、上昇中、折れ曲がって下降中の3つ。最初に点があり、2点目で下降を始めた場合は絶対に門松的にならない。上昇するなら上昇中に移行する。上昇から下降に転じた段階で門松的になり、そこから上昇に転じたときに門松的ではなくなり再び上昇中に移行する。一直線の DP。数列を走査しながら状態を更新し、同時に各要素が門松的な部分列の末尾となる数を数えていく。■解説はよくわからないね。配列を2本と木を1つ使っているみたいで定数倍は良さそうだけど計算が難しそう。すべての部分列の累積和を求める典型にあてはめて端から順番に数えましょうよ。


2025年12月27日 (土) [AtCoder] 今日は AtCoder Beginner Contest 438 があった。21時に間に合うようにお風呂に入っているときからおなかが苦しかった。様子を見ていたら途中離脱が不可避だと思ったので急いで出してスタンバイ。幸いにしてコンテスト中に本日3度目のうんこが出てくる気配は見えなかった。■A 問題 First Contest of the Year。計算でやるのは無理です。A 問題は間違えないことが一番大事。7ずつ刻んで2年目の初日を掴まえた。■B 問題 Substring 2。こういう問題は必ず両手の指を使って長さ N から長さ M の連続部分列がいくつ切り出せるかを数えます。N-M+1 個でした(覚えない)。他の人の提出を見て Enuemrable#each_cons(M) を使うのが目的にピッタリ適って計算もいらなくて良かったと知った。知らないメソッドではないんだけど出て来なかった。あとは (s-t)%10 と (t-s)%10 を取り違えていたことに問題を読み直すまで気づかなかったりといういつものぐだぐだ。極めつけはデバッグプリントでは答えがちゃんと出ているのに出力が誤っている。デバッグ出力用の式だけ修正して本番の式がそのままだ。両方の式を揃えてもう何度目にもなるサンプルを試してみても、まだ出力が誤っている(デバッグプリントは正しい答えを見せている)。同じ式から異なる答えが出てくることの意味がわからなすぎて音をあげる寸前だった。からくりはこう。p(S.size-T.size+1).times.map{...}.minp (S.size-T.size+1).times.map{...}.min の違い。スペースの有無で解釈が変わる。ふりかえれば今日はスペースが抜ける日だった。入力を受け取るテンプレ N = gets.to_iN= gets.to_i のようになってしまい離すために戻るということを今日は少なくとも2回やっていた。getsgest になるみたいなミスはいつものことだけど、スペースが抜けるというのはこれまで例がない。親指のコントロールが失われているのか寒くて指がかじかんでいるのか。■C 問題 1D puyopuyo。前から順番にくっつけて消す。連鎖はない。■D 問題 Tail of Snake。前から順に3つの値を更新していくだけで答えが出るらしい。自分は一度に全部考えることができなかったので、必要な情報を分けて予め準備していた。どういう情報か。ある要素(2番目から N-1 番目までのどれか)を胴体に選ぶとして、それより左で最も効率良く頭と胴を分けたときの最大値が何か。これは2要素の DP でできる。右側についても同様に求めて、左右を足し合わせたときに最大になる要素を選ぶ。サンプルの1と2が合って3だけが合わなかった原因は何か。左側について頭と胴の組み合わせを前計算し、右側については尾と胴の reverse で前計算をしなければいけないところ、尾の数列をどこにも使っていなかった。頭と胴だけで計算してどうしてサンプルの1と2が合うのか、役に立たねーサンプルだ。必須条件の扱いについて。3つの数列の1要素目については頭専用として予め取り除いておいた。N 要素目についても尾専用として取り除いておいた。胴についてはどれを胴にするのがいいかを総当たりするということでクリアしている。■E 問題 Heavy Buckets。ややこしいのでじっくり読んで問題を理解する。バケツリレーが行われる。バケツの行方を追跡したい。たらい回しのルートは決まっている。バケツの位置が即ち水の加算量。問題がわかれば1分もかからずにダブリングだなと見当がつく。固定され循環する未来が先読みできない道理がない。実装には 30 分かかる。1個先、2個先、4個先の位置はどこか。1個移動する、2個移動する、4個移動するあいだに加算される水の量はいくらか。この2つを 30 ビット分前計算した。■F 問題 Sum of Mex。40 分手が動かなかった。考えていたけど、傍目には寝ていたのと同じだった。前にも書いたけど、MEX って性格が悪い。物事を定義するのに否定で定義するんじゃあないよ。ないものは具体的に掴まえられないんですよ。一応しっぽはつかんだ。f 値が N になるのは一直線のグラフだ。1 から k-1 までの k 個の頂点(+中間に余分があっても良い)がまっすぐ並んでいるとき、両端の2頂点に繋がる頂点の組み合わせが f 値を k にする。ここから考えるのをやめたくなったのは、k より小さい m があって、f 値が m になる頂点の組み合わせを考えるとき、f 値が k だった頂点の組み合わせがまた出てくるよね、というところ。嫌だ。■F 問題。「1 から k-1 までの k 個の頂点(+中間に余分があっても良い)がまっすぐ並んでいるとき、両端の2頂点に繋がる頂点の組み合わせが f 値を k にする」と書いた。中間の余分の頂点が k と k+1 を含んでいたら f 値を k+2 にしなければいけない。■■■E 問題。類題として2問、ABC179-E「Sequence Sum」と ABC241-E「Putting Candies」が挙げられていた。過去の自分はどうしていたかなと見てみたら、ABC179 は D 問題で撃沈されていて E は D ともども翌日に通していた (提出 #16923150)。ABC241 の方は D をあきらめて E をやっていたらしいが AC は終了 11 分後だった (提出 #29711639)。どちらも解法はサイクルとサイクル長を検出するグラフ解法だった。まだダブリングを知らなかったと見える。ダブリングを最初に覚えたのは LCA を求めたかったとき。それだって LCA を求めるのにダブリングでないといけない理由はないので、オイラーツアーより後だったと記憶している。音に聞こえるダブリングというものを実装してみるチャンスだと思い立ったとき、概念的なイメージだけで実装した最初は BIT やセグメント木や std::set の外側で二分探索のループを回すような、log が二重にかかるやり方をしてしまって TLE になって、用意したデータの使い方が下手だと思い知らされたのだった。今回の E 問題が自然とダブリング解法になったのは、たくさんのクエリに答える必要性からだったと思える。たくさんのスタート地点があり、たくさんのなもりグラフがあるときに、連結成分の形をひとつひとつ調べてはいられない。考えるより高速でシミュレーションを回したい。


2025年12月22日 (月) [BAD BOY] スプロケットがぐらぐらしていることとフリーボディから錆が無限湧きしてくることの対策として注文したホイール(SHIMANO WH-RX010)が届いたのだけど、ディスクブレーキ専用でリムブレーキに非対応なんだって! たしかにシルバーの輪っかが外周側面に見えない。気が付かなかった。(ディスク化の可能性を潰さないために)ディスクブレーキに対応したハブやスポーク配列であることばかりチェックしていたら、今やリムブレーキが当たり前ではなくなっていた。これがいいというよりは他に選択肢がなくて間に合わせで買ったホイールが、間に合っていなかったということにたいへん残念な気持ちになっている。これをポジティブに変換するために後ろブレーキのディスク化を進めるつもりだけど、出費が続き過ぎ大き過ぎでつらい。■リヤホイールの要件は次の通りだった。(1) 黒色。(2) フレームのリヤエンド 135mm に収まること。(3) リムブレーキ対応。(4) ディスク化可能。(5) HGスプラインM (使用中のスプロケに合わせて)。(6) 9mm 軸のクイックリリース。(7) 700x26C から 28C のタイヤに対応したリム。たぶん(6)のクイックリリースが一番の制約。より太い E スルーというのが今の主流らしく、それを採用するにはフレームが対応している必要があるとか。クロスバイクらしくロード寄りの要求と MTB 寄りの要求が混在しているのと、その要求内容がふた昔前のものであることが選択肢を狭めている。今使っているホイールは前後とも通販でワールドサイクルさんに頼んだものだけど、もうホイール組みサービスはやってないみたい?■■■@2025-12-31 オイル充填済みのブレーキセット(BL-M8100/BR-M8100)とローター(BBB BBS-121 160mm)が届いたので、ホースをカットしてレバーに締め込んでハンドルに仮止めまでした。あとは新ホイールにローターを取り付けスプロケットを移植してチューブとタイヤも移植して、パッドがローターを擦らないようにキャリパーの位置決めをする。ホースが 5-10 cm 長すぎた気がするので取り回しでごまかせるか考える。ホースをレバーに突っ込んで締めるときにレバーの奥にしっかり押しつけるのを忘れていたので、なんならホースカットからやり直すのが全部丸く収まるのかも。それには使い捨て部品であるオリーブとコネクターインサートの買い直しが必要で、たぶんエア抜きも必要になるので、とても面倒。やりたくない。本当は後ろをディスクブレーキにするつもりは全然なかったんだよなあ。パッドを交換するたびにピストンを戻し、パッドがローターを引きずらないようにわずかなクリアランスの中央にローターが位置するようにキャリパーを固定するのがとても面倒なので、それを前後でやるのは嫌なのだ。でも来てしまったホイールをまるまる無駄にしたくないのでしかたがない。Cannondale 印のリア V ブレーキとブレーキレバーが取り外されたことで、2007 年から残っているパーツはいよいよハンドルバー、ステム、ヘッドセット、フォーク、フレームだけになってしまったのでは? (20250321p01.02)■■■@2026-01-01 BBB のディスクローターにロックリングが付属しておらず、シマノのホイールにも付いていなかったので、作業が滞ってしまった。スプロケのロックリングは余っていたけど、同じものではないようで完全に締め込む前に工具が底付きしてしまう。画像で見た感じディスクローター用のロックリングは内側の溝部分が盛り上がっていて外径も大きめ? というのも、スプロケ用のロックリングはローターの真ん中の穴と径がほとんど同じでしっかり押さえられるか不安があるし、締め込むにつれて溝が工具から離れていってしまうのが不都合なので、そうでないと問題が解決しない。■またも無駄金を使ってしまったことがわかった。以前から前で使用していて、後ろでも使用することになるパッド(F03C, J04C)がワイドタイプだと思っていたら実はナロータイプで、そうすると安くてロックリングも付属する選択肢があったのだ。高くてロックリングも付属しないワイドタイプ(たぶん重い)のローターを買う理由がなかった。がっくり。まあ、見た目と音鳴りを考慮して前で使っているのと同じローターにしたわけなので、惜しいのはお金だけではある。でもそうか、音鳴りを嫌って外してしまった SM-RT70 180mm を再利用するチャンスだったのだな。条件が変われば音鳴りしないかもしれないし、後ろブレーキは前ブレーキほど重要ではないのだから、そもそもローターを新調しないでありものでもよかった。キャリパーの位置は IS-ポストマウント変換アダプタ次第でどうとでもなるんだし。むむむむむ、無駄金、余剰パーツ。■スプロケを外した旧ホイールのフリーボディを触ってみればぐらぐらしていることがわかる。やはり錆が無限に湧いてくるフリーボディが原因だった。アマゾンにはフリーボディだけの販売もあって数千円で買えるんだけど、どれが使えるかがわからないんだよね。交換を想定したものでもないらしいし。セカンドホイールとして駄目元でぼちぼち修理を試みてもいいか。■14 年前の物だし無理だと思ってたんだけど、型番(FH-M775)で調べたらサービスマニュアル的なものが見つかった(EV-FH-M525-2067B.pdf)。交換修理が捗りそうだけど、とりあえず 14 mm の巨大なアーレンキーと 17 mm のハブスパナが必要らしいが持っていない。持っている一番大きいアーレンキーはクランク用の 8 mm だし、薄いスパナは 13/14/15/16 mm しかない。


2025年12月21日 (日) タイムズのシステムが入っている銀行の駐車場に車を止めて、銀行で用事を済ませて、精算をしたら無料時間を過ぎているから何百円か払えと言われる。そんなはずがない。無料時間は 20 分で、自分は 15 分以内に用事を済ませて来たのに、車を止めたのより 15 分以上早い 09:30 からのカウントで無料時間が過ぎていると言われる。その日のスケジュールではその時刻に車を止めることは完全に不可能なのだ。ところで、時間を計る目的において時刻の正確性は問題にならず、この駐車場の駐車券に印字される入庫時刻が自分のスマホの時計とは2分程度ずれていることを以前から知っている。でもその程度の誤差だし、銀行で過ごした時間が 15 分に満たないことは間違いないので、時間の計測開始時刻が不当に早かったことは間違いがない。■どうしてそのようなことが起こるのか。一度止めようとした人が考え直して出て行って、15 分後に自分がそこに止めたのだろうか。しかしロック板は? 上がっていたのを見なかったし、乗り上げた感触もなかった。センサーは? 調べたらほぼループセンサーというもので金属を検知しているらしい。他には光センサーや超音波センサーの場合もないではないと。もちろん進んだところではカメラでナンバーを見ている。たとえば不正に脱出した車があったとき、センサーが車の存在を感知できなくなったとして、駐車時間のカウンターがリセットされることがあるのだろうか。必ず次の駐車車両にツケを支払わせるようなロジックになっていないだろうか。とはいえ、そういうことを想定するとしても今回の場合は、無料時間内(15分程度)に不正脱出する理由がないことと、15 分後にまだロック板が上がっていないなんてことがあるのかという疑問がある。どうして自分は 15 分程度余分に駐車時間をカウントされてしまったのか。「タイムズの場合、ズバリ「3分後」にロック板が上がる事が多いです。 基本的には3分後ですがこの数値は設定で変更する事ができ、ATMなどの用事で短い時間しか滞在しない事が多い銀行などに併設されているタイムズの場合は「10分後」と、かなり長めに設定されているようです。」と書いているページもあるので、この銀行の設定が 15 分だった場合に、駐車時間のカウントがスタートしているがまだロック板が上がっていない駐車枠にタイミング良く自分が車を止めてしまった、ということが考えられないかな。ないかな?■この日記を書いている本題はここからで、こういうことがあったよ、君達も駐車券に不正確な入庫時刻が印字されていないか注意してないと余計な請求をされちゃうよ、という話をしたときのことだ。話がそれるけど、自衛のための注意が必要なのは本当のことで、入口にいて車の誘導をしているおっちゃんは曖昧な反応で俺がほんの 15 分前に車を入れたということを請け合ってくれなかった。銀行の中にいる人に事情を説明したところで、銀行の中で 15 分の用事を済ませる前に別の用事をしていて無料時間を超過してしまったのでしょうと思われるのが関の山だ。そして本題。09:30 に自分が銀行にいなかったと知っている人が、機械を信用して無料時間の超過を俺の責任にしようとする。機械のすることだからという理由で機械を信用している。ネットでパーキングの解説記事を調べてみて「センサーが車を検知して……」のような記述を読んで、「ほらほら」と俺にはわからない理由で謎の確信を得ている。「センサー」とだけ書かれてるけどそれが何を検出するセンサーなのか気にはならないのですか。センサーに検出できる限界があるとは思わないのですか。ロック板が上がったり下がったりする時間を設定で「いい具合」に調節するという事実が、仕組みの限界や避けられない(けれど最少化しようとしている)落とし穴の存在を示唆しているとは思わないのですか。こんな具合に機械のやることだからという理由にならない理由で人閒より上位に機械を置く人閒が身近にいたことが怖かった。仕組みが想像もできない機械は魔法で動いていると思ってるんだろう。俺もたった今魔法という言葉を、人間業ではないから間違いのないもののたとえとして使っている。実際に魔法を使う人間を知っていれば、その人間の為す他のことと同じ程度に魔法も信用のおけないものになるはずだ。機械も具体的に知れば知るほどありとあらゆる失敗が想定できるのにな。■お前は人閒一般の話にしたがっているが特定の人閒=お前に信用がないってだけなんじゃないの、という突っ込みはあろう。だったら判断力の怪しい盲信的な人閒はいなかったということで、良いですね。AI の御託宣を鵜呑みにして他人の話を聞かない人閒が多数派になる未来は怖いもんね。


2025年12月20日 (土) [AtCoder] 今日はユニークビジョンプログラミングコンテスト2025 クリスマス(ABC437)があった。先週と同じように時間だけはあるのに G 問題に手も足も出ない。■A 問題 Feet。よくわからない制約。その上限にどんな意味が?■B 問題 Tombola。トンボラって何? 愚直にやるだけなんだけど、最初に集合の引き算 A-B をして、違うから B-A をして、実は積集合 A&B が正解だったという沼にはまっていた。頭を使ってください。■C 問題 Reindeer and Sleigh 2。トナカイと橇。前回(1)は Sleigh が読めなかったということを覚えている。英語の場合 ei をエイって素直に読んでいいんですかという疑いが最初に来るので。トナカイって匹じゃなくて頭で数えたいよなあという感想を持ったのも前回と同じ。しばし考えた。考えたのはどういう DP をするか。一見するとパラメータが2つあって貪欲法がなじまない。だから DP。DP ができる制約には見えないけど、ずるができないなら全部を効率的に調べるしかない。それでどういう状態を持つか。考えていると、そりを引くトナカイがそりに乗るトナカイに転じるとき、引くパワーがマイナスになるのと同時に、重さもパワーにマイナスに作用するという点で影響が共通の値で表せることがわかる。じゃあとりあえず全頭引く側にまわってもらって、負の影響が小さいものから貪欲に可能な限り乗る側にまわってもらう。そこからぐだぐだ時間がかかるんですねえ。受け取るパラメータ(w,p)の順番を間違えたり、マイナスに作用する値を w-p にしてみたり w+p にしてみたり、処理順が反対だったり、いつのまにかソートが消えていたり。ああでもないこうでもないといじくって全体で 14 分かかった。解けたと思ってからの方が長い。■D 問題 Sum of Differences。ソートして累積和と個数で計算する。手を動かすだけで4分。実装が二分探索と尺取りに分かれるみたい。自分はこの程度の単純さなら尺取りの方がわかりやすいので尺取りでやっている。二分探索だと返ってきた探索結果の位置づけを off-by-one エラーに注意して吟味する必要があるが、尺取りだと尺を取る操作そのものによって扱っているものの意味づけが明確になるので悩まない。尺取り操作が複雑になる問題ではこれが逆になって、二分探索でスッとコンテキスト外から値を差し出される方がロジックを明確にしやすかったりする。 ■E 問題 Sort Arrays。問題文が難しい。「言い換えると……」があまりにも親切。それなしでは理解できなかった。時間大丈夫かなと不安に思いながらとりあえず 12 分で出したものは WA だった (TLE はなし)。手元ですぐにダメケースが作成できた。それは異なる Ai が同じ列である場合。再帰関数で実装したので自然と DFS 順に答えが出てくるのだけど、同等の数列を束ねる BFS 的な処理順も必要だった。完全に BFS というわけでもなかった。難しいよー。結局追加で実装に 14 分かけた。合わせて 26 分+ペナルティ5分。■F 問題 Manhattan Christmas Tree 2。45 度傾けるというあれですか? 傾け方はよくわかりませんが、見たことのある x+y と x-y のそれぞれに対して最大値を取得するものと最小値を取得するものの2通り、全部で4つのセグメント木を用意して、やってみたらサンプルが合ったので提出して AC。手を動かすだけで 14 分。■G 問題 Colorful Christmas Tree。2乗が許される制約。木 DP でできるんかなというかそれ以外にやりようが思いつかないんだけど、3値の子供の処理順をやりくりするだけでもたいへんなのに、どこに親との辺を取り除く処理を挟むかという可能性まで関わってくると整理しきれない。おてあげ。■自分のすべての提出。手も足も出ない G 問題を前に時間を持て余していたのが先週と同じだったように、順位とパフォーマンスも前回と似たものだった。前回と違う点を探すと、6完最速との順位差が 200 番程度ではなかったということ。なんと6完最速は順位表の2ページ目、38 番にいる。今日は G 問題の崖が一際険しかったと言えそう。F 問題を 1500 人以上が解いているのは先週今週変わらず。■■■匹と頭について。検索すると一筋縄ではいかない。まず伝統的には匹のみが長く使われていた。特に馬と匹の結びつきが強い。しかし頭がある現在は、大型の獣にはもっぱら頭が使われる。しかし対象が小型でも頭が正式に採用されているケースがある。つまりどちらをつかっても間違いではない。現代的な感覚で判断すると頭になるというだけのことだった。■■■F 問題。自分は C++ 用語で言うと2種類のセグメント木クラスをインスタンス化して解いたんだけど、動画やテキストで見かけたのは、コードは1種類だけで保持する値の符号をあれこれして4通りの結果を得るやり方だった。難しすぎると思うんだけど、どういう脳内モデルがあると初手がそれになるんだろう。……と書いてから再度訪れてみたら、答えがまんま書いてあった。「二つの座標 (X,Y) と (x,y) のマンハッタン距離は ∣X−x∣+∣Y−y∣=max((X+Y)−(x+y),(X−Y)−(x−y),(−X+Y)−(−x+y),(−X−Y)−(−x−y)) と表せることが良く知られています。特に難しい理論が必要なわけではなく、絶対値が二つあるのでそれの正負の組みせで展開するとこうなります。」 式を操作していたのね。


2025年12月17日 (水) 高木浩光@自宅の日記 - 知財検討会にまで及ぶAI規制の混迷──処遇AIと生成AIを混ぜると、全部壊れる」■AI ってこんなに有能なんだ、と驚きました。私は AI 以下です。AI の有能さを引き出すこともできそうにありません。ところでですね、これだけのやりとりを重ねるのなら、一言一句自分の言葉で書きたいと思わないのかなと思わないではないのです。自分がそういう(たち)なので。早さとか作業の並列性とかが理由なのかな。人の上に立つって大変だ。


2025年12月13日 (土) [AtCoder] 今日は AtCoder Beginner Contest 436 があった。F 問題までについての話だけど、あまりにも淡泊な問題ばかりで、新入生歓迎シーズンかなと今が何月か考えてしまった。年末でした。■A 問題 o-padding。数を1つも間違えずに計算できる自信がないので、十分な長さの文字列からちょうど長さ N の文字列を切り出しました。■B 問題 Magic Square。何を言っているのかさっぱりわからない。何をさせられているのかわからないまま機械的に翻訳しました。とまどっていた時間を含めて所要時間5分。■C 問題 2x2 Placing。配列にメモをすると空間的にまずいので Hash 表に記録をする。■D 問題 Teleport Maze。F までで一番時間を使った (18 分)。考える要素はない。BFS をする。何度もワープをしないように対策をする。ノータイムでそれがわかるのに時間がかかるんですねえ。一番手間取ったのは、キューには迷路での位置を表す添字を入れたのだけど、添字とワープを表す英小文字を混同してうまくワープできていなかったことをつきとめるのにえらく時間がかかった。つまり、添字から文字を参照し、文字からワープ先を参照する必要があったのだけど、添字からワープ先を参照しようとしていたということ。自分は普段訪問済み情報にグリッドの情報を予め埋め込んで、ループの中ではグリッドを参照しないでもいいように心がけているのだけど、無理だったと。無理だということが直視できていなかったと。普段の心がけから起こるべくして起きたミス。 あと同じくらい時間がかかったのが、ゴールマスの添字がいくつになるかということ。何度もサンプルのグリッドのマス目を実際に数えて、それが H×W のグリッドだといくつになるかを考えたのだけど、何度数えて何度計算しても1ずれてたの! ちなみに迷路は各行の末尾に番兵を置いたうえで1次元化していた。なんで1ずれたかというと、ゴールのある最終行の番兵の位置まで添字を1マス1マス数えていたからですね (最終行に限って番兵を数えてはいけない。それはゴールの次のマスだ)。やはり A 問題で対策したように計算しない方策を選ぶべきだった。■F 問題 Starry Landscape Photo。E 問題と 25 点しか違わないので、E と F 両方解けるにしても両方解けないにしても F 問題からとりかかって損がない。往年の F 問題って感じ。つまり、後ろに2問控えていた頃の? 「あなたは BIT (あるいはセグメント木) を知っていますか」。知っています。まず、何番目に明るい星まで写すのかを決める。今決めた星は必ず写す。この区別によって同じ構成の被写体を複数回カウントすることを防ぐ。あとは、左右にあるそれより明るい星をいくつずつフレームに収めるのかを決める。その通り数。計算式が二転三転したことにもう驚きはない。数字とは友達になれない。左に L 個、右に R 個の明るい星があるときに、中央にある1つだけを写す場合を含めて 1+L×R 通りではないんですよ。(L+1)×(R+1)-1 通りでもないんですよ。テキトーやってんじゃねーんですよ。答えは 1+L+R+L×R でした。わけるわけなくない? 頭を使ってどうぞ。■E 問題 Minimum Swap。ちょっとひねった問題設定でした。「1 回目の操作としてあり得る操作の数を求めてください」。要するに、答えに近づく1手であれば何でも良い。無駄な操作でなければ何でも良い。無駄でない操作とは何か。第一感は「交換した結果少なくとも一方が正しい位置に納まる操作」だった。嘘くさいなー。N=3、N=4 で嘘を暴こうとシミュレートしていて思い出したのが、すべての並べ替えは平行して存在する単数または複数の玉突き位置交換ループの足し算だということ。ということは数列を漏れなく玉突きグループに分けたときそれぞれの大きさがわかれば、グループ内で位置を正す操作の選び方は、2個を選ぶ組み合わせの数……だと思って AC だったんだけど、今になってわかっていなかったことがわかってきている。グループ内でどの2個を選んで位置を交換しても必ず正しい位置に近づいてるんですか? わかりません。こうである必要がある、を答えにしてたまたま AC だったけども、それだけで良かったのかどうかは考えていなかった。■F 問題。提出前に 1+L+R+L×R の式を見て一度だけ因数分解を考えて捨てていたのだけど、他の人の提出を見て (L+1)×(R+1) で表せることに気がついてしまったね。第2案で無駄に -1 をして答えを間違えていたことも、因数分解をしようとして失敗していたことも、とにかく中学生レベルの数学ができないことが露呈している。コンコンコン……入ってますか?(入ってません)■F 問題。通り数の計算式以外にもバグらせていた。処理の昇順と降順が反対だった。原因はたぶんだけど、明るさの表現として「1番明るい」と「明るさが N (最大)」の2通りを混同して区別なく使用していたのだろう。■自分のすべての提出。平均すると1問あたり8分で解いてるんだけど、その短時間でこんなにもバグがてんこもりなことに我がことながらあきれます。■■■E 問題みたいな並べ替えについては過去に散々苦しんだ経験がある。第二回全国統一プログラミング王決定戦予選-C「Swaps」(20191111p0120200826p01)から始まって ARC120-C「Swaps 2」(20211022p01)、ARC124-D「Yet Another Sorting Problem」(20211125)。Swaps 2 だけ毛色が違うけど他の2問は E 問題に繋がる問題だった。そこで散々数列をこねくり回した経験からひとつの見かたを獲得した。過去の日記でも触れてるけど、「競プロerのための群論 (swapと順列と対称群) - little star's memory」のようなありがたい記事を読んでも全然理解できないし身にもつかないのです。


2025年12月06日 (土) [AtCoder] 今日は AtCoder Beginner Contest 435 があった。終了1分前にバグの原因に気がついて修正して提出してコンテスト終了後にまだジャッジが進んでいるのをドキドキで見つめていた。それが E 問題。今日は F 問題までそれなりの早さで解かないといけないセットだったらしいです。■A 問題「Triangular Number」。三角数? N*(N+1)/2 ■B 問題 No-Divisible Range。愚直に、やります。■C 問題 Domino。どこまで倒せるかをメモしながら左から倒していく。違った。どこから倒せないかをメモしながら左から倒していく。■D 問題 Reachability Query 2。黒いマスを始点にして逆向きに辺をたどって通り道の頂点も黒く塗っておく。どの頂点も高々1度しか塗られないし、塗られたときにしか遷移しないので、全体で N+M に比例した処理。クエリ1で与えられる頂点がすでに黒いかどうかを確かめずに無条件に探索を開始したら TLE×2 を食らった。テストケースがいい仕事をしている。多くの辺を集めている頂点が何度も始点になったら、たとえその次の頂点が黒で探索がストップするとしても、最初の1ステップが O(M) で死ぬ。■E 問題 Cover query。区間の併合。BIT で区間の始点を管理した。座圧が必要。とてもやっかい。時間をかけて丁寧に書き何度も読み返し2歩進んで1歩戻る慎重さ……というか自分が今何をしているかを思い出す時間を確保しながら書いていた。とてもやっかい。最後まで見つからなかったバグとは何か。BIT で管理している区間の始点の集合が壊れている。単調増加のはずなのに途中で減少したりしていて、それでは BIT 上の二分探索ができない。なぜ壊れたか。ある位置を含みうる区間(始点がある位置以下にある直近の区間)を BIT から検索していたのだけど、ある区間の始点を基準にして、その位置を含みうる直前の区間の始点を検索していた。何が見つかるかは火を見るより明らかなんだけど、座圧をしているとデバッグプリントの解読が難しくて思い違いになかなか気づけない。十分に早い SortedSet があれば座圧は必要ないのになあ。遅延セグメント木を使う解法と、BIT を使っていながらもっとシンプルな解法があるみたいなのと、自分と同じような解法ながらずっと早く提出している人がいた。要するに、考えが足りず、実装も下手だった。これが現在の自分。■F 問題 Cat exercise。実装前にいろいろ考えた。移動を開始すると移動可能な範囲は必ず左右に2分割される。左右のどちらに移動させるかは選べる。移動先の高さを選ぶ意味はあるだろうか。……ない。じゃあ左右の移動先を効率良く見つけるためにセグメント木と値から添字の逆引きインデックスを用意すれば終わり。E 問題より簡単。「……ない」の点々部分について書く。移動先を選ぶということは、(1)優先される移動先を予め取り除いておく、(2)移動範囲を予め制限しておく、のどちらかを実行することになるのだけど、(1)をするくらいなら優先される高いタワーに寄り道をする方が移動距離が増える。(2)を実行するのは今ではなく制限のために取り除くタワーの隣に移動してきたときでいいし(つまりこれが左右の移動先を選ぶというときの実際の操作)、そのときを待つ方が移動距離が伸びる。■■■F 問題。O(N) で解けると読んだので考えてみた。頭の体操。こういうときに使えるデータの持ち方を知っている。AtCoder を始めたごく初期の日記に書いてある(脳log[20190907p01] AtCoder Beginner Contest 140 E問題)。結局、左右にある直近の現在より低いタワーの位置が定数時間でわかればいいのだ。高さ N から降順でやるのに失敗したので逆に、高さ1から昇順でやることにした。左右にあって最も近くの現在より高いタワー(左右1つずつ)に情報を伝えていく。提出 #71557988 (AC / 165 ms)。


2025年12月03日 (水) 「このテスト関数には問題があります。呼び出しても依然としてエラー終了するおそれが残されており、安全な実行を保証しません」という警告に対して、問題のあるテスト関数によるテストを取り除いて問題を解消していくスタイル。


2025年11月29日 (土) [AtCoder] 今日はSky株式会社プログラミングコンテスト2025(ABC434)があった、と書いている今は日曜日の夜です(日曜日の日記は ARC のために空けておきたい)。D 問題に負けた。茶色からやり直した方がいいよ。■A 問題 Balloon Trip。「AtCoder では秒と分を混ぜたような問題は出さないし、答えに単位も要求しない」と書いたのが先月のこと。単位が出てきました。「単位が kg であることに注意してください」と注意があるなんて学校の問題よりなんと親切なことか。小学生は 1000 を掛けるのか 1000 で割るのか迷うんですよ。でもそれだけ。■B 問題 Bird Watching。数と大きさの和がわかれば平均が計算できる。■C 問題 Flapping Takahashi。高橋君が存在しうる下限と上限を更新しながら判定をする。判定条件に一瞬迷ったけど、下限≦上限で間違いではなかった。いつものように all?any?none? といった Array のメソッドで入力を受け取りながら同時に判定をすると入力を受け取り切らなくて次のケースが狂うことに注意した。■D 問題 Clouds。計算量の見積もりができなかったのが敗因。2000×2000 の二重ループも、全体で N に収まるループも許されているけど、それらが組み合わさって 2000×N のループになっていることに気づけなかった。気がついたらやりようはある。雲のひとつひとつにハッシュ値を割り当てて重なり合いを xor で計算するならグリッドを走査するのに伴う雲の足し引きは定数時間の計算になる。提出 #71342582。どこかのブログを読んだ限りではもっとオーソドックスな解法があるなんてことない D 問題だった雰囲気があるけども、グリッドではなく雲の座標を伝っていくようにすると間に合うんですか?■E 問題 Distribute Bunnies。終了後に読んだけどわからなかった。似た問題が ARC-A あたりにあったのは知っている。たくさんの二択。UnionFind だと見かけたので UnionFind で解いた。でも UnionFind でいけるということが見抜けるようになったことを意味しない。カードに関する問題だったと思ったから AtCoder Problems で問題名を検索したら ARC111-B「Reversible Cards」がそうだった。400 点問題。4年半前の自分の提出 #21761198。ストレートに UnionFind ではないけど UnionFind っぽい処理をしている? 解説によれば連結成分ごとに DFS などで木かどうか判定すれば良いと書いてある。自分の今日の提出 #71357456 が木の判定をしているのかどうか知らないので2つが同じ問題なのかどうかも確かではない。■D 問題。雲が何枚重なっているかをマス目ごとに数えた後で、雲の厚みが1のマスの2次元累積和を作成し、雲ごとに、領域内に厚み1のマス目がいくつあるかを数えるらしい(「ABC434 振り返り - naoya - Obsidian Publish」)。厚み1のマス目の2次元累積和を用意するステップが完全に想定外だった。グリッドを走査するときに同時に1枚だけの雲がどの雲かを特定しようとしていたから TLE になっていた。その段階では枚数だけを数えておけば良かったのだ。2次元累積和を使って A-B-C+D の式で任意の矩形領域の和を得るのなんて簡単だよ。■■■D 問題。雲にハッシュ値を与えて XOR で重ね合わせをしたと書いた。実は最初は足し算と引き算で雲を重ねたり取り除いたりしていて、それでもサンプルが合っていた。なぜ足し算引き算ではなく XOR なのか。たとえば雲をたくさん重ねた状態のビット長がコントロールできないのが不都合なのかと思った。雲のハッシュ値が 40 ビット長だとして 1000 個の雲を足し算で重ねるとざっと 50 ビットがないと状態が保持できない。では雲の最大数が決まっていてビット長が足りているなら足し算で問題ないのだろうか。むしろ状態が 40 ビットを超えると発行済みの雲のハッシュ値(単独)とのかぶりが考えられなくなるのが嬉しいのではないか、と一瞬思ったけど、それなら最初から 50 ビットのハッシュ値を配っておいて XOR で重ね合わせをするのがビットの効率的活用なのかなというところに落ち着いた次第。■D 問題。単に雲の番号を足し合わせたものを状態として持っておけば良い。ハッシュ値はいらない。重なっている層数をあわせて管理しておき、雲が1枚だけのときにだけ雲の番号の和を参照するのだから、雲1+雲2が雲3と判別不可能だろうと関係ない。……ということが復習を終えた段階でもわからないんだなあ。


2025年11月27日 (木) 20251114の続き。パスキー。これまでで一番詳しそうな記事。■「パスキー徹底解説:パスワードレスな未来への完全ガイド - ZDNET Japan」■「第1回:パスキー認証器とは何か?--パスワードレス時代へのカギ - ZDNET Japan」■パスキーという仕組みを成り立たせる独立していたりしていなかったりする4つのアクター(記事ではエンティティとされている)があるという。OS、Web ブラウザ、Web サービスやアプリ(依拠当事者/リライングパーティーと呼ばれている)と最後に認証器(オーセンティケーター)。認証機というのが見えにくい。「パスキーの世界において、オーセンティケーターとは、パスキーの公開鍵と秘密鍵という構成要素を生成・保存し、あらゆる認証セレモニーの際にそれらを取得・使用する技術を指す。Googleのパスワードマネージャーのようにウェブブラウザーに組み込まれているものもあれば、「Bitwarden」「Dashlane」「NordPass」といったサードパーティー製のBYO(Bring Your Own)型パスワードマネージャーも含まれる。また、デバイスのOSと連携したり、Trusted Platform Module(TPM)や「Secure Enclave」などのローカルセキュリティハードウェア、あるいはYubicoの「YubiKey」のような「FIDO2」準拠のローミングオーセンティケーターといった、パスワードマネージャーではないハードウェアとの組み合わせで構成されたりする場合もある。ここで重要なのは、現在のパスワードマネージャーの多くがFIDO2準拠のオーセンティケーターである一方で、全ての認証器がパスワードマネージャーであるとは限らないという点である。例えば、YubiKeyは認証器ではあるが、パスワードマネージャーではない。また、「オーセンティケーター」という言葉の意味は、テクノロジーベンダーやその顧客によって異なる場合があることにも注意が必要だ。」 たとえば Bitwarden がそのひとつだという。Google や Microsoft とどちらがマシかはわからない。どれも選びたくない選ばされたくない雰囲気。