ISUCON7本戦で惜敗してきた

どうも、馬です。

今年もISUCONの本戦に行ってきました!

運営の皆さん、関わった皆さん、本当にありがとうございました!とても楽しかったです!

チームメイトの記事

あーちゃんの記事

bgpat.hateblo.jp

ふぉのさんの記事

ISUCON7本戦惜敗記(学生枠)

今回のコード

github.com

あーちゃんがブランチ分けたりGitのテクを駆使して、ソースコード管理オペレータをやってくれたので、依頼すると「この時点までこのコードだけ切り戻し」とかやってくれました。さすが。

あと、Closeされてますけどやることリストを今回も作ってます。

github.com

前も書いた通り、これは次にやることがわからなくなった時に使うものなので、あまり使わなかった感じですね。

ちょっと縁あって株式会社scoutyさんのオフィスでこのやることリストを作りました。ありがとうございました!

scouty.co.jp

前日まで

ISUCON7予選、ISUCON5本戦、ISUCON4本戦をやろうとしたのですが、結局ISUCON5本戦はうまく動かずでした。コードを見ると、もうaptで配布されていないgradle2.8をバージョン指定で入れていたので、2.8の部分を削ってビルドが通るようにしたり、PHPのいくつかのライブラリのがおかしかったので直したりしてみたのですが、ちゃんと動いているかよくわからない状態でした。二年も前のアプリケーションだとよくあることかもしれませんが、ISUCONは動かすところからだ!と言われると・・・って感じなので、なんとかしたさがあります。だけど今の環境でも動くようにするということは、スコアに影響があったり、二年前より楽になるor辛くなることがあるので、本番と全く同じ状態ではなくなってしまうところが、難しいところですね・・・。割り切りが必要そうです。

ISUCON7予選とISUCON4本戦は楽しんでやれました。もう三年も前のISUCON4本戦が普通に動いたことは、本当にすごいことだと思います。

やったこと

今回はあまり仕事できなかった感じですね。

チームではいつものごとくDB担当でしたけど、テーブルは綺麗なもんで、いじるところとか特になかったです。slow queryになるまで行けなかったです。

強いて言えばトランザクションのところが遅いと言えば遅かったですけど、かなり触りづらい感じになっていた上、AppのCPU使用率が高すぎて、ボトルネックになっていました。

不変値であると判明したm_itemをinitialize時にメモリに読み込む処理をサクッと書いたあとは調査、遅いところを直していこうって感じでした。

書いている間にふぉのさんは使うかもしれないRedis入れたりとかの環境の整備、あーちゃんはデプロイの自動化とかやってました。

golangでやってたので、pprofで調査したところ、多倍長演算がとんでもなく時間食っていることが判明しました。

この時の話し合いで、僕は多倍長演算をなんとかする、あーちゃんは構成を分散させてroom名で使うマシンを切り替える、ふぉのさんはそのサポートって感じで仕事を分けました。

結論から言うと、多倍長演算を最後までなんとかできなくて、あまり点数を伸ばすことができませんでした。

addingの方はかけ算をサボることができて、まず左から60bitくらいを残すように右にシフトさせたあとかけ算して、右にシフトさせた分を左にシフトし直すことで、誤差範囲内でかなりの計算量を減らすことができたのですが、Priceの方はこれやっちゃダメで、どう頑張っても誤差範囲内に収めることができませんでした。書いてる時はわからなかったのですが、これは当たり前で、買えるかどうかの判定を厳密な値を用いて判定しているからでした。大して多くもないパターン数だったので、計算結果をキャッシュすればよかったっぽいんですけど、引数が64bit変数だったんでキャッシュは無理って判断してました。少し競技プログラミングを齧ってる身としては、今から思えばなんで無理って思い込んだんだろうってなってます。

あーちゃんの方の分散はある程度うまくいき、ジャッジケースセットによっては一つのマシンに偏ったり、うまく分散したりと、微妙な挙動をしてました。

結局やれたのはここまでで、あとはガチャ回していい結果を引こうとしたのですが、うまくひけず、最高点の17000点くらいまでできずに12000点くらいでフィニッシュしました。競技終了後に運営側で一回回して、その点数と競技時間内最後に提出された点数の高い方が取られるので、ちょっといいガチャが引けたっぽくて15000点くらいの結果になりました。

再起動試験は2回くらいしかやってなかったので、少し不安だったのですが、ちゃんとFailせずに終わりました。

 

終わってから

なんか頭がぼーっとしちゃって、ちょっとしんどかったです。でもビール飲んでケーキ食べたらちょっと回復しました。

優勝したチームと全く同じ構成(golang+vim)だったので、実質優勝もっといい点数を取りたかったです。

来年はあーちゃんがいなくなるので、今回でこのチームも解散です。

ISUCON5,6,7と本戦出場率100%を誇るすごくいいチームでした。

来年のISUCONはどうするかまだ決めてないのですが、あーちゃんレベルの超人オペレータはなかなかいないので苦戦しそうです。それとコード読める人が欲しい・・・。

そろそろ就職活動するんで、もし面接とかでお会いできれば、よろしくお願いします。

リンク集

isucon.net

goryudyuma.hatenablog.jp

 

ISUCON7予選参戦記

今年もISUCON予選参加したよ!

isucon.net

 

結果は「73位 49,956 kstm[学生]」でした!

isucon.net

学生枠での予選突破です!三年連続!!

 

チーム紹介

去年までと全く同じです。

馬(Goryudyuma) : DBとアプリケーション担当

ふぉの(fono09) : インフラ担当

あーちゃん(bgpat_) : アプリケーションと全体指揮

 

やったこと

前日まで

Pixiv-isucon,ISHOCON1を個人で、ISUCON4予選をチームでやった。

今年は前日に練習会やるなんて暴挙はしないで、ちゃんと時間を取ってやったので、その時に得た知見を深掘りして調べることができたので、本番に活かせたと思う。

前日

大学の学園祭だったので、終わってから打ち合わせ。

今年も不測の事態を除いてGolangを使うこと、誰がどこを担当するかを改めて確認した後、やることリストを作っていった。

やることリスト、去年まではTrelloを使っていて、あれはあれで便利だったが、今年はGitHubのProjectを使うことにした。僕たちのチームで使う用途であれば、どちらを使ってもそんなに変わらないので、コードの管理まで含めてGitHubに任せてしまうことにしました。ちょうどサークルのGitHubのチームが、Privateリポジトリ無制限に使えるしね!一応公開してあるので、参考になるかも?

github.com

全部Issueとして立ててあり、それぞれ仕事ごとに担当者に紐づける的な感じでやってます。

もう大体Doneに移っていますが、ほとんどmustかshouldに入ってる状態でスタートしました。

それから、マイルストーンを使っての管理もできればってあーちゃんの提案により、一応全部どこかに所属するようにしました。これはあんま使わなかったな。

結論から言うと、このリスト、あんま活用できませんでした。

後で書きますが、みんなかなり慌ててしまって、更新をあまりしないで突っ走ってしまったため、Doneに入っている多くが、競技終了後に更新したものです。

