2012/09/30

YAPC::Asia Tokyo 2012 参加記録 #yapcasia

前夜祭も含め三日間参加してきました.ブログをかくまでがYAPC::Asiaということで,感想を綴っておこうと思います.

はじめに

今年も私が所属する株式会社アイダックに企業スポンサーになって頂きました.ありがとうございます.

また運営スタッフの皆さま,ありがとうございます.スタッフの方々のおかけで楽しい時間を過ごせました.

Perl Mongers

各地のPerl Mongersに会うことができる数少ない機会でしたので,普段お世話になっている方に挨拶してきました.

その中でも特に印象深いのは,近藤さんに直接お礼を伝えることができたことです.日本語版『初めてのPerl』を熟読してPerlを覚えたクチですが,読んでいた当時の自分は,翻訳者ご本人に直接お礼を言える機会があるとは思ってもいませんでした.

Perl Mongerのくくりにいれていいのか分かりませんが,またLarry Wallさんと写真を取れました!以前撮影した写真を見せ,また撮影をお願いしたところ,「OK. モウイチド」と快く応じていただけました.ありがとうございます.

モチベーション

毎回感じることですが,参加後は意識が高まって(),非常に開発したい気分になります.大勢の方が良質なアウトプットしているので,その影響を受けているのでしょう.この状態を維持し,あずまさんが仰ってたようにCPANに恩返し,恩送りしたいところです.

昨年と違い今年は登壇しなかったため,少し物足りなさが残りました.来年は(当選するかは別として)トークを応募しようと思います.

リンク

1日目,2日目のまとめをアップしてあります.例年通りなら後日トークの動画がアップされるかと思いますので,それまでの繋ぎとしてご利用ください.注意点ですが,自分用に聞いた話をメモしたものですので,解釈が間違っている可能性もあります.

YAPC::Asia Tokyo 2012 2日目

CPANに恩返ししよう

CPANモジュールはいつも本当に完璧か

  • 例えばCrypt::DH~0.07はこけたりする
  • 他にも依存モジュールでこけたりとか
    • CPAN Dependenciesを参照すると依存や各モジュールのインストール成功率が見れる
  • SYNOPSISがなかったりすることもたまにある

プログラマたるもの,常に建設的であれ

  • バグとかにぶち当たったら,対応する
    • patch
    • bug report
  • 自分のためでもあり,他の人の為でもある

連絡方法

  • Email
  • Twitter
    • ぼやいたら6分後にyappoさんが反応をくれた
    • #perlをつけるとか
  • Blog
  • github
  • PAUSE

恩返しするための方法

  • ブログに記録を残す
    • 現象や環境(バージョン等)
  • テストの失敗を報告する
    • CPANRTやgithubにIssueを書く
    • 簡潔にわりやすく
  • モジュールの使い方を書く
    • POD形式を意識して書いておく
  • 改善要望を出す
    • patchがなくても,issue登録だけでもOK
    • デザインの手助けもありかも
  • 盃を交わす
    • 勉強会に参加,開く

恩返しの次は恩送り

  • Nephia(Mini WAF)を作ってCPANにあげた!

Perl as a Foreign language

  • dan kogaiさん

前置き

  • 以前はPerlがどこにでもあった
  • 今はそれがJavaScriptになっている

この先Perlの生き方

  • サーバ側にはまだJavaScriptは普及しきっていない
  • とほほ・Kentな人でも使える
  • one-liners, shell script++として
    • Minimal Perlが参考になる
  • perlが遅い
    • 数値計算が遅い
    • 他の部分で頑張ってる.例えば起動処理はnode, php, python等と比べて速い
  • True TDD
    • testしてからじゃないとinstallしないポリシー
  • Decent Unicode Support
    • Perl, 1.9.XのRuby
  • Community

Perlで始める!初めての機会学習の学習

  • TAKESAKOさん

機会学習の教材

  • Pythonばっかり
  • PRMLは数学を忘れているのできつい
    • あんちょこを作ってgithubで公開し,ついでに販売

