SlideShare ist ein Scribd-Unternehmen logo
1 von 238
Downloaden Sie, um offline zu lesen
Everything but the
   Secret Sauce
Modules, Magic and Monstrosities created for
Jesse Vincent
   Best Practical
We make Hiveminder
It’s not opensource
We built lots of cool
stuff for Hiveminder
We opensource
everything we can
Today’s Agenda
Ten tools and techniques to help you:
Find bugs faster
Build web apps
Ship software
Get input from users
Own the Inbox
Find bugs faster
TAP-Harness-Remote
    Run your tests over there.
The Problem
Hiveminder has
 lots of tests
That's a problem?
Yes.
30 minutes to run
tests on my Macbook
(It took the same on
   a Macbook Pro)
What to do?
TAP::Harness 3.0
I have two cores!
TAP::Harness::Parallel
prove -j 5 --fork
22 minutes
Better!
Not good.
Run tests on a server!
rsync -rvp . server:
ssh server quot;prove -j 9 tquot;
Better.
Annoying to run.
TAP::Harness::Remote
Magic Remote Testing
# ~/.remote_test
    ---
    local: /path/to/local/testing/root/
    host:
           - remote1.testing.host.example.com
           - remote2.testing.host.example.com
    root: /where/to/place/local/root/on/remote/
    user: username
    master: 1
    perl: /usr/bin/perl
    ssh: /usr/bin/ssh
    ssh_args:
      - -x
      - -S
      - '~/.ssh/master-%r@%h:%p'
