aboutsummaryrefslogtreecommitdiff
path: root/docs/presentation/sietima.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/presentation/sietima.html')
-rw-r--r--docs/presentation/sietima.html221
1 files changed, 0 insertions, 221 deletions
diff --git a/docs/presentation/sietima.html b/docs/presentation/sietima.html
deleted file mode 100644
index 6b82e72..0000000
--- a/docs/presentation/sietima.html
+++ /dev/null
@@ -1,221 +0,0 @@
-<html>
- <head>
- <link rel="stylesheet" href="css/reveal.css">
- <link rel="stylesheet" href="css/theme/white.css" id="theme">
- <link rel="stylesheet" href="css2/github-gist.css">
- <meta http-equiv="content-type" content="text/html; charset=utf-8">
- <title>Sietima — a minimalist MLM</title>
- </head>
- <body>
- <div class="reveal">
- <div class="slides">
- <section>
- <h1>Sietima — a minimalist MLM</h1>
- <p>Author: dakkar &lt;<a href="mailto:dakkar@thenautilus.net">dakkar@thenautilus.net</a>&gt;</p>
- <p>Date: 2016-08-08</p>
- </section>
- <section>
- <h2>A bit of history</h2>
- <section>
- <h3>Siesta</h3>
- <aside class="notes">
- <p>Yes, I ran Siesta. It works!</p>
- <p>I ran 3 lists, with 10-30 people on each</p>
- </aside>
- </section>
- <section>
- <p>written in 2003</p>
- </section>
- <section>
- <p>14 years ago</p>
- </section>
- <section>
- <p><code>Class::DBI</code></p>
- <p class="fragment">no <code>Moo</code></p>
- <p class="fragment">Perl 5.8</p>
- <aside class="notes">
- <p>Surely things have got better!</p>
- <p>Can I rewrite it better?</p>
- </aside>
- </section>
- </section>
- <section>
- <h2>Plugin style</h2>
- <section>
- <p>simple base class</p>
- <pre><code class="perl">
-sub handle_mail($self,$incoming_mail) {
- my (@outgoing_messages) = $self->munge_mail($incoming_mail);
- for my $outgoing_message (@outgoing_messages) {
- $self->send_message($outgoing_message);
- }
- return;
-}
- </code></pre>
- </section>
- <section>
- <p>provide all the needed extensions points</p>
- <pre><code class="perl">
-sub munge_mail($self,$incoming_mail) {
- return Sietima::Message->new({
- mail => $incoming_mail,
- from => $self->return_path,
- to => $self->subscribers_to_send_to($incoming_mail),
- });
-}
- </code></pre>
- </section>
- <section>
- <p>but no more than that</p>
- </section>
- <section>
- <p>traits / roles</p>
- <ul class="fragment">
- <li><code>AvoidDups</code></li>
- <li><code>Debounce</code></li>
- <li><code>Headers</code></li>
- <li><code>ManualSubscription</code></li>
- <li><code>NoMail</code></li>
- <li><code>ReplyTo</code></li>
- <li><code>SubjectTag</code></li>
- <li><code>SubscriberOnly::Drop</code></li>
- <li><code>SubscriberOnly::Moderate</code></li>
- </ul>
- </section>
- <section>
- <p>try to avoid cross-trait dependencies</p>
- <p class="fragment">«<code>ReplyTo</code> needs <code>WithPostAddress</code>» is fine</p>
- <p class="fragment">but «<code>SubscriberOnly::Moderate</code> should be added after <code>Debounce</code>» is not</p>
- <p class="fragment">sadly I couldn't avoid it, suggestions welcome</p>
- </section>
- </section>
- <section>
- <h2>Driver</h2>
- <section>
- <p><code>App::Spec</code></p>
- </section>
- <section>
- <p>minimal spec in base class</p>
- <pre><code class="perl">
-sub command_line_spec($self) {
- return {
- name => 'sietima',
- title => 'a simple mailing list manager',
- subcommands => {
- send => {
- op => 'handle_mail_from_stdin',
- summary => 'send email from STDIN',
- },
- },
- };
-}
- </code></pre>
- </section>
- <section>
- <p>enriched by plugins</p>
- <pre><code class="perl">
-around command_line_spec => sub ($orig,$self) {
- my $spec = $self->$orig();
-
- my $list_mail_ids = sub ($self,$runner,$args) {
- $self->mail_store->retrieve_ids_by_tags('moderation');
- };
-
- my $with_mail_id = sub($cmd) { return (
- summary => "$cmd the given mail, currently held for moderation",
- parameters => [ {
- name => 'mail-id', required => 1,
- summary => "id of the mail to $cmd",
- completion => { op => $list_mail_ids },
- } ],
- ) };
-
- $spec->{subcommands}{'list-held'} = {
- op => 'list_mails_in_moderation_queue',
- summary => 'list all mails currently held for moderation',
- };
- $spec->{subcommands}{'show-held'} = {
- op => 'show_mail_from_moderation_queue',
- $with_mail_id->('show'),
- };
- $spec->{subcommands}{'resume-held'} = {
- op => sub ($self,$runner,$args) {
- $self->resume($runner->parameters->{'mail-id'});
- },
- $with_mail_id->('resume'),
- };
- $spec->{subcommands}{'drop-held'} = {
- op => sub ($self,$runner,$args) {
- $self->drop($runner->parameters->{'mail-id'});
- },
- $with_mail_id->('drop'),
- };
-
- return $spec;
-};
- </code></pre>
- </section>
- <section>
- <pre><code class="shell" data-noescape>
-$ sietima-test <span style="color:blue">&lt;TAB&gt;</span>
-drop-held -- drop the given mail, currently held for moderation
-help -- Show command help
-list-held -- list all mails currently held for moderation
-resume-held -- resume the given mail, currently held for moderation
-send -- send email from STDIN
-show-held -- show the given mail, currently held for moderation
- </code></pre>
- </section>
- <section>
- <pre><code class="shell" data-noescape>
-$ sietima-test resume-held <span style="color:blue">&lt;TAB&gt;</span>
-0f0571203ef5ee2f786b7f7f2832093ed4c34fe8
-4d43ee7a2a17457606c07475b14054839fad9b7e
- </code></pre>
- </section>
- </section>
- <section>
- <h2>Production ready!</h2>
- <section>
- <p>all my lists now run with Sietima</p>
- </section>
- <section>
- <p>coming soon to a CPAN near you</p>
- </section>
- </section>
- <section>
- <h2>CPAN is awesome</h2>
- <section>
- <p><code>Email::*</code>, RJBS</p>
- </section>
- <section>
- <p><code>Moo</code>, MST + HAARG</p>
- <p><code>Type::Tiny</code>, TOBYINK</p>
- </section>
- <section>
- <p><code>App::Spec</code>, TINITA</p>
- </section>
- <section>
- <p><code>Test2</code>, EXODIST</p>
- </section>
- </section>
- <section>
- <h2>Thank you</h2>
- </section>
- </div>
- </div>
- <script src="lib/js/head.min.js"></script>
- <script src="js/reveal.js"></script>
- <script>
- Reveal.initialize({
- dependencies: [
- { src: 'plugin/highlight/highlight.js',
- async: true,
- callback: function() { hljs.initHighlightingOnLoad(); }
- },
- { src: 'plugin/notes/notes.js', async: true }
- ],
- });
- </script>
- </body>
-</html>