大学生活振り返り

これは何?

  • 大学を卒業できたので,その振り返りです.
  • 印象に残ったイベント等を時系列順に書いています(一部時系列が前後するところもあります)
  • クリティカルな情報やそれに関するイベントは書かないようにしたつもりですが,削除するべき情報があった場合すぐに対応するのでご連絡ください.

ガイダンス

当時の弊学科は入学後すぐに1泊2日の大学関連ガイダンス兼懇親旅行みたいなのがあって,大学近くの旅館に泊まりました.
大学入学時点で(先輩・同期含め)知り合いが一人もいなかったので,「なんとしても知り合いを作らねば…」となってトランプとかオセロを持って行きました.
結局話しかけるタイミングを失ったり,他の人が持ってきたもので遊ぶなどしたりで一度も使わなかった記憶があります(悲しいね).
ガイダンスでは「気を抜いてると留年するで!」みたいなことを言われた気がします.当時自分の学力にかなり疑問を持っていたため,怖え〜となっていました.
他に記憶に残っているのは,旅館での夕食が想像の10倍くらい豪華だったことと,2日目に電力会社の施設を見学したことくらいで,全体として楽しかったです.

サークル

サークルには入りたいと思っていたため,入学直後にコンピュータ部に入りました.
基本的に部室に集まって雑談しながら各自パソコンをカタカタする感じで,たまに近所の子供達へプログラミングを教えに行くなどしていました.
また,サークル経由で学内バイト(研究室で使うプログラムを作成する)みたいなことを先輩としていたのですが,そこで与えられたタスクがかなり重く,半年くらいで辞めてしまいました.これは自分の中でかなりトラウマになっていて「僕は本当に社会でやっていけるんか………?」と不安になった記憶があります.

1年前期

ガイダンスが無事に終わり,本格的に大学生活が始まりました.
一年前期はまだ情報科学を扱った授業は少なく,linux上での操作を覚える授業があったくらいでした.元々Ubuntuを使っていたのでかなり余裕を持って取り組めていたと思います.(とはいえ知らないコマンドや操作方法も多くて,毎回「なるほどな〜」となっていました). この授業の中で Emacs を使った実習みたいなのがあって,「Vimとの強さがネットで議論されてるやつや!」と一人で盛り上がった記憶があります.
大学入学前はコンピュータや数学などの理系分野に興味を持つ知り合いがあまりいなかったため,授業でそれらの用語が話されるたびにテンションが上がっていました(最悪オタクすぎる).
1年前期で特に面白かったのは一般教養科目の「熱と流れ」という講義でした.毎回熱力学・流体力学の色々な話題をオムニバス形式で紹介していくスタイルの講義だったのですが,それまで全く触れたことのない分野だったのでひたすら「おもしれ〜」となりました.
その他にも,線形代数などの所謂大学数学の講義を,「これが†大学の講義†か…!」と思いながら受けていた記憶があります(どれも大学の講義ではあるんですが).

競プロを本格的に始める

大学に入学してから,競技プログラミング(特にAtCoder)を本格的に始めました.
元々CodeIQを少し触っていたのですが,他人と競い合うというよりはコンピュータを使って面白い問題を解きたいといった部分が大きく,AtCoderには(名前は知っていたものの)なんとなく手を出していませんでした.
大学入学後にサークルの先輩が競プロをしていると知り,せっかくだから僕も本腰を入れてやってみるかと思い立ったのがきっかけです.
当時はまだABCが4問体制だったため,早解きでもそこそこレートを得ることができ,それが続けるモチベーションになりました.
また,ICPCという単語を聞いたのも大学に入ってからで,当時は「せっかくだから1回くらいは出てみたいな〜」とぼんやり思っていました.

夏休み

1年前期が終わり,大学生初めての夏休みが始まりました.が,この夏休みは免許を取りに車校に行っていた記憶しかありません.
「大学生のうちに免許は取っといたほうがいいだろうな〜」とか思って入校したんですが,想像以上に大変でした.
とはいえ免許証を手に入れたときはかなり嬉しくて,「免許を取れるくらい歳を取ったのだなあ」としみじみした記憶があります.

1年後期

1年後期が始まりました.ここで初めて簡単なプログラミングをする講義が登場しました.とはいえプログラミングを経験している人ならかなり余裕を持ってついていけるような内容だったため,あまり「情報系の授業を受けている」という感覚はありませんでした.
この学期の講義で特に印象に残ったのが「対称性と微分方程式」という一般教養科目で,びっくりするくらい内容が難解でした.言語は日本語のはずなのに,何を言ってるのかわからないと感じたのはこれが初めてでした.この時点で微分方程式自体あまり理解していなかったこともあり,大学で受けた講義の中で一番必死で取り組んだ確信があります.

他の競プロerと出会う

大学1年目の12月,AtCoderの順位表に弊学所属の黄コーダーを発見します.leaf1415です.
これを見つけたとき「き,黄コーダー!?」と思わず声が出た記憶があります.それまで僕の知っている弊学の競プロerで,水色より上の方は存在しませんでした.
かなりびっくりしたと同時に「大学生活のどこかで一度合ってみたい」と思いました.当時僕は所属欄を空白にしていたので,取り急ぎ所属を University of Fukui に変えたことを覚えています.
後日Twitterでりーふさんらしき人からフォローされました(かなり嬉しかったです).とはいえこの時点ではオフラインであったことはなく「顔も名前も声も全くわからない,謎の強プロer」というイメージでした.
りーふさんと実際にお会いしたのは日経コンの懇親会時です.当時僕は奇跡的に懇親会への参加枠を手にしており,本戦に出場したりーふさんと懇親会で会うことになりました.
また,同じ大学erのえだまめさんともこの懇親会でお会いすることになりました.普段はみんな福井で生活しているのに,初エンカが東京だということにかなり面白さを感じた記憶があります.
その後,えだまめさんからの紹介で,なゆたさんとも知り合いました.この方たちと2019~2020年のチーム戦コンテストにかなり出た気がします.それまでは基本的に一人でプログラミングをしていたので,チームで一つのコンテストに出るというのは新鮮で,とても楽しかったです.

