DevDevデブ!!

プログラミングのこととか書きます。多分。。。

AQUANAUTS vo.21にいってきたよ

いってきたんだけど、別にパーティーレポートとかではない。

(そういう文章は書けない)

AQUANAUTSってなんや?

ドラムンベースサブジャンルであるところのリキッドファンクが大量に流れるイベント

詳しくはレジデントDJのid:Hizuru さんのブログを読んで

what-a-wonderful-world.hatenablog.com

what-a-wonderful-world.hatenablog.com

DJの人はブログとかで発信して欲しいな

このエントリの主題はこっち(タイトルはなんなんだっつー話ですが)

AQUANAUTSが気になる人は現場に行こう。

(ツイッターハッシュタグで検索してみてもいいかも)

グーグルの検索結果がパーソナライズされてるせいかもしれませんが、「リキッドファンク」でググると、上記のブログエントリのうちの下のほうが検索結果トップに出るんだよね。

これってすごいことじゃないですか?ジャンル名でググったらイベントについて紹介しているブログ記事が出て来るって

俺がAQUANAUTS知ったのもリキッドファンクでググってトップに出てきた上記のエントリを読んだからなんだよね。

(リキッドファンクという単語自体をどこで知ったかは忘れた)

ダンスミュージックって、サブジャンルがやたらあって、自分の好きなこんな感じの曲が何というジャンルにカテゴリされているのか、このジャンルの楽曲をリリースしている主なレーベルはどこなのか、ってなことを調べるのにやたら難儀する。

(まあ最近はshazam使えば曲名はだいたい分かるけど)

EDMとか今のメインストリームのジャンルならいいんだけど、ドラムンベースは日本ではそんなメジャーではなく、iflyerに掲載されてるイベント数も少ないので、自分たちがやってるイベントとかジャンルの紹介をブログやらSNSで発信してくれると俺が喜びます。それとtwiplaとかにイベント登録して検索可能にしてくれると。。。。

(ドラムンベースに限らずマイナージャンル全般ね)

(ドラムンベースbeatportでもサブジャンルによる分割がされてないんだよな。。。)

ところで明日はultra japan三日目、ペンデュラムです。

夜のうちに台風どっか行って、朝から晴れるみたいで良かった!!!!!!!!!

golangのrandパッケージのlockについて

rand.Intとか叩くと、実は中でlockかかってますよねっていう話です。

randパッケージってgoroutine safeなの?

math/randを使ってるサンプルではrand.Intとか直接叩いてて、Rand構造体を自分で作ってないじゃないですか?

そこで気になったわけです、これってgoroutine safeなのかどうか

CLIコマンドとか作ってて、goroutineの中で叩かないのであれば別に気にする必要ないんだけど、httpのハンドラの場合、それは自ずとgoroutineで起動するので(少なくともnet/httpはね)goroutine safeかどうか気にする必要があるんだよね。

ほんで、ググってて以下のブログエントリを見つけた。

The Hidden Dangers of Default Rand · Scott Mansfield

ロードジェネレータを作ってて、goroutineの中でmath/randを叩いてたら、あまりにもパフォーマンスが出ないので、math/randのソースを見たらlockしているのを発見した。というような内容 (詳しくは記事を読んで)

よって、中でlockかけてるからmath/randはgoroutine safeなんだね。

lockかかってるっつーことは、複数のgoroutineから叩くワークロードの場合、パフォーマンスが出ないのでは?

上記のブログエントリのロードジェネレータの場合がまさにそれで、ロック解除待ちが問題になっている。

httpハンドラの場合もgoroutineなので、ロック時間が問題になるのでは〜と思ったんだけど、普通のwebアプリの場合そこがホットスポットになることは稀なのか。 (だから日本語の記事は特にヒットしなかったのかな?)

一応回避策としては単純で、goroutineごとにRand構造体を作って、それを叩けという話になるようだ。

 r := rand.New(rand.NewSource(time.Now().Unix()))

てな具合に。(UnixNanoのほうがいいかな)

普通のwebアプリの場合、早すぎる最適化になるのかもしれないけど、どっちみちユニットテストのためにInterfaceでラッパー被せといたほうがいいんだよな。math/rand直接叩くより

