SlideShare a Scribd company logo
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
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?
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 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!
.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!

More Related Content

What's hot

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
Fernando 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 2010
singingfish
 
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
olegmmiller
 
Getting testy with Perl
Getting testy with PerlGetting testy with Perl
Getting testy with Perl
Workhorse Computing
 
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
Marcin 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 friend
Kirill Chebunin
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
Salaudeen Rajack
 
Developing apps using Perl
Developing apps using PerlDeveloping apps using Perl
Developing apps using Perl
Anatoly 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 Cracow
Kacper Gunia
 
Writing Pluggable Software
Writing Pluggable SoftwareWriting Pluggable Software
Writing Pluggable Software
Tatsuhiko Miyagawa
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpec
CiaranMcNulty
 
非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumaki非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumaki
keroyonn
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
Wim Godden
 
Mojolicious - A new hope
Mojolicious - A new hopeMojolicious - A new hope
Mojolicious - A new hope
Marcus 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 perl
Dean Hamstead
 
Effective Benchmarks
Effective BenchmarksEffective Benchmarks
Effective Benchmarks
Workhorse Computing
 
ReactPHP
ReactPHPReactPHP
ReactPHP
Philip Norton
 
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
Jeremy 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 - 4Developers
Kacper Gunia
 
New in php 7
New in php 7New in php 7
New in php 7
Vic Metcalfe
 

What's hot (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
 

Similar to 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 Sauce
Jesse 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 better
ZendCon
 
Umleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB appUmleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB app
Lenz Gschwendtner
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
chartjes
 
PSGI and Plack from first principles
PSGI and Plack from first principlesPSGI and Plack from first principles
PSGI and Plack from first principles
Perl Careers
 
When To Use Ruby On Rails
When To Use Ruby On RailsWhen To Use Ruby On Rails
When To Use Ruby On Rails
dosire
 
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
PVS-Studio
 
Capistrano
CapistranoCapistrano
Capistrano
Jason 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 Jasmine
Paulo Ragonha
 
Background Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbBackground Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRb
Juan Maiz
 
Perl Teach-In (part 1)
Perl Teach-In (part 1)Perl Teach-In (part 1)
Perl Teach-In (part 1)
Dave Cross
 
Capistrano2
Capistrano2Capistrano2
Capistrano2
Luca Mearelli
 
Capistrano
CapistranoCapistrano
Capistrano
Travis Roberts
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
Clinton Dreisbach
 
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
phpbarcelona
 
Sinatra
SinatraSinatra
RubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - KeynoteRubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - Keynote
Dr Nic Williams
 
Curscatalyst
CurscatalystCurscatalyst
Curscatalyst
Kar Juan
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
diego_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
 

Similar to 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)
 

More from Jesse Vincent

Building a keyboard from scratch
Building a keyboard from scratchBuilding a keyboard from scratch
Building a keyboard from scratch
Jesse Vincent
 
So, I made a keyboard
So, I made a keyboardSo, I made a keyboard
So, I made a keyboard
Jesse Vincent
 
Dancing App Stores - Android Open 2011
Dancing App Stores - Android Open 2011Dancing App Stores - Android Open 2011
Dancing App Stores - Android Open 2011
Jesse 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 2011
Jesse Vincent
 
Perl 5.16 and beyond
Perl 5.16 and beyondPerl 5.16 and beyond
Perl 5.16 and beyond
Jesse 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 beyond
Jesse Vincent
 
RT4 - The whole sordid story
RT4 - The whole sordid storyRT4 - The whole sordid story
RT4 - The whole sordid story
Jesse Vincent
 
K-9 Mail for Android
K-9 Mail for AndroidK-9 Mail for Android
K-9 Mail for Android
Jesse Vincent
 
Perl 5.12.0
Perl 5.12.0Perl 5.12.0
Perl 5.12.0
Jesse Vincent
 
P2P Bug Tracking with SD
P2P Bug Tracking with SDP2P Bug Tracking with SD
P2P Bug Tracking with SD
Jesse 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 system
Jesse 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 Hackery
Jesse Vincent
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking system
Jesse Vincent
 
Prophet - Beijing Perl Workshop
Prophet - Beijing Perl WorkshopProphet - Beijing Perl Workshop
Prophet - Beijing Perl Workshop
Jesse Vincent
 
A brief introduction to RTIR
A brief introduction to RTIRA brief introduction to RTIR
A brief introduction to RTIR
Jesse Vincent
 
An introduction to RTIR
An introduction to RTIRAn introduction to RTIR
An introduction to RTIR
Jesse 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 Cloud
Jesse Vincent
 
Web 2.0 is Sharecropping
Web 2.0 is SharecroppingWeb 2.0 is Sharecropping
Web 2.0 is Sharecropping
Jesse 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 database
Jesse Vincent
 

More from 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
 

Recently uploaded

The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...
The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...
The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...
APCO
 
Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...
Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...
Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...
my Pandit
 
Innovation Management Frameworks: Your Guide to Creativity & Innovation
Innovation Management Frameworks: Your Guide to Creativity & InnovationInnovation Management Frameworks: Your Guide to Creativity & Innovation
Innovation Management Frameworks: Your Guide to Creativity & Innovation
Operational Excellence Consulting
 
Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024
Kirill Klimov
 
Best practices for project execution and delivery
Best practices for project execution and deliveryBest practices for project execution and delivery
Best practices for project execution and delivery
CLIVE MINCHIN
 
Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...
Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...
Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...
my Pandit
 
Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...
Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...
Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...
SOFTTECHHUB
 
Digital Transformation Frameworks: Driving Digital Excellence
Digital Transformation Frameworks: Driving Digital ExcellenceDigital Transformation Frameworks: Driving Digital Excellence
Digital Transformation Frameworks: Driving Digital Excellence
Operational Excellence Consulting
 
Structural Design Process: Step-by-Step Guide for Buildings
Structural Design Process: Step-by-Step Guide for BuildingsStructural Design Process: Step-by-Step Guide for Buildings
Structural Design Process: Step-by-Step Guide for Buildings
Chandresh Chudasama
 
The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...
The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...
The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...
Stephen Cashman
 
Digital Marketing with a Focus on Sustainability
Digital Marketing with a Focus on SustainabilityDigital Marketing with a Focus on Sustainability
Digital Marketing with a Focus on Sustainability
sssourabhsharma
 
BeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdfBeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdf
DerekIwanaka1
 
amptalk_RecruitingDeck_english_2024.06.05
amptalk_RecruitingDeck_english_2024.06.05amptalk_RecruitingDeck_english_2024.06.05
amptalk_RecruitingDeck_english_2024.06.05
marketing317746
 
一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理
一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理
一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理
taqyea
 
Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024
FelixPerez547899
 
How to Implement a Real Estate CRM Software
How to Implement a Real Estate CRM SoftwareHow to Implement a Real Estate CRM Software
How to Implement a Real Estate CRM Software
SalesTown
 
Building Your Employer Brand with Social Media
Building Your Employer Brand with Social MediaBuilding Your Employer Brand with Social Media
Building Your Employer Brand with Social Media
LuanWise
 
Zodiac Signs and Food Preferences_ What Your Sign Says About Your Taste
Zodiac Signs and Food Preferences_ What Your Sign Says About Your TasteZodiac Signs and Food Preferences_ What Your Sign Says About Your Taste
Zodiac Signs and Food Preferences_ What Your Sign Says About Your Taste
my Pandit
 
Understanding User Needs and Satisfying Them
Understanding User Needs and Satisfying ThemUnderstanding User Needs and Satisfying Them
Understanding User Needs and Satisfying Them
Aggregage
 
How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....
How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....
How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....
Lacey Max
 

Recently uploaded (20)

The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...
The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...
The APCO Geopolitical Radar - Q3 2024 The Global Operating Environment for Bu...
 
Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...
Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...
Unveiling the Dynamic Personalities, Key Dates, and Horoscope Insights: Gemin...
 
Innovation Management Frameworks: Your Guide to Creativity & Innovation
Innovation Management Frameworks: Your Guide to Creativity & InnovationInnovation Management Frameworks: Your Guide to Creativity & Innovation
Innovation Management Frameworks: Your Guide to Creativity & Innovation
 
Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024
 
Best practices for project execution and delivery
Best practices for project execution and deliveryBest practices for project execution and delivery
Best practices for project execution and delivery
 
Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...
Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...
Taurus Zodiac Sign: Unveiling the Traits, Dates, and Horoscope Insights of th...
 
Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...
Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...
Hamster Kombat' Telegram Game Surpasses 100 Million Players—Token Release Sch...
 
Digital Transformation Frameworks: Driving Digital Excellence
Digital Transformation Frameworks: Driving Digital ExcellenceDigital Transformation Frameworks: Driving Digital Excellence
Digital Transformation Frameworks: Driving Digital Excellence
 
Structural Design Process: Step-by-Step Guide for Buildings
Structural Design Process: Step-by-Step Guide for BuildingsStructural Design Process: Step-by-Step Guide for Buildings
Structural Design Process: Step-by-Step Guide for Buildings
 
The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...
The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...
The Heart of Leadership_ How Emotional Intelligence Drives Business Success B...
 
Digital Marketing with a Focus on Sustainability
Digital Marketing with a Focus on SustainabilityDigital Marketing with a Focus on Sustainability
Digital Marketing with a Focus on Sustainability
 
BeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdfBeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdf
 
amptalk_RecruitingDeck_english_2024.06.05
amptalk_RecruitingDeck_english_2024.06.05amptalk_RecruitingDeck_english_2024.06.05
amptalk_RecruitingDeck_english_2024.06.05
 
一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理
一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理
一比一原版新西兰奥塔哥大学毕业证(otago毕业证)如何办理
 
Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024
 
How to Implement a Real Estate CRM Software
How to Implement a Real Estate CRM SoftwareHow to Implement a Real Estate CRM Software
How to Implement a Real Estate CRM Software
 
Building Your Employer Brand with Social Media
Building Your Employer Brand with Social MediaBuilding Your Employer Brand with Social Media
Building Your Employer Brand with Social Media
 
Zodiac Signs and Food Preferences_ What Your Sign Says About Your Taste
Zodiac Signs and Food Preferences_ What Your Sign Says About Your TasteZodiac Signs and Food Preferences_ What Your Sign Says About Your Taste
Zodiac Signs and Food Preferences_ What Your Sign Says About Your Taste
 
Understanding User Needs and Satisfying Them
Understanding User Needs and Satisfying ThemUnderstanding User Needs and Satisfying Them
Understanding User Needs and Satisfying Them
 
How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....
How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....
How are Lilac French Bulldogs Beauty Charming the World and Capturing Hearts....
 

Beijing Perl Workshop 2008 Hiveminder Secret Sauce