major additions for new orientation of presentation
Arthur Axel 'fREW' Schmidt [Wed, 9 Jun 2010 06:47:38 +0000 (01:47 -0500)]
slideshow.html

index 34c2e4f..76917e9 100644 (file)
@@ -76,7 +76,7 @@
    <div class="slide">
       <h1>Authors</h1>
       <h4>Originally Leo Lapworth @ LPW 2009</h4>
-      <h4>Matthew S. Trout</h4>
+      <h4>Amiri Barksdale</h4>
       <h4>Justin D. Hunter</h4>
       <h4>Arthur Axel "fREW" Schmidt</h4>
    </div>
       <h1>What's up guys?</h1>
       <div class="notes">
          <ul>
-            <li>How many people have designed a database with Foreign Keys?</li>
             <li>How many people have used any ORM?<ul>
                <li>In Perl?<ul>
                   <li>DBIC?</li>
-                  <li> Class::DBI? </li>
-                  <li> Rose::DB?  </li>
-                  <li> Fey?  </li>
-                  <li> Others?  </li>
+                  <li>Class::DBI?</li>
+                  <li>Rose::DB?</li>
+                  <li>Fey?</li>
+                  <li>Others?</li>
                </ul></li>
-               <li>AR? </li>
-               <li> DataMapper?  </li>
+               <li>AR?</li>
+               <li>DataMapper?</li>
                <li>(N)Hibernate?</li>
             </ul></li>
          </ul>
    </div>
 
    <div class="slide">
+      <h1>Purpose</h1>
+      <p>The purpose of this talk is to show you as many features of
+      DBIx::Class in 40 minutes so that when you need to do something with
+      it later you will know what's possible</p>
+   </div>
+
+   <div class="slide">
       <h1>DBIx::Class?</h1>
       <ul>
          <li>ORM (object relational mapper)</li>
          <li>SQL &lt;-&gt; OO (using objects instead of SQL)</li>
-         <li>Simple, powerful, complex, fab and confusing</li>
          <li>There are many ORMs, DBIx::Class just happens to be the best in Perl (personal opinion)</li>
       </ul>
    </div>
 
    <div class="slide">
-      <h1>Purpose</h1>
-      <p>The purpose of this talk is to show you as many features of
-      DBIx::Class in 40 minutes
-               so that when you need to do something with it later you will
-               know what's possible</p>
+      <h1>Meta</h1>
+      <p>These are reasons that are not technical or inherent to
+      the code of DBIC, but are totally awesome things about it.</p>
+   </div>
+
+   <div class="slide">
+      <h1>Large Community</h1>
+      <p>Currently there are 88 people listed as contributors to DBIC.  That
+      ranges from documentation help, to test help, to added features,
+      to entire database support.</p>
+   </div>
+
+   <div class="slide">
+      <h1>Active Community</h1>
+      <p>Currently (June 9, 2010) 6 active branches (commited to in the last two weeks) in git.  Last release (0.08122) had 14 new features, and 16 bug fixes.  Of course that <a href="http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/DBIx-Class.git;a=blob;f=Changes">ebbs and flows</a>.</p>
+   </div>
+
+   <div class="slide">
+      <h1>Responsive Community</h1>
+      <ul class="incremental">
+         <li>needed MSSQL Order by support, they helped me add support</li>
+         <li>generally very welcoming of people willing to help</li>
+      </ul>
+   </div>
+
+   <div class="slide">
+      <h1>General ORM</h1>
+      <p>These are things that are in most other ORMs, but are still reasons
+      to use DBIC over raw SQL.</p>
+   </div>
+
+   <div class="slide">
+      <h1>Cross DB</h1>
+      <p>The vast majority of code should run on all databases without needing tweaking</p>
    </div>
 
    <div class="slide">
       <h1>Basic CRUD</h1>
-      <ul>
+      <ul class="incremental">
          <li><strong>C</strong> - Create</li>
          <li><strong>R</strong> - Read</li>
          <li><strong>U</strong> - Update</li>
@@ -149,27 +183,9 @@ $sth-&gt;execute(
    title     =&gt; 'A book title',
    author_id =&gt; $author_id,
 });</pre>
-      <p>Don't need to work to pair placeholders and values</p>
-   </div>
-
-   <div class="slide">
-      <h1>DBIC: Create</h1>
-<pre>my $pratchett = $author_rs-&gt;create({
-   name =&gt; 'Terry Pratchett',
-});</pre>
-   </div>
-
-   <div class="slide">
-      <h1>DBIC: Create</h1>
-<pre>my $book = $pratchett-&gt;create_related(
-  <strong>books</strong> =&gt; {
-   title =&gt; 'Another Discworld book',
-});</pre>
-<strong>or</strong>
-<pre>my $book = $pratchett-&gt;add_to_<strong>books</strong>({
-   title =&gt; 'Another Discworld book',
-});</pre>
-               <p>Automaticaly fills in foreign key for you</p>
+      <ul class="incremental">
+         <li>No need to pair placeholders and values</li>
+      </ul>
    </div>
 
    <div class="slide">
