<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>Kevin Lawver&apos;s Presentations</title>
      <link>http://presentations.lawver.net/</link>
      <description>I&apos;ve given almost all of these presentations as training at work.  Since none of them contain AOL-specific stuff, and they might be useful to someone else, here they are.</description>
      <language>en</language>
      <copyright>Copyright 2008</copyright>
      <lastBuildDate>Tue, 13 May 2008 15:44:35 -0500</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=4.1</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

      
      <item>
         <title>An Introduction to Ruby on Rails</title>
         <description><![CDATA[<div class="slide">

<h1>Ruby on Rails? What's That?</h1>


<ul>
<li>"highly opinionated" web application framework written in Ruby</li>
<li>full-featured <span class="caps">MVC, </span>complete with development environment</li>
<li>as much a philosophy for development as a framework</li>
</ul>



</div>

<div class="slide">


<h1>Ruby on Rails' Strengths</h1>


<ul>
<li>Easy to get started with, easy to get something done enough to launch</li>
<li>Easy to re-factor and replace weak code with stronger</li>
<li>Development speed and philosophy lend themselves to agile development methodologies</li>
</ul>



</div>

<div class="slide">

<h1>Weaknesses</h1>


<ul>
<li>Some confusion about scale and the "right" architecture for Rails apps
<ul>
<li>Lots of people using Rails for the "wrong" thing.</li>
</ul>
</li>
<li>Can be hard to debug memory and performance issues</li>
<li>Speed of new features/fixes/best practices can make it hard to keep up, especially in a behemoth like <span class="caps">AOL.</span></li>
<li>Lots of <span class="caps">FUD </span>in other communities about Rails' weaknesses, can be hard to separate myth from reality and past from present.</li>
</ul>



</div>

<div class="slide">

<h1>When (and not) to Use Rails</h1>


<ul>
<li>When:
<ul>
<li>You need the power of <span class="caps">MVC, </span>but want to <strong>Get Things Done</strong>&trade; quickly</li>
<li>You want unit tests, a sane and flexible environment and help to do the <strong>Right Thing</strong>&trade;</li>
<li>You like being a part of a very active and passionate development community</li>
<li>You can start with a clean slate database-wise</li>
</ul>
</li>
<li>But Not When:
<ul>
<li>You don't need an <span class="caps">MVC </span>or framework, <em>especially</em> if you don't need a database</li>
<li>You need to get lots of data from lots of different sources for each request</li>
<li>You're constrained by a legacy database and can't change anything</li>
</ul>
</li>
</ul>



</div>	

<div class="slide">

<h1>Some Companies Running Rails</h1>


<ul>
<li><a href="http://www.hulu.com">Hulu</a></li>
<li><a href="http://vimeo.com">Vimeo</a></li>
<li><a href="http://basecamphq.com">Basecamp</a> (by <a href="http://37signals.com">37signals</a> - they created Rails)</li>
<li><a href="http://www.yellowpages.com">YellowPages.com</a></li>
<li><a href="http://twitter.com">Twitter</a></li>
<li>Rails also runs some of the most popular Facebook apps, including Packrat and another one I can't tell you about (I was sworn to secrecy)</li>
</ul>



</div>

<div class="slide">

<h1>The Ruby in Rails</h1>


<ul>
<li>Everything is an object
<ul>
<li>You can do things like: <code>15.times do</code></li>
</ul>
</li>
<li>Or: "Bob Denver".downcase</li>
<li>Real support for mix-ins, which makes patching and plugging in new features a snap</li>
<li>It makes for very compact, expressive and human-readable code.</li>
</ul>



</div>

<div class="slide">

<h1>Demo Time!</h1>


<ul>
<li>If you have OS X Leopard, you already have Rails (surprise!)
<ul>
<li>Before doing anything, you'll need to run: sudo gem update</li>
</ul>
</li>
<li>On Windows, check out <a href="http://instantrails.rubyforge.org/wiki/wiki.pl">InstantRails</a> </li>
<li>Lots of tutorials for the different flavors of *nix.</li>
</ul>



</div>

<div class="slide">

<h1>Creating a Rails App</h1>


<ul>
<li><code>rails name_of_your_rails_app</code></li>
<li><code>cd name_of_your_rails_app</code></li>
<li>Run <code>script/server</code> and then go to http://localhost:3000 </li>
<li>Ooh and Ahh.</li>
</ul>



</div>

<div class="slide">

<h1>Creating a Model</h1>


<ul>
<li><code>script/generate model Entry</code></li>
<li>Open up db/migrate/001_create_entries.rb</li>
<li>Add some columns (<a href="http://dev.lawver.net/rails/001_create_entries.rb.txt">see mine</a>)</li>
<li>Run <code>rake db:migrate</code></li>
<li>Hey look, we have a table!</li>
</ul>



</div>

<div class="slide">

<h1>Playing With Your Model</h1>


<ul>
<li><code>script/console</code></li>
<li><code>entry = Entry.new</code></li>
<li><code>entry.title = &quot;My First Blog Entry&quot;</code></li>
<li><code>entry.body = &quot;Hey, look, it's a blog entry!&quot;</code></li>
<li><code>entry.save!</code></li>
</ul>



</div>

<div class="slide">

<h1>The Faster Way to Create</h1>



<pre><code>entry = Entry.create(
	:title =&gt; &quot;My Second Blog Entry&quot;,
	:body =&gt; &quot;Wow, that's pretty awesome!&quot;
)</code></pre>



</div>

<div class="slide">

<h1>Let's Make It Look Like Something!</h1>


<ul>
<li>Create a new <span class="caps">HTML </span>document and save it to app/views/layouts/blog.html.erb 
<ul>
<li><a href="http://dev.lawver.net/rails/blog.html.erb.txt">see mine</a></li>
</ul>
</li>
<li>script/generate controller entries index show</li>
<li>Open app/controllers/entries_controller.rb</li>
<li>Create a new line above "def index" and add:
<ul>
<li><code>layout &quot;blog&quot;</code></li>
</ul>
</li>
<li>On a new line under <code>def index</code>, add:
<ul>
<li><code>@entries = Entry.find(:all,:order =&gt; &quot;created_at DESC&quot;,:limit =&gt; 10)</code></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Looking Good!</h1>


<ul>
<li>Now, open app/views/entries/index.html.erb
<ul>
<li><a href="http://dev.lawver.net/rails/index.html.erb.01.txt">Grab mine</a></li>
</ul>
</li>
<li>run <code>script/server</code></li>
<li>visit http://localhost:3000/entries</li>
<li>Ta-da!</li>
</ul>



</div>

<div class="slide">

<h1>Not Interesting Enough? Let's Add Comments!</h1>


<ul>
<li><code>script/generate model Comment</code></li>
<li>open db/migrate/002_create_comments.rb</li>
<li>Let's add some columns
<ul>
<li><a href="http://dev.lawver.net/rails/002_create_comments.rb.txt">Grab mine</a></li>
</ul>
</li>
<li><code>rake db:migrate</code></li>
</ul>



</div>

<div class="slide">

<h1>Associations</h1>


<ul>
<li>Open app/models/entry.rb</li>
<li>Create a new line under line 1 and add:
<ul>
<li><code>has_many :comments</code></li>
</ul>
</li>
<li>Open app/models/comment.rb and under line 1, add:
<ul>
<li><code>belongs_to :entry</code></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Let's Test It Out!</h1>


<ul>
<li>Run <code>script/console</code></li>
<li><code>entry = Entry.find(1)</code></li>
<li><code>entry.comments</code></li>
<li>I guess we don't have any... so, let's create one!</li>
<li><code>entry.comments.create(:email =&gt; &quot;someone@somewhere.com&quot;,:url =&gt; &quot;http://somewhere.com&quot;,:body =&gt; &quot;Awesome blog post!&quot;)</code></li>
<li>Now, let's see what entry.comments is...</li>
</ul>



</div>

<div class="slide">

<h1>Let's Display Them</h1>


<ul>
<li>Open app/controllers/entries_controller.rb
<ul>
<li>Or <a href="http://dev.lawver.net/rails/entries_controller.rb.02.txt">grab mine</a></li>
</ul>
</li>
<li>Inside "def show", add:
<ul>
<li><code>@entry = Entry.find(params['id'],:include =&gt; 'comments')</code></li>
<li><code>@page_title = @entry.title</code></li>
</ul>
</li>
<li>Open app/views/entries/show.html.erb
<ul>
<li><a href="http://dev.lawver.net/rails/show.html.erb.txt">Grab mine</a></li>
</ul>
</li>
<li>Oops! We forgot to get commenters' names!</li>
</ul>



</div>

<div class="slide">

<h1>Database Versioning!</h1>


<ul>
<li><code>script/generate migration add_name_to_comments</code></li>
<li>Open db/migrate/003_add_name_to_comments.rb</li>
<li>Inside self.up, add: <code>add_column :comments, :name, :string</code></li>
<li>Run <code>rake db:migrate</code></li>
<li>Now we can go display things!</li>
</ul>



</div>


<div class="slide">

<h1>Back to views</h1>


<ul>
<li>Make sure script/server is running</li>
<li>Go to http://localhost:3000/entries/show/1</li>
<li>Ta-da!</li>
</ul>



</div>

<div class="slide">

<h1>That's it!</h1>


<ul>
<li>There are more associations, unit tests, validations and others, but that's enough for one brown bag.</li>
<li>I left out almost all data validations and we didn't do any tests.</li>
</ul>



</div>

<div class="slide">

<h1>Things I've Learned</h1>


<ul>
<li>The console is your friend.</li>
<li>Fat models and skinny controllers are the best.</li>
<li>Get someone "honest" to write your tests.</li>
<li>Think about result set size.</li>
<li>Speed makes up for a myriad of sins</li>
</ul>



</div>

<div class="slide">

<h1>The Scale Myth</h1>

<blockquote><p>...languages don't scale, architectures do</p></blockquote>

</div>

<div class="slide">

<h1>Scale is Inside</h1>


<ul>
<li>Rails will scale if you do it right, just like anything else
<ul>
<li>Time to market is more important than scale to begin with anyway, so just get it out there and scale when you have to.</li>
</ul>
</li>
<li>Cache everything you can to protect the hard-to-scale bits of your app (database, disk, etc)</li>
<li>Don't return unbounded associations!</li>
<li>For example, back in our controller...</li>
</ul>



</div>

<div class="slide">

<h1>Unbounded Associations</h1>


<ul>
<li>In app/controllers/entries_controller.rb, show method:
<ul>
<li>Entry.find(params['id'],:include =&gt; "comments")</li>
</ul>
</li>
<li>What if that entry has 10,000 comments? </li>
<li>Create model methods with count limits, and page through.</li>
<li>Let's fix it...</li>
</ul>



</div>

<div class="slide">

<h1>Model Methods</h1>


<ul>
<li>Open app/models/entry.rb</li>
<li>After has_many :comments, add a new method:</li>
</ul>





<pre><code>def limited_comments(count=10,offset=0)
	self.comments.find(
		:all,
		:limit =&gt; count,
		:offset =&gt; offset
	)
end</code></pre>



</div>

<div class="slide">

<h1>Let's Try It!</h1>


<ul>
<li>First, we need to create at least 15 comments (this'll take some time)... or not!
<ul>
<li>In script/console</li>
<li><code>entry = Entry.find(1)</code></li>
<li><code>15.times {|i| entry.comments.create(:name =&gt; &quot;Me!&quot;,:body =&gt; &quot;I am comment #{i}!&quot;)}</code></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Ch-ch-changes</h1>


<ul>
<li>In app/controllers/entries_controller.rb, show becomes:</li>
</ul>





<pre><code>def show
	@entry = Entry.find(params['id'])
	@page_title = @entry.title
	offset = params[:offset] || 0
	@comments = @entry.limited_comments(10,offset)
end</code></pre>



</div>

<div class="slide">

<h1>Changing the Show</h1>


<ul>
<li>Which means we need to change app/views/entries/show.html.erb</li>
<li>Anywhere we see @entry.comments, we change it to @comments</li>
</ul>



</div>

<div class="slide">

<h1>Cache It!</h1>


<ul>
<li>Protect your database by caching everything you can!
<ul>
<li>Don't use disk-based caching in large deployments - because you'll have lots of instances and lots of disks.</li>
<li>Cache items as atomically as possible.</li>
<li>Separate cache deletion methods between object and partials (just remember this, it will make sense later)</li>
</ul>
</li>
<li>Check out the <a href="http://errtheblog.com/posts/57-kickin-ass-w-cachefu">cache_fu</a> plugin</li>
<li>Memcached is the coolest thing ever.</li>
</ul>



</div>

<div class="slide">

<h1>Be Careful Who You Trust</h1>


<ul>
<li>There are literally hundreds of Rails plugins out there. Be sure to check the code, and ask around before choosing a plugin for "serious" stuff (like database replication).</li>
<li>Make sure any tutorials you follow are up to date.</li>
</ul>



</div>

<div class="slide">

<h1>Be Flexible</h1>


<ul>
<li>The fix-rate in Rails-land is fast and furious.  I don't recommend living on Edge Rails, but stay open to rewrites.
<ul>
<li>If you decide you <em>have</em> to monkey-patch Rails, keep it small and remember that it's there so future versions don't bite you.</li>
</ul>
</li>
<li>It should never take you so long to write a single feature that you feel bad about discarding it and starting over!</li>
<li>Rails feels a lot more like art than code - sketch, form, re-form, tweak and mold.
<ul>
<li>And that's Ruby... learn and follow The Ruby Way. Don't write Ruby like you'd write <span class="caps">PHP </span>- it will <em>suck</em>.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Keep 'em  Separated</h1>


<ul>
<li>If you have a problematic part of your app, keep it separate!  You can run it on separate mongrels, which will give you time to troubleshoot and isolate the problem.</li>
<li>Mongrel behind Apache with mod_proxy_balancer gives you a lot of flexibility.  Use it.</li>
</ul>



</div>

<div class="slide">

<h1>Speed Makes Up For Everything</h1>


<ul>
<li>On <a href="http://photos.aim.com"><span class="caps">AIM</span> Photos</a>, we were able to completely rewrite how we did things in an afternoon, test it, and repeat until we got it right.</li>
<li>Developer time is expensive. The faster they can get things done, the better. </li>
<li>Developer morale is <em>more</em> expensive. If they're not having fun and feeling productive, they'll work <em>much</em> slower.</li>
<li>At its core, Rails is fun to work with.</li>
</ul>



</div>

<div class="slide">

<h1>An 'Incredible' Quote</h1>

<blockquote><p>In my experience, the thing that has the most significant impact on a movie's budget __ but never shows up in a budget __ is morale. If you have low morale, for every $1 you spend, you get about 25 cents of value. If you have high morale, for every $1 you spend, you get about $3 of value. Companies should pay much more attention to morale.</p></blockquote>

<p><a href="http://gigaom.com/2008/04/17/pixars-brad-bird-on-fostering-innovation/">Brad Bird</a></p>

</div>

<div class="slide">

<h1>The Future</h1>


<ul>
<li><a href="http://jruby.codehaus.org/">JRuby</a> looks promising</li>
<li>Life after <a href="http://mongrel.rubyforge.org/">Mongrel</a>
<ul>
<li><a href="http://code.macournoyer.com/thin/">Thin</a></li>
<li><a href="http://www.modrails.com/">Passenger</a></li>
</ul>
</li>
<li>Rails' little brothers
<ul>
<li><a href="http://merbivore.com">Merb</a></li>
<li><a href="http://www.nitroproject.org/">Nitro</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Recommended Reading</h1>


<ul>
<li><strong>Agile Development With Rails</strong> (wait until the 3rd edition comes out)
<ul>
<li><span class="caps">O'R</span>eilly's <strong>Ruby in a Nutshell</strong> is a good desk reference</li>
</ul>
</li>
<li><a href="http://weblog.rubyonrails.com/">Riding Rails</a></li>
<li><a href="http://weblog.jamisbuck.org/">buckblog</a></li>
<li><a href="http://blog.hasmanythrough.com">has_many :through</a></li>
<li><a href="http://errtheblog.com/">Err the Blog</a></li>
<li><a href="http://blog.hungrymachine.com/">Hungry Machine</a></li>
</ul>



</div>	

<div class="slide">

<h1><span class="caps">AOL'</span>s Rails Apps</h1>


<ul>
<li><a href="http://ficlets.com">Ficlets</a></li>
<li><a href="http://www.circavie.com">circaVie</a></li>
<li><a href="http://photos.aim.com"><span class="caps">AIM</span> Photos</a></li>
<li><a href="http://www.pixnay.com">Pixnay</a></li>
</ul>



</div>

<div class="slide">

<h1>Questions?</h1>


<ul>
<li><a href="http://dev.lawver.net/rails/demo_app.tar.gz">Download the app</a></li>
<li>E-mail: kevin.lawver@corp.aol.com</li>
<li><span class="caps">AIM</span>: kplawver</li>
<li>Blog: <a href="http://lawver.net">Ultranormal</a></li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/philosophy/an_introduction_to_ruby_on_rai/</link>
         <guid>http://presentations.lawver.net/philosophy/an_introduction_to_ruby_on_rai/</guid>
         <category>philosophy</category>
         <pubDate>Tue, 13 May 2008 15:44:35 -0500</pubDate>
      </item>
      
      <item>
         <title>AIM Photos: A Case Study in Agile Development</title>
         <description><![CDATA[<div class="slide">

<h1>What's <span class="caps">AIM</span> Photos?</h1>


<ul>
<li>A simple little photo sharing site built to support <a href="http://profiles.aim.com"><span class="caps">AIM</span> Profiles</a></li>
<li>The first large-scale <a href="http://rubyonrails.com">Ruby on Rails</a> application at <span class="caps">AOL</span></li>
<li>Pretty quick, and growing at a healthy clip</li>
<li><a href="http://photos.aim.com">Go check it out</a></li>
</ul>



</div>

<div class="slide">

<h1>The Team</h1>


<ul>
<li>Product: Ian Costello (left <span class="caps">AOL</span>), Will Kern (ditto), Jeremy Rephlo (as far as we know, he's staying)</li>
<li>Initial Developers: Venkat Balasubramanian, Jason Garber (left early on), David McVicar, Kevin Lawver</li>
<li>QA: Laura Haft and Dia Johnson</li>
<li>Project Management: Sabrina Doepringhaus</li>
<li>Operations: Dan Bradley</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">AIM</span> Photos Challenges</h1>


<ol>
<li>We have photos products already, do we need another one?</li>
<li>How/where do we store all the photos?</li>
<li>How do we convert them and retain quality?</li>
<li>We have little time and lots to do</li>
<li>And none of us have built a photo application before!</li>
</ol>



</div>

<div class="slide">

<h1>Choices</h1>


<ul>
<li>None of the existing photo products we have fit the product requirements
<ul>
<li>XDrive has an <span class="caps">API </span>and storage and it made long-term sense, but they couldn't support all of the product requirements for launch.</li>
<li><span class="caps">AOL</span> Pictures couldn't meet the date and had their own priorities</li>
</ul>
</li>
<li>So, we went with <span class="caps">WSS </span>for storage - lots of space and an easy <span class="caps">HTTP</span>-based <span class="caps">API</span>
<ul>
<li>With the understanding that we'd work with the XDrive folks to get their <span class="caps">API</span>s in a state we could use and we'd talk about moving in the future.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>The Big Choice: Ruby on Rails</h1>


<ul>
<li>I'd just built <a href="http://ficlets.com">ficlets</a>, and we didn't have much time.</li>
<li>Ficlets and <a href="http://circavie.com">circaVie</a> both proved you could built quality products quickly with limited resources - which was exactly our condition</li>
<li><span class="caps">AIM</span> Photos seemed like a good candidate to see if Rails could scale</li>
</ul>



</div>

<div class="slide">

<h1>Results</h1>


<ul>
<li>With a rotating crew of three developers (only one was on the project the whole time) and two QA engineers (one full-time), we built and launched <span class="caps">AIM</span> Photos in four months.</li>
<li>Over 6.5 million photos (about half came from migration) in less than three months.</li>
<li>Some load issues related to memory use and way underestimating growth, which we'll get to in a bit.</li>
</ul>



</div>

<div class="slide">

<h1>The Graph</h1>

<p><img src="http://crunch.office.aol.com/aimphotos/photo_uploads.png" alt="" /></p>

</div>

<div class="slide">

<h1>Process</h1>


<ul>
<li>We used Scrum</li>
<li>It worked a treat:
<ul>
<li>We hit every sprint on time, and were 80% utilized</li>
<li>Even though we had a ton to do and very little time, we still beat Profiles out the door</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Embracing Scrumminess</h1>


<ul>
<li>Scrum works really well only if:
<ul>
<li><em>Everyone</em> on the team embraces it.  Product has to buy in and be a part of the process or you're just doing little waterfalls</li>
<li><em>Everyone</em> believes in constant course correction and works to product better estimates, give better status reports and work smarter</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Architecture</h1>

<p><img src="http://crunch.office.aol.com/aimphotos/aimphotos_architecture.png" alt="" /></p>

</div>

<div class="slide">

<h1>Rails Helpers</h1>


<ul>
<li>We use a handful of great Rails plugins, which shows how reactive the community is to scaling needs:
<ul>
<li>cache_fu: Great memcached integration with ActiveRecord models.</li>
<li>Gibberish: Localization</li>
<li>acts_as_readonlyable: Easy-as-pie plugin to handle writer/reader databases.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Issue: Database Handles</h1>


<ul>
<li>We started out using acts_as_partitionable, which, unfortunately, created a database connection for every model/database combination, which meant that across 60 mongrels, we were keeping up over five hundred open connections to the writer database</li>
<li>Solved by finding and switching to acts_as_readonlyable.</li>
<li><strong>Lesson Learned</strong>: Choose your plugins carefully!</li>
</ul>



</div>

<div class="slide">

<h1>Issue: Memory and Image Manipulation</h1>


<ul>
<li>Image manipulation is memory intensive and leaky.
<ul>
<li>We got hit by a memory leak in RMagick, which causes very bad things to happen to Mongrel</li>
<li>We found a way around it for now, but it took too long to figure out and fix</li>
<li>Exposes the immaturity of Rails profiling tools and understanding of how it uses and frees memory</li>
<li>But, it was possible, and the community is making huge strides in building those tools</li>
</ul>
</li>
<li><strong>Lesson Learned</strong>: We should have spent more time looking at memory usage during development.</li>
</ul>



</div>

<div class="slide">

<h1>The Whole Graph</h1>

<p><img src="http://crunch.office.aol.com/aimphotos/photo_uploads_all.png" alt="" /></p>

</div>

<div class="slide">

<h1>A Happy Disaster</h1>


<ul>
<li><span class="caps">AIM</span> Photos is getting about 3x more traffic than estimated</li>
<li>When it was only 2x more, we were doing <span class="caps">OK.</span></li>
<li>Then, something happened, and...  we weren't.</li>
<li>Dan will talk about this a little, but thanks to him and being on the Matrix, we doubled our capacity in three days.  Hooray for Operations!</li>
</ul>



</div>

<div class="slide">

<h1>Diary: The Java Developer (Venkat)</h1>


<ul>
<li>Venkat asked me to give his slides... so pretend I'm him.</li>
</ul>



</div>

<div class="slide">

<h1>The Choice Thing</h1>


<ul>
<li>Rails makes some choices for you and has strong opinions about how things should be done. For the most part this, is a <em>good thing</em>.</li>
<li>On a lot of java projects, you just <strong>get it out the door</strong>&trade; and then cram it into an <span class="caps">MVC </span>later. Rails takes care of that for you and makes it easy to do the right thing.
<ul>
<li>The same can be said for unit testing, but Dave will cover that.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Configuration</h1>


<ul>
<li>Configuration is so much easier than having to deal with dozens of <span class="caps">XML </span>files like in Javaland.</li>
<li>Convention over configuration makes it really easy to get things working with little config.</li>
</ul>



</div>

<div class="slide">

<h1>The Console</h1>


<ul>
<li>The Rails console is invaluable for debugging and rapidly developing models and plugins</li>
</ul>



</div>

<div class="slide">

<h1>Community</h1>


<ul>
<li>The community is extremely active and helpful</li>
<li>It's really easy to find plugins and recommendations.</li>
<li>There's a lot of interest and things move quickly</li>
</ul>



</div>

<div class="slide">

<h1>The Right Choice for Some Things</h1>


<ul>
<li>Rails is the right choice for <em>some</em> apps, not all:
<ul>
<li>Iterative developed and quickly deployed</li>
<li>Small/medium sized web applications</li>
<li>Lets you get up and running quickly and saves a lot of time with quality built-in solutions</li>
</ul>
</li>
<li>See also: <a href="http://jimweirich.tadalist.com/lists/public/14055">Ten Things a Java Programmer Should Know About Ruby</a></li>
</ul>



</div>

<div class="slide">

<h1>Diary: The Value of Unit Tests (Dave)</h1>

</div>

<div class="slide">

<h1>Why Automated Unit Tests?</h1>


<ul>
<li>Code can break more easily when multiple developers update a repository</li>
<li>Functional breakdowns/Regression can be detected more easily</li>
<li>Validates your Model and Controller Interfaces</li>
<li>They're built-in with Rails!</li>
</ul>



</div>

<div class="slide">

<h1>Types of Tests in Rails</h1>


<ul>
<li>Unit Tests
<ul>
<li>Tests Rails Model</li>
<li><span class="caps">YAML </span>programmatically builds test data</li>
</ul>
</li>
<li>Functional Tests
<ul>
<li>Test Rails Controllers</li>
<li>Simulates <span class="caps">HTTP </span>requests + query params from a client</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Further Investigation</h1>


<ul>
<li>Google "TDD Rails" Test Driven Development</li>
<li><span class="caps">BDD </span>with <a href="http://rspec.rubyforge.org">rSpec</a></li>
</ul>



</div>	

<div class="slide">

<h1>Diary: The Testers Perspective (Laura)</h1>

</div>

<div class="slide">

<h1>Challenges</h1>


<ul>
<li>Environment set-up</li>
<li>What is the best way to overlap development and QA?</li>
<li>How can we test effectively and efficiently?</li>
<li>How do we make sure that new bugs get addressed in a timely manner?</li>
</ul>



</div>

<div class="slide">

<h1>What Worked Well</h1>


<ul>
<li>Pre-QAR testing</li>
<li>Daily builds</li>
<li>Combinations of <span class="caps">TCM </span>and exploratory testing</li>
<li>Including tasks such as build installs and bug re-testing in the sprint planning</li>
<li>Daily bug scrubs</li>
</ul>



</div>

<div class="slide">

<h1>Diary: Operational Considerations (Dan)</h1>

</div>

<div class="slide">

<h1>Rapid Application Delivery with the Matrix</h1>


<ul>
<li>To share hardware or not to share hardware, that is the question.</li>
<li>Pro: Shared hardware cuts down on time to deployment, and greatly<br />
increases expandability in times of crisis.</li>
<li>Con: shared hardware makes you ruin other applications when you have<br />
memory leaks or performance issues.</li>
<li>Con: versions of dependancies have to be the same.  So if a different<br />
app comes along and wants to use Rails 2.0, we will have a hard time<br />
installing both onto the same host.</li>
<li>We use the Matrix, which is a shared infrastructure, which means our<br />
development team will have to work extra hard to get the performance up<br />
to par.  </li>
<li>Given that we have had to rapidly scale to double our cacpacity, which<br />
took 1 business day, I think we made the right decision. If we didn't<br />
have to go through hoops for dependancies, we could probably reduce this<br />
time.</li>
</ul>



</div>

<div class="slide">

<h1>How to deploy rails in production </h1>


<ul>
<li>We created the basic rails application in <span class="caps">BCS.  </span></li>
<li>We also put all of our gems in <span class="caps">BCS. </span> The advantages are thet we can<br />
install from any <span class="caps">AOL </span>datacenter, we always have the same code, and we<br />
are able to track and query whats installed through standard rpm<br />
commands.</li>
<li>Use apache to front end rails.  We need to for <span class="caps">VL, </span>plus we can use<br />
mod_proxy_balancer to offload requests for <span class="caps">WSS.  </span></li>
</ul>



</div>

<div class="slide">

<h1>Tracking down performance issues</h1>


<ul>
<li>Initially, we had performance problems with photos in production, that<br />
didn't happen in dev.  It turns out the <span class="caps">BCS </span>version of the mysql plugin<br />
wasn't working because we had a mismatch of the gem and the mysql client<br />
library on the hosts we installed to. This made the application hang<br />
after a period of time, and prevented us from putting any real traffic<br />
on it at launch.   </li>
<li>Rails has had the previously mentioned memory leak.  Tracking it down<br />
in production has been nearly impossible.  The runtime tools for rails<br />
leave a lot to be desired.</li>
</ul>



</div>

<div class="slide">

<h1>Diary: Project Management Nightmares (Sabrina)</h1>

</div>

<div class="slide">

<h1>What Worked Well</h1>


<ul>
<li>Scrum worked really well here</li>
<li>Prep on tasks breakdown and estimates make sprint planning a <strong>breeze</strong></li>
<li>Winner: individual's accountability and team collaboration to meet the sprint's goal
<ul>
<li>(resources to volunteer in helping with tasks behind schedule)</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Challenges</h1>


<ul>
<li>Ruby QA environment setup (AIM Photos is the pioneer!)</li>
<li>UI design happening in parallel with development in the same sprint
<ul>
<li>our tech lead helped out quite a bit here</li>
</ul>
</li>
<li>Discovery of new tasks and under-estimation of efforts in the beginning</li>
<li>And then the usual: integrating party not in sync to integrate at the same time.</li>
</ul>



</div>

<div class="slide">

<h1>Conclusion</h1>


<ul>
<li>Other than some growing pains, and on-the-run learning, the experience with Rails has been great.
<ul>
<li>There have been some operational issues, but they've been fairly easy to remedy or work around.</li>
<li>The speed of development, testing and developer happiness is worth some pain in being an early adopter</li>
<li>We need to experiment with new technologies to find the ones we should jump on and adopt.</li>
</ul>
</li>
<li>Scrum is great if you embrace it fully.  The entire team has to buy in or it won't work.</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/aol/aim_photos_a_case_study_in_agi/</link>
         <guid>http://presentations.lawver.net/aol/aim_photos_a_case_study_in_agi/</guid>
         <category>aol</category>
         <pubDate>Mon, 10 Dec 2007 11:21:37 -0500</pubDate>
      </item>
      
      <item>
         <title>The Future of Markup</title>
         <description><![CDATA[<div class="slide">

<h1>The Current Markup World</h1>


<ul>
<li><span class="caps">XHTML</span> 1.0 Transitional provides the best benefit for web developers.
<ul>
<li>Enforces consistency and validation</li>
<li>Throws browsers in standards mode which reduces (but doesn't eliminate) differences between modern web browsers.</li>
<li>Allows for popular and necessary (but ungood) features like iframes that have been removed from <span class="caps">XHTML</span> 1.0 Strict and above</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>The Best Practices</h1>


<ul>
<li>Use the vocabulary to provide meaning around the data</li>
<li>Write as little markup as possible to convey meaning and give you enough hooks to write <span class="caps">CSS </span>for</li>
</ul>



</div>

<div class="slide">

<h1>Kevin's Theory of Heterogenous Markup</h1>


<ul>
<li>It's easier to style documents when you know what markup to expect.</li>
<li>It's easier to style documents when there are different types of elements to build selectors around.</li>
<li>It's a lot easier to read type selectors than class selectors.</li>
<li>You will build smaller, faster, better web applications if you use fewer divs and open yourself to the wide array of semantic elements the <span class="caps">XHTML</span> 1.0 spec has to offer you.</li>
</ul>



</div>

<div class="slide">

<h1>Think Outside the &lt;div&gt;</h1>


<ul>
<li>Divs are for large divisions of the page, or pieces that don't have other applicable semantics</li>
<li>Use id's and classes to add semantics
<ul>
<li><a href="http://microformats.org">microformats</a> are a good start</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Spans are Useless</h1>


<ul>
<li>It takes at least 13 characters to put a span around content.</li>
<li>Spans are meaningless.</li>
<li>It's better to use another, shorter, meaningless element instead.</li>
<li>b or i save you 6 characters per instance, which, over a large document, can significantly reduce page size.</li>
</ul>



</div>

<div class="slide">

<h1>Semantics Are What You Make of Them</h1>


<ul>
<li><span class="caps">HTML </span>was originally meant to mark up scientific documents</li>
<li>It misses a lot of semantics needed in today's web</li>
<li>It's OK to <em>bend</em> the original semantics of the element to serve your purpose and to get to heterogenous markup</li>
</ul>



</div>

<div class="slide">

<h1>Questions Before We Travel to the <em>Future</em>?</h1>


<ul>
<li>One?  Two?  Three?</li>
<li>Are they well-formed and valid?</li>
<li>Now, what's coming next?</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">XHTML</span> 2 vs. <span class="caps">HTML5</span></h1>


<ul>
<li><span class="caps">XHTML</span> 2 has been in the works in the <span class="caps">W3C </span>for years...
<ul>
<li>But, web developers don't want it and neither do browser vendors</li>
</ul>
</li>
<li>Ian Hickson started the <a href="http://whatwg.org"><span class="caps">WHAT</span> Working Group</a> as a response to <span class="caps">XHTML</span> 2 "abandoning" the "real" web</li>
<li><span class="caps">AOL </span>and others led the charge to get a new "real web" HTML group started within the <span class="caps">W3C.</span></li>
<li>Now, we have a new <span class="caps">HTML</span> Working Group working on <span class="caps">HTML5 </span>(basically, the <span class="caps">WHATWG'</span>s spec brought under the <span class="caps">W3C </span>umbrella)</li>
</ul>



</div>

<div class="slide">

<h1>What's New in <span class="caps">HTML5</span>?</h1>


<ul>
<li>better document semantics</li>
<li>new form elements</li>
<li>video and audio get their own elements</li>
<li>offline storage <span class="caps">API</span></li>
</ul>



</div>

<div class="slide">

<h1>Better Document Semantics</h1>


<ul>
<li><strong>section</strong>: Denotes generic section of a document or application</li>
<li><strong>article</strong> and <strong>aside</strong>: Independent pieces of content part of the larger document</li>
<li><strong>header</strong>, <strong>footer</strong> and <strong>nav</strong>: Finally!</li>
</ul>



</div>

<div class="slide">

<h1>Video and Audio Get Their Own Playground</h1>


<ul>
<li>There are <strong>video</strong> and <strong>audio</strong> elements now!</li>
<li>There are <em>huge</em> issues about the default codec, how to handle other things, etc.</li>
</ul>



</div>

<div class="slide">

<h1>New Form Elements</h1>


<ul>
<li>There are a lot of them!
<ul>
<li>lots of fields around dates and times</li>
<li><strong>number</strong></li>
<li><strong>range</strong> (sliders, finally!)</li>
<li>specific for e-mail addresses and <span class="caps">URL</span>s</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Offline Storage</h1>


<ul>
<li>Like <a href="http://gears.google.com">Google Gears</a> and Firefox 3's <span class="caps">API</span>s</li>
<li><span class="caps">SQL </span>and/or key-value pairs storage</li>
</ul>



</div>

<div class="slide">

<h1>When to Jump In?</h1>


<ul>
<li>Not yet! Nothing in <span class="caps">HTML5 </span>is interoperably implemented yet!</li>
<li>You can play around with some the new form elements in Safari 3.</li>
<li>Apple, Mozilla and Opera have all committed to supporting <span class="caps">HTML5 </span>- it's just a matter of waiting for implementations.
<ul>
<li>No word from Microsoft yet...</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Questions Before We Move On?</h1>


<ul>
<li>Are the experimental?</li>
<li>Are they implemented yet?</li>
</ul>



</div>

<div class="slide">

<h1>Introducing: The <span class="caps">URI</span></h1>

<p>http://something.something#fragIdentifier</p>

</div>

<div class="slide">

<h1>Subject Predicate Object</h1>

<p>http://dev.aol.com/node/230 has the value of creator as "Arun Ranganathan"</p>

</div>

<div class="slide">

<h1>Now Use <span class="caps">URI</span>s</h1>

<p>http://dev.aol.com/node/230<br />
dc:creator    <br />
http://www.arunranga.com<br />
TimBL's Tabulator (Demo)</p>

</div>

<div class="slide">

<h1>A Challenging Proposition</h1>



<pre><code>&lt;address class=&quot;vcard&quot;&gt;
&lt;a class=&quot;fn url&quot; href=&quot;http://tantek.com/&quot;&gt;Tantek &amp;Ccedil;elik&lt;/a&gt;
&lt;/address&gt;</code></pre>



</div>

<div class="slide">

<h1>Semantics on the <span class="caps">GRDDL</span></h1>


<ul>
<li>Extract data from <span class="caps">XHTML </span>using <span class="caps">XSLT</span> Transformations</li>
<li><code>link rel=&quot;transformation&quot;</code><br />
*Use Namespaces Inside <span class="caps">XHTML</span> Documents<br />
*Let the <span class="caps">XSLT</span> Do the Trick, or else Use <span class="caps">RDF</span>a</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">RDF</span>a By Example</h1>


<ul>
<li>Uses <span class="caps">XMLNS </span>to Embed Attributes via rel="ns:prop" or </li>
</ul>




<pre><code>&lt;meta
&lt;html xmlns:cal=&quot;http://www.w3.org/2002/12/cal/ical#&quot; xmlns:contact=&quot;http://www.w3.org/2001/vcard-rdf/3.0#&quot;&gt;</code></pre>



<ul>
<li>Creative Commons</li>
</ul>




<pre><code>&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;cc&lt;/a&gt;</code></pre>



</div>]]></description>
         <link>http://presentations.lawver.net/standards/the_future_of_markup/</link>
         <guid>http://presentations.lawver.net/standards/the_future_of_markup/</guid>
         <category>standards</category>
         <pubDate>Fri, 09 Nov 2007 16:36:55 -0500</pubDate>
      </item>
      
      <item>
         <title>An Overview of acts_as_trri</title>
         <description><![CDATA[<div class="slide">

<h1>acts_as_what?</h1>


<ul>
<li>It's a Rails plugin that adds methods for tagging and reviewing ActiveRecord models.</li>
<li>Works with existing models without requiring you to rewrite them.</li>
<li>Covers most (but not all) of the current <span class="caps">TRRI API. </span> I can add the rest if/when people ask for it.</li>
</ul>



</div>

<div class="slide">

<h1>Getting It</h1>


<ul>
<li><a href="http://crunch.office.aol.com/plugins/acts_as_trri.tar.gz">Download it</a></li>
<li>Untar is and drop it in app/vendor/plugins</li>
<li><a href="http://aim.office.aol.com/aim.wiki/AIMPhotos/ActsAsTrri">Then check out the wiki</a>
<ul>
<li>It may be a little out of date - I've been busy - most things should be the same.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Configuring it in Development</h1>



<pre><code>$TRRICONFIG = {
 :host =&gt; &quot;reddev-l26.tred.aol.com:8080&quot;,
 :url =&gt; &quot;/TRRI/REST/&quot;,
 :appid =&gt; &quot;yourappid&quot;, ## Change your your TRRI appid
 :appkey =&gt; &quot;&quot;,
 :default_type =&gt; &quot;text&quot;,
 :default_category =&gt; &quot;story&quot;,
 :timeout =&gt; 3,
 :ratings_scale =&gt; 10
}</code></pre>



</div>

<div class="slide">

<h1>Configuring it in Production</h1>



<pre><code>$TRRICONFIG = {
 :host =&gt; &quot;trri.search.aol.com:80&quot;,
 :url =&gt; &quot;/TRRI/REST/&quot;,
 :appid =&gt; &quot;yourappid&quot;, ## Change your your TRRI appid
 :appkey =&gt; &quot;&quot;, ## Your AKES key
 :default_type =&gt; &quot;text&quot;,
 :default_category =&gt; &quot;story&quot;,
 :timeout =&gt; 1,
 :ratings_scale =&gt; 10
}</code></pre>



</div>

<div class="slide">

<h1>Adding it to a Model</h1>



<pre><code>acts_as_trri {
  :category =&gt; &quot;photo&quot;,
  :type =&gt; &quot;image&quot;
}</code></pre>



</div>

<div class="slide">

<h1>Adding Tags</h1>



<pre><code>photo = Photo.find(1)
photo.set_tags([&quot;horse&quot;,&quot;bucket&quot;,&quot;silly&quot;],&quot;kplawver@aol.com&quot;)
# or
photo.add_tags([&quot;foo&quot;,&quot;bar&quot;],&quot;kplawver@aol.com&quot;)</code></pre>



</div>

<div class="slide">

<h1>Getting Tags</h1>



<pre><code>photo = Photo.find(1)
tags = photo.get_tags</code></pre>



</div>

<div class="slide">

<h1>Removing Tags</h1>



<pre><code>photo = Photo.find(1)
photo.remove_tags([&quot;foo&quot;,&quot;bar&quot;],'kplawver@aol.com')</code></pre>



</div>

<div class="slide">

<h1>Adding a Review</h1>



<pre><code>photo = Photo.find(1)
photo.add_review({
  :author =&gt; &quot;kplawver@aol.com&quot;,
  :title =&gt; &quot;My Review of Stuff&quot;,
  :text =&gt; &quot;That's friggin' awesome!&quot;,
  :ratings =&gt; [
	{
      :subject =&gt; &quot;Quality&quot;,
      :scale =&gt; 10,
      :score =&gt; 7
     }
  ]
})</code></pre>



</div>

<div class="slide">

<h1>Getting Reviews</h1>



<pre><code>photo = Photo.find(1)
reviews = photo.get_reviews(20,1)
reviews[:reviews].each do |review|
  # Do stuff here
end</code></pre>



</div>

<div class="slide">

<h1>What Review Objects Look Like</h1>


<ul>
<li>review
<ul>
<li>review_id</li>
<li>posted: Time object gives you date posted in <span class="caps">UTC</span></li>
<li>author</li>
<li>appid</li>
<li>type</li>
<li>category</li>
<li>title</li>
<li>text</li>
<li>ratings: array of
<ul>
<li>subject, scale and score</li>
</ul>
</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Incrementing Counters</h1>



<pre><code>photo = Photo.find(1)
photo.increment_counter</code></pre>




<ul>
<li>Defaults to "View" for the type.</li>
<li>Other supported types are:
<ul>
<li>Collect, Subscribe, Recommend, Forward</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Getting Counters</h1>



<pre><code>photo = Photo.find(1)
counter = photo.get_counter
count = counter[:count]</code></pre>




<ul>
<li>Default is, again, "View"</li>
</ul>



</div>

<div class="slide">

<h1>Get Top</h1>



<pre><code>top = Photo.get_top
results = top[:results]</code></pre>




<ul>
<li>Defaults to "Popular", "30day" and "All"</li>
</ul>



</div>

<div class="slide">

<h1>Objects in Results Array</h1>


<ul>
<li>result
<ul>
<li>status: "ok" or "notfound"</li>
<li>id: the id of the object</li>
<li>object: the actual ActiveRecord object - can be nil if it's not found!</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Caveats</h1>


<ul>
<li>Not every part of it's been exercised yet, and I keep finding little bugs here and there.</li>
<li>It works and is in production in <a href="http://photos.aim.com"><span class="caps">AIM</span> Photos</a>
<ul>
<li>an early version is working on <a href="http://ficlets.com">ficlets</a></li>
</ul>
</li>
<li>It's easiest to play with it in the Rails console.</li>
</ul>



</div>

<div class="slide">

<h1>Questions?</h1>


<ul>
<li>You've got to have at least one</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/aol/an_overview_of_acts_as_trri/</link>
         <guid>http://presentations.lawver.net/aol/an_overview_of_acts_as_trri/</guid>
         <category>aol</category>
         <pubDate>Mon, 22 Oct 2007 20:49:18 -0500</pubDate>
      </item>
      
      <item>
         <title>CSS for the Authentication Team</title>
         <description><![CDATA[<div class="slide">

<h1>Using <span class="caps">CSS </span>(the right way)</h1>


<ul>
<li>Let's look at the new <a href="https://my.screenname.aol.com/_cqr/login/login.psp?mcState=initialized&amp;sitedomain=photos.aim.com&amp;authLev=1&amp;lang=en&amp;locale=us&amp;siteState=OrigUrl%3Dhttp%253A%252F%252Fphotos.aim.com%252Fphoto%252Fupload"><span class="caps">SNS </span>login page</a>.</li>
</ul>



</div>

<div class="slide">

<h1>Issues</h1>


<ol>
<li>The markup's not valid.  The <a href="http://validator.w3.org">validator</a> reports 120 errors.</li>
<li><span class="caps">HTTP</span>-EQUIV Meta tags are old school.  Your webserver should be returning those headers.
<ul>
<li>Either way, all attributes must be lower case.</li>
<li>All elements must be lower case.</li>
<li>All elements must be closed.</li>
<li>Alt attributes only exist for images.  Use title for everything else.</li>
</ul>
</li>
</ol>



<p>... let's start there and we'll pick up the rest in a bit.</p>

</div>

<div class="slide">

<h1>Markup Decides Your Fate</h1>


<ul>
<li>Your markup is the foundation for <em>everything</em> else.</li>
<li>If it's bad, your <span class="caps">CSS </span>will be worse</li>
<li>If it's good, you'll write less <span class="caps">CSS </span>and it'll be easier to redesign later.</li>
<li>Because...</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">CSS </span>is Parasitic</h1>


<ul>
<li>We'll talk about this later, but <span class="caps">CSS </span>can only find and style elements it can <em>find</em>.  </li>
<li>The harder you make it to find the element you want to style, the more complex and inflexible your <span class="caps">CSS </span>will be.</li>
<li>Which means...</li>
</ul>



</div>

<div class="slide">

<h1>Use the Right Element for the Job!</h1>


<ul>
<li>If you're using the same class over and over again, you're probably not using the right element for the job.</li>
<li>Semantic meaning is not written in stone.</li>
<li>Unordered lists are your friends.</li>
<li>Use appropriate headings for your content.  It helps with accessibility, and even with <span class="caps">CSS.</span></li>
</ul>



</div>

<div class="slide">

<h1>Use an <span class="caps">XML</span> Editor</h1>


<ul>
<li>Provides quick validation checks</li>
<li>Should provide you available options for all elements so you don't have to guess.</li>
</ul>



</div>

<div class="slide">

<h1>Writing Good Markup</h1>

<p>Here's how I write <span class="caps">HTML. </span> Your mileage may vary:</p>


<ol>
<li>I think about the content first.  What's most important?  What order should everything be in?</li>
<li>I mark up the bare minimum to provide meaning and give me logical hooks to write <span class="caps">CSS </span>around (divs around major sections, everything else as semantic as possible).</li>
<li>Validate <strong>often</strong>!</li>
<li>Only when I'm happy with the markup do I start writing <span class="caps">CSS.</span></li>
</ol>



</div>

<div class="slide">

<h1>And Now <span class="caps">CSS</span></h1>


<ul>
<li>Let's start with vocabulary (hopefully, there's a whiteboard)
<ul>
<li>selector</li>
<li>declaration</li>
<li>property</li>
<li>descendent selector</li>
<li>child selector</li>
<li>wildcards (boo, hiss!)</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Specificity</h1>


<ul>
<li>The least understood, but most important part of <span class="caps">CSS.</span></li>
<li>Specificity determines which properties actually apply to an element.</li>
<li>Let's draw some pictures...</li>
</ul>



</div>

<div class="slide">

<h1>Keep It Isolated</h1>


<ul>
<li>Avoid wildcards!!</li>
<li>Use enough specificity to make sure you're not going to accidentally affect elements you don't mean to.</li>
<li>But, don't over-specify because you may need to override later.</li>
</ul>



</div>

<div class="slide">

<h1>A Sense of Order</h1>


<ul>
<li>Keep <em>one</em> stylesheet for your product.</li>
<li>Avoid inline styles, both style elements and especially style attributes</li>
<li>Write your <span class="caps">CSS </span>in document order!</li>
</ul>



</div>

<div class="slide">

<h1>Things You Don't Need</h1>


<ul>
<li>Separate browser-specific <span class="caps">CSS </span>files</li>
<li>Lots of server-side code to check for browsers and serve different markup.</li>
<li>Honest</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">CSS</span> Hacks</h1>


<ul>
<li>All <span class="caps">CSS </span>hacks should be done in the same stylesheet so you can keep track of them!</li>
<li><span class="caps">CSS </span>hacks should be as minimal and affect as atomic a property as possible.</li>
<li><span class="caps">CSS </span>hacks <em>should</em> all be valid <span class="caps">CSS.</span></li>
<li>The big browser you have to watch out for is IE 6. IE 7 needs a little help, but not much.</li>
<li>Should be kept as close as possible to the block or property they're overriding!!</li>
</ul>



</div>

<div class="slide">

<h1>Acceptable Hacks</h1>


<ul>
<li>The underscore hack:
<ul>
<li>Put an underscore in front of a property to make it apply only to <span class="caps">IE6.</span></li>
</ul>
</li>
<li>The <span class="caps">IE7 </span>* html child selector hack:
<ul>
<li>Hides the declaration from everyone but <span class="caps">IE7.</span></li>
</ul>
</li>
<li>Child Selector:
<ul>
<li>Hides from <span class="caps">IE6, </span>shows to all the "good" browsers.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Performance</h1>


<ul>
<li>One <span class="caps">CSS </span>file, and one only!</li>
<li>If you need to have multiples for localization, put it right underneath the original.</li>
<li>The fewer files you make your users download, the better.</li>
<li>Inline <span class="caps">CSS </span>blocks aren't cached, and shouldn't be there!</li>
<li>Style attributes are the <em>worst</em> because you can't override them!</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">CSS</span> Reality Check</h1>


<ul>
<li>You have <strong>three</strong> linked <span class="caps">CSS </span>files, and <strong>two</strong> style elements. Why?</li>
<li>You should validate your <span class="caps">CSS </span>too:
<ul>
<li>snslanding_css.css: 14 errors</li>
<li>snslanding_dyk2.css: 1 error (and it's not a "real" error)</li>
<li>snsMiniStyles.css: <strong>35 errors</strong> (WTF?)</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Things to Think About</h1>


<ul>
<li>zero is zero and doesn't need a unit</li>
<li>for padding and margin, 0 is the same as 0 0 0 0.</li>
<li>don't set font sizes in pixels!  <span class="caps">IE6 </span>can't resize them, which creates accessibility problems.</li>
<li>set the font properties on the body element and don't change them. You rarely need to change the font face.</li>
</ul>



</div>

<div class="slide">

<h1>Conclusion</h1>


<ul>
<li>Markup is <em>extremely</em> important.  Take the time to get it right.</li>
<li>Keep your <span class="caps">CSS </span>as simple as possible.  The better your markup is, the easier that is to accomplish.</li>
<li>Keep your <span class="caps">CSS </span>maintainable by keeping it in document order, and with adequate specificity so you can read it later on.</li>
</ul>



</div>

<div class="slide">

<h1>Questions?</h1>


<ul>
<li>kevin.lawver@corp.aol.com</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/aol/css_for_the_authentication_tea/</link>
         <guid>http://presentations.lawver.net/aol/css_for_the_authentication_tea/</guid>
         <category>aol</category>
         <pubDate>Fri, 12 Oct 2007 11:02:32 -0500</pubDate>
      </item>
      
      <item>
         <title>Sprint Demo</title>
         <description><![CDATA[<div class="slide">

<h1>The Basics</h1>


<ul>
<li>A photo-sharing site built to complement <span class="caps">AIM</span> Profiles
<ul>
<li>Not intended to be a stand-alone product, but is a feature of the profile.</li>
</ul>
</li>
<li>Built on Ruby on Rails by a rotating staff of developers</li>
</ul>



</div>

<div class="slide">

<h1>The Pieces</h1>


<ul>
<li><a href="http://rubyonrails.com">Ruby on Rails</a> - Open Source <span class="caps">MVC</span> Framework written in Ruby</li>
<li><a href="http://danga.com/memcached">Memcached</a> - In-memory cache for storying objects, fragments and sessions
<ul>
<li><a href="http://errtheblog.com/post/4872">cache_fu</a> - Plugin for Rails that does 90% of the memcached work for you.</li>
</ul>
</li>
<li>MySQL</li>
<li><a href="http://reddev-l26.tred.aol.com:8080/TRRI/"><span class="caps">TRRI</span></a> - Taggings, Ratings and Reviews infrastructure. Used for comments and tags.</li>
<li><a href="http://wiki.office.aol.com/wiki/Web_Storage_Services" title="WSS">Web Storage Services</a> - Storage for photos.  Provides us practically unlimited storage per user.</li>
<li>The Matrix: Virtualized shared hosting. Will allow us to roll out new instances quickly when we need them.	</li>
</ul>



</div>

<div class="slide">

<h1>Where We Are</h1>


<ul>
<li>Just finishing up our third sprint.</li>
<li>90% of user-facing functionality is in place (may not be working perfectly, but it's mostly in there)</li>
<li>Still working on:
<ul>
<li>Caching and Performance</li>
<li><span class="caps">CAT</span> Tools</li>
<li>Profile Integration (waiting on a lot of pieces to be finished)</li>
<li>Bugs and cleanup</li>
<li>Visual Design</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Enough Talking, Let's Do The Demo!</h1>


<ul>
<li>This is running on my laptop, and I'm "cheating" and using OpenAuth.</li>
</ul>



</div>	]]></description>
         <link>http://presentations.lawver.net/aol/sprint_demo/</link>
         <guid>http://presentations.lawver.net/aol/sprint_demo/</guid>
         <category>aol</category>
         <pubDate>Wed, 08 Aug 2007 11:52:10 -0500</pubDate>
      </item>
      
      <item>
         <title>Mashup University: Tapping The Portable Social Network</title>
         <description><![CDATA[<div class="slide">

<h1>Tapping the Portable Social Network</h1>


<ul>
<li>I'm tired of starting over.</li>
<li>What if I could bring my social network with me to every new site I go to?</li>
<li>This is all <a href="http://adactio.com/journal/1209/">Jeremy Keith's fault</a></li>
</ul>



</div>

<div class="slide">

<h1>Ingredients</h1>


<ol>
<li><a href="http://rubyonrails.com">Ruby on Rails</a></li>
<li>The following gems:
<ul>
<li>ruby-openid</li>
<li>mofo</li>
</ul>
</li>
<li>MySQL</li>
<li><a href="http://jquery.com">jquery</a></li>
<li>A page with an <a href="http://openid.net">OpenID</a> delegate, an hcard and a blogroll with <span class="caps">XFN</span>
<ul>
<li>I mean, who doesn't have that?</li>
</ul>
</li>
</ol>



</div>

<div class="slide">

<h1>Getting Started</h1>


<ol>
<li>Create a rails app: <code>rails mashup_u</code>
<ul>
<li>Or <a href="http://dev.lawver.net/mashup_u/mashup_u.zip">download this thing</a></li>
</ul>
</li>
<li>Make the changes in the <span class="caps">README</span></li>
<li>Configure the database in config/database.yml</li>
<li>run <code>script/server</code> to make sure things work.</li>
</ol>



</div>

<div class="slide">

<h1>The Routine Stuff</h1>


<ol>
<li>delete public/index.html</li>
<li>put <a href="http://jquery.com">jquery.js</a> in public/javascript</li>
<li>create a layout</li>
<li>add that layout to application.rb</li>
</ol>



</div>

<div class="slide">

<h1>Create Your Model</h1>



<pre><code>script/generate model User</code></pre>



</div>

<div class="slide">

<h1>Create Your Controllers</h1>



<pre><code>script/generate controller users
script/generate controller signin</code></pre>



</div>

<div class="slide">

<h1>Now, It's Time To Create a Signin Page!</h1>


<ol>
<li>open up controllers/signin_controller.rb</li>
<li>We need a few methods: index, aol_signin, aol_signedin, openid_signin, openid_signedin</li>
<li>We'll start with OpenID...</li>
</ol>



</div>

<div class="slide">

<h1>Configuring</h1>


<ul>
<li>We need to tell Rails where to store OpenID stuff</li>
<li>In environment.rb (at the bottom):</li>
</ul>





<pre><code>require &quot;openid&quot;
$OPENID_STORE = OpenID::FilesystemStore.new(&quot;#{RAILS_ROOT}/tmp/cache&quot;)
$OPENID_RETURN = &quot;http://HOST:PORT/signin/openid_signedin&quot;</code></pre>



</div>

<div class="slide">

<h1>Handling OpenID</h1>


<ul>
<li>We need to create the form in <code>app/views/signin/index.rhtml</code></li>
<li>Then we need to create the action!</li>
</ul>



</div>

<div class="slide">

<h1>Logging In With OpenID</h1>


<ul>
<li>We need to create the openid_signin method in <code>app/controllers/signin_controller.rb</code></li>
</ul>



</div>

<div class="slide">

<h1>Let's Log In!</h1>


<ul>
<li>Woo-hoo! (I'm being hopeful)</li>
</ul>



</div>

<div class="slide">

<h1>Let's Add OpenAuth!</h1>


<ul>
<li><a href="http://developer.aim.com/manageKeys.jsp">Go get a key</a></li>
<li>Add some config to <code>environment.rb</code></li>
<li>And then add some code to <code>signin_controller.rb</code>!</li>
</ul>



</div>

<div class="slide">

<h1>Let's Log In!</h1>


<ul>
<li>Woo-hoo! (again with the hope)</li>
</ul>



</div>

<div class="slide">

<h1>Time to make a User</h1>


<ul>
<li>We've logged in, now what?</li>
<li>We need to define what's in our users table.</li>
<li>Open up <code>db/migrate/001_create_users.rb</code> and add some columns</li>
</ul>



</div>

<div class="slide">

<h1>Create Some Relationships</h1>


<ul>
<li>Yet another model: <code>script/generate model Relationship</code></li>
</ul>



</div>

<div class="slide">

<h1>Now, We Need Some Users!</h1>


<ul>
<li>We need some to play with, so let's fake some.</li>
<li>Run <code>script/generate migration create_dummy_users</code></li>
<li>And let's make some friends!
<ul>
<li>When you do this, you should use folks from your buddy list or who are on your blog roll.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Time To Make The Tables!</h1>


<ul>
<li>Run <code>rake db:migrate</code></li>
</ul>



</div>

<div class="slide">

<h1>We Need to do Something About the Login Process</h1>


<ul>
<li>Let's make it do something special if you're a new user...</li>
</ul>



</div>

<div class="slide">

<h1>Now, we're ready to do something cool!</h1>


<ul>
<li>I know, <em>finally</em>!</li>
<li>Now, we have two different user types, and need to do slightly different things with them.  </li>
<li>We can also assume slightly different things from the data we have about them.</li>
</ul>



</div>

<div class="slide">

<h1>For OpenID Users</h1>


<ul>
<li>We have an <span class="caps">URL.</span>
<ul>
<li>What's there?</li>
<li>What can we infer about the user from the data we find there?</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Enter Microformats!</h1>


<ul>
<li>Let's look for an hcard</li>
<li>Let's look for some <span class="caps">XFN </span>links</li>
<li>Yes, <a href="http://mofo.rubyforge.org">mofo</a> is <em>that</em> cool.</li>
</ul>



</div>

<div class="slide">

<h1>For <span class="caps">AOL</span> Users</h1>


<ul>
<li>We have a screenname and a display name</li>
<li>We have a buddy list, so we know who their friends are.
<ul>
<li>This version uses javascript to pull in the buddy list that I stole from another project.  There is a way to do it server-side.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Back to the Code!</h1>


<ul>
<li>We need to handle those new users, so into users_controller.rb we go!</li>
<li>We need to define a <code>new</code> method.</li>
<li>And then do something different based on their identity_type.</li>
</ul>



</div>

<div class="slide">

<h1>Creating a Form</h1>


<ul>
<li>Now we need a form so they an tell us stuff we either don't know, or change the stuff we do.</li>
<li>Then we need to do something smart when they hit Save.</li>
</ul>



</div>

<div class="slide">

<h1>Finding the Network</h1>


<ul>
<li>Let's show OpenID first. </li>
<li>We go grab the identity url</li>
<li>crawl for <span class="caps">XFN </span>links</li>
<li>then do a lookup and see if they're in our network</li>
<li>display them to the user and let them choose who to keep and who to ignore.</li>
</ul>



</div>

<div class="slide">

<h1>Find the <span class="caps">AOL</span> Network</h1>


<ul>
<li>It's all built into the buddy list, so we have to do some extra stuff to get to it.</li>
<li>Sprinkle in some javascript</li>
<li>A little <span class="caps">JSON </span>web service</li>
<li>And voila, the people in your buddy list who are here already!</li>
</ul>



</div>

<div class="slide">

<h1>Creating Your User</h1>


<ul>
<li>In users_controller.rb, we need a create method!</li>
<li>It creates the user, then adds the relationships they checked off from the form.</li>
</ul>



</div>

<div class="slide">

<h1>Possibilities</h1>


<ul>
<li>It would be trivial to turn these two things into widgets so you could put in your blog <span class="caps">URL </span>and have it pre-fill the contacts, even if that's not your identity <span class="caps">URL. </span> Same thing with the buddy list stuff.</li>
<li>What other places are there on the web that aggregate this data in:
<ul>
<li>Predictable formats</li>
<li>With enough "reputation" to make it reliable and accurate</li>
<li>That don't require Yet Another Network to maintain?</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Questions</h1>


<ul>
<li>Gimme a minute, I need to catch my breath...</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/philosophy/mashup_university_tapping_the/</link>
         <guid>http://presentations.lawver.net/philosophy/mashup_university_tapping_the/</guid>
         <category>philosophy</category>
         <pubDate>Mon, 16 Jul 2007 21:55:29 -0500</pubDate>
      </item>
      
      <item>
         <title>XTech 2007: Open AIM as It Relates to You</title>
         <description><![CDATA[<div class="slide">

<h1>What is OpenAIM and what can it do for you?</h1>

</div>

<div class="slide">

<h1>Set of developer tools</h1>


<ul>
<li>Extend functionality beyond the <span class="caps">AIM </span>client
<ul>
<li>Tap into existing community of 68 million users</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Web <span class="caps">AIM </span>(Beta)</h1>


<ul>
<li>Add <span class="caps">AIM </span>to your web page
<ul>
<li>Ability to send and receive messages, set presence, access users' Buddy lists, etc</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">AIM</span> CC</h1>


<ul>
<li><span class="caps">SDK </span>to build your own custom client
<ul>
<li>Add <span class="caps">AIM </span>functionality to your current application</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">AIM</span> Bots</h1>


<ul>
<li>Create interactive Bots for any purpose
<ul>
<li>Bot is able to interact with your community in real-time, on-demand</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">AIM</span> Plugins</h1>


<ul>
<li>Add your specific features to <span class="caps">AIM</span>
<ul>
<li>Access built-in location based services (Skyhook)</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Open Success Stories</h1>

</div>

<div class="slide">

<h1><span class="caps">AIM</span> Pro</h1>


<ul>
<li>Built using <span class="caps">AIM</span> Custom Client
<ul>
<li>Enterprise level <span class="caps">AIM </span>client</li>
<li><a href="http://aimpro.premiumservices.aol.com/?promo=803159">More info</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Lite <span class="caps">AIM</span></h1>


<ul>
<li>Built using <span class="caps">AIMCC</span>
<ul>
<li>Small memory footprint client without all the bells and whistles</li>
<li><a href="http://x.aim.com/laim">More info</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">SCI'</span>s PlayLinc</h1>


<ul>
<li>Gives gamers many tools including <span class="caps">AIM</span>/ICQ integration
<ul>
<li><span class="caps">AIM </span>integration allows gamers to communicate with their friends and set-up matches</li>
<li><a href="http://aim.playlinc.com/index2.htm">More info</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide" >

<h1>The Lounge</h1>


<ul>
<li>Virtual world where music fans can hang out, talk about music and interact
<ul>
<li>Uses <span class="caps">AIMCC</span></li>
<li><a href="http://www.themusiclounge.com/faces/pages/index.xhtml">More info</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide" >

<h1>Chumby</h1>


<ul>
<li>Will launch with an <span class="caps">AIM </span>widget built on the Web <span class="caps">AIM </span>beta platform.
<ul>
<li>Custom Flash class will be added later this year (Time Frame <span class="caps">TBD</span>)</li>
<li><a href="http://www.chumby.com/">More info</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide" >

<h1>What does this give you</h1>


<ul>
<li>Ability to tap into the existing <span class="caps">AIM </span>network</li>
<li>Create communities around existing screennames (OpenAuth)</li>
<li>Promotion from <span class="caps">AIM </span>site for applications built on <span class="caps">AIM </span>platform</li>
<li>Limitless mashup possibilities</li>
</ul>



</div>

<div class="slide" >

<h1>So what does this give us</h1>


<ul>
<li>Further growth of <span class="caps">AIM </span>network beyond <span class="caps">AIM </span>client</li>
<li>Tested, stable environment that is easily extended</li>
<li>Less development time and energy to integrate with other applications</li>
</ul>



</div>
 <br />
<div class="slide" >

<h1>Aim Developer User License</h1>

<p>Currently license restricts development to:</p>

<blockquote><p>...and your Application shall be for use with the <span class="caps">U.S. </span>based version of the <span class="caps">AOL</span> Service exclusively.</p></blockquote>


<ul>
<li>Legal and product management are working to revise this <span class="caps">ASAP</span></li>
</ul>



</div>

<div class="slide" >

<h1>Kevin's turn</h1>

</div>

<div class="slide">

<h1>Open Building Blocks</h1>


<ul>
<li>We're going to talk about two:
<ul>
<li>Open Identity</li>
<li>Open Interaction and Social Data</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Case Study: User Authentication</h1>

</div>

<div class="slide">

<h1>Ficlets</h1>


<ul>
<li><a href="http://ficlets.com">A site for folks without a lot of time who want to write stories</a></li>
<li>An "innovation" project built by a very small team in a very short period of time using <a href="http://rubyonrails.com">Ruby on Rails</a></li>
</ul>



</div>

<div class="slide">

<h1>Enter OpenID and OpenAuth</h1>

</div>

<div class="slide">

<h1>OpenID</h1>


<ul>
<li><a href="http://openid.net">Distributed identity</a>:</li>
</ul>



<blockquote><p>OpenID starts with the concept that anyone can identify themselves on the Internet the same way websites do-with a <span class="caps">URI </span>(also called a <span class="caps">URL </span>or web address). Since <span class="caps">URI</span>s are at the very core of Web architecture, they provide a solid foundation for user-centric identity.</p></blockquote>

</div>

<div class="slide">

<h1>OpenAuth</h1>


<ul>
<li>Allows third-party sites to authenticate <span class="caps">AOL</span>/AIM users in their web apps</li>
<li><a href="http://dev.aol.com/openauth">more info</a></li>
</ul>



</div>

<div class="slide">

<h1>What It Buys Ficlets</h1>


<ul>
<li>No more passwords! Users don't have to remember yet another one, and I don't have to store them.</li>
<li>I don't have to create the "oops I forgot my password" UI!</li>
</ul>



</div>

<div class="slide">

<h1>Integration</h1>


<ul>
<li>OpenID: Ficlets used the <a href="http://www.openidenabled.com/openid/libraries/ruby">OpenID Enabled Ruby Library</a></li>
<li>OpenAuth: Three methods in the signin controller... took about 20 minutes.</li>
</ul>



</div>

<div class="slide">

<h1>Demo</h1>


<ul>
<li><a href="http://ficlets.com/signin">Go sign in!</a></li>
</ul>



</div>

<div class="slide">

<h1>Case Study: No More Blank Slates</h1>

</div>

<div class="slide">

<h1>Web <span class="caps">AIM</span></h1>


<ul>
<li>Allows third party sites to access <span class="caps">AOL</span>/AIM users' buddy lists, send IMs and create mashups around and through the <span class="caps">AIM </span>network.</li>
<li><a href="http://developer.aim.com/webaim">more info</a></li>
</ul>



</div>

<div class="slide">

<h1>Well, How Can That Help Me?</h1>


<ul>
<li>Make use of a user's existing social network!</li>
<li>Interact in real time with your users, allow them to share your content with their friends</li>
<li>Add IM and Buddy List to your existing application, widget platform, blog, etc.</li>
</ul>



</div>

<div class="slide">

<h1>Example: Widget</h1>


<ul>
<li>Using <a href="http://dev.netvibes.com">Netvibes' <span class="caps">UWA</span></a>, I created a simple Buddy List widget.</li>
<li><a href="http://dev.lawver.net/netvibes/webaim.html">Try it out</a></li>
<li>Works great in standalone mode, but there's currently an open question about module servers that keeps it from working in the "real" NetVibes.</li>
</ul>



</div>

<div class="slide">

<h1>How it Works</h1>


<ul>
<li>Almost a drop in of the <a href="http://developer.aim.com/whimsicals">Whimsicals</a> code, with a little bootstrapping to make it work in <span class="caps">UWA </span>and to fix some <span class="caps">CSS </span>stuff.</li>
<li>Whimsicals are just a reference implementation.  <a href="http://developer.aim.com/reference"><span class="caps">JSON </span>and <span class="caps">XML API</span>s</a> are available for you to build apps around.</li>
</ul>



</div>	

<div class="slide">

<h1>Example: The Social Blank Slate</h1>


<ul>
<li>I can't get my friends or family to set up a feed reader to keep up with my blog, photos, etc</li>
<li>But, they'll actively prune and keep their buddy list in <span class="caps">AIM.</span></li>
<li>Why not use that to make it easy to set up a feed reader?</li>
</ul>



</div>

<div class="slide">

<h1>Enter: Buddy Reader</h1>


<ul>
<li>Removes the "blank slate" problem by pre-populating your feed list with your buddies' feeds</li>
<li>Allows your friends to alert you to new sources of their content</li>
</ul>



</div>

<div class="slide">

<h1>Demo: Buddy Reader</h1>


<ul>
<li>Currently running on my laptop</li>
<li>Signin</li>
<li>Choose my buddies</li>
<li>Update my feeds</li>
<li>Browse</li>
</ul>



</div>	

<div class="slide">

<h1>Possibilities</h1>


<ul>
<li>What else could you do?</li>
<li>How else could a user's existing buddy list remove barriers or give your product a head start?</li>
<li>What else do you want?</li>
</ul>



</div>

<div class="slide">

<h1>Conclusion</h1>


<ul>
<li>There's no need to start a "green field" social network.</li>
<li>Leverage your users' existing connections.</li>
<li>Have fun, and be open.</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/philosophy/xtech_2007_open_aim_as_it_rela/</link>
         <guid>http://presentations.lawver.net/philosophy/xtech_2007_open_aim_as_it_rela/</guid>
         <category>philosophy</category>
         <pubDate>Fri, 18 May 2007 02:10:16 -0500</pubDate>
      </item>
      
      <item>
         <title>Web 2.0 Expo: Bridging the Gap Between Desktop and Web</title>
         <description><![CDATA[<div class="slide">
<h1>The Scene</h1>
<ul>
<li>Desktop apps are using more and more web services</li>
<li>The web is leaking onto the desktop in widgets and windowless browsers</li>
<li>The preferred programming paradigm is more web-like than ever</li>
</ul>

</div>

<div class="slide">
<h1>Beginnings</h1>
<ul>
<li>Modern <span class="caps">IDE</span>s embrace markup, javascript (or javascript-like) interfaces</li>
<li>Modern desktop apps are providing more and more data through web services
<ul>
<li>and digesting, or built on top of, web services (feed readers, etc)</li>
</ul>
</li>
</ul>

</div>

<div class="slide">
<h1>Today</h1>
<ul>
<li>Open <span class="caps">API</span>s</li>
<li>Desktop apps are essentially windowless browsers</li>
<li>Many more apps include renderers in them somewhere</li>
<li>Byte-less applications allow for rapid deployment
	<ul>
		<li>Web: <a href="http://pipes.yahoo.com">Yahoo Pipes</a>, <a href="http://ning.com">Ning</a></li>
		<li>Desktop: Apple's Cocoa Framework</li>
	</ul>
</li>
<li>Did you configure your wireless router with a client or web app?</li>
<li>Even Office tools are moving online...
	<ul>
		<li>Google Docs and Spreadsheets</li>
		<li><a href="http://zoho.com">Zoho</a></li>
		<li><a href="http://www.thinkfree.com">Thinkfree</a></li>
		<li>and many many more</li>
	</ul>	
</li>
</ul>

</div>

<div class="slide">
<h1>The Web Won</h1>
<ul>
<li>Forgiving programming model
<ul>
<li>Fairly easy to get started with</li>
</ul>
</li>
<li>Flexibility</li>
<li>Upgrade path between versions smoother
<ul>
<li>Ever thought about "sunsetting" a website?</li>
<li>Client <span class="caps">API</span>s find themselves relegated to the backend</li>
</ul>
</li>
</ul>

</div>

<div class="slide">
<h1>Demo Time...</h1>
<ul>
<li>Web <span class="caps">API</span>s doing traditional client work make for easy consumption</li>
<li>Focus on the UI rather than the brute forcing a protocol</li>
</ul>

</div>

<div class="slide">
<h1>Demo Time...</h1>
<ul>
<li>Open <span class="caps">AIM</span> Web <span class="caps">API</span>s talk directly to the <span class="caps">AIM</span> Cloud via <span class="caps">JSON</span> calls</li>
<li>Custom Session type allows for game data to be sent in a back channel between web pages</li>
</ul>

</div>

<div class="slide">
<h1>Is there any hope for clients?</h1>
<ul>
<li>Flex and Apollo do not provide high quality P2P solutions</li>
<li>Development tools are still better for clients</li>
<li>Clients are more sticky then web apps (push vs. pull)</li>
</ul>

</div>

<div class="slide">
<h1>Demo Time part II...</h1>
<ul>
<li><span class="caps">COM</span>/<span class="caps">ATL</span> <span class="caps">API</span>s acknowledge javascript so web <span class="caps">API</span>s can play nicely</li>
<li>User interface tools on the client side are becoming more like web pages
<ul>
<li>XML-like Windows Presentation Foundation and Boxely, <span class="caps">AOL</span>s toolkit for internal and external consumption</li>
</ul>
</li>
</ul>

</div>

<div class="slide">
<h1>Demo Time part II...</h1>
<ul>
<li>Open <span class="caps">AIM</span> API that <span class="caps">AIM</span> Lite uses allows for javascript plugins to be injected</li>
<li>Javascript hooks both Open <span class="caps">AIM</span> as well as Flickr's <span class="caps">REST</span> <span class="caps">API</span></li>
<li>Results are displayed is a simple Boxely UI control</li>
</ul>

</div>

<div class="slide">
	<h1>The "semantic web"</h1>
	<ul>
		<li>Apps are already more aware of semantic data in web pages.</li>
		<li>Upcoming versions of modern browsers will be <a href="http://microformats.org">microformat</a>-aware and allow you to do useful things with semantic data embedded in today's web.</li>
	</ul>	
</div>

<div class="slide">
	<h1>Demo Time part III...</h1>
	<ul>
		<li>Install <a href="http://mozilla.com">Firefox</a> and the <a href="https://addons.mozilla.org/en-US/firefox/addon/4106">Operator extension</a>.</li>
		<li>Go to <a href="http://ficlets.com/stories/710">a story on ficlets</a></li>
		<li>Export my hcard to your address book</li>
		<li>Or, browse that story's tags on other sites.</li>
	</ul>
</div>	

<div class="slide">
	<h1>Tomorrow's Browsers</h1>
	<ul>
		<li>This kind of thing will be seamless</li>
		<li>Provide true web-to-desktop integration</li>
	</ul>	
</div>	

<div class="slide">
<h1>Tomorrow</h1>
<ul>
<li>Better browsers</li>
<li>Offline <span class="caps">DOM</span> storage in Firefox 3.0</li>
<li>Better scripting standards and tools</li>
<li>Better markup standards (Web Formats, <span class="caps">XHTML</span>+)</li>
<li>Easier to use <span class="caps">IDE</span>s</li>
<li>Straight-from-the-web compilers (see <a href="http://amnesty.mesadynamics.com/Singles.html">Amnesty Singles</a>)</li>
</ul>

</div>

<div class="slide">
	<h1>And Now for a Couple Announcements...</h1>
	<ul>
		<li>No really, these are <em>good</em>.</li>
	</ul>	
</div>

<div class="slide">
<h1>Contact Info</h1>
<ul>
<li><a href="http://developer.aim.com">Main AIM Developer Web Page</a></li>
<li><a href="http://dev.aol.com">AOL Developer Network</a></li>
<li><a href="http://journals.aol.com/gregsblog/aimInfo">Greg's Blog</a></li>
<li><a href="http://lawver.net">Kevin's Blog</a></li>
</ul>
</div>

<div class="slide">
<h1>What's Next?</h1>
<ul>
<li>What do you want to see?</li>
<li>What can we do to help?</li>
<li>How does the relatively slow rollout cycle of desktop apps keep up with the ever-amorphous web?</li>
</ul>

</div>]]></description>
         <link>http://presentations.lawver.net/philosophy/bridging_the_gap_between_deskt/</link>
         <guid>http://presentations.lawver.net/philosophy/bridging_the_gap_between_deskt/</guid>
         <category>philosophy</category>
         <pubDate>Sun, 15 Apr 2007 19:23:44 -0500</pubDate>
      </item>
      
      <item>
         <title>Ficlets, Rails and OpenID</title>
         <description><![CDATA[<div class="slide">

<h1>What is Ficlets?</h1>


<ul>
<li><a href="http://ficlets.com">The Site</a></li>
<li>Collaborative fiction: Any user can add a prequel or sequel to any story</li>
<li>All content is licensed under <a href="http://creativecommons.org">Creative Commons</a></li>
<li>Using the <a href="http://flickr.com">Flickr</a> <span class="caps">API </span>to pull in "inspiration" photos</li>
<li>Using several feeds to spur story ids</li>
</ul>



</div>

<div class="slide">

<h1>How did Ficlets Happen?</h1>


<ul>
<li>Proposed at Kerry Parkins' Community in a Box offsite in early December</li>
<li>It was one of the "winners" and I got approval to build a prototype as an experiment</li>
<li>I got a very small team (4-5 total for design and dev): no project manager, no product lead, no QA</li>
<li>Designed in three weeks while I was on vacation, built in two months after I got back.</li>
</ul>



</div>

<div class="slide">

<h1>What Were You Trying to Prove?</h1>


<ul>
<li>We could use Rails to build high quality viral products quickly and with minimal QA involvement</li>
<li>I could lead a very small team and crank out a full-fledged product very quickly</li>
<li>That <span class="caps">AOL </span>could embrace the startup model - fuzzy roles, not a lot of process - and do it successfully</li>
<li>That we could launch a site that accepts OpenID and <span class="caps">AOL </span>screen names.</li>
<li>That we could launch a site that uses Creative Commons</li>
</ul>



</div>

<div class="slide">

<h1>Who Did It?</h1>


<ul>
<li><a href="http://ficlets.com/authors/jgarber">Jason Garber</a> -  Front end wizard.  He did all the microformats, <span class="caps">CSS </span>and a lot of javascript, so I didn't have to</li>
<li><a href="http://ficlets.com/authors/kushimo">Ari Kushimoto</a> - Did a lot of the UI and her initial take on the logo led us to the final treatment</li>
<li><a href="http://ficlets.com/authors/kevin_lawver">Me</a> - Idea, product owner, project manager, architect, designed the database, wrote all the models, controllers, routes, and did a good bit of the install.</li>
<li><a href="http://ficlets.com/authors/thecindyli">Cindy Li</a> - Lots of <span class="caps">UI, </span>initial brainstorming and direction and tons of marketing at <a href="http://2007.sxsw.com/interactive">SxSW</a></li>
<li><a href="http://ficlets.com/authors/theversifier">Jenna Marino</a> - The awesome visual look of the site and the logo.</li>
</ul>



</div>

<div class="slide">

<h1>What Happens to Ficlets Now?</h1>


<ul>
<li>We're fixing bugs, rolling them out several times a week</li>
<li>Waiting to see how ficlets does so we can justify phase two</li>
</ul>



</div>

<div class="slide">

<h1>Why We Used Rails</h1>


<ul>
<li>I'd been playing with it for months and looking for a "class project"</li>
<li>It felt like the right choice for rapid development</li>
<li>Very active community, good documentation, lots of deployment options</li>
<li>It's fun.</li>
</ul>



</div>

<div class="slide">

<h1>What's Rails?</h1>


<ul>
<li>Web development framework written in Ruby</li>
<li>A full-featured <span class="caps">MVC, </span>complete with development environment</li>
<li>As much a philosophy for web development as it is a framework</li>
</ul>



</div>

<div class="slide">

<h1>Why is it Cool?</h1>


<ul>
<li>It's easy to use</li>
<li>Super quick to install and get something working</li>
<li>Lots of plugins, gems and other fantastic tools to speed up development</li>
<li>Solid development philosophy that enforces best practice, but allows you to get around it if you absolutely have to.</li>
</ul>



</div>

<div class="slide">

<h1>Getting Started With Rails</h1>


<ul>
<li>Lots of full apps you can download:
<ul>
<li>OS X - <a href="http://locomotive.raaum.org/">Locomotive</a></li>
<li>Windows - <a href="http://instantrails.rubyforge.org/wiki/wiki.pl">InstantRails</a></li>
</ul>
</li>
<li>But, you should probably just install it by hand.
<ul>
<li><a href="http://hivelogic.com/narrative/articles/ruby-rails-mongrel-mysql-osx">OS X</a></li>
<li><a href="http://michaelwales.com/2006/12/setting-up-rails-on-windows/">Windows XP</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Creating a Project</h1>


<ul>
<li>rails project_you_want_to_create</li>
<li>cd project_you_want_to_create</li>
<li>script/server</li>
<li>http://localhost:3000 </li>
</ul>



</div>

<div class="slide">

<h1>Getting Something Working</h1>


<ul>
<li>Create your database</li>
<li>Configure in config/database.yml</li>
<li>Create a table in your database</li>
<li>run script/generate scaffold table_name</li>
</ul>



</div>

<div class="slide">

<h1>The Scale Myth</h1>


<ul>
<li>With the release of mongrel, scaling Rails is no longer a real problem (or no bigger a problem than any other product).</li>
<li>Ficlets is currently running on two machines with:	
<ul>
<li>1 apache each</li>
<li>4 mongrels each</li>
</ul>
</li>
<li>We've handled being boingboing'ed, dugg, ma.gnolia'ed, etc. with no real problems.</li>
</ul>



</div>

<div class="slide">

<h1>OpenID</h1>


<ul>
<li>Allows for distributed identity - you keep your identity and "share" it with requesting sites</li>
<li>Identity Providers (like <span class="caps">AOL</span>) and Relying Parties (like Ficlets)</li>
<li>See <a href="http://openid.net/">OpenID</a></li>
</ul>



</div>

<div class="slide">

<h1>OpenID and Rails</h1>


<ul>
<li>We decided to use the library at <a href="http://openidenabled.com">OpenID Enabled</a></li>
<li>Provides easy hooks for being both an identity provider and relying party - used on several public sites, and actively developed and supported.</li>
</ul>



</div>

<div class="slide">

<h1>The OpenID Login Process</h1>


<ol>
<li>User entered OpenID</li>
<li>Relying party requests OpenID, looks for delegate <span class="caps">URL</span>s</li>
<li>Redirects User to <span class="caps">URL </span>found in the openid.server link.</li>
<li>User authenticates and grants or denies permission</li>
<li>User is redirected by Identity Provider back to Relying Party</li>
</ol>



</div>

<div class="slide">

<h1>The Code: Signin</h1>


<ol>
<li>Checks to see if you're already signed in</li>
<li>Checks for return <span class="caps">URL </span>and sets that in the session</li>
<li>If it's a <span class="caps">POST</span>
<ol>
<li>Begins the OpenID login process</li>
<li>Redirects to Identity Provider or returns error</li>
</ol>
</li>
</ol>



</div>

<div class="slide">

<h1>The Code: Signedin</h1>


<ol>
<li>Check for success criteria</li>
<li>Checks to see if User exists
<ol>
<li>If User exists
<ol>
<li>Set session[:user] to User.id</li>
</ol>
</li>
<li>else
<ol>
<li>Create new User</li>
</ol>
</li>
</ol>
</li>
<li>Redirects to intended <span class="caps">URL </span>or the homepage</li>
</ol>



</div>

<div class="slide">

<h1>Handling Multiple Userspaces in One App</h1>


<ul>
<li>Database has not just a login, but a logintype to tell me where the user came from</li>
<li>Currently support OpenAuth and OpenID, but could support others (intended to support Yahoo's <span class="caps">BBA</span>uth but ran out of time)</li>
<li>We create "pen names" so users "real" identity is kept private. </li>
</ul>



</div>

<div class="slide">

<h1>Lessons Learned</h1>


<ul>
<li>Rails is fantastic, and makes development "fun"</li>
<li>Rails provides a great platform for pair programming</li>
<li>The myth that Rails can't scale is just that - a myth</li>
<li>I wouldn't skip QA the next time, but it can be done - and I'd spend a lot of time creating test cases</li>
<li>The design process is a lot more fun when it's collaborative and design and development feels like one team</li>
</ul>



</div>

<div class="slide">

<h1>Conclusion</h1>


<ul>
<li>It is possible to do things both quickly and well</li>
<li>We're too entrenched in roles and process to truly innovate</li>
<li>We have insanely creative and smart people within the company - it's time to unshackle them and let them be both creative and smart.</li>
<li>OpenID is great, and will bring a lot of people in to our products who don't want <span class="caps">AIM </span>screennames.</li>
</ul>



</div>

<div class="slide">

<h1>Questions?</h1>

<p>My questions for you:</p>


<ul>
<li>How can we do more stuff like this?</li>
<li>What's standing in the way of innovation?</li>
<li>What new technologies or methodologies should we be trying out?</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/philosophy/ficlets_rails_and_openid/</link>
         <guid>http://presentations.lawver.net/philosophy/ficlets_rails_and_openid/</guid>
         <category>philosophy</category>
         <pubDate>Wed, 28 Mar 2007 15:48:18 -0500</pubDate>
      </item>
      
      <item>
         <title>Microformats for Web Services and Portable Content</title>
         <description><![CDATA[<div class="slide">

<h1>What are Microformats?</h1>


<ul>
<li>A set of <span class="caps">HTML </span>attribute values that add meaning to otherwise generic content.</li>
<li>An implementation of <em>existing</em> web standards, <em>not</em> new standards</li>
</ul>



</div>

<div class="slide">

<h1>Where are They Used Today?</h1>


<ul>
<li>By companies like:
<ul>
<li><a href="http://aol.com"><span class="caps">AOL</span></a></li>
<li><a href="http://yahoo.com">Yahoo</a></li>
<li><a href="http://technorati.com">Technorati</a></li>
<li><a href="http://linkedin.com">LinkedIn</a></li>
<li><a href="http://ma.gnolia.com">Ma.gnolia</a> and others</li>
<li><a href="http://eventful.com">Eventful</a></li>
<li><a href="http://edgeio.com">Edgeio</a></li>
<li>Many more!</li>
</ul>
</li>
<li>By individual developers and bloggers all over the world</li>
<li><a href="http://microformats.org/wiki/implementations">See all the implementations</a></li>
</ul>



</div>

<div class="slide">

<h1>Existing Web Services</h1>


<ul>
<li>Technorati
<ul>
<li><a href="http://feeds.technorati.com/contacts/">hcard to vcf service</a></li>
<li><a href="http://feeds.technorati.com/events/">hcal to ical service</a></li>
</ul>
</li>
<li><span class="caps">AIM</span> Pages
<ul>
<li>Service to pull individual modulet modules from <span class="caps">AIM</span> Pages</li>
<li><a href="http://www.aimpages.com/kplawver/profile.html?moduleid=my-events-0">Example</a></li>
</ul>
</li>
<li>See the <a href="http://microformats.org/wiki/implementations">implementations page</a> for more</li>
</ul>



</div>

<div class="slide">

<h1>Existing Parsers</h1>


<ul>
<li>Ruby: <a href="http://mofo.rubyforge.org">mofo</a></li>
<li><span class="caps">PHP</span>: <a href="http://allinthehead.com/hkit">hKit</a></li>
<li>Javascript: <a href="http://www.danwebb.net/2007/2/9/sumo-a-generic-microformats-parser-for-javascript">Sumo</a></li>
<li>Python: <a href="http://phildawes.net/microformats/">Python Microformat Parser</a></li>
</ul>



</div>

<div class="slide">

<h1>Use Case: Widgets</h1>


<ul>
<li><a href="http://aimpages.com"><span class="caps">AIM</span> Pages</a> provides a web service around modules</li>
<li>Any page on <span class="caps">AIM</span> Page <em>is</em> a web service.</li>
<li><a href="http://aimpages.com/kplawver/profile.html?moduleid=my-events-0">Example</a></li>
</ul>



</div>

<div class="slide">

<h1>Demo: Incestuous Widgets</h1>


<ul>
<li><a href="http://aimpages.com/kplawver">My Page</a> has a list of conferences I'm attending.</li>
<li><a href="http://aimpages.com/kevinplawver">Me Evil Twin's Page</a> has one too!</li>
<li>If I sign in as me and to go my evil twin's page, it shows the events we're both going to!</li>
</ul>



</div>

<div class="slide">

<h1>Incestuous Widgets: How It Works</h1>


<ul>
<li>Grabs the visitor's my-events module if it's there.</li>
<li>Looks for <span class="caps">URL</span>s that are in the current page's my-events module.</li>
<li>Builds and then displays list of shared events.</li>
<li><a href="http://dev.lawver.net/ajax-experience/shared-events.html#view">the code</a></li>
</ul>



</div>

<div class="slide">

<h1>Use Case: Mashups and Portable Content</h1>


<ul>
<li>When your page is the <span class="caps">API, </span>people don't need fancy <span class="caps">REST </span>or <span class="caps">SOAP API</span>s.</li>
<li>You only have to build it once, and then see how people use it.</li>
</ul>



</div>

<div class="slide">

<h1>Demo: Mashups and Portable Content</h1>


<ul>
<li><a href="http://ficlets.com">Ficlets</a> has lots of different feeds</li>
<li>But, it's missing feeds for prequels and sequels.</li>
<li><a href="http://decafbad.com/blog/2007/04/05/ficlets-enhanced-author-feed-an-xsl-scraper-hack">Les Orchard created his own prequel/sequel feed from our microformatted content</a></li>
</ul>



</div>

<div class="slide">

<h1>Use Case: OpenID</h1>


<ul>
<li><a href="http://openid.net/">OpenID</a> provides distributed identity - all based on <span class="caps">URL</span>s.</li>
<li>What if those <span class="caps">URL</span>s contained <a href="http://microformats.org/wiki/hcard">hcards</a>?</li>
</ul>



</div>

<div class="slide">

<h1>Profile Demo</h1>


<ul>
<li>Built on Ruby on Rails</li>
<li>Uses OpenID for authentication</li>
<li>When it returns, it grabs the identity <span class="caps">URL </span>and looks for HCards using <a href="http://mofo.rubyforge.org">mofo</a></li>
<li>Populates your profile with the data if it finds an hcard.</li>
<li>Download it (coming soon)</li>
</ul>



</div>

<div class="slide">

<h1>Use Case: Feeds Without Feeds</h1>


<ul>
<li>What if you didn't need a feed?  What if your content was so well described on the page you could use <em>that</em> as the feed?</li>
</ul>



</div>

<div class="slide">

<h1>Demo: <span class="caps">AIM</span> Pages (if the network works)</h1>


<ul>
<li>I build a "cheap" <a href="http://aimpages.com/kplawver">blog module for <span class="caps">AIM</span> Pages</a></li>
<li>I wanted a feed, but didn't want to have to figure out how to write out another file to the user's directory.</li>
<li>Microformats to the rescue!</li>
</ul>



</div>

<div class="slide">

<h1>Demo: <span class="caps">AIM</span> Pages: Building the Feed</h1>


<ol>
<li>Using <span class="caps">PHP,</span> I grabbed that module of the page</li>
<li>Parsed out the hatom feed using <span class="caps">DOM </span>methods</li>
<li><a href="http://dev.lawver.net/ajax-experience/cheap-feed.php?sn=kplawver&amp;instance=cheap-blog-0">Return it as <span class="caps">ATOM</span></a></li>
</ol>



</div>

<div class="slide">

<h1>Demo: Rails + hpricot (if the network doesn't work)</h1>


<ul>
<li>Using <a href="http://rubyonrails.com">Rails</a> and <a href="http://code.whytheluckystiff.net/hpricot/">hpricot</a>, I built an hatom to <span class="caps">ATOM </span>conversion.</li>
<li><a href="http://portamax.local:3000/feed">Demo</a></li>
</ul>



</div>

<div class="slide">

<h1>Conclusion</h1>


<ul>
<li>Produce content once, then repurpose</li>
<li>Don't want <span class="caps">XHTML </span>anymore?  Transform it!</li>
<li>Use data from everywhere without dealing with <span class="caps">API</span>s</li>
<li>Get the "semantic web" <em>today</em>.</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">Q&amp;A</span></h1>

</div>]]></description>
         <link>http://presentations.lawver.net/standards/microformats_for_web_services/</link>
         <guid>http://presentations.lawver.net/standards/microformats_for_web_services/</guid>
         <category>standards</category>
         <pubDate>Tue, 20 Mar 2007 11:05:16 -0500</pubDate>
      </item>
      
      <item>
         <title>How to Convince Your Company to Embrace Mashup Culture</title>
         <description><![CDATA[<div class="slide">

<h1>Introductions</h1>


<ul>
<li><a href="http://lawver.net">Kevin Lawver</a> - Web standards dork, microformats nut, newly minted Rails geek</li>
<li><a href="http://nywebranger.com">Alla Gringaus</a> - Time Inc. Frontend Dev Lead</li>
<li><a href="http://arunranga.com">Arun Ranganathan</a> - <span class="caps">AOL'</span>s AC Representative at the <span class="caps">W3C, </span>yogic cassanova</li>
<li><a href="http://journals.aol.com/gregsblog/aimInfo/">Greg Cypes</a> - <span class="caps">AIM</span> Developer, evangelist, golfer</li>
<li><a href="http://slayeroffice.com">Steve Chipman</a> - Javascript genius, artist, part-time amateur ninja</li>
</ul>



</div>

<div class="slide">

<h1> What Came Before</h1>


<ul>
<li><a href="http://presentations.lawver.net/standards/embrace_web_standards/">Convincing your company to embrace web standards</a></li>
</ul>



</div>

<div class="slide">

<h1>What's Next?</h1>


<ul>
<li>Once you've embraced open standards, the next step...  open <span class="caps">API</span>s!</li>
</ul>



</div>

<div class="slide">

<h1>What's Mashup Culture?</h1>


<ul>
<li>Open</li>
<li>Agile</li>
<li>Data wants to be free</li>
<li>Nothing is sacred, and everything can be squished, mangled or munged to make something new and interesting.</li>
</ul>



</div>

<div class="slide">

<h1>Why Mashup Culture?</h1>


<ul>
<li>Entrenched processes engender entrenched thinking</li>
<li>Get out of the ditch of the same old thing</li>
<li>Innovate more quickly</li>
<li>Allows for a sense of play, which can only help morale and boost productivity 
<ul>
<li>(That one's for the managers)</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Alla</h1>


<ul>
<li><a href="http://presentations.lawver.net/philosophy/how_to_convince_your_company_t/golf.html">Slides</a></li>
</ul>



</div>

<div class="slide">

<h1>Arun</h1>

</div>




<div class="slide">

<h1>So, The Saga Continues</h1>
<ul>
<li>Last Year's Story: Web Standards
<ul>
<li>Efficiency, Reuse, Elegance, Accessibility</li>
</ul>
</li>
<li>This Year's Story: Guerilla Standards
<ul>
<li><em>Community</em>  Openness. </li>
</ul>
</li>
</ul>
</div>
<div class="slide">
<h1>Guerilla Standards: Case Study</h1>
<ul>
<li>AOL and OpenID
<ul>
<li>Lots of Internal Debate, Discussions at Mashup Camp, and Blogosphere Stuff</li>
<li>And then: 63 Million Screennames can be used as OpenIDs</li>
<li>http://openid.aol.com/screenname</li>
<li>http://journals.aol.com/screenname or journals.aol.com/screenname/blogname</li>
<li><a href="http://www.ficlets.com/">Ficlets</a> accepts OpenID</li>
</ul>
</li>
<li>Liberty Alliance's Notions of ID</li>
<li>Proprietary ID</li>
</ul>
</div>


<div class="slide">

<h1>Viva La Revolution</h1>

</div>




<div class="slide">

<h1>Greg</h1>


<ul>
<li><a href="http://presentations.lawver.net/philosophy/how_to_convince_your_company_t/greg.html">Slides</a></li>
</ul>



</div>

<div class="slide">

<h1>Steve</h1>


<ul>
<li><a href="http://slayeroffice.com/articles/sxsw07/">Slides</a></li>
</ul>



</div>

<div class="slide">

<h1>Wrapping Up</h1>

</div>

<div class="slide">

<h1>Don't Forget to Ask</h1>


<ul>
<li>Nothing changes if you don't ask.</li>
<li>Ask</li>
<li>If you don't like the answer, come up with a better question</li>
</ul>



</div>

<div class="slide">

<h1>Embrace the Agile</h1>


<ul>
<li>Show that things can be done quickly - embrace new technology</li>
<li>Embrace small teams moving quickly</li>
</ul>



</div>

<div class="slide">

<h1>Example: <a href="http://ficlets.com">Ficlets</a></h1>


<ul>
<li>I asked if I could build a prototype as an experiment</li>
<li>2 copies of <strong>Agile Development With Rails</strong></li>
<li>2 developers</li>
<li>3 designers on the main project</li>
<li>3 months from concept to launch</li>
<li>Creative Commons and <a href="http://flickr.com">Flickr</a> <span class="caps">API</span></li>
<li>Launched Wednesday, cuz why not?</li>
</ul>



</div>

<div class="slide">

<h1>Conclusion</h1>


<ul>
<li>If we can move a large mature company with entrenched processes like <a href="http://aol.com"><span class="caps">AOL</span></a>, you can move yours.</li>
<li>Start small.  Don't be afraid of prototypes and mockups</li>
<li>Have fun.  Mashups are about fun and exploration - so go explore!</li>
<li>And get <a href="http://dev.aol.com">great people</a> to help evangelize.</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/philosophy/how_to_convince_your_company_t/</link>
         <guid>http://presentations.lawver.net/philosophy/how_to_convince_your_company_t/</guid>
         <category>philosophy</category>
         <pubDate>Sat, 10 Mar 2007 23:02:26 -0500</pubDate>
      </item>
      
      <item>
         <title>Web Standards: What and Why</title>
         <description><![CDATA[<div class="slide">

<h1>Introduction</h1>


<ul>
<li>I'm Kevin Lawver
<ul>
<li>Member of the <a href="http://w3.org/Style/CSS"><span class="caps">CSS</span> Working Group</a></li>
<li>Helped create the <a href="http://developer.iamalpha.com/profile">ModuleT</a></li>
<li>Active at the beginning of the <a href="http://atomenabled.com"><span class="caps">ATOM</span></a> syndication format process</li>
<li>Co-founder of crazy grassroots web standards advocacy group at <span class="caps">AOL</span></li>
<li>Co-author of <a href="http://webstandardsbook.com">Adapting to Web Standards</a></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>What are Web Standards?</h1>


<ul>
<li>Definitions for Authors and Implementors to allow for interoperability, and consistent implementation of functionality.  </li>
<li>When used by geeks and nerds, they frequently mean <span class="caps">XHTML </span>and <span class="caps">CSS.</span></li>
</ul>



</div>

<div class="slide">

<h1>What Kinds Are There?</h1>


<ul>
<li>Dejure</li>
<li>Defacto</li>
<li>"Guerilla"</li>
</ul>



</div>

<div class="slide">

<h1>Dejure Standards</h1>


<ul>
<li>Ratified by a Standards Body</li>
<li>Well documented (although often not in language normal humans understand), usually with very good test cases and at least a reference implementation.</li>
<li>Examples:
<ul>
<li><span class="caps">XML, SOAP, ATOM</span></li>
<li><span class="caps">HTML, CSS, ECMAS</span>cript</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Defacto Standards</h1>


<ul>
<li>Become standards through large install base.  Examples:
<ul>
<li>Microsoft Office</li>
<li>Flash</li>
<li><span class="caps">RSS</span></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Where Do They Come From?</h1>


<ul>
<li><span class="caps">W3C</span>: <span class="caps">XML, HTML, CSS, SOAP, </span>etc</li>
<li>Liberty: Identity and authentication</li>
<li><span class="caps">OASIS</span>: Lots of <span class="caps">XML </span>schemas</li>
<li>Lots of others...</li>
</ul>



</div>

<div class="slide">

<h1>Guerilla Standards</h1>


<ul>
<li>We'll talk about that later...</li>
</ul>



</div>

<div class="slide">

<h1>Why Should I Use Them?</h1>


<ul>
<li>Quality is easily tested through validation</li>
<li>Consistency</li>
<li>Documentation</li>
<li>Consistent and interoperable implementations</li>
</ul>



</div>

<div class="slide">

<h1>Don't Invent New <span class="caps">XML</span> Languages!!</h1>


<ul>
<li><a href="http://www.tbray.org/ongoing/When/200x/2006/01/08/No-New-XML-Languages">Tim Bray wrote an excellent article</a></li>
<li>Key points:
<ul>
<li>Inventing new <span class="caps">XML </span>languages is <em>hard</em>, and more importantly, <strong>expensive</strong></li>
<li>To do it right, you have to create schemas, validators and all new tools</li>
<li>Why do that when there is probably already an <span class="caps">XML </span>language that will express what you need?</li>
</ul>
</li>
<li>Use the standards-based development method instead!<br />
	<br />
</div>	</li>
</ul>



<div class="slide">

<h1>The Standards-Based Development Method</h1>


<ul>
<li>State your problem</li>
<li>Research applicable standards</li>
<li>Look for implementations</li>
<li>Extend only if <em>absolutely</em> necessary</li>
</ul>



</div>

<div class="slide">

<h1>Step One: State Your Problem</h1>


<ul>
<li>What are you trying to accomplish?</li>
<li>What data do you need to represent?</li>
<li>What are the endpoints and delivery methods?</li>
</ul>



</div>

<div class="slide">

<h1>Step Two: Research</h1>


<ul>
<li>Are there any existing standards that represent similar data?</li>
<li>Are there data structures in other fields that could be mapped to your data?</li>
</ul>



</div>

<div class="slide">

<h1>Step Three: Look for Implementations</h1>


<ul>
<li>Is there already an open source toolkit in the language of your choosing?</li>
<li>How mature is it?</li>
<li>Is it something we should use and contribute back to?</li>
</ul>



</div>

<div class="slide">

<h1>Step Four: Extend Only if <em>Absolutely</em> Necessary</h1>


<ul>
<li>Extend through namespaces</li>
<li>Don't break existing tools!</li>
<li>Don't change the meaning of existing elements</li>
</ul>



</div>

<div class="slide">

<h1>Case Study: <span class="caps">XHTML</span></h1>


<ul>
<li><span class="caps">XHTML </span>is the <span class="caps">XML</span>-ization of <span class="caps">HTML.</span></li>
<li>Currently four flavors:
<ul>
<li><span class="caps">XHTML</span> Transitional 1.0</li>
<li><span class="caps">XHTML</span> Strict 1.0</li>
<li><span class="caps">XHTML</span> 1.1</li>
<li><span class="caps">XHTML</span> 2.0</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Benefits: Consistency</h1>


<ul>
<li><span class="caps">XHTML </span>requires you to close tags, quote attributes and use all lowercase elements and attributes.</li>
<li>That means you can enforce consistency across developers.</li>
</ul>



</div>

<div class="slide">

<h1>Benefits: Validation</h1>


<ul>
<li>Validation becomes easier as a preliminary test of quality.</li>
<li>Most decent text editors provide in-place validation.</li>
</ul>



</div>

<div class="slide">

<h1>Benefits: Broad Implementation</h1>


<ul>
<li>There are parsers for <span class="caps">XHTML </span>in almost every programming language</li>
<li>Because it's just <span class="caps">XML, </span>you can use <span class="caps">XML </span>parsers.</li>
<li>Fairly consistent implementation across modern web browsers</li>
</ul>



</div>

<div class="slide">

<h1>Benefits: Well Documented and Understood</h1>


<ul>
<li>Lots and lots of books and web resources.</li>
<li>Well-established best practices</li>
<li>Many subject matter experts within and outside of the company.</li>
</ul>



</div>

<div class="slide">

<h1>Guerilla Standards</h1>


<ul>
<li>Small groups, forming "rebel" working groups</li>
<li>Created to address perceived shortcomings of existing standards</li>
<li>Sometimes end up in larger established standards bodies</li>
</ul>



</div>

<div class="slide">

<h1>Examples</h1>


<ul>
<li><a href="http://microformats.org">Microformats</a>
<ul>
<li>Uses existing standards' (HTML and <span class="caps">XHTML</span>) attributes to add meaning to ambiguous elements</li>
</ul>
</li>
<li><a href="http://atomenabled.org"><span class="caps">ATOM</span></a>
<ul>
<li>Alternative to <span class="caps">RSS. </span> More consistent and well-designed than <span class="caps">RSS.</span></li>
<li>Also provides a syndication <span class="caps">API.</span></li>
</ul>
</li>
<li><a href="http://whatwg.org">WhatWG</a>
<ul>
<li>Formed in response to the <span class="caps">W3C'</span>s direction with <span class="caps">XHTML</span> 2.</li>
</ul>
</li>
<li><a href="http://openidenabled.com">OpenID</a>
<ul>
<li>Allows for truly portable internet identity</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Example: Microformats</h1>


<ul>
<li>All work is done on e-mail lists and <a href="http://microformats.org/wiki">the wiki</a>	</li>
<li>Rigorous community review makes for better standards.</li>
<li>Has been accused of being "cultish" and led by a small group<br />
	<br />
</div></li>
</ul>



<div class="slide">

<h1>Why Microformats?</h1>


<ul>
<li>You have to use classes in your <span class="caps">HTML, </span>why not use classes with <em>meaning</em>?</li>
<li>They're the semantic web <strong>today</strong>.  We don't need no stinkin' <span class="caps">RDF</span>!<br />
	<br />
</div></li>
</ul>



<div class="slide">

<h1>Microformats vs. <span class="caps">W3C</span></h1>


<ul>
<li>Microformats try to "pave the cowpath" instead of "boil the ocean"</li>
<li>The process of creating a microformat and getting it approved by the community can be done in weeks instead of years (::cough:: <span class="caps">W3C</span>).<br />
	<br />
</div>	</li>
</ul>



<div class="slide">	

<h1>Example: WhatWG</h1>


<ul>
<li>Produced the <a href="http://whatwg.org/specs/web-apps/current-work/"><span class="caps">HTML5</span></a> and <a href="http://www.whatwg.org/specs/web-forms/current-work/">WebForms 1.0</a> specs.</li>
<li>Along with group of <span class="caps">W3C </span>member companies (including <span class="caps">AOL</span>!), led the <span class="caps">W3C </span>to reconsider the direction of <span class="caps">XHTML </span>and the reformation of the <span class="caps">HTML</span> Working Group.</li>
<li>Extremely informal, but doggedly led by Ian Hickson.<br />
	<br />
</div>	</li>
</ul>



<div class="slide">

<h1>How Is <span class="caps">AOL</span> Involved?  <span class="caps">W3C</span></h1>


<ul>
<li><span class="caps">AOL </span>is a member of the <span class="caps">W3C, </span>and currently has representation on the following working groups:</li>
<li><span class="caps">CSS</span> WG: Cindy Li, Kevin Lawver</li>
<li>Protocols and Formats WG -- A <span class="caps">WAI </span>activity/WCAG: Donald Evans</li>
<li>Mobile Web Best Practices WG: Arun Ranganathan</li>
<li>Web Security Context WG: Praveen Allavilli, Shawn Duffy, Zhihong Zhang</li>
<li>Future <span class="caps">HTML</span> WG: Geoff Bishop, Arun Ranganathan</li>
<li>Web <span class="caps">API</span> WG: Arun Ranganathan, Kevin Lawver</li>
<li>Web Application Formats WG: Arun Ranganathan, Kevin Lawver, John Robinson</li>
<li>Web Content Labeling XG (Incubator Group): Diana Pentecost</li>
<li>We observe: Semantic Web, Web Services <span class="caps">XML</span> Protocol, Patent Policy, <span class="caps">P3P</span></li>
</ul>



</div>

<div class="slide">

<h1>Other Standards Bodies <span class="caps">AOL </span>is a Member of</h1>


<ul>
<li>Liberty Alliance: federated identity standards</li>
<li><span class="caps">OMA</span>: Open Mobile Alliance</li>
<li><span class="caps">IETF</span>: Internet Engineering Task Force: Edwin Aoki and Richard Collela</li>
<li><span class="caps">INCITS</span>: Accessibility</li>
<li><span class="caps">OASIS</span>: Monitor, but don't actively participate in the Security and Open Document Format: Roger Martin</li>
<li><span class="caps">JCP</span>: Java Community Process: Carlos <span class="caps">O'K</span>ieffe</li>
<li><span class="caps">OMTP</span>: Open Mobile Terminal Platform: Pim van Meurs, Mary Lou Hardy</li>
<li><span class="caps">DDEX</span>: Digital Date Exchange: Metadata for media: Nick Sincaglia </li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">AOL </span>is a Guerilla</h1>


<ul>
<li>Several employees are active in:
<ul>
<li>the Microformats community - ModuleT, hAtom, hReview and hResume</li>
<li>OpenID - Trying to get agreement between all the identity specs on a direction</li>
<li>Atom - <a href="http://abstractioneer.org">John Panzer</a> has been <em>very</em> involved in the Atom community<br />
	<br />
</div>	</li>
</ul>
</li>
</ul>



<div class="slide">

<h1>How Can I Get Involved?</h1>


<ul>
<li>We need more representation in the <span class="caps">W3C</span>!  If you're a domain expert, talk to your manager and get approval.</li>
<li>Adopt standards-based development practices!</li>
<li><a href="http://www.tbray.org/ongoing/When/200x/2006/01/08/No-New-XML-Languages">Don't create any more <span class="caps">XML </span>languages</a></li>
<li>Reach out.  There are domain experts in the company who can help point you in the right direction.</li>
</ul>



</div>

<div class="slide">

<h1>Conclusion</h1>


<ul>
<li>Follow the steps</li>
<li>Ask, don't invent</li>
</ul>



</div>

<div class="slide">

<h1>Questions?</h1>

</div>]]></description>
         <link>http://presentations.lawver.net/standards/web_standards_what_and_why/</link>
         <guid>http://presentations.lawver.net/standards/web_standards_what_and_why/</guid>
         <category>standards</category>
         <pubDate>Wed, 28 Feb 2007 18:27:29 -0500</pubDate>
      </item>
      
      <item>
         <title>Mashup Camp 3: Bridging the Gap: The Web and the Desktop</title>
         <description><![CDATA[<div class="slide">

<h1>The Scene</h1>


<ul>
<li>Desktop apps are using more and more web services</li>
<li>The web is leaking onto the desktop in widgets and windowless browsers</li>
<li>The preferred programming paradigm is more web-like than ever</li>
</ul>



</div>

<div class="slide">

<h1>Today</h1>


<ul>
<li>Open <span class="caps">API</span>s</li>
<li>Desktop apps are essentially windowless browsers</li>
<li>Many more apps include renderers in them somewhere</li>
</ul>



</div>

<div class="slide">

<h1>The Web Won</h1>


<ul>
<li>Forgiving programming model
<ul>
<li>Fairly easy to get started with</li>
</ul>
</li>
<li>Flexibility</li>
<li>Upgrade path between versions smoother
<ul>
<li>Ever thought about "sunsetting" a website?</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Beginnings</h1>


<ul>
<li>Modern <span class="caps">IDE</span>s embrace markup, javascript (or javascript-like) interfaces</li>
<li>Modern apps are providing more and more data through web services
<ul>
<li>and digesting, or built on top of, web services (feed readers, etc)</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Demo</h1>


<ul>
<li>Greg?  (I sure hope this works)</li>
</ul>



</div>

<div class="slide">

<h1>Tomorrow</h1>


<ul>
<li>Better browsers</li>
<li>Better scripting standards and tools (DOM3, WebAPI)</li>
<li>Better markup standards (Web Formats, <span class="caps">XHTML</span>+)</li>
<li>Easier to use <span class="caps">IDE</span>s</li>
<li>Straight-from-the-web compilers (see <a href="http://amnesty.mesadynamics.com/Singles.html">Amnesty Singles</a>)</li>
</ul>



</div>

<div class="slide">

<h1>What's Next?</h1>


<ul>
<li>What do you want to see?</li>
<li>What can we do to help?</li>
<li>How does the relatively slow rollout cycle of desktop apps keep up with the ever-amorphous web?</li>
</ul>



</div>]]></description>
         <link>http://presentations.lawver.net/philosophy/bridging_the_gap_the_web_and_t/</link>
         <guid>http://presentations.lawver.net/philosophy/bridging_the_gap_the_web_and_t/</guid>
         <category>philosophy</category>
         <pubDate>Tue, 16 Jan 2007 22:38:45 -0500</pubDate>
      </item>
      
      <item>
         <title>Microformats + DOM / AJAX = Mashup Nirvana</title>
         <description><![CDATA[<div class="slide">

<h1>Who is Kevin Lawver?</h1>


<ul>
<li><span class="caps">CSS</span> Dork and general web standards nut</li>
<li><a href="http://aol.com"><span class="caps">AOL</span></a> Employee</li>
<li><a href="http://lawver.net">Blogger</a></li>
<li>Part of the three-headed <a href="http://aimpages.com"><span class="caps">AIM</span> Pages</a> architect monster</li>
<li>Writer of <a href="http://developer.iamalpha.com">documentation</a></li>
</ul>



</div>

<div class="slide">

<h1>Agenda</h1>


<ul>
<li>Microformats Introduction</li>
<li>Development Case Study</li>
<li>Cool Examples
<ul>
<li>Generation</li>
<li>Discovery</li>
<li>Transformation</li>
</ul>
</li>
<li>Stuff You Can Use Today</li>
<li>Questions! (you can ask them any time, honest)</li>
</ul>



</div>

<div class="slide">

<h1>What are Microformats?</h1>

<blockquote><p>Microformats are a set of simple, open data formats built upon existing and widely adopted standards.</p></blockquote>

</div>

<div class="slide">

<h1>No, Really...</h1>


<ul>
<li>Conceptually:
<ul>
<li>A way of thinking about data formats that's highly correlated with semantic <span class="caps">XHTML, AKA </span>the real world semantics, <span class="caps">AKA </span>lowercase semantic web, <span class="caps">AKA </span>lossless <span class="caps">XHTML</span></li>
<li>a set of simple open data format standards that many (including Technorati) are actively developing and implementing for more/better structured blogging and web microcontent publishing in general.</li>
</ul>
</li>
<li>Practically: 
<ul>
<li>Add a little bit of extra stuff to your existing markup and you've joined the party.</li>
<li>Small changes to how you <em>already</em> create <span class="caps">XHTML.</span></li>
<li>Makes your good markup better without a lot of extra work.</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Sounds Hard...</h1>


<ul>
<li>Nope!  Take this from the <a href="http://theajaxexperience.com">conference homepage</a>:</li>
</ul>





<pre><code>&lt;address&gt;
    Westin Boston Waterfront&lt;br /&gt;
    425 Summer Street&lt;br /&gt;  
    Boston, MA  02210&lt;br /&gt;
    &lt;a href=&quot;http://maps.google.com/maps?q=425+Summer+Street,+Boston,+MA+02210&amp;hl=en&quot; target=&quot;_map&quot;&gt;View Map&lt;/a&gt;
&lt;/address&gt;</code></pre>



</div>

<div class="slide">

<h1>That Same Code With Microformats!</h1>



<pre><code>&lt;address class=&quot;vcard&quot;&gt;
    &lt;p class=&quot;org&quot;&gt;Westin Boston Waterfront&lt;/p&gt;
    &lt;p class=&quot;street-address&quot;&gt;425 Summer Street&lt;/p&gt;
    &lt;p&gt;&lt;b class=&quot;locality&quot;&gt;Boston&lt;/b&gt;, &lt;b class=&quot;region&quot;&gt;MA&lt;/b&gt;  &lt;b class=&quot;postal-code&quot;&gt;02210&lt;/b&gt;&lt;/p&gt;
    &lt;a href=&quot;http://maps.google.com/maps?q=425+Summer+Street,+Boston,+MA+02210&amp;hl=en&quot; target=&quot;_map&quot;&gt;View Map&lt;/a&gt;
&lt;/address&gt;</code></pre>



</div>

<div class="slide">

<h1>That Wasn't So Hard, Was It?</h1>


<ul>
<li>We can use a little <span class="caps">CSS </span>(two or three lines at the most) to make that look like we want.</li>
<li>We'll talk about <em>why</em> you'd want to do all that a little later.</li>
<li>But first... how we create microformats!</li>
</ul>



</div>

<div class="slide">

<h1>Paving the Cowpath</h1>


<ul>
<li>solve for <a href="http://ifindkarma.typepad.com/relax/2004/12/microformats.html">existing applications</a></li>
<li>solve a <strong>specific</strong> problem</li>
<li>start as <strong>simple</strong> as possible</li>
<li>design for <strong>humans first</strong>, machines second</li>
<li><strong>reuse</strong> building blocks from widely adopted standards</li>
<li>modularity / embeddability</li>
<li>enable and encourage decentralized and distributed development, content, services</li>
</ul>



</div>

<div class="slide">

<h1>Reuse, Reuse, Reuse!</h1>


<ul>
<li><strong>reuse</strong> building blocks from widely adopted standards
<ul>
<li>Before you go inventing a new language, learn the current ones</li>
<li>Document them, find strengths, weaknesses and reasons behind decisions</li>
<li>Pick the best from each one, or just go with what exists</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Current Microformats</h1>


<ul>
<li>Several are "finished", lots are very close</li>
<li>Several are in the brainstorming and example phases.</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">XFN, </span>rel-license and rel-tag</h1>


<ul>
<li>All use the <code>rel</code> attribute of links.</li>
<li><a href="http://gmpg.org/xfn"><span class="caps">XFN</span></a>: <span class="caps">XHTML</span> Friends Network - Tell the world what your relationship is with the folks on your blogroll.
<ul>
<li>Example: <code>&lt;a href=&quot;http://lawver.net/jen&quot; rel=&quot;spouse&quot;&gt;&lt;/a&gt;</code></li>
</ul>
</li>
<li><a href="http://microformats.org/wiki/rel-license">rel-license</a>: Define the license for your content.  Becoming more and more important
<ul>
<li>Example: <code>&lt;link rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by/2.0/&quot;/&gt;</code></li>
<li>Example 2: <code>Licensed under &lt;a href=&quot;http://creativecommons.org/licenses/by/2.0/&quot; rel=&quot;license&quot;&gt;Creative Commons 2.0&lt;/a&gt;</code></li>
</ul>
</li>
<li><a href="http://microformats.org/wiki/rel-tag">rel-tag</a>: Tag the current page with links
<ul>
<li>Example: <code>&lt;a href=&quot;http://lawver.net/politics&quot; rel=&quot;tag&quot;&gt;politics&lt;/a&gt;</code></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">XOXO</span></h1>


<ul>
<li>Mark up lists like outlines or blogrolls (comparable to <acronym title="Outline Processing Markup Language"><span class="caps">OPML</span></acronym>)</li>
<li>v1.0 is final</li>
<li><a href="http://microformats.org/wiki/xoxo">Homepage</a></li>
</ul>



</div>

<div class="slide">

<h1><span class="caps">XOXO</span> Example</h1>



<pre><code>&lt;ul class=&quot;xoxo&quot;&gt;
    &lt;li&gt;An item
        &lt;ul&gt;
            &lt;li&gt;A sub-item&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Another item&lt;/li&gt;
&lt;/ul&gt;</code></pre>



</div>

<div class="slide">

<h1>hCalendar</h1>


<ul>
<li>Pretty much everything in the <a href="http://www.ietf.org/rfc/rfc2445.txt">iCalendar</a> spec (you know, an iCal or Outlook entry) in <span class="caps">HTML.</span></li>
<li>baked, set in stone, etc</li>
<li><a href="http://microformats.org/wiki/hcalendar">Homepage</a></li>
</ul>



</div>

<div class="slide">

<h1>hCal Example</h1>



<pre><code>&lt;ul&gt;&lt;li class=&quot;vevent&quot;&gt;
    &lt;h4 class=&quot;summary&quot;&gt;
        &lt;a class=&quot;url&quot; href=&quot;http://theajaxexperience.com/&quot; target=&quot;_new&quot;&gt;The AJAX Experience&lt;/a&gt;
    &lt;/h4&gt;
    &lt;div class=&quot;description&quot;&gt;I'll be speaking about microformats, and their uses
        in DOM scripting, web services and AJAX-y goodness
    &lt;/div&gt;
    &lt;p class=&quot;location&quot;&gt;Boston, MA&lt;/p&gt;
    &lt;p&gt;
        &lt;abbr class=&quot;dtstart&quot; title=&quot;2006-10-23&quot;&gt;10/23/2006&lt;/abbr&gt; - 
        &lt;abbr class=&quot;dtend&quot; title=&quot;2006-10-25&quot;&gt;10/25/2006&lt;/abbr&gt;
    &lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;</code></pre>



</div>

<div class="slide">

<h1>hCard</h1>


<ul>
<li>Everything in an address book card, only in <span class="caps">HTML.</span></li>
<li>Done!</li>
<li><a href="http://microformats.org/wiki/hcard">Homepage</a></li>
</ul>



</div>

<div class="slide">

<h1>hCard Example</h1>



<pre><code>&lt;div class=&quot;vcard&quot;&gt;
    &lt;a class=&quot;url fn&quot; href=&quot;http://lawver.net/&quot;&gt;Kevin Lawver&lt;/a&gt; - 
    &lt;a href=&quot;http://aol.com&quot; class=&quot;org&quot;&gt;AOL&lt;/a&gt;
&lt;/div&gt;</code></pre>



</div>

<div class="slide">

<h1>hAtom</h1>


<ul>
<li>The <span class="caps">ATOM </span>feed format turned into <span class="caps">HTML.</span></li>
<li>Draft, but a solid one.</li>
<li><a href="http://microformats.org/wiki/hatom">Homepage</a></li>
<li>We'll look at an example in a little bit.</li>
</ul>



</div>

<div class="slide">

<h1>hAtom Example</h1>



<pre><code>&lt;div class=&quot;hentry&quot;&gt;
   &lt;h3 class=&quot;entry-title&quot;&gt;
       &lt;a href=&quot;http://someurl.com/blog/permalink&quot; class=&quot;bookmark&quot;&gt;My Blog Post&lt;/a&gt;
    &lt;/h3&gt;
   &lt;div class=&quot;entry-content&quot;&gt;I'm going to AJAX Experience!&lt;/div&gt;
   &lt;p&gt;
       Published &lt;abbr title=&quot;2006-10-24T09:30:30&quot;&gt;10/24/2006&lt;/abbr&gt; 
       by &lt;b class=&quot;author&quot;&gt;Kevin Lawver&lt;/b&gt;.
   &lt;/p&gt;
&lt;/div&gt;</code></pre>



</div>

<div class="slide">

<h1>hReview</h1>


<ul>
<li>A way to mark up reviews.</li>
<li>Drafty, but closey to doney</li>
<li><a href="http://microformats.org/wiki/hreview">Homepage</a></li>
<li>If we have time, we'll look at an example of this too.</li>
</ul>



</div>

<div class="slide">

<h1>hReview Example</h1>



<pre><code>&lt;div class=&quot;hreview&quot;&gt;
 &lt;span class=&quot;reviewer vcard&quot;&gt;
  &lt;span class=&quot;fn&quot;&gt;anonymous&lt;/span&gt;, 
  &lt;abbr class=&quot;dtreviewed&quot; title=&quot;20050418&quot;&gt;April 18th, 2005&lt;/abbr&gt;
 &lt;/span&gt;
 &lt;div class=&quot;item&quot;&gt;
  &lt;a lang=&quot;zh&quot; class=&quot;url fn&quot; href=&quot;http://www.imdb.com/title/tt0299977/&quot;&gt;
  Ying Xiong (&lt;span lang=&quot;en&quot;&gt;HERO&lt;/span&gt;)
  &lt;/a&gt;
 &lt;/div&gt;
 &lt;div&gt;Rating: &lt;span class=&quot;rating&quot;&gt;4&lt;/span&gt; out of 5&lt;/div&gt;
 &lt;div class=&quot;description&quot;&gt;&lt;p&gt;
  This movie has great music and visuals.
 &lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;</code></pre>



</div>

<div class="slide">

<h1>hResume</h1>


<ul>
<li>Mark up your resume</li>
<li>A little draftier than the others.</li>
<li><a href="http://microformats.org/wiki/hresume">Homepage</a></li>
</ul>



</div>

<div class="slide">

<h1>hResume Example</h1>


<ul>
<li><a href="http://www.kerihenare.com/cv/">Keri Henare</a> has a nice one.</li>
</ul>



</div>

<div class="slide">

<h1>Development Example: ModuleT</h1>


<ul>
<li>Needed to create modules, but couldn't use other existing formats</li>
<li>Wanted it to be easy for developers to create, test and deploy them.</li>
<li>Wanted to be able to embed them in any other format or <span class="caps">HTML </span>page.</li>
<li>So, we created a microformat!</li>
</ul>



</div>

<div class="slide">

<h1>Document Existing Formats</h1>


<ul>
<li><a href="http://microformats.org/wiki/widget-examples">Created a wiki page for examples</a></li>
<li>Looked at everything, tried to talk to everyone.</li>
</ul>



</div>

<div class="slide">

<h1>Draft, Publish, Revise, Repeat</h1>


<ul>
<li>Our <a href="http://developer.iamalpha.com/profile">profile</a> went through several drafts.</li>
<li>Each one got better.</li>
<li>We eventually had to stop and actually get to work...</li>
</ul>



</div>

<div class="slide">

<h1>ModuleT in Action</h1>


<ul>
<li>Currently in use on <a href="http://aimpages.com"><span class="caps">AIM</span> Pages</a></li>
<li>Coming soon to other <span class="caps">AOL </span>products</li>
<li>Released under a royalty-free license, so anyone can use it for pretty much anything.</li>
</ul>



</div>

<div class="slide">

<h1>Generating Microformats</h1>


<ul>
<li>I created a <a href="http://aimpages.com/.module/my-events">module</a> (<a href="http://dev.lawver.net/ajax-experience/my-events.html">javascript</a>)</li>
<li>Allows users to create a simple list of events</li>
<li>Not terribly exciting, except they're marked up as <a href="http://microformats.org/wiki/hcalendar">hcal</a> events!</li>
<li><a href="http://aimpages.com/kplawver">See it in use</a> (left hand side)</li>
</ul>



</div>

<div class="slide">

<h1>Parsing Microformats</h1>


<ul>
<li>I have the <a href="https://addons.mozilla.org/firefox/4106/">Operator</a> plugin, which will light up icons when it sees microformats on the page.</li>
<li>Click the one that lit up, and it should show you the info it found on the page.</li>
<li>We'll talk about this a little later.</li>
</ul>



<!-- * I have the "Tails":https://addons.mozilla.org/firefox/2240/ plugin, which just lit up.
* Click the little icon, and now I can export them to as iCal entries (well, on Windows you can, it has some "issues" in OS X).
* We'll talk a little bit more about this later. -->

</div>

<div class="slide">

<h1>Discoverability</h1>


<ul>
<li>Ok, big deal, you can put some dates on your page.</li>
<li>But, what if everyone else did too?</li>
</ul>



</div>

<div class="slide">

<h1>Shared Events</h1>


<ul>
<li>Now, when I go to <a href="http://aimpages.com/kevinplawver">my other page</a>, it should tell me what events "we" have in common.</li>
</ul>



</div>

<div class="slide">

<h1>How Sharing Works</h1>


<ul>
<li><a href="http://dev.lawver.net/ajax-experience/shared-events.html">Module javascript</a></li>
<li>Using <span class="caps">AIM</span> Page's super cool pageQuery <span class="caps">API,</span> I can get just a <a href="http://aimpages.com/kplawver/profile.html?moduleid=my-events-0">piece of a page</a></li>
<li>I take the <span class="caps">URL</span>s out of that chunk, and compare it to the <span class="caps">URL</span>s in the my-events module on the current page.</li>
<li>If any are the same, they get added to the list, and you get a friendly "Hey, you've got events in common" message.</li>
<li>Check out the module above that one.   If I go to <a href="http://aimpages.com/kevinplawver">my other page</a>, we'll see what events the two pages share.<br />
</div></li>
</ul>



<div class="slide">

<h1>Possibilities</h1>


<ul>
<li><span class="caps">SEO </span>is a dirty word, but this could turn out to be <span class="caps">SEO </span><em>on crack</em>.</li>
<li>Lots and lots of well-marked up data just laying around the web...  and spiders crawling all of it.</li>
<li>I smell smarter spiders in our future.</li>
</ul>



</div>

<div class="slide">

<h1>Your Document Becomes the <span class="caps">API</span></h1>


<ul>
<li>Using ModuleT, we built a web service to pull individual modules out of a page</li>
<li><a href="http://aimpages.com/kplawver/profile.html?moduleid=my-events-0">Example</a></li>
<li>Lots of other examples of transforming microformats into other things (more on that in a second)</li>
</ul>



</div>

<div class="slide">

<h1>What if...</h1>


<ul>
<li>You wrote <span class="caps">XHTML </span><em>expecting</em> it to be transformed?</li>
<li>Your web page was the <span class="caps">API, </span>what would happen?</li>
<li>You could embed pieces your web page in other pages, what would that look like?</li>
<li>Which leads to...</li>
</ul>



</div>

<div class="slide">

<h1>Transformation</h1>


<ul>
<li>Ok, let's start with a new module: <a href="http://aimpages.com/.module/cheap-blog">Cheap Blog</a>
<ul>
<li><a href="http://aimpages.com/kplawver">Example</a> (first module in the middle column)</li>
<li>The <a href="http://dev.lawver.net/ajax-experience/cheap-blog-edit.html">interesting bit of code</a></li>
</ul>
</li>
<li>It's a cheap blog!  It stores everything <em>in the page</em>!
<ul>
<li>In <a href="http://microformats.org/wiki/hatom">hAtom</a> to boot</li>
</ul>
</li>
<li>Now that we have a blog in the page, what can we do with it?</li>
</ul>



</div>

<div class="slide">

<h1>Transform it!!</h1>


<ul>
<li><del>Using <a href="http://rbach.priv.at/hAtom2Atom/">Robert Bachman's <span class="caps">XSLT</span></a>, we get just the piece of the page we need, then transform it!</del></li>
<li>Originally using Robert's stylesheet, now using <span class="caps">PHP DOM </span>stuff because my foo is not strong enough (or I didn't have enough time to troubleshoot some encoding issues).</li>
<li><a href="http://dev.lawver.net/ajax-experience/cheap-feed.php?sn=kplawver&amp;instance=cheap-blog-0">Example</a></li>
<li>It's not perfect, but this is a demo, right? </li>
</ul>



</div>

<div class="slide">

<h1>Other Tools for Transformation</h1>


<ul>
<li>There are several existing stylesheets and services for microformats (converting to and from):
<ul>
<li>hAtom2Atom: <a href="http://rbach.priv.at/hAtom2Atom/"><span class="caps">XSL</span></a> and a <a href="http://lukearno.com/projects/hatom2atom/">proxy</a></li>
<li><a href="http://suda.co.uk/projects/X2V/"><span class="caps">X2V</span></a> - Converts hCard and hCal to vcard and iCal.</li>
<li><a href="http://feeds.technorati.com/events/">hCal to iCal</a> - Give an <span class="caps">URL, </span>get back a .ics file!</li>
<li><a href="http://feeds.technorati.com/contacts/">hCard to vcard</a> - Give an <span class="caps">URL, </span>get back vcards!</li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Mashups and Microformats</h1>


<ul>
<li>Microformats make getting meaningful data out of <span class="caps">HTML </span>documents easier</li>
<li>Consistent class names and formatting mean repeatable parsing across documents</li>
<li>Allows for a whole new set of web services</li>
</ul>



</div>

<div class="slide">

<h1>Beginnings of the Revolution</h1>


<ul>
<li>Browser plugins/extensions</li>
<li>Web services</li>
<li>Bookmarklets</li>
<li>Others?</li>
</ul>



</div>

<div class="slide">

<h1>Some Browser Examples</h1>


<ul>
<li><a href="https://addons.mozilla.org/firefox/4106/">Operator</a></li>
<li><a href="https://addons.mozilla.org/firefox/2240/">Tails</a></li>
<li><a href="http://www.supernova2006.com/go/workshop-speakers">Tails in Action</a></li>
<li><a href="http://aimpages.com/kplawver">User Generated Microformats</a></li>
</ul>



</div>

<div class="slide">

<h1>Other Microformat Web Services and Extensions</h1>


<ul>
<li><a href="http//pingerati.net">Pingerati</a> - Sends pings to appropriate microformat-aware services based on what's in your page.</li>
<li><a href="http://greasemonkey.mozdev.org/">Greasemonkey</a> - Screaming for more microformat mashups.  Already treats web pages as a canvas.</li>
</ul>



</div>

<div class="slide">

<h1>Things That Would Make Me Happy</h1>


<ul>
<li>Microformat to <span class="caps">JSON 