/ 最近 .rdf 追記 設定 本棚

脳log[2026-01-27~]



2026年01月27日 (火) 「DI(依存性注入)という言葉がキモい」への回答。その違和感は“誤訳”から来ている」■もっともな感覚だと思う。同じように思った過去の自分は Parameterized Dependency という語をでっちあげた。目的ではなく形式寄りの命名だとは思うけど、その代わり当てはまるなら直截でわかりやすいと思う。ましてや “誤訳” よりはね。訳してないけど。今日わかったのは、訳す前の Dependency Injection をそのまま読み取るなら違和感は生じないのかもしれないということ。ネイティブではないのでわかりません。勝手用語を発明しなくても「DI (依存性注入)」で十分なのかもしれない。■C++ のテンプレート機能もね、型がパラメータになることで操作対象にできるというのがマクロ(※)のお株を奪って画期的だったという認識。次にパラメータ化したいのは関数の引数リストなんだけど、タプルでできるんですか? それと uniform function call syntax があると三者の相乗効果が期待できる。■※マクロ。Rust とか Crystal のマクロはなんか新しいよね、全然知らないけど。cpp コマンド(わざわざ呼び出したりしない)とは全然違う。


2026年01月26日 (月) ページネーションとパジネイション(pagination)は同じか否か。


2026年01月24日 (土) [AtCoder] 今日の JPRSプログラミングコンテスト2026#1(ABC442)。■A 問題 Count .。問題名のドットを見落としませんでした。いつでもどうすれば条件分岐(|| とか)が省けるかを考える。今日は c==?i||c==?j (c は各文字) を一度書いてから 'ij'.index(c) もありだなと思ってからの 'ij'[c] で提出した。■B 問題 Music Player。珍しく長い変数名 playingvolume を使ったものだから、タイプしながら volume は長すぎるせめて vol にすべきだったと後悔していた。他の人の変数名が気になります。■C 問題 Peer Review。エルデシュ数とかベーコン数をイメージしながら UnionFind の雰囲気を感じていたけど、直接の利害関係しか関係がなかった。Hash を使って重複を除いたけど、制約で予め除かれていたので無駄だった。Hash を使うだけで目に見えて実行時間が増えるので、本当に必要なとき以外は使うべきでない。必要なときでもある数までは配列の線形スキャンの方がましなのである。■D 問題 Swap and Range Sum。隣接項の交換なら累積和を2点更新するだけだと思って書き始めたら、実は1点更新だということがわかった。添字で間違えないように{参照/更新}する可能性のある項をすべて列挙してから実際の処理を書いた。順番に並べて前後の位置関係をヒントにすればたぶん取り違えないだろう。■E 問題 Laser Takahashi。「すなわち、モンスターは大きさを持ちません」 偏角ソートして累積和の差分を答えるだけなんだけど、角度を逆引きする関数をリファレンスから探してきても誤差で殺されそう。私はもう Rational を使う楽ちんさを知っています。傾きを分数で持つ。分母がゼロの場合を irb で確かめると例外が飛んだ。じゃあその場合だけ小数の無限大で (Float と Rational の比較は Ruby におまかせできる)。求める累積和の区間が円環の切れ目を含むと面倒なので例によって2周分の累積和を用意した。傾きが等しい点を累積和でうまく扱えるように座圧(傾きを傾きの序列で代替)もした。サンプルが合わない。デバッグ出力を見てよく考えると Rational で表現した傾きでは原点で対称な点を区別できない。どうする、今からベクトルの扱いが思い出せるか? どの象限にあるかという数字と傾きのペアでソートすることでなんとかなった。でも WA×5。象限によっては X=0 のときの値を負の無限大にしないといけなかった。これの修正に6分。全体では 25 分(+ペナルティ5分)かかった。■F 問題 Diagonal Separation 2。5000 の2乗は嫌な感じ。でも他には 600 点の G 問題しかないのでやるしかない。行単位で DP をするのかと思ったけどサンプル2が合わない。k の値を前の行から引き上げるとき、列方向の制約によって追加コストが必要になるのだった。そして日記を書いている今どうしてもサンプルが合わなかった理由がわかったのだけど、コストは追加されるだけではなく削減されることもある。1時間残していても問題を理解するのに足りなかったんだな。■■■F 問題水 diff 下位マジ? なら解けたなあ、とは思えない。


