空飛ぶ木造船

空想の産物

2025年2月4日

インターンシップの仕事は順調な滑り出しだ。一度経験したことのある内容なので、環境構築もオンボーディングもサクサク進み、インターンシップ開始二日目にしてもう初めてタスクに取り掛かりほとんど完了させることができた。前回ここまでくるのに1週間かかったことを考えると、とても早いことがわかる。

前回の経験があるおかげで、今仕事で自分がどのように振る舞えばいいかがわかっていることが一番大きな違いであるように思う。問題が起きた時にどこを見ればいいか、どれくらい詰まったら聞くのがいいのか、職場の人とどれくらい気安くコミュニケーションをとっていいのか、そもそもここではどのように仕事を進めているのか、知っていると知らないとでは大きな違いだ。それらの目に見えない些細な規範を逸脱したとしても自分が社員ではなくただのインターン生であることもあって、強く叱責されることはないと思うのだが、その場において正しく振る舞えているかをすごく気にする僕にとっては正しい振る舞いを割っているかどうかで心理的安全性が全く違ってくる。僕はその場にいて気まずいかどうかを常に気にしている。小心者すぎるな。

2025年2月3日

インターン先の会社が用意してくれた部屋の硬いベッドで目を覚ます。小学生のころは床でも椅子の上でもどこででもすぐに眠れることが自慢だったが、いつからか寝床が変わると寝つきが極端に悪くなるようになってしまった。昨晩もうまく寝付けず夜遅くまでゴロゴロと寝返りをうっていたが、微睡んでいるうちにどうにか寝付けたようだった。

昨晩のうちに買ってあったコンビニ食材をレンジで温めて一人で食べる。皿を出すのが面倒なのでパック野菜をパーティ開けして食べるのだが、その字面に反して食卓の風景は実に寂しい。誰とも話すことなく壁の方を向いて一人でもさもさと食べ進める。大学生になって親と暮らしいていた実家を離れたが、寮から大学に通っているのでついぞ一人暮らしをした経験がない。しかしこれから卒業して東京で就職すれば、この先少なくとも数年、悪くすれば一生、自分のためだけに作ったご飯を自分で食べて生活していくのだと思うと、あまり気分が上がらない。

寮生活でも当然誰とも喋らずに食事を摂ることはあるのだが、どう頑張っても受動的には個室スペースで食事ができない関係上*1、人と空間を共有することなくご飯を食べることは滅多にない。僕のいる寮ではいつでも誰かがそこにいて、同じ空間を共有できる。特に目的がなくとも簡単に人と時空間を共有できるので、何もしなければ一人でいるしかない生活への移行がもう間近であることに狼狽えている。

バスで会社に向かう。停留所で、前の人を追い抜かしてしまったような気がする。僕の前にいた人が、次のバスを待っていたのか、それとも単に扉が開くのを少しゆっくり待っていただけなのか分からぬ内に、僕はさっさとバスに乗ってしまった。人の目がたくさんあるところで失敗してしまったような気がして恥ずかしくなった。

田舎には田舎の生活があるように、都市にもそれにふさわしい振る舞いがある。それには着る服とか話す言葉のような大きなものだけでなく、たとえば満員電車で入り口近くに立っている時に自分が降りない駅でどうすべきか(おそらく一度ホームへ降りて、人が通れる空間を作るのが正解だ)とか、車と歩行者の間の取り方(都会に行けば行くほど車と人の距離は近い気がする)といったような些細な事柄も含まれる。これは単に、その土地ごとに生じる必要によって生活上の習慣が異なるというだけの話なのだが、私が自意識過剰であるあまり、そういった都市的振る舞いができないことがひどく気まずく感じられる。名前も知らない、もう二度とすれ違うこともないであろう冷たい他人の前でひどく滑稽な姿を演じているようで、どうにも居心地が悪い。正しい振る舞いを身につけて、僕も東京の一部になれれば、ここも少しは住み良い場所になってくれるんだろうか。

インターンの初日は前回もそうであったように、簡単な会社の説明とパソコン関係の設定に時間を費やして終わった。何も生産的なことを為してないようで気持ちが焦るが、前回も同様だったということを思い出して心を落ち着かせる。そんなことをしていたら仕事が終わった。

*1:寮に個室と呼べる場所はトイレの個室しかない

2025年2月2日

9時に起きていそいそと朝ごはんの用意をし始める。明日から始まるインターンシップのために15時には京都を発たねばならないが、その準備がまだ終わっていない。ご飯を食べ終えてから荷物を2時間ほどかけて忘れ物がないよう丁寧に詰め、再度確認。それから食べきれずに余った食材を後輩に託して、寮のネットについていくつか引き継ぎ事項も申し送る。食材を受け取ってくれた彼に、寮(の僕らが住んでいる区画)のインターネットを託す必要があるからだ。そうしていたらいつの間にか寮を出るべき時間になって、慌ただしく出発した。

新幹線に揺られること2時間ほどで品川に着く。途中富士山が車窓に大きく姿を現した。信じられないくらい大きな姿なのに、前来た時はなぜ気づかなかったのだろうか。座る席が反対側だったのか、天気が悪かったのか。今回ははっきり見ることができてよかった。

品川駅のホームはガラガラだった。それもそのはず、この先には終点の東京駅しかないからで、品川から新幹線で東京へ向かう合理的な理由なんか一つもない。もし品川駅から東京駅まで新幹線で向かったことがある人がいたら、一体それはどういう訳があったのだろうか。そんな人がいたとしたら、きっと何か人生の中で特別なことがあって、今までにないような心持ちで新幹線に乗ることになるんじゃなかろうか。