prove --harness TAP::Harness::Remote t/*.t
16.5 minutes
prove --harness TAP::Harness::Remote -j 5 t/*.t
Magic Parallel
Remote Testing
12 minutes!
Not good enough
    for TDD
What I need is...

•   Fast Servers

•   Lots of Fast Servers

•   Right Now

•   Not Very Often
A use for cloud
  computing!
TAP::Harness::Remote::EC2
4 hosts. -j 5
89 seconds
WIN
EC2 Caveats
Default Perl builds are really bad

(“XL” instances are great, though)

Machine Setup/Teardown is ~manual

The billing structure is crazy
What's next for
::Harness::Remote::* ?
More polish on EC2 tools

Better EC2 watchdogs

More widespread usage
Carp::REPL
It's not quite a debugger
How many of you use
 the Perl debugger?
How many of you
know how to use the
   perl debugger?
I don’t, either.
So, what do I use?
31b:~ jesse$ perl /tmp/contrived.pl
Undefined subroutine &main::does_not_exist called
at /tmp/contrived.pl line 20.

31b:~ jesse$ vim /tmp/contrived.pl

18.sub   c {
19.      my $to_call = shift;
20.      $to_call = quot;does_quot;.$to_call;
21.      no strict refs;
22.      $to_call->();
23.}
31b:~ jesse$ perl /tmp/contrived.pl
Undefined subroutine &main::does_not_exist called
at /tmp/contrived.pl line 22.

31b:~ jesse$ vim /tmp/contrived.pl

18.sub   c {
19.      my $to_call = shift;
20.      $to_call = quot;does_quot;.$to_call;
21.      no strict refs;
22.      use Carp; Carp::cluck(quot;$to_callquot;);
23.      $to_call->();
24.}
Ick. A Print Statement.
Anyone else here use
   print statement
     debugging?
(Oh god, I hope I'm
    not alone)
I want a simple
debugger that's easier
than print statements
sartak created
  Carp::REPL
A lightweight, modern,
 interactive debugger
Built on Devel::REPL
Carp::REPL Hooks into
   $SIG{__DIE__}
$SIG{__WARN__}
hooks are optional
31b:~ jesse$ perl -MCarp::REPL /tmp/contrived.pl
Undefined subroutine &main::does_not_exist called
at /tmp/contrived.pl line 22.

0: Carp::REPL::repl called at /tmp/contrived.pl:22.
   1: main::c called at /tmp/contrived.pl:15.
   2: main::b called at /tmp/contrived.pl:9.
   3: main::a called at /tmp/contrived.pl:27.
Now at /tmp/contrived.pl:22 (frame 0).
$
That's not a shell
    prompt
31b:~ jesse$ perl -MCarp::REPL /tmp/contrived.pl
Undefined subroutine &main::does_not_exist called
at /tmp/contrived.pl line 22.

0: Carp::REPL::repl called at /tmp/contrived.pl:22.
   1: main::c called at /tmp/contrived.pl:15.
   2: main::b called at /tmp/contrived.pl:9.
   3: main::a called at /tmp/contrived.pl:27.
Now at /tmp/contrived.pl:22 (frame 0).
$ warn $0
/tmp/contrived.pl at (eval 135) line 15, <FIN> line 1.
It's Perl, but
it's not just Perl
:t   -   Stack trace
:u   -   Up one stack frame
:d   -   Down one stack frame
:e   -   Print this frame's lexical environment
:q   -   Quit this REPL

$_e - ARRAYREF of this frame's @_
$ :t
0: Carp::REPL::repl called at /tmp/contrived.pl:22.
   1: main::c called at /tmp/contrived.pl:15.
   2: main::b called at /tmp/contrived.pl:9.
   3: main::a called at /tmp/contrived.pl:27.
$
$ :e
$Env = { quot;$to_callquot; => do { my $v = 'does_not_exist' } };
$ :u
$ :u
Now at /tmp/contrived.pl:9 (frame 2).
$ :e
$Env = { quot;$to_callquot; => do { my $v = 'exist' } };
$ :u
Now at /tmp/contrived.pl:27 (frame 3).
$ :e
$Env = { quot;$to_callquot; => do { my $v = '' } };
$ :d
Now at /tmp/contrived.pl:9 (frame 2).
$ :e
$Env = { quot;$to_callquot; => do { my $v = 'exist' } };
$ warn join(quot;, quot;,@$_a);
exist at (eval 138) line 18, <FIN> line 4.
Why is my code 'warn'ing?

 Maybe it's in an eval.

 Or in a CPAN library.

 No problem!

 perl -MCarp::REPL=warn
31b:~ jesse$ perl -MCarp::REPL=warn /tmp/contrived.pl
Use of uninitialized value in concatenation (.) or string at /tmp/contrived.pl
line 8.

0: Carp::REPL::repl called at /tmp/contrived.pl:8.
   1: main::a called at /tmp/contrived.pl:27.
Now at /tmp/contrived.pl:8 (frame 0).
$ :e
$Env = { quot;$to_callquot; => do { my $v = undef } };
$ :q
Undefined subroutine &main::does_not_exist called at /tmp/contrived.pl line 22,
<FIN> line 2.

0: Carp::REPL::repl called at /tmp/contrived.pl:22.
   1: main::c called at /tmp/contrived.pl:15.
   2: main::b called at /tmp/contrived.pl:9.
   3: main::a called at /tmp/contrived.pl:27.
Now at /tmp/contrived.pl:22 (frame 0).
$
Inserting breakpoints
You know your 'print' statements?

Turn them into breakpoints.

Two ways:

s/print/warn/ and -MCarp::REPL=warn
Carp::REPL::repl
18.sub   c {
19.      my $to_call = shift;
20.      no strict 'refs';
21.      Carp::REPL::repl(); #Gimme a breakpoint here!
22.      $to_call = quot;does_quot;.$to_call;
23.      $to_call->();
24.}
What's next for
       Carp::REPL?

I have no idea.

It's simple.

It works.
Build web apps
Template::Declare
  A Pure Perl Templating Engine
Perl has two big
templating camps
Template::Toolkit
A DSL for templates

It's NOT Perl

Why should I learn a new language for
templates?
HTML::Mason


There's Perl inside.
HTML::Mason

 <mason><is><still>
     <full><of>
 <angle><brackets>
HTML::Mason

 </brackets></angle>
     </of></full>
 </still></is></mason>
I'm Just A Simple
   Perl Hacker
I needed something
    more Perlish
template '/pages/mypage.html' => sub {
    html {
        head {};
        body {
            h1 {'Hey, this is text'};
            }
        }
};
template choices => page {
    h1 { 'My Choices' }
    dl {
        my $choices = Doxory::Model::ChoiceCollection->new;
        $choices->limit(
            column => 'asked_by',
            value => Jifty->web->current_user->id,
        );
        while (my $c = $choices->next) {
            dt { $c->name, ' (', $c->asked_by->name, ')' }
            dd { b { $c->a } em { 'vs' } b { $c->b } }
        }
    }
};
But!

Content! Templates!

Design! Code!

OMGWTFBBQ!?

THAT'S WRONG!
The person who told
 you it's wrong was
   lying to you.
We're Perl hackers
Why are we writing
 our templates in
another language?
This is not 1997
It’s 2008
People use CSS
for design now
Programmers still have
  to make templates
Templates run like
    CODE
Because they ARE code
Let's use our CODING
  tools to work with
          them
How about
Refactoring?
Have you ever tried to
   refactor HTML?
template 'mypage.html' => page {
 h1 { 'Two choices' };
 div { attr { class => 'item' };
       h2 { 'Item 1'};
   };
 div { attr { class => 'item' };
       h2 { 'Item 2'};
   };
};
template 'mypage.html' => page {
 h1 { 'Two choices' };
 for (quot;Item 1quot;, quot;Item 2quot;) { item($_); }
};

sub item {
    my $content = shift;
    div {
        attr { class => 'item' };
        h2 {$content};
    };

}
We can refactor
  templates!
Our HTML is
magically valid
(Syntax errors are...
   Syntax Errors)
Object Oriented
  Templates
Subclassing

It just works

We're using Perl's symbol table

(Template::Declare's show() passes the class for you)
Mixins

alias Some::Template::Library under '/path';

That's it.
Closures
Tags as Closures

HTML tags take blocks of content

Our tag methods take blocks of Perl

They return closures when you want them

They run and output their content when you want them to
sub h1 (&;$) {
  my $code = shift;

    ...

    if (defined wantarray) {
      return sub { ...closure around $code...};
    } else {
      # Actually do our work, run $code and
      # return the output
      return $code->();
    }
}
What's next for
     Template::Declare?

HTML Attribute Validation


Compile to .js
CSS::Squish
A compiler for Cascading Style Sheets
The Problem

Many small CSS Files

 Easy to work with

 Painful to serve
The Problem

One big CSS le

 Painful to work with

 Easy to serve
How CSS works
main.css:
@import quot;yui-fonts.cssquot;;
@import quot;base.cssquot;;
@import quot;layout.cssquot;;
@import quot;nav.cssquot;;
@import quot;forms.cssquot;;
@import quot;boxes.cssquot;;
@import quot;login.cssquot;;
...
How CSS works
• Browser downloads CSS stylesheets listed
  in HTML
• Browser processes each stylesheet for
  @include directives
• Browser fetches each stylesheet found
• This is slow.
How CSS works

To make CSS faster, you can tell browsers to cache stylesheets

...then you have trouble if you want to update your styles

Some people add datestamps to the stylesheet names:
        /css/mypagestyle.css?1210362379
How CSS::Squish works

 •   It pretends to be a browser.

 •   You give it the path to a stylesheet.

 •   It returns the fully computed stylesheet the
     browser would get eventually.

 •   You serve that file out to the user.
How we use
          CSS::Squish
 Instead of:
 <link rel=quot;stylesheetquot; type=quot;text/cssquot;
href=quot;main.css”/>

 We have this:
 <link rel=quot;stylesheetquot; type=quot;text/cssquot; href=quot;/
css/squished/
4a50a85044a6ba727f7aa0683ac21f7e.css”/>
How we use
                CSS::Squish
 If we have a cached copy of the squished CSS, name the ‘file’ as an
MD5 of the content

 Tell browsers to cache it forever

  When users load a page, they will always fetch the squished CSS if
it’s changed. By magic
What’s next for
         CSS::Squish

 Refactor the MD5 hash bits from Jifty to
CSS::Squish
 What else do you want?
Ship software
App::ChangeLogger
    Gorgeous changelogs
We create a lot of
    software
(145 Projects in
 bps-public svn)
We’re not so good at
   doing releases
Lots of manual work
ShipIt can help with
     most of it
What about
Changelog?
svn log svn://svn.foo.com/MyProj
> Changelog
Ship it!
Ew. No. Ick.
Wrong. Bad.
App::ChangeLogger
Two commands


• sort-changelog
• generate-changelog
Ok, three commands:

• svn log --xml svn://svn.bestpractical.com/
  App-Changelogger > changelog.raw.xml
• ./bin/sort-changelog changelog.xml
  changelog.out.xml
• bin/generate-changelog --generate
  changelog.out.xml Changelog
What's next for
    App::Changelogger?
Use it on itself. (Release it)

Store changelog metadata in repository

Support for Git, Hg

Easier customization
Shipwright
  Build. Ship.
The Problem



CPAN
The Problem


Everything that
 is not CPAN
We make RT
RT has Many
Dependencies
Apache::DBI                  Digest::MD5               HTML::Scrubber                Mail::Mailer                 Test::Warn

Apache::Request              Digest::base              HTML::TokeParser              Module::Refresh              Text::ParseWords

Apache::Session              File::Find                HTML::TreeBuilder             Module::Versions::Report     Text::Quoted

CGI::Cookie                  File::Glob                HTTP::Request::Common         Net::SMTP                    Text::Template

CGI::Fast                    File::ShareDir            HTTP::Server::Simple          PerlIO::eol                  Text::WikiFormat

CGI::SpeedyCGI               File::Spec                HTTP::Server::Simple::Mason   Pod::Usage                   Text::Wrapper

CSS::Squish                  File::Temp                IPC::Run                      Regexp::Common               Time::HiRes

Cache::Simple::TimedExpiry   GD::Graph                 IPC::Run::SafeHandles         Scalar::Util                 Time::ParseDate

Calendar::Simple             GD::Text                  LWP::UserAgent                String::ShellQuote           Tree::Simple

Class::ReturnValue           Getopt::Long              Locale::Maketext              Term::ReadKey                UNIVERSAL::require

DBD::Oracle                  GnuPG::Interface          Locale::Maketext::Fuzzy       Term::ReadLine               WWW::Mechanize

DBD::Pg                      HTML::Entities            Locale::Maketext::Lexicon     Test::Builder                XML::RSS

DBD::SQLite                  HTML::Form                Log::Dispatch                 Test::Deep                   XML::Simple

DBD::mysql                   HTML::FormatText          Log::Dispatch::Perl           Test::Expect

DBIx::SearchBuilder          HTML::Mason               MIME::Entity                  Test::HTTP::Server::Simple

Data::ICal                   HTML::RewriteAttributes   MIME::Types                   Test::WWW::Mechanize
116 CPAN distributions
   once you do the
      recursion
And then there are the
 external libraries and
      programs
• perl        • readline
• expat       • zlib
• fontconfig   • gnupg
• freetype    • mysql
• libgd       • postgresql
• libjpeg
• libpng
Plagger beats RT.
(It has 135 CPAN deps)
RT should be easy to
       install
All software should be
     easy to install
What Shipwright does

Tracks all dependencies in version control

  (As far down as you want. I skip libc.)
What Shipwright does

Computes a full dependency order

No more recursive CPAN installs
What Shipwright does

Keeps all packages in version control

No more “that site is down”
What Shipwright does

 Automates multi-package builds

  (No manual intervention)
What Shipwright does

Makes installed packages relocatable

(Wraps all scripts and binaries)
What Shipwright does

Makes historical builds reproducible

(No more “Oh. that API changed in 2.0”)
Shipwright and CPAN
CPAN-friendly
  (Not CPAN-only)

CPAN dist import

Automatic CPAN dependency resolution

Full build ordering

No more CPAN dependency hell.
Shipwright and C

 Native support for autoconscated packages

 No support for magic C->C dependency
resolutions
Shipwright and Ruby

Not Ruby friendly :(
     (not Ruby unfriendly)

No Gem support yet

Hackathon this weekend?
What you can ship

A platform-neutral source distribution

Platform-specic binary distributions
Making a Shipwright
            Vessel
svnadmin create file:///Users/jesse/shiprepo
shipwright create --repository
     svn:file:///Users/jesse/shiprepo/myproject
shipwright import --repository
     svn:file:///Users/jesse/shiprepo/myproject
     cpan:Plagger
Go get a cup of coffee
(Shipwright will chase all 135 dependencies)
Building a Shipwright
            Vessel
svn co file:///Users/jesse/shiprepo/myproject
cd myproject
./bin/shipwright-builder
(Possibly more coffee)
tar czvf myproject.tgz /path/to/build
Using a Shipwright
            Vessel

•   tar xzvf myproject.tgz c /usr/local/
    myproject

•   ln -s /usr/local/myproject/bin/myprogram
    /usr/local/bin
What's next for
      Shipwright?

Build tool usability improvements
Ruby support?
Get input from users
The Feedback Box
Let users make suggestions everywhere
mailto: links?
getsatisfaction.com?
I give up.
Don't make your users
       give up.
Feedback is important!
Feedback can be easy!
If you make it easy for
    users to give you
       feedback...
You can capture lots of
  good information!
From: Jesse Vincent / Feedback <comment-373709-destygrypuju@tasks.hiveminder.com>
Date: Mon, 12 May 2008 12:31:49 -0700
Subject: Up for grabs: I'd really like Hiveminder to do all my work for me! (#EFYG)

Jesse Vincent <jesse@bestpractical.com> created a task and put it up for grabs:

   http://task.hm/EFYG

   I'd really like Hiveminder to do all my work for me!

--
Private debugging information:

    Is a Pro user!

    HTTP_ACCEPT: application/xml, text/xml, */*
    HTTP_ACCEPT_ENCODING: gzip, deflate
    HTTP_ACCEPT_LANGUAGE: en-us
    HTTP_CONNECTION: keep-alive
    HTTP_COOKIE: JIFTY_SID_HIVEMINDER=b58e123456719fd411bb9f3a8123458f;
    HTTP_HOST: hiveminder.com
    HTTP_REFERER: http://hiveminder.com/todo/
    HTTP_USER_AGENT: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us)
                       AppleWebKit/526.5+ (KHTML, like Gecko) Version/3.1.1 Safari/525.18
    HTTP_X_REQUESTED_WITH: XMLHttpRequest
    REMOTE_ADDR: 75.147.59.54
    REMOTE_PORT: 35412
    REQUEST_METHOD: POST
    REQUEST_URI: /todo/
