ISUCON 8 出たそして負けた

ソレイユ (星宮いちご,霧矢あおい,紫吹蘭) (osyoyu, koba789, everysick) で ISUCON 8 に出た。

当日成果の出たアクションは霧矢あおいの中身である koba789 がまとめてくれているので、そっち参照。これは俺のエモ。 diary.hatenablog.jp

ソレイユ

この3人で出るのは4度目であり、今までの ISUCON の半分を戦ってきたことになる。ISUCON 5, 6 では散々なもので、誰もまともに SQL を書けず、グローバル変数$cache を置いてみたり(POST が来たら全消し)、終了15分前に「で、UbuntuRuby ってどうやってデプロイすんだっけ?」みたいな会話を交わしたりもした。

風向きが変わったのは昨年度の ISUCON 7 からで、突如チームとして機能するようになり、ペアプロをして事故なくコードを書き換えたり、アプリとインフラで作業を分担したりできるようになった。

これはなんとなく Git 使ってなんとなくマージ事故を起こして死ぬ、みたいなことをなくすようにしたのと、koba789 が退学就職し、業務で日々長大な分析 SQL を書くようになって、クエリのチューニングを一手に引き受けてくれるようになったことが大きいように感じている。

今回は osyoyu がインフラを引き受け、koba789 が SQL 書いて、everysick がバリバリ分析していく、という形だったと思う。コードは俺以外の2人がガンガン書いてて、俺は勝手に nginx や MySQL の設定をいじりながら、ペアプロと称して分かった顔をしながら眺める役をやっていた。3人で実装してもうまくマージできないことは既知の事実なので、これは結構良いやり方だと勝手に思っている。

27000

我々のスコアは結局 30000 の大台を超えられず、一番ハネた瞬間で 27000 前後止まりとなった。

今回は過去に参加した ISUCON と異なり、大きなやらかしがなかったという風に感じていて、そうなると何が足りないの? スピード以外なにもないよね、という話をした。実際今回は 17:35 頃になっても reservations 周りをロックフリーにするべく koba789 が奮闘していたが、間に合わず、終了10分後ぐらいに解を思いついていた様子だった。

この時間を稼ぎ出すことができればもっと上に行けると今は思っている。今年は必要なツールを全台に一発で Ansible で撒けるように用意しておいたが、まだ高速化の余地があったと(今年のインフラ担当としては)感じている。

(余談: apt 生まれ Ubuntu 育ちの我々としては、CentOS で ISUCON を戦うのは高地でサッカーをするようなもので、本番で消耗しないように Ansible Playbook を用意しておいたのだが、本番で時間を稼ぎ出すのに思い切り効いてしまったというのが実態。ちなみに Playbook を用意する過程で CentOS には慣れた)

Ruby, Go, MySQL 8

MariaDB の my.cnf でハマるのも避けたくて、今年も MySQL 8 を導入して今年も失敗した。昨年も 8.0 にチャレンジして無事環境を破壊したが、今年も無事 validate_password を踏み抜いて死亡した。結局 MySQL 5.7 に差し替えるまでの間、迷惑かけてみんなごめんな。

ところで、我々のチームは全員 Ruby のレベルはそれなりに高いはずで、小回りを効かせることもできるということで Ruby を選択し続けている(Go に浮気しかけた年も結局 Ruby に転向している)。しかし Go の初期実装のスコアの高さを見るとどうしても隣の芝が青く見えてくるのも事実で、スコアの団子を抜けるには Go 選んでもいいんじゃないかと思ったり思わなかったりもする。どうなんだろうね。全員 Go 書けるようになったわけだし。

総評

精進あるのみ

1000g未満のノートパソコンが欲しい

毎日あらゆる所に 1.58kg もある MacBook Pro 13" (Early 2015) を持ち運ぶ生活を送っていたら、健康そのものだった腰がいよいよ痛くなってきたので、持ち運び用に軽いノートパソコンが欲しい。過剰に薄い必要は全くないが、なるべく軽いほうが良い。

