SlideShare a Scribd company logo
1 of 81
Download to read offline
http://xkcd.com/224/
Perl
 Code Proļ¬ling
Memory Proļ¬ling
    Perl 5
    Perl 6

 Tim Bunce - SkyConā€™12
Devel::NYTProf
Perl Source Code Proļ¬ler


    Tim Bunce - SkyConā€™12
Devel::DProf Is Broken
$ perl -we 'print "sub s$_ { sqrt(42) for 1..100 };
 s$_({});n" for 1..1000' > x.pl

$ perl -d:DProf x.pl

$ dprofpp -r
  Total Elapsed Time =    0.108 Seconds
           Real Time =    0.108 Seconds
  Exclusive Times
  %Time ExclSec CumulS #Calls sec/call Csec/c   Name
   9.26   0.010 0.010       1   0.0100 0.0100   main::s76
   9.26   0.010 0.010       1   0.0100 0.0100   main::s323
   9.26   0.010 0.010       1   0.0100 0.0100   main::s626
   9.26   0.010 0.010       1   0.0100 0.0100   main::s936
   0.00       - -0.000      1        -      -   main::s77
   0.00       - -0.000      1        -      -   main::s82
Proļ¬ling 101
  The Basics
What To Measure?

              CPU Time   Real Time


Subroutines
                 ?          ?
Statements
                 ?          ?
Devel::NYTProf
   Does it all
Running NYTProf
   perl -d:NYTProf ...
   perl -MDevel::NYTProf ...


Conļ¬gure proļ¬ler via the NYTPROF env var
   perldoc Devel::NYTProf for the details


To proļ¬le code thatā€™s invoked elsewhere:
   PERL5OPT=-d:NYTProf
   NYTPROF=file=/tmp/nytprof.out:addpid=1:...
Reporting: KCachegrind
ā€¢ KCachegrind call graph - new and cool
   - contributed by C. L. Kao.
   - requires KCachegrind

  $ nytprofcg   # generates nytprof.callgraph
  $ kcachegrind # load the file via the gui
KCachegrind
Reporting: HTML
ā€¢ HTML report
   -   page per source ļ¬le, annotated with times and links
   -   subroutine index table with sortable columns
   -   interactive Treemap of subroutine times
   -   generates Graphviz dot ļ¬le of call graph
   -   -m (--minimal) faster generation but less detailed

$ nytprofhtml # writes HTML report in ./nytprof/...
$ nytprofhtml --file=/tmp/nytprof.out.793 --open
Summary




                             Links to annotated
                                source code




Link to sortable table
      of all subs
                          Timings for perl builtins
Color coding based on        Overall time spent in and below this sub
Median Average Deviation
relative to rest of this ļ¬le               (in + below)




Time between starting this perl
statement and starting the next.
So includes overhead of calls to
           perl subs.               Timings for each location calling into,
                                          or out of, the subroutine
Treemap showing relative
                 proportions of exclusive time




                                  Boxes represent subroutines
                                   Colors only used to show
                                packages (and arenā€™t pretty yet)




Hover over box to see details
                                          Click to drill-down one level
                                              in package hierarchy
Calls between packages
Calls to/from/within package
Questions?
                                   For more details see
Slides: http://www.slideshare.net/Tim.Bunce/develnytprof-v4-at-yapceu-201008-4906467
         Screencast: http://blip.tv/timbunce/devel-nytprof-yapc-asia-2012-6376582
Perl Memory Use
   Tim Bunce @ SkyConā€™12
Ouch!
$ perl some_script.pl
Out of memory!
$

$ perl some_script.pl
Killed.
$

$ perl some_script.pl
$
Someone shouts: "Hey! My process has been killed!"

$ perl some_script.pl
[...later...] "Umm, what's taking so long?"
Process Memory
$ perl -e 'system("cat /proc/$$/stat")'   # $$ = pid
4752 (perl) S 4686 4752 4686 34816 4752 4202496 536 0 0 0 0 0 0 0 20 0 1 0 62673440 123121664 440
18446744073709551615 4194304 4198212 140735314078128 140735314077056 140645336670206 0 0 134 0
18446744071579305831 0 0 17 10 0 0 0 0 0 0 0 0 0 0 4752 111 111 111

$ perl -e 'system("cat /proc/$$/statm")'
30059 441 346 1 0 160 0

$ perl -e 'system("ps -p $$ -o vsz,rsz,sz,size")'
   VSZ   RSZ    SZ    SZ
120236 1764 30059    640

$ perl -e 'system("top -b -n1 -p $$")'
...
  PID USER      PR NI VIRT RES SHR S %CPU %MEM       TIME+ COMMAND
13063 tim       20   0 117m 1764 1384 S 0.0 0.1     0:00.00 perl

$ perl -e 'system("cat /proc/$$/status")'
...
VmPeak:!   120236 kB
VmSize:!   120236 kB <- total (code, libs, stack, heap etc.)
VmHWM:!      1760 kB
VmRSS:!      1760 kB <- how much of the total is resident in physical memory
VmData:!      548 kB <- data (heap)
VmStk:!        92 kB <- stack
VmExe:!         4 kB <- code
VmLib:!      4220 kB <- libs, including libperl.so
VmPTE:!        84 kB
VmPTD:!        28 kB
VmSwap:!        0 kB
...
                                                         Further info on unix.stackexchange.com
C Program Code       int main(...) { ... }
  Read-only Data       eg ā€œString constantsā€
 Read-write Data      un/initialized variables
       Heap



                           (not to scale!)



 Shared Lib Code      
Shared Lib R/O Data    repeated for each lib
Shared Lib R/W Data   //



     C Stack           (not the perl stack)
      System
$ perl -e 'system("cat /proc/$$/maps")'
address                   perms ... pathname
00400000-00401000         r-xp ...   /.../perl-5.NN.N/bin/perl
00601000-00602000         rw-p ...   /.../perl-5.NN.N/bin/perl

0087f000-008c1000           rw-p ...     [heap]



7f858cba1000-7f8592a32000 r--p ...       /usr/lib/locale/locale-archive-rpm

7f8592c94000-7f8592e1a000   r-xp   ...   /lib64/libc-2.12.so
7f8592e1a000-7f859301a000   ---p   ...   /lib64/libc-2.12.so
7f859301a000-7f859301e000   r--p   ...   /lib64/libc-2.12.so
7f859301e000-7f859301f000   rw-p   ...   /lib64/libc-2.12.so
7f859301f000-7f8593024000   rw-p   ...

...other libs...

7f8593d1b000-7f8593e7c000   r-xp   ...   /.../lib/5.NN.N/x86_64-linux/CORE/libperl.so
7f8593e7c000-7f859407c000   ---p   ...   /.../lib/5.NN.N/x86_64-linux/CORE/libperl.so
7f859407c000-7f8594085000   rw-p   ...   /.../lib/5.NN.N/x86_64-linux/CORE/libperl.so
7f85942a6000-7f85942a7000   rw-p   ...


7fff61284000-7fff6129a000 rw-p ...       [stack]

7fff613fe000-7fff61400000 r-xp ...   [vdso]
ffffffffff600000-ffffffffff601000 r-xp ... [vsyscall]
$ perl -e 'system("cat /proc/$$/smaps")' # note ā€˜smapsā€™ not ā€˜mapsā€™