東京駅に旅立ちの時を待つ恋人がいて、その人と最後の別れをするにはどうしてもこの新幹線に乗るしかない。けどこれに乗ってしまえばもう今月の生活費が、けど躊躇っている時間はもうない......*1みたいな、人が生きる上でどうしても割り切れない非合理性のようなものがそこに現れ、一つの物語を形作るだろう。

これから降り立つべき無人のホームを見ていたら、そこにいない人の架空の人生について考え始めてしまっていた。山手線で乗り換えて渋谷へ。子供の頃は、自分が人生の中で山手線に実際に乗ることになるとは思いもしなかった。僕はいまだに東京という都市の実在を疑っている。人々の集合的無意識の中にある夢のような存在だと。いろんなフィクションに出てくるからみんな実在すると思っているだけで、本当は嘘なんじゃないか?来るたびに冗談みたいに人が多いので本当にうんざりする。特に渋谷は6ヶ月前に東京に来ていた時に乗り換えで利用していたので、かなり嫌いになった。いまだに東京の人の多さと景観の騒々しさには慣れない*2

渋谷駅で降りる直前にTwitterを見ていたら、東京で働いている友人がたまたま渋谷にいるらしいとわかったので、急遽連絡を取って一緒に居酒屋でご飯を食べる。Twitterでこうして友人と思いもしないタイミングで会えるなら、自分も定期的に自分の居場所を呟いておくべきかもと思った。どうやら友人は、謎の若者の飲み会に巻き込まれたようで(友人が途中退席したため、結局その会の目的も不明だ)、飲み会ゲーム(山手線ゲームみたいなやつ。東京の人って山手線大好きだよな)とコールだけで盛り上がる若者ノリに耐えきれず抜け出して人で飲み直すところだったという。明日からも仕事があるのにそんな意味不明の会に参加できるバイタリティに尊敬の念を禁じ得ない。

明日からインターンシップが始まるので日記は短めにまとめようと思ったが、手が滑っていつもの倍近く書いてしまった。東京の愚痴を言って一人で勝手に盛り上がる悪い左京区仕草を早くやめたい。

*1:彼(恋人を追いかける側)はある理由があって故郷の田舎に見切りをつけて東京にやってきたのだった。自分が自分の形を保って生きられる場所はここしかないと生活を始めたものの、うまく立ち行かずある寒い雨の夜に裏ぶれた路地の隙間に倒れ込む。せめて雨ではなく雪なら、と思いながら雨が染み込んで重く冷たくなった靴の中で足の指を畳んでじっと寒さを堪えていると、そこに手を差し伸べてくれる人が現れる。その人は彼と驚くほど似たような境遇で、いつの間にか二人は友情とも愛情とも知れぬ暖かい関係を築いていくが......

*2:しかし以前東京にいた際に何度かこの駅を利用したおかげで、物覚えの悪い僕でも、この都会の騒がしい景色の中に見覚えのあるものが混ざるようになった。このまま長い時間をここで過ごしていれば、いつかこの景色に慣れてしまうのだろうか。そうなったらどうか僕を左京区に連れて帰って、東京という共同幻想から目が覚めるまで鴨川のほとりで一緒に駄弁ってほしい。

2025年1月16日

日記

出来事

前日から昼寝の時間を調整して(といっても計3時間程度寝ているが)床に就いたがうまく眠れず5時寝10時起きとなってしまった。朝飯をパスしてこたつで計算と論理の課題の続き。入寮7年目、寮のこたつの中で長い時間を過ごしてきたからか、こたつでパソコンをいじっている時間が一番リラックスできる。しかし問題は全然解けない。こたつの中でうんうん唸っていたらいつの間にか昼になった。

昼飯を食べて少し微睡んでから散髪へ。いつも2ヶ月ごとに髪を切っていたが長くなりすぎるのと今回はテスト期間に被るのとで、前回から1.5ヶ月で再訪。もう通い始めて2年くらいになるのでそろそろ馴染みの店といってもいいかもしれない。この店素晴らしいところは、散髪を担当する人が人間に興味がないところだ。もう10回以上通っているが、今でもたまに学生かどうか訊かれる。学年や出身地、今住んでいる場所のことなども定期的に訊かれる。形式上会話をして場を和ませようという意思は感じられるが、多分この人は会話の内容にそれ以上の興味はないのだろう。髪を切りだしてしばらくすれば、僕も相手方もどちらも積極的に話題を出さないのですぐ静かになる。これは、ただ髪を切ってもらうだけの関係の人に対して僕が望んでいる最適な距離感だ。できれば僕の髪型以外のことを全く記憶せず、序盤の会話も無しに散髪というサービスの他には挨拶とにこやかな表情だけしていてほしい。

しかし、この理髪店には一つ大きな問題点がある。この店で散髪を担当する男性*1が、おそらくその妻*2と思しき人物に対して常に高圧的でパワハラ体質であることだ。妻の方は基本的にサポート的な業務を担当していて、理髪店への予約の電話の応対などをするのだが、彼女はその電話に対する全ての返答について男性側から指示されている。その指示もとてもそっけなく高圧的なもので、今までこの二人の間で支配-非支配の抑圧的な関係がどのように築かれていったかの一端が伺えてしまう。この店に通い続けることはこの家庭内暴力を肯定することになるのではないか、自分が自分自身に課す倫理に悖るのではないかと逡巡すること幾度だが、持ち前の怠慢さを発揮して結局この理髪店に通い続けてしまっている。