2026年01月19日 (月) [BAD BOY] 左ブレーキレバーとシフターの位置についての覚え書き。同じ試行錯誤を今日を含めて2回はやった気がするので、3回目をやる前に読んで済ませられるように。現在はブレーキレバーのクランプとクランプの外側にある足のあいだにシフターをクランプしている。I-SPEC EV タイプのブレーキレバーにはいらない足がある (「Supported here」)。末広がりのブレーキレバーの形(気に入らない)は奥から手前というより内から外への指の動きを要求するけども(でないと指が届かないし、届くように近づけるとレバーとハンドルが接触する)、手を内に寄せるとシフトレバーが邪魔で親指を手のひらと向かい合わせにできない。シフターのクランプをブレーキのクランプより中心に寄せるとどうだろうか。やってみた(たぶん1、2週間前にも試している)。問題点1。シフトレバーの動きがブレーキのクランプを擦る。これは多分にシフトレバーの問題であって、グリップのロックリングでさえうまくやらないと擦ってレバー操作に差し支える。ブレーキのクランプは厚みがあるのかどうしてもうまくやれない。金属加工ができるなら指の腹を受け止めるために広がっているレバーの部分を削っている。問題点2。シフトレバーが遠くなってシフトアップ操作が難しい。なんとかなるのではと予想していたけど、シフトダウンはともかくシフトアップが難しい(人差し指でやるのも親指でやるのもどちらも難しい)。以上より親指の行き場に迷う現状が一番ましだということがわかった。面倒なのでもういじらない。いじりたくなったら今日の日記を思い出して読むこと。


2026年01月17日 (土) [AtCoder] 今日は ABC441 (Promotion of Engineer Guild Fes) があった。典型度が高い王道な問題セットだったと思う。ただし典型=簡単ではない。■A 問題 Black Square。マス (P,Q) が一番左下の座標だったりするといやらしいけど、べつにそんなことはなく、P...P+100Q...Q+100 の範囲と比較する。■B 問題 Two Languages。難しかった。まず読み取るべきは「wi​ は高橋語か青木語のどちらかの単語」という制約。そうすると単語が高橋語のアルファベットで構成されているか、青木語のアルファベットで構成されているか、あるいは共通部分で構成されているかを判定すれば良い。共通部分 ? 'Unknown' : 高橋語 ? 'Takahashi' : 'Aoki' という論理。ところが実際に問題を解いたときはそんなにすっきりとした区分けができていたわけではないから、入力を加工して共通部分を用意するということをしなかった。その場合は 高橋語ではない ? 'Aoki' : 青木語ではない ? 'Takahashi' : 'Unknown' という否定混じりの論理にならざるを得ない。それは難しい。■C 問題 Sake or Water。B 問題より素直。カップ数を最小化しつつある程度以上のお酒を飲みたいのだから、ソートして量の多い方から、最悪の場合を想定して飲んでいく。■D 問題 Paid Walk。出次数が4以下で、L が 10 以下。スタート地点は 1 で固定。4 の 10 乗が 100 万程度だったから、全部試せばいい。過去2回拍子抜けした経験からもうわかってきたけど、D 問題で DFS をやるときは、DFS 自体が課題という判定なのか高速化の工夫が求められない傾向にある。今日のこれは DFS に限らず BFS でも良かったのかもしれないけど、DFS で書きたくなる問題ではあったと思う。■E 問題 A > B substring。問題文に嘘が書いてありました。「S の空でない連続する部分文字列は N(N-1)/2​ 個ありますが」と書いてあって、これは S から 2 つの文字を選ぶ組み合わせだから、1文字だけの部分文字列がカウントされていない。半開区間で文字列を表すなら末尾の次の位置までをありうる区間として、空でない部分文字列の数は N+1 から 2 つを選ぶ組み合わせだから、(N+1)N/2 になるけども N(N-1)/2 にはならねーな。空でない連続する部分文字列の数をあらためて考えると、始点ごとの終点の数が 1 から N までだからその和で N(N+1)/2 になる。指を使って N=5 の場合を2回数えたから間違いない。ということをたどたどしく念入りに確かめてからリロードをしたら、目の前でしれっとマイナスがプラスに変わりました。やめてほしい。これでやっと問題に取りかかれる。A を +1、B を -1 としたときの累積和が正になるものの数を数えたい。Hash 表を使って愚直にカウントすることが許されない制約なので BIT を使うことを考えた。できそう? できた。BIT で負の添字を扱うために N 程度の下駄をはかせてゼロの位置をずらした。その添字の操作を何度も繰り返すと間違えるので BIT 操作を関数でラップする丁寧さを見せた。■F 問題 Must Buy。DP です。N+数回 DP をすることが許されるならなんとかなる。ところが1回だけの DP をするのにも 5000 万のオーダーの処理になってしまう。時間制限を見るとちょい長めの 2.5 秒。Ruby だと苦労して工夫しても不可能な可能性があります。G 問題を読みましょう。■G 問題 Takoyaki and Flip。誤読をしていた。タイプ3のクエリではたこ焼きの合計を答えるのだと思っていたが最大値だった。図解で max とばっちり書かれていたけど、最初の実装を終えるまで見なかった。まだ誤読していた。タイプ2のクエリによって各お皿は1回だけ裏返されるのかと思っていたがそうではなかった。問題を正しく理解してからも、遅延セグメント木に何を乗せるか、不足に気が付いては足すということを繰り返した。区間演算について。たこ焼きを足すだけではなく裏返しもある。そして裏返しの裏返しは何もしないことではない。たこ焼きがゼロになっている。最終的に「表になっている面に足す」「裏返して0にする」「(裏の裏で)そのままの面で0にする」という3つの状態を考え合わせることになった。セグメントに保存する値について。裏向き無効と表向きの最大値のいずれかだけではなかった。ある範囲に表向きの皿と裏向きの皿の両方がある場合は、裏返しても裏返しても有効な最大値がある。最終的に表向きの無効値最大値と裏向きの無効値最大値を記録した。nullable integer のペアを記録したということ。提出 #72566496 (TLE×38/AC×27)。でも TLE です。しかも TLE の中に WA が隠れているのがほぼ確実。でも全然しっぽを出さなくてやっかい。■G 問題。レアなバグの原因がわかった気がする。Op::Abs2 と Op::Abs1 をセグメントに適用するときに、一度でも裏になったことのある面の最大値を、最大値がある場合はゼロにリセットするのを忘れている。どうせ TLE だから高速化のアイデアが出るまで再提出はしない。■E 問題。解説に O(N) 解答があるらしい。それは考えてみたい。■B 問題。昨日は大まじめに書いていたんだけど、解答の論理は否定も共通部分セットも使わずに 高橋語&&青木語 ? 'Unknown' : 高橋語 ? 'Takahashi' : 'Aoki' でも良かったのだな。横着して1文字あたりの判定を線形時間で書いて、判定結果を変数に保存もせず、だけど同じ判定を2回繰り返すまでは横着しきれなかったと見える。■■■動画を見ていたらブラウザからのコピペで Takahashi という風にスペースがくっついていたけど AC だったという話が聞こえてきた。これは自分もコンテスト中に気が付いていて、以前にそうならないようにした設定が失われているなと思ったのを思い出したので、改めて設定をし直した。Firefox で about:config を開いて space を検索するとまず editor.word_select.delete_space_after_doubleclick_selection = false という設定が見つかって、でもこれを true にしても期待した効果を発揮しなかったので下にスクロールしていくと layout.word_select.eat_space_to_next_word = true という設定が見つかって、これを false に変更すると期待通り余計なスペースが選択されなくなった。めでたし。


