人生2.0

「いい話」を集めて生きていきたい

英検1級の二次試験に2回落ちた話

お久しぶりです、jgvt5tiです。

今回は英検に落ちたという話です。まあスピーキングの能力が足りないので真っ当に落ちたというだけの話ですが、経緯とかお気持ちとかを語りたいと思います(ブログなのでね)

試験結果

まず試験結果はこんな感じです。

一次試験の結果は2022年度第一回の結果で、二次試験(スピーキング)は第三回の結果になります。

第一回試験

スピーキングは準一級にギリ合格レベルでしかなかったので、初回の試験は一次試験合格までいければいいと思い、ひたすら語彙を対策しリーディングだけは素点で9割取れました(これは結構すごいと思っている)。二次試験は模試を数回分やっただけで、普段から英語を話す習慣がないので案の定ボロボロでした(16/40)。試験中は試験官の困惑した反応が苦しかったです。

TOEIC

これは本筋とは関係ないのですが、第一回試験合格時の英語力は多分私の歴史上最高になったので、8月のTOEICでは930点を取ることができました。英検のモチベが下がった理由として英検以外の形で満足のいく結果を残せたことで、満たされてしまった節もあります。

第三回試験

一次試験が終わった当初は3ヶ月以上はオンライン英会話をした上で準備をして受けようと思ったのですが、いざ後期が始まると研究・授業・就活などがあり心の余裕がなくなってしまいました。結局オンライン英会話は春休みの1ヶ月だけしかしませんでしたし、試験対策もほぼ一夜漬けでした。なので当然ほぼ同じ点数(19/40)で落ちました。参考書で見たテーマ(安楽死は認められるべきか)が出たのにも関わらず、うまく喋れなかったのは後悔が残ります。

はてなリモートインターンシップ2022に参加しました

夏休みの三週間(8月末から9月の頭まで)の期間にはてなリモートインターンシップに参加したので参加記を書こうと思います。

講義パート

インターンの最初の4日間は講義パートでした。講義パートではそれぞれ1時間ほどの講義とマイクロサービスを実装する課題の2つがありました。

講義内容は

  • Web API
  • インフラ
  • コンテナ
  • マイクロサービス
  • RDBMS
  • フロントエンド
  • Kubernetes
  • デザイン

の8つで、どれも基礎からの理解が深まるようなものでした。内容が濃くまだ理解できていない点もありますが、これから必要になるであろう知識の足がかりになったのでとても有益だったと思います。

課題では慣れないGoやKubernetesを使用しましたが、メンターさんからの助けもあり無事動作するところまで実装できました。長時間ぶっ通しでのコーディングは大変でしたが、知らない技術を使ってサービスを作るのは刺激的で楽しかったです。

実践パート

実践パートではそれぞれのチームに分かれてタスクを進めました。私はMackerelチームに配属し、id:tosukeeさんと共同でペアプログラミングなどをしつつ作業を進めることになりました。

課題の内容はMackerelにおけるホスト(監視されるサーバーなど)を一括で退役(削除のようなもの)する機能を追加することでした。

技術としてはScala(Play Framework)とTypeScript(React)を使用しました。Scalaは大学の講義などである程度慣れていたのですが、TypeScriptとReact(特にReact Hooks)には不慣れだったので、メンターさんやtosukeeさん含めてチームの方に助けてもらいつつ作業をしていきました。

途中ホストを選択するためのチェックボックスが関係のない場所に表示されるなどのトラブルがありましたが、tosukeeさんやチームの方々の高い技術力によって無事乗り越えることができ、リリースへと至ることができました。

mackerel.io

その後1,2日ほど余裕ができたので私は公開APIの方でもホストの一括退役ができるようにバックエンドの実装を追加しました。

mackerel.io

また、リリース後早くもTwitterなどから反応を得ることができ、中には「神機能」とまで評価してくれた方もいたのでとても嬉しかったです。

終わりに

はてなインターンは全体を通して学ぶことがとても多かったです。それは単純に技術面で知識が深まっただけではなく、他のエンジニアさんやデザイナーさんとのコミュニケーションの取り方といったエンジニアとして普遍的な能力も高まったと思います。インターンのキャッチコピーにある「10年後の自分を作る」という言葉が本気に感じられる充実した体験でした。このような機会をいただけてはてなの皆様にはとても感謝しております、ありがとうございました!

余談

はてなのアカウントに設定しているアイコンはこのインターンに参加する上で著作権上絶対問題がないアイコンを用意するために5秒で作ったものです。 自己言及文的で気に入っているのでこれからも使っていこうと思います。

Rust+wasmで動くProlog処理系を書いた

完成したものは僕のGitHub Pagesで公開しています。 連言やカットなどの機能は省略したのでほぼ導出原理(の証明の探索)そのままになっています。

Prologの文法