Collect lots of feedback
Reply to lots of
   feedback
Conversations make
   users happy
Happy = Loyal
Own the inbox
Net::IMAP::Server
  An IMAP Server in Pure Perl
Why?
Offline Access
iPhone Access
Desktop Access
Really, we just like
  things that are
 sick and wrong.
Now Hiveminder users
 can take their tasks
      with them
Update your tasks
  while offline
What sort of mailbox
do you use with that?
How about Perl?
Net::IMAP::Server
Complete RFC 3501
  Implementation
Write your own
  backends
Let’s write one now
How about a
Spam server?
package Demo::IMAP::Auth;
use base 'Net::IMAP::Server::DefaultAuth';

sub auth_plain {
    my ($self, $user, $pass ) = @_;
    # XXX DO AUTH CHECK
    return 1;
}
package Demo::IMAP::Model;
use base 'Net::IMAP::Server::DefaultModel';

sub init {
    my $self = shift;
    $self->root(Demo::IMAP::Mailbox->new());
    $self->root->add_child( name => quot;INBOXquot;,
                            is_inbox => 1);
}
package Demo::IMAP::Mailbox;
use base qw/Net::IMAP::Server::Mailbox/;

my $msg = Net::IMAP::Server::Message->new(<<'EOM');
From: jesse@example.com
To: user@example.com
Subject: This is a test message!

