青空が青めく朝のまばゆさに何度も閉じてゆく瞼見る
満開の桜流しの雨が降るいつかの君を待つ汽水域
思い出を思い出してただけだった規則正しくばらばらになる
繰り返すまたもや桜繰り返す変わらないまま変われるように
信号が青に変われば走りだす前の車にずっと花びら
初夏に似た(どうであろうと花は花)卯月暮れても肌寒い夜
白波の終わりを眺め乱れ散るひかりが沈む浜辺にいたはずなんだ
青空が青めく朝のまばゆさに何度も閉じてゆく瞼見る
満開の桜流しの雨が降るいつかの君を待つ汽水域
思い出を思い出してただけだった規則正しくばらばらになる
繰り返すまたもや桜繰り返す変わらないまま変われるように
信号が青に変われば走りだす前の車にずっと花びら
初夏に似た(どうであろうと花は花)卯月暮れても肌寒い夜
白波の終わりを眺め乱れ散るひかりが沈む浜辺にいたはずなんだ
30代始まった。何一つ変わることなく体がぼろぼろになっていくのをただ眺めていた二十代後半が終わり、終わったところで同じように同じことが始まった30歳だ。真っ暗な未来に向かってうつむきながら少しずつ寝返りを打つかのごとく進んでゆくのだしらんけど。
20代を総括しようか。覚えてないけど。
二十歳になって真っ先にクレジットカード作った。そして最初に買ったのはたぶんHuluのサブスクとiTunesでBIGMAMAの曲だろう。酒も飲むようになった。病気のせいで二年で飲めなくなるわけだが、スコッチから入った。007でマッカランが毎回出てくることを知ったのがきっかけだったように思う。マッカラン、タリスカー、ラガヴーリン、白州、グレンフィディックなどを覚えている。
祖母が亡くなった。くも膜下出血だった。ついさっきまで元気だったのに突然のことだった。夕食時祖母がいないことに気付いた父が祖母を探し始め、近所の人とおしゃべりでもしているのだろうと思っていたが、ふとトイレの扉を開けてみたら、トイレに体を預けるように意識のない状態で倒れていた祖母を父が見つけた。父が叫ぶように僕を呼ぶ声が聞こえ、最初は聞き取れなかったが、二度目の声にただならぬものを感じ、声の方へと僕は向かっていった。トイレから祖母を僕と父で運び出し、父は人工呼吸、僕は心臓マッサージを始めた。近くでは倒れるように座り込んだ母が救急車を呼んでいた。心臓マッサージの途中、祖母の胸の骨が折れるような感触を今でも覚えている。救急車を誘導するため、僕は心臓マッサージを母と替わり、家の前の車を少し離れた駐車場に持っていき、オペレーターと電話しながら救急車を待った。まだ救急車到着まで時間がかかる趣旨をオペから伝えられるも、赤いランプがすぐに僕の目に飛び込んできて、いや、もう来ましたと僕は言った。最初に到着したのは救急車ではなく消防車だった。消防車は近所中に赤い光を撒き散らしながら家の前に止まった。救急隊が消防車に乗ってやってきたらしいことに少し安心して、家に戻った僕はなぜか母が畳の上で息を切らしながら倒れてるのを見た。母は持病を抱えており、病のストレスでパニック障害を発症したことがあったので、瀕死の祖母を心臓マッサージし続けた疲労とストレスで一時的な過呼吸状態にあったように思えた。救急隊の祖母に関する質問に母は答えることすらできずにいたので、母もやばいのではないかと不安になったがなぜか救急隊の人はケアしなかったので、たぶん父が大丈夫だととでも言ったのだろう。そして救急車に運ばれていく祖母に僕は付き添う形で同乗した。対向車が来る狭い道を選んだ運転手に、そこですれ違えますと僕は言った。運転手は僕にありがとうございますと言った。救急車は僕が慣れ親しんだ道をゆっくりと何度も赤く染め上げて走った。想定していたのと違う始めての病院に到着して、祖母は扉の向こうへ運ばれていった。そこのすぐとなりにあるベンチに座り僕は待った。胸に穴が空いたとはまさにこのことで、ほんとに胸のど真ん中に重いずっしりとした鉄球があるようでいて、何もない穴が空いているようでいて、あれほど落ち着かない時間は人生で初めてだった。なぜかどこか楽観的だった僕は祖母の死を予感していた。やがて父の姿が見えた。あれほど安心した瞬間もない。父が病院についたことと祖母の容態とは全く関係がないのに。父は僕にどうなるかわからないから一度帰ってもいいと言ったので、僕は帰ることにした。携帯を持ってきてなかった僕は受付でタクシーを呼びたいのですがと言うと、あちらからできますと言われ、そこにはただのボタンがあった。ボタンを押すと自動的にタクシー呼び出しになるらしい。家についた僕は、祖母にたいする態度などを後悔していた。もっと話を聞いてあげればよかったと。しかし当時の僕にも、今の僕にもそれはできないであろう。落ち着きがなく常に喋っていて、話しかけているのか、独り言なのかわからないあの騒音に僕はひどくストレスを感じていて、無視することが多かったのだ。あの後悔は懺悔のようなものに過ぎなかった。常に明るく誰とでも仲良くおしゃべりできるその姿に不快感を感じていたのだ。尊敬すべき敬愛すべきあの姿に。やがて父から電話があり、くも膜下出血であると告げられた瞬間、終わったと確信した。重度の障害が残るか、植物状態か、そう思ったが容態はもっと悪くいつ亡くなってもおかしくない状態だから病院に来てほしいとのことだった。病院に再び行くと人工呼吸などの多くの医療機器に繋がれた祖母の姿があった。薬で強制的に心臓を動かしている状態であるとのことだった。父は父の弟、僕の叔父にあたる人に電話をかけていた。叔父は祖父の葬儀にも来なかったようなそうでもなかったかのような人物で、はたして来るのかと思っていたが、意外と早く来た。次に仕事を切り上げた僕の妹が来た。エレベーターで顔を合わせるなり、ばあちゃんは?と聞いてきて僕は良くないと答えた。病室に入って祖母を見た妹はすぐに涙を流した。祖母の死を待つだけの時間を病室と待合室広場などを往復しながら過ごした。待合室広場のソファの上で顔に新聞を被せ寝ていた僕を起こす電話の音が鳴った。病室へ行くと途切れることのない長い心電図の音がなっていたらしい。僕が言ったときには規則的な音に戻っていた。まだ心臓は弱々しくも鼓動を続けていた。また待合室広場に戻り椅子に座った。夜明け前だった。入院患者数名がぞろぞろと起き出してきた。そして正面を東側にして立っている病院の10階から、完全なる朝焼けと日の出のすべてを僕は見ていた。それまでの人生で一番美しい景色だった。その日の夕方、祖母は亡くなった。
たまに6,7こ上の先輩と一緒に仕事をしていた時期でなかなかハードなことやらされていたが、比較的年の近い同職の人と仕事ができて嬉しかった。その中で初めて熱中症になって時限的な仕事が怖くなった。
親戚の家への運転をやらされた。下道3,4時間のクソ経路のせいでひどく疲れかつ下品で粗野な宴にぶち込まれ、帰ってくるなり、もう二度といかないとつぶやいてベットに倒れ込んだ。昔は僕も下品で粗野な子供だったのにもうそれが外部から飛んでくることに耐えられなくなっていた。
母の姉がなくなった。叔母は脳の血管に障害があるとかないとかで若い頃に余命宣告されていたらしいが塞かりそうになっていた血管から新しい血管が生え自然とバイパスしなんとかなったらしい生命力の持ち主である。相当のヤンキー(死語)であったようで僕は悪い影響をいくらか受けていたと思う。しかしガンには勝てなかったようだ。二度といかないはずだった親戚の家へとまたしても行く羽目になったのだが運転を拒否したのと、泊まりだったのと、酒があったのとで、だいぶ寛容になっていた。
自分の車をまだ持っていなかった僕は新型のロードスター(ND)が発表されたのでそれを買うつもりだった。妹を妹の車で駅まで送ったついでに車をかり、ディーラーへと試乗に行った。店につくなり、出迎えてくれた営業に試乗したいと伝えると免許書の確認などなにもなしにそのまま、店の中に入らずに直行でロードスターに乗り込んだ。高すぎた期待値のせいか、意外とこんなもんか感を感じつつ、屋根を開け、開けるときのスムーズさに感動しつつも、頭が熱くなってすぐ閉めた。店に戻り見積もりなどをもらっている最中に頭が痛いと感じていたのは前触れであった。
5月ごろ僕の体がぶっ壊れた。最初は数日立っても治らない頭痛。やがて首が痛くなってきて、やがて風呂にはいるだけでつかれはてるかのような疲労感、そして首の治療に通っていた整形外科での電気治療の刺激による過呼吸で、救急車に運ばれた。クソなので状況は割愛する。何事もなかったかのように病院から帰ってきた僕は運動しないといけないと思いランニングシューズを買いに翌日スポーツ用品店に行った。店内の照明の光が妙に眩しかった。とくに欲しいものもなかったので、そのとなりのイオンに行ったがそのわずかな道中で熱中症になった。逃げるようにトイレに駆け込み、用を足し、なぜかトイレ外にある自販機でポカリを買い、ベンチで飲んで体力の回復を待った。一向に回復しないしんどさに諦め、ベンチで横になった。その状態からどうやって少し離れた車まで行けばいいのか、その状態で運転できるのか、前日と同じ症状なら無理であろうなどと、思考を巡らせ絶望していた。空になったポカリのペットボトルを捨て、トイレに行き、またポカリを買って、車へ向かった。二階トイレから一階出口外のベンチまでたどり着いた。一旦ポカリと飲みつつ絶望しつつまた車を目指した。しかし車近くでまたトイレに行きたくなり、何故か近くにあったトイレに入った。そしてまたなぜかトイレ近くにある自販機とベンチでポカリと休息を取り、再度車へ向かった。車に乗り込み帰宅を目指したが車の運転が無理な状態であると判断しつつも、一旦試して見ようと、家とは反対方向ではあるが近くのコンビニを目指した。コンビニにつきわずかながら運転が可能であるかもしれないという希望を見出して、本格的に帰路についた。が、早々と無理になった。なったのだ。家までの距離を半分ほど行ったところのコンビニでようやく判断を下した僕は自力での帰宅をあきらめ、タクシーを呼び、車をそこに残したまま帰った。病状のギアが一つ上がった。ロードスター買ってる場合じゃねぇ。
市民病院に行った。整形外科で首MRIをとっても異常なし。神経外科で血液検査しても異常なし。自分で調べた結果、パニック障害だろうと思ったので別の心療内科を予約した。予約日まで日があったのもあって、かかりつけの病院でまったく効かない頭痛薬などをだしてもらっていたのだが、精神系の薬が必要であると感じていたタイミングで先生からリフレックスを提案された。そのときにはもうひどい不眠もあったので、不眠にも鬱にも効くリフレックスがとてもフィットした。とりあえず地獄の底から這い出して地上の空気を吸えた感じだったが、だからといって地上でまともに生活できる状態でもなかった。はずなのに。はずなのに僕は仕事を休職することなく続け、死にそうになりながら日々を過ごした。よく死ななかったななんでなんだ。そんなこんなで心療内科を訪れるもリフレックスがすでにフィットしてることもあり、それを継続。頓服でワイパックスを出してもらった。とりあえず心療内科とは抗精神病薬を管理してくれる場所にすぎないということを学んだ。フィットする薬を先生の勘と総当りで調べるそういう場所だ。余計なこと言う必要がない分それはそれでいい。しばらく月一で通い一年ほど立って双極性障害2型と診断された。なっとく。
5年くらいかけて試行錯誤した結果
一年間パソコンが触れなかった反動でむちゃくちゃプログラミングやった。Qittaにゴミみたいな記事上げたり、RustでSECDマシンのLispインタープリター書いて強い人から鉞じゃなかったプルリクもらえたりしてすごい勉強になったし嬉しかった。僕が一ヶ月かけて書いたコードを半日かからず手入れしてコメントしてて怖くなったりしてた。ネットでまともに人と喋り始めた時期だった。
首や頭が痛いがプログラミングがしたい。しかし首や頭がいたい。どうすべきか。ずっとストレッチなどはやっていたが特に改善せず。そんななかどうやらエルゴノミクスキーボードとやらがあるらしいということで、ErgodoxEZを買ったしかし首などは改善せず。しかし首痛いうんぬより、キーボード自体がかっこいいじゃないか。Ergodoxかっこいい!キースイッチたのしい!みたいなノリをTwitterでつぶやいてたり、同じようなノリの人をフォローしたりして、そこのつながりができ始めた。すごく楽しかったし、とても人間的な健全性をもった社交的な精神状態だったが、エビリファイが支配していただけなのではないか説もある。そしてそれらのつながりをすべてうしなってしまったかなしみがあるので割愛する。そんなこんなで、電子工作、3DCAD、基板設計、低レイヤープログラミングなどの知識を得たのだった。うわぁぁぁん。
電子工作の流れでオーディオ系をつくりたかった。シンセサイザーを作ろうとおもい、ためしに一個なにかシンセ買ってみようと調べていたところ、Ableton Pushに行き着いた。これ一台でリズムもメロディもいける64Padインターフェイスが魅力的だった。自作キーボードで金銭感覚バグりだしていたので、AbletonLive、Push、BabyFacePro、iLoudMicroMonitorなどを買い揃えかつ、MacOSじゃ不便になってきたのでWindowsにしたいのもあってPCも買い替えなどしてたら出費すごいことになってて草だった。Pushでフィンガードラムやコード理論の勉強をしたりした。
政治や経済に興味を持ち始めた。富国と強兵という本がとてもおもしろ買った。中野剛志先生はTPPですっかりあれな人扱いされているがMMTは面白いと思った。しかし政治運動としてのMMTはなんとも言い難い感じがあるので遠い目になる。
きたるキングダムハーツ3に備えてPS4Proを買ってひたすらゲームやっていた。GTAオンラインをやりながら今際なき虎ノ門ニュースとチャンネルクララを聞いていた。
東京グールが完結して悲しかったの感があった。
タレックスのオーバーグラスを購入した。通勤時の眠さがかなりマシになりQOLが向上した。いまやこれなしでは運転できない体になってしまっている。
あまり覚えてないので、買い物やメールの履歴などを見て書き出す。
政治や経済金融の本を買って読むようになった。毎日の読書を習慣づけていた時期だ。2年ほどで終わったが。
Pushじゃたりなくて鍵盤も買ってピアノの練習とかしていたらしい。
あこがれのエンボディチェアを中古で5.5マンという謎の値段で買って試したりしていた。けつが痛かったり、ヘッドレストがないこともあって動画見るのが辛かったりで一ヶ月でバロンに戻した。
バートルにハマりだした。最強ジャケット5501を買って3年ほどは着たと思う。裏アルミベストも買ってる。これ最高。
奥山真司先生にハマっていたらしい。アメ通を流しながらやはりゲームしていた記憶。ルトワックのクーデター入門買って読んだけど一体なんだったんだろうな。実際にクーデターした軍人が血まみれのクーデター入門を持っていたという話だけ覚えてる。
ゲームオブスローンズが完結したらしい。クソほどよかった。奥山先生がアメ痛で最終話ネタバレしてたのがクソオブクソだった思い出。
義務教育レベルの教養本をたくさん買っていたらしいがほぼ読んでないな。まんがたくさん買ってる。English Grammer In Useを読んだのもこの時期らしい。これのお陰で英語力が小学生レベルから高校生レベルになったので感謝してるし、もっと勉強するべきだし。めっちゃまんが買ってるわ。
このころからアシックスの靴の魅力に取り憑かれ始めた。甲高幅広の足にアシックスは優しい。アシックスのスノトレ買ってる。これ未だに履いてるしマジで最強。
鼻うがい買ってる。鼻うがいやると一生副鼻腔に水残って寝てる間に顔ビショビショになる罠があるのでやらなくなってしまった。
あまり記憶にない。ブログを始めた時期だ。最初のほうは毎日のように書いてるが当然のように次第に飽きてくる。今と比べると簡潔な文ではあるが、今と同じように説明足らずでもある。自分しかみないからコンテキストを明示する必要がないのでそういう文になってくるわけだが4年経ってもおんなじなんだな。
証券会社に口座を開設し積立NISAと株をやりだした。すぐコロナショックが訪れてビビり散らかして何も買えなかったんだけど、株は見てたから、あのとき買っていればの感がすごいことになってる。
このころからワイヤレスイヤホンを導入し通勤時にイヤホンするようになった。同乗者のノイズをシャットアウトすることができて快適な通勤ライフを送れている。ありがとうAirPodsPro。ありがとうTalex。
平和という病という本を読んだ江崎道朗さん激推の本だったので読んでみた。もう内容は覚えてないがブログに書いてあった。安全保障に興味を持てたのは江崎さんのおかげだ。
MIDI鍵盤から88鍵盤ピアノに買い替えた。本格的にピアノ練習がしたかったのだろうな。今となっては。。。
WATCHMEN見てる。クソ面白かったな。
パタヘネ本読んでる低レイヤーの基礎が書いてあったような気がする。
32インチ4kモニターに買い替えたのもこの頃らしい。お世話になってます。
山本隊長の動画や本を見ていた。このころから隊長の文体に影響されはじめてこんなんになってる。
軽トラドライブを始めたらしい。病気の影響もあり車を結局買えなかったので仕事用の軽トラを借りてトコトコ走っていたらしい。二度と行くべきではない山道などを走った記憶。しかし軽トラじゃなければいけなかったところへもドライブできて良かった。
オーディオインターフェースをBabyFaceProからUR22Cに買い替えてた。PS4Proの光オーディオ端子的なやつを使いたかったのもあってBabyFaceProが重宝されていたのだけど、PS4を売ってゲームやめて読書をしようというモードだったので買い替えたのだと思う。BabyFaceProが若干不安定で再起動する場面が増えてきたのも要因かな。
物語シリーズ全部見てた。化物語以来なので10年ぶりくらいで10年分の続編を接種した。
バンプのAcaiaのMVに泣いた。
バグバイオーグトリニティ読んだ。名作。
お金意識高めるために家計簿つけ始めてる。いまだに続いていてちゃんと便利。
js/tsでゲームボーイエミュレータ初めて書いたのもこのころらしい。
短歌を始めた。昨年末から彦根に仕事で通っていて、その行き帰りにヨルシカの全部入りのプレイリストをひたすら聴いていた。曲の歌詞がとても自分の教養の範疇にはないフレーズが多く、これは一体なんなんだという風になり詩の勉強をしたいと思い、それで短歌でも読むかとなった。普通の詩集は過去読んだかぎりでは小難しく特に面白みを感じなかったということもあり、文語体のエッセンスを短く接種できる短歌にした。と言うかヨルシカの詩が短歌ぽかった。最初は日常的にブログに書いていたが、ここのブログはgit pushしないと更新できない仕組みなのでスマホから投稿できなかったのもあり、noteに短歌を上げておくことにした。やはりSNS的で他人のを読む、他人に読んでもらうを意識するようになり対人リソースをだいぶ消費していたが、それはそれで楽しく、とてもよい日々となった。毎日一首を一年ほど続けた。詩も自分言語的ではあるが書けるようになったので曲も作ってみることにした。note上でピアニストの方によくいいねやコメントをもらっていたのもモチベになったかもしれない。youtube、note
nissoという自作キーボードもやっていた。作るだけ作って使わないパターンだった。結局Preonicがfit for meで最強すぎる。
4月頃にNext.jsでブログをつくりVercelにホストし始めた。
ギター買ってた。一時間練習したら一週間腱鞘炎になるので無理だった。こどもの頃にもギター買ってたけど左手にわずかに後遺症が残るレベルの怪我をしてて弦をまともに抑えられる指の形をしていなかったのもあり挫折していた。凛として時雨のunravelのn-buna remixのMVにn-bunaのES335系のギターが使われており、そういえばFホールのギターに子どものころすごく憧れていたのを思い出した。左手で弦を抑えられないなら右手で弦を押さえればいいのではと思いつき調べたら左利き用のギターがあることを知った。それで左利き用のいわゆるレフティのギターを買った。がしかし上記。
やっと車を買った。Mazda3である。シルバーを買ったことを当初は後悔していて買い替えようかと思った。金銭的にその勇気がなかったが。今ではまぁ満足してるたぶん。
短歌はまだ続いていたようだが春ごろに力尽きている。zigとhaskellでゲームボーイエミュレータを作っていたようだ。未だに未完であるみかん。ブログ見返すと、もうこのころから、人生ってなんなんだろうな、時間ってなんでこんなに早く過ぎていくんだろうな的なことばかり言ってる。もっと昔から言っていた気もする。ちゃんと買ったモノとか読んだ本とかメモしてるのえらいし中身ない。
そしてスプラトゥーン3が9月に発売された。発売から一年半以上立つ現在までほぼ毎日プレイしており1700時間を超えた。それはそれとして、最初はリッター4kをしばらく使っていた。フィジカルエイムがプレイすればするほどちゃんと上達するのは非常に楽しく、メモリープレイヤーはリッターポルノと化していた。いい連続キルができたらなんども見返し愉悦に浸るのであった。しかしフェスないしナワバリでは敵は無理に体を出す必要がないので受動的なキルチャンスが少なく、全然試合に貢献できないのであまりにも楽しくなくリッターに絶望していた。
PC買い替えた。DELLの13マソくらいのやつから自作の30マソくらいのやつに。憧れのRyzen7950Xが発売されてから半年だか一年だかで10万ぎりしてたのでそのタイミングで買った。16コア32スレッドがフル稼働する日は未だ来てないような気もするがそんなこともないのかもしれない。適当にパッケージビルドしたらあるだけコア使うんじゃないかなしらんけど。GPUが高すぎたので中古でRTX3070を4.7マソで買ったけど多いと一日一回くらい数秒画面がフリーズするのが外れだったが今じゃもうたまにしかしないので特にもう文句ない。
VTuberをよく見るようになった。特級呪霊でおなじみの人が爆死してたをきっかけになんでこんなに話題性あるんだと調べたところからハマっていった。VTuberにかぎらずストリーマーの切り抜きを多く見るようになった。
俺に俺の短歌が刺さりまくって自己満足です。これは28歳の短歌と言うより2022年1月からの三ヶ月の短歌だった。
流石に去年のことくらい覚えているだろうと思ったけどやはり覚えていない。20代最後でだからどうとかなかったけど社会的には意味を持つことが多いのでのでなんとなく切なかった。とにかくスプラ3を一生プレイしていた。リッターに絶望していた時、チャージャーの神ぴょんはフェスでどうしてるのかと思ったら竹を持っていたので竹にハマった。エイム力も上がったし、前目の立ち回りも練習できた。とかいいやりつつもXPは2000前後からなかなか上がらないし、Xマッチは武器ミラーがある分毎回同じような対面があるので飽きやすく、バンカラマッチで他武器を遊んでいた。弓、バレル、スプスコ。ガチマよりもサーモンランをやる割合が増えてきて、チャージャー用の-2の低感度ではサーモンランは難しかったので感度を上げ+4くらいでやりだした。ビッグランやバイトコンテストなどでモチベが爆上がりしてプレイ時間も更に増え、クマフェスならカンストできるくらいまではできるようになった。普通にたのしい。ゼルダの伝説ティアーズオブキングダムとかいう約束の神ゲーをやった。約束の神ゲーだったがスプラとちがって一ヶ月たたずして飽きてしまって悲しかった。なぜなんだろうか。
5月頃、琵琶湖の際際で一ヶ月ほど仕事した。最高の景色だった。一方で磯臭さや風が毎日のように強かったりなかなかつらいとこもあるんやなの感であった。いつか住んでみたい気もする。
盆休み明け、ギックリ腰になった。たぶんスプラで長時間同じ姿勢で座っていることが増えたのが積もり積もったような気がする。まじでこの世の終わりみたいな歩行可能状態になる。もはやPTSDないしトラウマとして僕の平穏に大きな消えない不安がまとわりついた。ただでさえ体力的に将来性のない仕事なのに、その肉体を削ぎに来るまさしく鬼の所業である。くそが。しかし案外一週間で仕事ができるまではなんとかなるし、三日目くらいにはクマフェスでカンストまでやっていたのでなんやかんやである。接骨院に数回通ってかなりよくなったので接骨院すごい。そこで低周波治療器でびりびりされてたので、市販品の低周波治療器で寝る前に毎日びりびりする習慣がついた。今も欠かさず毎日びりびりしてる。しかしどうあがいても中断できない仕事はあるものでそのような場面でギックリ腰になったらどうしようかと思うと、まぁ仕事辞めたくなるというか責任を持つ自信が器質的にない。そのような不安をひどく感じる。
ブログはもう月一でしか書いていない。おそらくTwitterのアカウントを変えたからだろう。誰にもフォローされてない独り言専用ストレージと成り果てているので、それでガス抜きされている可能性が高い。月一回、なんもしてねぇって書いてる。
無限にユーチューブ見てた。サブモニターかってサモランしながら見てたくらいには見てた。
株の短期トレードをやりだした。積立放置でやってきたが勉強したくてやりだした。結果勉強したところで儲かるもんではないし、ほぼ運ではある。2023年は50マソほど短期で儲けたらしいので運が良かった時期ではあったらしい。しかし2024年はまだ三ヶ月なのに20マソ以上は損している。年初からの株高に空売りをかけたのはまだ調整を見計らって抜けたので難を逃れたが、カバー株で一気に持ってかれた。きれいなボックストレンドを形成していたのでそこに乗っかっていたら、決算発表で予想の70%しか売上がなかったことが大きな要因となってドカンと落ちたのが痛かった。一時数マソプラスだったのでそこで利確しておけばよかったのだが、チャート的には利確する理由がなかったためホールドしてたらこれである。お財布がかなしみでいっぱいになった。
またゲームボーイエミュレータをrustとhaskellで書いてた。前回のhaskellはStateM/Lensだったせいか非常に低速でテストすら遅すぎてやる気にならなかったけど、今回はIOVector.Unboxedでごりごりで書いたらまともな速度がでたので満足。しかしIOMonadべったりなコードは書き味がC以上に無駄の多いCみたいでhaskellの気持ちよさとは程遠いコードになったのであった。前回のrustはマクロを多用しすぎてコンパイルが非常に遅くなりトライアンドエラーがあまりにも不快だったために投げ出した。今回は素直に手書きしたので問題なくかけた。昔書いたzigと比べたらzigのほうが早かったのでrustの方は最適化の余地がまだありそうな気もするがzigがすごいだけの気もするがよくわからん。相変わらずAPUは未実装である。
短歌少しだけ再開した。一ヶ月に一首程度から再開され、一ヶ月に数首程度まで増えた。増えた確かに増えた。
20代を生き延びた。この文章は僕にしか意味を持たない文章であるが、その意味も有意義なものではないであろう。それでもいつか、いつか何かしらの何かになるかもしれない。もちろんなににもならなくたって問題ない。どうでもいいんだぜんぶ。変化することができないという絶望感が僕のこれまでの人生とこの先の人生を覆い隠している。そして老いによる変化が怖い。死んでいく。消えていく。それでも10代よりかはマシだった気もする。さらにもう少しマシになっていく30代でいてください。どうかよろしくお願い致します。
この痛みはいつか誰かに誰よりも優しくなるための痛みだ
20代あと余命一ヶ月です。
ギックリ腰再び来る。ふざけるな。もう二度となるものかとトラウマを植え付けられたでおなじみのぎっくり腰になった。初体験から半年である。くそが。発症時は激しい痛みのあまり、視界がホワイトアウトし、酷いも耳鳴りもおまけに付いてきた。一人で仕事してたらこれはもうほんとに収拾不能な事象で、仕事との相性が最悪である。転職したほうがいいと思います。このブログを遡れば何年も前から他の要因で転職を考えていたが、さらに理由が増えてもうどうしようもない。結局転職はできていないしこれからもそうだろう。しかし仕事を続けられる健康もない。終わりです。
株高に何一つ乗れず儲け損なっている。謎の半導体メーカーの株を買っておくだけのことだったのに。十分に買うに値する技術的理由を知っているのに。資金もあるのに。あれはいったいなんだったんだろうか。
PRSのレフティ買おうかどうか迷ってた。今はもういらない。やっぱ欲しい。欲しい。
スプラ、ロンブラ持ち始めた。今までと全く違うプレイスタイルでキル数が20とか出るので楽しい。
いつか目指した場所に咲くアムネジアなんどもおやすみ黎明の雨
如月の岸辺で待てばまばゆさは雪の陰影冬の有限
この空は誰の願いを叶えるの?誰も誰かは知らなくていい
今もこの瞬間だけを指し示す時計刹那に照らす雷雪
千年の命が尽きる雨上がり風が吹く方へ広がる陰
夕暮れにすべてが無駄になっていく今日も空が青かったことも
探したら見つかる場所を思い出と言うんだ いつもここで待ってるよ
一昨年の夏にどうやってもテスト通らなくて放置してたゲームボーイエミュレータを根本的に書き換えてみたらだいぶましになった。最初はlens/Stateを使う方針でCPUのレジスタなんかをレコードのフィールドにぶち込んでそれらを書き換えていく感じだったが、ざっと書いたところでひどく遅くてかなしくなったので放置していた。今回はレジスタなどの本質的にミュータブルなデータを全部Vector.Unboxed.Mutableにぶちこんだら早くなったという話。そりゃそうなんよ。
lens/StateMでできるだけイミュータブルなレコード更新をしようとした型設計。
type CPU a = StateT CPUState (StateT MBCState (StateT LoggerState IO)) a data CPUState = CPUState { _a, __f, _b, _c, _d, _e, _h, _l :: Word8, _sp, _pc :: Word16, ... } deriving Show makeLenses ''CPUState
フラグ更新などはFレジスタに詰め込まれているのでlens関数を用いてアクセサーを書ける
carry :: Lens' CPUState Bool carry = lens get set where get c = testBit (__f c) 4 set c b = if b then c { __f = setBit (__f c) 4 } else c { __f = clearBit (__f c) 4 }
命令の実装などはStateをつかうことで、たとえばrustの実装と比べるとselfをまるっと省略ができている。それでありながら動的言語の様な記法でもある。一方で変数名にcarryやhalfもしくは省略してcとhを使いたかったが、フラグとレジスタのアクセサーと名前がかぶるので使えないあたりが不便なところ。名前空間。
add :: OP -> CPU () add op = do (a', c', h') <- add8CarryHalf <$> use a <*> readOP8 op a .= a' zero .= (a' == 0) negative .= False half .= h' carry .= c'
fn add(&mut self, op: OP) { let (a, carry, half) = self.a.add_carry_half(self.load8(op)); self.a = a; self.set_carry(carry); self.set_half(half); self.set_negative(false); self.set_zero(self.a == 0); }
上記のhaskellの実装ではモナドスタックをつかっており、なかなかモナモナとネストしてるあたり、こんなんでいいのか感もいなめない。モナドトランスフォーマーの宿命である。バベルの塔のごとく積み上がるモナドスタックをどうにかしようという試みとしてEffectなるものがある。最近ではOCamlに公式に採用されたらしい。よくはしらんけど。そんなんでhaskellのeffect実装を調べた感じではいくつかあるものの比較的浅いスタックだとmtlより遅いらしいということで採用は見送った。
そしてそのモナドスタックを潰しながら実行してく。
type Gameboy a = StateT GameboyState IO a data GameboyState = GameboyState { _cpu :: CPUState, _mbc :: MBCState, _logger :: LoggerState, _car :: Cartrige } makeLenses ''GameboyState stepGameboy :: GameboyState -> IO GameboyState stepGameboy gb = do let run = flip runStateT (((_,cpu'),mbc'),logger') <- run (gb^.logger) $ run (gb^.mbc) $ run (gb^.cpu) executeCPU pure $ gb & (cpu .~ cpu') . (mbc .~ mbc') . (logger .~ logger')
(((_,cpu'),mbc'),logger') <- run (gb^.logger) $ run (gb^.mbc) $ run (gb^.cpu) executeCPU
という風にモナドスタックみを感じる。もうちょいましになりそうだけど。上記の様な実装ではゲームプレイはできない処理速度となった。一応StateとIORefとIOVectorを比べてStateが一番マシだったのでそれを採用したので、haskellでは無理なのかとかなしくなった。
その実装をたまに思い出しては少し手を入れたりしていた。モナドスタックを潰してステートをフラットにしたりした。CPUの命令がGBモナドになるので微妙な開放感がある。3倍くらい早くなったがそれでもまだ遅かった。
type GB a = StateT GBState IO a data GBState = GBState { _cpu :: CPUState, _mbc :: MBCState, _logger :: LoggerState } -- CPU.hs add :: OP -> GB () add op = do (a', c', h') <- add8CarryHalf <$> (use $ cpu.a) <*> readOP8 w cpu %= (a .~ a') . (zero .~ (a' == 0)) . (negative .~ False) . (half .~ h') . (carry .~ c')
そんなところで放置してたが今年の冬にrustで書いてみたら、あまりの実装のラクさと速さに余計にhaskellとはなんだったのかとかなしみをいっそう深めたのでもう一度haskell実装を考えてみることにした。最適化をすればC++並みの速度がでるとの記載をはるか昔に見たのを思い出しながら。
IOVectorのベンチは取ったがUnboxedを失念していたのでUnboxedも見てみたところ、なんかよくわからんほどの差がでたので、なぜ忘れていたのかとさらにかなしくなった。haskellのデータはサンクと呼ばれる形で保持されている。一見ただのInt8であってもdata Int8 = I8# Int8#
というようにdata型になっている。これはヒープのポインターであり遅延評価のときなどに役立つクロージャのようなもの。しかし遅延評価の必要もないプリミティブなデータであればその様なラベルを省略して生のデータとして扱えるよねというのがUnboxedだ。ということで「もう状態全部Vector.Unboxed.Mutableにぶち込もう」となり、以下のようなデータ構造と命令の実装になった。
newtype Store a = Store (MVector (PrimState IO) a) data CPU = CPU { mbc :: MBC, regs8 :: Store Word8, regs16 :: Store Word16, ... } data CPURegisters8 = A | F | B | C | D | E | H | L | IME | Halt | Cycle deriving (Enum, Show, Eq) readReg8 :: CPU -> CPURegisters8 -> IO Word8 readReg8 (CPU {..}) r = readStore regs8 $ fromEnum r writeReg8 :: CPU -> CPURegisters8 -> Word8 -> IO () writeReg8 (CPU {..}) r n = writeStore regs8 (fromEnum r) n readFlag :: CPU -> CPUFlags -> IO Bool readFlag cpu flag = do f <- readReg8 cpu F pure $ testBit f $ 4 + fromEnum flag writeFlag :: CPU -> CPUFlags -> Bool -> IO () writeFlag cpu flag bool = do f <- readReg8 cpu F let f' = (if bool then setBit else clearBit) f (4 + fromEnum flag) writeReg8 cpu F $ f' .&. 0b11110000 add :: CPU -> Op8 -> IO () add cpu op = do (a, carry, half) <- addCarryHalf <$> readReg8 cpu A <*> readOp8 cpu op writeReg8 cpu A a writeFlag cpu Carry carry writeFlag cpu Half half writeFlag cpu Negative False writeFlag cpu Zero $ a == 0
StoreはただのVector.Unboxed.Mutableのラッパーである。CPURegistersをEnumのinstanceとすることでそのままVectorのインデックスとして扱える。速さを優先してlensもStateも使わなかったのですべての関数で明示的にそれらの状態を引き回す記述が増えている。こうなってくるとただのCよりめんどくさくて遅いCである気もしてくる。
ただだいぶ早くなった。テスト用のROMを26000000CPUStepくらい回すとテストが終わる。rust版と一秒差くらいなら悪くないんじゃないかな。両方とも最適化の余地が全然あるとは思う。haskellではPPUなどを書いてないのでゲームプレイはできない。終わり。
> time { stack run -- .\rom\gb-test-roms\cpu_instrs\cpu_instrs.gb | Out-Default } cpu_instrs 01:ok 02:ok 03:ok 04:ok 05:ok 06:ok 07:ok 08:ok 09:ok 10:ok 11:ok Passed all tests TotalSeconds : 5.6943804 > time { cargo run --release .\rom\gb-test-roms\cpu_instrs\cpu_instrs.gb | Out-Default } cpu_instrs 01:ok 02:ok 03:ok 04:ok 05:ok 06:ok 07:ok 08:ok 09:ok 10:ok 11:ok Passed all tests TotalSeconds : 4.6624661
追記。rust版だけloggerがオンになってたのでオフにして計測し直した。約2.5秒早くなった。
> time { cargo run --release .\rom\gb-test-roms\cpu_instrs\cpu_instrs.gb | Out-Default } cpu_instrs 01:ok 02:ok 03:ok 04:ok 05:ok 06:ok 07:ok 08:ok 09:ok 10:ok 11:ok Passed all tests TotalSeconds : 2.16294
ゲームボーイにはMBCというコンポーネントがある。メモリとROM(ゲームソフト)にアクセスするためのもので16bitしかないメモリアドレス空間を拡張的に使うものだ。MBCにはいくつもの種類があり、微妙に実装が違う。どのMBCを使うかはを実行時に決まるので、ここで他言語におけるインターフェイスやトレイトオブジェクト的なものがほしいのだが、haskellには静的な型クラスしかない(ゆうてここあんま調べてなかったな。ふつうにData.Dynamicでいけるんかな)。そんなこんなでhaskellでもlens/Stateでステートフルなトレイトオブジェクトもどきを使った。
type MBC a = StateT MBCState (StateT LoggerState IO) a data MBCState = MBCState { _mbcnState :: MBCNState, _memory :: Memory, _reader :: Int -> MBC Word8, _writer :: Int -> Word8 -> MBC () } data MBCNState = MBC0State | MBC1State { _bank :: Int, _bank1 :: Int, _bank2 :: Int, _bankRAMX :: Int, _enableRAMX :: Bool, _bankingMode :: Bool } deriving Show makeLenses ''MBCState makeLenses ''MBCNState newMBCState :: Cartrige -> IO MBCState newMBCState car = do _memory <- newMemory car pure $ MBCState { .. } where (_mbcnState, _reader, _writer) = case car^.mbcType of MBC0 -> (MBC0State, readMBC0, writeMBC0) MBC1 -> (MBC1State 0x4000 1 0 0 False False, readMBC1, writeMBC1) _ -> undefined
newするタイミングでROMに使われているMBCのタイプを読み取り実装と状態を選択するVTable的なやつ。
readMBC1 :: Int -> MBC Word8 readMBC1 i | 0 <= i && i <= 0x3fff = (V.! i) <$> (use $ memory.cartrige.rom) | 0x4000 <= i && i <= 0x7fff = do (Just b) <- preuse $ mbcnState.bank rom' <- use $ memory.cartrige.rom pure (rom' V.! (b .|. (i - 0x4000))) | 0x8000 <= i && i <= 0x9fff = do ram' <- use $ memory.ram lift $ VM.read ram' i | 0xa000 <= i && i <= 0xbfff = do ramx' <- use $ memory.ramx (Just b) <- preuse $ mbcnState.bankRAMX if b == 0 then do ram' <- use $ memory.ram lift $ VM.read ram' i else lift $ VM.read ramx' (b .|. (i - 0xa000)) | otherwise = do ram' <- use $ memory.ram lift $ VM.read ram' i
preuseしてちゃんと自分のステートを引っ張ってこれる。しかしpreuseはおそらく毎回直和型を走査してデータを引っ張ってきているのでコストがかかる。newしたタイミングでそれは決定していて無駄な走査なので気になる点ではある。
Vector.Unboxed.Mutableで書き直した版ではStore Word64にまとめて放り込んでいて、すべてのMBCTypeの関数で同じ型のMBCStateを引き回してる。readするたびMBCTypeを判別しているので良くない気がする。
readMBC :: MBC -> Word16 -> IO Word8 readMBC mbc@(MBC {..}) i = case mbcType cartridge of MBC1 -> readMBC1 mbc i _ -> error "readMBC unimplement MBCType"
一昨年の夏、僕がhaskellに絶望していたころzigが流行っていたのでzigでも書いたのを思い出した。早すぎて意味がわからん。こんだけちがうとrust版もなんかおかしいな。
> time { zig build run -Drelease-fast -- .\rom\gb-test-roms\cpu_instrs\cpu_instrs.gb } Serial: cpu_instrs 01:ok 02:ok 03:ok 04:ok 05:ok 06:ok 07:ok 08:ok 09:ok 10:ok 11:ok Passed all tests TotalSeconds : 0.937751
先々月くらいから信用取引をするようになって空売りに手を出してる。今月の株高に空売りのポジションとって全敗。6ヶ月か一年以内に買い戻さないといけないので下がるまで気軽に待つかというのがやりにくいというのもあるが、 元々短期で見るつもりのポジションだったので、読みが外れたら早々に損切りしてる。まだ含み損のポジションが残っててこれも怪しい感じなのでかなしい。今月のお小遣いないなった。。。
さて、ジェシー・リバモア 世紀の相場師という本を読んでる。なかなかおもしろい本で今月の僕の失敗を咎めるようなことが多く書かれていて学びがある。
6割くらいしかまだ読んでないがすでに刺さるところがある。ここ一週間仕事がなくて冬休みシーズン2が始まっていたので相場をみてることが多かったのだが、自分なりに思うところができてきた。
などといった、しょうもない群集心理を思ったりした。日経平均最高値更新からの一服感は引っ張っていた外国筋が利確して米株に流れているからなのではないかと推測。米株が高値更新してるから日本株もいつもなら追従するはずだが、短期的にそれがないのは日本株から米株へ流れているんだろうなというがしてるので、NYダウが上がってる間はN255は下がるんじゃねと思いつつも、N255の空売りを損切りしてるので、眼の前のマイナス値の不快感から開放されたい欲のほうが強いんだよな。など。