読者です 読者をやめる 読者になる 読者になる

強いkstm部員になるために(技術編)

この記事はkstm Advent Calendar 2016 24日目の記事です。

qiita.com

どうも、11月からkstmのサークル長になったbgpatです。

先日の Advent Calendar でこんな記事がありました。
toritoeikenken.hatenablog.com
まぁ、20人もいれば食う側の人間と食われる側の人間に分かれてしまっても仕方ないかなと思うところですが、それでよしとされてしまってはサークル全体の成長を望む僕としては辛いところです。

強いkstm部員になるには暴力体力とか煽り力とかいろいろあるわけですが、今回はその中でも技術力にフォーカスを当てて紹介したいと思います。

1. 体力

まず、いちばん大事なのは体力。わりとまじで。
技術を身につけるのって結構体力いるんですよ、ただし筋肉とかは別になくてもいいです。

kstmにいて一番技術力が身につくのは強い先輩についていくこと。
ただ、わからないことが出てくると諦めたくなるもんで、これが結構大変。

ここで大切なのはやるぞって決めたときに最後までやり通して、多少無理しても次の日とかに響かないように調整する能力。
ようするに体調管理ができてりゃいいです。

そんなに難しいことではないと思いますが、一人暮らし率の多い信州大学生にとっては管理してくれる人がいないパターンが多いので一度崩すと持ち直すのが結構大変なんですよね。

2. 環境

kstmは"ものづくりサークル"って名乗ってる通り、ソフトウェアから肉体までビルドするサークルです。
とはいえ、肉体ビルドはサークル活動の中でほんのわずかで、ほとんどは情報分野が占めます。

さて、情報技術を学ぶための環境ですが、僕が思う一番重要な環境は"端末"だと思います。
要するに普段使うパソコンです。

kstmの情報リソースとしてはラックマウントサーバーとかスイッチなどのネットワーク機器とかRasPiみたいなIoTデバイスがあります。
これらを有効活用して使いこなすにはUnix系のOSが簡単に使えるのが近道です。

現部員はMac使いが多いですが、Linuxがマトモに動くPCならどれでも問題ないです。(まともに動くPC自体が少ない)

ちなみに、信州大学ではWindows専用PCが推奨パソコンになっていますが、あれはLinuxを運用しようとするとディスプレイのバックライトが真っ暗になったりBluetoothが使えなかったりいろいろ問題が起こるのでオススメしません。
買う前にはちゃんと調べようね。

3. 実績

kstmの活動に限ったことではないですが、実績としてアピールできるものがあれば強いです。

出れそうなコンテストとかあれば積極的に参加しましょう。
参加するだけでも実績になります、結果が残れば尚よし。

あと、継続したことも評価されることが多いです。
ただし、証拠が残せないとアピールはしにくいかも。

そういう意味ではだいたい毎週開かれてるAtCoderとか、コード書いたことが全部残るGitHubとかすごくいいです。

そういえばGitHubについてはどっかで見た気がしますね。

goryudyuma.hatenablog.jp

4. 得意分野

kstmの強い人達を見てみると、なんか一つは得意分野があります。
全体的にまんべんなくできるってのもいいですが、○○について聞くならあの人!みたいに言われるようになるとそれだけで強いです。

できるだけ他の人とは被らないほうが得な気がします。(ニッチすぎても使い道に困るけど)
ちなみに今いる強い人達の得意分野を上げてみるとこんな感じ。

リストアップしてみるとB4率高い。B2とB3勢にはもうちょい頑張ってほしい。

5. アウトプット

集めた情報は発信してこそ意味があると思うんですよね。
どれだけ周りに価値が提供できるかってことではなくて(これはこれで重要だけど、どっちかというと実績になる気がする)、人に見られてるのを意識するだけでもぜんぜん違うと思います。
情報の整理整頓みたいに考えるといいかも。

方法はなんでもいいですが、一番のオススメはTwitter
気軽に情報発信できる雰囲気がいいです。
もちろん公開アカウントね。

この Advent Calendar もいいですね。
思ってた以上にみんな参加してるし、毎月あれば結構な量の記事が揃うんじゃないかなって。
こういうの続けていきたいね、うん。

まとめ

kstmに入るために技術力を問うようなことはしませんが、入ったからには強くなって欲しい。

タイトルに(技術編)とか付けてしまったので誰か別のも書いてくれると嬉しいなー。

ISUCON6参加記

