ISUCON8 の予選問題を復習した

今年もISUCONには参加する予定で、チームメンバーを集めるところまでは進めていたのですが、日程が 別のイベント と重なってしまい、参加できませんでした。。。

ISUCONの問題は取り組んでいてワクワクしてくる良問が出ているので、ネタバレを食らう前に復習しようと思いました。

復習するまで参加記や講評などは読まないようにしていたのですが、Twitterを見ているだけでも情報が流れてきてしまったので、以下の情報は知ってしまっていたことを予め申し上げておきます。

  • OSはCentOS 7
  • 複数台構成
  • HTTPサーバーはH2O
続きを読む

JAG夏合宿2018参加記(スタッフ視点)

今年もスタッフとして参加してきました。夏合宿の裏側を紹介してみると面白いかもと思ったので、私が担当した箇所をいくつかまとめてみます。

2018/Practice/夏合宿/案内 - ACM-ICPC Japanese Alumni Group

問題文の作成

私は問題の原案を考えるのは無理なので、今回は問題文の作成だけやっていました。担当したのは GuruGuru, Colorful Drink, Sum of QQ, Prime Routing です。

GuruGuru

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2904

「時計回りに1回転」の定義が当初の想定よりも複雑で、他の問題に差し替えることも検討していましたが、最終的に出題できてほっとしています。

元ネタはもちろん某ゲームです。仲間として Twirl Around, Kuru-Kuru Robot, KuruKuruKuririn, Kuru Kuru Door などがあります。

Colorful Drink

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2905

↓こういうのを作る問題でした。

プース・カフェ - Google 検索

Sum of QQ

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2912

数列から何かを計算するような問題って、ストーリーを考えるの難しくないですか?

締切が迫っていると「あなたは整数Sと無限の大きさの九九の表が書かれたカードを受け取った」とか「あなたは総和がSとなるような長方形の領域を愛している」といった唐突感のある問題文が生成されがちです。

Prime Routing

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2913

グラフの問題は問題文を作りやすいかと思いきや、かなり苦労しました。なぜかというと、この問題に出てくるグラフは重みがすべて1だからです。

「ココアちゃんは毎日歩いて学校に行っている。歩数が素数になるようにしたい」← 道路を1歩で歩くなんて無理があるしなぁ…

「チノちゃんは電車で旅行するのが好きだ。電車が駅に着くたびに写真を1枚撮っている。目的地に着くまでに取った写真の数が素数になるようにしたい」←同じ駅を2回以上着いても写真は1枚しか撮らないと誤読されそう

合宿の2~3週間前に行われた某オンサイトコンテストに尽力してくれたスタッフのツイートを見て、最終的にこのようなストーリーになりました。

ちなみにグラフが連結であるという制約は、以下のやり取りで決まったものです。

f:id:kujira16:20180923165315p:plain

風船の購入

今年は雑貨の購入も担当していました。問題が11問出題されるということが事前にわかっていたので、11色分の風船を購入する必要がありました。

東急ハンズに行けば簡単に入手できるだろうと高を括っていたのですが、一般的な雑貨店で売っている風船は、多くても8色セットのものでした。

というわけで、不足分を購入するためにJAGの内部Wikiでも紹介されていたナランハというジャグリングショップへ。

www.naranja.co.jp

店舗に在庫がない色もいくつかあったので、事前に電話でリクエストしておくと安心です。

モバイルWi-Fiルーターのレンタル

さらにルーターのレンタルも担当していました。オリセンで合宿のためにモバイルWi-Fiルーターをレンタルする場合、考慮しなければいけないことがいくつかあります。

  1. オリセンではWiMAXが入りにくい
  2. 1つのキャリアだけ契約してネットに繋がらないと詰んでしまうので、複数のキャリアから借りたほうが良い
  3. 猛烈な勢いで通信容量が消費されていくので、たっぷり目のプランを申し込んだほうが良い

