<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Missing Features</title>
	
	<link>http://missingfeatures.com</link>
	<description>Usability, software and user experience design.</description>
	<lastBuildDate>Tue, 10 Nov 2009 16:19:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/missingfeatures" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>CakePHP class_registry.php Fatal Error</title>
		<link>http://missingfeatures.com/2009/11/10/cakephp-class_registry-php-fatal-error/</link>
		<comments>http://missingfeatures.com/2009/11/10/cakephp-class_registry-php-fatal-error/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 16:18:15 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=251</guid>
		<description><![CDATA[Your correspondent ran into this rather crippling fatal error while working on a CakePHP application:
Fatal error:  Class &#8221; not found in path-to-cake\cake\libs\class_registry.php on line 140
Googling, clearing the CakePHP cache and several Apache restarts didn&#8217;t offer a solution. The problem turned out to be a stupid mistake in a model file that had a blank [...]]]></description>
			<content:encoded><![CDATA[<p>Your correspondent ran into this rather crippling fatal error while working on a CakePHP application:</p>
<blockquote><p><strong>Fatal error</strong>:  Class &#8221; not found in <strong>path-to-cake\cake\libs\class_registry.php</strong> on line <strong>140</strong></p></blockquote>
<p>Googling, clearing the CakePHP cache and several Apache restarts didn&#8217;t offer a solution. The problem turned out to be a stupid mistake in a model file that had a <strong>blank hasOne</strong> relationship setting:</p>
<blockquote><p>var $hasOne = &#8221;;</p></blockquote>
<p>Fixing the half-completed model relationship fixed the issue (either remove the line or enter in the name of a model for the relationship).</p>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/11/10/cakephp-class_registry-php-fatal-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>StackOverflow DC Dev Days Wrap Up</title>
		<link>http://missingfeatures.com/2009/11/10/stackoverflow-dc-dev-days-wrap-up/</link>
		<comments>http://missingfeatures.com/2009/11/10/stackoverflow-dc-dev-days-wrap-up/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 16:14:07 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=247</guid>
		<description><![CDATA[Your correspondent spent the day at the StackOverflow Dev Day conference in Washington, DC. Overall the conference was great; Joel, Jeff and the Carsonified team should be very proud of all their hard work.
Highlights

Power strips were all over the place, under the seats, for laptop power. Thank you!
It was neat getting to chat to members [...]]]></description>
			<content:encoded><![CDATA[<p>Your correspondent spent the day at the <a title="Fun!" href="http://stackoverflow.carsonified.com/events/washingtondc/">StackOverflow Dev Day</a> conference in Washington, DC. Overall the conference was great; <a title="The founder of FogCreek" href="http://www.joelonsoftware.com/">Joel</a>, <a title="Coding Horror is his blog" href="http://www.codinghorror.com/blog/">Jeff</a> and the <a title="Conference 2.0" href="http://carsonified.com/">Carsonified</a> team should be very proud of all their hard work.</p>
<p><strong>Highlights</strong></p>
<ul>
<li>Power strips were all over the place, under the seats, for laptop power. Thank you!</li>
<li>It was neat getting to chat to members of the FogCreek team face to face</li>
<li>The jQuery team does a great job of branding <a title="He was great" href="http://twitter.com/rworth">jQuery speakers</a>; the slides were <em>fantastic: </em>expertly branded, logically ordered and compellingly supportive of the speaker</li>
<li><strong>Great keynote theme</strong>: &#8220;How does your software help me copy my DNA?&#8221;</li>
<li>The between speaker interlude program was great (having a count down timer made it easy to spend the brief downtime efficiently and the twitter feed was compellingly interactive)</li>
<li>The <a title="Finally!" href="http://www.joelonsoftware.com/items/2009/10/08.html">wifi actually worked</a></li>
<li>Lunch was both accessible and yummy (a rarity for conference food)</li>
<li>The discussion topic by area lunch was a great idea</li>
<li>The opening [scrums] (sp?) video was funny</li>
<li><a title="Solid speakers" href="http://stackoverflow.carsonified.com/events/washingtondc/">All of the talks</a> were great: jQuery, iPhone development, the problems of backwards compatibility in language design, ASP.NET MVC, Google App Engine and the keynote.</li>
</ul>
<p><strong>Low lights</strong></p>
<ul>
<li>The front door staff actually asked for paper tickets; you can <em>fly on a plane</em> without a paper ticket</li>
<li>The name badges didn&#8217;t have StackOverflow rep printed on them (nor did they have a space to write that in)</li>
<li>Parking was a pain</li>
<li>The seats in the venue (balcony at least)  had no leg room, even for your <a title="Take it away Randy" href="http://www.youtube.com/watch?v=1NvgLkuEtkA">vertically challenged</a> correspondent</li>
<li>It would have been nice if Jeff Atwood was on hand</li>
<li>Bruce Eckel&#8217;s presentation on the problems of backwards compatibility could have used additional visual support and a bit more dialog polish</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/11/10/stackoverflow-dc-dev-days-wrap-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Analytics Training Outline</title>
		<link>http://missingfeatures.com/2009/10/19/google-analytics-training-outline/</link>
		<comments>http://missingfeatures.com/2009/10/19/google-analytics-training-outline/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 23:23:45 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[google analytics]]></category>
		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=241</guid>
		<description><![CDATA[Your correspondent recently had to deliver a training session on Google Analytics to savvy but non-technical users for a content driven community site. The audience of the training were the people behind the site and hadn&#8217;t used Google Analytics before.
This training outline worked really well:

About

What Google Analytics tracks


 So much data!
 Logging in


 Core features

Understanding [...]]]></description>
			<content:encoded><![CDATA[<p>Your correspondent recently had to deliver a training session on Google Analytics to savvy but non-technical users for a content driven community site. The audience of the training were the people behind the site and hadn&#8217;t used Google Analytics before.</p>
<p>This training outline worked really well:</p>
<ul>
<li>About
<ul>
<li>What Google Analytics tracks</li>
</ul>
<ul>
<li> So much data!</li>
<li> Logging in</li>
</ul>
</li>
<li> Core features
<ul>
<li>Understanding the layout</li>
<li>Using date ranges</li>
<li>Using the help icon</li>
<li> Using the export, email buttons</li>
</ul>
</li>
<li>Dashboard</li>
<li>Main metrics
<ul>
<li>Visitors</li>
<li> Traffic sources</li>
<li> Content</li>
</ul>
</li>
<li>Key metrics
<ul>
<li> Top content</li>
<li> Top exit pages</li>
<li> Search keywords</li>
<li>Metrics for your site</li>
</ul>
</li>
<li>Advanced topics
<ul>
<li>Goals, not useful for them</li>
<li> Custom reports</li>
</ul>
</li>
<li>The Help section</li>
<li>Questions</li>
</ul>
<p>Tips for training:</p>
<ol>
<li>Occasionally point out how the common page elements appear on various pages (email, export, date range, etc).</li>
<li>Occasionally point out how to add content to the dashboard, as you show metrics.</li>
<li>Show how easy it is to use the Google help site by searching for a term, and showing the glossary.</li>
<li>Just show and briefly explain the advanced topics are, don&#8217;t delve into them.</li>
<li>Spend two minutes thinking specifically about what the two metrics you would look at if you were responsible for the site, in order to be able to act on them.</li>
<li>This training takes about 45 minutes; expect 30 more minutes of questions.</li>
</ol>
<p>And don&#8217;t forget to send an <a title="Write an agenda every time" href="/2008/01/24/dont-waste-time-write-an-agenda/">agenda</a> to the team ahead of time:</p>
<ol>
<li> About Google Analytics</li>
<li> Logging in</li>
<li> Core features</li>
<li> Dashboard</li>
<li> Main metrics</li>
<li> Key metrics</li>
<li> Advanced features</li>
<li>Questions &amp; wrap-up</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/10/19/google-analytics-training-outline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding and styling an RSS feed to a view in Drupal</title>
		<link>http://missingfeatures.com/2009/07/14/adding-and-styling-an-rss-feed-to-a-view-in-drupal/</link>
		<comments>http://missingfeatures.com/2009/07/14/adding-and-styling-an-rss-feed-to-a-view-in-drupal/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 16:03:20 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=227</guid>
		<description><![CDATA[Here is how you add an RSS feed to a Drupal 6 page that is powered by a view:

Edit your view
Add a display called &#8220;Feed&#8221;
Specify a path for the RSS, like /rss

Drupal should automatically add the RSS auto-discovery link to your site, but often this doesn&#8217;t happen. You can add this manually by editing the [...]]]></description>
			<content:encoded><![CDATA[<p>Here is how you add an RSS feed to a Drupal 6 page that is powered by a view:</p>
<ol>
<li>Edit your view</li>
<li>Add a display called &#8220;Feed&#8221;</li>
<li>Specify a path for the RSS, like /rss</li>
</ol>
<p>Drupal should automatically add the RSS auto-discovery link to your site, but often this doesn&#8217;t happen. You can add this manually by editing the page.tpl.php file in your theme and following <a title="How to add an RSS meta tag for auto-discovery" href="http://www.rssboard.org/rss-autodiscovery">these directions</a>.</p>
<p>If you want to customize the theme it gets a bit more tricky. You can add new files to your theme folder to customize the RSS feed:</p>
<ol>
<li>Edit your view</li>
<li>Click on the feed display</li>
<li>Click on the &#8220;Theme Information&#8221; link</li>
</ol>
<p>The first file lets you alter the RSS wrapper around your RSS content, and the second file lets you alter the style of each item in the feed. However, you don&#8217;t really have any additional information about your node, so you can&#8217;t add CCK fields or other information.</p>
<p><strong>Nota bene</strong>: If you add either file be sure to click the &#8220;Rescan folder&#8221; icon, otherwise Drupal won&#8217;t see the file.</p>
<p>There is a <a title="How to get the full $node data in an RSS theme file" href="http://www.timtoon.com/blog/2009/05/27/customizing-an-rss-feed-using-drupal-and-views/">great post over</a> at TIMtheToon that has a great function you can add to your theme to add the full $node data to your RSS template file.</p>
<p><strong>Nota bene</strong>: Don&#8217;t forget to <a title="How to reset the Drupal theme registry" href="http://agaric.com/note/how-reset-theme-registry">reset the theme registry</a> to Drupal detects changes to your theme file.</p>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/07/14/adding-and-styling-an-rss-feed-to-a-view-in-drupal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How not to run a software licensing portal</title>
		<link>http://missingfeatures.com/2009/07/14/how-not-to-run-a-software-licensing-portal/</link>
		<comments>http://missingfeatures.com/2009/07/14/how-not-to-run-a-software-licensing-portal/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 11:48:30 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=229</guid>
		<description><![CDATA[Adobe makes some great software, but the licensing management experience for corporate licenses is an embarrassment.
Your correspondent purchased some additional corporate licenses for Adobe InCopy for two team members. In order to get the serial numbers for the software you need to log into the hapless Adobe Licensing site: http://licensing.adobe.com.
Unfortunately the licenses your correspondent purchased [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_231" class="wp-caption alignright" style="width: 160px"><a href="http://missingfeatures.com/wp-content/uploads/2009/07/adobe-licensing.png"><img class="size-thumbnail wp-image-231" title="Adobe licensing error messages, including debug info." src="http://missingfeatures.com/wp-content/uploads/2009/07/adobe-licensing-150x150.png" alt="Adobe licensing error messages, including debug info." width="150" height="150" /></a><p class="wp-caption-text">Adobe licensing error messages, including debug info.</p></div>
<p>Adobe makes some great software, but the licensing management experience for corporate licenses is an embarrassment.</p>
<p>Your correspondent purchased some additional corporate licenses for Adobe InCopy for two team members. In order to get the serial numbers for the software you need to log into the hapless Adobe Licensing site: <a href="http://licensing.adobe.com">http://licensing.adobe.com</a>.</p>
<p>Unfortunately the licenses your correspondent purchased were associated to a new licensing.adobe.com login ID, but needed to be associated to the preexisting ID linked to  other Adobe software already purchased.</p>
<p>Your correspondent had two goals: obtain the license keys and merge this login ID to another login ID. Attempting this <span style="text-decoration: line-through;">feat </span>trivial task revealed a variety of problems:</p>
<ol>
<li>There is no way to merge accounts in licensing.adobe.com.</li>
<li>It takes 6+ clicks to get from the contact us link on licensing.adobe.com to a support number (which isn&#8217;t the direct support line).</li>
<li>You must wait on hold and spend several minutes at the main support line until you are transferred to the licensing team, resulting in a lost queue position and additional hold time.</li>
<li>If you attempt to login with the wrong password several times your account is locked out and you <strong>must </strong>call into Adobe to get your account reactivated.</li>
<li>Your correspondent was transferred to a line that rang about 15 times and then soberly declared: &#8220;Your party is not answering. Your call will now be disconnected.&#8221;</li>
<li>Login error and alert messages appear in a tiny font and include actual debugging output.</li>
</ol>
<p>There are a variety of lessons we can take-away from this:</p>
<ol>
<li><strong>Queue positions ought to be respected when transferred to different departments.</strong> If you wait for 10 minutes for the main team and then are transferred to another team queue you should be placed 10 minutes ahead of everyone else.</li>
<li>Unless you are creating the login routine for GetNukeLaunchCodes.gov, <strong>account lockouts should life after a set time automatically</strong>.</li>
<li>Licensing sites should include tools that actual help the busy IT professional, like an <strong>instant combine/merge accounts feature</strong>.</li>
<li><strong>Search for and eliminate dead end phone paths</strong>. Phone menu systems, like software, need to <a href="http://missingfeatures.com/2007/07/30/on-the-importance-of-failing-well/">fail well</a>. In this case, that means routing a person back to a customer service rep (at the top of the queue) when transfers aren&#8217;t picked up properly.</li>
<li>Check the work of your programmers to <strong>ensure that debugging information isn&#8217;t revealed to the user</strong> on production systems. It&#8217;s unprofessional and possibly a security risk.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/07/14/how-not-to-run-a-software-licensing-portal/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Conference presentation tips</title>
		<link>http://missingfeatures.com/2009/07/09/conference-presentation-tips/</link>
		<comments>http://missingfeatures.com/2009/07/09/conference-presentation-tips/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 19:27:03 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[Software Industry]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=225</guid>
		<description><![CDATA[The pitfalls of using PowerPoint slides for presentations are well known. However, conferences would be much improved if organizers gave presenters a few simple guidelines to follow.
Here are four quick tips:

Your first/title slide should include the presentation title, your name, your title, your company and some kind of contact (this all lends credibility);
When showing an [...]]]></description>
			<content:encoded><![CDATA[<p>The <a title="Seth Godin post" href="http://sethgodin.typepad.com/seths_blog/2007/01/really_bad_powe.html">pitfalls of using PowerPoint slides for presentations</a> are well known. However, conferences would be much improved if organizers gave presenters a few simple guidelines to follow.</p>
<p>Here are four quick tips:</p>
<ol>
<li>Your first/title slide should include the presentation title, your name, your title, your company and some kind of contact (this all lends credibility);</li>
<li>When showing an image on a slide make the image as large as the slide;</li>
<li>Limit to 2-3 words per slide; and,</li>
<li>Do not read slides, have a conversation (each slide should either remind you of key themes to touch on during the chatter for that slide or evoke a reaction &#8212; thought, laughter, emotion, etc &#8212; in the audience).</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/07/09/conference-presentation-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using an .htaccess file to standardize your URL</title>
		<link>http://missingfeatures.com/2009/05/25/using-an-htaccess-file-to-standardize-your-url/</link>
		<comments>http://missingfeatures.com/2009/05/25/using-an-htaccess-file-to-standardize-your-url/#comments</comments>
		<pubDate>Mon, 25 May 2009 23:48:35 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=214</guid>
		<description><![CDATA[When creating a new site it&#8217;s a good idea to standardize on your domain name (www or no www?) and to gracefully handle HTTPS/SSL requests (do you have an SSL site, or should you redirect users off of it?). It&#8217;s also a good idea to compress the text files your server returns (like HTML, CSS [...]]]></description>
			<content:encoded><![CDATA[<p>When creating a new site it&#8217;s a good idea to standardize on your domain name (www or no www?) and to gracefully handle HTTPS/SSL requests (do you have an SSL site, or should you redirect users off of it?). It&#8217;s also a good idea to compress the text files your server returns (like HTML, CSS and JavaScript pages).</p>
<p>You can do all this with an .htaccess file.</p>
<p>The great power of .htaccess files is that they can include rewrite rules via Apache&#8217;s <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite module</a>. There are <a href="http://httpd.apache.org/docs/2.0/misc/rewriteguide.html">loads of things rewrite rules</a> can do, so we decided to create a standard file that would handle a few things:</p>
<ol>
<li>Redirect all HTTPS/SSL traffic to the same URL but to HTTP;</li>
<li>Redirect all traffic without a &#8220;www&#8221; entered to the same URL but with a &#8220;www.&#8221; added; and,</li>
<li>Compress all HTML, CSS and JavaScript  files (to speed up website browsing).</li>
</ol>
<p>The goal is that requests to:</p>
<blockquote><p>https://example.com/some/page</p></blockquote>
<p>will be gracefully redirected to</p>
<blockquote><p>http://www.example.com/some/page</p></blockquote>
<p>A clean, standard URL with no risk of SSL confusion.</p>
<p><strong>The .htaccess file</strong></p>
<blockquote><p># Standard .htaccess file<br />
# &#8211; Compress text documents for speed<br />
# &#8211; Rewrite https to http and no www to www</p>
<p>&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine on<br />
# move off of https<br />
RewriteCond %{HTTPS} on<br />
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301]</p>
<p>#move to www if no www is entered<br />
RewriteCond %{HTTP_HOST} !^(www\.).*<br />
RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]<br />
&lt;/IfModule&gt;</p>
<p># compress stuff for faster delivery<br />
AddOutputFilterByType DEFLATE text/css text/javascript application/x-javascript text/html<br />
Header append Vary User-Agent</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/05/25/using-an-htaccess-file-to-standardize-your-url/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firewall Configuration Interfaces</title>
		<link>http://missingfeatures.com/2009/04/03/firewall-configuration-interfaces/</link>
		<comments>http://missingfeatures.com/2009/04/03/firewall-configuration-interfaces/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 18:58:41 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=189</guid>
		<description><![CDATA[Your correspondent has worked with loads of different firewall configuration screens over the years, like Linux&#8217;s IPTables (command line), various Linksys and D-Link home and small business routers, the Apple OS X firewall, the Plesk IPTables interface and Windows tools like Windows Firewall (classic, Server 2008), BlackIce, Kerio Personal Firewall and on and on and [...]]]></description>
			<content:encoded><![CDATA[<p>Your correspondent has worked with loads of different firewall configuration screens over the years, like Linux&#8217;s IPTables (command line), various Linksys and D-Link home and small business routers, the Apple OS X firewall, the Plesk IPTables interface and Windows tools like Windows Firewall (classic, Server 2008), BlackIce, Kerio Personal Firewall and on and on and on.</p>
<p>Sadly, must of these firewall configuration screens are painful to use.</p>
<p><a href="http://missingfeatures.com/wp-content/uploads/2009/04/router-interface.png"><img class="alignright size-thumbnail wp-image-194" style="margin: 5px;" title="Linksys RV042 Firewall edit interface" src="http://missingfeatures.com/wp-content/uploads/2009/04/router-interface-150x150.png" alt="Linksys RV042 Firewall edit interface" width="150" height="150" align="right" /></a>Take the <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16833124160">Linksys RV042</a>, a reliable business-class router well suited for a small office. Managing the firewall can involve updates to three separate screens. Even the buttons on the edit rule screen (see right), are confusing: &#8220;Return&#8221;, &#8220;Save Settings&#8221; and &#8220;Cancel Changes&#8221;.</p>
<p>There are probably several reasons why this happens &#8212; limited budget, schedule, etc &#8212; but the likely explanation is that when the engineers schedule designing the new router they leave the admin interface as the last task, hate doing it and spend as little amount of time as possible on this &#8220;tail-end&#8221; work.</p>
<p>The ironic part of this logic is that it&#8217;s the admin interface where your customers spend 90% of their interaction time with the product. Sure, your customers <em>appreciate </em>(in the broadest sense) how quickly your little box moves tiny packets around, but they really don&#8217;t care so long as:</p>
<ol>
<li>It doesn&#8217;t crash; and,</li>
<li>The admin interface isn&#8217;t <em>too </em>painful.</li>
</ol>
<p>Given this, I&#8217;ve come up with a few really simple design guidelines for firewall interface designs.</p>
<p><strong>Firewall configuration user experience design screen rules</strong>:</p>
<ol>
<li><strong>No pagination</strong>. Pagination of firewall rules is as pointless as pagination on online news stories: there is rarely enough content to justify it.</li>
<li><strong>Poor </strong><strong>or non-existent labeling</strong>. As soon as you write your 11th firewall rule you start to forget for what the first 10 rules are used. Firewall configuration should support both tracking a rule name and labels on individual IP ranges.</li>
<li><strong>Allow multiple, user-entered IP ranges</strong>. Users should be able to enter in IPs in three formats: single IPs, human ranges (like 2.5.7.1-2.5.7.123) and in netmask form (for the nerds). And you must allow users to enter in a <strong>mix of all three</strong>.</li>
<li><strong>Clear interface</strong>. This should be a no-brainer, but loads of configuration screens have glaring UI gaffes. Keep it simple and standard.</li>
<li><strong>Combine stuff</strong>. Port forwarding, NAT, firewall, etc, can be combined into a single interface for most routers.</li>
</ol>
<p><strong>Mock-Up Screens</strong></p>
<p>To demonstrate some of these ideas, your correspondent has created a set of <a title="HTML mock-ups of firewall configuration" href="http://justinemond.com/firewall/">HTML mock-up screens</a>. Sure, this interface won&#8217;t work for a high-end Cisco router, but it should include the functionality you might expect from a home or small business router.</p>
<p>These are simple mock-ups; there are a few things missing like support for multiple ports and a way to move a rule several positions with one click. However, these screens hopefully demonstrate that firewall configuration screens can be made to be user friendly.</p>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2009/04/03/firewall-configuration-interfaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Blended SSL and non-SSL in CakePHP Applications</title>
		<link>http://missingfeatures.com/2008/12/15/using-blended-ssl-and-non-ssl-in-cakephp-applications/</link>
		<comments>http://missingfeatures.com/2008/12/15/using-blended-ssl-and-non-ssl-in-cakephp-applications/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 15:55:04 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP tips]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=188</guid>
		<description><![CDATA[(This is the fourth post in a series of posts on CakePHP tips.)
Your correspondent ran into a problem with a CakePHP site where the login and sign-up pages used an SSL connection, but the rest of the site forced non-SSL connections.
Why blend SSL and non-SSL? The application itself didn&#8217;t contain any sensitive information, and SSL [...]]]></description>
			<content:encoded><![CDATA[<p>(This is the fourth post in a <a href="../category/cakephp-tips/">series of posts on CakePHP tips</a>.)</p>
<p>Your correspondent ran into a problem with a CakePHP site where the login and sign-up pages used an SSL connection, but the rest of the site forced non-SSL connections.</p>
<p>Why blend SSL and non-SSL? The application itself didn&#8217;t contain any sensitive information, and SSL is a massive CPU drain. So to save cycles, we forced non-SSL for all pages but login and sign up (passwords and credit cards).</p>
<p>The problem was that after the user was redirected from the SSL login process page to the logged-in homepage, the cookie that stored the session reference for the user didn&#8217;t exist in the non-SSL site and thus the session didn&#8217;t exist and the user was immediately logged out.</p>
<p>A <a href="http://stackoverflow.com/questions/308659/session-not-saving-when-moving-from-ssl-to-non-ssl">post over at stackoverflow</a> and some quick Googling strongly hinted that that PHP was configured on the server to create secure cookies, that is cookies that are only accessible over SSL. However, your correspondent tried disabled secure cookies with <em>ini_set()</em>, to no avail.</p>
<p>Further digging revealed the real issue: the cookies were being created as secure cookies on login &#8212; in spite of my override setting in the bootstrap file &#8212; because the core CakePHP routine for cookie creation sets the &#8220;create secure cookies&#8221; PHP setting on-the-fly just before creating the cookie, whenever a page is running under SSL.</p>
<p>The solution was a foreced modification to CakePHP core, something to be avoided at all costs but something that had to be done.</p>
<p>The solution is to comment out this snippet in /cake/lib/session.php, around line 420:</p>
<blockquote><p>if ($ini_set &amp;&amp; env(&#8217;HTTPS&#8217;)) {<br />
ini_set(&#8217;session.cookie_secure&#8217;, 1);<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2008/12/15/using-blended-ssl-and-non-ssl-in-cakephp-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Proper CakePHP Redirects</title>
		<link>http://missingfeatures.com/2008/12/15/using-proper-cakephp-redirects/</link>
		<comments>http://missingfeatures.com/2008/12/15/using-proper-cakephp-redirects/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 15:34:09 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP tips]]></category>

		<guid isPermaLink="false">http://missingfeatures.com/?p=187</guid>
		<description><![CDATA[(This is the third post in a series of posts on CakePHP tips.)
CakePHP has a handy helper to redirect users to another page, used in controllers:
$this-&#62;redirect(&#8217;controller/action&#8217;)
Be careful: Apparently in CakePHP 1.1 and earlier this-&#62;redirect() doesn&#8217;t call exit() after the header redirect is set, so the PHP code after the redirect in your controller will get [...]]]></description>
			<content:encoded><![CDATA[<p>(This is the third post in a <a href="../category/cakephp-tips/">series of posts on CakePHP tips</a>.)</p>
<p>CakePHP has a handy helper to redirect users to another page, used in controllers:</p>
<blockquote><p>$this-&gt;redirect(&#8217;controller/action&#8217;)</p></blockquote>
<p>Be careful: <a href="http://cakebaker.42dh.com/2007/03/28/redirect-with-exit/">Apparently</a> in CakePHP 1.1 and earlier this-&gt;redirect() <strong>doesn&#8217;t call exit()</strong> after the header redirect is set, so the PHP code <em>after</em> the redirect in your controller will get executed. Yikes! That&#8217;s a major security hole.</p>
<p>Happily, this issue is fixed in CakePHP 1.2, which defaults to calling exit after the redirect. Even so, the proper syntax for writing a CakePHP redirect is:</p>
<blockquote><p>$this-&gt;redirect(&#8217;controller/action&#8217;,null,true);</p></blockquote>
<p>The second parameter lets you specify an <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">HTTP response code</a> to return with the redirect command. The last parameter (which defaults to true), specifies whether to call exit() after the redirect. Even though it defaults to true, you really should write your redirects this way.</p>
]]></content:encoded>
			<wfw:commentRss>http://missingfeatures.com/2008/12/15/using-proper-cakephp-redirects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