address                   perms ...   pathname
...

7fb00fbc1000-7fb00fd22000 r-xp ... /.../5.10.1/x86_64-linux/CORE/libperl.so
Size:               1412 kB   <- size of executable code in libperl.so
Rss:                 720 kB   <- amount that's currently in physical memory
Pss:                 364 kB
Shared_Clean:        712 kB
Shared_Dirty:          0 kB
Private_Clean:         8 kB
Private_Dirty:         0 kB
Referenced:          720 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

... repeated for every segment ...
... repeated for every segment ...
Memory Pages
āœ¦   Process view:
     āœ¦   Single large memory space. Simple.
āœ¦   Operating System view:
     āœ¦   Memory is divided into pages
     āœ¦   Pages are loaded to physical memory on demand
     āœ¦   Mapping can change without the process knowing
C Program Code
  Read-only Data      Memory is divided into pages
                       Page size is typically 4KB
 Read-write Data
       Heap

                      ā† Page ā€˜residentā€™ in physical
                        memory
                      ā† Page not resident



                         RSS ā€œResident Set Sizeā€
                      is how much process memory is
 Shared Lib Code      currently in physical memory
Shared Lib R/O Data
Shared Lib R/W Data



     C Stack
      System
Key Point


āœ¦   Donā€™t use Resident Set Size (RSS)
      āœ¦   It can shrink even while the process size grows.
āœ¦   Heap size or Total memory size is a good indicator.
The Heap
Heap
       ā† Your perl stuff goes here




       ā€¢   Heap is managed by malloc()
       ā€¢   Memory freed is rarely returned to
           the operating system
       ā€¢   Heap grows but rarely shrinks
Perl Data Anatomy
Integer
 (IV)


String
 (PV)


Number
with a
string



          Head Body Data   Illustrations from illguts
Array
(IV)




Hash
(HV)
Glob (GV)   Symbol Table (Stash)




Sub (CV)




              lots of tiny chunks!
Devel::Peek
ā€¢   Gives you a textual view of data
    $ perl -MDevel::Peek -e '%a = (42 => "Hello World!"); Dump(%a)'
    SV = IV(0x1332fd0) at 0x1332fe0
      REFCNT = 1
      FLAGS = (TEMP,ROK)
      RV = 0x1346730
      SV = PVHV(0x1339090) at 0x1346730
        REFCNT = 2
        FLAGS = (SHAREKEYS)
        ARRAY = 0x1378750 (0:7, 1:1)
        KEYS = 1
        FILL = 1
        MAX = 7
        Elt "42" HASH = 0x73caace8
        SV = PV(0x1331090) at 0x1332de8
          REFCNT = 1
          FLAGS = (POK,pPOK)
          PV = 0x133f960 "Hello World!"0
          CUR = 12                           <= length in use
          LEN = 16                           <= amount allocated
Devel::Size
ā€¢   Gives you a measure of the size of a data structure
    $ perl -MDevel::Size=total_size -le 'print total_size( 0 )'
    24

    $ perl -MDevel::Size=total_size -le 'print total_size( [] )'
    64

    $ perl -MDevel::Size=total_size -le 'print total_size( {} )'
    120

    $ perl -MDevel::Size=total_size -le 'print total_size( [ 1..100 ] )'
    3264

ā€¢   Is very fast, and accurate for most simple data types.
ā€¢   Has limitations and bugs, but is the best tool we have.
Memory Proļ¬ling
What?

āœ¦   Track memory size over time?
āœ¦   See where memory is allocated and freed?
āœ¦   Experiments with Devel::NYTProf
āœ¦   Turned out to not seem useful
Space in Hiding
āœ¦   Perl tends to consume extra memory to save time
āœ¦   This can lead to surprises, for example:
      āœ¦   sub foo {
              my $var = "X" x 10_000_000;
          }
          foo();      # ~20MB still used after return!

      āœ¦   sub bar{
              my $var = "X" x 10_000_000;
              bar($_[0]-1) if $_[0]; # recurse
          }
          bar(50);    # ~1GB still used after return!
My Plan
The Plan
āœ¦   Extend Devel::Size
āœ¦   Add a C-level callback hook
āœ¦   Add some kind of "data path name" for the callback to use
āœ¦   Add a function to Devel::Size to return the size of everything
āœ¦   Stream the data to disk
āœ¦   Write tools to visualize the data
āœ¦   Add multi-phase scan
      1. scan symbol tables, skip where ref count > 1
      2. process the skipped items
      3. scan arenas for other values (e.g. leaks)
āœ¦   Write tool to compare two sets of data
The Status
āœ“   Add a C-level callback hook
āœ“   Add some kind of "data path name" for the callback to use
āœ“   Add a function to Devel::Size to return the size of everything.
āœ“   Stream the data to disk
āœ“   Write tools to visualize the data

      ā€¢   Will become a separate distribution
      ā€¢   ā€œDevel::SizeMeGraphā€?
      ā€¢   Source repo available by Sunday
      ā€¢   Ready to demonstrate
Demonstration
Questions?
                               For more details see
Full slides: http://www.slideshare.net/Tim.Bunce/perl-memory-use-yapcasia2012
Screencast: http://blip.tv/timbunce/perl-memory-use-and-devel-sizeme-at-yapc-
                                asia-2012-6381282

                          Tim.Bunce@pobox.com
                          http://blog.timbunce.org
                                 @timbunce
Perl
A Summary of the Onions



      Tim Bunce ā€“ SkyConā€™12
2007
-   Perl 5 isnā€™t the new kid on the block
    -   Perl is 25 years old
    -   Perl 5 is 18 years old
-   A mature language with a mature culture
From ā€œThe State of the Onion 10ā€ by Larry Wall, 2006
-   Perl is 25 years old
-   Perl 5 is 18 years old
-   Perl 6 was conceived 12 years ago
-   Perl 6 ā€œRakudo Starā€ is 2 years old
ā€œCPAN is my language,
       Perl is my VMā€
-   Vast library of free code modules on ā€œCPANā€
-   Over 5,100 active authors (making releases)
-   Over 26,000 distributions (110,000 modules)
-   ~1,000 uploads per month (by ~500 authors)
-   ~250 new distributions per month
-   Automated smoke testing for all uploads
search.cpan.org / metacpan.org
Dependency Analysis available for all Modules
      http://deps.cpantesters.org/?module=Moose;perl=latest
Automated Smoke Testing




http://matrix.cpantesters.org/?dist=Moose%202.0603
Perl 5 Development
- 5.10 ā€“ 2007
- 5.12 ā€“ 2010
- 5.14 ā€“ 2011
- 5.16 ā€“Ā 2012
- 5.17.4 latest monthly development release
- 5.18 ā€“Ā due May 2013
Perl 5 New Features

- Refactored internals
 	

     many ļ¬xes, more speed, less memory