身近で機会学習の使われているところ

  • Kinect
    • Random Forest アルゴリズム
    • 奥行きからパーツ分けして認識

Kinect x Perl

  • CPANにない
  • Perl-Kinectを開発中
    • リアルタイムにテキストで出力
  • Kinect x DNS

Perl入学式をやってみた

  • @__papix__さん

運営上で気を付けていること

  • できるだけその場で質問に答える
  • コーディングを重視.できるだけ手を動かす
  • 継続的参加できるようにする
    • 2回同じ内容で対応
  • Twitterでのアフターサポート
  • 最初はいなくても,動いていればいずれ集まる
  • やる気大事

モダンmod_perl入門

  • @xtetsuji

mod_perlとは

  • mod_perl2も出てから10年経ってる
  • Perl CGIの高速化
    • Perlインタプリタを常駐化することの副次的な効果
  • Perlでapacheのinternalに触れる

mod_perl handler

  • sub hander {}を書いていき,apacheのconfigで設定する
  • 大量のhtmlの絵文字変換とか

使った例

  • mod_rewriteをmod_perlで書く
    • perlで出来ることはなんでもできる
  • PHPの前後でhookして書き換え
    • PHPのコードは書けないけど,除去はできる
    • 認証を全部削って,mod_perlで認証を追加
  • apache mpm threadとithreadでQueue Serverを実装
    • 複雑なことはしていない
    • 10K/minぐらい出てる

その他

  • handlerで書けば,mod_mrubyとも勝負できそうな速度
    • mod_mrubyの中の人のベンチ
    • 7000 req/secくらいは出る
  • \@mod_perl_infoを取ったので質問

mizzyさんの話は後日動画でご確認ください.

2012/09/28

YAPC::Asia Tokyo 2012 1日目

YAPC::Asia Tokyo 2012の初日です. 久しぶりに会う方とご挨拶できて,非常に良かったです.二年ぶりにLarryさんとも写真をとらせていただきました. またXslateのbridgeの件でgfxさんとお話して,今後の対応を確認できたのも収穫です. 以下は聞いてきたトークのメモです.あくまで私のメモなので正確な内容は今後公開されるスライドや恐らくアップロードされる動画を確認してください.おかしい点があれば,ご連絡ください.

What Does Your Code Smell Like?

  • Larray Wallさん
  • perl5のコードをperl6に書き換えるライブコーディング 
    • subの定義に引数を指定できる
    • referecneが簡潔に
    • if, while等の一部で括弧を省略できる
    • (^100).roll(10) 0-100までの乱数を10個生成する
    • say "Before @a"が展開されない.say "Before @a[]"にする必要がある
    • 0 ..^ @x 0から@xまで.省略すると ^@x
    • functional programmingもできる
    • gather/takeでありがちな一時変数を減らしたりとか
    • infix:<M>でオペレータMを定義できる? @out M= merge(@x,@y)みたいなコードがかける
    • その他色々

Web::Security beyond HTML5

  • Yosuke Hasegawaさん

Ajaxを利用したXSS

Ajaxデータを利用したXSS

  • ちょっと遅れて最初5分くらいは聴き逃した
  • IEだと勝手にapplication/javascriptがtext/htmlと解釈されることがある
  • IEにおけるファイルタイプ決定のメカニズムが複雑すぎる
    • URLの拡張子によって挙動が変わったりとか
    • 挙動がいつのまにか変化していることが多い
      • microsoft.com + IEの組み合わせのみでXSSになるページもあった
  • 発生しやすい状況
    • JSON
    • JSONP
    • CSV

Ajaxデータの盗み見

  • JSONとかは狙いやすい
  • Array Hijacking for Android
    • object.prototype. __definegetter__とか使う
  • JSON Hijacking for IE
    • JSONの一部にUTF-7とかで攻撃コードを紛れ込ませる
    • IE6,7だとresponse headerよりも

対策

  • X-Content-Tyep-Options: nosniff
    • IE6,7には効果なし
  • XMLHttpRequest以外からのアクセスを遮断する
    • X-Request-Withを見て判断する(jQueryとかが入れてる)
    • 自分で任意のheaderを使うのもあり

