20250310 発作/temporary value dropped while borrowed

3/9

持病のPC弄り病の発作が出てしまい、秋葉原にすっ飛んで行ってケース・電源・CPUクーラーを買ってしまった。7月の大規模アップグレードのときに電源は変えなかったのだが、電源の劣化を示唆するような症状は見られないと言えども(いや、実は出ているかもしれない…?)、購入から8年間酷使している電源はそろそろ不安だ。そして現在使用しているのがATXの省スペース横置きという変態型であるが故に電源の交換やHDDの追加作業が非常にめんどいという事情がある。このケースの厳しい寸法制限のせいでCPUクーラーは小さくて低性能なものを使わざるを得ず、またエアフローも貧弱であるために追加のファンがうるさい。

このケースを買った当時は学生で部屋が狭く、空間の活用も下手だった。今は違い、いかにもPCを置けそうな遊んでるスペースがデスク下にある。それならクソデカケースを買えばいろいろな問題が一挙に解決するではないか(なにか1つの新手によって全ての問題を一挙に解決できそうになると細かいことを考えるのがめんどくなるやつ)。

最近のケースは3.5インチベイが少ないのがトレンドとのことだが、僕は最低4は欲しく(現状も3使ってるし)、Define R5にした。10年以上前から使われている定番商品らしい。電源とクーラーはあまり詳しくなく、750WGOLDのATX3系であるMSI MAG A750GL PCIE5、そして国産であり低価格帯でAK400と双璧をなす定番・虎徹Mark3にした。

夕食は秋葉原の日乃屋カレーにした。日乃屋カレーってこんな味だったかな…?と思った(プラスの意味なのかマイナスの意味なのかは お察しください )。雨でとても寒い日だったのにメイドカフェ?の呼び込みはみんな足を見せる服装で大変だなあ。

ケースが届く月曜日が、Xデーだ。

3/10

普通の

↑これだけ入力した後温めたお茶を取りに行ったら何を書こうとしていたのか忘れた。何が普通だよ(さっき考えていたことを思い出そうとしても思い出せないこと、あるよね…あるよね?)。

家事

明日のPC換装・配置換え作業を控えて今日は念入りに掃除をした。昔は長机1つをPCデスクにしていたのだが、今は友人から貰ったクソデカ机(なんと天板120cm x 70cm)の左側にもう1枚机を連結してクソデカスギ机として運用している。クソデカ机の下にはキャビネットと僕の太ももが入っているが、追加机の下は何も活用されない空間になっていた(実際のところ故障して直線が引けない液タブが放置されている)。

なぜ液タブが放置されていたのか。それは捨てるのが難しそうだったからだ。一般に家電は捨てるのが難しいし、液タブは粗大ゴミとして捨てようにも分類が不明で問い合わせが必要そうだったので面倒そうで放置していた。今回改めて調べてみると近所のジョーシンで550円払って回収してもらえた。半導体はリサイクルされて回り回って今度はLLMのパーツにでもなるんだろうか。

その流れでベルトや食品を買って帰宅。冷凍餃子ってレンジじゃなくてフライパンで解凍するんですね。知らなかった。

RimWorld

RimWorldは人生の多くの洞察を与えてくれるが、一般規則と個別事例の関係もそうだ。後半のpawnが増えてきたコロニーは一人ひとりの行動をチェックして最適化していくのは困難だ。それはチェックが手間というのもあるし、一人ずつ最適化しても全体最適にならないからだ。そこでなるべく少ない数の一般的な規則を発布し、各pawnが自律的に行動することで全体が円滑に回ることを期待する。たとえば衣服に関して言えば

  • pawnのデフォルト着脱ルール(気温に合わせた服を着る)
  • pawnに「HP50%の服は着てはいけない」
  • 溶鉱炉「HP50%以下の服が存在する限りそれを燃やす」
  • ミシンに「衣服の在庫が1になるように製作する」

という4つのルールを設定することでpawnが衣服に関して困ることがなくなる。これが一般規則による問題の解決だ。

しかし現実は複雑だ。pawnが着るべき服は各pawnの性質によって大きく異なる。食人嗜好者なら人皮製の服、ヌーディストなら衣服なしにしたいし、戦闘時に前衛か後衛かによって防具も変わってくる。ミシンで製作できない拾い物の高性能衣服があるならそれを誰が着るかという設定も必要だ。

つまり、一般規則と個別事例の両方を意識しないと物事はうまく回らない。誰かが割を食うという可能性もあるし、システム全体が破綻するという可能性もある。思えば刑法が裁判官に対して量刑の範囲を指定し、裁判官が個別事例に応じて量刑を決定するというのはこれに通じるところがあるだろう。

