<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Unlimited Edition &#187; Development</title>
	<atom:link href="http://michaelodden.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://michaelodden.com</link>
	<description>Unlimited views, cleverness and love</description>
	<lastBuildDate>Tue, 08 Mar 2011 20:33:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Sad news &#8211; Smultron no longer supported</title>
		<link>http://michaelodden.com/development/terrible-news-smultron-no-longer-supported/</link>
		<comments>http://michaelodden.com/development/terrible-news-smultron-no-longer-supported/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 12:26:21 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://michaelodden.com/?p=360</guid>
		<description><![CDATA[As of 2009-07-06 will my editor of choice for the last 2-3 years, Smultron, no longer be further developed by the sole developer Peter Borg: Hi! First of all I&#8217;d like to thank you for your interest in my applications. But I have now come to a point where I don&#8217;t have the time to [...]

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/mac/essential-mac-applications/' rel='bookmark' title='Permanent Link: Essential mac-applications'>Essential mac-applications</a></li>
<li><a href='http://michaelodden.com/development/my-look-on-the-web/' rel='bookmark' title='Permanent Link: My look on the web'>My look on the web</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>As of 2009-07-06 will my editor of choice for the last 2-3 years, Smultron, <a href="http://smultron.sourceforge.net/">no longer be further developed</a> by the sole developer Peter Borg:</p>
<p><span id="more-360"></span></p>
<blockquote><p>Hi!</p>
<p>First of all I&#8217;d like to thank you for your interest in my applications. But I have now come to a point where I don&#8217;t have the time to spend on the applications that they deserve so I have decided to not release any more versions for the foreseeable future.</p>
<p>Cheers,</p>
<p>Peter Borg</p></blockquote>
<p>It&#8217;s not of immediate trouble for me,but I fear that in time this will have to make me switch editor.</p>
<h2>Thank you, Peter Borg</h2>
<p>A big &#8220;thank you&#8221; goes out to Peter for his great work and I&#8217;m sure he&#8217;s up to other great work. Thank you for taking so much time giving us this great editor and developer-utility which has made my days for quite some time now.</p>
<p>As this is an open source-project I have this hope that some skilled developer will adopt the project and continue on the same path: maintaining an editor which keeps out of the way (!), has this neat set of functions and a relatively small footprint.</p><img src="http://michaelodden.com/?ak_action=api_record_view&id=360&type=feed" alt="" />

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/mac/essential-mac-applications/' rel='bookmark' title='Permanent Link: Essential mac-applications'>Essential mac-applications</a></li>
<li><a href='http://michaelodden.com/development/my-look-on-the-web/' rel='bookmark' title='Permanent Link: My look on the web'>My look on the web</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/development/terrible-news-smultron-no-longer-supported/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adventures in Opera Unite</title>
		<link>http://michaelodden.com/development/adventures-in-opera-unite/</link>
		<comments>http://michaelodden.com/development/adventures-in-opera-unite/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 09:53:22 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Opera Unite]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://michaelodden.com/?p=267</guid>
		<description><![CDATA[Opera recently released Opera Unite claiming to reinvenet the web. I have used Opera Unite the latest week, and been playing around developing for it just as long. Heres what I think about it and have learned so far. What is Opera Unite Opera Unite is the latest member in the Opera-family and brings some [...]

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/opera-unite/opera-unite-convenient-tips-and-snippets-for-developers/' rel='bookmark' title='Permanent Link: Opera Unite: Convenient tips and snippets for developers'>Opera Unite: Convenient tips and snippets for developers</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Opera recently released Opera Unite claiming to reinvenet the web. I have used <a href="http://unite.opera.com">Opera Unite</a> the latest week, and been playing around developing for it just as long. Heres what I think about it and have learned so far. <span id="more-267"></span></p>
<h2>What is Opera Unite</h2>
<p>Opera Unite is the latest member in the Opera-family and brings some new ideas to the table. Opera calls it &#8220;Reinventing the web&#8221; &#8211; those kinds of claims will <a href="http://www.guardian.co.uk/technology/blog/2009/jun/17/opera-unite">of course</a> <a href="http://themacsucks.com/2009/06/opera-unite-why/">provoke</a> <a href="http://slashdot.org/story/09/06/18/1419227/Opera-Unite-is-a-Hail-Mary">a lot</a> of people (especially the <a href="http://www.theregister.co.uk/2009/06/22/dziuba_opera_unite/">know-alls</a>). It does perhaps not reinvent the web, but it does give the users more power and controll of their own data again, as was intended in the &#8211; oh so far away &#8211; beginning of the web</p>
<p>Opera&#8217;s idea is that you should be able to share your own data easily and with whoever you want, and to achieve this Opera has bundled the browser with a <strong>web-server</strong>. The applications you can share with Opera Unite is closely related to the Opera-widgets, but gives a little more power &#8211; i.e. access to the server and file-system through <acronym title="JavaScript">JS</acronym>. So by using standard web-technologies (<acronym title="Scalable Vector Graphics">SVG</acronym>, HTML5, <acronym title="Cascading Style Sheets">CSS</acronym>, <acronym title="JavaScript">JS</acronym>&#8230;) you can now pretty easily develop server-applications as well.</p>
<p>A popular rant-attack is against the fact that you have to create an opera-account to get this up and running, as Opera uses a proxy (operaunite.com) to organize the traffic and getting through your router. A lot of people complain of this as &#8220;Opera monitoring our data&#8221; (like this isn&#8217;t possible for Google and Facebook already) &#8211; so listen: as long as you&#8217;re connected to the Internet, your data will pass through quite some servers no matter what. Though luck. Now, if this is a service that will stand the test of time and users, I will expect the possibility for users to either run their own proxy-services or <a href="http://dev.opera.com/articles/view/custom-domains-opera-unite/">bypass it all together</a>.</p>
<p>Now, what concerns me the most right now, is the <strong>security-aspect</strong>. A lot of people will by running Opera Unite give any bad people out there (yup, I know you&#8217;re out there!) one more frontier to fight on &#8211; they can now attack the Opera Unite-server running on your computer, as well as attacking the browser. This means that Opera has to be extremely thorough to eliminate any security-issues that surely will come.</p>
<p>Beside of this, I&#8217;m very excited in seeing how this will evolve. They have released some <a href="http://dev.opera.com/articles/unite">developer-resources</a> already, and I&#8217;m sure more will come &#8211; so I&#8217;m eager to see how developers out there will develop creative tools to run under Unite.</p>
<h2>Developer-experiences so far</h2>
<p>As this is still in alpha there are a lot of issues I assume will get better when getting closer to release-date. This is meant as tips to other developers more or less new to Unite-development.</p>
<h3>Initiating your app</h3>
<p>You will need a config.xml, index.html and a javascript-file to get started. Your app can have a setup like this:</p>
<ul>
<li>myapp/</li>
<li> <a href="http://dev.opera.com/articles/view/opera-unite-developer-primer/#serviceconfig">config.xml</a></li>
<li> <a href="http://dev.opera.com/articles/view/opera-unite-developer-primer/#serviceindex">index.html</a></li>
<li> <a href="http://dev.opera.com/articles/view/opera-unite-developer-primer/#servicescript">script.js</a></li>
</ul>
<p>See the config.xml-link for details of the setup of this. The index.html can be a very simple HTML5-file, ie like this:</p>
<pre class="html" name="code">&lt;!DOCTYPE html&gt;
&lt;script src="script.js"&gt;&lt;/script&gt;</pre>
<p>Now we&#8217;re getting started, I&#8217;ll give an excerpt of a script.js-file, and give an idea of how it can look:</p>
<pre class="javascript" name="code">window.onload = function () {
    w = opera.io.webserver
    if (w)
        // the default page, kind of like index.html : )
        w.addEventListener('_index', showMainPage, false);
        // And two common
        w.addEventListener('newEntry', newEntry, false);
        w.addEventListener('editEntry', editEntry, false);
    }
}

function showMainPage(e) {
    var response = e.connection.response;
    var myhtml = "&lt;!DOCTYPE html&gt;&lt;head&gt;&lt;title&gt;AppTitle&lt;/title&gt;/head&gt;&lt;body&gt;&lt;h1&gt;Welcome!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;";
    response.write(myhtml);
    response.close();
}</pre>
<p>- As you probably can see, we are adding event-listeners to the webserver to listen for actions, and every page/action of an application requires it&#8217;s own method which takes care of the logics and displays any contents by writing the necessary <acronym title="HyperText Markup Language">HTML</acronym>. This is good explained in <a href="http://dev.opera.com/libraries/unite/docs/">Opera&#8217;s documentation</a> so I won&#8217;t dive further into that here.</p>
<p>What I&#8217;d rather like to mention is those things that will &#8220;crash&#8221; your app:</p>
<p>Every action-method <strong>must</strong> accept a named argument for the event-object &#8211; which in turn will give access to the <em>response </em>and <em>request</em>-objects. If not specifically named, then the app won&#8217;t load.</p>
<p>You will also have to write something (response.write(&#8220;something&#8221;)) _and_ close the response (response.close()) in the current action, otherwise the app won&#8217;t load.</p>
<h3>Markuper</h3>
<p>Opera does also give out a <a href="http://dev.opera.com/articles/view/markuper-unite-template-library/">template-helper</a>, which is just a <acronym title="JavaScript">JS</acronym>-library which will come handy. I haven&#8217;t found a place that distributes it in an organized manner, but you may download it as a part of the barebone-example in the previous link, or you may dissect any of the existing apps (download the .us-file, rename to .zip and extract). It seems there are some different versions out there so beware.</p>
<h4>The templater doesn&#8217;t currently seem to allow variables in attributes</h4>
<p>This is cumbersome, as I&#8217;d like to do something like this:</p>
<pre class="html" name="code">&lt;div id="content" data-import="templates/{{page}}.html"&gt;&lt;/div&gt;</pre>
<p>I assume this will be fixed, as it seems &#8211; when skimming through the library &#8211; that it should have been taken care of in the XPath-expression looking for the variables. <del>I&#8217;m working on a patch.</del></p>
<div class="update-inpost"><strong>Update:</strong><br />
Ref comment from <a href="http://michaelodden.com/development/adventures-in-opera-unite/comment-page-1/#comment-1888">António Afonso</a>, it seems that it&#8217;s only the data-attributes (used for importing, iterating through lists etc), that were affected of this. The &#8220;patch&#8221; is simple:</p>
<ol>
<li>Open the template.js</li>
<li>Find the method &#8220;this.parse = function( data )&#8221; (line 1439)</li>
<li>Switch the order of the <code>this.parseDataAttributes( data )</code> and <code>this.fillValues( data )</code>-calls</li>
<li>Save and go on!</li>
</ol>
</div>
<h4>Imported files through the templater can&#8217;t be empty</h4>
<p>If you try do something like this:</p>
<pre class="html" name="code">&lt;div id="content" data-import="templates/content.html"&gt;&lt;/div&gt;</pre>
<p>and the &#8220;content.html&#8221;-file is empty, then the app won&#8217;t load :p.</p>
<h3>404 Not found</h3>
<p>If you get the &#8220;404 Not found &#8211; Resource not found&#8221; it&#8217;s propably a <acronym title="JavaScript">JS</acronym>-error. Unfortunately you won&#8217;t get any better debug-messages by now if you haven&#8217;t implemented it yourself (see the &#8220;Notifications&#8221;-part of this post). Take a close look at your code, and I assume Opera will fix integration with dragonfly in upcoming releases.</p>
<h3>POST and GET</h3>
<p><strong>GET</strong>: e.connection.request.queryItems['id'][0]</p>
<p><strong>POST</strong>: e.connection.request.bodyItems['title'][0]</p>
<h3>Custom fonts</h3>
<pre class="css" name="code">@font-face {
    font-family: MyFancyFont;
    src: url('fonts/MyFancyFont.ttf');
}
/* Use like this: */
body {
    font-family: MyFancyFont;
}</pre>
<p>This is pretty obvious of course, as the new Opera-engine, Presto, has support for a lot of snacks when coming to <acronym title="HyperText Markup Language">HTML</acronym>, <acronym title="Cascading Style Sheets">CSS</acronym> and <acronym title="Scalable Vector Graphics">SVG</acronym> &#8211; and hopefully soon more <acronym title="JavaScript">JS</acronym>-snacks will come as well.</p>
<h3>Notifications</h3>
<p>You will more than once want to give some kind of notifications, either to yourself as developer or to the end-users. Notifications can ie be debug-messages, or event-messages like incoming message in an <acronym title="Instant Message">IM</acronym>-app.</p>
<p><strong>opera.postError()</strong> will let you post a message which only will appear in the error-console.</p>
<p><strong>widget.showNotification()</strong> will pop up a message in the lower right corner of the screen. It&#8217;s possible to attach a callback-function which will be called when/if the user clicks on the message.</p>
<pre class="javascript" name="code">void opera.postError( &lt;String&gt; message)
void widget.showNotification( &lt;String&gt; message, &lt;Function&gt; callback )</pre>
<h3>Quick tips</h3>
<p>If you want to test any changes made to the javascript-files, you will have to restart the app. If you&#8217;ve just changed any <acronym title="HyperText Markup Language">HTML</acronym>-files ie for the Markuper, you can just reload the page as you&#8217;d normally do. If none of them seem to work, you might have to remove the app and install it again. Remember to empty the trash as well before installing!</p>
<h3>Packaging the app</h3>
<p>The app-packages are simply zipped folders, renamed to the prefix &#8220;.us&#8221; (Unite Service), and to install it it&#8217;s only to drag-drop the file onto an Opera Unite-able browser, or if you want to share it online, give it a link like this:</p>
<pre class="html" name="code">&lt;a type="application/x-opera-uniteservice" href="url/to/myapp.us"&gt;Install myapp&lt;/a&gt;</pre>
<h2>Possibly related reading</h2>
<ul>
<li><a href="http://unite.opera.com/">Opera Unite Official Site</a></li>
<li><a href="http://dev.opera.com/articles/unite">Opera Unite Developer Resources</a></li>
<li><a href="http://dev.opera.com/libraries/unite/docs/">Unite <acronym title="Application Programming Interface">API</acronym> Overview</a></li>
<li><a href="http://unitehowto.com/">Opera Unite Howto&#8217;s</a></li>
<li><a href="http://www.guardian.co.uk/technology/blog/2009/jun/17/opera-unite">Is Opera Unite a revolution, or is it just the fat lady singing?</a></li>
<li><a href="http://ostatic.com/blog/opera-breathes-down-firefoxs-and-chromes-necks-with-unite">Opera breathes down Firefox&#8217;s and Chrome&#8217;s Necks</a></li>
<li><a href="http://dev.opera.com/articles/view/custom-domains-opera-unite/">Setting up custom domains for Opera Unite</a></li>
<li><a href="http://dev.opera.com/articles/view/how-to-debug-javascript-problems-with-op/">How to debug JavaScript problems with Opera</a></li>
<li><a href="http://dev.opera.com/libraries/widgetobject/docs/widget.dml">API: The widget-class</a></li>
<li><a href="http://robertnyman.com/2009/06/23/opera-unite-some-questions-and-answers/">Unite: Some questions and answers</a></li>
</ul><img src="http://michaelodden.com/?ak_action=api_record_view&id=267&type=feed" alt="" />

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/opera-unite/opera-unite-convenient-tips-and-snippets-for-developers/' rel='bookmark' title='Permanent Link: Opera Unite: Convenient tips and snippets for developers'>Opera Unite: Convenient tips and snippets for developers</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/development/adventures-in-opera-unite/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Google Wave &#8211; the email-killer?</title>
		<link>http://michaelodden.com/development/google-wave-the-email-killer/</link>
		<comments>http://michaelodden.com/development/google-wave-the-email-killer/#comments</comments>
		<pubDate>Fri, 29 May 2009 17:01:46 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[User-experience]]></category>

		<guid isPermaLink="false">http://blog.michaelodden.com/?p=200</guid>
		<description><![CDATA[Google recently announced their new tool/protocol/invention, Wave. I&#8217;ve seen their presentation and read through most the documentation, and think it will be interesting to see how it will evolve in the future. It&#8217;s currently only available as a sand-boxed version for invited developers, as well as it is possible to ask for access &#8211; I [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Google recently announced their new tool/protocol/invention, <a href="http://wave.google.com/">Wave</a>. I&#8217;ve seen their <a href="http://www.youtube.com/watch?v=v_UyVmITiYQ">presentation</a> and read through most the documentation, and think it will be interesting to see how it will evolve in the future. It&#8217;s currently only available as a sand-boxed version for invited developers, as well as it is possible to ask for access &#8211; I do not have any idea yet of how many there is who will gain access in this &#8220;early&#8221; stage.<span id="more-200"></span></p>
<h2>What is Google Wave?</h2>
<p>Google Wave is simply a way of communicating, with it&#8217;s own protocol, which aims to replace <acronym title="Instant Message">IM</acronym> and e-mail and other means of some-to-some communication. They are trying to remove the limitations of the regular communication-apps to ease the flow (waves) of information. This means that every conversation is a tree of messages, which in turn can contain text-messages, video, documents, images etc, and with control of it&#8217;s own history as well as access-control &#8211; mainly by inviting users to the conversation, but it&#8217;s also possible to delegate access to any sub-trees.</p>
<p>The <a href="http://waveprotocol.org/">protocol</a> is open, making it possible for anyone to build their own systems &#8211; a good decision, i think, by Google as it will have to reach widely to get the share and usage it will have to get to be a success.</p>
<h2>Will it succeed?</h2>
<p>It depends on what they think of as success. In some way or another &#8211; yes. It&#8217;s undoubtedly some good ideas, although little or nothing by itself is revolutionary. Similarly solutions exists already, but just as proprietary software as far as I know, so the idea of making it freely available, easily embeddable and with a good <a href="http://code.google.com/apis/wave/guide.html"><acronym title="Application Programming Interface">API</acronym></a> is one I really like. Not to forget that it all is supposed to run inside a web-browser <img src='http://michaelodden.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .</p>
<p>It is not likely that it will be of regular use anytime soon, as it relays heavily on HTML5-features as well as a proposed addition of their own &#8211; although it is these kind of &#8220;killer-apps&#8221; that possible could speed up the adaptment of the specification in the coming UA&#8217;s and the transition to these new UA&#8217;s for the end-users.</p>
<p>But it is yet to tell if it will replace the regular emails and IMs as they are deeply rooted in ways of communication the regular users really can associate with &#8211; sending letters, and talking &#8211; but I personally would love to see it happen!</p>
<p>What do you think? Is it anything new, does it have potential, or is it just old ideas in a new suite?</p>
<h2>Related resources</h2>
<ul>
<li><a href="http://wave.google.com/">Project page</a></li>
<li><a href="http://code.google.com/apis/wave/guide.html">Google Wave <acronym title="Application Programming Interface">API</acronym></a></li>
<li><a href="http://www.youtube.com/watch?v=v_UyVmITiYQ ">Google IO Presentation</a></li>
<li><a href="http://waveprotocol.org/">Google Wave Protocol</a></li>
<li><a href="http://mashable.com/2009/05/28/google-wave-guide/">Google Wave: A Complete Guide</a></li>
</ul><img src="http://michaelodden.com/?ak_action=api_record_view&id=200&type=feed" alt="" />

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/development/google-wave-the-email-killer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usability-tips for your application (Part I)</title>
		<link>http://michaelodden.com/development/usability-tips-for-your-application-part-i/</link>
		<comments>http://michaelodden.com/development/usability-tips-for-your-application-part-i/#comments</comments>
		<pubDate>Mon, 25 May 2009 15:07:20 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[User-experience]]></category>
		<category><![CDATA[Web development]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[skip-intro]]></category>
		<category><![CDATA[tabular data]]></category>
		<category><![CDATA[user-interfaces]]></category>

		<guid isPermaLink="false">http://blog.michaelodden.com/?p=9</guid>
		<description><![CDATA[There are a exponentially growing amount of applications being developed. Some of them vanish at an early stage, while others grow to be quite (and sometimes extremely) popular. What really dazzles me is how sucky many of them (both the popular and the unpopular ones) are regarding how they deal with user-interaction. I&#8217;m not an [...]

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/the-whys-hows-and-whens-of-pagination/' rel='bookmark' title='Permanent Link: The whys, hows and whens of pagination'>The whys, hows and whens of pagination</a></li>
<li><a href='http://michaelodden.com/webdevelopment/table-row-highlighterjs/' rel='bookmark' title='Permanent Link: table-row-highlighter.js'>table-row-highlighter.js</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>There are a exponentially growing amount of applications being developed. Some of them vanish at an early stage, while others grow to be quite (and sometimes extremely) popular. What really dazzles me is how sucky many of them (both the popular and the unpopular ones) are regarding how they deal with user-interaction. <span id="more-9"></span> I&#8217;m not an expert in user-interaction-design, but as a user of quite a lot of applications (both web and desktop), I do know when something feels cumbersome or just wrong or missing.  About a year ago, I started to write down some of those situations having ambitions about writing something useful. I started writing the headline &#8220;1000 or so tips for your application&#8221;, so although I still have quite some way to go to reach that goal ( <img src='http://michaelodden.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) I figured I&#8217;d rather start writing about what I&#8217;d already got and take it from there!</p>
<p>Keep in mind that, as I&#8217;m kind of an web-guy, I&#8217;ll mostly keep things related to the web, but much of what I&#8217;m going to write about is easy transferable to the desktop-applications.  And I will also encourage you to mention issues you&#8217;ve encountered as a comment and help me finish my list.</p>
<h3>In this post I&#8217;ll go through:</h3>
<ul>
<li>Make tables sortable</li>
<li>Make sure &#8220;Skip-intro&#8221;-links are visible at once, even before the flash is loaded.</li>
<li>When working with tables, make sure a key-press highlights the first, closest matching row.</li>
</ul>
<h3>Making tables sortable</h3>
<p>In short &#8211; what is the use of organizing tabular data in tables, when you don&#8217;t/won&#8217;t enjoy the full power of it?  When coming to using tables on the web, it should really be up to the UA&#8217;s to implement such features, but until then you&#8217;ll have to do it yourself.  There are mainly two solutions to this case (on the web, that is):</p>
<h4>Backend processing</h4>
<p>Your table-headers are links, with parameters to be sent to the web-server, where your script than sorts the listenings (assuming you have your data in a database-table or an array/hash-table), and then output the correct result.  The query-string sent to the server will probably look something like this: &#8220;field=name&amp;dir=desc&#8221;. The script will then sort the results while taking the parameters into account, and then return a nice dataset ready to be rendered in html.  The downside of this approach is the extra requests to the server and the loading time, which in turn will make the user have to wait. We all know that that&#8217;s not good you bad boy!</p>
<h4>Frontend processing</h4>
<p>This is easily done, if you have used correct markup for your table (thead and th&#8217;s for defining the header-area, and tbody td etc to define the content-part. <a title="Bring on the tables by Roger Johansson" href="http://www.456bereastreet.com/archive/200410/bring_on_the_tables/">Check out this for more info</a>). There are a great amount of javascript-scripts dealing with this issue, although they have their shortcomings. The main functionality of these are to attach javascript-events to the text in the table-headers, and make them sort the table on the corresponding column &#8211; pretty straight-forward and as expected. <img src='http://michaelodden.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>The problem, though, is best imagined through an example:  Let us say you have a search-form, which search through an database of articles. The result is in return displayed in a table, with columns for title and creation-date. The searchresults are also grouped in pages of 20 rows each, so to view the next 20 results you&#8217;ll have to click on the neat little &#8220;page 2&#8243;-link. Let us now stay on page one, and click on the &#8220;creation-date&#8221;-header to sort the results after date of creation. The problem here is that your javascript will (usually) only sort the current page, because &#8211; of course &#8211; it doesn&#8217;t know about the remaining pages. This issue is avoided using backend-processing. It is obviously also possible to work around this, but as a default behaviour &#8211; this is usually the result.</p>
<h3>&#8220;Skip-intro&#8221;-links</h3>
<p>While this is an issue I come across quite often, this is also the the situation with one of the easiest solutions.  The situation:  There is this super-fancy site, with an even more super-fancy intro (usually in Flash), to really show off how cool this site really is. And &#8211; as this super-fancy-site-intro-flash is quite heavy with regards to loading images, animations and sound-effects &#8211; they also have to have a status bar to indicate the progress of loading the intro. All in all fair enough, and the solution for those of use who doesn&#8217;t feel like watching this intro and really just want to get on with the real content, is to give us an &#8220;Skip intro&#8221;-link which in turn will send us (hopefully) directly to the main-site.</p>
<p>So the followup-question is &#8220;<strong>Where do I place this link?</strong>&#8220;, which basically has two answers (and only one of them are actually good): Inside the flash-animation (usually with s a getURL-call), or as an <acronym title="HyperText Markup Language">HTML</acronym>-link located somewhere around the intro (above, underneath, left, right, or even diretly onto it (behold the the magic of <acronym title="Cascading Style Sheets">CSS</acronym>) ).  The good solution here is to locate it in the <acronym title="HyperText Markup Language">HTML</acronym> as an anchor. This is for several reasons: It&#8217;s fetchable for search-engines (allthough some SE&#8217;s by now know <a title="SWF searchability FAQ" href="http://www.adobe.com/devnet/flashplayer/articles/swf_searchability.html">how to read swf&#8217;s</a>), and it&#8217;s in reach already before the flash is loaded. On the other side, the worst solution was by someone who had the link inside the flash, and only visible <strong>after</strong> the progress bar was finished. Great!</p>
<p><strong>In short: place the &#8220;skip intro&#8221;-link in the <acronym title="HyperText Markup Language">HTML</acronym>-code, and keep it visible as long as the intro is running. </strong></p>
<h3>Highlight corresponding cell/row on key press</h3>
<p>This is another tip related to tabular data, and are often directly related to the sortable-part. When working with tabular data, and selecting/sorting a certain column, and pressing a key, ie. the letter &#8220;B&#8221;, please jump directly to the closest matching row.</p>
<p>In short: If the user presses a key, make sure to highlight the corresponding row, depending on which column is highlighted/sorted on. If the user presses &#8220;B&#8221; and the table is sorted on surname, jump to the first row with a surname which starts on &#8220;B&#8221;. If there are no rows with matching surname, then highlight the closest matching one. I.e. the first starting with &#8220;C&#8221; etc.</p>
<p>Perhaps not exceptionally relevant for websites yet, but I do think that as more and more content-heavy applications are being developed for the web, it is something to look into. I&#8217;m working on a JavaScript-solution to this and will post about it a little later. Keep following <img src='http://michaelodden.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Related links</h3>
<ul>
<li><a title="sorttable: Make all your tables sortable" href="http://www.kryogenix.org/code/browser/sorttable/">Sorttable.js &#8211; Making <acronym title="HyperText Markup Language">HTML</acronym>-tables sortable via JavaScript </a></li>
<li><a title="tablesorter - a jQuery plugin" href="http://tablesorter.com/docs/">tablesorter &#8211; a jQuery plugin</a></li>
<li><a href="http://michaelodden.com/webdevelopment/table-row-highlighterjs/">table-row-highlighter.js</a> &#8211; My prototype of abovementioned functionality</li>
</ul>
<h2>More to come</h2>
<p>I&#8217;ve got plenty more to come in upcoming posts,  and would also very much like your input on especially the discussed issues as well as proporsitions for coming cases.</p>
<ul>
<li>Does entry-highlightning on tables after key-press have anything to do with the web?</li>
<li>How can this be implemented in a good fashion?</li>
<li>What other magic is reasonably to accomplish with neatly marked up tables?</li>
</ul>
<ul>
<li><a title="tablesorter - a jQuery plugin" href="http://tablesorter.com/docs/"> </a></li>
</ul><img src="http://michaelodden.com/?ak_action=api_record_view&id=9&type=feed" alt="" />

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/the-whys-hows-and-whens-of-pagination/' rel='bookmark' title='Permanent Link: The whys, hows and whens of pagination'>The whys, hows and whens of pagination</a></li>
<li><a href='http://michaelodden.com/webdevelopment/table-row-highlighterjs/' rel='bookmark' title='Permanent Link: table-row-highlighter.js'>table-row-highlighter.js</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/development/usability-tips-for-your-application-part-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The whys, hows and whens of pagination</title>
		<link>http://michaelodden.com/development/the-whys-hows-and-whens-of-pagination/</link>
		<comments>http://michaelodden.com/development/the-whys-hows-and-whens-of-pagination/#comments</comments>
		<pubDate>Sun, 24 May 2009 15:04:01 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[User-experience]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[toc]]></category>
		<category><![CDATA[users]]></category>

		<guid isPermaLink="false">http://blog.michaelodden.com/?p=21</guid>
		<description><![CDATA[Why In the most basic form, pagination is best illustrated by books: there&#8217;s a lot of content, and just expanding the sheet would too cumbersome. And then we discovered that by dividing the content into pages, and stacking them we&#8217;d get a lot of content in a handy way, and also making it pretty easy [...]

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/usability-tips-for-your-application-part-i/' rel='bookmark' title='Permanent Link: Usability-tips for your application (Part I)'>Usability-tips for your application (Part I)</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<h2>Why</h2>
<p>In the most basic form, pagination is best illustrated by books: there&#8217;s a lot of content, and just expanding the sheet would too cumbersome. And then we discovered that by dividing the content into pages, and stacking them we&#8217;d get a lot of content in a handy way, and also making it pretty easy to navigate. Especially by prepending or appending a table-of-contents (<acronym title="Table of contents">ToC</acronym>).</p>
<p>Web-pagination came, I believe, in the days of modems as a solution to keep the amount of data to download smaller, and then letting it up to the user to decide which parts of the paginated content (s)he&#8217;d check &#8211; although that&#8217;s a pretty basic assumption &#8211; anyhow, that&#8217;s not of the scope of this post.</p>
<h2>The problem</h2>
<p>What I see all too often is something like this:</p>
<div id="attachment_114" class="wp-caption alignleft" style="width: 229px"><img class="size-full wp-image-114 " title="Pagination at ALA" src="http://blog.michaelodden.com/wp-content/uploads/2009/05/picture-2.png" alt="Typical example of navigation of paginated content" width="219" height="94" /><p class="wp-caption-text">Example of common pagination</p></div>
<p>The problem with this approach, even though it&#8217;s the most common one, is that the links to the different pages gives no indication of what you&#8217;ll find there. Yes, if you&#8217;ve performed a search, then you&#8217;ll know that you&#8217;ll find even more results, and as it probably is sorted by relevance you know that the entries will be less and less relevant (probably) the further you go. But what then if the decrease of relevance between each entry isn&#8217;t linear? Then entries in page 10 won&#8217;t no longer be half as relevant as those in page 5, etc.</p>
<div id="attachment_113" class="wp-caption alignleft" style="width: 318px"><img class="size-full wp-image-113 " title="Typical example of navigation of paginated content" src="http://blog.michaelodden.com/wp-content/uploads/2009/05/picture-1.png" alt="Typical example of navigation of paginated content" width="308" height="25" /><p class="wp-caption-text">Another example of common pagination - guess from where!</p></div>
<p>In books, pagination is practical mainly in cooperation with the <acronym title="Table of contents">ToC</acronym>, and also for keeping track of relevant pages &#8211; like which page something specific is written, or the current position of your progress. On the web we usually just throw in pages &#8211; and skipping the <acronym title="Table of contents">ToC</acronym> &#8211; leaving it up to the user to manually search.</p>
<p>This is again no problem for those who are reading the entries from start to end &#8211; but rather for those who are looking for something specific.</p>
<h2>Alternatives &#8211; and when and how to use pagination</h2>
<h3>Dynamic filters</h3>
<div id="attachment_119" class="wp-caption alignleft" style="width: 160px"><a href="http://blog.michaelodden.com/wp-content/uploads/2009/05/amazon_filters.png"><img class="size-thumbnail wp-image-119 " title="Filters from Amazon.com" src="http://blog.michaelodden.com/wp-content/uploads/2009/05/amazon_filters-150x150.png" alt="Example of filters on search-result" width="150" height="150" /></a><p class="wp-caption-text">Screenshot from Amazon.com&#39;s filters - click for full image</p></div>
<p>Filters are a great way to allowing the user to skip those entries he assumes is unrelevant to the current search. Webshops, catalogs and similar sites are now becoming pretty good at using this approach &#8211; just take a look at Amazon.com&#8217;s approach (image). Here I&#8217;ve searched for <a href="http://www.amazon.com/Blues-Music-Video-Concerts-DVD/b/ref=bw_ab_163420_4?ie=UTF8&amp;node=511422&amp;pf_rd_p=236911101&amp;pf_rd_s=browse&amp;pf_rd_t=101&amp;pf_rd_i=163420&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=1WCZ0H4107TJ201Q6Y4G">blues-<acronym title="Digital Versatile Disc">DVD</acronym>&#8217;s</a>, and is presented with relevant filters depending on the current result. I can ie choose to just see entries from 1960 &#8211; 1969, and skip out all those who aren&#8217;t english as well. This reduces it down to sub-13 from 914 &#8211; great! Now I won&#8217;t need to browse among 76 pages anymore.</p>
<p>To integrate a good implementation of this you&#8217;ll have to find out what attributes of the entries are reasonably to filter by (remember to take into account the demgraphics of the users going to use this), and make sure your solution present this in a good way.</p>
<p>It will usually be reasonable to allow multiple filters (I want english entries from the 1960&#8242;s), but in some situations singe-filter-support will suffice.</p>
<p>Other sites using this technique: <a href="http://finn.no/">finn.no (no)</a>, <a href="http://ebay.com/">ebay.com</a>, <a href="http://www.gulesider.no/tk/">telefonkatalogen.no (no)</a></p>
<h3>Table of contents</h3>
<p>This is probably mostly relevant for web-books, but elements of this can also be integrated into other solutions and situations. It will usually be used instead of dynamic filters where the content is linearly continuated in a given order &#8211; instead of some arbitrary sorting.</p>
<p>Web-books, online documentation etc is natural places where this is applicable.</p>
<h3>Informative links</h3>
<div id="attachment_120" class="wp-caption alignleft" style="width: 310px"><a href="http://blog.michaelodden.com/wp-content/uploads/2009/05/paginated_miofw.png"><img class="size-medium wp-image-120 " title="Screenshot from an article-listening in my framework" src="http://blog.michaelodden.com/wp-content/uploads/2009/05/paginated_miofw-300x48.png" alt="" width="300" height="48" /></a><p class="wp-caption-text">Screenshot from my framework which takes care of descriptive links depending field and sort-ordering - with norwegian i18n. The arrow (not included in screenshot) is pointing at &quot;3&quot; and the UA is accordingly displaying the information.</p></div>
<p>Screenshot from my framework which takes care of descriptive links depending field and sort-ordering &#8211; with Norwegian i18n.There will probably always be some situations where you have to use pagination, and often will dynamic-filtering be a little overkill. The solution here can be to add information to the title-attribute of the link which says something about what you&#8217;ll find there. For example, if I have a result-set sorted by dates ascending, then a link to page might have the following pattern for it&#8217;s title-attribute: &#8220;Articles from &lt;fromdate&gt; to &lt;todate&gt;&#8221;. This way you&#8217;ll give the user an indication of what to find at that page, without having to check first.</p>
<h2>Related reading</h2>
<ul>
<li><a href=" http://en.wikipedia.org/wiki/Pagination">Wikipedia &#8211; Pagination</a></li>
<li><a href=" http://en.wikipedia.org/wiki/Table_of_contents">Wikipedia &#8211; Table of contents</a></li>
<li><a href="http://www.designvsart.com/blog/2008/06/04/a-guide-to-perfect-pagination/ ">Design VS Art Blog &#8211; A guide to perfect pagination</a></li>
</ul>
<h2>Feedback</h2>
<p>This is how I feel about the issue of organising larger amounts of data, and making it easy for users to find whatever is relevant. I&#8217;m sure there is situations I havent&#8217; covered here, and would like your comments on how this can be improved to give our users a best possible user-experience &#8211; and with that giving our clients a more valuable website.</p>
<ul>
<li>Is the title-attribute of anchors the best / right way to display information for informative links?</li>
<li>Are there other ways then filters, <acronym title="Table of contents">ToC</acronym>&#8217;a and informative links that can solve the problems?</li>
<li>What other places can <acronym title="Table of contents">ToC</acronym>&#8217;s be a good alternative?</li>
</ul>
<p>Your feedback is very much appreciated.</p><img src="http://michaelodden.com/?ak_action=api_record_view&id=21&type=feed" alt="" />

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/usability-tips-for-your-application-part-i/' rel='bookmark' title='Permanent Link: Usability-tips for your application (Part I)'>Usability-tips for your application (Part I)</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/development/the-whys-hows-and-whens-of-pagination/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>My look on the web</title>
		<link>http://michaelodden.com/development/my-look-on-the-web/</link>
		<comments>http://michaelodden.com/development/my-look-on-the-web/#comments</comments>
		<pubDate>Sun, 24 May 2009 12:29:56 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Web development]]></category>

		<guid isPermaLink="false">http://blog.michaelodden.com/?p=44</guid>
		<description><![CDATA[I feel strongly for the idea of the open web. A web accessible for everyone. Now, this doesn&#8217;t mean that every single page on the web should be 100% identical for everyone, but more like: Relevant information ought to be available and easily accessible by those who need and/or want it, regardless of disabilities. So [...]

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/usability-tips-for-your-application-part-i/' rel='bookmark' title='Permanent Link: Usability-tips for your application (Part I)'>Usability-tips for your application (Part I)</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>I feel strongly for the idea of the open web. A web accessible for everyone.</p>
<p>Now, this doesn&#8217;t mean that every single page on the web should be 100% identical for everyone, but more like: Relevant information ought to be available and easily accessible by those who need and/or want it, regardless of disabilities.  So in my view, it is important to separate the thought of <strong>content</strong> and <strong>functionality</strong> on the web.  And as well, in these days of the ever-increasing amount of web-applications this has got to be taken into account. As I&#8217;ll discuss further in a soon-to-come post there are some things to take into consideration whether the &#8220;website&#8221; actually is a website, or a web-application. In short: every web-application doesn&#8217;t necessarily have to be accessible to everyone, regardless of platform, disability etc, while most of the websites does have to be so.</p>
<p>There is a common misunderstanding that idea of the open web mean that every piece of content, associated with every bit of fancy functionality ought to be done in such a way that everyone &#8211; regardless if they&#8217;re using <acronym title="Internet Explorer">IE</acronym> 5, some old Netscape or even Lynx -should be able to enjoy both the content and the functionality.</p>
<h2>How I/to do it</h2>
<p>When I create a website for any company, I do make sure that all of their public content is accessible &#8211; this mean that the webpages are neatly marked up in as meaningful markup as possible, as while as making sure my stylesheets as looking fancy for the waste majority of users, and using javascript just to enchance the experience for those of them who support/enable it. This way it will be accessible for those using supporting UA&#8217;s (ie. those with reduced sight) and also degrades nicely for those with older browsers &#8211; or for some other reasons doesn&#8217;t fully support <acronym title="Cascading Style Sheets">CSS</acronym> and/or JavaScript).</p>
<p>This is not anything new for anyone who&#8217;ve heard for <a title="The Web Standards Project" href="http://webstandards.org/">web-standards</a>, <a href="http://en.wikipedia.org/wiki/Semantic_Web">semantic</a> <a href="http://robertnyman.com/2007/10/29/explaining-semantic-mark-up/">markup</a> and <a href="http://www.alistapart.com/articles/understandingprogressiveenhancement/">progressive enhancement</a> &#8211; which in turn will make sure of <a href="http://en.wikipedia.org/wiki/Graceful_degradation">graceful degradation</a>.</p>
<p>I know there are those out there who will shoot me for not saying that 100% ought to be accessible to everyone, but as we live in a real world &#8211; we have to make real decisions to make real business.</p><img src="http://michaelodden.com/?ak_action=api_record_view&id=44&type=feed" alt="" />

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/usability-tips-for-your-application-part-i/' rel='bookmark' title='Permanent Link: Usability-tips for your application (Part I)'>Usability-tips for your application (Part I)</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/development/my-look-on-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First year finished</title>
		<link>http://michaelodden.com/development/first-year-finished/</link>
		<comments>http://michaelodden.com/development/first-year-finished/#comments</comments>
		<pubDate>Mon, 18 May 2009 21:41:48 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://blog.michaelodden.com/?p=102</guid>
		<description><![CDATA[I&#8217;m now finished with the first year of university, leaving only two more years left. I feel I&#8217;ve managed quite well, and I&#8217;m looking forward for the upcoming classes: game-development, general programming, object-oriented analytics and design, etc. Now it&#8217;s time to focus on my jobs and private projects &#8211; beside enjoying at least some days [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m now finished with the first year of university, leaving only two more years left. I feel I&#8217;ve managed quite well, and I&#8217;m looking forward for the upcoming classes: game-development, general programming, object-oriented analytics and design, etc.</p>
<p>Now it&#8217;s time to focus on my jobs and private projects &#8211; beside enjoying at least <em>some</em> days off  - this summer.</p>
<p>Note to self, projects to get further during this summer:</p>
<ul>
<li>kidlock &#8211; a computer-lock for worried fathers, with a pedagogical twist</li>
<li>oppetider.no</li>
<li>mydemoground.com</li>
<li>MioNoid &#8211; My Arkanoid-creation, for practicing my game-development skills</li>
</ul><img src="http://michaelodden.com/?ak_action=api_record_view&id=102&type=feed" alt="" />

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/development/first-year-finished/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