2年前期

2年前期から徐々にプログラミング/情報工学の授業が増え,盛り上がってきた記憶があります.特に,プログラミングの講義では,関数呼び出しの際スタックがどのように積まれるかのような低レイヤの部分にも若干触れていて,おもしれ〜となった記憶があります.
この講義で得た知識は,後述するコンパイラ作成の際にかなり役立ちました. 他にはある講義で「英語の論文を読んで,その内容を日本語でまとめよ」みたいな課題が出てひょえ〜となっていました.その課題はチームで取り組んでも良かったのですが,当時謎の反骨心があり,「一人でやってやる…!」と思い立ち地獄を見た記憶があります.難しい課題は(可能であれば)協力してやるべきだと気付きました(それはそう).
また,この年に初めてICPCに出ました.コンテスト終了後のお疲れ様会で,解けなかった問題の解説を聞きながら「あああああああああなるほどなあああああ」みたいになったことを覚えています.

夏休み

2年生はどちらかというと夏休みにかなり(当社比)頑張っていて,低レイヤを知りたい人のためのCコンパイラ作成入門コンパイラブック)を読みながらCコンパイラを書いていました.
もともとコンパイラにはかなり興味を持っていて,「プログラムを生成するプログラムってメタ的でかなり面白いな…でもどうやったらそんなことができるんだろう」となって調べ始めた記憶があります.
最終的にCのメチャクチャ小さなサブセットのコンパイラができて,数独を解くプログラムをコンパイルして実行できるまでになりました.
その頃には夏休みが終わり,目標としていたセルフホストは達成できずでした.

2年後期

2年後期に実験が始まりました.複数のテーマがあり,基本ペア or チームでやっていく感じだったんですが,その中のペアを組んで取り組む課題で後のICPCチームメイトと出逢います. 課題は「レゴのマインドストームを使って,何か面白いものをつくれ」というもので,最終的にマインドストームの液晶部分と付属していたジャイロセンサを利用して,3D迷路(マインドストームスマホのように手で掲げ,その場で回転するとジャイロセンサが反応し液晶状の表示も回転する.前進はボタンで行う)を作りました.
個人的には二人で協力しつつ,面白いものが作れたのでかなり満足でした.レゴのブロック要素は全く使っていませんでしたが….
そのほかの講義ではデータ構造とアルゴリズムという授業の演習(与えられたプログラムを時間内に作成する)が金曜日の1限にあったのですが,一番疲れている曜日の初っ端からプログラミングをするのはかなりヘビーに感じました.
それでも,その頃にはAtCoderのコンテストに定期的に参加する程度にはプログラミングをしていたので,比較的余裕を持って取り組めたと思います.
年末に大学の先輩であるくま⚡️さんとお好み焼きを食べに行きました.twitter上でしか話したことがなくかなり緊張してたのですが,実際に会ってみるととても良い方でした.
お好み焼きはくまさんが見つけてくれたお店で食べたのですが,とても美味しい&&当時住んでいたアパートから近かったため「こんなお店があったんか」と驚きました.

3年前期

3年生前期はなかなか始まりませんでした.コロナの影響で学期の開始が遅れたからです.
当時は「なんか大変なことになってるな…」と思いはしたものの,まさか現在に至るまでこの影響が続くとは思いもしませんでした.
そのうち「今学期は基本オンラインになる」との連絡が来て,講義で使う仮想環境一式が入ったUSBが送られてきました.当時は実家に帰省していたので,そのまま授業を受けることにしました.
この時受けた講義は特に問題なく進行したのですが,実家で,かつ自分のパソコンを使って受講するのは初めてだったので,なかなか集中して取り組めないこともありました.
また,受けた中でかなり無を感じる講義があり,少し厳しい気持ちになったりもしました.一般には楽単の部類に入っている講義らしくて確かに楽だったのですが「本当にこれで単位が取れて良いのか…?」みたいなことを思っていた記憶があります.
この時受けた授業で特に面白かったのはJavaを使ったGUIプログラミングの講義で,最終課題として,各人が思い思いのGUIプログラムを作って発表するというものがありました.
自分の想像以上に凝ったプログラムが発表されていて,とても刺激を受けました.オンライン授業で人との関わりが普段以上に少なかったため,いろんな人の発表が見れて普段以上に楽しかった記憶があります.

夏休み

3年目の夏休みはオンラインでインターンをしました.当時の様子は社内ブログに載せていただいています.
やったことは上の記事の通りなんですが,これが学内バイト以来の「プログラムを書き,お金をもらう」という経験であり,(個人的には)ある程度形になるものを残せたため,かなりの成功体験となりました.
また,コンパイラ作成時にかじった構文解析の知識がこのインターンで活かせたため,その点でも良かったと感じています.

