Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

AWSにドブ課金するよ

AWS を含めたクラウドは商売のやり方が昔から本当に嫌いで個人では絶対触りたくないのだけど、そうも言ってられない時代なので今後はどっぷりと課金していく決意をする。

久々なので IAM 周りを色々と見て、問題なさそうなことを確認。

http://dev.classmethod.jp/cloud/aws/after_get_aws_account/ を見ながら課金周りのアラートを弄ってみたのだが、これ、複数アカウントで支払いをまとめてない限り特に要らないってことに気がつく。まあ色々触るリハビリにはちょうどよかったのでいいや。

不思議なもので、ドブに捨てるように課金すると決めると、触るのが楽しくなるのである。色々と使い倒して今日設定した課金のアラートも動くか見ておきたい。

ResourceTのコードリーディング

雑に読んだメモ。だいたい構造わかったので満足。

はてなダイアリーからはてなブログに移行した

ようやく重い腰を上げて http://d.hatena.ne.jp/hiratarahttp://hiratara.hatena.diary.jp へ移行した。かなり枯れてきてるので移行しても問題は起きないだろうし、markdownに対応されてるのは便利。はてな記法とか覚えてないし。

http://hiratara.github.io を使ったり Qiita を使ったりもしてるのだけど、前者は git push の履歴が細かく残り過ぎて気軽に編集しにくく、後者はまとまった文章を書いたほうがいいかなーという圧力があって気軽に投稿しにくい。 https://twitter.com/hiratara は気軽でいいのだけど、後からまとめて読み直しにくい。というか、そもそも読み直すつもりのものをまったく書かないのでただのログになってしまう。

ということで、今後はここもメモ用途に使ってみようかなと思っている。

$&のpodはきちんと読むべき

心に傷を負ったのでこれを記しておく。

The use of this variable anywhere in a program imposes a considerable performance penalty on all regular expression matches.

perlvar

perl5.18なら直ってるみたいな噂も小耳に挟んだけど変わらなそげ。手元のperl5.18.1の結果。

% time perl -e 'sub f { $_[0] =~ /foo/ } f("foo") for 1..10000000'
perl -e 'sub f { $_[0] =~ /foo/ } f("foo") for 1..10000000'  6.58s user 0.04s system 99% cpu 6.627 total
%  time perl -e 'warn $&; sub f { $_[0] =~ /foo/ } f("foo") for 1..10000000'
Warning: something's wrong at -e line 1.
perl -e 'warn $&; sub f { $_[0] =~ /foo/ } f("foo") for 1..10000000'  10.79s user 0.06s system 99% cpu 10.850 total

リャマ本には書いてた。

4/1追記: Plack::App::Proxyで使ってた。ごめんなさい。

「アドテクノロジー開発現場の話」を聞いてた

同僚である@myfinderさんが登壇した、Tech Compass【Vol.07】に出席してきました。マイナビさんにレポートをあげていますので、興味のある方がいらっしゃいましたらご覧ください。

超絶トラフィックをミリ秒で処理する、アドテクノロジー開発現場の話

合わせて読みたい

さらなる詳細な内容の書き起こしは、以下のエントリが詳しいです。

2014/1/22 TechCompass #7 超絶トラフィックをミリ秒で処理する、アドテクノロジー開発現場の話 まとめ

確率と測度

定義を忘れないようにまとめ。用語とかは以下の本のもの。

