ntk log ntk

競プロや非競技プロのやったことを書いています.

Twitterから見るshojin_proの歴史

adventar.org

この記事はでぶ Advent Calendar 2022の6日目の記事です。

shojin_debuさん(@shojin_pro)さんを知っていますか?

この記事はTwitterでのshojinさんのツイートを振り返り、その歴史をお伝えします。

shojin_proの始まり(2020年)

2020年4月頃、shojinさんはJavaや英語の精進のためにTwitterを開設したと言われています。その様子は この辺り のshojinさんに送られたリプライから見られます。

2020年5月末になるとてりーさんなど競プロerとやり取りしていることから、競プロ関係のフォロワーが増えていったようです。後で再度書きますが、shojinさんは一度Twitterアカウントを削除しているためツイートが消えている期間があります。しかしその期間であっても、shojinさんへのリプライからどんなやりとりがあったか見ることができます。

[ここにshojinさんのツイート]

消えている部分は「なんや😡😡😡😡😡」で補完すれば会話が成立しそうです。

また現在のTwitterの名前はshojin_debuになっていますが、今では貴重なshojin_pro時代をスクショしたツイートもありました。

お化けな方がおっしゃる「しなないで」には重みがありますね……。

またshojin_debuという言葉の初出は2020年9月22日のようです。

shojin_proの記念日

shojinさんの歴史を語るのに欠かせない日を紹介しましょう。覚えておくべき日は二つあります。

shojin_pro生誕祭(11/2)

お化けに生誕祭はあるのか?と昔思ったんですが、shojinさんにぴったりな日のようです。

毎年 #shojin_pro生誕祭 #お絵描きデ部のタグでツイートを多く見かけます。普段は#お絵描きデ部しにくいなあ、という方もこの日には描いて投稿しやすいかもしれません。#お絵描きデ部についてはshojinさんが書いた記事(【でぶ基礎知識】#お絵描きデ部というハッシュタグをご存知ですか? - でぶ脱却日記)を読んでください。

shojin_pro復活祭(10/27)

生誕祭に対し、こちらはまだあまりメジャーなイベントではありませんが、おさえておくべきイベントの一つです。というのも2021年5月31日、shojinさんはアカウントを消してしまいます。このときからなんや😡の影を追う人々がTwitterに続出しました。

消した当日のみならず、一か月、数か月経ってもshojin_pro復活を待ち望む人々が絶えませんでした。

そのshojin_pro復活を願ってやまない人々の期待に応え、2021年10月27日、shojinさんはついに復活します。このときの感動は今でも思い出すことができます。本当に嬉しかったですね……。

それからはまた以前のようにshojinさんにたくさんのリプライを送ることができるようになりました。

これを読んでいるみなさんも今日からたくさんshojinさんにリプライをしましょう!

おでぶなお化けよ永遠であれ!

明日のでぶ Advent Calendarはからあげさんによる「あすけんの女の人と一月戦った結果」です。

就活ポエム

プロフィール

ntk (@ntk_ta01) です。2年くらい前まではAtCoderのアルゴをよくやっていて、最近はヒューリスティックなコンテストによく参加しています

中央大学のM2、専攻は情報系、研究室ではスケジューリングなどの最適化をやっています。

プログラミングは競プロ以外を学部時代にやっておらず、就活開始時にWeb開発などを勉強し始めました。したがって、学部時代のインターンやアルバイトでの開発経験はありません。

本選考の結果は6社ほど応募して1社から内定をいただきました。サマーなどのインターンは5社ほど応募して3社合格をもらい、選考スキップも含めて4社のインターンに参加しました。

この記事は何?

B4の3月からM2の4月くらいまで就活をしていたので、それを振り返るポエムです。就活は多くの人がやると思うんですが、「気づけば周りがみんな就活をしているが、自分は就活のことを何も知らない……」みたいなことも珍しくないと思います。自分が就活してきて苦労した点や良かった点を書き残すので、数年以内に就活をすることになりそうなフォロワーの役に立てば幸いです。

対象読者

  • Twitterのフォロワー
  • 競プロerフォロワー
  • Web系ソフトウェアエンジニア職を目指すフォロワー
  • 開発経験のないフォロワー

また注意ですが、自分はWeb系のエンジニア職でしか就活をしていないので、それ以外の業界を見ている人の役には立たないかもしれません。

就活一般について