現在の MacBook Pro も性能面ではほぼ不満を感じていないので、買うとしても全マシ構成ではなく、性能はある程度妥協してでも軽量なノートパソコンが買えると良いな。と思っていたけれども、妥協しすぎると結局 MBP を持ち出すケースが多くなりそうなので、下のリストぐらいは求めたい。

ほしい要件

  • 1000g未満
  • ある程度深く打鍵でいるキーボードが載っている
    • MacBook Pro 並みの深さで十分、もう少し浅くても我慢できる
    • できれば US 配列が良いが、右側の記号が細くなっていない JIS キーボードなら US にマップして使えると思う
  • FHD以上, HiDPI でなくても良い
  • バッテリーは公称8時間持つことになっていれば十分
  • USB Type-A と Type-C 両方あると嬉しいかも、HDMI あるともっと嬉しい
  • Core i5 ぐらい載っていればOK、手元でも作業したいので i3 は微妙な気がする

要求ラインを上げるとお値段も上がるのが良くないですね。以下はアキヨドでざっと見たやつのリスト。

FMV LIFEBOOK UH75/B3 (WU2/B3)

kakaku.com

富士通 WEB MART: http://www.fujitsu-webmart.com/jp/webmart/!ui073?DAI_CODE=2506

748g / 13.3" / JISキーボード / Type-A x 1, Type-C x 1, HDMI

富士通 WEB MART で購入すると(モデル名は WU2/B3 になる)やたらと細かくカスタマイズできて、RAM も 4, 8, 12, 20GB から選べる。12GB にすると16万円ぐらい。

アキヨドで触ったのは違うモデルだったのか、770gぐらいあったけど、筐体が異常に軽くて持っている感覚がなかった。MacBook Air が本当に Air の名を冠するのに相応しい製品だったか確認するために Apple コーナーに思わず行く程度には軽かった。

キーボードは JIS 配列しか選べないようだけれども、記号類のキーピッチが潰れていることもなく、US にマッピングしても違和感なく使えそう。スペースバーはかなり短いが、ちょうどいつも押す位置にあったので問題なさそうだった(US 配列の MBP のスペースバーは長いけれども、左 1/3 以外は押してない)。富士通 WEB MART で2,700円追加課金するとかなのプリントを消せる。どうせなら US 配列を選ばせてほしい。

f:id:tomo_ari:20180309235522j:plain

打鍵感については、Libertouch シリーズをノートパソコンに移植! という触れ込みの記事を読んでいたので、結構期待して触りに行ったが、普通にいまいちクリック感の無いキーボードだったような……。とはいえ他の候補にもグッと来るキーボードが載っていたものがあったわけではなかったので、これは慣れか妥協なのかな。

pc.watch.impress.co.jp

あと、やたらとかっこいいギミックが搭載されてる有線 LAN 端子があるのは推せる。下の記事に写真があるので見てほしい。

www.digimonostation.jp

LG gram 14Z980 (14") / 13Z980 (13.3")

www.lg.com

965g / 13.3" / JISキーボード (個人輸入で US 買えそう) / Type-A x 1, Type-C x 1, HDMI 995g / 14" / JISキーボード (同上) / Type-A x 1, Type-C x 1, HDMI

実物は Web サイトで見るよりもだいぶシュッとしているデザイン。これも軽い。770gを手に持った後は全ての感覚がバグっていて、965g はかなりずっしり感じたが、MBP 13" を持って感覚をリセットした後ならば羽根としか思えない軽さ。

スペックは特にカスタマイズ効かないっぽいので、公式サイトのスペックシート (14" / 13") が全て。全然問題ないと思う。

16:9 ということもあり、14インチモデルでも MBP 13" よりわずかに大きいぐらい。13.3インチモデルにすると割りと小さくなる印象。解像度はどっちもFHD。