kstm(カスタム)でISUCON6の本選に参加してきた。今回も学生枠。

サークル部屋にあったわにさんも一緒に参加

予選はDBオンメモリ化とかやって(あんまり効果なかったけど)なんとか学生枠の9番目に滑り込んだ

10:00 - 11:00

競技が始まっても問題がデプロイできなかったのでレギュレーション読んでた。修正後も1回デプロイに失敗してちゃんと動くようになったのがたしか11時くらいだった気がする。

11:00 - 12:00

docker-compose.yml 見たり Node.jsのサーバー読んだりして構成把握してた。Node.jsでHTTPS使ってたりappにリバースプロキシしたりしてたのでとりあえずNginx入れる方針に。

前回みたい(学生チーム全Fail)にはなりたくなかったので5台あるサーバーの1つ目だけ使ってました。(実はwebappが1つ目のサーバーにしかなかったことには後で気づいた)

appをgolang実装に切り替えてスコアが4,174=>6,630に

12:00 - 13:00

appは全部馬さんに任せて、NginxからNodeとappにリバースプロキシする設定をした。

まずNginxいれて80番ポート開けてみたものの、外から接続できないという事態に。どうやらAzureのファイアウォールのせいだったみたいなんですが、このときは気づかなくて2つ目のサーバーにNginxいれて443ポートで接続できるのを確認。NodeのTLSの処理を全部Nginxに移して、あとはgzip圧縮したファイルを静的配信とかした。

このあたりでスコアが9,000くらいまで上がるようになって1位2位あたりをうろうろ。

13:00 - 14:00

ベンチ回しながらtopを眺めてるとMySQLとNodeが結構CPU食ってたのでそれぞれ3つ目4つ目のサーバーに移した。ディレクトリごとscpでコピーして`docker-compose up -d`すればいいだけなのでめっちゃ楽だった。

13:30くらいにスコア16,000を超えて全体で1位に。

14:00 - 15:00

/img/:idが重かったのでなんとかキャッシュできないかなーと。

馬さんがstrokeのキャッシュ、ふぉのさんがNginxでキャッシュ、僕は馬さんがコード書いてるのを見ながら頷くみたいな担当で動いてた。

NodeがCPU使いきれてなかったのでdocker-compose.ymlに同じコンテナをもう一つ建てるように書いた。

このときスコア18,000くらい。

15:00 - 16:00

Nginxでのキャッシュがうまくいかず、点数があがらない

strokeのキャッシュが実装完了して20,000点くらい。

16:00 - 17:00

ちょっと早めの再起動試験。

systemdの設定とか書くの忘れててDockerがあがってこなかった。このタイミングで再起動試験しててよかった。

なんかやることもなくなってきたのでDBのオンメモリキャッシュとか書き始めた。

17:00 - 18:00

DBのオンメモリキャッシュは何故かFailするのでボツ。

17:20にはもう一回再起動試験をしてちゃんと上がってくるのを確認。あとはベンチガチャ何回か引いて20,000点以上が出たらそのまま放置してFinish!
するつもりだったのだが...

結果

f:id:bgpat:20161028080205p:plain

おまけ

pixiv冬インターン参加記

ssl.pixiv.net

pixivにインターンに行ってきました。

まだ就活とかする時期でもないんですが、「東京に行ける!新幹線!報酬まで出る!」という不純な動機で応募したら通っちゃいました。

選考

選考はgithubだけでした。選考でやったことはこんな感じです。

https://github.com/pixiv/intern2015w/pull/7

 

1日目

まず、開発環境のセットアップ。結構複雑な作業のはずですが、特に詰まることなくすらすらできたので、インフラの人すごいなと思いました。

メインのバグ修正は、修正してプルリク送ると、メンターからフィードバックが貰えるというもの。バグごとに難易度がつけられていて、まずいちばん簡単なものから取り掛かりましたが、なかなかの量のソースコードなのでどこを触ればいいのかわからないまま時間が・・・。もっと積極的に質問しまくればよかった。

特にバグ修正もできず、お昼休憩。🍣でした。おいしかった。

午後は本格的にバグ修正に取り掛かりました。修正して、commitして、プルリク投げて、"脱出"タグ付けられて「よっしゃああ!!」ってなりました。ただ、ここまですんなり行ったのは最初だけで、ブランチ変え忘れてたり、あんまりコード読まずに修正して無駄な部分指摘されたり、なかなか脱出できなくて現実は甘くないなと感じました。