他の就活記事を読んでいると、なんだか社会のことをわかっている前提で書かれているものも多いです。大きい企業とベンチャー企業ってのがあるんだな、くらいしか知らなかった勢としては知識不足感が最初はすごいです(今もそうですが)。そもそも就活ってなにをすればいいのかわかりません。

どうやら就活は、

  1. 行きたい企業を見つける

  2. 企業の選考に応募する

  3. 面接や試験などの選考をこなして内定をもらい、内定承諾をする

というステップで構成されているっぽいです。複数の内定をもらってから、内定承諾をする企業を選ぶステップが存在する人もいるらしいです。

AtCoder Carrer Designの就活講座を読むと、就活一般についてもう少し詳しくわかる気がしますが、Web系エンジニア職以外の情報も広く落ちている印象のサイトです。

行きたい企業を見つける

振り返ると、この最初のステップが一番大事だと思いました。

とりあえずサポーターズやLabBaseを活用して企業を知るとよいです。知るとよいポイントは名前、何をやっているか、働いたらどんなことをするか、どんな人が働いてるか、休みや制度または給与はどれくらいあるかなどです。

talent.supporterz.jp

compass.labbase.jp

TLや就活記事で名前を見る就活サービスのxxナビやpaiza、wantedlyあたりは使いませんでした。AtCoderJobsも使いませんでした。AtCoderJobsを眺めるのはお手軽なので使ってみるべきかもしれません。

サポーターズは1on1面談という逆求人イベントが非常にオススメです。1日に複数社の話を一気に聞いて比較すると、行きたい会社や行きたくない会社が少し見えてきます。またこのイベントからインターンや本選考の招待がもらえたり、企業とさらに面談して情報がもらえることもあるのでとてもよいです。さらにサポーターズのこういったイベントに参加するメリットとして、めちゃくちゃアマギフがもらえます。僕もゲーミングチェアを買いました。

LabBaseだとサポーターズにないような企業とも面談をすることがあり、企業の比較に役立ちました。ICPCのスポンサーになっている会社や大きい会社の情報システム部門みたいなところと話したのですが、Web系のがやっぱり良いな……という気持ちに自分はなりました。

あとAtCoder Career Design Dayというイベントもオススメです。自分が最初に出たイベントはこれだった気がします。Connpassのイベントとかもチェックしているとよいです。

ただ採用イベントで話を聞いただけだとわからないことも多いです。よって、自分は調べた会社の中から複数社のインターンに行きました。インターンの応募は、企業の採用ページを見に行くと募集ページがあったりします(採用ページの例)(募集ページの例)。

インターンに行くメリットとデメリットは以下の通りです。

メリット

  • お金がもらえることがある
  • 開発経験ができることがある
  • 就活している友達や知り合いができることがる
  • 成長できることがある
  • 実際に働くイメージが持てることがある

デメリット

  • 忙しい
  • 就活としてやることが増える

インターンに行っていない企業より、インターンに行った企業だと実際に働くときのイメージが段違いで持てます。自分は本選考に応募する時点でインターンに行った企業のいずれかから行く企業を決めることにしていました。

インターン参加記事一覧

またインターンに参加した際は企業側に確認を取って上のような参加記を書くと、その後の選考で「参加記を読んでください」が使えるのでとても便利です。業務の内容は話せないことも多いですし、インターン参加の数か月後には忘れていることも多いです。本選考で話せるように参加記を書くのはオススメです。

就活のスケジュール

と、就活のステップを紹介しましたが、どの時期に何をしたらいいでしょうか? AtCoder Career Designの以下のページを見ると、エンジニアに関わる就職活動スケジュールイメージのITベンチャーの辺りがこの記事でのスコープなのですが、企業や人によってまちまちなので情報としては何も得られない感じがします(え?)。

career.atcoder.jp

ということで自分のスケジュールを紹介しますが、B4の2月に就活を意識し始めて、最初はサポーターズの技育祭やAtCoderの就活イベントに参加しました。 その後M1になる前後でサマーインターンに応募をはじめ、M1の8月~10月はインターン、11月くらいから本選考に応募をポツポツと始めました。 M1の2~3月もインターンをし、3月に内定をもらったので4月に内定承諾をして就活を終了しました。番号付きリストにすると以下の通りです。

  1. サポーターズに登録する

  2. なんかwebアプリを1個作る

  3. サポーターズの1on1面談(春)に出る

  4. 3週間~1か月のインターンに行く

  5. サポーターズの1on1面談(秋)に出る

  6. 3週間~1か月のインターンに行く

  7. 本選考を受けて内定をもらう。内定承諾をして就活終了