この方法自体が悪いと言う訳ではなく、もっと冷静にやれば、きちんと活用できたのかなあと。

去年までの知見になりますが、本番中は「あれ、この後どーするんだっけ」ってなることが結構あったりして、そんな時に事前にやることリストを作っておくことで、スムーズに次にすることを始められたりします。しかし、今回みたいにやることがすでにわかっている(ができない)場合は、あまり活用できなさそうだな〜ってなりました。あるに越したことはないので、本戦もこれ作ります。

それからふぉのさんとあーちゃんに買い出しにいってもらい、モンスターを仕入れてもらった。ご飯炊いた。

当日

開始前

あんま寝れなかった。まあ仕方ないね。

朝から雨だった。台風の影響。

ジュースとお菓子などを買い出しで仕入れて、ご飯と鯖缶食べながら本番まで待機。

開始

三台構成にちょい慌てる。

サーバー3でDBが動いていたので、僕が担当することにした。mysqlだったので、slow logを入れる。とりあえず遅いところから順にインデックス貼る。そんなに点数伸びなかった。

ふぉのさんがfail2banに引っかかって、ログインできないとか言ってた気がする。なんとかしたあと、fail2ban消した。

画像がDBから配信されていることに気づく。サーバー1に入り、画像をファイルに書き出す。僕の仕事は書き出すスクリプトを書くまで。あーちゃんに渡す。

画像をgzipで配信するなど、やってたらしい。でもまさかCDN的なものが前段にいて、Cache-Controlに publicをつけなければいけなかったとは最後まで気付かなかった。

SQLでIFNULLが使われてて、ここどうにかしようと頑張っていたが、結局最後までできなかった。見た目上動いているように見えるまでは行ったけど、ベンチマーカー曰くなんか数字がおかしかったらしい。

帯域が明らかに足りてなかったので、サーバー構成を変更し、サーバー1とサーバー2でapp、サーバー3でDBと言う構成にした。少し早くなったが、キャッシュ関連がうまく設定できてないので、ブレイクスルーにはならなかった。

画像が投稿されたら、gzip圧縮して静的ファイル保存場所に保存するように変更。とにかく重たい画像をDBに保存させないようにした。

この辺でgitの歴史を戻した際に、コミットしていなかったソースコード大部分が損失。全てを一つのgitで管理していた(/配下をgitに沈めて全てをignore,必要なものだけgitに入れていく方針を試していた)のだが、別のところで歴史を戻そうとすると、全てに影響があると言う状態の上で、コミュニケーションエラーがおきた。仕方ないので、もう一度書き直した。方針自体は(三人程度の小さいチームで全員顔合わせてる状況でしか使わないのなら)悪くないので、うまく運用時のトラブルが無いようにしていきたい。

最後はガチャ回す。6万点弱から3万点弱の間でめっちゃぶれてた。5万点弱のスコアが出て、時間もなかったので終了した。もちろんふぉのさんが間違ってEnqueueしないように、PCから離れる、キーボードやマウスから手を離させるなど、万が一が起きないように徹底した。

終了

ISUCONの時間が後ろに移ったので、休憩なしでコドフェス予選C開始。あんま解けなかった。D問題の考察思いついて、実装でバグってる時にISUCON本戦出場が決まって、コドフェス本戦がISUCON本戦と同じ日にやるので離脱した。仮にコドフェス通ってもISUCON行くので、行けない上に、8時間フルで頭動かしててとても疲れてたからだ。結局後から見ると考察はあってたっぽくて、頭がきちんと働いて入ればDまで行けたかも?って感じだった。

選挙解説見ながら(もちろん期日前投票済み)ビール飲んで、朝方家に帰って、今回のISUCON予選を終了した。とても楽しかった!

(今回はきっちりログを残していなかったので、かなりアバウト。今まではコミットにやったことを残していたのが、今回から運用方針が変わったのでちょっとやりづらくなった。でも今まで通りコミットにメッセージとして残していても問題は多分起きないので、本戦はきっちり残すと思います。)

 

「ISHOCON1」と「DISCO presents ディスカバリーチャンネル コードコンテスト2017 予選」と「PHPカンファレンス2017」と「CODE FESTIVAL 2017 qual B」と「DevFest Tokyo 2017」に参加してきた話

タイトルめっちゃ長いですね、ごめんなさい。内容もめっちゃ長いです、ごめんなさい。

 

 

先週末、面白そうなイベントがいっぱいあったので、とりあえず片っ端から参加してきました。

 

10/7 ISHOCON1 DDCC予選

ISHOCON1

朝4:30に高速バスに乗り込み、長野から新宿へ、京浜東北線で渋谷まで。

株式会社scouty様にて、ISHOCONというISUCONの練習会が開かれるとの情報を得て、参加してきました。
scouty.co.jp

scouty.connpass.com

 ISUCONは一昨年から毎年参加しているコンテストで、Webアプリケーションをレギュレーション内においてひたすら早くするコンテストです。去年はこんな感じで、学生一位をとりました。

goryudyuma.hatenablog.jp

今年も開催されるので、去年に引き続き史上初(多分)の学生連覇を目指して頑張ります。そのためにも練習が必要で、練習会を開催してくださる、それも参加費無料でってなると、めちゃくちゃありがたいです。運営に感謝!

結果を先に書くと、(実質)優勝でした✌️ 実質というのは、点数的には二位だったんですけど、点数一位の@showwinさんが、作問者かつ運営という立場だったので、一位の立場が降ってきた感じですね〜。後ちょっとだったので、完全勝利したかったのですが・・・。次は勝ちます。

コードはある程度Gitで管理していたのですが、コミットログが適当すぎて何してるかわからないと思われるので、時系列順に書いときます。なお、[n]はベンチマークでn点取ったことを示しています。素のVimでGofmtとか使わずに書いたので、インデントとかバラバラなのは許して。

github.com

個人参加ですがチーム名を決める必要があり、優勝商品がシャチョーさんと焼肉らしいので、思うがまま「焼肉食べたい」って名前にしました。

 

朝 渋谷駅新南口を出たまではよかった、でもそこからだと大分遠回りになってしまった。まさか橋もトンネルも一本もないなんて・・・。

会場入り 出席とって、荷物置いて、会場内Wifi入ったらMacのアプデが・・・。あの、パスワードのヒント出すとパスワードが平文で出てくるって奴ですね、これは上げなきゃまずいということでアップデート開始(←本番直前にんなことすんなよ!)

10時、競技開始 Macのアプデ終わらず、スマホでレギュレーション読む。簡単なルールの読み合わせがあった後、アプデ終われーって祈る時間

アプデ終わり まずはサーバー立ててとりあえずenqueueして、環境確認。とりあえず僕はDB担当なので、まずはDBから見ていく。MySQL5.5で動いてたので、即5.7へ上げて、mysql-slow-queryを入れる。[138]

11時過ぎ インデックスペタペタ貼って、ベンチ回す。16533点でトップに立つ。そろそろwebappをサービスとして立ち上げたいな、init.d書くかーってなる。[16533]