インターンの他にも,セキュリティキャンプに申し込んでいて,そちらにも参加することができました.これもオンラインで,夏休みの最後の方〜後期の初め頃までの開催でした. Cコンパイラを作成するコースを受講したのですが,同じ受講者や講師・チューターの方が強い人ばかりで(特に,講師の方の一人は上で紹介したコンパイラブックの作者でした)とても刺激を受けました.
ただ,開発の進捗の面では(多少機能の拡張はあったものの)キャンプ前に想像していたよりは成果が出ませんでした….
2年生の頃に書いたコードをベースにキャンプ中の開発をしていたのですが,これがかなり良くありませんでした.当時の自分が何を思ってそれを描いたのかを完全に忘却していて,「なんやこのコードは…」とひたすら唸っていた記憶があります.半年前の自分は他人なのだなあとここで痛感しました.
この辺りから,「自分は過去の物事を自分で思っている以上に忘れるのだから,未来の自分に対して今やっていることのログを残すのが大切」という意識が(それを実践できているかは別として)生えたように思います.
進捗としてはぼちぼちでしたが,キャンプ中に強い人たちから直々に教えてもらったり,他のセキュリティに関する講義を聞けたりと,今後の人生を変えるような経験ができたと感じています.

3年後期

3年後期が始まりました.卒研配属直前の学期ということもあり,難しい講義が多かった印象でした.それでも内容的には今まで受けた講義や個人的なプログラミングの経験を活かせば理解できるものがほとんどで,「何一つわからん………」みたいな講義はありませんでした.
コンピュータグラフィックスの講義で,自分で3D図形を描画するプログラムを作成する課題があり,それがかなり面白かったです.学んだ線形代数の知識を頼りにプログラムを書いて,実行すると思った通りに三次元の像が描写されるという体験はかなり楽しいものでした(実装途中ではバグらせまくっていて,めちゃくちゃな画像が表示されたりもしましたが).

また,この年もICPCに出ました.当時の感想ははてなブログにあります.この記事中にもありますが,当時の僕のムーブがひどく,「やってしまった…」となっていました.
それでも,2年連続でチームを組みICPCに参加できたことはとても嬉しい経験でした.

サークルの解散

4年生になり,研究が本格的に始まる前に,部長を引き継いだコンピュータ部の解散手続き(部員不足による)をしました.
部での活動で感じたことや解散に至った経緯は(自分の中で折り合いがつけば)またどこかに残したいなと思っているのですが,個人的な感想としては.

  • コロナ以前から部員が少なく,これ以上部員を減らしたくなかった
  • そのため,活動のハードルを下げ,脱落する部員を少なくしようとした
  • その結果,コンピュータ部というより単なる雑談を行うサークルとなってしまい,部としての存在意義が薄くなった
  • その結果,新入生に部としてのアピールがしにくく,さらに人が減った状態で最初に戻る

という悪循環に陥っていたなあと感じています.なんとかしないといけないと思いつつ,結局何もできませんでした.
最後の1年は僕ともう一人の部員でひたすら雑談しながら個人の作業をするみたいな感じになっていて,かなり申し訳ない気持ちでいました.
ただ,これが本当に誰もいない状態だったら本当に苦しかったと思うため,もう一人の部員にはとても感謝しています.

解散するときは正規の手続きを踏み,きちんと解散をしたいと思っていたため(それはそう),大学とのやりとりにはかなり気を使いました.
コロナの影響でしばらくサークル等に入れなかったこともあり,5月に解散届けを出し,最後の作業が完了したのは9月でした.
書類仕事以外にも部室の清掃をする必要があり,もう一人の部員と分担しながらこなしたもののかなり大変でした.
「これを一人でするのは絶対無理だわ…」と思った記憶があります(OBの先輩たちを呼べばよかったのですが…).

院試

4年生の夏に外部の院試を受けました.
外部院試という制度の存在自体は知っていたのですが,なんとなく自分からは縁遠いものに感じており,研究室に入る前までは現在の大学の院へ進学するつもりでいました.
しかし,配属先の研究室のボスが外部院進学をされていて,そのボスの話を聞くうちに「別に特別なことはなくて,申請すれば誰でも受けられるものなんだな」と心持ちが変わりました.
また,卒業研究で僕は研究室の主テーマから若干離れたことをやる予定でいたため,「今の研究分野を深めたいなら,別の研究室を探すのもありだなあ」と外部院進に傾いた記憶があります.
そんなわけで各大学の院進学説明会に参加し,良いと思える研究室を探し,その大学院+自大の大学院の院試を受けました.
ただ,外部の院試は受かると全く思えなくて「せっかくn万円払ったのだから,試験時間の間椅子を温めさせてもらうか……」みたいな気持ちで会場に行きました.
その後,本当にありがたいことに希望する外部院への入学が許可され,大きな山場を超えました.(これは罠で,後の入学手続きにめちゃくちゃ苦しめられました).

ICPC

大学4年目にもICPCに参加することができました.当時の様子ははてなブログに書いているんですが,大学生活最後にして予選を突破することができました.
正直なところ(僕がこの年はあまり競プロをできていなかったこともあり)予選突破できるかかなり不安に思っていたので,本当に嬉しかったです(チームメイトが強かった………!). 初めて参加したアジア予選でも最初の2問を解くことができました.正直もう一問は解きたかった…となりましたが,それでも最後にこの大会に参加できて本当によかったです.

研究