他にも説明会や勉強会に少し出たり、何社かと面談もしました。

サポーターズ1on1イベント Tips

何回か名前を挙げていますが、サポーターズの1on1イベントとは、1日で複数の企業と話すイベントです。春と秋にそれぞれあり、春はサマーインターン募集、秋は本選考募集をしている印象でした。

イベントの流れとしては、まず午前に企業紹介を聞き、午後は企業と学生でマッチングを作って2社から8社ほどの企業と1on1で話す感じです。

午後の1on1で企業の人とつながりを作れることがあり、イベント後も連絡を取ることやインターンへの招待をもらうことがありました。

24卒向けのサポーターズのリンクを貼っておきますが、しばらくすると消えそうです。申し込み可能イベントもほとんど締め切られています。

lp.supporterz.jp

学生からのフィードバックを受けてイベントの進行が変わることもあるかもしれませんが、自分が参加したときからのTipsをまとめます。

  • 選抜制のイベントなので、応募時は成果物や実績を書いておくのが大事。

  • 1on1後に企業からもらえるフィードバックを残しておくとよい。インターンや本選考の応募時や面談時に使いまわせるため。

  • Zoomのチャット欄に貼られるリンクとかをパッと保存できるようにしておくとよい。

  • 第一志望の企業などはその後の選考などで関わる機会もあるので、1on1をした場合には面談した人の名前などをメモっておくと忘れなくてよい。

  • 面談をする人に完全に依存するけれど、面談をする人が人事かエンジニアかで、聞ける話は結構違う。面談の練習になるので、今後の選考の時に役立つよう反省点やよかったことはメモっておく。

  • 前日までに各企業にしたい質問を考えておくとよい。

  • 今後応募するときに、このイベントで話したことを書いておくとよい。

オススメ書籍

  1. 21世紀最強の職業Web系エンジニアになろう AI/DX時代を生き抜くためのキャリアガイドブックの通販/勝又 健太 - 紙の本:honto本の通販ストア

  2. Webを支える技術 ―― HTTP,URI,HTML,そしてREST:書籍案内|技術評論社

1 は大学の先輩に教えてもらった本なのですが、Web系エンジニア周りの職業をザッと知るのに役立ちました。 2 はWebアプリを作るとき、最初にコレを読むのが良い気がしています。

感想

Web系エンジニア以外の就活をしなかったかつコロナがまだまだ落ち着いていない時期の就活だったため、就活を全てオンラインで行えたのは楽でした。スーツも買わなくてすみました。面談やESも最初は慣れなかったのですが、数をこなしていたらそんなに力まずともこなせるようになっていました(就活サービスや他の選考で書いたやつをコピペできるようにしておくとよい)。第一志望と決めた企業の合格を待っている時期だけ少し辛かったですが、就活を通じて友達ができたりお金がもらえたり業務でのプログラミングをしたりと自分は就活をしていた1年間を楽しめました。1年前はフロントエンドとバックエンドの違いもよくわからず、Gitも使えなかったんですが、まあバックエンドエンジニアとして働いていけそうなところまで来れてよかったです。

自分のやったことが少ない!と思う人もいれば、多い!と思う人もいると思います。"就活 はてなブログに投稿しました"とTwitterで検索をかけると他にも就活記事がいい感じに出てきます。他の人の就活記事も参考にしてみてください。また個別の社についてや自分の会社選び基準などについては詳しく書きませんでしたが、気になる学生のフォロワーは声をかけてください。昔から繋がっている何人かのフォロワーとは就活話をちょこちょこしています。

就活はマッチングとよく聞きますが、合わない企業とお話することが圧倒的に多かったです。合う企業と巡り合う運が必要だと感じました。自分はそういう点で運があって、満足できる結果になったと思います。競プロが好きだったりよくTwitterにいるようなフォロワーは自分と価値観が近い場合もあるかもしれません。ぜひ気になるフォロワーは通話などをしましょう。Apexからでも構いません。

いろいろと参考になるため、開発経験の多い人ですが下の記事を読むのもオススメです。判断基準の部分などは結構わかるなあ、と思って昔読んでいました。参考リンクが多いので、ここから他の人の就活記事を探すのもいいでしょう。

blog.p1ass.com

こういう話題をした後は欲しいものリストを貼ってもよさそうなので貼ります。ところで自分は5月6日が誕生日です!誰か祝ってくれると嬉しいです!

