<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Kevin Lawver&apos;s Presentations</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/" />
    <link rel="self" type="application/atom+xml" href="http://presentations.lawver.net/atom.xml" />
   <id>tag:presentations.lawver.net,2008://15</id>
    <link rel="service.post" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15" title="Kevin Lawver's Presentations" />
    <updated>2008-05-16T15:42:29Z</updated>
    <subtitle>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.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.1</generator>
 

<entry>
    <title>An Introduction to Ruby on Rails</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/philosophy/an_introduction_to_ruby_on_rai/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5482" title="An Introduction to Ruby on Rails" />
    <id>tag:presentations.lawver.net,2008://15.5482</id>
    
    <published>2008-05-13T19:44:35Z</published>
    <updated>2008-05-16T15:42:29Z</updated>
    
    <summary> Ruby on Rails? What&apos;s That? &quot;highly opinionated&quot; web application framework written in Ruby full-featured MVC, complete with development environment as much a philosophy for development as a framework Ruby on Rails&apos; Strengths Easy to get started with, easy to...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="philosophy" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>AIM Photos: A Case Study in Agile Development</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/aol/aim_photos_a_case_study_in_agi/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5354" title="AIM Photos: A Case Study in Agile Development" />
    <id>tag:presentations.lawver.net,2007://15.5354</id>
    
    <published>2007-12-10T16:21:37Z</published>
    <updated>2007-12-11T14:37:52Z</updated>
    
    <summary> What&apos;s AIM Photos? A simple little photo sharing site built to support AIM Profiles The first large-scale Ruby on Rails application at AOL Pretty quick, and growing at a healthy clip Go check it out The Team Product: Ian...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="aol" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>The Future of Markup</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/standards/the_future_of_markup/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5326" title="The Future of Markup" />
    <id>tag:presentations.lawver.net,2007://15.5326</id>
    
    <published>2007-11-09T21:36:55Z</published>
    <updated>2007-11-14T18:07:57Z</updated>
    
    <summary> The Current Markup World XHTML 1.0 Transitional provides the best benefit for web developers. Enforces consistency and validation Throws browsers in standards mode which reduces (but doesn&apos;t eliminate) differences between modern web browsers. Allows for popular and necessary (but...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="standards" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>An Overview of acts_as_trri</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/aol/an_overview_of_acts_as_trri/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5314" title="An Overview of acts_as_trri" />
    <id>tag:presentations.lawver.net,2007://15.5314</id>
    
    <published>2007-10-23T00:49:18Z</published>
    <updated>2007-10-23T12:37:42Z</updated>
    
    <summary> acts_as_what? It&apos;s a Rails plugin that adds methods for tagging and reviewing ActiveRecord models. Works with existing models without requiring you to rewrite them. Covers most (but not all) of the current TRRI API. I can add the rest...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="aol" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>CSS for the Authentication Team</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/aol/css_for_the_authentication_tea/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5303" title="CSS for the Authentication Team" />
    <id>tag:presentations.lawver.net,2007://15.5303</id>
    
    <published>2007-10-12T15:02:32Z</published>
    <updated>2007-10-12T15:20:44Z</updated>
    
    <summary> Using CSS (the right way) Let&apos;s look at the new SNS login page. Issues The markup&apos;s not valid. The validator reports 120 errors. HTTP-EQUIV Meta tags are old school. Your webserver should be returning those headers. Either way, all...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="aol" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>Sprint Demo</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/aol/sprint_demo/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5247" title="Sprint Demo" />
    <id>tag:presentations.lawver.net,2007://15.5247</id>
    
    <published>2007-08-08T15:52:10Z</published>
    <updated>2007-08-08T15:53:20Z</updated>
    
    <summary> The Basics A photo-sharing site built to complement AIM Profiles Not intended to be a stand-alone product, but is a feature of the profile. Built on Ruby on Rails by a rotating staff of developers The Pieces Ruby on...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="aol" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>	]]>
        
    </content>
