Beijing Perl Workshop 2008 Hiveminder Secret Sauce
-
Upload
jesse-vincent -
Category
Business
-
view
3.151 -
download
1
description
Transcript of Beijing Perl Workshop 2008 Hiveminder Secret Sauce
![Page 1: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/1.jpg)
Everything but the Secret Sauce
Modules, Magic and Monstrosities created for
![Page 2: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/2.jpg)
Jesse VincentBest Practical
![Page 3: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/3.jpg)
We make Hiveminder
![Page 4: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/4.jpg)
It’s not opensource
![Page 5: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/5.jpg)
We built lots of cool stuff for Hiveminder
![Page 6: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/6.jpg)
We opensource everything we can
![Page 7: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/7.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/8.jpg)
Find bugs faster
![Page 9: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/9.jpg)
TAP-Harness-RemoteRun your tests over there.
![Page 10: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/10.jpg)
The Problem
![Page 11: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/11.jpg)
Hiveminder has lots of tests
![Page 12: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/12.jpg)
That's a problem?
![Page 13: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/13.jpg)
Yes.
![Page 14: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/14.jpg)
30 minutes to run tests on my Macbook
![Page 15: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/15.jpg)
(It took the same ona Macbook Pro)
![Page 16: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/16.jpg)
What to do?
![Page 17: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/17.jpg)
TAP::Harness 3.0
![Page 18: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/18.jpg)
I have two cores!
![Page 19: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/19.jpg)
TAP::Harness::Parallel
![Page 20: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/20.jpg)
prove -j 5 --fork
![Page 21: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/21.jpg)
22 minutes
![Page 22: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/22.jpg)
Better!
![Page 23: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/23.jpg)
Not good.
![Page 24: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/24.jpg)
Run tests on a server!
![Page 25: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/25.jpg)
rsync -rvp . server:ssh server "prove -j 9 t"
![Page 26: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/26.jpg)
Better.
![Page 27: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/27.jpg)
Annoying to run.
![Page 28: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/28.jpg)
TAP::Harness::Remote
![Page 29: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/29.jpg)
Magic Remote Testing
![Page 30: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/30.jpg)
# ~/.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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/31.jpg)
prove --harness TAP::Harness::Remote t/*.t
![Page 32: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/32.jpg)
16.5 minutes
![Page 33: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/33.jpg)
prove --harness TAP::Harness::Remote -j 5 t/*.t
![Page 34: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/34.jpg)
Magic Parallel Remote Testing
![Page 35: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/35.jpg)
12 minutes!
![Page 36: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/36.jpg)
Not good enough for TDD
![Page 37: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/37.jpg)
What I need is...
• Fast Servers
• Lots of Fast Servers
• Right Now
• Not Very Often
![Page 38: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/38.jpg)
A use for cloud computing!
![Page 39: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/39.jpg)
TAP::Harness::Remote::EC2
![Page 40: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/40.jpg)
4 hosts. -j 5
![Page 41: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/41.jpg)
89 seconds
![Page 42: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/42.jpg)
WIN
![Page 43: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/43.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/44.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/45.jpg)
Carp::REPLIt's not quite a debugger
![Page 46: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/46.jpg)
How many of you use the Perl debugger?
![Page 47: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/47.jpg)
How many of you know how to use the
perl debugger?
![Page 48: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/48.jpg)
I don’t, either.
![Page 49: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/49.jpg)
So, what do I use?
![Page 50: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/50.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/51.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/52.jpg)
Ick. A Print Statement.
![Page 53: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/53.jpg)
Anyone else here use print statement
debugging?
![Page 54: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/54.jpg)
(Oh god, I hope I'm not alone)
![Page 55: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/55.jpg)
I want a simple debugger that's easier than print statements
![Page 56: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/56.jpg)
sartak created Carp::REPL
![Page 57: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/57.jpg)
A lightweight, modern, interactive debugger
![Page 58: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/58.jpg)
Built on Devel::REPL
![Page 59: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/59.jpg)
Carp::REPL Hooks into $SIG{__DIE__}
![Page 60: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/60.jpg)
$SIG{__WARN__} hooks are optional
![Page 61: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/61.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/62.jpg)
That's not a shell prompt
![Page 63: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/63.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/64.jpg)
It's Perl, but it's not just Perl
![Page 65: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/65.jpg)
: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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/66.jpg)
$ :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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/67.jpg)
$ :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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/68.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/69.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/70.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/71.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/72.jpg)
What's next for Carp::REPL?
I have no idea.
It's simple.
It works.
![Page 73: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/73.jpg)
Build web apps
![Page 74: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/74.jpg)
Template::DeclareA Pure Perl Templating Engine
![Page 75: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/75.jpg)
Perl has two big templating camps
![Page 76: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/76.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/77.jpg)
HTML::Mason
There's Perl inside.
![Page 78: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/78.jpg)
HTML::Mason
<mason><is><still>
<full><of>
<angle><brackets>
![Page 79: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/79.jpg)
HTML::Mason
</brackets></angle>
</of></full>
</still></is></mason>
![Page 80: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/80.jpg)
I'm Just A SimplePerl Hacker
![Page 81: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/81.jpg)
I needed something more Perlish
![Page 82: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/82.jpg)
template '/pages/mypage.html' => sub { html { head {}; body { h1 {'Hey, this is text'}; } }};
![Page 83: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/83.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/84.jpg)
But!
Content! Templates!
Design! Code!
OMGWTFBBQ!?
THAT'S WRONG!
![Page 85: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/85.jpg)
The person who told you it's wrong was
lying to you.
![Page 86: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/86.jpg)
We're Perl hackers
![Page 87: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/87.jpg)
Why are we writing our templates in another language?
![Page 88: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/88.jpg)
This is not 1997
![Page 89: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/89.jpg)
It’s 2008
![Page 90: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/90.jpg)
People use CSS for design now
![Page 91: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/91.jpg)
Programmers still have to make templates
![Page 92: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/92.jpg)
Templates run like CODE
![Page 93: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/93.jpg)
Because they ARE code
![Page 94: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/94.jpg)
Let's use our CODING tools to work with
them
![Page 95: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/95.jpg)
How about Refactoring?
![Page 96: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/96.jpg)
Have you ever tried to refactor HTML?
![Page 97: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/97.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/98.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/99.jpg)
We can refactor templates!
![Page 100: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/100.jpg)
Our HTML is magically valid
![Page 101: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/101.jpg)
(Syntax errors are... Syntax Errors)
![Page 102: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/102.jpg)
Object Oriented Templates
![Page 103: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/103.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/104.jpg)
Mixins
alias Some::Template::Library under '/path';
That's it.
![Page 105: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/105.jpg)
Closures
![Page 106: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/106.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/107.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/108.jpg)
What's next for Template::Declare?
HTML Attribute Validation
Compile to .js
![Page 109: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/109.jpg)
CSS::SquishA compiler for Cascading Style Sheets
![Page 110: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/110.jpg)
The Problem
Many small CSS Files
Easy to work with
Painful to serve
![Page 111: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/111.jpg)
The Problem
One big CSS file
Painful to work with
Easy to serve
![Page 112: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/112.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/113.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/114.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/115.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/116.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/117.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/118.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/119.jpg)
Ship software
![Page 120: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/120.jpg)
App::ChangeLoggerGorgeous changelogs
![Page 121: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/121.jpg)
We create a lot of software
![Page 122: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/122.jpg)
(145 Projects in bps-public svn)
![Page 123: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/123.jpg)
We’re not so good at doing releases
![Page 124: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/124.jpg)
Lots of manual work
![Page 125: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/125.jpg)
ShipIt can help with most of it
![Page 126: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/126.jpg)
What about Changelog?
![Page 127: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/127.jpg)
svn log svn://svn.foo.com/MyProj > Changelog
![Page 128: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/128.jpg)
Ship it!
![Page 129: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/129.jpg)
Ew. No. Ick. Wrong. Bad.
![Page 130: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/130.jpg)
App::ChangeLogger
![Page 131: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/131.jpg)
Two commands
• sort-changelog
• generate-changelog
![Page 132: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/132.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/133.jpg)
![Page 134: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/134.jpg)
![Page 135: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/135.jpg)
![Page 136: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/136.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/137.jpg)
ShipwrightBuild. Ship.
![Page 138: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/138.jpg)
The Problem
CPAN
![Page 139: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/139.jpg)
The Problem
Everything that is not CPAN
![Page 140: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/140.jpg)
We make RT
![Page 141: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/141.jpg)
RT has Many Dependencies
![Page 142: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/142.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/143.jpg)
116 CPAN distributions once you do the
recursion
![Page 144: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/144.jpg)
And then there are the external libraries and
programs
![Page 145: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/145.jpg)
• perl
• expat
• fontconfig
• freetype
• libgd
• libjpeg
• libpng
• readline
• zlib
• gnupg
• mysql
• postgresql
![Page 146: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/146.jpg)
Plagger beats RT.(It has 135 CPAN deps)
![Page 147: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/147.jpg)
RT should be easy to install
![Page 148: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/148.jpg)
All software should be easy to install
![Page 149: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/149.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/150.jpg)
What Shipwright does
Computes a full dependency order
No more recursive CPAN installs
![Page 151: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/151.jpg)
What Shipwright does
Keeps all packages in version control
No more “that site is down”
![Page 152: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/152.jpg)
What Shipwright does
Automates multi-package builds
(No manual intervention)
![Page 153: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/153.jpg)
What Shipwright does
Makes installed packages relocatable
(Wraps all scripts and binaries)
![Page 154: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/154.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/155.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/156.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/157.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/158.jpg)
What you can ship
A platform-neutral source distribution
Platform-specific binary distributions
![Page 159: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/159.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/160.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/161.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/162.jpg)
What's next for Shipwright?
Build tool usability improvementsRuby support?
![Page 163: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/163.jpg)
Get input from users
![Page 164: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/164.jpg)
The Feedback Box Let users make suggestions everywhere
![Page 165: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/165.jpg)
mailto: links?
![Page 166: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/166.jpg)
getsatisfaction.com?
![Page 167: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/167.jpg)
![Page 168: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/168.jpg)
![Page 169: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/169.jpg)
![Page 170: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/170.jpg)
![Page 171: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/171.jpg)
I give up.
![Page 172: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/172.jpg)
Don't make your users give up.
![Page 173: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/173.jpg)
Feedback is important!
![Page 174: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/174.jpg)
Feedback can be easy!
![Page 175: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/175.jpg)
![Page 176: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/176.jpg)
![Page 177: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/177.jpg)
![Page 178: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/178.jpg)
![Page 179: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/179.jpg)
If you make it easy for users to give you
feedback...
![Page 180: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/180.jpg)
You can capture lots of good information!
![Page 181: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/181.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/182.jpg)
Collect lots of feedback
![Page 183: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/183.jpg)
Reply to lots of feedback
![Page 184: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/184.jpg)
Conversations make users happy
![Page 185: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/185.jpg)
Happy = Loyal
![Page 186: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/186.jpg)
Own the inbox
![Page 187: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/187.jpg)
Net::IMAP::ServerAn IMAP Server in Pure Perl
![Page 188: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/188.jpg)
Why?
![Page 189: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/189.jpg)
Offline Access
![Page 190: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/190.jpg)
iPhone Access
![Page 191: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/191.jpg)
Desktop Access
![Page 192: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/192.jpg)
Really, we just like things that aresick and wrong.
![Page 193: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/193.jpg)
Now Hiveminder users can take their tasks
with them
![Page 194: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/194.jpg)
Update your tasks while offline
![Page 195: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/195.jpg)
What sort of mailbox do you use with that?
![Page 196: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/196.jpg)
How about Perl?
![Page 197: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/197.jpg)
Net::IMAP::Server
![Page 198: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/198.jpg)
Complete RFC 3501 Implementation
![Page 199: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/199.jpg)
Write your own backends
![Page 200: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/200.jpg)
Let’s write one now
![Page 201: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/201.jpg)
How about a Spam server?
![Page 202: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/202.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/203.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/204.jpg)
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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/205.jpg)
#!/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](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/206.jpg)
It runs! Ship it!(Just add SSL certificates)
![Page 207: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/207.jpg)
with.hmAssign tasks by email
![Page 208: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/208.jpg)
We wanted to make it easy to work with
Hiveminder by email.
![Page 209: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/209.jpg)
We had a few ideas...
![Page 210: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/210.jpg)
Cc:
![Page 211: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/211.jpg)
Too clumsy
![Page 212: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/212.jpg)
Bcc:
![Page 213: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/213.jpg)
Too likely to break
![Page 214: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/214.jpg)
Commands in the body
![Page 215: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/215.jpg)
Too ugly
![Page 216: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/216.jpg)
hm.
![Page 217: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/217.jpg)
What could we do?
![Page 218: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/218.jpg)
DNS Hacks!Everybody loves DNS hacks
![Page 219: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/219.jpg)
.hm
![Page 220: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/220.jpg)
Hiveminder!
![Page 221: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/221.jpg)
![Page 222: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/222.jpg)
.hm
![Page 223: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/223.jpg)
Heard and McDonald Islands!
![Page 224: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/224.jpg)
![Page 225: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/225.jpg)
with.hm
![Page 226: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/226.jpg)
Send your email with Hiveminder
![Page 227: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/227.jpg)
Wildcard MX Record!
![Page 228: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/228.jpg)
*.with.hm ➡ mail.hiveminder.com
![Page 230: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/230.jpg)
My mail server looks up bulknews.net.with.hm
![Page 231: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/231.jpg)
“Oh. That's handled by mail.hiveminder.com”
![Page 232: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/232.jpg)
mail.hiveminder.com unwraps the address.
![Page 233: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/233.jpg)
Hiveminder creates a task for [email protected]
![Page 234: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/234.jpg)
Hiveminder emails [email protected]
![Page 235: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/235.jpg)
Preventing Spam
![Page 237: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/237.jpg)
I bet you can come up with even scarier uses
of wildcard DNS.
![Page 238: Beijing Perl Workshop 2008 Hiveminder Secret Sauce](https://reader038.fdocuments.in/reader038/viewer/2022103013/540504b08d7f729e768b49b4/html5/thumbnails/238.jpg)
Thank you!