www.amazon.jp

ととりにゃあは実在するのか?

adventar.org

この記事はととりにゃあ Advent Calendar 2021の12日目の記事です。

ととりにゃあ Advent Calendar 2021ではととりにゃあについての記事が多く書かれていますが、ととりにゃあが存在するかという疑問を持ったことはないでしょうか?その存在について、Twitterではいくつかの噂が観測されています。

なんかコレを見ているといないのか…?みたいな気持ちになります。この謎を解明するため、我々取材班は競プロ忘年会へ向かいました。

f:id:ntk_ta01:20211211194531j:plain

会場の秋葉原UDX。朝10時は早かったなあ……。

f:id:ntk_ta01:20211211194540j:plain

ウオ~本日の催事にワクワク。ワクワクして午前中はLTを聞いてたらととりにゃあを探せなかった。取材班不覚。しかし取材班を救うようなととりにゃあエンカウントチャンスツイートがTLに流れてきた!!

これは行くしかねえ!すぐにモジャンボさんにリプを飛ばして合流場所へと向かった。

合流場所には想定よりも人がいっぱいいて、しかもじょえさん、けんしんさん、おぎんぎんさん、ふっぴーさんというメンツでめちゃくちゃビビった。が、そこには居た。ととりにゃあが居たのだ…!

f:id:ntk_ta01:20211211194557j:plain

ntk「ととりさんですか?」

ととり「はい」

取材班感動の瞬間である。無事ととりにゃあを観測し、その存在を確かめることができた。その後ととりにゃあは鶏白湯を食べたり懇親会でスマブラをしてた。

結論:ととりにゃあは実在した。


余談:今年3月のICPCアジアのGatherで酒飲みながら話したことがあったので久しぶり、の気持ちだった。

マネーフォワードのサマーインターンに参加しました!

2021/10/04から2021/10/29までマネーフォワードのマイクロサービスチームで短期インターンに参加しました! f:id:ntk_ta01:20211028180341j:plain

インターンに参加した経緯・目的

  • サポーターズの1on1逆求人イベントで会社を知り、何度か面談しているうちにいつの間にか参加することになっていた(え?)。
  • 参加前に考えていた目的は二つ。

    1. マネーフォワードの組織や文化の理解。
      • どんな事業をしていて、どんな風に働けて、どんな人がいるのかを知りたかった。
    2. 業務での開発経験を積む。
      • 参加するアルバイト・インターンとしては3社目だが、まだまだ経験が足りないので働きたかった。

インターンのイベント・取り組んだこと

今回のインターンでは次のようなゴールが設定されていました。

  • Goやマイクロサービスに関する経験を得る
  • 業務としての開発を体験する
  • マネーフォワードの雰囲気や大事にしていることを知る

これに加えて、タスクの完遂が優先事項でないと明記されていました。そのおかげで社内wikiを読み漁ったり、気になる社員さんのslackのtimesを見て面談を申し込むなどの組織理解に時間を割くことができ、非常によかったです。

そしてインターンで取り組んだこととしては以下の4つです。

社内wikiを乱読したのは初めてでした。リモートワークに対する知見(非言語で欠落する情報を意識するとか)や考え方(現在マネーフォワードでは緊急事態宣言下でなければ週1以上出社するルールがある、詳しくは下のリンクの記事に!)から、ゴミの捨て方やシュレッダーに紙くずがたまった時の処理方法まで読めて面白いと感じました。

note.com

とはいえメインで行っていたのはインターン生向けタスクです。

認証機能開発タスク

内容

銀行やその支店情報を管理するサービスで提供されているAPIに認証機能を追加しました。これによりグループ会社がインターネットを経由してAPIにアクセスできるようになります。このサービスはさまざまなプロダクトから利用されることが想定されています。

開発

gRPC interceptorで受け取った認証情報とデータベースで保持している認証情報を確認する機能を実装しました。今回機能を追加するプロダクトではクリーンアーキテクチャが採用されていたため、各層の役割を意識しながらコードを書きました。DBのテーブルを定義し、データモデルとドメインモデルを作成し、 DAO、repository層やusecase層を作成し…と言った具合です。またレビュワーの負担を減らせるようにプルリクエストを小さく小さく作ることを意識しました。例えばDAOなどもまずインターフェースを切り出してから、実装していました。 また上の機能とは別の認証情報を管理するAPIで利用されるような認証情報を作成・削除するようなDAOやrepository層のコードなども書きました。作成したデータモデルから利用が想定されるコードであり、新たにAPIを追加するのも容易であると考えています。