Hello. I am executive assistant to the director of
Bear Stearns, a failed investment Bank. I have
access to USD5,000,000. ...
EOM

sub load_data {
    my $self = shift;
    $self->add_message($msg);
}
#!/usr/bin/perl

use Net::IMAP::Server;
Net::IMAP::Server->new(
        auth_class => quot;Demo::IMAP::Authquot;,
        model_class => quot;Demo::IMAP::Modelquot;,
        user        => 'nobody',
        port        => 143,
        ssl_port    => 993
)->run();
It runs! Ship it!
(Just add SSL certicates)
with.hm
Assign tasks by email
We wanted to make it
 easy to work with
Hiveminder by email.
We had a few ideas...
Cc:
Too clumsy
Bcc:
Too likely to break
Commands in the body
Too ugly
hm.
What could we do?
DNS Hacks!
Everybody loves DNS hacks
.hm
Hiveminder!
.hm
Heard and McDonald
      Islands!
with.hm
Send your email with
    Hiveminder
Wildcard MX Record!
*.with.hm ➡
mail.hiveminder.com
An Example:

From: jesse@bestpractical.com
To: miyagawa@bulknews.net.with.hm
Subject: Could you release a new version of plagger?
My mail server looks up
 bulknews.net.with.hm
“Oh. That's handled by
 mail.hiveminder.com”