寮に戻ってきて、自分の住む寮の区画のネットを直すために、新しいルーターをセットアップする方法をまとめる。というのも、最近どうにもネットが重い時間帯があり、ルーターの性能不足を疑っているので新しいものに変えてみるのである。じきに後輩にネットの管理を引き継ぐ予定なのもあって実作業は後輩の子に任せてみることにする。テスト前で時間もないので、僕より時間のある後輩の方が適任だ。

その後晩御飯を食べ課題の続き。朝から取り組んでいた問題がやっと解決する。安心して眠れた。

内省

なし。

*1:外見で特定の属性を仮定するのは好きではしすべきでも無いと思っているが、分かり易さと書きやすさのためにこのように表現している。そもそも僕は性別という概念そのものに反対だ。不快に感じられたら申し訳ない。

*2:同上。婚姻関係を推定することについても。

2025年1月15日

日記

出来事

再起動直後のため昼夜が逆転しているが、調子はいいのでそのまま徹夜して朝を迎えることにした。6時くらいまで憎い量子物理学2のレポート課題のためにしこしこ計算し、調子がいいからか無事提出するところまで漕ぎ着ける。その後談話室で『エルフェンリート』第6話を視聴。やはりOPがいい。クリムトのオマージュも素晴らしいし、『LILIUM』の荘厳さはいうまでもない。本編がその重厚さに見合ったものになるかがこのアニメの完成度を測る上で重要となるが、6話まで見てきて、テンポの遅さと各人物の精神性(重い過去のある人物が多いので簡単に判断はできないとは思うが、特にユカの謎の嫉妬深さと手が出やすいところ)が気になり出してきた。これがゼロ年代のアニメの標準からはあまり外れていないのかもしれないが、2025年に見ると不自然さを感じてしまう。

9時頃に眠くなって仮眠をとる。10時から大学の障害学生向けのサポートセンター(DRC)の人との定期面談があったのだが、無事10時ちょうどに目覚めてしまい気分が萎える。衣服を整えて10時半に出発し、10:45-11:00で面談。気分が沈んでいた時期について話し、どうすれば回復できるかについて語っておしまい。そのまま図書館でtwitterを見て日記を書いてから、寮に戻って昼食を食べた。twitterは元気な時にしか見れないので、回復を実感した。

昼飯を食べると急速に眠気が来る。徹夜の反動もあって2時間寝るが、今日からはちゃんと夜に寝るために、ここから起きて活動を再開する。計算と論理のCoqの課題を進める。Coqは形式証明のための言語で、この授業ではCoqの使い方を学びつつラムダ計算とカリー・ハワード対応について触れるという内容の授業で、自分の興味のど真ん中なのでとても楽しい。が、形式証明自体はCoqのクセみたいなものがあって一筋縄にはいかないので意外と泥臭く試行錯誤を重ねる必要がある。課題はあまり進まなかった。

内省

ない。調子がいいからかな。

やりたいことリスト@2025年1月

やりたいことがたくさんある。そのどれもに手をつけられていないが、それでも確かにここに衝動がある。それを表現しなければ、自分を証明できない。よってここに書いておく。

ツール・環境構築

Neovim

VSCodeの動作の重さと、テキスト編集のためだけにブラウザ(Electronをブラウザと言っていいのだろうか)を動かす不効率さに嫌気が差して、以前導入だけしたが、結局移行ができていない。初心者向けに纏まったやつがいいと思いLunarVimを入れたはいいが、設定ファイルのどこをいじればいいのかまだわかってない。 www.lunarvim.org この記事が参考になるかと思っているが、全然ちゃんと読めていない。

Ghostty

HashiCorp共同創業者のミッチェル・ハシモト氏が暇に飽かせて自分好みに作ったターミナルエミュレータがついにversion 1.0を迎えて評判になっている。 ghostty.org どうせ新しいエディタを導入するならターミナルも新しくしたいなと思って目をつけているが、全然導入してない。この記事が参考になりそうだが、やはり設定が面倒だ。

  • 『Category Theory Second Edition』 (Steve Awodey 著):2.6章の圏の直積で止まっている
  • 『低レベルプログラミング』 (Igor Zhirkov 著):5章最後の演習で手こずっている
  • 『計算論』(高橋正子 著):ラムダ計算の勉強のために読み始めたが、そもそもまだ再帰関数が終わっていない
  • 『並行プログラミング入門』(高野祐輝 著):面白そうだと思って買って積んである
  • Interaction Combinatorの論文:計算機の未来がここにある

プログラミング

  • 寮の寮生データベースwebアプリ:version 3で抜本的に構造を整理したりフロント側に手を入れたいが、時間と能力が足りていない。構想とやる気はある
  • Rustで作ったLispインタプリタ
    • テストケースの実行がMakefileで書かれているがややこしいので、書き直したい。JSON形式とかでテストケースを管理したい
    • そもそも未完成なので最後までやりたい
  • HaskellでLispインタプリタ実装:言語処理系は実装に使う言語の勉強にもなる
  • Rustの型システムがTuring完全になることについての記事
  • 競技プログラミング:これは春休みにやる
    • cargo-competeという提出用の便利ツールがある(Rust用)
    • しかしcargo-competeは更新が止まっていて現環境だと壊れている😭
    • 親切な人が作ったPRが放置されているので取り込んで自分用に使えるforkを作る

