<?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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>outbreak</title>
	
	<link>http://friedcellcollective.net/outbreak</link>
	<description>bursts of ideas and rants by the alterego</description>
	<lastBuildDate>Tue, 15 May 2012 08:55:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/outbreak" /><feedburner:info uri="outbreak" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>A website is usually not just one product</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/JN5-E1Qy9fQ/</link>
		<comments>http://friedcellcollective.net/outbreak/2012/05/15/a-website-is-usually-not-just-one-app/#comments</comments>
		<pubDate>Tue, 15 May 2012 08:53:40 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=420</guid>
		<description>By releasing Inside government we were testing a proposition (‘all of what government is doing and why in one place’), and two supporting products (a frontend website and a content management system). Ross Ferguson People usually forget this. When you don&amp;#8217;t, your project has way more chances to succeed.</description>
			<content:encoded><![CDATA[<blockquote cite="http://digital.cabinetoffice.gov.uk/2012/05/14/feedback-isnt-just-for-cobain-and-hendrix-what-we-heard-from-the-inside-government-beta/">
<p>By releasing Inside government we were testing a proposition (‘all of what government is doing and why in one place’), and two supporting products (a frontend website and a content management system).</p>
<p><cite>Ross Ferguson</cite></p>
</blockquote>
<p>People usually forget this. When you don&#8217;t, <a href="http://digital.cabinetoffice.gov.uk/2012/05/14/feedback-isnt-just-for-cobain-and-hendrix-what-we-heard-from-the-inside-government-beta/">your project</a> has way more chances to succeed.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/porocIEVb-mcuGFfANnJwMQSQ90/0/da"><img src="http://feedads.g.doubleclick.net/~a/porocIEVb-mcuGFfANnJwMQSQ90/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/porocIEVb-mcuGFfANnJwMQSQ90/1/da"><img src="http://feedads.g.doubleclick.net/~a/porocIEVb-mcuGFfANnJwMQSQ90/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=JN5-E1Qy9fQ:bIN7svMs_KQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=JN5-E1Qy9fQ:bIN7svMs_KQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=JN5-E1Qy9fQ:bIN7svMs_KQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=JN5-E1Qy9fQ:bIN7svMs_KQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=JN5-E1Qy9fQ:bIN7svMs_KQ:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2012/05/15/a-website-is-usually-not-just-one-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2012/05/15/a-website-is-usually-not-just-one-app/</feedburner:origLink></item>
		<item>
		<title>Preloading resources</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/FfxtaePR90A/</link>
		<comments>http://friedcellcollective.net/outbreak/2011/10/03/preloading-resources/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 09:05:36 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=367</guid>
		<description>You might have read that when optimizing your site for speed HTTP requests are something to look at &amp;#8211; less requests mean less waiting and usually a faster site. When doing that for CSS you&amp;#8217;re faced with a dilemma: Put all of CSS in one file, which means less requests, but also means that the [...]</description>
			<content:encoded><![CDATA[<p><a href="http://developer.yahoo.com/performance/rules.html#num_http">You might have read</a> that when optimizing your site for speed <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> requests are something to look at &#8211; less requests mean less waiting and usually a faster site. When doing that for <a href="http://www.w3.org/Style/CSS/">CSS</a> you&#8217;re faced with a dilemma:</p>
<ol>
<li><strong>Put all of CSS in one file</strong>, which means less requests, but also means that the first time people land on your site, they will wait longer than needed to see the content which could mean a ruined first impression.</li>
<li><strong>Put CSS in per-section files</strong>, which means less loading up front but more request as people drill down into different sections of the page.</li>
</ol>
<p>When using the first option your only focus can be on how to optimize the CSS so that it loads as fast as possible and is as small as possible. As you have less files you can easily have that file minified and gzipped even if you&#8217;re not using a deployment solution that will do that for you.</p>
<p>Using the second variant gives you more options &#8211; you should still optimize the files, but now you have the option of deciding when to load them to make sure that the landing page does not get hit by the added request.</p>
<p>Even though I started with CSS preloading can be done for any resources needed on the page &#8211; fonts, scripts, images.</p>
<h3>When to preload?</h3>
<p>An very obvious case is a search results page. It usually has a very distinct design that requires certain resources not needed anywhere else. But that&#8217;s not enough &#8211; you need to know when the user will these resources so you don&#8217;t go preloading everything just in case. With search it&#8217;s when they focus inside a search box &#8211; they start typing the query, while you start preloading the resources in the background.</p>
<p>Other obvious places to preload resources:</p>
<ul>
<li>My account &#8211; when users click log-in or focus into the login form</li>
<li>Checkout &#8211; when users add stuff to their cart</li>
</ul>
<p>Other less obvious places are landing pages when the choice a user makes turns into many sub-options, especially when products have the same resources used on the content pages.</p>
<h3>To the code!</h3>
<p>If you&#8217;re already using a library it probably provides AJAX methods and event methods. If not, you can search <a href="http://microjs.com/#ajax">MicroJS</a> to find one and adapt the syntax.</p>
<p>A simple preloader is almost as simple as <em>helloWorld</em> &#8211; the only thing you need to make sure is that the type of data type is set to <code>text</code> so that it does not get executed.</p>
<pre><code>window.preload = function (src) {
	$.get(src, null, null, 'text');
} // call with preload('somefile.css');
</code></pre>
<p>If you want to allow the loading of multiple files at once you can detect if the passed element is an array.</p>
<pre><code>window.preload = function (data) {
	var a = $.isArray(data) ? data : [data];
	$.each(a, function (i, n) {
		$.get(n, null, null, 'text');
	});
}
// call with preload('somefile.css');
// or preload(['somefile.css', 'otherfile.js']);</code></pre>
<p>If you prefer to call the function with many parameters you can just use arguments in the each function call.</p>
<pre><code>window.preload = function () {
	$.each(arguments, function (i, n) {
		$.get(n, null, null, 'text');
	});
}
// call with preload('somefile.css');
// or preload('somefile.css', 'otherfile.js');</code></pre>
<p>Key element is to load the resources after the window.onload has happened &#8211; this means that any resources needed for the page to function properly have been loaded. If you do stuff sooner you might have to wait for other resources like fonts, images, videos. This means you need to know if the onload event happened &#8211; if it has, preload immediately, otherwise wait for the event to fire.</p>
<pre><code>(function () {
	var win = window,
		$ = window.jQuery,
		$win = $(win);
	$win.load(function () {
		$win.data('loaded', true);
	});
	win.preload = function (data) {
		var a = $.isArray(data) ? data : [data],
			fn = function (i, n) {
				$.each(a, function () {
					$.get(n, null, null, 'text');
				});
			};
		if ($win.data('loaded')) {
			fn();
		} else {
			$win.load(fn);
		}
	};
}());
// call with preload('somefile.css');
// or preload(['somefile.css', 'otherfile.js']);</code></pre>
<p>As you can see I also did a few other things &#8211; wrapped the code into a function to isolate all the variables. I also assigned window.jQuery to a local $ to make it a bit more bulletproof.</p>
<p>Needless to say this script needs to be loaded during the load stage. If you intend to load it afterwards you need to make sure that you properly detect the onload event &#8211; if you don&#8217;t nothing will get preloaded as it will be waiting for that event to fire.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/_Tmv_9_jrpatR2LwqUicWLNp4_g/0/da"><img src="http://feedads.g.doubleclick.net/~a/_Tmv_9_jrpatR2LwqUicWLNp4_g/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_Tmv_9_jrpatR2LwqUicWLNp4_g/1/da"><img src="http://feedads.g.doubleclick.net/~a/_Tmv_9_jrpatR2LwqUicWLNp4_g/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=FfxtaePR90A:X6rKzN4_tbU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=FfxtaePR90A:X6rKzN4_tbU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=FfxtaePR90A:X6rKzN4_tbU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=FfxtaePR90A:X6rKzN4_tbU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=FfxtaePR90A:X6rKzN4_tbU:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2011/10/03/preloading-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2011/10/03/preloading-resources/</feedburner:origLink></item>
		<item>
		<title>Taking your webapp offline</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/7lRRXPSoBo8/</link>
		<comments>http://friedcellcollective.net/outbreak/2011/08/21/taking-your-webapp-offline/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 21:05:39 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=358</guid>
		<description>I&amp;#8217;ve recently done a few things that would benefit from having an offline mode. Empowered by Appcache Facts I tried to make the newly published La Vuelta 2011 results page an offline-capable app. Goal The goal of this exercise is twofold: To force caching of resources that slow down the loading of your page. To [...]</description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently done a few things that would benefit from having an offline mode. Empowered by <a href="http://appcachefacts.info">Appcache Facts</a> I tried to make the newly published <a href="http://friedcell.net/vuelta/">La Vuelta 2011 results page</a> an offline-capable app.</p>
<h3>Goal</h3>
<p>The goal of this exercise is twofold:</p>
<ol>
<li>To force caching of resources that slow down the loading of your page.</li>
<li>To actually be able to use the app when offline.</li>
</ol>
<h3>Solution</h3>
<p>It&#8217;s as simple as writing a cache manifest. It pays to name it [something]<strong>.manifest</strong>, as Apache already serves the correct header with that suffix. What you do is list all the files you want cached, add stuff you allow on the network (check <a href="http://appcachefacts.info">Appcache Facts</a> and <a href="http://diveintohtml5.org/offline.html">Dive Into HTML5 &#8211; Offline Web Applications</a>) and it all works. Except it doesn&#8217;t.</p>
<pre><code>CACHE MANIFEST
# version 1

CACHE:
resource.js

NETWORK:
&#42;
http:&#47;&#47;&#42;
https:&#47;&#47;&#42;</code></pre>
<h4>AJAX stuff</h4>
<p>If you&#8217;re using AJAX to get data from a server using jsonp/script, your framework of choice (jQuery in my case) will probably default to using a no-cache approach to loading it. This will mean that it will request the file + some suffix to prevent browser caching. This will mean that the resource will not be available if you&#8217;re actually online.</p>
<p>You can use <em>navigator.onLine</em> to switch cache on/off, but I suggest you first try requesting the no-cache resource and if it errors out, request the cached resource. The benefit is that even if you are online but the server is not, the users will still see the data / use the app.</p>
<pre><code>$.ajax({
	dataType: 'script',
	url: 'resource.js',
	cache: false,
	success: successHandler,
	error: function () {
		$.ajax({
			dataType: 'script',
			url: 'resource.js',
			cache: true,
			success: successHandler
		});
	}
});</code></pre>
<h4>iPad issues</h4>
<p>Fixing the AJAX meant that it worked properly on the desktop (test with Firefox that has offline mode) and in Safari on the iPad. The trouble started when I added the app to <em>Home Screen</em> &#8211; data failed to load. It was the same app as in Safari and it should have worked.</p>
<p>After some debugging I found out that the data actually was loaded but the eval failed (I was using $.getScript). Some weird testing showed that the problem was a newline character in the data. As I really liked the newline there I added some code to the error handling that removed the newline and evaled the data, then ran success. And it worked!</p>
<pre><code>$.ajax({
	dataType: 'script',
	url: 'resource.js',
	cache: false,
	success: successHandler,
	error: function () {
		$.ajax({
			dataType: 'script',
			url: 'resource.js',
			cache: true,
			success: successHandler,
			error: function (xhr) {
				eval(xhr.textResponse.replace(/\n/g, ''));
				successHandler();
			}
		});
	}
});</code></pre>
<h3>Debugging</h3>
<p>It&#8217;s somewhat hard to debug offline stuff. I suggest using a clearly visible version indicator in the file to make sure you know which version of the file you&#8217;re looking at. Also remember that the first time you load the app after changing the file &amp; cache manifest it is served from cache. At the same time the manifest is checked and on the iPad the files are downloaded after everything else is done (app finished loading and rendering).</p>
<h3>It works!</h3>
<p>After these problems were solved I used the aforementioned navigator.onLine to hide stuff that normally comes from the network but is not relevant to the offline app (banners, share links, like/+1 buttons) and you can now check the <a href="http://friedcell.net/vuelta/">La Vuelta 2011 results page</a>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/T_KTbVuPa8FIgNMtR-2dbqU7JlM/0/da"><img src="http://feedads.g.doubleclick.net/~a/T_KTbVuPa8FIgNMtR-2dbqU7JlM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/T_KTbVuPa8FIgNMtR-2dbqU7JlM/1/da"><img src="http://feedads.g.doubleclick.net/~a/T_KTbVuPa8FIgNMtR-2dbqU7JlM/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=7lRRXPSoBo8:JJtv3nfWN8g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=7lRRXPSoBo8:JJtv3nfWN8g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=7lRRXPSoBo8:JJtv3nfWN8g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=7lRRXPSoBo8:JJtv3nfWN8g:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=7lRRXPSoBo8:JJtv3nfWN8g:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2011/08/21/taking-your-webapp-offline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2011/08/21/taking-your-webapp-offline/</feedburner:origLink></item>
		<item>
		<title>Form protection</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/dMLVMCOf348/</link>
		<comments>http://friedcellcollective.net/outbreak/2011/08/05/form-protection/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 14:34:54 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[general]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=346</guid>
		<description>I&amp;#8217;ve seen a discussion recently on how to protect your forms from spammers/bots that come and fill the forms to either fill your database with crap data or fill your page with porn links. When I read the answers I figured out that none of the people read the amazing article I did years ago, [...]</description>
			<content:encoded><![CDATA[<p>I&#8217;ve seen a discussion recently on how to protect your forms from spammers/bots that come and fill the forms to either fill your database with crap data or fill your page with porn links. When I read the answers I figured out that none of the people read the amazing article I did years ago, so I decided to try to remember what it said. So, <strong>a big fat disclaimer</strong>: I read this in an article somewhere and I don&#8217;t remember where. If you know the original article please post it in the comments, I&#8217;d love to link to it, I bet it has way more info than this one.</p>
<h3>The problem</h3>
<p>Almost all websites now have some forms on them, some of them are contact / registration forms, others use the data submitted and display it on the site itself (comment forms). But letting others submit data to your site/database opens you to all sorts of attacks. If you actually show the content of the submitted form, you&#8217;ll get a bunch of spammers posting comments with lots of links. If you only store data and not show it anywhere you&#8217;re still at risk &#8211; if you don&#8217;t notice your disk can fill up, your database may grow beyond its limits,&#8230; So what we want to do is to <strong>prevent bogus form posting</strong>.</p>
<h3>Spammer approach</h3>
<p>If you think about writing a spam-bot that will try to spam as many sites you possibly can you have two basic approaches.</p>
<h4>Record / replay</h4>
<p>This is a very simple approach &#8211; you use a person to submit the form, preferably with something that looks like real input and record the request made. Then you hand that data off to the bot, it changes some content and tries to resubmit it.</p>
<h4>Automation based on heuristics</h4>
<p>I wanted to say AI, but it really isn&#8217;t. What it is is a set of simple rules and randomized values that the bot thinks might trick your site into accepting the submit. Let&#8217;s say you have three fields, two are inputs with field names &#8220;name&#8221; and &#8220;email&#8221; and the third field is &#8220;comment&#8221;. A simple script can fill these with &#8220;valid&#8221; data and try to submit it.</p>
<h4>Human entry</h4>
<p>By far the simplest, but also most costly for spammers. Go on Amazon Turk or whatever other service, send a link to a Google Spreadsheet and have people manually enter the stuff into your forms. This is the source of &#8220;Sorry, this is my job&#8221; endings to spam comments.</p>
<h3>Popular solutions</h3>
<h4><a href="http://en.wikipedia.org/wiki/Turing_test">Turing test</a></h4>
<p>Add a field to the form that the user must fill with something that humans can do easily, but machines can&#8217;t. The biggest group here are <strong>Captchas</strong> (display an image with distorted characters, possibly an audio link that reads out the same characters, and have the user somehow figure it out and write the solution), but there have been others, like a &#8220;Human?&#8221; checkbox, or &#8220;3 + 4 =&#8221; fields, &#8220;Is this a kitten?&#8221; with a pic next to it.</p>
<h4>2-step process</h4>
<p>Supposedly by far the easiest way to do this is by introducing a 2-step process. After the initial submit, you get back a preview of the submitted data, possibly with a checkbox that says &#8220;Is this correct?&#8221; and another submit button. Robots are usually not good at following through and thus don&#8217;t actually submit the content.</p>
<p>Both solutions have an impact on user experience. With Captchas it&#8217;s sometimes really hard to see what they are and even if they have a &#8220;different image&#8221; link, it just seems like the owner of the site wants to make your life hell before you can submit your data. The other challenges might be easier on the user, but also easier to figure out if you&#8217;re being targeted by bots. The 2-step process works great for comments, that usually don&#8217;t have an edit link, so it might actually be good for user experience if done right (not Wikipedia style), but are less appropriate on other types of forms.</p>
<h3>Protect yourself differently</h3>
<p>These are the techniques that should prevent most bogus form entries from random passing bots, except &#8220;Human entry&#8221; &#8211; no protection for that, even though Captchas try hard. There is not much you can do when you&#8217;re targeted&#8230;</p>
<h4>Honeypot field</h4>
<p>Use this field to trick autoguessing bots to submit something in a field you know should be empty.</p>
<ul>
<li>Add an input field to your form with a regular name (state, maiden-name,&#8230;) that does not appear on your form otherwise.</li>
<li>Use a label that will clearly communicate that it needs to be empty.</li>
<li>Hide it with CSS, preferably not by adding class=&#8221;hidden&#8221;.</li>
</ul>
<p>If the form post includes content in this field discard it and redirect back to the form. The trick is to make sure the bots don&#8217;t figure out this is a honeypot, so use valid looking but nonsensical classes&#8230;</p>
<h4>Date field</h4>
<p>Use it to prevent resubmit of data too far from the creation date. Allow users a few hours to post the form.</p>
<p>To prevent manual modification you can use either proper encryption (symetric or asymetric) that will allow you to decode it on form post or use this date in combination with the onetime token.</p>
<h4>Onetime token</h4>
<p>Use this field to prevent replay of request data. If you can, save it into the database.It is a good idea to make this token in a form that it cannot be faked (say one character changed ad you have a valid one). This can be done with hashing data or encryption.</p>
<p>This one can be as tricky as you want. What I usually do (disclaimer: I don&#8217;t know much about encryption so this might be crap advice) is use a plain datetime field with the onetime token generated from <strong>IP address</strong>, <strong>UserAgent</strong> and the date field with <a href="http://en.wikipedia.org/wiki/HMAC">HMAC</a>. There is no need for this token to be reversible &#8211; I can recreate the same thing with the data from the form post and check if it matches.</p>
<p>When using these techniques make sure you take care of the user experience. If you detect a problem on what might be valid user input (&#8220;timeout&#8221; on the date field with a non used onetime token, wrong onetime token from an ip change by the service provider), you might want to display a second step from the &#8220;2-step process&#8221;. Whatever you do, don&#8217;t call your users spammers or bots &#8211; be nice, bots don&#8217;t read the text anyway.</p>
<h3>Did I miss anything?</h3>
<p>I know of no plugin that uses all of these techniques, but I haven&#8217;t really looked for it. What I do know is that I don&#8217;t want to ever use a Captcha, cause it often keeps me out, and the 2-step process in just too weird sometimes. Hope this helps. And again &#8211; if you find the original article (must be some 5 years old now at least if not more) or have any other solutions you use or endorse, do leave a comment.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/tcc_R9YI6PfDyfH4BXHScE0EjyI/0/da"><img src="http://feedads.g.doubleclick.net/~a/tcc_R9YI6PfDyfH4BXHScE0EjyI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/tcc_R9YI6PfDyfH4BXHScE0EjyI/1/da"><img src="http://feedads.g.doubleclick.net/~a/tcc_R9YI6PfDyfH4BXHScE0EjyI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=dMLVMCOf348:u6AVBIL7NIw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=dMLVMCOf348:u6AVBIL7NIw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=dMLVMCOf348:u6AVBIL7NIw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=dMLVMCOf348:u6AVBIL7NIw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=dMLVMCOf348:u6AVBIL7NIw:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2011/08/05/form-protection/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2011/08/05/form-protection/</feedburner:origLink></item>
		<item>
		<title>View Source Alliance</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/rSXoNZxnjwA/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/11/19/view-source-alliance/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 21:35:47 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=343</guid>
		<description>Most of what I learned on the web in my early years was from &amp;#8220;View Source&amp;#8221;. Then came the books and the conferences. It makes me sad to see lots of sites minifying code for performance and not releasing the full version of the code so other developers could learn from it. It&amp;#8217;s the openness that [...]</description>
			<content:encoded><![CDATA[<p>Most of what I learned on the web in my early years was from &#8220;View Source&#8221;. Then came the books and the conferences.</p>
<p>It makes me sad to see lots of sites minifying code for performance and not releasing the full version of the code so other developers could learn from it. It&#8217;s the openness that I really like about the web.</p>
<p>I think there should be a &#8220;View Source Alliance&#8221; that would set rules on how to release your code in a way that visitors can benefit from the speed of minified code, while web developers can still find your full files and learn from them.</p>
<p>I&#8217;ll set a few simple rules here, hoping somebody with more reach picks them up:</p>
<ol>
<li>If you minify the files for them, use a simple convention name.min.ext (say jquery.min.js)</li>
<li>When you deploy minified files, also deploy their full version at name.ext (say jquery.js)</li>
<li>If you for some reason can&#8217;t release the full files next to the minified ones, add this to the top of the minified file: /*viewsource*http://path.to/full.ext*/ (say /*viewsource*http://http://code.jquery.com/jquery-1.4.4.js*/)</li>
</ol>
<p>This way you will not only help others, but sometimes even stop breaking the law. Because you might be using some open source code with a licence that says you must release your code with a same/similar licence.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/B4US3r2BkD2ghHSvEXVEjBt-fi4/0/da"><img src="http://feedads.g.doubleclick.net/~a/B4US3r2BkD2ghHSvEXVEjBt-fi4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/B4US3r2BkD2ghHSvEXVEjBt-fi4/1/da"><img src="http://feedads.g.doubleclick.net/~a/B4US3r2BkD2ghHSvEXVEjBt-fi4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=rSXoNZxnjwA:gOj41XyHJL4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=rSXoNZxnjwA:gOj41XyHJL4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=rSXoNZxnjwA:gOj41XyHJL4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=rSXoNZxnjwA:gOj41XyHJL4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=rSXoNZxnjwA:gOj41XyHJL4:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/11/19/view-source-alliance/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/11/19/view-source-alliance/</feedburner:origLink></item>
		<item>
		<title>Motivation and hiring</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/irI9c4XmGp4/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/11/16/motivation-and-hiring/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 00:12:24 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=340</guid>
		<description>I don&amp;#8217;t think I ever wrote about motivation much here even though it&amp;#8217;s one of my favorite subjects and was also the main topic of my thesis. Recently I&amp;#8217;ve been thinking about it quite a lot again and I&amp;#8217;ve come to the conclusion that it&amp;#8217;s very important to use it to hire the right person. [...]</description>
			<content:encoded><![CDATA[<p>I don&#8217;t think I ever wrote about motivation much here even though it&#8217;s one of my favorite subjects and was also the main topic of my thesis. Recently I&#8217;ve been thinking about it quite a lot again and I&#8217;ve come to the conclusion that it&#8217;s very important to use it to hire the right person.</p>
<p>Back to the beginning. There are loads of theories on motivation and most of them just cover different aspects and mostly they can all live together. One of the aspects of motivation is where it comes from. That gives us <strong>intrinsic motivation</strong> and <strong>extrinsic motivation</strong>. Obviously it&#8217;s not a boolean thing as any individual sits on a line between the extremes. And there&#8217;s also the matter of having a different source of motivation for different things. Let&#8217;s not get into that.</p>
<h4>Intrinsic motivation</h4>
<p>Let me quote <a href="http://en.wikipedia.org/wiki/Motivation#Intrinsic_and_extrinsic_motivation">Wikipedia</a> on this:</p>
<blockquote><p><strong>Intrinsic motivation</strong> refers to motivation that is driven by an interest or enjoyment in the task itself, and exists within the individual rather than relying on any external pressure.</p></blockquote>
<p>We are motivated by the fact that we&#8217;re getting something done and by the feeling we get ourselves when we&#8217;re done. We&#8217;re not in it so someone can tell us we did a good job. We don&#8217;t really care. A friend of mine once said: &#8220;It&#8217;s for me. If somebody else likes it &#8211; great.&#8221; We like to think that the more we get into the subject, the better we&#8217;ll be at it and the better the result. In other words no relying on luck, no shortcuts, no marketing/selling, no subpar stuff. Because of all this we don&#8217;t like when others interfere with stuff we&#8217;re responsible for.</p>
<h4>Extrinsic motivation</h4>
<p>Another quote from Wikipedia:</p>
<blockquote><p>Common extrinsic motivations are rewards like money and grades, coercion and threat of punishment. Competition is in general extrinsic because it encourages the performer to win and beat others, not to enjoy the intrinsic rewards of the activity.</p></blockquote>
<p>These people often need to be &#8220;managed&#8221; to give them the sense of direction and success and are in that way more demanding. They also need more information about what is going on and might see the successes of their co-workers as their own and be empowered by them.</p>
<h4>Who to hire?</h4>
<p>You might want to hire intrinsically motivated people when you don&#8217;t have the management layers to keep them motivated or you just don&#8217;t have time to do that. On the other hand it&#8217;s very hard to keep them motivated when all the fun work is gone and thus tend to either switch tasks/assignments or try to over-explore/discover. These two reasons are also why some people want to hire intrinsically motivated employees only to later regret it as they can&#8217;t motivate them anymore or don&#8217;t know how.</p>
<p>Hiring extrinsically motivated people might be better for cases where you can manage them properly as they might feel lost without guidance. They are somewhat easier to motivate as you have a lot more ways to do it &#8211; sometimes even just a public pat on the back suffices. They are surely a better choice for a company in an established market as they thrive on beating the competition. If you have an &#8220;employee of the month&#8221; you should hire extrinsically motivated people.</p>
<p>I think it&#8217;s very important to hire a homogenous team motivation-wise. An extrinsically motivated manager might have a problem motivating an intrinsically employee and the employee won&#8217;t get why his extrinsically motivated colleague is bummed that he wasn&#8217;t complimented on the great work last week.</p>
<h4>The intrinsic problem</h4>
<p>We intrinsically motivated have a problem. Even though that extrinsically motivated people can internalize motivation when it matches their values and beliefs it is much more common for somewhat extrinsically motivated people to become more and more extrinsic with time due to the <a href="http://en.wikipedia.org/wiki/Overjustification_effect">Overjustification effect</a>. As that means that their number will go up with time, most of us are used to just getting in to solve the problems and then get out. Somewhat ironic that it sounds like a <a href="http://dictionary.reference.com/browse/mercenary">mercenary</a>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/siKNCVVaVT425KH3fGdpebNpQf4/0/da"><img src="http://feedads.g.doubleclick.net/~a/siKNCVVaVT425KH3fGdpebNpQf4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/siKNCVVaVT425KH3fGdpebNpQf4/1/da"><img src="http://feedads.g.doubleclick.net/~a/siKNCVVaVT425KH3fGdpebNpQf4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=irI9c4XmGp4:Ir8oGep8DlY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=irI9c4XmGp4:Ir8oGep8DlY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=irI9c4XmGp4:Ir8oGep8DlY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=irI9c4XmGp4:Ir8oGep8DlY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=irI9c4XmGp4:Ir8oGep8DlY:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/11/16/motivation-and-hiring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/11/16/motivation-and-hiring/</feedburner:origLink></item>
		<item>
		<title>HTML Lint</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/SAP8ivyDhNk/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/08/30/html-lint/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 12:01:44 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=328</guid>
		<description>From Lint Instructions: HTML Lint is a tool that makes sure your code looks good. While XHTML was very strict with syntax HTML 5 is more lenient like previous versions of HTML, which means keeping consistent code styles will become more difficult. Validating is not good enough anymore. HTML Lint is under constant development. If [...]</description>
			<content:encoded><![CDATA[<p>From <a href="http://lint.brihten.com/html/help">Lint Instructions</a>:</p>
<blockquote><p><a href="http://lint.brihten.com/">HTML Lint</a> is a tool  that makes sure your code looks good. While XHTML was very strict with syntax HTML 5 is more lenient like previous versions of HTML, which means keeping consistent code styles will become more difficult. Validating is not good enough anymore.</p>
<p>HTML Lint is under constant development. If you find a bug, report it on Twitter.</p></blockquote>
<p>It started in Seattle, at <a class="zem_slink" title="An Event Apart" rel="homepage" href="http://www.aneventapart.com">An Event Apart</a>. <a class="zem_slink" title="Jeremy Keith" rel="homepage" href="http://adactio.com/">Jeremy Keith</a> said in his presentation that validation for <a class="zem_slink" title="HTML5" rel="wikipedia" href="http://en.wikipedia.org/wiki/HTML5">HTML5</a> doesn&#8217;t make much sense anymore and that there should be a <a href="http://en.wikipedia.org/wiki/Lint_%28software%29">Lint tool</a>. I started thinking about it and after lunch I asked Jeremy what options he wanted in it. I added some of my own and made the first version of it flying to Phoenix (going to <a class="zem_slink" title="IA Summit" rel="homepage" href="http://iasummit.org/2009">IA Summit</a>) and then fixed it flying back to <a class="zem_slink" title="Ljubljana" rel="wikipedia" href="http://en.wikipedia.org/wiki/Ljubljana">Ljubljana</a>.</p>
<p>We released the first version soon and updated it with a new design a few days ago. I&#8217;ve been putting the update off as I had a few other projects going on, but <a href="http://drupalradar.com/video-jeremy-keith-keynote-session">Jeremy mentioned it at Drupalcon</a> and <a href="http://remysharp.com/">Remy</a> pointed his <a href="http://htmllint.com">htmllint.com</a> to it and <a href="http://twitter.com/rem/statuses/22166149457">tweeted about it</a>. So it had to be done.</p>
<p>HTML Lint was coded in Python by <a href="http://mmm.si">MMM</a>, which consists of me (<a href="http://fry.si">Marko Mrdjenovič</a>) and <a href="http://markos.gaivo.net">Marko Samastur</a>. The design for it was done by <a href="http://saratusar.com">Sara Tušar Suhadolc</a>. The source code should be available soon.</p>
<h6 class="zemanta-related-title">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://blog.reybango.com/2010/08/05/book-review-a-book-aparts-html5-for-web-designers-by-jeremy-keith/">Book Review: A Book Apart&#8217;s HTML5 for Web Designers by Jeremy Keith</a> (reybango.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.wait-till-i.com/2010/08/17/validate-dont/">validate() || dont()</a> (wait-till-i.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.nczonline.net/blog/2010/08/17/the-value-of-html-validation/">The value of HTML validation</a> (nczonline.net)</li>
<li class="zemanta-article-ul-li"><a href="http://www.456bereastreet.com/archive/201008/css3_is_not_html5/">CSS3 is not HTML5</a> (456bereastreet.com)</li>
</ul>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=40289321-7ad8-4582-9f26-0f933f326927" alt="" /><span class="zem-script pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/3LbNU0MPTUlcBLsX7wP0b6v1XGI/0/da"><img src="http://feedads.g.doubleclick.net/~a/3LbNU0MPTUlcBLsX7wP0b6v1XGI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/3LbNU0MPTUlcBLsX7wP0b6v1XGI/1/da"><img src="http://feedads.g.doubleclick.net/~a/3LbNU0MPTUlcBLsX7wP0b6v1XGI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=SAP8ivyDhNk:j2usPbaE1NA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=SAP8ivyDhNk:j2usPbaE1NA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=SAP8ivyDhNk:j2usPbaE1NA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=SAP8ivyDhNk:j2usPbaE1NA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=SAP8ivyDhNk:j2usPbaE1NA:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/08/30/html-lint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/08/30/html-lint/</feedburner:origLink></item>
		<item>
		<title>The Cross-Origin Request Sharing (CORS) knot</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/J1BODRgRRAo/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/08/03/the-cross-origin-request-sharing-cors-knot/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 17:02:33 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=313</guid>
		<description>As a developer for a company that does a lot of cross-domain posting I was happy to see CORS finally happening. I&amp;#8217;ve authored jQuery.windowName plug-in to add support for cross-domain posting in the past and this was my way out &amp;#8211; no more hacks as browser support for CORS grows. Yeah right. CORS is supported [...]</description>
			<content:encoded><![CDATA[<p>As a developer for a company that does a lot of cross-domain posting I was happy to see CORS finally happening. I&#8217;ve authored <a href="http://friedcellcollective.net/outbreak/jsjquerywindownameplugin/">jQuery.windowName plug-in</a> to add support for cross-domain posting in the past and this was my way out &#8211; no more hacks as browser support for CORS grows.</p>
<h3>Yeah right.</h3>
<p>CORS is supported on <a class="zem_slink freebase/en/xmlhttprequest" title="XMLHttpRequest" rel="wikipedia" href="http://en.wikipedia.org/wiki/XMLHttpRequest">XMLHttpRequest</a> object in <a href="http://en.wikipedia.org/wiki/Gecko_%28layout_engine%29">Gecko</a> and <a class="zem_slink freebase/en/webkit" title="WebKit" rel="wikipedia" href="http://en.wikipedia.org/wiki/WebKit">Webkit</a>. You just <a class="zem_slink freebase/en/hypertext_transfer_protocol" title="Hypertext Transfer Protocol" rel="wikipedia" href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">request</a> something  on a different domain, and if the response has the right header with the right value you get  the data. In IE you have to use a new object called <a href="http://msdn.microsoft.com/en-us/library/cc288060%28VS.85%29.aspx">XDomainRequest</a> which is somewhat similar to XMLHttpRequest, but without readystate, onreadystate event handler and basically any header getters/setters.</p>
<p>Sounds ok and when I first tried it I was quite happy with how it worked. But unfortunately nothing is that simple in the land of browsers. When it fails, it&#8217;s a whole new game&#8230;</p>
<h4>Gecko (<a class="zem_slink freebase/en/mozilla_firefox" title="Firefox" rel="homepage" href="http://www.mozilla.com/firefox/">Firefox</a>)</h4>
<h6>Same domain request:</h6>
<ul>
<li>200 response: xhr = {status: 200, statusText: &#8216;OK&#8217;}</li>
<li>304 response: xhr = {status: 304, statusText: &#8216;Not Modified&#8217;}</li>
</ul>
<h6>Cross domain request with proper headers:</h6>
<ul>
<li>200 response: xhr = {status: 200, statusText: &#8216;OK&#8217;}</li>
<li>304 response: xhr = {status: 0, statusText: &#8216;Not Modified&#8217;}</li>
</ul>
<h6>Cross domain request without proper headers:</h6>
<ul>
<li>200 response: xhr = {status: 0, statusText: &#8216;OK&#8217;}</li>
<li>304 response: xhr = {status: 0, statusText: &#8216;Not Modified&#8217;}</li>
</ul>
<h4>Webkit (<a class="zem_slink freebase/en/safari" title="Safari" rel="homepage" href="http://www.apple.com/safari/">Safari</a>, <a class="zem_slink" title="Google Chrome" rel="homepage" href="http://www.google.com/chrome">Chrome</a>)</h4>
<h6>Same domain request:</h6>
<ul>
<li>200 response: xhr = {status: 200, statusText: &#8216;OK&#8217;}</li>
<li>304 response: xhr = {status: 304, statusText: &#8216;Not Modified&#8217;}</li>
</ul>
<h6>Cross domain request with proper headers:</h6>
<ul>
<li>200 response: xhr = {status: 200, statusText: &#8216;OK&#8217;}</li>
<li>304 response: xhr = {status: 304, statusText: &#8216;Not Modified&#8217;}</li>
</ul>
<h6>Cross domain request without proper headers:</h6>
<ul>
<li>200 response: xhr = {status: 0, statusText: &#8221;}</li>
<li>304 response: xhr = {status: 0, statusText: &#8221;}</li>
</ul>
<h4>IE</h4>
<p>Same domain requests made with XMLHttpRequest, cross domain requests made with XDomainRequest.</p>
<h6>Same domain request:</h6>
<ul>
<li>200 response: xhr = {status: 200, statusText: &#8216;OK&#8217;}</li>
<li>304 response: xhr = {status: 304, statusText: &#8216;Not Modified&#8217;}</li>
</ul>
<h6>Cross domain request with proper headers:</h6>
<ul>
<li>200 response: onload invoked</li>
<li>304 response: onload with cache, onerror otherwise</li>
</ul>
<h6>Cross domain request without proper headers:</h6>
<ul>
<li>200 response: onerror invoked</li>
<li>304 response: onerror invoked</li>
</ul>
<h3>Where&#8217;s the knot?</h3>
<p>The problem with this is the lack of error handling. <strong>Firefox</strong> will return <em>status 0 on all errors</em>, but will indicate what the response was with statusText. It will also return 0 on a 304 response, which is a bit weird. <strong>Webkit</strong> on the other hand only returns status 0 on failed requests, but <em>without telling you what&#8217;s wrong</em>. You get the same error when a preflight request fails, a 500 error on the server or the real request fails. <strong>IE</strong> with its own separate XDomainRequest implementation <em>simplifies</em> this two handlers &#8211; onload and onerror. Unfortunately it raises an onerror request when a 304 is returned on empty cache.</p>
<h4><a class="zem_slink freebase/en/jquery" title="JQuery" rel="homepage" href="http://jquery.com/">jQuery</a> issues</h4>
<p>If you&#8217;re working with jQuery (and possibly other libraries) you&#8217;re in for a treat. <a class="zem_slink freebase/guid/9202a8c04000641f80000000001f1dd8" title="Opera (web browser)" rel="wikipedia" href="http://en.wikipedia.org/wiki/Opera_%28web_browser%29">Opera 9.5</a> falsely reports status = 0 when a <a class="zem_slink" title="List of HTTP status codes" rel="wikipedia" href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">HTTP status</a> 304 is returned from the server. For this reason jQuery treats <code>status === 0</code> as a successful request. Thus you have no way of knowing whether your request was a success or a failure.</p>
<h3>Untying the knot</h3>
<p>If you intend to use jQuery&#8217;s built-in methods you&#8217;ll need to do your own bookkeeping:</p>
<ol>
<li>Know when a request is a CORS request</li>
<li>Wait for complete event</li>
<li>If data is empty trigger error handling</li>
</ol>
<p>For this to work you obviously always need some data. If empty data is valid you&#8217;re screwed.</p>
<h4>Easy way out</h4>
<p>You might have noticed before that I made a jQuery.windowName plugin. It still has the same name, but now also supports CORS requests and does some of the CORS related bookkeeping. As the latest version is still in testing you can get it directly at <a href="http://friedcell.net/js/jQuery.windowName/jQuery.windowName.plugin.1.0.0.js">http://friedcell.net/js/jQuery.windowName/jQuery.windowName.plugin.1.0.0.js</a> (<a href="http://friedcell.net/js/jQuery.windowName/test.1.0.0.html">test page</a>).</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Enhanced by Zemanta" href="http://www.zemanta.com/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=e3af06ca-fbf3-423a-94f0-d0bfc37119c6" alt="Enhanced by Zemanta" /></a><span class="zem-script pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/AjVV1EcaI_TuVcJg50WYd1d-fKw/0/da"><img src="http://feedads.g.doubleclick.net/~a/AjVV1EcaI_TuVcJg50WYd1d-fKw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/AjVV1EcaI_TuVcJg50WYd1d-fKw/1/da"><img src="http://feedads.g.doubleclick.net/~a/AjVV1EcaI_TuVcJg50WYd1d-fKw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=J1BODRgRRAo:7iX5bp82gqA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=J1BODRgRRAo:7iX5bp82gqA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=J1BODRgRRAo:7iX5bp82gqA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=J1BODRgRRAo:7iX5bp82gqA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=J1BODRgRRAo:7iX5bp82gqA:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/08/03/the-cross-origin-request-sharing-cors-knot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/08/03/the-cross-origin-request-sharing-cors-knot/</feedburner:origLink></item>
		<item>
		<title>Blogging on the iPad</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/u6xIpJtTyiw/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/06/15/blogging-on-the-ipad/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 17:46:59 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=301</guid>
		<description>I wrote the previous post on the iPad in the WordPress app and I was forced to finish it in the browser. Here&amp;#8217;s why: Writing HTML is very hard on the iPad due to extensive keyboard switching. Opening tags are hard, but closing tags are even harder (switch to extended for &amp;#60;, back to symbols [...]</description>
			<content:encoded><![CDATA[<p>I wrote the previous post on the <a class="zem_slink" title="iPad" rel="homepage" href="http://www.apple.com/ipad/">iPad</a> in the <a class="zem_slink" title="WordPress" rel="homepage" href="http://wordpress.org">WordPress</a> app and I was forced to finish it in the browser. Here&#8217;s why:</p>
<ol>
<li>Writing <a class="zem_slink" title="HTML" rel="wikipedia" href="http://en.wikipedia.org/wiki/HTML">HTML</a> is very hard on the iPad due to extensive keyboard switching. Opening tags are hard, but closing tags are even harder (switch to extended for &lt;, back to symbols for /, back to normal for the tag name and then to extended for &gt;).</li>
<li>I&#8217;m missing the <a class="zem_slink" title="Spell checker" rel="wikipedia" href="http://en.wikipedia.org/wiki/Spell_checker">spell checking</a> feature I have in my <a class="zem_slink" title="Firefox" rel="homepage" href="http://www.mozilla.com/en-US/firefox/">Firefox</a>, because I usually have the iPad native checker off as I write lots of stuff in Slovenian.</li>
<li>I like adding some links automatically with <a class="zem_slink" title="Zemanta" rel="homepage" href="http://www.zemanta.com">Zemanta</a> and you don&#8217;t get that in the native app.</li>
</ol>
<p>While writing the first version of this post I also found another error &#8211; it seems that the WordPress iPad app doesn&#8217;t like &amp;lt; or &amp;gt; inside posts, so actually writing an HTML tag like this &lt;a&gt; is not possible (it crashes the app immediately).</p>
<p>So it seems I&#8217;ll still mostly be using the iPad for content consumption and chitchat and not content creation. And possibly scribbling down ideas.</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Enhanced by Zemanta" href="http://www.zemanta.com/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=4638a76e-2c3c-4092-bad6-346df09f945a" alt="Enhanced by Zemanta" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/uIQV7bYNkmh_JI76zil7CIBiWds/0/da"><img src="http://feedads.g.doubleclick.net/~a/uIQV7bYNkmh_JI76zil7CIBiWds/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/uIQV7bYNkmh_JI76zil7CIBiWds/1/da"><img src="http://feedads.g.doubleclick.net/~a/uIQV7bYNkmh_JI76zil7CIBiWds/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=u6xIpJtTyiw:YRMiatmu3-Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=u6xIpJtTyiw:YRMiatmu3-Q:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=u6xIpJtTyiw:YRMiatmu3-Q:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=u6xIpJtTyiw:YRMiatmu3-Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=u6xIpJtTyiw:YRMiatmu3-Q:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/06/15/blogging-on-the-ipad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/06/15/blogging-on-the-ipad/</feedburner:origLink></item>
		<item>
		<title>Login code pattern</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/QbZNrW8aUio/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/06/15/login-code-pattern/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 14:51:03 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=297</guid>
		<description>When coding a login interface it&amp;#8217;s common to follow this pattern: POST data to a script that checks it and sets appropriate cookies On success redirect to the previous (or some other) page On error show that error or redirect to an error page You do this so that users don&amp;#8217;t get the annoying &amp;#8220;resend [...]</description>
			<content:encoded><![CDATA[<p>When coding a <a class="zem_slink" title="Login" rel="wikipedia" href="http://en.wikipedia.org/wiki/Login">login</a> interface it&#8217;s common to follow this pattern:</p>
<ol>
<li> POST data to a script that checks it and sets appropriate <a class="zem_slink" title="HTTP cookie" rel="wikipedia" href="http://en.wikipedia.org/wiki/HTTP_cookie">cookies</a></li>
<li>On success redirect to the previous (or some other) page</li>
<li>On error show that error or redirect to an error page</li>
</ol>
<p>You do this so that users don&#8217;t get the annoying &#8220;resend data&#8221; pop-up if/when they reload the destination page. On the other hand this pattern exposes a usability issue when login data is correct but cookies are turned off.</p>
<p>For some reason my cookies were disabled today. That means that logging in to <a class="zem_slink" title="Twitter" rel="homepage" href="http://twitter.com">Twitter</a> (that uses the previously described pattern) looked a bit weird. I&#8217;d log in, get redirected and end up on the home page again. Same thing happened on <a class="zem_slink" title="addons.mozilla.org" rel="homepage" href="http://addons.mozilla.org">Mozilla Addons</a> page. The very definition of <a class="zem_slink" title="Recursion" rel="wikipedia" href="http://en.wikipedia.org/wiki/Recursion">recursion</a>.</p>
<p>When I finally figured it out, I immediately thought of a solution. When you redirect from the post add something to the URL &#8211; that way the redirected page can check if you&#8217;re actually logged in and alert you if you&#8217;re not.</p>
<p>Now this has a few problems of its own:</p>
<ol>
<li> It exposes that you have an account on a specific service that can be detected with history sniffing.</li>
<li>If you create a user based URL to circumvent the previous issue you might leak user information.</li>
<li>If you reload the destination page after session expired you&#8217;ll get an alert that might be wrong itself (you would have to implement some server-side logic that checks if the session has just started).</li>
</ol>
<p>With all this in mind I still think that redirecting to a different URL is better than leaving users without any information (no matter how uncommon having disabled cookies is).</p>
<p>How do YOU solve this?</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Enhanced by Zemanta" href="http://www.zemanta.com/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=18e29afa-5ddb-4191-b878-4ea1e4df1c8c" alt="Enhanced by Zemanta" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/2NQChHqunQeat87azfOg8FRQSr0/0/da"><img src="http://feedads.g.doubleclick.net/~a/2NQChHqunQeat87azfOg8FRQSr0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/2NQChHqunQeat87azfOg8FRQSr0/1/da"><img src="http://feedads.g.doubleclick.net/~a/2NQChHqunQeat87azfOg8FRQSr0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=QbZNrW8aUio:EwfPeDpCC14:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=QbZNrW8aUio:EwfPeDpCC14:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=QbZNrW8aUio:EwfPeDpCC14:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=QbZNrW8aUio:EwfPeDpCC14:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=QbZNrW8aUio:EwfPeDpCC14:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/06/15/login-code-pattern/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/06/15/login-code-pattern/</feedburner:origLink></item>
		<item>
		<title>An Event Apart Seattle review – day 1</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/soPshteqijc/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/06/02/an-event-apart-seattle-review-day-1/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 22:45:47 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[aneventapart]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[companies]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=282</guid>
		<description>Image by Heather L via Flickr &amp;#8220;This is your pilot speaking. We&amp;#8217;ve been notified that the passenger bridge has a flat tire.&amp;#8221; were the first few words after landing in Chicago, the third airport of the day. I left Ljubljana at 7:15 CEST towards Amsterdam, switched planes and continued towards Chicago. Fortunately the issue with [...]</description>
			<content:encoded><![CDATA[<div class="zemanta-img">
<div>
<dl class="wp-caption alignright">
<dt class="wp-caption-dt"><a href="http://www.flickr.com/photos/51109667@N00/3501459835"><img src="http://farm4.static.flickr.com/3555/3501459835_e1db197afc_m.jpg" alt="An Event Apart Seattle" title="An Event Apart Seattle" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution">Image by <a href="http://www.flickr.com/photos/51109667@N00/3501459835">Heather L</a> via Flickr</dd>
</dl>
</div>
</div>
<p>&#8220;This is your pilot speaking. We&#8217;ve been notified that the passenger bridge has a flat tire.&#8221; were the first few words after landing in Chicago, the third airport of the day. I left Ljubljana at 7:15 CEST towards Amsterdam, switched planes and continued towards Chicago. Fortunately the issue with the gates was small enough not to endanger my connection for the last leg &#8211; to Seattle, where I landed around 16:15 PST (around 18 hours after taking off from Ljubljana).</p>
<p>I came to Seattle to attend An Event Apart, a conference I wanted to attend since it was first announced. Meeting people like Jeffrey Zeldman and Eric Meyer and learning from them is just amazing. But first I needed to get to the hotel in downtown Seattle and get some sleep.</p>
<p>After a really long day the light rail ride from the <a class="zem_slink" title="Seattle–Tacoma International Airport" rel="homepage" href="http://www.portseattle.org/seatac/">Sea-Tac airport</a> to downtown Seattle was really amazing. Going through the suburbs, enjoying the displays of American culture &#8211; the highways, the trucks, the architecture, the people. There were only a few of us on the train at the first stop, but at the next stop loads of people got on wearing bright green shirts, scarfs and even a few kids with their faces painted green/blue &#8211; fans of <a href="http://en.wikipedia.org/wiki/Seattle_Sounders_FC">Seattle Sounders FC</a>. I thought to myself &#8211; nah, it can&#8217;t be soccer.</p>
<p>As I arrived a day early I had a day to spare to see the city. I woke up late and then visited The Space Needle &#8211; amazing views even in cloudy weather. I didn&#8217;t take the <a href="http://www.seattlemonorail.com/">old-school monorail</a> built for the world fair in 1962 thinking I&#8217;ll do that some other day. After registering at the wonderful Bell Conference Center (thanks to Marci for resolving the issues and sorry I woke you up Gašper) I walked through town to the <a class="zem_slink" title="Pike Place Market" rel="wikipedia" href="http://en.wikipedia.org/wiki/Pike_Place_Market">Pike Place Market</a> and to the high street stores &#8211; and wandered into a huge Anime convention (<a href="http://en.wikipedia.org/wiki/Sakura-Con">Sakura-Con</a>) and a bunch of kids (not even teenagers?) wearing totally inappropriate clothes.</p>
<p>The day ended with a karaoke meet-up set up by <a href="http://jeffcroft.com/">Jeff Croft</a>. I met <a href="http://www.mikeindustries.com/blog/">Mike Davidson</a> of the <a href="http://newsvine.com">Newsvine</a> fame (thanks for the beer!) and I heard <a href="http://www.stuffandnonsense.co.uk/">Andy Clarke</a> and <a href="http://adactio.com/">Jeremy Keith</a> sing <a href="http://en.wikipedia.org/wiki/Ace_of_Spades_%28song%29">Ace of Spades</a> together.</p>
<p>The conference started on Monday with breakfast &#8211; a really good one. And then two days of talks and an additional day of workshops. I&#8217;ll review them in different depth.</p>
<h3>Jeffrey Zeldman &#8211; Put Your Worst Foot Forward</h3>
<p>I wanted to see Jeffrey talk for some time now. I also got to meet him just before the conference started which made me want to see this even more as he&#8217;s a really friendly guy with years of experience to share. And the talk proved to be all that and more. Explaining his mistakes from the past and the ways he is solving them &#8211; teaching what to do with anti-patterns (to quote Jeremy Keith) was really effective and I think we were all nodding as it seems we all do the same mistakes.</p>
<h4>The checklist</h4>
<ol>
<li>Know before you go.</li>
<li>Keep expectations on track and in sync.</li>
<li>Constantly course-correct.</li>
<li>Tell the TRUTH.</li>
<li>Phrase it from the client&#8217;s/boss&#8217;s point of view.</li>
<li>Report bad news before the client/boss notices it.</li>
<li>Have a recovery plan.</li>
<li>Apologize-but never denigrate yourself or your team.</li>
<li>Have an exit strategy.</li>
<li>Know when to quit.</li>
</ol>
<h4>Takeaways</h4>
<p>Working with clients is a long distance relationship &#8211; away from sight, away from heart. You need to put more energy into syncing and you need to make sure you see things with their eyes. And as in any relationship &#8211; you need to know when to leave.</p>
<h3>Nicole Sullivan &#8211; Object Oriented CSS</h3>
<p>Nicole used to work for Yahoo! and recently helped Facebook optimize their stylesheets, so you might say she has some experience in building and maintaining CSS systems. But unfortunately it also means that a lot of us cannot relate to some stuff she is saying. One of the first thoughts I had was that she might be a good person to write the &#8220;CSS &#8211; The Good Parts&#8221; &#8211; she even quoted Douglas Crockford in her presentation.</p>
<h4>Controversial</h4>
<p>There were a few points that I couldn&#8217;t agree with when she said them and decided that I will think about them later. I&#8217;m not saying they&#8217;re bad practice, I just don&#8217;t think they&#8217;re good advice for most of us.</p>
<ol>
<li><strong>Don&#8217;t use specificity</strong> was one of the things that seem like throwing away a really powerful tool because some people can&#8217;t handle the power. I could probably agree with this in big systems, but it sounds like one of the reasons to adopt Java &#8211; it&#8217;s easy for beginners to start doing productive stuff and hard for them to screw things up.</li>
<li><strong>Don&#8217;t use .class1.class2</strong> as that causes all sorts of cross-browser issues. I would classify this as good stuff but it seems only IE6 is affected. So I couldn&#8217;t care less&#8230;</li>
<li><strong>Hacks shouldn&#8217;t change specificity</strong> as you&#8217;re not using specificity at all. That means that Modernizr and all other tools that add a class to the HTML/body elements are out of the question. The solution &#8211; using _property:value; &#8211; was something I don&#8217;t feel good about &#8211; using such invalid hacks just seems wrong.</li>
<li><strong>To define headers use h1, .h1 {}</strong> and in HTML <strong>use &lt;h2 class=&#8221;h1&#8243;&gt;&#8230;&lt;/h2&gt;</strong> if necessary. That just seems wrong even though I agree that reusing styles is important.</li>
<li><strong>Avoid specifying location</strong> when targeting elements. When you do that moving an element into a different context loses the styles.</li>
</ol>
<h4>Good stuff</h4>
<p>This list is what I think can mostly be used today for most of the people writing CSS. It is not a set of rules to abide in every case, but it should be your main modus operandi.</p>
<ol>
<li><strong>Reuse code</strong> as much as possible. If you&#8217;re copy pasting, you&#8217;re doing it wrong. One of the ways to do this is by following the second rule.</li>
<li><strong>Don&#8217;t use ids, inline styles and !important</strong> to write easily applicable code. You should not write <strong>location specific</strong> code. Don&#8217;t use .sidebar ul, but rather add a class (eg. sidenav) to that ul and use .sidenav for the rule. Smaller CSS yes, but it will also get you bigger HTML (and classitis?).</li>
<li><strong>Think in modules</strong> and provide styles that are easily reusable by just using a class name in HTML. Only elements that are strictly bound to modules should have location specific selectors (but with .class, not #id).</li>
<li><strong>Put defaults into .class </strong>and <strong>use elm.class to apply specifics</strong>. Many elements can have .error &#8211; and all errors should have a similar look, whether they&#8217;re divs, lists or paragraphs.</li>
</ol>
<h4>Wish-list</h4>
<ol>
<li><strong>Variables</strong> are something a lot of people want. What I want is for them to be simple enough that people can&#8217;t abuse them to make CSS a programming language. The proposed syntax:
<ul>
<li>To set the variable: @variables hex {myblue:#006;}</li>
<li>To access the variable a {color:hex.myblue;}</li>
</ul>
</li>
<li><strong>Prototypes </strong>are a really good way of providing defaults to a lot of elements at once and gets rid of rules that have many comma-delimited selectors. The proposed syntax:
<ul>
<li>Set a prototype with allowed child nodes: @prototype .box {margin:10px;children:b,.inner;}</li>
<li>Add styles to child nodes: .box .inner {position:relative;}</li>
<li>Use a prototype: .weatherBox {extends:.box;}</li>
<li>Under the hood this translates to: @prototype .box, .weatherBox {&#8230;} .box .inner, .weatherBox .inner {&#8230;} .weatherBox {&#8230;}</li>
<li>Also allows checking code: .leftCol .inner {color:red;} is invalid as .inner is part of .box prototype and .leftCol does not extend it</li>
</ul>
</li>
<li><strong>Mix-ins </strong>were skipped in the presentation as she was running out of time. You can think of them as small pieces of repeatable code that is only set in one place and used in others. Syntax:
<ul>
<li>Set a mixin: @mixin .clearfix {zoom:1}</li>
<li>Any selector that matches the mixin selector modifies it: .clearfix:after {content:&#8221;.&#8221;;display:block;height:0;clear:both;visibility:hidden;}</li>
<li>Include a mixin: .line {include:.clearfix;}</li>
</ul>
</li>
<li><strong>Prototype sub-nodes</strong> were also skipped. They seem to allow calculations based on values defined in different sub-nodes of prototypes &#8211; they&#8217;re not meant to access computed style:
<ul>
<li>Use calculations: .box .bottom {height:5px;} .box .bl {height:10px;margin-top:.bl.height-.bottom.height;}</li>
</ul>
</li>
</ol>
<p>Some of these changes will require us to write code for new and old browsers independently or to write a &#8220;compiler&#8221; that will compile code for older browsers. Is there one already written?</p>
<h4>Takeaways</h4>
<p>Building a CSS system means thinking about the selectors (and not the properties) and Nicole probably knows more than anyone else on that subject (to make you feel more comfortable, Jeremy Keith of Clearleft said they arrived to the same conclusion independently). Another, probably even more important takeaway is that you should think about flexible modules &#8211; sometimes stuff is more similar that it might seem at first. If you write CSS for a module that supports variations you&#8217;ll write less code that will apply faster and your visitors will be happy. If you want to look into an Object oriented CSS framework &#8211; check Nicole&#8217;s project <a href="http://github.com/stubbornella/oocss/">OOCSS project at GitHub</a>.</p>
<h3>Dan Cederholm &#8211; The CSS3 Experience</h3>
<p>Dan told us that we can and should use CSS3 now in non-critical areas such as experience, visual rewards, feedback and movement for users with the latest &amp; greatest browsers. Not so much progressive enhancement as progressive enrichment.</p>
<p>Some ideas for use of CSS3:</p>
<ul>
<li>Hover on items with RGBa background, a text-shadow and a border-radius with a transition (<a href="http://sam.brown.tc/">Sam Brown</a> style).</li>
<li>Hover with opacity change. Create a single image, make it transparent normally and less transparent on hover. With a transition of course.</li>
<li>Multiple backgrounds to achieve a <a href="http://silverbackapp.com">Silverback</a> parallax effect.</li>
<li>Enriching form elements with a background gradient and border radius.</li>
<li>Making form buttons prettier with text-shadow, border-radius, box-shadow and a background gradient. Animate the focus styles.</li>
<li>Use scale transform with box-shadow and a transition for hover on images in gallery.</li>
<li>Rotation on hover for a single degree with a transition.</li>
</ul>
<h4>Takeaways</h4>
<p>You can use CSS3 today, but know what others are missing so they don&#8217;t miss critical visual cues. Be subtle with these things or we&#8217;ll end back at using transitions to make stuff blink.</p>
<h3>Luke Wroblewski &#8211; Mobile First!</h3>
<blockquote><p>Web products should be designed for mobile first. (Even if no mobile version is planned.)</p></blockquote>
<p>Mobile is a big opportunity for growth, but you need to think about different things than when you&#8217;re doing web development like:</p>
<ul>
<li> Multiple screen sizes and densities</li>
<li>Performance optimization</li>
<li>Touch targets, gestures, and actions</li>
<li>Location systems</li>
<li>Device capabilities</li>
</ul>
<p>Designing for a smaller screen size will make you focus on core actions. To do that you&#8217;ll need to know your users. You should focus on iPhone, not (only) because of its popularity but also because it sets the design expectations very high. It also doesn&#8217;t allow any hidden features that hide in menus pressed by buttons &#8211; everything needs to be on the interface. When designing you should define device groups, create a default reference design and define rules for content and design adaptation &#8211; opt for web standards and a flexible layout. Technically you need to take care that you reduce requests and file size. You should take advantage of HTML5 that allows you to cache things locally and gives you the canvas tag that might sometimes be smarter than loading images. Think outside your web box &#8211; less cross browser issues means some new tricks come into play (like data URLs).</p>
<p>The context of using mobile applications is different. It&#8217;s not a long time sitting in front of a computer but rather quick bursts of attention everywhere, using mostly just one hand.</p>
<p>Mobile is innovating fast and you should think about the new capabilities to innovate yourself. Touch interfaces mean no hovers, thinking about bigger touch targets and a bunch of gestures that differ from platform to platform. Location information (from GPS, WiFi, cell towers or IP) is almost ubiquitous and can be used for positioning and filtering, but you should not forget other innovations that are less obvious like orientation information, audio &amp; video input and output, compass, push notifications, Bluetooth connections, proximity sensors, ambient light detectors,&#8230;</p>
<h4>Takeaways</h4>
<p>You need to think about mobile because it&#8217;s an opportunity for growth, the constraints will give you the focus you need to make a great product and the capabilities will drive innovation in your product. But don&#8217;t forget that the design considerations are different.</p>
<h3>Aarron Walter &#8211; Learning To Love Humans—Emotional Interface Design</h3>
<p>There&#8217;s a lot of talk about usability of web pages, but is this enough? Usable is just edible. Would you say you go to the restaurant because their food is edible? We have a few options on how to trigger an emotional response to our designs &#8211; one of them is giving our sites personality. It&#8217;s a platform for emotional response as we like to empathize and personality invites empathy.</p>
<blockquote><p>People will forgive shortcomings, follow your lead and sing your praises if you reward them with positive emotion.</p></blockquote>
<p>You can use treats to give users something more. Let users discover new things. It&#8217;s the little positive surprises that make us happy.</p>
<h4>Takeaways</h4>
<p>Usability is not enough, we need to think about designing pleasurable experiences. We need to create an emotional response from our users and make them want to come back.</p>
<h3>Jared Spool &#8211; Anatomy of a Design Decision</h3>
<p>How do we make design decisions and what kind of designs exist? There are a few decision styles:</p>
<ol>
<li>Unintentional design &#8211; when users will put up with whatever we give them and we don&#8217;t care about support costs and frustration (think airlines &amp; hotels).</li>
<li>Self design &#8211; works great when users are like us and we are our own users (think 37signals).</li>
<li>Genius design &#8211; when we have domain knowledge that informs our decisions and we&#8217;re solving same design problems repeatedly.</li>
<li>Activity focused design &#8211; when we can identify users and record their activities to go beyond our previous experiences.</li>
<li>Experience focused design &#8211; when we want to improve our users&#8217; complete experiences, in between specific activities.</li>
</ol>
<p>There are ways of moving up the chain:</p>
<ul>
<li>&#8220;Eat your own dog food&#8221; to get from unintentional to self design.</li>
<li>Do usability testing to get from self design to genius design.</li>
<li>Field studies get you from genius design to activity focused design.</li>
<li>Personas &amp; patterns help you get to experience focused design.</li>
</ul>
<p>There are two fundamentally opposite ways we can make decisions:</p>
<ol>
<li>Rule-based decisions are based on design books, brand identities and other rules. They don&#8217;t allow exceptions and ignore the knowledge of the person deciding.</li>
<li>Informed decisions are based on design patterns and put the person deciding behind the wheel. They are good for handling exceptions.</li>
</ol>
<p>With this in mind we can look into what is needed to do one or the other:</p>
<ol>
<li>Dogma</li>
<li>Methodologies</li>
<li>Process</li>
<li>Techniques</li>
<li>Tricks</li>
</ol>
<p>The first two are typical for rule-based decision making as they rely on a set of rules and don&#8217;t require a lot of knowledge from the person deciding. Techniques and tricks on the other hand come with experience and a lot of domain knowledge.</p>
<h4>Takeaways</h4>
<p>You need to know which decision style you&#8217;re using and encourage informed decisions, avoiding rule-based decision making. Techniques and tricks are more effective than methodologies and dogma even though/because they&#8217;re harder to come by.</p>
<h3>Pete LePage &#8211; Help Us Kill IE6</h3>
<p>A sponsored talk that didn&#8217;t really turn out as bad as some I&#8217;ve seen at other conferences (eg. FOWD). Pete presented the history and some <a href="http://www.ietestdrive.com">IE9</a> features. He also suggested that we let IE6 users know that they might want to upgrade their browser as Facebook does.</p>
<h3>MediaTemple Party</h3>
<p>The party was nice &#8211; being fashionably late meant that it wasn&#8217;t too crowded and that most of the snacks had already gone. I had a brief chat about designing Drupal 7 with <a href="http://www.markboulton.co.uk/">Mark Boulton</a>, met <a href="http://aarronwalter.com/">Aarron Walter</a> and <a href="http://www.petragregorova.com/">Petra Gregorová</a> formerly from Slovakia and a police man from Denmark that does web development in spare time. And I grabbed a (mt) beer and a coaster as a souvenir.</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://www.zemanta.com/" title="Enhanced by Zemanta"><img class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=9562306e-4374-477e-845e-f24d7c2deefb" alt="Enhanced by Zemanta" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/FP38GJhNuxgIP2cQLc2Emv6F4mc/0/da"><img src="http://feedads.g.doubleclick.net/~a/FP38GJhNuxgIP2cQLc2Emv6F4mc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FP38GJhNuxgIP2cQLc2Emv6F4mc/1/da"><img src="http://feedads.g.doubleclick.net/~a/FP38GJhNuxgIP2cQLc2Emv6F4mc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=soPshteqijc:AHJkk_Vo0X4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=soPshteqijc:AHJkk_Vo0X4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=soPshteqijc:AHJkk_Vo0X4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=soPshteqijc:AHJkk_Vo0X4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=soPshteqijc:AHJkk_Vo0X4:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/06/02/an-event-apart-seattle-review-day-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/06/02/an-event-apart-seattle-review-day-1/</feedburner:origLink></item>
		<item>
		<title>iPad Keynote issues</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/saDG_xW1MZI/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/05/14/ipad-keynote-issues/#comments</comments>
		<pubDate>Fri, 14 May 2010 13:57:42 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=283</guid>
		<description>Image via Wikipedia A lot has been said about why Keynote on the iPad is bad. I agree that most of the issues mentioned are a problem, but there are just a few I really care about: No presenter notes. I like my numbers in notes and not on slides. In case anybody asks I&amp;#8217;d [...]</description>
			<content:encoded><![CDATA[<div class="zemanta-img"><a href="http://en.wikipedia.org/wiki/Image:KeynoteIcon.png"><img src="http://upload.wikimedia.org/wikipedia/en/5/57/KeynoteIcon.png" alt="Keynote" /></a><span class="zemanta-img-attribution">Image via <a href="http://en.wikipedia.org/wiki/Image:KeynoteIcon.png">Wikipedia</a></span></div>
<p>A lot <a href="http://www.tuaw.com/2010/04/09/five-ways-keynote-for-the-ipad-badly-misses-the-mark/">has</a> <a href="http://www.toddalbert.com/wp/10-biggest-surprises-good-and-bad-about-the-ipad/">been</a> <a href="http://theappleblog.com/2010/04/07/ipad-keynote-a-better-mistress-than-wife/">said</a> about why <a class="zem_slink" title="Keynote (presentation software)" rel="wikipedia" href="http://en.wikipedia.org/wiki/Keynote_%28presentation_software%29">Keynote</a> on the <a class="zem_slink" title="iPad" rel="homepage" href="http://www.apple.com/ipad/">iPad</a> is bad. I agree that most of the issues mentioned are a problem, but there are just a few I really care about:</p>
<ol>
<li><strong>No presenter notes</strong>. I like my numbers in notes and not on slides. In case anybody asks I&#8217;d like to be able to check the screen and tell them. How about a drawer similar to the slide index that comes from the bottom of the screen? Oh, and not removing notes on import&#8230;</li>
<li><strong>Can&#8217;t see which slide I&#8217;m on.</strong> I have the problem of checking the projection as it is, I don&#8217;t need the software to make me do it even more. This is also problematic when using &#8220;the laser pointer&#8221; &#8211; you have no idea what you&#8217;re pointing at unless you check the projection. I could do with a faded slide in the background.</li>
</ol>
<p>Most of the others would be nice to have, but these are just a big pain. Until they&#8217;re fixed the iPad to VGA connector was just a waste of money&#8230;</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Enhanced by Zemanta" href="http://www.zemanta.com/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=c76cb66e-625b-4c44-9b6e-c1a7130b2315" alt="Enhanced by Zemanta" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/OXSu3sDRvIqQhAnW-OzfQRtCp8o/0/da"><img src="http://feedads.g.doubleclick.net/~a/OXSu3sDRvIqQhAnW-OzfQRtCp8o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/OXSu3sDRvIqQhAnW-OzfQRtCp8o/1/da"><img src="http://feedads.g.doubleclick.net/~a/OXSu3sDRvIqQhAnW-OzfQRtCp8o/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=saDG_xW1MZI:In8UukCa39w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=saDG_xW1MZI:In8UukCa39w:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=saDG_xW1MZI:In8UukCa39w:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=saDG_xW1MZI:In8UukCa39w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=saDG_xW1MZI:In8UukCa39w:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/05/14/ipad-keynote-issues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/05/14/ipad-keynote-issues/</feedburner:origLink></item>
		<item>
		<title>Update</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/6z1F8wmYjWM/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/05/04/update/#comments</comments>
		<pubDate>Tue, 04 May 2010 21:03:24 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=281</guid>
		<description>Image via CrunchBase I&amp;#8217;ve been trying to write something for some time now. As I obviously suck at blogging I decided to just post this short list of stuff that happened in between. I now work part time at Zemanta. I&amp;#8217;ve also downgraded to Head of Frontend as knowing everything as VP Engineering would be [...]</description>
			<content:encoded><![CDATA[<div class="zemanta-img"><a href="http://www.crunchbase.com/product/ipad"><img class="alignright" src="http://www.crunchbase.com/assets/images/resized/0007/4404/74404v12-max-250x250.jpg" alt="Image representing iPad as depicted in CrunchBase" width="250" height="155" /></a><span class="zemanta-img-attribution">Image via <a href="http://www.crunchbase.com">CrunchBase</a></span></div>
<p>I&#8217;ve been trying to write something for some time now. As I obviously suck at blogging I decided to just post this short list of stuff that happened in between.</p>
<ol>
<li>I now work part time at <a class="zem_slink" title="Zemanta" rel="homepage" href="http://www.zemanta.com">Zemanta</a>. I&#8217;ve also downgraded to Head of Frontend as knowing everything as VP Engineering would be kind of hard. This gives me more time to work on my own projects.</li>
<li>I&#8217;ve been to <a class="zem_slink" title="Seattle" rel="wikipedia" href="http://en.wikipedia.org/wiki/Seattle">Seattle</a> for <a class="zem_slink" title="An Event Apart" rel="homepage" href="http://www.aneventapart.com">An Event Apart</a> and <a href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAsQFjAA&amp;url=http%3A%2F%2Fwww.flickr.com%2Fphotos%2Fzeldman%2F4493219601%2F&amp;ei=1oTgS9SXEc-LOPX_xcUI&amp;usg=AFQjCNEVRrU6DGYzQsr0d5IWrVbsHFL6KA&amp;sig2=UIzcPaYixUwnhRMNo2lYWg">I have proof</a>. It was a great conference and I&#8217;m writing a review post. It&#8217;s taking more time than I expected. I should have known better.</li>
<li>I&#8217;ve been to <a class="zem_slink" title="Phoenix, Arizona" rel="wikipedia" href="http://en.wikipedia.org/wiki/Phoenix%2C_Arizona">Phoenix</a> for <a href="http://iasummit.org">IASummit</a>. Another great conference and a great community. The <a href="http://www.slideshare.net/whitneyhess/transcending-our-tribe-3750435">closing plenary by Whitney Hess</a> made me want to go again next year and help out. I promised to write a rookie review, but haven&#8217;t yet. I also hope to make it a review post.</li>
<li>I have an <a class="zem_slink" title="iPad" rel="homepage" href="http://www.apple.com/ipad/">iPad</a>. I love it. I should write a post about it but I probably won&#8217;t. First observations? I tweet more. I attribute that I&#8217;m chattier on <a class="zem_slink" title="Twitter" rel="homepage" href="http://twitter.com">Twitter</a> to that and to the conferences. I need to upgrade my blog so I can blog from it. Maybe then I&#8217;ll blog more.</li>
<li>At An Event Apart <a class="zem_slink" title="Jeremy Keith" rel="homepage" href="http://adactio.com/">Jeremy Keith</a> said that it would be lovely if somebody made a tool that would check <a class="zem_slink" title="HTML5" rel="wikipedia" href="http://en.wikipedia.org/wiki/HTML5">HTML5</a> for more than the validator does. I did the first version on the plane (SEA-PHX and PHX-ZUR). <a href="http://markos.gaivo.net/blog">Marko Samastur</a> wrote most of the <a class="zem_slink" title="Django (web framework)" rel="homepage" href="http://www.djangoproject.com">Django</a> app and it&#8217;s now online at <a href="http://lint.brihten.com">http://lint.brihten.com</a>. It has an <a class="zem_slink" title="Application programming interface" rel="wikipedia" href="http://en.wikipedia.org/wiki/Application_programming_interface">API</a> and will be opensourced soon. It is the first <a href="http://mmm.si">MMM</a> project.</li>
<li>I started thinking of doing something very cool next year due to <a class="zem_slink" title="Andy Budd" rel="homepage" href="http://www.andybudd.com/">Andy Budd</a>&#8216;s convincing at the IASummit karaoke, hosted by the very cool <a href="http://www.kevinmhoffman.com/">Kevin M. Hoffman</a>. I shall disclose the details at a later date, but it will be also a MMM thing.</li>
<li><a href="http://euroia.org">EuroIA</a> <a href="http://www.euroia.org/Submissions.aspx">call for papers</a> is open and it will only be open until Sunday, May 16 24:00 CET. The conference will be in Paris in September and I think you should check it out.</li>
</ol>
<p style="text-align: left;">Enough about me, how about you? Who am I kidding, there&#8217;s no one out there&#8230;</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Enhanced by Zemanta" href="http://www.zemanta.com/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=3f4ddf17-f5ba-4fa9-adc2-3f1bd36b921a" alt="Enhanced by Zemanta" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/KTcAEfPypJk8l-bNI2bO5uROH00/0/da"><img src="http://feedads.g.doubleclick.net/~a/KTcAEfPypJk8l-bNI2bO5uROH00/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/KTcAEfPypJk8l-bNI2bO5uROH00/1/da"><img src="http://feedads.g.doubleclick.net/~a/KTcAEfPypJk8l-bNI2bO5uROH00/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=6z1F8wmYjWM:rWy1Af64BD0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=6z1F8wmYjWM:rWy1Af64BD0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=6z1F8wmYjWM:rWy1Af64BD0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=6z1F8wmYjWM:rWy1Af64BD0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=6z1F8wmYjWM:rWy1Af64BD0:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/05/04/update/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/05/04/update/</feedburner:origLink></item>
		<item>
		<title>jQuery 1.4 and 1.4.1 considered harmful – use jQuery 1.4.2!</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/6Nm79dfNdZo/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/02/24/jquery-14-and-141-considered-harmful/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 14:11:08 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=280</guid>
		<description>I never thought I&amp;#8217;d write a &amp;#8220;considered harmful&amp;#8221; post, but this is really way too serious. Do not use jQuery 1.4 or 1.4.1 with user generated content! jQuery 1.4 branch added some great stuff, but let a really ugly bug through. Something that you could call jQuery injection. replaceWith: function( value ) { if ( [...]</description>
			<content:encoded><![CDATA[<p>I never thought I&#8217;d write a &#8220;<a href="http://meyerweb.com/eric/comment/chech.html">considered harmful</a>&#8221; post, but this is really way too serious.</p>
<h3>Do not use jQuery 1.4 or 1.4.1 with user generated content!</h3>
<p><a class="zem_slink freebase/en/jquery" title="JQuery" rel="homepage" href="http://jquery.com/">jQuery</a> 1.4 branch added some great stuff, but let a really ugly bug through. Something that you could call <strong>jQuery injection</strong>.</p>
<pre><code>replaceWith: function( value ) {
	if ( this[0] &amp;&amp; this[0].parentNode ) {
		// Make sure that the elements are removed from the DOM before they are inserted
		// this can help fix replacing a parent with child elements
		if ( !jQuery.isFunction( value ) ) {
			value = jQuery( value ).detach();
		}
...
</code></pre>
<p>With previous versions you could easily do <code>$('#myElement').replaceWith('some text');</code> to replace the selected node with a text node. In jQuery 1.4 and 1.4.1 you can&#8217;t &#8211; but just failing does not constitute a huge bug.</p>
<p>If you take a good look at the code above you can easily find that if <code>value</code> passed is a  <code>string</code> that looks like a selector, it will <strong>detach nodes from the document</strong>. Consider calling <code>$('#myElement').replaceWith('html');</code> &#8211; the screen goes blank and everything the user has been working on is gone.</p>
<h3>Fortunately&#8230;</h3>
<p><strong>jQuery 1.4.2 fixed this issue</strong> by properly using detach only when <code>value</code> is not a <code>string</code>. If you are using jQuery 1.4 or 1.4.1 and for some reason cannot upgrade to 1.4.2 (or just don&#8217;t want to), you can still just copy the whole <code>replaceWith</code> method from jQuery 1.4.2 to your version.</p>
<h6 class="zemanta-related-title">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://java.sys-con.com/node/1179088">101 on jQuery Selector Performance</a> (java.sys-con.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.sitepoint.com/blogs/2010/02/24/learn-jquery/">It&#8217;s Easy to Fall in Love with jQuery</a> (sitepoint.com)</li>
<li class="zemanta-article-ul-li"><a href="http://oreilly.com/catalog/9780980576856/">jQuery: Novice to Ninja</a> (oreilly.com)</li>
</ul>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/f26232c7-fdf3-43ba-9caa-9d33dd6899c0/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=f26232c7-fdf3-43ba-9caa-9d33dd6899c0" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related more-info pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/bB7MjoDACORspr-cIBdHObX69GM/0/da"><img src="http://feedads.g.doubleclick.net/~a/bB7MjoDACORspr-cIBdHObX69GM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/bB7MjoDACORspr-cIBdHObX69GM/1/da"><img src="http://feedads.g.doubleclick.net/~a/bB7MjoDACORspr-cIBdHObX69GM/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=6Nm79dfNdZo:mjgTKbhOFjg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=6Nm79dfNdZo:mjgTKbhOFjg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=6Nm79dfNdZo:mjgTKbhOFjg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=6Nm79dfNdZo:mjgTKbhOFjg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=6Nm79dfNdZo:mjgTKbhOFjg:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/02/24/jquery-14-and-141-considered-harmful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/02/24/jquery-14-and-141-considered-harmful/</feedburner:origLink></item>
		<item>
		<title>Setting innerHTML wraps content with DIVs!?</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/jRMYDcIcsRw/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/02/24/setting-innerhtml-wraps-content-with-divs/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 11:53:50 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=279</guid>
		<description>Trying to add some HTML to an element with innerHTML and weird stuff happens in Firefox (3.5, 3.6)? var elm = document.getElementById('myElement'); elm.innerHTML = 'Test'; alert(elm.innerHTML); // alerts '&amp;#60;div xmlns="http://www.w3.org/1999/xhtml"&amp;#62;Test&amp;#60;/div&amp;#62;' I just figured out the problem is that one of myElement ancestors is attached to a table as a non-table element. In my case there [...]</description>
			<content:encoded><![CDATA[<p>Trying to add some <a class="zem_slink freebase/en/html" href="http://en.wikipedia.org/wiki/HTML" title="HTML" rel="wikipedia">HTML</a> to an element with innerHTML and weird stuff happens in Firefox (3.5, 3.6)?</p>
<pre><code>var elm = document.getElementById('myElement');
elm.innerHTML = 'Test';
alert(elm.innerHTML);
// alerts '&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Test&lt;/div&gt;'
</code></pre>
<p>I just figured out the problem is that one of <em>myElement</em> ancestors is attached to a table as a non-table element. In my case there was a <code>div</code> attached to a <code>tr</code>. Changing that <code>div</code> to <code>td</code> fixed the problem.</p>
<p title="I don't think any webdeveloper really said this, I just decided I need another paragraph:)">And they say web development isn&#8217;t full of surprises&#8230;</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/b6295000-ad04-47d4-b392-7b4e3b9eb67a/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=b6295000-ad04-47d4-b392-7b4e3b9eb67a" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related more-info pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/4M_PXR4XJmib2VCQnTzsfXZ83lI/0/da"><img src="http://feedads.g.doubleclick.net/~a/4M_PXR4XJmib2VCQnTzsfXZ83lI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/4M_PXR4XJmib2VCQnTzsfXZ83lI/1/da"><img src="http://feedads.g.doubleclick.net/~a/4M_PXR4XJmib2VCQnTzsfXZ83lI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=jRMYDcIcsRw:rYR3f7Beczs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=jRMYDcIcsRw:rYR3f7Beczs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=jRMYDcIcsRw:rYR3f7Beczs:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=jRMYDcIcsRw:rYR3f7Beczs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=jRMYDcIcsRw:rYR3f7Beczs:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/02/24/setting-innerhtml-wraps-content-with-divs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/02/24/setting-innerhtml-wraps-content-with-divs/</feedburner:origLink></item>
		<item>
		<title>Screwing up conversion rates</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/4MX9nrno6Lc/</link>
		<comments>http://friedcellcollective.net/outbreak/2010/01/31/screwing-up-conversion-rates/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 16:16:45 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[services]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=272</guid>
		<description>By far the best way to screw up your conversion rates is to go mainstream. The traffic graph is the number of visitors per day while the conversion rate is the percentage of the visitors converted. When you go mainstream your traffic will spike and plateau at a lower level a few days later. This [...]</description>
			<content:encoded><![CDATA[<p>By far the best way to screw up your conversion rates is to go mainstream.</p>
<p><img src="http://static.marela.si/users0/fry/3/zccPWZnUtSNu50wMk9HIFTHl3DM.jpg" alt="Traffic - conversion graph" height="252" width="400" /></p>
<p>The traffic graph is the number of visitors per day while the <a class="zem_slink freebase/guid/9202a8c04000641f8000000000ea1a8f" title="Conversion rate" rel="wikipedia" href="http://en.wikipedia.org/wiki/Conversion_rate">conversion rate</a> is the percentage of the visitors converted. When you go mainstream your traffic will spike and plateau at a lower level a few days later. This will <strong>screw up</strong> your conversion rate. Don&#8217;t worry though &#8211; figure out who the visitors are and fix your <a class="zem_slink freebase/guid/9202a8c04000641f800000000081685f" title="Landing page" rel="wikipedia" href="http://en.wikipedia.org/wiki/Landing_page">landing pages</a> to target them as good as you can.</p>
<p>This graph obviously focuses on start-ups that have a <em>huge</em> conversion rate at the beginning as most of the conversion happens on tech-news sites and only already &#8220;converted&#8221; people get to your page &#8211; conversion rates of 80% are common in such cases. It should also be valid for later stage companies, but you need to adjust the conversion rate numbers. Another fact of conversion rates is that as your number of visitors grows your conversion rate will drop due to the fact that more users will be &#8220;just browsing&#8221; (think about a store in a mall).</p>
<p>If you don&#8217;t belive me think about the what the <a class="zem_slink freebase/guid/9202a8c04000641f800000000484d119" title="Twitter" rel="homepage" href="http://twitter.com/">Twitter</a> homepage looked like in time. The first one I saw had the public stream on it &#8211; geeky as hell. They changed that into a still somewhat geeky homepage that explained what Twitter is and helped you register. The latest one is almost non-geeky and focuses on real-time search and has a prominent sign up button.</p>
<h6 class="zemanta-related-title">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.seomoz.org/blog/11-conversion-lessons-learned-2009">Conversion Rate Optimization Lessons Learned in 2009</a> (seomoz.org)</li>
<li class="zemanta-article-ul-li"><a href="http://altitudebranding.com/2010/01/breaking-a-goal-into-metrics/">Breaking A Goal Into Metrics</a> (altitudebranding.com)</li>
</ul>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/b895aee9-d624-4f3f-84ea-3879011f8c75/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=b895aee9-d624-4f3f-84ea-3879011f8c75" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/BwbbzP0szfhu4ug9bPdJftgxzlU/0/da"><img src="http://feedads.g.doubleclick.net/~a/BwbbzP0szfhu4ug9bPdJftgxzlU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/BwbbzP0szfhu4ug9bPdJftgxzlU/1/da"><img src="http://feedads.g.doubleclick.net/~a/BwbbzP0szfhu4ug9bPdJftgxzlU/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=4MX9nrno6Lc:2S6aBTX9YLA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=4MX9nrno6Lc:2S6aBTX9YLA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=4MX9nrno6Lc:2S6aBTX9YLA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=4MX9nrno6Lc:2S6aBTX9YLA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=4MX9nrno6Lc:2S6aBTX9YLA:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2010/01/31/screwing-up-conversion-rates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2010/01/31/screwing-up-conversion-rates/</feedburner:origLink></item>
		<item>
		<title>Fluid searchbox</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/DOugVPwHo6I/</link>
		<comments>http://friedcellcollective.net/outbreak/2009/10/04/fluid-searchbox/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 19:16:50 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=257</guid>
		<description>There&amp;#8217;s been a lot of fluid layouts recently. When you use a fluid layout it&amp;#8217;s hard to make everything fluid as you need to stretch certain elements and have other elements fixed. I was approached some time ago by a designer who was working on a fluid design but was having problems with a HTML/CSS [...]</description>
			<content:encoded><![CDATA[<p>There&#8217;s been a lot of fluid layouts recently. When you use a fluid layout it&#8217;s hard to make everything fluid as you need to stretch certain elements and have other elements fixed.</p>
<p>I was approached some time ago by a designer who was working on a fluid design but was having problems with a HTML/CSS only solution for a fluid searchbox. The idea to create a searchbox that grows when the window grows is simple, but becomes a tad more difficult when you add stuff to the left and right of it, some being fixed width (width in px or em) and some fluid width (width in %).</p>
<p>As I like challenges I took it on and produced a sample that worked on most modern browsers in a single evening. They didn&#8217;t like it because it didn&#8217;t work in IE7 (cause I never checked it) even though the fix for IE (it was only IE7 that didn&#8217;t work) was trivial. After a while I went back and checked it out again, changed the code a bit and I think it&#8217;s much better now.</p>
<h3>The simple form</h3>
<p>Creating a fluid search box when you only have a single element next to it is trivial. What you do is wrap the input in an element and use padding to create space for the fixed element, then position the fixed element absolutely (or relatively) in the space created by the padding.</p>
<h5>HTML:</h5>
<pre><code>&lt;fieldset&gt;
	&lt;div&gt;
		&lt;input type="text" name="q" value="" /&gt;
	&lt;/div&gt;
	&lt;input class="s" type="submit" value="Search" /&gt;
&lt;/fieldset&gt;</code></pre>
<h5>CSS:</h5>
<pre><code>fieldset {position:relative;padding:0;}
div {padding-right:6em;}
div input {width:100%;}
input.s {width:5em;font-size:1em;position:absolute;right:0;top:0;}</code></pre>
<h5>Sample</h5>
<form action="#" method="get">
<fieldset style="padding: 0pt; position: relative;">
<div style="padding-right: 6em;">
<input style="width: 100%;" name="q" type="text" /></div>
<input class="s" style="position: absolute; right: 0pt; top: 0pt; font-size: 1em; width: 5em;" type="submit" value="Search" />
</fieldset>
</form>
<p>You could target the input with <code>input[type=submit]</code> but that wouldn&#8217;t work in older browsers.</p>
<h3>A complex form</h3>
<p>The complex form from the intro includes a title, a search type drop-down (select element), the input box and a submit button. This gives us four elements, two of which are fixed and two fluid &#8211; and more stuff to hack around.</p>
<h5>HTML</h5>
<pre><code>&lt;fieldset&gt;
	&lt;div class="l"&gt;
		&lt;span&gt;Find&lt;/span&gt;
		&lt;select name="type"&gt;
			&lt;option&gt;in Books&lt;/option&gt;
			&lt;option&gt;in DVDs&lt;/option&gt;
		&lt;/select&gt;
	&lt;/div&gt;
	&lt;div class="c"&gt;
		&lt;input type="text" value="" name="q" /&gt;
	&lt;/div&gt;
	&lt;div class="r"&gt;
		&lt;input type="submit" value="Search" /&gt;
	&lt;/div&gt;
&lt;/fieldset&gt;</code></pre>
<h5>CSS</h5>
<pre><code>fieldset {margin:0;padding:0;position:relative;border:0;}
fieldset .l {height:0;}
fieldset .l span {width:3em;display:inline-block;}
fieldset .l select {width:10%;}
fieldset .c {margin:0 60px 0 4em;padding:0 .7em 0 10%;}
fieldset .c input {width:100%;}
fieldset .r {position:absolute;right:0;top:0;}
fieldset .r input {width:60px;}
* html fieldset .l {float:left;width:100%;margin-right:-100%;}</code></pre>
<h4>The basics</h4>
<p>I created three elements that help me align elements. I&#8217;m using classes l for left, c for center and r for right. The left element includes the title and the type, the central element includes the search box and the right element includes the submit button.</p>
<pre><code>fieldset .l {height:0;}
fieldset .r {position:absolute;right:0;top:0;}</code></pre>
<p>The left element has its height set to 0 so it seemingly doesn&#8217;t take any space. The central element includes the input and needs no special positioning, while the right element is positioned similar to the simple solution &#8211; absolute and set to right.</p>
<h4>The surrounding elements</h4>
<p>You can set the width of these elements in any unit you like. I set the width for the span element in em, type drop-down in % to make it fluid and submit button in px.</p>
<pre><code>fieldset .l span {width:3em;display:inline-block;}
fieldset .l select {width:10%;}
fieldset .r input {width:60px;}</code></pre>
<p>The only thing you need to do in CSS is set the width to these elements. You need to set the display property on the span element to work around the fact that inline elements don&#8217;t allow setting of width.</p>
<h4>The fluid input</h4>
<pre><code>fieldset .c {margin:0 60px 0 4em;padding:0 .7em 0 10%;}
fieldset .c input {width:100%;}</code></pre>
<p>The input needs its width set to 100% so it will stretch the whole available width of the parent. That happens due to the fact that block-level elements will grow to 100% automatically and the margin and padding will &#8220;shrink&#8221; its contents. This allows setting the spacing in two different units &#8211; one for margin and one for padding. If you look at the CSS rule, you&#8217;ll see that the widths are similar to those set for the surrounding elements &#8211; of course with some spacing added.</p>
<ul>
<li>Right: 60px margin (width of the submit button), .7em padding (spacing)</li>
<li>Left: 4em margin (3em for the title + spacing), 10% padding (type select width)</li>
</ul>
<h4>The browsers</h4>
<p>You can check out <a href="http://friedcellcollective.net/fluidtest.html">a sample page with the complex form</a>. Working on Windows I&#8217;ve tested it in these browsers:</p>
<ul>
<li>Firefox: 2.0, 3.0, 3.5</li>
<li>Opera: 10</li>
<li>Safari: 4</li>
<li>Google Chrome: 3</li>
<li>Internet Explorer: 8 (with its rendering of IE7 Standards and Quirks)</li>
</ul>
<p>As always at least one browser had to fail &#8211; IE6 did. The problem was <code>height:0;</code> as IE6 will render elements as high as their content. We can work around this by changing the way we make it zero width/height so it doesn&#8217;t affect the central element.</p>
<pre><code>* html fieldset .l {float:left;width:100%;margin-right:-100%;}</code></pre>
<p>I&#8217;m using the IE6 CSS filter to target IE6, you can use conditional comments or whatever you like best. The rule floats the element left, making it 100% wide, but resets the position by setting the right margin to -100%.</p>
<p>As I&#8217;m using <code>display:inline-block;</code> this will work a bit different on browsers that don&#8217;t support inline-block. In Firefox 2.0 you can use <code>display:-moz-inline-box;</code> in the rule for the <code>span</code>, but make sure you put it before the <code>inline-block</code>.</p>
<pre><code>fieldset .l span {width:3em;display:-moz-inline-box;display:inline-block;}</code></pre>
<h4>Last words</h4>
<p>You might want to fix some stuff in some browsers so everything aligns nice. The techinque used is derived from the <a href="http://meyerweb.com/eric/thoughts/2005/11/09/multi-unit-any-order-columns/">multi-unit any-order column layout</a> by <a class="zem_slink freebase/guid/9202a8c04000641f800000000024c5db" title="Eric Meyer" rel="wikipedia" href="http://en.wikipedia.org/wiki/Eric_Meyer">Eric Meyer</a> as it opens your mind on how to use multiple units in a single layout without fuss. I&#8217;ve tried all the browsers I have on my dev machine and I&#8217;m not saying it works everywhere. If you find a browser where it doesn&#8217;t post a comment; if you find a better way of doing things also post a comment.</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/6a47e4e4-04fd-4357-b788-c5ea937c07fa/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=6a47e4e4-04fd-4357-b788-c5ea937c07fa" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/_tPd1loh_0XpcSbPBtpZHJrax3w/0/da"><img src="http://feedads.g.doubleclick.net/~a/_tPd1loh_0XpcSbPBtpZHJrax3w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_tPd1loh_0XpcSbPBtpZHJrax3w/1/da"><img src="http://feedads.g.doubleclick.net/~a/_tPd1loh_0XpcSbPBtpZHJrax3w/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=DOugVPwHo6I:OEt7fGxZdfs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=DOugVPwHo6I:OEt7fGxZdfs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=DOugVPwHo6I:OEt7fGxZdfs:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=DOugVPwHo6I:OEt7fGxZdfs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=DOugVPwHo6I:OEt7fGxZdfs:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2009/10/04/fluid-searchbox/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2009/10/04/fluid-searchbox/</feedburner:origLink></item>
		<item>
		<title>Hiring developers: King of the Hill effect</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/K-b6GyMX5pU/</link>
		<comments>http://friedcellcollective.net/outbreak/2009/08/14/hiring-developers-king-of-the-hill-effect/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 23:24:22 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[general]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[zemanta]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=270</guid>
		<description>You might have noticed that we&amp;#8217;re hiring at Zemanta. As we&amp;#8217;re a start-up we&amp;#8217;re looking for experienced developers that can get to work right away. The environment of browsers and as if that&amp;#8217;s not enough blogging platforms and rich-text editors is very challenging so the bar is set quite high. As we were talking about [...]</description>
			<content:encoded><![CDATA[<p>You might have noticed that <a class="zem_olink" title="Know a JavaScript developer?" href="http://friedcellcollective.net/outbreak/2009/07/21/know-a-javascript-developer/">we&#8217;re hiring</a> at <a class="zem_slink" title="Zemanta" rel="homepage" href="http://www.zemanta.com">Zemanta</a>. As we&#8217;re a start-up we&#8217;re looking for experienced developers that can get to work right away. The environment of browsers and as if that&#8217;s not enough blogging platforms and rich-text editors is very challenging so the bar is set quite high. As we were talking about hiring a new person we tried to write a job description and application invitation that would set the bar high and also test some things we wanted to know before conducting the interviews. It seems we might have went a bit too far as we only got a few applications.</p>
<p>You always expect some people to send you a <a class="zem_slink freebase/guid/9202a8c04000641f800000000a1eb583" title="Application for employment" rel="wikipedia" href="http://en.wikipedia.org/wiki/Application_for_employment">job application</a> request that will not conform to what you&#8217;re requesting and that&#8217;s ok &#8211; you can easily ignore these applications. You will also always get some people who don&#8217;t fit the requirements by a mile but are trying to get &#8220;on the shortlist&#8221; for possible openings in the future &#8211; that&#8217;s ok too. And you&#8217;ll also get a lot of people that will value their own knowledge far more that they should &#8211; these are the ones I wanna talk about here.</p>
<p>You&#8217;ve probably met a bunch of &#8220;airheads&#8221;, &#8220;egomaniacs&#8221; or whatever you call the people that are full of themselves and describe their knowledge as expert but turn silent when you pop a simple advance question. I call them &#8220;king of the hill&#8221; types.</p>
<h3>Assessing your own knowledge is hard</h3>
<p>It&#8217;s in our nature to compare. My &#8220;house&#8221; is bigger than your &#8220;house&#8221; is part of our minds, even more so in <a class="zem_slink freebase/guid/9202a8c04000641f800000000003651a" title="Slovenia" rel="wikipedia" href="http://en.wikipedia.org/wiki/Slovenia">Slovenia</a>, a small market where basically everybody knows everybody. So it&#8217;s only natural that we assess our knowledge based on comparison. There&#8217;s an obvious problem with that &#8211; I will have no idea who you&#8217;re comparing yourself with and therefore your score will make no sense to me. In that sense it&#8217;s similar to confidence levels in search.</p>
<p>You might think setting a comparison chart would make the scores better, but it really doesn&#8217;t. If you tell a developer that he should assess his knowledge of a language based on a scale where 1 is &#8220;can read it&#8221; and 10 is &#8220;i invented it&#8221; you&#8217;ll get a lot of 8s. Which would mean they&#8217;re basically the best developer for that language in the country. When you do, you can easily think that the guy saying it is a moron and discard him as a viable candidate. And you&#8217;d be wrong doing that, at least sometimes.</p>
<h3>Are you King of the Hill?</h3>
<p>When people overestimate their knowledge it&#8217;s because of two basic reasons:</p>
<ol>
<li>They are genuine asswipes that think they know more than the guy that invented the language, but know showing they&#8217;re an egomaniac on the interview is not smart. So they&#8217;ll lower the score to an 8 to make you feel good. These guys are usually easy to recognize as they&#8217;ll be defensive and dismiss any questions they don&#8217;t know with something like &#8220;that sucks&#8221;, &#8220;i never need that&#8221;, &#8230;</li>
<li>They really have no idea what else is out there. I was sure that in the age of internet such people don&#8217;t exist anymore, but even in computer related industries you can easily find people that got stuck in a particular part of the web of amateur forums and people of the previous variety. This means they do actually know everything, but don&#8217;t realize that everything is a lot bigger than they know.</li>
</ol>
<p>But this is only a part of the story.</p>
<h3>Who to hire then?</h3>
<p>I&#8217;ve drawn a simple graph to help explain this:</p>
<div class="zemanta-img aligncenter"><a href="http://www.marela.si/photos/33761"><img src="http://static.marela.si/users0/fry/3/tDT0XvOUY671dbTLJ-g6t3HhmEE.jpg" alt="Don\'t hire the King of the Hill" /></a><span class="zemanta-img-attribution">Don&#8217;t hire the King of the Hill!</span></div>
<h4>The beginners</h4>
<p>As you start learning about something you&#8217;ll know that you know next to nothing. You&#8217;ll also see a lot you can learn and might even see where you want to get &#8211; as near to the &#8220;i inveted it&#8221; as possible. At that time your think you know less than you really do &#8211; these are the people <strong>you should hire</strong> only if you are willing to wait until they learn more and if you believe they can. As you learn and overcome the problems you thought were the &#8220;the big problems&#8221; you&#8217;ll go over the equilibrium and become a smart-ass.</p>
<h4>The kings</h4>
<p>This is where it gets interesting. Some people like to be king of the hill so they will ignore everything beyond that point. They will also make sure that people lower on the actual knowledge axis will not see over that point. They&#8217;ll have all sorts of reasons why everything beyond this point is crap. These are the people that make the most damage to development communities, as they&#8217;re usually the vocal ones. <strong>You should not hire them</strong>.</p>
<h4>The enlightened</h4>
<p>But as I said before they might really just have no idea what&#8217;s beyond that point. That&#8217;s easily solvable even during the interview &#8211; you can show them some code, throw around some ideas and arguments on why that&#8217;s good and some people will say &#8220;Wow, I didn&#8217;t even know all that is possible!&#8221; (yep, I actually got a response like that). <strong>You should hire this people immediately</strong> &#8211; seriously, don&#8217;t let them leave the interview without signing a contract. Tell them they&#8217;re the last interview before the decision and that you decided already and don&#8217;t need to wait. And because they&#8217;re now sure they know less than they really do, you&#8217;ll be able to get great <a class="zem_slink freebase/guid/9202a8c04000641f8000000000a7dc9e" title="Value (economics)" rel="wikipedia" href="http://en.wikipedia.org/wiki/Value_%28economics%29">value for money</a>.</p>
<p>You must however be really careful with developers in this stage. They will climb the curve fast and soon they&#8217;ll start whining about lack of challenging work. They&#8217;ll also start to want more money. They might even want to say they want to be a team leader. When they do, they&#8217;re really just saying they want more money. Don&#8217;t confuse expert developer knowledge for managerial skills!</p>
<h4>The experts</h4>
<p>The best you can do at this stage is making them architect or senior developer. And with that done you need to start sending them to topnotch conferences and encourage them to write papers trying to get a gig at one of them. They&#8217;ll meet with the inventors, see that they&#8217;re actually normal people with a unique set of knowledge that is much wider than they expected. The new &#8220;lack of focus&#8221; will keep them busy and inspire them. They might become a better developer or stay at the same level, but they&#8217;ll be happy. They&#8217;ll be the kid with a new toy. With the ability to find a new toy when this one gets boring. That&#8217;s what supporting <a class="zem_slink freebase/guid/9202a8c04000641f8000000000542e8b" title="Extracurricular activity" rel="wikipedia" href="http://en.wikipedia.org/wiki/Extracurricular_activity">extracurricular activities</a> and flexibility is good for.</p>
<h6 class="zemanta-related-title">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.zemanta.com/blog/introducing-balloons-free-multimedia-overlays-for-bloggers/">Introducing Balloons: Free multimedia overlays for bloggers</a> (zemanta.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.avc.com/a_vc/2009/07/new-zemanta-release.html">New Zemanta Release</a> (avc.com)</li>
<li class="zemanta-article-ul-li"><a href="http://myventurepad.com/MVP/70563">Making The Web Smarter</a> (myventurepad.com)</li>
</ul>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/66543189-d8ad-44c4-9d90-613bf2e03a1b/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=66543189-d8ad-44c4-9d90-613bf2e03a1b" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related more-info pretty-attribution paragraph-reblog"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/6BUTLWcanWF8_rsNFCz22qNgYJM/0/da"><img src="http://feedads.g.doubleclick.net/~a/6BUTLWcanWF8_rsNFCz22qNgYJM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6BUTLWcanWF8_rsNFCz22qNgYJM/1/da"><img src="http://feedads.g.doubleclick.net/~a/6BUTLWcanWF8_rsNFCz22qNgYJM/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=K-b6GyMX5pU:kDUAo7qTW_A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=K-b6GyMX5pU:kDUAo7qTW_A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=K-b6GyMX5pU:kDUAo7qTW_A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=K-b6GyMX5pU:kDUAo7qTW_A:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=K-b6GyMX5pU:kDUAo7qTW_A:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2009/08/14/hiring-developers-king-of-the-hill-effect/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2009/08/14/hiring-developers-king-of-the-hill-effect/</feedburner:origLink></item>
		<item>
		<title>Know a JavaScript developer?</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/wUIy2bMSIBQ/</link>
		<comments>http://friedcellcollective.net/outbreak/2009/07/21/know-a-javascript-developer/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 09:54:08 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[companies]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[zemanta]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=269</guid>
		<description>If you haven&amp;#8217;t heard yet, we&amp;#8217;re looking for a JavaScript developer at Zemanta. I think the ad says it all. Are you the frontend developer we are looking for? Zemanta is developing a platform for contextually enhancing content and your job would be to help us develop tools that make this easy and fun for [...]</description>
			<content:encoded><![CDATA[<p>If you haven&#8217;t heard yet, we&#8217;re looking for a <a class="zem_slink freebase/guid/9202a8c04000641f8000000000015527" href="http://en.wikipedia.org/wiki/JavaScript" title="JavaScript" rel="wikipedia">JavaScript</a> developer at <a class="zem_slink" href="http://www.zemanta.com" title="Zemanta" rel="homepage">Zemanta</a>. I think <a href="http://www.zemanta.com/jobs">the ad</a> says it all.</p>
<blockquote>
<h3>Are you the frontend developer we are looking for?</h3>
<p>Zemanta is developing a <em>platform for contextually enhancing content</em> and your job would be to help us develop <strong>tools that make this easy and fun for writers and readers alike</strong>.</p>
<p>If you have an exceptional understanding of <em>Javascript</em> and the <em>internals of browsers</em>, thrive on challenges and love <em>learning new skills</em>, then we would love to talk to you. Knowing <em>Python</em> and <em>Django framework</em> is a plus, but not a prerequisite.</p>
<p style="margin: 2em 0pt 0pt; text-align: center;">&#8220;I have nothing to offer but blood, toil, tears and sweat.&#8221;</p>
<p style="margin: 0pt 0pt 2em; text-align: center; font-style: italic;">(Winston Churchill on life at a startup)</p>
<p>Well, not quite. <strong>Working in a startup means working in an ever-changing environment.</strong> We expect you to be flexible, do what needs to be done when needed, but offer flexibility in return. We care about good work and meeting deadlines. We don&#8217;t care where or when you do it, as long as you keep true to mutual agreements which include occasional meetings and we promise not to overburden you with work. <em>A self-reliant member of a team is how you see yourself.</em></p>
<p>Schools you might have attended are none of our concern. We care only about how good of a developer and person you are. We expect you to send us examples of your work or explain persuasively why we should hire you. Zemanta is an international company, so your application, as much of our communication, will have to be in English.</p>
<p style="margin: 2em 0pt;">Please send your application saved as an HTML or TXT document to <a style="font-weight: bold;" href="mailto:jobs@zemanta.com">jobs@zemanta.com</a>.</p>
<p style="margin: 2em 0pt;"><strong>Closing date for applications: 31.7.2009</strong></p>
</blockquote>
<p>In a time when practically all pages include some sort of JavaScript I am surprised that we don&#8217;t have more JavaScript developers popping up &#8211; this now surely is a full time job even in <a class="zem_slink freebase/guid/9202a8c04000641f800000000003651a" href="http://en.wikipedia.org/wiki/Slovenia" title="Slovenia" rel="wikipedia">Slovenia</a>. So you are one challenge yourself and send your job application and if you know one, send him our way&#8230;<br />
<h6 class="zemanta-related-title">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.slideshare.net/sneeu/wtf-is-python">WTF is Python</a> (slideshare.net)</li>
</ul>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/83c4e6c7-89f7-4c49-a0f3-4e58767b548e/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=83c4e6c7-89f7-4c49-a0f3-4e58767b548e" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/dQ4dgX6OtpW8Yz92V6Ds36JaIlI/0/da"><img src="http://feedads.g.doubleclick.net/~a/dQ4dgX6OtpW8Yz92V6Ds36JaIlI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/dQ4dgX6OtpW8Yz92V6Ds36JaIlI/1/da"><img src="http://feedads.g.doubleclick.net/~a/dQ4dgX6OtpW8Yz92V6Ds36JaIlI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=wUIy2bMSIBQ:3CIW-Sco0r0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=wUIy2bMSIBQ:3CIW-Sco0r0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=wUIy2bMSIBQ:3CIW-Sco0r0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=wUIy2bMSIBQ:3CIW-Sco0r0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=wUIy2bMSIBQ:3CIW-Sco0r0:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2009/07/21/know-a-javascript-developer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2009/07/21/know-a-javascript-developer/</feedburner:origLink></item>
		<item>
		<title>Do we have SEO experts in Slovenia?</title>
		<link>http://feedproxy.google.com/~r/outbreak/~3/TT29PG5lcjY/</link>
		<comments>http://friedcellcollective.net/outbreak/2009/07/21/do-we-have-seo-experts-in-slovenia/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 09:22:35 +0000</pubDate>
		<dc:creator>Marko Mrdjenovic</dc:creator>
				<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=268</guid>
		<description>I am fascinated that finally somebody decided to show people that most of the local SEO experts are actually a bunch of asshats. I&amp;#8217;m not saying all of them are and some do actually give you sound advice (that you could get elsewhere for free). Most of them (assumption as I haven&amp;#8217;t heard of any [...]</description>
			<content:encoded><![CDATA[<p>I am fascinated that finally somebody decided to show people that most of the local <a class="zem_slink freebase/guid/9202a8c04000641f800000000014d95f" href="http://en.wikipedia.org/wiki/Search_engine_optimization" title="Search engine optimization" rel="wikipedia">SEO</a> experts are actually a bunch of asshats. I&#8217;m not saying all of them are and some do actually give you sound advice (<a href="http://web.zen.si/archives/2008/01/spletne-urice-68-mene-ima-pa-google-rad/" lang="sl">that you could get elsewhere for free</a>). Most of them (assumption as I haven&#8217;t heard of any yet) will not be able to actually help you be better at <a class="zem_slink freebase/guid/9202a8c04000641f800000000042acea" href="http://google.com" title="Google" rel="homepage">Google</a> beyond rewriting code and doing text optimization and similar.</p>
<p>That&#8217;s why I&#8217;m supporting <a href="http://www.had.si" lang="sl">had</a> in trying to become the best result for <a href="http://www.had.si/blog/2009/07/21/retorik-in-retorika-retoricni-zapis/" lang="sl">retorik</a> and <a href="http://www.had.si/blog/2009/07/21/retorik-in-retorika-retoricni-zapis/" lang="sl">retorika</a> on Google and save 590 EUR that people would otherwise pay to get to learn how to become the first result on <a class="zem_slink freebase/guid/9202a8c04000641f8000000005bd2afa" href="http://en.wikipedia.org/wiki/Web_search_engine" title="Web search engine" rel="wikipedia">search engines</a>.<br />
<h6 class="zemanta-related-title">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://web-workathome.com/seo-myths-mess-free-report/">How SEO Myths can mess you up (Free Report)</a> (web-workathome.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.raketscience.com/make-your-blog-easy-to-find-thru-web-directories/">Make Your Blog Easy To Find Thru Web Directories</a> (raketscience.com)</li>
<li class="zemanta-article-ul-li"><a href="http://franklinbishop.net/track-your-seo-performance/">Track Your Seo Performance</a> (franklinbishop.net)</li>
<li class="zemanta-article-ul-li"><a href="http://r.zemanta.com/?u=http%3A//money.cnn.com/2009/07/20/smallbusiness/optimise_web_site_for_local_traffic.smb/index.htm&amp;a=6325058&amp;rid=ead2fbe7-3d27-45d2-9cb1-551ebfaffe1c&amp;e=507bd4290885f7c471a6f7b81ec9fd21">Luring local traffic to your Web site</a> (money.cnn.com)</li>
<li class="zemanta-article-ul-li"><a href="http://blog.unionstreetmedia.com/internet-marketing/utilizing-google-local-for-your-business/">Utilizing Google Local For Your Business</a> (unionstreetmedia.com)</li>
</ul>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/ead2fbe7-3d27-45d2-9cb1-551ebfaffe1c/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=ead2fbe7-3d27-45d2-9cb1-551ebfaffe1c" alt="Reblog this post [with Zemanta]"/></a><span class="zem-script more-related more-info pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>

<p><a href="http://feedads.g.doubleclick.net/~a/X81MAOHEbtuM812rKePQeuoOPIw/0/da"><img src="http://feedads.g.doubleclick.net/~a/X81MAOHEbtuM812rKePQeuoOPIw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/X81MAOHEbtuM812rKePQeuoOPIw/1/da"><img src="http://feedads.g.doubleclick.net/~a/X81MAOHEbtuM812rKePQeuoOPIw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/outbreak?a=TT29PG5lcjY:xVIIDjxFKdE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/outbreak?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=TT29PG5lcjY:xVIIDjxFKdE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/outbreak?i=TT29PG5lcjY:xVIIDjxFKdE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/outbreak?a=TT29PG5lcjY:xVIIDjxFKdE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/outbreak?i=TT29PG5lcjY:xVIIDjxFKdE:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://friedcellcollective.net/outbreak/2009/07/21/do-we-have-seo-experts-in-slovenia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://friedcellcollective.net/outbreak/2009/07/21/do-we-have-seo-experts-in-slovenia/</feedburner:origLink></item>
	</channel>
</rss>

