Pixel Pedals of Tomakomai

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

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用の環境変数取り出すいい方法はあるかも?

今日は「秋のエンジニアぶつかり稽古 2013」の日です

@__kanさんを見に来てます。メモを取る必要のあるイベントかわかりませんが、一応。

行事の内田さんより

  • YAPCでのカヤックさんの企画
    • かん関とあんちぽ関の取り組み
    • 「俺の本気を見せてやる」プレゼンタイム

吉高由里子と僕 / @hisaichi5518さん

  • コピペ辛い→おじさん達となくしてる
  • 吉高由里子さんが大好き
    • 笑顔が素敵な女優さん
  • 吉高由里子さんに相応しい男か
  • クリエイターとは
    • 作家、芸術家。作って発表してる人
    • カヤック 「WEBクリエイターの集団」
    • 僕もクリエイターだ!
  • 仕事では書いてないので、胸を貼って言えない
    • 吉高由里子さんに関係するものをネットに公開→結婚
    • おもしろ法人にいても面白いことを言えない
  • 「最高のハックは、日常的な問題への個人的な解決策」
    • ワンクリックで吉高由里子さんを見れるようなGoogle Chrome拡張
    • なぜかやじうまウォッチに取り上げられた → 連絡は来ない
  • クリエイターは一日にしてならず
  • 連絡は来なかったけど、クリエイターに近づけた
    • 誰かのためでなく、自分の小さな問題を自分なりに解決すればよい
    • リアクションも嬉しい (承認されない可能性もあるけど)

勤労と感謝とプログラム / @r7kamuraさん

  • 2010年に初めてエンジニアリング 「今季何見てるんですか?」
  • 2011年 分散GPU
  • 2012年 クックパッド 新卒1人
  • 2013年 秋場所 → 意識のぶつかり合い。本気。やばいイベントぽい
  • 若者 → 本気を見せることはかっこ悪い
    • 本気を出しているときはフロー状態。記憶に残らない
  • 本気を出して作ったもの
  • 相転移 - 好意、上の怒り
    • 好き過ぎて、気に入らない部分が見えてくる
    • 一日で書き換える
  • Chanko
    • 特定の機能のプロトタイプを行う
    • ある条件において、機能を注入する
    • スタッフだけとか、特定の時期だけとか
    • 例外発生時は本来の機能に切り戻し
    • テストもないような作成したばかりの機能でも安全に投入できる
  • MVCでうまくいくのは小規模アプリだけ
    • ファットモデルの問題とか
    • DCI : ユーザ体験やロジックに基づいてコードを分割
    • Chankoもこの思想
    • 一枚岩のRailsのアプリを、nodeでできた複数のアプリに分割するとか
  • 内部はひどかった
    • Complexity 2.5点/4.0満点
    • 外部に誇れるプロダクトであるべき
  • Tunningathon
    • 200ms 以内にレスポンスを返すのが目安
    • Nyanko → 怒りから生まれた、Yet another Chanko
    • 速度も上がった。本気を出したから覚えてないけど
  • うまく行かなかったこと
    • 悔しい思いをして、勉強し始めた
    • 入社して全部のgitのdiffを見ている
  • エンジニア界隈に必要なのは、モチベーション
    • wikihouseプロジェクト。3Dプリンタで自分で家を作って住む
    • モチベーションがあればなんでもできる
    • 他の方にもモチベーションを共有したい!

すべてが@__kanになる / @hirataraさん

自分のトークでした。kan拡張の話をしました。

文系学部卒アラフォーエンジニアが本気で理系大学生やってる話 / @gosukenatorさん

  • 学生をやっている
  • 学割
  • 履修計画 → 1科目2単位、16科目/年
  • 授業 → テキスト、メディア、スクーリング
  • 1科目につき2本のレポート
    • レポートは2年間有効
  • 勉強時間 → 朝(30分)、昼休み、夜(1時間)、土日
    • レポートは紙
    • コメントの内容は先生によってだいぶ違う
  • プログラミングの科目も、プロでも全部Sが取れるわけではない
  • 成績優秀だと大学のスカラシップ制度適用 (学費15万円が10万円に)
  • ロリポクラッキング事件で大学どころでは(試験の一週間前)
    • 徹夜対応→合格
  • 阻害要因 → MTAL GEAR SOLID V @ PS4
  • 来年から本気出す

横綱級エンジニア2名によるぶつかり稽古 / @__kan 関, @kentaro 関

  • こういうイベントになってしまった弊社はどうなのか
    • @__kanさんとぶつかると飛ばされてしまう
    • 精神的ぶつかり稽古 → ペアプロ
  • @kentaroさんがテストを書いて、@__kanさんが交互に実装していく
  • 「こういう被り物でプログラムするの初めて」
  • 力士の実装
    • まずはnewの実装 → vimスワップで苦戦 → 完了
    • しこ名を取るアクセサの実装→「Moo使ったことないからわからない」「自分も使ったことない」
    • 「ぶつかり稽古がこんな大変とは思わなかった」
    • 星取表へのアクセサ → 「なかなかやりますねえ」
    • 取り組みをしたら星取表が変わるか → $selfが勝つように実装
    • 勝ち星と負け星?白星と黒星? → アクセサから出して算出
  • 番付クラスの実装
    • new。力士を渡せる → テスト側のミスが。「稽古と言うよりアシスタント」
    • torikumiメソッドの実装で一気に@__kan関が不利に 「これがぶつかり稽古ですよ」
    • 変数名が @tmp, $foo, $bar に 「完全に転がし対象ですね」
    • テスト通らず「教えてくださいよー」「テストの方ですね」
  • 「取り組み時間、残り3分です」
  • -Ilib が無事にbutukari.plを完成!!
  • 「後何分?」「マイナス2分くらい」
  • 「後はkanさんがどんな感じでやるか見ていましょう」「なるほどー、mapですか」
  • 完成!!

終わりの挨拶

2014年をお楽しみに!