mail.hiveminder.com
unwraps the address.
Hiveminder creates a task
for miyagawa@bulknews.net
Hiveminder emails
miyagawa@bulknews.net
Preventing Spam
miyagawa@bulknews.net.my-
      secret.with.hm
I bet you can come up
with even scarier uses
   of wildcard DNS.
Thank you!

Weitere ähnliche Inhalte

Was ist angesagt?

The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015Fernando Hamasaki de Amorim
 
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010singingfish
 
Create a web-app with Cgi Appplication
Create a web-app with Cgi AppplicationCreate a web-app with Cgi Appplication
Create a web-app with Cgi Appplicationolegmmiller
 
Let's play a game with blackfire player
Let's play a game with blackfire playerLet's play a game with blackfire player
Let's play a game with blackfire playerMarcin Czarnecki
 
Symfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendSymfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendKirill Chebunin
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShellSalaudeen Rajack
 
Developing apps using Perl
Developing apps using PerlDeveloping apps using Perl
Developing apps using PerlAnatoly Sharifulin
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowKacper Gunia
 
Writing Pluggable Software
Writing Pluggable SoftwareWriting Pluggable Software
Writing Pluggable SoftwareTatsuhiko Miyagawa
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpecCiaranMcNulty
 
非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumaki非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumakikeroyonn
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I thinkWim Godden
 
Mojolicious - A new hope
Mojolicious - A new hopeMojolicious - A new hope
Mojolicious - A new hopeMarcus Ramberg
 
Getting big without getting fat, in perl
Getting big without getting fat, in perlGetting big without getting fat, in perl
Getting big without getting fat, in perlDean Hamstead
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkJeremy Kendall
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersKacper Gunia
 
New in php 7
New in php 7New in php 7
New in php 7Vic Metcalfe
 

Was ist angesagt? (20)

The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
 
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
 
Create a web-app with Cgi Appplication
Create a web-app with Cgi AppplicationCreate a web-app with Cgi Appplication
Create a web-app with Cgi Appplication
 
Getting testy with Perl
Getting testy with PerlGetting testy with Perl
Getting testy with Perl
 
Let's play a game with blackfire player
Let's play a game with blackfire playerLet's play a game with blackfire player
Let's play a game with blackfire player
 
Symfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendSymfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friend
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
Developing apps using Perl
Developing apps using PerlDeveloping apps using Perl
Developing apps using Perl
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers Cracow
 
Writing Pluggable Software
Writing Pluggable SoftwareWriting Pluggable Software
Writing Pluggable Software
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpec
 
非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumaki非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumaki
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
Mojolicious - A new hope
Mojolicious - A new hopeMojolicious - A new hope
Mojolicious - A new hope
 
Getting big without getting fat, in perl
Getting big without getting fat, in perlGetting big without getting fat, in perl
Getting big without getting fat, in perl
 
Effective Benchmarks
Effective BenchmarksEffective Benchmarks
Effective Benchmarks
 
ReactPHP
ReactPHPReactPHP
ReactPHP
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro framework
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4Developers
 
New in php 7
New in php 7New in php 7
New in php 7
 