2日目

1日目の反省から、分からないことがあったらすぐ聞く のスタンスで挑みました。聞いてみたらすごく丁寧に教えてもらえたので、本当に助かりました。午後はちょっと重いバグをずっとやってました。コード読んで修正して、上手くいかなかったらメンターさんに方針を相談して、という感じでした。結局時間内に修正できなくて、時間があればなんとかなりそうだったので後悔はありますが、pixivのソースのかなりの部分が読めたので満足です。

懇親会では、エディタの話とか、普段はなかなかできないマニアックな話ができて楽しかったです。splatoonほしい。

まとめ

インターン行ってよかったです。Web開発の現実が見れた気がします。参加していた人もみんなレベルが高くて、もっと勉強しないと、と感じました。

pixivの皆さん、インターン生の皆さん、2日間ありがとうございました。

ISUCON5本選に学生枠で参加しました

bgpatです。
所属しているサークルの先輩2人(@fono09, @Goryudyuma)とチーム名kstmでISUCON5の本選に参加してきました。

午前

まず、予選の教訓からapt-get purge apparmorしました。初回ベンチかけてる間に環境の確認。使い慣れてるMySQLじゃなくて全く使ったことのないPostgresqlが入っていて、コレどうしよう状態。psqlコマンドはこのとき初めて使いました。ベンチ終わってnginxのログとかブラウザで確認したりして、/dataが重いなーということでコード読み始めました。一緒にコード読んでた@Goryudyumaが外部サーバーに対してHTTPリクエスト送ってるのが原因と教えてくれたので、このあたりを調べることに。ローカル環境からAPIのホストを叩いても案の定名前解決できなかったので、サーバー内の/etc/hostsを見るとAPIサーバーのアドレスが書かれていました。ローカルのhostsに同じ設定を書くとブラウザからAPIを叩けるようになったのでメンバーにも共有。とりあえずAPIのリクエストをキャッシュすれば早くなるのでは?と提案だけして、@fono09にredisの設定とかやってもらい、golang書けないのでコードは@Goryudyumaに書いてもらいました。

13:00〜17:00

何も考えずとりあえず全部キャッシュするコードが完成したのでベンチ回してみるとよくわからないエラーを吐いてfail。ブラウザでAPI叩いて確認すると、tenkiは高頻度で更新されているみたいなので、キャッシュから除外するように修正するがfail。このあともいろいろ触ってみたけど最終的にはnullしか表示されなくなって、せっかくGO言語使ってるんだしということで、APIリクエストの並列処理のほうをやってみることに。並列化処理完成してブラウザでチェック、よし問題なさそう と張り切ってベンチ回すもなぜかfail。しかもapp.goが死んでる。ログを見るとJSONのパースで落ちてるらしいことが分かり、Resp.Bodyをログに吐き出すようにすると、何も入ってなくてイミガワカラナイ。懇親会で聞いたところによると、ちょっと工夫してログに出せば"Too Many Requests"が見れたんだとか。このあともキャッシュがうまくいかない原因を考えてみたり並列処理なんとかできないか触ってみましたが、ことごとくfailしまくってお通夜状態でした。

17:00〜終了

結局打てる手もなくなり、同じサーバーの中にAPサーバーいっぱい立てれば並列処理になって少しは早くなるかもとか考え出して、やってみてもうまく動かず結局ほぼ初期状態に戻す感じでフィニッシュ。時間もなく、ほぼ初期状態だったので再起動確認はしませんでした。学生チームが全チームfailになると知っていれば再起動確認の時間残したのに。

反省

大体どのチームとも方針は変わらなかったのに、考察しきれてない部分が多くて全く点数が伸びず、最終的にfailに終わってしまいました。予選のときは、ほぼノー勉で挑んで、たまたま自分たちに合った環境が問題になってスコアが伸びたけど、本選で惨敗して、甘くないなーと実感しました。来年もISUCONがあるなら、運ではなくて実力で予選突破できるように練習とかちゃんとしたいです。

まとめ

コンテスト自体はボロボロでしたが、長時間パソコンに向かってみんなで考えたり、プロが書いたコードが見れたり、懇親会ですごい人たちと話したり、東京見物したり、ほんとに楽しい充実した日となりました。運営のみなさん、本当にありがとうございました。

おまけ

会場に着いてから暇だったのでこんなもの書いてました。せっかくなので置いておきます。