昔は日本でも US 配列で売っていたらしいが、今日アキヨドで売っていたのは普通に JIS 配列だった。右側の記号類が縦に潰されているのがかなりマイナスポイントだけど、海外のサイトで買えば US 配列のものが手に入りそうだし良いと思う。打鍵感は UH75 よりちょっと良かった気がする(ちょっと)。

f:id:tomo_ari:20180310000637j:plain

HUAWEI Matebook X Pro

consumer.huawei.com

アキヨドで見たときは安くてすごいいいじゃん! と思ったけど、1.33kgもあった……。タブレットに分離する HUAWEI Matebook (Xじゃないやつ) は軽いんだけど、いかんせん分離してしまう。

ThinkPad X1 Carbon 2018

1.13kg

今日見るのを忘れてしまったので後で調べる。X240 以降のあのキーボードならわりと良いんじゃないかと勝手に思っている。

という感じかな……。どれも買うにはちょっと決め手に欠けるという感じなので、もう少し様子見かもしれない。

3枚以上重ね着できない人のための冬に着るべき服ガイド

Tシャツだったあの頃から

冬ですね。ここ茨城県つくば市の12月では、夜は当たり前のように氷点下、昼間も8度程度の日々が続き、みな震えながら関東平野を踏みしめています。

無論、僕もその例外ではありません。中高時代と変わらない、Tシャツ1枚の上にパーカーを着込み、いつものコートを羽織った格好で、自転車で広大な大学を駆け回っていました。

で、この装い、自分では比較的スタンダードな「冬の格好」だと思っていた(コートも着てるし)わけですが、どうもそうではないらしい。毎年冬になると「おしょーゆの格好はおかしい」「半袖じゃないだけえらい」「見てるこっちが寒くなる」と言われるので、何かがおかしいことは分かるのだが、一体どうすれば良いのか皆目見当もつかない。寒いと思ってないんだから改善のしようがないわけです。マジで何を着れば良いのかさっぱり分からん。

と、いうわけですが、このたび何を着れば冬らしくなるか・暖かそうに見えるか、ということについて同期女子にアドバイスをいただいたので、ここで紹介しようと思う。

検討の過程

標題についての検討は慎重かつ大胆に、長時間に渡って行われた。ここでアドバイスを頂いた同期複数名は「冬に相応しい格好」について信頼できる情報源ではあるが、外部からの視点による検証も必要であるとの考えのもと、MEN'S NON-NO と non-no を急遽大学の書籍部で購入し、熟読した。

MEN'S NON-NO はともなく、なぜ non-no ? と思われるかもしれないが、ページをめくってみるとその答えは誰の目にも明らかである。女性向けファッション誌には「彼氏役」や「男友達役」が(脇役として)何度も登場するからだ! 無論のこと主役ではないため、派手な格好を披露してくれることはないが、彼らは一つの正解の例を我々に提示してくれた。ダサいのもいたけど。

かくして「冬らしい格好」に関する一通りの意見交換が行われたので、その結果をこのブログに貼り付けておく。検討を進めながらリアルタイムで Scrapbox.io にメモしていった内容そのままなので整理されていない感は否めないが、そこは大きい目で見てほしい。

また、以下にたびたびサイズについての言及が登場するが、これはこのアドバイスを受けた際に着ていたパーカーがやたらと小さかったことに起因する。自分では合っていると思って買ったんだよ。

服のジャンル別

シャツ

  • 春・秋ぐらいのTシャツぐらいの感覚で着ると良いらしい
    • パーカーの下にもセーターの下にもシャツ
    • 彼女の親に会いに行くときに着るのが「きれいめシャツ」、友達と遊びに行くときに着るのが「カジュアルシャツ」
    • チェックは目が細かいほうが安物感が出ない
      • 目が粗いものはあまり着ないほうが良い

パーカー

  • パーカーが一番上だと寒そうに見える
    • シャツを内側に着る
    • もしくはジャケットを上に羽織る
    • 春なら
    • 買ってしまったSについては前を閉めなければOK
      • それでも小さく見えるらしい
    • カーディガンとは合わせない

