limitusus’s diary

主に技術のことを書きます

El CapitanでUSB-Serialを使う

その手の人には常識かもしれないんですが、OS X 10.10あたりからドライバ署名されていないもののインストールができなくなってますね
手元にあるUSB-CVRS9はLinuxで問題なく動いていたので気付くのが遅れてしまいました。

さて、これを使おうとサンワサプライのサイトを見てもOS X用のドライバは落ちていません。
調べてみるとこのUSB-CVRS9、実はOEM品でした。

USB-CVRS9 は ATEN UC-232A の OEM です
MacBook で USB <-> シリアルポート変換ケーブルを使う

なるほど、ということで実際にATEN Japanのサイトからドライバを探してみるも、10.9用までしかなく、無理矢理入れようとしてもインストールには失敗してしまいました。

まさかOS X用にUSB-Serialだけ対応機種を別購入か…

困っていたところでInstalling Aten Serial-to-USB on OS X El Capitanというタイトルそのままな記事を発見。
確認してみたところATEN JapanではなくATEN本体のサイトからドライバを探すと(Support→Software & Driver)無事に10.10対応のドライバ(署名済み)が入手できました。

あとは通常通りcuなりscreenなりで接続すればOKです。
これでOS Xでもルータをいじれますね。

EBSがattachされたらSlackに通知する仕組みを作った

AWS Lambdaを以前から使ってみたいなあと思っていたのですが、「何かの操作にhookする」というので試してみました。

今回は「任意のEBS VolumeがEC2 instanceにattachされたら(AttachVolume)Slackのwebhookを叩いて通知する」というのをやってみました。

Pythonを利用しています
https://gist.github.com/limitusus/59640fc2a9b2bbaf6941

だいたいよく利用されそうな情報は変数に放り込んだので、ちょっとコードをいじれば「特定のVolumeだけ」とか「特定のinstanceだけ」とかも簡単に実現できます。

仕組み

  • CloudTrailを有効にし、SNS通知を有効にする
  • SNS topicにはLambdaを登録しておく
  • Lambda(上URL)ががんばって通知する

気付いたこと

  • Lambdaに最初に渡ってくるイベント通知は小さく、CTのBucketにgzがあるのでそれを取りにいく処理が必要(boto3が使える)
    • Lambdaが実行されるroleにS3アクセスの権限が必要なことに注意
  • gzファイルの展開時もファイルに書き出すような操作はIOErrorとなる。Lambdaの世界ではインメモリで処理する必要がある
  • attachされた時刻が入っているが、UNIXTIMEのミリ秒表記なのでtime.gmtimeに渡すときは1000で割る
  • LambdaのスクリプトはWeb画面でも編集できるがテストしにくいしエディタも慣れたものを使った方がいい
    • ローカルで開発するときは更新をawscliでできるので、以下のようなスクリプトを書いておくと簡単にデプロイできる
#!/bin/sh

zip -r ebsattached.zip ebsattached.py
aws --region us-east-1 lambda update-function-code \
    --function-name "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:ebsattached" \
    --zip-file "fileb://ebsattached.zip"
echo "Deployed"

ISUCON5 予選通過してきた

9/26,9/27で開催されたISUCON5の予選に9/27分で参加して通過してきました。

3人チームで出場しましたが、自分の視点での時系列でまとめておこうと思います。
(書いてある内容は自分の作業だけではありません)

概要

spec: n1-highcpu-4 (4vCPU, 3.5GB RAM) 1台

時系列

10:00
  • 競技開始。事前に準備していたレポジトリをcloneしてきてセットアップを開始。
  • 8/26時点でUbuntuと公開されていたことには全く気付かずCentOSを想定しており面喰らう。
  • とりあえず初期ベンチ。220くらい(記録忘れた)
  • インフラ担当として各種パッケージを放り込む。
  • tmux, openrestyはソースからビルド。nginxは結果的に1.6とか入っていたので何も考えずにビルドして問題なかった
  • 練習のときは全く触れなかったsystemdでアプリが起動している
    • 慣れた手順にするためsupervisordをインストー
    • nginx→openrestyについでに切り替え
    • memcachedも立てておく
    • ruby実装をsupervisord経由の起動に切り替え
      • staticなものはさっさとnginxで返す
      • ベンチがContent-Lengthを要求しているがnginxがgzip圧縮していてContent-Lengthがつかない
      • しょうがないのでgzipはoff
  • mysqlがAppArmorでハマる
    • 1時間くらい悩んだ
  • slowlogが全クエリ出るようになった
  • nginxのアクセスログ解析もできるようになった
