<?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>lexanderA</title>
	<atom:link href="http://lexandera.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://lexandera.com</link>
	<description>A blog about the web, mobile web, semantic web and mobile semantic web.</description>
	<lastBuildDate>Sun, 06 Jun 2010 18:27:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Is this how it all started?</title>
		<link>http://lexandera.com/2010/06/is-this-how-it-all-started/</link>
		<comments>http://lexandera.com/2010/06/is-this-how-it-all-started/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 18:27:47 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Far Side]]></category>
		<category><![CDATA[Semantic Web]]></category>
		<category><![CDATA[Tim Berners-Lee]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=595</guid>
		<description><![CDATA[I wonder if Tim Berners-Lee got his idea for the semantic web while reading Gary Larson&#8217;s The Far Side comics:


]]></description>
			<content:encoded><![CDATA[<p>I wonder if <a class="zem_slink" title="Tim Berners-Lee" rel="wikipedia" href="http://en.wikipedia.org/wiki/Tim_Berners-Lee">Tim Berners-Lee</a> got his idea for the semantic web while reading Gary Larson&#8217;s <a href="http://en.wikipedia.org/wiki/The_Far_Side">The Far Side</a> comics:</p>
<p><a href="http://lexandera.com/wp-content/uploads/2010/06/larson-oct-1987.gif"><img class="alignnone size-full wp-image-594" title="Real world tagging" src="http://lexandera.com/wp-content/uploads/2010/06/larson-oct-1987.gif" alt="" width="321" height="419" /></a></p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=ada0b50d-962f-4cd7-8c30-81e99cb8b7c9" alt="" /><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2010/06/is-this-how-it-all-started/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Want iPad multitasking? Buy multiple iPads.</title>
		<link>http://lexandera.com/2010/04/want-ipad-multitasking-buy-multiple-ipads/</link>
		<comments>http://lexandera.com/2010/04/want-ipad-multitasking-buy-multiple-ipads/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 22:54:14 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[IPad]]></category>
		<category><![CDATA[multitasking]]></category>
		<category><![CDATA[Star Trek]]></category>
		<category><![CDATA[SteveWozniak]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=584</guid>
		<description><![CDATA[A while ago I suggested on Twitter that the solution to iPad&#8217;s lack of multitasking is buying multiple iPads. People thought I was joking. When I shared the same idea with my coworkers they didn&#8217;t take me seriously either. Then a couple of weeks ago I came across an interesting piece in Newsweek in which [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I suggested on Twitter that the solution to iPad&#8217;s lack of multitasking is buying multiple iPads. People thought I was joking. When I shared the same idea with my coworkers they didn&#8217;t take me seriously either. Then a couple of weeks ago I came across <a href="http://www.newsweek.com/id/235567">an interesting piece in Newsweek</a> in which the <a href="http://www.fakesteve.net/">Fake Steve Jobs</a> interviews the real <a class="zem_slink" title="Steve Wozniak" rel="homepage" href="http://www.woz.org/">Steve Wozniak</a>. The interview itself is about what The Woz thinks of the iPad but it ends with the following gem on multitasking:</p>
<blockquote><p><strong>Wozniak</strong>: &#8230;By the way, I solved the problem of battery life and [the lack of] multitasking on the iPhone.<br />
<strong>Interviewer</strong>: Really?<br />
<strong>Wozniak</strong>: Yeah. I just have two iPhones, so if the battery runs down on the first one, I can use the other. And if I&#8217;m talking on one, I can use the other one to look something up. You would not believe how much use I get out of that.</p></blockquote>
<p>Perhaps my idea wasn&#8217;t so far-fetched after all.</p>
<p>Sure, ditching your current setup and replacing it with multiple tablet computers would mean quite a change in how you use your computer. But many people would likely be perfectly happy with the alternative. Like those people, for example, who are ordering iPads faster than Apple can manufacture them.</p>
<p>With iPads having neither a keyboard nor a mouse and being small enough so that you can have several of them in front of you, I imagine switching between them should be a snap. Also, the added screen real estate of what is essentially a multi-monitor setup should also make it easier to work with multiple apps at the same time.</p>
<p>Of course, this idea is not new at all. You may have even seen it on TV decades ago. A user called <a href="http://news.ycombinator.com/user?id=derefr">derefr</a> left the following comment over at HackerNews when I mentioned my idea:</p>
<blockquote><p>[Using multiple iPads] makes complete sense to me—remember the scenes in Star Trek where someone is sitting at a desk absolutely covered in <a href="http://memory-alpha.org/wiki/PADD">PADD</a>s, each doing one little thing? We just need to wait for the price to come down :)</p></blockquote>
<p>Being located in Europe, coming across even one, let alone two or three iPads has proven to be a bit difficult for me. So if someone reading this has had the chance to try working with more than one iPad at the same time it would be great to hear how well it works and what problems you&#8217;ve run into.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=15540ae3-4847-4365-8fc4-a970466acf9a" alt=""><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2010/04/want-ipad-multitasking-buy-multiple-ipads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t &#8212; in Scala</title>
		<link>http://lexandera.com/2009/11/dont-in-scala/</link>
		<comments>http://lexandera.com/2009/11/dont-in-scala/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 08:49:43 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Acme]]></category>
		<category><![CDATA[Control flow]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Syntax]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=553</guid>
		<description><![CDATA[While browsing Reddit yesterday, I came across this thread on Perl&#8217;s Acme::Don't module. The Acme::Don't module is a joke module which adds support for &#8220;don't&#8220;, the opposite of the &#8220;do&#8221; command. The &#8220;don't&#8221; construct accepts a block of code and then DOESN&#8217;T execute it, no matter what. Now, lately I&#8217;ve been playing around with Scala [...]]]></description>
			<content:encoded><![CDATA[<p>While browsing Reddit yesterday, I came across this <a href="http://www.reddit.com/r/programming/comments/a26fe/dont/">thread on Perl&#8217;s <code>Acme::Don't</code> module</a>. The <a href="http://search.cpan.org/%7Edconway/Acme-Don-t-1.01/t.pm"><code>Acme::Don't</code></a> module is a joke module which adds support for &#8220;<code>don't</code>&#8220;, the opposite of the &#8220;<code>do</code>&#8221; command. The &#8220;<code>don't</code>&#8221; construct accepts a block of code and then DOESN&#8217;T execute it, no matter what. Now, lately I&#8217;ve been playing around with <a class="zem_slink" href="http://www.scala-lang.org" title="Scala (programming language)" rel="homepage">Scala</a> and I know that thanks to its flexible syntax it&#8217;s possible to create functions which look and behave just like control structures. This got me thinking&#8230; could I implement a useful version of &#8220;<code>don't</code>&#8220;? </p>
<p>After a couple of minutes I came up with the following 2 use cases (in addition to the original standalone don&#8217;t block):</p>
<pre name="code" class="javascript">

dont { ... }
dont { ... } unless (condition)
dont { ... } until (condition)
</pre>
<p>Implementing the <code>dont { ... }</code> part is easy. The only thing needed to make this work is a function which accepts a block of code and doesn&#8217;t do anything with it.</p>
<p>Adding support for the <code>unles/until</code> part is a bit trickier, but still easy. For this to work, the dont function must return an object which contains methods named <code>unless</code> and <code>until</code>. These methods then evaluate the condition passed to them and execute the original block of code <code>if/when</code> the condition is true.</p>
<p>It&#8217;s probably best if I just show you the code:</p>
<pre name="code" class="scala">

def dont(code: =&gt; Unit) = new DontCommand(code)

class DontCommand(code: =&gt; Unit) {
    def unless(condition: =&gt; Boolean) =
        if (condition) code

    def until(condition: =&gt; Boolean) = {
        while (!condition) {}
        code
    }
}
</pre>
<p>Now there&#8217;s nothing else left but to use it in an example:</p>
<pre name="code" class="scala">

/* This will never be executed */
dont {
    println(&quot;Hello? Can anyone hear me?&quot;);
}

/* This will only be executed if the condition is true */
dont {
    println(&quot;Yep, 2 really is greater than 1.&quot;)
} unless (2 &gt; 1) 

/* Just a helper function */
var number = 0;
def nextNumber() = {
    number += 1
    println(number)
    number
}

/* This will not be printed until the condition is met. */
dont {
    println(&quot;Done counting to 5!&quot;)
} until (nextNumber() == 5) 
</pre>
<p>Runnig the above code should print:</p>
<blockquote><p>Yep, 2 really is greater than 1.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
Done counting to 5!</p></blockquote>
<div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"><img style="border: medium none ; float: right;" class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=72b2b28a-d74d-477d-93b7-4f614da280d5"><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>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/11/dont-in-scala/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Predictions on the future of NoSQL</title>
		<link>http://lexandera.com/2009/11/predictions-on-the-future-of-nosql/</link>
		<comments>http://lexandera.com/2009/11/predictions-on-the-future-of-nosql/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 11:02:53 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Predictions]]></category>
		<category><![CDATA[Query language]]></category>
		<category><![CDATA[SPARQL]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=545</guid>
		<description><![CDATA[These days new NoSQL databases are springing up faster than URL shorteners. Even incomplete lists are likely to mention over 50 of them, most of them never heard of before. But even though they&#8217;re all being lumped together under the same name, they are so different from each other that there&#8217;s still a dilemma how [...]]]></description>
			<content:encoded><![CDATA[<p>These days new <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a> databases are springing up faster than URL shorteners. Even incomplete <a href="http://www.zemanta.com/fruitblog/nosql-meetup-reporton/">lists</a> are likely to mention over 50 of them, most of them never heard of before. But even though they&#8217;re all being lumped together under the same name, they are so different from each other that there&#8217;s still a dilemma how to come up with a name which would describe them for what they are instead of describing them for what they&#8217;re not.</p>
<p>Nobody knows for sure what the future of NoSQL will be like, which way the development is most likely to head and who the winners will be, but we can still try and make some predictions. Here are mine:</p>
<p><strong>Several subgroups will emerge</strong><br />
This is not as much a prediction as much as it is an observation of already visible patterns. At least two main groups will emerge from the NoSQL movement: networked data structure servers (key/value stores, queues, &#8230;) and databases for working with structured data.</p>
<p><strong>The data structure branch will remain very diverse</strong><br />
Typical software in this category is rather minimalistic, both in terms of functionality and in terms of code size. Thanks to this the threshold for entry of new players is rather low; also low is the price paid by users for switching between competing implementations.<br />
Various players will likely specialize in some technological niche and they will continue to be used mainly as means of speeding up applications and not as fundamental building blocks.</p>
<p><strong>Relational databases will fight back</strong><br />
Some databases already have support for storing, manipulating and indexing structured data in the form of XML. I have a feeling that JSON support can&#8217;t be far away. For most users this will be enough to stay with the established players in the database field instead of choosing a strictly document oriented database.</p>
<p><strong>Document oriented databases will morph into graph databases</strong><br />
Implementing cross document referencing will take them half way there. Pressure from the relational databases, as described above, will push them the rest of the way.</p>
<p><strong>SPARQL will become the query language of choice<br />
</strong><a href="http://en.wikipedia.org/wiki/SPARQL">SPARQL</a> is a query language for <a class="zem_slink" title="Resource Description Framework" rel="wikipedia" href="http://en.wikipedia.org/wiki/Resource_Description_Framework">RDF</a><sup class='footnote'><a href='#fn-545-1' id='fnref-545-1'>1</a></sup>; in other words: a language for querying graphs. It supports querying multiple data sources at the same time (federated queries) and there are projects underway to make it work with Hadoop clusters.<br />
I&#8217;m not saying that alternative methods of querying will disappear completely! I&#8217;m just trying to say that the key players most likely to be used by the average developer (the next generation graph database equivalents of MySQL and PostgreSQL and similar) will end up standardizing on SPARQL instead of inventing yet another language.</p>
<p><strong>Software will gain weight</strong><br />
Reading about NoSQL databases gives me a feeling of deja-vu. Most of it reads almost exactly like articles about MySQL from the beginning of this decade: &#8220;We&#8217;re better than competition because we don&#8217;t have transactions/triggers/datatype checking/guaranteed consistency/fulltext search/&#8230;&#8221;. MySQL now has all of those features and NoSQL databases will follow in the same path. Most users will start hitting walls due to lack of features, not due to performance issues and when that happens having features will become more important than being lean.</p>
<p><strong>The cycle will repeat itself</strong><br />
After a decade or so a new class of players claiming that their lack of features is their strength will emerge once again</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=c670fd3f-4e02-47dc-9926-222ea29b4388" alt="" /><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-545-1'>RDF is an extremely simple format wrapped in a metric buttload of mystery in misunderstanding. But more about that some other time. <span class='footnotereverse'><a href='#fnref-545-1'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/11/predictions-on-the-future-of-nosql/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Replacing menus with dashboards</title>
		<link>http://lexandera.com/2009/09/replacing-menus-with-dashboards/</link>
		<comments>http://lexandera.com/2009/09/replacing-menus-with-dashboards/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 09:00:23 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[tabs]]></category>
		<category><![CDATA[url field]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=485</guid>
		<description><![CDATA[Is it just me, or do most dialogs on Android seem to be removed really, really far away from the main parts of applications?
Not sure what I&#8217;m talking about?
Let&#8217;s take a look at the browser, for example. Just entering a new URL requires you to go through 3 different screens:

By the time you can start [...]]]></description>
			<content:encoded><![CDATA[<p>Is it just me, or do most dialogs on Android seem to be removed really, really far away from the main parts of applications?</p>
<p>Not sure what I&#8217;m talking about?</p>
<p>Let&#8217;s take a look at the browser, for example. Just entering a new URL requires you to go through 3 different screens:</p>
<p><a href="http://lexandera.com/wp-content/uploads/2009/09/1_current.png"><img class="alignnone size-full wp-image-498" src="http://lexandera.com/wp-content/uploads/2009/09/1_current_small.png" alt="" width="714" height="180" /></a></p>
<p>By the time you can start typing it feels like you&#8217;re already in a different application<sup class='footnote'><a href='#fn-485-1' id='fnref-485-1'>1</a></sup>. Switching to a different window also involves going to a special part of the application designed to handle this single task.</p>
<p>This pattern is not limited just to the browser. Entering an address in the maps application or searching the list of your contacts also involves going through several steps.</p>
<p>Back to the browser&#8230;</p>
<p>If you take a look the UI of a regular browser you can immediately see a number of frequently used elements such as the location bar, the back button and tabs for switching between windows. Those UI elements are always visible and usable with a single click. On mobile devices things are a bit different. Because of limited screen sizes most of browser&#8217;s UI is either eating away precious screen real estate (like on the iPhone) or is hidden behind a menu button (like on Android).</p>
<p>Except that because of the nature of menus, many of those features are not hidden just behind the menu button, but also behind an item on that menu.</p>
<p>Now, just as I&#8217;m typing this, <a class="zem_slink" title="Marissa Mayer" rel="wikipedia" href="http://en.wikipedia.org/wiki/Marissa_Mayer">Marissa Mayer</a> is on the stage at <a class="zem_slink" title="TechCrunch50" rel="homepage" href="http://www.TechCrunch50.com">TechCrunch50</a> introducing <a href="http://fastflip.googlelabs.com/">Google fast flip</a> and talking about how Google is obsessed with speed and shaving milliseconds off of repetitive interactions. So what can can we do to speed up interaction with Google&#8217;s mobile browser?</p>
<p>First, we need to understand what&#8217;s wrong with menus.</p>
<p>A typical menu is a list of actions available for that application, but most of those actions can&#8217;t be performed from the menu itself. Instead, selecting an item takes you somewhere else where that action can finally be performed. In essence, a menu keeps asking the question &#8220;What do you want to do?&#8221; over and over again and the user then needs to explicitly say that he wants to go to to the place where he can type in an URL or go to the place where he can switch to a different window, etc.</p>
<p>How do we handle this situation where we know that in many applications the user&#8217;s answer to the menu&#8217;s question is going to be the same most of the time?</p>
<p>Like it is the case usually these days, the solution can already be found on the iPhone. No real surprise there. The iPhone doesn&#8217;t have built-in support for application menus which could be copied, but it does have this:</p>
<p><a href="http://lexandera.com/wp-content/uploads/2009/09/music_dashboard.png"><img class="alignnone size-full wp-image-499" src="http://lexandera.com/wp-content/uploads/2009/09/music_dashboard.png" alt="" width="211" height="159" /></a></p>
<p>What you&#8217;re looking at is a special dashboard for controlling music playback, which can be brought up by pressing the home button twice.</p>
<p>With a bit of bad luck &#8211; or bad judgment &#8211; this could have easily been implemented as a list of items such as &#8220;adjust volume&#8221; and &#8220;control playback&#8221;, with each of them leading to a new screen where that action could be performed. But instead its designers made it possible to perform common actions directly from the pop-up and added a &#8220;Music&#8221; button that takes you to that other app where the rest of the playback controls are.</p>
<p>So let&#8217;s take this dashboard pattern and apply it to Android&#8217;s browser menu:</p>
<p><a href="http://lexandera.com/wp-content/uploads/2009/09/2_alt1.png"><img class="alignnone size-full wp-image-500" title="2_alt1_small" src="http://lexandera.com/wp-content/uploads/2009/09/2_alt1_small.png" alt="2_alt1_small" width="544" height="180" /></a></p>
<p>While some features (like bookmarks) still remain hidden behind a menu button, the two most commonly used ones are immediately presented in usable form. The &#8220;go&#8221; button is replaced by an actual location bar and the &#8220;Windows&#8221; button is replaced by thumbnails of windows. You now no longer need to announce first that you want to go to a different page or switch to a different tab; you can perform that action directly instead.</p>
<p>A quick before/after comparison:</p>
<div>
<table id="c0m_" border="0" cellspacing="0" cellpadding="3" bordercolor="#000000">
<tbody style="font-size:90%;">
<tr>
<td style="border-bottom: 1px solid grey;"><strong>Action</strong></td>
<td style="border-bottom: 1px solid grey;"><strong>Before</strong></td>
<td style="border-bottom: 1px solid grey;"><strong>After</strong></td>
</tr>
<tr>
<td>Loading a web page</td>
<td>press &#8220;menu&#8221; → press &#8220;go&#8221; → focus URL field (3 steps)</td>
<td>press &#8220;menu&#8221; → focus URL field (2 steps)</td>
</tr>
<tr>
<td>Switching to a different window</td>
<td>press &#8220;menu&#8221; → press &#8220;tabs&#8221; → select tab (3 steps)</td>
<td>press &#8220;menu&#8221; → select tab (2 steps)</td>
</tr>
</tbody>
</table>
</div>
<p>Removing a single step here and there may not seem like much, but it adds up. Making a typo in the URL or working with several windows suddenly becomes just a little bit less frustrating. A simple improvement that can be achieved simply by ignoring the established meaning of the word &#8220;menu&#8221;.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=6586ad72-cb6a-4cc4-902f-85df0363cdfb" alt="" /><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-485-1'>Sure, if you have a phone with a physical keyboard you can just start typing and invoke the default action without going through menus, but what if your phone uses an onscreen keyboard or if you want to use some other action? <span class='footnotereverse'><a href='#fnref-485-1'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/09/replacing-menus-with-dashboards/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Advertising overload</title>
		<link>http://lexandera.com/2009/07/advertising-overload/</link>
		<comments>http://lexandera.com/2009/07/advertising-overload/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 22:27:31 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Forbes]]></category>
		<category><![CDATA[Sad]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=471</guid>
		<description><![CDATA[I followed a link to Forbes today and this is what I saw:

There&#8217;s an article hidden somewhere in that screenshot. Can you find it?
Content is no longer king. It is now a third-rate citizen; a stinky bait used to lure in visitors; a parasite eating away at precious advertising space.

]]></description>
			<content:encoded><![CDATA[<p>I followed a link to Forbes today and this is what I saw:</p>
<p><img class="size-full wp-image-474 alignnone" title="Advertising overload" src="http://lexandera.com/wp-content/uploads/2009/07/forbes_fail_2.png" alt="Advertising overload" width="520" height="394" /></p>
<p>There&#8217;s an article hidden somewhere in that screenshot. Can you find it?</p>
<p>Content is no longer king. It is now a third-rate citizen; a stinky bait used to lure in visitors; a parasite eating away at precious advertising space.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=7a196937-d471-414f-bbf9-cd41fdafade4" alt="" /><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/07/advertising-overload/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Future of Mobile Browsers</title>
		<link>http://lexandera.com/2009/07/the-future-of-mobile-browsers/</link>
		<comments>http://lexandera.com/2009/07/the-future-of-mobile-browsers/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 15:39:25 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mobile web]]></category>
		<category><![CDATA[Semantic Web]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[Semantic tagging]]></category>
		<category><![CDATA[Web browser]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=436</guid>
		<description><![CDATA[Not that long ago, while my coworkers were attending a conference in London, I was spending my time wandering around the city in full tourist mode, trying to find a shop I had read about on the Internet but that didn&#8217;t seem to actually exist in real life. Although I was pretty sure I was [...]]]></description>
			<content:encoded><![CDATA[<p>Not that long ago, while my coworkers were attending a conference in London, I was spending my time wandering around the city in full tourist mode, trying to find a shop I had read about on the Internet but that didn&#8217;t seem to actually exist in real life. Although I was pretty sure I was on the right street I couldn&#8217;t find it and nobody I asked about it had the slightest idea about where it could be located.</p>
<p>This problem should be easily solvable in our age of ubiquitous connectivity, right? All I had to do was take out my mobile phone, fire up the web browser, check the shop&#8217;s website for the address and locate it using Google maps. How hard could that be? Very hard, as it turned out.</p>
<p>The experience of trying to perform this task was so horribly bad that in the end I wound up walking to Apple store a couple of streets away and waiting in line for a display iMac so that I could find the information I needed, copy it to a piece of paper and finally walk back. Yes, that was in fact a better alternative to trying to accomplish anything using a mobile browser.</p>
<p>A year and a half has passed since, but things haven&#8217;t changed much for the better. Even though connection speeds have gotten better and hardware is now much faster, the gap between mobile devices and computers is still huge and browsing the web on a mobile device can still be rather frustrating experience. Unlike computers, which these days have large displays running at high resolutions and are coupled with mice which give users pixel-accurate cursor control, mobile devices still have tiny touch screens and pointer accuracy of around 400 square pixels&#8230; if you&#8217;re lucky enough to have pointy fingers.</p>
<p>And despite their differences we use both types of devices for accessing the same websites.</p>
<p>So you&#8217;d probably think that browsers running on mobile devices with their tiny screens, clumsy keyboards and imprecise pointer control would be the ones getting all the usability improvements and fancy automated features. But you&#8217;d be wrong. What&#8217;s curious to me is that despite the fact that mobile devices are the ones with highly obvious usability problems, desktop browsers &#8211; which are already much easier to use &#8211; are the ones getting all the improvements. <a href="http://www.teesoft.info/content/view/68/1/lang,en/">Autopager</a>, <a href="http://adblockplus.org/en/">Adblock</a>, <a href="http://www.greasespot.net/">Greasemonkey</a>, <a href="http://userstyles.org/stylish/">Stylish</a>, <a href="http://lab.arc90.com/experiments/readability/">Readability</a>/<a href="http://www.tidyread.com/">Tidyread</a>, Bookmarklets, <a href="http://www.microsoft.com/windows/internet-explorer/features/easier.aspx">Web slices</a>, <a href="http://www.microsoft.com/windows/internet-explorer/features/faster.aspx">Accelerators</a> and many others are features mobile users can only wish for<sup class='footnote'><a href='#fn-436-1' id='fnref-436-1'>1</a></sup>.</p>
<p>What about usability features specific to mobile browsers? Apart form the &#8220;.com&#8221; button on iPhone&#8217;s virtual keyboard I really can&#8217;t think of any. As a matter of fact, I&#8217;m having a difficult time thinking of a single user-facing feature available in today&#8217;s mobile browsers that wasn&#8217;t already present in Netscape Navigator in the mid 90s<sup class='footnote'><a href='#fn-436-2' id='fnref-436-2'>2</a></sup>.</p>
<p>So what can we do to bring mobile browsers into the modern times?</p>
<p><strong>1. The single most important feature need by mobile browsers is support for extensions.</strong></p>
<p>When was the last time you tried out an interesting mobile browser extension? I&#8217;d say never. Since most mobile browsers have no support for extensions whatsoever, you couldn&#8217;t do it even if you wanted to.</p>
<p>Once it&#8217;s possible to easily extend the browser anyone can start experimenting and adding features, but without that the existing browser is a dead end. Developers who want to add even a tiniest feature need to re-implement the whole browser functionality around the page rendering component. And I know from personal experience that doing this and then sneaking code for additional functionality in through the back door is a truly awful way of adding features. Not only is it a lot of work for the developer, but it&#8217;s also rather inconvenient and unlikely for users to try out a new browser.</p>
<p><strong>2. Mobile browsers need to become content aware.</strong></p>
<p>Now that the miracle of copy&amp;paste has finally arrived to the world of mobile phones, performing some tasks like moving an address from the browser into the maps application has become slightly easier. But is this really enough to keep us happy for the next few years? Even on desktop computers where performing such a task takes only a second, copying from the browser and pasting into another app is no longer considered good enough.</p>
<p>Internet Explorer 8 now supports accelerators (so does Firefox, via IE8 Activities add-on) which perform such tasks for you. They are not perfect, of course. One problem is that all accelerators are offered every time, even if they make no sense in the given context:</p>
<div id="attachment_438" class="wp-caption alignnone" style="width: 304px"><img class="size-full wp-image-438 " title="IE8 Accelerators" src="http://lexandera.com/wp-content/uploads/2009/06/ie8-accelerators.png" alt="IE8 Accelerators" width="294" height="159" /><p class="wp-caption-text">Suggested accelerators don&#39;t always make sense</p></div>
<p>This same problem will be bigger on mobile devices &#8211; once and if they gain support for accelerators. I predict that more accelerators will be needed due to the limited nature of the devices, but displaying them all won&#8217;t work very well on small screens. Which is where content awareness comes into play. If the browser knew what kind of content you just selected it could present you only with options which make sense at that moment. Even better &#8211; most of the time selecting the text could be skipped altogether since the browser would already know where something starts and ends and could attach accelerators to that piece of content in advance. It could even grab new accelerators online if it determines using them would make sense.</p>
<p>There are several ways content awareness could be implemented. Microformats and RDFa immediately spring to mind, but since they are about as common in the wild as pink flying giraffes, some other solutions would need to be found. Alternatives might include external content descriptions and extraction rules (possibly <a href="/2009/04/crowdsourcing-the-semantic-web/">crowdsourced</a>), downloadable sets of algorithms for detection, data extracted by services like <a href="http://developer.yahoo.com/yql/">YQL open data tables</a> or <a href="http://en.wikipedia.org/wiki/Natural_language_processing">NLP</a> services&#8230; But more about that some other time.</p>
<p>What I believe is important is that this content recognition should be performed by a centralized framework and available to all extensions so they don&#8217;t need to do their own parsing. Some basic work in this direction has been done with the Operator toolbar and Firefox&#8217;s support for Microformats, but in my opinion such functionality is much more needed in mobile browsers.</p>
<p><strong>3. Browsers need to start detecting and exposing available extensions</strong></p>
<p>You&#8217;re visiting a page that contains several events which can be added to your calendar and a table which can be displayed as a chart. Someone has created an alternative stylesheet which removes the huge header and there is also a mobile widget which allows you to interact with he same service in a more mobile-friendly way. But you&#8217;re never going to know about them and use them if your browser doesn&#8217;t notify you about their existence and make it easy to install and use them.</p>
<p><strong>4.  We need support for client-side content modification<br />
</strong><br />
Some might disagree, but I believe we do.</p>
<p>How many times have you had to zoom in just so you could click the link to the next page in a sequence of pages, or pan around to find where that huge header ends and content starts? You don&#8217;t need to put up with any of this if you&#8217;re browsing the web on a computer. All sorts of common annoyances can be solved by simple tweaks, and extensions for desktop browsers have been making it possible to do this for years. By augmenting, modifying and filtering content they not only make it easier to access content you&#8217;re interested in, but also <a href="/2009/05/the-future-is-in-the-ability-to-ignore/">make it possible to ignore</a> irrelevant parts of pages.</p>
<p>&#8211;</p>
<p>These are just some ideas about what the future of mobile browsers could look like. You might not agree with me on whether content awareness and even content modification are going to be important factors in the future of mobile browsing, but there&#8217;s one thing which is difficult to disagree with: a lot of work still needs to be done in order to turn mobile browsing into a user-friendly experience.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=a3e797fb-ff75-4032-b8f9-e128d814ee9d" alt="" /><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-436-1'>While iPhone&#8217;s browser does support bookmarklets, they&#8217;re still a royal pain to set up. <span class='footnotereverse'><a href='#fnref-436-1'>&#8617;</a></span></li>
<li id='fn-436-2'>I wanted to list pinch-to-zoom here but I realized it&#8217;s more of an OS feature than a browser feature. <span class='footnotereverse'><a href='#fnref-436-2'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/07/the-future-of-mobile-browsers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ultimate JavaScript minification</title>
		<link>http://lexandera.com/2009/05/ultimate-javascript-minification/</link>
		<comments>http://lexandera.com/2009/05/ultimate-javascript-minification/#comments</comments>
		<pubDate>Thu, 21 May 2009 09:00:23 +0000</pubDate>
		<dc:creator>Matjaž Lipuš</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Utilities]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=397</guid>
		<description><![CDATA[This is a guest post by Matjaž Lipuš, a social web geek, front-end web developer and semantic web enthusiast.
After developing some fat client applications using JavaScript frameworks I noticed how some code constantly repeats, making application footprint even bigger than necessary.
A while ago I (once again) stumbled upon article about helping the YUI Compressor. Article [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is a guest post by <a href="http://matjaz.info" target="_blank">Matjaž Lipuš</a>, a social web geek, front-end web developer and semantic web enthusiast.</em></p>
<p>After developing some <a href="http://en.wikipedia.org/wiki/Fat_client" target="_blank">fat client</a> applications using JavaScript frameworks I noticed how some code constantly repeats, making application footprint even bigger than necessary.<br />
A while ago I (once again) stumbled upon article about <a href="http://yuiblog.com/blog/2008/02/11/helping-the-yui-compressor/" target="_blank">helping the YUI Compressor</a>. Article is great and in large client side applications could really make a difference in final footprint considering these tips. I think this should be automated as much as possible, so I extended a list of this tips which could be fully automated. And here comes in the <a href="http://developer.yahoo.com/yui/compressor/" target="_blank">YUI Compressor</a> (YUIC).<br />
I am using YUIC for code minification. I also contributed some fixes and suggestions to the author &#8211; <a href="http://www.julienlecomte.net/" target="_blank">Julien Lecomte</a>. Those were implemented in past versions. YUIC is a great tool for code minification and munging. I believe it can be further extended and improved generating even smaller output. So here are my tips how to achieve this, ordered by complexity.</p>
<h3>Concatenate static strings with +</h3>
<p>If you have a big chunk of text to insert into page you would probably split it into multiple lines and making multiple strings. YUIC already has functionality concatenating static strings into one. So code like this:</p>
<pre name="code" class="javascript">
var x = &quot;This is &quot; +
        &quot;some text&quot;;
</pre>
<p>becomes:</p>
<pre name="code" class="javascript">
var x=&quot;This is some text&quot;;
</pre>
<p>Don not use arrays for this, because YUIC cannot tell you are actually concatenating strings.</p>
<h3>Variable declarations at the beginning of the function</h3>
<p>Scope in JavaScript is per function. So if you declare a variable twice in the same function, second time variable is just overridden with new value. As JSLint suggests you should declare all variables at the beginning of the function. Looking at this from minification view this means only one var statement! So instead of:</p>
<pre name="code" class="javascript">
function iterate(array) {
    var result = &quot;&quot;;
    for (var i=0, len=array.length; i&lt;len; i++) {
        var el = array[i];
        result += el + &quot;,&quot;;
    }
    return result;
}
</pre>
<p>write:</p>
<pre name="code" class="javascript">
function iterate(array) {
    var result = &quot;&quot;,
        i, len,
        el;
    for (i=0, len=array.length; i&lt;len; i++) {
        el = array[i];
        result += el + &quot;,&quot;;
    }
    return result;
}
</pre>
<p>You should note when declaring global variables there is no need for var statement at all.</p>
<h3>This as local variable</h3>
<p>Writing serious JavaScript code means writing object-oriented code. In JavaScript we access object members in conjunction with this keyword. This means a lot of this keywords.</p>
<pre name="code" class="javascript">
Person.prototype.getInfo = function()
{
    var result = &quot;&quot;,
        i, len;
    for (i=0,len=this.length; i&lt;len; i++) {
        result += this[i].name + &quot; &quot; + this[i]. surname + &quot; - &quot; + this [i].age;
    }
    return result;
};
</pre>
<p>Assigning this to a local variable means YUIC can munge local variable to a 1-3 letters which means smaller footprint.</p>
<pre name="code" class="javascript">
Person.prototype.getInfo = function()
{
    var x = this,
        result = &quot;&quot;,
        i, len;
    for (i=0,len=x.length; i&lt;len; i++) {
        result += x[i].name + &quot; &quot; + x[i]. surname + &quot; - &quot; + x[i].age;
    }
    return result;
};
</pre>
<p>You should note local variable must be declared first, as we could access members of this object in the following variables declaration/assignment.</p>
<pre name="code" class="javascript">
Person.prototype.getInfo = function()
{
    var x= this,
        result = &quot;&quot;,
        i, len = x.length;
    for (i=0; i&lt;len; i++) {
        result += x[i].name + &quot; &quot; + x[i]. surname + &quot; - &quot; + x[i].age;
    }
    return result;
};
</pre>
<p>You should also note using this as local variable is only reasonable when this keyword occurs at least two times per scope, but that is most of the time.</p>
<h3>Shorten numbers</h3>
<p>Although this seems to be strange it is simple to trim leading zero from decimal numbers. So instead of:</p>
<pre name="code" class="javascript">
var n1 = 0.1,
    n2 = -0.1;
</pre>
<p>you should write</p>
<pre name="code" class="javascript">
var n1 = .1,
    n2 = -.1;
</pre>
<h3>Common strings</h3>
<p>As with JavaScript frameworks and it&#8217;s hash style configs there is a lot of string repetition.</p>
<pre name="code" class="javascript">
var form = new MyForm({
    id: &quot;form&quot;,
    items: [{
        type: &quot;text&quot;,
        cls:  &quot;blue&quot;,
        name: &quot;name&quot;
    }, {
        type: &quot;text&quot;,
        cls: &quot;blue&quot;,
        name: &quot;surname&quot;
    }]
});
</pre>
<p>This code can be minified (in a inner scope) as:</p>
<pre name="code" class="javascript">
var textString = &quot;text&quot;,
    blueString = &quot;blue&quot;,
    form = new MyForm({
    id: &quot;form&quot;,
    items: [{
        type: textString,
        cls: blueString,
        name: &quot;name&quot;
    }, {
        type: textString,
        cls: blueString,
        name: &quot;surname&quot;
    }]
});
</pre>
<p>A special caution must be given to a strings declared as variables as they can be changed. So we cannot use this variable as a constant. These two strings should be separated into two variables unless we are sure value has not been changed until constant string usage.<br />
We could go even further by moving common strings to outer most scope which uses this string and accessing it in inner scopes with closures and even further replacing substrings (in this case »name«). This raises a question about performance penalties doing string concatenation.</p>
<h3>Repeating access to object members</h3>
<pre name="code" class="javascript">
function focusInput()
{
	if (this.msgInput) {
		this.msgInput.focus();
	}
}
</pre>
<p>this could without any problem been written as</p>
<pre name="code" class="javascript">
function focusInput()
{
	var msgInput = this.msgInput;
	if (msgInput) {
		msgInput.focus();
	}
}
</pre>
<h3>Shorten object&#8217;s member access</h3>
<p>JavaScript libraries have a nice namespace convention, but in a large usage of library you get a lot of code repetition.</p>
<pre name="code" class="javascript">
var store  = new Lib.data.Store(),
    record = new Lib.data.Record();
store.add(record);
</pre>
<p>We can see a common namespace is Lib.data which can be shorten by assigning to a variable</p>
<pre name="code" class="javascript">
var Data   = Lib.data,
    store  = new Data.Store(),
    record = new Data.Record();
store.add(record);
</pre>
<p>There could even be further improvements if we are dealing with (static) object which does not have this key word in the function. Good example is the utility function JSON.stringify(), which can be assigned to a local variable.</p>
<pre name="code" class="javascript">
var toJSON  = JSON.stringify,
    result1 = toJSON(obj1),
    result2 = toJSON(obj2);
</pre>
<h3>Shorten object&#8217;s member names</h3>
<p>While using namespaces is good in an organizational way it means a lot of code for just accessing object. The idea is to shorten object&#8217;s member names. So instead of</p>
<pre name="code" class="javascript">
function Person(name, surname)
{
    this.firstName = name;
    this.lastName  = surname;
}
Person.prototype.getFullName = function()
{
    return this.firstName  + &quot; &quot; + this.lastName;
};
</pre>
<p>code looks like</p>
<pre name="code" class="javascript">
function Person(name, surname)
{
    this.a = name;
    this.b = surname;
}
Person.prototype.c = function()
{
    return this.a + &quot; &quot; + this.b;
};
</pre>
<p>This is only reasonable for automated process, although keeping short member names can also save a lot of bytes.<br />
You should keep in mind that you must replace member access in all places, this means where they are defined (set) and used. You also cannot shorten reserved members such as Array&#8217;s length or documents getElementsById.<br />
So a good idea would probably be keeping a white list of members which should (not) get munged.</p>
<p>I was already doing some work in YUIC about variable declarations at the beginning of the function, shorten numbers and common strings, but it is not 100% stable, although I successfully minified some of the JS libraries.<br />
Also I did not measure any performance penalties of these tips, but it would be interested to see some.<br />
You should note that this would best perform if code is also <a href="http://jslint.com/" target="_blank">JSLint</a> compliant.</p>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/05/ultimate-javascript-minification/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A proposal for symbiosis between Wolfram Alpha and Wikipedia</title>
		<link>http://lexandera.com/2009/05/a-proposal-for-symbiosis-between-wolfram-alpha-and-wikipedia/</link>
		<comments>http://lexandera.com/2009/05/a-proposal-for-symbiosis-between-wolfram-alpha-and-wikipedia/#comments</comments>
		<pubDate>Sat, 16 May 2009 20:30:22 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Mashup]]></category>
		<category><![CDATA[Symbiosis]]></category>
		<category><![CDATA[Wikipedia]]></category>
		<category><![CDATA[Wolfram Alpha]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=374</guid>
		<description><![CDATA[Attention, please!
Wolfram Alpha is not a Google killer!
Wolfram Alpha is not a Wikipedia killer!
Wolfram Alpha does not want to dismember any company and bathe itself in its blood!
Please ignore unimaginative claims made by linkbait authors. Let&#8217;s forget the 1999&#8217;s prehistoric &#8220;me kill&#8221; mentality and focus instead on more peaceful opportunities. We now live in the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Attention, please!</strong></p>
<p><a class="zem_slink" title="Wolfram Alpha" rel="homepage" href="http://www.wolframalpha.com">Wolfram Alpha</a> is not a Google killer!<br />
Wolfram Alpha is not a Wikipedia killer!<br />
Wolfram Alpha does not want to dismember any company and bathe itself in its blood!</p>
<p>Please ignore unimaginative claims made by linkbait authors. Let&#8217;s forget the 1999&#8217;s prehistoric &#8220;me kill&#8221; mentality and focus instead on more peaceful opportunities. We now live in the age of mash-ups, so here&#8217;s my modest proposal for symbiosis between Wolfram Alpha and Wikipedia.</p>
<p>The opportunity for symbiosis comes from their different strengths. Wolfram Alpha&#8217;s FAQ section gives a very clear description of how it compares to Wikipedia:</p>
<blockquote><p>Wikipedia gives you pages of narrative about topics. Wolfram|Alpha computes answers to specific questions you ask, just giving facts, not narrative. Wolfram|Alpha often includes sidebar links to Wikipedia.</p></blockquote>
<p>Wikipedia describes a concept; Wolfram Alpha gives you the ability to try out that concept in practice.</p>
<p>And because everything needs a car analogy&#8230;<br />
Wikipedia is like a car magazine and Wolfram Alpha is like a car simulator. You can open a magazine and read more about a car you just took for a virtual test drive, or start with the magazine and go for a ride in a car you just read about.</p>
<p>You can see in the above quote that one-way links from Wolfram Alpha to Wikipedia already exist. What&#8217;s still missing are connections from Wikipedia to Wolfram Alpha, which might one day look like this:</p>
<div id="attachment_384" class="wp-caption alignnone" style="width: 550px"><a href="http://lexandera.com/wp-content/uploads/2009/05/wolfram_wiki_2.png"><img class="size-full wp-image-384" title="Wolfram Alpha / Wikipedia mash-up." src="http://lexandera.com/wp-content/uploads/2009/05/wolfram_wiki_2.png" alt="A hypothetical Wolfram Alpha / Wikipedia mash-up. Click for full size." width="540" height="506" /></a><p class="wp-caption-text">A hypothetical Wolfram Alpha / Wikipedia mash-up. Click for full size.</p></div>
<p>There you have it. Wolfram Alpha and Wikipedia can not olny coexist peacefully, they can help each other. No need to argue about who is going to kill who.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=1836b049-1a70-4d58-ae85-ad55e6e94f57" alt="" /><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/05/a-proposal-for-symbiosis-between-wolfram-alpha-and-wikipedia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The future is in the ability to ignore</title>
		<link>http://lexandera.com/2009/05/the-future-is-in-the-ability-to-ignore/</link>
		<comments>http://lexandera.com/2009/05/the-future-is-in-the-ability-to-ignore/#comments</comments>
		<pubDate>Thu, 07 May 2009 06:18:10 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Clay Shirky]]></category>
		<category><![CDATA[Filter failure]]></category>
		<category><![CDATA[Information overload]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Steve Gillmor]]></category>
		<category><![CDATA[TechCrunch]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=362</guid>
		<description><![CDATA[&#8220;It’s time to get completely off RSS and switch to Twitter. RSS just doesn’t cut it anymore.&#8221;, says Steve Gillmor in his Techcrunch post titled &#8220;Rest in Peace, RSS&#8220;. 
While most commenters see his rant as a sign of the old man slowly losing his mind, it is also a sign of another thing: filter [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;It’s time to get completely off RSS and switch to Twitter. RSS just doesn’t cut it anymore.&#8221;, says <a class="zem_slink" href="http://www.crunchbase.com/person/steve-gillmor" title="Steve Gillmor" rel="crunchbase">Steve Gillmor</a> in his Techcrunch post titled &#8220;<a href="http://www.techcrunchit.com/2009/05/05/rest-in-peace-rss/">Rest in Peace, RSS</a>&#8220;. </p>
<p>While most commenters see his rant as a sign of the old man slowly losing his mind, it is also a sign of another thing: filter failure. Filter failure is what causes information overload and was also the topic of <a class="zem_slink" href="http://en.wikipedia.org/wiki/Clay_Shirky" title="Clay Shirky" rel="wikipedia">Clay Shirky</a>&#8217;s <a class="zem_slink" href="http://web20expo.com" title="Web 2.0 Expo" rel="homepage">Web 2.0 Expo</a> keynote in NYC, which you can watch below:</p>
<p><embed src="http://blip.tv/play/gshVzq1XhrwN" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="390"></embed> </p>
<p>So what&#8217;s happening here?</p>
<p>RSS readers are partially recreating the conditions which make reading email such a chore. They require you to check them every so often, read all the messages and make sure that the number of unread messages goes down to zero and stays there! But it never does. Every time you check your reader, there are new messages waiting and demanding your attention, even though they don&#8217;t really need it. Posts worth reading are lost among dozens which are not. After a while you start drowning in a flood of content you&#8217;re not interested in, you become overloaded and you don&#8217;t even bother unsubscribing from the feeds, you just stop checking your RSS reader altogether.</p>
<p>You switch over to twitter where all the links you see are already pre-filtered by other people. Think about it &#8211; in order for a link to end up in your Twitter stream, somebody must have already read the article and decided it was worth sharing. In addition to this, your previous experience tells you whose links are worth clicking and whose not. And yes, there is a new lump of messages waiting for you every time you log into Twitter and their number is very likely to be overwhelming, but Twitter has no &#8220;unread count&#8221; which would force you to check every single tweet and doesn&#8217;t have a &#8220;mark all as read&#8221; button which would make you feel like you were missing something every time you used it. It allows you to check as many messages as you want to and doesn&#8217;t demand anything from you.</p>
<p>Or as Stephen Baker <a href="http://www.businessweek.com/the_thread/blogspotting/archives/2009/05/why_twitter_cat.html">puts it</a>:</p>
<blockquote><p>On Twitter, each of us can recommend a link. If you have 500 followers, maybe 50 of them see it. Maybe five of them take a look. Let’s say two appreciate it. The other three may be less likely to open your links in the future. Maybe one will “unfollow” you. But that’s ok. Each of us finds our own audience. But the key is that there’s little guilt or obligation associated with Twitter. It’s a managed pool of serendipity.</p></blockquote>
<p>In some cases filters alone are no longer enough to avoid information overload. We also need a way of ignoring what can safely be ignored.</p>
<div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"><img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=77f078c4-1098-4ae2-be8b-4af8752001bf"><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>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/05/the-future-is-in-the-ability-to-ignore/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>On named parameters</title>
		<link>http://lexandera.com/2009/05/on-named-parameters/</link>
		<comments>http://lexandera.com/2009/05/on-named-parameters/#comments</comments>
		<pubDate>Mon, 04 May 2009 04:07:30 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Autocomplete]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[Named parameters]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=352</guid>
		<description><![CDATA[Here&#8217;s a proof that quitting your job and not working on anything for two months is not good for you: I just spent two days pondering why named function parameters are loved by coders and considered an important part of many programming languages while named parameters in URLs are considered to be ugly, harmful and [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a proof that quitting your job and not working on anything for two months is not good for you: I just spent two days pondering why named function parameters are loved by coders and considered an important part of many programming languages while named parameters in URLs are considered to be ugly, harmful and one of the leading causes of scurvy. Developers will even find a way to emulate named function parameters in languages which don&#8217;t support them by default while at the same time they will try their best to make all the parameters in URLs of their websites strictly positional. It makes everyone look a bit confused and bipolar, if you ask me.</p>
<p>Here&#8217;s a quick overview of the situation.</p>
<p>Named parameters in URLs: BAD<br />
<em><span><span> http://domain.com/list?type=fruit&amp;page=1&amp;items=20</span></span></em></p>
<p>Positional parameters in URLs: GOOD<br />
<em><span><span> http://domain.com/list/fruit/1/20</span></span></em></p>
<p>Named parameters in function calls: GOOD<br />
<em>foo.list(:type =&gt; &#8220;fruit&#8221;, :page =&gt; 1, :items =&gt; 20)</em></p>
<p>Why is this so? It might have more than just a little bit to do with the fact that coders spend a lot of their time reading, writing and modifying function calls, while URLs are only rarely modified by anyone (or even read, for that matter). The need to modify URLs is so rare in fact that many security holes exist only because developers never even remotely considered that someone might insert an unfriendly value into one of the parameters. It makes sense then that if URLs are only meant to be looked at, to make them short and pretty and clean of any characters which make them appear as if they&#8217;ve been involved in an explosion at the ASCII factory.</p>
<p>Why then is the URL, this unfriendly sequence of characters, still presented as a fully editable value? Is it really not possible to turn it into anything more than a barely readable &#8220;you are here&#8221; sign?</p>
<p>Microsoft managed to do something interesting with the way directory paths (URL&#8217;s distant relatives) are displayed in Vista and Windows 7: each directory is a separate button and clicking any one of them takes you directly to that directory.</p>
<div id="attachment_354" class="wp-caption alignnone" style="width: 489px"><img class="size-full wp-image-354" title="Windows explorer in Vista" src="http://lexandera.com/wp-content/uploads/2009/05/urlbar-vista-path.png" alt="Windows explorer in Vista" width="479" height="55" /><p class="wp-caption-text">Two different ways of displaying the same directory path</p></div>
<p>Couldn&#8217;t something similar be done for URLs? Here&#8217;s my suggestion: make it easy to experiment with different parameter values. Hide all the &#8220;noise&#8221; characters. Turn each key/value pair into a button and offer alternative values when somebody clicks them.</p>
<p><img class="alignnone size-full wp-image-355" title="Location bar" src="http://lexandera.com/wp-content/uploads/2009/05/urlbar-builder.png" alt="Location bar" width="481" height="87" /></p>
<p>Now, this might not catch on with your average Joe Streetperson, but it does look like it could be useful to developers when they are testing a website or a web service which returns different XML/JSON based on parameter values.</p>
<p>Think of it as <a class="zem_slink" title="IntelliSense" rel="wikipedia" href="http://en.wikipedia.org/wiki/IntelliSense">Intellisense</a> for the location bar.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=2a9c2d7e-a319-43b2-9f0c-bffe5f520223" alt="" /><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/05/on-named-parameters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crowdsourcing the semantic web</title>
		<link>http://lexandera.com/2009/04/crowdsourcing-the-semantic-web/</link>
		<comments>http://lexandera.com/2009/04/crowdsourcing-the-semantic-web/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 03:08:30 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Semantic Web]]></category>
		<category><![CDATA[Browser extension]]></category>
		<category><![CDATA[Chicken and egg]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[RDFa]]></category>
		<category><![CDATA[Semantic tagging]]></category>
		<category><![CDATA[Tagging]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=329</guid>
		<description><![CDATA[This is getting a bit old, isn&#8217;t it? Even after years and years of hearing about the semantic web, the actual semantic metadata is still an extremely rare occurrence on the web. It&#8217;s obvious that our current approach to building the linked data cloud is just not working.
Currently, all attempts at providing semantic metadata require [...]]]></description>
			<content:encoded><![CDATA[<p>This is getting a bit old, isn&#8217;t it? Even after years and years of hearing about the semantic web, the actual semantic metadata is still an extremely rare occurrence on the web. It&#8217;s obvious that our current approach to building the linked data cloud is just not working.</p>
<p>Currently, all attempts at providing semantic metadata require server-side changes which means that we need to rely on page authors to implement them. This, of course, is a major obstacle. But what if we could change that? What if we could bypass page authors and have the crowd add semantic metadata to existing pages?</p>
<p>I believe that this is more than possible.</p>
<p>Semantic metadata would usually be added to web pages by adding additional attributes to HTML elements or creating new elements where needed. But as it turns out, existing web pages are already broken up into a surprising number of elements, so why not just use these?</p>
<p>Let&#8217;s take this search result from Amazon as an example:</p>
<div id="attachment_331" class="wp-caption alignnone" style="width: 751px"><img class="size-full wp-image-331" title="Block tagging example" src="http://lexandera.com/wp-content/uploads/2009/04/block-tagging-example1.png" alt="Block tagging example" width="741" height="115" /><p class="wp-caption-text">Relax, it&#39;s just a mock-up. Let&#39;s please resist arguing about the correctness of the labels.</p></div>
<p>Everything in the above image you see having a blue border is already a separate HTML block, addressable using an <a class="zem_slink" title="XPath" rel="wikipedia" href="http://en.wikipedia.org/wiki/XPath">XPath</a> expression. In order to attach a meaning to a block, we could use this XPath expression and associate it with a meaning, like this:</p>
<p><strong>//div[@class="productData"]/div[@class="productTitle"]/a = &#8220;Book:Title&#8221;</strong></p>
<p>Behind the scenes URIs from an OWL based ontology would be used instead of simple text labels. These mappings could then be uploaded to a server and made available to anyone.</p>
<p>So let&#8217;s forget forget about convincing thousands of web developers to learn and start using semantic markup. Forget Microformats. Forget <a class="zem_slink" title="RDFa" rel="wikipedia" href="http://en.wikipedia.org/wiki/RDFa">RDFa</a>. Everything about the semantic web boils down to one thing: reusable data. And existing data already published on the web can be made reusable by the crowd, using simple tools. Within a year we could have thousands of reusable semantic data sources!</p>
<h3>Possible uses</h3>
<p>Once we have a large collection of rules for determining what the data inside a certain HTML block represents, what can we do with them?</p>
<p>We can begin by creating an application which knows how to extract data from web pages and transform it into various formats like the original HTML with RDFa mixed in, pure RDF, RSS and others. That&#8217;s right &#8211; we can still have RDF and therefore compatibility with existing and future data published in the same format! This would also create a business opportunity for hosted RDF services, similar to how Feedburner is hosting RSS feeds. A service could even be created for hosting SPARQL endpoints.</p>
<p><img class="alignnone size-full wp-image-333" title="Diagram 1" src="http://lexandera.com/wp-content/uploads/2009/04/slurpy_mix_diagram-copy2.png" alt="Diagram 1" width="397" height="350" /></p>
<p>What about some uses that would benefit the regular people instead of just linked data nerds?</p>
<p>I believe that one area which desperately needs semantic metadata is mobile web browsing. Limited screen sizes and tiny or even virtual keyboards make tasks which are trivial to perform using a desktop computer a real chore on mobile devices. With semantic metadata, mobile browsers could be much more context-aware and could offer a better browsing experience. Please see my experimental browser <a href="/mosembro/">Mosembro</a> for more information on that topic.</p>
<p><img class="alignnone size-full wp-image-334" title="Diagram 2" src="http://lexandera.com/wp-content/uploads/2009/04/slurpy_mobile_diagram2-copy.png" alt="Diagram 2" width="563" height="297" /></p>
<p>Some other things which would suddenly become easy to implement:</p>
<ul>
<li> Automatic browser-generated mashups. Put a map next to any address, a &#8220;find on Amazon&#8221; link next to any book, etc.</li>
<li> Ad-hoc personal search and comparison engines: search all international Amazon stores, search used car ads on multiple sites or find all the 26&#8243; screens costing less than 400€ by pulling in data from several electronics retailers and then filtering it.</li>
<li> Autonomous agents that notify you when one of your favorite travel agencies posts a last minute offer that matches your criteria.</li>
<li> Site-level search integrated into the browser (by using semantically tagged search forms). I never want to use browser&#8217;s &#8220;find in page&#8221; functionality again just to locate the search form! And since there would also be semantic metadata for search results available, local search results could then be combined with Google search results for that same domain.</li>
<li>Autofill for all kinds of forms.</li>
<li>Custom RSS feeds from any source, filtered by any set of criteria. (show Hacker news feed filtered by your favorite posters, or only posts with more than 5 comments)</li>
<li> Backup tool for your data stored in web apps: store tagged content in a reusable format; then import it into another app (which can also be automated using tagged input forms).</li>
<li> <a id="al08" title="Data portability" href="http://dataportability.org/">Data portability</a></li>
<li>Pretty much anything else promised by Microformats and RDFa advocates. The list goes on and on.</li>
</ul>
<p>I suggest you also have a look at <a href="http://www.adaptivepath.com/aurora/">demo videos for the Aurora browser concept</a>, as they are full of great examples of what would be possible if lots of semantic metadata was available.</p>
<p>At this point you might be thinking: &#8220;This sounds nice and all, but it&#8217;s never going to work&#8221;, so here&#8217;s a closer look at two existing browser extensions which are based on similar approaches.</p>
<h3>Extension 1: Autopager</h3>
<p><a href="http://autopager.mozdev.org/">Autopager</a> is a Firefox extension which automatically loads the next page of a site inline when you reach the end of the current page. It&#8217;s interesting for us because it uses XPath expressions for addressing HTML blocks, user generated rules and a central server for sharing those rules.</p>
<p>In order for it to do its thing, Autopager only needs to know two things:</p>
<ul>
<li> which page element is the link to the next page</li>
<li> which element represents the contents of the page.</li>
</ul>
<p>This is done using XPath expressions, like shown in the image below:</p>
<p><img class="alignnone size-full wp-image-336" title="Autopager" src="http://lexandera.com/wp-content/uploads/2009/04/autopager-xpath-expressions1.png" alt="Autopager" width="502" height="110" /></p>
<p>Autopager is very popular and is an excellent proof that this approach works &#8211; at least for simple tasks such as sharing rules for locating the &#8220;next page&#8221; link.</p>
<h3>Extension 2: Intel Mash Maker</h3>
<p><img class="alignnone size-full wp-image-337" title="Intel logo" src="http://lexandera.com/wp-content/uploads/2009/04/ddmqm7j6_24d4mc3kgq_b.gif" alt="Intel logo" width="127" height="51" /></p>
<p><img class="alignnone size-full wp-image-338" title="Mash Maker logo" src="http://lexandera.com/wp-content/uploads/2009/04/ddmqm7j6_23fjqwrcgm_b.gif" alt="ddmqm7j6_23fjqwrcgm_b" width="192" height="29" /></p>
<p>Intel&#8217;s <a href="http://mashmaker.intel.com/web/">Mash Maker</a> is also a Firefox extension and it comes remarkably close to the idea described above. Poking at the <a href="http://mashmaker.intel.com/v18/domaininfo.php?domain=amazon.com&amp;cachehack=0">JSON encoded data returned by its web service</a> reveals that it also uses XPath expressions for addressing HTML elements. It also makes it possible to further narrow down the selection using regular expressions to only capture a part of the element&#8217;s contents. The part where it falls short, though, is that it only uses plain text lables instead of URIs for defining the meaning of blocks. This unfortunately makes the definitions pretty much unusable outside of their mashup platform.</p>
<p>Unfortunately, the project appears to be dead or on hold. The newest user contributed mashup is more than two months old and the latest blog entry was posted more than a year ago. But it still is worth checking out and it does prove that this approach can be implemented to handle more complex situations than those from the Autopager example.</p>
<h3>Finally&#8230;</h3>
<p>There you have it, folks: a simple and straightforward way of solving the semantic web&#8217;s chicken and egg problem if perfectly within our reach.</p>
<p>The question now is who would be willing to sponsor such a project?</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/pixy.gif?x-id=277e70ef-440f-4974-8af8-f350a96221d9" alt="" /><span class="zem-script more-related"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/04/crowdsourcing-the-semantic-web/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Reinventing the wheel: the fluent interface design pattern</title>
		<link>http://lexandera.com/2009/04/reinventing-the-wheel-the-fluent-interface-design-pattern/</link>
		<comments>http://lexandera.com/2009/04/reinventing-the-wheel-the-fluent-interface-design-pattern/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 15:56:31 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fluent interface]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[reinventing the wheel]]></category>
		<category><![CDATA[with]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=316</guid>
		<description><![CDATA[What&#8217;s the fluent interface design pattern? It&#8217;s a design pattern which became very visible in recent time, mainly due to jQuery, which was designed around it. In this pattern, class methods return the same object they were called on (they end with &#8220;return this;&#8221;), which makes it possible to chain them. It also makes it [...]]]></description>
			<content:encoded><![CDATA[<p>What&#8217;s the <a href="http://martinfowler.com/bliki/FluentInterface.html">fluent interface</a> design pattern? It&#8217;s a design pattern which became very visible in recent time, mainly due to <a class="zem_slink" title="JQuery" rel="homepage" href="http://jquery.com/">jQuery</a>, which was designed around it. In this pattern, class methods return the same object they were called on (they end with &#8220;return this;&#8221;), which makes it possible to chain them. It also makes it easily spottable in code, due to the distinctive outline created by chained methods.</p>
<p>Let&#8217;s have a quick look at what I&#8217;m talking about.</p>
<p>If Java Swing libraries supported this kind of coding, then the following block of java code, copied from <a href="http://asserttrue.blogspot.com/2009/04/swing-versus-death-by-paper-cut.html">a random blog post</a>, could be rewritten from this repetitive sequence:</p>
<pre name="code" class="java">

JFrame mainFrame = new JFrame(&quot;Hello World&quot;);
mainFrame.add(label, BorderLayout.CENTER);
mainFrame.addWindowListener(new MainFrameListener());
mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
</pre>
<p>&#8230;to this chain of methods:</p>
<pre name="code" class="java">

new JFrame(&quot;Hello World&quot;)
    .add(label, BorderLayout.CENTER)
    .addWindowListener(new MainFrameListener())
    .setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE)
    .pack()
    .setLocationRelativeTo(null)
    .setVisible(true);
</pre>
<p>It&#8217;s amazing how much cleaner the code looks just by eliminating all those mainFrame references.</p>
<p>But wait&#8230; doesn&#8217;t this look familiar from somewhere? Doesn&#8217;t it remind you of a certain language feature you may have used years ago?</p>
<p>Yes, you&#8217;re right! It looks remarkably like the &#8220;with&#8221; control structure available in <a href="http://www.delphibasics.co.uk/RTL.asp?Name=With">Delphi/Pascal</a> and <a href="http://msdn.microsoft.com/en-us/library/wc500chb%28VS.71%29.aspx">VisualBasic</a>! If Java also supported it, the above example could be rewritten like this:</p>
<pre name="code" class="java">

with (new JFrame(&quot;Hello World&quot;)) {
    add(label, BorderLayout.CENTER);
    addWindowListener(new MainFrameListener());
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
}
</pre>
<p>It looks almost almost exactly the same as the one using the fluent interface, doesn&#8217;t it?</p>
<p>The main difference is that such a built-in construct works with any object you happen to throw at it, doesn&#8217;t require any additional effort from the library designer, and doesn&#8217;t require you to write repetitive code or wrapper classes if the library author failed to include the fluent interface pattern into the library in the first place. It also doesn&#8217;t interfere with the <a href="http://en.wikipedia.org/wiki/Command-query_separation">command-query separation principle</a> and is perfectly compatible with step through debuggers.</p>
<p>But the fluent interface pattern does make it possible for us to have a special name for a simple concept, a Wikipedia entry for it, and dozens of blog posts about a solution to a problem that&#8217;s been solved, in a better way, decades ago.</p>
<div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"><img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=0d2ac358-b3a3-470d-b238-13d1e79d34b7"><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>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/04/reinventing-the-wheel-the-fluent-interface-design-pattern/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>How is Mosembro different from OilCan?</title>
		<link>http://lexandera.com/2009/02/how-is-mosembro-different-from-oilcan/</link>
		<comments>http://lexandera.com/2009/02/how-is-mosembro-different-from-oilcan/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 03:42:24 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mosembro]]></category>
		<category><![CDATA[Microformat]]></category>
		<category><![CDATA[OilCan]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=286</guid>
		<description><![CDATA[



Image via Wikipedia



If you looked at OilCan &#8211; a Greasemonkey-like browser extension for Android &#8211; and Mosembro, you&#8217;d quickly realize that they have a lot in common. Both are experimental browser extensions which run on Android, both aim to make websites friendlier, both support installable actions written in JavaScript, and both make it possible for [...]]]></description>
			<content:encoded><![CDATA[<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 212px;">
<dt class="wp-caption-dt"><a href="http://en.wikipedia.org/wiki/Image:Android-logo.svg"><img title="Alternate logo." src="http://upload.wikimedia.org/wikipedia/en/thumb/c/c2/Android-logo.svg/202px-Android-logo.svg.png" alt="Alternate logo." width="202" height="202" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image via <a href="http://en.wikipedia.org/wiki/Image:Android-logo.svg">Wikipedia</a></dd>
</dl>
</div>
</div>
<p>If you looked at <a href="http://www.jsharkey.org/blog/2008/12/15/oilcan-greasemonkey-on-steroids-for-android/">OilCan</a> &#8211; a <a class="zem_slink" title="Greasemonkey" rel="homepage" href="http://www.greasespot.net">Greasemonkey</a>-like browser extension for <a class="zem_slink" title="Android" rel="homepage" href="http://code.google.com/android/">Android</a> &#8211; and <a href="/mosembro/">Mosembro</a>, you&#8217;d quickly realize that they have a lot in common. Both are experimental browser extensions which run on Android, both aim to make websites friendlier, both support installable actions written in JavaScript, and both make it possible for those scripts to modify web pages and launch other applications. And since looking at OilCan&#8217;s source code has allowed me to avoid reinventing the wheel at several occasions, some pretty obvious similarities can also be spotted at the source code level.</p>
<p>So, with so many things in common, how are they different at all?</p>
<p>The main difference, I believe, is what causes user scripts to be triggered. A typical OilCan script is triggered by a web page&#8217;s URL and is executed only once. Its goal is to change the content or functionality of a very specific document. Mosembro scripts, on the other hand, are triggered by embedded microformats and can be executed dozens of times for each page, while not caring about which page they were executed on.</p>
<p>I could say at this point that OilCan&#8217;s approach to invoking scripts could be compared to function calls in programming languages and Mosembro&#8217;s approach compared to what is done in aspect oriented programming, with functionality implemented by actions attached to bits of semantic content being <a href="http://en.wikipedia.org/wiki/Cross-cutting_concern">cross-cutting concerns</a>, but I&#8217;m not sure about it, so I won&#8217;t. ;-)</p>
<p>Also, because Mosembro is very narrowly focused on adding functionality to web pages based on semantic data embedded in them it can also provide additional infrastructure, like microformat parsers and action menus, which wouldn&#8217;t exactly fit in with a more general purpose framework. And finally, there&#8217;s the integrated support for site-level search.</p>
<p>So, there you have it. While it&#8217;s true that both apps have a lot in common, it&#8217;s their unique features that really matter.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/c8ae4d89-28da-43e3-8556-0ee417dbfa47/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=c8ae4d89-28da-43e3-8556-0ee417dbfa47" alt="Reblog this post [with Zemanta]" /></a></div>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/02/how-is-mosembro-different-from-oilcan/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mosembro r5 now available for download</title>
		<link>http://lexandera.com/2009/02/mosembro-r5-now-available-for-download/</link>
		<comments>http://lexandera.com/2009/02/mosembro-r5-now-available-for-download/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 19:59:46 +0000</pubDate>
		<dc:creator>Aleksander Kmetec</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mobile web]]></category>
		<category><![CDATA[Mosembro]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://lexandera.com/?p=275</guid>
		<description><![CDATA[The first major Mosembro release after r2 is now available for download.
If you already have Mosembro installed, uninstall it first by running: adb uninstall com.lexandera.mosembro
The new version can then be installed by executing the following command: adb install mosembro-r2.apk
New features include:

It is now possible to install addidional actions which extend Mosembro&#8217;s functionality.
Addresses can be copied [...]]]></description>
			<content:encoded><![CDATA[<p>The first major <a href="/mosembro/">Mosembro</a> release after r2 is now <a href="http://code.google.com/p/mosembro/downloads/list">available for download</a>.</p>
<p>If you already have Mosembro installed, uninstall it first by running: adb uninstall com.lexandera.mosembro<br />
The new version can then be installed by executing the following command: adb install mosembro-r2.apk</p>
<p>New features include:</p>
<ul>
<li>It is now possible to install addidional actions which extend Mosembro&#8217;s functionality.</li>
<li>Addresses can be copied to clipboard.</li>
<li>Improved security and various bugfixes.</li>
</ul>
<p>Screenshots of new features:</p>
<div id="attachment_277" class="wp-caption alignnone" style="width: 610px"><img class="size-full wp-image-277" title="Mosmbro r5 screenshots" src="http://lexandera.com/wp-content/uploads/2009/02/r5screenshots.png" alt="Mosmbro r5 screenshots" width="600" height="289" /><p class="wp-caption-text">Mosembro r5: dialogs for installing and managing installed actions</p></div>
<p>Several simple actions can be installed from the bottom of the <a href="http://lexandera.com/mosembrodemo/">demo page</a> which is loaded when Mosembro starts up. Go &amp; try them out.</p>
]]></content:encoded>
			<wfw:commentRss>http://lexandera.com/2009/02/mosembro-r5-now-available-for-download/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