経験できたこと

  • Goでクリーンアーキテクチャを意識してコードを書いたこと。
  • 新しく入ったチームでのコードを読んで理解すること。
    • わからないことはもちろんいつでも聞けたが(slackやdiscordで質問する機会は多くあった)、タスクの完遂は優先事項でなかったのでコードをじっくり読むことに多く時間を割いた。
  • gRPC interceptorを使って認証機能を挟むこと
    • gRPC interceptorを知らなかったので触れることができてよかった。

今度の課題

  • テストの書き方やエラー処理についてわからないことが多いので勉強していきたい。
  • 何度かクリーンアーキテクチャには触れているが、そろそろ積んでいる実戦ドメイン駆動設計の本を読んでしっかりインプットしたい。
  • 出したPRのCIがlint errorでfailしていると嫌な気持ちになるので自動化などについても勉強したい。

大学の授業が始まってからのインターン参加だったため、不規則なスケジュール(朝2時間業務してから午後授業に出て夕方から3時間業務をするなど)でしたが柔軟に対応していただき助かりました。また面談で聞いた社員の方のさまざまな経験や今回機能を追加したサービスのデータの背景など、文章が長くなってしまうために書かなかったことは多いですがマネーフォワードについて多くのことを知れました。タスクを通して確実に力のついたインターンであり、楽しかったです。約一ヶ月ありがとうございました!

VOYAGE GROUPのインターン、Treasure 2021に参加した

8/9(月)〜8/27(金)の3週間、株式会社VOYAGE GROUP(以下VGと略します)のTreasureに参加してきました。

参加学生のtask4233くんの参加記を読むと、どんなことをしてきたか書かれているのでそちらを読んでください。

task4233.hatenablog.com

ありがとうございました。



















これだけじゃしょうもない記事すぎるのでもう少し何か書きます笑

taskくんが書いてなさそうなこと、自分自身のことや自分が感じたことなどを書きます。来年インターンに行く人の参考になれば幸いです。

参加前

自分は今年の2月くらいまでは競プロと研究しかしていなかったのでWeb開発のことは何もわかりませんでした。5月にはwebアプリを一個作りましたが(AtCoder Merge Grassを作った - ntk log ntk)、Treasureの面接は4月の頭だったので何をアピールして受かったのかあまり覚えていません(え?)。webアプリの開発をし始めたことと競プロ頑張ったことくらいしかアピールできなかったはずなので、それで乗り切ったんだと思います。AtCoderICPCありがとう!

参加までに何をしたか

ISUCONに出ることを決めたのもあって6月くらいからTour of Goを触るなどGoの勉強をしていました。ただ研究もあったのでGoでアプリを作るとか100問競プロの問題を解くとかはしてません。しかしこのインターンはめちゃくちゃサポートが手厚かったので7月に出た事前課題をこなすと自然とインターン本番で書ける程度のレベルにはなりました。事前課題はGoだけじゃなく、ReactやAWSの課題もありました。具体的にはベースとなる記事を投稿できるアプリがあって、それの環境構築をしたり機能を少し追加したりするという課題です。わからないところはSlackで聞けて、課題を提出するとレビューももらえたので事前課題だけでもGoの書き方やReactのhookについてなど学びがありました。

あとDB講義の事前課題として本を買ってもらえたので読みました。面白い本でした。

参加直前に届いたプレゼント

お菓子や食べ物(3袋分)、Tシャツやモンスターなどいろいろ届いてびっくりしました。

f:id:ntk_ta01:20210830160851j:plain

インターン、参加!

講義以外でのよかったこと

オンラインのインターンでしたが、他の学生や社員の方と交流ができるように雑談の機会が多く設けられていました。他社インターンハッカソンへの参加経験がある人や自分同様にチーム開発経験のない人、また競プロ勢などいろいろな学生がいましたが、けっこうな人と仲良くなって他社のインターンのことを聞けたり就業時間後にAmong Usをしたりと楽しかったです。社員の方とは座談会があってVGのことを詳しく聞けたり、LT会をしているのを聞きに行ってキーボードのことについて詳しくなれたりで楽しかったです。

↓とか買ってみようかな~

adskbcc CorneCherry 半田付けの要らない42キー自作キーボードキットbtoshop.jp

学んだこと

Git、GitHubを用いたチーム開発