Rust

このようなコードをコンパイルしようとすると

fn f() -> Vec<i32> {
    vec![1,2,3,4,5]
}

fn main() {
    let v1 = f().iter();
    println!("{:?}", v1);

    let v2 = f().into_iter();
    println!("{:?}", v2);
}

v1のほうだけ失敗する。

error[E0716]: temporary value dropped while borrowed
 --> src/main.rs:6:14
  |
6 |     let v1 = f().iter();
  |              ^^^       - temporary value is freed at the end of this statement
  |              |
  |              creates a temporary value which is freed while still in use
7 |     println!("{:?}", v1);
  |                      -- borrow later used here
  |
help: consider consuming the `Vec<i32>` when turning it into an `Iterator`
  |
6 |     let v1 = f().into_iter();
  |                  ~~~~~~~~~
help: consider using a `let` binding to create a longer lived value
  |
6 ~     let binding = f();
7 ~     let v1 = binding.iter();
  |

そもそも解説ページに全部書いてあるのだが、メソッドチェーンの形が解説のコード例につながるということがしばらくわからなかった(それが自明に思える人は以下読む必要ない)。
https://doc.rust-lang.org/error_codes/E0716.html

v1がやろうとしていることは、メソッドチェーンを分解するとつまりはこういうことであり

let v1 =
    {
        let tmp = f();
        tmp.iter()
    };
println!("{:?}", v1);

v1はtmpをborrowしているが、当のtmpはprintln!が実行されるころには存在していない。そもそもprintln!の場所でv1はもう使えないということだ。言われてみればRustの目玉機能である所有権の基礎of基礎なのだが、テキストで読んだ形と少しでも変わるともうわからなくなってしまっていた。やはり実践は重要だ。

20250306 ぎっくり腰?

項目 内容 得点
起床 7:15 100
散歩 ノー 0
朝食の栄養カバレッジ 3色カバー 100
体操 実施 100
労働 した・passion: 85点, discipline: 80点(複雑) 83
ジム 有酸素+筋トレ 100
勉強会 参加 100
個人開発 実施 100
あすけん - 26
総合 1日の総合評価 82

↑睡眠時間と節電を追加すべきかも

久々に入眠がクソ下手だった。割った睡眠薬の小さい方の欠片を飲むという蛮勇のせいだ。

腰が痛い。便座に腰掛けようと中腰になった途端に腰に軽く痛みが走り、その直後は大丈夫だったが夜になってじわじわ痛んできた。ジムは行ったが背筋系の種目は休んだ。参ったなあ。バックエクステンションはマシンが壊れていて重量が上がらないのでその分可動域を広く取ってみていたが、それが悪かったかもしれない。

これと同じタイプのマシンなんだが、理屈のうえでは体を直立よりも反らせようとしたら尻浮きませんか?どうやって成立するのかあまり理解ができない。

昼食は寒さと、それに伴うreproduction・搾取・愛玩・本能等の鬱っぽい思考をを辛さで追い払うために日高屋のチゲ味噌ラーメンにした。昨日・一昨日の松屋よりかなり安いけど満足度は負けていない。日高屋の餃子以外のメニューは侮れない。

写真をアップしようとしたら、スマホからPCに画像を転送するのに使っているKDE Connectが壊れていた。メンテナが修正版を出してくれたので数日以内にはストアに入って直るだろう。しかしなんで海外のOSSで活躍してるエンジニアってのはみんな雰囲気のあるイケメンで写真写りもいいんだろう。
https://github.com/GSConnect/gnome-shell-extension-gsconnect/issues/1932#issuecomment-2701205070

例のパケットキャプチャのプロジェクトを久々に少し触った。Clineの登場で界隈が賑やかいが、このプロジェクトに限ってはRustとインターネットプロトコルスイートを学習するという生存戦略が目的であるので、LLMは封印することにした。これで本当に生存できるかは10年後わかります。所有権の話いつまで経ってもよくわからない(というかメソッドチェーンと所有権の絡みってBookで説明されてなくない?)のだが、とりあえずこのひたすらエラーを解説するページが便利っぽいということを今日は発見した。
https://doc.rust-lang.org/error_codes/E0716.html

20250220 下を向いて歩く

7:50頃起床。ゴミ拾い散歩(柴ーズ)、朝食、ノー体操、労働(特上)、ジム(軽、54.9kg)、夕食、勉強会、個人開発、歯磨き、今。