12時 一位だったのは一瞬だった、すぐに抜かれた。init.dに書いたけどうまく動かなくて、昼ごはん食べる。美味しかった。ふつーに動かすことはできるので、サービス化は諦め。一人じゃなくてチームなら、インフラ班に任せるみたいにできるんだけど・・・。昼食中のおしゃべりで、ベンチマークの引数にworkloadでもっと並列度あげるといいかも?みたいな話が出たのでちょっとやってみる。スコア少し伸びた。[19791]

12時半  ISUCON本番だと、他のチームメンバーがみるところも、一人だと全部みる必要がある。ツライ。でもできないわけではないのでやる。nginxからgzip済みの画像を配信するように変更[23169]

13時  「僕はDB担当!」って心の中で叫んでいたので、ここまでコードはほとんど読んでいない。そろそろ読むかという気持ちになる。他のチームでマイナス何十万点みたいな幻を見た気がする。あれは一体なんだったのか・・・。

14時  全データをメモリに乗せてしまうことを決意。ISUCON6予選で僕たちがやった方法。書き込みはDBにもメモリ上にもするが、読み込みはメモリ上からのみ読み込むことで、読み込みをひたすら早くするのと同時に再起動試験にも耐えうるようにする。後、initialize時にメモリ上にデータを構築するようにしとく必要あり。実装開始。

15時  なんかページ番号と件数とがあってないみたいなこと言われまくる。後々わかるが、自分の実装バグ。まあ適当に直したが、ちょっと手間取ってた。そのほかにも気づいた点があれば随時直していた。[35593]

17時 データをメモリ上に乗せたやつが、ベンチ完走。三位くらいにつける[106002]

17時20分  Go1.6が使われてたので、Go1.9に。なんでもっと早く気づかなかった・・・。ガチャ回し始める。[125206]

17時40分  ガチャ回す。workloadの値変えたりキャッシュいじって見たり。再起動試験とか細かいことはしない感じだったのですが、とりあえず18時にベンチ落ちることはないようにしていた。点数もキリがいいところで止めた。[134000]

18時  終了!二位かー、残念って思ってたところ、前述の理由で実質一位に!

 

f:id:Goryudyuma:20171011170419p:plain

 

かなりセーフにプレイしたので、例えば最後の方、頑張ればできそうだなと思った点数上がるポイントいくつか見つけてたけど、手を出さなかった。終了間際までやる癖は、少なくともISUCONにおいては絶対にやめたほうがいい。・・・と、二年前の本戦でFail(再起動後のベンチマーク完走せず)した経験から得た知見があった。ここマジで重要。いくら後ちょっとの改善で勝てそうだとしても、グッと我慢して、自分の実力は今はここまで、次は勝つぞって思うことが次に繋がるって信じてる。

 

懇親会でビール二本ほど飲みながら、「あそこどーしましたー?」とか、「本戦頑張りましょー」とか。scoutyのインターン生、楽しそうだったなあ。

チーム名「焼肉食べたい」の想いが通じ、今度焼肉奢ってもらえそうです。また東京行くときに日程調整します!

 

DISCO presents ディスカバリーチャンネル コードコンテスト2017 予選

 

終わった後は渋谷を離れて、ラーメン食べてネカフェに入った。その次のイベントに参加。AtCoder上のオンライン参加なので、ネットに繋がってて端末があって、コーディング環境があればどこにいても参加可能。

All submissions - DISCO presents ディスカバリーチャンネル コードコンテスト2017 予選 | AtCoder

結果は4完154位でした。19卒から100人本戦に行けるので、上に100人も19卒がいると思えないんで、行けたんじゃないかなーって思ってます。

AとBはやるだけ、Cは300点問題だし二重ループで終わるやろ〜って書いてDへ行く。もちろん終わってなくて、Dに悩んでるときにちょっと結果見て、TLEって出てて血の気が引いた。一重ループににぶたんするようにして計算量落として、バグってて一回WA出したけどAC。Dは上下対称か左右対称を作って、上下対称作った後は左右対称、左右対称作った後は上下対称作れば、後は4つずつポイントが入るので最適そう、って組んだけど、点数計算のところがどうにもバグりまくって、最後は気合いで通した。

まあうん、競技プログラミングやるのはいいけど、朝3時ごろから起きてて超眠くて、ビール飲んでしかもネカフェというパーソナルスペース(?)もへったくれもないところでやるとこうなるよねってやつですね。これでギリギリ通らなかったとかなりゃ、後悔するかも・・・。でもまあ、その時はその時だなあ。

というわけで、1日目終了。寝た。

 

10/8 PHPカンファレンス コドフェス予選B

あんま目覚めは良くなかったけど、蒲田まで行く。時間あったので銭湯行ってひとっぷろ浴びる。

PHPカンファレンス

phpcon.php.gr.jp

今年で三年連続参加。僕はカンファレンスを、世間ではこんなことやってるんだってのを知る機会として利用してる。特に知らない単語をいっぱい仕入れて、帰ってからその単語とかサービスを調べて見て、いざ何か作ろうってなったときに使える引き出しを増やすって感じ。

ただ、何分長野からだと参加するのが難しいのが少し悩み。早く東京就職決めて、もっと引き出しを増やす機会を増やしたい。

今年心に残ったことは、

  • グラブルはメインデータをCSVで管理している(!?)こと
  • 徳丸先生の講演は特に興味深く拝聴させていただいている、なんというかよくそんな脆弱性見つけられたなってのが分かりやすく解説していただけるのがとてもありがたい
  • MySQLのチューニングは、ISUCONでやってることではあったが、具体的にこうなるから早くなるよってことが示されてなるほどってなった。バッファプールの関係でSELECT時に書き込みが発生しうる点とか面白い。
  • 結果にコミットできるデバイス、最高では。しかも効果ありとなると、商品化待った無し。

などです。

それから、企業ブースに出ていらっしゃったmedibaさんから頂いた、「nu board」ってやつがめっちゃ神です。ノート型のホワイトボードで、めっちゃ使いやすいです。今度から持ち歩くものが一つ増えました。

 本当にありがとうござました!

 

CODE FESTIVAL 2017 qual B

またネカフェ入ろうと思ったけど、なんとなくホテル調べてみようと思って適当に探してると、カプセルホテル一泊3100円見つけて「これは行くしかないなー、久々にカプセルホテル泊まりたいし」ってなって、予約して20分ほどでチェックイン。booking.com初めて利用しましたけど、めっちゃ簡単に取れました。

ちゃんとWifiついてるところ選んだので、問題なくコドフェス予選出れます。一応ネットのチェックした後、なんか大浴場ついてたのでとりあえずお風呂。

「今日はビール飲んでないしー」とか思いながら開始、無事死亡って感じでしたね。疲れもあったと思う・・・。

ABCの三完、289位、日本人119位でした。うーん、サンクスも厳しそーかなーってなった。

 ここでさっきのmedibaさんから頂いた「nu board」が超役に立ったのですよ!(モロマ)

 