ジャケット

  • Sを買わない
  • もろもろの上に羽織れる
    • 大きめのものを買うと良さそう
    • パーカーの上でもOK

セーター

  • 一番上
    • これも大きめのものがあると良さそう

カーディガン

  • これは間違いなく一番上
    • シャツの上

misc

  • 上からの順序としては コート > (ジャケット) > パーカー=セーター=カーディガン > シャツ=Tシャツ
    • 同じレベルは組み合わせられない
  • パーカーは冬の格好ではない
  • Sを買わない
    • MかLを買う
  • 腕を伸ばしたときに手首の骨が出ない程度のサイズが適切

ns-3 を (macOSで) 動かすメモ

環境: macOS Sierra (低)

あまりにも多種多様な方法があったので、雑なメモを残しておく。

気持ち

  • VMLinux を入れるほうが簡単。Linux なら ns-3 が生やしてくれる tap とかを使って外部を巻き込んだシミュレーションもできる。
  • 2006年の気持ちに戻る。パッケージマネージャーに頼らない。
  • hg repo を clone してくると、謎のスクリプトを使って別途 ns-3 本体をダウンロードすることになるので使わない。tarball を落としてくるだけで良い。
  • ns-3 には waf という万能スクリプトが同梱されていて、これが configure や make をラップしている。これは使う。
  • waf をラップする build.py や bake というスクリプトも同梱されているが、よく言えば開発途中みたいなものなので使わなくて良い。
    • Wiki にも "Most users quickly transition to using Waf directly to configure and build ns-3." と書いてる。
  • "ns-3 mac" みたいなキーワードでググって出てきた公式っぽいページは見ない。10.6 の話をされても仕方あるまい。
  • Python 2 しか使わない。

ドキュメントを斜め読みする

ns-3 wikiGetting Started を読む。以下の項目は飛ばす。

  • Downloading ns-3 Using Bake
  • Building with build.py
  • Building with bake

下準備

tarball を落とす。ns-allinone-3.27 という名前はヤバそうだ、なにが all-in-one だ、という気持ちは抑え、落ち着いて展開する。

ns-3.27 ディレクトリに潜る。今後は ns-3.27 ディレクトリより上は忘れます。

ここからは万能スクリプト waf を叩いて回る。まずは configure 。

$ ./waf configure --build-profile=debug
(snip configureっぽい出力)
---- Summary of optional NS-3 features:
Build profile                 : debug
Build directory               :
BRITE Integration             : not enabled (BRITE not enabled (see option --with-brite))
DES Metrics event collection  : not enabled (defaults to disabled)
Emulation FdNetDevice         : enabled
Examples                      : enabled
File descriptor NetDevice     : enabled
GNU Scientific Library (GSL)  : not enabled (GSL not found)
Gcrypt library                : not enabled (libgcrypt not found: you can use libgcrypt-config to find its location.)
GtkConfigStore                : not enabled (library 'gtk+-2.0 >= 2.12' not found)
MPI Support                   : not enabled (option --enable-mpi not selected)
NS-3 Click Integration        : not enabled (nsclick not enabled (see option --with-nsclick))
NS-3 OpenFlow Integration     : not enabled (Required boost libraries not found)
Network Simulation Cradle     : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected (see option --force-planetlab))
PyViz visualizer              : not enabled (Python Bindings are needed but not enabled)
Python Bindings               : not enabled (Python library or headers missing)
Real Time Simulator           : enabled
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled
Tap FdNetDevice               : enabled
Tests                         : not enabled (defaults to disabled)
Threading Primitives          : enabled
Use sudo to set suid bit      : not enabled (option --enable-sudo not selected)
XmlIo                         : not enabled (library 'libxml-2.0 >= 2.7' not found)
'configure' finished successfully (2.432s)