</entry>

<entry>
    <title>Mashup University: Tapping The Portable Social Network</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/philosophy/mashup_university_tapping_the/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5225" title="Mashup University: Tapping The Portable Social Network" />
    <id>tag:presentations.lawver.net,2007://15.5225</id>
    
    <published>2007-07-17T01:55:29Z</published>
    <updated>2007-07-17T21:20:49Z</updated>
    
    <summary> Tapping the Portable Social Network I&apos;m tired of starting over. What if I could bring my social network with me to every new site I go to? This is all Jeremy Keith&apos;s fault Ingredients Ruby on Rails The following...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="philosophy" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>XTech 2007: Open AIM as It Relates to You</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/philosophy/xtech_2007_open_aim_as_it_rela/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5157" title="XTech 2007: Open AIM as It Relates to You" />
    <id>tag:presentations.lawver.net,2007://15.5157</id>
    
    <published>2007-05-18T06:10:16Z</published>
    <updated>2007-05-18T06:16:22Z</updated>
    
    <summary> What is OpenAIM and what can it do for you? Set of developer tools Extend functionality beyond the AIM client Tap into existing community of 68 million users Web AIM (Beta) Add AIM to your web page Ability to...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="philosophy" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>Web 2.0 Expo: Bridging the Gap Between Desktop and Web</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/philosophy/bridging_the_gap_between_deskt/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5134" title="Web 2.0 Expo: Bridging the Gap Between Desktop and Web" />
    <id>tag:presentations.lawver.net,2007://15.5134</id>
    
    <published>2007-04-15T23:23:44Z</published>
    <updated>2007-04-15T23:38:44Z</updated>
    
    <summary> The Scene Desktop apps are using more and more web services The web is leaking onto the desktop in widgets and windowless browsers The preferred programming paradigm is more web-like than ever Beginnings Modern IDEs embrace markup, javascript (or...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="philosophy" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>Ficlets, Rails and OpenID</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/philosophy/ficlets_rails_and_openid/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5120" title="Ficlets, Rails and OpenID" />
    <id>tag:presentations.lawver.net,2007://15.5120</id>
    
    <published>2007-03-28T19:48:18Z</published>
    <updated>2007-03-29T20:32:33Z</updated>
    
    <summary> What is Ficlets? The Site Collaborative fiction: Any user can add a prequel or sequel to any story All content is licensed under Creative Commons Using the Flickr API to pull in &quot;inspiration&quot; photos Using several feeds to spur...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="philosophy" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>Microformats for Web Services and Portable Content</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/standards/microformats_for_web_services/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5114" title="Microformats for Web Services and Portable Content" />
    <id>tag:presentations.lawver.net,2007://15.5114</id>
    
    <published>2007-03-20T15:05:16Z</published>
    <updated>2007-04-13T19:55:38Z</updated>
    
    <summary> What are Microformats? A set of HTML attribute values that add meaning to otherwise generic content. An implementation of existing web standards, not new standards Where are They Used Today? By companies like: AOL Yahoo Technorati LinkedIn Ma.gnolia and...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="standards" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>How to Convince Your Company to Embrace Mashup Culture</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/philosophy/how_to_convince_your_company_t/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5100" title="How to Convince Your Company to Embrace Mashup Culture" />
    <id>tag:presentations.lawver.net,2007://15.5100</id>
    
    <published>2007-03-11T04:02:26Z</published>
    <updated>2007-03-11T20:59:30Z</updated>
    
    <summary> Introductions Kevin Lawver - Web standards dork, microformats nut, newly minted Rails geek Alla Gringaus - Time Inc. Frontend Dev Lead Arun Ranganathan - AOL&apos;s AC Representative at the W3C, yogic cassanova Greg Cypes - AIM Developer, evangelist, golfer...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="philosophy" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>Web Standards: What and Why</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/standards/web_standards_what_and_why/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5087" title="Web Standards: What and Why" />
    <id>tag:presentations.lawver.net,2007://15.5087</id>
    
    <published>2007-02-28T23:27:29Z</published>
    <updated>2008-06-20T19:00:35Z</updated>
    
    <summary> Introduction I&apos;m Kevin Lawver Member of the CSS Working Group Helped create the ModuleT Active at the beginning of the ATOM syndication format process Co-founder of crazy grassroots web standards advocacy group at AOL Co-author of Adapting to Web...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="standards" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>Mashup Camp 3: Bridging the Gap: The Web and the Desktop</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/philosophy/bridging_the_gap_the_web_and_t/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=5048" title="Mashup Camp 3: Bridging the Gap: The Web and the Desktop" />
    <id>tag:presentations.lawver.net,2007://15.5048</id>
    
    <published>2007-01-17T03:38:45Z</published>
    <updated>2007-04-15T23:30:52Z</updated>
    
    <summary> The Scene Desktop apps are using more and more web services The web is leaking onto the desktop in widgets and windowless browsers The preferred programming paradigm is more web-like than ever Today Open APIs Desktop apps are essentially...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="philosophy" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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>]]>
        
    </content>