CANSAY nu board ヌーボード A4判 NGA403FN08

CANSAY nu board ヌーボード A4判 NGA403FN08

 

 外出先でちょっとホワイトボードがあると、思考の整理がしやすかったです。C問題とか、これがなかったら解けたかどうか怪しいし。

これで二日目終わり。

 

10/9 DevFest Tokyo 2017

池上線

朝から池上線に行きました。この日は90周年で無料開放デーだったのです。

 朝8時ごろに行ったので、まあ普通に人は多かったですけど、全然乗れないなんてことはなかったです。昼頃ツイッターに大混雑って流れてて、朝のうちに行ってよかったなーって思いました。

五反田から大崎へ行き、りんかい線東京テレポートまで行きました。

DevFest Tokyo 2017

実は今回東京行く前、 「月曜日授業かー、帰ってきて一限出るのつらいなー」って話したら「月曜祝日だよ何言ってるの」って言われて「じゃあ月曜まで東京いてもいいじゃん!なんかイベントないかな!?」ってconnpass見たらあったのがこのイベント。かなりゆるい気持ちで参加しました。

  • Firebase,正直何も知らなくて、色々できそうってことがわかった。
  • GCPAWSもそうだけど、多すぎて何がなんやら。どんどん触らないとわからないんだろうけど、触るためにはわかってないと難しそうってスパイラル。
  • React Nativeってふつーに使えるんだなー、これは触って見なければ。
  • Golang2.0の話題も出てくるんだなー、どーなるんだろなー。
  • AppEngineのためだけにGo書く人もいるらしいので、Goをある程度書く人として、少しは触っといたほうが良さそうね。

満員の会場とか出てたり、人気の講演は人がいっぱいでした。また触ってみたい技術がいっぱい出てきたので、ちょっとずつ消化して行きます。

 

終わって

終わった後は新宿に出てご飯食べてバスタから長野まで帰りました。

三日間、超疲れました。ようやく体調回復したのと、やる気が出たので、アウトプットしときます。

(夏休みやってたこととかまだアウトプットできてない・・・どーしよ・・・。Fringe81さんにインターン行ったり、IBMメインフレームコンテストに出たり、Gitチャレンジに出たりしてました。)

 

また今後も、勉強会、コンテストなどで東京行きます!お会いした時などにはよろしくお願いします!

PC環境メモ

自分のPC環境についてメモしとこうと思います。

 

ノートPC

13inch MacBookPro2016

13インチMacBook Pro - スペースグレイ
システム構成
•   2.9GHzデュアルコアIntel Core i5プロセッサ(Turbo Boost使用時最大3.3GHz)
•   16GB 2,133MHzメモリ
•   Intel Iris Graphics 550
•   512GB PCIeベースSSD
•   Thunderbolt 3ポート x 4
•   Touch BarとTouch ID
•   感圧タッチトラックパッド
•   PRO APPS 065-C171 NONE
•   LOGIC PRO 065-C172 NONE
•   バックライトキーボード (US) + 製品マニュアル(日本語)
•   アクセサリキット

外出時のメインマシン。6月頃に買った。

初めてのMacで慣れないことも多いけど、働いてくれている。

Touch Barは非常に微妙だと思うけど、TouchIDはすごくいい機能だと思う。

BootCampでWindows10も入れてる。VisualStudioとか使うときに開く。

でも動作が微妙で、たまに固まったり変な動作するところがイライラする、ので本当に非常用になってしまっている。

買った直後に2017が出て少し悲しくなったが、2017が2016に比べてそんなに変化なくてまあよかったかな。

 

デスクトップPC

■OS : Windows 10 Home 64ビット
■CPU : インテル® Core™ i7-6800K
■メモリ : 32GB PC4-17000 (8GB×4)
SSD : 480GB ( 6Gbps 対応 )
■グラフィックス :
GeForce® GTX 1080(8GB)
■電源:700W / 80PLUS® BRONZE 
■DVDスーパーマルチドライブ搭載

f:id:Goryudyuma:20170911003014j:plain

最近自宅に入った家庭用メインマシン。7月に買った。

動作サクサクでめちゃくちゃいい。

ディスプレイ三枚環境で運用してみようと思って、とりあえずこんな感じ。

f:id:Goryudyuma:20170911000706j:plain

スペック申し分なし、もう家から出たくない・・・。

 

 

ポンポン新しいPC買ってしまった。

しばらくはこの二台と、前まで使ってたWindowsノートPCを予備機として三台体制で運用します。

これでインターンとISUCONで稼いだPC用の予算がほぼ尽きてしまった。大人買い楽しかったし、後悔はしていない。(てか予算の元、どっちもLINEだった・・・感謝しかないな、うん。)

 

goryudyuma.hatenablog.jp

 Macは買わないとか言ってた以外は、この時に書いた通りノートPCとデスクトップPCの体制になりました。

 

最高の環境を整えたので、こいつらを更新しつつ、いろんな成果を出していこうと思います!

LINE Winter Internship 2017に参加してきた

もう終わってから結構経っちゃいましたけど、LINE株式会社にてインターン生してました。

line-hr.jp

守秘義務だの何だのあって、実際に何やったのよとか、書いたコードはどんなだとかは書いちゃダメなので、次回以降応募しようか迷ってる人に向けて流れとかを書き残して置こうと思います。

めっちゃ長文かつ感想というか個人的なものが大量に入ってるんで、適当に読み飛ばしてください。

 

 

応募

まずはインターンについて知る必要があります。(このフェーズはツイッターとかブログとかでいいんですけど、)僕はISUCON6決勝で、LINEの社員さんとお話した時に「うちのインターン来ない?」みたいに誘われました。学生一位取った直後でビールも結構飲んでて、かなり気が大きくなってたと思います、「いいっすよー!」みたいに答えた覚えが微かにあります・・・(ほんとごめんなさい、めっちゃ失礼ですね・・・)。

「あ、でも僕LINE使ってないですけどいいですか?」ってのもついでに聞きました。ついでとか言いながら、かなり重要な事ですけど。そもそも僕、LINEのコミュニティって苦手で、「てかLINEやってる?」に代表されるあのリア充感というか、雰囲気がどうにも肌に合わない。ツイッターフェイスブックでいいやーって人です。大学の学科LINEがあって、そこに入るためだけにLINEアカウントを持っていましたが、そのグループLINEで「Skypeとか他のやつに移行しない?」とか発言するくらいには使ってない人でした。スマホ新しくしてからはアプリを入れず、その前のスマホ(sim無し)でたまに連絡チェックしてるくらいのユーザーでした。こんな僕でしたが、「いいですよー、是非応募してください!」って社員さんが言ってくださったので、「じゃあ応募しますね!」って返事しました。

