Hatena::ブログ(Diary)

北海道苫小牧市出身のPGが書くブログ RSSフィード Twitter

Fork me on GitHub

2999-12-31(火) このエントリーを含むブックマーク このエントリーのブックマークコメント

しばらくはgithub pagesで書いてみる。

2014-03-31(月)

$&の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で使ってた。ごめんなさい。

2014-01-28(火)

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

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

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

合わせて読みたい

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

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

2014-01-19(日)

確率と測度

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

はじめての確率論 測度から確率へ
佐藤 坦
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μと書ける。
  • ボレル可測空間上の測度をボレル測度と呼ぶ
    • ルベーグ測度とは、任意の区間Iに対してμ(I)が区間の体積となっているようなボレル測度のこと
    • ルベーグ測度は一意に存在する
  • 確率変数Xの分布μ_Xとはμ_X(A)=P(X^-1(A))で定義される(R, B_1)上の測度
    • Xは可測写像(関数)なのでAが可測集合ならX^-1(A)も可測集合であることに注意

続く。

2013-12-31(火)

lambdabot-hipchat-plugins

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

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


HipChatのAPI

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


HaskellのXMPP

更新されてそうな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用の環境変数取り出すいい方法はあるかも?