<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.1.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Ernest Delgado</title>
	<link>http://ernestdelgado.com/archive</link>
	<description>It's time to show up.</description>
	<pubDate>Sun, 24 Aug 2008 04:17:46 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.3</generator>
	<language>en</language>
			<item>
		<title>Moving Forward</title>
		<link>http://ernestdelgado.com/archive/moving-forward/</link>
		<comments>http://ernestdelgado.com/archive/moving-forward/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 04:17:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/moving-forward/</guid>
		<description><![CDATA[I think it&#8217;s worth mentioning this graph shown by Vic Gundotra at the
last Google IO when talking about the evolution of the web browser and how to
&#8220;Move the web platform forward&#8221;:
&#8220;(&#8230;) There have been recent improvements in the browser. Things like the
canvas tag in the latest generation of browsers&#8221;

]]></description>
			<content:encoded><![CDATA[<p>I think it&#8217;s worth mentioning this graph shown by Vic Gundotra at the<br />
last Google IO when talking about the evolution of the web browser and how to<br />
<span class="q" cite="http://www.youtube.com/watch?v=vk1HvP7NO5w">&#8220;Move the web platform forward&#8221;</span>:</p>
<p><span class="q" cite="http://www.youtube.com/watch?v=vk1HvP7NO5w">&#8220;(&#8230;) There have been recent improvements in the browser. Things like the<br />
canvas tag in the latest generation of browsers&#8221;</span></p>
<p><a target="_blank" href="http://ernestdelgado.com/img/PostShots/graphio.png"><img src="http://ernestdelgado.com/img/PostShots/graphio_small.png" class="snapshots" title="Open Web Technologies" alt="Open Web Technologies" height="232" width="350" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/moving-forward/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SXSW 2009</title>
		<link>http://ernestdelgado.com/archive/sxsw-2009/</link>
		<comments>http://ernestdelgado.com/archive/sxsw-2009/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 08:37:59 +0000</pubDate>
		<dc:creator>ernest</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/sxsw-2009/</guid>
		<description><![CDATA[The canvas element has been generating increasingly more interest and
broad web acceptance in the past year - noticeably more than similar
technologies like SVG or VML that have been around for
much longer.
Martin Kliehm has kindly offered me the opportunity to participate in
a dual presentation at the next SXSW to talk about canvas and
demonstrate some interesting uses.
If [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://developer.mozilla.org/en/docs/Canvas_tutorial" title="Mozilla Canvas Tutorial" target="_blank">canvas element</a> has been generating increasingly more interest and<br />
broad web acceptance in the past year - noticeably more than similar<br />
technologies like SVG or VML that have been around for<br />
much longer.</p>
<p><a href="http://learningtheworld.eu/2008/upcoming-talks-aria-canvas/" title="Martin Kliehm" target="_blank">Martin Kliehm</a> has kindly offered me the opportunity to participate in<br />
a dual presentation at the next <a href="http://sxsw.com/" title="sxsw 2009" target="_blank">SXSW</a> to talk about canvas and<br />
demonstrate some interesting uses.</p>
<p>If you are interested in the canvas element, you can <a href="http://panelpicker.sxsw.com/ideas/view/1328" title="Vote for Canvas Panel" target="_blank">cast your vote</a> for<br />
this presentation (until August 29). And while you&#8217;re at it, you might also want to <a href="http://groups.google.com/group/google-excanvas/browse_thread/thread/6f35f6db27462b10/d4b77fa839073e01" title="Vote for Canvas Support in IE8" target="_blank">cast your vote<br />
for canvas support in IE8</a> (although it seems to be <a href="http://blogs.msdn.com/ie/archive/2008/06/03/ie8-beta-2-coming-in-august.aspx" title="ie8 beta 2" target="_blank">useless</a> by now)</p>
<p><a href="http://panelpicker.sxsw.com/ideas/view/1328"><img src="http://ernestdelgado.com/img/PostShots/sxsw09.png" class="snapshots" title="SXSW 09" alt="SXSW 09" height="111" width="350" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/sxsw-2009/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Image Transformations in Canvas with Slicing (by Ross Harmes and Ernest Delgado)</title>
		<link>http://ernestdelgado.com/archive/image-transformations-in-canvas-with-slicing-by-ross-harmes-and-ernest-delgado/</link>
		<comments>http://ernestdelgado.com/archive/image-transformations-in-canvas-with-slicing-by-ross-harmes-and-ernest-delgado/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 05:02:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/image-transformations-in-canvas-with-slicing-by-ross-harmes-and-ernest-delgado/</guid>
		<description><![CDATA[Published on the Yahoo! User Interface Blog
]]></description>
			<content:encoded><![CDATA[<p>Published on the <a href="http://yuiblog.com/blog/2008/06/23/slicing/" title="Image Transformations in Canvas with Slicing" target="_blank">Yahoo! User Interface Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/image-transformations-in-canvas-with-slicing-by-ross-harmes-and-ernest-delgado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rendering Polygons with Canvas</title>
		<link>http://ernestdelgado.com/archive/rendering-polygons-with-canvas/</link>
		<comments>http://ernestdelgado.com/archive/rendering-polygons-with-canvas/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 01:36:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/rendering-polygons-with-canvas/</guid>
		<description><![CDATA[This time I wanted to test the performance of the canvas rendering
versus other technologies. Since Google Maps uses VML, SVG and image
retrieval depending on which browser you are using, I compared the
rendering times of the maps polygons to see the results.

In the end it wasn&#8217;t the best environment to do the tests since it was [...]]]></description>
			<content:encoded><![CDATA[<p>This time I wanted to test the performance of the canvas rendering<br />
versus other technologies. Since Google Maps uses VML, SVG and image<br />
retrieval depending on which browser you are using, I compared the<br />
rendering times of the maps polygons to see the results.</p>
<p><a href="http://www.ernestdelgado.com/gmaps/canvas/ddemo1.html" title="Render polygons with Canvas"><img width="350" class="snapshots" src="http://www.ernestdelgado.com/img/PostShots/renderCanvas.png"/></a></p>
<p>In the end it wasn&#8217;t the best environment to do the tests since it was impossible<br />
for me to split the actual rendering time of the polygons and the rest<br />
of the processes of the map code. In any case, I leave <a href="http://www.ernestdelgado.com/gmaps/canvas/ddemo1.html">the experiment</a><br />
for you to see.</p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/rendering-polygons-with-canvas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Canvas</title>
		<link>http://ernestdelgado.com/archive/canvas/</link>
		<comments>http://ernestdelgado.com/archive/canvas/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 01:08:59 +0000</pubDate>
		<dc:creator>ernest</dc:creator>
		
		<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/canvas/</guid>
		<description><![CDATA[I am releasing an experiment I made last October when I started
playing with the canvas element.
One of the main reasons I started to play with this technology was that while I was trying to port a previous SVG experiment, I noticed it had quite a few cross browser issues. The final result with canvas was [...]]]></description>
			<content:encoded><![CDATA[<p>I am releasing an <a href="http://www.ernestdelgado.com/public-tests/canvasphoto/" title="Canvas experiment">experiment</a> I made last October when I started<br />
playing with the <a href="http://en.wikipedia.org/wiki/Canvas_%28HTML_element%29" title="Canvas definition">canvas element</a>.</p>
<p>One of the main reasons I started to play with this technology was that while I was trying to port a previous SVG experiment, I noticed it had quite a few cross browser issues. The final result with canvas was quite<br />
satisfactory and it gave me the chance to learn features beyond the<br />
basics such as drag and drop, event handlers and performance<br />
optimization.</p>
<p>Since that experiment in October my interests and prototypes in Canvas<br />
have been more and more challenging: Skewing techniques, VR emulation,<br />
polygon rendering, etc. There&#8217;s a bunch of code to release though I am<br />
not allowed to release all of it right now. But I will do my best.</p>
<p><a href="http://www.ernestdelgado.com/public-tests/canvasphoto/" title="Canvas experiment"><img width="350" class="snapshots" src="http://ernestdelgado.com/public-tests/canvasphoto/d1.png"/></a></p>
<p><strong>Update:</strong> Due to the interest and enhancement requests from friends and colleagues, I have created a <a href="http://code.google.com/p/canvas-photo/source/checkout">project page</a> where you can contribute and add items to the <a href="http://code.google.com/p/canvas-photo/issues/list">to do</a> list.</p>
<p>
<strong>Update 2:</strong> Check the <a href="http://www.ernestdelgado.com/public-tests/canvasphoto/demo/flickr/flickr.html">Flickr</a> and <a href="http://imagine-it.org/canvas/photodemo/canvas.html">Picasa</a> integration from Michael Johnston and Pamela Fox respectively.</p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/canvas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JS Interpreter and Execution</title>
		<link>http://ernestdelgado.com/archive/js-interpreter-and-execution/</link>
		<comments>http://ernestdelgado.com/archive/js-interpreter-and-execution/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 04:50:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/js-interpreter-and-execution/</guid>
		<description><![CDATA[Here is a quick (and tricky) mini challenge for those who usually work with javascript. Take a couple of minutes to think about the results of the alerts in each snippet.

// Snippet 1
x = 4;
function init() {
 alert(x);
 var x = x;
 alert(x);
}
init();
	

// Snippet 2
x = 4;
function init() {
 alert(x);
 // var x = x;
 [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a quick (and tricky) mini challenge for those who usually work with javascript. Take a couple of minutes to think about the results of the alerts in each snippet.</p>
<pre class="snippet"><code>
// Snippet 1
x = 4;
function init() {
 alert(x);
 var x = x;
 alert(x);
}
init();
	</code></pre>
<pre class="snippet"><code>
// Snippet 2
x = 4;
function init() {
 alert(x);
 // var x = x;
 alert(x);
}
init();
	</code></pre>
<p><a id="answer-link" style="clear: both; display: block;" href="/archive/js-interpreter-and-execution">See the answer</a></p>
<div id="answer1" class="answer">
		Answer below<br />
		<br />
		.<br />
		<br />
		.<br />
		<br />
		.<br />
		
	</div>
<div id="answer2" class="answer">
<button id="snippet1">Run snippet 1</button><br />
<button id="snippet2">Run snippet 2</button></p>
<p>The explanation of the behavior of the snippet 1 (<strong>undefined</strong>, <strong>undefined</strong>) is that the line <code>var x = x;</code> is doing a declaration <code>var x;</code> and an initialization <code>x = x;</code> at the same time. But each of these processes happen separately, one after the other, when the javascript code is <strong>interpreted</strong> and then <strong>executed</strong>.</p>
<p>First, when the code is interpreted, before any code is executed, the <code>var x;</code> declaration makes the variable <strong>x</strong> available within the scope of the entire function, no matter what line it is written on. It would have the same effect whether <code>var x;</code> was written at the very end of the function or at the very beginning. However, the variable won&#8217;t be initialized, i.e., assigned to any value, until the code is executed. Until then, its default value will be <strong>undefined</strong>.</p>
<p>Second, when the code is executed, any <strong>x</strong> inside that function will refer to the declared local <strong>x</strong> instead of the global <strong>x</strong> as one may think at first sight. Therefore, the <code>x = x;</code> initialization won&#8217;t throw any run time error because the variable <strong>x</strong> exists but it has never been assigned to any value other than the default <strong>undefined</strong>.</p>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/js-interpreter-and-execution/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Walking the DOM</title>
		<link>http://ernestdelgado.com/archive/walking-the-dom/</link>
		<comments>http://ernestdelgado.com/archive/walking-the-dom/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 04:09:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/walking-the-dom/</guid>
		<description><![CDATA[As an experiment I had the idea of implementing the iterative version of the walk the DOM recursive function (which uses firstChild and nextSibling DOM methods to walk the DOM tree as a binary tree). One of the conditions was I didn&#8217;t want to use a stack in the iterative implementation. At some point, I [...]]]></description>
			<content:encoded><![CDATA[<p>As an experiment I had the idea of implementing the iterative version of the <strong>walk the DOM</strong> recursive function (which uses <em>firstChild</em> and <em>nextSibling</em> DOM methods to walk the DOM tree as a <a href="http://en.wikipedia.org/wiki/Binary_tree" title="Binary tree" target="_blank">binary tree</a>). One of the conditions was I didn&#8217;t want to use a stack in the iterative implementation. At some point, I had the hope that it could be faster than the recursive one due to the absence of the <a href="http://en.wikipedia.org/wiki/Recursion_(computer_science)" title="Recursion" target="_blank"><em>function-call overhead</em></a> but that didn&#8217;t happen.</p>
<p>With that said I will leave the code here for anyone who wants to spend more time playing with it or provide some <a href="http://ernestdelgado.com/contact" title="contact form">feedback</a>.</p>
<p><a href="http://ernestdelgado.com/articles/wsi/src.js.html">Source code</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/walking-the-dom/feed/</wfw:commentRss>
		</item>
		<item>
		<title>World Map Projections</title>
		<link>http://ernestdelgado.com/archive/world-map-projections/</link>
		<comments>http://ernestdelgado.com/archive/world-map-projections/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 05:07:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/world-map-projections/</guid>
		<description><![CDATA[As a big fan of world maps and also because I have been for a while programing some things on it, I am going to show my favorite world map projections:
		1 - Goode homolosine
		
This projection belongs to the equal-area projection category, which means it tries to represent countries in their correct proportional size.
		I think the [...]]]></description>
			<content:encoded><![CDATA[<p>As a big fan of world maps and also because I have been for a while programing some things on it, I am going to show my favorite world <a href="http://en.wikipedia.org/wiki/Map_projection">map</a> <a href="http://www.radicalcartography.net/?projectionref">projections</a>:</p>
<p>		<strong>1 - Goode homolosine</strong><br />
		<a href="http://43places.com"><img class="snapshots" style="width:340px;" src="/img/PostShots/m1.png" /></a></p>
<p>This projection belongs to the equal-area projection category, which means it tries to represent countries in their correct proportional size.<br />
		I think the first well known app using it was <a href="http://43places.com">43places.com</a>.</p>
<p>For a long time, this map made in flash was the main map of the 43places application so the users were able to select countries and see which ones were visited, &#8216;want to visit&#8217;, etc. From my point of view this map was the best choice. However, they later switched to google maps maybe because of the specificity of the markers. Although you still can access the flash version from its users&#8217; profile.</p>
<p>		<strong>2 - Robinson</strong><br />
		<a href="http://commons.wikimedia.org/wiki/World_map"><img class="snapshots" style="width:340px;" src="/img/PostShots/m2.png" /></a></p>
<p>This one belongs (among other categories) to the compromised projection ones. Its goal is to find a balance between different kinds of distortions.</p>
<p>That representation can be seen everywhere in the <a href="http://wikipedia.org">Wikipedia</a>.</p>
<p>		<strong>3 - Peters</strong><br />
		<a href="http://futuremaps.co.uk"><img class="snapshots" style="width:340px;" src="/img/PostShots/m3.png" /></a></p>
<p>Probably the most popular of the Cyllindrical Equal-Area. However, similar projections like <a href="http://www.radicalcartography.net/?projectionref">Behrmann</a> or <a href="http://www.radicalcartography.net/?projectionref">Hobo-Dyer</a> make the countries look less strange. They all differ in the ratio of the vertical to horizontal axis, especially close to the pole areas</p>
<p>I haven&#8217;t found any web app using them though.</p>
<p>		<strong>4 - Mercator</strong><br />
		<a href="http://maps.google.com"><img class="snapshots" style="width:340px;" src="/img/PostShots/m4.png" /></a></p>
<p>Also called &#8216;evil mercator&#8217; since it&#8217;s the worst one in terms of distortion of the countries. Greenland is 554% bigger than its real size, Canada 258%, USA 68%, etc.</p>
<p>It&#8217;s still commonly used in a lot of places. For instance, google maps uses it. Although my guess is that 95% of the use of google maps is not at the world view zoom level.</p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/world-map-projections/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Acknowledgments</title>
		<link>http://ernestdelgado.com/archive/acknowledgments/</link>
		<comments>http://ernestdelgado.com/archive/acknowledgments/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 05:53:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/acknowledgments/</guid>
		<description><![CDATA[
I have never been in the acknowledgments of a book before.
Ross Harmes from Yahoo! and Dustin Diaz from Google decided about a year ago to write a book about Javascript Design Patterns. As I have the honor of being on the team of the former, I was pleased to offer my feedback on his excellent [...]]]></description>
			<content:encoded><![CDATA[<p><a style="float:left;margin:23px 11px 0px 0px;" href="http://www.amazon.com/JavaScript-Design-Patterns-Dustin-Diaz/dp/159059908X/webstandardsw-20"><img class="snapshots" style="width:120px;" src="/img/PostShots/jpatterns.jpg" /></a></p>
<p>I have never been in the acknowledgments of a book before.</p>
<p><a href="http://techfoolery.com/">Ross Harmes</a> from Yahoo! and <a href="http://www.dustindiaz.com/">Dustin Diaz</a> from Google decided about a year ago to write a book about Javascript Design Patterns. As I have the honor of being on the team of the former, I was pleased to offer my feedback on his excellent lessons. Although one wonders who needs technical feedback when the beast <a href="http://simonwillison.net/">Simon Willison</a> is already doing that.</p>
<p>Javascript, being the first mainstream lambda language, has its very own features. It well deserves a good training not only to write better code but to use all the potential of the language. This book will really help you in both aspects and it will make your path easier to the mastery of the language.</p>
<p>If I feel happy to be mentioned in the book, I can&#8217;t imagine how proud Ross and Dustin must feel to be the authors after months of work. In fact, it&#8217;s a feeling that is worth a try.</p>
<p>Congratulations guys!</p>
]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/acknowledgments/feed/</wfw:commentRss>
		</item>
		<item>
		<title>User Registration Patterns (URP)</title>
		<link>http://ernestdelgado.com/archive/user-registration-pattern-urp/</link>
		<comments>http://ernestdelgado.com/archive/user-registration-pattern-urp/#comments</comments>
		<pubDate>Sat, 24 Nov 2007 07:59:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<guid isPermaLink="false">http://ernestdelgado.com/archive/user-registration-pattern-urp/</guid>
		<description><![CDATA[
In this article we will try to prove that some practices in current web apps have important privacy and security issues both for the user and for the application. To illustrate these issues better we will first analyze the patterns that the main Web 2.0 companies have used when implementing the &#8216;user registration process&#8217;. Then, [...]]]></description>
			<content:encoded><![CDATA[<!--DISABLE_WPAUTOP-->
<p>In this article we will try to prove that some practices in current web apps have important <strong>privacy</strong> and <strong>security</strong> issues both for the user and for the application. To illustrate these issues better we will first analyze the patterns that the <a href="http://movers20.esnips.com/TableStatAction.ns?reportId=100">main Web 2.0 companies</a> have used when implementing the &#8216;user registration process&#8217;. Then, we will go over some of the aspects of the process, such as authentication flow, email confirmation, captchas and sharing information with third parties. This will hopefully help you decide which practices you should use when implementing your app.</p>
									
<div id="summary"><h3>Contents</h3>
										<a href="#t1">1. 50 apps</a>								<a href="#t2">2. Authentication flow</a>
<a class="subc" href="#t21">2.1. Case 1: confirmation: no. login: email.</a>		<a class="subc" href="#t22">2.2. Case 2: confirmation: no (blocking). login: username.</a>
<a class="subc" href="#t23">2.3. Case 3: confirmation: no (no blocking). login: username.</a>
<a class="subc" href="#t24">2.4. Case 4: confirmation: yes. login: email/username.</a>
<a href="#t3">3. Confirmation process.</a>
<a href="#t4">4. Accessing a third party&#8217;s contact list</a>
<a href="#t5">5. Captcha</a>
<a href="#t6">6. User privacy</a>
<a href="#t7">7. Alternatives</a>
</div>
<h3 id="t1">50 apps</h3>
									<p>Before you write a single line of code you will have to make some high-level decisions that determine what features you will need in the user registration. If you are planning on building several applications, you&#8217;d better review the user registration requirements for each of them, instead of reusing the same code and patterns for all of them.</p>

									<p>Most of the apps in the following table have millions of users registered. In order to handle such a large number of users, they had to change some <em>old school</em> strategies and adopt new ones. For instance, in order to avoid the user picking a username that is not available, they suggest that the user use an email address as username (due to its uniqueness). Also, in order to attract as many users as possible, they try to minimize the registration process to a one step registration process (if possible). As we will see, if we apply the two previous concepts the wrong way the result can create some <strong>security</strong> or <strong>privacy</strong> flaws.
									</p>

						
									<button id="showbutton">Show table</button>
									<button id="hidebutton1">Hide table</button>
									<div id="table-wrap">
									<p>Click on the name of each app to see a screenshot of its sign up form:</p>
<p><a href="#comments">Leave a comment</a> if you want to complete the <em>language</em> column.</p>
									
									<table border="0" cellspacing="5" cellpadding="5">
	<thead>									<tr>
											<th>App</th>
											<th>Used as login</th>
											<th>Email confirmation needed</th>
											<th>Privacy data</th>
											<th>Required personal data</th>
											<th>Captcha</th>
											<th>Language / Framework</th>
										</tr>
													</thead><tfoot>							<tr>
											<th>App</th>
											<th>Used as login</th>
											<th>Email confirmation needed</th>
											<th>Privacy data</th>
											<th>Required personal data</th>
											<th>Captcha</th>
											<th>Language / Framework</th>
										</tr></tfoot><tbody></tbody>
									</table>
									<h5>Note: This table doesn&#8217;t include any Google or Yahoo! properties, since each use common accounts to login. It also doesn&#8217;t include those apps that don&#8217;t require any kind of user registration (yubnub, popurls, etc). Please feel free <a href="/contact/">to send</a> any corrections of the content of the table.</h5>
									<button id="hidebutton2">Hide table</button>
									
									</div>
									
									<h3 id="t2">Authentication flow</h3>
									<h3 id="t21">Case 1: <em>confirmation: no. login: email.</em></h3>
									<span>(i.e. twitter, netvibes, hi5)</span>
									<p>This pattern includes the apps that send a confirmation email to the user but allow the user to login and use the app anyway, even if they haven&#8217;t gone through the confirmation process.</p>
									<p>This practice allows any user to use a non-confirmed email as his unique username. That means if I happen to know <strong>Bill Gates</strong>&#8216; email, for instance, then I will be able to use his email as my username in all these apps; at the same time, he won&#8217;t be able to register with his own email. In some cases the apps might have a system for expiring those non-confirmed accounts but we only found <strong>one case</strong> where this was explicitly shown to the user (imeem.com):</p>
									<blockquote>&#8220;You have 10 days left to verify your email.&#8221;</blockquote>
									<p>One of the solutions used by some apps goes as follows:<br />
									The user is able to access the app but only the more <strong>basic features</strong>. As soon as the user tries to perform any advanced action, or one that implies the use of the email (like recovering your password) then they are asked to confirm the email address. This approach is not enough to solve the initial drawback. The potential real owner of the email is still blocked from registering with his own email.</p>

									<img src="/img/ArticleShots/pie1.jpg" /><h5>Fig 1. Used as login.</h5>

									<h3 id="t22">Case 2: <em>confirmation: no (blocking). login: username.</em></h3>
									<span>(i.e. Remember the milk)</span>
									<p>In this case we seem to be preventing some possible identity theft issues. The problem, though, is that many of these applications save the given email coupled with the profile data, thus not allowing a new user (maybe the real owner) to register with an email that has already been used before:
									<br /><blockquote>&#8220;Sorry but this email is already in use&#8221;.</blockquote>
									<p>This shouldn&#8217;t happen unless the owner of the email address has performed some sort of confirmation.</p>

									<h3 id="t23">Case 3: <em>confirmation: no (no blocking). login: username.</em></h3>
									<span>(i.e. Technorati)</span>
									<p>This is the same case as the previous one, with one difference: the registration process allows the new registrant to use an email that has already been used before.<br />The email shouldn&#8217;t be relevant to any part of the application. If it is, the user should be forced to confirm the email address as soon as they use any feature related to it, such as notifications and reminders. Also, the email should not be <strong>publicly visible</strong> in the user&#8217;s profile until it is confirmed.</p>

									<h3 id="t24">Case 4: <em>confirmation: yes. login: email/username.</em></h3>
									<span>(i.e. Youtube, pbWiki)</span>
									<p>This is the best practice so far. The user is registered in a two-step process. They fill in the form and then confirm the registration by clicking on the provided link in an email. There are two bad things about this pattern. The first one is obvious: the user will have to go through a longer process than the one-step registration. The second issue is explained in the next section.</p>
									
									<img src="/img/ArticleShots/pie2.jpg" /><h5>Fig 2. Email confirmation.</h5>
									
									<h3 id="t3">Confirmation process.</h3>
									<p>As we have seen in the last case, once we fill in the form an email is sent to our inbox with a confirmation link that completes the registration process. In some cases, an auto-generated password or username will be sent in the email instead of a link (i.e. stumbleupon.com). The goal in both cases is to prove that the user owns a given email account.</p>
									<p>We can draw a parallel here to the public key cryptography:</p>
									<img width="250px" src="/img/ArticleShots/pkey.png" />
									<h5>Fig 3. Public-key Cryptography [Source: <a href="http://en.wikipedia.org/wiki/Public_key">Wikipedia</a>]</h5>
									
									<blockquote cite="http://www.globus.org/security/public-key-cryptography.html">&#8220;The most important thing to know about public key cryptography is that unlike earlier cryptographic systems, it relies not on a single key (a password or a secret &#8220;code&#8221;), but on two keys. These keys are numbers that are mathematically related in such a way that if either key is used to encrypt a message, the other key must be used to decrypt it. (&#8230;) By making one of the keys available publicly (a public key) and keeping the other key private (a private key), a person can prove that he or she holds the private key simply by encrypting a message. If the message can be decrypted using the public key, the person must have used the private key to encrypt the message.&#8221; [Source: <a href="http://www.globus.org/security/public-key-cryptography.html">The globus alliance</a>]</blockquote>

									<p>In our case, the email address is the <strong>public key</strong> that we share with the app to send us a message with an exclusive link for us in it. We will be the only ones to read it (&#8221;decrypting it&#8221;), by accessing our email account through the email password (the <strong>private key</strong>). Clicking on the link will prove us as the owner.</p>

									<p><strong>The problem</strong> is if we misspelled the email in the initial form. This is something that has happened to everyone at least once. In that case the email confirmation will be sent to another (potentially existing) account. If the owner of this other account completes the process, then they will be able to access the application and the data stored in our profile that we have input in the initial form. They will be also able to perform the password recovery. That&#8217;s why some apps ask you to type your email twice, as if it were a password.</p>
									
									<p>Fortunately, none of the apps that we analyzed ask you for confidential data, like the street where you live or your phone number. But most of them ask you for your zip code, your date of birth or your full name. These data can also be considered <strong>sensitive</strong> for the privacy of the user and can be misused by the fake user.</p>
									
									<p>It&#8217;s clear that something needs to be changed in the authentication flow to ensure that anyone who wrongly gets the password isn&#8217;t able to login into the account so easily.</p>

									
									<h3 id="t4">Accessing a third party&#8217;s contact list</h3>
									<p>There is another practice with quite a few applications: After the registration is done, the app will allow the user to import their contacts from other accounts (gmail, hotmail, etc.). In this situation the interface should be very <strong>unobtrusive</strong> to the user. It&#8217;s very important to make the user confident that all their privacy issues are under control. The truth is that asking for the user data from a third party account is aggressive enough.</p>
									<p>There are some apps that need to give a clearer message that none of this information will be stored for any use other than import the contacts in the actual process. More importantly, a &#8217;skip this step&#8217; message, if it exists, should be very noticeable (instead of being the very small letter at the bottom of the page) so that the user can have the freedom to decide whether or not to commit this process.</p>
									<p>As an example of a bad practice we have Tagged.com, which uses a very aggressive method: after finishing the registration process, we are redirected to the &#8216;add contacts from third parties&#8217; process. In this stage we are not provided with any link that allows us to skip the form. There is no link to go back to the home page, and not even the main company logo is linkable.</p>

									<h3 id="t5">Captcha</h3>
									
									<p>There are still quite a few apps that don&#8217;t prevent spambots from automatically registering with their sites. Surprisingly, those that do use captchas sometimes use the <strong>same image</strong> for every registration page in the same process. That is the case when the user fills any form field incorrectly and the application gives the user another opportunity to do it. This is a really bad practice since, in order to deter spambots, a given captcha image should be shown only once, and it should always be changed to a new image if an incorrect response is given.</p>

									<img src="/img/ArticleShots/pie4.jpg" /><h5>Fig 4. Use of captcha.</h5>

									<h3 id="t6">User privacy</h3>
									<p>Web application companies will eventually have a huge amount of users registered, if they are popular. The companies store the user data in their databases. PrivacyInternational.org recently released an <a href="http://www.privacyinternational.org/article.shtml?cmd%5B347%5D=x-347-553961">excellent study</a> about privacy practices of key Internet based companies. They analyze details like data retention, responsiveness, ethical compass and many others.</p>
									
									<p>In our case, we will focus in those elements presented to the user in the initial form of the registration process. In this step of the process the company needs to be as transparent as possible to the user, giving them easy access to the terms of service and privacy policy documents. As the pie chart indicates there is still a 24% of apps that don&#8217;t clearly provide the user any link or information to the privacy policy or the terms of service in the sign up form. On top of that, those that do provide this information (76%) don&#8217;t necessarily do it in an active way. <strong>31% of them</strong> don&#8217;t include a check box so the user can select and explicitly accept the company policies or their terms of services in order to complete the sign up process.</p>

									<img src="/img/ArticleShots/pie3.jpg" /><h5>Fig 5. Display of TOS/PP.</h5>
									
									<h3 id="t7">Alternatives</h3>
									<p>As we have seen in this article, we as web developers have to foresee every kind of action our users are able to perform with the choices we give them. We have to test and prevent all possible hacks and errors. Check if these actions have poor <strong>security</strong> or <strong>privacy</strong> issues for the user and fix them. With all these principles in mind it&#8217;s evident that the patterns used for most of the current well-known apps are not completely prepared for that.</p>
									
									<p>Some alternatives like <a href="http://openid.net">OpenID</a> and <a href="http://oauth.net">OAuth</a> are coming up with their <strong>open specification</strong> to try to change the current paradigms. Each of them, though, are meant to solve different issues:</p>
									
									<blockquote cite="http://oauth.net/about/">&#8220;While OpenID is all about using a single identity to sign into many sites, OAuth is about giving access to your stuff without sharing your identity at all (or its secret parts). (&#8230;) OAuth talks about getting users to grant access while OpenID talks about making sure the users are really who they say they are.&#8221; [Source: <a href="http://oauth.net/about/">OAuth.net - about</a>]</blockquote>
									
									<p>That means that while OpenID is an alternative of the four different authentication flows we analyzed, OAuth would take care about the &#8216;<a href="#t4">Accessing the third party&#8217;s contact list</a>&#8216; issue we have seen before.</p>
									
									<p>OAuth released a draft so apps can use a common protocol instead of different proprietary protocols used so far for the same purpose (Google AuthSub, AOL OpenAuth, Yahoo BBAuth, Upcoming API, Flickr API, Amazon Web Services API, etc). OpenID has been available longer but, unfortunately, only one out of the fifty analyzed apps (mag.nolia.com) showed very clearly, in its registration process, the ability to use OpenID (with a big OpenID logo). Not even livejournal.com, who is an OpenID provider, had it as visible as it should be.</p>]]></content:encoded>
			<wfw:commentRss>http://ernestdelgado.com/archive/user-registration-pattern-urp/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