12:00
  • 少しコードも見始める
  • entries.bodyをsplitして1行目をtitleに使う作りに見覚えを感じる
    • titleカラムを足して切り離す戦略を取り始める
  • 他にもいくつか飛んでいるクエリを見てindexを追加しようと試みる
  • buffer pool sizeが128MBな一方データが2GBほどあることに気付き愕然とする
    • あわててbuffer pool sizeを変えるが反映されずハマる
  • 50万行のentriesテーブルにindexを貼ってカラム追加するのに20分弱かかった
  • この時点で / へのアクセスが遅いことには気付きつつ、中でいろいろやっているのでいったん後回し。
    • 簡単そうなやつから着手している
  • エントリについたコメントの件数をSELECT COUNTしているのが気に入らなかったのでnum_commentsカラムを追加して更新するようにする

このあたりmysqlの設定変更に手間取りなかなかベンチマーク走行ができず焦る

15:00
  • ようやくALTERが実行でき、entries.bodyからtitleを切り離す作業が完了
  • スコアが2500あたりになる
  • footprintsのクエリが激重なので戦略を考え始める
    • 日付ごとに最新の訪問記録しかいらない
    • 最新のだけ持つことでGROUP BYを消去すればいい
  • 裏では「DOM要素 '#friends dd.friend-friend a' に文字列 'タマキ' をもつものは表示されないはずですが、表示されています」というエラーに苦しんでいるようだ
    • 確率的に失敗しているのか、再現条件がよくわからず一旦スルーする
  • それまで0.35secほどかかっていたfootprints系の処理が0.01secにおさまる。
  • やはり / に0.4secかかっておりここに着手
    • 基本的にはキャッシュ戦略に注力することになる
  • たしかこの辺でスコア3000に到達するチームが現れたと思う
16:20
  • mysqlslowdumpでこの辺のクエリに目をつける
Count: 611848  Time=0.00s (32s)  Lock=0.00s (27s)  Rows=1.0 (611848), root[root]@localhost
  SELECT COUNT(N) AS cnt FROM relations WHERE one = 'S' AND another = 'S'

Count: 500  Time=0.03s (16s)  Lock=0.00s (0s)  Rows=1000.0 (500000), root[root]@localhost
  SELECT * FROM entries ORDER BY created_at DESC LIMIT N
  • 1つ目は最新のエントリを表示するためのものなので、entriesとrelationsをjoinしたクエリを投げるようにすることで解消
17:00
  • このあたりで汎用キャッシュ機構が完成し、ベンチマークが再び流せるようになる
  • スコア20746
    • その前のスコアが2000点台だったので一気に順位が2位に上昇
17:10
  • 最新コメント10件のエントリ情報を出す部分を考え始める
    • publicとprivateでそれぞれ10件取得してUNIONしてORDER BY, LIMITすれば同じものが取れる
    • さらにindexを追加
17:30
  • 安全のため再起動試験を行う
    • supervisordが起動するようになってなかった…修正
    • 他は全て問題なし
    • InnoDB data fileをキャッシュに乗せないとキツそう?ということで初期化処理に追加
17:37
  • ひととおりやろうとしていた改善が完了し、スコア22230
  • 何度かベンチを回しつつ、他チームに追い付かれないかヒヤヒヤしながら待つ
    • なお最終スコアでなく最高スコアで順位がつくとみんなで勘違いしてた
18:00
  • 終了し解散。

結果

http://isucon.net/archives/45532743.html

2日目の4位(スコア20162)に入ったということで本戦出場が決定しました。

本戦は猛者だらけなので勝てるか怪しいですが頑張ります。