チーム開発について全てを学びました、なんてことはないのですが、マジで1mmもチーム開発したことない人間がGitHubってこうやって使うんだ~を少し学びました。

具体的には「pull requestを小さく作って開発を回す」「prには何が実現されるか、なぜそれを入れるかなどをレビュワーにわかりやすいように書く」「GitHub Actionsを使ってmainブランチにマージする前にコードのビルドが通るかチェックするなどCI環境を作る」「切ったブランチに最新のmainの変更を取り込みたいときは"git rebase -i main"」などです。

今までGitやGitHubは雰囲気で使っていたのですが少しは理解が深まったかと思います。

APIファーストなバックエンド開発

5月に作ったWebアプリのバックエンドは「なんか必要そうなAPIのコードを書く!」と行き当たりばったりで開発していたのですが、インターンではAPIを設計することを体験しました。例えば講義ではユーザが記事を投稿できるようなアプリを扱ったのですが、ある記事にコメントする機能を追加するのをAPIから考えました。APIを考えるとは、アクセスするためのURIを考えたりHTTPメソッドは何にするか、レスポンスやHTTPのStatus Codeは何を返すかなどを決めることだと今のところ理解しています(違うかも)。

さらにただ考えるだけでなくコードを書く前にSwaggerというAPIのドキュメントを生成するツールを用いました。swagger.yamlをstoplight studioにて編集してコマンドをたたくといい感じにコードを生やしてロジックを書く部分に集中させてくれました。

まだまだAPIのことやswaggerのこと、あとバックエンドのアーキテクチャのことなんかもわかってないので勉強していきたいです。読みたい本↓

www.oreilly.co.jp

AWS Lambda

自分だけで開発していても触る機会のないようなAWSのLambdaを使えるようになりました(たぶん)。これはチーム開発のアプリで24時間に1回くらいある処理を走らせるために導入しました。自分のメモも兼ねて書きますが、

サンプル関数コード - AWS Lambda

.zip ファイルアーカイブを使用して Go Lambda 関数をデプロイする - AWS Lambda

あたりに従って、コードをアップロードすると使えました。

f:id:ntk_ta01:20210830165501p:plain
Lambdaで関数を作成すると出てくる画面

使いこなせてはいませんが、また使う機会があればどこを操作すればいいかなどはまあまあわかるようになったと思います。AWSを触ったことはなかったので、チームについていたサポーターの方やインフラ講義の講師の方にわからないことはたくさん質問しました。インターンの機会がなければこういうクラウドは触りにくいので、貴重な経験でした。

おわりに 

全体としての感想は、一言で言うと「本当に楽しかった」です。夏に圧倒的成長をしたいという全ての学生にオススメしたいインターンシップでした。

taskくんのブログから引用しました。同じ気持ちです。特に競プロerで来年以降インターンとか行きたいけどチーム開発ってあんまりしたことないな~みたいな人とかにオススメです。まず2月か3月に説明会とかがあったので聞きに行くといいと思います(来年もあれば)。

いろいろな学びがあっただけなく、VGという会社自体や社員の方の雰囲気について知ることもできてよかったです。オンラインでもオフィスツアーがあって、もし入社したらどういう働き方をするのかイメージが持てました。社員の方については自分の意見をしっかり持った方が多い印象を持ちました。自分の疑問に思ったことは技術的なことでも会社のシステム的なことでも聞きそうな人や、入社したきっかけなどを聞いたら自分はこういう考えだったと話してくれる人が多かったです。

来月は就業型のインターンがあるので頑張ります💪💪💪 またmonkukuiさんにちょっと前に宣言したのですが、AtCoder ProblemsにPRを出すのも10月末までにはやります!頑張るぞ~

f:id:ntk_ta01:20210830172247p:plain
PR出したすぎ!

最後になりますが、Treasureで関わった皆さん本当にありがとうございました!ぜひ今後も繋がりを持てる方はよろしくお願いします。

ISUCONに初参加しました(ISUCON11)

ISUCONは与えられるwebサービスの性能をどれだけよくできるかを競うコンテストです。今年に入ってからwebに関わるコードを書いたり今月からweb系インターンに行き始めた自分ですが、web知識の幅を増やそうと考えて参加してみました!

isucon.net

チームメンバーは店長さん(@_shop_one)とlongrunさん(@1on9run_zun1027)でした。ICPC横浜の懇親会で喋ったのもあって声かけやすかった競プロer、かつISUCON出場経験はないが出てみたいという同じくらいの熱量を持っていた2人です。アプリの言語としてはGoを使いました。

