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 file

 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
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
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 autoconfiscated 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-specific 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?
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
I give up.
Don't make your users
       give up.
Feedback is important!
Feedback can be easy!
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
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 certificates)
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!
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
.hm
Heard and McDonald
      Islands!
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
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
 
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
 
非同期処理の通知処理 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
 

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
 
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
 
Curscatalyst
CurscatalystCurscatalyst
CurscatalystKar Juan
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworksdiego_k
 
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
 
Curscatalyst
CurscatalystCurscatalyst
Curscatalyst
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
 
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

Slicing Work on Business Agility Meetup Berlin
Slicing Work on Business Agility Meetup BerlinSlicing Work on Business Agility Meetup Berlin
Slicing Work on Business Agility Meetup BerlinAnton Skornyakov
 
Live-Streaming in the Music Industry Webinar
Live-Streaming in the Music Industry WebinarLive-Streaming in the Music Industry Webinar
Live-Streaming in the Music Industry WebinarNathanielSchmuck
 
7movierulz.uk
7movierulz.uk7movierulz.uk
7movierulz.ukaroemirsr
 
Fabric RFID Wristbands in Ireland for Events and Festivals
Fabric RFID Wristbands in Ireland for Events and FestivalsFabric RFID Wristbands in Ireland for Events and Festivals
Fabric RFID Wristbands in Ireland for Events and FestivalsWristbands Ireland
 
Developing Coaching Skills: Mine, Yours, Ours
Developing Coaching Skills: Mine, Yours, OursDeveloping Coaching Skills: Mine, Yours, Ours
Developing Coaching Skills: Mine, Yours, OursKaiNexus
 
PDT 89 - $1.4M - Seed - Plantee Innovations.pdf
PDT 89 - $1.4M - Seed - Plantee Innovations.pdfPDT 89 - $1.4M - Seed - Plantee Innovations.pdf
PDT 89 - $1.4M - Seed - Plantee Innovations.pdfHajeJanKamps
 
Intellectual Property Licensing Examples
Intellectual Property Licensing ExamplesIntellectual Property Licensing Examples
Intellectual Property Licensing Examplesamberjiles31
 
Ethical stalking by Mark Williams. UpliftLive 2024
Ethical stalking by Mark Williams. UpliftLive 2024Ethical stalking by Mark Williams. UpliftLive 2024
Ethical stalking by Mark Williams. UpliftLive 2024Winbusinessin
 
Introduction to The overview of GAAP LO 1-5.pptx
Introduction to The overview of GAAP LO 1-5.pptxIntroduction to The overview of GAAP LO 1-5.pptx
Introduction to The overview of GAAP LO 1-5.pptxJemalSeid25
 
AMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdf
AMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdfAMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdf
AMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdfJohnCarloValencia4
 
Borderless Access - Global B2B Panel book-unlock 2024
Borderless Access - Global B2B Panel book-unlock 2024Borderless Access - Global B2B Panel book-unlock 2024
Borderless Access - Global B2B Panel book-unlock 2024Borderless Access
 
Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024Borderless Access
 
Chicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdf
Chicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdfChicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdf
Chicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdfSourav Sikder
 
Tata Kelola Bisnis perushaan yang bergerak
Tata Kelola Bisnis perushaan yang bergerakTata Kelola Bisnis perushaan yang bergerak
Tata Kelola Bisnis perushaan yang bergerakEditores1
 
UNLEASHING THE POWER OF PROGRAMMATIC ADVERTISING
UNLEASHING THE POWER OF PROGRAMMATIC ADVERTISINGUNLEASHING THE POWER OF PROGRAMMATIC ADVERTISING
UNLEASHING THE POWER OF PROGRAMMATIC ADVERTISINGlokeshwarmaha
 
Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024Borderless Access
 
Q2 2024 APCO Geopolitical Radar - The Global Operating Environment for Business
Q2 2024 APCO Geopolitical Radar - The Global Operating Environment for BusinessQ2 2024 APCO Geopolitical Radar - The Global Operating Environment for Business
Q2 2024 APCO Geopolitical Radar - The Global Operating Environment for BusinessAPCO
 
HELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptx
HELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptxHELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptx
HELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptxHelene Heckrotte
 
Cracking the ‘Business Process Outsourcing’ Code Main.pptx
Cracking the ‘Business Process Outsourcing’ Code Main.pptxCracking the ‘Business Process Outsourcing’ Code Main.pptx
Cracking the ‘Business Process Outsourcing’ Code Main.pptxWorkforce Group
 