やりたいことリストは月1で更新するようにしてもいいかもしれない。

2025年1月14日(再起動・時)

年末と年始を跨いで大学に行けておらず特に先週1週間は睡眠以外の生活の全てが憂鬱という霞の向こうに姿を隠していたが、無事日々の生活を復興することに成功した。一度元気がなくなると立て直すのに時間がかかる。何か積極的に行動して生活を立て直すということができない。ただ消極的に時が来るのを待って、その時がくれば動き出す。唯一これだけがこれまでの大学生活で得た自分でできる再起のための方法だった。もちろん友人家族に強制的に起こしてもらうという形もあり、何度も周囲の人たちに助けてもらっていて感謝の念に堪えないのだが、この方法は自分にも周りにも(特に私自身の惰弱で傲慢な精神にとって)負担が大きく、元気のない時にはこのやり方を採ることが難しい。よって現在のところ、"時"を待つしか方法がない。いつもテスト期間までに"時"がくれば勝ち、そうでなければ負け、という孤独な戦いを人知れずベッドの上で戦っている。

何かが足りない気がする。動けない時はよくそう感じる。「やらなければ!」という焦燥感がどこにも結び付かず空回りしただ心を蝕む。ドーパミンだかセロトニンだかが足りていないために動けないのではないか。器質的・・・な問題で自分は動けないのだという半分言い訳半分本気の理屈を反芻しながら、その何らかしらの足りていない精神作用のある物質のことを考え、それが産出されるよう祈りながらまた眠る、そんな生活。

時間を止める能力があれば、とよく思う。私は頭の回転が良くはないのに凝り性で納得いくまで理解できないと前に進めない性分だ、と客観的に認められるようになったのは最近のことだ。何事もやり遂せるまでに時間がかかるが、現実は待ってくれない。そして別に私が必要とするほどの完成度も求めてはいない。その不一致に苦しみストレスが3ヶ月分溜まると(いつも6月と12月に動けなくなる)私は停止する。時間を止めて自分の満足行くまで勉強し休憩することができないために、私自身の活動の方を止めてしまうのである。このマイナス方向にしか働かない完璧主義は私の根幹に深く根ざしており、発達傾向によるものだと強く感じる。今までそうであったように、この完璧主義を捨てて今すぐに生きやすくすることはできないだろう。ただ対策はある。普通とは少し違っても、日々をできるだけ楽に過ごせるように自分だけの生活を作り上げていきたい。

2025年1月2日

達成

Done

  • 期末試験の過去問収集

Doing

  • 『低レベルプログラミング』第5章

ToDo

  • テスト勉強スケジュール策定

日記

出来事

今日は父方の祖母の家に顔を出した。祖母の家では、8つ下で私と誕生日が同じ従姉妹に勉強を少し教えた。共通テスト(共通テスト!?)の情報の過去問でわからないところがあるようで、なんとかその場で解いて解説することで情報学科としての面目を保った。うまく教えてあげることができたか不安だが、こうして自分の得意な分野で頼ってもらえるのは嬉しい。

父方の祖母の家でも毎年正月は豪華なおせちが出る。今年は寿司までついていて大変素晴らしい品揃えだったが、朝からしこたまおせちを食べてきてしまったせいで普段の3割程度しか食べることができなかった。残念。

食後に従姉妹の進路相談に加わる。つい最近高校受験の話をしていたなと思っていたら、いつのまにか大学選びに悩む年齢になっていた。親戚の子供の時間は恐ろしいくらい速く進んでいく。そしてさらに恐ろしいのは、彼女が高校受験のことを考えていた時も大学受験に悩んでいる時も僕が大学生のままで居続けているという事実だ。彼女からみて7年も大学に通い続けている変な従兄弟のおじさんって何に見えているのだろうか。

進路相談の焦点は、彼女が進学希望先のレベルについて守りに入りすぎているというところにあった。彼女の成績であればもう1段階か2段階上に挑戦しても全く問題ないようなくらいなのに、すごく簡単なところを志望しているようである。これには彼女自身の性格の影響も否定はできないが、それにも増して私は社会的な抑圧を強く感じた。この抑圧の要点は、実学志望とリスク許容度である。彼女の親は(そして私の親も)資格をとって確実に就職できる方が良いと強く考えているようで、従姉妹もそれに賛同する形で実学系の進路を取ろうとしている。また、進学におけるリスク許容度については一般的に男女で大きく違うという研究を以前見た気がするのだが、特に自分と従姉妹を比較しても強くその傾向があると思った。

彼女や彼女の親に悪意や欠点があるわけ全くないが、構造的に積み重なった有形・無形の制約が彼女をして無意識的に控えめな選択を選ばせているように仕向けているようで、何かできないかと思った。こういう見方は一方的で偽善的かもしれないと思いつつも、とりあえず私立一本で考えるのではなく、国公立も両立して考えてみてはと伝えた。

作品視聴

  • 『グリザイア:ファントムトリガー』第1話:映画っぽい雰囲気でいい感じ。だがゲーム原作を尺に収めるために展開が走り気味なのが少し気になる

内省

おせちの話を書いていて、自分の環境が恵まれていることを再確認した。

熊野寮という環境に何年も住んでいながらも、無遠慮に自分の普通を誰かに押し付けて人を傷つけてしまうことが何度もあった。無くすことは難しいかもしれないが、できるだけ減らしたい。知識を使って他人を尊重できる人間でありたいと強く思う。