想定読者はISUCON出たことないぜ!みたいなフォロワーや、web何も知らないで初めてISUCON出る学生が最初は何したか気になる人です。

過去問練習!

ISUCON公式からハンズオンや座学があったので、何の知識も持たないで行ったらよくわかりませんでした。

isucon.net

このまま本番じゃやばい!というのもあって練習としてまず個人でISUCON7予選を、次にチームでISUCON10予選を解きました。環境を作るのも慣れてなくてまあまあ大変でしたが、Dockerをごにょごにょしてたら作れました。

github.com

github.com

座学ではプロファイリングツールを入れてどこが悪いか調べろ、と言っていたのでalpとpprofを入れました。公式のREADME見て苦戦しながら入れるも動かない、Dockerを再起動したら動く、などの苦戦を伴ってプロファイリングツールに慣れていきました。

そしていざ改善をしようと思っても何をしたらいいかわからなかったので、公式解説を見に行ったり強そうな人がブログにまとめた記事とか読んでN+1問題を潰すとか画像をキャッシュする?とかを学びました。

DBにインデックスをはる、とか複数サーバに処理を分散させる、とかはどう行うのかわからないままで当日を迎えました。

予選当日!

~11:00 サーバに接続したりする

予選本番です。始まっていざサーバ3台があるのに対し、どうやって実装とかを進めていく?という話になりました。強いチームは1台でアプリの改善をして、他の台ではDBの改修をしてというように分けるのだと思いましたが、そんなことできないな~という話にもなり3人がそれぞれ別々のサーバで改善を進めていくことになりました。

サーバにはsshで接続します。ところで普段の自分はWindowsのWSL環境なのですが、ssh接続したサーバに対しvscode上で開発がしたいと考えていました。これをするにはWSLを閉じてWindows側にsshの鍵を置き、そっちからsshをすると上手くいきます。最初はわからなくて苦労しました。

次にこれをGitHubに上げるところで苦戦しました。ssh先でgit configのnameとemailを設定したらpushができるようになりましたが、鍵とかがどうなっていたのかはよくわかっていません。isuconユーザのホームディレクトリにwebappやら設定ファイルやらが置いてあり、webapp以下の使用する言語の実装をGitHubに上げることにしました。リポジトリは下のものです。

github.com

~12:00 プロファイリングツールを入れる

練習同様alpとpprofを入れよう、ということをしました。pprofは

$ go get -u runtime/pprof
$ go get -u net/http/pprof
$ apt install graphviz

をたたいて、goのコードでimportに1行とmain関数に数行足せば使えるようになります(たぶん)。main関数には

runtime.SetBlockProfileRate(1)
runtime.SetMutexProfileFraction(1)