2026年01月12日 (月) とある小説で1ページ内で4つも消化器、消化、消化器、消化と繰り返されていたけども、全部消火です。異化同化消化とあるけども、異化と消化の関係が不明瞭。異化作用のうち特定のものを、消化というみたいな、雰囲気を感じています。■検索したら出てきた「異化と同化、消化という用語について説明せよ。」簡潔な解答。「異化:複雑な物質をより簡単な物質に分解し、エネルギーが放出される過程。代表例に呼吸や発酵がある」「消化:細胞内や消化管内で、炭水化物・脂肪・タンパク質などが吸収可能な段階まで分解される過程。エネルギーは放出されない。」■さらに Wikipedia「異化 (生物学)」。「異化は次の三段階がある。(略) この段階は消化管の消化酵素や細胞内のリソソームの酵素によって行われる。消化によって糖質、脂質、タンパク質はそれぞれの構成単位である単糖類、脂肪酸、グリセロール、アミノ酸に変えられる。」 分解して ATP を作るまでが異化で、その第一段階のうち消化管内で行われるものはもちろん消化だろうけど、異化の第一段階は細胞内でも行われている。■もうひとつ Wikipedia「消化」。物理的消化と化学的消化という分類があるな。消化に注目すると今度は咀嚼までがスコープに入ってくる。■異化と消化は現象というよりは目的や機能に付けられた名前であり、一部にオーバーラップがあるということで良いだろうか。異化の目的(最終段階)は ATP を生み出すことです。消化の目的(最終段階)は食べ物を細胞内に取り込むことです。その過程でどちらも物質が単純化されます。■消化について書いているときに、不用意に「体内」という言葉を使うと誤解しか招かないなと思った。口から食べておなかの中にある食べ物は体内にあるかないか。一般的な感覚では体内。人間を管に見立てれば体外。さっきコピペしたように、消化の文脈では消化管内と細胞内が対比されていた。どちらも体内としてしまうと意味ありげな区別が失われてしまう。