次に応募です。ISUCONから帰ってしばらく経って、「LINEがインターン募集するぞ、しかも報酬は40万/月」ってのがTwitterのTL(タイムライン)に流れてきました。実はこの時、応募するのをかなり迷いました。そもそも力が足りてなさすぎてて、行ったとしても迷惑だろうってのが僕の中であったからです。でも応募するって言っちゃったし、もし実力足りてなけりゃ選考のどっかで落としてくれるだろ~、受けるだけ受けるか~って軽い感じでとりあえず応募しました。

まずあるのは書類選考です。もう結構経っちゃっててどんなのが出たのか全然覚えてませんけど、簡単に自己紹介とかしたような気がするようなしないような。作ったものとか。なんか通っちゃったらしくて、次の審査の技術テスト受けてください~ってメールが来ました。

技術テスト、3つの項目に別れていて、それぞれWeb上で答える形式でした。一つ目が応用情報午前問題みたいなやつで、時間内に絶対終わんねえよって問題数出されるのでひたすら4択だか5択だかを答えます。僕はたまたま応用情報受けた直後だったってのもあって、時間が足りない事以外は問題なくいけました。その次にあるのが、簡単な競プロみたいなプログラミング問題です。一行もコード書けない人を弾く的な意図らしく、ABC(AtcoderBeginnerContest)のC問くらい?の難易度だと思います。それもアルゴリズムの知識とかは特に必要でなく、どちらかと言うと実装ゲーって感じでした。ここで問題となるのが使用できる言語。あくまで問題が競プロっぽいってだけで、競プロではないので、言語指定とかあるわけでして。たしか、「Java,Python(2 or 3),node,Perl」の中から選べ的な感じだったと思います。これでこのLINEという会社がどんな人材を求めてるのか、薄っすらと見えてくるというものです。しかし困った当時の僕。「(得意言語の)C++PHPもGoも使えない!」ってなって、まだこの中だと書けそうなJavaで挑みました。制限時間の最初1/3を「JavaのPackageがわかんなくてコンパイル出来ねえ!」って溶かしたり、「Javaであれってどうやるんだ!?」みたいなのの連続で、「C++PHPなら一瞬で書けるのにぃ!(※要検証)」って言いながらなんとか書きました。最終提出ではテストケース一個だけ通らないところまで行き、制限時間が少し過ぎてからそのラスト一個も通るように直しましたがそっちは提出間に合わず・・・。「あーこれは落ちましたわー」って思いながら三つ目の項目、自己アピールを書きました。

しばらく経って格通。「なんでや!」って思いながらも、「面接来て下さーい」って書いてあったので、「よし、最後は東京旅行や、華々しく散るぞー」って日程調整して面接に行きました。面接はクリスマスの直後くらいでしたね。今だから言えることとして、面接前日から当日朝まで京都で日本酒たらふく飲んでて(お猪口換算で21杯、一万くらい使ったらしい?)、その後京都駅から東海道本線18切符で渋谷駅まで行きました。途中の駅でリバースもして、「ああこれが僕の限界か・・・」などと。お酒でリバースしたのはこの時が初めてで、ようやく限界を知れた喜びが強かったくらい狂っていたのを覚えています。お酒をたらふく飲んだ後に電車に揺られる、特に211系みたいに微妙に古くて揺れる電車だと激しく気持ち悪いことがわかりました(自明)。面接で提出する書類を確認した所ちょっとした不備が見つかったので、大船あたりからグリーン車で渋谷まで乗って(机の確保)、夕方渋谷についてすぐに面接。少しだけ体調回復したもののまだ気持ち悪さが残ってる中、就活で答えそうな、「超デカいリアルタイムに動くデータで遊びたいです!」的な事を話して、「こういう時、君ならどーする?」って聞かれたのに幾つか答えました。あと「東京で暮らすことに問題ない?」とか、「Javaに親殺されたりしてない?(意訳)」とか聞かれました。これで落とされたら仕方ないなーって出来でした。終わった後は開放感から、御殿場線乗りつぶししに戻って(あたしって、ほんとバカ)JR東海全線乗りつぶし達成、そのあと東京で友達と遊んで帰りました。

1月に入ってしばらく経って、電話にて格通。簡単に最後の確認(本当に来れるか等)された上で、いつからいつまでインターンするかをできるだけ早く決めてくれって言われました。卒論発表の直後の月曜からお願いしますと連絡し、めでたくインターン生になれることになりました。

 

労働環境

さて、もうすでにかなり長くなってますけど、まだまだ続きますよ。どんどん読み飛ばしてください。次は労働環境について。

  • 待  遇:
    ・4週間コース:報酬40万円
    ・8週間コース:報酬80万円
    ※遠方からの参加の場合、希望と審査により宿泊代を支援します。
    ※交通費全額支給
    ※期間中、定められた日数内であればお休みいただくことは可能です。
    ※勤務時間10:00~18:30(休憩1時間)

ってサイトには書いてありますけど、詳しく書きますね。

まず「これだけ報酬が多いと、いろいろ他で払わないといけないものがあるのでは?」って最初に思うかもしれませんが、報酬は報酬なので、普通に振り込まれます。

次に宿泊代を支援とのことですが、私の場合はマンスリーマンションを会社に借りていただきました。駅から近く、その最寄駅からもオフィスのある渋谷まで乗換なしっていう超好立地のマンションでした。部屋もひとり暮らしする分には文句なしにいい部屋でした。地方学生にはありがたすぎる支援です。

f:id:Goryudyuma:20170506025501j:plain

(一枚だけ入った直後に撮った写真があったので貼っておきます。なお、年によってマンスリーマンションだったり他だったりするようですので、あくまで私の例ということでお願いします。)もちろん会社からの支援ですので、特にお金取られたりとかはなかったです。強いて言うなら生活用品少しだけ揃えました。家電は一通り揃っていたのですが、食料品とかシャンプーとかは流石になかったので。

交通費全額支給、たしかにされてました。インターンの往復とか、面接の往復とかも新幹線代出てました。

次は期間中の休みの制度ですね。これ、有給です。20日の勤務日のうち、2日までなら有給として休んでいいよ~って言われました。それ以上休むなら給与から天引、らしいです。まあ僕の場合有給一回も使わなかったので、関係なかったのですが。普通は学校行事等どうしても休まざるを得なくても大丈夫にするような制度らしく、インターン中に休むのはもったいなさすぎると感じていた僕には必要ない制度でした。

勤務時間、10:00~18:30ですね。残業とかないの?とかは気になりますが、むしろ残業しようとしてると怒られます・・・。てか怒られました・・・。インターン生は超ホワイトでしたね。社員さんの中には、僕より早く来て僕より遅く帰る人もいて、社会人すごいってなってました。もちろん人それぞれで、僕より遅く来られる人も結構いらっしゃったり。

さて、ここからは書いてないこと。

まず、一人一台、PC貸与があります。インターン前に、「/^(MacBookPro (13|15)inch (JIS|US)keyboard | Windows)$/の中から選んで!」ってメールが来たので、ちょっと迷って希望を伝えた所、「MacBookPro2016 15inch US keyboard」がきました。(この記事をあなたがいつ読んでるのか知りませんが、出てから半年たってないモデルです。)Macをメインで使ったことがなく、またUSキーボードもメインで使ったことがなかったので、挑戦してみた感じです。Macに慣れるのに少し時間がかかりましたけど、慣れた後は普通に使いこなしてました。