2025年1月1日

達成

Done

  • 量子物理学の課題(1日遅れ)

Doing

なし

ToDo

  • 期末試験の過去問収集
  • テスト勉強スケジュール策定

日記

出来事

久々に朝と呼べる時間に起きた。実家様々である。家族でおせちを食べる。年々おせちが美味しく感じられるようになっているのは、味覚が肥えたからなのか、里心がついたからか、はたまた冬休みの乱れた食生活のためか。私の実家では、毎年母方の伯母の家と祖父との3家合同で年末3日間かけておせちを手作りしている。自分の無知を恥じるばかりだが、そういう家は決して多くはなく、むしろ珍しい部類に入るのだということを知ったのは大学に入って以降のことだった。昔はやたらと家事を手伝わされる(3家族の3日分の朝食を作るのだから当然大量の作業と人手が必要だ)ので嫌だったが、今では手作りでかつそれなりに伝統的なおせちを食べているという事実が少し誇らしく、我が家のおせちという存在が自らのアイデンティティに刻まれていると感じる。実家に帰ると自分のアイデンティティを再発見することが多い。ただ、今年は年末ギリギリに帰省したのでおせちを全く手伝っていない。ただ食べるだけで誇らしげにしているのは傲慢かもしれない。

散歩がてら郵便局に手紙を出してから、やっと今まで手をつけていなかった課題に手を出した。授業も授業資料もわかりづらく非本質的に難しいやりがいのない課題だが、これを出さないことには単位がもらえず卒業が難しくなってしまうので、なんとか覚悟を決める。今回の課題は幸いなことにやっている内容自体はそこまで複雑ではなかったが、面倒臭い積分計算に時間を取られた。昔から計算が大の苦手で、計算が合わないだけで大筋は合っている、という状態から課題を完成させるまで2,3日かかるということがざらにある。そのくせ凝り性で完成するまで提出したがらないので、ここになぜ私が4留を決めることになったの要因がありありと現れている。もう少し頭が良いかこだわりがなければ生きやすかったんだろうな。

作品視聴

なし

内省

今年の目標を考えた。将来のことを無責任に考えるのは楽しい。私にはやりたいことがたくさんある。ただそれをうまくこなしていく能力と、理想に見合わない現実に耐える心の強さがないので、いつも後に残るのは無力感と付け焼き刃の雑学ばかりだ。ただ新年早々後ろ向きになっても仕方ないので、できるだけ実効性のあるように目標を考えたい。目標は以下の通りだ。

  1. 研究をして卒業する
  2. 卒業後の生活スタイルの基礎を作る
  3. 何もできない日問題の具体的な解決
  4. プログラミングに関するインプットとアウトプット

1は当然というか、卒業のために必要なことをやるというだけの話だ。ただ、研究室セミナーでB4やM1の先輩方の発表を聞いてもそれらが全く理解できないことを考えると、結構気が重たい。論文を読んでするべき理由のあるテーマを選び、地道に作業を進めて完成に漕ぎ着けたい。来年度からはなるべく研究室に通うようにしようと思う。ただ、人に馴染むのが苦手なので、研究室に居場所を見つけられるかが心配だ。

2は卒業して就職した後を見据えての目標だ。一人で起きて働いて飯を食う。そういう生活がちゃんとできるように準備を整えたい。会社は大学と違ってちゃんと行かなければという緊張感があるので、実はむしろ働く方が自分には楽かもしれない。面倒臭い授業を自分の意思でサボれる環境は、自分で生活の全てを取捨選択しなければならないので大変だ。早く卒業したい。

3は結構深刻だ。今年度も何度か何もできない日があった。これの解決策は今のところ、1週間寝通して気力が回復するのを待ち、そういう期間があっても問題ないようにタスクの量とスケジュールを調整するしかないのだが、もう少し自分の時間をうまく使えるようになりたい。なので、具体案を考えた。

  • 元気がない日は誰かの家に行く: 家主に迷惑
  • 散歩する: 疲れて寝そう
  • 勉強以外でもとりあえず出かける習慣をつける: 出かける先が思いつかない
    • コーヒーが飲めて何か作業をしなきゃいけない雰囲気だけど毎日気軽に行ける場所がほしい: 研究室?

元気がなくてもとりあえず出かけて、そこで作業を始められればいいかなと考えたが、簡単にはいい案は思いつかない。ただ、以前寮の後輩の子にいい感じのコワーキングスペースがあると教えてもらったので、それを再度教えてもらってからもう一度検討したい。そこに通う習慣をつければ、元気がなくてもなんとか体を動かして、少しは自分の人生のために時間を使えるようになるかもしれない。あとマックに行く案もあるかも。この日記のきっかけになった後輩がしているので、それを真似てもいいかもしれない。

4はずっと思っている。去年はほとんど手をつけられなかったが、これが本当にやりたいことだ。読みたい本などは以下の通り。

  • 『Category Theory Second Edition』 (Steve Awodey 著): 2.6章の圏の直積で止まっている
  • 『低レベルプログラミング』 (Igor Zhirkov 著): 何度も再開しては4章を読み直してそれ以降進んでいない
  • 『計算論』(高橋正子 著):ラムダ計算の勉強のために読み始めたが、まだ再帰関数が終わっていない
  • 『並行プログラミング入門』(高野祐輝 著)
  • Interaction Combinatorの論文: できれば何かしらの記事にしたい