not enabled で必要そうなコンポーネントがあったら、Homebrew を使って入れると良いと思う。LD_LIBRARY_PATH とか渡して上げる必要はあるかも。やってないからわからん

ではいわゆる make をしましょう。ns-3 本体の全体をビルドするから時間がかかる。

./waf -j4  # make っぽく -jN できる
[   1/2261] Compiling install-ns3-header: ns3/antenna-model.h
[   2/2261] Compiling install-ns3-header: ns3/isotropic-antenna-model.h
[   3/2261] Compiling install-ns3-header: ns3/angles.h
(snip)

適当なスクリプトを動かす

scratch ディレクトリの中に自分が書いた C++ スクリプト(シナリオ)を置いておくとビルドされる。っぽい。

$ cp examples/tutorial/first.cc scratch/myfirst.cc  # 適当なサンプルをコピー
$ ./waf  # ビルド
$ ./waf --run scratch/myfirst
Waf: Entering directory `/Users/osyoyu/Development/ns-allinone-3.27/ns-3.27/build'
Waf: Leaving directory `/Users/osyoyu/Development/ns-allinone-3.27/ns-3.27/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (4.567s)
At time 2s client sent 1024 bytes to 10.1.1.2 port 9
At time 2.00369s server received 1024 bytes from 10.1.1.1 port 49153
At time 2.00369s server sent 1024 bytes to 10.1.1.1 port 49153
At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9

動いてそう。良かったですね。

ISUCON7 予選2日目にチーム「学生気分」で参加した

f:id:tomo_ari:20171023004637p:plain

ISUCON7予選2日目に参加した。メンバーは昨年、一昨年と同じく @osyoyu, @KOBA789, @everysick とチーム「学生気分」で出たが、実は大学を中退して学生ではなくなったメンバーが1名いるので一般枠です。

最終スコアは 80770点 (ベストスコアは 87598点) で、惜しくもなく予選落ちしてしまった。が、仮に学生枠で出場していれば3位で予選通過だった点数は取れたので、実力は伸びてるっぽい(?)。

最終的な構成

  • Server 1, 2
    • puma (1 worker, 16 threads)
  • Server 3
    • puma (1 worker, 16 threads)
    • MySQL

所感

チームを組んで3年目、ようやく ISUCON を戦える分業体制が敷けた。全体として時間の浪費を減らし、問題そのものにきちんと取り組めたが、その分だけ点数を伸ばしきれなかった悔しさがある。けれども、初めて*1まっとうに戦えたので、その点はちょっと嬉しい。

自分は下回りと DB を整え続ける役回りをやりつつ、アプリを正攻法で殴っている KOBA789 をペアプロ的な感じで手伝っていた(と思う)。コードを触る人をとにかく減らしたことで現状に対するメンバーそれぞれの認識が分散しなかったことと、単純にコードが分散してしまって最新が行方不明になる類の事故が完全に防止できたことで効率よくボトルネック潰しに取り組めた。everysick は Redis とかやってたと思う。

同じ部屋に集まり、何をしているかを声に出すことで作業内容を共有し続けたことで、手がついていない事項も共有され、途中から自然と分担が進んで効率が高まっていった。

Server 1 に適用したコードや設定の更新をほかの2台に配布・適用するだけの超雑なスクリプト (mamiya.sh と名付けた (失礼)) を書いて運用していたが、非常に便利だったので、この手のツールを面倒臭がらずに作るのは大事ですね。

所感2

経験というか、このチーム固有の便利なことなんだけれど、KOBA789 と everysick がほとんど同じ Emacs の設定を使っていて、自分だけ Vim なので、設定のコンフリクトが起きなくて楽。とはいえ zshrc は 2vs1 でかなりカチ合うわけだけど、それはもう分かりきっていることなので PROMPT などを書き換えるスクリプトをササッと書いてログインするたびに叩いてた。後者は経験か。