大学生活最後のイベントであるところの卒業研究をしました.僕の学科では4年の4月に研究室へ配属があり,そこから一年間卒業研究に取り組みます.
僕はスパコンで動作するプログラムを実装し,その性能を評価する類の研究をしたのですが,かなり大変でした.
並列プログラミング自体未経験+内部で用いたライブラリの日本語資料がほぼ存在しない+プログラムが実行されるまでにかなりの待ち時間がある(実行結果を見ながらのデバッグが難しい)などがあり「僕は本当に今年卒業できるのだろうか…」とひたすら疑問に思っていました.
また,得られた研究成果を卒論という形に落とし込むことも大変でした.伝えたいことを伝わるように書くのが本当に難しく「もっと長い文章を書く経験を積んでおけば………」とかなり後悔していました.
それでもなんとか卒論を書ききり,卒論&学会発表をし,学位と学長表彰を得ることができました.大学生活終了です.

大学生活を通して

入学当初は「4年で卒業できるんか………?」とひたすら不安に思っていたのですが,蓋を開けてみればとても良い結果に終わり,満足しています.
また,競プロや大学の諸々を通して(ここに名前を載せていない方達も含めた)多くの方と知り合えたのは本当に幸運だったと思っています. ここでは書かなかった/書けなかったこともあり,大変な思いをすることもありましたが,総じてとても楽しい4年間でした.
修士課程も頑張ります!

2021年の目標振り返り

これは何?

今年のはじめに今年の目標を書いたので,その振り返りです.

できたものを✔️,できなかったものを❌,微妙なものを🤔で表しています.

メンタルを健康に保つ→❌

研究室配属等で環境が変わったり,院試等の将来に関する物事があったり,部長をしていたサークルの解散手続き(人数不足のため)をしたりなど,精神力のいるイベントが多かった印象があります.

そのようなイベントがあるのはある程度仕方ない(多くが自分でコントロールできない/やる必要があることのため)んですが,メンタルを回復するための行動(お酒を飲む,猫をなでる,散歩するなど)があまりできなかったな...と感じています.辛くなくなるまで布団にこもってYouTubeを見るみたいなことをしていたため,来年は能動的にメンタルを保っていきたいです.

人とコミュニケーションを取る→✔️

言うほど✔️か...?今年は週毎にゼミやミーティングがあったり,ICPCに参加したり等で人とコミュニケーションを取る機会はそこそこあったと思います.人とゲームしたりラーメンを食べたりするのはかなり楽しかったです.

ただ,自分から人を誘ったりイベントを企画するのがあまりできなかった感があり,若干の申し訳無さを感じています.来年はなにかしたい.

研究をする→🤔

「俺は本当に卒論を書けるのか…?」という気持ちと「や(れ)ることはやってるつもりでいるんだけどなあ…」という気持ちが混在しています.助けてくれ....

自分の卒論をかけるのは自分だけなので,やっていきます(やっていくので).

webで動く何かを作る→❌

春頃に「ポートフォリオ作るぞ~!」となってtodoリストを更新してから,何もしていません....「webで何かを動かせたら楽しいだろうな~」という気持ちはずっとありつつ,環境構築の段階で躓きました.フロントエンド何もわからん.

OSSの何かを作って,3ヶ月以上継続的に開発する→🤔

今年の春ごろまでは有志の人たちと一緒に円周率の計算プログラムを作っていました. フルスクラッチで100万桁を計算するところまでは(確か)できたと思うんですが,現在は更新が止まっています....個人的に作成したリポジトリもあり,いつか開発を再開したいなと思いつつ,現状手が回っていません.

OSSではないですが,今年の7月から卒論のプログラムを書き始めていて,そちらは現在も更新が続いています.

蟻本/けんちょん本を読み込む(各章で登場するアルゴリズムや考え方が言えるレベルで)→❌

読めていません...

青diffまで埋める→❌

埋めていません...

今年は競プロ(特にAtCoder)に関してはかなりだめで,無精進で週末コンテストに出るくらいしかしていませんでした. 精進をしないとあまり問題が解けないので(それはそう)なんとかしたいなという気持ちでいます.

参加記/色変記事以外の内容でブログを12本以上書く→❌

この記事含め今年書いた記事は4本(うち1本は参加期)でした. やったことの記録を残しておくと後々かなり役立ちそうだなとは思っているのですが,習慣にできずうーんとなっています.

週記を公開している方をTwitterで見かけていて,かなり良さそうだなと感じています.

体を動かす系のゲームを合計200時間以上プレイする→❌

合計16時間(最後にプレイしたのが6月)でした.... Quest2+Oculus Linkでプレイしていたのですが,ゲームを始めるまでのセットアップ(部屋の障害物の片付け,PCとSteamの起動,メガネをいい感じにQuest2本体にはめる...)が思ったより面倒くさく,あまり続きませんでした.また,寒くなってくるとそもそも運動しようという気が起きず(は?)厳しかったです.

最近は友達がリングフィットアドベンチャーを始めていて,かなり気になっています.

体重を0.9倍にする→✔️

今年の7月から食事管理+運動管理を始めていて,今年の体重lowest/highestが0.89くらいになりました.

食事管理にはあすけん,運動管理にはmi band5+Google fitを使っています. 特にあすけんはとても便利で,バーコードや写真から食べたものを登録できるため記録がかなり捗りました.

最近は実家に帰り無限にご飯が出てくるのと,寒すぎて家から出れないのとで急速に体重を取り戻しつつあります.助けてくれ.

TOEIC800点を取る(取れるくらいの英語力を身につける)→✔️