あとRustで書いていたLispインタプリタの続きもやりたい。元々のリポジトリではテストケースの実行がMakefileで書かれていて複雑なので、Dockerとかで綺麗に実行できるように整えたい。インタプリタの実装は言語のいろんな機能を使うので、プログラミング言語習得のための習作に向いていると去年やっていて思った。Haskellの勉強にインタプリタの実装をやってみたい。

やりたいことはたくさんあるが、まずは課題と期末を乗り越えなくては。

2024年12月31日

実家に帰省したところ、明日の元旦礼拝がオンラインになったと聞いた。教会に行くのもそのコミュニティの人たちと接するのも苦手なので、嬉しい話だった。いい機会なので、昨日の日記の時点では成熟について書くとかいっていたが、今日は教会について書きたいと思う。

私の母親がそれなりに熱心なクリスチャン(洗礼を受けたことがあるし、毎週欠かさず日曜は礼拝に行く)なので、実家に帰省するたびに教会に行くように言われる。実際小学生の間は毎週欠かさず日曜学校(礼拝の前にある子供向けの説教。私が通っていた頃には教会の高齢化が進みすぎて僕しか参加者が居なかった)に行っていたし、中高でも部活がない時は礼拝に連れて行かれていた。特にクリスマス礼拝は大学受験の年まで欠かしたことがなかったように思う。クリスマス礼拝でイエス誕生の劇をやったことがあるし、説教が暇すぎて寝ていたらキャンドルサービスの火で髪の毛を焦がしてしまい教会を硫黄臭くしてしまいもした。クリスマスとは、私にとってはかなり宗教的な日だ。

クリスマス礼拝に行くのはいやだがクリスマス自体は私にとって特別なイベントなので、大学に入ってからは毎年毎年クリスマスが来るたびにケーキを大量に買って食べたり談話室で一生クリスマスソングを流したりしてしまう。教会に行く以外で何か催し物をやらないと気が済まなくなっているのだ。最近はアニメのクリスマス回をずっと垂れ流しにすることで気を紛らわしていたりする。

毎年母親はクリスマス礼拝に行くように言ってくる。地元の教会に帰ってきて欲しいともいうし、それが難しいならと私の住んでいる場所の近くの教会でもクリスマス礼拝がやっていると情報を寄越してくる。気付いたのだが、これはすごいヨーロッパ的というか、キリスト教世界で親元を離れ独り立ちした子供たちの多くが経験する普遍的な体験なんじゃないかという気がする。親との関係や自分が今やっていることによって、クリスマス礼拝に対してどう思うかというドラマが世界中で生まれていて、自分もその一端を担っていると思うと面白い。

その熱心な母親に引き継がれた我が家のクリスチャンの系譜は、私の母方の祖父母たちから始まっている。あまり自分の昔のことを話したがらない祖父の話を母親が無理矢理に引き出して整理したところによると、祖父は戦後間も無く職を求めて地元を離れ親戚を頼って神戸まで出てきたらしいのだが、その時世話をしてくれた親戚というのが戦前からのクリスチャンだったようである。そこで祖父は教会に行き始め、そこで知り合った女性と結婚し、私の母とその姉を授かったのだ。祖母の方も似たような形で、疎開先でクリスチャンの親戚に世話になったようである。そして私の母と私の伯母は親に連れられて教会に通い始め、そこで同年代の子供たちと交友関係を築いていったらしい。そのため教会には母の数十年来の知り合いたちがおり、私のよく知らないおじさん・おばさんたちが一方的に私の近況を把握して心配してきたりするので、教会は居心地が悪い。別にその人たちを嫌っているわけではないのだが(本当に嫌いではない)、「田舎の閉塞感」という字面から想像されるものにちょっとした宗教み(彼らは僕の知らないところで僕の進級を神に祈ってくれたりする)を足してもらえれば、僕の感じている不満を理解してもらえると思う。

ここまで教会を嫌がっておいてなんだが、私はクリスチャンの家庭に生まれて教会に一時期通っていたことを自分のアイデンティティの一部に持っている。たまに聖句やイエスの例え話を持ち出して自分を慰めたり人を馬鹿にしたりする(マタイによる福音書19章24節『金持ちが天国に行くより、ラクダが針の穴を通る方が易しい』はお気に入りだ)。そして、教会という場所自体はとても素晴らしいと思う。そこには善意で満たされたコミュニティがあって、大人になっても続けることができる。誰もが生涯を通じてコミュニティの中で役割を持ち、尊敬される世界にしたいという僕の持っている問題意識に対するとても確実な回答になっている。そのことを私は母を通じて目の当たりにしてきた。そう思っていても自分がかつて通っていた教会を毛嫌いしてしまうのは、僕の精神的な幼さのせいなのだと思う。

長くなってしまったので今日はここでおしまい。いつか僕の信仰についても話をしたいと思う。良いお年を。

2024年12月30日

ここ数日何もしてない。年内に出すべき課題があるにもか関わらず楽しくアニメをみて、帰ってきたOBたちと楽しく話していたら何日か立っていた。日付感覚すら怪しい。何もせず何日経ったのだろうか?

そのうち成熟について書く。

2024年12月22日

朝起きたら夜だった。寝た時点ではまだ夜明け前だったので、まるまま昼をスキップしてしまったようである。そんな日もある。そうなっても大丈夫なようにスケジュールを組んであるので、問題ない。惜しいとは思うが、自分の限界だと思って受け入れる。