@@ -204,7 +220,9 @@ my $book = $book_rs-&gt;search({
 my @books = $book_rs-&gt;search({
    author =&gt; $author_id,
 })-&gt;all;</pre>
-               <p>TMTOWTDI</p>
+      <ul class="incremental">
+         <li>TMTOWTDI</li>
+      </ul>
    </div>
 
    <div class="slide">
@@ -219,15 +237,6 @@ my @books = $book_rs-&gt;search({
    </div>
 
    <div class="slide">
-      <h1>DBIC: Read</h1>
-<pre>my $resultset = $book_rs-&gt;search({
-   author =&gt; $author_id,
-});</pre>
-      <p>Search takes SQL::Abstract formatted queries</p>
-      <pre>&gt; perldoc SQL::Abstract</p>
-   </div>
-
-   <div class="slide">
       <h1>SQL: Update</h1>
 <pre>my $update = $dbh-&gt;prepare('
    UPDATE books
@@ -263,58 +272,48 @@ $delete-&gt;execute(<strong>$book_id</strong>);</pre>
    </div>
 
    <div class="slide">
-      <h1>Creating models</h1>
+      <h1>OO Overidability</h1>
+      <ul class="incremental">
+         <li>Override new if you want to do validation</li>
+         <li>Override delete if you want to disable deletion</li>
+         <li>and on and on</li>
+      </ul>
+      <div class="notes">
+         <p>I got yelled at about this before by people, so
+         we don't get EVERYTHING from OO, but we do get a lot
+         so :-P</p>
+      </div>
    </div>
 
    <div class="slide">
-<pre>package Foo::Schema::Result::Author;
-__PACKAGE__-&gt;table('authors');
-__PACKAGE__-&gt;add_columns(
-  id =&gt; {
-    data_type         =&gt; 'int',
-    is_auto_increment =&gt; 1
-  },
-  title =&gt; {
-    data_type   =&gt; 'varchar',
-    is_nullable =&gt; 1,
-    size        =&gt; 255,
-  },
-);
-__PACKAGE__-&gt;set_primary_key('id');
-__PACKAGE__-&gt;has_many( books =&gt;
-   'Foo::Schema::Result::Book', 'author_id'
-);
-1;
-</pre>
+      <h1>Convenience Methods</h1>
+      <ul class="incremental">
+         <li>find_or_create</li>
+         <li>create_or_update</li>
+      </ul>
    </div>
 
    <div class="slide">
-<pre style="float: left; font-size: 80%;">package Foo::Schema::Result::Book;
-use strict; use warnings;
-__PACKAGE__-&gt;table('books');
-__PACKAGE__-&gt;add_columns(
-  id =&gt; {
-    data_type         =&gt; 'int',
-    is_auto_increment =&gt; 1
-  },
-  name =&gt; {
-    data_type   =&gt; 'varchar',
-    is_nullable =&gt; 1,
-    size        =&gt; 255,
-  },
-</pre>
-<pre style="float: left; font-size: 80%;">
-  author_id =&gt; {
-    data_type   =&gt; 'int',
-    size        =&gt; 8,
-  },
-);
-__PACKAGE__-&gt;set_primary_key('id');
-__PACKAGE__-&gt;belongs_to( author =&gt;
-   'Foo::Schema::Result::Author', 'author_id'
-);
-1;
-</pre>
+      <h1>Non-column methods</h1>
+      <p>Need a method to get a user's gravatar URL?  Add a
+      gravatar_url method to their Result class</p>
+   </div>
+
+   <div class="slide">
+      <h1>RELATIONSHIPS</h1>
+      <ul class="incremental">
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Relationship#belongs_to">belongs_to</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Relationship#has_many">has_many</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Relationship#might_have">might_have</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Relationship#has_one">has_one</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Relationship#many_to_many">many_to_many</a> (technically not a relationship)</li>
+         <li>SET AND FORGET</li>
+      </ul>
+   </div>
+
+   <div class="slide">
+      <h1>DBIx::Class Specific Features</h1>
+      <p>These things may be in other ORM's, but they are very specific, so doubtful</p>
    </div>
 
    <div class="slide">
@@ -345,25 +344,136 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
    </div>
 
    <div class="slide">
-      <h1>Splitting Logic Cleanly</h1>
-      <p>Foo::Schema::Result::Bar = individual row</p>
-      <p>Foo::Schema::ResultSet::Bar = searches / table </p>
+      <h1>Populate</h1>
+      <p>Made for inserting lots of rows very quicky into database</p>
+<pre>$schema-&gt;populate([ Users =&gt;
+   [qw( username password )],
+   [qw( frew &gt;=4char$  )],
+   [qw(      ...          )],
+   [qw(      ...          )],
+);
+</pre>
+      <ul class="incremental">
+         <li>I use this to <a href="http://blog.afoolishmanifesto.com/archives/1255">export our whole (200M~) db to SQLite</a></li>
+      </ul>
    </div>
 
    <div class="slide">
-      <h1>Using your Schema</h1>
-<pre>#!perl
-use strict; use warnings;
-use lib 'lib';
-use Foo::Schema;
-my $schema = Foo::Schema-&gt;connect($dns, $user, $pass);
-my $author_rs = $schema-&gt;resultset('Author');
-my $author    = $author_rs-&gt;create({
-   name =&gt; 'Douglas Adams',
-});
-my $book = $author-&gt;add_to_books({
-   title =&gt; '42',
-});
+      <h1>Multicreate</h1>
+      <p>Create an object and all of it's related objects all at once</p>
+<pre>$schema-&gt;resultset('Author')-&gt;create({
+   name =&gt; 'Stephen King',
+   books =&gt; [{ title =&gt; 'The Dark Tower' }],
+   address =&gt; {
+      street =&gt; '123 Turtle Back Lane',
+      state  =&gt; { abbreviation =&gt; 'ME' },
+      city   =&gt; { name =&gt; 'Lowell' },
+   },
+</pre>
+      <div class="notes">
+         <ul>
+            <li>books is a has_many</li>
+            <li>address is a belongs_to which in turn belongs to state and city each</li>
+            <li>for this to work right state and city must mark abbreviation and name as unique</li>
+         </ul>
+      </div>
+   </div>
+
+   <div class="slide">
+      <h1>Extensible</h1>
+      <p>DBIx::Class helped pioneer fast MI in Perl 5 with Class::C3, so it is made
+      to allow extensions to nearly every part of it.</p>
+   </div>
+
+   <div class="slide">
+      <h1>Extensible: DBIC::Helpers</h1>
+      <ul class="incremental">
+         <li>DBIx::Class::Helper::ResultSet::IgnoreWantarray</li>
+         <li>DBIx::Class::Helper::ResultSet::Random</li>
+         <li>DBIx::Class::Helper::ResultSet::SetOperations</li>
+         <li>DBIx::Class::Helper::Row::JoinTable</li>
+         <li>DBIx::Class::Helper::Row::NumifyGet</li>
+         <li>DBIx::Class::Helper::Row::SubClass</li>
+         <li>DBIx::Class::Helper::Row::ToJSON</li>
+      </ul>
+   </div>
+
+   <div class="slide">
+      <h1>Extensible: DBIC::TimeStamp</h1>
+      <ul class="incremental">
+         <li>Cross DB</li>
+         <li>set_on_create</li>
+         <li>set_on_update</li>
+      </ul>
+   </div>
+
+   <div class="slide">
+      <h1>Extensible: DBIx::Class::Schema::KiokuDB</h1>
+      <ul class="incremental">
+         <li>Kioku is the new hotness</li>
+         <li>Mix RDBMS with Object DB</li>
+         <li>beta ( == sexy )</li>
+      </ul>
+   </div>
+
+   <div class="slide">
+      <h1>SQL::Abstract</h1>
+      <pre>my $resultset = $book_rs-&gt;search({
+         name =&gt; { -like =&gt; "%$nick%" },
+      });</pre>
+      <ul class="incremental">
+         <li>(kinda) introspectible</li>
+         <li>Prettier than SQL</li>
+      </ul>
+   </div>
+
+   <div class="slide">
+      <h1>Result vs ResultSet</h1>
+         <ul class="incremental">
+            <li>Result == Row</li>
+            <li>ResultSet == Query</li>
+            <li>(less important but...)</li>
+            <li>ResultSource == Table</li>
+            <li>Storage == Database</li>
+         </ul>
+   </div>
+
+   <div class="slide">
+      <h1>ResultSet methods</h1>
+<pre>package MyApp::Schema::ResultSet::Book;
+use base 'DBIx::Class::ResultSet';
+sub good {
+   my $self = shift;
+   $self-&gt;search({
+      rating =&gt; { '&gt;=' =&gt; 4 },
+   })
+};
+sub cheap {
+   my $self = shift;
+   $self-&gt;search({
+      price =&gt; { '&lt;=' =&gt; 5}
+   })
+};
+# ...
+1;
+      </pre>
+      <ul class="incremental">
+         <li>All searches should be ResultSet methods</li>
+         <li>Name has obvious meaning</li>
+      </ul>
+   </div>
+
+   <div class="slide">
+      <h1>ResultSet method in Action</h1>
+      <pre>$schema-&gt;resultset('Book')-&gt;good</pre>
+   </div>
+
+   <div class="slide">
+      <h1>ResultSet Chaining</h1>
+<pre>$schema-&gt;resultset('Book')
+   -&gt;good
+   -&gt;cheap
+   -&gt;recent
 </pre>
    </div>