Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 –...
Transcript of Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 –...
![Page 1: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/1.jpg)
Advanced Perl Advanced Perl TechniquesTechniques
Day 2Day 2
Dave CrossMagnum Solutions Ltd
![Page 2: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/2.jpg)
UKUUG18th February 2011
2
What We Will Cover
Profiling and Benchmarking Object oriented programming with Moose MVC Frameworks
− Catalyst
PSGI and Plack
![Page 3: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/3.jpg)
UKUUG18th February 2011
3
Schedule
09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End
![Page 4: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/4.jpg)
UKUUG18th February 2011
4
Resources
Slides available on-line− http://mag-sol.com/train/public/2011-02/adv
Also see Slideshare− http://www.slideshare.net/davorg/slideshows
Get Satisfaction− http://getsatisfaction.com/magnum
![Page 5: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/5.jpg)
BenchmarkingBenchmarking& Profiling& Profiling
![Page 6: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/6.jpg)
UKUUG18th February 2011
6
Benchmarking
Ensure that your program is fast enough But how fast is fast enough? premature optimization is the root of all
evil− Donald Knuth
− paraphrasing Tony Hoare
Don't optimise until you know what to optimise
![Page 7: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/7.jpg)
UKUUG18th February 2011
7
Benchmark.pm Standard Perl module for benchmarking Simple usage use Benchmark;my %methods = ( method1 => sub { ... }, method2 => sub { ... },);timethese(10_000, \%methods);
Times 10,000 iterations of each method
![Page 8: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/8.jpg)
UKUUG18th February 2011
8
Benchmark.pm Output
Benchmark: timing 10000 iterations of method1, method2... method1: 6 wallclock secs \ ( 2.12 usr + 3.47 sys = 5.59 CPU) \ @ 1788.91/s (n=10000) method2: 3 wallclock secs \ ( 0.85 usr + 1.70 sys = 2.55 CPU) \ @ 3921.57/s (n=10000)
![Page 9: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/9.jpg)
UKUUG18th February 2011
9
Timed Benchmarks
Passing timethese a positive number runs each piece of code a certain number of times
Passing timethese a negative number runs each piece of code for a certain number of seconds
![Page 10: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/10.jpg)
UKUUG18th February 2011
10
Timed Benchmarks
use Benchmark;my %methods = ( method1 => sub { ... }, method2 => sub { ... },);
# Run for 10,000(!) secondstimethese(-10_000, \%methods);
![Page 11: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/11.jpg)
UKUUG18th February 2011
11
Comparing Performance
Use cmpthese to get a tabular output Optional export use Benchmark 'cmpthese';my %methods = ( method1 => sub { ... }, method2 => sub { ... },);cmpthese(10_000, \%methods);
![Page 12: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/12.jpg)
UKUUG18th February 2011
12
cmpthese Output
Rate method1 method2method1 2831802/s -- -61%method2 7208959/s 155% --
method2 is 61% slower than method1 Can also pass negative number to cmpthese
![Page 13: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/13.jpg)
UKUUG18th February 2011
13
Benchmarking is Hard
Very easy to produce lots of numbers Harder to ensure that the numbers are
meaningful Compare code fragments that do the same
thing
![Page 14: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/14.jpg)
UKUUG18th February 2011
14
Bad Benchmarking
use Benchmark qw{ timethese };timethese( 1_000, { Ordinary => sub { my @results = sort { -M $a <=> -M $b } glob "/bin/*";}, Schwartzian => sub { map $_->[0], sort { $a->[1] <=> $b->[1] } map [$_, -M], glob "/bin/*"; },});
![Page 15: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/15.jpg)
UKUUG18th February 2011
15
What to Benchmark
Profile your code See which parts it is worth working on Look for code that
− Takes a long time to run, or
− Is called many times, or
− Both
![Page 16: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/16.jpg)
UKUUG18th February 2011
16
Devel::DProf
Devel::DProf is the standard Perl profiling tool
Included with Perl distribution Uses Perl debugger hooks perl -d:DProf your_program Produces a data file called tmon.out Command line program dprofpp to view
results
![Page 17: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/17.jpg)
UKUUG18th February 2011
17
Sample Output $ perl -d:DProf ./invoice.pl 244
$ dprofpp Total Elapsed Time = 1.173152 Seconds User+System Time = 0.963152 SecondsExclusive Times%Time ExclSec CumulS #Calls sec/call Csec/c Name 6.02 0.058 0.067 482 0.0001 0.0001 Params::Validate::_validate 5.09 0.049 0.114 7 0.0070 0.0163 Class::DBI::Loader::mysql::BEGIN 4.15 0.040 0.050 10 0.0040 0.0050 Template::Parser::BEGIN 4.15 0.040 0.166 7 0.0057 0.0237 DateTime::Locale::BEGIN 4.05 0.039 0.094 43 0.0009 0.0022 base::import 3.74 0.036 0.094 449 0.0001 0.0002 DateTime::Locale::_register 3.11 0.030 0.280 4 0.0074 0.0700 DateTime::Format::MySQL::BEGIN 2.91 0.028 0.028 170 0.0002 0.0002 Lingua::EN::Inflect::_PL_noun 2.70 0.026 0.040 1 0.0262 0.0401 Template::Parser::_parse 2.49 0.024 0.024 1113 0.0000 0.0000 Class::Data::Inheritable::__ANON__ 2.08 0.020 0.020 12 0.0017 0.0017 DBD::mysql::db::_login 2.08 0.020 0.020 4 0.0050 0.0050 Template::Stash::BEGIN 2.08 0.020 0.099 9 0.0022 0.0110 Template::Config::load 2.08 0.020 0.067 9 0.0022 0.0074 Template::BEGIN 2.08 0.020 0.039 4 0.0049 0.0097 Lingua::EN::Inflect::Number::BEGIN
![Page 18: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/18.jpg)
UKUUG18th February 2011
18
Devel::NYTProf
New profiling module Based on work from the New York Times Enhanced by Tim Bunce Pretty HTML output
− “borrowed” from Devel::Cover
Far more flexible Far more powerful
![Page 19: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/19.jpg)
UKUUG18th February 2011
19
Using NYTProf
Similar to Devel::DProf $ perl -d:NYTProf ./invoice.pl 244
Writes nytprof.out $ nytprofhtml
Or $ nytprofcsv
![Page 20: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/20.jpg)
UKUUG18th February 2011
20
Conclusions
Don't optimise until you know you need to optimise
Don't optimise until you know what to optimise
Use profiling to find out what is worth optimising
Use benchmarking to compare different solutions
![Page 21: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/21.jpg)
UKUUG18th February 2011
21
More Information
perldoc Benchmark perldoc Devel::DProf perldoc Devel::NYTProf Chapters 5 and 6 of Mastering Perl
![Page 22: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/22.jpg)
UKUUG18th February 2011
22
Benchmarking Examples
Profile the code that you have been given Where do we need to make improvements Suggest some alternative implementations Benchmark your suggestions
![Page 23: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/23.jpg)
MooseMoose
![Page 24: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/24.jpg)
UKUUG18th February 2011
24
Moose A complete modern object system for Perl 5 Based on experiments with Perl 6 object
model Built on top of Class::MOP
− MOP - Meta Object Protocol
− Set of abstractions for components of an object system
− Classes, Objects, Methods, Attributes
An example might help
![Page 25: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/25.jpg)
UKUUG18th February 2011
25
Moose Example package Point;use Moose;
has 'x' => (isa => 'Int', is => 'ro');has 'y' => (isa => 'Int', is => 'rw');
sub clear { my $self = shift; $self->{x} = 0; $self->y(0);}
![Page 26: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/26.jpg)
UKUUG18th February 2011
26
Understanding Moose
There's a lot going on here use Moose
− Loads Moose environment
− Makes our class a subclass of Moose::Object
− Turns on strict and warnings
![Page 27: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/27.jpg)
UKUUG18th February 2011
27
Creating Attributes
has 'x' => (isa => 'Int', is => 'ro')
− Creates an attribute called 'x'
− Constrainted to be an integer
− Read-only accessor
has 'y' => (isa => 'Int', is => 'rw')
![Page 28: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/28.jpg)
UKUUG18th February 2011
28
Defining Methods sub clear { my $self = shift; $self->{x} = 0; $self->y(0);}
Standard method syntax Uses generated method to set y Direct hash access for x
![Page 29: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/29.jpg)
UKUUG18th February 2011
29
Subclassing package Point3D;use Moose;
extends 'Point';
has 'z' => (isa => 'Int');
after 'clear' => sub { my $self = shift; $self->{z} = 0;};
![Page 30: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/30.jpg)
UKUUG18th February 2011
30
Subclasses
extends 'Point'
− Similar to use base− Overwrites @ISA instead of appending
has 'z' => (isa = 'Int')
− Adds new attribute 'z'− No accessor function - private attribute
![Page 31: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/31.jpg)
UKUUG18th February 2011
31
Extending Methods
after 'clear' => sub { my $self = shift; $self->{z} = 0;};
New clear method for subclass Called after method for superclass Cleaner than $self->SUPER::clear()
![Page 32: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/32.jpg)
UKUUG18th February 2011
32
Creating Objects
Moose classes are used just like any other Perl class
$point = Point->new(x => 1, y => 2);
$p3d = Point3D->new(x => 1, y => 2, z => 3);
![Page 33: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/33.jpg)
UKUUG18th February 2011
33
More About Attributes
Use the has keyword to define your class's attributes
has 'first_name' => ( is => 'rw' );
Use is to define rw or ro
Omitting is gives an attribute with no accessors
![Page 34: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/34.jpg)
UKUUG18th February 2011
34
Getting & Setting
By default each attribute creates a method of the same name.
Used for both getting and setting the attribute
$dave->first_name('Dave');
say $dave->first_name;
![Page 35: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/35.jpg)
UKUUG18th February 2011
35
Change Accessor Name
Change accessor names using reader and writer
has 'name' => ( is => 'rw', reader => 'get_name', writer => 'set_name',);
See also MooseX::FollowPBP
![Page 36: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/36.jpg)
UKUUG18th February 2011
36
Required Attributes By default Moose class attributes are
optional Change this with required has 'name' => ( is => 'ro', required => 1,);
Forces constructor to expect a name Although that name could be undef
![Page 37: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/37.jpg)
UKUUG18th February 2011
37
Attribute Defaults Set a default value for an attribute with
default has 'size' => ( is => 'rw', default => 'medium',);
Can use a subroutine reference has 'size' => ( is => 'rw', default => \&rand_size,);
![Page 38: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/38.jpg)
UKUUG18th February 2011
38
More Attribute Properties lazy
− Only populate attribute when queried trigger
− Subroutine called after the attribute is set isa
− Set the type of an attribute
Many more
![Page 39: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/39.jpg)
UKUUG18th February 2011
39
More Moose
Many more options Support for concepts like delegation and
roles Powerful plugin support
− MooseX::* Lots of work going on in this area
![Page 40: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/40.jpg)
UKUUG18th February 2011
40
Moose Examples
Write a Moose class that models a person Write code which uses that class Try out various attribute properties
![Page 41: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/41.jpg)
CatalystCatalyst
![Page 42: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/42.jpg)
UKUUG18th February 2011
42
MVC Frameworks
MVC frameworks are a popular way to write applications
− Particularly web applications
![Page 43: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/43.jpg)
UKUUG18th February 2011
43
M, V and C Model
− Data storage & data access
View− Data presentation layer
Controller− Business logic to glue it all together
![Page 44: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/44.jpg)
UKUUG18th February 2011
44
MVC Examples
Ruby on Rails Django (Python) Struts (Java) CakePHP Many examples in most languages Perl has many options
![Page 45: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/45.jpg)
UKUUG18th February 2011
45
MVC in Perl Maypole
− The original Perl MVC framework
CGI::Application− Simple MVC for CGI programming
Jifty− Developed and used by Best Practical
Catalyst− Currently the popular choice
![Page 46: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/46.jpg)
UKUUG18th February 2011
46
Newer MVC in Perl Dancer Squatting Mojolicious
![Page 47: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/47.jpg)
UKUUG18th February 2011
47
Catalyst
MVC framework in Perl Building on other heavily-used tools Model uses DBIx::Class View uses Template Toolkit These are just defaults Can use anything you want
![Page 48: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/48.jpg)
UKUUG18th February 2011
48
Simple Catalyst App
Assume we already have model− CD database from DBIx::Class section
Use catalyst.pl to create project $ catalyst.pl CDcreated "CD"created "CD/script"created "CD/lib"created "CD/root"... many more ...
![Page 49: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/49.jpg)
UKUUG18th February 2011
49
What Just Happened? Catalyst just generated a lot of useful stuff
for us Test web servers
− Standalone and FastCGI
Configuration files Test stubs Helpers for creating models, views and
controllers
![Page 50: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/50.jpg)
UKUUG18th February 2011
50
A Working Application
We already have a working application $ CD/script/cd_server.pl
... lots of output
[info] CD powered by Catalyst 5.7015You can connect to your server at http://localhost:3000
Of course, it doesn't do much yet
![Page 51: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/51.jpg)
UKUUG18th February 2011
51
Simple Catalyst App
![Page 52: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/52.jpg)
UKUUG18th February 2011
52
Next Steps Use various helper programs to create
models and views for your application Write controller code to tie it all together Many plugins to handle various parts of the
process− Authentication
− URL resolution
− Session handling
− etc...
![Page 53: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/53.jpg)
UKUUG18th February 2011
53
Create a View $ script/cd_create.pl view Default TT
exists "/home/dave/training/cdlib/CD/script/../lib/CD/View" exists "/home/dave/training/cdlib/CD/script/../t"created "/home/dave/training/cdlib/CD/script/../lib/CD/View/Default.pm"created "/home/dave/training/cdlib/CD/script/../t/view_Default.t"
![Page 54: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/54.jpg)
UKUUG18th February 2011
54
Remove Default Message In lib/CD/Controller/Root.pm sub index :Path :Args(0) { my ( $self, $c ) = @_;
# Hello World $c->response_body($c->welcome_message);}
Remove response_body line Default behaviour is to render index.tt Need to create that
![Page 55: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/55.jpg)
UKUUG18th February 2011
55
index.tt root/index.tt <html> <head> <title>CDs</title> </head> <body> <ul>[% FOREACH cd IN [ 1 .. 10 ] %] <li>CD [% cd %]</li>[% END %] </ul> </body></html>
![Page 56: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/56.jpg)
UKUUG18th February 2011
56
New Front Page
![Page 57: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/57.jpg)
UKUUG18th February 2011
57
Adding Data
Of course that's hard-coded data Need to add a model class And then more views And some controllers There's a lot to do I recommend working through a tutorial
![Page 58: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/58.jpg)
UKUUG18th February 2011
58
Easier Catalyst
A lot of web applications do similar things Given a database Produce screens to edit the data Surely most of this can be automated It's called Catalyst::Plugin::AutoCRUD (Demo)
![Page 59: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/59.jpg)
UKUUG18th February 2011
59
Cat::Plugin::AutoCRUD
Does a lot of work On the fly For every request No security on table updates So it's not right for every project Very impressive though
![Page 60: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/60.jpg)
UKUUG18th February 2011
60
Conclusions There's a lot to bear in mind when writing a
web app Using the right framework can help Catalyst is the most popular Perl framework As powerful as any other framework
− In any language
Lots of work still going on Large team, active development
![Page 61: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/61.jpg)
UKUUG18th February 2011
61
Recommended Book The Definitive
Guide to Catalyst− Kieren Diment
− Matt S Trout
![Page 62: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/62.jpg)
UKUUG18th February 2011
62
Catalyst Examples
Set up a basic Catalyst project based on the CD database from yesterday
We will then work together to add some simple controllers and views to the application
Add Catalyst::Plugin::AutoCRUD to your application
![Page 63: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/63.jpg)
PSGI/PlackPSGI/Plack
![Page 64: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/64.jpg)
UKUUG18th February 2011
64
PSGI/Plack
“PSGI is an interface between Perl web applications and web servers, and Plack is a Perl module and toolkit that contains PSGI middleware, helpers and adapters to web servers.”
− http://plackperl.org/
![Page 65: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/65.jpg)
UKUUG18th February 2011
65
PSGI/Plack
PSGI is a specification (based on Python's WSGI)
Plack is a reference implementation (based on Ruby's Rack)
![Page 66: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/66.jpg)
UKUUG18th February 2011
66
The Problem There are many ways to write web
applications There are many ways to write web
applications in Perl Each is subtly different Hard to move an application between server
architectures
![Page 67: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/67.jpg)
UKUUG18th February 2011
67
Server Architectures
CGI FastCGI mod_perl etc...
![Page 68: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/68.jpg)
UKUUG18th February 2011
68
Frameworks
There are many Perl web application frameworks
Each creates applications in subtly different ways
Hard to port applications between them
![Page 69: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/69.jpg)
UKUUG18th February 2011
69
The Goal
What if we had a specification that allowed us to easily move web applications between server architectures and frameworks
PSGI is that specification
![Page 70: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/70.jpg)
UKUUG18th February 2011
70
PSGI Application my $app = sub { my $env = shift;
return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 71: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/71.jpg)
UKUUG18th February 2011
71
PSGI Application
A code reference Passed a reference to an environment hash Returns a reference to a three-element array
− Status code
− Headers
− Body
![Page 72: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/72.jpg)
UKUUG18th February 2011
72
A Code Reference my $app = sub { my $env = shift;
return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 73: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/73.jpg)
UKUUG18th February 2011
73
A Code Reference my $app = sub { my $env = shift;
return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 74: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/74.jpg)
UKUUG18th February 2011
74
Environment Hash my $app = sub { my $env = shift;
return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 75: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/75.jpg)
UKUUG18th February 2011
75
Environment Hash my $app = sub { my $env = shift;
return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 76: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/76.jpg)
UKUUG18th February 2011
76
Return Array Ref my $app = sub { my $env = shift;
return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 77: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/77.jpg)
UKUUG18th February 2011
77
Return Array Ref my $app = sub { my $env = shift;
return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 78: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/78.jpg)
UKUUG18th February 2011
78
Running PSGI App
Put code in app.psgi Drop in into a configured PSGI-aware web
server Browse to URL
![Page 79: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/79.jpg)
UKUUG18th February 2011
79
PSGI-Aware Server
Plack contains a simple test server called plackup
$ plackup app.psgiHTTP::Server::PSGI: Accepting connections at http://localhost:5000/
![Page 80: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/80.jpg)
UKUUG18th February 2011
80
Plack::Request Plack::Request turns the environment into a
request object use Plack::Request;
use Data::Dumper;
my $app = sub {
my $req = Plack::Request->new(shift); return [ 200, [ 'Content-type', 'text/plain' ], [ Dumper $req ], ];}
![Page 81: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/81.jpg)
UKUUG18th February 2011
81
Plack::Response Plack::Response builds a PSGI response
object use Plack::Request;
use Plack::Response;use Data::Dumper;
my $app = sub { my $req = Plack::Request->new(shift); my $res = Plack::Response->new(200); $res->content_type('text/plain'); $res->body(Dumper $req); return $res->finalize;}
![Page 82: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/82.jpg)
UKUUG18th February 2011
82
Middleware
Middleware wraps around an application Returns another PSGI application Simple spec makes this easy Plack::Middleware::* Plack::Builder adds middleware
configuration language
![Page 83: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/83.jpg)
UKUUG18th February 2011
83
Middleware Example use Plack::Builder;
use Plack::Middleware::Runtime;
my $app = sub { my $env = shift;
return [ 200, [ 'Content-type', 'text/plain' ], [ 'Hello world' ], ]};
builder { enable 'Runtime'; $app;}
![Page 84: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/84.jpg)
UKUUG18th February 2011
84
Middleware Example $ HEAD http://localhost:5000200 OKDate: Tue, 20 Jul 2010 20:25:52 GMTServer: HTTP::Server::PSGIContent-Length: 11Content-Type: text/plainClient-Date: Tue, 20 Jul 2010 20:25:52 GMTClient-Peer: 127.0.0.1:5000Client-Response-Num: 1X-Runtime: 0.000050
![Page 85: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/85.jpg)
UKUUG18th February 2011
85
Middleware Example $ HEAD http://localhost:5000200 OKDate: Tue, 20 Jul 2010 20:25:52 GMTServer: HTTP::Server::PSGIContent-Length: 11Content-Type: text/plainClient-Date: Tue, 20 Jul 2010 20:25:52 GMTClient-Peer: 127.0.0.1:5000Client-Response-Num: 1X-Runtime: 0.000050
![Page 86: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/86.jpg)
UKUUG18th February 2011
86
Plack::App::* Ready-made solutions for common
situations Plack::App::CGIBin
− Cgi-bin replacement
Plack::App::Directory− Serve files with directory index
Plack::App::URLMap− Map apps to different paths
![Page 87: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/87.jpg)
UKUUG18th February 2011
87
Plack::App::*
Many more bundled with Plack Configured using Plack::Builder
![Page 88: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/88.jpg)
UKUUG18th February 2011
88
Plack::App::CGIBin use Plack::App::CGIBin;use Plack::Builder;
my $app = Plack::App::CGIBin->new( root => '/var/www/cgi-bin')->to_app;
builder { mount '/cgi-bin' => $app;};
![Page 89: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/89.jpg)
UKUUG18th February 2011
89
Plack::App::Directory use Plack::App::Directory;
my $app = Plack::App::Directory->new( root => '/home/dave/Dropbox/psgi')->to_app;
![Page 90: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/90.jpg)
UKUUG18th February 2011
90
Framework Support
Many modern Perl applications already support PSGI
Catalyst, CGI::Application, Dancer, Jifty, Mason, Maypole, Mojolicious, Squatting, Web::Simple
Many more
![Page 91: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/91.jpg)
UKUUG18th February 2011
91
Catalyst Support
Catalyst::Engine::PSGI use MyApp;
MyApp->setup_engine('PSGI');my $app = sub { MyApp->run(@_) };
Also Catalyst::Helper::PSGI script/myapp_create.pl PSGI
![Page 92: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/92.jpg)
UKUUG18th February 2011
92
PSGI Server Support
Many new web servers support PSGI Starman, Starlet, Twiggy, Corona,
HTTP::Server::Simple::PSGI Perlbal::Plugin::PSGI
![Page 93: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/93.jpg)
UKUUG18th February 2011
93
PSGI Server Support
nginx support mod_psgi Plack::Handler::Apache2
![Page 94: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/94.jpg)
UKUUG18th February 2011
94
Plack::Handler::Apache2 <Location /psgi>
SetHandler perl-script PerlResponseHandler Plack::Handler::Apache2 PerlSetVar psgi_app /path/to/app.psgi</Location>
![Page 95: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/95.jpg)
UKUUG18th February 2011
95
PSGI/Plack Summary
PSGI is a specification Plack is an implementation PSGI makes your life easier Most of the frameworks and server you use
already support PSGI No excuse not to use it
![Page 96: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/96.jpg)
UKUUG18th February 2011
96
Further Information
perldoc PSGI perldoc Plack http://plackperl.org/ http://blog.plackperl.org/ http://github.com/miyagawa/Plack #plack on irc.perl.org
![Page 97: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/97.jpg)
UKUUG18th February 2011
97
PSGI/Plack Examples
Try out some of the simple PSGI examples from the previous slides
Use plackup to run the applications
![Page 98: Advanced Perl Techniques Day 2 · UKUUG 18th February 2011 3 Schedule 09:45 – Begin 11:15 – Coffee break 13:00 – Lunch 14:00 – Begin 15:30 – Coffee break 17:00 – End](https://reader033.fdocuments.us/reader033/viewer/2022050608/5faf76fa63121025f54d971a/html5/thumbnails/98.jpg)
That's all folksThat's all folks
• Any questions?