夜に起きて、昨日買っておいた味付け済みのホルモンを焼いて食べる。部屋のこたつに入って一人でもさもさ食べる。焼肉屋で食べるそれとは違って思いのほか堅くてコリコリしている。顎の筋肉が痛い。味はうまいので食べ切ってしまったが、これならいつものように鶏もも肉を買う方が良いと思った。なんとなく、暮らしの実感を得る。

ついにやる気が出て、途中辞めになっていた『Engage Kiss』を見る。同じA-1 Pictures制作の『リコリス・リコイル』の裏番組になっていたアニメだ。派手なバトルがあって一見高級そうだが内容は実にくだらなかった。けどまあまあ面白い。面白いというか、キャラ萌えだった。高尚なアニメをお高くとまった感じで視聴するのも乙だが、アニメを見始めて最初期に感じた萌えの感覚も私は捨てたくない。「萌え」すらも、今のアニメ視聴のメインストリームからは外れてしまっているかも知れないが。くだらない話が、くだらなさそうな看板を掲げているならあまり文句はない。

課題を一つこなして、映画をみた。『aftersun』という映画。トルコ旅行の計画の話を友人にしたところ、トルコが舞台のこの映画をおすすめされた。実際のところそこまでトルコっぽさはなかった。全体的に、青が印象的な映画だなと思った。プールと、海と、空。確かに鬱々とした気分の時には、どんな真夏の晴天でも明度を欠いた青に見えるなと昔を思い出した。一ミリも楽しくない部活で、理不尽に死ぬほど顧問に叱られている時に、クソ暑い夏の日差しがどこか非現実的な遠くの出来事に思われた中二の夏休みの思い出。いい映画だったので、いつかまたもう一度見たい。

2024年12月21日

日記なのでその日あった出来事について書いておいたほうが良いだろうと思い至ったが、今日は諸事情で書けない。明日以降の申し送りとする。

時が経って気心の知れた友人たちと離れ離れになるのは寂しい。他人の言語と信念を理解して自分のものと擦り合わせるのは時間がかかるし、相性もある。その得難い友人たちといつまでも一緒にいられるわけではない。この当たり前の事実の前に抵抗する覚悟はちゃんとしてあるが、今日は特に寂しかった。老人の孤独に似てるんじゃないかと思った。

2024年12月20日(実際的すぎる生活上の問題)

友人が最近始めた日記がとても素晴らしいので、自分も始めてみる。私の日記を読んで喜ぶ人がいるかはわからないので、あるいは体のいい自己顕示欲の言い訳かもしれない。

現在私を悩ませている問題は大学の課題と就職活動についてだ。あまりにも実際的で卑近すぎる問題だと思う。まず大学の課題についてだが、毎週出る課題が難しく時間がかかりすぎてしまい、それ以外の活動ができないことが悩みだ。しかもその難しさのうちおそらく半分は非本質的な難しさ(授業のわかりづらさと課題の問題設計の不完全さ)に起因しているように思われる。このことがさらに課題に対するモチベーションを下げ、腰を重たくし、タスクに取り掛かれないが故に私の自尊心を傷つけている。実に腹立たしい。次に就職活動についてだが、自分が積極的に働く理由を見出せないことが故に全てが億劫に感じられる。就活を始めるにあたってそれなりに真面目に自分が働くことについて考えたが、その結果漠然と働くこと自体には同意しているが何か特定の仕事に対してモチベーションを感じているわけではないということが明らかになって以来、どこの会社で働くかという問いに真剣になれない。そもそもこの資本主義社会に対して手を貸してやることが自分自身の正義にかなうようには思われない。世界をもっと不便で離れていてゆっくりとした、人々が助け合わずには生きていけないような場所にする仕事になら就いてもいい。とても個人主義的ライフスタイルから誕生したオタクの思考とは思われないが、結局のところそれが自分の6年間の寮生活の決算だった。それにしても就職活動を厭う大学生としてなんて陳腐で面白みのない言い訳なんだろうか。自分自身に言い逃れをするにあたっても独自性の一つも出せない。昔何度も同じ豆知識を披露して姉に「壊れたラジカセのよう」と揶揄されたことを思い出す。その頃から全く進歩がない。どこかで聞いたことのある言葉を右から左に受け渡すことしかできないのだ。

そして上の正義にかなう仕事の方ではなく、単なる自分の興味のあることとしては、今はプログラミング言語を作りたいと思っている。昔から私は意味ありげな難解な記号列を書き連ねるのが好きだった。プログラミングを始めたのも、今もそれを続けているのも、数学が好きなのも、型理論なかに興味があるのも、結局のところ記号列への衝動が根底にある。実用性があって実世界と接続されつつも難解でかっこいい記号列として最も適当な例はプログラミング言語だろう。次いで数学だ。さらにその次は自作自然言語とかだろうな。田舎の川のほとりで高速インターネット回線に繋がって日がな一日中自分のプログラミング言語を作るのが夢だ。そんな日につながるような努力がしたい。

ABC253 C - Max - Min Queryについて

ABC253 C - Max - Min Queryについて、コンテスト中に自分が解いた方法とその理論的な解説、そして想定解法に沿った解答を確認したいと思います。

問題の要約

多重集合 S Q個のクエリが与えられるので、それらを処理する問題です。クエリは以下の三種類があります。

  • 1 x:  S xを一つ追加
  • 2 x c:  Sから x \min(c, (S に含まれる x の個数 ))個削除する。
  • 3: ( Sの最大値)−( Sの最小値)を出力する。このクエリを処理するとき、 Sが空でないことが保証される。

