<?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; Opera Unite</title>
	<atom:link href="http://michaelodden.com/category/opera-unite/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>Opera Unite: Convenient tips and snippets for developers</title>
		<link>http://michaelodden.com/opera-unite/opera-unite-convenient-tips-and-snippets-for-developers/</link>
		<comments>http://michaelodden.com/opera-unite/opera-unite-convenient-tips-and-snippets-for-developers/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 19:38:35 +0000</pubDate>
		<dc:creator>michaelo</dc:creator>
				<category><![CDATA[Opera Unite]]></category>

		<guid isPermaLink="false">http://michaelodden.com/?p=301</guid>
		<description><![CDATA[Well, as I&#8217;m keeping on with my experiments with Opera Unite I continue to make notes, and perhaps some other developers out there might come across the same issues as well. Here is how to implement &#8220;data-if&#8221;, some debugging-tips and a patched Markuper amongst others. Introducing a basic &#8220;data-if&#8221; in Markuper The Markuper has a [...]

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/adventures-in-opera-unite/' rel='bookmark' title='Permanent Link: Adventures in Opera Unite'>Adventures in Opera Unite</a></li>
<li><a href='http://michaelodden.com/webdevelopment/tip-of-the-day-loose-comparisons-in-php-gives-edgy-behaviour/' rel='bookmark' title='Permanent Link: Tip of the day: Loose comparisons in PHP gives edgy behaviour'>Tip of the day: Loose comparisons in PHP gives edgy behaviour</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Well, as I&#8217;m keeping on with my experiments with Opera Unite I continue to make notes, and perhaps some other developers out there might come across the same issues as well.</p>
<p>Here is how to implement &#8220;data-if&#8221;, some debugging-tips and a patched Markuper amongst others.</p>
<p><span id="more-301"></span></p>
<h2>Introducing a basic &#8220;data-if&#8221; in Markuper</h2>
<p>The Markuper has a great, simple method of adding custom attributes to determine whether or not keep an arbitrary element and it&#8217;s content. You may already know the &#8220;<strong>data-keep-if</strong>&#8220;-attribute, now &#8211; here is &#8220;<strong>data-if</strong>&#8220;, a tad more flexible:</p>
<pre name="code" class="javascript">/**
Author: Michael Odden
Email: me@michaelodden.com

A simple example of an extension of Opera's Markuper - a Unite JavaScript template-library:
Implementing the "if"-operator, allowing for boolean expressions, and does only show
the element if the value is true.

To allow variables in the expressions, you'll have to download the patched Markuper, currently found at:

http://michaelodden.com/files/unite/template.js

See blogpost for details:

http://michaelodden.com/opera-unite/opera-unite-convenient-tips-and-snippets-for-developers

NB! You should not include data in the attribute which you don't controll 100%, as the method
is currently using "eval". Yup, bad, I know. I'm working on a better approach.

= USAGE:

- In the server side JavaScript, where you initiate the Markuper:

var data = {"sum":101};
var template = new Markuper("path/to/template.html", data);
template.registerDataAttribute('if', dataAttrIf);

- In the template:
&lt;div data-if="{{sum}}&gt;100"&gt;
&lt;p&gt;The sum is more than 100&lt;/p&gt;
&lt;/div&gt;

*/

function dataAttrIf(node, data, key) {
	node.removeAttribute("data-if"); // Remove the attribute, leaving no trails
	if(!eval(key)) {
		node.remove(); // remove the node
		return false; // avoid processing the contents of the node
	}
}
</pre>
<p>NB! I&#8217;m currently using <acronym title="JavaScript">JS</acronym>&#8217; <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/eval">eval</a>-method, which &#8211; in short &#8211; is not recommended if you don&#8217;t have 100% control of the code being evaluated. While it gives you extreme flexibility, it will probably also affect security. It is amongst others a very common source of XSS-vulnerabilities.</p>
<p>I am working on a better expression-parser, perhaps built upon Markuper&#8217;s &#8220;operatorsRegExp&#8221;, which is used for some neat interpretation of the &#8220;data-keep-if&#8221;-values. As far as possible I will for now recommend data-keep-if as long as it&#8217;s possible, and this is mostly an example of how easy it is to expand the Markuper, and making a little more flexible option needed for an application of mine.</p>
<p>You will also need the patched Markuper found at the bottom of this post (template.js) if you want to allow variables in the expressions. See my <a href="http://michaelodden.com/development/adventures-in-opera-unite/">previous Unite-post</a> for details.</p>
<h2>Check if files exists</h2>
<p>I came across a situation where I preferred to use the _request event-handler, which is a &#8220;fetch-all&#8221; event, this mean that I won&#8217;t need to dispatch events for every single action, but rather take care of the logics in one gateway-method. But there is a problem: when using the _request-handler, Unite won&#8217;t dispatch through to any publicly available files either, unless explicitly told so. In my case this meant my .css og client-side .js-files wasn&#8217;t loaded.</p>
<p>To work around this, I created a function which checks if there is a file matching the current request &#8211; and if so serve this instead of continuing with the regular logic.</p>
<p>Remember to include access to the file i/o by adding the following in your config.xml (inside the widget-element):</p>
<pre lang="xml">    &lt;feature name="http://xmlns.opera.com/fileio"&gt;&lt;/feature&gt;</pre>
<pre name="code" class="javascript">/**
 * @author	Michael Odden
 * @email	me@michaelodden.com
 * @url		http://michaelodden.com/
 * @description
 * 		Checks if the requested path can be mapped to an existing static file (underneath public_html).
 *		If so: server the static file, otherwise continue the normal flow. Intended used with the _request event handler.
 *
 *
 * @return	mixed - true / false regarding if file exists, or the result of response.closeAndRedispatch ()
 * @param	OperaEvent - e - The event-object as sent to the eventhandler (required)
 * @param	boolean - dispatch - should the method autmaticly dispatch to load the file, or just return true / false.
 */
function requestedFileExists(e, dispatch) {
	var fileExists = true;
	var uri = e.connection.request.uri;
	var dir = opera.io.filesystem.mountSystemDirectory('application');
	dispatch = typeof(dispatch)!="undefined" ? dispatch : true;

	if(dir) {
		try {
			var relPath = uri.replace(new RegExp(e.target.currentServiceName,"i"), "public_html");
			var stream = dir.open(dir.resolve(relPath ), opera.io.filemode.READ);
		} catch(err) {
			fileExists = false;
		}
	}

    return (dispatch &#038;&#038; fileExists) ? e.connection.response.closeAndRedispatch() : fileExists;
}
</pre>
<p>I found it necessary to also have a function which simply checks if there is a public file with a given name, and simply returns true or false.</p>
<pre name="code" class="javascript">/**
 * @author	Michael Odden
 * @email	me@michaelodden.com
 * @url		http://michaelodden.com/
 * @description
 * 		Checks if a given file exists under the public_html folder. Returns true / false accordingly.
 *
 *
 * @return	Boolean - true / false regarding if file exists
 * @param	OperaEvent - e - The event-object as sent to the eventhandler (required)
 * @param	String - file - path relative to public_html to look for
 */
function publicFileExists(e, file) {
	var fileExists = true;
	var dir = opera.io.filesystem.mountSystemDirectory('application');

	if(dir) {
		try {
			var relPath = "public_html/" + file;
			var stream = dir.open(dir.resolve(relPath ), opera.io.filemode.READ);
		} catch(err) {
			fileExists = false;
		}
	}

	return fileExists;
}
</pre>
<h3>Usage</h3>
<pre name="code" class="javascript">window.onload = function() {
	var w = opera.io.webserver;
	if(w) {
		w.addEventListener("_request", onRequest, false);
	}
}

function onRequest(e) {
	// Demo 1: requestedFileExists()
	// Check if the requested <acronym title="Uniform Resource Identifier">URI</acronym> can match to an existing file under public_html.
	// If so, dispatch directly to that file, and cancel further load
	requestedFileExists(e);

	// Demo 2: publicFileExists()
	// this demo as a whole does the same as Demo 1, but the publicFileExists does
	// only return true / false, and the developer has to decide action herself.
	if(publicFileExists(e, "tesfile.html")) {
		e.connection.response.closeAndRedispatch();
	}
}
</pre>
<h2>Notes to self</h2>
<p>window.onload is only run when the application is started (through the Unite Control Panel), and not on each page-load as some would believe.</p>
<p>Markuper does of course need <a href="http://dev.opera.com/articles/view/file-i-o-api-for-widgets/">access to the filesystem</a>.</p>
<p><a href="https://developer.mozilla.org/en/core_javascript_1.5_guide/exception_handling_statements/try...catch_statement">Try-catch</a> is my best friend. If you have some weird situations where your application doesn&#8217;t load, it might be because a missing library (not including the file-io through your config.xml etc) then you&#8217;ll have to start debugging. By wrapping essential parts in try-catch and check the error-object as passed to the catcher you might save yourself quite some time debugging in the darkness. It is a matter of best-practice to use try-catch on parts of your code that might fail, but it will also come handy as a debugger tool just for checking large or small parts of your code.</p>
<h2>JavaScript on both sides</h2>
<p>It seems to be a common source of confusion for some: it&#8217;s important to remember that &#8211; in Unite &#8211; <acronym title="JavaScript">JS</acronym> is used both on the server-side as well as on the client-side. Methods like &#8220;alert()&#8221;, won&#8217;t work on the SSJS (the ones included in the main index.html-file, either directly or indirectly). Pretty obviously, but I remember my first debugging-action was to try an &#8220;alert()&#8221; <img src='http://michaelodden.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<h2>Recommended</h2>
<ul>
<li><a href="/files/unite/template.js">template.js</a> &#8211; patched version of the Markuper, fixing the bugs as mentioned in my previous Unite-article. Thanks goes to António.</li>
<li><a href="http://dev.opera.com/libraries/">Offical Opera Libraries</a> &#8211; Opera does have some really skilled developers, and it&#8217;s worth checking out the libraries.</li>
<li><a href="http://dev.opera.com/articles/view/opera-javascript-for-hackers-1/">JavaScript for hackers</a> &#8211; a great article, and the title says it all &#8211; well worth read for everyone working with JavaScript.</li>
</ul><img src="http://michaelodden.com/?ak_action=api_record_view&id=301&type=feed" alt="" />

<h2>Related posts:</h2><ul><li><a href='http://michaelodden.com/development/adventures-in-opera-unite/' rel='bookmark' title='Permanent Link: Adventures in Opera Unite'>Adventures in Opera Unite</a></li>
<li><a href='http://michaelodden.com/webdevelopment/tip-of-the-day-loose-comparisons-in-php-gives-edgy-behaviour/' rel='bookmark' title='Permanent Link: Tip of the day: Loose comparisons in PHP gives edgy behaviour'>Tip of the day: Loose comparisons in PHP gives edgy behaviour</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://michaelodden.com/opera-unite/opera-unite-convenient-tips-and-snippets-for-developers/feed/</wfw:commentRss>
		<slash:comments>8</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>
	</channel>
</rss>