Ähnlich wie Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceJesse Vincent
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterZendCon
 
Umleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB appUmleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB appLenz Gschwendtner
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applicationschartjes
 
PSGI and Plack from first principles
PSGI and Plack from first principlesPSGI and Plack from first principles
PSGI and Plack from first principlesPerl Careers
 
When To Use Ruby On Rails
When To Use Ruby On RailsWhen To Use Ruby On Rails
When To Use Ruby On Railsdosire
 
Analyzing FreeCAD's Source Code and Its "Sick" Dependencies
Analyzing FreeCAD's Source Code and Its "Sick" DependenciesAnalyzing FreeCAD's Source Code and Its "Sick" Dependencies
Analyzing FreeCAD's Source Code and Its "Sick" DependenciesPVS-Studio
 
Capistrano
CapistranoCapistrano
CapistranoJason Noble
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
Background Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbBackground Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbJuan Maiz
 
Perl Teach-In (part 1)
Perl Teach-In (part 1)Perl Teach-In (part 1)
Perl Teach-In (part 1)Dave Cross
 
Xdebug - Derick Rethans - Barcelona PHP Conference 2008
Xdebug - Derick Rethans - Barcelona PHP Conference 2008Xdebug - Derick Rethans - Barcelona PHP Conference 2008
Xdebug - Derick Rethans - Barcelona PHP Conference 2008phpbarcelona
 
RubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - KeynoteRubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - KeynoteDr Nic Williams
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworksdiego_k
 
Curscatalyst
CurscatalystCurscatalyst
CurscatalystKar Juan
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Benjamin Bock
 

Ähnlich wie Beijing Perl Workshop 2008 Hiveminder Secret Sauce (20)

Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret Sauce
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
 
Umleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB appUmleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB app
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
PSGI and Plack from first principles
PSGI and Plack from first principlesPSGI and Plack from first principles
PSGI and Plack from first principles
 
When To Use Ruby On Rails
When To Use Ruby On RailsWhen To Use Ruby On Rails
When To Use Ruby On Rails
 
Analyzing FreeCAD's Source Code and Its "Sick" Dependencies
Analyzing FreeCAD's Source Code and Its "Sick" DependenciesAnalyzing FreeCAD's Source Code and Its "Sick" Dependencies
Analyzing FreeCAD's Source Code and Its "Sick" Dependencies
 
Capistrano
CapistranoCapistrano
Capistrano
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Background Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbBackground Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRb
 
Perl Teach-In (part 1)
Perl Teach-In (part 1)Perl Teach-In (part 1)
Perl Teach-In (part 1)
 
Capistrano2
Capistrano2Capistrano2
Capistrano2
 
Capistrano
CapistranoCapistrano
Capistrano
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Xdebug - Derick Rethans - Barcelona PHP Conference 2008
Xdebug - Derick Rethans - Barcelona PHP Conference 2008Xdebug - Derick Rethans - Barcelona PHP Conference 2008
Xdebug - Derick Rethans - Barcelona PHP Conference 2008
 
Sinatra
SinatraSinatra
Sinatra
 
RubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - KeynoteRubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - Keynote
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
 
Curscatalyst
CurscatalystCurscatalyst
Curscatalyst
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)
 

Mehr von Jesse Vincent

Building a keyboard from scratch
Building a keyboard from scratchBuilding a keyboard from scratch
Building a keyboard from scratchJesse Vincent
 
So, I made a keyboard
So, I made a keyboardSo, I made a keyboard
So, I made a keyboardJesse Vincent
 
Dancing App Stores - Android Open 2011
Dancing App Stores - Android Open 2011Dancing App Stores - Android Open 2011
Dancing App Stores - Android Open 2011Jesse Vincent
 
Perl 5.16 and Beyond - YAPC::Asia 2011
Perl 5.16 and Beyond - YAPC::Asia 2011Perl 5.16 and Beyond - YAPC::Asia 2011
Perl 5.16 and Beyond - YAPC::Asia 2011Jesse Vincent
 
Perl 5.16 and beyond
Perl 5.16 and beyondPerl 5.16 and beyond
Perl 5.16 and beyondJesse Vincent
 
OSCON 2011 - Perl 5.16 and beyond
OSCON 2011 - Perl 5.16 and beyondOSCON 2011 - Perl 5.16 and beyond
OSCON 2011 - Perl 5.16 and beyondJesse Vincent
 
RT4 - The whole sordid story
RT4 - The whole sordid storyRT4 - The whole sordid story
RT4 - The whole sordid storyJesse Vincent
 
K-9 Mail for Android
K-9 Mail for AndroidK-9 Mail for Android
K-9 Mail for AndroidJesse Vincent
 
P2P Bug Tracking with SD
P2P Bug Tracking with SDP2P Bug Tracking with SD
P2P Bug Tracking with SDJesse Vincent
 