コンテスト中に書いた解法と計算量

自分が考えた解き方は、辞書式配列mapと二つのヒープmax_heapmin_heapを用意し、mapで要素の個数を管理しmax_heapで最大値、min_heapで最小値を取ることができるようにするというものでした。 実装は以下の通りになります。

use proconio::*;
use std::cmp::{min, Reverse};
use std::collections::{BinaryHeap, HashMap};

fn main() {
    input! {q: usize}

    let mut map = HashMap::new();
    let mut max_heap = BinaryHeap::new();
    let mut min_heap = BinaryHeap::new();

    for _ in 0..q {
        input! {kind: usize}

        match kind {
            1 => {
                input! {x: usize}
                *map.entry(x).or_insert(0) += 1;
                if map[&x] == 1 {
                    max_heap.push(x);
                    min_heap.push(Reverse(x));
                }
            }
            2 => {
                input! {
                    x: usize, c:usize
                }

                if map.contains_key(&x) {
                    *map.get_mut(&x).unwrap() -= min(c, map[&x]);
                }
            }
            3 => {
                let mut max;
                let mut min;
                loop {
                    let &m = max_heap.peek().unwrap();
                    if map[&m] > 0 {
                        max = m;
                        break;
                    } else {
                        max_heap.pop();
                    }
                }

                loop {
                    let &Reverse(m) = min_heap.peek().unwrap();
                    if map[&m] > 0 {
                        min = m;
                        break;
                    } else {
                        min_heap.pop();
                    }
                }

                println!("{}", max - min);
            }
            _ => return,
        }
    }
}

どうやらユーザー解説をみるとこの解法はmultisetがない場合の想定解のようなものだったようです。

ここで、一つ懸念点となるのが既に削除された値が最小値・最大値の候補になる場合です。この場合、候補の値が既にmap上で0個となっていれば(= 値が削除済み)、次の最大値・最小値をさらに確認し、それがmap上で1個以上の値を持っていればそれを最大値・最小値として出力します。この方法だと、例えば最大値の候補となる値が N個連続で軒並み削除済みの値であれば計算量が O(N \log N)になってしまいそうです。

この場合についての計算量をならし計算量(償却計算量)で考えます。まず一度の削除にかかる計算量はmap上の値を書き換えるだけなので O(1)です。そして、削除を N回行った後に最大値を出力しようとしてmax_heapから Npop()を行うので、この計算量は O(N \log N)となりますが、これを連続した N回の操作全体で平均してやると、計算量は O(\log N)となります。

よって削除にかかる計算量も O(\log N)となります。上記の議論は [Python] heapqを応用して挿入/削除/最小値取得を効率的に行うを参考にしています。

想定解のRustによる実装

公式解説によれば、C++のmultisetクラスを利用するようなので、それと似たような機能をもつ構造体MultiSetを実装して解きます。 実装にあたっては記事Rustでmultisetもどき(ABC170 - E)を参考にHashSetやBTreeMapの要素の型をちょっと抽象化してみました。なんちゃって実装ですが、よかったら参考にしてください。

use proconio::*;
use std::cmp::min;
use std::collections::{BTreeSet, HashMap};
use std::hash::Hash;

struct MultiSet<T> {
    map: HashMap<T, usize>,
    set: BTreeSet<T>,
}

// 重複集合: 要素の重複を許し、要素が一意(= この場合は昇順)に並んだ集合
impl<T> MultiSet<T>
where
    T: Eq + Hash + Ord + Copy,
{
    fn new() -> Self {
        Self {
            map: HashMap::new(),
            set: BTreeSet::new(),
        }
    }

    // 重複許可挿入
    fn insert(&mut self, v: T) {
        *self.map.entry(v).or_insert(0) += 1;
        // setに要素がない場合は追加
        if self.map[&v] == 1 {
            self.set.insert(v);
        }
    }

    // 要素を一つ削除し、削除した要素を返す
    fn erase(&mut self, v: T) -> Option<T> {
        if !self.map.contains_key(&v) || self.map[&v] == 0 {
            return None;
        }

        *self.map.get_mut(&v).unwrap() -= 1;
        if self.map[&v] == 0 {
            self.set.take(&v);
        }
        Some(v)
    }

    // 要素vをc個削除。要素vがc個以下の場合はvの個数を0にする
    fn delete(&mut self, v: T, c: usize) {
        if !self.map.contains_key(&v) || self.map[&v] == 0 {
            return;
        }

        *self.map.get_mut(&v).unwrap() -= min(c, self.map[&v]);
        if self.map[&v] == 0 {
            self.set.take(&v);
        }
    }

    // 最大値を取得
    fn max(&self) -> Option<T> {
        if let Some(&v) = self.set.iter().last() {
            Some(v)
        } else {
            None
        }
    }

    // 最小値を取得
    fn min(&self) -> Option<T> {
        if let Some(&v) = self.set.iter().next() {
            Some(v)
        } else {
            None
        }
    }
}

fn main() {
    input! {q: usize}

    let mut multiset = MultiSet::new();

    for _ in 0..q {
        input! {kind: usize}

        match kind {
            1 => {
                input! {x: usize}
                multiset.insert(x);
            }
            2 => {
                input! {
                    x: usize, c:usize
                }
                multiset.delete(x, c);
            }
            3 => {
                println!("{}", multiset.max().unwrap() - multiset.min().unwrap());
            }
            _ => return,
        }
    }
}

参考文献