<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.7.6(BH)" -->
<rss version="2.0"    xmlns:georss="http://www.georss.org/georss/"
>
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Henri Bergius: category &quot;midgard&quot;</title>
        <description>Motorcycle Adventures and Free Software from Henri Bergius</description>
        <link>http://bergie.iki.fi/blog/</link>
        <lastBuildDate>Wed, 17 Mar 2010 20:29:09 +0000</lastBuildDate>
        <generator>FeedCreator 1.7.6(BH)</generator>
        <language>en</language>
        <managingEditor>henri.bergius@iki.fi</managingEditor>
        <item>
            <title>First year of Qaiku, and a travel writing challenge</title>
            <link>http://bergie.iki.fi/blog/first_year_of_qaiku-and_a_travel_writing_challenge/</link>
            <description><![CDATA[
<p><img src="http://bergie.iki.fi/static/1/1df2bbe864279c02bbe11df8849b307a0df59445944_qaiku-birthday_mascot.gif" border="0" alt="1st birthday of Qaiku" title="1st birthday of Qaiku" style="float:right;" /><a href="http://www.qaiku.com/">Qaiku</a>, the <a href="http://bergie.iki.fi/blog/microblogging-why_qaiku_might_do_what_twitter_and_brightkite_didn-t/">conversational microblogging service</a> that launched a year ago had a refresh that launched today. While it hasn't yet convinced the twittering masses, it has already proven itself as a lot more thoughtful platform for the Finnish online community, and as a valuable <a href="http://bergie.iki.fi/blog/maemo-org_is_testing_workstreaming_with_qaiku/">workstreaming tool</a>.</p>
<p>The new version looks quite nice and fresh. Notice the privacy information on the right-hand side, which is relevant as Qaiku allows channels and profiles that are private or invitation-only:</p>
<p><img src="http://bergie.iki.fi/static/1/1df2bbd3c08f3262bbd11dfb984e5004382fa3ffa3f_qaiku-onmytravels-small.png" border="0" alt="qaiku-onmytravels-small.png" title="qaiku-onmytravels-small.png" /></p>
<p>Technically the new version is also remarkable as it is the first major website to run fully on top of the legacy-free <a href="http://bergie.iki.fi/blog/raise_the_hammer-midgard2_mjolnir_goes_live/">Midgard2 platform</a>. So yes, every entry you see there is a GObject. And D-Bus signals fly when you post.</p>
<h2>On to the challenge, then</h2>
<p>To highlight Qaiku's threading, conversational nature I started a new <a href="http://www.qaiku.com/go/61gu/"><em>"On my travels, I have"</em></a><a href="http://www.qaiku.com/go/61gu/"> thread</a> for sharing your <em>most extraordinary travel experiences</em>. This is not on Twitter or Buzz as with Qaiku it is so easy to keep the conversation together and accessible for the future as well.</p>
<p>To contribute, <a href="http://www.qaiku.com/settings/registration/">sign up on Qaiku</a>, go to <a href="http://www.qaiku.com/go/61gu/">the thread</a> and add your experiences as a comment. If you have a link or picture to include, you can also do so. My first entry was:</p>
<blockquote><a href="http://bergie.iki.fi/blog/african-miracles/">seen</a> ice descend from the heavens and provide us with cold beer on a hot day in Lesotho</blockquote>
<p>Will be interesting to see what comes out of this :-)</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>-3.06343 -60.106998</georss:point>
            <category>desktop</category>
            <pubDate>Tue, 09 Mar 2010 21:00:09 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df2bbebf6658b62bbe11dfb4a947f5df1c12871287</guid>
        </item>
        <item>
            <title>Getting started with the Midgard content repository</title>
            <link>http://bergie.iki.fi/blog/getting_started_with_the_midgard_content_repository/</link>
            <description><![CDATA[
<p>I'm doing a talk today in the <a href="http://www.bossaconference.indt.org/">Bossa Conference</a> about using  <a href="http://bergie.iki.fi/blog/raise_the_hammer-midgard2_mjolnir_goes_live/">Midgard</a> as a content repository for mobile applications. As part of my presentation I wrote some simple example code for using the <a href="http://www.midgard-project.org/documentation/python_midgard/">Midgard APIs in Python</a>, and thought they would be good to share to those not attending the event as well.</p>
<p>The <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">idea of a content repository</a> is that instead of coming up with new, isolated file formats or database setups for your application you can just work with objects and signals, and let Midgard handle the rest. This is something that lots of people are doing with  <a href="http://couchdb.apache.org/">CouchDB</a> as well, but we feel Midgard, with its light footprint and native APIs for languages like Python, C, Vala and PHP fits better in the mobile applications context.</p>
<h2>Installing Midgard</h2>
<p>Midgard packages are available for many different Linux distributions through the OpenSuse Build Service. To find the right repository for  your setup, go to the <a href="http://download.opensuse.org/repositories/home:/midgardproject:/mjolnir/">OBS project page</a>.  For example, on my Ubuntu Karmic netbook the URL to add to apt <code>sources.list</code> is  <code>deb http://download.opensuse.org/repositories/home:/midgardproject:/mjolnir/xUbuntu_9.10/ ./</code>. Then I just:</p>
<pre>sudo apt-get update
sudo apt-get install python-midgard2
</pre>
<p>Midgard is also available in <a href="http://maemo.org/packages/search/?org_maemo_packages_search%5B1%5D%5Bproperty%5D=name&amp;org_maemo_packages_search%5B1%5D%5Bconstraint%5D=LIKE&amp;org_maemo_packages_search%5B1%5D%5Bvalue%5D=midgard">Maemo extras</a> and for OS X <a href="http://www.macports.org/ports.php?by=name&amp;substr=midgard2">on MacPorts</a>.</p>
<h2>Defining a schema</h2>
<p>The first thing when developing a Midgard application is to define your storage objects. This is done using the  <a href="http://www.midgard-project.org/documentation/mgdschema-file-properties/">MgdSchema XML format</a>. In this case we're doing a simple "attendee" object that amends Midgard's built-in person record with information related to the conference:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;Schema xmlns="http://www.midgard-project.org/repligard/1.4"&gt;
    &lt;type name="openbossa_attendee" table="openbossa_attendee"&gt;
        &lt;property name="id" type="unsigned integer" primaryfield="id"&gt;
            &lt;description&gt;Local non-replication-safe database identifier&lt;/description&gt;
        &lt;/property&gt;
        &lt;property name="person" type="unsigned integer" link="midgard_person:id"&gt;
            &lt;description&gt;Person attending the event&lt;/description&gt;
        &lt;/property&gt;
        &lt;property name="registration" type="datetime"&gt;
            &lt;description&gt;Registration date of the attendee&lt;/description&gt;
        &lt;/property&gt;
        &lt;property name="likesbeer" type="boolean"&gt;
            &lt;description&gt;Whether the attendee likes beer&lt;/description&gt;
        &lt;/property&gt;
    &lt;/type&gt;
&lt;/Schema&gt;
</pre>
<p>Then we just save this XML file into <code>/usr/share/midgard2/schema/</code> so that Midgard will find it.</p>
<h2>Initiating the repository connection</h2>
<p>Once the MgdSchema is in place it is time to <a href="http://xkcd.com/353/">import antigravity</a> and start hacking in Python.  The code works pretty much in the same way in other languages Midgard is available for, but Python is used here for the sake of simplicity. First we load the Midgard extension:</p>
<pre>import _midgard as midgard
</pre>
<p>Then we setup the <a href="http://www.midgard-project.org/api-docs/midgard/core/9.9/midgard-connection.html">repository connection</a>. With these <a href="http://www.midgard-project.org/api-docs/midgard/core/9.9/midgard-config.html">settings</a> we will store our content into an SQLite database located in  <code>~/.midgard2/data/midgardexample.db</code>:</p>
<pre>configuration = midgard.config()
configuration.dbtype = 'SQLite'
configuration.database = 'midgardexample'

# Open a Midgard repository connection with our config
connection = midgard.connection()
connection.open_config(configuration)
</pre>
<p>As this is the first time we're interacting with the repository we need to tell Midgard to  <a href="http://www.midgard-project.org/api-docs/midgard/core/9.9/midgard-storage.html">prepare the storage</a> for itself and also for our new <code>openbossa_attendee</code> class:</p>
<pre>midgard.storage.create_base_storage()
midgard.storage.create_class_storage('midgard_person')
midgard.storage.create_class_storage('midgard_parameter')
midgard.storage.create_class_storage('openbossa_attendee')
</pre>
<h2>Interacting with data</h2>
<p>First we create a person <a href="http://www.midgard-project.org/api-docs/midgard/core/9.9/midgard-object.html">object</a> with our attendee:</p>
<pre>person = midgard.mgdschema.midgard_person()
person.firstname = 'Leif'
person.lastname = 'Eriksson'
person.create()
</pre>
<p>Then we create our attendee object and link that with the person we just created:</p>
<pre>attendee = midgard.mgdschema.openbossa_attendee()
attendee.person = person.id
attendee.likesbeer = True
attendee.create()
</pre>
<h2>Querying data</h2>
<p>Later we'll want to find out about all Leifs attending the event. We do this by using the  <a href="http://www.midgard-project.org/api-docs/midgard/core/9.9/midgard-query-builder.html">Midgard query builder</a>:</p>
<pre>qb = midgard.query_builder('openbossa_attendee')
qb.add_constraint('person.firstname', '=', 'Leif')
attendees = qb.execute()
</pre>
<p>The query builder returns us a list of matching attendee objects. We can go through them and also fetch the associated persons:</p>
<pre>for attendee in attendees:
    person = midgard.mgdschema.midgard_person()
    person.get_by_id(attendee.person)
    if attendee.likesbeer:
        print "%s, %s is attending the event" % (person.lastname, person.firstname)
</pre>
<p>Then we can update the persons with their email addresses:</p>
<pre>    person.email = 'leif@vinland.no'
    person.update()
</pre>
<p>For basic data handling, that's it! When you need more, you can extend objects with  <a href="http://www.midgard-project.org/documentation/php_midgard_object_attachments/">file attachments</a> or  <a href="http://www.midgard-project.org/documentation/php_midgard_object_parameters/">parameters</a>. You can also create joined records using <a href="http://blogs.nemein.com/people/piotras/view/1246881867.html">Midgard views</a>.  Midgard provides <a href="http://teroheikkinen.iki.fi/blog/midgard_workshop_at_fscons/">D-Bus signals</a>, <a href="http://blogs.nemein.com/people/piotras/view/1246966442.html">transactions</a>,  <a href="http://www.midgard-project.org/documentation/mgdschema-metadata-object/">centralized metadata</a>,  <a href="http://www.midgard-project.org/documentation/php-midgard_replicator/">synchronization</a> and many other things.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>-3.06343 -60.106998</georss:point>
            <category>desktop</category>
            <pubDate>Tue, 09 Mar 2010 15:50:26 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df2b937abcafba2b9311df8feac5680ae0b314b314</guid>
        </item>
        <item>
            <title>CMS Watch on their Midgard usage</title>
            <link>http://bergie.iki.fi/blog/cms_watch_on_their_midgard_usage/</link>
            <description><![CDATA[
<p><a href="http://www.cmswatch.com/Blog/1826-Which-CMS-does-The-Real-Story-Group-Use?">Which CMS does The Real Story Group Use? (Tony Byrne / CMS Watch)</a>:</p>
<blockquote>The answer is, we use an open-source platform called "Midgard." We picked it nearly ten years ago, and it has held up fairly well.<br />...<br /><br /> One of the things we like about Midgard actually makes it rather unsuitable for many simpler publishing scenarios: it is highly object-oriented. This allows us to run multiple sites off largely a single codebase -- at the cost of quite user-unfriendly administrative and authoring facilities.<br /><br /> Also, Midgard is very much a development platform, and we have had to create a fair amount of custom code, especially to handle structured content. In that regard, our CMS experience probably resemble yours. As an industry we remain very far from plug-and-play content management technology for all but the simplest of websites.</blockquote>
<p>While the post contains many negative points about <a href="http://www.midgard-project.org/midgard/">older Midgard</a> (the UIs are <a href="http://bergie.iki.fi/blog/midgard-s-new-toolbar/">a bit better now</a> than they used to be, quite a lot of development has since <a href="http://trac.midgard-project.org/timeline">been happening</a> especially in <a href="http://bergie.iki.fi/blog/long-term_support_for_midgard-ragnaroek_is_here/">the LTS branch</a>), it is remarkable that <a href="http://www.cmswatch.com/">CMS Watch</a> has been able to run their services through the <em>same CMS setup for ten years</em>. This really shows the durability and commitment to long-term stability we have in the Midgard community. We've been doing this for <a href="http://bergie.iki.fi/blog/first_ten_years_of_midgard/">more than ten years</a>, and will likely keep going for quite a bit longer.</p>
<p>As for usability and popularity of Midgard, there is quite little we can do about it in the Midgard1 area, as that is now in <a href="http://bergie.iki.fi/blog/long-term_support_for_midgard-ragnaroek_is_here/">long-term support</a> phase that won't allow major changes. But <a href="http://bergie.iki.fi/blog/raise_the_hammer-midgard2_mjolnir_goes_live/">Midgard2 is a new world</a> with new opportunities. Midgard's <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">content repository</a> is pretty much there already, as is the MVC layer, and this spring we should be able to unveil the new, quite revolutionary CMS concept as well. Watch <a href="http://bergie.iki.fi/">this blog</a> for updates!</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>-3.06343 -60.106998</georss:point>
            <category>midgard</category>
            <pubDate>Mon, 08 Mar 2010 18:24:26 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df2adfd3b9cf802adf11df924fff308a1dbaf7baf7</guid>
        </item>
        <item>
            <title>Register and log into meego.com using your maemo.org account</title>
            <link>http://bergie.iki.fi/blog/register_and_log_into_meego-com_using_your_maemo-org_account/</link>
            <description><![CDATA[
<p><a href="http://meego.com/">MeeGo</a> is the new mobile Linux platform developed by Nokia and Intel. As the <a href="http://bergie.iki.fi/blog/maemo-s_community_involvement_infrastructure_is_what_meego_needs/">community is forming</a> up, we thought that it would be good to enable people to use their <a href="http://maemo.org/profile/list/">maemo.org identities</a> also on the MeeGo web services (as well as on any other <a href="https://www.myopenid.com/directory">OpenID enabled website</a>). For this, let me introduce <a href="http://maemo.org/openid/">Maemo's OpenID provider</a>.</p>
<p>First of all, go to <a href="http://meego.com/">meego.com</a> and click login:</p>
<p><img src="http://bergie.iki.fi/static/1/1df214b955a0432214b11df8240e36785e2ee2fee2f_meego-login-png.jpg" border="0" alt="meego-login.png" title="meego-login.png" /></p>
<p>Select the "<em>Log in using OpenID</em>" option, and provide your <a href="http://maemo.org/openid/">maemo.org OpenID URL</a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1df214bb9e88c06214b11df9a008b182b8765336533_meego-maemo-openid-png.jpg" border="0" alt="meego-maemo-openid.png" title="meego-maemo-openid.png" /></p>
<p>Then the request will be redirected to <a href="http://maemo.org/">maemo.org</a> where the site will check your credentials and ask whether to relay your information on to meego.com:</p>
<p><img src="http://bergie.iki.fi/static/1/1df214be6d9568c214b11df85c435f51c00c07ac07a_maemo-openid-meego-png.jpg" border="0" alt="maemo-openid-meego.png" title="maemo-openid-meego.png" /></p>
<p>And that's it, suddenly you can use your maemo.org account with meego.com!</p>
<p> </p>
<p>The same <a href="http://trac.midgard-project.org/browser/branches/ragnaroek/midcom/net.nemein.openidprovider">OpenID provider</a> component can also be utilized on any other <a href="http://www.midgard-project.org/midgard/8.09/">Midgard</a>-powered website.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.167999 24.9263</georss:point>
            <category>midgard</category>
            <pubDate>Wed, 24 Feb 2010 13:57:09 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df214c801741f6214c11df81724157cc3a80998099</guid>
        </item>
        <item>
            <title>Going to the Bossa Conference</title>
            <link>http://bergie.iki.fi/blog/going_to_the_bossa_conference/</link>
            <description><![CDATA[
<p><a href="http://www.bossaconference.indt.org/">Bossa Conference</a>, an event about mobile development with free software technologies will be held on March 7th-10th in <a href="http://en.wikipedia.org/wiki/Manaus">Manaus</a>, Brazil. This year I'm speaking about using <a href="http://midgard2.org/">Midgard</a> as a replicated storage layer in mobile applications, with examples for multiple programming languages and toolkits.</p>
<p>The idea behind the <a href="http://bergie.iki.fi/blog/midgard2_stable-generic_content_repository_for_web-desktop_and_mobile/">Midgard content repository</a> is that instead of coming up with your own file formats you can just <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">keep working with objects and signals</a>, and let the repository deal with the rest.</p>
<p><img src="http://bergie.iki.fi/static/1/1df2077771ab4aa207711dfb6718745055195119511_bossaconference-small-png.jpg" border="0" alt="bossaconference-small.png" title="bossaconference-small.png" /></p>
<p>It is always fun to go to Brazil and <a href="http://www.flickr.com/photos/bergie/collections/72157600946258420/">meet the vibrant free software community</a> there. The plan is to fly over this weekend, spend a few days in Sao Paulo and then head for the Amazon. Feel free to <a href="http://bergie.iki.fi/">ping me</a> if you're around.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.169899 24.9384</georss:point>
            <category>desktop</category>
            <pubDate>Tue, 23 Feb 2010 12:38:44 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df2078618248a0207811dfbc30997c9fb3d8eed8ee</guid>
        </item>
        <item>
            <title>Halti.com provides contextual product recommendations</title>
            <link>http://bergie.iki.fi/blog/halti-com_provides_contextual_product_recommendations/</link>
            <description><![CDATA[
<p>Last week the <a href="http://halti.com/">Finnish outdoor brand Halti</a> launched a pretty interesting web service. While many outdoor brands focus on extreme sports that don't really have much to do with the reality of most of their customers, Halti connects their product lineup to the needs of the site visitor by utilizing both weather and location. This means where ever they are or are planning to go, they can get product recommendations personalized to their needs:</p>
<p><img src="http://bergie.iki.fi/static/1/1df1657ccade8c6165711dfba5f45ffba46b268b268_halti-small-png.jpg" border="0" alt="halti-small.png" title="halti-small.png" /></p>
<p>This is another case of <a href="http://bergie.iki.fi/blog/making_the_gnome_desktop_location-aware/">location context being used</a> to serve users better. To figure out where the user is coming from the site uses a combination of <a href="http://bergie.iki.fi/blog/easy_user_location_with_midgard/">IP positioning</a> and <a href="http://bergie.iki.fi/blog/browser_geolocation_without_gps-quite_accurate_enough/">browser geolocation</a>, while weather information comes from <a href="http://www.foreca.com/">Foreca's</a> feeds. Map visualization uses <a href="http://cloudmade.com/">CloudMade's</a> <a href="http://www.openstreetmap.org/">OpenStreetMap</a>-based maps. And of course the whole thing runs on the stable <a href="http://bergie.iki.fi/blog/long-term_support_for_midgard-ragnaroek_is_here/">Ragnaroek series of Midgard</a>.</p>
<p><strong>In other news,</strong> <a href="http://josetjaksa.fi/">Jos et jaksa</a> is another pretty interesting recent site launch, especially for the fact that it is the first-ever website running on the <a href="http://bergie.iki.fi/blog/midgard_2-finally_legacy-free/">legacy-free Midgard2 platform</a> and <a href="http://www.midgard-project.org/discussion/developer-forum/status_of_midgard_mvc/">Midgard MVC</a>.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.166401 24.9175</georss:point>
            <category>geo</category>
            <pubDate>Wed, 10 Feb 2010 15:33:05 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df165995023e66165911dfae5e39ee72ad6ab26ab2</guid>
        </item>
        <item>
            <title>Direct manipulation interfaces</title>
            <link>http://bergie.iki.fi/blog/direct_manipulation_interfaces/</link>
            <description><![CDATA[
<p>There certainly is a lot of buzz about <a href="http://www.engadget.com/tag/Appletablet/">Apple's rumored Tablet</a> product.  <a href="http://daringfireball.net/2009/12/the_tablet">Daring Fireball writes</a>:</p>
<blockquote>If you’re thinking The Tablet is just a big iPhone, or just Apple’s take on the e-reader, or just a media player, or <em>just</em> anything, I say you’re thinking too small — the equivalent of thinking that the iPhone was going to be just a click wheel iPod that made phone calls. I think The Tablet is nothing short of Apple’s reconception of personal computing.</blockquote>
<p>What I find most interesting are the view that the Tablet may bring new  computer interaction paradigms. <a href="http://daringfireball.net/2010/01/the_original_tablet">Again from Daring Fireball</a>:</p>
<blockquote>Our “desktop” computers’ human interfaces haven’t fundamentally changed since 1984 — keyboard and mouse/trackpad for input, overlapping draggable resizable windows on-screen, and a hierarchical file system where you create and manage “document files”. Have you ever sat back, scratched your chin, and wondered when the computer industry will break free of these current interfaces — which can be a hassle even for experts, and downright confusing (e.g. click vs. double-click) for the non-experts? Surely no one expects the computer interfaces of, say, 50 years hence to be based on these same metaphors and input methods. What’s the next step?</blockquote>
<p>A touchscreen tablet isn't really suited for <a href="http://en.wikipedia.org/wiki/WIMP_%28computing%29">the WIMP paradigm</a> as for example <a href="http://www.macworld.com/article/145609/2010/01/tablet_text_entry.html">text entry is quite difficult</a>, and you probably want larger, thumb-friendly user interface elements. This is where <a href="http://theappleblog.com/2010/01/07/microsofts-slate-exactly-unlike-apples-upcoming-tablet/">Microsoft's Tablet PC initiative failed</a>, trying to bring the regular WIMP user interface to the tablet.</p>
<p>Instead what seems to be happening is that all the Wiis, iPhones, and N900s are now heading us towards a <a href="http://en.wikipedia.org/wiki/Post-WIMP">post-WIMP</a> world. Instead of indirect manipulation by mouse and keyboard we can now interact with our applications using the more natural ways of touching things on screen or moving the device around.</p>
<p>This innovation will not be limited only to mobile APIs, web applications can already now know whether user is accessing them via a WIMP  system or a touchscreen device thanks to <a href="https://developer.mozilla.org/en/css/media_queries#-moz-touch-enabled">CSS  media queries</a> and <a href="http://dougt.org/wordpress/2009/08/orientation/">Javascript  orientation events</a> in <a href="http://www.mozilla.com/en-US/firefox/3.6/releasenotes/">latest  Firefox</a>.</p>
<p>The user interface innovation that is arriving thanks to these new interaction possibilities is quite promising, though it will probably take a while before we know what things actually work, and what are just fun demos.</p>
<p>If you're thinking about new kinds of user interfaces, it might be a good time to read papers like <a href="http://www.useit.com/papers/noncommand.html">Noncommand User Interfaces</a> (<em>Jakob Nielsen</em>, 1993) and <a href="http://worrydream.com/MagicInk/">Magic Ink</a> (<em>Bret Victor</em>, 2006).</p>
<p>I certainly am as we are in the process of <a href="http://www.qaiku.com/go/5ebp">defining a new kind of CMS UI</a> for <a href="http://bergie.iki.fi/blog/raise_the_hammer-midgard2_mjolnir_goes_live/">Midgard 2</a>.</p>
<p><strong>Update:</strong> Gizmodo has a very nice <a href="http://gizmodo.com/5452501/the-apple-tablet-interface-must-be-like-this">article on Jef Raskin's information appliance concept</a> and the evolution of GUIs.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.163502 24.927999</georss:point>
            <category>desktop</category>
            <pubDate>Thu, 21 Jan 2010 13:26:44 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df06909e4e04ce069011dfb6b32b7fb4e242a442a4</guid>
        </item>
        <item>
            <title>Midgard in 2009</title>
            <link>http://bergie.iki.fi/blog/midgard_in_2009/</link>
            <description><![CDATA[
<p><img src="http://bergie.iki.fi/static/1/1def5febc8f9aeef5fe11de9b44cb847ee61f091f09_vali_new_year.jpg" border="0" alt="Vali raising a toast" title="Toast for 2009 from Vali" style="float:right;margin-left:6px;" />2009 was a pretty active year for the <a href="http://www.midgard-project.org/">Midgard</a> content repository project, and so it is good to take a look at some of the highlights:</p>
<ul><li><a href="http://www.midgard2.org/">Midgard2</a> finally <a href="http://bergie.iki.fi/blog/midgard2_stable-generic_content_repository_for_web-desktop_and_mobile/">became a reality</a>, bringing us a <a href="http://bergie.iki.fi/blog/midgard_2-finally_legacy-free/">fully legacy-free</a> modern Midgard implementation. There were two releases: <a href="http://www.midgard-project.org/updates/midgard2-9-3-0-vinland-released/">9.03 Vinland</a> and <a href="http://bergie.iki.fi/blog/raise_the_hammer-midgard2_mjolnir_goes_live/">9.09 Mjolnir</a>. Midgard2 works just fine also <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">in desktop applications</a> and mobile devices like <a href="http://bergie.iki.fi/blog/tomboy_web_synchronization-conboy_and_midgard/">the Nokia N900</a></li>
<li><a href="http://www.midgard-project.org/midgard/8.09/">Ragnaroek</a>, the <a href="http://bergie.iki.fi/blog/long-term_support_for_midgard-ragnaroek_is_here/">long-term support version</a> of Midgard1 kept chugging along with four new maintenance releases and total of <a href="http://trac.midgard-project.org/query?status=closed&amp;milestone=8.09.3+Ragnaroek&amp;milestone=8.09.4+Ragnaroek&amp;milestone=8.09.5+Ragnaroek&amp;milestone=8.09.6+Ragnaroek&amp;order=priority">566 issues closed</a>. Ragnaroek will be maintained until October 2013</li>
<li>The <a href="http://bergie.iki.fi/blog/first_ten_years_of_midgard/">Midgard Project turned ten years old</a> in May. A <a href="http://www.midgard-project.org/10/programme/">gala evening</a> and <a href="http://www.flickr.com/photos/bergie/sets/72157617984600444/">party was held</a> in Helsinki, Finland</li>
<li>Midgard's content repository gained bindings to two new programming languages alongside existing PHP, C and Python: <a href="http://www.mdk.org.pl/2009/3/26/midgard-objc-bindings">Objective-C in March</a> and <a href="http://trac.midgard-project.org/browser/trunk/midgard/apis/vala/example.vala?rev=24376">Vala in December</a></li>
<li>Midgard was <a href="http://www.iks-project.eu/team">one of the CMSs</a> admitted to the <a href="http://bergie.iki.fi/blog/starting_the_interactive_knowledge_project/">EU-funded Interactive Knowlegde project</a> that aims to increase semantic capabilities in content management</li>
<li><a href="http://www.qaiku.com/">Qaiku</a>, a <a href="http://bergie.iki.fi/blog/microblogging-why_qaiku_might_do_what_twitter_and_brightkite_didn-t/">conversational microblogging platform</a> powered by Midgard MVC was launched in March</li>
<li>We had two Midgard Gatherings: in <a href="http://bergie.iki.fi/blog/midgard_gathering_2009_in_linkoping/">March in Linköping, Sweden</a> and in <a href="http://www.qaiku.com/channels/show/midgard/view/1debfda2c347a3cbfda11dea31c97423a5855b355b3/">October in Helsinki, Finland</a></li>
<li><a href="http://bergie.iki.fi/blog/ragnaland_is_coming/">Ragnaland</a> became a way to bridge the gap between Midgard1 and Midgard2 by enabling running of MidCOM applications on top of Midgard MVC</li>
<li>Midgard was presented in several conferences including <a href="http://bergie.iki.fi/blog/learn_about_midgard2-geoclue_and_libchamplain_in_guadec_2009/">Gran Canaria Desktop Summit</a>, <a href="http://bergie.iki.fi/blog/content_repository_talk_in_froscon/">FrOSCon</a>, <a href="http://www.qaiku.com/channels/show/seminaarikannu/view/1deadc2a643dd4cadc211de91f513767f63d2b7d2b7/">OpenMind</a> and <a href="http://www.qaiku.com/channels/show/seminaarikannu/view/1ded0f68a907c48d0f611de9405ddb75667e0dfe0df/">FSCONS</a></li>
<li><a href="http://www.qaiku.com/channels/show/midgard/view/1deeca09f359ab4eca011dea74d4f007179bd35bd35/">Founding meeting for an association to support the Midgard project</a> was held in December. The association will provide membership to all active Midgard contributors, and an alumni membership for people who have been part of the project in the past</li>
</ul><p>Happy new year to everybody in the Midgard world!</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.176201 24.920099</georss:point>
            <category>desktop</category>
            <pubDate>Thu, 31 Dec 2009 11:23:35 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1def5feef2e0fa8f5fe11de9869ffb95a6ee8c4e8c4</guid>
        </item>
        <item>
            <title>Easy user location with Midgard</title>
            <link>http://bergie.iki.fi/blog/easy_user_location_with_midgard/</link>
            <description><![CDATA[
<p>Location is an important context that  <a href="http://gigaom.com/2009/05/20/why-location-awareness-will-make-the-web-more-useful/http://gigaom.com/2009/05/20/why-location-awareness-will-make-the-web-more-useful/">web services can utilize</a> for <a href="http://www.foursquare.com/">fun</a> or <a href="http://worrydream.com/MagicInk/">smarter user interaction</a>. In past getting location used to be difficult, but now thanks to good <a href="http://www.geoplugin.com/">IP locationing databases</a> and <a href="http://bergie.iki.fi/blog/browser_geolocation_without_gps-quite_accurate_enough/">browser geolocation</a> capabilities it is becoming a lot easier.</p>
<p>But to be really easy, the framework you're using should provide user's location built-in, without you as an application developer having to think about it. This is the reason for <a href="http://bergie.iki.fi/blog/the-midgard-position/">Midgard's geolocation features</a> to exist, after all. With Midgard, getting user's location is quite easy:</p>
<h2>Midgard MVC (Midgard 9.09)</h2>
<pre>// Read location from session or user's location log
$user_location = midgardmvc_helper_location_user::get_location();
if (is_null($user_location))
{
    // No location found, try to geocode based on user IP via the GeoPlugin service
    $geocoder = new new midgardmvc_helper_location_geocoder_geoplugin()
    $location_parameters = array('ip' =&gt; $_SERVER['REMOTE_ADDR']);
    try
    {
        $user_location = $geocoder-&gt;geocode($location_parameters);
        midgardmvc_helper_location_user::set_location($user_location);
    }
    catch (Exception $e)
    {
        // Couldn't get location from IP
    }
}

if (!is_null($user_location))
{
    echo sprintf('You\'re in %s, %s', $user_location-&gt;latitude, $user_location-&gt;longitude);
    // Will print "You're in 60.1633, 24.9279"
}
</pre>
<h2>MidCOM (Midgard 8.09)</h2>
<pre>&lt;?php
// Read location from session or user's location log
$user_location = org_routamc_positioning_user::get_location();
if (is_null($user_location))
{
    // No location found, try to geocode based on user IP
    $geocoder = org_routamc_positioning_geocoder::create('geoplugin');
    $location_parameters = array('ip' =&gt; $_SERVER['REMOTE_ADDR']);
    $user_location = $geocoder-&gt;geocode($location_parameters);
    if (!is_null($user_location))
    {
        // Store geocoded location to session or user's location log
        org_routamc_positioning_user::set_location($user_location);
    }
}

if (!is_null($user_location))
{
    echo sprintf('You\'re in %s, %s', $user_location['latitude'], $user_location['longitude']);
    // Will print "You're in 60.1633, 24.9279"
}
?&gt;
</pre>
<p>The examples above will work with both anonymous site visitors (using sessions) and registered users (using Midgard's position log). In this example we check if location is already available via browser geolocation or some importer like <a href="http://www.qaiku.com/go/4pje">Qaiku</a> or <a href="http://fireeagle.yahoo.net/">Fire Eagle</a>, and if not we fall back to IP-based positioning using the <a href="http://www.geoplugin.com/">GeoPlugin</a> service. The resulting user location array or object (depending on Midgard used) contains a textual description of the place and accuracy information in addition to WGS-84 coordinates.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1633 24.9279</georss:point>
            <category>geo</category>
            <pubDate>Wed, 02 Dec 2009 14:08:41 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1dedf4c31e52a12df4c11dea1c85599e67c404d404d</guid>
        </item>
        <item>
            <title>Using MidCOM3 with FirePHP</title>
            <link>http://bergie.iki.fi/blog/using_midcom3_with_firephp/</link>
            <description><![CDATA[
<p><a href="http://getfirebug.com/">Firebug</a> is a Firefox extension all web developers are familiar with. Now when developing with the <a href="http://bergie.iki.fi/blog/midcom_3_at_a_glance/">MidCOM3 MVC framework</a> it is possible to <a href="http://trac.midgard-project.org/ticket/814">get your debug information</a> straight from Midgard to Firebug<a href="http://www.firephp.org/"></a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1ded84fd014f496d84f11deb7eda5dcade1825f825f_midgard-firephp-small-png.jpg" border="0" alt="midgard-firephp-small.png" title="midgard-firephp-small.png" /></p>
<p>This is built on top of the excellent <a href="http://www.firephp.org/">FirePHP extension</a>, which helps you get data not only from regular web pages but also <a href="http://www.christophdorn.com/Blog/2009/04/03/how-to-integrate-firephp-for-ajax-development/">from AJAX requests</a>.</p>
<p>Currently we send all logged information plus details about current route and templates being used. To use this, <a href="http://www.firephp.org/">install FirePHP</a> in your Firefox, FirePHPCore from PEAR packages, and enable <em>development_mode</em> in MidCOM3 configuration.</p>
<p>I'm considering to port this also to <a href="http://www.midgard-project.org/midgard/8.09/">Ragnaroek</a>.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>midgard</category>
            <pubDate>Mon, 23 Nov 2009 16:52:54 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1ded850a503317cd85011de8161379d629ab8b9b8b9</guid>
        </item>
        <item>
            <title>What is a content repository</title>
            <link>http://bergie.iki.fi/blog/what_is_a_content_repository/</link>
            <description><![CDATA[
<p>Joint post of <a href="http://bergie.iki.fi/">Henri Bergius</a> and <a href="http://michaelmarth.blogspot.com/">Michael Marth</a> cross-posted <a href="http://dev.day.com/microsling/content/blogs/main/contentrepositories.html">here</a> and <a href="http://bergie.iki.fi/blog/what_is_a_content_repository/">here</a>.</p>
<p>Web Content Repositories are more than just plain old relational databases. In fact, the requirements that arise when managing web content have led to a class of content repository implementations that are comparable on a conceptual level. During the <a href="http://www.iks-project.eu/">IKS</a> community <a href="http://www.iks-project.eu/civicrm/event/info?reset=1&amp;id=3">workshop in Rome</a> we got together to compare JCR (the <a href="http://jackrabbit.apache.org/">Jackrabbit</a> implementation) and <a href="http://www.midgard-project.org/">Midgard</a>'s content repository. While in some cases the terminology might be different, many of the underlying ideas are identical. So we came up with a list of common traits and features of our content repositories. For comparison, there is also <a href="http://couchdb.apache.org/">Apache CouchDB</a>.</p>
<p>So, why use a Content Repository for your application instead of the old familiar RDBMS? Repositories provide several advantages:</p>
<ul><li>
<p><em>Common rules for data access</em> mean that multiple applications can work with same content without breaking consistency of the data</p>
</li>
<li>
<p><em>Signals about changes</em> let applications know when another application using the repository modifies something, enabling collaborative data management between apps</p>
</li>
<li>
<p><em>Objects instead of SQL</em> mean that developers can deal with data using APIs more compatible with the rest of their desktop programming environment, and without having to fear issues like SQL injection</p>
</li>
<li>
<p><em>Data model is scriptable</em> when you use a content repository, meaning that users can easily write Python or PHP scripts to perform batch operations on their data without having to learn your storage format</p>
</li>
<li>
<p><em>Synchronization and sharing</em> features can be implemented on the content repository level meaning that you gain these features without having to worry about them</p>
</li>
</ul><table class="tblGenFixed" border="1" cellspacing="0" cellpadding="2"><thead><tr><th class="s0">feature</th> <th class="s1">JCR / Jackrabbit</th> <th class="s2">Midgard</th> <th class="s3">CouchDB</th>
</tr></thead><tbody><tr><td class="s4">content type system</td>
<td class="s5">In JCR structured or unstructured nodes are supported and can be mixed at will in a content tree.</td>
<td class="s5">Content types are defined in MgdSchema types. All content must be stored to an MgdSchema type, but types can be extended on content instance level using the "parameter" triplets</td>
<td class="s6">Type-free</td>
</tr><tr><td class="s7">type hierarchy</td>
<td class="s8">Structured node types support inheritence of types, additional cross-cutting aspects can be added with "mixins". Node types can define allowed node types for child nodes in the content hierarchy.</td>
<td class="s8">MgdSchemas allow inheritance, and an extended type can be instantiated either using the extended type or the base type</td>
<td class="s9">Type-free</td>
</tr><tr><td class="s4">IDs</td>
<td class="s5">Nodes with mixin "referenceable" have GUID. In practice the node path is often used to reference nodes.</td>
<td class="s5">Every object has a GUID used for referencing. Objects located in trees that have a "name" property can also be referred to using the path</td>
<td class="s6">All objects can be accessed via a UUID</td>
</tr><tr><td class="s7">References</td>
<td class="s8">Nodes can reference each other with hard link (special property type) or soft link (by referring to the node path)</td>
<td class="s8">MgdSchema types can have properties linking to other objects of same or different type. A link of "parentfield" type places an MgdSchema type in a tree.</td>
<td class="s9">No reference support built-in</td>
</tr><tr><td class="s4">content hierarchy</td>
<td class="s5">All content is hierarchical / in a tree</td>
<td class="s5">Content can exist in tree, or independently of it depending on the MgdSchema type definition</td>
<td class="s6">flat structure</td>
</tr><tr><td class="s7">interesting property types</td>
<td class="s8">Multi-valued (like an array), binary properties (e.g. for files), nodes have an implicit sort-order</td>
<td class="s8">Binary properties stored using the Midgard Attachment system</td>
<td class="s9">Support for binary properties</td>
</tr><tr><td class="s4">transactions</td>
<td class="s5">Multiple content modifications are written in transactions.</td>
<td class="s5">Transactions can be used optionally.</td>
<td class="s6"></td>
</tr><tr><td class="s7">events</td>
<td class="s8">JCR Observers can register for content changes on different paths and/or for different node types and/or CRUD, receive notification of changes as serialized node</td>
<td class="s8">All transactions cause both process-internal GObject signals, and interprocess DBus signals</td>
<td class="s9">Support for one external event notification shell script</td>
</tr><tr><td class="s4">workspaces</td>
<td class="s5">Workspaces provide separate root trees.</td>
<td class="s5">No workspaces support in Midgard 9.03, coming in next version</td>
<td class="s6">Multiple databases within one CouchDB instance</td>
</tr><tr><td class="s7">import and export</td>
<td class="s8">nodes or parts of the repository (or the whole repo) can be imported or exported in XML. 2 formats: docview for human-frindly representation, sysview including all technical aspects</td>
<td class="s8">Objects can be exported and imported in XML format. There are tools supporting replication via HTTP, tarballs, XMPP, and the CouchDB replication protocol</td>
<td class="s9">JSON serialization is the standard way of accessing the repository. CouchDB replication protocol supports full synchronization between instances</td>
</tr><tr><td class="s4">versioning</td>
<td class="s5">Checkin/checkout model to create new versions of nodes, optionally versions complete sub-trees, supports branching of versions.</td>
<td class="s5">No versioning</td>
<td class="s6">All versions of content are stored and accessible separately, no branching</td>
</tr><tr><td class="s7">locking</td>
<td class="s8">Nodes can be locked and unlocked</td>
<td class="s8">Objects can be locked and unlocked</td>
<td class="s9"></td>
</tr><tr><td class="s4">object mapping</td>
<td class="s5">Not in standard, but implemented in Jackrabbit. Rarely used in practice.</td>
<td class="s5">Object mapping is the standard way of accessing the repository</td>
<td class="s6">All content is accessed via JSON objects</td>
</tr><tr><td class="s7">queries</td>
<td class="s8">In JCR1 Sql or XPath, in JCR2 also QueryBuilder.</td>
<td class="s8">Query Builder</td>
<td class="s9">Javascript map/reduce</td>
</tr><tr><td class="s4">access control</td>
<td class="s5">Done on repository level, i.e. all access control is independent of application. In Jackrabbit: pluggable authentication/authorization handlers.</td>
<td class="s5">No access control in Midgard repository, usually implemented on application level. Midgard proves a user authentication API</td>
<td class="s6">No access control</td>
</tr><tr><td class="s7">persistence</td>
<td class="s8">In Jackrabbit different Persistence Managers can be plugged in (RDBMS, tar file, ...)</td>
<td class="s8">libgda allows storage to different RDBMS like MySQL, SQLite and Postgres</td>
<td class="s9">CouchDB has its own storage</td>
</tr><tr><td class="s4">architecture</td>
<td class="s5">Jackrabbit: library (jar), JEE resource, OSGi bundle or standalone server</td>
<td class="s5">Library</td>
<td class="s6">Erlang-based daemon</td>
</tr><tr><td class="s7">APIs</td>
<td class="s8">Standard: Java-based, PHP coming up. In Jackrabbit: also WebDAV and HTTP-based API</td>
<td class="s8">C, Objective-C, PHP, Python</td>
<td class="s9">HTTP+JSON</td>
</tr><tr><td class="s4">full-text search</td>
<td class="s5">Included in repository. In Jackrabbit: Lucene bundled</td>
<td class="s5">No (SOLR used on application level)</td>
<td class="s6">Plugin for using Lucene, not installed by default</td>
</tr><tr><td class="s7">standard metadata</td>
<td class="s8">All nodes have access rights, jcr:primaryType and jcr:mixinTypes properties. JCR 2.0 standardizes a set of optional metadata properties.</td>
<td class="s8">All objects have a set of standard metadata including creator, revisor, timestamps etc</td>
<td class="s9">No standard properties</td>
</tr></tbody></table>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>desktop</category>
            <pubDate>Thu, 19 Nov 2009 10:02:03 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1ded4f2966e0490d4f211deaeaf87e99efcee8aee8a</guid>
        </item>
        <item>
            <title>Raise the hammer! Midgard2 Mjolnir goes live</title>
            <link>http://bergie.iki.fi/blog/raise_the_hammer-midgard2_mjolnir_goes_live/</link>
            <description><![CDATA[
<p><a href="http://www.midgard-project.org/updates/midgard2_9-09-mjolnir-released/">Mjolnir, the new major release of Midgard2</a> Content Repository is <a href="http://www.midgard-project.org/download/9-09/">now out</a>. Named after the <a href="http://en.wikipedia.org/wiki/Mjolnir">hammer of Thor</a>, this release finally provides <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">a real content repository</a> that can be used by both desktop and web application developers.</p>
<p><img src="http://bergie.iki.fi/static/1/1ded443591ef040d44311deaedd1725f0bcefd2efd2_mjolnir-narrow-png.jpg" border="0" alt="mjolnir-narrow.png" title="mjolnir-narrow.png" /></p>
<p>In addition to being a <a href="http://blogs.nemein.com/people/piotras/view/1247082537.html">GObject-powered</a> content repository for PHP, Python and Objective-C, the Mjolnir release provides several significant goodies on top of the older Midgard2 series:</p>
<ul><li><a href="http://blogs.nemein.com/people/piotras/view/1246881867.html">MgdSchema Views</a> provide a way to define joined data types</li>
<li><a href="http://trac.midgard-project.org/ticket/790">MgdSchema types can be extended</a> with subclasses and <a href="http://blogs.nemein.com/people/piotras/view/1255005390.html">additional information</a></li>
<li><a href="http://blogs.nemein.com/people/piotras/view/1246966442.html">Transactions are available</a> for storage engines that support them</li>
<li><a href="http://www.midgard-project.org/development/mrfc/0045/">New authentication API</a> provides support for different types like OpenID and OAuth</li>
<li>...and there are a lot more unit tests, helping to safeguard against regressions</li>
</ul><p>We've been testing running the <a href="http://www.qaiku.com/">Qaiku microblogging service</a> with Mjolnir. The <em>exactly same PHP code</em> that we used with <a href="http://www.midgard-project.org/midgard/8.09/">Midgard 8.09 LTS</a> performs <em>20-60% better</em> when running on Mjolnir.</p>
<p><a href="http://www.midgard-project.org/download/9-9/">Get Midgard2 9.09 Mjolnir</a> while it is hot! Builds for various Linux distributions are already <a href="http://download.opensuse.org/repositories/home:/midgardproject:/mjolnir/">starting to hit OBS repositories</a>...</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>desktop</category>
            <pubDate>Wed, 18 Nov 2009 13:21:07 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1ded4453adae678d44511debc5fb5c90c2607a507a5</guid>
        </item>
        <item>
            <title>In defence of URLs and the Open Web</title>
            <link>http://bergie.iki.fi/blog/in_defence_of_urls_and_the_open_web/</link>
            <description><![CDATA[
<p>An increasing number of web services and applications are emphasising search terms or pre-selected websites instead of allowing users to enter any address they choose. This is worrying, as while <a href="http://www.cabel.name/2008/03/japan-urls-are-totally-out.html">searches are more user-friendly</a>, <a href="http://www.w3.org/Provider/Style/URI">URLs</a> are the heart of <a href="http://www.mozilla.org/about/manifesto.en.html">an open web where</a> anybody can publish without <a href="http://dvice.com/archives/2009/10/net-neutrality.php">obscure business dealings</a> or oppressive app store policies.</p>
<p>There are many examples of this happening, from <a href="http://my.opera.com/coxy/blog/2008/12/17/facebook">Facebook's framing of web</a> to netbooks systems like the <a href="http://www.jolicloud.com/">JoliCloud</a> not having an address bar. Certainly many companies are looking at <a href="http://www.pcworld.com/businesscenter/article/154198/google_deal_produces_91_of_mozillas_revenue.html">Mozilla's search engine revenue</a> and <a href="http://gigaom.com/2009/07/14/the-meteoric-rise-of-the-app-store/">Apple's app store model</a> and want to emulate that, moving the web into silos of their own control. But at the same time, we're thinking of <a href="http://linkeddata.org/">Linked Data</a> and open, interoperable web standards.</p>
<p>Web indeed is <a href="http://www.arcticstartup.com/2009/09/11/the-web-at-a-new-crossroads/">at new crossroads</a>.</p>
<p>Chris Messina predicts <a href="http://factoryjoe.com/blog/2009/11/16/the-death-of-the-url/">the death of URLs</a>:</p>
<blockquote>a future without URLs and without the infinite organicity of the web frightens me. It’s not that I know what we’ll lose by removing this artifact of one of the most generative periods in history — and that’s exactly the point! The URL and the ability for anyone to mint a new one and then propagate it is what makes the web so resilient, so empowering, and so interesting! That I don’t need to ask anyone permission to create a new website or webpage is a kind of ideological freedom that few generations in history have known!</blockquote>
<p>Tim O'Reilly presents <a href="http://radar.oreilly.com/2009/11/the-war-for-the-web.html">a call to arms</a>:</p>
<blockquote>It could be that everyone will figure out how to play nicely with each other, and we'll see a continuation of the interoperable web model we've enjoyed for the past two decades. But I'm betting that things are going to get ugly. We're heading into a war for control of the web. And in the end, it's more than that, it's a war <em>against</em> the web as an interoperable platform. Instead, we're facing the prospect of Facebook as the platform, Apple as the platform, Google as the platform, Amazon as the platform, where big companies slug it out until one is king of the hill.<br /><br />And it's time for developers to take a stand. If you don't want a repeat of the PC era, place your bets now on open systems. Don't wait till it's too late.</blockquote>
<p> </p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>business</category>
            <pubDate>Tue, 17 Nov 2009 19:19:36 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1ded3ae250ed850d3ae11deb351377d4b1cd9aad9aa</guid>
        </item>
        <item>
            <title>Midgard Weekly Summaries are back</title>
            <link>http://bergie.iki.fi/blog/midgard_weekly_summaries_are_back/</link>
            <description><![CDATA[
<p>
<a href="http://www.midgard-project.org/">Midgard</a> is a very active free software project, and it is quite difficult to keep up <a href="http://trac.midgard-project.org/timeline">with all the changes</a>, decisions and discussions happening around it. Therefore I decided to bring the <a href="http://www.midgard-project.org/updates/mws/">Midgard Weekly Summaries</a> back.
</p>

<ul><li><a href="http://www.midgard-project.org/updates/mws/midgard_weekly_summary-75-october_2nd_2009/">Midgard Weekly Summary #75: October 2nd 2009</a></li>
</ul><p>
MWS has been running before, with <a href="http://lwn.net/Articles/5414/">66 issues</a> released between 1999 and 2002, and <a href="http://www.midgard-project.org/updates/mws/archive/year/2007/">8 issues in 2007</a>. This time we follow the <a href="http://bergie.iki.fi/blog/for_a_collaborative_mws/">idea of a Collaborative MWS</a>.
</p>

<p>
Notices about new published summaries will be sent to the <a href="http://www.midgard-project.org/community/support-discussion/">Midgard user mailing list</a>, <a href="http://www.qaiku.com/channels/show/midgard/">Qaiku #midgard channel</a>, <a href="http://twitter.com/MidgardProject">Twitter @MidgardProject</a> and are available <a href="http://www.midgard-project.org/updates/mws/rss.xml">via RSS</a>. Enjoy!
</p>



<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/midgard" rel="tag">midgard</a></p>


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>midgard</category>
            <pubDate>Fri, 02 Oct 2009 12:39:48 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1deaf50abab75b2af5011de83ce535685520c9d0c9d</guid>
        </item>
        <item>
            <title>Fall conference schedule</title>
            <link>http://bergie.iki.fi/blog/fall_conference_schedule/</link>
            <description><![CDATA[
<p>
After a <a href="http://bergie.iki.fi/blog/on_to_new_motorcycle_adventures/">brief summer motorcycling break</a> the fall is shaping up to be quite full with conferences. Here is <a href="http://www.dopplr.com/traveller/bergie/trips">the current list</a>:
</p>

<ul><li>September 30th - October 1st: <strong><a href="http://www.openmind.fi/">OpenMind</a></strong> and <strong><a href="http://www.mindtrek.org/2009/">MindTrek</a></strong> in Tampere, Finland<br /> I'll <a href="http://www.openmind.fi/programme">give a talk</a> about <a href="http://bergie.iki.fi/blog/midgard2_stable-generic_content_repository_for_web-desktop_and_mobile/">the Midgard project</a> and how <a href="http://www.slideshare.net/bergie/nemein-ja-midgard-yritys-open-source-projektin-keskipisteess">our company has evolved together with it</a>. In addition <a href="http://www.flug.fi/linuxtekija/">Linux-tekijä awards</a>, where I was in <a href="http://www.flug.fi/linuxtekija/2009/">the awards committee</a>, will be announced<br /><br /></li>
<li>October 9th - 11th: <strong><a href="http://maemo.org/news/events/maemo_summit_2009/">Maemo Summit</a></strong> in Amsterdam, the Netherlands<br /> While I'm not giving a talk in the event it will be great to meet the rest of the maemo.org team, and <a href="http://talk.maemo.org/showpost.php?p=330630&amp;postcount=1">the community around the project</a><br /><br /></li>
<li>October 17th: <strong><a href="http://www.finhack.org/">Finhack</a></strong> in Forssa, Finland<br /> A free-form hacking event for the Finnish free software community. Expect some progress with <a href="http://bergie.iki.fi/blog/xmpp_publish-subscribe_for_midgard_and_ajatus_replication/">Midgard's XMPP capabilities</a><br /><br /></li>
<li>October 23rd - 25th: <strong>Midgard Gathering</strong> Helsinki, Finland<br /> Midgard users and developers get together to learn about the new capabilities of <a href="http://www.slideshare.net/bergie/midgard2-content-repository-for-desktop-and-the-web">Midgard 9.09 Mjolnir</a> and discuss the roadmap for the next release<br /><br /></li>
<li>October 29th: <strong><a href="http://www.nluug.nl/activiteiten/events/nj09/index-en.html">The Open Web</a></strong> in Ede, the Netherlands<br /> NLUUGs conference on new web technologies where <a href="http://www.nluug.nl/activiteiten/events/nj09/programma-en.html">I'll be speaking</a> both about <a href="http://www.slideshare.net/bergie/locationaware-desktop">GeoClue</a> and the <a href="http://www.slideshare.net/bergie/midgard2-content-repository-for-desktop-and-the-web">Midgard Content Repository</a><br /><br /></li>
<li>November 11th - 13th: <strong><a href="http://www.iks-project.eu/civicrm/event/info?reset=1&amp;id=3">Semantic Search workshop</a></strong> in Rome, Italy<br /> Together with a general meeting of IKS Project participants<br /><br /></li>
<li>November 13th - 15th: <strong><a href="http://www.fscons.org/">FSCONS</a></strong> in Gothenburg, Sweden<br /> The annual Nordic free software gathering where <a href="http://www.fscons.org/schedule">I'll be speaking</a> about <a href="http://bergie.iki.fi/blog/how_midgard_and_midgard2_differ/">Midgard2</a></li>
</ul><p>
<img src="http://bergie.iki.fi/midcom-serveattachmentguid-1deab7ea36b0f1eab7e11de8ca11d7dd48aeed5eed5/bergie-signals-gcds.jpg" height="287" width="400" border="1" hspace="4" vspace="4" alt="Explaining signals at Gran Canaria Desktop Summit" title="Explaining signals at Gran Canaria Desktop Summit" /></p>

<p>
Looking forward to all the interesting discussions and ideas that will surely come up from these events. If you will be around in one of those, make sure to <a href="http://bergie.iki.fi/">look me up</a> and we can chat. The events will also be covered in <a href="http://www.qaiku.com/home/bergie/">my Qaiku stream</a>.
</p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>desktop</category>
            <pubDate>Sun, 27 Sep 2009 15:58:47 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1deab7ea456f76cab7e11de8f173730f66003330333</guid>
        </item>
        <item>
            <title>Content management starts with the repository</title>
            <link>http://bergie.iki.fi/blog/content_management_starts_with_the_repository/</link>
            <description><![CDATA[
<p>
<a href="http://www.gadgetopia.com/">Gadgetopia</a> makes <a href="http://www.gadgetopia.com/post/6931">an argument for building your own CMS</a>:
</p>

<blockquote>
<em>"See — the problem with a full scale Content Management System is that it has too many opinions. Those opinions were though of by somebody other than you and the needs of your organization. The more developed a content management system (or any piece of software, really) the more “opinions” it has. And the more “opinions” it has, the more likely one of them is going to really tick you off."</em>
<br /><br />I can relate to this.  We work with one system in particular that makes an astonishing array of presumptions about how you’re going to use it, and if you try to step outside those presumptions, demons fly out of the abyss and try to suck your eyeballs out.
<br /><br />This goes back to a previous discussion we had about <a href="http://www.gadgetopia.com/post/6091">Content Management as an API</a>.  In that post, we had a great experience with hand-rolling a CMS...
</blockquote>

<p>
The term they are looking for is <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">Content Repository</a>, a service that provides common APIs for content storage, retrieval, signaling and so forth. With <a href="http://www.midgard-project.org/">Midgard</a> we're <a href="http://bergie.iki.fi/blog/midgard_2-more_than_just_php-more_than_just_cms/">following this approach</a>, providing <a href="http://bergie.iki.fi/blog/midgard_and_jcr-a_look_at_two_content_repositories/">content retrieval</a> and <a href="http://bergie.iki.fi/blog/midcom_3_at_a_glance/">web functionality APIs</a> first, and then building some reusable user interfaces on top of that.
</p>

<p>
In addition to Midgard some content repositories to look at include <a href="http://couchdb.apache.org/">Apache CouchDB</a> and <a href="http://jackrabbit.apache.org/">Jackrabbit</a>. All of them allow you to <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">stop worrying about storage and retrieval</a> methods and focus on the actual end user functionalities, while keeping the whole system accessible and scriptable for integration purposes.
</p>



<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/couchdb" rel="tag">couchdb</a>, <a href="http://www.technorati.com/tag/jcr" rel="tag">jcr</a>, <a href="http://www.technorati.com/tag/midgard" rel="tag">midgard</a></p>


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>midgard</category>
            <pubDate>Mon, 07 Sep 2009 14:16:47 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1de9bb913c8aef49bb911de99c0e1221457698f698f</guid>
        </item>
        <item>
            <title>How Midgard and Midgard2 differ</title>
            <link>http://bergie.iki.fi/blog/how_midgard_and_midgard2_differ/</link>
            <description><![CDATA[
<p>
I had to make some updates to the architecture diagrams, and I thought to publish them here to showcase the difference. <a href="http://www.midgard-project.org/midgard/8.09/">Midgard</a> was a CMS framework for PHP:
</p>

<p>
<img src="http://bergie.iki.fi/midcom-serveattachmentguid-1de99289822a404992811de891f478df01375907590/midgard-architecture-809.png" height="384" width="332" border="0" hspace="4" vspace="4" alt="Midgard 8.09 architecture" title="Midgard 8.09 architecture" /></p>

<p>
<a href="http://www.midgard2.org/">Midgard2</a> is a more <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">universal content repository</a> where CMS is just one application:
</p>

<p>
<img src="http://bergie.iki.fi/midcom-serveattachmentguid-1de992899dba7c8992811de891f478df01375907590/midgard2-architecture-909.png" height="477" width="429" border="0" hspace="4" vspace="4" alt="Midgard2 9.09 architecture" title="Midgard2 9.09 architecture" /></p>

<p>
Please note that more choice in databases and web servers is not the only goodie provided by Midgard2. You also get things like <a href="http://bergie.iki.fi/blog/some_plans_for_midcom_3/">a completely rewritten MVC framework</a>, <a href="http://blogs.nemein.com/people/piotras/view/1246881867.html">database views</a>, <a href="http://blogs.nemein.com/people/piotras/view/1246966442.html">transactions</a> and native <a href="http://blogs.nemein.com/people/piotras/view/1232642360.html">datetime objects</a>. And all of this for multiple programming languages, not <a href="http://bergie.iki.fi/blog/midgard_2-more_than_just_php-more_than_just_cms/">just PHP</a>.
</p>



<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/midgard" rel="tag">midgard</a></p>


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>midgard</category>
            <pubDate>Fri, 04 Sep 2009 07:57:34 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1de99289ae52a90992811de891f478df01375907590</guid>
        </item>
        <item>
            <title>Content repository talk in FrOSCon</title>
            <link>http://bergie.iki.fi/blog/content_repository_talk_in_froscon/</link>
            <description><![CDATA[
<p>
<a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">Content repositories can be useful</a> for your application. In the <a href="http://kore-nordmann.de/blog/0092_frsocon_upcoming.html">PHP track of FrOSCon</a> on Aug 22nd there will be a talk about this: <a href="http://programm.froscon.org/2009/events/417.en.html">Midgard2: Content repository for your PHP application</a>
</p>

<blockquote>
Content repositories allow you to separate the actual front-end of your application from background processing tools. More than just their underlying databases, they impose common rules for data access, and keep multiple applications up-to-date on data changes through signaling. Midgard2 provides a flexible content repository that avoids the restrictions of the traditional ORM approach. And not only your PHP web application, but also to possible Python, Objective-C and C# tools you use.
<br /><br />This enables you to split applications into smaller, easily maintainable and scalable pieces that can be run on different systems and platforms as needed. In addition to web, the Midgard2 library can be used for desktop and mobile application development, building software that synchronizes with web services. It is based and engineered fully on the top of the desktop (GNOME) software stack. Being highly modular and having very little dependencies it scales from a note taking application to a full-blown CMS system. Combined with advanced replication capabilities it allows you to synchronize data between offline and online instances of your service.
</blockquote>

<p>
Unlike shown in the program, the talk will be given by <a href="http://www.kaktus.cc/">Arttu Manninen</a> this time, as I will be <a href="http://bergie.iki.fi/blog/personal_passions-motorcycle_travel/">off motorcycling</a> somewhere around Asia Minor. Arttu? Yep, <a href="http://bergie.iki.fi/blog/tank-surfing-on-flickr/">this guy</a>:
</p>

<p>
<a href="http://www.flickr.com/photos/bergie/231727544/"><img src="http://farm1.static.flickr.com/82/231727544_dc4c74b75f.jpg" alt="Tank surfing" title="Tank surfing" /></a>
</p>



<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/froscon" rel="tag">froscon</a>, <a href="http://www.technorati.com/tag/midgard" rel="tag">midgard</a>, <a href="http://www.technorati.com/tag/php" rel="tag">php</a></p>


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1632 24.9277</georss:point>
            <category>midgard</category>
            <pubDate>Fri, 07 Aug 2009 19:57:56 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1de838c99ca1f64838c11deb1be257802a86df06df0</guid>
        </item>
        <item>
            <title>Will content repositories kill the file?</title>
            <link>http://bergie.iki.fi/blog/will_content_repositories_kill_the_file/</link>
            <description><![CDATA[
<p>
<a href="http://www.mdk.org.pl/">MDK</a> <a href="http://www.mdk.org.pl/2009/7/30/the-great-demise-of-the-file">laments the demise of the simple file</a> in the onslaught of storage services:
</p>

<blockquote>
Sure, the applications still give you a way to share things and take them out of the storage. You can export a contact out of your address book as a vcard file. But the role of The File here is slowly being reduced to a role of an intermediate storage medium. The business card is temporarily put in the .vcf file before it gets injected into somebody else’s database (another address book?).
<br /><br />As more and more applications operate on databases, the computer is becoming a monolithic black-box that “has things”. How exactly (and where) the data is stored is becoming less clear. The application and the interface becomes united with the user data. It becomes one.
</blockquote>

<p>
This echos the sentiments of <a href="http://al3x.net/">Alex Payne</a> when he <a href="http://al3x.net/2009/01/31/against-everything-buckets.html">warned against what he calls Everything Buckets</a>:
</p>

<blockquote>
Computers work best with structured data. Everything Buckets discourage the use of structured data by providing a convenient place to commingle “structureless” data like RTF and PDF documents. Rather than forcing the user to figure out the rhyme and reason of their data (for example, by putting receipts in a financial management application and addresses in an address book), Everything Buckets cry: “throw it all in here! Search it! Maybe I’ll corrupt my proprietary database, but maybe I won’t and you’ll have the joy of sifting through a mire of RTF documents. Doesn’t that sound great?”
</blockquote>

<p>
And yes, I agree that obscure application-specific databases are not really better than obscure proprietary file formats.
</p>

<p>
This is exactly why I've <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">been talking about content repositories</a>, services like <a href="http://www.midgard2.org/">Midgard2</a> and <a href="http://couchdb.apache.org/">CouchDb</a> that not only can provide superior content storage and organization, but do it in a way that multiple applications can share. You can easily write your own scripts to perform batch operations on the data, and receive <a href="http://teroheikkinen.iki.fi/blog/midgard_workshop_at_fscons/">D-Bus notifications</a> when something changes.
</p>

<p>
And good repositories also provide <a href="http://bergie.iki.fi/blog/couchdb_and_midgard_talking_with_each_other/">easy synchronization tools</a> so you can have your data available on all of your computers, and even <a href="http://bergie.iki.fi/blog/tomboy_web_synchronization-conboy_and_midgard/">on the web</a>. If they can also do peer-to-peer sharing, we're close to achieving the <a href="http://bergie.iki.fi/blog/free_desktop_and_the_cloud/">fully free cloud</a>.
</p>



<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/couchdb" rel="tag">couchdb</a>, <a href="http://www.technorati.com/tag/gnome" rel="tag">gnome</a>, <a href="http://www.technorati.com/tag/midgard" rel="tag">midgard</a></p>


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1754 24.9191</georss:point>
            <category>mobility</category>
            <pubDate>Thu, 30 Jul 2009 17:10:24 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-df3a9fe07d2b11deb3003d1acb6d517d517d</guid>
        </item>
        <item>
            <title>Why you should use a content repository for your application</title>
            <link>http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/</link>
            <description><![CDATA[
<p style="text-align:right;">
<img src="http://bergie.iki.fi/midcom-serveattachmentguid-c2ca82c86bb311de8b335be47077c124c124/midgard2-bubble-1.png" height="137" width="128" border="0" align="right" hspace="8" vspace="4" alt="Midgard2" title="Midgard2" /></p>

<p>
I gave my <a href="http://www.grancanariadesktopsummit.org/node/210">Midgard2: Content repository for desktop and the web</a> talk yesterday in <a href="http://www.grancanariadesktopsummit.org/">GCDS</a>. The <a href="http://www.slideshare.net/bergie/midgard2-content-repository-for-desktop-and-the-web">slides are available on SlideShare</a>. The main idea was that any application that deals with structured data could benefit from using a content repository like <a href="http://www.midgard2.org/">Midgard2</a> or <a href="http://couchdb.apache.org/">CouchDB</a>.
</p>

<p>
So, what is a content repository? It is a service that sits between an application and a data store. It provides several advantages:
</p>

<ul><li><strong>Common rules for data access</strong> mean that multiple applications can work with same content without breaking consistency of the data</li>
<li><strong>Signals about changes</strong> let applications know when another application using the repository modifies something, enabling collaborative data management between apps</li>
<li><strong>Objects instead of SQL</strong> mean that developers can deal with data using APIs more compatible with the rest of their desktop programming environment, and without having to fear issues like <a href="http://xkcd.com/327/">SQL injection</a></li>
<li><strong>Data model is scriptable</strong> when you use a content repository, meaning that users can easily write Python or PHP scripts to perform batch operations on their data without having to learn your storage format</li>
<li><strong>Synchronization and sharing</strong> features can be implemented on the content repository level meaning that you gain these features without having to worry about them</li>
</ul><p>
<a href="http://www.midgard2.org/">Midgard2</a> is a content repository library that is built on top of <em>glib</em>, <em>libgda</em> and <em>dbus</em>, making it fit the general free desktop infrastructure very well. You can use it in any application that is written in <a href="http://www.midgard-project.org/api-docs/midgard/core/mjolnir/">C</a>, <a href="http://www.mdk.org.pl/2009/3/26/midgard-objc-bindings">Objective-C</a>, <a href="http://www.midgard-project.org/documentation/python_midgard/">Python</a>, <a href="http://www.midgard-project.org/documentation/mgdschema-in-php/">PHP</a>, or soon <a href="http://www.flickr.com/photos/bergie/2439346766/">Mono</a>. Learn more <a href="http://www.slideshare.net/bergie/midgard2-content-repository-for-desktop-and-the-web">from the slides</a>!
</p>



<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/couchdb" rel="tag">couchdb</a>, <a href="http://www.technorati.com/tag/gnome" rel="tag">gnome</a>, <a href="http://www.technorati.com/tag/midgard" rel="tag">midgard</a>, <a href="http://www.technorati.com/tag/mono" rel="tag">mono</a></p>


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>28.1292 -15.4513</georss:point>
            <category>desktop</category>
            <pubDate>Wed, 08 Jul 2009 11:37:50 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-c45a20c66bb311de991c5b56e3857f077f07</guid>
        </item>
    </channel>
</rss>
