読者です 読者をやめる 読者になる 読者になる

見習いの見習いプログラマ

まだまだ先は長い

やっぷしーほっかいどーとかで会場NWした話とか #yapcjapan

こっち書くのが久々ですね。こんにちわ。

昨日くらいにYAPCが北海道にくるとかなんとかで、いつものルートでNWとかよろしくって放り込まれました。どうも。

会場NW経歴はこんな感じ

2014

  • Global Game Jam 2014 Sapporo
  • OSC2014 Hokkaido

2015

  • Global Game Jam 2015 Sapporo
  • OSC2015 Hokkaido
  • PyCon mini Sapporo

2016

  • Global Game Jam 2016 Sapporo
  • OSC2016 Hokkaido
  • PHPConference Hokkaido
  • YAPCHokkaido ← New!

その他2013年くらいにBoost勉強会のほうもやった記憶があります

運営スタッフ関連は2011のOSCから雑用的に色々やってたので、いい感じにスタッフ歴がついてしまいました。

元々この手のイベントのインフラ番長は @koiwa さんが番長してましたが、世代交代の流れがあって現在私ともう傍らの @raa0121 がだいたいまわすようになりました。

2016に、色々あってNW機材に変化がおきました。

実はスタッフコミット量的に一番多いGGJのほうで、インフラ設備の更新をなんとかしないといけない問題が発生した関係で、一気に機材を買い増した経緯があります(一応経費関連でGGJ実行委員会所有物扱い) その後は年1でしか使えないのはノウハウ溜まらない問題があるので、試験的に色々なイベントで実験投入を繰り返してるという状態です(最近configが安定してきたけど、改良の余地はまだありそう)

そして今回は、我らが @koiwa 師匠がEdgeRouter X共同購入の話があがったので、我が家に1台やってきました。

今回使った機材

RoomA 設営みぃお

  • EdgeRouter X * 1台
  • PoEハブ * 1台
  • Aironet 702(自立型設定) * 3台

RoomB 設営みぃお/らぁ

  • IX2015 * 1台
  • PoEハブ * 1台
  • Aironet 702(自立型設定) * 1台

RoomC 設営らぁ

  • Aironet1242AG(YAPCAsiaの記事見て2014年に買ったやつです) * 1台

CのルーターはBから10mと5mを用意して100均の延長アダプターでくっつけて配置しました。

スタッフ部屋 設営らぁ

  • なくてもと思ったけど後半に自宅で昔の現役だったWR8700Nをホイッと繋げました(今はWG1800HP2が現役です)

Aironet702の最初の投入時はその他の関係も混ざった状態で悲鳴あがってたのですが、その後configを見直してカンファレンスではだいたい平和になっていました。

Aは、部屋の後ろの戸棚の上に無線APを配置してエアコン理論でビームさせたお陰か、広い部屋なのに前のほうでも40~50%程度の強さを維持してくれていたのでAPを上に設置する重要性を再度学んだ(後述の問題で後ろ2台だけで終盤まで回してた)

今回やらかしたドジと、そこから学んだデータ

実はAのSSID 1台間違えたんですよ!!!! YAPCHokkaidoRoomA と YAPCHokkaido-RoomA みたいなレベルのミス。 SSIDで類似が飛んでたのに気づいた人は間違いありません。それはドジしたせいです。どちらも同じルーター通ります。
後半見たら実は1台のAPに76クライアントくらいぶら下がってることに気づいて半分冷や汗かいたのは言うまでもない。

不定期にEdgeRouterさんのグラフやらNW繋いでiPhoneで画像をあげて見ていた感じ、たまーにパケットが詰まっている感じがあったので、もしかしたらAPが悲鳴あげかけてたかもしれません。ゴメンナサイ。 恐らく702におけるカンファレンスの接続数の規模感は50台/AP くらいが理想そうです。

あと、開始前後で前に設置したAPが原因で前のほうに接続障害が起きてごめんなさい>< 前のほうで障害と聞いて、「あー多分前の子失敗してる」って判断してAP撤去して後ろの子にローミングさせました。。。。。