2026年01月11日 (日) [AtCoder] 昨日は ABC440 (Promotion of Engineer Guild Fes) があった。苦しい。配点を見れば E までを確実に解きたい回。フタを開けてみれば C も D も E も苦しい。(結果とは別のところで)とても満足している。■A 問題 Octave。X の Y 乗ではありませんでした。■B 問題 Trifecta。T の小さい順に3つ。■C 問題 Striped Horse。問題文が難しいです。幅 2W で区切った前半 W を黒で塗る。変数は x。これを操作することで 2W の区切りをずらすことができる。N マスが 2W の倍数でないと面倒なので 0 を補って 2W 境界にアラインする。あとは尺取り。2W 幅の繰り返しは予め重ね合わせて同時に扱える。頭の中を整理しながら丁寧に丁寧に丁寧に時間をかけて尺取り。黒と白の幅がそれぞれ W しかないから勘違いしたけど、総当たりするには 2W 通りを考える。23 分かかった。■D 問題 Forbidden List 2。ある値 x が与えられたとき、X 以上 x 以下の整数の個数と、A 数列に含まれる X 以上 x 以下の要素の個数から、含まれない数の個数がわかる。ある値 x が A 数列に含まれる場合と含まれない場合を慎重に区別すれば答えを二分探索できると思ったけど、これは log が2乗になるというのに時間制限が標準の2秒しかない。これはいけない。A 数列をなぞる処理を考えよう。ソートした A 数列のうち X 以上の要素のみを並べた A′ について考える。求める Y 番目の値が A′[i] の左にあるか右にあるかは計算で求められる。答えが右にある A′[i] のうち最大のものはなんだろうか。なぜか Q×N の処理に満足して TLE を出したけど、A 数列をなぞる処理を二分探索で書き換えるのは簡単。6分で修正して全体で 35 分+ペナルティ5分。■E 問題 Cookies。まずですね、問題文でさらっと流されている全ての選び方が N+K-1 個から K 個を選ぶ方法の数だということがわからない。そこをわかったつもりでプライオリティキューを使って1個1個下位の要素に置き換えていく操作を X-1 回行う処理を書いたら、サンプルの3が合わない。どうやったらサンプル3の答えが出てくるのか、プログラムを離れても理解できなかった。最大の値 97 を2番目の値 93 に置き換えることで4ずつ小さくなっていくものだと思っていたら、途中から減り幅が2になって1になっている。ようやくわかったのは、たくさんの 97 を 93 に置き換えるよりも、1つだけの 97 を 59 に置き換える方が優れている、そういう閾値が K 以下で存在している場合があるということ。残り 10 分以下でそれがわかっても、なんならどれだけ時間があっても、重複なく整然と次の候補をキューに入れていくことができない。■自分のすべての提出。■動画を見ていて知ったけど、馬の問題が多かったらしい。今年は午年らしい。どうしてどちらも「らしい」なのか。シマウマがいきなり長さ N のマス目になるんだなという、前置きと本題の切り替えの唐突さは感じていたが、そういう理由だったのね。■■■E 問題。N+K-1 個から N-1 個を選ぶだと理解できた。K 個ではなく K 個以外である N-1 個の方が仕切り。H で表される組み合わせは知っているしそれで理解しようと考えていたんだけど、どちらに注目するかでさっぱりわからなくなるんだなあ。むしろ問題文に書かれていたことでわからなくなった。■E 問題。重複のない遷移を考える必要はない。最大 50 要素になる配列を Hash につっこんで重複を調べるので十分に早い。提出 #72433875 (TLE×18/AC×16)。ダメです。■提出 #72434929 (AC / 934 ms)。遷移先をより限定することで AC になった。A 数列は予め降順にソートしておく。各クッキーを何枚選んだかという C 数列を状態としてダイクストラ法をする。1枚以上選ばれたクッキー i のひとつひとつについて、遷移先は (C[i]-1; C[i+1]+1) したあとの C に限って良い。遷移できなければ遷移しないだけ。それで網羅できる。■E 問題。逆の遷移を考えることで重複のない一意の遷移を選ぶことができるとかなんとか解説に書いてあるらしい。読んだけどよくわからないので「らしい」です。■F 問題。動画で考察を聞いてなお実装が1時間で終わらない。提出 #72444957 (AC)。すべてが 66 行目に詰まっている。


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 の御託宣を鵜呑みにして他人の話を聞かない人閒が多数派になる未来は怖いもんね。