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
- 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 *
- 楽だけども山をみることはできない
- 電車で行くのは...
- 忘れた
- 自分の足で上るのがrakudo compiler
kamaitachi - perl flash media server - Daisuke Murase (typester)
- kamaitachi
- Flash Media Server (FMS)
- web service using FMS
- kayacで作ったもの
- shiritori-ring
- koebu.com
- online audio recorder
- FMS impl
- 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
- Sniffer::RTMP
- future plan
- support sharedobject
- flashの人から使いたいと言われている
- AnyEvent (currently using danga::socket)
- support streaming static media file
- support sharedobject
perl hacks on vim - Lin You-An (c9s)
- 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
- text object
- word,string,paragraph,block
- テキストオブジェクトごとの操作が可能
- fold
- syntax fold
- marker fold
- indent fold
- manual fold
- expr fold
- custom function
- diff fold
- :h folding
- helpful settings
- インデント
- source code traverse
- モジュールを見つける
- モジュールをCPANからインストールする
- Pod Helper
- podのテンプレートを追加
- if vim compiled with perl
- plugin
- pluginのインストール方法
- 昔の方法
- 公式サイトで探してダウンロードしてInstall details読んでインストール
- めんどい
- Vimana
$ cpan Vimana
$ vimana search xml $ vimana install xml.vim
-
- future plan
- upgrade
- remove
- config
- support makefile
- http://github.com/c9s/Vimana/tree/master
- future plan
小規模WebサイトのためのCGIフレームワーク「sabae」- Susumu Iwata (issm)
- http://www.slideshare.net/issm/20090911-yapcasia-2009
- ドラクエ風のプレゼン
- 自己紹介
- issm
- LLPメガネラボ
- 小規模なWebサイトの構築
- nicograph.jp
- dqwm.net
- このプレゼンで利用しているもの
- perl, javascript使い
- cgiを主に使っている
- but not kentist
- action mapping
- model + di(仮)
- action
- get/postは別に書ける
- before/after: 前処理/後処理
- view
- view名テンプレート
- デモ
- プロジェクト作成
- yamlの修正
- action作成 -> templateも作成される
- templateの修正
- future
- modelのひな形
- form validation
- エラー処理
- testing
- 小規模向けの特徴を
- 公開サービスとして再構築
- 整理して公開
- dqwn.netについて
- javascriptのbookmarklet
- sabaeとは無関係
- 呪文は任意のjavascriptを実行できないと
job queue manager Qudo - Atsushi Kobayashi (nekokak)
- http://d.hatena.ne.jp/nekokak/20090911/1252655814
- http://nekokak.org/presen/yapcasia2009-qudo/
- id: nokokak
- 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
- theschwarzはData::Object::Driverべったり
- 使い方
- worker作成
- job manager起動クラスの作成
- job enqueueコード
- hook/plugin
- デモ
- メッセージを送ってgrowlに通知するデモ
- 実績
- 1件のみ
- http://github.com/nekokak/qudo/tree/master
- future
- document
- cpan up
- 条件に合うものだけキューからジョブを取ってくることは可能か
- 現状はenqueue順にしか取れない
- ジョブをキャンセルすることは可能?
- dequeueメソッドで可能
- 時刻指定して何時間後に行うとかは可能?
- enqueueのパラメタで設定できる
- 実働しているDriverは何?
- パフォーマンスは?
- job dbは一台のみなのでそこに限界はある
- エラーになったジョブはいつ実行されるか?
- q4mは最初にきてしまう
- Qudoはエラーになったものはキューの最後になる
"Lego programming" with Lorzy - Chia-lian Kao (clkao)
- http://www.slideshare.net/clkao/lego-programming-with-lorzy
- goto spa or die
- clkao
- Best Practical
- RT作っている
- inline::x86はよかった
- just in time slides
- just in time software
- RTのPerlプラグイン
- 一般人はPerlなんて書けない
- そこで
- Lorzy: Lazy Lispy Orz
- scheme like interpreter in perl
- typeful
- 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
- こんなのができるように
- andのuiが欲しい
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
- 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を辿るのは実行時である
- instance object is passed as hidden argument (method)
- 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として呼ぶこともできる
- first argument of instance method is self (instance object)
- 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
- palm pre
- PhoneGap
- html/javascriptで書いてmobileで実行できる?
- html5 = future
- ???? = 2009
- micro web app = 2009
- remedie = local web server
- デモ
- new in 0.6.x
- performance
- non-blocking, multi-tasking, libxml
- commet messaging
- チャネル取得中に作業ができる
- performance
- how to make
- Http::engine
- desktop appなのでstatic fileを提供しなければならない
- plack::middleware::static
- ajax api (JSON-REST)
- rpc以下はAPIとして利用
- problem 1 dirty code
- Path::Router, Path::Dispatcher JSORB, etc
- prob2 vulnerable CSRF
- auth,special headers, switch to jsonrpc
- special headersを利用している
- auth,special headers, switch to jsonrpc
- bonjour
- auto discovery
- share subscription
- workers comet messaging
- 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
- server as app
- local::lib
- build & install all deps
- platypus
- macの.appにパッケージングする
- see also: perl-app-builder
記憶 - Yuval Kogman (nothingmuch)
- KiokuDB
- オブジェクトグラフを保存できる
- tuples ⊂ objects
- relations ⊂ collections
- 何が保存できるか
- closure
- type graph
- tied
- ほとんど全て
- KiokuDB::TypeMap
- objects <-> entryのマッピング
- KiokuDB::Collapser
- objects -> simple data entries
- KiokuDB::Linker
- entries -> objects
- オブジェクト間のリンクを作成
- KiokuDB::Backend
- Drivers
- Roles
- Key Value Store
- インデックスについて
- PerlではSearch GINというプロジェクトを進めている
- バックエンドでやるという方法もある
- コマンドライン
- KiokuDB::Cmd
- performance
- unoptimized
- but quite good
- backend
- ORMと変わらないぐらい
- todo
- more backends
- postgreSQL
- XML
- Cassandra
- Tokyo Tyrant
- RDF
- neo4j
- persistence metaclass
- real collections api
- transaction aware
- share with future dbic
- class versioning
- partitioning
- sharding
- high level cache
- more backends
- conclusion
- respect object
- transparent
- no magic
- native object storage
- not vaporware
- used in production
- kiokudb::tutorial
Lightning Talks
Top Tens Of 2008/2009 - Kenichi Ishigaki
- CPAH Author 選手権
- 1位はhiroseさん
- モジュールをupした数
- 日本でトップ:tokuhirom
- 世界でトップ:adamk
- 国別cpan authorの数
- 日本が1位
hacking ngnix - Kazuhiro Ozawa
- http://yappo.ficia.com/#album/9509705E-9EAA-11DE-ADEA-3624873069EA
- ネタ
- メタル小僧
- ZIGOROuさんのコスプレ
- nginx module
- pluggableに書かれてある
- event loop
- protocol
- pluggableに書かれてある
- httpdの中でmemcached.listenを指定する
- Plack::Impl::Nginx
Mojo/Mojolicious hookout - Kazuhiro Shibuya
Hoppyではじめよういあるタイムweb - Takeshi Miki
- http://www.slideshare.net/tmiki1009/hoppyweb
- id:download_takeshi
- HTML::Feature, lingua::JA::TFIDF, Lingua::JA::Categorize
- gooの中の人
- realtime web
- comet
- google wave, xmpp
- pubsubhubbub
- reversehttp
- html5のweb-socket?
- 実装されていないブラウザがある
- Flash XMLSocketでいいのでは
- 全二重tcp/ip
- 普及率も9?%
- Hoppy
- service - Hoppy - hookという構成
- クライアントはHoppyと接続を確立
- 通常の処理はServiceでrpc形式で
- Hookがpushを行う
- 時間切れ
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()でスタックを操作しているけど
- hackyでもないし
CPAN realtime feed - Tatsuhiko Miyagawa
- http://www.slideshare.net/miyagawa/cpan-realtime-feed
- CPANにモジュールをアップしてからインストール可能になるまで時間がかかる
- すぐにインストール可能にしたい
- http://friendfeed.com/cpan
- App::CPAN::Fresh
- cpanf
- demo
- ちょっと前にアップロードされたstardustをインストール
- App::CPAN::Freshもアップロードしてインストール
Why I Stick With Perl (基調講演) - Jonathan Rockway (jrockway)
トークが速くてついていけなかった
- なぜPerlを使うのか
- syntaxが好きだから?
- 速くコードを書けるから?
- コミュニティ
- 問題を解決するためにプログラミングする
- どのように?
- ライブラリを利用する
- 経験
- コミュニティ
- ライブラリが重要
- どうやってここまでたどり着いたのか歴史をたどっていく
- UNIX
- すべてのものと通信できる
- 再利用しやすい
- c compiler
- paser generator
- glue between processes (shell)
- 現在のPerl
- 古いアイデアが新しいものに置き換えられている
- OOP
- constructorとaccessorを手書き
- ないよりはまし
- class::accessor (shudder!)
- ましになった
- use Moose
- 新しいものに置き換えられるが古いものも動く
- コミュニティはperlを改善し続けている
- コミュニティで新しいことが起こっている
- 今後のPerl
- webについて考えてみる
- CGI.pm
- 手書きよりはまし
- 結構便利
- CGI::App
- Catalyst
- no more framework
- HTTP::Engine
- 何を使うかはユーザに選ばせる
Closing Ceremony - Daisuke Maki (lestrrat)
- gappoiによる動画鑑賞
- 3つのC
- Perlは企業にも使われている
- 以下でアンケートをやっている