
<?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>コンテスト | monolog</title>
	<atom:link href="https://blog.monora.me/tag/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.monora.me</link>
	<description>monora log #=&#62; ものろーぐ</description>
	<lastBuildDate>Tue, 26 Jul 2022 18:54:42 +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>ISUCON12 予選に参加しました (最終スコア15532点)</title>
		<link>https://blog.monora.me/2022/07/participated-in-isucon12-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=participated-in-isucon12-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Tue, 26 Jul 2022 18:01:43 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=2405</guid>

					<description><![CDATA[<p>2022年7月23日 (土) に開催された ISUCON12 の予選に「DJ起床失敗とMC布団 w/o MC布団」として id:h-otter と参加しました。 言語は Go、最終スコアは15532点、参考スコアを上から [&#8230;]</p>
The post <a href="https://blog.monora.me/2022/07/participated-in-isucon12-qual/">ISUCON12 予選に参加しました (最終スコア15532点)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>2022年7月23日 (土) に開催された ISUCON12 の予選に「DJ起床失敗とMC布団 w/o MC布団」として <a href="https://h-otter.hatenablog.jp/">id:h-otter</a> と参加しました。</p>



<p>言語は Go、最終スコアは<strong>15532点</strong>、<a href="https://isucon.net/archives/56838276.html">参考スコア</a>を上から数えると<strong>45位</strong>だったようです。悔しい。<br />具体的な取り組みは下の方で述べますが、MySQL移行はバグなく完遂し、さてここからチューニングしていくぞ！という感じのところで終わりました。エンジンが掛かるまでの速度が足りなかった。</p>



<figure class="wp-block-image size-large"><img width="640" height="342" src="https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-640x342.jpg" alt="" class="wp-image-2412" srcset="https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-640x342.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-320x171.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-200x107.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-768x411.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-1536x822.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a.jpg 1686w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>毎回、運営の皆様にはいくら感謝しても足りませんが、今回も取り組みがいのある問題で楽しかったです。ベンチマーカーも最後まで待ち時間がほぼなく、スコアも安定していたのでとてもストレスフリーでした。ありがとうございました。</p>



<p>マルチテナントで大量の SQLite3 データベースがあることが分かったとき、ISUCON本を読んだだけの人間には解かせないってことね!と思いながらニコニコしました。</p>



<p>ところで知り合いがたくさん著者に名を連ねている<a href="https://amzn.to/3J29GVW">ISUCON本</a>ですが、予選の2週間前に購入し、予選開始1時間前に部屋から発掘されました。<br />30分ぐらいで流し読みしたのですが、大変実利的な内容に溢れているなあと感じました。nginx の upstream で keep-alive を有効にする方法は知らなかった……</p>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">今日までに読もうと思って積んでいた本です。今日発見しました <a href="https://t.co/RSsbxMkoFD">pic.twitter.com/RSsbxMkoFD</a></p>&mdash; kyontan (@sukukyon) <a href="https://twitter.com/sukukyon/status/1550642844624617473?ref_src=twsrc%5Etfw">July 23, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



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



<h3>9:00 起床</h3>



<p>前日も早く寝るぞと自分に言い聞かせながら4時半まで起きてしまい、念には念で8時に掛けた目覚ましが1時間鳴っていました。すでにこの時点で心も体も終わっています。</p>



<p>部屋の隅にISUCON本が積まれているのを発見しました。<a href="https://amzn.to/3PxJipt">ちいとぽ</a>も積まれています。<br />h-otterと合流するために移動しつつ、パラパラと眺めます。</p>



<h3>10:00</h3>



<p>まだ合流のため移動中ですが予選が始まっているようです</p>



<h3>10:05</h3>



<p>合流しました。 CloudFormation テンプレートを流します</p>



<h3>10:22 初回スコア 2732</h3>



<p>起動したのでベンチを回しました。この時点で分担も何も決まっていません。</p>



<p>とりあえず kataribe を入れたり pt-query-digest を入れたりします。<br />「そういえば先日の社内ISUCONで Cloud Profiler 便利だったな……」みたいなことを思いながら、入れ方を調べます。<br />GCPプロジェクトが必要らしいので作ったり、サービスアカウントキーを発行したりします。予選始まってからやることではない。</p>



<h3>11:30ごろ</h3>



<p>Cloud Profiler を入れたので眺めました</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="251" src="https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-640x251.jpg" alt="" class="wp-image-2406" srcset="https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-640x251.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-320x126.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-200x79.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-768x302.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-1536x603.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-2048x804.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>SQLite だね〜という感想。</figcaption></figure>



<h3>12:00</h3>



<p>h-otter が MySQL 対応の実装を終わらせて、「Uber eatsでも呼ぶか〜」と言いながら、なぜか歩いてマクドナルドに飯を買いに行きます。なんで??</p>



<h3>13:03 MySQL移行 3023点</h3>



<p>MySQL移行が一段落します。今思うと速かった。</p>



<p>sqlite から SQL をダンプしてゴニョゴニョやり始めて十分程度経ったあと、 <code>sqlite3-to-sql</code> って名前のスクリプトあるけど?? と気付いて笑ってました。先に気付こうね。</p>



<p>とりあえず MySQL に流し込むこと数分、INSERT が一向に終わらないことに気が付きます。このままでは <code>POST /initialize</code> がタイムアウトしてしまうため、バルクインサートをするクエリに書き換えることにしました。</p>



<p>sed で気合でバルクインサートに書き換えましたが遅い。ここで1台目のインスタンスがメモリを食いつぶして死にます。160万件のINSERTを一発でやると死ぬことが分かる。<br />先日の社内ISUCONでもインスタンスのメモリを食いつぶしたんだよな……と思いながら1台目を捨てます。</p>



<p>これが答えです。</p>



<pre class="wp-block-code"><code>for i in `seq 1 100`; do echo $i; mv $i.sql $i.sql.bak; sed -z -e "s/);\n/);\n\n/" -e "s/NULL\n);/NULL\n);\n\n/g" -e "s/);\nINSERT INTO &#91;a-z_]* VALUES/)\n,/g" $i.sql.bak &gt; $i.sql; done</code></pre>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-640x302.jpg" alt="" class="wp-image-2408" width="640" height="302" srcset="https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-640x302.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-320x151.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-200x95.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-768x363.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-1536x726.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-2048x968.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>それなりに早くなりましたが、まだ遅いので tenant の player_score テーブルにおいて、 updated_at が一定以上のレコードを DELETE する作戦に切り替えます。これで10秒程度で POST /initialize が通るようになりました。</p>



<pre class="wp-block-code"><code>DELETE FROM tenant_X.player_score WHERE updated_at &gt; 1654041599;
DROP TABLE tenant_X.competition;
DROP TABLE tenant_X.player;</code></pre>



<p>他のチームの参加記を読んだら 「<code>/var/lib/mysql</code> をコピーする」「毎回 mysqldump を実行する」みたいな筋肉実装が多くて震えました……</p>



<p>確かここらへんで h-otter がなぜか flock を倒す実装を書くもベンチがコケました。<br />「そこはボトルネックじゃないっぽいし一旦revertしよ?」と、人の競技中の努力を無に帰すような心無い発言をしました。ごめんなさい。</p>



<p>なぜかここからしばらく無の時間が続きます。なぜ……</p>



<h3>15:20 3758点</h3>



<p>h-otter が competitionRankingHandler の N+1 を潰したようです。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="323" src="https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-640x323.png" alt="" class="wp-image-2410" srcset="https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-640x323.png 640w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-320x161.png 320w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-200x101.png 200w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-768x388.png 768w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-1536x775.png 1536w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-2048x1033.png 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>15:50 6336点</h3>



<p>グッとクエリを睨んで indexを追加。<code>playerAddHandler</code> がかなり速くなりました。</p>



<pre class="wp-block-code"><code>ALTER TABLE visit_history ADD INDEX (competition_id, player_id, created_at);
ALTER TABLE visit_history ADD INDEX (created_at);
ALTER TABLE tenant_X.player_score ADD INDEX (competition_id, player_id, row_num DESC);</code></pre>



<p>マルチテナントのDBをそのまま持ってきたので、tenant_id は無視するようにしました。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="225" src="https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-640x225.jpg" alt="" class="wp-image-2411" srcset="https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-640x225.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-320x112.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-200x70.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-768x270.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-1536x539.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-2048x719.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>16:08 7923点</h3>



<p>h-otter が <code>playerHandler</code> の N+1 を潰したようです。</p>



<p>そして <code>player_score</code> に index を追加。<br /><code>ALTER TABLE player_score ADD INDEX (player_id, competition_id);</code></p>



<p>バルクインサートと、JSONシリアライザの変更(encoding/json → <a href="https://github.com/goccy/go-json">goccy/go-json</a>)をした結果、スコアがやや増加しました。(8269点)</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="175" src="https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-640x175.jpg" alt="" class="wp-image-2415" srcset="https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-640x175.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-320x88.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-200x55.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-768x210.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-1536x420.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-2048x560.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>16:36 10253点</h3>



<p>なんかヤバそうな実装の dispenseId を倒しました。1万点突破。<br />よくわからんけど順序保証されてたほうが良さそうな気がしたので、 time.Now().UnixNano() を文字列にしてそのまま突っ込みました。爆速。</p>



<p>たしかこのあたりで、 tenant の <code>player_score</code> は <code>(tenant_id, competition_id, player_id)</code> ごとに最新の1行だけあればいいことに h-otter が気付きましたが、あまり速くならず。<br />この時点で row_num に関する index を落とすべきでした。</p>



<p>既存の <code>tenant_{1..100}</code> に対してもそれを適用しましたが、スコアとしては特に変化なしでした。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="188" src="https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-640x188.jpg" alt="" class="wp-image-2414" srcset="https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-640x188.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-320x94.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-200x59.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-768x226.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-1536x452.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-2048x602.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>このあたりでベンチマーカのログから、タイムアウトでユーザーが減ったという表示がなくなり、ようやくISUCON始まったな! という気持ちになります。すでに手遅れ。</p>



<h3>17:03 12505点</h3>



<p>h-otter が jwt のパース結果をキャッシュします。神</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="236" src="https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-640x236.jpg" alt="" class="wp-image-2417" srcset="https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-640x236.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-320x118.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-200x74.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-768x283.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-1536x566.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-2048x754.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>17:45 14363点</h3>



<p>app + DB の2台構成にした気がします。</p>



<h3>17:50 15962点</h3>



<p>流石にやや諦めムード。ログを切ったりできることをしました。<br />忘れずDEBUGログを切ったりスロークエリーを切ったりしました。偉い。</p>



<p>「再起動試験はしなくていいでしょ！」で終了</p>



<h2>感想</h2>



<ol><li>MySQL 移行をバグらせずに完遂できた俺達は偉い (本当に偉いと思っている)</li><li>毎回意味不明なバグを仕込んで後半暗澹たる感じにあるので、今回はほぼ最後までノーバグで駆け抜けられたのは良かった。良くも悪くも我々は大人になった</li><li>プロファイラ / スロークエリ / アクセスログの3本柱をちゃんと見ながら走れたのは本当に良かった。常に事実は正しい。fact based / metrics-driven</li><li>後半のスコアのブチ上がり方が楽しかった。というかここに来るまでを自分は第一関門を突破した段階だと思っている。やれる改善はたくさん残っていたし、あと1時間あれば更に2倍, 3倍のスコアは出ていたんだろうなと思うと悔しい</li></ol>



<p>そのほか</p>



<ol><li>午前中からの競技は本当に心も体も終了していて何も捗らなかった。ISUCONに必要なのは健康な心と身体</li><li>デカいテレビで h-otter がリゼ・ヘルエスタと名取さなの原神ガチャ配信をずっと流していた。「縁起がいいと思ったんだけどなあ」って何?</li><li>その後はリゼがパワプロしてた。リゼ・ヘルエスタについて私が知っているのは第一第二第三皇女のいずれかであるということぐらいです。</li><li>最後1時間ぐらいローテンションお嬢様 (壱百満天原サロメ)流したら集中力が0になった。何?</li></ol>



<p></p>The post <a href="https://blog.monora.me/2022/07/participated-in-isucon12-qual/">ISUCON12 予選に参加しました (最終スコア15532点)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2405</post-id>	</item>
		<item>
		<title>ISUCON9 予選の参加ログ (チーム: 再起動非対応)</title>
		<link>https://blog.monora.me/2019/09/reboot-not-supoprted-at-isucon9-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reboot-not-supoprted-at-isucon9-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 08 Sep 2019 13:44:34 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1998</guid>

					<description><![CDATA[<p>こんばんは、kyontanです。 前回再起動試験で落ちたのでチーム「再起動非対応」で参加しました。ベストスコアは4410点でした。再起動試験までたどり着けなかった……悔しい…… チーム「再起動非対応」は同期3人 (自分  [&#8230;]</p>
The post <a href="https://blog.monora.me/2019/09/reboot-not-supoprted-at-isucon9-qual/">ISUCON9 予選の参加ログ (チーム: 再起動非対応)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>こんばんは、kyontanです。</p>
<p><a href="https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/">前回</a>再起動試験で落ちたのでチーム「再起動非対応」で参加しました。ベストスコアは<strong>4410点</strong>でした。再起動試験までたどり着けなかった……悔しい……</p>
<p>チーム「再起動非対応」は同期3人 (自分 @kyontan, <a href="https://hogashi.hatenablog.com/">@hogashi</a>, <a href="https://h-otter.hatenablog.jp/">@h-otter</a>) での参加でした。学生は2人いたはずですがエントリーをミスったので学生は1人ということになっています。</p>
<p><span id="more-1998"></span></p>
<h3>使用した言語</h3>
<p>私はRubyが一番得意だと思っていますが、非同期処理が書きやすいとか型が着いていると嬉しい、みたいなことはあり今回も<strong>Go</strong>言語です。<br />
でも今回はN+1潰すときの型マッピングで無駄に時間を溶かしてしまったので、Rubyの方が良かったかもしれない……つらい……</p>
<h3>開始前の準備</h3>
<p>Prometheus/Grafana等のサーバの設定を @h-otter にお願いしました。前回のコードを読み返しつつ、何をしたかを思い出すなどした。</p>
<p>時間がなくて完全に忘れてしまいましたが、せめて練習はやっておくべきでしたね…</p>
<p>あと、 Alibaba Cloud の UI が色々不思議な感じで良かったですね。</p>
<h3>本番</h3>
<p>完全に正解していますが、今回はマイクロサービス問だということに気が付いたのは開始してからだいぶ経ってからでした。</p>
<blockquote class="twitter-tweet" data-width="550" data-dnt="true">
<p lang="ja" dir="ltr">開始30分前、チームメイトとの雑談「今日は何がでるかなー」「フリマアプリかオークションかそういうやつでしょ」「マイクロサービスとかね」「わかる〜」 <a href="https://twitter.com/hashtag/isucon?src=hash&amp;ref_src=twsrc%5Etfw">#isucon</a></p>
<p>&mdash; kyontan@新刊はまだ (@sukukyon) <a href="https://twitter.com/sukukyon/status/1170651769401069568?ref_src=twsrc%5Etfw">September 8, 2019</a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>今回できたことが異常に少ない気がする。kataribeのログを眺めつつ、チームでやったことは以下のことです。比較的時系列だけどそうでない部分もあるかも。</p>
<ul>
<li>開始スコアは <strong>2310</strong></li>
<li>10:30 メモリ多いな〜って思っていたら2, 3台目のインスタンスタイプを間違えていたことに気がつく。インスタンス立て直し
<ul>
<li>コードは既にリポジトリへ追加していたのでチームメイトはルール/コードリーディングを進める</li>
</ul>
</li>
<li>10:50ごろ: 作業開始</li>
<li>11:30ごろ?: MySQL 5.7 を 8.0 へ (@h-otter)
<ul>
<li>スコア変化なし</li>
</ul>
</li>
<li>11:45 DBにインデックスを張る(@kyontan)
<ul>
<li>多分間違えていて、これらにインデックスを貼りましたがあまり効いていなかったようにみえました</li>
<li>BigQuery の触りすぎでRDBのインデックスの挙動をほぼ忘れたのも敗北ポイント</li>
</ul>
</li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="raw">config (name)
items (created_at, id)
items (id)
items (buyer_id)
items (seller_id)
shippings (transaction_evidence_id)
transaction_evidences (id)
transaction_evidences (item_id)
users (account_name)
users (id)
</pre>
<ul>
<li>12:20: カテゴリをオンメモリへ (@hogas, @h-otter)
<ul>
<li><strong>2510点</strong>ぐらい</li>
</ul>
</li>
<li>12:30: http2 対応, 静的ファイルをキャッシュ, アップロードされた画像を nginx で返すなど
<ul>
<li>スコア変化なし</li>
</ul>
</li>
<li>13:30: config もキャッシュするように</li>
<li>14:00: 新着商品には発売中の商品だけを返すようにする (@hogas)</li>
<li>14:45  &#8211; 16:00: <code>GET /users/transactions.json</code><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;"> の N+1 を潰す (@kyontan)</span>
<ul>
<li><strong>3500点</strong>ぐらい</li>
<li>なぜか色々ハマって2時間半ぐらい溶かしていた。これは敗北ポイント</li>
<li>多分ここらへんでMySQLがサチらなくなっていた気がする
<ul>
<li>CPUがサチっていたことに気が付いていたが原因が分からず (pprofをなぜ見なかったのか……)</li>
</ul>
</li>
</ul>
</li>
<li>15:30: <code>UserSimple</code> が持つ情報は全てオンメモリでキャッシュする
<ul>
<li>ユーザの存在チェックだけするような部分 (権限チェック) も基本的にこれで対応できるのでそうした</li>
<li><strong>4210点</strong>
<ul>
<li>ここからスコア上がらず……</li>
</ul>
</li>
</ul>
</li>
<li>16:00: 同じクエリを何度か叩いているエンドポイントがあったので潰す (@hogas, @kyontan)</li>
<li>16:00ごろ: transactions 以外詰まってないしCPUに余裕があるので campaign (負荷レベル)を弄ったところ外部APIで 403エラー  {&#8220;error&#8221;:&#8221;IP address is not allowed&#8221;} が連発しだす
<ul>
<li>主に<code>GET /users/transactions.json</code> <span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;">での外部 shipment  サービスへのリクエストで連発</span></li>
<li>外部APIへの403はアプリケーション的には500を返す仕様だったので、これが連発してベンチマーカが途中終了し完走しない</li>
<li>ここらへんで手詰まりに</li>
</ul>
</li>
<li>17:00: 明らかに不要な <code>SELECT FOR UPDATE</code> を削除 (4箇所+ぐらい)
<ul>
<li>これかこれの次辺りで<strong>4410点</strong>。これがベストスコア</li>
</ul>
</li>
<li>17:10: 外部APIを叩く部分で exponential backoff を実装 (@h-otter)
<ul>
<li>変化なし / 403 が連発する</li>
</ul>
</li>
<li>17:30: 外部APIをリクエストするエンドポイントだけ2台へ分散する
<ul>
<li>403 の連発は解決せず、なぜ……</li>
</ul>
</li>
<li>18:10: 最終スコア0点 (failed) で終了</li>
</ul>
<p>色々施策を打つもスコアの変化要因が今ひとつ分からず頭が回っていなかったですね。<br />
特に外部API が undocumented な 403 を返す (しかもメッセージは 「許可されていないIPアドレス」) というのは全然分かりませんでした。<br />
マイクロサービス問題なら単一IPから連続でアクセスすると弾くようになっているのかな、などと思い、後半で外部APIへリクエストをするエンドポイントだけ複数台へ分散するなどしていましたが全く解決せず泥沼へ。</p>
<p>これベンチマーカと外部API側に問題あるのでは? みたいな気持ちになりつつ、マイクロサービス問だしちゃんとbackoffとか実行すればいけるでしょ! と思っていましたが、意図したエラーだったのかは未だに分からず……</p>
<p>他の方の感想を見た限りでは、ポータルサイトへ登録されていないIPからのアクセスは弾かれるみたいですが、これについてはUI上で正しく登録されていることを確認したので問題なさそうでした。<br />
11:00 ごろにインスタンスを立ち上げ直してIPを再登録したのがポータルサイトの何らかのエッジケースを踏んだのでは? などと勝手に邪推しています。謎ですね。</p>
<p>そのほか、 campaign の値を変えると何が変わるのか (POST系アクセスが増える?)、みたいなことも終了後にログを分析してようやくなんとなく傾向がわかり悔しい気持ちに。</p>
<h3>感想</h3>
<p>終わってみれば途中重大な気付き (「外部APIのレスポンスキャッシュできるじゃん」「ユーザの嗜好に合わせて商品出し分けたら?」など) があり、見逃しの多い回でした。<br />
bcrypt の件は全く気づいておらず。前回は初手でやった(があまり意味がなかった) pprof を今回なぜ見なかったのか……</p>
<p>短い時間で追い詰められている環境の中でどれだけ集中できる / 気付けるか、というのが重要になると改めて感じました。</p>
<p>コンテストとしては今回も設定が面白く、運営の手の込みようが分かり、かつ短期間で取り組みがいのあるとても良い問題でした。<br />
運営の皆様、大変お疲れさまでした。</p>The post <a href="https://blog.monora.me/2019/09/reboot-not-supoprted-at-isucon9-qual/">ISUCON9 予選の参加ログ (チーム: 再起動非対応)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1998</post-id>	</item>
		<item>
		<title>ISUCON8 予選に参加して再起動試験に落ちました</title>
		<link>https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=failed-reboot-test-in-isucon8-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 16 Sep 2018 12:35:11 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1864</guid>

					<description><![CDATA[<p>おはようございます。名取さなにハマっている kyontan です。 チーム「hhkb」で同期3人 (自分 @kyontan, @hogashi, @h-otter) 2回目の参加で2日目で Go 実装でした。学生枠突破な [&#8230;]</p>
The post <a href="https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/">ISUCON8 予選に参加して再起動試験に落ちました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>おはようございます。名取さなにハマっている kyontan です。<a href="https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129.png"><img loading="lazy" class="aligncenter wp-image-1867 size-medium" src="https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129-320x218.png" alt="" width="320" height="218" srcset="https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129-320x218.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129-200x136.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129.png 414w" sizes="(max-width: 320px) 100vw, 320px" /></a></p>
<p><figure id="attachment_1879" aria-describedby="caption-attachment-1879" style="width: 620px" class="wp-caption aligncenter"><a href="https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de.png"><img loading="lazy" class="size-large wp-image-1879" src="https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-640x502.png" alt="" width="620" height="486" srcset="https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-640x502.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-200x157.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-320x251.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-768x603.png 768w" sizes="(max-width: 620px) 100vw, 620px" /></a><figcaption id="caption-attachment-1879" class="wp-caption-text">最終スコア</figcaption></figure></p>
<p>チーム「hhkb」で同期3人 (自分 @kyontan, @hogashi, @h-otter) 2回目の参加で2日目で Go 実装でした。学生枠突破ならずでした、悔しい。というよりは <strong>55,982点</strong>で全体4位の点数で落ちました。ちなみに hhkb は h-otter, hogashi, kyontan, :boom: ???? の略です。<br />
スキルセット的には、 @h-otter がインフラ(ミドルウェア含)なんでもできる+Goの経験が一番あるマンで、 @hogashi がアプリケーションなんでもできるマンで、 @kyontan はアプリとインフラとDBを一通り見られるマンみたいな感じでした。</p>
<p>今回の参加に向けて、取り組んだことをつらつらと書きます。</p>
<p><span id="more-1864"></span></p>
<p>今回は真面目に本戦に行きたかったので前々日に ConoHa で ISUCON7 の予選を解き直して練習しました。具体的には ConoHa の練習用イメージを使って 1GBプラン x3台で予選環境を再現しました。結果、10時間程度で 5,204点から509,190点まで持っていけることが分かり、計測と試行の反復を効率的に行えば ISUCON の予選は突破できるという確信を深めていました。<br />
また、前回は最後の最後でベンチマーカを走行させた結果点数が下がって落ちたので、前回の直後に「泣きの1回はやらない」というスローガンを掲げ、1年越しでそれを達成しました。</p>
<p><figure id="attachment_1875" aria-describedby="caption-attachment-1875" style="width: 620px" class="wp-caption aligncenter"><a href="https://blog.monora.me/wp-content/uploads/2018/09/score_init.png"><img loading="lazy" class="wp-image-1875 size-large" src="https://blog.monora.me/wp-content/uploads/2018/09/score_init-640x160.png" alt="" width="620" height="155" srcset="https://blog.monora.me/wp-content/uploads/2018/09/score_init-640x160.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/score_init-200x50.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/score_init-320x80.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/score_init-768x192.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/score_init.png 984w" sizes="(max-width: 620px) 100vw, 620px" /></a><figcaption id="caption-attachment-1875" class="wp-caption-text">ベンチマークの初回走行の結果しばらく1位になった</figcaption></figure></p>
<p>事前に準備したのは Prometheus のサーバ (@h-otter がいい感じにやってくれた)と、やること/できることチェックリストぐらいでしょうか。だいたい大会では開始した瞬間にテンパってそのまま撃沈するのが常なので、思考停止状態でもコピペで動くようなコード片とかを用意しておくと便利ですね。あとは思考が無になったときに確認するべき事項とかを作っておくと良いのではないでしょうか? 頻繁に無になって帰りたくなりました。メンタルは大事。</p>
<p>例えば下のような感じです。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3.png"><img loading="lazy" class="aligncenter size-large wp-image-1868" src="https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-640x433.png" alt="" width="620" height="419" srcset="https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-640x433.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-200x135.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-320x216.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-768x519.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3.png 1062w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<p>当日は3人がローカルで開発し、本番環境のVMへバイナリを転送して検証する、という進め方でやっていました。Go はクロスプラットフォームでのビルドがしやすいのが便利ですね。</p>
<p>具体的にやったことを羅列します。というか @h-otter が書いていたのを未承諾引用します。順番は適当</p>
<ul>
<li><code>SELECT *</code> する系のクエリを必要な列しか取らないようにした</li>
<li><code>/api/users</code> は <code>user_id</code> で <code>reservations</code> を全部とってきて、アプリ側で処理してやったらめっちゃ速くなった
<ul>
<li>ここでベンチマーカが重いと言ってくるエンドポイントが <code>/users/:id</code> から <code>/api/events/:id/actions/reserve</code> になった</li>
</ul>
</li>
<li><code>getEvent</code> を <code>getEventWithoutDetail</code> と分けた</li>
<li><code>getEvent</code> と <code>getEvents</code> を2クエリに</li>
<li><code>sheets</code> へのクエリを消す
<ul>
<li>効果があったのかは良くわからない</li>
</ul>
</li>
<li>MariaDB のチューニング</li>
<li>Prometheus と Grafana で可視化</li>
<li>ログインのクエリを1つに</li>
<li>パスワードを平文で突っ込むようにした</li>
<li>DB にインデックス張った (けどあまり良い結果がでなくてもんにょりした)
<ul>
<li>最初に <code>mysql</code> コマンドでインデックス張ったけど結果が全く変わらなくて、なぜ? と思ったら毎回 <code>/initialize</code> でテーブルを作り直していることに気がついた。</li>
</ul>
</li>
<li>IN句を使いたかったので DBにアクセスするライブラリを sqlx に切り替えた</li>
<li>トランザクションの開始がおかしいところがあったので直したり デッドロック時にエラーを返さずリトライするようにした</li>
</ul>
<p>最後は予約時のシート決定を高速化するコードが安定化しなくて入らなかったり、Redisでいい感じにやろうぜみたいなことを思うだけ思ってやらなかったりしました。多分ここができると数万点上がったはず。</p>
<p>あとはスコアに関係ないけど作業便利になる系として、 エラーログでソースコードの行番号を吐くようにしたり、 <code>Makefile</code> 弄って1コマンドでデプロイできるようにしました。<br />
開発は3台のサーバでバラバラにやっていましたがDBは1台だけを参照するようにしました。これはDBのチューニングとかがあって、1台でやった変更を他に反映したりするのが面倒くさかったので。こうすると、やりたい人間が適当にベンチマーク対象のサーバを変更して実行してやればいいので楽でした。</p>
<p>ソースコードは GitHub で管理し、いい感じにやりました。コミットログは下の通りです。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814.png"><img loading="lazy" class="aligncenter size-large wp-image-1866" src="https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-308x640.png" alt="" width="308" height="640" srcset="https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-308x640.png 308w, https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-96x200.png 96w, https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-154x320.png 154w, https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814.png 559w" sizes="(max-width: 308px) 100vw, 308px" /></a>数字がタグに付いていることがありますが、これはいいスコアが出た時にバイナリごとコミットしてタグつけておこうぜ、みたいな感じにした結果でした。</p>
<p>今回の僕の活躍はよく分からなくて、いい感じデバッグ担当だった気がします。PRを見るなりとりあえずマージしてベンチマーカを落としたりバグ探しをしていたりしました。とにかく @h-otter がぶち壊しつつ @hogashi がいい感じに安定化するコードを書いてくれてよかった感がある。</p>
<p>Webサーバはh2oで十分高速だし、画像のトラフィック詰まりもないしで、とにかくアプリケーションコードの改善に注力した/するしかなかった8時間でした。</p>
<p>最終的に残り30分でベンチマーカを叩いたところ3万点前後のスコアが5万点に若干跳ねてそこで打ち止め。一度再起動をしてブラウザからアクセスできることを確認し天命を待ったところ、無事再起動試験で落ち失格となりました。天命……</p>
<p>(追記: スコアが跳ねたのは、最後に実行先サーバを変えた時に インデックスを張る処理を <code>init.sh</code> に書いたサーバで実行したからかもしれないことを思い出した。)</p>
<p>なぜ失格になったのかは分かっていなくて、おそらく <code>/admin/api/reports/events/:id/sales</code> の処理が遅くて不整合が起きて落ちたのかなあなどと思っていますが、2回連続で落ちるのは運が悪かったなと……</p>
<p>なんやかんやでやることがなくならない8時間で、やることが見つからない8時間よりは良かったのではないかと思います。</p>
<blockquote class="twitter-tweet" data-width="550" data-dnt="true">
<p lang="ja" dir="ltr">ISUCONの予選に向けて昨日は練習をしていたわけだけど、知っていることをちゃんと愚直にできれば比較的現実的な時間で予選突破ラインには十分立てることが分かったので良かった</p>
<p>&mdash; kyontan@新刊はまだ (@sukukyon) <a href="https://twitter.com/sukukyon/status/1040457052307447810?ref_src=twsrc%5Etfw">September 14, 2018</a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>イキっているなどと言われてもこれは事実だと信じていて、典型的な N+1 を潰すなどすれば予選は通過できるはずなことは分かりましたね。くぅ〜〜</p>
<p>来年はちゃんと本選に行けたらいいですね。頑張りましょう。</p>
<p>そして、参加会場を提供していただいた mixi 様、惜敗の悔しさを教えてくれる最高のコンテストを運営をしていただいたISUCONの運営の皆様、お疲れ様でした、ありがとうございました!</p>
<p>以下は画像です</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/score_2.png"><img loading="lazy" class="wp-image-1877 size-large" src="https://blog.monora.me/wp-content/uploads/2018/09/score_2-640x141.png" alt="" width="620" height="137" srcset="https://blog.monora.me/wp-content/uploads/2018/09/score_2-640x141.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/score_2-200x44.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/score_2-320x71.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/score_2-768x170.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/score_2.png 1000w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/score_3.png"><img loading="lazy" class="wp-image-1876 size-large" src="https://blog.monora.me/wp-content/uploads/2018/09/score_3-640x139.png" alt="" width="620" height="135" srcset="https://blog.monora.me/wp-content/uploads/2018/09/score_3-640x139.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/score_3-200x43.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/score_3-320x70.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/score_3-768x167.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/score_3.png 984w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>The post <a href="https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/">ISUCON8 予選に参加して再起動試験に落ちました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1864</post-id>	</item>
		<item>
		<title>ISUCON7 予選に参加しました</title>
		<link>https://blog.monora.me/2017/10/participated-isucon7-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=participated-isucon7-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 22 Oct 2017 17:29:29 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1665</guid>

					<description><![CDATA[<p>チーム「まだチーム名で消耗してるの?」で同期3人 (自分 @kyontan, @hogas, @h-otter) 初参加で2日目でした。学生枠突破ならずでした。 Ruby実装で挑み、最終スコア 38605点@2017-1 [&#8230;]</p>
The post <a href="https://blog.monora.me/2017/10/participated-isucon7-qual/">ISUCON7 予選に参加しました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>チーム「まだチーム名で消耗してるの?」で同期3人 (自分 @kyontan, @hogas, @h-otter) 初参加で2日目でした。学生枠突破ならずでした。</p>
<p>Ruby実装で挑み、最終スコア 38605点@2017-10-22 20:59:30, ベストスコア: <strong>67792点</strong>@2017-10-22 20:44:59 でした。<br />
ベストスコアでは予選ラインは超えていたんだなあと思いますが、最終的には伸び悩んだチームも多いようで、結局落ち着くところに落ち着いたのかなと思います。</p>
<p>ソースコードは <a href="https://github.com/kyontan/isucon7_qual">kyontan/isucon7_qual</a> です。踏み台でやっていた影響でコミッタが僕に見えますが、だいたい僕ではない。</p>
<p><figure id="attachment_1668" aria-describedby="caption-attachment-1668" style="width: 620px" class="wp-caption aligncenter"><a href="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart.png"><img loading="lazy" class="wp-image-1668 size-large" src="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-640x254.png" alt="" width="620" height="246" srcset="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-640x254.png 640w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-200x79.png 200w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-320x127.png 320w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-768x304.png 768w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart.png 1696w" sizes="(max-width: 620px) 100vw, 620px" /></a><figcaption id="caption-attachment-1668" class="wp-caption-text">ISUCON7 予選での Score / LoadLevel の変化</figcaption></figure></p>
<p>次回も参加したいなという気持ちになってきたので、ひとまずはやったことを記していきます。</p>
<p><span id="more-1665"></span></p>
<p>実は僕と @hogas は ISUCON6 の夏期講習に出たことがありましたが、そのときには日程等もあり参加しておらずということで、今回が初参加に。<br />
@h-otter というインフラに<strong>とても強い</strong>同期がいたことや、周囲でも参加する人間が何故か多く、とにかくやっていくしかないという流れに。</p>
<p>チーム名を決めるところで消耗/摩耗し、本番前日までSlackはほとんど流れておらず。前日夜になって僕とか @h-otter がぽちぽち参加記やチューニングできそうなところを貼っていく感じに。</p>
<p>最近、正午より前に起きると早起きしたと言い出す僕が時間に間に合っていたあたりで色々とミスっていたんですが、東京都内の某所で3人で集まってやっていました。</p>
<h2>事前にやった</h2>
<p>とりあえずグローバルIPを持つ作業用サーバを用意しておいた。Rubyは事前に入れておいて、開始後に MySQL  も入れてスタンドアロンで動くようにした。あとあと @hogas はここでずっと作業してたり、 @h-otter が Prometheus のサーバを立てたりしていた。便利</p>
<p>コードについては GitHub リポジトリを立てて、普通にブランチ切ってやっていた。便利</p>
<p>情報共有は対面だったので、コードスニペット貼れるしリアルタイムで最高な HackMD を例のごとく使っていた。ベンチマーカの結果を全部ペタペタ貼っていたら容量制限に引っかかり、2スレ目、3スレ目が誕生した。HackMDのタイトルは<strong>「ISUCON7 まだチーム名で消耗してるの? 2スレ目」</strong>でした。</p>
<h2>やったこと</h2>
<p>ミドルウェアより下は正直 @h-otter に丸投げしていたので、アプリケーションより上をぽちぽち見ていました。<br />
インフラについては正直何をしたのかは全容を把握していないですが、初手で nginx や MySQL に基本のチューニングを突っ込み、Prometheus で延々と監視しながらPDCAを回していたっぽい。正しいインフラチューニングや……</p>
<p>言語は僕と @hogas が使い慣れている Ruby を選択しました。正直クエリ弄るぐらいでいいなら Go でもいいよねーって言っていましたが、慣れてるほうが便利でした。Sinatra の文字列には幼馴染のような安心感がある。</p>
<p>僕と @hogas はよしなにアプリケーションコードを読みながら色々した。以下は色々</p>
<h4>erb を haml に置き換える / hamlit gem の導入</h4>
<p>気持ち+2000点ぐらい</p>
<p>初期実装が erb で、erubis に置き換えるというのも一案ありましたが、行きの車内で「erubis hamlit 速度」などで検索した結果やっぱり hamlit かとなっており、ノータイムで haml に書き換えることを決断しました。<br />
erb2haml とかあったね〜と @hogas と話しながらやってもらった。</p>
<p>以下様子です</p>
<blockquote class="twitter-tweet" data-width="550">
<p lang="ja" dir="ltr">. <a href="https://twitter.com/hogextend?ref_src=twsrc%5Etfw">@hogextend</a> 「erb2hamlどうやって使うの?」ぼく「とりあえず rails new して突っ込んでみたら?」 <a href="https://twitter.com/hashtag/isucon?src=hash&amp;ref_src=twsrc%5Etfw">#isucon</a></p>
<p>&mdash; きょんたん (@sukukyon) <a href="https://twitter.com/sukukyon/status/922121692440182785?ref_src=twsrc%5Etfw">October 22, 2017</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet" data-width="550">
<p lang="ja" dir="ltr">僕「ﾖｯｼｬ(gem install rails)」</p>
<p>&mdash; hogas (@hogextend) <a href="https://twitter.com/hogextend/status/922125423697305600?ref_src=twsrc%5Etfw">October 22, 2017</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p><small>(erb2haml はコマンドラインツールとかではなく、Rails に追加する rake タスク群ということに気が付いた様子)</small></p>
<h4>nginx &lt;-&gt; Puma を UNIXドメインソケットに</h4>
<p>気持ち +2000点</p>
<p>定番です。HTTP 5000/tcp から UNIXドメインに変えた。</p>
<h4>SQL のクエリ改善</h4>
<p>気持ち+10000点ぐらい</p>
<p>これは定番ですね。SELECT のカラムを絞ったり (@hogas)、 <code>LIMIT</code> を付けたり (@hogas)、インデックスを張ったりした。N+1 は手を付けていましたが、コード変更に集中できなくて最終的に投げてしまった。悔しい</p>
<p>終了直前にソースコード眺めてたら <code>statement.close</code> を意図的に忘れていそうなコードが見つかり慌てて修正した。スコア上の変化は分からず。</p>
<h4> 画像を静的ファイルに書き出す</h4>
<p>気持ち+15000点ぐらい</p>
<p>ユーザーのアバター画像が DB に <code>blob</code> で入っていたので、雑に Ruby のワンライナーで書き出して (ここまで @kyontan)、 nginx に <code>try_files</code> で食わせる (@h-otter) みたいなことをした。<br />
既に話題になっていますが、最終的には <code>Cache-control</code> 的な問題でキャッシュヒット率が悪かったらしい。むむむ。</p>
<h4>SHA1 を殺す (パスワード, アバター画像)</h4>
<p>気持ち+2000点</p>
<p>パスワードのソルトを生成している <code>random_string</code> を見たときに、これは要らないのではと思ってしまったのが始まり。初期データのパスワードはハッシュ化されていたので、 <code>id</code> が1000より大きい user は全て平文パスワードを DB に突っ込んだりした。 (by @hogas)<br />
アバター画像は、ファイルの内容を SHA1 したものをファイル名に使用する実装になっていましたが、もしかしていけるのではと言いながらユーザIDをそのままファイル名にしたら通ってしまったのでそのままに。</p>
<h4>Redis (最終的に入れず)</h4>
<p>気持ち+2000点ぐらい(?)</p>
<p>画像をバイナリで入れるのはまあそうだね〜〜と言いながら、Redis に載せようとしていた。正直コードの変更は大したことがないのは分かっていたので実装はシュッとできたけれど、実際に動かしてみると意外とスコアに有意な差が出なかった。その後も永続化周りで少し足踏みしていたり、他の変更を見ていたために最終的に入れられなかった。残念</p>
<h4>アプリケーションサーバ3台化</h4>
<p>気持ち +3000点ぐらい</p>
<p>@h-otter がラスト30分でイケると言い出してやってた。ここで Puma (アプリケーションサーバ) のスレッド数を調整していた (10 -&gt; 18スレッド)時に出したのがベストスコアです。</p>
<h2>その他</h2>
<ul>
<li>再起動試験は何の問題もなかった????
<ul>
<li>過去の参加記なんかを見てるとここが関門かなというのはあったので絶対やっておきたかった (やりました)</li>
<li>Redis に手を出してなかったのでここで不安はあまりなかった</li>
</ul>
</li>
<li>MySQL の Too Many Connections が割りと頻発した
<ul>
<li>ここは <code>statement.close</code> 忘れも影響してるかなと思うけれど、500が途中で出たり安定しないことがあった。最終的には安定しました</li>
</ul>
</li>
<li>日ごろは頭痛の頭の字もないのに、とにかく頭痛が酷かった。緊張にはやはり弱い。</li>
<li>JSONシリアライザが遅いのは分かっていて、 <code>Oj</code> を入れるぞと言いながら入れるのを忘れた。あれを入れただけでシリアライズについては数倍速くなるというのは分かっていたので、ただただつらい。</li>
<li>ICTトラブルシューティングコンテストでスコアサーバを延々とやっていたことが知見として生きたとは思う。DB設計なりアプリケーション設計なりチューニングなり。
<ul>
<li>当時のオーバーキルなチューニングしたときの操作が生きることになるとは思ってなかった</li>
</ul>
</li>
<li>最後のベンチマークの結果を見て全員で嘘やんって言ってた
<ul>
<li>ルールを読んでなかった。次回は読みます</li>
<li>にゃーん</li>
</ul>
</li>
</ul>
<p>そういえば30分ほどですがスコアボードの上位に乗っていました。学生トップなのは分かっていたので、これは予選突破できるんじゃない? とか言いながら笑っていたのを覚えています。このあたりが後々ボーダーになるんだろうな〜という話をしていて、実際そうなったのである程度読みは正しかったのかなと思いつつ。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot.png"><br />
<img loading="lazy" class="aligncenter size-large wp-image-1676" src="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-640x259.png" alt="" width="620" height="251" srcset="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-640x259.png 640w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-200x81.png 200w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-320x129.png 320w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-768x311.png 768w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot.png 1968w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<h2>総括/最高</h2>
<p>監視に強い人(@h-otter)強い。常に横で IOバウンドかネットワークバウンドか、みたいなことを見ながらアドバイスしてもらえる環境は最高。</p>
<p>限られた時間の大会という環境でもくもくとコードいじれる人(@hogas)強い。とにかく僕が頭が回ってなくてコードをまともに書けない状況にあったので、そんな中でちゃんと改善する変更を入れ続けてくれて最高。</p>
<p>基本的にどこに手を入れればいいか、この変更はコスパ的にどうかみたいなことを常に考えながら立ち振る舞えてはいたと思うので、そういった点ではなかなか善戦はできたかなと思いつつ。<br />
しかし、できたことは山のように残っているなという感想。、途中で集中力が切れてしまったこともあり、こういう結果になったのは悔しいなと思う。</p>
<p>ただ、これだけ言えるというのはつまりバランスが最高だということに他ならなくて、こういった駆け引きができるバランスのゲームを作るのはとにかく難しいなと思っているだけに最高だな！！！という気持ちです。<br />
こんな最高のコンテストを生み出してくれた運営の皆様、ありがとうございました。そしてお疲れ様でした！</p>
<p>本選に行かれる皆様はぜひとも頑張ってほしいなと思うところです。</p>
<p>&nbsp;</p>
<p>次回は最高の♨️から最高の心構えでやっていきたい。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>The post <a href="https://blog.monora.me/2017/10/participated-isucon7-qual/">ISUCON7 予選に参加しました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1665</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>