ルックルックこんにちは(DNSの話だよ

前回までのあらすじ

ngx_mrubyからDynamoDBにアクセスするために、ちょっとしたクライアントを書いたYO

今回のお話

  • DynamoDBのエンドポイントの実IPからping値のよいやつを選択してええええええ
  • DynamoDBのDNSTTL短いけど、頻繁にDNSルックアップ走ることになるのん??

DynamoDBのエンドポイント、digるたびに違うIP返しますね?

正確には5秒毎に異なるIPが返ってくる

;; ANSWER SECTION:
dynamodb.ap-northeast-1.amazonaws.com. 5 IN A   52.94.8.154

INの前にある5っていうのがTTL

キャッシュサーバから5秒毎にキャッシュが消えるので、違うIPが返ってくるという感じか

まあこの挙動自体はDNSラウンドロビン的なやつなので、特にいうことはない

微妙にping値が良いIPがありますぞ

ec2インスタンス内からping叩いて調べたところ、ほとんどは3ms程度で返ってくるんだけど、中には応答速度が1msを切るIPがあったりする。

なんでしょうね。。。?ec2インスタンスと物理的近い位置に存在するのかな?ていうか同一のAZに存在するエンドポイントの場合にpingの応答が早くなってるのかな?

このAZ間通信のレイテンシ問題、要求レスポンス速度がシビアな分野だと問題になるんですよね。

(まだAZが異なるのが原因とは断定できないが)

elasticacheへのアクセスとか、AZまたぐとレイテンシが大きくなるために、シングルAZに寄せて運用してたり。。。

じゃあ/etc/hostsにping値の良いIP書いちゃえばいいじゃん?

と思うじゃん?

当然アンチパターンとされてるわけです。

Q5: DynamoやAuroraを利用する際のアンチパターンは何か有りますか?

A5: アンチパターンとしましては、DNS名を使わないで、DynamoやAuroraのDNS名を名前解決してそのIPを利用されるパターンが考えられます。直接IPを指定するのではなく、DNS名を使うようにしましょう。また、アプリ側でDNSキャッシュをTTLを無視してしまう場合があります。使う場合には、IPアドレスが動的に変更されることがあり得ますので、DNSキャッシュのTTLを無視しないようにしましょう。JVMではDNSキャッシュしてしまうのがデフォルトでしたので注意しましょう。

aws.typepad.com

あ、はい^^

ping値の良いIPを選択して少しでもネットワークレイテンシを軽減するっつーのはムリっぽいですねー。

あれ?TTLが短いということは、頻繁にDNSルックアップが走るということになります?

単純に考えると、5秒毎にDNSルックアップが走るのか〜?そんでIP変わるからKeepAliveも切れるのか〜???

という懸念点があったので、ちょいと調べた

そもそもHttpクライアントが内部にDNSキャッシュ持ってたりするよな

持ってたりします。

上記の引用にもあるんだけど、JavaDNSレコードに設定されているTTLを考慮せずにキャッシュして、かつデフォルト設定だとキャッシュのTTLが無限なので、別途TTLを設定しないままAWSのマネージド・サービスのエンドポイントにアクセスすると、途中でつながらなくなったりするようだ。

DNS 名を参照するための JVM TTL の設定 — 開発者ガイド

ネットワークのプロパティ

今回作ったmrubyのDynamoDBクライアントはHttpクライアントとしてmruby-curlを使っているので、このあたりの事情はlibcurlに準拠する。

CURLOPT_DNS_CACHE_TIMEOUT

上記リンク先の公式ドキュメントによると、デフォルト60秒間キャッシュするらしい

ほんとはDNSレコードのTTLを尊重したほうがいいんだろうけど、とりあえず大丈夫だろう。

サーバ内にDNSキャッシュおけばええんちゃう

ってちょっと思ったけど、DNSキャッシュサーバはDNSレコードのTTLを考慮してキャッシュを消すはずなので、あんまり置く意味はないか。

今回のケースだとアプリ内部でもキャッシュしてるし。

環境はAWSなので、DNSサーバはvpc内のprivate DNSを見に行くんだけど、このへんで障害起こったことってあるんだろうか。

サーバ内でDNSキャッシュサーバ動かしたら一応可用性の向上にはなるのか

(DynamoDBについてはTTLが短いからあんまり意味ない気がするが)

結局問題は解決してない

DNSルックアップが走るのはしゃーないし、KeepAliveも切れますよと

でも、仮にIPがA〜Fとあるとして、DNSルックアップした際にそれらを順繰りに返してるとしたら、以前アクセスしたことのあるIPについてはKeepAliveが持続してたりする?

(このへんのレイヤー理解が乏しいんだよな。。。)

ちょっとでもDynamoDBのレイテンシを小さくしようとしたら、いまんとこDAXを使うのが確実なんだろうけど、クライアントがJava版しかないんだよね。

しかもHttpじゃなくてTCPで通信してるみたいだし

ソースはgithubで参照できるから、mrubyに移植するのも不可能ではないと思うんだけど、通信仕様をドキュメントとして公開してない(まだしてないよね?)ってことは、なんか破壊的変更が入る可能性も考えられるよなあ

というかDynamoDB、たまにスパイク発生するのが厳しいんですが。。。

主キーを使った単純なGETで、jmeterでしばいてみると、cloudwatchで平均3msちょいのレイテンシになるのだけど、最高値で50msとか出る。

ngx_mrubyだとデータストアへのアクセスでスパイク発生すると、そこで詰まるんですよね。

アドテクでDynamoDB使ってる事例、AWSのページに結構のってるけど、このあたりの問題どうやって攻略してるんだろう。

mrubyやっていってる

ワタクシ動画広告配信のお仕事してまして、配信ロジックの一部をngx_mrubyでアレしてるわけです。

現職は5月からで、まだngx_mrubyで動いてる部分は触ってなかったんだけど、先週から一部改修を担当することになって、ハマった点があったので書いておく

mruby-1.3.0でSocketErrorが出るぞい?

mrubyからDynamoDBにアクセスする必要があり、まだ誰もクライアント公開してなかったっぽいので、自作し始めたんですが、http通信するところでどうやってもSocketErrorが出て困っていた。

github.com

どうもバグらしい。

(mruby本体のものか、mruby-socketのものか分かってないけど)

mruby-1.2.0だと発生しないようなので、バージョンを下げて対応した。

(つーかproductionで動いてるの1.2だった。。。。)

そもそも1.3は先月リリースされたばかりなので、まだproductionで動かすのはちと怖いですね。

mrubyのhttpクライアント、KeepAlive対応してなくね?

前述の通り、DynamoDBのクライアントを書いてました。

DynamoDBとはhttpで通信するので、KeepAliveが有効になっていないとレイテンシが大きくなります。

mruby-s3とかでmruby-simplehttp使ってたから、とりあえず真似して使ってたんですが、ソース見てみたらHeaderのConnectionのとこ、Closeで決め打ちされてるでねーか。。。

github.com

どうも下記のエントリを見た感じだと、KeepAliveの実装は結構めんどうくさいらしい??(←ちゃんと分かってない)

abrakatabura.hatenablog.com

libcurlのラッパーであるところの、mruby-curlだといけそうだったので、それを使うことにした。

github.com

tcpdumpでちょろっと覗いた感じだと大丈夫そうだった。

(http/1.1だと、connectionはcloseを指定しない限り、デフォルトでKeepAliveとなるらしいんだけど、DynamoDBはConnectionにCloseしてもKeepAliveと応答するんだよね。。。サーバ側の振る舞いはそれがhttp/1.1の仕様通りなのか?)

mgemでライブラリ管理したら、mrdbコマンドが消えた??

mgem config default > build_connfig.rb

とかしたあとに、mrubyをビルドしなおしたらデバッガであるmrdbコマンドが消えて困惑したという話。

上記のコマンドだと、以下の行は消えるんですねー

conf.cc.defines << %w(MRB_ENABLE_DEBUG_HOOK)

なんか、mgemじゃなくてbuild_config.rbを直接管理したほうがよくない??って気がしてる

感想

まだドキュメント充実してない感はある。

(それをコントリビュートオポチュニティと捉えるかどうかだな)

既存のrubyのgemが使えないというのは結構大きい

移植しろっつー話になると思うんだけど、aws-sdkは結構重量級だしなー

とりあえず、今回作ったDynamoDBクライアントのawsのv4署名の部分は切り出して公開したい感じ

(v4署名地味にめんどくさくって、公式sdkマジ神だと思った)

HOSPITAL NIGHTとIMAP++いってきた

7/21 HOSPITAL NIGHTいってきた

去る7/21、HOSPITAL NIGHTにいってきました。

170721_DBS - UNIT

金曜の23時半からだから、仕事終わってそのまま行ったんだけど、ボッチは時間潰すのが大変だった。 サイゼリヤのドリンクバーで粘ろうと思ったけど、クソ混んでたんですよね。。。

しゃーないのでマックで時間つぶして、店の外で30分ほど待機してた。

代官山unitにてhospital night待機

unit初めていったんだけど、コインロッカーが小さいですね。。。

事前に調べて知ってたから駅のコインロッカーにカバン入れてからきたんだけど、am2:00超えたら追加料金発生するから、コインロッカー代で800円も飛んでいった。。。

(恵比寿駅のコインロッカーいつから400円もするようになったの?コインロッカーサーチだと300円だったのに)

会社のロッカーにおいてけばよかったなー

先着20名ほどにFUTUREっていうドラムンベースの小冊子配ってて、Vol01をもらった。

hospital nightでもらったドラムンベースの専門誌のバックナンバー。vol01って書いてあるけど、創刊号??

CD付きなんだけど、CD再生できる機械ないっすw

PS4とかXboxONEってCD再生できたっけ?

このブログ書いてるMacbook Pro光学ドライブついてないから、音源はもっぱらitmsで買うかApple Musicで聴くかしてるしなー

PCに取り込む機器が無い。

肝心のDJプレイのほうなんですけど、Danny Wheelerが良かったです。

mineoだと地下は電波が悪いのかshazamれなくて曲が分からないんだけど、俺の好みの曲調だった。

ロンドン・エレクトリシティは、うんホスピタルだねって感じだった。HOSPITALの21周年目記念セットだから当たり前なんだけどw

ドラムンベースを意識して聞き始めたのって、NETSKYの1stアルバムからで、ちゃんとアルバム聞いたのってNETSKY、camo&crooked、metrikくらいで昔のHOSPITALの楽曲実は知らんかったり。

(ロンドン・エレクトリシティとハイ・コントラストはアルバムちょろちょろ聴いてるから、耳が覚えてる曲もあるけど。meteoriteとか)

近況 (転職とか、初クラブとか)

得意なことは三日坊主 ブログ放置しまくってたので近況とか書いときます

転職してました

5月の中旬に転職してました。

中小SIer(一応一次請け、だけど僕はweb系の会社にパートナーとして常駐)から、web系の会社へ。

自分の所属は広告配信事業だけど、それが専業の会社ではないので、Web系としておく。

筆者はJavaがメインで、時々GolangRubyという感じだったのですが、転職先の会社では管理画面にPerlが使われていたため、有給消化期間中にPerl勉強してました。

Perl、むずくないっすか??

むずいってか、RubyPythonと比較して、必要な学習量が多いというか。。。

会社ではAmon2をカスタムした自社フレームワークを使っているので、とりあえずAmon2から触り始めたんですが、Perl最速文法〜みたいなのを読んだだけでは、Amon2のチュートリアル全然わからないんですよね。

それでオライリーのはじめてのPerlを読み始めたんですけど、下巻まで読んでようやくリファレンスが出て来るっていう。

これは章立てが悪いっていう話になるのかな?

結城先生の本あたりからあたったほうが良かっただろうか?

Pythonだったら「みんなのPython」、Rubyだったら「たのしいRuby」を読めばそれぞれFlask、Sinatraチュートリアルは理解できるという感覚なので、続・はじめてのPerlでようやくリファレンスが出てくるっていうのは、学習量多いな−と感じた。

まあ、管理画面を他の言語で書き換える事業メリットは皆無なので、やるっきゃナイトって感じでやっていってるんですが。

おじさん、初めてクラブへ行くの巻

7/14にNETSKYを見にCircus Tokyoに行ってきました。

CIRCUS presents NETSKY

もうなんかクラブとか怖いし、渋谷とかアウェーだしって感じだったんだけど、NETSKYはどうしても観たかったので、おっかなびっくり友達を誘っていってきた。(ドラムンベース好き)

NETSKYは言うまでもなく最高って感じだったんだけど、フロアの地面が揺れるレベルで低音が出る環境でDJ WILDPARTYがかけるジャングルによって軽くポンペになってた(´・ω・`)

続けて翌日7/15、AQUANAUTSに行ってきた。

what-a-wonderful-world.hatenablog.com

AQUANAUTSはリキッドファンク中心のイベント

(リキッドファンクはドラムンベースサブジャンル)

イベントの存在は一年ほど前から知ってて、土曜の夕方から始まるイベントなので参加しやすいなーと思ってたんだけど、まあ、半ヒキなので外出るのが億劫で今まで行かず、初クラブデビューキメた翌日だったので、ノリで行ってきた。

早稲田 茶箱に来た

島袋拓也さん(@stk132)がシェアした投稿 -

いやー、良かったですね。

リキッドファンク好きなんだけど、今までapple musicでHospitalとliquicityをちょいちょいつまみ食いしていく感じだったので、自分の知らない音源を大音量で大量摂取できて、最高でした。

あと、個人的には照明明るめなのが嬉しい。暗いと全然視えない人なので。

8/11にCtrl+Aとの合同イベントがあるとのことなので、これも行こうと思う。

club-mogra.jp

最後にクソ最高なsmoteの動画貼っておきますね

www.youtube.com

今年のULTRA JapanはPendulumも来るし、楽しみですね。

codebuildでハマってた

会社のブログに書いたけど、ここにもまとめておく

AWS CodeBuild使ってみようとして、以下の二点でハマった。

  • buildspec.ymlのphase名をtypoってもエラーにならず、phasesが全て素通りした。
  • go言語のプロジェクトをビルドしようとしたら、vendoringが有効になってなくてハマった

phase名をtypoってもエラーにならない件

ビルド完了してるのに、artifactsに指定したファイルが見つからないというログが出てて、なんでだろうと思ってたら、phasesを全て無視して、artifactsの処理だけ走ってたという話。

(そもそもartifactsに指定したビルド成果物が見つからなかったらエラーにしろって思うのですけど)

原因はpre_buildをpre-buildとtypoしてたせいでした。

phase名をミスったらphases全体をスキップしてしまうのは規定動作なのだろうか??

go言語のvendoringが有効になってなくてハマった

上記のtypoを修正して再実行したら、今度はbuildフェイズのgo buildでパッケージが見つからないと言われた。can not found package〜ね。

pre_buildフェイズでglideで依存パッケージは入れてるはずなので、おかしいなーと思いつつ、vendoring機能について確認してたら、そもそもビルド対象のプロジェクトディレクトリがGOPATH配下に無いことに気づいた。

(GOPATH配下じゃないとvendoringが有効にならないことを忘れていた)

codebuildはビルド対象として指定したリポジトリを/tmp/tmpランダム数字/srcって感じでチェックアウトしてくる。

で、ワーキングディレクトリは上記パスのsrc配下になっている。

この状態からvendoringを有効にするために行なったワークアラウンドが以下。

  pre_build:
    commands:
      - glide install
      - mkdir -p $GOPATH/src/github.com/stk132/tsg
      - mv * $GOPATH/src/github.com/stk132/tsg/.
  build:
    commands:
      - cd $GOPATH/src/github.com/stk132/tsg && go build

うん。GOPATH配下に自分でディレクトリ切って、ファイル全部コピーして、当該ディレクトリに移動してgo buildコマンドを叩いている。

cdとgo buildをつなげているのは、別の行にわけて実行すると、cdの次の行ではワーキングディレクトリに戻っているため。

(このあたりはDockerfileをビルドするときと同じ挙動ですかね?)

これはもうちょいスマートな方法ないですかね??

まとめ

しょうもないことでハマったせいでポケモンやる時間吸われてつらい