Prologのプログラムはホーン節と呼ばれる述語論理の論理式の列から成ります。さらにホーン節は仮定を表すプログラム節と質問を表すゴール節の二種類に分けられます。 プログラム節の文法は

 A :- B_1, ... , B_n.

または

A.

のような形をしており、それぞれ「B_1からB_nがすべて成り立つならばAが成り立つ」と「Aは無条件で成り立つ」という仮定を表します。 ゴール節の文法は

C_1, ..., C_n.

の形であり、「C_1, ... ,C_nは充足可能か?もしそうならそのような代入を求めよ」という質問を表します。

例えばプログラム節が

p(X) :- q(X), r(X).
q(a).
r(a).
p(b).

でありゴール節が

p(X).

であったならば答えはX=aとX=bという代入になります。

処理系のアルゴリズム

Prologの処理系は事前にプログラム節を読み取り、ゴール節で与えられるクエリを投げられたときに、そのゴール節を充足させるような代入を探索します。これは導出原理の証明図を探すことに対応します。述語論理の充足可能問題の決定不能性からこの探索は停止する保証がありません。

アルゴリズムとしては以下のような深さ優先探索です。

  • ゴール節が空なら充足可能でその時点での代入を返す

  • ゴール節が空でないならその中から論理式(Cとする)を一つとる

    • プログラム節の結論の中でCとマッチするものがあるならCをその節の仮定に置き換える

先ほどの例で言うと、 ゴール節のp(X)はプログラム節p(b).とp(X) :- q(X), r(X).の結論にマッチします。 前者の場合は仮定が存在しないのでゴール節が空になり探索が終了し、X=bという答えが出ます。 後者の場合は仮定があるのでゴール節がq(X)とr(X)に置き換わり探索が続きます。 q(X),r(X)はそれぞれq(a),r(a)とマッチするので探索は終了します。

このマッチするかを判定するアルゴリズムは単一化と呼ばれMLの型推論などにも用いられています。

実装

字句解析・構文解析にはpegを使いました。nomの方が慣れていたのですが、「大文字の列」などを認識するのが面倒だったのでpegを採用しました。 ソースコードのRust側はこちらにWasmを利用するJavaScript側はこちらに公開しています。

東京大学大学院コンピュータ科学専攻に合格した話

今更ですが大学院入試に合格した話です。自分自身いろんな人の体験記を参考にしてたので、後世の誰かのために対策とか軽く振り返ろうと思います。

書類選考

情報理工学系研究科では出願時に研究計画書とTOEFL iBTのスコア提出があり、そこで書類選考(足切りのようなもの)があります。

研究計画書では十分な知識があるアピールをしながら、研究したいことをおおまかに書きました。参考文献としてその道で有名な本や志望ラボの教授の論文などを引用しました。

TOEFLは70点しかなかったので不安でしたが無事書類選考は通過しました。書類選考で落ちてる人も割といたので研究計画は真面目に書いた方がいいと思います。

数学

数学に関してはB1の頃の教科書である

  1. 齋藤正彦「線形代数
  2. 吹田新保「理工系の微分積分学

などを読みつつ過去問を東大東工大それぞれ5年分を解きました。

情報理工の数学は主に工学部向けなのか、特異値分解など慣れない題材が多かったので過去問はボロボロでした。ただ微積線形と最低限の確率統計の知識で解ける問題を解けば合格はできるんじゃないかと思います。

専門科目

参考書リストは大学院のページに載っているのですが、それを全て読むのは時間的にほぼ不可能な上に、本の演習問題より遥かに難しい問題がゴロゴロ出るので、外部生にとっては厳しい科目だったと思います。自分自身もあまり解けなかったので参考になるか怪しいですが一応やったことを書いておきます。

オートマトン

Sipser「計算理論の基礎1」を読んで演習問題も8割くらい解きました。過去問は割と解けたのですが本番のオートマトンの問題は難しくコケました。

アルゴリズム

過去問や内部生が受けてる授業のシラバスを参照し、該当範囲をアルゴリズムイントロダクションで学びました。昔競プロをやってたので自信はあったのですが、本番は難しくコケました(2)。

論理回路・コンピュータアーキテクチャ

坂井先生の本を読みました、本番一応答えはほとんど書きましたが、多分あんま合ってないです。

OS

Operating System Conceptsの中で過去問で扱われた題材(排他処理やメモリ管理)を読みました。本番は過去問とそっくりな問題が出て割と解けた気でいます。

機械学習

一応過去問にあったので杉山先生の「統計的機械学習」を教科書にしている授業をとって勉強しました。本番は出題されなかった。

面接

筆記の出来などを聞かれました。面接自体は5分ぐらいで終わりましたが、オンラインだったせいか待機時間はやたら長かったです。

総評

ボロボロの出来だったのですがなぜか合格できました。多分合格最低点も高くない(5割あるかわからないくらい)なので、過去問の得点率が低くてもめげずに基礎問題を確実に解けるようにするのがいいのかと思います。