てきとうなメモ

本の感想とか技術メモとか

YAPC::Asia 2009 2日目

How regular expressions work internally - José Castro (cog)

"Hello World" =~ /World/;
  • Hello Worldに対してWorldをずらしていき,最初の文字(W)をまずmatchさせ,次の文字(o)がmatchするか調べる
"Hello World" =~ /Words/;
    • Wordsの4文字目で失敗する.
    • "Hello World"の長さが超えていてもマッチしようとする (ex. "ord" == "Words")
  • quantifier
"aaaabbbbaabbaa" =~ /aa+b+/;
    • aにmatchしなくなる部分でbacktrack発生
  • not greediness
aabb =~ /a+?b+/
    • a+?がgreedyでないので2文字目でb+に進む backtrack
  • common mistake
"it's 42" =~ /(.+)(\d+)/; # $1 = "it's 4", $2 = "2"
  • performance
"aaaaaaaa" =~ /a+a+a+a+a+a+b/
    • 最初のa+がgreedyなので最後まで進めて次のa+がmatchせずbacktrack
    • 最初のa+を7文字とする.次のa+を1文字とする.やっぱりbacktrack
    • 最初のa+を6..1文字とする
    • 大量のbacktrack
    • このmatchは0.02sかかった
    • 1文字増やすごとに50%ぐらい処理時間上昇
    • 30文字の時 = 6.27sec
  • bの後ろに$を置いた場合は?
    • $を使ってもよけい悪くなる

The Way to Rakudo * - Jonathan Worthington (jnthn)

  • perl 6
  • perl6
    • Perlを再設計
    • 文法的に後方非互換
    • しかし,Perlっぽい言語に
  • perl6 is spec
    • 一部はドキュメント化され,一部はテストが仕様になっている
  • ウォーターフォール型ではなく,渦巻き型開発
    • フィードバックを得て良いものにする
  • 最初のちゃんと動いた実装であるpugsはもうactiveではない
  • Rakudo
    • perl6実装
    • on parrot vm
    • most active
  • 良いニュース
    • very active
    • 20 monthly release
  • 問題
    • 仕様や実装の問題を見つけるために,モジュールやアプリケーションを書いてほしい
    • development release -> few users
  • そこで
    • 2010 2Qにメジャーリリース
    • significant subset of perl6
  • what does rakudo do today
    • scalars, arrays, hashes
    • all of the basic operator
  • OO
    • significant cavoerage
    • class, role(composition, mixin), method, attr, introspec
  • multiple dispatch
    • primitive typeのみ?
  • junctions
if $dice_roll == 2|4|6 { say "even" }
  • parse
    • rakudo uses grammar engine to parse perl6
    • but far from standard grammar
  • the way to rakudo *
  • using std
    • use std grammar
    • parse performance improve
  • signature handling
    • arguments binding is slow and incomplete
    • correctness, performance, completeness
  • lazy
    • list is lazy in perl6
    • not in rakudo now
    • will be in rakudo *
  • module install
    • CPANのようなものはないが,ある程度のものはある
  • perl5 integration
    • basic support for perl5
    • 昨日動いた
$cgi = eval('use CGi; new CGI', :lang<perl5>); print $cgi.header; print $cgi.start_html
  • missing in rakudo *
  • might not be fast
    • focus has been and will remain completensess
    • 仕事ができればいい人は受け入れられるかも
  • concurrency
    • rakudo * will not support it
  • advanced data structure still todo
    • compact structure, user-defined array indexing, PDL
  • 山登りに例えると
    • 自分の足で上るのがrakudo compiler
      • 危険はある
      • 山の景色を楽しめる
    • rakudo ocmpiler
    • 空路で行くのがrakudo *
      • 楽だけども山をみることはできない
    • 電車で行くのは...
      • 忘れた

kamaitachi - perl flash media server - Daisuke Murase (typester)

  • with perl
    • code sharing with other perl app
    • much less bugs
  • Red5はデフォルトの初期設定のセキィリティが甘い
    • free red5 server listとか作ると面白いかも
  • kamaitachi supports
    • RTMP only (not RTMPE/RTMPT)
    • RPC (not shared object)
  • RPC
    • rpc like xmlrpc
    • use AMF
  • with aotoconnect
    • 接続を確立した後にconnectメソッドを呼ぶ必要があるのでそこを省略
  • demo
  • RTMP hacking tips
    • read source of other impl
    • analyze packet stream by Sniffer::RTMP
    • don't read adobe's rtmp spec (fuking license)
  • Sniffer::RTMP
  • future plan
    • support sharedobject
      • flashの人から使いたいと言われている
    • AnyEvent (currently using danga::socket)
    • support streaming static media file