と下のコマンドに現れる/debug/pprof/*を受け付けるようなものを足せばよいです。

そして

go tool pprof -http=0.0.0.0:1080 isucondition https://isucondition.t.isucon.dev/debug/pprof/profile

をしてベンチを走らせれば動きました。isuconditionというのはgoのバイナリで、その後ろのURLはアプリのものです。-httpは分析結果をブラウザで見るために指定しています。ベンチはコンテスト中だと選手用ページからボタンを一つ押せば走らせることができました。

f:id:ntk_ta01:20210822190931p:plain

これを見て重いところを改善するぜ!と、ようやくISUCONが始まった感じがしました。

12:00~ 改善に向けて取り組む

pprofを見ているとgetTrendやpostIsuConditionが重そうだったのでその辺りの改善から始めました。その辺りでコードの改善をしたらどうやって変更を反映するんだ?ということに気づきました。自分はわからなかったのですが、チームメンバーがmain.goをコンパイルし直した後でsudo systemctl restart --now isucondition.go.serviceしたらいいよと教えてくれました。終わってから気づいたのですが、質問としても投稿されていたみたいでした。

f:id:ntk_ta01:20210822191948p:plain

その後、自分は16時半くらいまでgetTrendと格闘していました。実行時のエラーログをどこから見るのか調べるのに苦労したり、Goの経験の浅さから思ったように書けなかったことが原因です。エラーログは、

journalctl -b | grep "db error"

で見ることができました。

その間、チームメンバは画像を静的ファイルにするべくnginxをいろいろいじったり、DBのindexをあちこちに貼ってくれたりと格闘していました。そうやって諸々をしていたのですが、5000点~9500点あたりをうろうろしているだけでした。

終了直前

最後にベンチを実行したサーバにて、終了後にシステムテストのようなものが走ります。誰のサーバが1番点数出る?みたいなことを試しつつ、プロファイリングツールを消して最終提出を行いました。

感想

途中トラブルが発生したための延長もあって、ほぼ9時間のコンテストとなり非常に疲れました。練習してきたことが刺さらずに点数が伸びず終了直後は辛い気持ちでしたが、翌日に発表された最終スコアで1万点をこえていたので今は嬉しい気持ちです。

f:id:ntk_ta01:20210822193612p:plain

ISUCON11 オンライン予選 全てのチームのスコア(参考値) : ISUCON公式Blog

参加登録時点ではGoを書いたことがなく、SQLも授業でやったくらいで全然覚えてないぜ!みたいな状態でした。そこからGoやSQLを勉強したり、過去の参加記を読んだりしていろいろ勉強しましたが、これから勉強するとよさそうな知識の入り口はいろいろ見えるようになりました。チームでの予選時の目標は達成できなかった(おそらく598チーム中306位)のですが、当初の参加目的である知識を広げることは達成です。

f:id:ntk_ta01:20210822193929p:plain

今月や来月はweb系企業でインターンをしているので、次に出るISUCONではもっと良い成績を取れるように力をつけたいです💪

AtCoder Merge Grassを作った

2022/01/24追記:アプリの公開を停止しました。

最近は23卒のwebエンジニアになるべく、webの勉強をしています。就活で書ける開発したものを増やすため、今回はAtCoder Merge Grassというwebアプリを作りました。

github.com

f:id:ntk_ta01:20210505005728p:plain
こんな感じ

この記事では以下のようなことを書きます。

使い方

GitHubのログインと、AtCoderのアカウント名の入力が必要です。入力ができたらMergeボタンを押すとマージ後の芝が生成されます。

AtCoderからの集計はProblemsのようにSubmissionsとAll ACとUnique ACの3つに切り替えられます。

勉強したこと

  • Rustのactix-web(バックエンド)
  • Create-React-App(フロントエンド)
  • GitHubのOAuthアプリの作り方
  • AtCoder ProblemsのAPIの使い方
  • Herokuでのデプロイのしかた

Rustが書きたかったので、そこから書き始めようと思いました。とはいえ最初にActix Webのドキュメントを読んでもわからないことが多かったので、MDNのHTML/CSSJavaScriptのドキュメントやJSPrimerを読んだり、Pythonでechoサーバを書いたりしていました。webを支える技術などの本を読んだりもしました。

JSPrimerを読んでからはとにかくアプリを作り始めました。ただフロントエンドとバックエンドみたいなのも最初はよくわからなかったです。

ただいきなり全部は作れなかったのでとりあえずGitHubAPIからcontribution graphを返して表示するやつを作りました。

github.com

Create React AppのことやLoginの扱いなどはAtCoder Problemsのコードをめちゃくちゃ読んだり、一部そのまま使ったりして勉強しました。URLのパラメータを扱ったりCookieを扱ったりするのも初めてだったので、一つ一つググってました。GitHubのログイン後のコールバックURLをバックエンドのものに設定した辺りで、フロントとバックってこう使い分けるのかな~をちょっとずつわかっていった気がします。

AtCoder ProblemsのAPIはドキュメントに書いてあることを読んでちゃんと使っているつもりですが、何かまずいことをしていたら教えてください……。具体的には>Please sleep for more than 1 second between accesses.をどうすればいいかよくわかっていません……。

今後の課題など

本当はコピペしたらGitHubのREADMEに表示されるようなカードを途中からは作りたかったです。下みたいなカードです。まだこれを作るにはどうすればいいかわかりませんでした……。

github.com

また画像付きでツイートする機能を実装したかったのですが、パッとできませんでした(AtCoder Marathon Replayのコードとかをそのうち読みたい)。

ちなみにこのアプリを作ろうと思ったきっかけは、monkukuiさんのツイートを見たからです。また、後付けですが競プロと開発の両方をしてる人の精進が可視化されるといいな~と思いながら作っていました。

これからもwebについて勉強しようと思います!!!!

あと先月くらいに気づいたのですが、上位互換みたいなツールがありました。欲しかったのはこっち、みたいな人がいるかもしれません。

qiita.com


5月6日が誕生日なので欲しいモノリスト貼ります!👀

www.amazon.jp