上にも書いたけど、コードに触る人を減らしてしまうことでマージ・デプロイの煩わしさを減らせたのは良かった。この辺は普通の感覚ならば UNIX ユーザーをそれぞれ作ったり、それぞれの作業用インスタンスを作ったりしたくなったりして(実際今まではそうしていた)大変なことになっていたと思うので、これも ISUCON 経験なんですかね。

あとは床に寝そべらず、椅子に座ったのが良かったのかも。

所感3

スロークエリや分かりやすいボトルネックなどを潰しきり、終盤はやるべきことが分からなくなってしまったが、上位陣とは背中も見えないほどの点数の開きがあったので、彼らは本当に強いんですね……。

やったこと・やれなかったこ

この項を忘れないうちに書いてしまいたいのだけれど、手元にメモがないのでまたあとで

*1:昨年・一昨年はほぼ0点に近いスコア

キーボード(音が出るほう)を買った

キーが少ないほうね。文章が書けないほう。どう言えば明確に区別できるんだ。

先日、急に楽器が弾きたくなり、衝動のおもむくままに近所の WonderREX (茨城にあるハードオフみたいなやつ)に駆け込んだところ、種々の電子ピアノやキーボードが異常に安い値段で投げ売りされていたので YAMAHA DSR-500 という機種をつい買ってしまった。

こういう感じ。

f:id:tomo_ari:20170817030257j:plain

とりあえずカレンダーガールの初心者向けピアノ動画を0.3倍速で見つつひたすら練習していたところ、右手だけなんとか押せるようになってきた。好きな曲の音が出せるだけでけっこう楽しい。

www.youtube.com

ピアノの類は一切未経験・五線譜は全く読めないので、はじめは調号の存在に気づかずに(譜面通り B を押してるのに明らかに違う音だぞ……? 動画の下のピアノではなぜか A#押してるし……)と思ったりしてた。知ってる曲だと違う音を出しちゃったときにすぐに分かって便利。

途中からこういうカンペを作って見ながらやってる。一時記号とかナチュラルとかが出てこなければまぁまぁ分かるようになってきた気がする。ナチュラルの記号がわからなくて [楽譜 記号 互] でググったのはここだけの秘密な(♮って 互 に似てるじゃん?)。

f:id:tomo_ari:20170817030421j:plain

自分としてはカレンダーガールっぽい音が出せるようになってきただけでかなりエンジョイできてて、間違えまくってはいる*1もののめちゃめちゃ面白く感じている。それっぽく弾けるようなるまで頑張りたい。

ところで今日は 8/17

なので僕の誕生日です!!!!!! 祝ってくれ!!!!!!!! プレゼントは http://amzn.to/osyoyu でお盆も受け付けています!!!!!!!

*1:10秒ちょっとのイントロを間違えずに録音できるまで10分かかった

PushCrew を使ってブラウザ通知を出すのをやめてほしい && ユーザーの設定を尊重してほしい

ブンブンハローユーチューブ、ユーザーの設定は尊重しましょう

pushcrew.com

f:id:tomo_ari:20170705184704p:plain

↑ 記事の本文に丸かぶりするダイアログの様子

ブラウザ通知そのものの是非はさておき、PushCrew はブラウザの通知に関する設定を全く尊重せず、あらゆる通知をブロックする設定にしていてもこのダサいダイアログを画面の真ん中に出してくる。

ド迫力で通知を許可するように求める Facebook だって

f:id:tomo_ari:20170705185808p:plain

ブラウザーの設定で通知をブロックしていれば (Notification.permission === "denied" であれば)こんな画面を見ることはない。

ちなみに全ブロック状態で PushCrew のダイアログで [受け取る] を押すと、こういうレイアウトが壊れたウィンドウが出てより悪い。

f:id:tomo_ari:20170705190035p:plain

というわけで、自分のブログなどに PushCrew 設定している各位は ユーザーの意志の表明を無視してまで 通知を押し付ける必要があるのか今一度考え直していただきたいです、こちらからは以上