予告通り散歩しながらゴミ拾いをしてみた。やってみると意外と難しい。まず地面のゴミを探しながら安全に歩くのが難しい。そしてゴミに集中して歩いていると本来の目的である頭を空っぽにするというのが達成できない。タバコの吸い殻がとっくに鎮火しているのに持ち帰ってからもずっと臭う。まあときどきやればいいかな。

最近の労働は出勤から退勤までチョコたっぷりだが、余裕が失われているのであまり良くない。

個人開発はパケットキャプチャにした。というのももう一つの候補だったRustでGUIは、まず日本語入力が出来ないフレームワークは足切り、そしてせっかくRustなのにHTMLのラッパーみたいなやつ書かされるのも意味ねえなと思ったら選択肢がどんどん減ってしまいやる気をなくした。

とりあえずChatGPTに聞いてみるとpcapかpnetを使えということで、pnetの方が抽象化が親切で易しそうだったのでこちらを使うことにした。NetworkInterfaceからdatalink::channelでデータを引いてみるとEthernetPacket(このレイヤーだとパケットじゃなくてフレームじゃない?)が取れた。

https://www.infraexpert.com/study/ethernet4.html を見ながら、とりあえず何か意味のある情報を知りたくてget_ethertype()を取ってみると2048とたまに2054が出てきた。 https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml によるとそれぞれIPv4とARPらしい。ARPってこのレイヤーだったんだ…(記憶なし)。

そう言えばDota2に巨大アップデートが来て、僕がよく使っているDazzleにも大きなreworkが入った…のだが、Dazzleはいつもそうなのだが、ヒーローの本来の持ち味がなんだったがさっぱりわからない大胆というか無軌道な変更が入った。それがすごく弱い。しかもその変更が無限財産増殖グリッチに悪用でき、悪人が使うと強いというもうわけがわからないことになっている。

20250219 失敗は未定義

7:30頃起床。散歩、朝食、ノー体操、労働(上)、昼食(キッチンオリジン)、ジム(強、54.9kg)、夕食、勉強会(長)、歯磨き、今。

せっかく毎日散歩しているならゴミでも拾うかと思い、ゴミ拾い用のトングを買いに行った。それが昼。キッチンオリジンでカニクリームコロッケを買って帰ったのだが、家にソースがなくてちょっと締まりのない昼食だった(でも醤油もそんなに悪くなかったよ)。水菜のサラダは調理が楽なうえにカルシウムが豊富で結構いい感じ。

ジムはインターバルを伸ばして強度x回数を向上させた結果前より少しだけ力が増している。ジムで有酸素漕ぎながらアニメを見ていると、周囲の視線が気になってニヤついてはいけないという意識が働き、それが逆に笑いを増幅してしまうのでなぜか満足度が向上する現象が起きている。情報の内容だけではなくコンテクストも重要ということだ。

Rustで作っていたちょっとしたCLIツール(諸事情により非公開)が完成したのでもう一発Rustでなにかやってみたいなと思っている。もうwebサービス(というかHTTPリクエストとDBを中継するコントローラ)はどれだけやっても大した経験値にならないだろうしRustの得意分野でもなさそうなので、GUIデスクトップアプリケーションか、wiresharkの真似事みたいなやつをやってみたいなと構想している。してはいるのだが、平日に個人開発の時間を捻出するのはなかなか難しい。30代はpassionではなくdiscipline定期。ルーティンを堅持しながら少しずつ整理していきたい。

この前友人に「今後の人生のライフプランは?」と聞かれて困った。特にない…。目標がないということは失敗も未定義なので安心(?)なのだが、そういう人生を送っていることに後ろめたさがないわけでもない。でも「ライフプラン」的な何かを達成しなくても毎日求められている仕事を能力を発揮して解決し、ほかほかご飯食べてあったかい布団で眠れること自体が十分成功であるとも言えるし、それに「満足」できることは有益な能力だ。

オチはない。

20250125 子供の活躍

9時頃起床。病院(頭)、薬局、朝マック、ダンス見物、展覧会、昼食、ジム(風呂のみ・相撲観戦)、夕食、夕寝、個人開発、今。

反省

昨日の日記は良くなかった。日記というのは、やることが全部終わって寝るだけの状態でchill…の機運に包まれながら一日のことを振り返り、その出来事のあったときの生のフィーリングとそれを俯瞰する執筆時の冷静さがブレンドされてこそ味わい深くなるし、自分にとっても意味がある。

日記