perl hacks on vim - Lin You-An (c9s)

  • コードの修正に←→を使うと遅い
    • 1操作に4secかかり,1日に50回そういう操作をし,年300日働くと仮定すると,1年で16.6時間の無駄
  • vim is editor
  • いろいろなエディタの学習曲線
    • vimは急速に上昇する
    • emacsが渦巻いているんだが...
  • 4以上のモードがある
  • insert, normal visual, select
  • normal mode
    • hjklで移動
    • [で括弧
    • fで同じ文字の場所に
    • ^$で行頭/行末
    • HML ページのhigh/middle/low
    • % 次の括弧
    • :h motion.txt
  • insert mode
    • iIaAでinsert modeに
  • visual mode
    • v V Ctrl-Vでvisual modeに
  • syntax higilight
    • 500ぐらい
  • customize
    • perl syntaxは既にあるが,DSLっぽいモジュールはsyntaxが欲しい
      • Template::Declare
      • Markapl
      • Jifty::DBI::Schema
    • :help syntax.txt
  • keymapping
    • :nmap :!perl -Wc %
    • :nmap v>
      • >の代わりにタブでインデント
    • :h map.txt
  • text object
    • word,string,paragraph,block
    • テキストオブジェクトごとの操作が可能
  • fold
    • syntax fold
    • marker fold
    • indent fold
    • manual fold
    • expr fold
      • custom function
    • diff fold
    • :h folding
  • quickfix
  • helpful settings
  • インデント
    • perltidy
      • :set equalprg=perltitdyで=を押すとperltidyが実行される
    • SQL::Beautyを使ってSQLのインデント
  • source code traverse
    • モジュールを見つける
  • モジュールをCPANからインストールする
  • Pod Helper
    • podのテンプレートを追加
  • if vim compiled with perl
    • perlコードをvim scriptに書くことができる
  • plugin
  • pluginのインストール方法
  • 昔の方法
    • 公式サイトで探してダウンロードしてInstall details読んでインストール
    • めんどい
  • Vimana
    • CPANのようなもの
    • CPANからインストール可能
$ cpan Vimana
$ vimana search xml
$ vimana install xml.vim

小規模WebサイトのためのCGIフレームワーク「sabae」- Susumu Iwata (issm)

  • action mapping
  • model + di(仮)
    • datasource interface
    • yamlsql libraryファイルを作っていてSQLを取得する
  • action
    • get/postは別に書ける
    • before/after: 前処理/後処理
  • view
    • view名テンプレート
  • デモ
    • プロジェクト作成
    • yamlの修正
    • action作成 -> templateも作成される
    • templateの修正
  • future
    • modelのひな形
    • form validation
    • エラー処理
    • testing
    • 小規模向けの特徴を
    • 公開サービスとして再構築
    • 整理して公開

job queue manager Qudo - Atsushi Kobayashi (nekokak)

  • Qudo
    • 駆動
    • TheSchwartzのようなjob queue
  • motivation
    • 作ってみたかった
    • DBIx::Skinnyを使いたかった
    • githubの練習
    • TheSchwartzってtypoしやすい
  • job queue
    • 重い処理なのでユーザが待たされてしまうが,すぐに結果を返す必要のない処理をキューにためて実行する
    • 例えば登録制のサイトにおける登録完了メール
  • job queue実装
  • q4m
    • 奥さんによるプロダクトで実績がある
  • qamasu
    • Djangoの露木先生によるプロダクト
  • gearman
    • gearmandを動かす
    • on memoryに保存されるので再起動でジョブが削除される
  • Theschwarz
    • ジョブがDB上に保存されるのでreliable
  • 設計方針
  • 拡張しやすいこと
    • theschwarzはData::Object::Driverべったり
      • ORMに依存しない
    • hook pointを入れる
      • serializeもhookで
      • theschwarzはStorable only
      • messagemap
    • エラー処理
      • theschwarzは古いエラー情報は消える
    • 監視系
      • workerごとのジョブ数を見たりできるようにする
    • testable
      • Qudo::Testを先に作ってから実装した
    • hook/plugin
  • 使い方
    • worker作成
    • job manager起動クラスの作成
    • job enqueueコード
    • hook/plugin
  • デモ
    • メッセージを送ってgrowlに通知するデモ
  • 実績
    • 1件のみ
  • http://github.com/nekokak/qudo/tree/master
  • future
  • 条件に合うものだけキューからジョブを取ってくることは可能か
    • 現状はenqueue順にしか取れない
  • ジョブをキャンセルすることは可能?
    • dequeueメソッドで可能
  • 時刻指定して何時間後に行うとかは可能?
    • enqueueのパラメタで設定できる
  • 実働しているDriverは何?
  • パフォーマンスは?
    • job dbは一台のみなのでそこに限界はある
  • エラーになったジョブはいつ実行されるか?
    • q4mは最初にきてしまう
    • Qudoはエラーになったものはキューの最後になる

"Lego programming" with Lorzy - Chia-lian Kao (clkao)

  • そこで
  • Lorzy: Lazy Lispy Orz
  • use Moose; Moose typesystem
    • defining rule, actions
    • like gmail filter
  • (lambda (ticket transaction) ...) :: Bool
  • ルール
    • ticketとtransactionを引数にとり,真偽値を返す
(Str.Eq (RT::Model::Queue.name (RT::Model::Ticket.queue ticket)))
  • visual programmingっぽい
  • strongly typed
  • メニュー->ticket->queueのように選択することができる
  • 型推論を行い,必要な関数の候補を表示する
    • 例えば,ルールはBoolを返さないと行けないのだが,Stringを返す関数をとりあえず入力た場合,Stringを引数にしてBoolを返す関数であるStr.Eqが表示される.
  • backend: lcore
  • 2003 audrey jesse
    • language-mzscheme
  • 2008
    • lcore
  • 600 lines
  • todo
    • andのuiが欲しい
      • itunesのルールのような
    • MooseX::Types::Applicative
      • こんなのができるように
map
  isa => "CodRef[CodeRef[a,b],ArrayRef[a],ArrayRef[b]]";
    • load existing rules in ui
  • conclusoin
    • visual progaming enviroment
    • sandbox
  • demo
    • show s-exp
  • 質疑応答 (あんまり自信ない)
  • なぜS式?
    • 木構造のルールを扱うのがやりやすかったので
    • perl6はまだだし
  • RTの中に入る?
    • rt4?
    • 次の次のクリスマスぐらい?

Basic Mechanism of Object-Oriented Programming Language - makoto kuwata

  • basic mechanism of OOPL
  • part 1 basic
  • overview
  • method call
    • variable -> instance obj -> class obj -> method lookup table
    • class obj -> parent class obj
    • instance object is passed as hidden argument
  • instance objct
    • instance variables + is-a pointer
    • struct(c++,java) or hash(perl)
  • class object
    • class variables (+ is-a pointer) + parent piointer + method lookup table
  • method lookup table
    • method signagure + function pointer
  • methodとfunctionの違い
    • instance object is passed as hidden argument (method)
      • 通常は第一引数
    • method called dynamically, function statically
      • method lookup tableを辿るのは実行時である
  • part2 more
  • method signature
    • method name + arg type + (return type)
    • in java
      • void hello(int v, char ch) -> hello(IC)V
      • void hello(String s) -> hello(Ljava.lang.String;)V
  • method overload
    • メソッド名は同じだが引数が異なる
    • 引数の型が異なるのでsignatureで見分けることができる
  • method override
    • 子クラスが親クラスのメソッドを上書きする
    • same signature but child first
  • super
    • メソッドを検索するときに1度スキップする
  • polymorphism
    • どのメソッドが呼ばれるかはレシーバオブジェクトに依存するのであって変数の型に依存するのではない
    • どのメソッドが呼ばれるかは実際の型ではなく宣言時の型に依存する
  • オブジェクトオブジェクト(基底クラスのオブジェクオ)とクラスオブジェクトの関係は複雑である
  • part3 case study
  • ruby
struct RBasic {
  ...;
  VALUE klass; is-a pointer
}
struct RObject {
  ...;
  st_table *iv_tbl; instance variables
}
struct RClass {
  ...;
  struct st_table *m_tbl; method table
  VALUE super; parent pointer
}
  • perl
    • bless binds hash data with class name (is-a pointer)
    • is-a should be relation between instance and class but @ISA is not
  • python
    • first argument of instance method is self (instance object)
      • そのため,第一引数にオブジェクトを入れてfunctionとして呼ぶこともできる
  • java
    • copy parent method table to child method table
  • javascript
    • prototype-basedだがこれまで紹介してきた構造と似ている
    • functionはclassオブジェクトである
      • .__proto__で辿る
    • prototypeはmethod lookup table
      • .prototypeで辿る

Remedie: Building a desktop app using Perl, SQLite and jQuery - Tatsuhiko Miyagawa (miyagawa)

  • web appで作ればいいのでは
  • mobile
  • html5 = future
  • ???? = 2009
  • micro web app = 2009
  • remedie = local web server
  • デモ
    • キーバインド
      • jk 動画の次/前
      • hl チャネルの次/前
      • o : play
      • <--> :skip
    • twibから取得
    • ニコニコ動画のマイリストから取得
    • incremental search
    • drag and drop
    • チャネルの更新はnon-blocking
    • iphoneから操作可能
  • new in 0.6.x
    • performance
      • non-blocking, multi-tasking, libxml
    • commet messaging
      • チャネル取得中に作業ができる
  • how to make
  • problem 1 dirty code
    • Path::Router, Path::Dispatcher JSORB, etc
  • prob2 vulnerable CSRF
    • auth,special headers, switch to jsonrpc
      • special headersを利用している
  • bonjour
    • auto discovery
    • share subscription
  • workers comet messaging
  • SQLite
  • ウェブアプリだとmysql/posgreSQLはすばらしいが
  • デスクトップ向けの場合はSQLiteが良いのでは
    • Firefox,Mail.app,iCalが利用している
    • end-user won't to run server
    • bonus: easy backup, Dropbox sync
  • db schema
    • スケーラビリティは考えていない.デスクトップ向けなので
    • インデックスはほとんどなく,カラムにせずJSONで保存している部分がある
    • id,type,parent,ident,name,props
  • key-value
  • ORMは何でも
    • 現状はRose::DB::Object
    • メモリを食うのでやめたい
      • デスクトップではメモリの消費量も重要
  • see also: KiokuDB
  • jQuery
    • dom manipulation
    • $.ajax
  • jQuery.flydom
    • hash -> dom
    • escapeしてくれなかったので修正
  • jQuery.hotkeys
  • jQuery.contextMenu
    • 右クリック
  • jQuery.Corners
    • 新着何件の部分
  • event handling
    • $.event.trigger
    • $(document).bind
  • comet
    • 送られてきたコマンドをevalしているため,本当は危険であるが,デスクトップなので大丈夫だろうと.
  • UI
  • more like desktop
    • クライアント-サーバ型
    • アプリがWebクライアントである
  • site specific browser

記憶 - Yuval Kogman (nothingmuch)

  • KiokuDB
    • オブジェクトグラフを保存できる
  • tuples ⊂ objects
  • relations ⊂ collections
  • KiokuDB Internals
  • transparency holygrail
    • 推測が必要になる
    • pixie
    • tangram
  • moose
    • 推測をなくす
    • guessing is evil
  • 何が保存できるか
    • closure
    • type graph
    • tied
    • ほとんど全て
  • KiokuDB::Collapser
    • objects -> simple data entries
  • KiokuDB::Linker
    • entries -> objects
    • オブジェクト間のリンクを作成
  • KiokuDB::Backend
    • Drivers
    • Roles
    • Key Value Store
  • インデックスについて
    • PerlではSearch GINというプロジェクトを進めている
    • バックエンドでやるという方法もある
  • performance
    • unoptimized
    • but quite good
    • backend
    • ORMと変わらないぐらい
  • todo
    • more backends
    • persistence metaclass
    • real collections api
    • transaction aware
    • share with future dbic
    • class versioning
    • partitioning
    • sharding
    • high level cache
  • conclusion
    • respect object
    • transparent
    • no magic
    • native object storage
    • not vaporware
    • used in production
  • kiokudb::tutorial
  • backend
    • (couch,mango,dbi,directory::traversal,hash)
  • production backend
    • dbi backend
      • database backend
    • bdb backend (old)

Lightning Talks

Top Tens Of 2008/2009 - Kenichi Ishigaki
  • CPAH Author 選手権
    • 1位はhiroseさん
  • モジュールをupした数
    • 日本でトップ:tokuhirom
    • 世界でトップ:adamk
  • 国別cpan authorの数
    • 日本が1位
hacking ngnix - Kazuhiro Ozawa
Mojo/Mojolicious hookout - Kazuhiro Shibuya
  • id:ka2u
  • mojolicious
    • 1.0をリリースしようとしているところ
    • MojoX::Renderer::Text::MicroTemplate
    • Mojox::Session::Store::File
  • Mojo::Server::Reversehttp
    • mojo + webhook + ptth
  • デモ
    • はてブでスターをつけると通知する
  • B!hooks + Mojookout + Gtk2::Notify
Hoppyではじめよういあるタイムweb - Takeshi Miki
perl hacks on emacs - Daisuke Murase
  • perl hacks on vimとかやられたので急遽変更した
  • cperl-modeのメソッドのインデントがよくないので修正する
    • imakado++
  • perl-completion.el
    • メソッドや変数やモジュールのcompletionをする.
    • モジュールのpodやソースコードを読むことができる
  • anything.el
    • プロジェクト内のファイルの検索
args.pm - a brand new argument validator - Tokuhiro Matsuno
  • 引数の妥当性チェックを行いたい
  • Params::Validateがあるが書き方があまりよくない
  • MooseX::Declareは良いがtoo hacky
  • args.pm
    • Perlっぽく書けるし,わかりやすい
args my $self, my $name => {isa => 'Str'};
    • hackyでもないし
      • use PadWalker::var_name()でスタックを操作しているけど
CPAN realtime feed - Tatsuhiko Miyagawa
  • http://www.slideshare.net/miyagawa/cpan-realtime-feed
  • CPANにモジュールをアップしてからインストール可能になるまで時間がかかる
    • PAUSEへのアップロード: 5s
    • PAUSEでのインデクシング: 30s
    • ミラーがdiff sync: 20s
    • ミラーがインデクシング: 1h
    • rsync server: 1 ~ 24h
    • cpanクライアントのキャッシュに入る?: 24h
    • max 48h
  • すぐにインストール可能にしたい
  • demo
    • ちょっと前にアップロードされたstardustをインストール
    • App::CPAN::Freshもアップロードしてインストール
IRC HTTP Stream - Yusuke Wada
  • id:miyagawaさんの後なのでcoolに
  • IRCのメッセージを取得したい
    • port forwardingとか
    • これではだめだ
  • miyagawanizeされたのだから
  • それPla!
  • use Plack
  • AnyEvent::IRC::Client
  • do you know sore pla
    • I want to make WAF
    • ask miyagawa-san do you know how
    • Yes, Plack can
  • これがそれPla!(sorepla)
  • それPla脳の恐怖

Why I Stick With Perl (基調講演) - Jonathan Rockway (jrockway)

トークが速くてついていけなかった

  • なぜPerlを使うのか
    • syntaxが好きだから?
    • 速くコードを書けるから?
    • コミュニティ
  • 問題を解決するためにプログラミングする
  • どのように?
    • ライブラリを利用する
    • 経験
    • コミュニティ
  • ライブラリが重要
  • どうやってここまでたどり着いたのか歴史をたどっていく
  • UNIX
    • すべてのものと通信できる
    • 再利用しやすい
      • c compiler
      • paser generator
      • glue between processes (shell)
  • Perl
    • もっと使いやすくなった
    • 他の問題も出てきて,ライブラリが開発された
  • CPAN
    • perlの新しい部分
    • ライブラリの文化
  • 現在のPerl
    • 古いアイデアが新しいものに置き換えられている
  • OOP
  • constructorとaccessorを手書き
    • ないよりはまし
  • class::accessor (shudder!)
    • ましになった
  • use Moose
  • 新しいものに置き換えられるが古いものも動く
  • コミュニティはperlを改善し続けている
  • コミュニティで新しいことが起こっている
  • 今後のPerl
  • webについて考えてみる
  • CGI.pm
    • 手書きよりはまし
    • 結構便利
  • CGI::App
  • Catalyst
  • no more framework
  • コミュニティはすばらしい
    • 手伝ってくれる
    • バグを見つけてくれる
    • yapcでビールをおごってくれる
    • 私は楽しいことだけやって,コミュニティは私の代わりにつまらないことをやってくれる
  • なぜPerlを使うのか
    • コミュニティが私を助けてくれたから
    • because the community has done for me

Closing Ceremony - Daisuke Maki (lestrrat)