<?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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Coffee on the Keyboard</title>
	<atom:link href="http://coffeeonthekeyboard.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://coffeeonthekeyboard.com</link>
	<description>Technical 2.0</description>
	<pubDate>Sun, 04 Jan 2009 04:50:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Stop Supporting IE6</title>
		<link>http://coffeeonthekeyboard.com/stop-supporting-ie6-163/</link>
		<comments>http://coffeeonthekeyboard.com/stop-supporting-ie6-163/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 18:04:35 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Design]]></category>

		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[enabling]]></category>

		<category><![CDATA[flaw]]></category>

		<category><![CDATA[Front-end]]></category>

		<category><![CDATA[out-of-date]]></category>

		<category><![CDATA[security]]></category>

		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=163</guid>
		<description><![CDATA[As a community, as a whole, web designers and developers need to stop supporting Internet Explorer 6. Now. Completely.
I&#8217;ve been thinking a lot about browser compatibility as I&#8217;ve been working on Today&#8217;s Meet. My CSS is valid, but it doesn&#8217;t work quite right in IE6. The interface is completely JavaScript-based, and will only become moreso [...]]]></description>
			<content:encoded><![CDATA[<p>As a community, as a whole, web designers and developers need to <strong>stop supporting Internet Explorer 6</strong>. Now. Completely.</p>
<p>I&#8217;ve been thinking a lot about browser compatibility as I&#8217;ve been working on <a href="http://todaysmeet.com/">Today&#8217;s Meet</a>. My CSS is valid, but it doesn&#8217;t work quite right in IE6. The interface is completely JavaScript-based, and will only become moreso in the future. How much time should I put into making it all work with IE6?</p>
<p><strong>None.<span id="more-163"></span><br />
</strong></p>
<p>I know lots of people, usually in government offices or schools, who are stuck with IE6. For some reason, their IT departments have neglected to update their systems for <em>over two years</em>.</p>
<p>(Sure, some of these systems are running <a href="http://www.betanews.com/article/Microsoft_No_IE7_for_Windows_2000/1117464807">Windows 2000</a>. This is a real minority at this point, though, and the rest have no excuse. If you&#8217;re running Windows 2000, and absolutely cannot afford to get new systems, get Firefox.)</p>
<p>I used to think I needed to support IE6 because this group is frighteningly large. But now I&#8217;ve come to realize—especially in the wake of <a href="http://voices.washingtonpost.com/securityfix/2008/12/microfot_emergency_patch_for_i.html?nav=rss_blog">this week&#8217;s news</a>—that by supporting IE6, all I&#8217;m really doing is enabling these lazy IT departments to keep running dangerously out-of-date software.</p>
<p>IE6 is the Vicodin to lazy IT&#8217;s <a href="http://en.wikipedia.org/wiki/Dr._Gregory_House#Character_biography">Dr. House</a>. As developers we&#8217;re Drs. <a href="http://en.wikipedia.org/wiki/James_Wilson_(House)">Wilson</a> and <a href="http://en.wikipedia.org/wiki/Lisa_Cuddy">Cuddy</a>. Just keep handing it out.</p>
<p>How up-to-date is the rest of the software on a system that (apparently) hasn&#8217;t run Windows Update in 2 years? What other major <a href="http://www.microsoft.com/security/malwareremove/default.mspx">security holes</a>, <a href="http://www.microsoft.com/enable/products/ie7/">accessibility issues</a>, and <a href="http://blogs.zdnet.com/web2explorer/?p=260">compatibility problems</a> would be solved by updating?</p>
<p>Not only is supporting IE6 annoying, it enables people to run software that is out-of-date and easily exploited. Are we really helping users, or are we just helping them get hacked?</p>
<p>So from now on, no more.</p>
<p>My personal projects will no longer support IE6. I won&#8217;t test in IE6.</p>
<p>IE7, Firefox 3, Safari 3, provisionally Opera (really, if it works in the first 3, it should work in Opera).  Keep your software up-to-date.</p>
<p>If you&#8217;re still using IE6, <a href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx">go get 7</a>. (Then don&#8217;t use it until after the Windows Update patch.)</p>
<p>If you can&#8217;t run updates, but can install software, <a href="http://www.mozilla.com/en-US/">go get Firefox</a>.</p>
<p>If you can&#8217;t do any of that, tell your IT department that running software 2 <em>years</em> out of date is unacceptable. Tell your boss to tell them. It&#8217;s a performance/security/accessibility/compatibility/etc issue.</p>
<p>And if you&#8217;re a developer, stop and think. Are you actually doing your visitors any good by supporting IE6? Or should you take all the time and effort you put into backwards compatibility and put it someplace more valuable?</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/stop-supporting-ie6-163/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Oh the Humanity (of Twitter)</title>
		<link>http://coffeeonthekeyboard.com/oh-the-humanity-of-twitter-155/</link>
		<comments>http://coffeeonthekeyboard.com/oh-the-humanity-of-twitter-155/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 00:15:24 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[Marketing]]></category>

		<category><![CDATA[Social Media]]></category>

		<category><![CDATA[bots]]></category>

		<category><![CDATA[human]]></category>

		<category><![CDATA[pr]]></category>

		<category><![CDATA[relations]]></category>

		<category><![CDATA[Social Networking]]></category>

		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=155</guid>
		<description><![CDATA[Twitter creates a powerful opportunity: no matter who you are, or how big your business, you can put a human &#8220;face&#8221; on Twitter.
Comcast (@comcastcares), JetBlue (@jetblue), Biggby Coffee (@biggbybob) and Starbucks (@starbucks), even Britney Spears (sorry, I refuse to link that one) have all shown up on Twitter with very real, human exchanges.
I&#8217;m not sure, [...]]]></description>
			<content:encoded><![CDATA[<p><a onclick="window.open(this.href, 'newwindow'); return false;" href="http://www.twitter.com/">Twitter</a> creates a powerful opportunity: no matter who you are, or how big your business, you can put a human &#8220;face&#8221; on Twitter.</p>
<p>Comcast (@<a href="http://twitter.com/comcastcares">comcastcares</a>), JetBlue (@<a href="http://twitter.com/jetblue">jetblue</a>), Biggby Coffee (@<a href="http://twitter.com/biggbybob">biggbybob</a>) and Starbucks (@<a href="http://twitter.com/starbucks">starbucks</a>), even Britney Spears (sorry, I refuse to link that one) have all shown up on Twitter with very real, human exchanges.</p>
<p>I&#8217;m not sure, behind the scenes, whether there are several people or one incredibly busy person at each of these companies, but they&#8217;ve decided to drop the corporate suit and engage their followers. They aren&#8217;t using Twitter as a broadcasting medium, but as a networking and conversation tool.</p>
<p>They <em>get it</em>.</p>
<p>Here is one of my favorite examples:</p>
<blockquote cite="http://twitter.com/threeofus/status/1000792408"><p><a href="http://twitter.com/threeofus/status/1000792408">threeofus:</a> @<a href="http://twitter.com/Starbucks">Starbucks</a> Who actually types the tweets for Starbucks?</p></blockquote>
<blockquote cite="http://twitter.com/Starbucks/status/1000851867"><p><a href="http://twitter.com/Starbucks/status/1000851867">Starbucks:</a> @<a href="http://twitter.com/threeofus">threeofus</a> Hi, I&#8217;m Brad, I work in the online team. How are you?</p></blockquote>
<p>So what&#8217;s the trick? What did Starbucks/Brad do right?</p>
<ul>
<li><strong>Use the First Person.</strong> &#8220;I,&#8221; &#8220;me,&#8221; &#8220;my,&#8221; all make your tweet feel more personal. No real surprise there. &#8220;We,&#8221; &#8220;us,&#8221; and &#8220;our&#8221; work, but not nearly as well. You sound like a spokesperson, instead of a person.</li>
<li><strong>Own the Conversation.</strong> By introducing and naming himself, Brad is taking ownership of the interaction. Even if Starbucks has 10 people reading and responding to tweets, threeofus can feel like she&#8217;s talking to one person.</li>
<li><strong>Engage.</strong> Read and respond to other users, especially @-replies. Read, retweet and share. If you&#8217;re only sending information one way, you aren&#8217;t part of the community. You can also use tools like <a href="http://search.twitter.com/">Twitter search</a> to find and respond to users talking about you or your company.</li>
<li><strong>Show Emotion. </strong>&#8220;This is so cool,&#8221; &#8220;Wow, long day&#8221; or even just &#8220;:-)&#8221; are all things that a person would say, but a press release never would. You don&#8217;t need to wear your heart on every tweet, but let some of your feelings come out—at least the good ones.</li>
<li><strong>Be Active.</strong> For most of us, Twitter is <a href="http://www.nytimes.com/2008/09/07/magazine/07awareness-t.html">ambient information</a>. You need to update regularly to get in to that stream.</li>
<li><strong>Don&#8217;t &#8220;Always Be Closing.&#8221;</strong> Don&#8217;t make every tweet a pitch or a request. That doesn&#8217;t mean you <em>can&#8217;t</em> pitch: I link my blog posts on Twitter, my friend @<a href="http://twitter.com/alecrj">alecrj</a> mentions his shows. But if every tweet sounds like an advertisement, then you sum up to an infomercial.</li>
</ul>
<p>Here&#8217;s a comparison: Lansing&#8217;s alternative paper recently started twittering at @<a href="http://twitter.com/CityPulse">CityPulse</a>. Right now, the biggest words in their tweet cloud are their URL, &#8220;city,&#8221; &#8220;pulse,&#8221; &#8220;check,&#8221; &#8220;out,&#8221; &#8220;pick,&#8221; and &#8220;up.&#8221; Every tweet is trying to drive me to their website or pick up a copy of the paper. They&#8217;ve sent no @ messages, used the word &#8220;I&#8221; once, and have gone a week at a time without updating.</p>
<p>And despite following almost 300 people, they&#8217;ve only got 100 followers.</p>
<p>This is what confuses traditional marketing about Twitter: <strong>the community won&#8217;t listen to you until you listen to the community.</strong></p>
<p>Of course, there are robots on Twitter, too, and some are very popular, like @<a href="http://twitter.com/nytimes">nytimes</a> and @<a href="http://twitter.com/BarackObama">BarackObama</a>. They are <em>broadcasters</em>, not community members. They perform very specific roles and are backed by very unique content. They add enough value that they don&#8217;t need to engage the community.</p>
<p>And yet, if they did, they would be even more powerful.</p>
<p>So do you and your company <em>get it?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/oh-the-humanity-of-twitter-155/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Responsible SQL: How to Authenticate Users</title>
		<link>http://coffeeonthekeyboard.com/responsible-sql-how-to-authenticate-144/</link>
		<comments>http://coffeeonthekeyboard.com/responsible-sql-how-to-authenticate-144/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 17:16:58 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[attack]]></category>

		<category><![CDATA[Back-end]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[injection]]></category>

		<category><![CDATA[security]]></category>

		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=144</guid>
		<description><![CDATA[Most SQL-injection articles set a horrible example for young programmers.
Here is a very typical &#8220;bad example&#8221; of why you need to escape user data before it goes into SQL queries:
(ed. The symbol « is a line break that’s not in the real code.)
$username = $_POST&#91;&#8216;username&#8217;&#93;; // username=admin
$password = $_POST&#91;&#8216;password&#8217;&#93;; // password=&#8217; OR 1=1; &#8212; &#8216;
$user [...]]]></description>
			<content:encoded><![CDATA[<p>Most SQL-injection articles set a horrible example for young programmers.</p>
<p>Here is a very typical &#8220;bad example&#8221; of why you need to escape user data before it goes into SQL queries:</p>
<p>(ed. The symbol « is a line break that’s not in the real code.)</p>
<div class="dean_ch" style="white-space: wrap;"><span class="re0">$username</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#8216;username&#8217;</span><span class="br0">&#93;</span>; <span class="co1">// username=admin</span><br />
<span class="re0">$password</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#8216;password&#8217;</span><span class="br0">&#93;</span>; <span class="co1">// password=&#8217; OR 1=1; &#8212; &#8216;</span></p>
<p><span class="re0">$user</span> = <span class="re0">$db</span>-&gt;<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT * FROM users WHERE «<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;username=&#8217;$username&#8217; AND «<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;password=&#8217;$password&#8217; LIMIT 1;&quot;</span><span class="br0">&#41;</span>;</div>
<p>The point, of course, is that you must sanitize your user input, or else this person would run this query:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="re0">$user</span> = <span class="re0">$db</span>-&gt;<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT * FROM users WHERE «<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;username=&#8217;admin&#8217; AND «<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;password = &#8221; OR 1=1; &#8212; &#8216; LIMIT 1;&quot;</span><span class="br0">&#41;</span>;</div>
<p>Which grants the sneaky user all your admin privileges. Other versions have nefarious users dropping your users or articles tables.</p>
<p>The problem is: this is the wrong way to authenticate users. These examples are written for beginners to understand the importance of sanitizing input, but they also provide a model to those beginners for how user authentication works. And it&#8217;s a very bad model.</p>
<p>This is a long one, more after the break.<span id="more-144"></span></p>
<p>The only upside to authenticating this way is that you don&#8217;t expose any information on failure, that is, if I&#8217;m trying to hijack someone&#8217;s account, I can&#8217;t tell the difference between an invalid user name and a valid user name with a bad password. That&#8217;s good, but there are good reasons not to do this at the database level.</p>
<p>The &#8220;correct&#8221; way is not much more complex. Basically:</p>
<ol>
<li>Look up the record with the <strong>username</strong> only.</li>
<li>Get the (hashed) password out of the database.</li>
<li>Hash the submitted password.</li>
<li>Compare the two hashes.</li>
</ol>
<p>This is really not very hard to implement. In PHP:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="coMULTI">/**<br />
&nbsp;* Check a password against the database<br />
&nbsp;*<br />
&nbsp;* @<a href="http://twitter.com/param">param</a> string $username The username to check<br />
&nbsp;* @<a href="http://twitter.com/param">param</a> string $password The (supposed) password<br />
&nbsp;* @<a href="http://twitter.com/return">return</a> int 0=success, 1=bad username, 2=bad password<br />
&nbsp;*/</span><br />
<span class="kw2">function</span> check_password <span class="br0">&#40;</span> <span class="re0">$username</span>, <span class="re0">$password</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$db</span> = <span class="kw2">new</span> mysqli<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// we need to talk to the DB</span></p>
<p>&nbsp; &nbsp; <span class="co1">// the real_escape_string() function is much better</span><br />
&nbsp; &nbsp; <span class="co1">// than add_slashes() for escaping MySQL database input</span><br />
&nbsp; &nbsp; <span class="re0">$_username</span> = <span class="re0">$db</span>-&gt;<span class="me1">real_escape_string</span><span class="br0">&#40;</span><span class="re0">$username</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="co1">// I try to make my SQL queries as easy to read</span><br />
&nbsp; &nbsp; <span class="co1">// as possible. (Not always very easy.)</span><br />
&nbsp; &nbsp; <span class="re0">$result</span> = <span class="re0">$db</span>-&gt;<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT password &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="st0">&quot;FROM users &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="st0">&quot;WHERE username = &#8216;{$_username}&#8217; &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="st0">&quot;LIMIT 1;&quot;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="co1">// we&#8217;re assuming the query ran correctly</span></p>
<p>&nbsp; &nbsp; <span class="co1">// if we can&#8217;t return a row, then there&#8217;s no user with</span><br />
&nbsp; &nbsp; <span class="co1">// that name</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> !<span class="re0">$user</span> = <span class="re0">$result</span>-&gt;<span class="me1">fetch_assoc</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// return code for bad username</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// now, assuming the password was hashed with crypt()</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">$user</span><span class="br0">&#91;</span><span class="st0">&#8216;password&#8217;</span><span class="br0">&#93;</span> != «<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/crypt"><span class="kw3">crypt</span></a><span class="br0">&#40;</span><span class="re0">$password</span>, <span class="re0">$user</span><span class="br0">&#91;</span><span class="st0">&#8216;password&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">2</span>; <span class="co1">// return code for bad password</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// return code for success</span><br />
<span class="br0">&#125;</span></div>
<p>What&#8217;s going on here? Basically, we&#8217;re looking up the user by the username. If we don&#8217;t find a user, we throw out an error. If we do find a user, we re-encrypt the password they supplied, and check it against the encrypted password we already have. If they don&#8217;t match, we throw out an error. If they do, the user is allowed to log in.</p>
<p>There are two key differences between this method and the method so often espoused by tutorial writers:</p>
<ol>
<li>This method stores an encrypted password instead of plain text.</li>
<li>This method differentiates between bad usernames and bad passwords.</li>
</ol>
<p>#1 should be obvious. Never store an unencrypted password. It&#8217;s extremely dangerous: if someone ever gets a look at the table, they can just read the users&#8217; passwords—which may well be the same as their bank password (no it shouldn&#8217;t be, but it probably is). And it&#8217;s unnecessary. Every server-side language implements the MD5 hash, which is weak but works. Better options (like PHP&#8217;s <a onclick="window.open(this.href,'newwindow'); return false;" href="http://www.php.net/crypt">crypt()</a>) can use algorithms like Triple-DES, SHA1, Blowfish, or at least MD5 with a random salt.</p>
<p>But wait, #2, I said it was better <em>not</em> to distinguish between a bad username and a bad password, right? Well&#8230; yes, to the end user. In either case, I should display a message like &#8220;Bad username or password&#8221; to the person who tried to log in.</p>
<p>Internally, however, I want to know what happened. Is someone targetting known users, or just trying random combinations? How did they find real usernames? Where should I be improving security?</p>
<p>You&#8217;re also minimizing the number of user-submitted strings that get sent to the database. There are fewer opportunities for you to accidently allows an injection attack. If you have a policy on username syntax, you can keep yourself even safer by not talking to the database if the username is bad:</p>
<p>(I&#8217;ve omitted logging or real error-handling here. In a live version, I would probably wrap most of this in a <code><a onclick="window.open(this.href,'newwindow'); return false;" href="http://us2.php.net/manual/en/language.exceptions.php">try</a></code> block, throw one of three types of exceptions, and do some logging in the <code>catch</code> block.)</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span></p>
<p><span class="co1">// Usernames must start with a letter, and contain</span><br />
<span class="co1">// only letters, numbers, underscores and dots, but</span><br />
<span class="co1">// must not end with a dot or underscore.</span><br />
<span class="re0">$user_regex</span> = <span class="st0">&#8216;/[a-zA-Z][a-zA-Z0-9_<span class="es0">\.</span>]*[a-zA-Z0-9]/&#8217;</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span> <a href="http://www.php.net/preg_match"><span class="kw3">preg_match</span></a><span class="br0">&#40;</span><span class="re0">$user_regex</span>,<span class="re0">$username</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">// the username matches our allowed syntax</span><br />
&nbsp; &nbsp; <span class="re0">$auth</span> = check_password<span class="br0">&#40;</span><span class="re0">$username</span>, <span class="re0">$password</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">$auth</span> === <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="co1">// the do_login() function is an exercise</span><br />
&nbsp; &nbsp; &nbsp; <span class="co1">// to the reader</span><br />
&nbsp; &nbsp; &nbsp; do_login<span class="br0">&#40;</span><span class="re0">$username</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="co1">// the username was bad, or the username/password</span><br />
<span class="co1">// was wrong</span><br />
<span class="co1">// die() is an overly simplistic choice, here.</span><br />
<a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Bad username or password.&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">?&gt;</span></div>
<p>Obviously we still escape the username, to make damn sure, but this gives us another place to get information. Did someone actually enter <code>'; DROP TABLE users; --</code> into our login form, or did they just mistype their password.</p>
<p>I&#8217;m going to end with a request: if you&#8217;re about to write a tutorial for beginners, please be aware of what you&#8217;re modeling in your examples. If you&#8217;re doing something you would never do, for the sake of simplicity or because it&#8217;s not the focus of the tutorial, point that out. Link to another tutorial or at least mention that it&#8217;s a bad way to do something.</p>
<p>Don&#8217;t send a quiet message that wrong is OK.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/responsible-sql-how-to-authenticate-144/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Go Vote Today</title>
		<link>http://coffeeonthekeyboard.com/go-vote-today-142/</link>
		<comments>http://coffeeonthekeyboard.com/go-vote-today-142/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 16:49:25 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[2008]]></category>

		<category><![CDATA[barack obama]]></category>

		<category><![CDATA[election]]></category>

		<category><![CDATA[john mccain]]></category>

		<category><![CDATA[Politics]]></category>

		<category><![CDATA[vote]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=142</guid>
		<description><![CDATA[Go vote.
If you don&#8217;t know where, lots of websites will help you, even Google Maps.
Don&#8217;t assume that the polls will come true even if you skip voting. Vote.
If you&#8217;re still undecided (have you been living on Mars, in a cave, under a rock, with your eyes closed and your ears covered for the past 2 [...]]]></description>
			<content:encoded><![CDATA[<p>Go vote.</p>
<p>If you don&#8217;t know where, lots of websites will help you, even <a href="http://maps.google.com/vote">Google Maps</a>.</p>
<p>Don&#8217;t assume that the polls will come true even if you skip voting. Vote.</p>
<p>If you&#8217;re still undecided (have you been living on Mars, in a cave, under a rock, with your eyes closed and your ears covered for the past 2 years) or think the candidates are &#8220;the same,&#8221; I urge you to check out their websites: <a href="http://barackobama.com/">BarackObama.com</a> and <a href="http://johnmccain.com/">JohnMcCain.com</a> and read about their positions.</p>
<p>I assure you, they are very different.</p>
<p>As <a href="http://www.newyorker.com/humor/2008/10/27/081027sh_shouts_sedaris">David Sedaris</a> said, it&#8217;s like being offered the chicken dinner or a plate of shit with broken glass in it, and asking how the chicken is cooked. No matter which side you&#8217;re on.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/go-vote-today-142/feed/</wfw:commentRss>
		</item>
		<item>
		<title>In the Shadows of Media Giants</title>
		<link>http://coffeeonthekeyboard.com/in-the-shadows-of-media-giants-136/</link>
		<comments>http://coffeeonthekeyboard.com/in-the-shadows-of-media-giants-136/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 01:00:42 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[biden]]></category>

		<category><![CDATA[campaign]]></category>

		<category><![CDATA[Life]]></category>

		<category><![CDATA[mccain]]></category>

		<category><![CDATA[news]]></category>

		<category><![CDATA[obama]]></category>

		<category><![CDATA[observation]]></category>

		<category><![CDATA[palin]]></category>

		<category><![CDATA[Politics]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=136</guid>
		<description><![CDATA[The McCain campaign will probably go down in history as one of the worst-run campaigns in American history. Not because of a few horrible gaffs (&#8221;helped create&#8221; the BlackBerry? intended to insult the Prime Minister of Spain? speaking in front of a green screen?) but because they forgot who their candidate was.
The following does not [...]]]></description>
			<content:encoded><![CDATA[<p>The McCain campaign will probably go down in history as one of the worst-run campaigns in American history. Not because of a few horrible gaffs (&#8221;helped create&#8221; the BlackBerry? intended to insult the <span class="gotcha" title="&quot;President&quot; Zapatero doesn't exist, for the record. They have a constitutional monarcy.">Prime Minister</span> of Spain? speaking in front of a green screen?) but because they <em>forgot who their candidate was</em>.</p>
<p class="note">The following does <em>not</em> constitute rigorous proof. Just <a href="http://en.wikipedia.org/wiki/Scientific_method">observation</a> and <a href="http://en.wikipedia.org/wiki/Conjecture">conjecture</a>.</p>
<p>For an experiment, I went to Google News and searched for &#8220;mccain&#8221; &#8220;palin&#8221; &#8220;obama&#8221; and &#8220;biden&#8221;, all separately, and just looked at the total results. (I looked on the second page because Google&#8217;s duplicate-finding algorithms usually seem to pare down results by the time you get to page 2.)</p>
<p>Here are the results:</p>
<ul>
<li><a href="http://news.google.com/news?q=obama">obama</a> — 433.631</li>
<li><a href="http://news.google.com/news?q=mccain">mccain</a> — 416,804</li>
<li><a href="http://news.google.com/news?q=biden">biden</a> — 86,164</li>
<li><a href="http://news.google.com/news?q=palin">palin</a> — <strong>202,033</strong></li>
</ul>
<p>Obama and McCain are fairly even (unsurprising, since most articles that mention one mention the other). What shocks me is that Sarah Palin, who almost no one in the country had heard of until two months ago, has already caught up to half of the candidates, who have been on the trail for a year and a half.</p>
<p>Unless <a href="http://video.google.com/videoplay?docid=5775099474392087542">Michael Palin</a> has been making tons of news, lately?</p>
<p>She&#8217;s got two and a half times the press of Joe Biden, who&#8217;s been a US Senator for 35 years, so probably has some old mentions in there.</p>
<p>We see a similar trend in the regular Google search:</p>
<ul>
<li><a href="http://www.google.com/search?q=obama">obama</a> — 206,000,000</li>
<li><a href="http://www.google.com/search?q=mccain">mccain</a> — 146,000,000</li>
<li><a href="http://www.google.com/search?q=biden">biden</a> — 37,900,000</li>
<li><a href="http://www.google.com/search?q=palin">palin</a> — <strong>107,000,000</strong></li>
</ul>
<p>Here I attribute the difference between Obama and McCain to <a href="http://www.fivethirtyeight.com/2008/10/whats-wrong-with-this-picture-aka-nate.html">Obama&#8217;s lead among young voters</a>. But Palin has even more momentum here, half of Obama and two-thirds of McCain. (I re-ran this search several times, because Google said it was customizing my results based on my recent queries.)</p>
<p>Why?</p>
<p>McCain picked an ambitious, photogenic campaigner. He, on the other hand, is an occasionally ornery, but usually soft-spoken old man. Barack Obama is a well-spoken Black man with a thousand-watt smile. Biden is the soft-spoken older man on that ticket.</p>
<p>Unfortunately for Senator McCain, he also picked an unknown, inexperienced Governor who usually sounds like a high school student who <a href="http://www.youtube.com/watch?v=KyoafptEm5c">didn&#8217;t read the book</a>, and <a href="http://www.nbc.com/Saturday_Night_Live/video/clips/gov-palin-cold-open/773761/">looks like Tina Fey</a>. Comic. Gold.</p>
<p>I realize that picking <a href="http://allard.senate.gov/public/">someone</a> <a href="http://en.wikipedia.org/wiki/Tim_Pawlenty">less exciting</a> that John McCain may have been difficult, but picking someone much <em>more</em> interesting, and not in a particularly good way, was definitely a bad choice. Yes she energized the base. She also energized every comedian and reporter. So much so that they forgot about John McCain.</p>
<p>They are &#8220;<a href="http://www.newsvirginian.com/wnv/news/local/article/voting_for_the_chick_signs_point_to_palin_across_the_county_valley/29420/">voting for the chick</a>.&#8221;</p>
<p class="note">For disclosure, I only identify as a Democrat because they&#8217;re as far left as I can get and still have a realistic chance of winning. I&#8217;m roughly in the left side of the British Liberal Democrat party.</p>
<p class="note">But, if I was a Republican, I would be angry about this. As a liberal, it&#8217;s just funny.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/in-the-shadows-of-media-giants-136/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Connecting PHP, IIS 6, and SQL Server 2005</title>
		<link>http://coffeeonthekeyboard.com/connecting-php-iis-6-and-sql-server-2005-129/</link>
		<comments>http://coffeeonthekeyboard.com/connecting-php-iis-6-and-sql-server-2005-129/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 16:33:20 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[Back-end]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[iis]]></category>

		<category><![CDATA[microsoft]]></category>

		<category><![CDATA[pdo]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=129</guid>
		<description><![CDATA[I know I will be accosted for this, but at work we needed to run PHP on IIS 6 (fairly simple) and connect it to a remote database server running SQL Server 2005 (not terrible, once I gave up the Microsoft way).
Yeah yeah, do it in ASP.NET, I know. While I like C# as a [...]]]></description>
			<content:encoded><![CDATA[<p>I know I will be accosted for this, but at work we needed to run PHP on IIS 6 (<a href="http://www.peterguy.com/php/install_IIS6.html">fairly simple</a>) and connect it to a remote database server running SQL Server 2005 (not terrible, once I gave up the Microsoft way).</p>
<p>Yeah yeah, do it in ASP.NET, I know. While I like C# as a language, I kind of hate ASP.NET as a framework, so what are you gonna do? Java was an option but the start-up time was too long for this project.</p>
<p>My first Google search for &#8220;PHP SQL Server 2005&#8243; turned up the Microsoft <a href="http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx">SQL Server 2005 Driver for PHP</a>. &#8220;Well great!&#8221; I thought. It&#8217;s just a PHP extension, very easy to install on Windows. But I didn&#8217;t know the horrid depths into which I was about to sink.</p>
<p>The Microsoft driver comes with an example application and database. The application assumes you are connecting to a local database. There is scant information about remote databases.</p>
<p>The driver defines this function:</p>
<pre>sqlsrv_connect($host[, $connectionOptions[, ...]]);</pre>
<p>The example application tells you to set <code>$host</code> to <var>(local)</var>. Supposedly this works. However, after scouring the internet for several days, and trying every permutation of hostname, Windows networking name, port, IP address, white space, and several other variables that shouldn&#8217;t have been in there, I&#8217;ve decided it doesn&#8217;t talk to remote servers nicely.</p>
<p><a href="http://us.php.net/manual/en/book.pdo.php">PDO</a>&#8217;s ODBC driver, on the other hand, and a quick visit to <a href="http://www.connectionstrings.com/">www.connectionstrings.com</a>, worked wonderfully.</p>
<p>Here is how I needed to create the PDO object. I hope this is useful for someone else:</p>
<p>(ed. The symbol « is a line break that&#8217;s not in the real code.)</p>
<pre>$host     = '1.2.3.4';
$port     = '1433';
$database = 'MyDatabase';
$user     = 'MyDatabaseUser';
$password = 'MyDatabasePassword';

$dsn = "odbc:DRIVER={SQL Server}; «
 SERVER=$server,$port;DATABASE=$database";

try {
  // connect
  $conn = new PDO($dsn,$user,$password);
} catch (PDOException $e) {
  // fancy error handling
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/connecting-php-iis-6-and-sql-server-2005-129/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Does the Web Hate School?</title>
		<link>http://coffeeonthekeyboard.com/does-the-web-hate-school-123/</link>
		<comments>http://coffeeonthekeyboard.com/does-the-web-hate-school-123/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 15:36:18 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[classrooms]]></category>

		<category><![CDATA[Education]]></category>

		<category><![CDATA[schools]]></category>

		<category><![CDATA[Social Networking]]></category>

		<category><![CDATA[teachers]]></category>

		<category><![CDATA[tools]]></category>

		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=123</guid>
		<description><![CDATA[Full Disclosure: I am employed at Michigan State University&#8217;s College of Education as a web designer and application developer. The opinions I express on this blog are mine, and do not necessarily reflect those of my employers or clients. Particularly this post.
Education generally falls behind every other sector in computer technology integration and internet use. [...]]]></description>
			<content:encoded><![CDATA[<p class="note">Full Disclosure: I am employed at Michigan State University&#8217;s College of Education as a web designer and application developer. The opinions I express on this blog are mine, and do not necessarily reflect those of my employers or clients. Particularly this post.</p>
<p>Education generally falls behind every other sector in computer technology integration and internet use. A typical fast food employee uses a computer more during the day than a typical middle school student. (What are cash registers but custom computers?) At almost any business you can expect employees to use networked computers for everything from sales and inventory to customer service to internal work and communication.</p>
<p>But beyond simply using the box, private companies in every sector generally have up-to-date, professionally designed web sites that (at least try to) provide useful information or services to customers. Been to your or your kid&#8217;s school web site lately? Universities are usually &#8220;OK,&#8221; but they get worse as you go down.</p>
<p>In any other sector, you are likely to find online collaboration tools, meeting planners, digital resources for employees, use of messaging tools like internal e-mail (Exchange servers), private IM, Yammer/Laconi.ca, internal wikis, public and private blogs&#8230; you get the idea.</p>
<p>But not in education.</p>
<p>Education is part of the problem, but <strong>it is not the whole problem</strong>. Many <a href="http://speedchange.blogspot.com/">people talk about how teachers and schools fail to use computers and the internet well</a> in their classrooms. Many schools treat the computer itself as a goal, rather than as a tool to do new things, or do old things better and faster. Teachers generally fall behind the private sector in computer literacy. Yes, all these things are true.</p>
<p>But we, we the tech sector, the web 2.7.4 crowd, <strong>we are part of the problem, too</strong>.</p>
<p>How often does a new tool support education? Offer suggestions or support for teachers? Provide educational pricing? Provide the EULA and Privacy Policy education legally requires?</p>
<p>The people who become teachers are often the people who did well in school, who see no reason to change anything because, to them, <em>it works</em>. In the tech world, &#8220;where did they drop out of school?&#8221; is a legitimate question. Your typical programmer has at least one degree in Computer Science, but the real success stories—Bill Gates, Steve Jobs, Mark Zuckerberg—the ones who made real money, are drop outs. School didn&#8217;t work for them—for <em>us—</em>so what do we owe school?</p>
<p>When <a href="http://yammer.com/">Yammer</a> launched, they gave a simple business plan: for companies that wanted to &#8220;claim&#8221; and control their networks, they would charge $1 per month per user. A small start up might pay $5 to $20 a month. Even a big company is probably paying only a few hundred dollars per month. A university, on the other hand, could be stuck paying tens of thousands of dollars per month, or skipping the service entirely. Which do you think they&#8217;re likely to do?</p>
<p>What was <a href="http://forum.yammer.com/topic.php?id=551">Yammer&#8217;s response</a>? &#8220;Our product [...] is not geared toward educational institution [sic].&#8221;</p>
<p>Many schools have prohibitions against using Google services for anything work-related because, if you don&#8217;t <del>pay for</del> <ins>use (update: Google Apps for Education is free, my bad)</ins> their educational services, their <a href="http://www.google.com/intl/en/privacy_terms.html">Terms of Use</a> (read Section 11) could allow them to share sensitive student data.</p>
<p>You&#8217;re a school? You don&#8217;t matter. Only cool people matter.</p>
<p><strong>Let&#8217;s change</strong>. Let&#8217;s remember that the community of &#8220;tech-savvy&#8221; users, while growing, is still a minority. Let&#8217;s encourage teachers and schools to use the tools we create, so people come out of school ready to use these tools.</p>
<p>It is possible. <a href="http://education.ning.com/page/page/show?id=1027485:Page:45750">Ning is experimenting with education</a>. But how do we make tools ed-friendly?</p>
<p><strong>Fix your EULA and Privacy Policy, or provide a second one for education</strong>. Don&#8217;t be the next <a href="http://www.google.com/search?q=chrome+eula">Google Chrome</a>. (Frankly, everyone should be reconsidering their EULA right now. Why do some people need so many rights to my content?)</p>
<p><strong>Offer suggestions to teachers</strong>. I know: it&#8217;s not really a priority. You&#8217;ve got bug fixing, paying customers, searching for VC, coming out with the next version. But it&#8217;s not terribly difficult. Got a user forum? Add a section for education. Got a wiki? Add an education page. Blog? Throw up a post for teachers once in a while, or better, get guest posts from teachers who use your tool.</p>
<p><strong>Provide educational pricing</strong>. Schools have less money every year. If you can work out a deal to make your product free to schools, do it. But it&#8217;s not hard: just charge schools less. Think of this as an investment. If they use your product as students, they may well want to use it when they graduate and have to pay.</p>
<p>Or,<strong> provide an ad-free version to schools</strong>. This is the Ning method. If your business model doesn&#8217;t involve charging directly, be aware that schools often take issue with displaying ads to students. It&#8217;s the same investment as above: hook them young.</p>
<p>Schools lag on the internet because there is resistance on both sides: educators are reluctant to integrate new things into their curricula, and the new tools rarely give a damn about schools and students as users.</p>
<p>Changing the tech side won&#8217;t solve the problem. Schools need to adapt, too. (Where would you look for a Windows 95 computer if you needed one today? I&#8217;d check the local elementary school. It&#8217;s probably in a lab, or hidden in the back of a classroom.) Schools need to treat computers like tools, and the internet as a tool, and the tools we build on the internet as tools, and use those tools effectively. That will take time.</p>
<p>In the meantime, let&#8217;s try to reduce the resistance on our side, so when they come around, educators feel welcome.</p>
<p>Edit: I need to proofread better, even with angry rants.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/does-the-web-hate-school-123/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WP Plugin: Better Search Widget</title>
		<link>http://coffeeonthekeyboard.com/wp-plugin-better-search-widget-113/</link>
		<comments>http://coffeeonthekeyboard.com/wp-plugin-better-search-widget-113/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 18:30:23 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[Back-end]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[Projects]]></category>

		<category><![CDATA[search]]></category>

		<category><![CDATA[widget]]></category>

		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=113</guid>
		<description><![CDATA[Today I upgraded from WordPress 2.3.3 to 2.6.1. I&#8217;m such a late adopter sometimes.
I had to go through and repeat a few hacks. For example, 2.3.x didn&#8217;t allow you to do get_sidebar($name), so I&#8217;d hacked the &#8220;get_sidebar()&#8221; function. And I replaced the still-broken Atom feed reading widget with James Wilson&#8217;s Google Reader Widget.
Then I finally [...]]]></description>
			<content:encoded><![CDATA[<p>Today I upgraded from WordPress 2.3.3 to 2.6.1. I&#8217;m such a late adopter sometimes.</p>
<p>I had to go through and repeat a few hacks. For example, 2.3.x didn&#8217;t allow you to do <code>get_sidebar($name)</code>, so I&#8217;d hacked the &#8220;get_sidebar()&#8221; function. And I replaced the still-broken Atom feed reading widget with James Wilson&#8217;s <a href="wordpress.org/extend/plugins/google-reader-widget/">Google Reader Widget</a>.</p>
<p>Then I finally got fed up with the default &#8220;Search&#8221; widget, which doesn&#8217;t look like the other widgets at all (no title), so I started hacking into that one. Then I realized &#8220;why hack, when I can extend?&#8221;</p>
<p>So, here it is, <a href="http://jamessocol.com/projects/better-search-widget.php">Better Search Widget</a>.</p>
<p>All it does is add a search widget with a customizable title, submit button, and field size. Quick-and-useful. You can see the results in the sidebar.</p>
<p>If you decide to use it, leave a comment and I&#8217;ll check out your blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/wp-plugin-better-search-widget-113/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chrome Is Not A Browser</title>
		<link>http://coffeeonthekeyboard.com/chrome-is-not-a-browser-111/</link>
		<comments>http://coffeeonthekeyboard.com/chrome-is-not-a-browser-111/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 15:34:53 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Standards]]></category>

		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[chrome]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/chrome-is-not-a-browser-111/</guid>
		<description><![CDATA[If you somehow haven&#8217;t heard of it, Google&#8217;s Chrome is a neat, quick, Acid2-compliant &#8220;browser&#8221; designed to work with web applications, not web pages.
Chrome certainly looks like a modern browser, with tabs along the top and an address bar and a &#8220;Most visited&#8221; home screen, it will seem familiar to anyone who&#8217;s moved past Internet [...]]]></description>
			<content:encoded><![CDATA[<p>If you <a href="http://search.twitter.com/search?q=chrome">somehow haven&#8217;t heard of it</a>, Google&#8217;s <a href="http://www.google.com/chrome">Chrome</a> is a neat, quick, Acid2-compliant &#8220;browser&#8221; designed to work with web <em>applications</em>, not web <em>pages</em>.</p>
<p>Chrome certainly looks like a modern browser, with tabs along the top and an address bar and a &#8220;Most visited&#8221; home screen, it will seem familiar to anyone who&#8217;s moved past Internet Explorer 6.</p>
<p>And yet, my Twittersphere has been full of comments like &#8220;Nice, but not nice enough to make me drop Firefox/Safari.&#8221;</p>
<p>While there are some visual improvements, such as an extremely small &#8220;chrome&#8221; (the parts of the browser <em>around</em> the page area) footprint, the big changes are &#8220;under the hood.&#8221; Chrome is built for tabs—each tab is an isolated process; no one tab can take down the whole browser—and is built for JavaScript-heavy &#8220;web 2.0&#8243; apps—Chrome&#8217;s new V8 JavaScript engine executes a full order of magnitude faster than the current browsers, in my experience.</p>
<p>And all of those &#8220;under the hood&#8221; changes are <strong>open source</strong>.</p>
<p>Chrome is not a browser.</p>
<p>Chrome is Google&#8217;s way of making a point: modern web browsers have <a href="http://www.youtube.com/watch?v=7RSHMheDIrM">not kept up with the web</a> itself.</p>
<p>More and more, the web is becoming an interactive application, and most browsers are not built for it. They display pages, and running applications is an afterthought. While we&#8217;ve seen huge improvements in JavaScript execution in the past few years, speed is still a limitation for developers. Applications are also much more likely to crash than static pages (go ahead, just try to crash a browser with just malformed HTML) and isolating tabs will give necessary boosts to speed, stability, and security.</p>
<p><a href="http://krisabel.ctv.ca/blog/_archives/2008/9/2/3866151.html">Kris Abel</a> of <a href="http://krisabel.ctv.ca/">CTV.ca</a> said it best: &#8220;Google’s entire business takes place throughout the internet itself and so they see their interests served regardless of which company takes web browsing to the next level, in fact they see their interests served if all companies do exactly that.&#8221;</p>
<p>I&#8217;m not switching to Chrome. I doubt very many people will find it useful as a primary browser. I don&#8217;t expect many user-interface improvements, like Firefox&#8217;s vast add-on library or the accessibility features of Firefox 3, Opera or IE8.</p>
<p>I do expect any future version to have more &#8220;under the hood&#8221; improvements, and I hope that the makers of Firefox, Opera, Internet Explorer, and any new browsers that spring from this, will re-evaluate their own products and move in this direction.</p>
<p>Because when the browsers get better, the web gets better.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/chrome-is-not-a-browser-111/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Identity 2.0 - A Primer</title>
		<link>http://coffeeonthekeyboard.com/identity-20-a-primer-106/</link>
		<comments>http://coffeeonthekeyboard.com/identity-20-a-primer-106/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 16:13:36 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[2.0]]></category>

		<category><![CDATA[authority]]></category>

		<category><![CDATA[How To]]></category>

		<category><![CDATA[identity]]></category>

		<category><![CDATA[Life]]></category>

		<category><![CDATA[social messaging]]></category>

		<category><![CDATA[Social Networking]]></category>

		<category><![CDATA[twitter]]></category>

		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/identity-20-a-primer-106/</guid>
		<description><![CDATA[Google your name. Right now. I&#8217;ll wait.
Put your name here:


Good. What came up?
Look at the first page of results and ask yourself these questions about each one:

Is it really me?
Did I create this?
Do I control this?

You need to be able to say &#8220;yes&#8221; to all of these for at least the top two or three [...]]]></description>
			<content:encoded><![CDATA[<p>Google your name. Right now. I&#8217;ll wait.</p>
<form action="http://www.google.com/search" method="get" onsubmit="window.open('http://www.google.com/search?q='+this.q.value,'','');return false;"><label for="google-search">Put your name here:</label></p>
<input name="q" id="google-search" size="30" type="text" />
<input value="Google Thyself" type="submit" /></form>
<p>Good. What came up?</p>
<p>Look at the first page of results and ask yourself these questions about each one:</p>
<ol>
<li>Is it really me?</li>
<li>Did I create this?</li>
<li>Do I control this?</li>
</ol>
<p>You need to be able to say &#8220;yes&#8221; to all of these for at least the top two or three results. (As I write this, the <a href="http://www.rssmeme.com/">RSSmeme</a> page <a href="http://www.rssmeme.com/user/15663/">repeating my Google Reader shared items</a> has crawled above my blog, and I&#8217;m upset about it.)</p>
<h3>Creating Identity</h3>
<p>I&#8217;m lucky. My last name is very rare, so even if you <a href="http://www.google.com/search?q=Socol">Google just &#8220;Socol&#8221;</a>  I come in second—only to <a href="http://speedchange.blogspot.com/">my father</a>, and ahead of Wikipedia. You may not be so lucky, saddled with a name like Jones or Smith or, even worse, you might have the <a href="http://www.youtube.com/watch?v=145mqJduiO4">same name as a celebrity</a>. You may have an uphill battle.</p>
<p>People with common names need to get creative. It can be as simple as adding an initial—my friend became <a href="http://www.myspace.com/alecrjohnston">Alec R. Johnston</a> to distinguish himself. Something a little more creative—Lisa Bettany named her blog <a href="http://www.mostlylisa.com/">Mostly Lisa</a>. Or you can geek out, like Ben Lew, who uses the name <a href="http://n0s0ap.com/">n0s0ap</a>. (Those are zeros.)</p>
<p>Ben uses the name n0s0ap on <a href="http://del.icio.us/n0s0ap">del.icio.us</a>, <a href="http://flickr.com/photos/n0s0ap">flickr</a>, <a href="http://www.last.fm/user/n0s0ap/">Last.fm</a>, <a href="http://digg.com/users/n0s0ap">Digg</a>, <a href="http://twitter.com/n0s0ap">Twitter</a>, etc. Lisa uses a combination of &#8220;<a href="http://www.viddler.com/explore/MostlyLisa/">MostlyLisa</a>&#8221; and &#8220;<a href="http://twitter.com/lisabettany">LisaBettany</a>.&#8221; I use a combination of an old name, &#8220;<a href="http://www.last.fm/user/urbaneexistance/">UrbaneExistance</a>&#8221; (I know it&#8217;s spelled wrong) and &#8220;<a href="http://friendfeed.com/jamessocol">JamesSocol</a>&#8221; for all new registrations.</p>
<p>But all of us, Alec, Ben, Lisa, and I, make sure our real names are linked to our identities. It&#8217;s no Clark Kent: n0s0ap <em>is</em> Ben Lew, with the glasses on or off.</p>
<h3>Owning Identity</h3>
<p>Do you own your own domain name? Why not? Go buy it. Now. Go!</p>
<p>I have this conversation with friends all the time. Would you want someone signing your name on paper documents? Of course not, so why would you let them do the same thing online? I own jamessocol.com, jamessocol.net, and jamessocol.org, just so no one else does. Even if you do nothing but have it redirect to your social network of choice, you should own your name.</p>
<p>If your name is taken, reread the last section and get creative.</p>
<p>Now, about those <strong>social networks</strong>. You don&#8217;t need to be on every one, but get on a few, build a profile, and put your name on it. You can create and control your own Facebook and MySpace pages without knowing a single HTML tag. Once you&#8217;ve got a name, whether it&#8217;s your real name or something else, use it. last.fm/user/<strong>you</strong>. twitter.com/<strong>you</strong>.</p>
<h3>Controlling Identity</h3>
<p>The best way I&#8217;ve found to control what the web knows about you is to start your own propaganda campaign. Put your name on a lot of things, preferably with links back to your own site.</p>
<p>An easy way to start is by commenting. Blog comments help the most, since you spread that influence around the whole internet, but within MySpace or Facebook posting real, meaningful, interesting comments on profiles and walls will make sure people think of you when they hear your name.</p>
<p>If you have the time, try blogging. There are a lot of blogs with <a href="http://problogger.com/">great</a> <a href="http://chrisbrogan.com/">advice</a>, but you can always just &#8220;write what you know.&#8221; Once you find your voice, the writing flows.</p>
<p>What else? It depends what you like. If you take pictures, get a <a href="http://flickr.com/photos/urbaneexistence/">Flickr</a> stream. <a href="http://www.last.fm/user/urbaneexistance/">Last.fm</a> is a great way to share and find music you like. <a href="http://www.goodreads.com/profile/jamessocol">GoodReads</a> is a similar site for books. <a href="http://twitter.com/jamessocol">Twitter</a> is great for finding people with similar interests and building connections. <a href="http://linkedin.com/in/jamessocol">LinkedIn</a> is a professional social network, particularly good for people in marketing or new media. <a href="http://speedchange.blogspot.com/">Blogger</a>, while not the best blogging platform, has some good community features. <a href="http://en.wikipedia.org/wiki/List_of_social_networking_websites">There is a lot out there</a>.</p>
<h3>Be Yourself</h3>
<p>Don&#8217;t let someone else be you! Own your own identity and be proud of it. It will help you <a href="http://coffeeonthekeyboard.com/expertise-and-authority-20-104/" title="build authority">build authority</a> and when a potential employer or client googles you, they&#8217;ll get a good idea about you from the first page of results.</p>
<p>What else, 2.0-savvy readers? What did I forget?</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/identity-20-a-primer-106/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