昨夜は明日が休みなので…と夜ふかししてしまったが、通院があるのでそこそこ早起きは必要で睡眠不足だった。ここ2週間ほどは規則正しく十分な睡眠を取ることに慣れていたので今日はずっと微妙な体調だった。

処方箋を持ってショッピングモール内の薬局へ。薬局は土曜午後になると高くなるので午前のうちに。でもみんなそう思っていたのか混んでいて40分かかると言われたので、モール内でブラブラして時間を潰す。ふとマクドナルドが目に入って、朝食を食べていなかったのでバーガー1つで朝マックとした。味は普通。しかしマクドナルドはそれしか注文しない人間にすごい量の紙を出してきて(敷くやつ、包むやつ、拭くやつ)アメリカンだ…となった。

薬を受け取り帰ろうとすると、モール内の広場で子どもたちがダンスしていた。近くのスクールらしい。さすがにスクールで本格的に習っているだけあってみんな照れがなく、堂々たる身体表現だった。ダンスを人と合わせるのは音楽より難しそうに見えた。音楽は出ている音さえ合っていれば身体動作がきっちり一致する必要はないのだが、ダンスは拍のポイントで同じポーズをするだけではなく、ポーズからポーズの間の遷移も同じf(t)で表現されなければならないからだ。

帰り道にちょっとした美術館があり、地域の中学の美術部の合同展覧会をやっているとのことだったので見てきた。率直に言うと中学生の絵というのは子供らしい素直さ・独創性がない一方で大人らしいテクニック・思想性もまだ身につけておらず、「うーん、中学生っぽい!」と感じるものが多かった。まあそれはそういうもので、自然なことだと思う。しかし素晴らしい熱意・センス・工夫あるいはトンチを感じる作品もあった。

活力のある子どもたちに刺激を受けて、僕もやっていき!が高まっているのでとりあえず手持ちのRemix製のwebアプリケーションは一通りv3フラグに対応した。Remixはまだ色々進化しようとしていてすごいなあ(職業ソフトウェアエンジニアとしては怖いけど)。Rustで作っているちょっとしたCLIツールもclapなるオーギュメントパーサーを導入していい感じに進化させている。今のところ細かいメモリを扱う処理はなく所有権周りの機能は活用していないが、そういう人間にとってもマクロ機能がとても便利だ。RustのstructはTypeScriptのobject/type/interfaceに比べるとやや取り回しが悪いかなという印象だが(たとえばネストで定義できない)、素のstructにマクロでいろいろな機能を付与していける(たとえばserdeのrenameとかclapのlong/shortとか)のは本当にすごい。Goのstruct tagも面白い機能だなと思ったけどマクロの使用感はその上を行っている。作る方は大変なんだろうけどな〜。

真・三國無双2

ここ数日、『真・三國無双2』の動画を見るのがマイブームになっている。僕が小学生くらいの頃に友達の家でよくやった(僕は所有していない)。24年前に発売されたゲームなのだが、現代まで続くシリーズの礎となった偉大な作品でもある。

大昔のゲームに対する深い知識と研究、そして投稿動画が2本なのに妙に上手い動画編集。何者なんだろう。YouTubeの世界は広いなあ…(そして最近暗号の勉強をしているので、疑似乱数への対処法を見るのは面白い)

豆苗

もう「刈って」いいか…?←刈りました

20250116 日記

7:30起床。散歩、朝食、掃除、労働(普通)。休憩、ジム(相撲観戦)、退勤。

Dota2(負)、夕食、勉強会、歯磨き、ゴミ出し、睡眠薬。

朝散歩で寒い思いをすることで暖かい部屋への感謝を持って労働開始できる。が、敢えて寒い思いをするのはサウナerの冷水浴と同じなのかもしれない。帰宅して手を洗うときは、わざと水を流しながら隅々まで石鹸をつけることで温水に切り替わるのを待つ。クソくだらない資源の無駄だ。

執筆メモに「root」と書いてあるのだが意味がさっぱりわからない。マジで何?

次の勉強会題材は『暗号と認証 しくみと理論がしっかりわかる教科書』にした。友人に昔貰ったものだ。その友人の性格からしていかめしい本かと思ったら本当にしっかりわかりそうな親切な教科書だった。

個人開発(僕は勉強会と個人開発は内容を分けることにしている)では今はRustで簡単なwebスクレイピングをしている。Rustは型システムが充実しているしAIもRustが得意なのでスラスラ進む。しかしserdeで型なしjsonをパースするときに、jsonのフォーマットは同じなのに内容によってStringがnull扱いされて失敗することがあり、謎だ。