ISUCON10にElixirで参戦して、惨敗してきました。

9/12(土)に行われたISUCON10にぼっち参戦してきました。

以前から気になってはいたものの、参加できていなかったので、ようやく初参戦することができました!

 

結果は・・・

 

はい、スコア0でフィニッシュでした 😇

 

なぜElixir?

f:id:tamanugi:20200914234205p:plain

(微妙に名前隠れてないけど、本名じゃないしまぁいいってことで)
 

純粋にElixirをもうちょっと使えるようになりたいなって思っていたり、社内Slackの#isuconでこんな冗談を言っていたりして、あとに引けなくなったとかそんな感じです。
(Elixirエンジニアに転職したいという思いもあったり)

過去のISUCONでもフルスクラッチ参戦した方がいたみたいなので、まぁ可能性は0じゃないかと思いチャレンジしてみました。

 

やったこととか

リポジトリはこちらになります。

github.com

 

ElixirのWEBフレームワークといえば、Phoenixですが、ISUCON向きではないなと思い、Plug+Cowboy+Ectoといった構成でチャレンジしました。

他の参照実装でも大体薄いWEBフレームワークの実装なので、それに合わせたような形ですね。

一応実装 5時間 + チューニング3時間で考えていたのですが、結局実装が終わらずでした・・・😭

完全にスキル不足ですね。。。

 

はまったこと

SQLの実行結果を構造体に入れる方法

Rubyの参照実装を参考に実装していて、とりあえずSQL直書きでいいかと思っていたのですが、その実行結果を構造体に変換する方法がわかりませんでした。

終わってから調べてみたところ、Ecto.Repo.load/2 を使えばできるみたいでした。

 

レスポンスが不正です

スコアが0になったのは、ベンチマークのアプリケーションの妥当性チェックを通すことができなかったからです。。。

ローカルで開発して、curlで叩いて目視で確認していました。なので、上で書いたような構造体にしてからJSONに変換していなかったせいで、ぱっと見それっぽいレスポンスが返ってきているように見えても、フィールド名が違った、構造が違った・・・ということがほとんどのAPIで発生してしまっていました。

しかもベンチマークのエラーメッセージでは細かいエラーが確認できないため(当たり前ですが)、何が違うのかを把握するのに時間がかかってしまいました。。。

Plugのテストは簡単にかけるので、ざっくりとレスポンスの型があっているかだけでもテスト書けばよかったなと思います。

ファイルのアップロード方法がわからなかった

もうこれは問題外なレベルで恥ずかしいのですが、Plugでmultipart-formを受け取る方法がわかりませんでした😇

plug Plug.Parsers,
  parsers: [:urlencoded, :multipart, :json],

みたいな感じで、:multipart を追加するんだろうなと思いますが、ちゃんと試してみようと思います。

だいぶ終盤だったので、ここの実装は諦めて isuumo.go.service を立ち上げて、Nginx 設定追加してそちらに流すようにしました。
(もはやISUCONとは。。。)

EctoのNo Database Selected 

アプリケーションの妥当性チェックの段階でそこまでクエリを実行していないはずですが、Ecto経由で実行したクエリは No Database Selected のエラーで失敗するという事象に悩まされました。

Too Many Connections とかのエラーならまだわかるのですが、No Database Selectedのエラーで失敗するというのがわからず。。。(同じAPI/箇所で失敗するのではなく、いろんなとこで1,2回だけ失敗する)

pool_sizeの指定がわるいのかと思い、適当に変えてみたけど変わらずでした。。。

これがなければ(一部はgoに流していたものの)妥当性チェックを抜けれていたと思うのでとても悔しかったです。

 

その他

久しぶりに .ssh/config をいじりました。 ProxyJump といった項目が初見でしたが、比較的最近のOpenSSHで追加されたんでしょうか?

ポートフォワーディングは以下のように .ssh/config に追加して、 ssh isucon-web するだけで行けるようにしていました。

Host isucon-web
ProxyJump isucon-bastion
User isucon
HostName xxx.xxx.xxx.101
LocalForward 8080 xxx.xxx.xxx.101:80

 

感想

結果こんな形で参加枠を潰してしまいごめんなさい!って気持ちになりましたが、競技中はめちゃくちゃ集中して取り組むことが出来て、凄い楽しかったです。

また感想戦も交われない寂しさと悔しさも強かったですが、それ以上にとても色々と勉強になりました。SPATIAL INDEXとかは知らかなったし、その他色々よく気づくな〜ってポイントが多く尊敬の念でいっぱいでした。

来年こそはちゃんと修行して、Elixirで予選突破したいと思います!

 

最後に運営のみなさま、とても素晴らしいイベントに参加させていただきまして、本当にありがとうございました!

 

PS. 決勝進出した弊社つよつよエンジニア3人組頑張ってください〜〜 💪

【ふくもく会】開発環境自慢LTで「ゆるかわフォントいいよって話」というLTしてきた

先日、ふくもく会で開発環境をテーマにしたLT大会があったので、

「フォント」をテーマにしたLTをしてきた。

 

speakerdeck.com

 

社内ではLTしたことはあったが

こういった外部の勉強会では初めてだったので。

割りと緊張した。

 

結構早口になってしまい、時間もあまったので

次回LTのときはもうすこしゆっくり話すようにしたい。。。

 

 

今回は kanazawa.rb さんとのコラボで、

向こうの人のLTも聞けたのでよかった。

 

vimで :up とか ZZ とか :x 初めて知った。

 

fukumoku.connpass.com

 

Vimを少し始めてみる

エディタはAtomを使っていましたが、

重いのと不安定なのがずっと不満でふとVimを使ってみようと思いたった

 

...とはいえ、一からvimrcを育てていくのはつらいので

Githubでvimrcで検索して一番スターが多かった以下の

リポジトリのvimrcを使わせてもらうことに

 

github.com

 

The Ultimate vimrc  !!!!!!

 

プラグインとかいっぱい?でよくわからないけど

これをベースに自分で色々と改良していきたいなー

 

とりあえず leaderをスペースに変更

 

さぁ Let's Vim Life!!

(なお以前はEmacsを3日で飽きた模様)

 

【雑記】「8 Things Every Person Should Do Before 8 A.M. 」

medium.com

 

上の記事がよさげだったのでメモ(やるとはいっていない

1. 健康的に7時間以上の睡眠をとるようにしよう

2. 瞑想で明晰さと豊かさを得よう

3. ハードな運動を心がけよう 

4. タンパク質を30g摂取しよう

5. 冷たいシャワーを浴びよう

6. 自己を高めるコンテンツを聞こう/読もう

7. ライフビジョンを見直そう

8. 長期的なゴールに向かって最低でも一つは実行しよう 

 

んー瞑想とかしたら二度寝してしまいそうだ

 

2 ~ 6 番をとりあえずTodoistに突っ込んでおこう

 

はてなブログ始めました

こんにちわ @tamanugi といいます。

エンジニアとして成長していくためにはアウトプットも必要・・・ということで ブログなるものを始めたいと思います。

普段はWeb系エンジニアとして、主に企業向けサイトの開発・保守などに携わっています。 インフラからサーバサイドの実装まで手がけています。

また業務以外では個人的にiOsアプリの開発などを勉強していたりします。

エンジニアとして学んだこと感じこと、はたまた技術的なTipsなどを発信していきたいと思います。 よろしくお願いいたします。