3月に受けたTOEICで865点を取りました.

実感としても,英語の論文やドキュメントを読んだりするのが(以前に比べて)楽になっている感はあります. ただ,これはTOEICというよりも,論文やドキュメントを読んでいるうちにそれらを読む力がついた気がしています(それはそう)

プログラミングが関係する何かで社会から正のお金を得る→❌

これ,当初は「夏にどこかの会社でインターン/バイトができればいいな~」と思って書いたんですが,実際は研究や院試等でそれどころではありませんでした....

一年たった今もプログラミングによってお金を得たい(自分のスキルを生かして生きていけるようになりたい)という気持ちがありつつ,果たして自分はそれを学業(研究)と両立してやっていけるのか...?ともなっています.難しい.

院/将来について決める→✔️(?)

少なくとも今年中に決める必要があることは決めて,今年中にする必要があることはしました.

ただ,将来に関してはこれからも考えるだろうな...というのが正直な気持ちとしてあります.2年後の自分がどういうことをしているのかいまいち想像できません. とはいえ未来は不確定なものだし,これから自分が何をしたいかが変わることもあるだろうなと思っているので,あまりガチガチに固めすぎるのもなあという気持ちでいます.

いざ決断をするときになって選択肢がないととても悲しいので,そうならないように情報は集めつつ,最終的な判断はするべきときにしたいなとなっています.

以上です.思ったより❌が多くて悲しくなりました.来年は4個以上の目標を達成したいです.

ICPC国内予選2021参加記

ICPC国内予選2021にchomonolismizu_yokanの二人とチーム「Cutting Tree」で参加しました. 結果は4完27位で,予選を通過しました!

本番まで

本番までに構文解析をやっておきたい&&実装力を鍛えたい気持ちがあったため,ASCII ExpressionとMatrix Calculatorを通すなどしていました.

前日(木曜日)にチームメンバーで集まり,リハーサルをしました.ボス問である鎖中経路の実装がすぐにできず,悲しい気持ちになりました.

本番前日の夜は緊張でなかなか寝付けませんでした.酔っ払ったら/お腹がいっぱいになったら眠くなるだろうとストロングゼロ+炭水化物を摂取したり,運動して体力を使おうと深夜の大学を徘徊したりしたんですが全く効果がなく,自分で自分にキレていました.

幸い本番当日は予定が何もなかったため,昼過ぎまで布団の上で過ごしていました.

その後大学へ向かい,15時半ごろにチームメイトと合流しました.

予選開始までに1時間くらい時間があったのですが,その間は会場に遊びに寄ってくれた同じ大学の競プロer達と雑談をしたりしていました.

本番

前日の打ち合わせで,初動はA,B,Cをそれぞれmizu_yokan,僕,chomonolisで分担すると決めていたので,Bを読みました.

一瞬何やこれとなったんですが,落ち着いて読むと,左端の列に数字が書いてある時,その数字が書いてある行の値が確定することがわかります.また,あるマスに数字が書いてある時,そのマスの列/行の値がわかっていれば,行/列の値もわかります.そのため,盤面全体を走査し,行/列の値を一つずつ確定していくコードを作成しました. 実行に数十秒程度かかってもいいからバグを埋め込みにくいコードを書くと決めていたので,愚直に100*100のマス目全体を見る処理を100*100回繰り返すコードを書きました(今気づいたんですが,繰り返し回数は高々200回で良いですね…) 入力がw,hの順に与えられることにしばらく気づかず時間を溶かしたりしつつ実装を終え,ちょっと待つと実行が終わりACできました.ほとんど同じタイミングでmizu_yokanによってAが通りました.

Cに構文解析要素があるとのことだったため,見ます.chomonolisがすでに考察を終えていたため,それを聞いて実装しました.文字列から木を作成し,答えを根の全探索によって求めるコードを書きます.巨大なテストケースに対してめちゃくちゃ時間がかかり焦ったのですが,メモ化をすると爆速で処理が終わるようになりACできました.

その後,三人がかりでDを見ます.本当に何も分からなくて「焼きなましじゃない?」みたいなことを言っていたら,chomonolisが二分探索+半分全列挙解を完成させてくれました(すごい…).それが想像以上に高速だったため,PCを応援しつつ処理の完了を待ちます.その後しっかりとDが通り,4完が確定しました.

その後,Eをチラ見し「難しそう…」となったため,予選終了までは順位表を眺めたり,各問題の振り返りをしていたりしていました.

個人的な感想/反省点

はじめてICPCの予選を突破できたため,本当に嬉しい気持ちでいっぱいです.

今回のICPCでは数十秒~数分程度の解法ができたら,無理に高速化せずにそのまま実行しようと決めていたのですが,(去年のICPCで,数十秒で実行が終了するプログラムの高速化に固執してしまい予選突破を逃した思い出があったため)それがいい方向に働いたな〜と感じています.

また,今回のC問題では考察と実装の分担がうまくできたため,個人的にかなり良かったです.

反省点として,実装が遅かったなあというのがあります.特に,Bに30分近くかけてしまったため,もう少し早く書けるようになりたいです.

アジア地区予選も頑張ります!

chomonolisによる参加記もあるため,ぜひこちらもどうぞ!

M1 Macでchibiccを動かす

問題

低レイヤを知りたい人のためのCコンパイラ作成入門のリファレンス実装であるchibiccをM1 Macbook Air のdockerで動かしたところ、make testを実行した際に次のエラーが出た。