今回は 1. と 3. を重視して 2. が犠牲になり、SoftBankY!mobileの回線(実質的にSoftBankだけ)をレンタルしました。この2つは容量制限超過時の速度制限が適用されるのが18:00~1:00で昼間には制限が解除されるプランがあったり、業者によって無制限プランを提供していたりと、イベントには使いやすいです。NTTドコモKDDIは容量制限超過時の速度制限が厳しいコース(3日7GBを超えると通信ストップなど)しか見つけられませんでした。

利用したのはカシモバという業者とWiFiレンタルどっとこむという業者です。新宿に店舗があるので、店舗受取りに便利です。カシモバは店舗受取りなら定常的に手数料無料、WiFiレンタルどっとこむは価格.comから申し込むとキャンペーンで手数料が無料でした。それぞれ3台ずつ、計6台を3日間の契約で1万円くらいでした。*1

実際にオリセンで使ってみたところ、Y!mobileは実質的にSoftBankなので電波の入り具合などは一緒かと思っていたのですが、センター棟の1階ではY!mobileの電波が入らないという問題が発生しました。帰ってきてから気づいたのですが、Y!mobileでは標準モード(月7GBの容量制限)とアドバンスドモード(3日10GBの容量制限)の2種類を切り替えることができ、明治神宮の付近にアドバンスドモード非対応エリアがある ということで、それが関係していたのではないかと思います。

www.ymobile.jp

おわりに

今年も大きなトラブルなく終えられてホッとしています。そろそろスタッフの人数的に厳しくなってきたので、新しいスタッフが入ってきてくれることを期待しています。

*1:JAGは非営利で活動しているので、費用を安く上げるためにどこまで節約していいのか謎なところです。合宿の前日にスタッフの自宅まで配送してもらえば、スタッフの負担は減るので、当日の朝の作業は楽になります。

「ふつうのLinuxプログラミング 第2版」を読んだ

システムコールファイルシステムについての知識が全くなかったので夏休みに読みました。

以下,雑な読書メモと追加情報です。

GCCのバージョン番号

gcc -v でもバージョン番号らしき表示はされるのですが,明らかに --verbose 的な出力だったので,不便だなぁとは思っていました。

gccコマンドラインのオプション引数の書式が無法地帯だった時代を引きずっているようで,こういうのがいくつかあります。

Unix domain socket

p.41 の記述です。リバースプロキシとアプリケーションサーバーをUnix domain socketでつなぐのをISUCONで初手でやっているので気になりました。追加調査をしたいですね。

ディレクトリの実行権限

答えを知らない人はここを読みましょう。

unix.stackexchange.com

askubuntu.com

superuser.com

本で指摘されなかったら永遠に+xの意味を分かっていなかったかもしれません。

バッファリングモード

std::endl は毎回 flush() が呼ばれてしまうので \n を使ったほうが速い」みたいな話がありましたが,ちゃんと計測し直したほうが良いかもしれません。

stdio

open/close で fd を使った操作をしていると「じゃあFILEって何だ…?」という疑問が湧いてくるのですが,その答えが載っていて助かりました。

とはいえ,普段の操作では fopen() からの fileno() で fd を取得するほうが安全かもしれません。

getc/putc はマクロで実装されていて fgetc/fpuc は関数で実装されているという違いがあるそうです。

Filesystem Hierarchy Standard

どういうファイルはどの場所に置けばよいかがわかりやすく書かれていてよいです。

「shareって何を共有しているんだろう…?」というのは長年の謎でした。

ハードリンク

superuser.com

ハードリンクを使うことがほとんど無いので役に立つかはわかりませんが…

シンボリックリンク

シンボリックリンクはパス(つまりシンボル)だけを持っているリンクなので,存在しないパスへのリンクを作ることもできるし,指しているファイルやディレクトリが消えても残り続ける。

実行ファイル

稀に gcc -S でアセンブリを見ることがあるのですが,「.text ってなんだろう… 実行される処理が書いてあるっぽいのにな…」 とずっと思っていました。

いつか使うことがあるかもしれません。

fork

よく知らずに使っていました。

dup/dup2

signal

これは覚えられる気がしないです。

credential

必要になったことが今まで無かったのでよくわかりませんでした。

ネットワーク

manかどこかに書かれているはずなんだけどな〜 と思っていたのですが,まさかetcに置いてあるとは…