XHR Lv.2の注意点

  • クロスドメインリクエストが可能
  • ただしクライアントとサーバ側で注意しないと危険
    • クライアント側
      • URLのチェックを怠らない
      • URLの確認はじつはめんどくさい
    • サーバ側
      • Originヘッダを見るだけではダメ
      • Cookieを使う
      • setRequestHeaderで独自の確認用ヘッダを付ける
      • preflightリクエストを使うとX-hogehogeというヘッダを使えるようになる
      • Plack::Middleware::CrossOriginを使うと楽

XSSフィルター/XSS Auditor

  • IE8, Chrome,Safariとか
  • 誤検知もあるので,X-XSS-Protectionヘッダでコントロール可能

X-Content-Type-Options: nosniff

  • 動的コンテンツには全部付けておくべき

クリックジャッキング対策

  • X-Frame-Options: DENY
    • できれば使ったほうがよい

Content-Security-Policy(CSP)

  • XSS根絶の切り札
  • まだまだ規格・実装が不安定
  • 許可するリソースを記述

    Content-Security-Policy: default-src 'self'; image-src *
    

HTTPSの強制

  • HTTP Strict Transport Security(HSTS)
  • HTTP Responseヘッダで指定する
    • HTTPでは汚染されているかもしれないので,HTTPSで吐き出す必要がある

まとめ

  • ブラウザベンダーに文句言うだけじゃなく,サーバ側で積極的に対応する必要がある
  • 是非実装に落として,どんどん広めていって欲しい

大きくなったシステムの疎結合化への取り組み

分離する

  • Service Procedureに差し替える
    • 基本的にプレーンなデータを返す
    • オブジェクト等は返さないようにする
  • 今回は内部向けのCoreInternal API
  • 1つのリポジトリにいれてる
    • メリット
      • 既存資産の活用
    • デメリット
      • リポジトリの肥大化
  • JSONRPC over HTTP / Plackを使用
  • まだ社内でもベータ的な状態

コードの計測

  • Inscpect Packageで計測
    • 昨年のmixiの人が発表したやつ
    • 結合度,複合度を計算して,技術的な負債をスコア化
  • コードレビューもやってる
  • ガイドラインをテストにして自動化する
    • @EXPORTを禁止
    • 非推奨モジュールの使用のチェック
    • ループ用途のmap, grep
  • 何気なく書いているコードで複雑化していくので,意識して書く

Perlと出会いPerlを作る

  • 五嶋さん
  • 大学時代はKonohaScriptの開発

gperl

  • コンセプトは世界一高速なPerl処理系を目指している
  • C++でスクラッチで開発
  • フィボナッチやたらいまわしで数十倍高速
    • 数値はperlの弱いところで,文字列処理をやっていないのはちょっとアンフェア by dan kogai
    • Regexとか文字列関連はまだ実装されていないので,できてからベンチ取りたい

高速化

  • 引数用の配列を事前に構築
  • NaN-boxingによる型検査
  • アノテーションによるStatic Typing/JIT Compile

    • # @static_typing, # @jit_safe

      # @static_typing
      sub fib {
          ...
      }
      

仕様の都合で諦めた箇所

  • 関数引数にあるリストの展開
    • 関数用に確保した配列を拡張する必要があるので遅い
  • デフォルトでのスカラー変数の参照渡し

Profiling memory usage of Perl applications

  • ps, top, /proc等を使う
  • RSSを計測の目安に使わないこと
  • Devel::Peekで変数(IV, HV, GV等)の構造を表示できる
  • Devel::Sizeでメモリ使用量を見れる
  • Devel::Sizeを拡張したい.一部した
  • Devel::SizeMeGraph なんか色々可視化してる!

2012/09/22

Released Text::Xslate::Bridge::FillInForm::Lite

追記 2012-10-03

Don't use this module. You should use Text::Xslate(ver 1.5018 or higher) and html_builder_module option. See Text::Xslate::Bridge::FillInForm::Lite for detail.