sbite@macbookair chibicc %  docker run --rm -v $PWD:/tmp -w /tmp compilerbook make test
./chibicc -Iinclude -Itest -c -o test/line.o test/line.c
/tmp/chibicc-eSJ6iQ: Assembler messages:
/tmp/chibicc-eSJ6iQ:240: Error: unknown mnemonic `push' -- `push %rbp'
/tmp/chibicc-eSJ6iQ:241: Error: operand 1 must be an integer register -- `mov %rsp,%rbp'
/tmp/chibicc-eSJ6iQ:242: Error: operand 1 must be an integer or stack pointer register -- `sub $144,%rsp'
/tmp/chibicc-eSJ6iQ:243: Error: operand 1 must be an integer register -- `mov %rsp,-8(%rbp)'
/tmp/chibicc-eSJ6iQ:244: Error: unknown mnemonic `movl' -- `movl $0,-144(%rbp)'
/tmp/chibicc-eSJ6iQ:245: Error: unknown mnemonic `movl' -- `movl $48,-140(%rbp)'
/tmp/chibicc-eSJ6iQ:246: Error: unknown mnemonic `movq' -- `movq %rbp,-136(%rbp)'
…

原因

付録3:Dockerを使った開発環境の作成を参考にしてLinuxのdockerイメージを作成したが、この方法だとM1 Macではaarch64版のLinuxがダウンロードされるっぽい(Apple M1はarm系のチップなので、それはそう)

sbite@macbookair chibicc %  docker run --rm -v $PWD:/tmp -w /tmp compilerbook uname -a
Linux b551daa93102 5.10.25-linuxkit #1 SMP PREEMPT Tue Mar 23 09:24:45 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

chibiccはx86_64のアセンブリを出力するので、aarch64のアセンブラでは解釈できないものになっていて、これが原因でエラーが出ていそう。

解決策

M1 MacにはRossetaというx86_64をエミュレーションする機能がついていて、これを利用することで、x86_64版のLinuxをdocker経由で動かすことができた。
まずはmacRossetaを入れる(Rossetaの入れ方はメモってなかったのでググってください…)
インストールが終わると、arch -x86_64 uname -mを実行してx86_64が出力されるようになるはず。

sbite@macbookair chibicc % arch -x86_64 uname -m
x86_64

その後、オプションに--platform linux/amd64 を付けてdockerイメージを作成する

sbite@macbookair chibicc % docker build -t compilerbook_x86_64 https://www.sigbus.info/compilerbook/Dockerfile  --platform linux/amd64
[+] Building 1.4s (9/9) FINISHED                                                
 => CACHED [internal] load remote build context                            0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest           1.3s
 => [1/6] FROM docker.io/library/ubuntu:latest@sha256:3c9c713e0979e9bd606  0.0s
 => CACHED [2/6] RUN apt update                                            0.0s
 => CACHED [3/6] RUN DEBIAN_FRONTEND=noninteractive apt install -y gcc ma  0.0s
 => CACHED [4/6] RUN adduser --disabled-password --gecos '' user           0.0s
 => CACHED [5/6] RUN echo 'user ALL=(root) NOPASSWD:ALL' > /etc/sudoers.d  0.0s
 => CACHED [6/6] WORKDIR /home/user                                        0.0s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:7b022fe760762b094441e9f6d01c415d3aa52b6ed4105  0.0s
 => => naming to docker.io/library/compilerbook_x86_64                     0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

make clean今までに作成した.oファイル等を削除しておく(これを忘れて無限にハマった…)