今回の接続クライアント数はDHCPリース的に106台くらいがピークでした(300秒で開放しちゃったので、トータルはわかりません) 雪で来れなかった方も考慮すると、ピーク時3台で綺麗に分散されるのが丁度よさそうという結論がとれそうです。

実は前日準備より前の準備時間がほぼ0時間状態だったので、その中でやったとしてはそこそこまわってよかったです(経験重ねないと間違いなく事故る(=経験でわかってる分のコストはペイ済)ので良い子は絶対マネしないように)

NW準備から当日の様子あるだけ

明日のおまいらのインターネットの仕込み #yapcjapan

Mio Mitaniさん(@miio119)が投稿した写真 -

インターネットです。 APが一台設定ミスにより二台運用中 #yapcjapan

Mio Mitaniさん(@miio119)が投稿した写真 -

最後に

インターネットで共通の友人がいて会えなかったpastakがチャッカリ参戦してたので全てが満たされた。おわり。

ISUCON4予選で撃沈してきた話

てごわい

isucon4予選してきました。結論からいうと撃沈。13000くらいでした。

「み(ぃお)た(け)ら(れれ)団子」ってことで「みたらし団子」で参加してたのでした。

たけ氏には、確実に倒せそうなテンプレ周りとかunixソケット化とか色々お願いしてたとおもう。られれさんにはnata2とかいれてもらったり雑用たんまりお願いしたりとか。

どんな問題?

いすこん銀行、IPアドレス同一で10連続、パスワードとかまちがえて3回連続で制限ふっかけるとかそういう感じの部分をなんとかしてくださいってことらしい。

オンラインバンクなのに金額出ないし振り込めないし、なんかやばそうな銀行なので預けてはいけません。

コードリーディングした結果の方針

  • DBロックしてないから結構甘い
  • login_log が結構な量になるから多分重たい
  • というか、取得SQLがアレっぽいなー
  • もうこれ、RedisかMemcacheに全部載せてしまえば?上位層絶対これやってるしょー、下手したらweb側でなんかしてそうー

とかいう結論にいたり、Memcacheに仕様にそってデータをいれてみる。

後々のことも考えてuser_1_totalとかip_127.1.1.1 とかみたいなキーを作ってえっさこっさする

今見てもじつにひどい実装

https://github.com/miio/isucon4/blob/master/helpers.js#L116

不一致で死にまくり夕方までFail祭り。

初期データのキャッシュ温めしてないことに気付き制作。しかし、どうみてもこれstringifyでやらかしてるんですがねぇー

https://github.com/miio/isucon4/blob/master/memcache_init.js#L12

抽出SQLつらいわーとか言ってたら、たけ氏がレポート提出用のパクって作ればいいんじゃね?とか言ってきたので量産されるコピペメソッド。たけ氏天才か?w

https://github.com/miio/isucon4/blob/master/helpers.js#L273

ヒットしないキャッシュたち

キャッシュを全部温めたので理論上キャッシュfailはしないはず(消してもいなくて更新しかしてないから)なのになんかヒットしないパターンが多数あって、その結果重たいSQL直撃してたらしい

未だに原因不明なので原因見つけたらまとめたいなぁ。

まぁSQL直撃なのでインデックスだけ。

echo "ALTER TABLE login_log ADD INDEX idx1(user_id,succeeded);" | mysql -h ${myhost} -P ${myport} -u ${myuser} ${mydb}

こんなのおいときゃまぁ上がるっしょーってことで5分くらいで見つけてこれいれたら3000くらいあがったんだっけ。デスヨネーとしか。

感想

まぁ冒険しすぎたけど、今回は母数も増えすぎてたし、冒険しないと頭打ちにはなるだろうなーとは思っていました。はい。memcacheでヒットしない件は温めスクリプト改造したので検証したら、ヒットしないケースがあったのでちょっと詳しく調べたいところ。

というか、Redis力あればRedisにいれたほうが確実だった可能性もあるらしくてつらいなー。MySQLガチチューニングしとけばよかったかしら?

そんなわけでソースだけあっぷ

miio/isucon4 · GitHub

鳩さんありがとう。Node.js使ったよー

2014年が近い