Tex::Xslate側でhtml_builderをかませるhtml_builder_moduleオプションが追加されたので,このモジュールはdeprecatedになりました. 詳しくはText::Xslate::Bridge::FillInForm::Liteをご確認ください.

これから以下のようにfillinformをかけます


    use Text::Xslate;
    my $txt = Text::Xslate->new(
        html_builder_module => ['HTML::FillInForm::Lite' => ['fillinform']]
    );

Dancerのconfigでは以下のように指定してください

    template: "xslate"
    engines: 
      xslate: 
        html_builder_module:
          - "HTML::FillInForm::Lite"
          - ["fillinform"]

ご対応いただいたgfxさん,patchを書いていただいたtokuhiromさん,ありがとうございました!

追記ここまで

LINK

INSTALL

$ cpanm Text::Xslate::Bridge::FillInForm::Lite

HOW TO USE


    use Text::Xslate;
    my $txt = Text::Xslate->new(
        module => ['Text::Xslate::Bridge::FillInForm::Lite']
    );

    my $output = $tx->render_string(<<'T', { q => { foo => 'bar' } } );
    : block form | fillinform($q) -> {
    
: } T

MOTIVATION

  1. 毎回,Text::Xslate::Manual::Cookbookからcodeをcopyしてた
  2. Dancer::Template::XslateのようにText::Xslate#newにfunctionを渡せない時がある

Dancerのconfigはyaml形式のためcodeを直接書けない.moduleオプションは文字列で渡せるので問題ない

    template: "xslate"
    engines: 
      xslate: 
        module:
          - "Text::Xslate::Bridge::FillInForm::Lite"

一応,以下のように書けば対応はできるがめんどくさい


    package MyApp; 
    use Dancer ':syntax';
    use Text::Xslate qw(html_builder);
    use HTML::FillInForm::Lite qw(fillinform);

    our $VERSION = '0.1';

    set 'engines'  => {
        'xslate' => {
            function => {
                'fillinform' => html_builder(\&fillinform)
            }
        }
    };

    get '/' => sub {
        template 'index', { q => { foo => 'bar' } };
    };

    true;

追記 2012-09-24

Text::Xslateとしてはラッパー的なpluginが溢れるのはよくないよねという方針だったらしいので、tokuhiromさんが汎用的に使えそうな案をいくつか出してくれた。
Re: Text::Xslate::Bridge::FillInForm::Lite

3番目のText::Xslate#newにhtml_builderオプションを追加する方針が良さそうに思う。
上記patchが取り込まれるかはまだわからないが、取り込まれた場合はこのmoduleはdeprecatedにする予定

2012/09/11

最近読んだ本のまとめ


Twttierにしか書いてないと忘れるのでメモ

チケット駆動開発











プロダクティブ・プログラマ












2012/09/04

JSON::Types::boolとJSON::PP::value_to_json

JSON::Types ってのを書いた

JSONとして数値を返したい時によく+0とかしてたけど,こっちの方が意図が明確になって良さそう.

JSON::Typesの実装方法を確認しているときに,JSON::Types::boolが気になった

    sub bool($) {
            $_[0] ? \1 : \0;
    }

なぜ1,0のreferenceを返してるのか.その答えはJSON::PP::value_to_jsonの中にあった.

    sub value_to_json {
        my ($self, $value) = @_;

        # 省略

        my $type = ref($value);

        if(!$type){
            return string_to_json($self, $value);
        }
        elsif( blessed($value) and  $value->isa('JSON::PP::Boolean') ){
            return $$value == 1 ? 'true' : 'false';
        }
        elsif ($type) {
            if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
                return $self->value_to_json("$value");
            }

            if ($type eq 'SCALAR' and defined $$value) {
                return   $$value eq '1' ? 'true'
                       : $$value eq '0' ? 'false'
                       : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
                       : encode_error("cannot encode reference to scalar");
            }

            # 省略
        }
        else {
            # 省略
        }

    }

JSON::PP::Boolean\1, \0を渡すとtrue, falseにしてくれる模様.

ちなみにJSON::PP::Booleanの生成方法

    $JSON::PP::true  = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
    $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };