238
Everything but the Secret Sauce Modules, Magic and Monstrosities created for

Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Everything but the Secret Sauce

Modules, Magic and Monstrosities created for

Page 2: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Jesse VincentBest Practical

Page 3: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We make Hiveminder

Page 4: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

It’s not opensource

Page 5: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We built lots of cool stuff for Hiveminder

Page 6: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We opensource everything we can

Page 7: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Today’s AgendaTen tools and techniques to help you:

Find bugs faster

Build web apps

Ship software

Get input from users

Own the Inbox

Page 8: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Find bugs faster

Page 9: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

TAP-Harness-RemoteRun your tests over there.

Page 10: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

The Problem

Page 11: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Hiveminder has lots of tests

Page 12: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

That's a problem?

Page 13: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Yes.

Page 14: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

30 minutes to run tests on my Macbook

Page 15: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

(It took the same ona Macbook Pro)

Page 16: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What to do?

Page 17: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

TAP::Harness 3.0

Page 18: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

I have two cores!

Page 19: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

TAP::Harness::Parallel

Page 20: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

prove -j 5 --fork

Page 21: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

22 minutes

Page 22: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Better!

Page 23: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Not good.

Page 24: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Run tests on a server!

Page 25: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

rsync -rvp . server:ssh server "prove -j 9 t"

Page 26: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Better.

Page 27: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Annoying to run.

Page 28: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

TAP::Harness::Remote

Page 29: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Magic Remote Testing

Page 30: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

# ~/.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'

Page 31: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

prove --harness TAP::Harness::Remote t/*.t

Page 32: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

16.5 minutes

Page 33: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

prove --harness TAP::Harness::Remote -j 5 t/*.t

Page 34: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Magic Parallel Remote Testing

Page 35: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

12 minutes!

Page 36: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Not good enough for TDD

Page 37: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What I need is...

• Fast Servers

• Lots of Fast Servers

• Right Now

• Not Very Often

Page 38: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

A use for cloud computing!

Page 39: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

TAP::Harness::Remote::EC2

Page 40: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

4 hosts. -j 5

Page 41: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

89 seconds

Page 42: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

WIN

Page 43: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

EC2 CaveatsDefault Perl builds are really bad

(“XL” instances are great, though)

Machine Setup/Teardown is ~manual

The billing structure is crazy

Page 44: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What's next for::Harness::Remote::* ?

More polish on EC2 tools

Better EC2 watchdogs

More widespread usage

Page 45: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Carp::REPLIt's not quite a debugger

Page 46: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

How many of you use the Perl debugger?

Page 47: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

How many of you know how to use the

perl debugger?

Page 48: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

I don’t, either.

Page 49: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

So, what do I use?

Page 50: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

31b:~ jesse$ perl /tmp/contrived.plUndefined 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 = "does_".$to_call;21. no strict refs;22. $to_call->();23.}

Page 51: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

31b:~ jesse$ perl /tmp/contrived.plUndefined 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 = "does_".$to_call;21. no strict refs;22. use Carp; Carp::cluck("$to_call");23. $to_call->();24.}

Page 52: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Ick. A Print Statement.

Page 53: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Anyone else here use print statement

debugging?

Page 54: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

(Oh god, I hope I'm not alone)

Page 55: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

I want a simple debugger that's easier than print statements

Page 56: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

sartak created Carp::REPL

Page 57: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

A lightweight, modern, interactive debugger

Page 58: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Built on Devel::REPL

Page 59: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Carp::REPL Hooks into $SIG{__DIE__}

Page 60: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

$SIG{__WARN__} hooks are optional

Page 61: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

31b:~ jesse$ perl -MCarp::REPL /tmp/contrived.plUndefined 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).$

Page 62: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

That's not a shell prompt

Page 63: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

31b:~ jesse$ perl -MCarp::REPL /tmp/contrived.plUndefined 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.

Page 64: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

It's Perl, but it's not just Perl

Page 65: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

: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 @_

Page 66: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

$ :t0: 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.$

Page 67: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

$ :e$Env = { "\$to_call" => \do { my $v = 'does_not_exist' } };$ :u$ :uNow at /tmp/contrived.pl:9 (frame 2).$ :e$Env = { "\$to_call" => \do { my $v = 'exist' } };$ :uNow at /tmp/contrived.pl:27 (frame 3).$ :e$Env = { "\$to_call" => \do { my $v = '' } };$ :dNow at /tmp/contrived.pl:9 (frame 2).$ :e$Env = { "\$to_call" => \do { my $v = 'exist' } };$ warn join(", ",@$_a);exist at (eval 138) line 18, <FIN> line 4.

Page 68: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Why is my code 'warn'ing?

Maybe it's in an eval.

Or in a CPAN library.

No problem!

perl -MCarp::REPL=warn

Page 69: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

31b:~ jesse$ perl -MCarp::REPL=warn /tmp/contrived.plUse 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 = { "\$to_call" => \do { my $v = undef } };$ :qUndefined 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).$

Page 70: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

You know your 'print' statements?

Turn them into breakpoints.

Two ways:

s/print/warn/ and -MCarp::REPL=warnCarp::REPL::repl

Inserting breakpoints

Page 71: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

18.sub c { 19. my $to_call = shift;20. no strict 'refs';21. Carp::REPL::repl(); #Gimme a breakpoint here!22. $to_call = "does_".$to_call;23. $to_call->();24.}

Page 72: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What's next for Carp::REPL?

I have no idea.

It's simple.

It works.

Page 73: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Build web apps

Page 74: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Template::DeclareA Pure Perl Templating Engine

Page 75: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Perl has two big templating camps

Page 76: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Template::Toolkit

A DSL for templates

It's NOT Perl

Why should I learn a new language for templates?

Page 77: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

HTML::Mason

There's Perl inside.

Page 78: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

HTML::Mason

<mason><is><still>

<full><of>

<angle><brackets>

Page 79: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

HTML::Mason

</brackets></angle>

</of></full>

</still></is></mason>

Page 80: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

I'm Just A SimplePerl Hacker

Page 81: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

I needed something more Perlish

Page 82: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

template '/pages/mypage.html' => sub { html { head {}; body { h1 {'Hey, this is text'}; } }};

Page 83: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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 } } } }};

Page 84: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

But!

Content! Templates!

Design! Code!

OMGWTFBBQ!?

THAT'S WRONG!

Page 85: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

The person who told you it's wrong was

lying to you.

Page 86: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We're Perl hackers

Page 87: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Why are we writing our templates in another language?

Page 88: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

This is not 1997

Page 89: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

It’s 2008

Page 90: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

People use CSS for design now

Page 91: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Programmers still have to make templates

Page 92: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Templates run like CODE

Page 93: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Because they ARE code

Page 94: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Let's use our CODING tools to work with

them

Page 95: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

How about Refactoring?

Page 96: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Have you ever tried to refactor HTML?

Page 97: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

template 'mypage.html' => page { h1 { 'Two choices' }; div { attr { class => 'item' }; h2 { 'Item 1'}; }; div { attr { class => 'item' }; h2 { 'Item 2'}; };};

Page 98: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

template 'mypage.html' => page { h1 { 'Two choices' }; for ("Item 1", "Item 2") { item($_); }};

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

}

Page 99: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We can refactor templates!

Page 100: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Our HTML is magically valid

Page 101: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

(Syntax errors are... Syntax Errors)

Page 102: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Object Oriented Templates

Page 103: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Subclassing

It just works

We're using Perl's symbol table

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

Page 104: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Mixins

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

That's it.

Page 105: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Closures

Page 106: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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

Page 107: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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->(); }}

Page 108: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What's next for Template::Declare?

HTML Attribute Validation

Compile to .js

Page 109: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

CSS::SquishA compiler for Cascading Style Sheets

Page 110: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

The Problem

Many small CSS Files

Easy to work with

Painful to serve

Page 111: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

The Problem

One big CSS file

Painful to work with

Easy to serve

Page 112: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

How CSS worksmain.css:@import "yui-fonts.css";@import "base.css";@import "layout.css";@import "nav.css";@import "forms.css";@import "boxes.css";@import "login.css"; . . .

Page 113: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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.

Page 114: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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

Page 115: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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.

Page 116: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

How we use CSS::Squish

Instead of: <link rel="stylesheet" type="text/css" href="main.css”/>

We have this: <link rel="stylesheet" type="text/css" href="/css/squished/4a50a85044a6ba727f7aa0683ac21f7e.css”/>

Page 117: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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

Page 118: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What’s next for CSS::Squish

Refactor the MD5 hash bits from Jifty to CSS::Squish What else do you want?

Page 119: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Ship software

Page 120: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

App::ChangeLoggerGorgeous changelogs

Page 121: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We create a lot of software

Page 122: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

(145 Projects in bps-public svn)

Page 123: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We’re not so good at doing releases

Page 124: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Lots of manual work

Page 125: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

ShipIt can help with most of it

Page 126: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What about Changelog?

Page 127: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

svn log svn://svn.foo.com/MyProj > Changelog

Page 128: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Ship it!

Page 129: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Ew. No. Ick. Wrong. Bad.

Page 130: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

App::ChangeLogger

Page 131: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Two commands

• sort-changelog

• generate-changelog

Page 132: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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

Page 133: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 134: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 135: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 136: 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

Page 137: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

ShipwrightBuild. Ship.

Page 138: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

The Problem

CPAN

Page 139: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

The Problem

Everything that is not CPAN

Page 140: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We make RT

Page 141: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

RT has Many Dependencies

Page 142: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Apache::DBI

Apache::Request

Apache::Session

CGI::Cookie

CGI::Fast

CGI::SpeedyCGI

CSS::Squish

Cache::Simple::TimedExpiry

Calendar::Simple

Class::ReturnValue

DBD::Oracle

DBD::Pg

DBD::SQLite

DBD::mysql

DBIx::SearchBuilder

Data::ICal

Digest::MD5

Digest::base

File::Find

File::Glob

File::ShareDir

File::Spec

File::Temp

GD::Graph

GD::Text

Getopt::Long

GnuPG::Interface

HTML::Entities

HTML::Form

HTML::FormatText

HTML::Mason

HTML::RewriteAttributes

HTML::Scrubber

HTML::TokeParser

HTML::TreeBuilder

HTTP::Request::Common

HTTP::Server::Simple

HTTP::Server::Simple::Mason

IPC::Run

IPC::Run::SafeHandles

LWP::UserAgent

Locale::Maketext

Locale::Maketext::Fuzzy

Locale::Maketext::Lexicon

Log::Dispatch

Log::Dispatch::Perl

MIME::Entity

MIME::Types

Mail::Mailer

Module::Refresh

Module::Versions::Report

Net::SMTP

PerlIO::eol

Pod::Usage

Regexp::Common

Scalar::Util

String::ShellQuote

Term::ReadKey

Term::ReadLine

Test::Builder

Test::Deep

Test::Expect

Test::HTTP::Server::Simple

Test::WWW::Mechanize

Test::Warn

Text::ParseWords

Text::Quoted

Text::Template

Text::WikiFormat

Text::Wrapper

Time::HiRes

Time::ParseDate

Tree::Simple

UNIVERSAL::require

WWW::Mechanize

XML::RSS

XML::Simple

Page 143: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

116 CPAN distributions once you do the

recursion

Page 144: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

And then there are the external libraries and

programs

Page 145: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

• perl

• expat

• fontconfig

• freetype

• libgd

• libjpeg

• libpng

• readline

• zlib

• gnupg

• mysql

• postgresql

Page 146: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Plagger beats RT.(It has 135 CPAN deps)

Page 147: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

RT should be easy to install

Page 148: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

All software should be easy to install

Page 149: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What Shipwright does

Tracks all dependencies in version control

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

Page 150: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What Shipwright does

Computes a full dependency order

No more recursive CPAN installs

Page 151: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What Shipwright does

Keeps all packages in version control

No more “that site is down”

Page 152: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What Shipwright does

Automates multi-package builds

(No manual intervention)

Page 153: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What Shipwright does

Makes installed packages relocatable

(Wraps all scripts and binaries)

Page 154: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What Shipwright does

Makes historical builds reproducible

(No more “Oh. that API changed in 2.0”)

Page 155: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Shipwright and CPAN

CPAN-friendly (Not CPAN-only)

CPAN dist import

Automatic CPAN dependency resolution

Full build ordering

No more CPAN dependency hell.

Page 156: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Shipwright and C

Native support for autoconfiscated packages

No support for magic C->C dependency resolutions

Page 157: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Shipwright and Ruby

Not Ruby friendly :( (not Ruby unfriendly)

No Gem support yet

Hackathon this weekend?

Page 158: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What you can ship

A platform-neutral source distribution

Platform-specific binary distributions

Page 159: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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)

Page 160: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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

Page 161: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Using a Shipwright Vessel

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

• ln -s /usr/local/myproject/bin/myprogram /usr/local/bin

Page 162: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What's next for Shipwright?

Build tool usability improvementsRuby support?

Page 163: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Get input from users

Page 164: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

The Feedback Box Let users make suggestions everywhere

Page 165: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

mailto: links?

Page 166: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

getsatisfaction.com?

Page 167: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 168: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 169: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 170: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 171: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

I give up.

Page 172: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Don't make your users give up.

Page 173: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Feedback is important!

Page 174: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Feedback can be easy!

Page 175: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 176: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 177: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 178: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 179: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

If you make it easy for users to give you

feedback...

Page 180: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

You can capture lots of good information!

Page 181: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

From: Jesse Vincent / Feedback <[email protected]> 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 <[email protected]> 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/

Page 182: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Collect lots of feedback

Page 183: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Reply to lots of feedback

Page 184: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Conversations make users happy

Page 185: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Happy = Loyal

Page 186: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Own the inbox

Page 187: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Net::IMAP::ServerAn IMAP Server in Pure Perl

Page 188: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Why?

Page 189: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Offline Access

Page 190: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

iPhone Access

Page 191: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Desktop Access

Page 192: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Really, we just like things that aresick and wrong.

Page 193: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Now Hiveminder users can take their tasks

with them

Page 194: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Update your tasks while offline

Page 195: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What sort of mailbox do you use with that?

Page 196: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

How about Perl?

Page 197: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Net::IMAP::Server

Page 198: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Complete RFC 3501 Implementation

Page 199: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Write your own backends

Page 200: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Let’s write one now

Page 201: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

How about a Spam server?

Page 202: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

package Demo::IMAP::Auth;use base 'Net::IMAP::Server::DefaultAuth';

sub auth_plain { my ($self, $user, $pass ) = @_; # XXX DO AUTH CHECK return 1;}

Page 203: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

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 => "INBOX", is_inbox => 1);}

Page 204: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

package Demo::IMAP::Mailbox;use base qw/Net::IMAP::Server::Mailbox/;

my $msg = Net::IMAP::Server::Message->new(<<'EOM');From: [email protected]: [email protected]: This is a test message!

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

sub load_data { my $self = shift; $self->add_message($msg);}

Page 205: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

#!/usr/bin/perl

use Net::IMAP::Server;Net::IMAP::Server->new( auth_class => "Demo::IMAP::Auth", model_class => "Demo::IMAP::Model", user => 'nobody', port => 143, ssl_port => 993)->run();

Page 206: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

It runs! Ship it!(Just add SSL certificates)

Page 207: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

with.hmAssign tasks by email

Page 208: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We wanted to make it easy to work with

Hiveminder by email.

Page 209: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

We had a few ideas...

Page 210: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Cc:

Page 211: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Too clumsy

Page 212: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Bcc:

Page 213: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Too likely to break

Page 214: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Commands in the body

Page 215: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Too ugly

Page 216: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

hm.

Page 217: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

What could we do?

Page 218: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

DNS Hacks!Everybody loves DNS hacks

Page 219: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

.hm

Page 220: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Hiveminder!

Page 221: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 222: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

.hm

Page 223: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Heard and McDonald Islands!

Page 224: Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Page 225: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

with.hm

Page 226: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Send your email with Hiveminder

Page 227: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Wildcard MX Record!

Page 228: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

*.with.hm ➡ mail.hiveminder.com

Page 229: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

An Example:

From: [email protected]

To: [email protected]

Subject: Could you release a new version of plagger?

Page 230: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

My mail server looks up bulknews.net.with.hm

Page 231: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

“Oh. That's handled by mail.hiveminder.com”

Page 232: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

mail.hiveminder.com unwraps the address.

Page 233: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Hiveminder creates a task for [email protected]

Page 234: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Hiveminder emails [email protected]

Page 235: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Preventing Spam

Page 237: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

I bet you can come up with even scarier uses

of wildcard DNS.

Page 238: Beijing Perl Workshop 2008 Hiveminder Secret Sauce

Thank you!