
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>ICTSC | monolog</title>
	<atom:link href="https://blog.monora.me/tag/ictsc/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.monora.me</link>
	<description>monora log #=&#62; ものろーぐ</description>
	<lastBuildDate>Wed, 09 Dec 2020 15:58:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.1</generator>
<site xmlns="com-wordpress:feed-additions:1">21279848</site>	<item>
		<title>ICTSCのコンテストサイトを支えた技術</title>
		<link>https://blog.monora.me/2020/12/technology-that-supports-ictsc-contest-site/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=technology-that-supports-ictsc-contest-site</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Wed, 09 Dec 2020 15:00:34 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ICTSC]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[whywaita Advent Calendar]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1653</guid>

					<description><![CDATA[<p>この記事は whywaita Advent Calendar 2020 の10日目の記事です。2週目です。来週何を書くか考えるだけで気が遠くなります。 昨日は @icchy さんで 「whywaitaであいうえお作文する [&#8230;]</p>
The post <a href="https://blog.monora.me/2020/12/technology-that-supports-ictsc-contest-site/">ICTSCのコンテストサイトを支えた技術</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>この記事は <a href="https://adventar.org/calendars/5082">whywaita Advent Calendar 2020</a> の10日目の記事です。2週目です。来週何を書くか考えるだけで気が遠くなります。</p>



<p>昨日は @icchy さんで 「whywaitaであいうえお作文する」でした。タイトルだけでだいたい想像できますね。</p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">whywaita: huge youth with aged insight to alcohol<br><br>(ref: <a href="https://t.co/dydlSQ25jD">https://t.co/dydlSQ25jD</a>) <a href="https://t.co/5ZLXsnMMM7">pic.twitter.com/5ZLXsnMMM7</a></p>&mdash; マットレス, がりょ1000 (@icchyr) <a href="https://twitter.com/icchyr/status/1336325587929976834?ref_src=twsrc%5Etfw">December 8, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<p>なるほど。</p>



<p><br />@icchy さんのおすすめインターネットコンテンツは<a href="https://alcoholog.hatenablog.jp/" title="https://alcoholog.hatenablog.jp/">飲酒日記</a>です。</p>



<figure class="wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-hatena-blog"><div class="wp-block-embed__wrapper">
<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="2020/12/01 - 飲酒日記" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Falcoholog.hatenablog.jp%2Fentry%2F2020%2F12%2F01%2F015540#?secret=kafpNdDwCr" data-secret="kafpNdDwCr" scrolling="no" frameborder="0"></iframe>
</div></figure>



<p>閑話休題。<br />アドベントカレンダー、書くネタはあれど頭を使うものばかりで泣きそうになったので、とりあえず過去の下書きを漁っていたらタイトルだけ書かれたこの記事の下書きを見つけました。<br />最近思うこともあったので、すでに忘れ去られ、誰もが忘れたままでいたいと思っていたICTSCのコンテストサイトの歴史を紐解いてみたいと思います。<br />whyawitaさんとの関わりもあるし、whywaita Advent Calendar的には100点満点のネタですね。よろしくお願いします。</p>



<span id="more-1653"></span>



<h3>ICTSCとは</h3>



<p>早速本題に入りたいのですが、そのためにはICTSCに関する簡単な知識が必要です。<br /><a href="https://icttoracon.net/archives/8570" title="https://icttoracon.net/archives/8570">ICTSC (ICTトラブルシューティングコンテスト)</a> は学生による学生のためのインフラ技術を競うコンテストで、最近は年1回開催されています。途中でナンバリングが回数から年号になるの、あるあるって感じですね。<br />予選もありますが、予選のことは一旦考えないこととして、本選の話をします。選ばれた本選の参加者は、当日の限られた制限時間内に与えられる問題へ挑むことになります。</p>



<p>問題は次のような形式で与えられます。</p>



<blockquote class="wp-block-quote"><p>「A社の技術者であるXさんは、自社の端末からあるWebサイトを開こうとするといつも失敗することに気が付きました。A社の社内ネットワークのトポロジは下の図のようになっており(省略)、ルータの管理コンソールへアクセスするために必要な情報はXXです。あなたはXさんに変わってこの問題を解決してください」</p><p>管理コンソールのIP: xxx.yyy.zzz.www<br />ユーザ名: admin<br />パスワード: nyannyan<br /><br />社内端末のIP, ユーザ名, パスワード: &#8230;</p></blockquote>



<p>参加者はこれらの情報を元に、持てる限りの知識と経験を活かして挑み、気合で問題を解決することになります。<br />(大会インフラとしてはVMがいて、仮想ないし物理のルータがいて……となりますが、今回の本題からはそれるので割愛します)</p>



<p>そうして、問題に不明点があれば質問をし (競技界隈では clar(ification) と呼ばれたりするみたいですね)、解決に必要な情報をまとめて回答します。基本的に回答はテキストで自由な形式で行われます。<br />運営は提出された回答を読み、必要があれば実際にVMへアクセスして回答の検証をし、採点を行います。<br />採点を行った結果、正答であれば点数が加算され、不正答であれば改めて参加者が挑戦する、というのが一連の流れになります。</p>



<h3>コンテストサイトの必要性</h3>



<p>ICTSCでは、約15問の問題が2日間かけて出題され、参加チーム数も15チーム近くに上ります。賞金が出るということもあり、運営は限られた時間内に公平性をできるだけ保ちつつ採点や質問対応といったタスクをこなさなければなりません。<br />15チームというのは意外と少なく見えますが、人数でいうと60人から80人近くおり、1つのチームでも分担して複数の問題に取り組んでいたりします。そうなると、意外と想像を絶する数の質問や回答が来ます。15チーム×15問で単純に225回答ですし。</p>



<p>私がICTSCの運営にジョインしたのは、遠い昔のICTSC5でした。当時はプロジェクト管理ツールである <a href="https://redmine.jp/" title="https://redmine.jp/">Redmine</a> を使って出題を行っていました。チームごとにプロジェクトを立て、問題ごとにIssueを立てて、そのコメントで質問や回答の管理をしていた気がします。<br />この構成で実際に開催を行ったところ、様々なトラブルが生じました。<br />質問や回答の状況が適切に把握できない(どの質問にまだ返答してないのか?採点は行われたか?)だけでなく、特定チームへの紙のトポロジ図の配布漏れ (これなんで紙で配ってたんでしたっけ?) などが生じました。</p>



<p>今思えばこれなんで起きたんだ?みたいなトラブルですね。Redmineを賢く使えば良かったのではないかと思ってきた……</p>



<p>さて、こういった課題に対処するために若者がやることは一つですね?<br />そう、<strong>「僕が考えた最強のコンテストサイトで解決しよう」</strong>です！</p>



<h3>コンテストサイトの開発</h3>



<p>さて、経緯はどうあれコンテストサイトの開発が始まります。正確にはすでに私の知らないところで一度頓挫していたのですが、忘れます。</p>



<p>今のコンテストサイトは様々あり(後述)、私が知らない構成になっているので、とりあえず私が知っている構成の最後の回のブランチへのリンクを貼ります。</p>



<p><a href="https://github.com/ictsc/ictsc-score-server/tree/ictsc2018">GitHub: ictsc/ictsc-score-server at ictsc2018</a></p>



<p>さて、途中で採用技術が二転三転している(なぜ?)ので、老害らしく順を追っていくことにしましょう。</p>



<h4>ICTSC6</h4>



<p>輝かしいコンテストサイト初回導入のときです。当時関わっていた人からはICTSC6の文字列すら見たくないという話も聞きます。当時の振り返りはこちら。</p>



<figure class="wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-monolog"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="bWqUq8X13t"><a href="https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/">第6回 ICTトラブルシューティングコンテストの運営委員をしていました</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="&#8220;第6回 ICTトラブルシューティングコンテストの運営委員をしていました&#8221; &#8212; monolog" src="https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/embed/#?secret=bWqUq8X13t" data-secret="bWqUq8X13t" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p><a href="https://github.com/ictsc/ictsc-score-server/tree/ictsc6">https://github.com/ictsc/ictsc-score-server/tree/ictsc6</a></p>



<p>開発が始まりました、技術的には、特に面白みのない簡単な REST API + SPA 構成です。</p>



<p>私はフロントエンド技術には疎かったので、同じ運営学生のメンバーの方と、スポンサーの中の方々に協力して頂きました。<br />一体本業外のこんなことにどれだけの工数を割いていただいたのか、想像を絶する状況になっていたことだろうと思います。本当にありがとうございました。</p>



<p>特に、デザイナーの方にはふわっとしたユースケースから具体的な行動パターンの書き起こしから何から何までお世話になってばかりでした。特に、第6回は初めてコンテストサイトを導入するので何が起こるかわからない、というときに「じゃあ念の為に紙の解答用紙も作っておきますね!」とネタで解答用紙までデザインして渡していただいたときは笑いました。</p>



<p>さて、当時の採用技術は次の通りです。</p>



<ul><li>REST API<ul><li>Ruby</li><li>Sinatra (Ruby のシンプルなWebフレームワーク)</li><li>ActiveRecord (Rails で使われている O/Rマッパー)</li><li>(SQLite3)</li></ul></li><li>Web UI (SPA)<ul><li>Angular 2.0</li><li>RxJS 5.0</li></ul></li></ul>



<p>REST API の方は私がRailsの経験がほとんどなかったので必然的にこうなりました。Web UIはおまかせしたらこうなりました。<a href="https://github.com/ictsc/ictsc-score-server/blob/ictsc6/ui/package.json" title="https://github.com/ictsc/ictsc-score-server/blob/ictsc6/ui/package.json">package.json</a> 見るとわかるんですけど、Angular 2.0 って当時まだRCなんですよね。尖ってますね<br />RxJSが使われたコード、当時ちょっと弄ろうとしたら手も足も出なかったきおくがあります。今なら読めるかもしれない</p>



<p>ところで、当時のREST APIには致命的な設計ミスがあり、REST APIでN+1をしていました。例えば、参加者が問題文の書かれたページを開くと、次のようなアクセスが走ります。</p>



<ul><li><code>/problems/2</code></li><li><code>/problems/2/comments</code></li><li><code>/problems/2/issues</code></li><li><code>/problems/2/issues/37/comments</code></li><li><code>/problems/2/issues/39/comments</code></li><li>&#8230;</li><li><code>/problems/2/answers</code></li><li><code>/problems/2/answers/27</code></li><li><code>/problems/2/answers/27/comments</code></li><li>&#8230;</li></ul>



<p>うーんひどい、典型的なN+1ですね。</p>



<p>N+1 はデータ量が少ないと影響が見えにくいので、この問題は回答や質問量が増えてきた2日目に顕著になりました。<br />そして当時の私はDBにインデックスを貼るということを知らなかったらしい。いま schema.rb 見て吐き気が……</p>



<p>そして、運営は全ての参加者の回答や質問を見ることができる、つまりどうなるでしょうか? 大変なことになります。<br />10秒経っても帰ってこないAPIが乱舞して開発者ツールはさながらナイアガラの滝の様相を呈していました。同一IPに同時に張れるセッション数限界までリクエストが飛んでドーン、返ってきたら第2弾がドーン、もう見たくない……</p>



<p>当時は完全にテンパっていたのでAPI側の修正を入れる余裕はなく、フロントエンド側で急遽キャッシュ等の対応を入れてもらったものの、却って新しいリソースが見えなくなるなどして大変でした。</p>



<figure class="wp-block-image size-large"><img width="640" height="344" src="https://blog.monora.me/wp-content/uploads/2020/12/b0b2b8f0-2cc5-4725-ad4f-e39880c3d9d1-640x344.png" alt="" class="wp-image-2210" srcset="https://blog.monora.me/wp-content/uploads/2020/12/b0b2b8f0-2cc5-4725-ad4f-e39880c3d9d1-640x344.png 640w, https://blog.monora.me/wp-content/uploads/2020/12/b0b2b8f0-2cc5-4725-ad4f-e39880c3d9d1-320x172.png 320w, https://blog.monora.me/wp-content/uploads/2020/12/b0b2b8f0-2cc5-4725-ad4f-e39880c3d9d1-200x107.png 200w, https://blog.monora.me/wp-content/uploads/2020/12/b0b2b8f0-2cc5-4725-ad4f-e39880c3d9d1-768x412.png 768w, https://blog.monora.me/wp-content/uploads/2020/12/b0b2b8f0-2cc5-4725-ad4f-e39880c3d9d1.png 1278w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>私が出題した問題の問題詳細ページ。VoIPに関するトラブルを出題しました。</figcaption></figure>



<p>そんなこんながありつつも、なんとか(?)大会は閉幕。次回への課題を残しつつ、コンテストは第7回へ続きます。</p>



<h4>ICTSC7</h4>



<p>知り合いのOB、みんなICTSC7の話しかしたがらんがち。<br /><a href="https://github.com/ictsc/ictsc-score-server/tree/ictsc7">https://github.com/ictsc/ictsc-score-server/tree/ictsc7</a></p>



<figure class="wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-monolog"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="bDdjtuEqVu"><a href="https://blog.monora.me/2017/03/had-been-a-steering-committee-of-ictsc7/">ICTSC7 の運営委員を務めました</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="&#8220;ICTSC7 の運営委員を務めました&#8221; &#8212; monolog" src="https://blog.monora.me/2017/03/had-been-a-steering-committee-of-ictsc7/embed/#?secret=bDdjtuEqVu" data-secret="bDdjtuEqVu" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>ICTSC6で辛酸を嘗めた私達[誰?]は、次こそは運営がトラブルシューティングしないコンテストにすべく様々な改善を行いました。</p>



<ul id="block-735dd9a3-4515-4519-855b-169cbe3c82ed"><li>REST API<ul><li>Ruby</li><li>Sinatra (Ruby のシンプルなWebフレームワーク)</li><li>ActiveRecord (Rails で使われている O/Rマッパー)</li><li>MySQL (MariaDBだったかも?)</li></ul></li><li>Web UI (SPA)<ul><li>Vue.JS 2.1</li><li>Vuex 2.0</li></ul></li></ul>



<p>API は N+1 問題を潰すべく、様々な対策が取られました。<br />その集大成が <a href="https://github.com/ictsc/ictsc-score-server/blob/ictsc7/services/nested_entity.rb" title="https://github.com/ictsc/ictsc-score-server/blob/ictsc7/services/nested_entity.rb">nested_entity.rb</a> です。この100行に満たないコードがこのコンテストサイトの真価といっても過言ではないでしょう。私はそう思います。<br />これは要するに「僕の考えた最強のGraphQLっぽいやつ」で、指定した関連リソースをいい感じに取ってきてくれます。<a href="https://github.com/ictsc/ictsc-score-server/blob/d5fc08d0f0d889092f5390885fa9c7669a4d06a1/controllers/problem.rb#L23">こうやって</a>使います。 こんな読みづらい使い方だからだめなんだわ。</p>



<p>これを使うと、上記のICTSC6の例が次の1リクエストで完結します。</p>



<ul><li><code>/problems/2?with=comments,issues-comments,answers-comments</code></li></ul>



<p>便利なのは分かりました。さて、ここで内部的には何をやっているのかというと、大きく次の2つのことを行っています。</p>



<ul><li>アクセスするユーザの権限によるRBAC (Role-Based Access Control) の適用</li><li>N+1を避けるクエリの生成</li></ul>



<p>コンテストサイトのユーザには、参加者や運営、スポンサーといったロールが割り当てられており、それぞれ見ることができる情報に差があります。例えば参加者が他チームの回答を見られては困りますね。</p>



<p>これ、すなわちRBACを実現するために、全てのロールに対してあらゆるモデルで読めるものを ActiveRecord の scope で定義しています。例えば<a href="https://github.com/ictsc/ictsc-score-server/blob/d5fc08d0f0d889092f5390885fa9c7669a4d06a1/db/model.rb#L421-L430" title="https://github.com/ictsc/ictsc-score-server/blob/d5fc08d0f0d889092f5390885fa9c7669a4d06a1/db/model.rb#L421-L430">こんな感じ</a>です。<br />scope とは何かというと、あらかじめ用意されたパラメータの指定可能なクエリといえばいいでしょうか。scope は <code>ActiveRecord::Relation</code> 型の値を返します。これは何かというと、ActiveRecord の抽象的なクエリ表現なので、これを更に合成したりできます。便利</p>



<p>クエリレベルでもN+1を避けるためにはどうしたら良いでしょうか? 気合でクエリを合成したらできそうです。<br />なんと ActiveRecord はクエリに <code>include</code> パラメータを渡すと勝手に合成してくれます。そうしましょう。<br />nested_entity.rb では、<a href="https://github.com/ictsc/ictsc-score-server/blob/d5fc08d0f0d889092f5390885fa9c7669a4d06a1/services/nested_entity.rb#L45-L47" title="https://github.com/ictsc/ictsc-score-server/blob/d5fc08d0f0d889092f5390885fa9c7669a4d06a1/services/nested_entity.rb#L45-L47">このあたり</a>で与えられたクエリパラメータをいい感じに ActiveRecord が解釈できる形に変換しています。</p>



<p>全てが ActiveRecord の世界で簡潔するので、RBACもN+1もクエリレベルで表現されます。これはすごくて、あとは全てのロールがアクセスできるリソースをActiveRecordのクエリで表現できれば大丈夫です。<a href="https://github.com/ictsc/ictsc-score-server/blob/d5fc08d0f0d889092f5390885fa9c7669a4d06a1/db/model.rb#L220-L247">つらい</a>、<a href="https://github.com/ictsc/ictsc-score-server/blob/d5fc08d0f0d889092f5390885fa9c7669a4d06a1/db/model.rb#L481-L513">二度とやりたくない</a>。</p>



<p>ちゃんとDBもMySQLにしてインデックスも貼ったので、APIも水平スケールできるようになりました。こうしてコンテストサイトの Iikanji Speed-Up に成功した我々は、その後数回に渡って予選敗退を繰り返しました。何が足りないん?</p>



<p>そして、フロントエンド担当のエンジニアの方の異常な熱意により、唐突に <a href="https://github.com/ictsc/ictsc-score-server/tree/ictsc7/ui2" title="https://github.com/ictsc/ictsc-score-server/tree/ictsc7/ui2">ui2</a> ディレクトリが爆誕しました。突然のAngular引退宣言に人々は涙を禁じえませんでした。</p>



<p>そうして開催されたICTSC7は、少なくともコンテストサイトについては成功裏に終わったといっても過言ではないでしょう。</p>



<p>ユーザから見える部分としては、問題がこれまでの2日間の午前午後、計4パートでの固定出題から、問題を解くごとに次の問題が解けるようになったり、最初に問題を解いたチームに追加点数(first blood)を与えるようになったりという変化の方が大きかったかもしれませんが、これもコンテストサイトの貢献ということで。</p>



<p>ちなみにこの頃のスクリーンショットがこちら。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="356" src="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-640x356.png" alt="ICTSC7 コンテストサイト" class="wp-image-1599" srcset="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-640x356.png 640w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-200x111.png 200w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-320x178.png 320w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-768x428.png 768w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site.png 1440w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>ICTSC8におけるコンテストサイトのトップ画面</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="218" src="https://blog.monora.me/wp-content/uploads/2020/12/bf705b46-8524-43f3-a4b9-8c2698fd1a86-640x218.png" alt="" class="wp-image-2211" srcset="https://blog.monora.me/wp-content/uploads/2020/12/bf705b46-8524-43f3-a4b9-8c2698fd1a86-640x218.png 640w, https://blog.monora.me/wp-content/uploads/2020/12/bf705b46-8524-43f3-a4b9-8c2698fd1a86-320x109.png 320w, https://blog.monora.me/wp-content/uploads/2020/12/bf705b46-8524-43f3-a4b9-8c2698fd1a86-200x68.png 200w, https://blog.monora.me/wp-content/uploads/2020/12/bf705b46-8524-43f3-a4b9-8c2698fd1a86-768x262.png 768w, https://blog.monora.me/wp-content/uploads/2020/12/bf705b46-8524-43f3-a4b9-8c2698fd1a86.png 1398w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>問題一覧画面の一部。このときは、出題された問題群ごとにちゃんと設定があり、その説明文が左に表示されていました。</figcaption></figure>



<h4>ICTSC8</h4>



<p>ICTSC8の記憶があまりありません。</p>



<figure class="wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-monolog"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="jTDaqetJT9"><a href="https://blog.monora.me/2017/10/had-been-a-steering-committee-of-ictsc8/">ICTSC8 の運営委員を務めました</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="&#8220;ICTSC8 の運営委員を務めました&#8221; &#8212; monolog" src="https://blog.monora.me/2017/10/had-been-a-steering-committee-of-ictsc8/embed/#?secret=jTDaqetJT9" data-secret="jTDaqetJT9" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p><br /><a href="https://github.com/ictsc/ictsc-score-server/tree/ictsc8">https://github.com/ictsc/ictsc-score-server/tree/ictsc8</a><br />コミットログを見ると、たしかに差分はあるけどあまり変わってないですね。確かプッシュ通知を実装しました。CyberAgentのFRESHチーム?が作った <a href="https://github.com/opensaasstudio/plasma" title="https://github.com/opensaasstudio/plasma">plasma</a> を使っています。</p>



<p>ICTSC8では小さなバグフィックスやルール変更の対応等はあったものの、それよりはテストを書くことにご執心だったようです。RSpecの鬼になったkyontanの姿が垣間見えますね。増える緑の. (RSpecではテストケースが1つPASSするごとに.がプリントされた)にエクスタシーでも感じていたんでしょうか。<br /><a href="https://github.com/ictsc/ictsc-score-server/tree/ictsc8/spec/requests">https://github.com/ictsc/ictsc-score-server/tree/ictsc8/spec/requests</a><br />相変わらず<a href="https://github.com/ictsc/ictsc-score-server/blob/fb5884fc643facdd0a76cd54f2cbe3be0a58cce1/spec/support/api_helpers.rb#L25-L55" title="https://github.com/ictsc/ictsc-score-server/blob/fb5884fc643facdd0a76cd54f2cbe3be0a58cce1/spec/support/api_helpers.rb#L25-L55">へんなヘルパー</a>定義しててウケました。そんなんだからお前のコードは人に読まれない。</p>



<p>そうして満足したので運営委員を引退しました。それはそれとして、参加記を見ると毎回のように後悔が綴られていますね。</p>



<h4>ICTSC9</h4>



<p>関わっていないのでほとんど分かりません。</p>



<p><a href="https://github.com/ictsc/ictsc-score-server/blob/3730cfaa8d62b14a573a1e3a5998f045993e2504/services/nested_entity.rb#L16">https://github.com/ictsc/ictsc-score-server/blob/3730cfaa8d62b14a573a1e3a5998f045993e2504/services/nested_entity.rb#L16</a></p>



<p>ほんまにすまんて</p>



<h4>ICTSC2018</h4>



<p>運営に出戻ったものの何したのか覚えてません。コンテストサイトには手を出していないはず。</p>



<p>このあたりで API 向けの CLI が生えたらしい。今までシードデータ投入をSQLでやってたのを、 REST API 経由でやるようにしたんですかね。</p>



<p><a href="https://github.com/ictsc/ictsc-score-server/tree/ictsc2018/cli">https://github.com/ictsc/ictsc-score-server/tree/ictsc2018/cli</a></p>



<p>あとはしれっと Kubernetes 化とかされている。モダンなインフラってやつ</p>



<p>私が知るのはここまでです</p>



<hr class="wp-block-separator"/>



<h4>ICTSC2019</h4>



<p><a href="https://github.com/ictsc/ictsc-score-server/commit/5d5fd505944f7df9314b5e6378c770fbd9cb6182">Big Bang! · ictsc/ictsc-score-server@5d5fd50</a></p>



<p>唐突に api2 と ui3 が爆誕する。担当者のキレ具合が垣間見えますね。僕も同情します。</p>



<ul id="block-3550f266-a2d7-42cf-ace3-fdc2ecf144a8"><li>REST API<ul><li>Ruby</li><li>Rails 6.0</li><li>GraphQL</li><li>PostgreSQL</li></ul></li><li>Web UI (SPA)<ul><li>Nuxt.js 2.0</li><li>Apollo Client 2.6</li></ul></li></ul>



<p>ザ・モダン・Webアプリケーション大全。僕の心境としては「GraphQLもどきを作って公園で砂遊びしてたらいつのまにか本物のGraphQLで置き換えられていた、何が起きているのか(ry」って感じです。<br />DB が Postgres に変わったのはなんでなんでしょうね? 僕は理由を知らないので知っている人がいたら教えて下さい。</p>



<p>増えた機能が多すぎて良くわかりませんが、Webでだいたいのリソースが編集できるようになってたり、問題VMへのアクセスに必要な情報を専用のテーブルで管理できるようになったりしたようです。憶測ですが、VMをプロビジョニングするいい感じのツールと連携していい感じにできるんじゃないですかね。</p>



<p>こうして生み出したプロダクトが自分の手を離れて育っていく様子をまだ学生の身にして実感することができました。ハッピー。</p>



<h3>万物は流転する</h3>



<p>私事になりますが、先日<a href="https://www.janog.gr.jp/meeting/janog47/" title="https://www.janog.gr.jp/meeting/janog47/">JANOG47</a>？っていう日本最大級のネットワークエンジニアの集まり？ってやつでNETCONっていうあいしーてぃーえすしー？みたいなのをやるって言われてあれやそれやで運営委員になりました。</p>



<p>どうやらコンテストサイトが必要らしいんですよね。</p>



<p>………というわけで最近<a href="https://github.com/janog-netcon/netcon-score-server" title="https://github.com/janog-netcon/netcon-score-server">fork</a>しました。これどうしたらいいんですか?</p>



<p>そんなこんなで、泣きながら Ruby の GraphQL実装を調べています。ドキュメントの大切さが目に染みる。</p>



<p>明日は同期だったはずのくるとんさんです。ワンワールドサファイアステータスを求めて飛び回りたいという発言を最近目にしましたがお元気ですか?</p>The post <a href="https://blog.monora.me/2020/12/technology-that-supports-ictsc-contest-site/">ICTSCのコンテストサイトを支えた技術</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1653</post-id>	</item>
		<item>
		<title>ICTSC8 の運営委員を務めました</title>
		<link>https://blog.monora.me/2017/10/had-been-a-steering-committee-of-ictsc8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=had-been-a-steering-committee-of-ictsc8</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 15 Oct 2017 08:49:46 +0000</pubDate>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[ICTSC]]></category>
		<category><![CDATA[ICTSC8]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1655</guid>

					<description><![CDATA[<p>こんばんは。 第6回 ICTトラブルシューティングコンテストの運営委員をしていました ICTSC7 の運営委員を務めました に引き続きのエントリになります。ちなみに記事はないですが第5回でも運営委員を努めさせて頂いていた [&#8230;]</p>
The post <a href="https://blog.monora.me/2017/10/had-been-a-steering-committee-of-ictsc8/">ICTSC8 の運営委員を務めました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>こんばんは。</p>
<ul>
<li><a href="https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/">第6回 ICTトラブルシューティングコンテストの運営委員をしていました</a></li>
<li><a href="https://blog.monora.me/2017/03/had-been-a-steering-committee-of-ictsc7/">ICTSC7 の運営委員を務めました</a></li>
</ul>
<p>に引き続きのエントリになります。ちなみに記事はないですが第5回でも運営委員を努めさせて頂いていたので、これで4回目になります。<br />
後述しますが5回目はないので運営委員シリーズはこれで最後です。(そもそもシリーズものではないですが……)</p>
<p>偉そうになんやかんや語っているところだらけですが、あくまで主観だし間違いも色々あると思います。ただの記録や雑感として受け取って頂ければ幸いです。</p>
<p><span id="more-1655"></span></p>
<hr />
<p>表題の <a href="http://icttoracon.net/archives/category/%E7%AC%AC8%E5%9B%9E%E3%83%88%E3%83%A9%E3%82%B3%E3%83%B3" target="_blank" rel="noopener noreferrer">ICTSC8</a> とは、正式名称を「スカイアーチネットワークス杯 第8回ICTトラブルシューティングコンテスト」と呼びますが、学生主体の学生による学生のためのインフラ技術中心のトラブルシューティング大会です。<br />
インフラ技術といっても色々ありますが、ここで指しているのは主に OSI参照モデルの L2-L7 あたりを指します。運営委員はL1もやってますが、問題としては出題されていないはず。</p>
<p>今回は電気通信大学で開催され、数回ぶりの学校での開催となりました。ちなみに前回, 前々回はNTT東西の研修センタで、その前は Cisco 東京本社でした。</p>
<p>前回、前々回となんらかのマネジメント的な役職についていましたが、今回はそうではなく、単なる平の運営委員としての参加でした。<br />
特に今回は何をしたということを主張することもしづらいような立場でしたが、問題を1問作り、あとはひたすらコンテストサイトに手を入れていた気がします。</p>
<p>作った問題はこれ (<a href="http://icttoracon.net/tech-blog/2017/09/14/%E5%95%8F%E9%A1%8C%E8%A7%A3%E8%AA%AC-%E3%83%9B%E3%83%93%E3%83%83%E3%83%88%E3%81%AE%E5%9B%BD-%E7%AC%AC%E4%BA%8C%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB/" target="_blank" rel="noopener noreferrer">問題解説: ホビットの国 第二のトラブル | ICTSC tech-blog</a>) で、ICTSC7 における運営側のトラブルを再現したものになりました。<br />
Keystone API のバージョン差異によるトラブルであったことまではわかっているのですが、未だに原因が究明できていない問題の一つです。<br />
OpenStack を理解している方には是非運営委員に来ていただきたいところ……</p>
<p>(実はもう一問作っていた問題があったのですが、自分の力不足により出題できず仕舞いとなりました……)</p>
<p>コンテストサイトについては、3回を通して色々とやってきたこともあるので、近日中に別の記事にまとめたいと思っています。<br />
引き継ぎは失敗したので、次回はないかもしれません。心残りのうちの1つです。</p>
<h3>きっかけ</h3>
<p>そもそものきっかけは、ふわっとしたサーバー/ネットワーク技術への興味があった自分を <a href="https://twitter.com/whywaita">@whywaita</a> 先輩が運営に引き込んできたところから始まりました。</p>
<p>スイッチとルーターって何が違うんだっけ、というような右も左も分かっていなかったアホの自分でしたが、実際の機器の操作やDCでの作業など、様々な経験をさせて頂けてとても学びになりました。<code>en, conf t, do show run, ...</code></p>
<p>そこに自分も何らかの貢献ができたり、その次の世代へ、というように流れを作ることができていたならよかったのかなと思います。</p>
<p>技術面では、いかに面白いことをするかということで <a href="https://github.com/a-r-g-v/ictsc6-nat-module">Linux のカーネルモジュール</a>を書いている人がいたり、OpenFlow をやったり、家が立つような価格の機材でなんやかんやしている人がいたりした一方で、目に見えるところでは<a href="http://katu7414.hatenablog.com/entry/2017/09/02/171123">シナリオを導入したり</a>も運営も満足できるコンテストにできるのかということを考えながら進めた運営でした。</p>
<p>至らぬところも数多くあり、<a href="https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/">人間関係が破滅し</a>チームとして動くことの難しさを感じました。やっぱり自分はマネジメントに向いていない……<br />
一方で、チームでしかできないこと、チームでやることの<a href="https://blog.monora.me/2017/03/had-been-a-steering-committee-of-ictsc7/">楽しさを感じた回</a>もありました。</p>
<p>特に、次の世代への引き継ぎという点では至らないところが多かったと思っていて、自分が運営委員を努めていた4回の中で新しく入ってきて、僕がやめることになった第8回の時点で次もやると言っていた方は5, 6名程度だったのかなという気持ちです。巻き込んで楽しいと思ってもらうというのは難しいですね。オーガナイズやマネジメントをする立場としては、やはりこういった巻き込み力が大切なのかなと思いました。</p>
<h3>暴論</h3>
<p>また、私はIPAの情報処理技術者試験でネットワークスペシャリストやらなんやらを取っていましたが、結局そういったものを得ることに大した意味はないのかな、などと思っています。百聞は一見にしかず。もちろん体系的な知識を得る機会になることそのものは良いと思っていますが、結局業務独占できない資格に大した意味は無いんや……!<br />
(しかし単に話のネタになるので、残る最後のテクニカルなスペシャリストであるところのデータベーススペシャリストぐらいは取っておくかぐらいの気持ちがあります。)</p>
<p>特にリーダー/副リーダーは20人規模のグループのマネジメント(ができていたかどうかはともかく)をすることになるわけで、こういったことに挑戦できる機会というのは学生ではなかなか得られないと思います。人やマネジメントということに興味を持つようになったのもこのあたりなのかなと。</p>
<p>もちろん社会人になってからもこういったことを経験する機会は多いでしょうし、学生しか失敗できないということはないでしょうが、それでもこういった機会があることは素晴らしいことだと思いますし、若いうちに積んでおいて損をするわけではないのかなと思います。<br />
(もちろん、そんなことをしている暇/隙があったら個人の技術を磨け、という論調もありますし、同意します。)</p>
<h3>最後に</h3>
<p>実際にそういったものに触れられる環境へ繋がる機会を下さった実行委員の皆様や、そこへ自分を引き入れてくれた運営委員の @whywaita を始め、一緒にICTSCの運営をした運営委員の皆に感謝します。ありがとうございました。</p>
<p><small>(しかし、僕が運営委員をやめたあとにも @whywaita が運営委員をしていることを観測しました。不義理を働いてしまった……)</small></p>
<p>次回はどうなるんでしょうね、楽しみです。</p>
<p>&nbsp;</p>The post <a href="https://blog.monora.me/2017/10/had-been-a-steering-committee-of-ictsc8/">ICTSC8 の運営委員を務めました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1655</post-id>	</item>
		<item>
		<title>ICTSC7 の運営委員を務めました</title>
		<link>https://blog.monora.me/2017/03/had-been-a-steering-committee-of-ictsc7/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=had-been-a-steering-committee-of-ictsc7</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 19 Mar 2017 18:18:05 +0000</pubDate>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[ICTSC]]></category>
		<category><![CDATA[ICTSC7]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1582</guid>

					<description><![CDATA[<p>こんにちは。 ICTトラブルシューティングコンテスト という学生が主体となってインフラやサーバに関するトラブルを起こして、学生が解決する(雑) な大会がありまして、その第7回、通称 ICTSC7 の運営側として参加してき [&#8230;]</p>
The post <a href="https://blog.monora.me/2017/03/had-been-a-steering-committee-of-ictsc7/">ICTSC7 の運営委員を務めました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>こんにちは。</p>
<p><a href="http://icttoracon.net/">ICTトラブルシューティングコンテスト</a> という学生が主体となってインフラやサーバに関するトラブルを起こして、学生が解決する(雑) な大会がありまして、その第7回、通称 <a href="http://icttoracon.net/archives/category/%E7%AC%AC7%E5%9B%9E%E3%83%88%E3%83%A9%E3%82%B3%E3%83%B3">ICTSC7</a> の運営側として参加してきました。</p>
<p>ちなみに、この前説は<a href="https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/">以前書いた記事</a>からコピーしたものを数字だけ変えただけです。</p>
<p>実際に大会の本選が行われたのが 2017/3/4, 5 (土日) でしたから、もう2週間が経ったわけです。忘れないうちに書き残して置こうと思います。</p>
<p>今回もフォトレポートを始め、参加者や運営委員の方々がレポートを上げてくださっているので、そちらもご参照ください。</p>
<blockquote><p><a href="http://icttoracon.net/archives/3741">NTT東日本杯 ICTSC7 レポートまとめ</a></p></blockquote>
<p>さて、改善点が多かったかと思えば最終的には反省点の山になり、上でリンクした記事を読み返したところ陰鬱な気持ちになった前回という大会がありました。それを元にして、今回はどうやって動いたんだお前という話です。</p>
<p>ちなみに活動期間ですが、2016/10/1 に運営委員結成開始, 2016/10/29, 30 にキックオフ合宿, 2017/2/18 より HotStage開始, 2017/3/4, 5 が本選でした。キックオフから数えて、4ヶ月に渡り活動していたことになります。</p>
<p><span id="more-1582"></span></p>
<h3>役割</h3>
<p>今回、私はインフラリーダーとして、リーダー, 副リーダーの下にいる3つのリーダー職 (インフラリーダー, 問題リーダー, イベントサポート) の1つを勤めさせて頂きました。<br />
改めてこれらの役割をまとめてみます。</p>
<p>リーダー, 副リーダー: 全運営委員 (今回は22名, ちなみに前回は16名) の指揮をする。また、機材折衝であったりイベント全体に関わる様々な部分において、実行委員(大人側)と調整を行う。<br />
問題リーダー: 運営委員によって作問された問題の品質を保証するのが目的。スケジュール管理や問題のバランス調整が主な役割ですが、今回はシナリオ作成も行ってくれました。<br />
イベントサポート: おそらく機能したのは今回が初。リーダーが今まで全てを担っていた機材折衝や管理の大部分を受け持ち、その他会場側との調整や、当日の段取りなど、実行委員側にお任せしていた内容を学生側でできる限り受け持つという目的のもと、それを主導する立場。<br />
インフラリーダー: 問題を出題する基盤となる、会場ネットワークの L1 ~ L7 を設計/実装し運営委員および参加者に提供する、インフラ担当の運営委員のトップ。</p>
<p>各役割は確か運営委員が結成して1, 2週間ぐらいで立候補形式で決定した記憶があります。<br />
あと、副リーダーが役職上しか存在していなかったという噂を聞きました。そういうこともあります。<br />
忙しさの順序で言うと、問題リーダー&gt;イベントサポート&gt;=リーダー&gt;=インフラリーダー ぐらいになるんじゃないでしょうか。あくまで今回の僕からみた主観的な感想です。ピーク値で言うと本選直前のイベントサポートが一番忙しそう。</p>
<h3>やったこと</h3>
<p>そんな中、自分が今回何をしたかを書いていきいます。<br />
端的にいうと、前回は副リーダーとして色々やり、やらかしましたが、それでも僕は前回の基本的な方針は間違えていないという信念を持ち、できる限り近い方針で運用をしつつ、それでいて自分でほとんどタスクを持たないようにしました。</p>
<h4>情報のやりとり</h4>
<p>インフラリーダーがやることなのか分からないですが、やりました。<br />
前回は Slack, Crowi (Wiki), Trello (ToDo管理), Google Drive (ドキュメント管理) の4つを主に使用していたはずですが、Trello を結局うまく使えず最新の情報が抜けまくってたのでやめました。<br />
つまり、Slack, Crowi (Wiki), Google Drive の 3つで運用しました。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-slack-channels-1.png"><img loading="lazy" class="alignleft wp-image-1590 size-medium" src="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-slack-channels-1-88x320.png" alt="ICTSC7 Slack チャンネルの一部" width="88" height="320" srcset="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-slack-channels-1-88x320.png 88w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-slack-channels-1-55x200.png 55w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-slack-channels-1.png 168w" sizes="(max-width: 88px) 100vw, 88px" /></a>例のごとく Slack は最高のチャットツールですが、ちゃんとチャンネル戦略を練らないと一瞬で破綻するのでちゃんとやります。<br />
具体的には左にあるはずの画像のような感じです。プレフィックスを良い感じにつけて、適度にサブチャンネルを付けると良い感じになります。(例: #infra 単体にしてしまうとサーバやネットワークといった異なる話題がごちゃ混ぜになってしまうので、 #infra-server, #infra-network を作るなど)<br />
今回は問題のチャンネル #problem-xxx を作り、その中で各自が検証の進捗を書くようにしたのが新しかったでしょうか。あと、前回は HotStage (本選2週間から東京へ運営委員が集まり、インフラやらなんやらの直前準備を行う機関) に #hotstage-XXX チャンネルを色々作っていたのですが、既存のチャンネルとの差別化ができなくて混乱したのでやめました。<br />
最終的なチャンネル数は 73チャンネル (うち分報15チャンネル, 問題個別21チャンネル) でした。メッセージ数は約47100メッセージ, うち59%が Public Channel でした。(前回は約48900メッセージ, 67%)</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-crowi.png"><img loading="lazy" class="size-thumbnail wp-image-1594 alignleft" src="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-crowi-166x200.png" alt="ICTSC7 Wiki Portal" width="166" height="200" srcset="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-crowi-166x200.png 166w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-crowi-266x320.png 266w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-crowi-532x640.png 532w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-crowi.png 623w" sizes="(max-width: 166px) 100vw, 166px" /></a><a href="http://site.crowi.wiki">Crowi</a> は最高の Wiki だと思います。ちょうど ICTSC7 が始まる前に 階層化 or 非階層化論争が再び起こり、Scrapbox も最近流行っているのかな、という感じはします。ただ、前回運用した知見があることに加え、前回の100ページを超える知見が溜まっていることは大きな利点だと感じ、前回の Wiki を継続して使用しました。<br />
Wiki 自体は前回の運営委員がアクセスするものとは異なるものを同じデータをクローンして作り、 <code>/ictsc7</code> という階層を切っただけです。<br />
今回だけで新たに 144ページが作成されました。これは個人的にはとても驚いていて、前回は全体の147ページの半分以上を自分が書いていたはずですが、今回は自分が書いたのはたかが10ページ程度だったので、そこまでページがあったとは思わなかったからで。<br />
今回は大人も含め積極的に Wiki にまとめるということをしてくれていた気がします。<br />
ただ、まだまだこの運用, Wikiには改善すべき点があると思っているので、どうにか模索したいところです。<br />
(例えば各ディレクトリ以下の情報をうまく収集して表にできたりすると、一々2つのページを手で更新しなくてよくて便利、など)</p>
<p>Google Drive は言わずもがなですね。基本的に Docs, Slides は使用しないので、 Sheets ばかりを乱用します。<br />
IPアドレス一覧であったりネットワークの管理はやはりスキーマがある方が圧倒的に便利ですし、Markdown の表はめっちゃ使いづらいので、やはりリアルタイム同期ができて実質 Excel な Sheets は最高です。Conditional Format を使うと割りと楽に綺麗にできるのも評価すべきところ。<br />
今回は1つのドキュメントにIPアドレスからVLAN設計からなにまで全部を詰め込みました。(今回は使っていませんが)シート間参照ができることと、別の内容を開きたい時にドキュメントを開き直さなくて良いのがメリットですね。ドキュメントを開き直さなくていいの、自明でしょという感じはしますが、Google Sheets の読み込みは結構重くてなんだかんだ10秒ぐらい奪われるのでシート切り替え1秒なんかで済むのは結構大きい気がします。逆にまとめることによるデメリットも今回だとないのかなと。</p>
<p>あとは、恒常的には使っていませんが HackMD はそこそこ使っていました。ミーティングの議事録なんかはこれで取るとリアルタイム同期されるのもあって便利です。</p>
<p>ちなみに、情報のやりとりがスムーズにできるとだいたいのことは良い感じに行く気がします。でもモチベーションの維持が大変ですが……</p>
<h3>インフラ</h3>
<p>インフラリーダーとして何をやったかというと、基本的になにもしていません。<br />
インフラリーダーがそれでいいのか良く分からないんですが、今回の運営委員はインフラに強そうな人がたくさん居たので、多分任せたら良い感じにいくんだろうなって思いました。<br />
おそらく僕がすべきだったのは進捗確認だったので、進捗確認と次にやるタスクの明確化だけは常に行いました。ミーティングについても、全体でのミーティングが月1程度だったのに対し、インフラ担当の中ではその倍の頻度である2週に1度の頻度で行いました。(週1開催という目標は達成できませんでしたが……)<br />
あとは一部機材折衝をしましたが、実際僕がやったのはここまでなので、実際にどういうことを運営委員全体としてしたのかをつらつら書きます。</p>
<p>ちなみに大会ネットワークというのは結構自由なもので、スター型であろうがフルメッシュであろうがリング型であろうが、気合さえあればやることができます。コンテストのルールすら自由に変えられますからね。</p>
<p>ちなみに前回 (ICTSC6) の HotStage 末期には、テンションが壊れた運営委員が「次回はオールSDN, オールIPv6, オールBGPでやるぞ」などと叫びこんなホワイトボードを書き残していましたが、知られていません。消したら消えました。当たり前ですね。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320.jpg"><img loading="lazy" class="aligncenter wp-image-1596 size-medium" src="https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-320x301.jpg" alt="夢 (ICTSC6)" width="320" height="301" srcset="https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-320x301.jpg 320w, https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-200x188.jpg 200w, https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-768x723.jpg 768w, https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-640x603.jpg 640w" sizes="(max-width: 320px) 100vw, 320px" /></a></p>
<p>さて、今回は SDN やってみようぜ! というテンションの元、いくつかの SDN 技術の検証なんかを最初の2ヶ月ほどを使ってやっていました。具体的には Midonet, OpenFlow, QinQ (これはSDNではない) なんかを検証し、どうにか取り入れられないかと試していました。結局色々な制約があってだいたいなくなったんですが、実は OpenFlow は競技ネットワークの片隅で動いていたりしました。参加者の皆さん、ご存知でしたか?<br />
ラックの上部にハードウェア OpenFlow スイッチがマウントされていたことに気が付いた方は何名いたのでしょうか。でも実際に OpenFlow が動いていたのはそれではなく、下から3番目にマウントされていたラックサーバです。すみません。</p>
<p>競技ネットワークには、プロビジョニングを簡単にするという目的のため、各チームのVMがそれぞれ同じIPアドレス, ネットワークアドレスを持つ設計になっていました。つまり、同じネットワークアドレスを持つネットワークが15個 (=チーム数) 存在していました。運営ネットワークからこれらのVMを区別してアクセスするため、VLAN ID を利用してIPアドレスを書き換える不思議なNATが前回に引き続き今回も存在しました。前回はこのNATの実装として、Linux の netfilter に適用するカーネルモジュールが書かれていましたが、今回はこれを OpenFlow を使った Open vSwitch での実装に置き換えました。コントローラーは Python の ryu でした。</p>
<p>話が飛びましたが、ネットワークの設計について、最終的には ICTSC6 の基本設計を踏襲しつつ、実装する技術の選定からはゼロベースで行う方針になりました。基本設計は基本的に毎回ゼロベースでやっても同じ結論に帰結することが多いので、そこの手間を省き実装に時間を割いたということになります。</p>
<p>実装がどう違うかというと、例えば前回使っていた Apache CloudStack が OpenStack Newton に変わる程度の変化がありました。これは大きな変化で、途中 Horizon というコンポーネントがなかったことにされる程度の些事はありましたが、期間全体を通して安定動作し、再構築も容易な OpenStack はやはり良かった気がします。(前々回も OpenStack でしたね。ちなみに前々回使ったときは諸事情あり Neutron が使えませんでしたが、今回は使えました。時代の進化を感じます)<br />
その他、過去2回に渡りインフラの都合で出題できていなかった IPv6 にまつわる問題を出題するため、コアネットワークに IPv6 を割り当てました。OpenStack の VM には必要性がなかった(+やはり不安があった)ため割り当てませんでしたが、Ocata では IPv6 Full Support らしいので、次回こそはあるかもしれませんね。また、これに伴い、対外接続を提供頂いた <a href="https://www.homenoc.ad.jp/">Home NOC Operator</a> 様には グローバルIPv6 アドレスの割当を頂きました。ありがとうございました。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2017/03/6054ef651edcb2a52508caa66659b0c6.png"><img loading="lazy" class="aligncenter size-thumbnail wp-image-1598" src="https://blog.monora.me/wp-content/uploads/2017/03/6054ef651edcb2a52508caa66659b0c6-200x146.png" alt="ICTSC7 無線LAN" width="200" height="146" srcset="https://blog.monora.me/wp-content/uploads/2017/03/6054ef651edcb2a52508caa66659b0c6-200x146.png 200w, https://blog.monora.me/wp-content/uploads/2017/03/6054ef651edcb2a52508caa66659b0c6-320x233.png 320w, https://blog.monora.me/wp-content/uploads/2017/03/6054ef651edcb2a52508caa66659b0c6.png 400w" sizes="(max-width: 200px) 100vw, 200px" /></a>また、会場で提供している無線LANから問題VMの提供されているネットワークへの疎通性を持たせたりもしました。少なくとも僕の知るICTSCである限りの直近3回でこれができたのは今回だけです。それに伴い、802.1X で良い感じに認証してそれぞれのチーム, 運営のVLANへ繋がるようになっていました。<br />
802.1X にすることで、参加者がLinux マシンを持ってきたら繋がらないのでは? という懸念がありましたが、幸い Linux マシンを持ち込んだ参加者は Network Manager で無事接続できたようです。ちなみに FreeBSD なノートPCでも繋がったらしいです。<br />
ただ、残念ながら、Network Manager の入っていない Arch Linux を使っているとある運営委員の ThinkPad では繋がらなかったらしいです。</p>
<p>そういえば DNS の構築は僕がやりました。今回は NSD をコンテンツサーバとして、Unbound をキャッシュサーバにしてやったみたいです。ゾーンファイルなんかは自動生成で適当にやるようにしたりもしました。ドメインがあるのは結構便利で、作業効率が若干上がった気がしますし早めに導入しておくと良さそうですね。<br />
え、Unbound + NSD は TAB問題だって? そりゃ DNS構築したときにハマったものを問題にしたんだからそりゃそうです。HotStage にねじ込んだらどこかの会社の1問目になっていてびっくりしました。<br />
ちなみに解答としては、SELinux を無効にする (or 有効にした状態で <code>10053/UDP</code> を NSD が Listen できるようにする)、iptables で <code>53/TCP, UDP</code> を許可する、 <code>unbound.conf</code> へ <code>insecure-domain</code> を追加する、<code>nsd.conf</code> の <code>172.16.0.0/16</code> がミスタイプであることに気が付き、 <code>172.16.0.0/12</code> に直すで満点です。文脈がわからないと何も分からないですね。<br />
ちなみに半分ぐらいのチームが解いたみたいで、半分のチームは2問目以降へ進めなかったということになりますが、上の通り初歩的なミスを連続でやらかしているだけなので、頑張りましょう。</p>
<p>問題といえば、KYF問題は面白かったですね。これは僕がキックオフで酒を飲んでした発言を本当に実現されたもので、WoLパケットを送るとVMが起動するっていう、何が起きてるのか分からない問題です。実際にはネットワーク上に隠しVMが居てパケットをキャプチャしていて、WoLパケットを拾うと OpenStack Nova API を叩いて VM を起動しているんですが、ここまで説明しても凄いのか良くわからないですね。でもその実装力はすごいと思います。</p>
<p>また話が逸れましたが、競技用ネットワーク全体でBGPルーティングされたりもしたみたいですよ。</p>
<p>ところで、ここまでを振り返ってみて、何かに気が付かないでしょうか。<a href="https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320.jpg"><img loading="lazy" class="aligncenter wp-image-1596 size-medium" src="https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-320x301.jpg" alt="夢 (ICTSC6)" width="320" height="301" srcset="https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-320x301.jpg 320w, https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-200x188.jpg 200w, https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-768x723.jpg 768w, https://blog.monora.me/wp-content/uploads/2017/03/IMG_0320-640x603.jpg 640w" sizes="(max-width: 320px) 100vw, 320px" /><br />
</a>今回のネットワークにおいて、IPv6 はコアネットワークと参加者の手元に到達性があり、OpenFlow が組み込まれ、BGPが周り、そしてRadius認証のある無線LANが提供されました。つまり、夢はだいたい叶ったということです。<br />
実際、前回こんなことを言っていたときには、こんなの叶うわけがないというニュアンスで笑いながら言っていましたし、そもそもこの話は今回の運営ではしていないので、本当に偶然なのですが。</p>
<p>結局、大会のインフラというのは合理性を取ると本当に何もなくなってしまうので、できる限り参加者に楽しんでもらえるように面白い要素を詰め込みつつ、いかに無駄な作業を省き、いかに面白い技術を取り入れ、そして安定したネットワークを参加者へ提供するかというところに向かっていくのが理想だと思います。そういった意味で、今回のコンテストはルールの面を始めとして参加者へ面白いものを提供し、インフラは結構面白いことができ、そこそこ自動化され、ちゃんと安定していたので良かったのではないかと。</p>
<p>次回はどうなるのか楽しみですね</p>
<h3>コンテストサイト</h3>
<p>今回も<a href="https://github.com/kyontan/ictsc-score-server">やりました</a>。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site.png"><img loading="lazy" class="aligncenter wp-image-1599 size-large" src="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-640x356.png" alt="ICTSC7 コンテストサイト" width="620" height="345" srcset="https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-640x356.png 640w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-200x111.png 200w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-320x178.png 320w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site-768x428.png 768w, https://blog.monora.me/wp-content/uploads/2017/03/ictsc7-contest-site.png 1440w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<p>アンケートを見る限り概ね好評だったようで、良かったです。初日の朝のミスは頭が真っ白になりましたが、<code>git push</code> してなかっただけでした。<br />
基本的に前回起きたパフォーマンス系の問題 (真面目にRESTしすぎてDoSになった問題) を解決しつつ、今回のルール変更へ対応し……というのを真面目にやりました。具体的にはスコアボードを実装したり、問題の公開条件を変更(時間による条件を廃止し、問題を解く度に次の問題が公開されるようになった)、みたいなところを修正しています。<br />
その他、真面目に SQL を勉強して ActiveRecord に泣かされたり、前回参加者に怒られたのがトラウマになったのでパフォーマンスチューニングをそこそこ真面目にやって5台の物理サーバを使い60物理コア, 120スレッドの環境で分散させたりした結果、Sinatra アプリケーションにもかかわらずエンドポイントによっては 1000req/s を優に超えたり (30~10000req/s) しましたが、実際には20req/s を超えることはほとんどありませんでした。ちゃんと負荷を見据えてエンドポイントを設計しなおしたのが功を奏したので、良かったです。<br />
あとちゃんとリクエストやら負荷やらを Zabbix + Grafana 可視化したりしてくれてました。<a href="https://blog.monora.me/wp-content/uploads/2017/03/891fba6b5c5dad09339bed6ceda4d6ff.png"><img loading="lazy" class="aligncenter wp-image-1597 size-large" src="https://blog.monora.me/wp-content/uploads/2017/03/891fba6b5c5dad09339bed6ceda4d6ff-640x146.png" alt="ICTSC7 コンテストサイトの負荷の推移" width="620" height="141" srcset="https://blog.monora.me/wp-content/uploads/2017/03/891fba6b5c5dad09339bed6ceda4d6ff-640x146.png 640w, https://blog.monora.me/wp-content/uploads/2017/03/891fba6b5c5dad09339bed6ceda4d6ff-200x45.png 200w, https://blog.monora.me/wp-content/uploads/2017/03/891fba6b5c5dad09339bed6ceda4d6ff-320x73.png 320w, https://blog.monora.me/wp-content/uploads/2017/03/891fba6b5c5dad09339bed6ceda4d6ff-768x175.png 768w, https://blog.monora.me/wp-content/uploads/2017/03/891fba6b5c5dad09339bed6ceda4d6ff.png 1205w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<p>懺悔になりますが、前回に引き続いてデザインとフロントエンドを実行委員の方へ<del>丸投げ</del>お願いする形になりました。また直前で負荷を掛けさせてしまい、すみませんでした……。フロントエンドが Angular2 から Vue2 に変わったのは何かの陰謀です。</p>
<p>ドキュメンテーションとリファクタリングとテストコードはこれからやります……。</p>
<h3>まとめ</h3>
<p>こんな感じで、僕は前回と同じでコンテストサイトの開発に没頭していたICTSCでした。<br />
全体としてもトラブルなく終わったと思っていますし、成功に終わったと言って良いでしょう。</p>
<p>まだまだやるべきこと、改善すべきことはありますが、ひとまずここまで。</p>
<p>ここに来るまでご尽力くださった、ICTSC7 のスポンサーの皆様、実行委員の皆様、そして支えて下さった運営委員の皆様へ感謝します。ありがとうございました。</p>The post <a href="https://blog.monora.me/2017/03/had-been-a-steering-committee-of-ictsc7/">ICTSC7 の運営委員を務めました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1582</post-id>	</item>
		<item>
		<title>第6回 ICTトラブルシューティングコンテストの運営委員をしていました</title>
		<link>https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=had-been-a-steering-committee-of-ictsc6</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Tue, 25 Oct 2016 10:51:23 +0000</pubDate>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[ICTSC]]></category>
		<category><![CDATA[ICTSC6]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">http://blog.monora.me/?p=1390</guid>

					<description><![CDATA[<p>ICTトラブルシューティングコンテスト という学生が主体となってインフラやサーバに関するトラブルを起こして、学生が解決する(雑) な大会がありまして、その第6回、通称 ICTSC6 の運営側として参加してきました、という [&#8230;]</p>
The post <a href="https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/">第6回 ICTトラブルシューティングコンテストの運営委員をしていました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p><a href="http://icttoracon.net">ICTトラブルシューティングコンテスト</a> という学生が主体となってインフラやサーバに関するトラブルを起こして、学生が解決する(雑) な大会がありまして、その第6回、通称 <a href="http://icttoracon.net/archives/category/第6回トラコン">ICTSC6</a> の運営側として参加してきました、ということです。</p>
<p>大会自体は8/27, 28 (土日) が本番でしたが、運営委員は 4/24 のキックオフMTGから活動が始まっていて、実に4ヶ月近くの期間があったことになります。</p>
<p>写真とかは公式のレポートにたくさんあるのでご参照下さい。</p>
<blockquote><p><a href="http://icttoracon.net/archives/3407">NTT西日本杯 ICTSC6 準備期間 レポート – ICTSC | ICT トラブルシューティングコンテスト</a></p>
<p><a href="http://icttoracon.net/archives/3417">NTT西日本杯 ICTSC6 DAY1 レポート – ICTSC | ICT トラブルシューティングコンテスト</a></p>
<p><a href="http://icttoracon.net/archives/3426">NTT西日本杯 ICTSC6 DAY2 レポート – ICTSC | ICT トラブルシューティングコンテスト</a></p>
<p>&nbsp;</p></blockquote>
<p>ICTSC には運営委員として、第5回 (ICTSC5) から関わっていて、ICTSC6 では運営委員の副リーダーなるものを務めさせて頂きました。<br />
(ICTSC6 は16人の運営委員と大人の方々による実行委員とスポンサーの方々によって成り立っており、その学生側ということです。)</p>
<p>ICTSC5 の反省を活かして、ICTSC6 のために自分が行ったことはとにかく1つに集約されていて、「とにかく見える化、情報の集約化を徹底して、何かをしたいときにすぐに行動できるようにする」というもの。</p>
<p>結局この記事は僕の自己満足ですし完全に主観で書いていて、最終的にはここに書いていない範囲、色々とよくないこともあったし、そもそも未だ僕が把握してない範囲で色々揉めたというのもあるのですが、結果としてそれを全部汲み取って解決できなかったのは本当に自分が悪いと思っています。未だももやもやとする気持ちもあります。<br />
責任転嫁するつもりはないし、頼むから直接言ってくれという気持ちです。</p>
<p>&nbsp;</p>
<p>以下、雑多に何をしたのか書いていきます。</p>
<p><span id="more-1390"></span></p>
<p>&nbsp;</p>
<p><small>ICTSC5 は、自分が初参加で周りが見えていなかったということもあるのだけれど、とにかく情報がブラックボックス化されていて誰が知っているのかすら良く分からないみたいな情報でつらかったという印象があった。</small></p>
<p>そのためにやったことは大きく2つあって、以下をしました。</p>
<ul>
<li>Wiki を作る</li>
<li>Slack で Public チャンネルを大量に立てて話題を分ける / 見える化する (Private チャンネルを減らす)</li>
</ul>
<p>Wiki は色々と模索した結果、 <a href="http://site.crowi.wiki/">Crowi</a> という国産の WIki が一番イケている印象があったので選択しました。半年間運用しましたけど本当に安定していて、ちゃんと動いて階層化ができて MarkDown がシュッと書けて良かったと思っています。<br />
開発も精力的に行われていて、大会運営の後半では Elasticsearch と連携して検索機能も実装されて更に便利になった。開発者の人とも Gitter でコミュニケーションが取れて良いプロダクト。</p>
<p>とにかくありとあらゆる情報はこの Wiki から参照できるようにして、他サービスとして利用していた Google Drive やら Trello やらも全部参照できる情報をここに載っけるようにした。<br />
合宿みたいなほぼ全員で集まる機会もあったので、Wikiの使い方をレクチャーしたり、みたいなこともした気がする。(あまりうまく行かなかったな、とは思っています)</p>
<p>結果としては、4ヶ月間で 147ページ ものページが作成されて Wiki で常に参照できる状態になった。<br />
僕は文書化をほぼほぼ機械的にしていて、Slack で議論された事柄を片っ端から Wiki にまとめるみたいなことをした。<br />
懸念していたのは、情報が錯綜することと古くなって参照されなくなることだったので、とにかくそこに気を使って更新を止めないようにした。</p>
<p>Crowi には Slack 連携機能があったので、#wiki-update みたいなチャンネルを作って通知を飛ばすようにした。<br />
基本的に人が寝ている時間に作業する人間なので、4時とか5時とかにバンバン通知を飛ばしていた気がする。</p>
<p>Slack については完全に議論と雑談をするためのフリースペースでいいという認識で、1万件問題についてはログを取って参照できるようにすればいいし、そもそも確定した重要事項については Wiki に書くのが大前提なんだから、いくら流れてもいいのでとにかく書いてくれというスタンスで運用した(つもり)。</p>
<p>分報 (#times_{username})を導入したのもそういう意図があるし、運営委員そのものが日本中に散らばっているので、そのコミュニケーションの要となる Slack はとにかくコミュニケーションでツーでカーな感じにしたかった。</p>
<p>とにかく議論が混乱しないよう、分野ごとにチャンネルを大量に作成して、分けて議論がそれたらすぐに該当するチャンネルへ誘導するといったスタンス。<br />
具体的には、 #infra やそのサブチャンネルとなる #infra-dc, #infra-network, #infra-server 問題作成に関連する #problem, 大会運営に関する #event-support などなど。times 含め59チャンネルが作成された (うち分報13チャンネル)</p>
<p>概ねこの方針は正しかったと思っていて、一部分けすぎて混乱したみたいなのはあったのですが、それでも全部が #random に書き込まれる世界よりはよっぽど健全だったと思っています……</p>
<p>そんな感じでやっていきました。</p>
<p>最後に、副リーダーとしてはリーダーの仕事を常に奪い続けるスタンスで行動していて、リーダーは常に手が空いてる状態を維持するように善処したつもりです。結局どうだったのかは人により意見が別れると思いますが、どうだったんだろう……</p>
<p>その他にも、無限に人にタスクを投げ続けるように立ち回ったつもりではあるのですが、結果としては僕がタスクを抱えすぎたり口を滑らせたりで本番直前で周りに大迷惑を掛けてしまったということが一番の反省点です。</p>
<p>結局、大会の運営というのは最終的にはどうやって人をマネジメントするかということに帰結していて、していますということです。</p>
<p>&nbsp;</p>
<p>改めまして、この大会にご尽力くださった運営委員、実行委員、スポンサーの皆様、そして参加して頂いた皆様には厚く御礼申し上げます。ありがとうございました。</p>
<p>&nbsp;</p>The post <a href="https://blog.monora.me/2016/10/had-been-a-steering-committee-of-ictsc6/">第6回 ICTトラブルシューティングコンテストの運営委員をしていました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1390</post-id>	</item>
	</channel>
</rss>