2014年やることとか、どうしていくかを考えないといけない。

直近だと、GGJかな。ネットワークトラブルが3連続で起きてるので(専属担当不在)4回目は落させないというプレッシャーと十二分な準備を心がけてます。といっても、私はネットワークにそんな詳しいほうではないので、この担当やると言えてるのは過去の実績が他で積み上がってるからであったりします。

きっと何とかなります。

あとは、引っ越しクエスト。これも色んな理由で必ず完了させないといけないので遂行します。

大きな買い物はできるだけ控える方向で考えてて、多分あり得るとしたらこの2点

  • エアコン装備
  • MacBookProリプレース

MacBookは筐体が先に死にかけてて、使用歴も3年経過したのでだいぶ頑張ってくれたと思う。

リプレースするとなった場合は、次のRetinaが出る頃になると思います。

カメラ投資すると大変アレなのでこの投資は再来年以降に凍結です(今まで一眼にかけた金額と同じ金額が必要となると...

外部のイベントや勉強会は2013年でも結構絞ってたほうで、この方針は継続。方向性を固めていきたいなぁって。

今年は小さなものを完成させる方向に走ってたけど、来年は根本の技術というか、プロダクトを完成させる以上に知識を付け直さないと色々と置いてかれている感じがしているので努力したいなぁ。

2013年を振り返ってみよう

今年もあともう少し。今年何やったっけということでまとめ。

東京Ruby会議10に行ってきた

理由:2日開催、Rubyist

東京と言っておきながら、東京ディズニーランド商法と一緒で千葉Ruby会議です。 確か2日目に雨まじりの雪が降って東京の雪の弱さに笑ってた気がする。 予備日ではmixiさんに遊びに行ったなぁ。帰り2時間くらい遅れの飛行機で帰り、もひゃ氏と1便違う程度だから空港で到着待ったりした。

帰りはエアポート混雑してたし、私が常にuシート民なのでuシートに誘導したりなんとか。

GGJやってた

理由:恒例

みぃおさんRails書いてた。かふせさんいなかったら死んでた。神。

rubykaigi2013スタッフしてた

理由:割と思いつき

そしてカメラ買ってました。望遠欲しいとか言いながらEOS Kiss X6i買ってた。

このイベント3日くらいあったんだけど、普通に3000シャッター切ってた。一眼レフ良い。

帰りの飛行機逃しを華麗にキメ、ANA最終便がもう無いので共同運行しているADO便にANAユーザとして乗り込むことに。mayucoさんと一緒の便だった。

るびまpublishしたよ!

Ruby札幌に出没するようになった

後半は予定コンフリクトだったり仕事で燃え尽きたりして行けなかったですが、割と参加してた。

そして1回発表したのは良い成果! もっと発表できるようになりたい><

食事会でよく撮影してた

理由:撮影が好きだから

社内の食事会支援により毎月チーム食事会をしています。多分ほとんど撮影してますが、半数はHDDに眠ってます。ごめんなさい。尚、公開はお食事部分のみかな。

クックパッドのコンテストに応募した

理由:いまづちゃんが仲間を欲しそうな目でこっちを見ている...!

いまづちゃん、もひゃ氏と3人でコンテストに応募した。テーマ出てから24時間くらいで作るアレです。

結局デスマって最後みんなで撃沈してましたw

付箋とか使って楽しく開発してたなぁ

pairpullというサービス作ったよ!

OSCで澤田さんにそそのかされ2000枚くらい撮影してた

理由:やってみたかった。

これに合わせて追加投資約20万程投下。内訳はF4白筒レンズで12万、シグマのスピードライトで1万5千、一脚1万、追加のSDカード4枚(16GB)程と更にタムロンの標準ズーム(F2.8)まで投下してこうなってしまった。

澤田さんの装備は私の総額の2倍はかかってるけど重量も半端ない。意外とF4レンズでもISO1600 or 3200を様子見ながら手持ちで使えるくらいにはよかったよ。キャノンが誇る手ぶれ補正なだけある。

多分余程じゃなければF2.8もいらないんじゃないかなぁ。重量が1.5kgに跳ね上がっちゃうし。

後々の持ち出す頻度もかなり高いレンズなだけにF4で800g切る軽さと安定の画質は素晴らしいですよ。広角端が70mmと、APS-Cでギリギリ頑張ってポートレート撮影が出来るので、ポートレート撮影するのによく使ってます(コツ掴めば何とかなります

かなり撮影した。選別してまだお蔵に... もう年越すのだがry

RailsGirlsSapporoでコーチした

理由:私が趣味Railsな人だ

コーチ募集もう終ってたんだけど、オーガナイザのおめがさんに頭下げてコーチに。いや〜、教えるのって難しいですね〜 でも楽しかったよ!

ここでも白筒が大活躍してた。素晴らしい。

高専カンファレンス in 北海道3行ってた

理由:開催が近所だった。高専カンファレンスの雰囲気を探ってみたかった。

別にみぃおさんは高専生でも高専卒でもないです。当日は雑用手伝いとかしてました。

あと、あそなす氏とかいましたね。撮影もしてた。高専クラスタとの人脈開拓が微妙になされた気がする!

そらはーが北海道に遊びに来てたので一緒に遊んだ

理由:などない!

1日目はOSCとリアルコンフリクトしてたので別行動で、2日目夕方にOSC勢が解散していったので合流したというアクロバッティングなスケジュールでした。

たくさんのそらはー写真とか芸術の森の写真とかあるけどHDDに眠ってて、現像してupしたいですね。

SECCON予選参加したら優勝してたらしい

理由:つばめさんに勧誘されました。

私はリアル雑魚なので訓練しておきます。

今年のシャッター回数

どうやら15000シャッター超えたらしいです。

SECCON 札幌大会に参加してきました! QRコード問題のwrite-up

どうも、みぃおです。今回はSECCON札幌に参加してきました。

詳しいことは別の記事に書こうと思うのですが、チームdodododoでチーム一の雑魚役やってました。優勝してしまったので本戦がんばります(震え声

そんなわけで、寝落ちる前にwrite-upだけ書きます。

15 デコードせよ その他 100

f:id:miio119:20131202020852p:plain

スコアボードには黄色い☆がついていて、注訳を見ると「You answered fastest in all.」ということなので、 一番乗りで解けたようです。

記録上では「2013-12-01 12:23:48に、dodododoが問題 15を解きました。」です。

f:id:miio119:20131202020507g:plain

QRコードのファイルをMacのプレビューで開くと、なぜか16枚くらい画像が出てきます。

これを、ひたすらiPhoneQRコードリーダーアプリでスキャンします。 その結果をMacに転送し、つなぎ合わせるとBASE64エンコーディングされた文字列らしきものが出てきます。

VlZOQlIwa2dUazhnVlU1QlNra0tWVmRCUjBrZ1RrOGdWVkpCU2trS1ZVNUJSMGtnVGs4Z1ZVMUJUVWtLVlU1QlIwa2dUazhnUjBWT1Mwa0tWRWhGSUVaTVFVY2dTVk1nVlU1QlIwbE9UMHBWVFU5T1ZFRkpVMDlWQ2c9PQo=

これを一度デコードすると

VVNBR0kgTk8gVU5BSkkKVVdBR0kgTk8gVVJBSkkKVU5BR0kgTk8gVU1BTUkKVU5BR0kgTk8gR0VOS0kKVEhFIEZMQUcgSVMgVU5BR0lOT0pVTU9OVEFJU09VCg==

もう一度デコードすると

USAGI NO UNAJI\nUWAGI NO URAJI\nUNAGI NO UMAMI\nUNAGI NO GENKI\nTHE FLAG IS UNAGINOJUMONTAISOU\n

ということで、答えは「UNAGINOJUMONTAISOU」でした。

実際に解くときは、こんなrubyコードを書いて対応しました(後でbase64コマンドがあることを知りました... 恥ずかしい

str = "VlZOQlIwa2dUazhnVlU1QlNra0tWVmRCUjBrZ1RrOGdWVkpCU2trS1ZVNUJSMGtnVGs4Z1ZVMUJUVWtLVlU1QlIwa2dUazhnUjBWT1Mwa0tWRWhGSUVaTVFVY2dTVk1nVlU1QlIwbE9UMHBWVFU5T1ZFRkpVMDlWQ2c9PQo="

str2 = "VVNBR0kgTk8gVU5BSkkKVVdBR0kgTk8gVVJBSkkKVU5BR0kgTk8gVU1BTUkKVU5BR0kgTk8gR0VOS0kKVEhFIEZMQUcgSVMgVU5BR0lOT0pVTU9OVEFJU09VCg=="
require "base64"

p Base64.decode64(str)
p Base64.decode64(str2)

以上です。

ActiveRecord 3 でINSERT SELECTするためのgem activerecord-pickin を作ってみたよ

https://github.com/miio/activerecord-pickin

作りました。

経緯としては

  • INSERT SELECTって地味に使いたい時がある
  • ググっても見つからない
  • ar-extensionsっていうのは見つかったけど、Rails2
  • @onkさんに聞いてみても知らないとお返事をもらう

→じゃ、作るかーってことで基本実装だいたい1〜2日くらいだった気がします

コンセプトとしては、SELECTした結果をINSERTしたいということで、Rails3から強化されてるRelationを有効活用してみました。

使い方とか

Map.where(stage_id: 1).pickin(GameMap, {game_stage_id: 24}, [:id])

INSERT INTO 'game_maps' ("id", "game_stage_id", "type", "x", "y", "created_at", "updated_at") SELECT NULL, '24', "type", "x", "y", "created_at", "updated_at" FROM "maps" WHERE "maps"."stage_id" = 1

1つ1つ解いていきますと

SELECTしたいModel.relationのオブジェクト.pickin(Intoしたいクラス, {特定のカラムを固定の文字にしたい場合}, [INSERT対象から外したいカラム])

です。

例えば、idカラムなんかはプライマリキー制約があったりするので外したいってことが割とあると思うんですよね。 しかし、わざわざカラム指定するのも面倒そうなので対象から外すというアプローチをとってみました(もし標準機能であるなら突っ込んでほしいです

次に、値のオーバライドも対応しました。先ほどの例だと、game_stage_idはMapに持っていないから、固定値いれたいよ!って時に使います。

Map.where(stage_id: 1).select([:type]).pickin(GameMap)

INSERT INTO 'game_maps' ("type") SELECT "type" FROM "maps"  WHERE "maps"."stage_id" = 1

selectにも対応しました。この場合は、selectで指定したカラムのみに対してうまいことクエリを作ります

ちなみに、現時点ではv0.9.1になっていて、正式版ではないです(気になる仕様やテスト整備が追いついていないため 更に言うと、v0.9.0まではMySQLでシンタックスエラーになるバグを抱えています。

多分テスト整備したらv1.0.0で正式版にしたいなーと思ってたり。

開発裏話

やっていることとしては、Rails3から追加されたArelを使ってクエリ生成しているだけだったりします。Arel単体にもINSERT SELECTのクエリを発行できるとか出来ないとかありますが、あちこちFIXMEだらけだった記憶があります。

まぁ、Arelに一応存在していると知る以前に実装してしまったので、実際にはINSERTクエリとSELECTクエリを2つに分けて、これを単純に文字列連結しただけという簡単実装です。

枠を恋人にした設定で実感したこと

どうも、元カノです。

枠 Advent Calendar 2012 3日目です。

http://atnd.org/events/34329

きゅぶんずさんに会ったのは7月の頭くらいにあった、 プロ生の時ですね(会場は某M$の北海道支社でCLR/Hと札幌C++と合同のやつ)

その時は、ちょっと臆病な所があって、抱き着き魔なのは割りとすぐ分かったのですけども(@yuu_haraに抱きついてるとこを見ながら

私に抱きつくまで割りと時間がかかりました

というか、リアル女子にはかなりのチキンのようで、すっげービクビクしてましたよ(実話

というわけで、実は1週間後からスピード交際が始まり

こんなこんなで暴露されたけど、暴露ツイートどっか消えたようです

favのためなら何でもするようです。

8月に一度東京でデートしました。

尚、この数カ月後、色々あってリア充爆発しました。