YAPC::Asia 2015レポ

去る8/20,8/21でYAPC::Asia 2015に行ってきました。

2012,2013ではstaff参加し、2014,2015は普通の参加者です。
今年は最後のYAPC::Asiaということで、(個人スポンサーチケットは買えなかったけど)参加してきました。
本当はスタッフ参加できればよかったのだけど、仕事の都合がつかず断念…

ブログを書くまでがYAPC::Asia」ということで、これを公開したら俺のYAPC::Asiaは終了だ!!!

まず会場。ビッグサイト。大きい。
こんなに広いところでやるとは…スタッフ大変だろうなあとスタッフ脳になりながら行ってきました。

聞いたトーク

メリークリスマス!

http://yapcasia.org/2015/talk/show/a636430c-0fbf-11e5-8a02-43ec7d574c3a

今年はLarryが来る年、ということでLarryの基調講演でスタート。
Perl6の話かと思いきや半分くらいが指輪物語の話。読んでないので英語では付いていけない。同時通訳に頼る。
普段英語セッションでもあまり同時通訳には頼っていないんですが、ここだけは頼りました。
ついに今年の年末にはPerl6のリリースがありそう?期待していいのかな?という感じのKeynoteでした。

世界展開する大規模ウェブサービスのデプロイを支える技術

http://yapcasia.org/2015/talk/show/9ec2791c-05e5-11e5-81fa-79c97d574c3a

Miiverseを展開しているはてな任天堂からそれぞれ一人ずつの発表。
個人的には結構興味を持った発表でした。
ポイント

  • AWS複数リージョン
    • それぞれでmaster-slave
    • master同士が円環レプリ
  • デプロイ
    • mackerelでAutoScaleを使ったデプロイ→ もっとスケールできるpull型デプロイへ
    • consul + stretcher で実際に高速なデプロイが可能になっている
Consulと自作OSSを活用した100台規模のWebサービス運用

http://yapcasia.org/2015/talk/show/b335dee0-09ad-11e5-8d7a-67dc7d574c3a

fujiwara組の組長であるfujiwaraさんの発表。
上記トークで使っていたconsulとstretcherの話。
実際にどんなことができるのか、どうやって使っているのか、stretcherの設計思想などを聞くことができました。資料も充実。

うっかりをなくす技術

http://yapcasia.org/2015/talk/show/523b9508-0d77-11e5-8174-67dc7d574c3a

Human error ≠ mistake をベースに「どのようにしてmistake/near-miss」を減らすのか、
そのためにはどのような技術選択をすべきか、という話。

ISUCONの勝ち方

http://yapcasia.org/2015/talk/show/86ebd212-fab3-11e4-8f5a-8ab37d574c3a

ISUCON常連のkazeburoさんの発表。
どのようにISUCONの問題に取り組むか、ということが一通り話されました。
一番印象に残ったのはスライド最後の「勝つのは俺たちだ!」の1枚。

Perl 5.22 and You

http://yapcasia.org/2015/talk/show/3fe49c10-fa67-11e4-9e02-8ab37d574c3a

Perlのプロジェクトマネージャでもあるrjbsの発表。
Perl 5.22で新しく入った構文、逆に削除された構文について紹介されました。
個人的には結構いい感じになったんじゃないかと思っているところ。

ランチセッションB / 空間情報探索基礎論

http://yapcasia.org/2015/talk/show/e34fca9d-2ad1-11e5-aca1-525412004261

モバイルファクトリー提供のランチセッション。
普通ランチセッションって割とライトな発表がされて採用してるよ!ってアピールすることが多いのだけど、このトークはまさかのガチ発表。
地球上のGPS座標を用いた近傍位置情報検索技術についての発表がされました。
GeoHexのエンコード方法、近傍探索の手法が勉強できました。
あ、ごはんおいしかったです。

Perlでゼロから作るコンテナ

http://yapcasia.org/2015/talk/show/268d730e-136c-11e5-ac8f-d9f87d574c3a