- New language features (state, say, //, autodie, ...)
- Language feature management
- Unicode 6.1 and many new Unicode features
- Many powerful new regex features
        See http://www.slideshare.net/rjbs/whats-new-in-perl-v510-v516
http://xkcd.com/208/
Demo
                Regexp::Debuger
See http://www.youtube.com/watch?v=zcSFIUiMgAs
A Culture of Testing
-2002: Perl 5.8.0 had 26,725 core tests
	

    +41,666 more for bundled libraries etc.
-2007: Perl 5.10.0 has 78,883 core tests
	

    +109,427
-2010: Perl 5.11.5 has 191,008 core tests
	

    +167,015
-2012: Perl 5.16.0 has 262,370 core tests
       +261,776
Perl 6
Another member of the Perl language family
Learn it once, use it many times. Learn as
you go.       Many acceptable levels of
competence. Multiple ways to say the same
thing. No shame in borrowing. Indeterminate
dimensionality. Local ambiguity is okay.
         Natural Language
Punctuation by prosody and inļ¬‚ection.
         Principles in Perl
Disambiguation by number, case and word
order. Topicalization. Discourse structure.
Pronominalization. No theoretical axes to
grind. Style not enforced except by peer
pressure. Cooperative design. ā€œInevitableā€
Divergence.     http://www.wall.org/~larry/natural.html
Timeline
2000: Perl 6 conceived (after a smashed coffee mug)
2001-2004: Initial design docs
2005: First prototype, pugs (in Haskell)
2005+ Continual radical evolution (the whirlpool)
2010: 1st Rakudo Star release
2012: 17th Rakudo Star release
   Mostly implemented in Perl6 (>60% and rising)
ā€œIf we'd done Perl 6 on a schedule, you'd have it by
now. And it would be crap.ā€
    ā€”Larry Wall, 2002


ā€œDo it right.ā€ and ā€œIt's ready when it's ready.ā€
    Freedom to explore deeply and change


ā€œTruly radical and far-reaching improvements over
the past few years.ā€
ā€œWe've spent a decade stealing the very best ideas
from the best programming languages, and making
them simple and practical for mortal developers to
use.ā€
   ā€”Damian Conway
ā€œShould be called Perl 8 or Perl 9ā€




ā€œfeedback at many levels from multiple implementationsā€
Multiple Implementations
 Two main implementations:
     Rakudo - built on Parrot Compiler Toolchain
     Niecza - targeting the CLR (.NET and Mono)
 Plus: STD, viv, Perlito, Pugs and others
 Work on a JVM implementation is starting


 All sharing a common test suite

                See http://perl6.org/compilers
Some Perl 6 Features
Rich set of operators and meta-operators
Rich type system
Rich object system, including roles/traits
A full Meta Object Protocol
Multiple dispatch using types and expressive signatures
Gradual typing
Lazy lists and iterators, with controllable eagerness
Deep introspection
Native Call Interface
Representational polymorphism
Powerful matching and parsing with subclassable grammars
Series and Reduction
ā€£   say 1, 2, 4 ... 1024;
    1 2 4 8 16 32 64 128 256 512 1024

ā€£   my @fib = 1, 1, *+* ... *;   # infinite
    say @fib[^10]; # 0..9
    1 1 2 3 5 8 13 21 34 55 89

ā€£   say [*] 1..10; # reduction, use any operator
    3628800

ā€£   sub postfix:<!>($n) { [*] 1..$n }
    say 10!
    3628800
Multiple Dispatch
ā€£   multi fact(0) { 1 }
    multi fact($n) { $n * fact($n ā€“ 1) }

ā€£   multi fib(0) { 0 }
    multi fib(1) { 1 }
    multi fib($n) { fib($n ā€“ 1) + fib($n ā€“ 2) }

ā€£   multi quicksort([]) { () }
    multi quicksort([$pivot, *@rest]) {
        my @before = @rest.grep(* < $pivot);
        my @after = @rest.grep(* >= $pivot);
        (quicksort(@before), $pivot, quicksort(@after))
    }
Native Call Interface
sub PQexecPrepared(
     - OpaquePointer $conn,
       Str $statement_name,
       Int $n_params,
       CArray[Str] $param_values,
       CArray[int] $param_length,
       CArray[int] $param_formats,
       Int $resultFormat)

 -    returns OpaquePointer
      is native('libpq')
      { ... }

Also supports structures and callbacks.
my @suits   = < ā™£ ā™¢ ā™” ā™  >;
my @ranks   = 2..10, < J Q K A >;

# concatenate each rank with each suit
my @deck = @ranks X~ @suits;

# create hash of card to points value
my %points = @deck Z (    (2..10, 10, 10, 10, 11)
                       X+ (0,0,0,0) );

# grab five cards from the deck
my @hand = @deck.pick(5);

# display my hand
say ~@hand;

# tell me how many points it's worth
say [+] %points{@hand};
@xyzĀ»++                 # increment all elements of @xyz

@x = @a Ā»minĀ« @b        # @x is smallest of @a and @b

$mean = ([+] @a) / @a            # calculate mean of @a

$sumsq = [+] (@x Ā»**Ā» 2)         # sum of squares of @x

$fact = [*] 1..$n                # $n factorial

for %hash.kv -> $k, $v { say "$k: $v" }
Example Module
      JSON::Tiny




   https://github.com/moritz/json
module JSON::Tiny;

proto to-json($) is export {*}
multi to-json(Real:D $d) { ~$d }
multi to-json(Bool:D $d) { $d ?? 'true' !! 'false'; }
multi to-json(Str:D $d) {
Ā Ā Ā Ā '"'
Ā Ā Ā Ā ~ $d.trans(['"', '',     "b", "f", "n", "r", "t"]
Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā => ['"', '', 'b', 'f', 'n', 'r', 't'])
Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā .subst(/<-[c32..c126]>/, { ord(~$_).fmt('u%04x') }, :g)
Ā Ā Ā Ā ~ '"'
}
multi to-json(Positional:D $d) {
Ā Ā return '[ ' ~ $d.map(&to-json).join(', ') ~ ' ]';
}
multi to-json(Hash:D $d) {
  return '{ '~ $d.map({ to-json(.key)~' : '~to-json(.value) }).join(', ')~ ' }';
}
multi to-json(Any:U $) { 'null' }
multi to-json(Any:D $s) { die "Can't serialize an object of type "~$s.WHAT.perl}



use JSON::Tiny::Actions;
use JSON::Tiny::Grammar;

sub from-json($text) is export {
Ā Ā Ā Ā my $a = JSON::Tiny::Actions.new();
Ā Ā Ā Ā my $o = JSON::Tiny::Grammar.parse($text, :actions($a));
Ā Ā Ā Ā return $o.ast;
}
grammar JSON::Tiny::Grammar;

rule   TOP         {   ^ [   <object> | <array> ] $ }
rule   object      {   '{'   ~ '}' <pairlist>     }
rule   pairlist    {   <?>   <pair> * % ,              }
rule   pair        {   <?>   <string> ':' <value>     }
rule   array       {   '['   ~ ']' <arraylist>    }
rule   arraylist   {   <?>   <value>* % [ , ]        }

proto token value {*};
token value:sym<number> {
Ā Ā Ā Ā '-'?
Ā Ā Ā Ā [ 0 | <[1..9]> <[0..9]>* ]
Ā Ā Ā Ā [ . <[0..9]>+ ]?
Ā Ā Ā Ā [ <[eE]> [+|-]? <[0..9]>+ ]?
}
token value:sym<true>     { <sym>          };
token value:sym<false>    { <sym>          };
token value:sym<null>     { <sym>          };
token value:sym<object> { <object>         };
token value:sym<array>    { <array>        };
token value:sym<string> { <string>         }

token string                    { " ~ " ( <str> |  <str_escape> )* }
token str                       { <-["tn]>+ }
token str_escape                { <["/bfnrt]> | u <xdigit>**4 }
class JSON::Tiny::Actions;

method TOP($/)       { make $/.values.[0].ast };

method object($/)     { make $<pairlist>.ast.hash }
method pairlist($/) { make $<pair>>>.ast.flat }
method pair($/)       { make $<string>.ast => $<value>.ast }
method array($/)      { make $<arraylist>.ast }
method arraylist($/) { make [$<value>>>.ast] }
method string($/) {
Ā Ā Ā Ā make $0.elems == 1
Ā Ā Ā Ā Ā Ā Ā Ā ?? ($0[0].<str> || $0[0].<str_escape>).ast
Ā Ā Ā Ā Ā Ā Ā Ā !! join '', $0.list.map({ (.<str> || .<str_escape>).ast });
}
method value:sym<number>($/) { make +$/.Str }
method value:sym<string>($/) { make $<string>.ast }
method value:sym<true>($/)    { make Bool::True }
method value:sym<false>($/) { make Bool::False }
method value:sym<null>($/)    { make Any }
method value:sym<object>($/) { make $<object>.ast }
method value:sym<array>($/) { make $<array>.ast }
method str($/)                { make ~$/ }
method str_escape($/) {
Ā Ā Ā Ā if $<xdigit> {
Ā Ā Ā Ā Ā Ā Ā Ā make chr(:16($<xdigit>.join));
Ā Ā Ā Ā } else {
Ā Ā Ā Ā Ā Ā Ā Ā my %h = '' => "", '/' => "/", 'b' => "b",Ā 'n' => "n",
                  't' => "t", 'f' => "f", 'r' => "r", '"' => """;
Ā Ā Ā Ā Ā Ā Ā Ā make %h{~$/};
Ā Ā Ā Ā }
}
Perl 6

Already full of awesome
Hundreds of examples on http://rosettacode.org
Developers happy to stay in stealth mode for now
Get ahead of the revolution: http://perl6.org
In Summary...
Perl
has a massive library of reusable code
has a culture of best practice and testing
has a happy welcoming growing community
has a great future in Perl 5 and Perl 6
is a great language for getting your job done
   for the last 25 years, and the next 25!
Questions?
See also http://www.slideshare.net/Tim.Bunce/perl-myths-200909


                       http://perlmonks.org
                      http://search.cpan.org
                  http://rakudo.org/how-to-help
                     http://blog.timbunce.org
                            @timbunce
http://xkcd.com/519/

More Related Content

What's hot

Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Tim Bunce
Ā 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in PerlLaurent Dami
Ā 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011CodeIgniter Conference
Ā 
Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011Tim Bunce
Ā 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueGleicon Moraes
Ā 
On UnQLite
On UnQLiteOn UnQLite
On UnQLitecharsbar
Ā 
High Performance tDiary
High Performance tDiaryHigh Performance tDiary
High Performance tDiaryHiroshi SHIBATA
Ā 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scriptingTony Fabeen
Ā 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksHow to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksCarlos Sanchez
Ā 
Redis as a message queue
Redis as a message queueRedis as a message queue
Redis as a message queueBrandon Lamb
Ā 
Using ngx_lua in UPYUN
Using ngx_lua in UPYUNUsing ngx_lua in UPYUN
Using ngx_lua in UPYUNCong Zhang
Ā 
Apache Hadoop Shell Rewrite
Apache Hadoop Shell RewriteApache Hadoop Shell Rewrite
Apache Hadoop Shell RewriteAllen Wittenauer
Ā 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaJon Moore
Ā 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4moai kids
Ā 
Fluentd unified logging layer
Fluentd   unified logging layerFluentd   unified logging layer
Fluentd unified logging layerKiyoto Tamura
Ā 
Hadoop 20111117
Hadoop 20111117Hadoop 20111117
Hadoop 20111117exsuns
Ā 
Lua tech talk
Lua tech talkLua tech talk
Lua tech talkLocaweb
Ā 

What's hot (20)

Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Ā 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in Perl
Ā 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011
Ā 
Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011
Ā 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message Queue
Ā 
On UnQLite
On UnQLiteOn UnQLite
On UnQLite
Ā 
High Performance tDiary
High Performance tDiaryHigh Performance tDiary
High Performance tDiary
Ā 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scripting
Ā 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksHow to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
Ā 
Redis as a message queue
Redis as a message queueRedis as a message queue
Redis as a message queue
Ā 
Using ngx_lua in UPYUN
Using ngx_lua in UPYUNUsing ngx_lua in UPYUN
Using ngx_lua in UPYUN
Ā 
Apache Hadoop Shell Rewrite
Apache Hadoop Shell RewriteApache Hadoop Shell Rewrite
Apache Hadoop Shell Rewrite
Ā 
Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)
Ā 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
Ā 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4
Ā 
Fluentd unified logging layer
Fluentd   unified logging layerFluentd   unified logging layer
Fluentd unified logging layer
Ā 
Tuning Solr for Logs
Tuning Solr for LogsTuning Solr for Logs
Tuning Solr for Logs
Ā 
Hadoop 20111117
Hadoop 20111117Hadoop 20111117
Hadoop 20111117
Ā 
Top Node.js Metrics to Watch
Top Node.js Metrics to WatchTop Node.js Metrics to Watch
Top Node.js Metrics to Watch
Ā 
Lua tech talk
Lua tech talkLua tech talk
Lua tech talk
Ā 

Similar to Perl at SkyCon'12

Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing DaeHyung Lee
Ā 
Perly Parallel Processing of Fixed Width Data Records
Perly Parallel Processing of Fixed Width Data RecordsPerly Parallel Processing of Fixed Width Data Records
Perly Parallel Processing of Fixed Width Data RecordsWorkhorse Computing
Ā 
Speed up R with parallel programming in the Cloud
Speed up R with parallel programming in the CloudSpeed up R with parallel programming in the Cloud
Speed up R with parallel programming in the CloudRevolution Analytics
Ā 
Bottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMPBottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMPkatzgrau
Ā 
Driver Debugging Basics
Driver Debugging BasicsDriver Debugging Basics
Driver Debugging BasicsBala Subra
Ā 
Osd ctw spark
Osd ctw sparkOsd ctw spark
Osd ctw sparkWisely chen
Ā 
Nyt Prof 200910
Nyt Prof 200910Nyt Prof 200910
Nyt Prof 200910HighLoad2009
Ā 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceJesse Vincent
Ā 
Tips And Tricks For Bioinformatics Software Engineering
Tips And Tricks For Bioinformatics Software EngineeringTips And Tricks For Bioinformatics Software Engineering
Tips And Tricks For Bioinformatics Software Engineeringjtdudley
Ā 
Hadoop Performance Optimization at Scale, Lessons Learned at Twitter
Hadoop Performance Optimization at Scale, Lessons Learned at TwitterHadoop Performance Optimization at Scale, Lessons Learned at Twitter
Hadoop Performance Optimization at Scale, Lessons Learned at TwitterDataWorks Summit
Ā 
What we can learn from Rebol?
What we can learn from Rebol?What we can learn from Rebol?
What we can learn from Rebol?lichtkind
Ā 
Why and How Powershell will rule the Command Line - Barcamp LA 4
Why and How Powershell will rule the Command Line - Barcamp LA 4Why and How Powershell will rule the Command Line - Barcamp LA 4
Why and How Powershell will rule the Command Line - Barcamp LA 4Ilya Haykinson
Ā 
Servers and Processes: Behavior and Analysis
Servers and Processes: Behavior and AnalysisServers and Processes: Behavior and Analysis
Servers and Processes: Behavior and Analysisdreamwidth
Ā 
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...Alex Levenson
Ā 
Using R on High Performance Computers
Using R on High Performance ComputersUsing R on High Performance Computers
Using R on High Performance ComputersDave Hiltbrand
Ā 
Tips
TipsTips
Tipsmclee
Ā 
You know, for search. Querying 24 Billion Documents in 900ms
You know, for search. Querying 24 Billion Documents in 900msYou know, for search. Querying 24 Billion Documents in 900ms
You know, for search. Querying 24 Billion Documents in 900msJodok Batlogg
Ā 

Similar to Perl at SkyCon'12 (20)

Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
Ā 
Perly Parallel Processing of Fixed Width Data Records
Perly Parallel Processing of Fixed Width Data RecordsPerly Parallel Processing of Fixed Width Data Records
Perly Parallel Processing of Fixed Width Data Records
Ā 
Inferno Scalable Deep Learning on Spark
Inferno Scalable Deep Learning on SparkInferno Scalable Deep Learning on Spark
Inferno Scalable Deep Learning on Spark
Ā 
Speed up R with parallel programming in the Cloud
Speed up R with parallel programming in the CloudSpeed up R with parallel programming in the Cloud
Speed up R with parallel programming in the Cloud
Ā 
Bottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMPBottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMP
Ā 
Driver Debugging Basics
Driver Debugging BasicsDriver Debugging Basics
Driver Debugging Basics
Ā 
Osd ctw spark
Osd ctw sparkOsd ctw spark
Osd ctw spark
Ā 
Nyt Prof 200910
Nyt Prof 200910Nyt Prof 200910
Nyt Prof 200910
Ā 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret Sauce
Ā 
Tips And Tricks For Bioinformatics Software Engineering
Tips And Tricks For Bioinformatics Software EngineeringTips And Tricks For Bioinformatics Software Engineering
Tips And Tricks For Bioinformatics Software Engineering
Ā 
Hadoop Performance Optimization at Scale, Lessons Learned at Twitter
Hadoop Performance Optimization at Scale, Lessons Learned at TwitterHadoop Performance Optimization at Scale, Lessons Learned at Twitter
Hadoop Performance Optimization at Scale, Lessons Learned at Twitter
Ā 
What we can learn from Rebol?
What we can learn from Rebol?What we can learn from Rebol?
What we can learn from Rebol?
Ā 
Why and How Powershell will rule the Command Line - Barcamp LA 4
Why and How Powershell will rule the Command Line - Barcamp LA 4Why and How Powershell will rule the Command Line - Barcamp LA 4
Why and How Powershell will rule the Command Line - Barcamp LA 4
Ā 
Servers and Processes: Behavior and Analysis
Servers and Processes: Behavior and AnalysisServers and Processes: Behavior and Analysis
Servers and Processes: Behavior and Analysis
Ā 
Pecl Picks
Pecl PicksPecl Picks
Pecl Picks
Ā 
myHadoop 0.30
myHadoop 0.30myHadoop 0.30
myHadoop 0.30
Ā 
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Ā 
Using R on High Performance Computers
Using R on High Performance ComputersUsing R on High Performance Computers
Using R on High Performance Computers
Ā 
Tips
TipsTips
Tips
Ā 
You know, for search. Querying 24 Billion Documents in 900ms
You know, for search. Querying 24 Billion Documents in 900msYou know, for search. Querying 24 Billion Documents in 900ms
You know, for search. Querying 24 Billion Documents in 900ms
Ā 

More from Tim Bunce

Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008Tim Bunce
Ā 
Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)Tim Bunce
Ā 
DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007Tim Bunce
Ā 
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)Tim Bunce
Ā 
Perl Myths 200909
Perl Myths 200909Perl Myths 200909
Perl Myths 200909Tim Bunce
Ā 
DashProfiler 200807
DashProfiler 200807DashProfiler 200807
DashProfiler 200807Tim Bunce
Ā 
DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007Tim Bunce
Ā 
Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)Tim Bunce
Ā 

More from Tim Bunce (8)

Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008
Ā 
Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)
Ā 
DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007
Ā 
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Ā 
Perl Myths 200909
Perl Myths 200909Perl Myths 200909
Perl Myths 200909
Ā 
DashProfiler 200807
DashProfiler 200807DashProfiler 200807
DashProfiler 200807
Ā 
DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007
Ā 
Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)
Ā 

Recently uploaded

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
Ā 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
Ā 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
Ā 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
Ā 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
Ā 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
Ā 
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | DelhiFULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhisoniya singh
Ā 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
Ā 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
Ā 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
Ā 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
Ā 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
Ā 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
Ā 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
Ā 
šŸ¬ The future of MySQL is Postgres šŸ˜
šŸ¬  The future of MySQL is Postgres   šŸ˜šŸ¬  The future of MySQL is Postgres   šŸ˜
šŸ¬ The future of MySQL is Postgres šŸ˜RTylerCroy
Ā 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
Ā 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
Ā 
Scaling API-first ā€“ The story of a global engineering organization
Scaling API-first ā€“ The story of a global engineering organizationScaling API-first ā€“ The story of a global engineering organization
Scaling API-first ā€“ The story of a global engineering organizationRadu Cotescu
Ā 
Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024BookNet Canada
Ā 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
Ā 

Recently uploaded (20)

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Ā 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Ā 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
Ā 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
Ā 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
Ā 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
Ā 
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | DelhiFULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
Ā 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
Ā 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
Ā 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Ā 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
Ā 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
Ā 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
Ā 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
Ā 
šŸ¬ The future of MySQL is Postgres šŸ˜
šŸ¬  The future of MySQL is Postgres   šŸ˜šŸ¬  The future of MySQL is Postgres   šŸ˜
šŸ¬ The future of MySQL is Postgres šŸ˜
Ā 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
Ā 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
Ā 
Scaling API-first ā€“ The story of a global engineering organization
Scaling API-first ā€“ The story of a global engineering organizationScaling API-first ā€“ The story of a global engineering organization
Scaling API-first ā€“ The story of a global engineering organization
Ā 
Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: Whatā€™s new for BISAC - Tech Forum 2024
Ā 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
Ā 

Perl at SkyCon'12

  • 2. Perl Code Proļ¬ling Memory Proļ¬ling Perl 5 Perl 6 Tim Bunce - SkyConā€™12
  • 3. Devel::NYTProf Perl Source Code Proļ¬ler Tim Bunce - SkyConā€™12
  • 4. Devel::DProf Is Broken $ perl -we 'print "sub s$_ { sqrt(42) for 1..100 }; s$_({});n" for 1..1000' > x.pl $ perl -d:DProf x.pl $ dprofpp -r Total Elapsed Time = 0.108 Seconds Real Time = 0.108 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 9.26 0.010 0.010 1 0.0100 0.0100 main::s76 9.26 0.010 0.010 1 0.0100 0.0100 main::s323 9.26 0.010 0.010 1 0.0100 0.0100 main::s626 9.26 0.010 0.010 1 0.0100 0.0100 main::s936 0.00 - -0.000 1 - - main::s77 0.00 - -0.000 1 - - main::s82
  • 5. Proļ¬ling 101 The Basics
  • 6. What To Measure? CPU Time Real Time Subroutines ? ? Statements ? ?
  • 7. Devel::NYTProf Does it all
  • 8. Running NYTProf perl -d:NYTProf ... perl -MDevel::NYTProf ... Conļ¬gure proļ¬ler via the NYTPROF env var perldoc Devel::NYTProf for the details To proļ¬le code thatā€™s invoked elsewhere: PERL5OPT=-d:NYTProf NYTPROF=file=/tmp/nytprof.out:addpid=1:...
  • 9. Reporting: KCachegrind ā€¢ KCachegrind call graph - new and cool - contributed by C. L. Kao. - requires KCachegrind $ nytprofcg # generates nytprof.callgraph $ kcachegrind # load the file via the gui
  • 11. Reporting: HTML ā€¢ HTML report - page per source ļ¬le, annotated with times and links - subroutine index table with sortable columns - interactive Treemap of subroutine times - generates Graphviz dot ļ¬le of call graph - -m (--minimal) faster generation but less detailed $ nytprofhtml # writes HTML report in ./nytprof/... $ nytprofhtml --file=/tmp/nytprof.out.793 --open
  • 12.
  • 13. Summary Links to annotated source code Link to sortable table of all subs Timings for perl builtins
  • 14.
  • 15. Color coding based on Overall time spent in and below this sub Median Average Deviation relative to rest of this ļ¬le (in + below) Time between starting this perl statement and starting the next. So includes overhead of calls to perl subs. Timings for each location calling into, or out of, the subroutine
  • 16.
  • 17. Treemap showing relative proportions of exclusive time Boxes represent subroutines Colors only used to show packages (and arenā€™t pretty yet) Hover over box to see details Click to drill-down one level in package hierarchy
  • 20. Questions? For more details see Slides: http://www.slideshare.net/Tim.Bunce/develnytprof-v4-at-yapceu-201008-4906467 Screencast: http://blip.tv/timbunce/devel-nytprof-yapc-asia-2012-6376582
  • 21. Perl Memory Use Tim Bunce @ SkyConā€™12
  • 22. Ouch! $ perl some_script.pl Out of memory! $ $ perl some_script.pl Killed. $ $ perl some_script.pl $ Someone shouts: "Hey! My process has been killed!" $ perl some_script.pl [...later...] "Umm, what's taking so long?"
  • 24. $ perl -e 'system("cat /proc/$$/stat")' # $$ = pid 4752 (perl) S 4686 4752 4686 34816 4752 4202496 536 0 0 0 0 0 0 0 20 0 1 0 62673440 123121664 440 18446744073709551615 4194304 4198212 140735314078128 140735314077056 140645336670206 0 0 134 0 18446744071579305831 0 0 17 10 0 0 0 0 0 0 0 0 0 0 4752 111 111 111 $ perl -e 'system("cat /proc/$$/statm")' 30059 441 346 1 0 160 0 $ perl -e 'system("ps -p $$ -o vsz,rsz,sz,size")' VSZ RSZ SZ SZ 120236 1764 30059 640 $ perl -e 'system("top -b -n1 -p $$")' ... PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13063 tim 20 0 117m 1764 1384 S 0.0 0.1 0:00.00 perl $ perl -e 'system("cat /proc/$$/status")' ... VmPeak:! 120236 kB VmSize:! 120236 kB <- total (code, libs, stack, heap etc.) VmHWM:! 1760 kB VmRSS:! 1760 kB <- how much of the total is resident in physical memory VmData:! 548 kB <- data (heap) VmStk:! 92 kB <- stack VmExe:! 4 kB <- code VmLib:! 4220 kB <- libs, including libperl.so VmPTE:! 84 kB VmPTD:! 28 kB VmSwap:! 0 kB ... Further info on unix.stackexchange.com
  • 25. C Program Code int main(...) { ... } Read-only Data eg ā€œString constantsā€ Read-write Data un/initialized variables Heap (not to scale!) Shared Lib Code Shared Lib R/O Data repeated for each lib Shared Lib R/W Data // C Stack (not the perl stack) System
  • 26. $ perl -e 'system("cat /proc/$$/maps")' address perms ... pathname 00400000-00401000 r-xp ... /.../perl-5.NN.N/bin/perl 00601000-00602000 rw-p ... /.../perl-5.NN.N/bin/perl 0087f000-008c1000 rw-p ... [heap] 7f858cba1000-7f8592a32000 r--p ... /usr/lib/locale/locale-archive-rpm 7f8592c94000-7f8592e1a000 r-xp ... /lib64/libc-2.12.so 7f8592e1a000-7f859301a000 ---p ... /lib64/libc-2.12.so 7f859301a000-7f859301e000 r--p ... /lib64/libc-2.12.so 7f859301e000-7f859301f000 rw-p ... /lib64/libc-2.12.so 7f859301f000-7f8593024000 rw-p ... ...other libs... 7f8593d1b000-7f8593e7c000 r-xp ... /.../lib/5.NN.N/x86_64-linux/CORE/libperl.so 7f8593e7c000-7f859407c000 ---p ... /.../lib/5.NN.N/x86_64-linux/CORE/libperl.so 7f859407c000-7f8594085000 rw-p ... /.../lib/5.NN.N/x86_64-linux/CORE/libperl.so 7f85942a6000-7f85942a7000 rw-p ... 7fff61284000-7fff6129a000 rw-p ... [stack] 7fff613fe000-7fff61400000 r-xp ... [vdso] ffffffffff600000-ffffffffff601000 r-xp ... [vsyscall]
  • 27. $ perl -e 'system("cat /proc/$$/smaps")' # note ā€˜smapsā€™ not ā€˜mapsā€™ address perms ... pathname ... 7fb00fbc1000-7fb00fd22000 r-xp ... /.../5.10.1/x86_64-linux/CORE/libperl.so Size: 1412 kB <- size of executable code in libperl.so Rss: 720 kB <- amount that's currently in physical memory Pss: 364 kB Shared_Clean: 712 kB Shared_Dirty: 0 kB Private_Clean: 8 kB Private_Dirty: 0 kB Referenced: 720 kB Anonymous: 0 kB AnonHugePages: 0 kB Swap: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB ... repeated for every segment ... ... repeated for every segment ...
  • 28. Memory Pages āœ¦ Process view: āœ¦ Single large memory space. Simple. āœ¦ Operating System view: āœ¦ Memory is divided into pages āœ¦ Pages are loaded to physical memory on demand āœ¦ Mapping can change without the process knowing
  • 29. C Program Code Read-only Data Memory is divided into pages Page size is typically 4KB Read-write Data Heap ā† Page ā€˜residentā€™ in physical memory ā† Page not resident RSS ā€œResident Set Sizeā€ is how much process memory is Shared Lib Code currently in physical memory Shared Lib R/O Data Shared Lib R/W Data C Stack System
  • 30. Key Point āœ¦ Donā€™t use Resident Set Size (RSS) āœ¦ It can shrink even while the process size grows. āœ¦ Heap size or Total memory size is a good indicator.
  • 32. Heap ā† Your perl stuff goes here ā€¢ Heap is managed by malloc() ā€¢ Memory freed is rarely returned to the operating system ā€¢ Heap grows but rarely shrinks
  • 33. Perl Data Anatomy Integer (IV) String (PV) Number with a string Head Body Data Illustrations from illguts
  • 35. Glob (GV) Symbol Table (Stash) Sub (CV) lots of tiny chunks!
  • 36. Devel::Peek ā€¢ Gives you a textual view of data $ perl -MDevel::Peek -e '%a = (42 => "Hello World!"); Dump(%a)' SV = IV(0x1332fd0) at 0x1332fe0 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x1346730 SV = PVHV(0x1339090) at 0x1346730 REFCNT = 2 FLAGS = (SHAREKEYS) ARRAY = 0x1378750 (0:7, 1:1) KEYS = 1 FILL = 1 MAX = 7 Elt "42" HASH = 0x73caace8 SV = PV(0x1331090) at 0x1332de8 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x133f960 "Hello World!"0 CUR = 12 <= length in use LEN = 16 <= amount allocated
  • 37. Devel::Size ā€¢ Gives you a measure of the size of a data structure $ perl -MDevel::Size=total_size -le 'print total_size( 0 )' 24 $ perl -MDevel::Size=total_size -le 'print total_size( [] )' 64 $ perl -MDevel::Size=total_size -le 'print total_size( {} )' 120 $ perl -MDevel::Size=total_size -le 'print total_size( [ 1..100 ] )' 3264 ā€¢ Is very fast, and accurate for most simple data types. ā€¢ Has limitations and bugs, but is the best tool we have.
  • 39. What? āœ¦ Track memory size over time? āœ¦ See where memory is allocated and freed? āœ¦ Experiments with Devel::NYTProf āœ¦ Turned out to not seem useful
  • 40. Space in Hiding āœ¦ Perl tends to consume extra memory to save time āœ¦ This can lead to surprises, for example: āœ¦ sub foo { my $var = "X" x 10_000_000; } foo(); # ~20MB still used after return! āœ¦ sub bar{ my $var = "X" x 10_000_000; bar($_[0]-1) if $_[0]; # recurse } bar(50); # ~1GB still used after return!
  • 42. The Plan āœ¦ Extend Devel::Size āœ¦ Add a C-level callback hook āœ¦ Add some kind of "data path name" for the callback to use āœ¦ Add a function to Devel::Size to return the size of everything āœ¦ Stream the data to disk āœ¦ Write tools to visualize the data āœ¦ Add multi-phase scan 1. scan symbol tables, skip where ref count > 1 2. process the skipped items 3. scan arenas for other values (e.g. leaks) āœ¦ Write tool to compare two sets of data
  • 43. The Status āœ“ Add a C-level callback hook āœ“ Add some kind of "data path name" for the callback to use āœ“ Add a function to Devel::Size to return the size of everything. āœ“ Stream the data to disk āœ“ Write tools to visualize the data ā€¢ Will become a separate distribution ā€¢ ā€œDevel::SizeMeGraphā€? ā€¢ Source repo available by Sunday ā€¢ Ready to demonstrate
  • 45. Questions? For more details see Full slides: http://www.slideshare.net/Tim.Bunce/perl-memory-use-yapcasia2012 Screencast: http://blip.tv/timbunce/perl-memory-use-and-devel-sizeme-at-yapc- asia-2012-6381282 Tim.Bunce@pobox.com http://blog.timbunce.org @timbunce
  • 46. Perl A Summary of the Onions Tim Bunce ā€“ SkyConā€™12
  • 47. 2007
  • 48. - Perl 5 isnā€™t the new kid on the block - Perl is 25 years old - Perl 5 is 18 years old - A mature language with a mature culture
  • 49. From ā€œThe State of the Onion 10ā€ by Larry Wall, 2006
  • 50. - Perl is 25 years old - Perl 5 is 18 years old - Perl 6 was conceived 12 years ago - Perl 6 ā€œRakudo Starā€ is 2 years old
  • 51. ā€œCPAN is my language, Perl is my VMā€ - Vast library of free code modules on ā€œCPANā€ - Over 5,100 active authors (making releases) - Over 26,000 distributions (110,000 modules) - ~1,000 uploads per month (by ~500 authors) - ~250 new distributions per month - Automated smoke testing for all uploads
  • 53. Dependency Analysis available for all Modules http://deps.cpantesters.org/?module=Moose;perl=latest
  • 55. Perl 5 Development - 5.10 ā€“ 2007 - 5.12 ā€“ 2010 - 5.14 ā€“ 2011 - 5.16 ā€“Ā 2012 - 5.17.4 latest monthly development release - 5.18 ā€“Ā due May 2013
  • 56. Perl 5 New Features - Refactored internals many ļ¬xes, more speed, less memory - New language features (state, say, //, autodie, ...) - Language feature management - Unicode 6.1 and many new Unicode features - Many powerful new regex features See http://www.slideshare.net/rjbs/whats-new-in-perl-v510-v516
  • 58. Demo Regexp::Debuger See http://www.youtube.com/watch?v=zcSFIUiMgAs
  • 59. A Culture of Testing -2002: Perl 5.8.0 had 26,725 core tests +41,666 more for bundled libraries etc. -2007: Perl 5.10.0 has 78,883 core tests +109,427 -2010: Perl 5.11.5 has 191,008 core tests +167,015 -2012: Perl 5.16.0 has 262,370 core tests +261,776
  • 60. Perl 6 Another member of the Perl language family
  • 61. Learn it once, use it many times. Learn as you go. Many acceptable levels of competence. Multiple ways to say the same thing. No shame in borrowing. Indeterminate dimensionality. Local ambiguity is okay. Natural Language Punctuation by prosody and inļ¬‚ection. Principles in Perl Disambiguation by number, case and word order. Topicalization. Discourse structure. Pronominalization. No theoretical axes to grind. Style not enforced except by peer pressure. Cooperative design. ā€œInevitableā€ Divergence. http://www.wall.org/~larry/natural.html
  • 62. Timeline 2000: Perl 6 conceived (after a smashed coffee mug) 2001-2004: Initial design docs 2005: First prototype, pugs (in Haskell) 2005+ Continual radical evolution (the whirlpool) 2010: 1st Rakudo Star release 2012: 17th Rakudo Star release Mostly implemented in Perl6 (>60% and rising)
  • 63. ā€œIf we'd done Perl 6 on a schedule, you'd have it by now. And it would be crap.ā€ ā€”Larry Wall, 2002 ā€œDo it right.ā€ and ā€œIt's ready when it's ready.ā€ Freedom to explore deeply and change ā€œTruly radical and far-reaching improvements over the past few years.ā€
  • 64. ā€œWe've spent a decade stealing the very best ideas from the best programming languages, and making them simple and practical for mortal developers to use.ā€ ā€”Damian Conway
  • 65. ā€œShould be called Perl 8 or Perl 9ā€ ā€œfeedback at many levels from multiple implementationsā€
  • 66. Multiple Implementations Two main implementations: Rakudo - built on Parrot Compiler Toolchain Niecza - targeting the CLR (.NET and Mono) Plus: STD, viv, Perlito, Pugs and others Work on a JVM implementation is starting All sharing a common test suite See http://perl6.org/compilers
  • 67. Some Perl 6 Features Rich set of operators and meta-operators Rich type system Rich object system, including roles/traits A full Meta Object Protocol Multiple dispatch using types and expressive signatures Gradual typing Lazy lists and iterators, with controllable eagerness Deep introspection Native Call Interface Representational polymorphism Powerful matching and parsing with subclassable grammars
  • 68. Series and Reduction ā€£ say 1, 2, 4 ... 1024; 1 2 4 8 16 32 64 128 256 512 1024 ā€£ my @fib = 1, 1, *+* ... *; # infinite say @fib[^10]; # 0..9 1 1 2 3 5 8 13 21 34 55 89 ā€£ say [*] 1..10; # reduction, use any operator 3628800 ā€£ sub postfix:<!>($n) { [*] 1..$n } say 10! 3628800
  • 69. Multiple Dispatch ā€£ multi fact(0) { 1 } multi fact($n) { $n * fact($n ā€“ 1) } ā€£ multi fib(0) { 0 } multi fib(1) { 1 } multi fib($n) { fib($n ā€“ 1) + fib($n ā€“ 2) } ā€£ multi quicksort([]) { () } multi quicksort([$pivot, *@rest]) { my @before = @rest.grep(* < $pivot); my @after = @rest.grep(* >= $pivot); (quicksort(@before), $pivot, quicksort(@after)) }
  • 70. Native Call Interface sub PQexecPrepared( - OpaquePointer $conn, Str $statement_name, Int $n_params, CArray[Str] $param_values, CArray[int] $param_length, CArray[int] $param_formats, Int $resultFormat) - returns OpaquePointer is native('libpq') { ... } Also supports structures and callbacks.
  • 71. my @suits = < ā™£ ā™¢ ā™” ā™  >; my @ranks = 2..10, < J Q K A >; # concatenate each rank with each suit my @deck = @ranks X~ @suits; # create hash of card to points value my %points = @deck Z ( (2..10, 10, 10, 10, 11) X+ (0,0,0,0) ); # grab five cards from the deck my @hand = @deck.pick(5); # display my hand say ~@hand; # tell me how many points it's worth say [+] %points{@hand};
  • 72. @xyzĀ»++ # increment all elements of @xyz @x = @a Ā»minĀ« @b # @x is smallest of @a and @b $mean = ([+] @a) / @a # calculate mean of @a $sumsq = [+] (@x Ā»**Ā» 2) # sum of squares of @x $fact = [*] 1..$n # $n factorial for %hash.kv -> $k, $v { say "$k: $v" }
  • 73. Example Module JSON::Tiny https://github.com/moritz/json
  • 74. module JSON::Tiny; proto to-json($) is export {*} multi to-json(Real:D $d) { ~$d } multi to-json(Bool:D $d) { $d ?? 'true' !! 'false'; } multi to-json(Str:D $d) { Ā Ā Ā Ā '"' Ā Ā Ā Ā ~ $d.trans(['"', '', "b", "f", "n", "r", "t"] Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā => ['"', '', 'b', 'f', 'n', 'r', 't']) Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā .subst(/<-[c32..c126]>/, { ord(~$_).fmt('u%04x') }, :g) Ā Ā Ā Ā ~ '"' } multi to-json(Positional:D $d) { Ā Ā return '[ ' ~ $d.map(&to-json).join(', ') ~ ' ]'; } multi to-json(Hash:D $d) { return '{ '~ $d.map({ to-json(.key)~' : '~to-json(.value) }).join(', ')~ ' }'; } multi to-json(Any:U $) { 'null' } multi to-json(Any:D $s) { die "Can't serialize an object of type "~$s.WHAT.perl} use JSON::Tiny::Actions; use JSON::Tiny::Grammar; sub from-json($text) is export { Ā Ā Ā Ā my $a = JSON::Tiny::Actions.new(); Ā Ā Ā Ā my $o = JSON::Tiny::Grammar.parse($text, :actions($a)); Ā Ā Ā Ā return $o.ast; }
  • 75. grammar JSON::Tiny::Grammar; rule TOP { ^ [ <object> | <array> ] $ } rule object { '{' ~ '}' <pairlist> } rule pairlist { <?> <pair> * % , } rule pair { <?> <string> ':' <value> } rule array { '[' ~ ']' <arraylist> } rule arraylist { <?> <value>* % [ , ] } proto token value {*}; token value:sym<number> { Ā Ā Ā Ā '-'? Ā Ā Ā Ā [ 0 | <[1..9]> <[0..9]>* ] Ā Ā Ā Ā [ . <[0..9]>+ ]? Ā Ā Ā Ā [ <[eE]> [+|-]? <[0..9]>+ ]? } token value:sym<true> { <sym> }; token value:sym<false> { <sym> }; token value:sym<null> { <sym> }; token value:sym<object> { <object> }; token value:sym<array> { <array> }; token value:sym<string> { <string> } token string { " ~ " ( <str> | <str_escape> )* } token str { <-["tn]>+ } token str_escape { <["/bfnrt]> | u <xdigit>**4 }
  • 76. class JSON::Tiny::Actions; method TOP($/) { make $/.values.[0].ast }; method object($/) { make $<pairlist>.ast.hash } method pairlist($/) { make $<pair>>>.ast.flat } method pair($/) { make $<string>.ast => $<value>.ast } method array($/) { make $<arraylist>.ast } method arraylist($/) { make [$<value>>>.ast] } method string($/) { Ā Ā Ā Ā make $0.elems == 1 Ā Ā Ā Ā Ā Ā Ā Ā ?? ($0[0].<str> || $0[0].<str_escape>).ast Ā Ā Ā Ā Ā Ā Ā Ā !! join '', $0.list.map({ (.<str> || .<str_escape>).ast }); } method value:sym<number>($/) { make +$/.Str } method value:sym<string>($/) { make $<string>.ast } method value:sym<true>($/) { make Bool::True } method value:sym<false>($/) { make Bool::False } method value:sym<null>($/) { make Any } method value:sym<object>($/) { make $<object>.ast } method value:sym<array>($/) { make $<array>.ast } method str($/) { make ~$/ } method str_escape($/) { Ā Ā Ā Ā if $<xdigit> { Ā Ā Ā Ā Ā Ā Ā Ā make chr(:16($<xdigit>.join)); Ā Ā Ā Ā } else { Ā Ā Ā Ā Ā Ā Ā Ā my %h = '' => "", '/' => "/", 'b' => "b",Ā 'n' => "n", 't' => "t", 'f' => "f", 'r' => "r", '"' => """; Ā Ā Ā Ā Ā Ā Ā Ā make %h{~$/}; Ā Ā Ā Ā } }
  • 77. Perl 6 Already full of awesome Hundreds of examples on http://rosettacode.org Developers happy to stay in stealth mode for now Get ahead of the revolution: http://perl6.org
  • 79. Perl has a massive library of reusable code has a culture of best practice and testing has a happy welcoming growing community has a great future in Perl 5 and Perl 6 is a great language for getting your job done for the last 25 years, and the next 25!
  • 80. Questions? See also http://www.slideshare.net/Tim.Bunce/perl-myths-200909 http://perlmonks.org http://search.cpan.org http://rakudo.org/how-to-help http://blog.timbunce.org @timbunce