<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	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/"
	>

<channel>
	<title>My Security Planet &#187; Chris Shiflett</title>
	<link>http://rgaucher.info/planet/</link>
	<description>My Security Planet &#187; Chris Shiflett</description>
	<generator>Gregarius 0.5.4</generator>
	<language>en</language>
	<item>
		<title>Chris Shiflett: Mozilla Account Manager</title>
		<link>http://shiflett.org/blog/2010/aug/mozilla-account-manager</link>
		<pubDate>Tue, 17 Aug 2010 12:09:43 -0500</pubDate>
		<guid>http://shiflett.org/blog/2010/aug/mozilla-account-manager</guid>
		<content:encoded><![CDATA[	<p>
  For some time now, I've been happily using <a href="http://agilewebsolutions.com/products/1Password">1Password</a> to manage all of my online accounts. I really like it and recommend it to all of my friends, but I do have a few reservations:
</p>
<ul>
  <li>It uses a proprietary format for storing my account information. (Older versions used the <a href="http://en.wikipedia.org/wiki/Keychain_%28Mac_OS%29">Keychain</a> format.)
  </li>
  <li>It does not integrate with <a href="http://apple.com/iphone/features/safari.html">Mobile Safari</a> or anything that's not a browser (e.g., <a href="http://en.wikipedia.org/wiki/ITunes">iTunes</a>). This means browsing on my iPhone or iPad is practically impossible, and my iTunes password has to be easy to type, leaving me vulnerable.
  </li>
  <li>There's currently no way for developers to make sure their sites support 1Password. Given the way 1Password works, <a href="http://microformats.org/">microformats</a> seem like a possible solution.
  </li>
</ul>
<p>
  <a href="http://mozillalabs.com/blog/2010/03/account-manager/">Earlier this year</a>, I heard about <a href="http://mozilla.com/firefox/accountmanager/">Account Manager</a>, a new effort from Mozilla that aims to help web sites and users <a href="https://mozillalabs.com/conceptseries/identity/connect/">connect</a> in a safe and consistent way. In other words, it can potentially make managing passwords online a lot easier, more consistent, and more secure. Furthermore, because it's being developed as an <a href="https://wiki.mozilla.org/Labs/Weave/Identity/Account_Manager/Spec/Latest">open standard</a>, widespread support is a possibility.
</p>
<p>
  The <a href="https://wiki.mozilla.org/Labs/Weave/Identity/Account_Manager/Spec/Latest">spec</a> uses <a href="http://mediawiki.org/">MediaWiki</a>, which does not number sections by default. Because all references within the spec use section numbers, you might want to log in and select "auto-number headings" in your preferences. (You can also refer to the table of contents at the top.)
</p>
<p>
  This weekend, I managed to find some time to <a href="http://twitter.com/shiflett/status/21253871362">explore Account Manager</a> a bit. With the help of <a href="http://blog.sandmill.org/">Dan Mills</a>, I got it <a href="http://twitter.com/shiflett/status/21369046516">working with Firefox 4</a>. He was also kind enough to provide some preview builds for you to use:
</p>
<ul>
  <li>
    <a href="https://people.mozilla.com/~dmills/account-manager/builds/firefox-4.0b4pre.en-US.mac.dmg">firefox-4.0b4pre.en-US.mac.dmg</a> (Mac)
  </li>
  <li>
    <a href="https://people.mozilla.com/~dmills/account-manager/builds/firefox-4.0b4pre.en-US.linux-i686.tar.bz2">firefox-4.0b4pre.en-US.linux-i686.tar.bz2</a> (Linux)
  </li>
  <li>
    <a href="https://people.mozilla.com/~dmills/account-manager/builds/firefox-4.0b4pre.en-US.win32.installer.exe">firefox-4.0b4pre.en-US.win32.installer.exe</a> (Windows)
  </li>
</ul>
<p>
  If you want to try it out before I give you a quick tour, install one of the Firefox 4 preview builds linked above, and visit my <a href="http://shiflett.org/lab/account-manager">Account Manager demo</a>.
</p>
<p>
  Implementing Account Manager is pretty straightforward. To keep things simple, I'm only going to show you how to implement login and logout. Think of this as two steps:
</p>
<ol>
  <li>Inform the browser whether the user is logged in.
  </li>
  <li>Inform the browser how to log in and log out.
  </li>
</ol>
<p>
  The first step is accomplished via the <code>X-Account-Management-Status</code> header. (This is a response header you can set with the <a href="http://php.net/header"><code>header()</code></a> function.) Here's an example:
</p>
<pre>
<code>X-Account-Management-Status: active; id="chris"; name="Chris Shiflett"; authmethod="username-password-form"</code>
</pre>
<p>
  This header informs the browser that the user is currently logged in as <code>chris</code>. Instead of <code>active</code> (logged in), you may specify <code>none</code> (not logged in) or <code>passive</code> (remember me). The rest of the header is a semicolon-delimited list of attributes, three of which are currently defined: <code>name</code>, <code>id</code>, and <code>authmethod</code>. There are various options for <code>authmethod</code>, but I'm only going to be talking about <code>username-password-form</code>.
</p>
<p>
  Informing the browser how to log in and log out is almost as easy. You indicate these things in an Account Management Control Document (AMCD). You can view <a href="http://shiflett.org/lab/account-manager/amcd">my AMCD</a> to get an idea of the format, but because <a href="http://php.net/json_encode"><code>json_encode()</code></a> doesn't generate the most readable JSON, I'll share the PHP as well:
</p>
<pre>
<code>&lt;?php</code>
<code> </code>
<code>$json = array(</code>
<code>    'version' =&gt; 1,</code>
<code>    'sessionstatus' =&gt; array(</code>
<code>        'method' =&gt; 'GET',</code>
<code>        'path' =&gt; '/lab/account-manager/status'</code>
<code>    ),</code>
<code>    'auth-methods' =&gt; array(</code>
<code>        'username-password-form' =&gt; array (</code>
<code>            'connect' =&gt; array(</code>
<code>                'method' =&gt; 'POST',</code>
<code>                'path' =&gt; '/lab/account-manager/login',</code>
<code>                'params' =&gt; array(</code>
<code>                    'username' =&gt; 'username',</code>
<code>                    'password' =&gt; 'password'</code>
<code>                )</code>
<code>            ),</code>
<code>            'disconnect' =&gt; array(</code>
<code>                'method' =&gt; 'GET',</code>
<code>                'path' =&gt; '/lab/account-manager/logout'</code>
<code>            )</code>
<code>        )</code>
<code>    )</code>
<code>);</code>
<code> </code>
<code>echo json_encode($json);</code>
<code> </code>
<code>?&gt;</code>
</pre>
<p>
  Although it's not indicated in the spec yet, <code>sessionstatus</code> is now required. In a future post, I will discuss this in more detail along with registration and other features.
</p>
<p>
  After you create your own AMCD, specify its location with a <code>Link</code> header:
</p>
<pre>
<code>Link: &lt;http://shiflett.org/lab/account-manager/amcd&gt;; rel="acct-mgmt"</code>
</pre>
<p>
  As a reminder, you can try my <a href="http://shiflett.org/lab/account-manager">demo of Account Manager</a>. I encourage you to use something like <a href="https://addons.mozilla.org/en-US/firefox/addon/3829/">Live HTTP Headers</a>, so you can examine the HTTP traffic. If you want to implement Account Manager on your own sites, be prepared to make frequent changes.
</p>
<p>
  Here are a few additional things I noticed:
</p>
<ul>
  <li>Account Manager does not seem to abide by the <code>Cache-Control</code> header correctly, which can make development cumbersome. You must restart Firefox for any AMCD change to take effect. (See my comment below for an alternative solution.)
  </li>
  <li>It is not currently possible to protect against <a href="http://shiflett.org/articles/cross-site-request-forgeries">CSRF</a>, but there are ongoing <a href="https://groups.google.com/group/mozilla-labs-online-identity/browse_thread/thread/3e6648671a170fc7">discussions</a> about it, so a solution is sure to come in the near future.
  </li>
  <li>Logging out currently requires the GET request method. As I've <a href="http://shiflett.org/blog/2006/dec/google-web-accelerator-debate">discussed</a> before, POST is more appropriate. Because Account Manager provides a consistent interface, the request method you choose to use has no aesthetic implications, so I hope most people will use POST.
  </li>
</ul>
<p>
  Want to participate in a new browser technology that just might prove to be more important than tabs? Install Firefox 4 (<a href="https://people.mozilla.com/~dmills/account-manager/builds/firefox-4.0b4pre.en-US.mac.dmg">Mac</a>, <a href="https://people.mozilla.com/~dmills/account-manager/builds/firefox-4.0b4pre.en-US.linux-i686.tar.bz2">Linux</a>, <a href="https://people.mozilla.com/~dmills/account-manager/builds/firefox-4.0b4pre.en-US.win32.installer.exe">Windows</a>), read the <a href="https://wiki.mozilla.org/Labs/Weave/Identity/Account_Manager/Spec/Latest">spec</a>, try my <a href="http://shiflett.org/lab/account-manager">demo</a>, join the <a href="https://groups.google.com/group/mozilla-labs-online-identity">mailing list</a>, and most of all, have fun!
</p>
<p>
  There's a lot I did not cover in this post, but I will be blogging more about Account Manager in the near future. One of the missing topics I'm most interested in exploring is how Account Manager can potentially be supported by apps other than Firefox. It's possible that 1Password could continue to be essential, because it could be the app-neutral data store for all of my account data.
</p>
<p>
  Tue, 17 Aug 2010 17:09 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: PHP Anthem</title>
		<link>http://shiflett.org/blog/2010/aug/php-anthem</link>
		<pubDate>Thu, 05 Aug 2010 09:31:35 -0500</pubDate>
		<guid>http://shiflett.org/blog/2010/aug/php-anthem</guid>
		<content:encoded><![CDATA[	<p>
  Yesterday on IRC, <a href="http://zmievski.org/">Andrei Zmievski</a> mentioned a <a href="http://fracturedvisionmedia.com/FVM005/">new song about PHP</a>. <a href="http://seancoates.com/">Sean Coates</a> linked to a <a href="http://youtube.com/watch?v=S8zhmiS-1kw">YouTube video</a> with the song, which I then <a href="http://twitter.com/shiflett/status/20324835334">mentioned on Twitter</a>:
</p>
<blockquote>
  <p>
    PHP finally has an anthem. This is what we’ve been lacking. <a href="http://j.mp/PHPanthem">[j.mp]</a> /via <a href="http://twitter.com/coates">@coates</a>
  </p>
</blockquote>
<p>
  If you haven't listened yet, take a moment to do so. There are a few options:
</p>
<ul>
  <li>
    <a href="http://drop.io/6obkw8b">Download the song (MP3)</a>
  </li>
  <li>
    <a href="http://fracturedvisionmedia.com/FVM005/downloads/FVM005_MP3.zip">Download the entire album (MP3)</a>
  </li>
  <li>
    <a href="http://fracturedvisionmedia.com/FVM005/downloads/FVM005_CDR.zip">Download the entire album (CD)</a>
  </li>
  <li>
    <a href="http://youtube.com/watch?v=S8zhmiS-1kw">Watch on YouTube</a>
  </li>
</ul>
<p>
  The song is by <a href="http://blog.leefernandes.com/">Lee Fernandes</a>, who goes by <a href="http://twitter.com/reelfernandes">@reelfernandes</a> on Twitter. I couldn't find the lyrics online, so I created a <a href="http://typewith.me/GSltyqHqpl">new document</a> on <a href="http://typewith.me/">TypeWith.me</a> to solicit help. To my delight, prompted by <a href="http://twitter.com/coates/status/20325837222">Sean's request</a>, Lee joined and helped us out. :-)
</p>
<p>
  TypeWith.me is made with <a href="http://etherpad.com/">EtherPad software</a>. Lee thinks it's <a href="http://twitter.com/reelfernandes/status/20326827713">excellent</a>. If you're sad about <a href="http://googleblog.blogspot.com/2010/08/update-on-google-wave.html">yesterday's news about Wave</a>, you should give it a try.
</p>
<p>
  The complete lyrics are below, with some links to add context. Enjoy! :-)
</p>
<blockquote>
  <p>
    Oh yeah. (Oh yeah.)<br />
    (Just one day it just hits you all of a sudden. It's just like...)
  </p>
  <p>
    Oh yeah, I'm so <a href="http://php.net/">PHP</a> this year.<br />
    Got a <a href="http://piqueweb.net/">mic</a> in the <a href="http://php.net/ltrim">left</a>, and 'n the <a href="http://php.net/rtrim">right</a>, <a href="http://seancoates.com/brews">cold beer</a>.<br />
    Compile that <a href="http://httpd.apache.org/">Apache</a>.<br />
    Now we got <a href="http://php.net/downloads.php#v5">version 5</a> and <a href="http://flickr.com/photos/hasta-pronto/373225236/">two chicks</a> laid out in the back seat.<br />
    Yeah, sometimes the <a href="http://forums.devnetwork.net/viewtopic.php?t=53286">code looks a little trashy</a>.<br />
    But, this ain't <a href="http://en.wikipedia.org/wiki/ColdFusion">ColdFusion</a>.<br />
    Stop talking <a href="http://sass-lang.com/">sassy</a>, and pull up them <a href="http://cafepress.com/+php+underwear-panties">panties</a>.
  </p>
  <p>
    I'm really... I'm just saying; why don't you go check out the <a href="http://php.net/docs.php">API reference docs</a>.<br />
    They're really good.<br />
    (They are.)
  </p>
  <p>
    Is it <a href="http://php.net/date_time_set">underline</a> or <a href="http://php.net/datetime.settime">CamelCase</a>?<br />
    I can't <a href="http://php.net/apc_store">remember</a>; I've been busy <a href="http://lithify.me/">poundin' cakes</a>.<br />
    It's what <a href="http://phpdeveloper.org/">PHP developers</a> do.<br />
    We <a href="http://php.net/usage.php">get more booty</a> than you.<br />
    Don't be jealous when you smell us; <a href="http://php.net/if">check</a> the <a href="http://php.net/bool">Boolean</a> dude, it reads...
  </p>
  <p>
    [<a href="http://php.net/closures">chorus</a>]<br />
    (Oh yeah.)<br />
    Check the Boolean dude; it reads true.<br />
    (Oh yeah.)<br />
    PHP gets more booty than you.<br />
    (Oh yeah.)<br />
    Check the Boolean dude; it reads true.<br />
    (Oh yeah.)<br />
    PHP gets more booty than you.<br />
    (Oh yeah.)<br />
    Check the Boolean dude; it reads...
  </p>
  <p>
    True, PHP gets more booty than you,<br />
    but we still keep it <a href="http://shiflett.org/articles/sql-injection">clean</a>.<br />
    <a href="http://mysql.org/">MySQL</a> <a href="http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string">really real</a> wrappin' all <a href="http://php.net/string">strings</a>.<br />
    <a href="http://shiflett.org/blog/2005/feb/my-top-two-php-security-practices">Filter input</a> like it was a herpes strain.<br />
    (You know what I'm saying?)<br />
    That's why we got the <a href="http://php.net/reserved.classes">STD class</a>.<br />
    <a href="http://php.net/oop5">Objects</a> we <a href="http://php.net/references.pass">pass</a> might need to be <a href="http://php.net/gc">trashed</a>.<br />
    Girl, what you doin'?
  </p>
  <p>
    Come <a href="http://en.wikipedia.org/wiki/Gunzip">gunzip</a> this.<br />
    Be my witness as I <a href="http://php.net/stripslashes">strip this string of all slashes.</a><br />
    Now, I got what I need.<br />
    No <a href="http://phpsecurity.org/contents#ch06">traversing my filesystem</a> when you ain't supposed to be.<br />
    That's how it is <a href="http://nexdot.net/blog/2008/09/15/ruby-on-fails-story-and-stickers/">rolling with PHP</a>.<br />
    All the <a href="http://phpwomen.org/">hot chicks</a>, yeah, they love PHP.<br />
    (It's so true.)<br />
    (Oh yeah, that's what I'm talking about.)
  </p>
  <p>
    [chorus]
  </p>
  <p>
    (Yo, yo, <a href="http://php.net/ftell">tell</a> 'em about it.)
  </p>
  <p>
    <a href="http://php.net/history">PHP: Hypertext Preprocessor</a>.<br />
    It's <a href="http://php.net/is_real">real</a> out here.<br />
    Somebody better <a href="http://php.net/call_user_func">call</a> the <a href="http://modsecurity.org/">mod_security</a> <a href="http://ivanristic.com/">officer</a>.<br />
    My concern is for those <a href="http://terrychay.com/article/is-ruby-the-dog-and-php-the-dogfood.shtml">weak half-assed scripting languages</a>.<br />
    The ones that can't hang with us.<br />
    It's strange, but they <a href="http://packetstormsecurity.org/0910-advisories/dsa-1905-1.txt">get hanged</a> and <a href="http://tiobe.com/index.php/content/paperinfo/tpci/">remain in dust</a>.<br />
    Some <a href="http://shiflett.org/blog/2008/aug/end-of-life-for-php-4">aren't quite dead</a> and still remain a <a href="http://java.sun.com/developer/technicalArticles/xml/webservices/">pain to us</a>.
  </p>
  <p>
    PHP's got more muscle.<br />
    <a href="http://oreilly.com/catalog/9780596100674">In a nutshell</a>, nothing's quite <a href="http://php.net/language.operators.comparison">like</a> it.
  </p>
  <p>
    Predicted by the <a href="http://toys.lerdorf.com/">ancient cultures</a> and the <a href="http://zend.com/">psychics</a>.<br />
    The ones who dreamt in <a href="http://php.net/class.recursiveiteratoriterator">recursive</a> states.<br />
    <a href="http://php.net/language.operators.errorcontrol">Whispering</a> premonitions of <a href="http://php.net/license/">open source</a> <a href="http://schlueters.de/">community gates</a>.<br />
    PHP.
  </p>
  <p>
    (Oh yeah...)
  </p>
  <p>
    [chorus]
  </p>
</blockquote>
<p>
  If you're curious to learn more, you're in luck. Sean and <a href="http://blog.preinheimer.com/">Paul Reinheimer</a> will be interviewing Lee for a future episode of <a href="http://piqueweb.net/">Pique Web</a>, their new podcast on PHP and related web technologies.
</p>
<p>
  Oh yeah!
</p>
<p>
  Thu, 05 Aug 2010 14:31 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: Auto Increment with MongoDB</title>
		<link>http://shiflett.org/blog/2010/jul/auto-increment-with-mongodb</link>
		<pubDate>Thu, 29 Jul 2010 14:52:18 -0500</pubDate>
		<guid>http://shiflett.org/blog/2010/jul/auto-increment-with-mongodb</guid>
		<content:encoded><![CDATA[	<p>
  <a href="http://analog.coop/">We</a> are currently working on an app that uses a number of technologies, including PHP, Python, and <a href="http://mongodb.org/">MongoDB</a>. Recently, a need arose to use sequential identifiers for users, similar to an <code>auto_increment</code> column in MySQL.
</p>
<p>
  If you've used MongoDB, you might be familiar with the default behavior of using a <a href="http://en.wikipedia.org/wiki/Universally_unique_identifier">UUID</a> as the primary key. This is convenient, especially if you partition your database across servers, because you don't have to coordinate the primary key in any way. If you use sequential identifiers (as I demonstrate in this post), you can use multiple servers and interleave identifiers by advancing each server's sequence by the total number of servers. (For example, with two servers, advance each sequence by two, so one server generates even identifiers, and the other generates odd.)
</p>
<p>
  I'd rather not discuss the advantages and disadvantages of either approach, because it's exactly this debate that makes it very difficult to find any useful information on using sequential identifiers with MongoDB. Instead, I'm just going to explain how I did it, and hope this is helpful to someone. :-)
</p>
<p>
  First, create a sequence collection that you can use to determine the next identifier in the sequence. The following creates a collection called <code>seq</code> that has a single sequence in it (for <code>users</code>), but you can add as many as you need:
</p>
<pre>
<code>db.seq.insert({"_id":"users", "seq":new NumberLong(1)});</code>
</pre>
<p>
  If you assign <code>seq</code> to <code>1</code> instead of <code>new NumberLong(1)</code>, it will be interpreted as a float due to a JavaScript quirk.
</p>
<p>
  Before adding a new user, you need to increment the sequence by one and fetch the next identifier. Fortunately, the <a href="http://mongodb.org/display/DOCS/findandmodify+Command">findandmodify() command</a> provides an atomic way to do this. Using the MongoDB shell, the command would look something like this:
</p>
<pre>
<code>db.seq.findAndModify({</code>
<code>    query: {"_id":"users"},</code>
<code>    update: {$inc: {"seq":1}},</code>
<code>    new: true</code>
<code>});</code>
</pre>
<p>
  Because I'm using <a href="http://lithify.me/">Lithium</a>, I added a method for fetching the next identifier to my <code>User</code> model:
</p>
<pre>
<code>&lt;?php</code>
<code> </code>
<code>namespace appmodels;</code>
<code> </code>
<code>class User extends lithiumdataModel {</code>
<code> </code>
<code>    static public function seq() {</code>
<code>        $seq = static::_connection()-&gt;connection-&gt;command(</code>
<code>            array('findandmodify' =&gt; 'seq',</code>
<code>                  'query' =&gt; array('_id' =&gt; 'users'),</code>
<code>                  'update' =&gt; array('$inc' =&gt; array('seq' =&gt; 1)),</code>
<code>                  'new' =&gt; TRUE</code>
<code>            )</code>
<code>        );</code>
<code> </code>
<code>        return $seq['value']['seq'];</code>
<code>    }</code>
<code> </code>
<code>}</code>
<code> </code>
<code>?&gt;</code>
</pre>
<p>
  If you're not using Lithium, you can use the <a href="http://php.net/manual/en/class.mongodb.php">MongoDB class</a> to execute a <a href="http://php.net/manual/en/mongodb.command.php"><code>command()</code></a>.
</p>
<p>
  With this in place, adding a new user is a simple process. I create an array called <code>$data</code> with everything I want to store for a user, and then do the following:
</p>
<pre>
<code>&lt;?php</code>
<code> </code>
<code>$user = User::create($data);</code>
<code>$user-&gt;_id = User::seq();</code>
<code>$success = $user-&gt;save();</code>
<code> </code>
<code>?&gt;</code>
</pre>
<p>
  This example should be easy to adapt to any environment. Once you have the next identifier in the sequence, you simply store it as you would any other data.
</p>
<p>
  I hope to blog more about both MongoDB and Lithium. As these technologies are still pretty new to me, please feel free to point out any improvements. I'll update the post accordingly.
</p>
<p>
  Thu, 29 Jul 2010 19:52 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: Change Blindness and Zooming Out</title>
		<link>http://shiflett.org/blog/2010/jun/change-blindness-and-zooming-out</link>
		<pubDate>Wed, 30 Jun 2010 17:12:40 -0500</pubDate>
		<guid>http://shiflett.org/blog/2010/jun/change-blindness-and-zooming-out</guid>
		<content:encoded><![CDATA[	<p>
  <a href="http://flickr.com/photos/shiflett/4693037840"><img src="http://shiflett.org/img/dpc10.jpg" alt="Change Blindness Experiment at the Dutch PHP Conference" /></a>
</p>
<p>
  Two weeks ago, I had the great honor of giving a keynote at the <a href="http://phpconference.nl/">Dutch PHP Conference</a>. Because I had never been to Amsterdam or to the Dutch PHP Conference, I was really excited to have a chance to speak there. It was also an opportunity to give my favorite talk to a new audience.
</p>
<p>
  On the morning of the keynote, I followed along with conference organizer <a href="http://lornajane.net/">Lorna Mitchell</a> to the RAI Center where the conference was being held. As soon as I saw the stage, I smiled. Not only would I be able to stand on a stage unobstructed by a podium or any other obstacle, the seats were arranged <a href="http://en.wikipedia.org/wiki/Stadium_seating">like a theater</a>, making it easier to connect with the audience. (Conference organizers, please take note.)
</p>
<p>
  It was lucky that I arrived early to test the video and audio. If you own a MacBook Pro, you may or may not know that it puts the sound card to sleep if it has been unused for a few minutes. (If you use headphones, you can hear when it sleeps and awakes.) When you're connected to a massive sound system for a theater, this behavior creates a really horrible noise. The solution I came up with was to play iTunes the entire time with the iTunes volume control turned all the way down. Hopefully this trick will save someone else a lot of trouble. :-)
</p>
<p>
  As I began speaking, I noted that PHP had just turned 15 years old. Years ago, the community was energized by all of the misinformation being spread about PHP. It doesn't scale. It's insecure. It's not maintainable. When I began speaking about security, it was partly in response to some of this. I wanted to educate developers, so that we would not only take responsibility for the security of our apps, but also so that we could avoid the most common and dangerous security problems.
</p>
<p>
  These days, petty insults probably continue in the comments on <a href="http://digg.com/">Digg</a> or <a href="http://news.ycombinator.com/">Hacker News</a>, but no one takes them too seriously. Can PHP scale? Well, the biggest and most popular sites on the Web all use PHP, so I guess so. With no misinformation to energize us, it can easily seem like the PHP community has lost its luster. Not so.
</p>
<p>
  In my talk, <a href="http://slideshare.net/shiflett/securitycentered-design">Security-Centered Design</a>, I suggest we take a lesson from the design community, where user experience takes priority. We must evolve, or as <a href="http://aralbalkan.com/">Aral Balkan</a> puts it:
</p>
<blockquote>
  <p>
    The age of features is dead; welcome to the age of user experience.
  </p>
</blockquote>
<p>
  My talk revolves loosely around security, but it's really a call to arms for my developer peers to take a step back and consider the bigger picture. We need to zoom out. Sometimes, even with a subject as technical as security, the social elements of the problems we face are just as important as the technical. If we can't empathize with users, we can't be great developers.
</p>
<p>
  I want to thank everyone who took the time to say <a href="http://joind.in/talk/view/1550">nice things</a> about my talk. Hearing it described as the "best keynote I have ever seen" and the "highlight of the event" is really encouraging and makes it all worthwhile. I can't possibly thank you enough.
</p>
<p>
  I'll leave you with a little taste of the talk where I invite everyone to participate in a change blindness experiment. I may discuss <a href="http://en.wikipedia.org/wiki/Change_blindness">change blindness</a> and how it applies to the Web in more detail later, but for now, see if you can spot the difference in the two photos I used in the <a href="http://vimeo.com/12995367">change blindness video</a> I created for this talk.
</p>
<p>
  Thanks again to everyone who woke up early after a late night at the conference social to see me speak, and I hope to see you again sometime. :-)
</p>
<p>
  Wed, 30 Jun 2010 22:12 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: URL Sentences</title>
		<link>http://shiflett.org/blog/2010/may/url-sentences</link>
		<pubDate>Mon, 31 May 2010 15:14:06 -0500</pubDate>
		<guid>http://shiflett.org/blog/2010/may/url-sentences</guid>
		<content:encoded><![CDATA[	<p>
  Two and a half years ago, I was helping <a href="http://jontangerine.com/">Jon Tan</a> redesign a web site. We share an affinity for organization and structure, but we also like to experiment with new ideas.
</p>
<p>
  One morning via <a href="http://skype.com/">Skype</a>, I shared a crazy idea that I wasn't entirely sure of yet, trusting Jon to tell me if it was a bad idea.
</p>
<blockquote>
  <p>
    What if we make every URL a sentence?
  </p>
</blockquote>
<p>
  Before he could respond, I pasted in some examples I had been playing with to help clarify what I meant:
</p>
<ul>
  <li>
    <code>/is</code> (About)
    <ul>
      <li>
        <code>/is/here</code> (Contact)
      </li>
      <li>
        <code>/is/hiring</code>
      </li>
      <li>
        <code>/is/chris-shiflett</code>
      </li>
    </ul>
  </li>
  <li>
    <code>/does</code> (Work)
    <ul>
      <li>
        <code>/does/web-design</code>
      </li>
    </ul>
  </li>
  <li>
    <code>/helps</code> (Clients)
    <ul>
      <li>
        <code>/helps/digg</code>
      </li>
    </ul>
  </li>
  <li>
    <code>/thinks</code> (Planet)
    <ul>
      <li>
        <code>/thinks/about</code> (Tags)
      </li>
      <li>
        <code>/thinks/about/oscon</code>
      </li>
    </ul>
  </li>
  <li>
    <code>/remembers</code> (Timeline)
    <ul>
      <li>
        <code>/remembers/2008</code> (Archive)
      </li>
    </ul>
  </li>
  <li>
    <code>/writes</code> (Books)
    <ul>
      <li>
        <code>/writes/essential-php-security</code>
      </li>
      <li>
        <code>/writes/http-developers-handbook</code>
      </li>
    </ul>
  </li>
  <li>
    <code>/has</code> (Site Map / Search)
    <ul>
      <li>
        <code>/has?php</code>
      </li>
      <li>
        <code>/has/colophon</code>
      </li>
      <li>
        <code>/has/accessibility</code>
      </li>
    </ul>
  </li>
  <li>
    <code>/shares</code> (Feeds)
    <ul>
      <li>
        <code>/shares/news</code>
      </li>
      <li>
        <code>/shares/planet</code>
      </li>
      <li>
        <code>/shares/everything</code>
      </li>
    </ul>
  </li>
  <li>
    <code>/presents</code> (Talks)
  </li>
</ul>
<p>
  These URLs still adhere to a basic — albeit shallow — hierarchy to help keep things organized, but instead of the usual <em>about</em>, <em>work</em>, and <em>clients</em>, I used verbs like <em>is</em>, <em>does</em>, and <em>helps</em>. I was pleasantly surprised to hear Jon liked the idea. He noted some limitations, like the challenge of avoiding awkward wording when the hierarchy was deep, but he thought it was worth trying to map out the entire site to see if we could make it work.
</p>
<p>
  Because <a href="http://omniti.com/">the site</a> was fairly small, it turned out well. As I <a href="http://shiflett.org/blog/2008/mar/urls-can-be-beautiful">noted previously</a>, this approach isn't appropriate for all sites, but it can give URLs a voice of their own. (I don't use URL sentences on <a href="http://shiflett.org/">shiflett.org</a>.) It can also help you organize your pages. For example, if a page can't fit neatly into a sentence that starts with <em>example.org is...</em>, then it probably doesn't belong in the about section of the <em>example.org</em> site.
</p>
<p>
  There are other ways to make sentences with URLs, especially if your domain name <a href="http://google.com/">can be used as a verb</a>. And you don't mind. :-) Using verbs (present tense) as the top-level hierarchy is just one example.
</p>
<p>
  There have been other uses of URL sentences over the years:
</p>
<ul>
  <li>Jon collaborated with <a href="http://accessibility.co.uk/">Jon Gibbins</a> on a really neat site for <a href="http://accessibility.co.uk/">Denna Jones</a> that uses URL sentences and other interesting <a href="http://dennajones.com/colophon">innovations</a>. (Pages like the colophon do not, but the primary ones do.)
  </li>
  <li>
    <a href="http://clearleft.com/">Clearleft</a> use URL sentences in their latest redesign. Paul Lloyd discusses this and more in a <a href="http://paulrobertlloyd.com/2009/12/urls_matter">related post about URLs</a>.
  </li>
  <li>
    <a href="http://pixeldiva.co.uk/">Ann McMeekin</a> cleverly uses URL sentences to indicate categories for her blog. Some posts she <em>considers</em>; others she <em>shares</em>. A full list of categories is available in the sidebar.
  </li>
  <li>
    <a href="http://fictivecameron.com/">Cameron Koczon</a> used URL sentences when redesigning <a href="http://jessicahische.com/">Jessica Hische</a>'s site. She chose verbs like <em>typographizes</em> and <em>designifies</em> to add a bit of her personality to the mix.
  </li>
  <li>
    <a href="http://martin-geber.com/">Martin Geber</a> used past tense verbs as his top-level hierarchy, creating URLs that align with the idea that his site is a personal archive of thoughts, memories, and the like. He <a href="http://martin-geber.com/thought/2008/11/23/new-website/#inspiration">writes more about the inspiration for the site</a>. Thanks for the nod, Martin!
  </li>
  <li>
    <a href="http://kernpunkt.de/">Kernpunkt</a> gives a German interpretation of URL sentences. This is the only non-English example I've seen.
  </li>
  <li>There are some examples of URL sentences being used to add a bit of flavor to an existing site without reorganizing everything. Adrian Sevitz pointed me to <a href="http://vzaar.com/is/adrian_sevitz">his company's site</a> as one such example.
  </li>
</ul>
<p>
  I'm really happy to see other people embracing URL sentences and adding their own creativity, personality, and style. If the idea makes sense for a site you're making, please let me know, and I'll add your example as an update or comment to this post.
</p>
<p>
  If making sentences out of your URLs makes you smile or makes your work more fun, you should definitely do it. The best sites are the ones we make while having fun. :-)
</p>
<p>
  Mon, 31 May 2010 20:14 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: CSS Naked Day</title>
		<link>http://shiflett.org/blog/2010/apr/css-naked-day</link>
		<pubDate>Thu, 08 Apr 2010 16:50:42 -0500</pubDate>
		<guid>http://shiflett.org/blog/2010/apr/css-naked-day</guid>
		<content:encoded><![CDATA[	<p>
  Where did my design go? For the fourth consecutive year (<a href="http://shiflett.org/blog/2007/apr/my-first-css-naked-day">2007</a>, <a href="http://shiflett.org/blog/2008/apr/css-naked-day">2008</a>, <a href="http://shiflett.org/blog/2009/apr/css-naked-day">2009</a>), I'm participating in <a href="http://naked.dustindiaz.com/">CSS Naked Day</a>.
</p>
<p>
  The <a href="http://naked.dustindiaz.com/">CSS Naked Day</a> site has not been updated, but this year's CSS Naked Day is Fri, 09 Apr 2010. I'm a bit late, but the "day" officially lasts two days to account for time zone differences.
</p>
<p>
  As I <a href="http://shiflett.org/blog/2009/apr/css-naked-day">mentioned last year</a>:
</p>
<blockquote>
  <p>
    You have to look beyond the surface to truly appreciate good design, so participating in CSS Naked Day does more to show off my design than to hide it.
  </p>
</blockquote>
<p>
  This is a chance to discuss improvements that need to be made to this site or any other. If you spot anything I could improve to better adhere to <a href="http://webstandards.org/">web standards</a> or <a href="http://accessibility.co.uk/">accessibility</a> guidelines, please do let me know.
</p>
<p>
  Join me, and show your support for web standards!
</p>
<p>
  Thu, 08 Apr 2010 21:50 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: Webstock</title>
		<link>http://shiflett.org/blog/2010/feb/webstock</link>
		<pubDate>Fri, 12 Feb 2010 18:58:44 -0600</pubDate>
		<guid>http://shiflett.org/blog/2010/feb/webstock</guid>
		<content:encoded><![CDATA[	<p>
  I've been speaking at conferences since 2003, but I've never been as excited about a conference as I am about <a href="http://webstock.org.nz/">Webstock</a>. I remember discussing it at the first <a href="http://en.wikipedia.org/wiki/Kiwi_Foo_Camp">Kiwi Foo Camp</a> with <a href="http://webstock.org.nz/about/">Natasha Lampard</a> and a few others. I liked the name — I <em>love</em> wordplay — and her enthusiasm was infectious; she wanted to make Webstock extraordinary.
</p>
<p>
  The first Webstock took place just a year prior to that impromptu discussion, and it has quickly become the top web conference around. I first began to realize what a big deal Webstock was when Nat Torkington had <a href="http://twitter.com/gnat/status/715499122">this</a> to say about it:
</p>
<blockquote>
  <p>
    Back home safe, utterly exhausted after Webstock. Best. Conference. Evar.
  </p>
</blockquote>
<p>
  For those who don't know Nat, he ran <a href="http://en.oreilly.com/oscon">OSCON</a> — usually my favorite conference each year — for a decade. He has also been heavily involved in lots of other <a href="http://conferences.oreilly.com/">O'Reilly conferences</a>, including <a href="http://en.wikipedia.org/wiki/Unconference">unconferences</a> like <a href="http://en.wikipedia.org/wiki/FooCamp">Foo Camp</a> and Kiwi Foo Camp. For him to call Webstock the best conference ever is really saying something.
</p>
<p>
  Fast forward to today. I'm sitting in a Starbucks in Los Angeles. The new Vampire Weekend album is playing. 16 hours ago, I began my journey to Wellington, New Zealand, and in another 20 hours, I will land there. (This journey will take a full day and a half.) I've been busy with a really exciting <a href="http://analog.coop/">Analog</a> project lately, so I haven't blogged about Webstock yet. If you haven't <a href="https://webstock10.lilregie.com/">registered</a>, you should hurry. They were almost sold out a few days ago, so it might already be too late. If you're lucky enough to be going, I hope you'll say hello.
</p>
<p>
  I'm giving a workshop called <a href="http://webstock.org.nz/10/programme/workshops.php#shiflett">Evolution of Web Security</a> that combines some of my previous talks with some new material, covering the security spectrum from old to new, technical to social:
</p>
<blockquote>
  <p>
    This is a multi-faceted workshop that explores new concepts in web security. After a solid grounding in well-known exploits like cross-site scripting (XSS) and cross-site request forgeries (CSRF), I'll demonstrate how traditional exploits are being used together and with other technologies like Ajax to launch sophisticated attacks that penetrate firewalls, target users, and spread like worms. I'll then discuss some ideas for the future, such as evaluating trends to identify suspicious activity and understanding human tendencies and behavior to help provide a better, more secure user experience.
  </p>
</blockquote>
<p>
  I'm also giving a talk called <a href="http://webstock.org.nz/10/programme/presentations.php#shiflett">Security-Centered Design</a> that focuses and expands on some of the material from the workshop:
</p>
<blockquote>
  <p>
    Security is more than filtering input and escaping output (FIEO), and it's more than cross-site scripting (XSS) and cross-site request forgeries (CSRF). Security isn't even always black and white. In order to create a more secure user experience, we need to understand how people think. Perception is as important as reality, and meeting user expectations is a fundamental of good security. In this multifarious talk, I'll explore topics such as change blindness and ambient signifiers, and I'll show some real-world examples that demonstrate the profound impact human behavior can have on security.
  </p>
</blockquote>
<p>
  I gave this talk a few times in 2009, and I have updated it for 2010. Although the technical-to-social shift of web security isn't a topic that's being talked about that much yet, the transition is evident in a lot of recent activity, including solutions like <a href="http://oauth.net/">OAuth</a> and <a href="http://developers.facebook.com/connect.php">Facebook Connect</a>. We need more people thinking about how to solve evolving technical and social problems. I don't pretend to have all the answers, but I hope this talk can be a catalyst for more awareness and discussion.
</p>
<p>
  Webstock, here I come!
</p>
<p>
  Sat, 13 Feb 2010 00:58 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: 2009 Highlights</title>
		<link>http://shiflett.org/blog/2010/jan/2009-highlights</link>
		<pubDate>Thu, 14 Jan 2010 22:16:20 -0600</pubDate>
		<guid>http://shiflett.org/blog/2010/jan/2009-highlights</guid>
		<content:encoded><![CDATA[	<p>
  I'm a bit delinquent, but this is my first post of the year, and sticking with tradition, it's a chance for me to record highlights from the previous year. This is my seventh consecutive year doing this; it's hard to believe I've been blogging consistently for that long.
</p>
<p>
  I used to speak at more than a dozen conferences each year, and it negatively affected the quality of my talks and the quality of my life. My speaking schedule for 2009 was much better:
</p><a href="http://phpconference.co.uk/">PHP UK</a> I gave the last talk at PHP UK, and although it wasn't considered a keynote, it sure felt like one. It was one of my favorite talks for numerous reasons. I had just spent a few hours drinking Persian tea in the sun at a café with <a href="http://jontangerine.com/">Jon</a> and <a href="http://accessibility.co.uk/">Jon</a>, so I was both relaxed and energized. The stage had no podium, so I felt very connected to the audience. (It also helped that the auditorium was shaped like a bowl.) The <a href="http://joind.in/talk/view/166">feedback</a> was also extremely kind; people thought the talk was <a href="http://twitter.com/dannymekic/statuses/1259834628">inspiring</a>, <a href="http://twitter.com/robsworder/statuses/1259712137">even better than expected</a>, <a href="http://twitter.com/BillStegers/statuses/1258916473">mind boggling</a>, and <a href="http://twitter.com/noginn/statuses/1259376346">the highlight of the conference</a>. (One person even suggested it <a href="http://twitter.com/symphonicknot/statuses/1258816087">saved the conference</a>.) Perhaps more surprising than the quality of the feedback was the quantity, thanks mostly to the ubiquity of <a href="http://twitter.com/">Twitter</a>. To those who said nice things, thank you so much. It really helped lift my spirits. I capped off my visit to London with <a href="http://flickr.com/photos/shiflett/3322815888">an Arsenal match</a>. (It was yet another draw; they're doing much better this season.) <a href="http://conf.phpquebec.org/">PHP Québec</a> Almost immediately after returning from the UK, I was off to Montréal for the annual PHP Québec conference, one of my favorites. I enjoyed all the usual delights, including viande fumée at <a href="http://schwartzsdeli.com/">Schwartz's</a>. I was very happy to be giving the closing keynote, and even happier about how many people were there and all of the nice feedback on Twitter and elsewhere. I managed to get a <a href="http://flickr.com/photos/shiflett/3339750921">photo of the audience participating in a change blindness experiment</a>, which I later used in a change blindness demonstration, just to be meta. :-) <a href="http://tek.phparch.com/">php|tek</a> The annual php|tek conference was back in Rosemont (not too far from Chicago), and it was every bit as fun as expected. I was able to celebrate my birthday at the <a href="http://maproom.com/">Map Room</a>, where <a href="http://seancoates.com/">Sean</a> played beer host, and everyone had a great time. (I know I did.) I also managed to make it downtown, where I tried <a href="http://en.wikipedia.org/wiki/Chicago-style_pizza">Chicago-style pizza</a> for the first time. It was pretty good, but it just can't compete with <a href="http://en.wikipedia.org/wiki/New_York-style_pizza">New York-style pizza</a>. (I still love going to <a href="http://en.wikipedia.org/wiki/Grimaldi%27s_Pizzeria">Grimaldi's</a> for lunch when the line's short.) My talk was a big hit as well, but I didn't have quite as much energy as when I gave it at PHP UK. <a href="http://en.oreilly.com/oscon2009">OSCON</a> San Jose is no Portland, and that one fact made this OSCON a little underwhelming. It has often been my favorite conference of the year, but not this year. Luckily, <a href="http://zmievski.org/">Andrei</a> convinced <a href="http://helgi.ws/">Helgi</a>, <a href="http://jontangerine.com/">Jon</a>, <a href="http://seancoates.com/">Sean</a>, and me to stay in San Francisco. As a result, some of my best memories were of places like <a href="http://samovarlife.com/">Samovar</a>, <a href="http://21st-amendment.com/">21st Amendment</a>, and <a href="http://russianriverbrewing.com/">Russian River</a>. In the evenings, I learned a lot about <a href="http://en.wikipedia.org/wiki/Grid_%28page_layout%29">grids</a>, <a href="http://en.wikipedia.org/wiki/Leading">leading</a>, and <a href="http://webtypography.net/Rhythm_and_Proportion/Vertical_Motion/2.2.2/">vertical rhythm</a> from Jon while watching him prepare <a href="http://slideshare.net/jontangerine/grokkin-design">his talk</a>. The <a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8466">tutorial</a> I gave with Sean went really well, although it was a little rough around the edges, and <a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8397">my talk</a> was a big hit. A big thanks to <a href="http://en.oreilly.com/oscon2009/profile/25433">Chris Sontag</a> for saying it was "by far one of the top three talks" of the conference. :-) <a href="http://cw.mtacon.com/">CodeWorks</a> My last conference of 2009 was actually four conferences, because I participated in a traveling conference called CodeWorks that visited seven cities. (I spoke at the last four.) Atlanta, Miami, Washington, and New York each have their own memories. I received more feedback on <a href="http://joind.in/">Joind.in</a> than Twitter during CodeWorks, which is a testament to the fine work of <a href="http://blog.phpdeveloper.org/">Chris Cornutt</a>, who has been making it better and better over time. (It's a speaker feedback site.) Aside from some really good talks, one of my favorite memories of CodeWorks was sitting outside in Miami enjoying cigars, mojitos, and conversation with fellow speakers. My favorite stop was New York, of course, where I played tour guide for as many people as possible. I also organized a <a href="http://shiflett.org/blog/2009/oct/codeworks-and-beer-table">beer dinner at Beer Table</a> to cap off the conference. It was a fantastic night with great food, great beer, and great friends.
<p>
  Here's a brief list of other highlights:
</p>
<ul>
  <li>Sean and I <a href="http://shiflett.org/blog/2009/mar/smashing-php">wrote an article</a> for <a href="http://smashingmagazine.com/">Smashing Magazine</a>.
  </li>
  <li>I participated in <a href="http://naked.dustindiaz.com/">CSS Naked Day</a> for a <a href="http://shiflett.org/blog/2009/apr/css-naked-day">third time</a>.
  </li>
  <li>I was <a href="http://developers.slashdot.org/article.pl?sid=09/04/12/1834205">Slashdotted</a> for the seventh time.
  </li>
  <li>I <a href="http://www.flickr.com/photos/tags/landice">visited Iceland</a> for the first time with my friends Andrei and Helgi.
  </li>
  <li>I <a href="http://shiflett.org/blog/2009/jul/goodbye-omniti">left OmniTI</a> and started a much-needed period of renewal, also known as funemployment.
  </li>
  <li>I moved my office to a shared working space in Dumbo — Studio 612A — with the <a href="http://twitter.com/shiflett/studio612a">world's best studio mates</a>.
  </li>
  <li>Sean and I pulled off another <a href="http://phpadvent.org/2009">PHP Advent</a>, an annual PHP tradition since 2007.
  </li>
</ul>
<p>
  The highlight of the year for me was <a href="http://shiflett.org/blog/2009/dec/hello-analog">announcing Analog</a>. I still can't believe how supportive everyone has been, and I can't thank you all enough. You can tell there's a lot of excitement and energy in the air as we enter 2010, and I hope Analog is a big part of all of the good things to come.
</p>
<p>
  Keeping with tradition, here's a list of things I hope to accomplish in 2010:
</p>Speak at better conferences I'm cheating a bit, because I'm already scheduled for <a href="http://en.wikipedia.org/wiki/Kiwi_Foo_Camp">Kiwi Foo Camp</a>, <a href="http://webstock.org.nz/">Webstock</a>, <a href="http://confoo.ca/en">ConFoo</a>, and <a href="http://sxsw.com/interactive">South by Southwest</a>. If I speak at no other conferences, this is already going to be a landmark year for me. I hope to one day become one of the top speakers at web conferences, and speaking at fewer, better conferences should give me the opportunity to make progress toward that goal. Make something I like to learn and share what I learn, so I do a lot of writing and speaking. I want to continue doing that, but I want to also find time to make something. I'm very lucky to be working with great friends at <a href="http://analog.coop/">Analog</a>, and because this is one aspiration we all share, I have high hopes. :-) Work on my blog This is a minor goal, but I want to spend some time fixing a few old bugs in my blog, including a finicky OpenID implementation. (If you try to comment with OpenID and have trouble, please try posting without it, and sorry for the hassle.) Publish more During 2009, I wrote one article and a handful of blog posts each month. I try to always be very respectful to my readers, so I only post to my blog when I think I have something interesting to say. (Posting highlights each year might be an exception!) 2009 was a tough year for many reasons, and my inspiration suffered. I'm already excited about 2010, and I hope to blog much more. I also have a growing list of ideas for articles.
<p>
  Thanks very much for reading, and I hope you have a wonderful 2010.
</p>
<p>
  Fri, 15 Jan 2010 04:16 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: Hello, Analog</title>
		<link>http://shiflett.org/blog/2009/dec/hello-analog</link>
		<pubDate>Thu, 31 Dec 2009 17:31:39 -0600</pubDate>
		<guid>http://shiflett.org/blog/2009/dec/hello-analog</guid>
		<content:encoded><![CDATA[	<p>
  <img src="http://shiflett.org/img/418-analog-logotype.gif" alt="Analog" />
</p>
<p>
  A few months ago, I was on top of the world. The place was called Sjónarsker, and the view was <a href="http://twitter.com/shiflett/status/2193177218">breathtaking</a>. It was the third day of a <a href="http://flickr.com/photos/shiflett/tags/landice">road trip around Iceland</a> with my friends <a href="http://zmievski.org/">Andrei</a> and <a href="http://helgi.ws/">Helgi</a>, and I had just shared some big news with them. I was <a href="http://shiflett.org/blog/2009/jul/goodbye-omniti">leaving my former company</a> and starting something new.
</p>
<p>
  They wanted to know what I would be doing next, and although I didn't know, I did have an answer. "Good people. Good work." These four words became a personal mission statement in the months that followed — something to provide focus and clarity.
</p>
<p>
  Good people and good work go hand in hand. I remember how much I enjoyed working with <a href="http://jontangerine.com/">Jon Tan</a> and <a href="http://accessibility.co.uk/">Jon Gibbins</a> a few years ago when <a href="http://shiflett.org/blog/2007/mar/a-new-beginning">redesigning my blog</a>. The experience is perhaps best remembered with a <a href="http://gr0w.com/articles/work/shiflettorg_design/">comment</a> I made shortly after we finished:
</p>
<blockquote>
  <p>
    Working with both Jon Tan and Jon Gibbins was a joy; not only do they possess the skills necessary to shape ideas and bring them to life, but their rich personalities and keen sense of humor makes the entire process a lot of fun.
  </p>
</blockquote>
<p>
  Good work isn't work; it's fun. To do our best work, we need to love what we do. We need to surround ourselves with good people who appreciate good work. We need the freedom to break boundaries. We need to be inspired. Above all else, we need to be <em>happy</em>.
</p>
<p>
  I'm <em>very</em> happy to introduce <a href="http://analog.coop/">Analog</a>, a co-operative of web designers and developers:
</p>
<blockquote>
  <p>
    Analog is a company of friends who make web sites. It's a co-operative where imagination, design, and engineering thrive; good people doing good work.
  </p>
</blockquote>
<p>
  Allow me to introduce you to my friends.
</p><a href="http://alancolville.org/about/">Alan Colville</a> Alan is a user experience designer who has been making the Web a better place for more than a decade, helping companies like BlackBerry, Vodafone, and Visa. Although his professional experience is impressive, we're more impressed by his achievements on a bicycle, like being the runner-up at the <a href="http://bike-fest.com/cheddar/">Kona Cheddar Bikefest</a> 2009. <a href="http://zmievski.org/about/">Andrei Zmievski</a> Andrei is one of the best developers I know, and if you use PHP, chances are you've encountered his work. He's a member of the <a href="http://php.net/credits.php">PHP Group</a>, started <a href="http://gtk.php.net/">PHP-GTK</a>, helped create <a href="http://smarty.net/">Smarty</a>, and is the architect of the Unicode and internationalization support in PHP 6. In fact, when <a href="http://news.cnet.com/2100-1023-963937.html">Yahoo switched to PHP</a>, they hired Andrei. He's also a talented photographer and brewer, and 100 days from now, he'll be running the <a href="http://parismarathon.com/">Marathon de Paris</a>. <a href="http://accessibility.co.uk/about/">Jon Gibbins</a> Jon, also known as Gibbo or the Prince of Kindness, is a multi-talented web developer and accessibility aficionado who has helped companies like Travelodge and National Geographic. His mastery of HTML, CSS, JavaScript, and PHP is truly inspiring. On occasion, he suspends his kindness long enough to play a mean guitar. <a href="http://jontangerine.com/about/">Jon Tan</a> Jon is the best designer I know. I first encountered his work long before I knew him as a person, and I still feel extremely lucky to know him. His love of typography is evident in all of his work, and he's one of the only members of the <a href="http://istd.org.uk/">International Society of Typographic Designers</a> who focus on typography for the Web. He's also a former journeyman in the Guild of Indian Ocean Octopus Fishermen. I'm pretty sure the guild is made up, but the stories are real. :-)
<p>
  <a href="http://en.wikipedia.org/wiki/Co-operative">Co-operatives</a> are organizations that adhere to the <a href="http://ica.coop/coop/principles.html">co-operative principles</a>. <a href="http://jontangerine.com/log/2009/12/introducing-analog">Jon's description</a> of his personal values — values we all share — helps explain what we're about:
</p>
<blockquote>
  <p>
    I believe that everyone working on a project should profit equitably from it according to the scope of their participation. I believe we should have the right to claim our own work irrevocably, without suffering the indignity of being white-labelled. (It still happens.) I believe that working for nothing in order to secure clients is daft, and reject the notion that designing "on spec" has any benefit whatsoever for anyone involved. I believe that if democracy and freedom are important to us, then they shouldn't be signed away when we take a job.
  </p>
</blockquote>
<p>
  Being a co-operative is an important part of who we are. This is why we proudly use <a href="http://analog.coop/">analog.coop</a> as our all-important online identity. It's also why we're an <a href="http://en.wikipedia.org/wiki/Industrial_and_provident_society">industrial and provident society</a>, which is something I hope to tell you more about in the near future.
</p>
<p>
  Twitter seems to be the primary source of activity these days, so it felt natural to <a href="http://twitter.com/shiflett/status/6701022263">announce</a> Analog there, which we did just before Christmas. We're still a bit stunned by what happened next. <a href="http://tweetreach.com/">TweetReach</a> says news of our launch reached more than a quarter of a million people on Twitter in the first few days. The abundance of support and kindness has been both overwhelming and uplifting. To those of you who helped celebrate our launch, I can't <a href="http://twitter.com/analogcoop/thanks/members">thank you</a> enough.
</p>
<p>
  There's a lot more to talk about — <a href="http://phpadvent.org/2009/geoip-wrangling-by-andrei-zmievski">GeoIP wrangling</a>, Twitter integration, <a href="http://hashgrid.com/">#grid</a>, <a href="http://designinformer.com/the-wow-factor-in-web-design/">Easter eggs</a>, &amp;c. — but I'll save those topics until I have more time.
</p>
<p>
  For now, I just want to wish you a very happy new year! :-)
</p>
<p>
  Thu, 31 Dec 2009 23:31 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>
<item>
		<title>Chris Shiflett: PHP Advent 2009</title>
		<link>http://shiflett.org/blog/2009/dec/php-advent-2009</link>
		<pubDate>Tue, 01 Dec 2009 17:07:47 -0600</pubDate>
		<guid>http://shiflett.org/blog/2009/dec/php-advent-2009</guid>
		<content:encoded><![CDATA[	<p>
  With the help of <a href="http://seancoates.com/">Sean</a> and twenty-four fantastic authors from the PHP community, <a href="http://phpadvent.org/">PHP Advent</a> is back for a third year.
</p>
<p>
  <a href="http://paul-m-jones.com/">Paul</a> gets things started with an <a href="http://phpadvent.org/2009/comprehensible-code-by-paul-jones">article on comprehensible code</a>:
</p>
<blockquote>
  <p>
    Reading code is hard work. Here are some reasons why, along with some tips on how to make it easier for other developers to understand your code.
  </p>
</blockquote>
<p>
  Thanks to everyone who has helped <a href="http://backtype.com/connect/phpadvent.org/tweets">spread the love on Twitter</a> and elsewhere, and thanks especially to our authors.
</p>
<p>
  We've got a few surprises this year, so I hope you'll follow along. You can <a href="http://twitter.com/phpadvent">follow @phpadvent on Twitter</a>, <a href="http://feeds.feedburner.com/phpadvent">subscribe to our feed</a>, or just visit <a href="http://phpadvent.org/">phpadvent.org</a> for a daily dose of tips, tricks, and tidbits.
</p>
<p>
  You can also read previous PHP Advent articles if you haven't already:
</p>
<ul>
  <li>
    <a href="http://shiflett.org/blog/2007/dec">PHP Advent 2007</a>
  </li>
  <li>
    <a href="http://phpadvent.org/2008">PHP Advent 2008</a>
  </li>
</ul>
<p>
  In addition to <a href="http://phpadvent.org/">PHP Advent</a>, you might also be interested in <a href="http://24ways.org/">24 Ways</a>, an advent calendar for web geeks.
</p>
<p>
  <a href="http://en.wikipedia.org/wiki/Mele_Kalikimaka">Mele Kalikimaka</a>!
</p>
<p>
  Tue, 01 Dec 2009 23:07 GMT — <a href="http://shiflett.org/">Chris Shiflett’s Blog</a> <a href="http://shiflett.org/feeds/blog"><img src="http://shiflett.org/img/icon_feed_standard.gif" alt="Chris Shiflett’s Feed" /></a>
</p> ]]></content:encoded>
</item>


</channel>
</rss>