Kürzlich hochgeladen (20)

Slicing Work on Business Agility Meetup Berlin
Slicing Work on Business Agility Meetup BerlinSlicing Work on Business Agility Meetup Berlin
Slicing Work on Business Agility Meetup Berlin
 
Live-Streaming in the Music Industry Webinar
Live-Streaming in the Music Industry WebinarLive-Streaming in the Music Industry Webinar
Live-Streaming in the Music Industry Webinar
 
7movierulz.uk
7movierulz.uk7movierulz.uk
7movierulz.uk
 
Fabric RFID Wristbands in Ireland for Events and Festivals
Fabric RFID Wristbands in Ireland for Events and FestivalsFabric RFID Wristbands in Ireland for Events and Festivals
Fabric RFID Wristbands in Ireland for Events and Festivals
 
Developing Coaching Skills: Mine, Yours, Ours
Developing Coaching Skills: Mine, Yours, OursDeveloping Coaching Skills: Mine, Yours, Ours
Developing Coaching Skills: Mine, Yours, Ours
 
PDT 89 - $1.4M - Seed - Plantee Innovations.pdf
PDT 89 - $1.4M - Seed - Plantee Innovations.pdfPDT 89 - $1.4M - Seed - Plantee Innovations.pdf
PDT 89 - $1.4M - Seed - Plantee Innovations.pdf
 
Intellectual Property Licensing Examples
Intellectual Property Licensing ExamplesIntellectual Property Licensing Examples
Intellectual Property Licensing Examples
 
Investment Opportunity for Thailand's Automotive & EV Industries
Investment Opportunity for Thailand's Automotive & EV IndustriesInvestment Opportunity for Thailand's Automotive & EV Industries
Investment Opportunity for Thailand's Automotive & EV Industries
 
Ethical stalking by Mark Williams. UpliftLive 2024
Ethical stalking by Mark Williams. UpliftLive 2024Ethical stalking by Mark Williams. UpliftLive 2024
Ethical stalking by Mark Williams. UpliftLive 2024
 
Introduction to The overview of GAAP LO 1-5.pptx
Introduction to The overview of GAAP LO 1-5.pptxIntroduction to The overview of GAAP LO 1-5.pptx
Introduction to The overview of GAAP LO 1-5.pptx
 
AMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdf
AMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdfAMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdf
AMAZON SELLER VIRTUAL ASSISTANT PRODUCT RESEARCH .pdf
 
Borderless Access - Global B2B Panel book-unlock 2024
Borderless Access - Global B2B Panel book-unlock 2024Borderless Access - Global B2B Panel book-unlock 2024
Borderless Access - Global B2B Panel book-unlock 2024
 
Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024
 
Chicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdf
Chicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdfChicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdf
Chicago Medical Malpractice Lawyer Chicago Medical Malpractice Lawyer.pdf
 
Tata Kelola Bisnis perushaan yang bergerak
Tata Kelola Bisnis perushaan yang bergerakTata Kelola Bisnis perushaan yang bergerak
Tata Kelola Bisnis perushaan yang bergerak
 
UNLEASHING THE POWER OF PROGRAMMATIC ADVERTISING
UNLEASHING THE POWER OF PROGRAMMATIC ADVERTISINGUNLEASHING THE POWER OF PROGRAMMATIC ADVERTISING
UNLEASHING THE POWER OF PROGRAMMATIC ADVERTISING
 
Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024Borderless Access - Global Panel book-unlock 2024
Borderless Access - Global Panel book-unlock 2024
 
Q2 2024 APCO Geopolitical Radar - The Global Operating Environment for Business
Q2 2024 APCO Geopolitical Radar - The Global Operating Environment for BusinessQ2 2024 APCO Geopolitical Radar - The Global Operating Environment for Business
Q2 2024 APCO Geopolitical Radar - The Global Operating Environment for Business
 
HELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptx
HELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptxHELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptx
HELENE HECKROTTE'S PROFESSIONAL PORTFOLIO.pptx
 
Cracking the ‘Business Process Outsourcing’ Code Main.pptx
Cracking the ‘Business Process Outsourcing’ Code Main.pptxCracking the ‘Business Process Outsourcing’ Code Main.pptx
Cracking the ‘Business Process Outsourcing’ Code Main.pptx
 

Beijing Perl Workshop 2008 Hiveminder Secret Sauce