実は妻の発表でした。
Dockerはコンテナ技術を様々に組み上げて作られた大きなプロダクトですが、そもそもその基盤にあるコンテナの技術とは?というところが勉強できる発表だったと思います。
namespaceの導入、uid namespaceを用いて実際にコンテナの中のuidを書き換えたりと、やりたい放題やれるコンテナの作り方のトークでした。

Profiling & Optimizing in Go

http://yapcasia.org/2015/talk/show/6bde6c69-187a-11e5-aca1-525412004261

途中から聴講。
Goのプロファイラって優秀なんですね。
実践的なプロファイリング手法がライブ紹介されていました。動画に期待。

全体を通して

新しく知り合いになれた人、久々に会う人、「またお前か」って感じで会う人など、いろいろな人に会えました。
YAPC::Asiaスタッフつながりの人とか、カメラマンの八木さんとかとは本当に1年振りだったりして(全員に挨拶できずすみません)。
同窓会っぽい面があるのもこの会のいいところだなと思います。

無限コーヒーすごかったですね。今までの会場では提供できなかったものです。どうやったんだろう…

最後のYAPC::Asiaを終えて

2011年から5年連続で参加してきてついに終わってしまうのが残念な限りです。
Opening/Closingでの牧さん、ありがとうございました。
いつも牧さんはボランティアスタッフの貢献を称えてますが、スタッフ経験者としてはやはり牧さんの力が大きかったんじゃないかと思っています。
今回は過去最多で参加者2000人超。そうそう開催できるものではありませんでした。大きなトラブルも(多分?)なく終了できたのはスタッフ全員のおかげです。CONBUのLTでのライブパフォーマンスもすごかったですね。あんなに早く設営、撤収してるのは初めて見ました。
Beaconの際は是非力になれればと思っています。
ということで、また!

うるう秒をテストしたら仮想インタフェースが落ちた話

今月末はうるう秒が予定されていますね。
http://jjy.nict.go.jp/news/leaps2015.html

これについては様々なところで「何が影響を受ける?」「どう対応する?」などが書かれています。

今回はその中でも、「事前に試験環境でうるう秒を入れてみる」ことについてRedHatの記事が書かれていたので、そのお話。
How to clear the Leap Second Insertion flag after it has been received?

この記事の中では leap-a-day.c というコードが公開されていて、簡単に言うと

ということをやってくれます。

これを試験環境で実行したところ、仮想ネットワークインタフェース(IP alias)が落ちたので、再現条件を記録しておきます。
なお、この問題にうるう秒は本質的に関係ありません

続きを読む

Perlからshared objectの関数を呼び出す

今回のお題

foo.so に含まれている関数 void func(void) をPerlから呼び出す。
プロトタイプ宣言の通り、引数は取らないし戻り値もない(あるいは見ない)。

やりかたはいくつかあって、

  • 普通ならXSモジュールを書いて対応する。
    • ただこのシンプルな目的のためにXSモジュールを書くのはいささか大袈裟すぎる。
  • もう少し簡単にやろうと思うと Inline::C を利用する。
    • これでも別に構わなかったのだけど、今回はこのPerlスクリプトをほぼ同時に並列起動する可能性があり、コンパイルが多重に走るのを避けたい。

ということで、ちょっと珍しいアプローチとしてXSモジュールのベースに使われているDynaLoaderモジュールを直接使ってみることにした。

続きを読む

Perlのglobはもうshellを呼ばない

もう10年以上前の話だが、メモ。

IPAのセキュア・プログラミング講座にある4-2. Perl の危険な関数には以下の記載がある。

便利な<> 構文,glob関数であるが,実は内部的にシェルを呼び出している。そのためリスト7の1行目のような文字列を渡した場合,パスワードファイルの内容をメールで送信できてしまう。

が、これはかなーり古いPerlでの話で、pre-5.6.0のみに当て嵌まる話。現在はFile::GlobというXSで記述されたモジュールがよしなにやってくれており、cshを内部でforkすることはない。

このあたりはperldeltaに詳しい。
https://metacpan.org/pod/release/GSAR/perl-5.6.0/pod/perldelta.pod

この記述、加筆修正されないんだろうか…