</entry>

<entry>
    <title>Microformats + DOM / AJAX = Mashup Nirvana</title>
    <link rel="alternate" type="text/html" href="http://presentations.lawver.net/standards/microformats_dom_ajax_mashup_n/" />
    <link rel="service.edit" type="application/atom+xml" href="http://lawver.net/mt/mt-atom.fpl/weblog/blog_id=15/entry_id=4926" title="Microformats + DOM / AJAX = Mashup Nirvana" />
    <id>tag:presentations.lawver.net,2006://15.4926</id>
    
    <published>2006-10-20T22:16:26Z</published>
    <updated>2007-03-22T14:54:26Z</updated>
    
    <summary> Who is Kevin Lawver? CSS Dork and general web standards nut AOL Employee Blogger Part of the three-headed AIM Pages architect monster Writer of documentation Agenda Microformats Introduction Development Case Study Cool Examples Generation Discovery Transformation Stuff You Can...</summary>
    <author>
        <name>Kevin Lawver</name>
        <uri>http://lawver.net</uri>
    </author>
    
        <category term="standards" />
    
    <content type="html" xml:lang="en" xml:base="http://presentations.lawver.net/">
        <![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 </span>conversion tools</li>
<li>A "global" widget/module spec</li>
<li>Consistent licensing of web pages, feeds and services so I know what I can use/embed</li>
<li>More smart people thinking about web services around microformats.</li>
</ul>



</div>

<div class="slide">

<h1>The Future is Bright</h1>


<ul>
<li>The <strong>Semantic Web</strong> is taking forever, and depends on people creating new ontologies, and users fundamentally changing how they use the web.</li>
<li>Microformats can be the semantic web <em>today</em>, with existing user behavior and using existing browsers and tools.</li>
<li>There are now millions of web pages with microformats embedded in them.</li>
<li>The services around them are getting better and better as more people start paying attention.</li>
<li>What can you do with them?</li>
</ul>



</div>

<div class="slide">

<h1>Return on Investment</h1>


<ul>
<li>Because someone asked that I cover it... if you use microformats, you'll get:
<ul>
<li>more <span class="caps">SEO </span>juice in the future</li>
<li>cool Web 2.0 buzz from the geek-o-sphere</li>
<li>automatic functionality as more tools become available</li>
<li>instant web services because your page becomes your <span class="caps">API</span></li>
</ul>
</li>
</ul>



</div>

<div class="slide">

<h1>Questions?</h1>


<ul>
<li>One, two, three...  four?</li>
<li>More?   Is it still too early for questions?</li>
</ul>



</div>]]>
        
    </content>
</entry>

</feed> 