sbite@macbookair chibicc %  docker run --rm -v $PWD:/tmp -w /tmp compilerbook_x86_64 make clean
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
rm -rf chibicc tmp* test/line.exe test/constexpr.exe test/decl.exe test/variable.exe test/const.exe test/struct.exe test/arith.exe test/offsetof.exe test/varargs.exe test/typedef.exe test/asm.exe test/vla.exe test/builtin.exe test/cast.exe test/complit.exe test/pointer.exe test/enum.exe test/bitfield.exe test/macro.exe test/float.exe test/extern.exe test/function.exe test/union.exe test/compat.exe test/string.exe test/atomic.exe test/attribute.exe test/pragma-once.exe test/literal.exe test/usualconv.exe test/tls.exe test/alignof.exe test/alloca.exe test/sizeof.exe test/commonsym.exe test/unicode.exe test/stdhdr.exe test/initializer.exe test/control.exe test/generic.exe test/typeof.exe test/*.s test/*.exe stage2
find * -type f '(' -name '*~' -o -name '*.o' ')' -exec rm {} ';'

その後make testなどとすると、ちゃんと動くことが確認できる。

sbite@macbookair chibicc %  docker run --rm -v $PWD:/tmp -w /tmp compilerbook_x86_64 make test
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
cc -std=c11 -g -fno-common -Wall -Wno-switch   -c -o tokenize.o tokenize.c
cc -std=c11 -g -fno-common -Wall -Wno-switch   -c -o unicode.o unicode.c
cc -std=c11 -g -fno-common -Wall -Wno-switch   -c -o hashmap.o hashmap.c
cc -std=c11 -g -fno-common -Wall -Wno-switch   -c -o type.o type.c
(snip)
testing -MD ... passed
testing -fPIC ... passed
testing #include_next ... passed
testing -static ... passed
testing -static ... passed
testing -shared ... passed
testing -L ... passed
testing -Wl, ... passed
testing -Xlinker ... passed
OK

参考にした記事

zenn.dev

2021年の目標

これは何?

今年の目標です(Twitterに書く予定だったんですが,長くなってしまったので)

お気持ちが多いです

メンタルを健康に保つ

最重要目標です.メンタルが辛いとすべてが辛くなってしまうので...

2020年は今までと色々違ったこともあって,度々しんどくなりがちでした.今年は辛くなったらなるべく早く気分転換(運動する・実家に帰って猫を揉む・飲酒をするなど)をしていきたいです

人とコミュニケーションを取る

↑に関連して,人と話すと(めちゃくちゃ緊張するけど)メンタルが回復するなあと感じたことが結構あったので,なるべくコミュニケーションを取っていきたいです

研究をする

今期の必修を落とさなければ卒検着手できるはずなので,しっかりやっていきたい

自分が何をしたいかをはっきりとさせて,自分に合った研究室を選びたいです(難しそうだけど)

webで動く何かを作る

目で見える何かを作りたいなという気持ちがあるのと,フロントエンドができるようになると色々捗りそうなので

去年は神経衰弱を作りました

OSSの何かを作って,3ヶ月以上継続的に開発する

何かを作ろうと思い立って,ちょっと書いてすぐ飽きて放置というのを無限回やっているので,今年で克服したい....

蟻本/けんちょん本を読み込む(各章で登場するアルゴリズムや考え方が言えるレベルで)

どちらも持ってはいるんですが,斜め読みした程度なのでしっかり読んでいきたい

青diffまで埋める

2020年はstreaksを伸ばしていた時期があったんですが,最後の方は虚無埋めばかりになってしまったので,今年は難しく感じる問題もしっかり通していきたいです

参加記/色変記事以外の内容でブログを12本以上書く

セキュキャンに参加して,アウトプットをもっとしていきたい...!となったので

体を動かす系のゲームを合計200時間以上プレイする

去年は運動を全くしなかったので....健康な体を手に入れたい

体重を0.9倍にする

健康な体を手に入れたい(2)

TOEIC800点を取る(取れるくらいの英語力を身につける)

1年前に受けたときは750点くらいだったので,今年で超えたい

今の英語力だと洋ゲーの内容を理解したり,プログラミング言語チュートリアルを読んだりするのが結構辛いので,スラスラ読めるようになりたいです

プログラミングが関係する何かで社会から正のお金を得る

コードを書いてお金をもらうという体験が想像以上に良かったので,今年も何かをしたいです

n年後には社会に出るため,今のうちに慣れておきたいというのもあります

院/将来について決める

これしたくないな〜となってるんですが,いつかは決めないといけないため...

何を選ぶにしても,そこでやっていけると思える自信を持ちたいです

ICPC国内予選2020参加記

ICPC2020国内予選にizryt,nayutaとチーム「Cutting Tree」として参加しました.結果は3完81位で,ギリギリ予選通過ならずでした...
本番の様子を書いていきます.

開始前

  • 起床後,ライブラリと参考になりそうな記事を片っ端からダウンロードする.
  • 大学に行って糖分補給用にラムネとチョコレートを買う.なゆたさんと合流後,ライブラリを入れたUSBを家においてきたことに気づく(は?)

  • 急いで取りに帰って再び大学に戻り,いずらいと君とも合流する.
  • PCをセットアップしてるといつの間にか14:30くらいになっていたので,リハーサルをする.最後の問題が普通に解けなくてびっくりした.
  • その後は最初の問題の担当を決めたり,ツイッターを見ていたりして過ごした.

開始後

  • ログインしたらいきなりエラーになってめっちゃ焦る.運営の方に電話をかけようとした瞬間に問題が見えるようになる.
  • いずらいと君がAを,なゆたさんがBを,自分がCをみる.Aが爆速(3:17)で通されていてビビった.
  • Cをみて,Pの約数2つを全探索しか思いつかなくて辛くなる.とりあえず実装してテストケースを回すと無限時間かかる(それはそう).このあたりでBが解かれる(32:34).
  • 他に方針が思いつきそうにないので,頑張って高速化をする→実行する→遅すぎて止めるというループを繰り返す.
  • これ以上高速化できそうにない...となり,しばらく頭を抱えたあと,ふとターミナルを見ると実行が終了していることに気づく(は?).
  • 慌てて提出してCorrectをもらったので,もう一つのテストケースもぶん回して,ACをもらう(59:35)
  • Cの実装中にDが構文解析だということを聞いていたので,自信満々にDを読む.
  • 最初N<=8だと誤読していて,「O(N!)で常勝!w」となっていた.その後N<=16なのに気づき顔面蒼白になる.
  • 構文解析パートを実装して,とりあえずO(N!)解法(各変数に対して1~Nの順列を割り当てる)を書く.テストケースの実行が終わらない.
  • 「いくつかの変数に値を割り振ると,残りの変数への割り振り方によらず各式の値が一定になる」という場合があるということに気づき,その場合をまとめて計算するようにするも実行は終わらず.
  • この時点で枝刈りによる高速化に固執してしまい.残りの時間はずっとこれを考えていた.
  • 途中Fをみて「フローでは?」みたいなことを言うが嘘だった(は??)
  • その後も,高速化を試みる→テストケースで無限時間かかるを繰り返し,Dが解けないままコンテストが終わった.

個人的な反省点

  • Cを高速に通そうとして時間を食い,Dを枝刈りで通そうとして他の解法を捨てるという,本当に良くないムーブをしました.
  • 特にDは途中でいずらいと君が「bitDPでは?」と言っていたため,その時点で解法を考え直すべきでした.
  • チーム名のCutting Treeは「枝刈りをしてでも問題を通したい」という気持ちがこもっているのですが,実際には枝刈りで問題を通すには実力が必要(高速化の知識や現実的な時間内に終わるかの見積もりが必要なため)だと痛感しました.

AtCoder青になりました

先日行われたABC166で青色になりました!

精進グラフはこんな感じです。 f:id:sbite:20200506015828p:plain 水色になったのが2018/10/6なので、そこから一年半ほどかかったみたいです。

やったことや感想を書きます。

やったこと

とにかく問題を解く(精進)

青になれた要因の95%ぐらいはこれだと思います。レートが上がるには問題が解ける必要があるため…。
精進方法は十人十色だと思うのですが、僕は結構ゆるくやっています。具体的には一日に一問以上を解く(difficultyは問わない)というのを今年の1月から続けています。これはもともと自分が精進を全くしないタイプだったので、下手にハードルをあげても三日坊主になるのでは…?と思ったからです。解きっぱなしではなく、解いた後に解説や他の強プロerの提出を見るようにしています。大抵の場合自分よりエレガントな考察・実装になっていて参考になるからです。(例えば これ とかで、僕はこの問題を脳死クソ長ダイクストラで解いていたのですが、制約が小さいのでワーシャルフロイドを使うと実装が軽くなります(解説解))
最近はよるかつを覗いて、AC済みの問題を頭の中でとき直したりしています。これも効果があると感じています(一回解いたきりだとどんどん忘れていくため…)
精進を始めたきっかけなのですが、学科の同級生によるところがとても大きいです。その人が今年のはじめにAtCoderを始めたのを知り、「自分も頑張らんとなー」と精進を始めた経緯があります。それまで同学科同学年でAtCoderをやっている人は(自分の観測した限りでは)いなかったため、とても嬉しかったです。普段同じ授業を受けているということもあり、ライバル心が謎に生えたのも覚えています。ありがとう。

レートを気にしない

色変記事を書いておいては?って感じなんですが、最近のコンテストはレートをあまり気にしないようにしつつ参加しています。理由は単純で、自分の性格上レート(や順位)を気にしていると問題を解くことに集中できないからです。
以前の自分はすぐに解けなさそうな問題に出会ったとき、「解けない…このままじゃパフォがやばい」「この時点でこの完数じゃ冷えるだろうな…」「〇〇さんはもうN完している…。☓☓さんにも追い抜かれそう…」といった考えで頭がいっぱいになり、問題の考察をまともにできないことがよくありました(今でもあります)。また、レートをあげたいがために欲を出して、その結果大失敗することもありました(あります)。
最近でこれになったのが日立コンで、前日のABC158で温まりレートが1500を超えていた僕は「この勢いのまま今回も温まりたい、そのためにはC問題を解く必要がありそう→Cから解くか!」といったことをやりました。その結果がこれです。 f:id:sbite:20200506020231p:plain

50分かけて書いたCが見事にWAで、「やっちまった…」となりました。その後のことはよく覚えていません。
†0完太陽パフォ17†を経験して、「レートを意識しすぎるのは(自分の性格的に)良くないな」と感じるようになりました。
精進でRPSやAC数などレート以外の競プロに関する数字を増やし始めたのも、レートを気にしないようになったきっかけの一つです。特にRPSは精進グラフで単調増加な様が見れるので、冷えたときも「でも僕(精進)青上位だし…」と自分を慰めやすくなります(あんまりRPSと実レートが乖離していてもそれはそれで悲しいのですが…)。もちろん今でもレートが下がると悲しいし、色変間近だと緊張もします(今回のABC166もまさかここで青になれるとは思っていなくて、だからこそリラックスして取り組めた感があります。仮にこのABCにレート1599で挑んでいたら、また違った結果になっていたかもしれません)。それでも、以前と比べて「実力がついていればレートは自然と上がっていくから、まずは実力をあげよう。そして落ち着いて問題に取り組もう」と思えるようになりました。

感想(ポエムポエムしています)

青になれたことはもちろん嬉しいのですが、一年半かけて一つの目標を達成できたこと自体が本当に嬉しいです。飽きっぽい性格なので、こんなに長く続けられるとは思っていませんでした。
他の人にたくさん助けられたなあという気持ちがあって、特に弊学最強erであるところのりーふさんに出会えたことは本当に幸運でした。それまでは自分の中で空想上の生物だった暖色コーダーを目の当たりにすることで、「自分のすぐ近くにこんなにすごい人がいるんだ、少しでも追いつきてえ」となった記憶があります。また、ICPCで一緒にチームを組んでくれたえだまめさん、なゆたさんの存在もとても大きかったです。この方達がいなかったらhighest-216を達成したあたりで心が折れていたかもしれません。本当にありがとうございます。
…ここまで色変記事を書いてきたんですが、正直なところまだ青になった実感が無いです。自力で上がったと言うよりは、最大級に上ブレしたという感じなので…。しばらくはコンテストに出つつ精進して、青維持できる実力をつけていきたいと思います。 また、競プロ(アルゴ)以外にも、競プロ(マラソン)や開発、CTFなどもやっていきたいです。どれも無理せず楽しみながらぼちぼちやっていけたら良いなあと思っています。あと、何かしらの文章を書いて公開していくやつも定期的にしていきたいです(この記事を書くのに丸3日かけてしまったので…(は???))

最後まで読んでいただきありがとうございました!!!