それから一人一台、Dell4Kディスプレイが貸与されます。これも結構便利に使ってました。コード読むのも何するのも楽でした。

あとは机や椅子、各種社内ツールのアカウント、オフィス入館証などをもらいました。

朝ごはん、早く行けば無料でおにぎりがもらえたりします。昼はカフェで弁当が安く買える他、社員さんと外にもよく食べに行っていました。その節はごちそうさまでした。夜は惣菜買ってきて食べたりが多かったですが、飲み会形式で社員さんと食べたり、最後の方は仲良くなった他のインターン生と飲みに行ったりしてました。てな感じで、健康的な(不健康的な?)食生活を送ってました。基本夜型の僕が昼型になってた点も特筆すべき事案かもしれません。

 

やったこと

次は具体的にインターン中何してたかについて。最初に書いたように、コードを貼ったりすることはそもそもできないのですが、Web上で公開されてる範囲で答えると、JavaのSpring-bootってやつでWebサイトみたいなのを作ってました。実はこんなスライドがありまして、

www.slideshare.net

(僕の見た範囲でも)LINEってJavaの会社って言っても過言じゃないくらい使われてました。後はいわゆる歴史的な経緯から、Perlも少し。

とまあ軽く言語の話題に触れたところで、インターンの流れを。

まず2月24日に卒論発表を終えて、その土曜日に新幹線で移動。関東の友人たちと遊んだあとマンスリーマンション入居。足りない物をリストアップし、買い出しなどをする。インターン一週間目は、オリエンテーションの後、支給されたMacに慣れること、環境に慣れること、Javaに慣れることなどを目標にしながら、社内のGithub Enterpriseのコードを眺めるなどしていた。社内特有の用語なども多く、自分で調べたり質問したりしてた。社内会議などにも参加させてもらい、いろんなところで取ってるデータがまとめられて共有されてて、大企業はここまでやるんだって思った。土日はICTSCってコンテストに2日とも引っ張り出されたので、特に休めずインターン二週目突入。初めてプロジェクトを持ち、ガリガリコーディングしていく。自分の力がどんどん発揮できて、(どの週も楽しんでやってたけど、この週は特に)楽しくて楽しくて仕方がなかった一週間だった。この後の土日は半日寝て半日遊ぶって感じで、ゆる~く過ごした。三週目、しっかり休めたのもあって少しだけクールダウン、企画の人やデザインの人とも話し合いながら担当プロジェクトをほぼ完成させた。同時にもう一つ仕事やってみることになった。四週目、一個目のプロジェクトの改善点が上がってきてはちょこちょこっと直しながら、2つめの仕事をこなしていたが、壁にぶつかる。仕様上の問題で、すぐには解決できそうになかったので、解決できそうな手法を一応提示して降りることになった。これを完成まで見れなかったのはとても残念。これにてインターン終了、翌日長野へ帰りました。

(どこまで書いて良いのか怪しいので安全マージン取ってかなりボカした結果、すごくわかりづらい文章になっていますね・・・)

 

報酬の使いみち

結構な額をもらっちゃったんで、使っていきたいのですが実はまだ手を付けてなかったりします。PC買うぞって決めたのは良いものの、まだどれにするか迷ってます。インターン中ずっとMac触ってましたけど、Windows(とサーバーで使ってるUbuntu)に慣れてる身からして、Macじゃなくても別にいいやってなりました。ここ、深く掘り下げると宗教戦争勃発してしまうのであんまり話したくないです(笑)。とりあえずいいパソコンを探して、今の5年目に突入したメインノートマシンを置き換えようと企画してます。「どんな高いノートパソコン買ったところで40万もいかんだろ?」って意見がありますけど、たしかにその通り(これは嘘で、40万超えのモンスターノートPCもあるにはありますが・・・。僕はいらないです・・・)。余ったお金でPC買いたいです。「ノートPC買うのにまたPC買うの?」ってなりますけど、こっちはデスクトップでそこそこの性能が出せるやつがいいですね。軽くて持ち運びが楽で充電持つノートPCと、性能の出るデスクトップ、一気に二台!大人買い(?)!買いたい!というわけで、今鋭意選定中です。

 

最後に

終わってから記事書くまで期間が空いたのは、文章書く気が起きなかったからですごめんなさい・・・。給料も振り込まれて修了記念の盾も届いて、もうここで書いとかないと一生書かないなと思ったので、頑張って書きました。(相も変わらず長文ごめんなさい。)

インターン中、社員さんには本当にお世話になりました!またいつか、一緒に仕事出来たらうれしいです!ありがとうございました!

 

インターン中に撮ったお気に入りの写真、貼っときますね。

f:id:Goryudyuma:20170506044313j:plain

 

@社員さんへ

出しちゃダメそうな情報は出してないつもりですけど、もし万が一漏れてたら至急

馬 (@Goryudyuma) | Twitter

 まで連絡ください。できるだけ早く消します。

セキュリティ・キャンプ2016 応募用紙

どうも、馬です。

なんか2017年セキュリティ・キャンプ全国大会の募集が始まった事により、

www.ipa.go.jp

 

去年以前にセキュリティ・キャンプに行った人の応募用紙がまとめられてるスプレッドシートができる事態になっています。

 

というわけで、僕も流れ的に晒して、スプレッドシートに載ろうと思います。

 

ただし一つ注意点。

晒してるみなさんはプロの人達ばっかで、それに比べて僕の応募用紙はみすぼらしいものとなっています。他の方と比較されると、どうしても劣って見えるかと思いますが、その点ご容赦ください。

 

問題文

https://www.ipa.go.jp/files/000053055.pdf

 

 

共通問題 【1-1】:https://063.jp/location2/  (今は動かしてない)
今いる場所から近い順に駅を表示するアプリを作りました。GPS情報が変わることをトリガーに情報を更新しているので、移動している時に、リアルタイムに一番近い駅を出せます。また、最寄り地点リストは、線路情報から、一番近い線路を出すことができます。このアプリにより、今どの路線に乗っていて、次の駅まで何mくらいあって、周辺の鉄道はどんな路線があるのかなどが簡単にわかるようになりました。
技術的な自慢としては、駅情報は約3万件、線路地点情報は約100万件のデータベースの検索を、一般的な土地では1秒以内に終わらせられるようにチューニングした点です。
また、googlemapへの表示も、なめらかにカーブが表示されるように工夫しています。

共通問題 【1-2】:サーバー側はPHP7でAPIが動いています。このAPIにリクエストを送ると、APIは駅情報などを保存しているMySQLに対してクエリを発行し、帰ってきたデータをJSON形式でクライアントに返します。
クライアント側はReact.jsで書かれています。また、表示をきれいにするために、bootstrapも用いています。

共通問題 【1-3】:組み終わったあとにブログ記事を書きました。
http://goryudyuma.hatenablog.jp/entry/2016/02/05/225848