SD - A peer to peer issue tracking system
SD - A peer to peer issue tracking systemSD - A peer to peer issue tracking system
SD - A peer to peer issue tracking systemJesse Vincent
 
Hacking your Kindle (OSCON Lightning Talk)
Hacking your Kindle (OSCON Lightning Talk)Hacking your Kindle (OSCON Lightning Talk)
Hacking your Kindle (OSCON Lightning Talk)Jesse Vincent
 
Beginning Kindle Hackery
Beginning Kindle HackeryBeginning Kindle Hackery
Beginning Kindle HackeryJesse Vincent
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking systemJesse Vincent
 
Prophet - Beijing Perl Workshop
Prophet - Beijing Perl WorkshopProphet - Beijing Perl Workshop
Prophet - Beijing Perl WorkshopJesse Vincent
 
A brief introduction to RTIR
A brief introduction to RTIRA brief introduction to RTIR
A brief introduction to RTIRJesse Vincent
 
An introduction to RTIR
An introduction to RTIRAn introduction to RTIR
An introduction to RTIRJesse Vincent
 
Prophet: a path out of the Cloud
Prophet: a path out of the CloudProphet: a path out of the Cloud
Prophet: a path out of the CloudJesse Vincent
 
Web 2.0 is Sharecropping
Web 2.0 is SharecroppingWeb 2.0 is Sharecropping
Web 2.0 is SharecroppingJesse Vincent
 
Prophet - A peer to peer replicated disconnected database
Prophet - A peer to peer replicated disconnected databaseProphet - A peer to peer replicated disconnected database
Prophet - A peer to peer replicated disconnected databaseJesse Vincent
 

Mehr von Jesse Vincent (20)

Building a keyboard from scratch
Building a keyboard from scratchBuilding a keyboard from scratch
Building a keyboard from scratch
 
So, I made a keyboard
So, I made a keyboardSo, I made a keyboard
So, I made a keyboard
 
Dancing App Stores - Android Open 2011
Dancing App Stores - Android Open 2011Dancing App Stores - Android Open 2011
Dancing App Stores - Android Open 2011
 
Perl 5.16 and Beyond - YAPC::Asia 2011
Perl 5.16 and Beyond - YAPC::Asia 2011Perl 5.16 and Beyond - YAPC::Asia 2011
Perl 5.16 and Beyond - YAPC::Asia 2011
 
Perl 5.16 and beyond
Perl 5.16 and beyondPerl 5.16 and beyond
Perl 5.16 and beyond
 
OSCON 2011 - Perl 5.16 and beyond
OSCON 2011 - Perl 5.16 and beyondOSCON 2011 - Perl 5.16 and beyond
OSCON 2011 - Perl 5.16 and beyond
 
RT4 - The whole sordid story
RT4 - The whole sordid storyRT4 - The whole sordid story
RT4 - The whole sordid story
 
K-9 Mail for Android
K-9 Mail for AndroidK-9 Mail for Android
K-9 Mail for Android
 
Perl 5.12.0
Perl 5.12.0Perl 5.12.0
Perl 5.12.0
 
P2P Bug Tracking with SD
P2P Bug Tracking with SDP2P Bug Tracking with SD
P2P Bug Tracking with SD
 
SD - A peer to peer issue tracking system
SD - A peer to peer issue tracking systemSD - A peer to peer issue tracking system
SD - A peer to peer issue tracking system
 
Hacking your Kindle (OSCON Lightning Talk)
Hacking your Kindle (OSCON Lightning Talk)Hacking your Kindle (OSCON Lightning Talk)
Hacking your Kindle (OSCON Lightning Talk)
 
Beginning Kindle Hackery
Beginning Kindle HackeryBeginning Kindle Hackery
Beginning Kindle Hackery
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking system
 
Prophet - Beijing Perl Workshop
Prophet - Beijing Perl WorkshopProphet - Beijing Perl Workshop
Prophet - Beijing Perl Workshop
 
A brief introduction to RTIR
A brief introduction to RTIRA brief introduction to RTIR
A brief introduction to RTIR
 
An introduction to RTIR
An introduction to RTIRAn introduction to RTIR
An introduction to RTIR
 
Prophet: a path out of the Cloud
Prophet: a path out of the CloudProphet: a path out of the Cloud
Prophet: a path out of the Cloud
 
Web 2.0 is Sharecropping
Web 2.0 is SharecroppingWeb 2.0 is Sharecropping
Web 2.0 is Sharecropping
 
Prophet - A peer to peer replicated disconnected database
Prophet - A peer to peer replicated disconnected databaseProphet - A peer to peer replicated disconnected database
Prophet - A peer to peer replicated disconnected database
 

KĂźrzlich hochgeladen

Tech Startup Growth Hacking 101 - Basics on Growth Marketing
Tech Startup Growth Hacking 101  - Basics on Growth MarketingTech Startup Growth Hacking 101  - Basics on Growth Marketing
Tech Startup Growth Hacking 101 - Basics on Growth MarketingShawn Pang
 
