Commits

Anonymous committed c3d01e3

Adding YAPC::NA 2014 talk. Will add others soon.

  • Participants

Comments (0)

Files changed (20)

yapc/na/2014/FirstTimeCPANContributor/cpan.png

Added
New image

yapc/na/2014/FirstTimeCPANContributor/index.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<title>First Time CPAN Contributor</title>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<!-- metadata -->
+<meta name="generator" content="S5" />
+<meta name="version" content="S5 1.2a2" />
+<meta name="author" content="Adam M Dutko" />
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="hidden" />
+<!-- style sheet links -->
+<link rel="stylesheet" href="ui/default/slides.css" type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="projection" id="operaFix" />
+<!-- embedded styles -->
+<style type="text/css" media="all">
+.imgcon {width: 525px; margin: 0 auto; padding: 0; text-align: center;}
+#anim {width: 270px; height: 320px; position: relative; margin-top: 0.5em;}
+#anim img {position: absolute; top: 42px; left: 24px;}
+img#me01 {top: 0; left: 0;}
+img#me02 {left: 23px;}
+img#me04 {top: 44px;}
+img#me05 {top: 43px;left: 36px;}
+</style>
+<!-- S5 JS -->
+<script src="ui/default/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="ui/custom.css" type="text/css" />
+</head>
+<body>
+
+<div class="layout">
+<div id="controls"><!-- DO NOT EDIT --></div>
+<div id="currentSlide"><!-- DO NOT EDIT --></div>
+<div id="header"></div>
+<div id="footer">
+  <div id="license">
+    <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/us/"><img alt="Creative Commons License" style="border-width:0" src="ui/creative-commons.png" /></a>
+    <br /><span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type">First Time CPAN Contributor</span> by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Adam M Dutko</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/us/">Creative Commons Attribution-Share Alike 3.0 United States License</a>.
+  </div>
+
+  <h2>First Time CPAN Contributor</h2>
+</div>
+</div>
+
+<div class="presentation">
+
+<div class="slide">
+  <h1>First Time CPAN Contributor</h1>
+  <h2>Adam M Dutko</h2>
+</div>
+
+<div class="slide">
+  <h1>Why you might be here?</h1>
+
+  <ul class="incremental">
+    <li>Perl Conference</li>
+    <li>Right?</li>
+    <li>New to Perl</li>
+    <li>Want to Contribute</li>
+  </ul>
+</div>
+
+<div class="slide">
+   <h1>About Me</h1>
+   <ul class="incremental">
+     <li>Cleveland.pm</li>
+     <li>We're equal</li>
+     <li>Second YAPC</li>
+     <li>Not a newbie</li>
+     <li>Not hardcore</li>
+   </ul>
+</div>
+
+<div class="slide">
+   Before I get started ...
+</div>
+
+<div class="slide">
+   What's up with this?
+</div>
+
+<div class="slide">
+   <h1>WTF</h1> 
+   <img style="width: 300px; min-width: 300px; height: 180px; min-height: 180px; margin-left: auto; margin-right: auto; display: block;" src="what_the_hell.gif" alt="What the hell?">
+</div> 
+
+<div class="slide">
+   <li>And now back to our regularly scheduled program ...</li>
+</div>
+
+<div class="slide">
+  <h1>Contributions</h1>
+  <ul class="incremental">
+    Ways to contribute
+    <li>Talk (YAPC::NA)</li>
+    <li>Write (http://perltricks.com/)</li>
+    <li>Patches (http://neilb.org/adoption/)</li>
+    <li>Documentation <br />(http://www.annocpan.org)<br /> (http://perldoc.org)</li>
+    <li>Test (http://cpantesters.org)</li>
+    <li>Filter (http://prepan.org)</li>
+    <li>Give Feedback (http://cpanratings.perl.org)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <br />
+  <li>
+    <center><img src="cpan.png" alt="The CPAN" ></center>
+  </li>
+  <br />
+</div>
+
+<div class="slide fake-slide0">
+  <h1>Part 0: Where do I start?</h1>
+</div>
+
+<div class="slide">
+  <h1>Documentation</h1>
+  <ul class="incremental">
+    <li><em>perlstyle</em></li>
+    <li>perlmodstyle</li>
+    <li>perlmodlib</li>
+    <li>perlnewmod</li>
+    <li>perlmodinstall</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlstyle</h1>
+  <ul class="incremental">
+    <li>Larry's Preferences</li>
+    <li>General Guidelines</li>
+    <li>Think Baby Perl (Easy to grok/parse Perl)</li>
+    <li>"standards"</li>
+    <li><code>use strict;</code></li>
+    <li><code>use warnings;</code></li>
+    <li>CAN vs SHOULD</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodstyle</h1>
+  <ul class="incremental">
+    <li>Perl Community's "best practice[s]"</li>
+    <li>Separation of Concerns</li>
+    <li>Namespace Wisely</li>
+    <li>Versioning</li>
+    <li>Named Parameters</li>
+    <li>Don't add garbage (Task::Kensho anyone?)</li>
+    <li>"use Modern::Perl ?" &gt; '2012' (Deprecation)</li>
+    <li>"use" version (don't be crazy)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodlib</h1>
+  <ul class="incremental">
+    <li>Lots of existing code</li>
+    <li>List of Mirrors</li>
+    <li>Various Resources</li>
+    <li>More Best Practices</li>
+  </ul>  
+</div>
+
+<div class="slide">
+  <h1>perlnewmod</h1>
+  <ul class="incremental">
+    <li>Is it useful?</li>
+    <li>Searched CPAN?</li>
+    <li>Talk</li>
+    <li>Make It (TIMTOWDI)</li><br />
+      <ul>
+      <li>Copy from existing code (Text::Tabs or File::Copy)</li>
+      <li>Module::Build (Deprecated in v5.19 and Removed v5.22)</li>
+      <li>Module::Starter (Contender)</li>
+      <li>Dist::Zilla (Future)<br />
+    </li>
+  </ul>
+</div>
+
+<div class="slide fake-slide0">
+  <h1>Part1: Some "pointers"</h1>
+</div>
+
+<div class="slide">
+  <h1>Namespace Selection</h1>
+  <ul class="incremental">
+    <li>PAUSE (will help)</li>
+    <li>Think Context</li>
+    <li>Think Features</li>
+    <li>App is valid</li>
+    <li>NEVER Local</li>
+    <li>Discuss Top-Level Namespaces (Big Projects)</li>
+    <li>No $self (we like you, not that much)</li>
+    <li>Avoid Net</li>
+    <li>avoid lowercase names</li>
+    <li>Avoid Simple and General</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>Versioning</h1>
+  <ul class="incremental">
+    <li>Should be simple ...
+    <li>... it's not ... </li>
+    <li>PAUSE helps</li>
+    <li>Help PAUSE</li>
+    <li>XX.Y or X.YYY.ZZZ or 2014.0623</li>
+    <li>version->is_lax() is your friend</li>
+  </ul>
+</div>
+
+<div class="slide">
+   <h1>Version Fail</h1>
+   <code>
+   <br /><br />
+   # actual CPAN version numbers<br /><br />
+   $VERSION = VERSION;<br /><br />
+   $VERSION = 0xdeadbeef;<br /><br />
+   our $VERSION = 'set-when-loading';<br /><br />
+   our $VERSION = "1.2-trailing-junk";<br /><br />
+   </code>
+</div>
+
+<div class="slide">
+   <h1>Version Helper</h1>
+   <code>
+   #!/usr/bin/perl<br />
+   use Modern::Perl '2013';<br />
+   use version 0.77;<br />
+   <br />
+   ## Fail on perlstyle<br />
+   print "VALID\n" if version->is_lax('2014.0621') . "\n";<br /><br />
+   print "INVALID\n" if version->is_lax('wheresthebeef') . "\n";<br /><br />
+   </code>
+</div>
+
+<div class="slide">
+   <h1>Suggestions</h1>
+   <ul class="incremental">
+     <li>use Carp;</li>
+     <li>$VERSION in all .pm files</li>
+     <li>$XS_VERSION = $VERSION; # only needed if you have XS code</li>
+     <li>Release Early and Release Often</li>
+     <pre>  Alpha/Beta ... eg. 1.20_01</pre> 
+     <li>Have a good SPAM filter</li>
+     <li>pod2html and pod2html</li>
+     <li>Typos</li>
+   </ul>
+</div>
+
+<div class="slide fake-slide0">
+  <h1>Part 2: Basic Steps</h1>
+</div>
+
+<div class="slide">
+  <h1>Tools</h1>
+  <ul class="incremental">
+    <li>PAUSE (http://pause.perl.org)</li> 
+    <li>Request Tracker (http://rt.cpan.org)</li>
+    <li>Module::Starter (http://search.cpan.org/perldoc/Module::Starter)</li>
+    <li>Iterate</li>
+    <li>Test</li>
+    <li>Upload</li>
+    <li>Maintain</li>
+    <li>Gracefully Stepdown</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>PAUSE</h1>
+    <br /><br />
+    <img style="display: block; margin-left: auto; margin-right: auto" src="pause.jpg" alt="PAUSE">
+    <br /><br />
+    <center><li>http://pause.perl.org</li></center>
+</div>
+
+<div class="slide">
+  <h1>DSLIP</h1>
+    <ul class="incremental">
+      DSLIP<pre>
+      Development Stage
+      Support Level
+      Language Used
+      Interface Style
+      Public License
+      </pre>
+      <a href="http://www.cpan.org/modules/00modlist.long.html">Cisco::Conf</a>(adpO)
+      <pre>
+      Development Stage: alpha
+      Support Level: Developer
+      Language Used: Perl only
+      Interface Style: Object Oriented
+      </pre>
+    </ul>
+</div>
+
+<div class="slide">
+  <h1>Request Tracker</h1>
+    <br /><br />
+    <img style="display: block; margin-left: auto; margin-right: auto" src="perlbug.png" alt="RT">
+    <br /><br />
+    <center><li>http://rt.perl.org</li></center>
+</div>
+
+<div class="slide">
+  <h1>Module::Starter</h1>
+    <code>
+      cpanm -i Module::Starter<br /><br />
+      <pre>module-starter
+        --module=Linux::Kernel
+        --author="Adam M Dutko"
+        --email="addutko@cpan.org"
+        --license="gpl" 
+      </pre>
+      perl Makefile.PL<br />
+      make<br />
+      (make test)<br />
+      make dist<br />
+    </code>
+</div>
+
+<div class="slide">
+  <h1>Module::Starter</h1>
+  <pre>
+    Added to MANIFEST: Changes
+    Added to MANIFEST: ignore.txt
+    Added to MANIFEST: lib/Linux/Kernel.pm
+    Added to MANIFEST: Makefile.PL
+    Added to MANIFEST: MANIFEST
+    Added to MANIFEST: README
+    Added to MANIFEST: t/00-load.t
+    Added to MANIFEST: t/boilerplate.t
+    Added to MANIFEST: t/manifest.t
+    Added to MANIFEST: t/pod-coverage.t
+    Added to MANIFEST: t/pod.t
+    Created starter directories and files
+  </pre>
+</div>
+
+<div class="slide">
+  <h1>Iterate</h1>
+  <ul class="incremental">
+    <li>README</li>
+    <li>LICENSE</li>
+    <li>MANIFEST</li>
+    <li>t/</li>
+    <li>eg/ or examples/</li>
+    <li>Changes</li>
+    <li>lib/</li>
+  </ul> 
+</div>
+
+
+<div class="slide">
+  <h1>Document</h1>
+  <pre>
+      NAME
+        ·   SYNOPSIS
+        ·   DESCRIPTION
+        ·   MODULES && SUBMODULES 
+        ·   BUGS/CAVEATS/etc
+        ·   AUTHOR
+        ·   SEE ALSO
+        ·   COPYRIGHT and LICENSE
+  </pre>
+  http://search.cpan.org/search?module=Cisco::Conf
+</div> 
+
+<div class="slide">
+  <h1>Upload</h1>
+  <ul class="incremental">
+    <li>PAUSE</li>
+    <li>Dist::Zilla</li>
+  </ul>  
+</div>
+
+<div class="slide fake-slide0">
+<h1>Part 3: Next Steps</h1>
+</div>
+
+<div class="slide">
+  <h1>Dist::Zilla</h1>
+  <ul class="incremental">
+    <li>Research (http://dzil.org/)</li>
+    <li>Conversion (http://dzil.org/tutorial/convert-dist.html)</li>
+    <li>License (http://dzil.org/tutorial/copyright-and-license.html)</li>
+    <li>Dependencies (http://dzil.org/tutorial/prereq.html)</li>
+    <li>Reduction (http://dzil.org/tutorial/writing-docs.html)</li>
+    <li>Integration (http://dzil.org/tutorial/vcs.html)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>Update</h1>
+  <ul class="incremental">
+    <li>Recent Uploads (http://www.cpan.org/modules/01modules.mtime.html)</li>
+    <li>Hall of Fame (http://www.cpan.org/authors/00whois.html)</li>
+    <li>Modules (http://www.cpan.org/modules/01modules.index.html)</li>
+    <li>More Modules (http://www.cpan.org/modules/00modlist.long.html)</li>
+    <li>Recent Code (http://perltricks.com/article/93/2014/6/2/What-s-new-on-CPAN-May-2014)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>Need help?</h1>
+  <ul class="incremental">
+    <li>PAUSE and CPAN mirroring: modules@perl.org</li>
+    <li>Authoring Help: module-authors-help@perl.org</li>
+    <li>QA Help: perl-qa-help@perl.org</li>
+    <li>Pre-upload: prepan.org</li>
+    <li>PAUSE Code: https://github.com/andk/pause</li>
+    <li>Statistics: http://cpants.cpanauthors.org/</li>
+    <li>Authors</li>
+</div>
+
+<div class="slide">
+  <h1>Thank you Perl</h1>
+  <br /><br />
+  <pre style="width: 200px; min-width: 200px;">
+    All right... all right... but apart from 
+    better sanitation, the medicine, education,
+    wine, public order, irrigation, roads, 
+    a fresh water system, and public health ...
+    what ha[s] [Perl] ever done for us?' 
+
+      - Monty Python
+  </pre>
+</div>
+
+</body>
+</html>
+
+<!--
+
+Copyright 2014 Adam M Dutko. All Rights Reserved.
+
+This work is licensed under a Creative Commons Attribution-Share Alike
+3.0 United States License See
+http://creativecommons.org/licenses/by-sa/3.0/us/ for details.
+
+-->

yapc/na/2014/FirstTimeCPANContributor/index.html.bkup

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<title>First Time CPAN Contributor</title>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<!-- metadata -->
+<meta name="generator" content="S5" />
+<meta name="version" content="S5 1.2a2" />
+<meta name="author" content="Adam M Dutko" />
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="hidden" />
+<!-- style sheet links -->
+<link rel="stylesheet" href="ui/default/slides.css" type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="projection" id="operaFix" />
+<!-- embedded styles -->
+<style type="text/css" media="all">
+.imgcon {width: 525px; margin: 0 auto; padding: 0; text-align: center;}
+#anim {width: 270px; height: 320px; position: relative; margin-top: 0.5em;}
+#anim img {position: absolute; top: 42px; left: 24px;}
+img#me01 {top: 0; left: 0;}
+img#me02 {left: 23px;}
+img#me04 {top: 44px;}
+img#me05 {top: 43px;left: 36px;}
+</style>
+<!-- S5 JS -->
+<script src="ui/default/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="ui/custom.css" type="text/css" />
+</head>
+<body>
+
+<div class="layout">
+<div id="controls"><!-- DO NOT EDIT --></div>
+<div id="currentSlide"><!-- DO NOT EDIT --></div>
+<div id="header"></div>
+<div id="footer">
+  <div id="license">
+    <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/us/"><img alt="Creative Commons License" style="border-width:0" src="ui/creative-commons.png" /></a>
+    <br /><span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type">First Time CPAN Contributor</span> by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Adam M Dutko</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/us/">Creative Commons Attribution-Share Alike 3.0 United States License</a>.
+  </div>
+
+  <h2>First Time CPAN Contributor</h2>
+</div>
+</div>
+
+<div class="presentation">
+
+<div class="slide">
+  <h1>First Time CPAN Contributor</h1>
+  <h2>Adam M Dutko</h2>
+</div>
+
+<div class="slide">
+  <h1>Why you might be here?</h1>
+
+  <ul class="incremental">
+    <li>Perl Conference</li>
+    <li>Right? (Marriage Conference Yesterday)</li>
+    <li>New to Perl</li>
+    <li>Want to Contribute</li>
+  </ul>
+</div>
+
+<div class="slide">
+   <h1>About Me</h1>
+   <ul class="incremental">
+     <li>Cleveland.pm</li>
+     <li>We're equal</li>
+     <li>Second YAPC</li>
+     <li>Not a newbie</li>
+     <li>Not hardcore</li>
+   </ul>
+</div>
+
+<div class="slide">
+   Before I get started ...
+</div>
+
+<div class="slide">
+   What's up with this?
+</div>
+
+<div class="slide">
+   <h1>WTF</h1> 
+   <img style="width: 300px; min-width: 300px; height: 180px; min-height: 180px; margin-left: auto; margin-right: auto; display: block;" src="what_the_hell.gif" alt="What the hell?">
+</div> 
+
+<div class="slide">
+   <li>And now back to our regularly scheduled program ...</li>
+</div>
+
+<div class="slide">
+  <h1>Contributions</h1>
+  <ul class="incremental">
+    Ways to contribute
+    <li>Talk (YAPC::NA)</li>
+    <li>Write (http://perltricks.com/)</li>
+    <li>Patches (http://neilb.org/adoption/)</li>
+    <li>Documentation <br />(http://www.annocpan.org)<br /> (http://perldoc.org)</li>
+    <li>Test (http://cpantesters.org)</li>
+    <li>Filter (http://prepan.org)</li>
+    <li>Give Feedback (http://cpanratings.perl.org)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <br />
+  <li>
+    <center><img src="cpan.png" alt="The CPAN" ></center>
+  </li>
+  <br />
+</div>
+
+<div class="slide fake-slide0">
+  <h1>Part 0: Where do I start?</h1>
+</div>
+
+<div class="slide">
+  <h1>Documentation</h1>
+  <ul class="incremental">
+    <li><em>perlstyle</em></li>
+    <li>perlmodstyle</li>
+    <li>perlmodlib</li>
+    <li>perlnewmod</li>
+    <li>perlmodinstall</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlstyle</h1>
+  <ul class="incremental">
+    <li>Larry's Preferences</li>
+    <li>General Guidelines</li>
+    <li>Think Baby Perl (Easy to grok/parse Perl)</li>
+    <li>"standards"</li>
+    <li><code>use strict;</code></li>
+    <li><code>use warnings;</code></li>
+    <li>CAN vs SHOULD</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodstyle</h1>
+  <ul class="incremental">
+    <li>Perl Community's "best practice[s]"</li>
+    <li>Conventions</li>
+    <li>Think Simple</li>
+    <li>Namespace Wisely</li>
+    <li>Avoide NIHS</li>
+    <li>Don't add garbage (Task::Kensho anyone?)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodstyle</h1>
+  <ul class="incremental">
+    Think ... Useful Code
+      <li>Avoid NIHS</li>
+      <li>Focus on Quality</li>
+      <li>Namespace Wisely (http://www.cpan.org/modules/00modlist.long.html)</li>
+      <li>Don't add garbage (Task::Kensho anyone?)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodstyle</h1>
+  <ul class="incremental">
+    Choose a Good API Design
+    <li>Baby Perl</li>
+    <li>Simple</li>
+    <li>Separation of Concerns</li>
+    <li>Consistency (Naming)</li>
+    <li>Named Parameters</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodstyle</h1>
+  <ul class="incremental">
+    Stability
+    <li><code>use strict;</code></li>
+    <li><code>use warnings;</code></li>
+    <li>Best practices</li>
+    <li>"use Modern::Perl ?" &gt; '2012' (Deprecation)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodstyle</h1>
+  <ul class="incremental">
+    Document
+    <li>POD</li>
+    <li>Purpose, Scope, Target</li>
+    <li>Document Public Methods</li>
+    <li>Usage Examples</li>
+    <li>README (pod2txt)</li>
+    <li>Release Notes</li>
+    <li>Support links</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>perlmodstyle</h1>
+  <ul class="incremental">
+    Release
+    <li>Specify Pre-reqs</li>
+    <li>"use" version (don't be crazy)</li>
+    <li>Versioning</li>
+    <li>Licensing</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>Quick Review</h1>
+  <ul class="incremental">
+    <li>Package (namespace)</li>
+    <li>Class (namespace + subs)</li>
+    <li>Module (file w/ class(es) +/- exports)</li>
+    <li>Distribution (collection of files)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  And now for something "not so" completely different ...
+</div>
+
+<div class="slide">
+  <h1>perlmodlib</h1>
+  <ul class="incremental">
+    <li>Lots of existing code</li>
+    <li>List of Mirrors</li>
+    <li>Various Resources</li>
+    <li>More Best Practices</li>
+  </ul>  
+</div>
+
+<div class="slide">
+  <h1>perlnewmod</h1>
+  <ul class="incremental">
+    <li>Is it useful?</li>
+    <li>Searched CPAN?</li>
+    <li>Talk</li>
+    <li>Make It (TIMTOWDI)</li><br />
+      Copy from existing code (Text::Tabs or File::Copy)<br /><br />
+      Module::Build (Deprecated in v5.19 and Removed v5.22)<br /><br />
+      Module::Starter (Contender)<br /><br />
+      Dist::Zilla (Future)<br />
+    </li>
+  </ul>
+</div>
+
+<div class="slide fake-slide0">
+  <h1>Part1: Some "pointers"</h1>
+</div>
+
+<div class="slide">
+  <h1>Namespace Selection</h1>
+  <ul class="incremental">
+    <li>PAUSE (will help)</li>
+    <li>Think Context</li>
+    <li>Think Features</li>
+    <li>App is valid</li>
+    <li>NEVER Local</li>
+    <li>Discuss Top-Level Namespaces (Big Projects)</li>
+    <li>No $self (we like you, not that much)</li>
+    <li>Avoid Net</li>
+    <li>avoid lowercase names</li>
+    <li>Avoid Simple and General</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>Versioning</h1>
+  <ul class="incremental">
+    <li>Should be simple ...
+    <li>... it's not ... </li>
+    <li>PAUSE helps</li>
+    <li>Help PAUSE</li>
+    <li>XX.Y or X.YYY.ZZZ or 2014.0623</li>
+    <li>version->is_lax() is your friend</li>
+  </ul>
+</div>
+
+<div class="slide">
+   <h1>Version Fail</h1>
+   <code>
+   <br /><br />
+   # actual CPAN version numbers<br /><br />
+   $VERSION = VERSION;<br /><br />
+   $VERSION = 0xdeadbeef;<br /><br />
+   our $VERSION = 'set-when-loading';<br /><br />
+   our $VERSION = "1.2-trailing-junk";<br /><br />
+   </code>
+</div>
+
+<div class="slide">
+   <h1>Version Helper</h1>
+   <code>
+   #!/usr/bin/perl<br />
+   use Modern::Perl '2013';<br />
+   use version 0.77;<br />
+   <br />
+   ## Fail on perlstyle<br />
+   print "VALID\n" if version->is_lax('2014.0621') . "\n";<br /><br />
+   print "INVALID\n" if version->is_lax('wheresthebeef') . "\n";<br /><br />
+   </code>
+</div>
+
+<div class="slide">
+   <h1>Suggestions</h1>
+   <ul class="incremental">
+     <li>use Carp;</li>
+     <li>$VERSION in all .pm files</li>
+     <li>$XS_VERSION = $VERSION; # only needed if you have XS code</li>
+     <li>Release Early and Release Often</li>
+     <pre>  Alpha/Beta ... eg. 1.20_01</pre> 
+     <li>Have a good SPAM filter</li>
+     <li>pod2html and pod2html</li>
+     <li>Typos</li>
+   </ul>
+</div>
+
+<div class="slide fake-slide0">
+  <h1>Part 2: Basic Steps</h1>
+</div>
+
+<div class="slide">
+  <h1>Tools</h1>
+  <ul class="incremental">
+    <li>PAUSE (http://pause.perl.org)</li> 
+    <li>Request Tracker (http://rt.cpan.org)</li>
+    <li>Module::Starter (http://search.cpan.org/perldoc/Module::Starter)</li>
+    <li>Iterate</li>
+    <li>Test</li>
+    <li>Upload</li>
+    <li>Maintain</li>
+    <li>Gracefully Stepdown</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>PAUSE</h1>
+    <br /><br />
+    <img style="display: block; margin-left: auto; margin-right: auto" src="pause.jpg" alt="PAUSE">
+    <br /><br />
+    <center><li>http://pause.perl.org</li></center>
+</div>
+
+<div class="slide">
+  <h1>DSLIP</h1>
+    <ul class="incremental">
+      DSLIP<pre>
+      Development Stage
+      Support Level
+      Language Used
+      Interface Style
+      Public License
+      </pre>
+      <a href="http://www.cpan.org/modules/00modlist.long.html">Cisco::Conf</a>(adpO)
+      <pre>
+      Development Stage: alpha
+      Support Level: Developer
+      Language Used: Perl only
+      Interface Style: Object Oriented
+      </pre>
+    </ul>
+</div>
+
+<div class="slide">
+  <h1>Request Tracker</h1>
+    <br /><br />
+    <img style="display: block; margin-left: auto; margin-right: auto" src="perlbug.png" alt="RT">
+    <br /><br />
+    <center><li>http://rt.perl.org</li></center>
+</div>
+
+<div class="slide">
+  <h1>Module::Starter</h1>
+    <code>
+      cpanm -i Module::Starter<br /><br />
+      <pre>module-starter
+        --module=Linux::Kernel
+        --author="Adam M Dutko"
+        --email="addutko@cpan.org"
+        --license="gpl" 
+      </pre>
+      perl Makefile.PL<br />
+      make<br />
+      (make test)<br />
+      make dist<br />
+    </code>
+</div>
+
+<div class="slide">
+  <h1>Module::Starter</h1>
+  <pre>
+    Added to MANIFEST: Changes
+    Added to MANIFEST: ignore.txt
+    Added to MANIFEST: lib/Linux/Kernel.pm
+    Added to MANIFEST: Makefile.PL
+    Added to MANIFEST: MANIFEST
+    Added to MANIFEST: README
+    Added to MANIFEST: t/00-load.t
+    Added to MANIFEST: t/boilerplate.t
+    Added to MANIFEST: t/manifest.t
+    Added to MANIFEST: t/pod-coverage.t
+    Added to MANIFEST: t/pod.t
+    Created starter directories and files
+  </pre>
+</div>
+
+<div class="slide">
+  <h1>Iterate</h1>
+  <ul class="incremental">
+    <li>README</li>
+    <li>LICENSE</li>
+    <li>MANIFEST</li>
+    <li>t/</li>
+    <li>eg/ or examples/</li>
+    <li>Changes</li>
+    <li>lib/</li>
+  </ul> 
+</div>
+
+
+<div class="slide">
+  <h1>Document</h1>
+  <pre>
+      NAME
+        ·   SYNOPSIS
+        ·   DESCRIPTION
+        ·   MODULES && SUBMODULES 
+        ·   BUGS/CAVEATS/etc
+        ·   AUTHOR
+        ·   SEE ALSO
+        ·   COPYRIGHT and LICENSE
+  </pre>
+  http://search.cpan.org/search?module=Cisco::Conf
+</div> 
+
+<div class="slide">
+  <h1>Upload</h1>
+  <ul class="incremental">
+    <li>PAUSE</li>
+    <li>Dist::Zilla</li>
+  </ul>  
+</div>
+
+<div class="slide fake-slide0">
+<h1>Part 3: Next Steps</h1>
+</div>
+
+<div class="slide">
+  <h1>Dist::Zilla</h1>
+  <ul class="incremental">
+    <li>Research (http://dzil.org/)</li>
+    <li>Conversion (http://dzil.org/tutorial/convert-dist.html)</li>
+    <li>License (http://dzil.org/tutorial/copyright-and-license.html)</li>
+    <li>Dependencies (http://dzil.org/tutorial/prereq.html)</li>
+    <li>Reduction (http://dzil.org/tutorial/writing-docs.html)</li>
+    <li>Integration (http://dzil.org/tutorial/vcs.html)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>Update</h1>
+  <ul class="incremental">
+    <li>Recent Uploads (http://www.cpan.org/modules/01modules.mtime.html)</li>
+    <li>Hall of Fame (http://www.cpan.org/authors/00whois.html)</li>
+    <li>Modules (http://www.cpan.org/modules/01modules.index.html)</li>
+    <li>More Modules (http://www.cpan.org/modules/00modlist.long.html)</li>
+    <li>Recent Code (http://perltricks.com/article/93/2014/6/2/What-s-new-on-CPAN-May-2014)</li>
+  </ul>
+</div>
+
+<div class="slide">
+  <h1>Need help?</h1>
+  <ul class="incremental">
+    <li>PAUSE and CPAN mirroring: modules@perl.org</li>
+    <li>Authoring Help: module-authors-help@perl.org</li>
+    <li>QA Help: perl-qa-help@perl.org</li>
+    <li>Pre-upload: prepan.org</li>
+    <li>PAUSE Code: https://github.com/andk/pause</li>
+    <li>Statistics: http://cpants.cpanauthors.org/</li>
+    <li>Authors</li>
+</div>
+
+<div class="slide">
+  <h1>Thank you Perl</h1>
+  <br /><br />
+  <pre style="width: 200px; min-width: 200px;">
+    All right... all right... but apart from 
+    better sanitation, the medicine, education,
+    wine, public order, irrigation, roads, 
+    a fresh water system, and public health ...
+    what ha[s] [Perl] ever done for us?' 
+
+      - Monty Python
+  </pre>
+</div>
+
+</body>
+</html>
+
+<!--
+
+Copyright 2014 Adam M Dutko. All Rights Reserved.
+
+This work is licensed under a Creative Commons Attribution-Share Alike
+3.0 United States License See
+http://creativecommons.org/licenses/by-sa/3.0/us/ for details.
+
+-->

yapc/na/2014/FirstTimeCPANContributor/pause.jpg

Added
New image

yapc/na/2014/FirstTimeCPANContributor/perlbug.png

Added
New image

yapc/na/2014/FirstTimeCPANContributor/ui/custom.css

+html>body {
+    background: none;
+    font-family: Verdana, Helvetica, sans-serif;
+}
+
+div.image-set {
+    margin-left: 6.5%;
+    margin-top: 1em;
+}
+
+div#header, div#footer {
+    color: black;
+    background: #eddbb4;
+}
+
+div#license {
+    float: left;
+    font-size: 20%;
+    margin-left: 1em;
+    width: 40%;
+}
+
+.slide h1 {
+    background: #eddbb4;
+    color: black;
+}
+
+.slide h1 {
+    text-transform: none;
+}
+
+span.date, span.uri {
+    font-size: 80%;
+}
+
+span.uri {
+    color: blue;
+}
+
+div.image-gallery {
+    text-align: center;
+}
+
+p.image-notes {
+    font-size: 40%;
+    font-style: italic;
+}
+
+img.for-slide {
+    float: right;
+}
+
+/* copied from pretty.css for ul */
+.slide ol {margin-left: 5%; margin-right: 7%;}
+
+.slide ul, .slide ul li ul, .slide ol {
+    line-height: 1.2em;
+}
+
+.slide li {
+    margin-top: 0.5em;
+}
+
+.slide pre {
+    font-size: 100%;
+    line-height: 110%;
+}
+
+.slide .current,
+.highlight {
+    color: #03c;
+}
+
+.delete {
+    text-decoration: line-through;
+    color: #eee;
+}
+
+.slide pre.small {
+    font-size: 33%;
+}
+
+.slide pre.medium {
+    font-size: 80%;
+}
+
+.slide table.side-by-side tr {
+    vertical-align: top;
+}
+
+.match-moose {
+    color: #03c;
+}
+
+.match-unsweet {
+    color: #03c;
+    font-weight: bold;
+}
+
+.wrong {
+    color: #F00;
+}
+
+.right {
+    color: #090;
+}
+
+.slide h2 {
+    margin: 0.1em 0 0.1em 0;
+}
+
+.slide ul + h2,   
+.slide ul + pre {
+    margin-top: 0.5em;
+}
+
+.fake-slide0 {padding-top: 3.5em; font-size: 90%;}
+.fake-slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+   font: bold 2em Helvetica, sans-serif; white-space: normal;
+   color: #000; background: transparent;}
+
+.slide code { padding: 0; font-weight: bold; color: #533;}

yapc/na/2014/FirstTimeCPANContributor/ui/default/blank.gif

Added
New image

yapc/na/2014/FirstTimeCPANContributor/ui/default/bodybg.gif

Added
New image

yapc/na/2014/FirstTimeCPANContributor/ui/default/framing.css

+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2;  list-style: none;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {text-align: right; width: 100%; margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/

yapc/na/2014/FirstTimeCPANContributor/ui/default/iepngfix.htc

+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+  if ((/\.png$/i).test(src)) {
+   filt(src, 'image');  // was 'scale'
+   src = blankImg;
+  } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+  if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+   var s = RegExp.$1;
+   style.backgroundImage = '';
+   filt(s, 'crop');
+  } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component>

yapc/na/2014/FirstTimeCPANContributor/ui/default/notes.css

+/* Following are the note styles -- edit away! */
+
+body {
+	margin: 0;
+	padding: 1.0em;
+	font: 2em/1.4em 'Lucida Grande', Verdana, sans-serif;
+}
+
+div.timers {
+	background: #FFF;
+	color: #333;
+	border: 0.08em solid #222;
+	border-top-width: 1px;
+	border-left-width: 1px;
+	float: left;
+	padding: 0.2em;
+	margin: 0 0 0.5em;
+	position: relative;
+}
+
+div.timers h1 {
+	text-align: left;
+	font-size: 0.6em;
+	line-height: 1.4em;
+	background-color: #FF9;
+	padding: 0 0.75em;
+	margin: 0.25em 0 0;
+	border: 1px solid #EE8;
+}
+
+div.timers div.controls {
+	position: absolute;
+	right: 0.25em;
+	top: 0.1em;
+	line-height: 1em;
+}
+
+div.timers h1 a {
+	text-decoration: none;
+	color: #000;
+}
+
+div.timers div.controls a {
+	font-size: 0.5em;
+	padding: 0;
+	color: #330;
+}
+
+div.timers a.control {
+	position: absolute;
+	text-decoration: none;
+	padding: 0 0.25em;
+	color: #AAA;
+	outline: 0;
+}
+
+#minus {
+	left: 0.25em;
+}
+
+#plus {
+	right: 0.25em;
+}
+
+.overtime {
+	background: yellow;
+	color: red;
+	border: 3px solid;
+	padding: 0.1em 0.25em;
+	font-weight: bold;
+}
+
+div.timers h2 {
+	font-size: 0.6em;
+	line-height: 1.0em;
+	font-weight: normal;
+	margin: 0 0 -0.25em;
+	padding-top: 0.5em;
+	color: #666;
+}
+
+div.timers p {margin: 0; padding: 0 0.5em;}
+div.timers form {margin: 0;}
+
+div.timers span.clock {
+	font-family: monospace;
+}
+
+div.timers ul {margin: 0; padding: 0; list-style: none;}
+div.timers li {float: left; width: 5em; margin: 0; padding: 0 0.5em;
+  text-align: center;}
+
+div#elapsed {width: 12.1em;}
+div#remaining {clear: left; width: 12.1em;}
+div#remaining p {text-align: center;}
+
+#slide,
+#next,
+#notes,
+#nextnotes {
+	font-size: 0.75em;
+	line-height: 1.4em;
+	clear: left;
+/*	max-width: 30.0em; */
+	text-shadow: 0.1em 0.1em 0.1em #111;
+}
+
+#next {margin-top: 2.5em;}
+#next, #nextnotes {
+	color: #999;
+	font-size: 0.66em;
+}
+
+em.disclaimer {
+	color: #666;
+}
+
+div.collapsed h1 {display: block; font-size: 0.33em;}
+div.collapsed h1 a {display: inline;}
+div.collapsed * {display: none;}
+
+/* custom */
+div.timers {
+    display: none;
+}

yapc/na/2014/FirstTimeCPANContributor/ui/default/opera.css

+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+	visibility: visible !important;
+	position: static !important;
+	page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}

yapc/na/2014/FirstTimeCPANContributor/ui/default/outline.css

+/* don't change this unless you want the layout stuff to show up in the outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+  display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#slide0 h1 {padding-top: 1.5em;}
+.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em;
+  border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}

yapc/na/2014/FirstTimeCPANContributor/ui/default/pretty.css

+/* Following are the presentation styles -- edit away! */
+
+body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2.25em;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+ul, pre {margin: 0; line-height: 1em;}
+html, body {margin: 0; padding: 0;}
+
+blockquote, q {font-style: italic;}
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;}
+blockquote p {margin: 0;}
+blockquote i {font-style: normal;}
+blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;}
+blockquote b i {font-style: italic;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;}
+.slide code.bad, code del {color: red;}
+.slide code.old {color: silver;}
+.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;}
+.slide pre code {display: block;}
+.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;}
+.slide li {margin-top: 0.75em; margin-right: 0;}
+.slide ul ul {line-height: 1;}
+.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+
+div#header, div#footer {background: #005; color: #AAB;
+  font-family: Verdana, Helvetica, sans-serif;}
+div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat;
+  line-height: 1px;}
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1, #footer h2 {display: block; padding: 0 1em;}
+#footer h2 {font-style: italic;}
+
+div.long {font-size: 0.75em;}
+.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1;
+  margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap;
+  font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize;
+  color: #DDE; background: #005;}
+.slide h3 {font-size: 130%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 60%; bottom: 0;
+  width: 40%;
+  text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;}
+html>body div#controls {position: fixed; padding: 0; top: auto;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  background: #005; border: none; color: #779; 
+  cursor: pointer;}
+#controls #navList #jumplist {background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;}
+
+#slide0 {padding-top: 3.5em; font-size: 90%;}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+   font: bold 2em Helvetica, sans-serif; white-space: normal;
+   color: #000; background: transparent;}
+#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.note {display: none;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;}
+img.incremental {visibility: hidden;}
+.slide .current {color: #B02;}
+
+
+/* diagnostics
+
+li:after {content: " [" attr(class) "]"; color: #F88;}
+ */

yapc/na/2014/FirstTimeCPANContributor/ui/default/print.css

+/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */

yapc/na/2014/FirstTimeCPANContributor/ui/default/s5-core.css

+/* Do not edit or override these styles! The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer, 
+  html>body div#controls, html>body .slide {position: fixed;}
+.handout, .notes {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}

yapc/na/2014/FirstTimeCPANContributor/ui/default/slides.css

+@import url(s5-core.css); /* required to make the slide show run at all */
+@import url(framing.css); /* sets basic placement and size of slide components */
+@import url(pretty.css);  /* stuff that makes the slides look better than blah */

yapc/na/2014/FirstTimeCPANContributor/ui/default/slides.js

+// S5 v1.2a1 slides.js -- released into the Public Domain
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
+// about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var s5NotesWindow;
+var s5NotesWindowLoaded = false;
+var previousSlide = 0;
+var presentationStart = new Date();
+var slideStart = new Date();
+
+var countdown = {
+	timer: 0,
+	state: 'pause',
+	start: new Date(),
+	end: 0,
+	remaining: 0
+};
+
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+	if (!object.className) return false;
+	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+	if (!object) return false;
+	return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+	if (!object || !hasClass(object,className)) return;
+	object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+	if (!object || hasClass(object, className)) return;
+	if (object.className) {
+		object.className += ' '+className;
+	} else {
+		object.className = className;
+	}
+}
+
+function GetElementsWithClassName(elementName,className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (var i = 0; i< allElements.length; i++) {
+		if (hasClass(allElements[i], className)) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+	if (element == null || element.nodeName=='BODY') return false;
+	else if (element.id == id) return true;
+	else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+	var result = "";
+	if (node.nodeType == 1) {
+		var children = node.childNodes;
+		for (var i = 0; i < children.length; ++i) {
+			result += nodeValue(children[i]);
+		}
+	}
+	else if (node.nodeType == 3) {
+		result = node.nodeValue;
+	}
+	return(result);
+}
+
+function slideLabel() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var list = document.getElementById('jumplist');
+	smax = slideColl.length;
+	for (var n = 0; n < smax; n++) {
+		var obj = slideColl[n];
+
+		var did = 'slide' + n.toString();
+		obj.setAttribute('id',did);
+
+//		if (isOp) continue;   // Opera fix (hallvord)
+
+		var otext = '';
+		var menu = obj.firstChild;
+		if (!menu) continue; // to cope with empty slides
+		while (menu && menu.nodeType == 3) {
+			menu = menu.nextSibling;
+		}
+	 	if (!menu) continue; // to cope with slides with only text nodes
+
+		var menunodes = menu.childNodes;
+		for (var o = 0; o < menunodes.length; o++) {
+			otext += nodeValue(menunodes[o]);
+		}
+		list.options[list.length] = new Option(n + ' : '  + otext, n);
+	}
+}
+
+function currentSlide() {
+	var cs;
+	if (document.getElementById) {
+		cs = document.getElementById('currentSlide');
+	} else {
+		cs = document.currentSlide;
+	}
+	cs.innerHTML = '<a id="plink" href="">' +
+		'<span id="csHere">' + snum + '<\/span> ' +
+		'<span id="csSep">\/<\/span> ' +
+		'<span id="csTotal">' + (smax-1) + '<\/span>' +
+		'<\/a>'
+		;
+	if (snum == 0) {
+		cs.style.visibility = 'hidden';
+	} else {
+		cs.style.visibility = 'visible';
+	}
+}
+
+function go(step) {
+	if (document.getElementById('slideProj').disabled || step == 0) return;
+	var jl = document.getElementById('jumplist');
+	var cid = 'slide' + snum;
+	var ce = document.getElementById(cid);
+	if (incrementals[snum].length > 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			removeClass(incrementals[snum][i], 'current');
+			removeClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (step != 'j') {
+		snum += step;
+		lmax = smax - 1;
+		if (snum > lmax) snum = lmax;
+		if (snum < 0) snum = 0;
+	} else
+		snum = parseInt(jl.value);
+	var nid = 'slide' + snum;
+	var ne = document.getElementById(nid);
+	if (!ne) {
+		ne = document.getElementById('slide0');
+		snum = 0;
+	}
+	if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+	if (incrementals[snum].length > 0 && incpos == 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			if (hasClass(incrementals[snum][i], 'current'))
+				incpos = i + 1;
+			else
+				addClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (incrementals[snum].length > 0 && incpos > 0)
+		addClass(incrementals[snum][incpos - 1], 'current');
+	if (isOp) { //hallvord
+		location.hash = nid;
+	} else {
+		ce.style.visibility = 'hidden';
+		ne.style.visibility = 'visible';
+	} // /hallvord
+	jl.selectedIndex = snum;
+	currentSlide();
+	loadNote();
+	permaLink();
+	number = undef;
+}
+
+function goTo(target) {
+	if (target >= smax || target == snum) return;
+	go(target - snum);
+}
+
+function subgo(step) {
+	if (step > 0) {
+		removeClass(incrementals[snum][incpos - 1],'current');
+		removeClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos],'current');
+		incpos++;
+	} else {
+		incpos--;
+		removeClass(incrementals[snum][incpos],'current');
+		addClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos - 1],'current');
+	}
+	loadNote();
+}
+
+function toggle() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	if (!slides.disabled) {
+		slides.disabled = true;
+		outline.disabled = false;
+		s5mode = false;
+		fontSize('1em');
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'visible';
+		}
+	} else {
+		slides.disabled = false;
+		outline.disabled = true;
+		s5mode = true;
+		fontScale();
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'hidden';
+		}
+		slideColl[snum].style.visibility = 'visible';
+	}
+}
+
+function showHide(action) {
+	var obj = GetElementsWithClassName('*','hideme')[0];
+	switch (action) {
+	case 's': obj.style.visibility = 'visible'; break;
+	case 'h': obj.style.visibility = 'hidden'; break;
+	case 'k':
+		if (obj.style.visibility != 'visible') {
+			obj.style.visibility = 'visible';
+		} else {
+			obj.style.visibility = 'hidden';
+		}
+	break;
+	}
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+	if (!key) {
+		key = event;
+		key.which = key.keyCode;
+	}
+	if (key.which == 84) {
+		toggle();
+		return;
+	}
+	if (s5mode) {
+		switch (key.which) {
+			case 10: // return
+			case 13: // enter
+				if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+				if (key.target && isParentOrSelf(key.target, 'controls')) return;
+				if(number != undef) {
+					goTo(number);
+					break;
+				}
+			case 32: // spacebar
+			case 34: // page down
+			case 39: // rightkey
+			case 40: // downkey
+				if(number != undef) {
+					go(number);
+				} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+					go(1);
+				} else {
+					subgo(1);
+				}
+				break;
+			case 33: // page up
+			case 37: // leftkey
+			case 38: // upkey
+				if(number != undef) {
+					go(-1 * number);
+				} else if (!incrementals[snum] || incpos <= 0) {
+					go(-1);
+				} else {
+					subgo(-1);
+				}
+				break;
+			case 36: // home
+				goTo(0);
+				break;
+			case 35: // end
+				goTo(smax-1);
+				break;
+			case 67: // c
+				showHide('k');
+				break;
+			case 78: // n
+				createNotesWindow();
+				break;
+		}
+		if (key.which < 48 || key.which > 57) {
+			number = undef;
+		} else {
+			if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+			if (key.target && isParentOrSelf(key.target, 'controls')) return;
+			number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+		}
+	}
+	return false;
+}
+
+function clicker(e) {
+	number = undef;
+	var target;
+	if (window.event) {
+		target = window.event.srcElement;
+		e = window.event;
+	} else target = e.target;
+	if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
+	if (!e.which || e.which == 1) {
+		if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+			go(1);
+		} else {
+			subgo(1);
+		}
+	}
+}
+
+function findSlide(hash) {
+	var target = null;
+	var slides = GetElementsWithClassName('*','slide');
+	for (var i = 0; i < slides.length; i++) {
+		var targetSlide = slides[i];
+		if ( (targetSlide.name && targetSlide.name == hash)
+		 || (targetSlide.id && targetSlide.id == hash) ) {
+			target = targetSlide;
+			break;
+		}
+	}
+	while(target != null && target.nodeName != 'BODY') {
+		if (hasClass(target, 'slide')) {
+			return parseInt(target.id.slice(5));
+		}
+		target = target.parentNode;
+	}
+	return null;
+}
+
+function slideJump() {
+	if (window.location.hash == null) return;
+	var sregex = /^#slide(\d+)$/;
+	var matches = sregex.exec(window.location.hash);
+	var dest = null;
+	if (matches != null) {
+		dest = parseInt(matches[1]);
+	} else {
+		dest = findSlide(window.location.hash.slice(1));
+	}
+	if (dest != null)
+		go(dest - snum);
+}
+
+function fixLinks() {
+	var thisUri = window.location.href;
+	thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+	var aelements = document.getElementsByTagName('A');
+	for (var i = 0; i < aelements.length; i++) {
+		var a = aelements[i].href;
+		var slideID = a.match('\#slide[0-9]{1,2}');
+		if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+			var dest = findSlide(slideID[0].slice(1));
+			if (dest != null) {
+				if (aelements[i].addEventListener) {
+					aelements[i].addEventListener("click", new Function("e",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"if (e.preventDefault) e.preventDefault();"), true);
+				} else if (aelements[i].attachEvent) {
+					aelements[i].attachEvent("onclick", new Function("",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"event.returnValue = false;"));
+				}
+			}
+		}
+	}
+}
+
+function externalLinks() {
+	if (!document.getElementsByTagName) return;
+	var anchors = document.getElementsByTagName('a');
+	for (var i=0; i<anchors.length; i++) {
+		var anchor = anchors[i];
+		if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+			anchor.target = '_blank';
+			addClass(anchor,'external');
+		}
+	}
+}
+
+function permaLink() {
+	document.getElementById('plink').href = window.location.pathname + '#slide' + snum;
+}
+
+function createControls() {
+	var controlsDiv = document.getElementById("controls");
+	if (!controlsDiv) return;
+	var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+	var hideDiv, hideList = '';
+	if (controlVis == 'hidden') {
+		hideDiv = hider;
+	} else {
+		hideList = hider;
+	}
+	controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+	'<div id="navLinks">' +
+	'<a accesskey="n" id="show-notes" href="javascript:createNotesWindow();" title="Show Notes">&equiv;<\/a>' +