共通問題 【2-1】:データベースの正規化がよくわからなかった。具体的には、正規化する目的、正規化するにはどうすればよいのか、正規化のメリットデメリットなど。
共通問題 【2-2】:ネットの記事を読み漁った。書籍では「理論から学ぶデータベース実践入門(奥野幹也)」を読んだ。また、実際に正規化を試してみたりした。
共通問題 【2-3】:正規化する目的は、同じデータを同じカラムにデータそのもののまま入れることを防ぐことにある。一つのデータを更新したい時に、データがそのまま入っている状態だと、そのデータと同じものをすべて更新しないといけない。しかし、そのデータそのものが入っているところにリンクとして入れておき、データそのものは別のところで持っておくことで、更新は一回ですむ。正規化する基準としては、同じデータが複数同じカラムに入っていて、更新がかかる可能性があるとき。メリットとしては更新時に一回のみ更新すれば良くなること、デメリットとしてはテーブルが増えてしまうので、きちんとドキュメント化しておかなければ管理できないほどテーブルが増えてしまうこと。
共通問題 【3-1】:5-A サーバー運用におけるパスワード管理
普段、自分はVPSを運用している。その上で動いているサービスや、他のところで動いているサービスには、パスワード認証が使われている物が多い。これからさらに自分が扱うサーバーの数は増えていくことが予想され、扱うパスワードも増えるであろう。まさにこの講義でパスワード管理の問題点と対処法を学び、自分の力としたい。

2-C 人工知能セキュリティ
詳細にも述べられている通り、人工知能に関するセキュリティと言われてもなにも思い浮かばないので、とても惹かれた。人工知能機械学習は様々な分野で使われており、自分も興味がある。確実に自分の知らないことを講義してくださると思うので、楽しみにしている。

3-A Webアプリケーションの脆弱性の評価と発見
Webアプリケーションを運用する上で、脆弱性は特にあってはいけないものだ。自分で作るときは自分で分かる範囲では対策するが、自分が知らない脆弱性については対処しようがない。個人レベルでしか脆弱性があるかチェックできないので、本講義を通して、より実践的な脆弱性の発見の手法を身につけ、今動いているWebアプリケーションや今後作るWebアプリケーションにおいて、脆弱性を発見して理解し、対処していきたい。

共通問題 【3-2】:今まで、自分はセキュリティに対して一種の恐怖感を持っており、例えばアプリケーションを作る際、できるだけ個人情報となりうるものは保存しないように徹底していた。個人情報を持ちたくないがために、作りたいと思ったアプリケーションの仕様そのものを変えたこともあるくらいである。自分程度が組むアプリケーションなら、脆弱性など有って当然だと思っていた。もし流出したら・・・と考えると、どうしても保守的な考え方になってしまっていた。しかし、そろそろわがままも言えない状態になってきていて、個人情報の保存に手を出さざるを得なくなりそうだ。もし可能ならば、セキュリティキャンプに参加し、セキュリティ脆弱性について知識をつけ、自信を持った上で今後のサーバー運用やアプリケーションの開発に挑みたい。
選択問題 【1】:
選択問題 【2】:
選択問題 【3】:
選択問題 【4】:プログラム(C++)

-----------


#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

#define DEBUG 0

struct FRH {
        char Magic[3];
        char Source[21]; /* null(‘\0’) terminated ascii strings */
        char Destination[21]; /* null(‘\0’) terminated ascii strings*/
        uint32_t DataLength; /* min 0, max 4,294,967,295 */
        char *Data; /* null(‘\0’) terminated ascii strings */
};

//デバッグ用の出力関数
void show(FRH now) {
        std::cout << "Magic       :" << now.Magic << std::endl;
        std::cout << "Source      :" << now.Source << std::endl;
        std::cout << "Destination :" << now.Destination << std::endl;
        std::cout << "DataLength  :" << now.DataLength << std::endl;
        std::cout << "Data        :" << now.Data << std::endl;
        std::cout << std::endl;
}

//条件1のチェック
bool checkCondition1(FRH now) {
        if (now.Magic[0] == 'R' && now.Magic[1] == 'H') {
                return true;
        } else {
                return false;
        }
}

//条件2のチェック
bool checkCondition2(FRH now) {
        std::string S = now.Source;
        transform(S.begin(), S.end(), S.begin(), ::tolower);
        if (S == "rise-san" || S == "cocoa-san") {
                return true;
        } else {
                return false;
        }
}

//条件3のチェック
bool checkCondition3(FRH now) {
        std::string D = now.Destination;
        transform(D.begin(), D.end(), D.begin(), ::tolower);
        if (D == "chino-chan" || D == "chino") {
                return true;
        } else {
                return false;
        }
}

//条件4のチェック
bool checkCondition4(FRH now) {
        std::string S = now.Source;
        std::string D = now.Destination;
        transform(S.begin(), S.end(), S.begin(), ::tolower);
        transform(D.begin(), D.end(), D.begin(), ::tolower);
        if (!(S == "cocoa-san" && D == "chino")) {
                return true;
        } else {
                return false;
        }
}

//条件5のチェック
bool checkCondition5(FRH now) {
        std::string data = now.Data;
        if ( ( int)data.find("BlueMountain") != -1 ||
                        (int)data.find("Columbia") != -1 ||
                        (int)data.find("OriginalBlend") != -1) {
                return true;
        } else {
                return false;
        }
}

//条件6のチェック
bool checkCondition6(FRH now) {
        std::string data = now.Data;
        if ( (int)data.find("DandySoda") == -1 &&
                        (int)data.find("FrozenEvergreen") == -1) {
                return true;
        } else {
                return false;
        }
}