Call Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine ServiceCall Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine Serviceritikaroy0888
 
Best VIP Call Girls Noida Sector 40 Call Me: 8448380779
Best VIP Call Girls Noida Sector 40 Call Me: 8448380779Best VIP Call Girls Noida Sector 40 Call Me: 8448380779
Best VIP Call Girls Noida Sector 40 Call Me: 8448380779Delhi Call girls
 
VIP Kolkata Call Girl Howrah 👉 8250192130 Available With Room
VIP Kolkata Call Girl Howrah 👉 8250192130  Available With RoomVIP Kolkata Call Girl Howrah 👉 8250192130  Available With Room
VIP Kolkata Call Girl Howrah 👉 8250192130 Available With Roomdivyansh0kumar0
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Lviv Startup Club
 
Mondelez State of Snacking and Future Trends 2023
Mondelez State of Snacking and Future Trends 2023Mondelez State of Snacking and Future Trends 2023
Mondelez State of Snacking and Future Trends 2023Neil Kimberley
 
Boost the utilization of your HCL environment by reevaluating use cases and f...
Boost the utilization of your HCL environment by reevaluating use cases and f...Boost the utilization of your HCL environment by reevaluating use cases and f...
Boost the utilization of your HCL environment by reevaluating use cases and f...Roland Driesen
 
A DAY IN THE LIFE OF A SALESMAN / WOMAN
A DAY IN THE LIFE OF A  SALESMAN / WOMANA DAY IN THE LIFE OF A  SALESMAN / WOMAN
A DAY IN THE LIFE OF A SALESMAN / WOMANIlamathiKannappan
 
Grateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdfGrateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdfPaul Menig
 
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒anilsa9823
 
0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdf0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdfRenandantas16
 
Insurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usageInsurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usageMatteo Carbone
 
Understanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key InsightsUnderstanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key Insightsseribangash
 
Pharma Works Profile of Karan Communications
Pharma Works Profile of Karan CommunicationsPharma Works Profile of Karan Communications
Pharma Works Profile of Karan Communicationskarancommunications
 
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...lizamodels9
 
Unlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdfUnlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdfOnline Income Engine
 
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service AvailableCall Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service AvailableDipal Arora
 
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...noida100girls
 
GD Birla and his contribution in management
GD Birla and his contribution in managementGD Birla and his contribution in management
GD Birla and his contribution in managementchhavia330
 
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best ServicesMysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best ServicesDipal Arora
 

KĂźrzlich hochgeladen (20)

Tech Startup Growth Hacking 101 - Basics on Growth Marketing
Tech Startup Growth Hacking 101  - Basics on Growth MarketingTech Startup Growth Hacking 101  - Basics on Growth Marketing
Tech Startup Growth Hacking 101 - Basics on Growth Marketing
 
Call Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine ServiceCall Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine Service
 
Best VIP Call Girls Noida Sector 40 Call Me: 8448380779
Best VIP Call Girls Noida Sector 40 Call Me: 8448380779Best VIP Call Girls Noida Sector 40 Call Me: 8448380779
Best VIP Call Girls Noida Sector 40 Call Me: 8448380779
 
VIP Kolkata Call Girl Howrah 👉 8250192130 Available With Room
VIP Kolkata Call Girl Howrah 👉 8250192130  Available With RoomVIP Kolkata Call Girl Howrah 👉 8250192130  Available With Room
VIP Kolkata Call Girl Howrah 👉 8250192130 Available With Room
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
 
Mondelez State of Snacking and Future Trends 2023
Mondelez State of Snacking and Future Trends 2023Mondelez State of Snacking and Future Trends 2023
Mondelez State of Snacking and Future Trends 2023
 
Boost the utilization of your HCL environment by reevaluating use cases and f...
Boost the utilization of your HCL environment by reevaluating use cases and f...Boost the utilization of your HCL environment by reevaluating use cases and f...
Boost the utilization of your HCL environment by reevaluating use cases and f...
 
A DAY IN THE LIFE OF A SALESMAN / WOMAN
A DAY IN THE LIFE OF A  SALESMAN / WOMANA DAY IN THE LIFE OF A  SALESMAN / WOMAN
A DAY IN THE LIFE OF A SALESMAN / WOMAN
 
Grateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdfGrateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdf
 
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒
 
0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdf0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdf
 
Insurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usageInsurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usage
 
Understanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key InsightsUnderstanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key Insights
 
Pharma Works Profile of Karan Communications
Pharma Works Profile of Karan CommunicationsPharma Works Profile of Karan Communications
Pharma Works Profile of Karan Communications
 
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
 
Unlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdfUnlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdf
 
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service AvailableCall Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
 
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...
 
GD Birla and his contribution in management
GD Birla and his contribution in managementGD Birla and his contribution in management
GD Birla and his contribution in management
 
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best ServicesMysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
 

Beijing Perl Workshop 2008 Hiveminder Secret Sauce