<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Coffee on the Keyboard &#187; Code</title>
	<atom:link href="http://coffeeonthekeyboard.com/tag/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://coffeeonthekeyboard.com</link>
	<description>by James Socol</description>
	<lastBuildDate>Fri, 20 Apr 2012 22:17:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/>		<item>
		<title>Developing at Scale: Database Replication</title>
		<link>http://coffeeonthekeyboard.com/developing-at-scale-database-replication-444/</link>
		<comments>http://coffeeonthekeyboard.com/developing-at-scale-database-replication-444/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 16:10:15 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Back-end]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[sumo]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=444</guid>
		<description><![CDATA[When a website is small—like this one, for example—usually the entire thing, from the web server to the database, can live on a single server. Even a single virtual server. One of the first things that happens when a web site gets bigger is this is no longer true. One reason is load. A popular [...]]]></description>
			<content:encoded><![CDATA[<p>When a website is small—like this one, for example—usually the entire thing, from the web server to the database, can live on a single server. Even a single virtual server. One of the first things that happens when a web site gets bigger is this is no longer true.</p>
<p>One reason is load. A popular website will simply require more than a single server, virtual or otherwise, can give, and the only way to keep scaling is to add more servers. For example, if the server runs out of available Apache connections and the number cannot be raised without negatively impacting performance.</p>
<p>Another reason is downtime. If a website is served from a single server, and that server goes down for any reason, planned or otherwise, then the website is down. At some point, downtime is essentially unacceptable—just ask Twitter—and redundancy is required.</p>
<h3>Enter Replication</h3>
<p>A common response is to set up database replication, where one database server operates as a &#8220;master,&#8221; and one or more other servers operate as &#8220;slaves.&#8221; In this setup, all of your <em>writes</em> to the database will go to the master, then &#8220;replicate&#8221; to the slaves, and all or most of the <em>reads</em> will come from the slaves. (Note that the slaves are doing both all the writes as well as all the reads: slaves are not a good place to recycle sub-par hardware.)</p>
<p>Replication introduces a new type of problem: if you naively send <em>all</em> reads to the slaves then data you just wrote <em>will not be there</em>.</p>
<h3>La&#8230;wait for it&#8230;g</h3>
<p>Even if the master and slave are sitting next to each other with a cable connecting them, replication will probably take more time than your code does to reach the next step. At a minimum, you need to assume that replication lag will be hundreds of milliseconds—an eternity when the time from one line in your web app to the next is measured in micro- or nanoseconds. In reality, replication in the real world may well take seconds, especially if your master and slaves are not physically next to each other.</p>
<p>The result is that <a href="http://en.wikipedia.org/wiki/ACID">ACIDity</a> is essentially broken, specifically the <strong>D</strong>urability part. You cannot simply write data and immediately rely on its existence.</p>
<p>For example, say you have a large discussion forum. If you naively send all reads to the slaves, then someone&#8217;s post may take seconds to appear on the site. This is a problem if you&#8217;re trying to show a user their post immediately after posting it.</p>
<h3>Smarter Reading</h3>
<p>The solution is to occasionally read from the master. When you need to access data that was just written, it is <em>probably</em> only available on the master, so that&#8217;s where you&#8217;ll read it. Within a single HTTP request, this is fairly simple: just force any queries that rely on recently-written data to the master.</p>
<p>Outside of a single HTTP request, this is slightly more complex. If you&#8217;re following the practice of redirecting after a POST request to a GET request (which you should) then creating a new forum post and viewing it will be on two different HTTP requests.</p>
<p>One way around this is to set a very short-lived cookie that tells your web app to continue reading from the master. If any write occurs in a request, the response should include this cookie. The exact time-to-live will depend on how long your replication lag usually is—cover at least 4 or 5 standard deviations. Any request that has this cookie should honor it by reading only from the master.</p>
<h3>A Pitch</h3>
<p>One of the hardest things for new web developers is developing large-scale applications: first, you need a large-scale application! Setting up database replication is a huge pain, and if your site isn&#8217;t getting enough traffic, it&#8217;s not worth it.</p>
<p>Mozilla is one way aspiring web developers can get some experience working with large-scale web apps. All of our web apps are open source and open to contributions from community members. To get involved, stop by <a href="irc://irc.mozilla.org/webdev">#webdev</a> in IRC!</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/developing-at-scale-database-replication-444/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Code-sharing Update</title>
		<link>http://coffeeonthekeyboard.com/code-sharing-update-361/</link>
		<comments>http://coffeeonthekeyboard.com/code-sharing-update-361/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 17:01:10 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[amo]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sumo]]></category>
		<category><![CDATA[team]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=361</guid>
		<description><![CDATA[When we decided to move SUMO to a new platform, one of the reasons we chose Django was code sharing and reuse—specifically that SUMO and AMO would be able to share code, meaning both teams would save time and see benefits. So how is that going? Were we right in our assumption here? The code [...]]]></description>
			<content:encoded><![CDATA[<p>When we decided to <a href="http://coffeeonthekeyboard.com/the-evolution-of-sumo-339/">move SUMO to a new platform</a>, one of the reasons we chose <a href="http://www.djangoproject.com/">Django</a> was code sharing and reuse—specifically that <a href="http://support.mozilla.com/">SUMO</a> and <a href="https://addons.mozilla.org">AMO</a> would be able to share code, meaning both teams would save time and see benefits.</p>
<p>So how is that going? Were we right in our assumption here? The code we&#8217;re sharing so far:</p>
<dl>
<dt><a href="http://github.com/jbalogh/django-multidb-router">MultiDB Router</a></dt>
<dd>A Django DB router that supports reading from a pool of slave databases.</dd>
<dt><a href="http://github.com/jbalogh/django-cache-machine">Cache Machine</a></dt>
<dd>A powerful caching library for Django that, in particular, provides automatic object caching and invalidation through the ORM.</dd>
<dt><a href="http://github.com/jbalogh/jingo">Jingo</a></dt>
<dd>An adapter for using <a href="http://jinja.pocoo.org/2/">Jinja2</a> templates with Django.</dd>
<dt><a href="http://github.com/jbalogh/django-nose">Django-Nose</a></dt>
<dd>A test runner for Django using <a href="http://somethingaboutorange.com/mrl/projects/nose/0.11.2/">Nose</a>.</dd>
<dt><a href="http://github.com/jbalogh/django-debug-cache-panel">Django Debug Cache Panel</a></dt>
<dd>Adds a cache panel for <a href="http://github.com/robhudson/django-debug-toolbar">Django Debug Toolbar</a>.</dd>
<dt><a href="http://github.com/jbalogh/test-utils">Test-Utils</a></dt>
<dd>Tools we use testing in the Django/Jinja2/Nose setup.</dd>
<dt><a href="http://github.com/jsocol/bleach">Bleach</a></dt>
<dd>A library for sanitizing and linkifying user HTML, based on <a href="http://code.google.com/p/html5lib/">html5lib</a>.</dd>
<dt><a href="http://github.com/davedash/django-fixture-magic">Fixture Magic</a></dt>
<dd>Django management commands for working with fixture data.</dd>
</dl>
<p>Additionally, we expect both teams will probably use the following, eventually:</p>
<dl>
<dt><a href="http://github.com/jsocol/didyoumean">DidYouMean</a></dt>
<dd>A wrapper for <a href="http://hunspell.sourceforge.net/">Hunspell</a>, using <a href="http://code.google.com/p/pyhunspell/">PyHunspell</a> to provide spelling suggestions for searches.</dd>
<dt><a href="http://github.com/fwenzel/django-gearman">Django Gearman</a></dt>
<dd>Provides an easier interface from Django to the Python <a href="http://gearman.org/">Gearman</a> bindings.</dd>
<dt>AMO&#8217;s JS and CSS minification</dt>
<dd>AMO has already solved the problem of JS and CSS minification with Django and Jinja2.</dd>
</dl>
<p>And it&#8217;s not a released library, but SUMO has also been able to directly reuse code from AMO to simplify pagination.</p>
<p>Overall, it seems like we&#8217;re doing really well on this! It&#8217;s great to see the projects not just sharing code, but packaging and publishing it on Github and <a href="http://pypi.python.org/pypi">PyPI</a>. If any of the above is useful to you, go ahead and try it out! You can open issues with any of the packages on Github, or find us in <a href="irc://irc.mozilla.org/webdev">#webdev</a> in irc.mozilla.org.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/code-sharing-update-361/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP: Better Search Widget 1.1</title>
		<link>http://coffeeonthekeyboard.com/wp-better-search-widget-1-1-232/</link>
		<comments>http://coffeeonthekeyboard.com/wp-better-search-widget-1-1-232/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 17:05:05 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[l10n]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=232</guid>
		<description><![CDATA[Better Search Widget 1.1 is a significant upgrade to Better Search Widget that adds new features and fixes an old bug with internationalization. Features (New features in bold.) Optional default value. Optional, custom widget title. Optional onfocus and onblur listeners. Optional, customizable focus and blur colors. Custom button value. Custom field size. The built-in search [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://coffeeonthekeyboard.com/wp-content/uploads/2009/07/better-search-widget.zip">Better Search Widget 1.1</a> is a significant upgrade to <a href="http://coffeeonthekeyboard.com/wp-plugin-better-search-widget-113/" title="Better Search Widget">Better Search Widget</a> that adds new features and fixes an old bug with internationalization.</p>
<h3>Features</h3>
<p>(New features in bold.)</p>
<ul>
<li><strong>Optional default value</strong>.</li>
<li><strong>Optional,</strong> custom widget title<strong>.</strong></li>
<li><strong>Optional onfocus and onblur listeners.</strong></li>
<li><strong>Optional, customizable focus and blur colors.</strong></li>
<li>Custom button value.</li>
<li>Custom field size.</li>
</ul>
<p>The built-in search widget has only one of these features, the optional, custom title.</p>
<h4>Onfocus and Onblur</h4>
<p>In order to use the blur and focus colors, you must enable the onfocus and onblur event listeners. In order to use the listeners, you must specify a default value (otherwise none of this makes sense). Here&#8217;s an example:</p>
<div style="border: 1px solid #333; margin: 0.5em auto; padding: 0.7em 0; width: 50%; text-align: center;">
<form>
<input style="color: #999; width: 80%;" type="text" value="Default" onfocus="this.style.color='#333';if('Default'==this.value)this.value='';" onblur="if(''==this.value){this.style.color='#999';this.value='Default'}" /></form>
</div>
<h3>Bug Fixes</h3>
<p>A pretty serious typo meant that none of the internationalization code worked correctly. This has been fixed, and en_US, en_GB, and fr_FR localizations are available. de_DE is coming. If you&#8217;d like to translate, there is a .pot file included in the languages directory.</p>
<h3>License</h3>
<p>Better Search Widget is released under the <a href="http://www.opensource.org/licenses/mit-license.php">MIT License</a>. If you use it, or have suggestions for new features or bug fixes, let me know!</p>
<h3>Getting It</h3>
<p>You can download <a href="http://coffeeonthekeyboard.com/wp-content/uploads/2009/07/better-search-widget.zip">Better Search Widget 1.1</a> now in a Zip file. Or, to save yourself some trouble,  you can check it out of Subversion from</p>
<pre>svn co svn://jamessocol.com/better-search-widget/tags/1.1.0 ./better-search-widget</pre>
<p>(Run that in your <code>wp-content/plugins</code> directory.) Subversion will make it easiest to upgrade later.</p>
<h3>Roadmap</h3>
<p>Soon, though probably not today, I will be releasing Better Search Widget 2, which will take advantage of the new Widget API in WordPress 2.8. This will add support for multiple instances of the widget, but will require at least WordPress 2.8. You should upgrade, anyway.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/wp-better-search-widget-1-1-232/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Widget l10n</title>
		<link>http://coffeeonthekeyboard.com/widget-l10n-230/</link>
		<comments>http://coffeeonthekeyboard.com/widget-l10n-230/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 04:36:43 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[l10n]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=230</guid>
		<description><![CDATA[I spent some of today working on bringing a couple of WordPress widgets up-to-date (Better Search and Most Comments) only to discover there is a new widget API. I guess I haven&#8217;t been paying attention. I&#8217;ll probably start some 2.0 branches tomorrow to take advantage of the new API. I wish I didn&#8217;t know how [...]]]></description>
			<content:encoded><![CDATA[<p>I spent some of today working on bringing a couple of WordPress widgets up-to-date (<a href="http://jamessocol.com/projects/better-search-widget.php">Better Search</a> and <a href="http://jamessocol.com/projects/most-comments-widget.php">Most Comments</a>) only to discover there is a <a href="http://codex.wordpress.org/Widgets_API#Developing_Widgets_on_2.8.2B">new widget API</a>. I guess I haven&#8217;t been paying attention.</p>
<p>I&#8217;ll probably start some 2.0 branches tomorrow to take advantage of the new API. I wish I didn&#8217;t know how many people don&#8217;t keep their WordPress installations up to date, so I wouldn&#8217;t care about backwards compatibility.</p>
<p>At least both widgets got nice new, and functional, internationalization (i18n) code and new localization (l10n) files.</p>
<p>And BSW got a good feature update, incorporating some suggestions from <a href="http://mjml.de/">Marco Jung</a>, who is also, kindly, doing a German localization, and a few of my own. The built-in search widget has stepped up it&#8217;s game, and fixed the thing BSW was originally designed to fix (no widget title) so I have a higher bar to clear to justify the name &#8220;<em>Better</em> Search Widget.&#8221;</p>
<p>I&#8217;ll write up the new features tomorrow.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/widget-l10n-230/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript: Private Static Members, Part 2</title>
		<link>http://coffeeonthekeyboard.com/javascript-private-static-members-part-2-218/</link>
		<comments>http://coffeeonthekeyboard.com/javascript-private-static-members-part-2-218/#comments</comments>
		<pubDate>Tue, 19 May 2009 14:55:36 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=218</guid>
		<description><![CDATA[Finally, it&#8217;s time to finish up the lesson on private static members and methods in JavaScript. Last time, I introduced the technique of creating and immediately executing a function, using parentheses. I talked a little about returning a function and storing it in a variable. var myFunc = &#40;function &#40;&#41; &#123; &#160; return function &#40;&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>Finally, it&#8217;s time to finish up the lesson on private static members and methods in JavaScript.</p>
<p><a href="http://coffeeonthekeyboard.com/javascript-private-static-members-part-1-208/">Last time</a>, I introduced the technique of creating and immediately executing a function, using parentheses. I talked a little about <em>returning</em> a function and storing it in a variable.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> myFunc = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Hello, World!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">alert</span><span class="br0">&#40;</span>myFunc<span class="br0">&#41;</span>; <span class="co1">// &quot;function () &#8230; &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">myFunc<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Hello, World!</span></div>
</li>
</ol>
</div>
<p><span id="more-218"></span><br />
There are a lot of things you can do with this trick, like create interesting <a href="http://coffeeonthekeyboard.com/firefox-open-in-blank-tab-197/">bookmarklets</a>. But let&#8217;s see how you can use it to protect information on the class level.</p>
<p>Here we&#8217;ll take advantage of JavaScript&#8217;s scope behavior. Remember that a function uses the variables where it is <em>defined</em>, not executed. Perhaps a better example&#8230;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> myFunc = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> message = <span class="st0">&quot;I&#8217;m hidden.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span>message<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> message = <span class="st0">&quot;I&#8217;m visible.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">myFunc<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// &quot;I&#8217;m hidden.&quot;</span></div>
</li>
</ol>
</div>
<p>We can see that the inner function (which is returned from the outer function and set to <code>myFunc</code>) uses the value of <code>message</code> from the block where it was defined, not executed.</p>
<p>Now you should be able to see where this is going. Let&#8217;s look at a more complex example, extended from the <a href="http://coffeeonthekeyboard.com/private-variables-in-javascript-177/">first part</a>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Product = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> partNumRegex = <span class="re0">/^\d<span class="br0">&#123;</span><span class="nu0">4</span><span class="br0">&#125;</span>\-\d<span class="br0">&#123;</span><span class="nu0">2</span><span class="br0">&#125;</span>$/</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">function</span> <span class="br0">&#40;</span> num <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> partNum = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">setPartNum</span> = <span class="kw2">function</span> <span class="br0">&#40;</span> n <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>partNumRegex.<span class="me1">test</span><span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partNum = n;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">getPartNum</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> partNum;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>num<span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">setPartNum</span><span class="br0">&#40;</span>num<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> car = <span class="kw2">new</span> Product;</div>
</li>
<li class="li2">
<div class="de2">car.<span class="me1">setPartNum</span><span class="br0">&#40;</span><span class="st0">&#8217;1234-56&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> table = <span class="kw2">new</span> Product;</div>
</li>
<li class="li1">
<div class="de1">table.<span class="me1">setPartNum</span><span class="br0">&#40;</span><span class="st0">&#8217;345678&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Car: &quot;</span>+car.<span class="me1">getPartNum</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// &quot;Car: 1234-56&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Table: &quot;</span>+table.<span class="me1">getPartNum</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// &quot;Table: null&quot;</span></div>
</li>
</ol>
</div>
<p>What&#8217;s the advantage here? The variable <code>partNumRegex</code> is <em>not</em> copied by the <code>new</code> operator. In a small example like this, there is not much benefit, but if you had hundreds of <code>Product</code> objects, you could save a significant amount of memory.</p>
<p>There are a few major drawbacks: a public static (class) method cannot access a private static method or variable. For example:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Product = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> partNumRegex = <span class="re0">/^\d<span class="br0">&#123;</span><span class="nu0">4</span><span class="br0">&#125;</span>\-\d<span class="br0">&#123;</span><span class="nu0">2</span><span class="br0">&#125;</span>$/</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// snip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Product.<span class="me1">validPartNum</span> = <span class="kw2">function</span> <span class="br0">&#40;</span>num<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>partNumRegex.<span class="me1">test</span><span class="br0">&#40;</span>num<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// (1)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The class method <code>validPartNum</code> has no access to the private class variable <code>partNumRegex</code>, and so will throw an error at (1). Adding an accessor <em>must</em> be done on the <em>instance</em>, not the class, like so:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Product = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> partNumRegex = <span class="re0">/^\d<span class="br0">&#123;</span><span class="nu0">4</span><span class="br0">&#125;</span>\-\d<span class="br0">&#123;</span><span class="nu0">2</span><span class="br0">&#125;</span>$/</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">getPartNumRegex</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> partNumRegex;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// snip</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>But then you cannot access the private variable without first creating an instance of the class, and the accessor function is copied with the <code>new</code> operator. New methods added to the <code>Product.prototype</code> object are likewise unable to access the private static variables. This is a limitation of JavaScript.</p>
<p>Even with these limitations, the ability to hide implementation behind an agreed-upon interface is powerful. (JavaScript doesn&#8217;t actually have interfaces, but you can just write it down.) Behind the scenes, you could load new data via Ajax, without ever exposing your Ajax method to that new guy down the hall who likes to misuse everything he can:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Product = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> partNumRegex = <span class="re0">/^\d<span class="br0">&#123;</span><span class="nu0">4</span><span class="br0">&#125;</span>\-\d<span class="br0">&#123;</span><span class="nu0">2</span><span class="br0">&#125;</span>$/</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// private static function, not copied with &quot;new&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw2">function</span> loadPartData<span class="br0">&#40;</span>partNum<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// load data via Ajax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> partNum = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// snip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">setPartNum</span><span class="br0">&#40;</span>num<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>partNumRegex.<span class="me1">test</span><span class="br0">&#40;</span>num<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partNum = num;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> data = loadPartData<span class="br0">&#40;</span>partNum<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">productName</span> = data.<span class="me1">productName</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">price</span> = data.<span class="me1">price</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// snip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>That&#8217;s it for now. I owe most of these three articles to the book <a href="http://www.amazon.com/JavaScript-Design-Patterns-Recipes-Problem-Solution/dp/159059908X">Pro JavaScript Design Patterns</a>, by Ross Harmes and Dustin Diaz. Those two are geniuses, and anyone who wants to be a better JavaScript programmer would do well to pick up their book.</p>
<p>Next up, I&#8217;ll argue why the <code>&lt;dl&gt;</code> tag is a good way to display forms semantically.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/javascript-private-static-members-part-2-218/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript: Private Static Members, Part 1</title>
		<link>http://coffeeonthekeyboard.com/javascript-private-static-members-part-1-208/</link>
		<comments>http://coffeeonthekeyboard.com/javascript-private-static-members-part-1-208/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 14:47:54 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=208</guid>
		<description><![CDATA[A little while ago I talked about creating private variables and methods in JavaScript. This works, but is not necessarily efficient: each instance of the class creates new copies of the members. While that may be exactly what you want for instance variables (think of partNum in the old examples) it is not always ideal. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://coffeeonthekeyboard.com/private-variables-in-javascript-177/" title="A little while ago">A little while ago</a> I talked about creating private variables and methods in JavaScript. This works, but is not necessarily efficient: each instance of the class creates new copies of the members. While that may be exactly what you want for instance variables (think of <code>partNum</code> in the old examples) it is not always ideal.</p>
<p>The complexity jumps significantly, though. So I&#8217;m dividing this half into two parts.</p>
<p>To get started, we need to forget about all this Object-Oriented Programming for a minute and look at some of the neat <a href="http://coffeeonthekeyboard.com/firefox-open-in-blank-tab-197/" title="tricks">tricks</a> you can do with functions in JavaScript.</p>
<p><strong>Update:</strong> <a href="http://coffeeonthekeyboard.com/javascript-private-static-members-part-2-218/" title="Part 2">Part 2</a> is now available.<span id="more-208"></span></p>
<p>First, let&#8217;s take a look at a few ways to define a function in JavaScript:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> oneFunction <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// function body goes here</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> anotherFunction = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// function body goes here</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
</ol>
</div>
<p>The first example, <code>oneFunction</code> should be familiar to programmers from most languages. The second one is completely equivalent, but works slightly differently. In this case, the right-hand side, a function, is being assigned to the left-hand side, the var <code>anotherFunction</code>.</p>
<p>Remember that in JavaScript, functions are first-class objects, just like everything else, so can be declared with the <code>var</code> keyword. They can also be passed to other functions as arguments, or returned from functions.</p>
<p>Now let&#8217;s take a brief look at parentheses. What do parentheses really do? Essentially, they evaluate and return whatever expression is inside them. For example:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> five = <span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// the expression is &quot;5&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> nine = <span class="br0">&#40;</span><span class="nu0">2</span> * <span class="nu0">4</span><span class="br0">&#41;</span> + <span class="nu0">1</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// &quot;2 * 4&quot; is evaluated and returned as &quot;8&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> nottrue = <span class="br0">&#40;</span><span class="kw2">true</span> || <span class="kw2">false</span><span class="br0">&#41;</span> &amp;amp;&amp;amp; <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// &quot;true || false&quot; evalutes to &quot;true&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">var</span> thirty = <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="nu0">5</span>*<span class="nu0">5</span><span class="br0">&#41;</span><span class="nu0">-10</span><span class="br0">&#41;</span>*<span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// &quot;5*5&quot; is evaluated, then returned as 25 to 25-10,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// which evaluates to 15, which is returned and doubled</span></div>
</li>
</ol>
</div>
<p>So parentheses are slightly more powerful than the simple grouping operation we associate with them. Sometimes we see examples like this, which may be more illustrative:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> checkName <span class="br0">&#40;</span><span class="kw3">name</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw3">name</span>==<span class="st0">&#8216;admin&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So what happens if we combine parentheses&#8217; ability to evaluate and return code with our ability to define functions as an expression?</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> aFunc = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="coMULTI">/*&#8230;*/</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Of course, this is just the same as <code>anotherFunction</code> above, but you can see that the right-hand side &#8220;returns&#8221; a function. Let&#8217;s do something a little different now:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="kw3">name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Hello, &quot;</span>+<span class="kw3">name</span>+<span class="st0">&quot;!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="st0">&quot;World&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>What&#8217;s going on here? The first set of parentheses [<code>(function ... )</code>] evaluate and return the code inside, creating a function. The last set [<code>("World")</code>] are then <em>calling</em> the function created by the first set. Immediately.</p>
<p>This is a powerful technique, but has certain limits. The interior function is executed immediately on creation, which means the <abbr title="Document Object Model">DOM</abbr> will probably not be loaded yet. Once the function is executed, it is lost. Trying to save it in the left-hand side of an equation will only save the <em>return value</em> of the function, not the function itself. For example:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> aFunc = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;I&#8217;m not a function!&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">alert</span><span class="br0">&#40;</span>aFunc<span class="br0">&#41;</span>; <span class="co1">// Alerts &quot;I&#8217;m not a function!&quot;</span></div>
</li>
</ol>
</div>
<p>But, remember what I said about functions as first-class objects? It means we can use one function as a return value from another function:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> bFunc = <span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// 1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// 2</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Hello, World!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// 3</span></div>
</li>
</ol>
</div>
<p>The outer function (1) is executed immediately (3), and the var <code>bFunc</code> stores its return value, which is the inner function (2). So now, <code>bFunc</code> is a function, and calling <code>bFunc()</code> will alert &#8220;Hello, World!&#8221;.</p>
<p>We&#8217;ll stop for now. If this technique is new to you, play with it for a while. If not, just hang tight and I&#8217;ll get to <a href="http://coffeeonthekeyboard.com/javascript-private-static-members-part-2-218/" title="Part 2">Part 2</a> soon enough.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/javascript-private-static-members-part-1-208/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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 [...]]]></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>
		<slash:comments>4</slash:comments>
		</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; [...]]]></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;">
<ol>
<li class="li1">
<div class="de1"><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></div>
</li>
<li class="li1">
<div class="de1"><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></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><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 «</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; username=&#8217;$username&#8217; AND «</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; password=&#8217;$password&#8217; LIMIT 1;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</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;">
<ol>
<li class="li1">
<div class="de1"><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 «</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; username=&#8217;admin&#8217; AND «</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; password = &#8221; OR 1=1; &#8212; &#8216; LIMIT 1;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</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;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Check a password against the database</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @<a href="http://twitter.com/param">param</a> string $username The username to check</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* @<a href="http://twitter.com/param">param</a> string $password The (supposed) password</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @<a href="http://twitter.com/return">return</a> int 0=success, 1=bad username, 2=bad password</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><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></div>
</li>
<li class="li1">
<div class="de1">&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></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// the real_escape_string() function is much better</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// than add_slashes() for escaping MySQL database input</span></div>
</li>
<li class="li1">
<div class="de1">&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>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// I try to make my SQL queries as easy to read</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// as possible. (Not always very easy.)</span></div>
</li>
<li class="li1">
<div class="de1">&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></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="st0">&quot;FROM users &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="st0">&quot;WHERE username = &#8216;{$_username}&#8217; &quot;</span></div>
</li>
<li class="li2">
<div class="de2">&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>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// we&#8217;re assuming the query ran correctly</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// if we can&#8217;t return a row, then there&#8217;s no user with</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// that name</span></div>
</li>
<li class="li1">
<div class="de1">&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></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// return code for bad username</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// now, assuming the password was hashed with crypt()</span></div>
</li>
<li class="li1">
<div class="de1">&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> != «</div>
</li>
<li class="li1">
<div class="de1">&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></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">2</span>; <span class="co1">// return code for bad password</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// return code for success</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</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;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Usernames must start with a letter, and contain</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// only letters, numbers, underscores and dots, but</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// must not end with a dot or underscore.</span></div>
</li>
<li class="li1">
<div class="de1"><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>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><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></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// the username matches our allowed syntax</span></div>
</li>
<li class="li2">
<div class="de2">&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>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&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></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// the do_login() function is an exercise</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// to the reader</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; do_login<span class="br0">&#40;</span><span class="re0">$username</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// the username was bad, or the username/password</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// was wrong</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// die() is an overly simplistic choice, here.</span></div>
</li>
<li class="li1">
<div class="de1"><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>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</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>
		<slash:comments>0</slash:comments>
		</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 [...]]]></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>&#8216;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>
		<slash:comments>0</slash:comments>
		</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 [...]]]></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>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

