<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Kris Jordan</title>
	
	<link>http://www.krisjordan.com</link>
	<description>on Software, Frameworks, &amp; Stuff</description>
	<pubDate>Wed, 17 Dec 2008 03:37:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/KrisJordan" type="application/rss+xml" /><item>
		<title>Recess! Framework Screencast #1</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/487243596/</link>
		<comments>http://www.krisjordan.com/2008/12/16/recess-framework-screencast-1/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 03:34:44 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Recess Framework]]></category>

		<category><![CDATA[Recess]]></category>

		<category><![CDATA[screencast]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=574</guid>
		<description><![CDATA[I&#8217;m excited to get the first Recess! screencast out on the interwebs over at RecessFramework.org. Special thanks to Joel Sutherland and the Raleigh Web Design firm New Media Campaigns for helping me launch the Recess site in record time!
Without further adieu&#8230; Routing in Recess!
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m excited to get the first Recess! screencast out on the interwebs over at <a href="http://www.recessframework.org" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.org');">RecessFramework.org</a>. Special thanks to <a href="http://www.twitter.com/JoelSutherland" onclick="javascript:pageTracker._trackPageview ('/outbound/www.twitter.com');">Joel Sutherland</a> and the <a href="http://www.newmediacampaigns.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.newmediacampaigns.com');">Raleigh Web Design</a> firm <a href="http://www.newmediacampaigns.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.newmediacampaigns.com');">New Media Campaigns</a> for helping me launch the Recess site in record time!</p>
<p>Without further adieu&#8230; <a href="http://www.recessframework.org/page/routing-in-recess-screencast" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.org');">Routing in Recess</a>!</p>
<div id="attachment_575" class="wp-caption alignnone" style="width: 410px"><a href="http://www.recessframework.org/page/routing-in-recess-screencast" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.org');"><img class="size-full wp-image-575" title="Recess! Framework" src="http://www.krisjordan.com/wp-content/uploads/2008/12/recesshomepage.gif" alt="Recess! PHP Framework" width="400" height="249" /></a><p class="wp-caption-text">Recess! PHP Framework</p></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=gFFcO"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=gFFcO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=nqSvo"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=nqSvo" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=z9E4o"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=z9E4o" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=7TVRo"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=7TVRo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/12/16/recess-framework-screencast-1/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/12/16/recess-framework-screencast-1/</feedburner:origLink></item>
		<item>
		<title>Towards RESTful PHP - 5 Basic Tips</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/472143764/</link>
		<comments>http://www.krisjordan.com/2008/12/02/towards-restful-php-5-basic-tips/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 06:33:57 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=482</guid>
		<description><![CDATA[What is REST?
REST is an architectural style, or set of conventions, for web applications and services that centers itself around resource manipulation and the HTTP spec. Web apps have traditionally ignored the HTTP spec and moved forward using a subset of the protocol: GET and POST,  200 OKs and 404 NOT FOUNDs.  As [...]]]></description>
			<content:encoded><![CDATA[<p><strong>What is REST?</strong><br />
REST is an architectural style, or set of conventions, for web applications and services that centers itself around <em>resource manipulation</em> and the HTTP spec. Web apps have traditionally ignored the HTTP spec and moved forward using a subset of the protocol: GET and POST,  200 OKs and 404 NOT FOUNDs.  As we entered a programmable web of applications with APIs the decision to ignore HTTP gave us problems we&#8217;re still dealing with today. We have an internet full of applications with different interfaces (GET /user/1/delete vs. POST /user/delete {id=1}). With REST we can say <em>/user/1 is a resource</em> and use the HTTP DELETE verb to delete it. For more detail on REST check out <a href="http://en.wikipedia.org/wiki/REST" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">wikipedia</a> and &#8220;<a href="http://www.megginson.com/blogs/quoderat/2007/02/15/rest-the-quick-pitch/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.megginson.com');">quick pitch</a>&#8220;.</p>
<h2>Tip #1: Using PUT and DELETE methods</h2>
<p>In PHP you can determine which HTTP method was used with: $_SERVER['REQUEST_METHOD']; From web browsers this will be either GET or POST. For RESTful clients applications need to support PUT and DELETE (and ideally OPTIONS, etc.) as well. Unfortunately PHP doesn&#8217;t have $_PUT and $_DELETE variables like it does $_POST and $_GET. Here&#8217;s how to access the content of a PUT request in PHP:</p>
<pre class="php" name="code">$_PUT  = array();
if($_SERVER['REQUEST_METHOD'] == 'PUT') {
    $putdata = file_get_contents('php://input');
    $exploded = explode('&amp;', $putdata); 

    foreach($exploded as $pair) {
        $item = explode('=', $pair);
        if(count($item) == 2) {
            $_PUT[urldecode($item[0])] = urldecode($item[1]);
        }
    }
}</pre>
<h2>Tip #2: Send Custom HTTP/1.1 Headers</h2>
<p>PHP&#8217;s <a href="http://www.php.net/header" onclick="javascript:pageTracker._trackPageview ('/outbound/www.php.net');">header</a> function allows custom HTTP headers to be sent to the client. The HTTP/1.x header contains the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" onclick="javascript:pageTracker._trackPageview ('/outbound/www.w3.org');">response code</a> from the server. PHP will, by default, send back a 200 OK status code which suggests that the request has succeeded even if it has die()&#8217;ed or a new resource has been created. There are two ways to change the status code of your response:</p>
<pre class="php" name="code">header('HTTP/1.1 404 Not Found');
/* OR */
header('Location: http://www.foo.com/bar', true, 201); // 201 CREATED</pre>
<p>The first line is a generic way of setting the response status code. If your response requires another header, like the Location header to the resource of a &#8216;201 Created&#8217; or &#8216;301 Moved Permanently&#8217;, placing the integer status code in the third parameter of header is a shortcut. It is the logical equivalent of the following example, which is easier to read at the cost of being an extra line of code.</p>
<pre class="php" name="code">header('HTTP/1.1 201 Created');
header('Location: http://www.foo.com/bar');</pre>
<h2>Tip #3: Send Meaningful HTTP Headers</h2>
<p>Policy for deciding when it is appropriate to send each HTTP status code is a full post on its own and the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" onclick="javascript:pageTracker._trackPageview ('/outbound/www.w3.org');">HTTP spec</a> leaves room for ambiguity. There are <a href="http://www.xml.com/pub/a/2004/12/01/restful-web.html" onclick="javascript:pageTracker._trackPageview ('/outbound/www.xml.com');">many</a> <a href="http://blog.brianguthrie.com/articles/2008/08/22/rails-and-rest-a-reference-to-commonly-used-http-status-codes-and-their-use-in-rest-apis" onclick="javascript:pageTracker._trackPageview ('/outbound/blog.brianguthrie.com');">other</a> resources on the net which provide insights so I&#8217;ll just touch on a few.</p>
<p><strong>201 Created</strong> is used when a new resource has been created. It should include a Location header which specifies the URL for the resource (i.e. books/1). The inclusion of a location header does not automatically forward the client to the resource, rather, 201 Created responses should include an entity (message body) which lists the location of the resource.</p>
<p><strong>202 Accepted</strong> allows the server to tell the client &#8220;yeah, we heard your order, we&#8217;ll get to it soon.&#8221; Think the <a href="http://www.twitter.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.twitter.com');">Twitter API</a> on a busy day. Where 201 Created implies the resource has been created before a response returns, 202 Accepted implies the request is ok and in a queue somewhere.</p>
<p><strong>304 Not Modified</strong> in conjunction with caching and conditional GET requests (requests with If-Modified-Since / If-None-Match headers) allows web applications to say &#8220;the content hasn&#8217;t changed, continue using the cached version&#8221; without having to re-render and send the cached content down the pipe.</p>
<p><strong>401 Unauthorized</strong> should be used when attempting to access a resource which requires authentication credentials the request does not carry. This is used in conjunction with www-authentication.</p>
<p><strong>500 Internal Server Error</strong> is better than OK when your PHP script dies or reaches an exception.</p>
<p>In the <a href="http://www.recessframework.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">Recess! Framework</a> I use this <a href="http://www.krisjordan.com/php-class-for-http-response-status-codes/">StatusCodes class</a> to provide named constants for all HTTP/1.1 status codes. Example usage:</p>
<pre class="php" name="code">header(StatusCodes::httpHeaderFor(StatusCodes::HTTP_NOT_FOUND));</pre>
<h2>Tip #4: Don&#8217;t Use $_SESSION</h2>
<p>A truly RESTful PHP application should be entirely stateless- <strong>all requests should contain enough information to be handled without additional server side state</strong>. In practice this means storing authentication information in a cookie with a timestamp and a checksum. Additional data can also be stored in a cookie. In the event you need more than a cookie&#8217;s worth of data fall back to storing it in a central database with the authentication still in the cookie. <a href="http://www.krisjordan.com/2008/09/16/cal-henderson-scalable-web-architectures-common-patterns-and-approaches/">This is how Flickr approaches statelessness.</a></p>
<h2>Tip #5: Test with cURL or rest-client</h2>
<p><a href="http://www.krisjordan.com/wp-content/uploads/2008/12/rest-client.png"><img class="alignright size-thumbnail wp-image-494" title="rest-client" src="http://www.krisjordan.com/wp-content/uploads/2008/12/rest-client-150x150.png" alt="" width="150" height="150" /></a><a href="http://curl.haxx.se/" onclick="javascript:pageTracker._trackPageview ('/outbound/curl.haxx.se');">cURL</a> makes it easy to execute any HTTP METHOD on a resource URL. You can pass request parameters and headers as well as inspect response headers and data. The command line tool &#8216;curl&#8217; is standard on many *nix distros. Windows users should check out <a href="http://www.mingw.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.mingw.org');">MinGW/MSYS</a> which supports cURL. Even <a href="http://us2.php.net/curl" onclick="javascript:pageTracker._trackPageview ('/outbound/us2.php.net');">PHP has cURL functions</a> which are enabled on most hosts (<a href="http://us2.php.net/manual/en/curl.setup.php" onclick="javascript:pageTracker._trackPageview ('/outbound/us2.php.net');">php/curl install page</a>).</p>
<p><strong>cURL Example Usage &amp; Common Parameters:</strong></p>
<pre># curl -X PUT http://www.foo.com/bar/1 -d "some=var" -d "other=var2" -H "Accept: text/json" -I</pre>
<p><strong>-X [METHOD]</strong> Specify the HTTP method.<br />
<strong>-d &#8220;name=value&#8221;</strong> Set a POST/PUT field name and value.<br />
<strong>-H [HEADER]</strong> Set a header.<br />
<strong>-I</strong> Only display response&#8217;s headers.</p>
<p>Alternatively, a free GUI to test REST interfaces is <a href="http://code.google.com/p/rest-client/" onclick="javascript:pageTracker._trackPageview ('/outbound/code.google.com');">Java/Swing based <strong>rest-client</strong></a>. rest-client is scriptable and has support for JSON/XML.</p>
<h2>Tip #6 - Use a RESTful PHP Framework</h2>
<p>Frankly, developers shouldn&#8217;t have to worry about many of these low-level details of REST when writing PHP apps. REST is based on conventions and conventions, by nature, involve a lot of boilerplate. This is right up a framework&#8217;s alley (as Rails has shown). What options exist for PHP? CodeIgniter&#8217;s routing completely ignores the HTTP METHOD so there is <a href="http://blog.medryx.org/2008/10/03/codeigniter-rest/" onclick="javascript:pageTracker._trackPageview ('/outbound/blog.medryx.org');">serious hacking</a> that needs to be done. Cake <a href="http://book.cakephp.org/view/478/Custom-REST-Routing" onclick="javascript:pageTracker._trackPageview ('/outbound/book.cakephp.org');">has</a> REST support but wasn&#8217;t designed to make specifying useful response status codes a part of the framework. <a href="http://konstrukt.dk/" onclick="javascript:pageTracker._trackPageview ('/outbound/konstrukt.dk');">Konstruct</a> appears to have a very well thought out architecture for a controllers framework built around HTTP and REST. Unfortunately it is not easily approached and lacking (intentionally) many components, like an ORM layer, developers have come to expect in a modern web framework.</p>
<p>(Disclaimer: <em>Shameless Plug!</em>) <strong>The lack of a solid, RESTful PHP framework was one of my primary motivations for creating the <a href="http://www.recessframework.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">Recess! Framework</a></strong>. Recess is a full-stack, open source (MIT), <a href="http://www.recessframework.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">RESTful PHP framework</a>. If you&#8217;re interested in writing RESTful PHP applications check it out and sign-up to be notified of its upcoming release.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=fBRFO"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=fBRFO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=sIdCo"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=sIdCo" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=NqLSo"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=NqLSo" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=Zb4yo"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=Zb4yo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/12/02/towards-restful-php-5-basic-tips/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/12/02/towards-restful-php-5-basic-tips/</feedburner:origLink></item>
		<item>
		<title>How Recess Solves Common PHP/MySQL Issues</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/468734726/</link>
		<comments>http://www.krisjordan.com/2008/11/28/how-recess-solves-common-phpmysql-issues/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 21:25:25 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Recess Framework]]></category>

		<category><![CDATA[data access]]></category>

		<category><![CDATA[layering]]></category>

		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=474</guid>
		<description><![CDATA[Justin Carmony wrote a great article titled &#8216;PHP Design - Biggest Database Oversights&#8216;. The article points out 5 naive PHP/MySQL design decisions that will come back to haunt projects if they&#8217;ve been made. As I&#8217;m getting closer to the public preview release of the Recess! Framework this article discusses how Recess! addresses some of the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.justincarmony.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.justincarmony.com');">Justin Carmony</a> wrote a great article titled &#8216;<a href="http://www.justincarmony.com/blog/2008/10/25/php-design-biggest-database-oversights/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.justincarmony.com');">PHP Design - Biggest Database Oversights</a>&#8216;. The article points out 5 naive PHP/MySQL design decisions that will come back to haunt projects if they&#8217;ve been made. As I&#8217;m getting closer to the public preview release of the <a href="http://www.recessframework.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">Recess! Framework</a> this article discusses how Recess! addresses some of the most common oversights in database development.</p>
<p><strong>Re: Oversight #1 - No Data Access Layer</strong></p>
<p>Quality software design and engineering is all about abstracting away details and finding the proper layers of functionality. As Justin points out, if there is no layer of abstraction which wraps data access code then low-level data access code will appear everywhere. PHP projects which interleave data connections and queries throughout their code are difficult to maintain. </p>
<p>The database stack in Recess! has four major components: 1) SQL statement builder, 2) Data Sources, 3) Data Sets, 4) Object-Relational Mapped Models. The notion of a &#8216;data access layer&#8217; is taken care of by Data Sources. Data sources wrap properly around PDO and introduce new methods beyond PDO&#8217;s, for example: getTables and getColumns($table). The implementation of these methods is specific to the RDBMS so Recess! also has the notion of a vendor specific driver called a DataSourceProvider. Currently Sqlite and MySql are supported.</p>
<p><strong>Re: Oversight #2 - Design for Only One Database Connection</strong></p>
<p>Small, greenfield projects often start out with a single database. This leads to naive data access layers which only support connections to a single database. Recess! supports multiple, named Data Sources. Instead of using a singleton pattern it uses a registry to store the Data Sources by name.</p>
<p>Having named Data Sources in an application gets really powerful at higher layers of abstraction, such as at the ORM layer, where we can mark-up a model with a single annotation to define which Data Source the model is persisted in.</p>
<p><strong>Re: Oversight #3 - No Developer Logging</strong></p>
<p>This isn&#8217;t as fully fleshed out yet as I&#8217;d like but the plans and hooks are in place to be able to log queries, their stack traces, as well as their EXPLAIN&#8217;ed strategies for execution in the RDBMS.  In Recess! there is a distinct difference between Development mode and Production mode. Sql logging will be a toggle option on by default in development and off by default in production.</p>
<p><strong>Re: Oversight #4 - Queries Written in Procedural Processes</strong></p>
<p>My dislike of queries being written in procedural code may run even deeper than Justin&#8217;s! Recess! abdicates SQL string manipulation to a low-level SqlBuilder class. An instance of SqlBuilder allows SQL query strings to be built incrementally using chained method calls. Let&#8217;s take a look at some examples:</p>
<pre name="code" class="php">
$sqlBuilder = new SqlBuilder();
$sql = $sqlBuilder
            -&gt;from('people')
            -&gt;like('name','Kris')
            -&gt;orderBy('age')
            ->toSql();
// $sql is now:
// 'SELECT people.*
//    WHERE people.name = :people_name
//    ORDER BY people.age
$args = $sqlBuilder-&gt;getPdoArguments();
// $args is now array( 'people_name' =&gt; 'Kris' );

// Let's add another criterion
$sql = $sqlBuilder->equal('home_city', 'Charlotte')->toSql();
// $sql is now:
//  SELECT people.*
//      WHERE people.name LIKE :people_name
//      AND people.home_city = :people_home_city
//      ORDER BY people.age

$args = $sqlBuilder-&gt;getPdoArguments();
// $args is now array(
//                   'people_name' =&gt; 'Kris',
//                   'people_home_city' =&gt; 'Charlotte' );
</pre>
<p>SqlBuilder can do more complex things like joins, as well as inserts, updates, and deletes. Recess! users, though, will likely never use SqlBuilder because it&#8217;s still too low level of an abstraction. Internally, however, having the ability to incrementally construct query strings has made the framework code quite pretty.</p>
<p>Here&#8217;s code at the level of abstraction Recess! developers can expect to write:</p>
<pre name="code" class="php">
class Person extends Model { }
$person = new Person();
$person-&gt;name = 'Kris';
$person-&gt;homeCity = 'Charlotte';
$people = $person-&gt;find()-&gt;orderBy('name');
foreach($people as $person) {
   echo $person-&gt;name, ' ', $person-&gt;age, '&lt;br /&gt;';
}
</pre>
<p>This example just scrapes the surface of Recess! object-relational mapping. Relationships, CRUDS, cascading deletes, etc. are all handled as well. In a future post I&#8217;ll step through the data access stack&#8217;s capabilities in more detail. Needless to say, in Recess! queries won&#8217;t be mixed with procedural code!</p>
<p><strong>Re: Oversight #5 - No Separation of Reads and Writes</strong></p>
<p>Once projects outgrow a single server RDBMS the next step is often to do a Master/Slave setup in MySQL. In a Master/Slave setup expensive and less frequent writes are channeled to the Master server while reads are channeled to the Slave server.</p>
<p>In Recess!, by using named data sources as described in #2, we can handle Data Sources on a per model basis. A natural extension of this is handling reads and writes independently on a per model basis. The pseudo-code below shows how this may look on a model:</p>
<pre name="code" class="php">
/**
 * !Source master, For: Writes
 * !Source (slave1, slave2, slave3), For: Reads
 * !HasMany books
 */
class Person extends Model {}

/**
 * !Source master
 * !BelongsTo person
 */
class Books extends Model {}
</pre>
<p>In a future post I&#8217;ll describe the Recess! annotations system which will explain the constructs you&#8217;re seeing in the DocComments. Recess! annotations give us a way of providing static metadata about a class and are built-in to the framework&#8217;s core. Recess! annotations should be familiar to Java and .Net programmers who have used annotations.</p>
<p><strong>Conclusion</strong></p>
<p>So that&#8217;s a quick look at how Recess! handles Justin Carmony&#8217;s commonly made MySQL/PHP mistakes. These issues are abstracted away in the internals of Recess. If you&#8217;re a PHP developer check out <a href="http://www.recessframework.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">RecessFramework.com</a> and sign-up to be notified when it is publicly released &#8220;very soon now&#8221;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=RhQcN"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=RhQcN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=R6r4n"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=R6r4n" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=Kofpn"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=Kofpn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=iU3Jn"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=iU3Jn" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/11/28/how-recess-solves-common-phpmysql-issues/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/11/28/how-recess-solves-common-phpmysql-issues/</feedburner:origLink></item>
		<item>
		<title>Dynamic Properties in PHP and StdClass</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/466984556/</link>
		<comments>http://www.krisjordan.com/2008/11/27/dynamic-properties-in-php-with-stdclass/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 05:49:15 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[dynamic properties]]></category>

		<category><![CDATA[stdclass]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=451</guid>
		<description><![CDATA[Languages like JavaScript and Python allow object instances to have dynamic properties. As it turns out, PHP does too. Looking at the official PHP documentation on objects and classes you might be lead to believe dynamic instance properties require custom __get and __set magic methods. They don&#8217;t.
Simple, Built-in Dynamic Properties
Check out the following code listing:

class [...]]]></description>
			<content:encoded><![CDATA[<p>Languages like JavaScript and Python allow object instances to have dynamic properties. As it turns out, PHP does too. Looking at the official PHP documentation on objects and classes you might be lead to believe dynamic instance properties require custom __get and __set magic methods. They don&#8217;t.</p>
<h2>Simple, Built-in Dynamic Properties</h2>
<p>Check out the following code listing:</p>
<pre class="php" name="code">
class DynamicProperties { }
$object = new DynamicProperties;

print isset($object-&gt;foo) ? 't' : 'f'; // f

// Set Dynamic Properties foo and fooz
$object-&gt;foo = 'bar';
$object-&gt;fooz = 'baz';

// Isset and Unset work
isset($object-&gt;foo); // true
unset($object-&gt;foo); 

// Iterate through Properties and Values
foreach($object as $property =&gt; $value)  {
     print($property . ' = ' . $value . '&lt;br /&gt;');
}
// Prints:
//   fooz = baz</pre>
<p>
Using the built-in dynamic instance properties is an order of magnitude faster (30x, by my profiling) than using magic __get and __set methods. Built in dynamic property accesses happen without invoking a method call back to PHP script.</p>
<p>So when does it make sense to use __get and __set? If you need more complex behavior, like calculated properties, you must use __get and __set. Also, as an astute comment points out, if you would prefer <em>not</em> to have dynamic properties on a class you can throw errors from __get and __set.<br />
<h2>StdClass: Anonymous Objects</h2>
<p>Sometimes all that is necessary is a property bag to throw key value pairs into. One way is to use array, but this requires quoting all keys. Another way is to use dynamic properties on an instance of StdClass. StdClass is a sparsely documented class in PHP which has no predefined members.</p>
<pre name="code" class="php">
$object = new StdClass;
$object->foo = 'bar';
json_encode($object);
</pre>
<p>Next I&#8217;ll touch on the SPL&#8217;s Countable and ArrayAccess as a means of being able to accomplish the following in PHP:</p>
<pre class="php" name="code">
class MyClass implements Countable, ArrayAccess { ... }

$myObject = new MyClass();
// Using array access notation
$myObject[0] = 'hello';
$myObject[1] = 'world';
$myObject['foo'] = 'bar';
</pre>
<p><em>Thanks to the folks pointing out that you don&#8217;t need to extend from StdClass in order to have dynamic properties!</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=uYwHN"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=uYwHN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=k4DYn"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=k4DYn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=bCoAn"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=bCoAn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=8f9kn"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=8f9kn" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/11/27/dynamic-properties-in-php-with-stdclass/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/11/27/dynamic-properties-in-php-with-stdclass/</feedburner:origLink></item>
		<item>
		<title>How does the quality of political candidates’ websites correlate with campaign success?</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/436248339/</link>
		<comments>http://www.krisjordan.com/2008/10/29/how-does-the-quality-of-political-candidates%e2%80%99-websites-correlate-with-campaign-success/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 21:11:41 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Web 2.0]]></category>

		<category><![CDATA[political campaigns]]></category>

		<category><![CDATA[Recess Framework]]></category>

		<category><![CDATA[web design]]></category>

		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=445</guid>
		<description><![CDATA[VoteTheSite.com, a micro-site my good friends at New Media Campaigns have built, is conducting an on-line experiment to explore just that question. VoteTheSite.com pits congressional candidates’ websites against each other race-by-race. Races can be viewed randomly or by state. I was surprised by the range of quality congressional websites have. From top notch sites in [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.votethesite.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');">VoteTheSite.com</a>, a micro-site my good friends at <a href="http://www.newmediacampaigns.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.newmediacampaigns.com');">New Media Campaigns</a> have built, is conducting an on-line experiment to explore just that question. <a href="http://www.votethesite.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');">VoteTheSite.com</a> pits congressional candidates’ websites against each other race-by-race. Races can be viewed <a href="http://www.votethesite.com/races/chance" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');">randomly</a> or by <a href="http://www.votethesite.com/races" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');">state</a>. I was surprised by the range of quality congressional websites have. From top notch sites in <a href="http://www.votethesite.com/races/show/168" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');">Texas&#8217; 5th</a> to the really poor websites in <a href="http://www.votethesite.com/races/show/378" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');">Georgia&#8217;s 1st</a> they run the quality gamut.</p>
<div id="attachment_446" class="wp-caption alignright" style="width: 310px"><a href="http://www.votethesite.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');"><img class="size-full wp-image-446" title="VoteTheSite.com" src="http://www.krisjordan.com/wp-content/uploads/2008/10/votethesite.jpg" alt="VoteTheSite.com - Vote on Political Websites" width="300" height="213" /></a><p class="wp-caption-text">VoteTheSite.com - Vote on Political Websites</p></div>
<p>After the elections have taken place the votes on websites will be tallied up and compared to election results. Should be really interesting to see what the outcome is and how strong website quality correlates with campaign success.</p>
<p>Within the first 24 hours over 5,000 votes have been cast. Congrats to the <a href="http://www.newmediacampaigns.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.newmediacampaigns.com');">New Media</a> team for getting this out the door so quickly (with a little help from the Mechanical Turk)! <a href="http://www.votethesite.com/races" onclick="javascript:pageTracker._trackPageview ('/outbound/www.votethesite.com');">Go vote on the websites in your state</a>…</p>
<p>VoteTheSite.com was written (in under 2 days!) on an early version of the PHP Framework, the <a href="http://www.recessframework.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">Recess! Framework</a>, I’ve had my head down plugging away on the past couple of weeks. Expect blog activity to pick up as the <a href="http://www.recessframework.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">Recess! Framework</a> moves closer to a public release. Sign up to be notified of the release at <a href="http://www.recessframework.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.recessframework.com');">RecessFramework.com</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=y0TjM"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=y0TjM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=nt2om"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=nt2om" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=c0h9m"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=c0h9m" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=RFEgm"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=RFEgm" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/10/29/how-does-the-quality-of-political-candidates%e2%80%99-websites-correlate-with-campaign-success/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/10/29/how-does-the-quality-of-political-candidates%e2%80%99-websites-correlate-with-campaign-success/</feedburner:origLink></item>
		<item>
		<title>Hello Again, Old Friend: Revisiting a PHP Framework</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/414994018/</link>
		<comments>http://www.krisjordan.com/2008/10/08/hello-again-old-friend-revisiting-a-php-framework/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 17:26:45 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[framework]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[redesign]]></category>

		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=435</guid>
		<description><![CDATA[I&#8217;m in the process of replumbing the lightweight PHP application framework I wrote with Joel Sutherland over three years ago. Its original design was inspired by the Java Struts Framework. It enabled us to rapidly develop the first version of New Media Campaigns&#8216; website management software. Two summers ago we did a major redesign inspired [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m in the process of replumbing the lightweight PHP application framework I wrote with <a href="http://www.jsuth.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.jsuth.com');">Joel Sutherland</a> over three years ago. Its original design was inspired by the <a href="http://struts.apache.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/struts.apache.org');">Java Struts Framework</a>. It enabled us to rapidly develop the first version of <a href="http://www.newmediacampaigns.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.newmediacampaigns.com');">New Media Campaigns</a>&#8216; <a href="http://www.newmediacampaigns.com/page/content-management" onclick="javascript:pageTracker._trackPageview ('/outbound/www.newmediacampaigns.com');">website management software</a>. Two summers ago we did a major redesign inspired by the <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">DRY</a> nature of <a href="http://www.rubyonrails.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.rubyonrails.org');">Ruby on Rails</a>. Since then Joel and <a href="http://www.joshlockhart.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.joshlockhart.com');">Josh Lockhart</a> have been tweaking the framework by addressing the issues which crop up after their intensive use while rewriting New Media&#8217;s system. </p>
<p>Energized by <a href="http://www.krisjordan.com/live-blogging-from-web-20-expo-new-york/">what I saw at the Web 2.0 Expo</a> in NY I&#8217;m back at it again. My three big goals with this take:</p>
<p>1) <strong>Get it in the wild: Open source with an <a href="http://en.wikipedia.org/wiki/MIT_License" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">MIT license</a></strong>. This is going to happen before the New Year. Hopefully sooner. We intended to do this with V2. It actually <em>was </em>publicly available in 2006 for a brief period of time but without any real plan for evangelism. I&#8217;ve been using open source software for a long time and its high time to give back.</p>
<p>2) <strong>Play nice in the new RESTful world.</strong> If I had to bet on a paradigm for interacting with web APIs I would bet the farm on <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">REST</a>. It is perfectly aligned with the grain of the web. Most existing frameworks written without an emphasis on REST have made awkward face lifts to adapt. When revisiting our own framework and considering how to make it properly RESTful this would have held true if not for&#8230;</p>
<p>3) <strong>Signficantly </strong><strong>Improving the Architecture.</strong> Revisiting old code is a joy. It&#8217;s easy to forget how clever you were and how much work you did. Yet it&#8217;s very disturbing to realize how hacked some of the fundamental design was. As mentioned, the current version was influenced significantly by what Rails plumbing looked like circa-2006. Since then two really important things have changed: 1) the emphasis on tying closer to HTTP protocol, and 2) two additional years of experience with systems design under the belt.</p>
<p>So, <em>here&#8217;s to take 3</em>! Bits available for download in upcoming months. E-mail me at krisjordan/gmail if interested in being copied on barely functional, pre-release bits in the mean time. Otherwise, <a href="http://feeds.feedburner.com/KrisJordan/" onclick="javascript:pageTracker._trackPageview ('/outbound/feeds.feedburner.com');">stay tuned</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=iBCyM"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=iBCyM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=kg1jm"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=kg1jm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=aeXQm"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=aeXQm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=6Ydkm"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=6Ydkm" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/10/08/hello-again-old-friend-revisiting-a-php-framework/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/10/08/hello-again-old-friend-revisiting-a-php-framework/</feedburner:origLink></item>
		<item>
		<title>Brainstorming Ideas with Sharpies &amp; Sticky Notes</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/408734724/</link>
		<comments>http://www.krisjordan.com/2008/10/01/brainstorming-ideas-with-sharpies-sticky-notes/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 00:17:48 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Communication]]></category>

		<category><![CDATA[powerpoint]]></category>

		<category><![CDATA[presentations]]></category>

		<category><![CDATA[sharpies]]></category>

		<category><![CDATA[sticky notes]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=425</guid>
		<description><![CDATA[After getting a comment from Ric Bretschneider of Microsoft&#8217;s PowerPoint team I came across the book slide:ology on his site Presentations Roundtable.  I picked up slide:ology from a bookstore on my way out to New York and it is a great piece of work (and art!) authored by Nancy Duarte of Duarte Design. Duarte Design [...]]]></description>
			<content:encoded><![CDATA[<p>After getting a <a href="http://www.krisjordan.com/2008/09/07/10-minute-mock-prototyping-tips-for-powerpoint/">comment</a> from <a href="http://talk.presentationsroundtable.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/talk.presentationsroundtable.com');">Ric Bretschneider</a> of Microsoft&#8217;s <a href="http://blogs.msdn.com/powerpoint/archive/2008/09/14/one-more-special-intern.aspx" onclick="javascript:pageTracker._trackPageview ('/outbound/blogs.msdn.com');">PowerPoint team</a> I came across the book <a href="http://www.amazon.com/gp/product/0596522347?ie=UTF8&amp;tag=krijoronsofst-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0596522347" onclick="javascript:pageTracker._trackPageview ('/outbound/www.amazon.com');">slide:ology</a> on his site <a href="http://talk.presentationsroundtable.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/talk.presentationsroundtable.com');">Presentations Roundtable</a>.  I picked up <a href="http://www.amazon.com/gp/product/0596522347?ie=UTF8&amp;tag=krijoronsofst-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0596522347" onclick="javascript:pageTracker._trackPageview ('/outbound/www.amazon.com');">slide:ology</a> from a bookstore on my way out to New York and it is a great piece of work (and art!) authored by <a href="http://slideology.com/contributors/" onclick="javascript:pageTracker._trackPageview ('/outbound/slideology.com');">Nancy Duarte</a> of <a href="http://www.duarte.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.duarte.com');">Duarte Design</a>. Duarte Design is the firm behind Al Gore&#8217;s &#8220;An Inconvenient Truth&#8221; <a href="http://www.duarte.com/#1.0.0" onclick="javascript:pageTracker._trackPageview ('/outbound/www.duarte.com');">Keynote slide deck</a>. They are also the designers of <a href="http://www.ted.com/index.php/talks/john_doerr_sees_salvation_and_profit_in_greentech.html" onclick="javascript:pageTracker._trackPageview ('/outbound/www.ted.com');">John Doerr&#8217;s TED talk</a>&#8217;s deck. Duarte Design is truly first class.</p>
<div id="attachment_426" class="wp-caption alignright" style="width: 115px"><a href="http://www.krisjordan.com/wp-content/uploads/2008/10/stickynotesexcerpt.jpg"><img class="size-thumbnail wp-image-426" title="Innovating with Sticky Notes" src="http://www.krisjordan.com/wp-content/uploads/2008/10/stickynotesexcerpt-150x150.jpg" alt="Innovating with Sticky Notes" width="105" height="105" /></a><p class="wp-caption-text">Innovating with Sticky Notes (Excerpt)</p></div>
<p>A technique that caught my eye was &#8220;Innovating with Sticky Notes&#8221; (p28). The premise is to use a sharpie and generate ideas on sticky notes. One idea per sticky note (the bonus of using a sharpie is that is about all you can fit). Just unleash as many ideas as possible and get them up on the wall. Structure and flow can then be orchestrated by rearranging the notes.</p>
<div id="attachment_427" class="wp-caption alignleft" style="width: 115px"><a href="http://www.krisjordan.com/wp-content/uploads/2008/10/stickynotes.jpg"><img class="size-thumbnail wp-image-427" title="stickynotes" src="http://www.krisjordan.com/wp-content/uploads/2008/10/stickynotes-150x150.jpg" alt="Idea Notes for Chord Talk" width="105" height="105" /></a><p class="wp-caption-text">Idea Notes for Chord Talk</p></div>
<p>I decided to give the sticky note method a shot with a talk I&#8217;m giving on the <a href="http://en.wikipedia.org/wiki/Chord_project" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">Chord Protocol</a> in a <a href="http://www.cs.unc.edu/~dewan/290/f08/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.cs.unc.edu');">graduate class</a> I&#8217;m auditing at UNC. I must admit I really liked the technique after trying it out. It&#8217;s quick and dirty and prevented me from getting lost in details and aesthetics. My focus remained on the big ideas and overall message I wanted to &#8216;teach&#8217;. I would even go so far as to say that it&#8217;s <em>fun</em>. Once I&#8217;m done with the talk I&#8217;ll narrate a slideshow and throw it up on here so you can see the end result.</p>
<p>This sharpie + sticky notes method is only a detail in the grand thesis of Nancy Duarte&#8217;s <a href="http://slideology.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/slideology.com');">slide:ology</a>. Spend some quality time with <a href="http://www.amazon.com/gp/product/0596522347?ie=UTF8&amp;amp;tag=krijoronsofst-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596522347" onclick="javascript:pageTracker._trackPageview ('/outbound/www.amazon.com');">this book</a> before you prepare your next presentation, you won&#8217;t regret it.</p>
<p><em>Aside: if you&#8217;re going to use this technique on a wall at a coffee shop be prepared for inquisitive looks! <img src='http://www.krisjordan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=6KrqM"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=6KrqM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=q6KUm"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=q6KUm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=3H4nm"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=3H4nm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=85tNm"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=85tNm" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/10/01/brainstorming-ideas-with-sharpies-sticky-notes/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/10/01/brainstorming-ideas-with-sharpies-sticky-notes/</feedburner:origLink></item>
		<item>
		<title>10 High Order Bits from the Web 2.0 Expo in NY</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/403219750/</link>
		<comments>http://www.krisjordan.com/2008/09/25/10-high-order-bits-from-the-web-20-expo-in-ny/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 22:41:09 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Web 2.0 Expo NY]]></category>

		<category><![CDATA[adelson]]></category>

		<category><![CDATA[cal]]></category>

		<category><![CDATA[digg]]></category>

		<category><![CDATA[filter failure]]></category>

		<category><![CDATA[flickr]]></category>

		<category><![CDATA[fried]]></category>

		<category><![CDATA[gps]]></category>

		<category><![CDATA[huffington]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[REST]]></category>

		<category><![CDATA[vaynerchuk]]></category>

		<category><![CDATA[web2expoNY]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=373</guid>
		<description><![CDATA[
10. Your Web App: Give it a REST
David Heinemier Hansson&#8217;s session about making Ruby on Rails RESTful cast this battle as an epic one between the REST Rebels and the Imperial WS-* Death Star. It&#8217;s going to be a tough fight but you know who&#8217;s gonna win.
REST (Representational State Transfer) is the elegant architecture and [...]]]></description>
			<content:encoded><![CDATA[<h3><a href="http://www.krisjordan.com/2008/09/17/david-heinemeier-hansson-go-rest-with-rails/"><img class="alignright size-thumbnail wp-image-223" title="WS - Deathstar" src="http://www.krisjordan.com/wp-content/uploads/2008/09/ws-deathstar-150x150.jpg" alt="" width="105" height="105" /></a></h3>
<h2>10. <a href="http://www.krisjordan.com/2008/09/17/david-heinemeier-hansson-go-rest-with-rails/">Your Web App: Give it a REST</a></h2>
<p><a href="http://www.krisjordan.com/2008/09/17/david-heinemeier-hansson-go-rest-with-rails/" target="_blank">David Heinemier Hansson&#8217;s session</a> about making <a href="http://www.rubyonrails.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.rubyonrails.org');">Ruby on Rails</a> RESTful cast this battle as an epic one between the REST Rebels and the Imperial <strong>WS-*</strong> Death Star. It&#8217;s going to be a tough fight but you know who&#8217;s gonna win.</p>
<p>REST (<a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">Representational State Transfer</a>) is the elegant architecture and set of conventions first presented in <a href="http://en.wikipedia.org/wiki/Roy_Fielding" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">Roy Fielding</a>&#8217;s PhD dissertation &#8220;<a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" onclick="javascript:pageTracker._trackPageview ('/outbound/www.ics.uci.edu');">Architectural Styles and the Design of Network-based Software Architectures</a>&#8220;. It is well aligned with the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.w3.org');">HTTP protocol</a> and much simpler to implement and use than SOAP, XMLRPC, etc.</p>
<p>Implementing RESTful APIs in web applications is getting really easy with leading frameworks like <a href="http://www.rubyonrails.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.rubyonrails.org');">Rails</a> and Cake supporting REST as a first-class citizen. The <a href="http://en.wikipedia.org/wiki/Atom_(standard)" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">Atom format</a> is leading the charge as a RESTful format supported by the big players: Google, <a href="http://www.infoq.com/news/2008/03/microsoft-atompub" onclick="javascript:pageTracker._trackPageview ('/outbound/www.infoq.com');">Microsoft</a>, Yahoo, Twitter, etc.</p>
<h3><a href="http://www.krisjordan.com/2008/09/18/clay-shirky-keynote/"><img class="alignright size-thumbnail wp-image-289" title="Clay" src="http://www.krisjordan.com/wp-content/uploads/2008/09/shirky-150x150.jpg" alt="" width="105" height="105" /></a></h3>
<h2>9. <a href="http://www.krisjordan.com/2008/09/18/clay-shirky-keynote/">&#8220;It’s Not Information Overload, It’s Filter Failure&#8221; </a></h2>
<p><a href="http://en.wikipedia.org/wiki/Clay_Shirky" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">Clay Shirky&#8217;s talk</a> states that since the invention of the printing press humans have always faced information overload. We have been surrounded by more information than we can consume in an entire lifetime for centuries. The problem is not information over load, it&#8217;s filter failure. We need better filters.</p>
<p><a href="http://en.wikipedia.org/wiki/Jay_Adelson" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">Jay Adelson</a> of <a href="http://www.digg.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.digg.com');">Digg</a> believes building better filters is exactly the mission Digg and other players in the collaborative filter space are addressing.</p>
<h2><img class="alignright size-thumbnail wp-image-382" title="iPhone GPS" src="http://www.krisjordan.com/wp-content/uploads/2008/09/iphone-map-150x150.jpg" alt="" width="105" height="105" />8. <a href="http://www.krisjordan.com/2008/09/18/andrew-turner-mikel-maron-trends-and-technologies-in-where-20/">Sensor Driven Data: The Web is Getting Orwellian</a></h2>
<p>With Apple putting GPS in iPhones, Google putting GPS in Android, Nikon putting GPS in the Coolpix P6000, and &#8230; you get the point. GPS, motion sensors, video recorders, microphones, and other sensors are increasingly distributed and surrounding us.</p>
<p>Tim O’Reilly believes a BIG revolution is happening Here. Tim is really bullish on sensor driven data. <a href="http://en.oreilly.com/where2008/public/content/home" onclick="javascript:pageTracker._trackPageview ('/outbound/en.oreilly.com');">Where 2.0 has its own O&#8217;Reilly Conference</a>. This space is heating up fast.</p>
<h3><a href="http://www.jquery.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.jquery.com');"><img class="alignright size-thumbnail wp-image-378" title="jQuery" src="http://www.krisjordan.com/wp-content/uploads/2008/09/jquery_logo-150x53.gif" alt="" width="105" height="37" /></a></h3>
<h2>7. <a href="http://www.jquery.com" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.jquery.com');">Javascript is Bringing Sexy Back to the Browser</a></h2>
<p>John Resig gave a session on <a href="http://www.krisjordan.com/2008/09/17/john-resig-building-a-visualization-language/">processing.js</a>, his visualization engine running atop the HTML5 Canvas. The canvas has really low level functionality, a la OpenGL for 2-D surfaces, but with the right libraries in place it can lead to some truly impressive results. Flickr&#8217;s Paul Hammond gave perhaps the most compelling story of the use of Javascript and Canvas. After building Flickr Stats, using Canvas for graph visualizations, a team member loaded a page on an iPhone. It just flat out worked.</p>
<p>Unfortunately my friends over at Microsoft are slowing down the progress here with no planned support for the HTML5 Canvas in IE8. Google&#8217;s <a href="http://excanvas.sourceforge.net/" onclick="javascript:pageTracker._trackPageview ('/outbound/excanvas.sourceforge.net');">excanvas</a> gets around this for IE users by mapping to VML. Unfortunately excanvas currently only works in quirks mode in IE8. <em>Damnit Microsoft</em>, you&#8217;ve brought IE8 a long ways towards being a modern, friendly player on the web, why not support Canvas? <em>Come on Oz, come on.</em></p>
<h3><a href="http://dataportability.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/dataportability.org');"><img class="alignright size-thumbnail wp-image-313" title="Data Portability" src="http://www.krisjordan.com/wp-content/uploads/2008/09/data-portability-150x150.jpg" alt="" width="96" height="96" /></a></h3>
<h2>6. <a href="http://www.krisjordan.com/2008/09/19/joseph-smarr-tying-it-all-together-implementing-the-open-web/" target="_self">The Open Web is Nearing the Tipping Point</a></h2>
<p><a href="http://www.dataportability.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.dataportability.org');">DataPortability</a> co-founders Chris Saad and Daniela Barbosa gave a <a href="http://www.krisjordan.com/2008/09/18/chris-saad-daniela-barbosa-understanding-the-basics-of-personal-data-and-dataportability/" target="_blank">great session</a> on the basic motivations behind the movement. The future the DataPortability group is trying to create, one which allows us to owning our data, our contacts, our relationships, etc. and be able to move them freely and easily between the on-line systems we use sounds truly empowering. The big players are joining the party: Microsoft, Google, Facebook, Six Apart, Linked In, Yahoo, Digg, Plaxo, MySpace. But Chris says &#8220;Who cares about them? This is a grassroots effort!&#8221;</p>
<p><a href="http://www.josephsmarr.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.josephsmarr.com');">Joseph Smarr</a>, Chief Architect of <a href="http://www.plaxo.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.plaxo.com');">Plaxo</a>, gave another <a href="http://http://www.krisjordan.com/2008/09/19/joseph-smarr-tying-it-all-together-implementing-the-open-web/">interesting session</a> on the major components of the open web and how they fit together. OAuth, OpenID, Open Social, and others were covered. The feeling I walked away with is that <em>we&#8217;re a lot closer than I thought.</em></p>
<h2><a href="http://danga.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/danga.com');"><img class="alignright size-thumbnail wp-image-388" title="Danga" src="http://www.krisjordan.com/wp-content/uploads/2008/09/danga-150x150.jpg" alt="" width="105" height="105" /></a>5. <a href="http://www.krisjordan.com/2008/09/18/joe-stump-scaling-digg-and-other-web-applications/" target="_blank">Web Scalability thanks to Async &amp; Danga</a></h2>
<p>&#8220;You can’t drop something in 40,000 buckets, synchronously, at once&#8221;, said Digg&#8217;s Lead Architect, Joe Stump in his session &#8220;<a href="../2008/09/18/joe-stump-scaling-digg-and-other-web-applications/">Scaling Digg and Other Web Applications</a>&#8220;. He was referencing what happens when Kevin Rose posts a message on Twitter. (<a href="http://twitter.com/kevinrose" onclick="javascript:pageTracker._trackPageview ('/outbound/twitter.com');">Rose</a> <em>actually </em>has nearly 65,000 followers on Twitter) Asynchronous task queuing is how the folks at Digg, Twitter, and Flickr deal with problems that are <em>really hard</em> to do in real time in any scalable fashion.</p>
<p>Just about all of Brad Fitzpatrick&#8217;s (of LiveJournal and OpenID fame) lightweight systems software, freely available at Danga.com, seems to be used by the biggest Web 2.0 players to achieve scale. That memcached, gearman, perlbal, djabberd, and mogilefs, all came out of Fitzpatrick and Danga is just incredible. No wonder Google gobbled him up from Six Apart.</p>
<h3><img class="alignright size-medium wp-image-377" title="Twitter API" src="http://www.krisjordan.com/wp-content/uploads/2008/09/twitterapi_logo.png" alt="" width="119" height="28" /></h3>
<h2>4. <a href="http://www.krisjordan.com/2008/09/16/web-20-expo-building-successful-next-generation-web-20-apps-from-dion-hinchcliffe/">Web 2.0 Traffic: It&#8217;s Out-of-Band<br />
</a></h2>
<p>The knowledge tidbit that stuck out more in my mind than any other was that Twitter gets 10 times the amount of traffic from its API than it does through its website. It makes sense, I&#8217;d just never acknowledged it explicitly. <a href="http://www.krisjordan.com/2008/09/16/web-20-expo-building-successful-next-generation-web-20-apps-from-dion-hinchcliffe/">Dion Hinchcliffe&#8217;s workshop</a> painted a similar story for many other Web 2.0 successes. The canonical example is YouTube with the embedded video. The decision to put html snippets plainly visible, right beside of the video, was perhaps their most genius move. Modern web applications and services are making themselves relevant by opening as many channels of distribution possible through feeds, widgets, badges, and programmable APIs.</p>
<h3><a href="http://www.php.net" onclick="javascript:pageTracker._trackPageview ('/outbound/www.php.net');"><img class="alignright size-thumbnail wp-image-375" title="PHP" src="http://www.krisjordan.com/wp-content/uploads/2008/09/php.gif" alt="" width="84" height="47" /></a></h3>
<h2>3. <a href="http://www.krisjordan.com/2008/09/16/cal-henderson-scalable-web-architectures-common-patterns-and-approaches/" target="_blank">Cal Henderson&#8217;s PHP Tent Revival</a></h2>
<p>If not for Cal Henderson I may have never have touched PHP again. I&#8217;m probably going to come back to this topic in more depth in a future post but Cal&#8217;s workshop &#8220;<a href="http://www.krisjordan.com/2008/09/16/cal-henderson-scalable-web-architectures-common-patterns-and-approaches/">Scalable Web Architectures: Common Patterns and Approaches</a>&#8221; renewed my interest in, relationship with, and respect for PHP. The funny thing is that wasn&#8217;t even the point of the talk. Cal and <a href="http://www.krisjordan.com/2008/09/18/joe-stump-scaling-digg-and-other-web-applications/">Joe Stump of Digg</a>&#8217;s succinct point that <em>Langauges Don&#8217;t Scale</em> is right on. Sure PHP isn&#8217;t as beautiful, trendy, or well designed as Python or Ruby are. However, some of the design decisions made by PHP&#8217;s Rasmus, specifically the &#8217;shared nothing&#8217;ness, make it a great technology for web applications. There&#8217;s a reason why Facebook, Digg, Flickr, and co. are still on it.</p>
<p>After Cal&#8217;s workshop I asked him: <strong>if you could do it all over again with Flickr would you choose to go with Python or Ruby?</strong> Cal&#8217;s answer: <strong>Nope, I&#8217;d do it in PHP.</strong></p>
<h3><a href="http://www.krisjordan.com/2008/09/17/jason-fried-10-things-weve-learned-at-37signals/"><img class="alignright size-thumbnail wp-image-376" title="Bambi on Ice" src="http://www.krisjordan.com/wp-content/uploads/2008/09/bambi_ice-150x150.jpg" alt="" width="105" height="105" /></a></h3>
<h2>2. <a href="http://www.krisjordan.com/2008/09/17/jason-fried-10-things-weve-learned-at-37signals/" target="_blank">Set Your Baby Free</a></h2>
<p>By grooming and nurturing a web app internally for an extended period of time is you lose a lot of value. <a href="http://www.krisjordan.com/2008/09/17/jason-fried-10-things-weve-learned-at-37signals/">Jason Fried</a>&#8217;s notion of &#8220;half a product is better than a half-assed product&#8221; is so fitting here. <a href="http://www.krisjordan.com/2008/09/18/sandy-jen-scaling-synchronous-web-apps-lessons-learned-from-meebo/">Sandy Jen of Meebo echoes similar notions in her talk</a>: Start out with something simple, see if it works, evolve. Bring your customers into the feedback loop as quickly as possible. Joshua Schachter, founder of delicious, spoke of the exact same sentiments in his talk on &#8220;<a href="http://www.krisjordan.com/2008/09/17/joshua-schachter-lessons-learned-in-scaling-and-building-social-systems/">Scaling and Building Social Systems</a>&#8220;.</p>
<h2>1. Want to Set the World on Fire? <em>YOU </em>Better Bring the Fire.</h2>
<p><em>If <span style="text-decoration: underline;">you</span> are not bringing the heat, get out of the kitchen</em>. Passion was the common thread amongst the most inspiring talks I saw at the conference. Between <a href="http://garyvaynerchuk.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/garyvaynerchuk.com');">Gary Vaynerchuk</a>, <a href="http://www.37signals.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.37signals.com');">Jason Fried</a>, and <a href="http://www.huffingtonpost.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.huffingtonpost.com');">Arianna Huffington</a> the message was  consistent: be passionate. I&#8217;m going to let Gary roll this one out with his amazingly energetic keynote on building personal brand&#8230;</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="390" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://blip.tv/play/Ac6tAIa8DQ" /><embed type="application/x-shockwave-flash" width="480" height="390" src="http://blip.tv/play/Ac6tAIa8DQ"></embed></object></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=S7ZEL"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=S7ZEL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=DSxGl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=DSxGl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=nbdTl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=nbdTl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=42Bfl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=42Bfl" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/09/25/10-high-order-bits-from-the-web-20-expo-in-ny/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/09/25/10-high-order-bits-from-the-web-20-expo-in-ny/</feedburner:origLink></item>
		<item>
		<title>Joseph Smarr - Tying it All Together: Implementing the Open Web</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/397534989/</link>
		<comments>http://www.krisjordan.com/2008/09/19/joseph-smarr-tying-it-all-together-implementing-the-open-web/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 20:39:22 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Web 2.0 Expo NY]]></category>

		<category><![CDATA[dataportability]]></category>

		<category><![CDATA[joseph smarr]]></category>

		<category><![CDATA[oauth]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[opensocial]]></category>

		<category><![CDATA[plaxo]]></category>

		<category><![CDATA[web2expoNY]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=361</guid>
		<description><![CDATA[[Live from Web 2.0 Expo 9/16 - 9/19 Follow along the other Expo Talks in RSS.]
Joseph Smarr is the Chief Platform Architect at Plaxo.
Lots of open source building blocks for bringing things together. How do all these pieces sit together and what is the landscape going to look like when the dust settles?
The social web [...]]]></description>
			<content:encoded><![CDATA[<p><em>[Live from Web 2.0 Expo 9/16 - 9/19 <a href="http://feeds.feedburner.com/KrisJordan" onclick="javascript:pageTracker._trackPageview ('/outbound/feeds.feedburner.com');">Follow along the other Expo Talks in RSS</a>.]</em></p>
<p><em><a href="http://www.josephsmarr.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.josephsmarr.com');">Joseph Smarr</a> is the <a href="http://www.plaxo.com/about/management_team#joseph" onclick="javascript:pageTracker._trackPageview ('/outbound/www.plaxo.com');">Chief Platform Architect</a> at <a href="http://www.plaxo.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.plaxo.com');">Plaxo</a>.</em></p>
<div id="attachment_364" class="wp-caption alignright" style="width: 210px"><img class="size-full wp-image-364" title="Joseph Smarr" src="http://www.krisjordan.com/wp-content/uploads/2008/09/joseph_smarr.jpg" alt="Joseph Smarr" width="200" height="200" /><p class="wp-caption-text">Joseph Smarr</p></div>
<p>Lots of open source building blocks for bringing things together. How do all these pieces sit together and what is the landscape going to look like when the dust settles?</p>
<p>The social web today is very broken. On each site you have to re-create an account, re-enter profile info, re-find friends, re-establish relationships. New social apps have limited options: create yet-another-silo and start from scratch or make a widget inside of an existing walled garden.</p>
<p>There&#8217;s got to be a better way and there is. Help is on the way. It&#8217;s coming in the form of new building blocks that establish: who I am, who I know, and what&#8217;s going on. We&#8217;re going to aim for the medium level of detail on each of the projects which fit into these building blocks.</p>
<p><strong>Who I am</strong>: Creating a portable, durable online identity. OpenID is important in this space. OpenID lets you come to a new website and allows you to log-in with an account that exists on another site. You can sign up and sign in with your existing account. You can then link and share your profile data between sites. When you go through Plaxo&#8217;s sign up you can sign in with any open ID. This takes you over to your identity provider and allows you to verify that you want to share your information with Plaxo. This is good for users and for Plaxo by reducing friction. Yahoo is OpenID, MySpace is on the way, AOL is signed up, some of Google&#8217;s properties are supported, this has majorly caught on.</p>
<p>Consolidate your online identity with me-links for rel=me (XFN). The social graph API allows you to query Google using REST for the downstream me links. This makes it easy to find out more information about users by what exists on the web. Again great for both the consumer in not having to duplicate info and great for businesses in terms of getting data into your systems.</p>
<p><strong>Who I know</strong>: You need to be able to build and maintain relationships. Until recently the only way you could get at this information was to scrape your webmail address books. It&#8217;s kind of hacky and insecure. The good news is over the last year that this isn&#8217;t going away, it&#8217;s useful, and they&#8217;ve made it easy to practice safe portability. Google, Yahoo, and Microsoft have mechanisms for getting at the information without giving a new service your webmail password. OAuth is a means for sharing private data between trusted sites. A bunch of people came together and came up with a standard way of getting at data. OAuth is supported by Google, MySpace, it&#8217;s a part of DataPortability. OAuth gives a third party site a token which is revocable. It can be scoped access. Friends-list portability allows for continuous discovery across multiple sites.</p>
<div id="attachment_365" class="wp-caption alignleft" style="width: 310px"><a href="http://www.krisjordan.com/wp-content/uploads/2008/09/joseph_slide.jpg"><img class="size-medium wp-image-365" title="The Open Stack" src="http://www.krisjordan.com/wp-content/uploads/2008/09/joseph_slide.jpg" alt="The Open Stack" width="300" height="225" /></a><p class="wp-caption-text">The Open Stack</p></div>
<p><strong>What&#8217;s going on?</strong> Because the entire web is becoming social you&#8217;re creating and doing interesting things on a lot of different sites. You can&#8217;t walk each site to check and see who is doing what. OpenSocial is trying to define a standard language for social networking applications on the web. You can drop in widgets that work on all social networking sites. OpenSocial is going mainstream and has over 500 million users by the end of the year. Everyone is agreeing on standard APIs at the server-to-server level. RSS and Atom is another important piece which is often overlooked. It&#8217;s an important standard for sharing &#8220;here&#8217;s what going on right now.&#8221; If you put RSS together with OAuth you can get private update feeds. Jabber XMPP is becoming more important, too, it started as an open standard for instant messaging. One of the things they built in as a result is that it is federated. It&#8217;s a good set of open tools for different sites sending messages to each other.</p>
<p>This stuff is out there, it&#8217;s real, and it fits into these standard blocks. What we&#8217;ll do now is pull everything together.</p>
<p><strong>How does the friends list portability work?</strong></p>
<ol>
<li><em>Tell the site your social graph provider</em>: XRDS-Simple (discovery) + OAuth (access)</li>
<li><em>Site fetches your data to find local friends</em>: Site fetches your data to find your local friends ??? No standard way to do this yet. A project that&#8217;s going on and in draft spec is still up and coming is PortableContacts.net.</li>
<li><em>Site lets you connect to people you want</em>: You can periodically look for new matches.</li>
</ol>
<p><strong>How does contact portability work?</strong></p>
<ol>
<li>User signs in with an OpenId: Site fetches OpenID URL -&gt; looks for X-XRDS-Location, Site parses XRDS-Simple doc to discover available APIs</li>
<li>Site tries to access contacts API -&gt; gets a 401: WWW-Authenticate response header specifies OAuth, OAuth discovery (via XRDS) provides OAuth endpoints</li>
<li>Site sends user through OAuth</li>
</ol>
<p>A resource Joseph wrote on OpenID: <a href="http://www.plaxo.com/api/openid_recipe" onclick="javascript:pageTracker._trackPageview ('/outbound/www.plaxo.com');">http://www.plaxo.com/api/openid_recipe</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=pM8SL"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=pM8SL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=hXVyl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=hXVyl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=5HrOl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=5HrOl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=lRgil"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=lRgil" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/09/19/joseph-smarr-tying-it-all-together-implementing-the-open-web/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/09/19/joseph-smarr-tying-it-all-together-implementing-the-open-web/</feedburner:origLink></item>
		<item>
		<title>Jeffrey Zeldman and Panel - Content Matters</title>
		<link>http://feeds.feedburner.com/~r/KrisJordan/~3/397466743/</link>
		<comments>http://www.krisjordan.com/2008/09/19/jeffrey-zeldman-and-panel-content-matters/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 19:09:25 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
		
		<category><![CDATA[Web 2.0 Expo NY]]></category>

		<category><![CDATA[content]]></category>

		<category><![CDATA[Design]]></category>

		<category><![CDATA[web2expoNY]]></category>

		<category><![CDATA[zeldman]]></category>

		<guid isPermaLink="false">http://www.krisjordan.com/?p=346</guid>
		<description><![CDATA[[Live from Web 2.0 Expo 9/16 - 9/19 Follow along the other Expo Talks in RSS.]

The Panel:
Liz Danzico – Bobulate.com - part information architect, part usability analyst, and part editor.
Alex Write “Information Architect” – NyTimes.com – Previously a UX designer and journalist in California.
Bre Pettis – “Videographer” – BrePettis.com, Etsy.com
Kristina Halverson – “Content Strategist” – [...]]]></description>
			<content:encoded><![CDATA[<p><em>[Live from Web 2.0 Expo 9/16 - 9/19 <a href="http://feeds.feedburner.com/KrisJordan" onclick="javascript:pageTracker._trackPageview ('/outbound/feeds.feedburner.com');">Follow along the other Expo Talks in RSS</a>.]</em></p>
<p><img class="aligncenter size-full wp-image-350" title="The Panel" src="http://www.krisjordan.com/wp-content/uploads/2008/09/panel.jpg" alt="" width="500" height="140" /></p>
<p><em><span style="text-decoration: underline;">The Panel:</span><br />
Liz Danzico – <a href="http://www.bobulate.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.bobulate.com');">Bobulate.com</a> - part information architect, part usability analyst, and part editor.</em><br />
<em>Alex Write “Information Architect” – <a href="http://www.nytimes.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.nytimes.com');">NyTimes.com</a> – Previously a UX designer and journalist in California.<br />
Bre Pettis – “Videographer” – <a href="http://www.brepettis.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.brepettis.com');">BrePettis.com</a>, <a href="http://www.etsy.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.etsy.com');">Etsy.com</a><br />
Kristina Halverson – “Content Strategist” – <a href="http://www.braintraffic.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.braintraffic.com');">BrainTraffic.com</a><br />
Jeffrey Zeldman  - “Evangelist” – <a href="http://www.alistapart.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.alistapart.com');">AlistApart.com</a>, <a href="http://www.happycog.com" onclick="javascript:pageTracker._trackPageview ('/outbound/www.happycog.com');">HappyCog.com</a>, <a href="http://www.zeldman.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.zeldman.com');">Zeldman.com</a><br />
Paul Ford – “Editor” – <a href="http://www.harpers.org" onclick="javascript:pageTracker._trackPageview ('/outbound/www.harpers.org');">Harpers Magazine</a>, <a href="http://ftrain.com" onclick="javascript:pageTracker._trackPageview ('/outbound/ftrain.com');">ftrain.com</a>, <a href="http://www.themorningnews.com/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.themorningnews.com');">themorningnews.com</a></em></p>
<p><strong>Liz Danzico Setting Context for Panel Discussion</strong></p>
<div id="attachment_351" class="wp-caption alignleft" style="width: 210px"><img class="size-full wp-image-351" title="Liz Danzico" src="http://www.krisjordan.com/wp-content/uploads/2008/09/liz.jpg" alt="" width="200" height="200" /><p class="wp-caption-text">Liz Danzico</p></div>
<p>The people on this panel are interested in changing your minds on the role of the content in design and user experience mocks. The original name of this talk was: copy matters.</p>
<p>You may have heard these two conflicting views: 1. Content drives traffic. Content certainly is a primary reason for users to come to you. 2. Users don’t read on-line (Jakob Nielsen).</p>
<p>We will be talking about whether we are at a cross-roads. Going back a little bit in history to transitions in media, people referred to television as radio with pictures. When movies and television were first made cameras were stationary. Early MTV was just bands on the stage playing. When we make transitions from old to new we borrow metaphors from old technology and apply them to the new. As we look at the web as a publishing medium we’re looking at a different publishing medium. Different responsibilities for makers, editors, etc.</p>
<p>“<strong>We aren’t writing, we are speaking in text</strong>.” – Erika Hall of Mule Design.</p>
<p>“<strong>The internet looks like writing, but it’s actually a conversation.</strong>” –Khoi Vinh, NYTimes.com</p>
<p><em><strong>What kind of content are we talking about in the panel?</strong></em></p>
<p><strong>Navigation &amp; Orientation content</strong> – Daytum.com, Flickr.com with rotating greetings setting the tone in different languages. Navigation on CNN is an example of clear communication on sub-pages. Matched with URL and page hierarchy.</p>
<p><strong>Labels &amp; Action</strong> – Vimeo with its labels. Geni.com as a quick review of what labels are.</p>
<p><strong>Help Content </strong>– Tick “Just kidding I Remember Now” link next to “Send me my password”.</p>
<p><strong>Non-textual content</strong> – Visual content like election maps, photos, info visualization.</p>
<p><strong>Content, content, !</strong> – Marketing communications sites like Business Week with Editorial Content, etc.</p>
<p>With this new publishing model and these new types of content, how are we going to make it work? Ask the experts!</p>
<p><em><strong>Q) What is the nature of the content work you do? The reason I asked each of you to the panel is because each of you has a different role in content.</strong></em></p>
<p><strong>Halverson</strong>- Typically our clients are dealing with content that helps discuss their products and services. We are trying to help them wrangle, plan for the creation, creating, standards and structures in place to help them govern that content. I got into content strategy because I was handed wire frame to fill content for websites.</p>
<p><strong>Pettis</strong>- I got into video and videos about how to make things. For two years had a show called video projects. I’m a video guy who thinks print is a part of the past.</p>
<div id="attachment_353" class="wp-caption alignleft" style="width: 210px"><img class="size-full wp-image-353" title="Jeffrey Zeldman" src="http://www.krisjordan.com/wp-content/uploads/2008/09/jeffrey-zeldman.jpg" alt="Jeffrey Zeldman" width="200" height="200" /><p class="wp-caption-text">Jeffrey Zeldman</p></div>
<p><strong>Zeldman</strong>- With the magazine I write, with my website I write. I was a journalist and in advertising and copywrite for a long time. When I started websites back in 1995 the whole thing as that it was self publishing. I thought everyone was going to learn HTML and be self –publishing. <strong>I thought everyone would find their voice and try to find an audience.</strong> With our client services projects we always start with the content, what it is, what’s there, how they’re going to interact with it. We develop content strategy and architecture before we get to design. If you bring design in fairly late in the process you’ve already worn them down. In terms of the magazine it’s a labor of love.</p>
<p><em><strong>Q: How do you deal with accommodating both organizing content that is purely visual and content that is textual?</strong></em></p>
<p><strong>Write</strong>- NYTimes publishes a lot of content and we increasingly publish a lot of multimedia content: images, slideshows, interactive flash, etc. Issues that come up is around the metadata layer. All of our photos are in a huge database that exist separately from the article database and content management system. We have a good taxonomy to tag articles but we don’t have the same capabilities with issues. From a design point of view we’re constantly trying to figure out how to weave that content into the site.</p>
<p><strong>Pettis </strong>– The thing I’m excited about on the internet is that people find a passion and get into it and publish about it. I’m on the blogging team at Etsy. We have really passionate users.  What we do with the blog is open it up so that anyone can pitch ideas. We have over 300 authors on the blog. We have a video team of people who want to point cameras at things and record what they’re thinking and doing. It’s a way of sharing passion and excitement.</p>
<p><em><strong>Q: How are you helping your clients how to become sophisticated publishers of content?</strong></em></p>
<p><strong>Halverson </strong>– That for me is way down the tracks. As an example take a company with 12 different business units serving 122 different markets. Producing content for a lot of audiences. Our process is A) Figuring out where the content is and who is out there B) establish who is publishing content, reviewing content, etc. C) governing consistent brand standards across the content. <strong>There’s a complete infrastructure lacking within many organizations between print marketing and interactive marketing. We start by trying to bring these people into the same umbrella.</strong> That challenge in some organization is really difficult. They spend all their money on brand and have no idea how to govern and create content.</p>
<p><strong>Zeldman </strong>– I would just like to say it’s mostly luck. Like woody allen said ablout love: sometimes you’re lucky sometimes you’re not. With clients we would turn things over and sometimes the client would use it and take of running, sometimes they wouldn’t. We built a content management system and would write guidelines and sometimes clients would follow them and sometimes they wouldn’t. We’re doing something for a food manufacturer and they make a delicious bar which has a cool brand and has medical implications so the challenge for copy is that there are pages that have to address people with lupus and there are other birds where there are birds with funny sayings. What rules do you give the client for when they use each tone, how to transition? We create matrices and recommendations and if we’re lucky the client has the right people and the right talent to keep it going. You hope that everyone is passionate about the project.<br />
<em><strong><br />
Question: How do you approach content from a user generated view point?</strong></em></p>
<p><strong>Zeldman </strong>– I think it’s both. You have to talk about both sides of the equation.</p>
<p><strong>Liz </strong>– More and more it’s our responsibility as designers to think about creating very good frameworks that are well thought through, intuitive, and provide intuitive roles which people can participate in. That’s one step: designers create a framework to participate. The second step is for users to actually be involved. The third is an editorial responsibility of the client to monitor content.</p>
<p><strong>Zeldman </strong>– <strong>If you abandon the responsibility of editorial control you lose a lot of value.</strong> If your content is of high quality you’ll get comments of high quality. Generally because the writing is so good at NYTimes there are some really well thought out comments.</p>
<p><strong>Write </strong>– When user generated content works well it’s when it’s well channeled. If there’s a cacophony of noise you can’t get anything out of it. <strong>At NYTimes you can comment on certain articles but it’s all moderated by a team of people that try to keep the level of discourse civil.</strong> The notion of just opening things up and letting people go after it leads to craziness.</p>
<p><strong>Ford </strong>– Another example: how many wiki sites are dead on the web right now?</p>
<p><strong>Zeldman </strong>– The first site I worked on for a client was Batman Forever in 1995. We had a forum and seeded some content. It went well initially, people used it. But once we were off the job and the movie stopped needing to sell tickets so they stopped keeping track of the forum. Suck.com later did a piece on it. People were making racist comments and trying to have sex with each other.</p>
<p><strong>Ford </strong>- You can get content for free but you can’t get editing for free.</p>
<p><strong>Halverson </strong>– We’ve had companies who try to fix their content problems by buying a really expensive CMS. They think the magical content will just arrive. You must plan for, create, and govern content.</p>
<p><strong>Zeldman </strong>– Even Flickr is about constraints. They encourage a certain kind of user.</p>
<p><strong>Halverson </strong>– Good example but an easy example because the site is for fun. It gets more complicated when the matter is more serious.</p>
<p><em><strong>Q: What kinds of tips can you give to people who are responsible for creating content?</strong></em></p>
<p><strong>Write </strong>- Part of the design process is what are the words that exist on the page? “The vacuous victory of typesetters over authors.” People tend to think of the web as boxes and content blocks.</p>
<div id="attachment_357" class="wp-caption alignleft" style="width: 210px"><img class="size-full wp-image-357" title="Bre Pettis" src="http://www.krisjordan.com/wp-content/uploads/2008/09/bre-pettis1.jpg" alt="Bre Pettis" width="200" height="200" /><p class="wp-caption-text">Bre Pettis</p></div>
<p><strong>Ford </strong>– If you are the one doing content make it very easy to get tons of feedback. I’m the sole guy doing web copy on Harpers and I hear back from customers constantly. When you are the person doing the copy it’s your job to make it as straightforward as possible.</p>
<p><strong>Pettis </strong>– I’m shocked to hear businesses farming out content and passion.</p>
<p><strong>Halverson </strong>– I often work with people who are responsible for content on top of their many other jobs. <strong>Don’t conceive of and put boxes on your wireframes for content you don’t have time to create and govern. Scale back.</strong></p>
<p><strong>Zeldman </strong>– <strong>I think that’s the most important piece of advice I’ve heard today. Scale back.</strong> If you don’t have the people to do it, you shouldn’t do it. Grow slowly.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/KrisJordan?a=tzK0L"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=tzK0L" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=W6Wsl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=W6Wsl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=phNTl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=phNTl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/KrisJordan?a=zrTBl"><img src="http://feeds.feedburner.com/~f/KrisJordan?i=zrTBl" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.krisjordan.com/2008/09/19/jeffrey-zeldman-and-panel-content-matters/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.krisjordan.com/2008/09/19/jeffrey-zeldman-and-panel-content-matters/</feedburner:origLink></item>
	</channel>
</rss>