int main() {
        //ファイルとして開く
        std::ifstream fin("pyonpyon.rh", std::ios::in | std::ios::binary);
        if (!fin){
                std::cout << "ファイルが開けません" << std::endl;
                return 1;
        }

        FRH now;

        //順番に処理する
        while(fin.readsome(now.Magic, 2)) {
                fin.readsome(now.Source, 20);
                fin.readsome(now.Destination, 20);

                //4byte読み込んでuint32_tに変換する
                now.DataLength = 0;
                char x[4];
                fin.readsome(x, 4);
                now.DataLength = 0;
                for (int i = 0; i < 4; i++) {
                        now.DataLength <<= 8;
                        now.DataLength += x[i];
                }

                //文字数+1だけメモリを確保する
                now.Data = new char[now.DataLength + 1];
                fin.readsome(now.Data, now.DataLength);

                //flagが一度でもfalseになればREJECTED、ならなければPASS
                bool passflag = true;
                if(passflag && !checkCondition1(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition2(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition3(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition4(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition5(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition6(now)){
                        passflag = false;
                }

                if(passflag) {
                        std::cout << "PASS" << std::endl;
                } else {
                        std::cout << "REJECTED" << std::endl;
                }


                if(DEBUG) {
                        show(now);
                }

                delete now.Data;
        }
}

-----------

以上プログラム

実行結果

-----------

PASS
PASS
REJECTED
PASS
REJECTED
PASS
PASS
REJECTED
PASS
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
REJECTED
REJECTED
REJECTED

-----------

以上実行結果

選択問題 【5】:OSとは、ハードウェア(物理的なもの)を操作する仮想的なインターフェースだ、と考えています。汎用OSでは、さまざまなメーカーが製造する部品の合作である現在のコンピューターを、共通のインターフェースで操作できるようにしようとしたものであり、逆に組込みシステムは、自分の会社の製品に特化して無駄な機能は取り除き、必要な機能のみにすることで、メンテナンスしやすくしたり保存に必要になる容量を少なくしたり、コストを下げたりできます。しかし最近、一台のハードウェアに対応するOSは一つである必要性はないという考え方が主流になってきました。マルチブートで複数のOSを一台のハードウェアに入れて、好みや役割により使いたいインターフェースを選ぶなどもできます。また、動いているハードウェアに対応するOSの上に、仮想的にハードウェアを作り対応するOSを動かす、バーチャルマシンもできてきました。
OSがハードウェアを操作するので、OSそのものには様々な機能が備わっています。OSがCPUをどのように使うのかを決め、OSがメモリをどのように使うのかを決め、OSがマウスやキーボードをどのように使うのかを決めます。OSはコンピューターのすべてを操作する頭脳の役割を果たしています。

選択問題 【6】:IDとパスワードを入力して認証ということは、どこかにデータベースがあり、そこでSQLが使われていると考えました。そこで、SQLインジェクションに対するセキュリティテストを行います。SQLインジェクションがもし成功すると、データの改ざんから個人情報の取得まで、幅広くダメージが与える事が可能です。一度でも信頼を大きく失ったアプリケーションは、今後使われることはないでしょう。これはとても大きな損害で、実際に問題になっています。
セキュリティテストテストですが、まず、IDやパスワードの入力欄に、「'」(シングルクォート)や「`」(バッククォート)などを入れて送信します。もし入力文字列をエスケープせず、文字列結合によりSQLを生成している場合、ここで何かしらのエラーや予期せぬ結果が出ます。
つぎに、入力欄に、「%」(パーセント)や「_」(アンダーバー)などを入れて送信します。入力文字列に適切なエスケープがされていなければ、ワイルドカードとなるのでこちらも予期せぬ結果が出力されるでしょう。

選択問題 【7】:
選択問題 【8】:
選択問題 【9】:マイナンバーカードは、本人とマイナンバーを紐付ける大切なカードである。別人に送られてはいけない。自分なら、カードの申請時に住所に誤りがないかをチェックしてもらい、情報が確認取れ次第、本人限定受取で郵送されるというクレジットカードの送付と似たシステムにするだろう。郵送時の誤りは極力抑えられるとして、申請時に誤りが入りにくいようにしなければならない。マイナンバーカードが発行されるのは、マイナンバーが発行された後なので、発行したい人はすでにマイナンバーを手元に持っているはずである。よって申請時には、マイナンバーと、氏名年齢などの個人を特定できる情報を要求し、データが一致していた時に申請が通るようにする。ネット弱者にも配布できるように、市役所などの窓口でも申請はできるようにしなければならないが、これはこの申請手続きの代行である。
選択問題 【10】:
選択問題 【11】:

 

 

(メールそのままコピってきた)

 

以上です。自分でもなんで通ったかあんま分かってないし、その分今後に期待されてるのかなと勝手に思ってます。今後とも、精進いたします。

終結

この記事は、kstmアドベントカレンダー25日目(最終日)の記事として書かれました。

qiita.com

 

まずは、25日間、一日も落とすことなく終えることができました!お疲れ様でした!

この記事は、特に技術的にどーとか言う話はナシで、純粋な心でMerry Christmas!と祝いましょう。

ちょっと最初に、ツッコミどころとして残っている所だけ突っ込まさせてください。(これ片付けとかないとオチオチ新年も迎えられない)

 

ツッコミどころ

その一:みんな締切守りすぎ

え、どゆこと!?絶対「記事遅れました~テヘペロ」って人一人くらい出ると思ってたのに!ふつーに締め切り守るとか、外に公開されてるものだからって張り切りすぎでしょみんな!!後から多少の編集したものはあるものの、全日当日夜には記事が公開されてて、「やればできるやん・・・」って思いました。

その二:続きがあると思わせぶりなタイトルの記事

「前半」「その1」とかタイトルに入ってたり、

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

強いkstm部員になるために(技術編) - bgpatのブログ

とか。早く続きが読みたいです!

 

kstmの活動

さて、アドベントカレンダーでだいたいkstmの雰囲気とかわかってもらえたと思います。そうです、kstmとは飲みサーです!

・・・って冗談で言ってますけど、実際そう言っても間違いではないです。もちろん未成年や飲みたくない者に飲ませることはしないですし、節度を持って飲みますけど、それは置いといて。"全員で"何かを成し遂げるってことは少なくて、その場にいたメンバーで「やろうぜ!」って声かけあって、コンテストに参加したりしています。または個人で勝手にやって、記録だけkstmに置いていくとか、最近は多いです。なので、「kstmの"みんな"は普段どんなことしてるの?」って聞かれると、「飲み会です」と答えざるを得ないのです・・・。

 

( 追記:上のことを書いておいたものの、後から検索してみても「kstmは飲みサー」とはアドベントカレンダーのどこにも書いてなかった・・・!誰か一言くらい触れてると思ってたのに・・・!

追記終わり )

 

それはさておき、kstmではコンテストや勉強会などに積極的に参加しています。一例として、去年度の活動記録を貼っておきます。

f:id:Goryudyuma:20161224234411p:plain

(kstmメンバーがコンテストや勉強会に参加する時に、kstmの名前で参加した他に、個人で参加して後からkstmの活動としてこのリストに入れたものがあります。)

今年度はさらに、ICTSCやISUCONなどで、参加しただけにとどまらず結果も残るようになってきました。先輩たちから受け継いできたゆるい雰囲気を維持しながらやるときはやる、っていういいサークルに更に磨きがかかってきたと思います。

 

メンバー募集

最後くらいダラダラ書いても仕方ないので、言いたいこと言ってしまいます。

kstmでは、メンバーを募集しています。信州大学生で、このアドベントカレンダーを見て興味を持った、活動に参加してみたくなったら、是非サークルメンバーにコンタクトしてください!見学だけでも大歓迎です!

 

来年のアドベントカレンダー

来年のことを言うと鬼が笑うと言いますが、笑って過ごせるクリスマスなんていいではありませんか。来年、やるとしたら、今回参加できなかったメンバーや、kstmに関わりのある人なんかを呼んで、もっと盛大に開催できればいいなーと思います。目標はメンバーの被りなし!ってことで、よろしくね、アドベントカレンダー総責任者のugwisくん!(丸投げ)

 

締め

これにて2016年度kstmアドベントカレンダー、終結です。

メリークリスマス!

それと、良いお年を!

来年もよろしく&がんばりましょう!!!