DevDevデブ!!

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

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をビルドするときと同じ挙動ですかね?)

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

まとめ

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

ひさびさにMakefile書いた

別にC++を書き始めたとかいうことではない。 タスクランナー代わりにMakefileを使っている。

今仕事で、NFSのHA構成を構築するAnsibleスクリプトを組んでいるのだけど、ansible-playbookコマンドってextra-varsとか、tagの指定とか入ってくると横にクソ長くなるし、extra-varsの一部を変更して実行する必要がある場合とか面倒くさいんですよね。

なのでMakefileでタスク定義すればいいじゃん?と思いました。

Macならデフォルトで入ってますしね。(command line toolsかxcode入れる必要あったっけ?)

ていうかデフォルトで入ってるっていうのはツール選択上の強みですよね。

(だったらシェルスクリプトのほうがいいやんけって言われそうだけど)

gulpとかで書いた場合、他の人に渡すときにgulp入れてもらわないといけなくなるし

gulp1つインストールできない人にAnsibleスクリプトを引き継いだりするのは、それはそれで怖いけどね。。。

ここ一年間の進捗

ここ一年間ほどダイエットを敢行していたので、進捗を晒します。

進捗

  • 開始時 : 133kg
  • なう : 80.75kg

身長174.5cmなので、あと10kgほどは落とす必要がある。

f:id:stk132:20161108023503p:plain:w200:leftf:id:stk132:20161108023524p:plain:w200:leftf:id:stk132:20161108023541p:plain:w200:left

ちなみに体脂肪率は11/7朝時点で12.7%とか出たが、体重が増減してないのに日によって5〜8%ぐらい上下するのであまり信用していない。

きっかけ

去年の健康診断で血圧が上140いったのと、肝臓の数値が悪くて病院での診断をすすめられたため。

「痩せりゃ正常値の範囲に戻るっしょ」という雑な考えのもとダイエットを開始した

(結局医者にはかかっていないので、今月の健康診断で数値が悪いままだったら本当に病院いかないといけないかも)

手法

食事はとりのささみをレンチンしたものにケチャップをかけたのと、豆腐をレンチンしてめんつゆかけたのばっかり食ってた。

あと、毎日エアロバイク15km

厳密には食事制限してなくて、大体1日1500kcal以下を目標としてたんだけど、カロリー計算するのがめんどくさくて同じものばっかり食ってた。

痩せてどうなったか

適当にLサイズの服を選択して普通に着られるっていうのは最高

(キングサイズの衣料はデザインがダサい上に、面積がデカイために高いということが多い)

あと、ズボンにデブ穴ができる心配が減った。

しかし、足のサイズが30cmあるので、靴選びだけは未だに難航する。(靴下もな)

終わりに

もう少しでBMI上の肥満域を脱してしまうのだけど、このブログのタイトルどうしましょうかね。。。

speakerdeckのスライドをpdfで保存するCLIコマンドを作った

github.com

pocketに保存したspeakerdeckのスライドをpdfでダウンロードしてローカルに保存するコマンド

won't read it laterの頭文字をとって「wril」です。

なぜ作った?

端的にいうとspeakerdeckが重くてkindle fire HD7と俺の寿命がマッハなので、いったんpdfで保存し、kindleパーソナルライブラリに突っ込もうとしたって話

いや、ほんと、speakerdeckって重くないですか? エアロバイク漕ぎながらpocketに入れた記事を消化するんですが、slideshareは普通に見られるのに、speakerdeckは重くてまともにスライドのページがめくれないんですよね。

めくれないどころか、kindle fire HD7がフリーズして再起動したんですよね。

おかげでspeakerdeckのスライドが全然消化できないので、技術で殴ろうとしたという話

仕組み

  • pocketのapiを叩いて、「speakerdeck」という文字列が含まれるエントリを検索
  • 上記検索結果からエントリのURLにアクセス
  • アクセスしたspeakerdeckのページから、PDFのダウンロードリンクをスクレイピング
  • 上記pdfリンクにアクセスしてダウンロード

技術的に特におもしろいところはない。

pdfをkindleパーソナルライブラリにアップロードするところは今のところsento-to-kindleアプリで手動アップロードしている

使い方

以下でコマンドをビルド

npm install
npm run build

pocketのコンシューマキー、アクセストークンを環境変数に設定

export POCKET_CONSUMER_KEY=xxxx
export POCKET_ACCESS_TOKEN=xxxx

以下のように実行

node dist/main.js -d /tmp/pdf_dl -c 10 -s unread

オプションで指定しているのはそれぞれ

  • ダウンロード先ディレクト
  • ダウンロード数
  • pocketのアーティクルのstateの指定

ちなみにpdfのタイトルはURLをスラッシュ区切りにして、末尾のパスを使っている。 これだと同名のスライドがあった場合、上書きされてしまうので、スライド著者のspeakerdeckのアカウント名を先頭に入れて一意性を担保したほうがいいかもしれない。

終わりに

とりあえず、pocketに保存したspeakerdeckのページからスライドをpdfダウンロードして、kindleパーソナルライブラリに保存するという目的は達成できている。

あとはページング対応入れたらいいかなという感じ

というか、当初IFTTTとAWS Lambdaと組み合わせてピタゴラスイッチ化するつもりだったんだけど、途中でめんどくなってやめた。CLIコマンドならnode.jsである必要はないので、golangで書き直すかも。