はじめての確率論 測度から確率へ
佐藤 坦
4320014731

  • Ωを標本空間となる集合とする。これは任意の集合でよい。
  • σ-集合体
    • Ωの部分集合の集合B⊂P(Ω)がσ-集合体 ⇔ Ω∈B、a∈B⇒a^C∈B、A_k∈B⇒∪A_k∈B (加算無限和)
    • σ集合体Bについて、(Ω, B)を可測空間という
    • 定理: 任意の部分集合属S⊂P(Ω)について、Sを含む最小のσ-集合体σ[S]が唯一存在
    • ボレル集合体
      • 距離空間(E, d)について、開集合Oで生成されるσ[O]
      • ユークリッド空間R^d上のボレル集合体をB_dと書く
      • ユークリッド空間だと、 B_d = σ[J_d] (ただし、J_d := {(a_1, b_1]×...×(a_d, b_d]}) と書ける
  • 加速空間(Ω, B)、mをB上の関数(ただし値域はR∪±∞)とする。mが測度とは、「0 <= m(A) <= ∞」「m(φ) = 0」「m(∪A_k) = ��m(A_k)、ただし可算」を満たすこと
    • m(Ω_n) < ∞ なる Ωの分割Ω_nが存在する時、σ-有限測度
    • m(Ω) < ∞のとき、有限測度
    • (Ω, B, m)を測度空間と呼ぶ
    • 確率測度とは、測度mで「m(Ω)=1」のもの
  • 可測空間(Ω, B)に対して可測関数X:Ω→Rとは「∀α. {ω:X(ω)>α}∈B」
    • Xが確率変数とは、Xが可測関数であるということ
  • 可測空間(Ω, B)(Ω', B')に対して、T:Ω→Ω'が可測写像とは、「b’∈B'⇒T^-1(b')∈B」
    • Xが可測関数(ただし∞はとらない)であることと(R, B_1)への可測写像であることは同値
  • Ωの分割A_k∈Bとa_kによってX(ω)=��a_k I_{A_k}(ω)と書ける時、Xを単関数という
    • ただし、I_{A_k}(ω)は、ω∈A_kなら1、それ以外のときは0
    • 単関数は定義より可測
  • 確率変数Xについて、E[X]=lim E[X_n]を期待値という
    • {X_n}はX(ω)=lim X_n(ω)なる単関数列で、存在する
    • E[X_n]=��a_k P(A_k)と定義する(ただしX_n(ω)=��a_k I_{A_k}(ω))
  • 測度空間(Ω, B, μ)、A∈Ω、可測関数fに対して、∫_A f dμ := lim (��a_k P(A_k∩B))と定義できる
    • このインテグラルの定義により、 E[X] = ∫_B X dμと書ける。
  • ボレル可測空間上の測度をボレル測度と呼ぶ
  • 確率変数Xの分布μ_Xとはμ_X(A)=P(X^-1(A))で定義される(R, B_1)上の測度
    • Xは可測写像(関数)なのでAが可測集合ならX^-1(A)も可測集合であることに注意

続く。

lambdabot-hipchat-plugins

HipChatを使う機会があったので、lambdabotHipChatへ組み込むプラグインを書いてる。とりあえず年内ぎりぎりでなんとなくは動くようになった。

以下、この件に関するメモ。

HipChatのAPI

WEB APIXMPPが使える。メッセージのストリーミングはXMPPを使うことになってるっぽいので、lambdabotのようなユーザの発言に反応するbotはこちらを使ったほうが良い。ただし、WEB APIの方がXMPPでは指定できないような細いことにも対応しているので、いろんな操作をしたければこちらを叩くことになる。

HaskellXMPP

更新されてそうなpontarius-xmppを使った。network-protocol-xmpp の方も一応は更新されてそう。

HipChatでグループチャットの発言を拾うためにはMUCに対応する必要があるのだが、こちらに対応しているのはhaskell-xmppXMPPの2つだけだが、あまり更新されてないので採用しなかった。

lambdabotのXMPPサポートについては、実は2007年に形跡があるが削除されている。今はXMPP関連のコードは残っていない。と思う。2008年にもXMPP用のforkが作られた形跡がある。が、だいぶ古いしWEB APIも併用したいので、今回はガン無視してスクラッチから書いた。

lambdabot

IRCに密結合している。masterブランチ見た感じだと、本体とプラグインを分けようとしているっぽく、今回作ったものもこれに便乗してパッケージを切った。

lambdabot-irc-pluginsを読むとやるべきことはだいたいわかる。Lambdabot.Monad の received と addServer がエントリポイントで、こいつらを呼べばbotの処理に参加できる。ユーザから受け取ったメッセージは、前者の関数にひたすら流す。botの発言はaddServerに登録したハンドラに流れてくるので、これを再びユーザに返せばよい。

ただし、どちらのインタフェースもIRCと密結合しており、IrcMessage型を必要とする。XMPPやWEB APIの言葉をそれっぽくIRCの言葉に翻訳する必要がある。メッセージの先頭が「:」から始まるとか、割と生のプロトコルが見える形なので、気持ち悪い。

lambdabotのIRCへの接続は、ドキュメントで見てもわかるようにコマンドライン引数の -e で irc-connect コマンドを実行させることで行う。このオプションを渡さないと offline コマンドが呼び出される仕組み。シンプル過ぎる。同様に今回作ったプラグインでHipChatへ繋げたい場合は、コマンドライン引数で -e に hipchat コマンドを渡すと良い。

cabal sandboxとlambdabot

lambdabotは以下の2点の理由でcabal sandboxと相性があまりよくない。

  • djinnなど、ライブラリではなく実行可能ファイルを必要とする
  • muevalがcabal sandboxを見つけられない

前者はPATH環境変数、後者はGHC_PACKAGE_PATH環境変数を、手元でlambdabotコマンドを実行する時に手動で設定することで凌いでいる*1

まとめ

よいお年を。

*1:sandbox用の環境変数取り出すいい方法はあるかも?