<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.6(BH)" -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss"
 xml:lang="en">
    <title>Henri Bergius</title>
    <subtitle>Motorcycle Adventures and Free Software from Henri Bergius</subtitle>
    <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/"/>
    <id>http://bergie.iki.fi/blog/</id>
    <updated>2010-03-18T12:27:33+00:00</updated>
    <author>
        <name>henri.bergius@iki.fi</name>
    </author>
    <generator>FeedCreator 1.7.6(BH) (info@mypapit.net)</generator>
    <link rel="self" type="application/atom+xml" href="http://bergie.iki.fi/blog/atom.xml" />
    <entry>
        <title>Easier templating for Midgard 8.09</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/easier_templating_for_midgard_8-09/"/>
        <published>2010-03-17T20:33:14+00:00</published>
        <updated>2010-03-17T20:33:14+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df32044fd172aa320411df84b1594ab9b013e813e8</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="midgard" />
        <content type="html"><![CDATA[
<p>For a while now there has been discussion about making <a href="http://www.kaktus.cc/weblog/372ed3bd0f54f3c74b1f158caf87f36a/">template editing</a> easier with <a href="http://www.midgard-project.org/midgard/">Midgard CMS</a>. In the Ragnaroek series we have a very <a href="http://www.midgard-project.org/documentation/concepts-midcom-specs-subsystems-style-engine/">comprehensive template system</a> where all output from the system can be overridden. While the possibilities have not always been easy to discover, things should be better in the <a href="http://trac.midgard-project.org/milestone/8.09.8%20Ragnaroek">next Ragnaroek LTS release</a>.</p>
<p>To access the template system just click F<em>older &gt; Edit layout template</em> in the <a href="http://bergie.iki.fi/blog/midgard-s-new-toolbar/">Midgard toolbar</a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3201efbd09f8320111df80bbcb7714e98cae8cae_midcom-toolbar-edittemplate.png" border="0" alt="midcom-toolbar-edittemplate.png" title="midcom-toolbar-edittemplate.png" /></p>
<p>This will take you into <a href="http://bergie.iki.fi/blog/building_a_new_admin_interface_for_midgard/">Asgard, the Midgard administration interface</a>. There you'll be shown what elements are used by the components running on your site:</p>
<p><img src="http://bergie.iki.fi/static/1/1df32022a590a94320211dfb0f36fd381e98e6a8e6a_asgard-template-possibleelements.png" border="0" alt="asgard-template-possibleelements.png" title="asgard-template-possibleelements.png" /></p>
<p>Clicking on an element name will let you create it. Then you'll be shown the default contents of that element to make overriding them easier. The language used in the templates is <a href="http://blog.astrumfutura.com/archives/420-Is-PHP-A-Worthy-Template-Language-Well,-of-course-it-is....html">obviously PHP</a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3202625fb4e2320211df96f1fd6cee6a91709170_asgard-element-defaults.png" border="0" alt="asgard-element-defaults.png" title="asgard-element-defaults.png" /></p>
<p>When you save your element it will replace the component's default output in the folders using that particular style. You can also do nice things like including contents from another page <a href="http://www.midgard-project.org/documentation/midcom-method-dynamic_load/">using Dynamic Loading</a>.</p>
<h2>What about file attachments?</h2>
<p>Asgard also allows you to add files (images, CSS, javascript, whatever) to your template. To do this click the <em>Attachments</em> button when you're in the style. There you'll be able to manage existing file attachments and to add new ones:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3202fe3bb7ee320211df80cfc1cacbe5946a946a_asgard-style-attachments-add.png" border="0" alt="asgard-style-attachments-add.png" title="asgard-style-attachments-add.png" /></p>
<p>If you're dealing with a text-based file (CSS, javascript, XML, ...) Asgard will also allow you to edit it directly on the web:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3203321b73ba320311df96f1fd6cee6a91709170_asgard-edit-css-file.png" border="0" alt="asgard-edit-css-file.png" title="asgard-edit-css-file.png" /></p>
<p>...and finally when you're done with your file and want to use it in some of your templates, the URL is available easily from the interface:</p>
<p><img src="http://bergie.iki.fi/static/1/1df32035ad2fc1a320311df80cfc1cacbe5946a946a_asgard-file-information-url.png" border="0" alt="asgard-file-information-url.png" title="asgard-file-information-url.png" /></p>]]></content>
        <summary type="html"><![CDATA[
<p>For a while now there has been discussion about making <a href="http://www.kaktus.cc/weblog/372ed3bd0f54f3c74b1f158caf87f36a/">template editing</a> easier with <a href="http://www.midgard-project.org/midgard/">Midgard CMS</a>. In the Ragnaroek series we have a very <a href="http://www.midgard-project.org/documentation/concepts-midcom-specs-subsystems-style-engine/">comprehensive template system</a> where all output from the system can be overridden. While the possibilities have not always been easy to discover, things should be better in the <a href="http://trac.midgard-project.org/milestone/8.09.8%20Ragnaroek">next Ragnaroek LTS release</a>.</p>
<p>To access the template system just click F<em>older &gt; Edit layout template</em> in the <a href="http://bergie.iki.fi/blog/midgard-s-new-toolbar/">Midgard toolbar</a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3201efbd09f8320111df80bbcb7714e98cae8cae_midcom-toolbar-edittemplate.png" border="0" alt="midcom-toolbar-edittemplate.png" title="midcom-toolbar-edittemplate.png" /></p>
<p>This will take you into <a href="http://bergie.iki.fi/blog/building_a_new_admin_interface_for_midgard/">Asgard, the Midgard administration interface</a>. There you'll be shown what elements are used by the components running on your site:</p>
<p><img src="http://bergie.iki.fi/static/1/1df32022a590a94320211dfb0f36fd381e98e6a8e6a_asgard-template-possibleelements.png" border="0" alt="asgard-template-possibleelements.png" title="asgard-template-possibleelements.png" /></p>
<p>Clicking on an element name will let you create it. Then you'll be shown the default contents of that element to make overriding them easier. The language used in the templates is <a href="http://blog.astrumfutura.com/archives/420-Is-PHP-A-Worthy-Template-Language-Well,-of-course-it-is....html">obviously PHP</a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3202625fb4e2320211df96f1fd6cee6a91709170_asgard-element-defaults.png" border="0" alt="asgard-element-defaults.png" title="asgard-element-defaults.png" /></p>
<p>When you save your element it will replace the component's default output in the folders using that particular style. You can also do nice things like including contents from another page <a href="http://www.midgard-project.org/documentation/midcom-method-dynamic_load/">using Dynamic Loading</a>.</p>
<h2>What about file attachments?</h2>
<p>Asgard also allows you to add files (images, CSS, javascript, whatever) to your template. To do this click the <em>Attachments</em> button when you're in the style. There you'll be able to manage existing file attachments and to add new ones:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3202fe3bb7ee320211df80cfc1cacbe5946a946a_asgard-style-attachments-add.png" border="0" alt="asgard-style-attachments-add.png" title="asgard-style-attachments-add.png" /></p>
<p>If you're dealing with a text-based file (CSS, javascript, XML, ...) Asgard will also allow you to edit it directly on the web:</p>
<p><img src="http://bergie.iki.fi/static/1/1df3203321b73ba320311df96f1fd6cee6a91709170_asgard-edit-css-file.png" border="0" alt="asgard-edit-css-file.png" title="asgard-edit-css-file.png" /></p>
<p>...and finally when you're done with your file and want to use it in some of your templates, the URL is available easily from the interface:</p>
<p><img src="http://bergie.iki.fi/static/1/1df32035ad2fc1a320311df80cfc1cacbe5946a946a_asgard-file-information-url.png" border="0" alt="asgard-file-information-url.png" title="asgard-file-information-url.png" /></p>]]></summary>
        <georss:point>60.1717 24.928101</georss:point>
    </entry>
    <entry>
        <title>First year of Qaiku, and a travel writing challenge</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/first_year_of_qaiku-and_a_travel_writing_challenge/"/>
        <published>2010-03-09T21:00:09+00:00</published>
        <updated>2010-03-09T21:00:09+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df2bbebf6658b62bbe11dfb4a947f5df1c12871287</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>-3.06343 -60.106998</georss:point>
    </entry>
    <entry>
        <title>Getting started with the Midgard content repository</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/getting_started_with_the_midgard_content_repository/"/>
        <published>2010-03-09T15:50:26+00:00</published>
        <updated>2010-03-09T15:50:26+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df2b937abcafba2b9311df8feac5680ae0b314b314</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>-3.06343 -60.106998</georss:point>
    </entry>
    <entry>
        <title>CMS Watch on their Midgard usage</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/cms_watch_on_their_midgard_usage/"/>
        <published>2010-03-08T18:24:26+00:00</published>
        <updated>2010-03-08T18:24:26+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df2adfd3b9cf802adf11df924fff308a1dbaf7baf7</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="midgard" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>-3.06343 -60.106998</georss:point>
    </entry>
    <entry>
        <title>Register and log into meego.com using your maemo.org account</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/register_and_log_into_meego-com_using_your_maemo-org_account/"/>
        <published>2010-02-24T13:57:09+00:00</published>
        <updated>2010-02-24T13:57:09+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df214c801741f6214c11df81724157cc3a80998099</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="midgard" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.167999 24.9263</georss:point>
    </entry>
    <entry>
        <title>Wallpapers for Ubuntu 10.04: my submissions</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/wallpapers_for_ubuntu_10-04-my_submissions/"/>
        <published>2010-02-24T11:03:08+00:00</published>
        <updated>2010-02-24T11:03:08+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df213430bdfef0213411dfb09eaf71f8da25e425e4</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![CDATA[
<p><a href="https://wiki.ubuntu.com/LucidLynx">Ubuntu 10.04</a> "Lucid Lynx" is coming and they're <a href="https://wiki.ubuntu.com/Artwork/Incoming/Lucid/Wallpaper_Contest_Planning">looking for suitable wallpapers</a>. I <a href="http://www.flickr.com/groups/ubuntu-artwork/pool/15087210@N00/">made some submissions</a> and was pretty happy to see one of them in the <a href="http://www.techdrivein.com/2010/02/top-15-wallpapers-for-ubuntu-1004-lucid.html">Top 15 wallpapers for Ubuntu Lucid</a> post:</p>
<p><a href="http://www.flickr.com/photos/bergie/321447455/in/pool-ubuntu-artwork"><img src="http://farm1.static.flickr.com/126/321447455_2d54ef237d.jpg" border="0" alt="Shnjaka sailing on lake Onega, Russia" title="Shnjaka sailing on lake Onega" /></a></p>
<p>Here are some other submissions I made:</p>
<p><a href="http://www.flickr.com/photos/bergie/309644595/in/pool-ubuntu-artwork"><img src="http://farm1.static.flickr.com/108/309644595_dab479e233_m.jpg" border="0" alt="Lights of the Itaipu dam, Brazil" title="Lights of the Itaipu dam, Brazil" /></a> <a href="http://www.flickr.com/photos/bergie/2708621916/in/pool-ubuntu-artwork"><img src="http://farm4.static.flickr.com/3098/2708621916_18e17ebcef_m.jpg" border="0" alt="Sunset on the Aegean sea, Turkey" title="Sunset on the Aegean sea, Turkey" /></a> <a href="http://www.flickr.com/photos/bergie/3862191013/in/pool-ubuntu-artwork"><img src="http://farm3.static.flickr.com/2434/3862191013_aff947ecc6_m.jpg" border="0" alt="Motorcycling on mountain roads, Albania" title="Motorcycling on mountain roads, Albania" /></a></p>]]></content>
        <summary type="html"><![CDATA[
<p><a href="https://wiki.ubuntu.com/LucidLynx">Ubuntu 10.04</a> "Lucid Lynx" is coming and they're <a href="https://wiki.ubuntu.com/Artwork/Incoming/Lucid/Wallpaper_Contest_Planning">looking for suitable wallpapers</a>. I <a href="http://www.flickr.com/groups/ubuntu-artwork/pool/15087210@N00/">made some submissions</a> and was pretty happy to see one of them in the <a href="http://www.techdrivein.com/2010/02/top-15-wallpapers-for-ubuntu-1004-lucid.html">Top 15 wallpapers for Ubuntu Lucid</a> post:</p>
<p><a href="http://www.flickr.com/photos/bergie/321447455/in/pool-ubuntu-artwork"><img src="http://farm1.static.flickr.com/126/321447455_2d54ef237d.jpg" border="0" alt="Shnjaka sailing on lake Onega, Russia" title="Shnjaka sailing on lake Onega" /></a></p>
<p>Here are some other submissions I made:</p>
<p><a href="http://www.flickr.com/photos/bergie/309644595/in/pool-ubuntu-artwork"><img src="http://farm1.static.flickr.com/108/309644595_dab479e233_m.jpg" border="0" alt="Lights of the Itaipu dam, Brazil" title="Lights of the Itaipu dam, Brazil" /></a> <a href="http://www.flickr.com/photos/bergie/2708621916/in/pool-ubuntu-artwork"><img src="http://farm4.static.flickr.com/3098/2708621916_18e17ebcef_m.jpg" border="0" alt="Sunset on the Aegean sea, Turkey" title="Sunset on the Aegean sea, Turkey" /></a> <a href="http://www.flickr.com/photos/bergie/3862191013/in/pool-ubuntu-artwork"><img src="http://farm3.static.flickr.com/2434/3862191013_aff947ecc6_m.jpg" border="0" alt="Motorcycling on mountain roads, Albania" title="Motorcycling on mountain roads, Albania" /></a></p>]]></summary>
        <georss:point>60.167999 24.9263</georss:point>
    </entry>
    <entry>
        <title>Going to the Bossa Conference</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/going_to_the_bossa_conference/"/>
        <published>2010-02-23T12:38:44+00:00</published>
        <updated>2010-02-23T12:38:44+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df2078618248a0207811dfbc30997c9fb3d8eed8ee</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.169899 24.9384</georss:point>
    </entry>
    <entry>
        <title>Maemo's community involvement infrastructure is what MeeGo needs</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/maemo-s_community_involvement_infrastructure_is_what_meego_needs/"/>
        <published>2010-02-16T09:39:35+00:00</published>
        <updated>2010-02-16T09:39:35+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df1adf313a4aec1adf11df91d009c4739223262326</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![CDATA[
<p><a href="http://maemo.org/">Nokia's Maemo</a> and <a href="http://moblin.org/">Intel's Moblin</a> are merging to form <a href="http://meego.com/">MeeGo</a>, a development environment for a new class of internet-connected devices ranging from smartphones through netbooks to TV sets. This may be finally what provides the free software world with a consistent and modern alternative to the <a href="http://bergie.iki.fi/blog/ipad_and_information_appliances-a_free_software_angle/">iPhones and iPads</a> that the proprietary world has come up with, the "magical user experiences" Linux Foundation's <a href="http://www.linux.com/news/featured-blogs/158-jim-zemlin/281338-linux-can-compete-with-the-ipad-on-price-but-wheres-the-magic">Jim Zemlin was asking for</a>.</p>
<p><img src="http://bergie.iki.fi/static/1/1df1adcc83389021adc11dfbd6acbf8ba612c7f2c7f_meego-small-png.jpg" border="0" alt="meego-small.png" title="meego-small.png" /></p>
<p><a href="http://developer.android.com/guide/basics/what-is-android.html">Unlike Android</a>, both Moblin and Maemo stacks have been very promising in the sense that <a href="http://wiki.maemo.org/Documentation/Maemo_5_Developer_Guide/Architecture/Top_Level_Architecture">they've been closely aligned with</a> existing and well-known Linux desktop technologies. All RPC communications happen through D-Bus, Qt or Clutter is used as the GUI toolkit, there is <a href="http://telepathy.freedesktop.org/wiki/">Telepathy</a> for integrated VoIP and IM communications, and Moblin even comes with the <a href="http://software.intel.com/en-us/articles/geoclue-location-information-retrieval-for-moblin-20-linux/">GeoClue location service</a>.</p>
<p>So far the discussion about this merge has very much focused on technical terms: what toolkit to use (Qt is recommended), what package manager (RPM) and so forth. However, <a href="http://talk.maemo.org/showpost.php?p=527267&amp;postcount=93">what hasn't been discussed yet</a> is what will happen to Maemo's excellent <a href="http://wiki.meego.com/Maemo_and_Moblin_community_assets">infrastructure for community involvement</a>:</p>
<ul><li><a href="http://maemo.org/community/brainstorm/"><strong>Brainstorm</strong></a> is a tool for proposing ideas and solutions to them, and then voting to qualify them. This is a very good way to gather ideas and feedback from the community, and some brainstorms have even ended up having community-led free implementations available, freeing Nokia from having to write all platform functionality</li>
<li><a href="http://talk.maemo.org/"><strong>Talk</strong></a> is the very popular forum for both Maemo end users and developers. Having an open forum to discuss it all, and having also people from Nokia and Intel there would help to communicate the aims and decisions around the platform a lot better</li>
<li><a href="http://maemo.org/packages/"><strong>Packages</strong></a> and <a href="http://maemo.org/downloads/Maemo5/"><strong>Downloads</strong></a> provide a fully open and crowdsourced "app store experience" where the community is free to develop, upload and install Maemo applications through a consistent service that <a href="http://wiki.maemo.org/Extras-testing">provides quality control</a>, <a href="http://tabletui.wordpress.com/2009/12/22/2010-ui-countdown-9-%E2%80%93-extras-assistant/">nice installers</a> and a <a href="http://blog.karlitschek.de/2009/11/open-collaboration-services.html">free API</a> for browsing the software available</li>
<li><a href="http://wiki.maemo.org/Task:Community_Council"><strong>Community Council</strong></a> and the <a href="http://wiki.maemo.org/Maemo.org_Sprints"><strong>Sprint process</strong></a> have been the way Maemo's community infrastructure has been designed and developed out in the open. The various tasks have been documented in the Wiki, and people have been able to follow the progress through <a href="http://www.qaiku.com/channels/show/maemork/">a Qaiku workstream</a></li>
<li><a href="http://wiki.maemo.org/Karma"><strong>Karma</strong></a> is a way to credit community members for their involvement. The involvement can be technical (for instance, developing a popular Maemo application) or social (publishing popular blog posts or helping people on Talk), and has been used as a criteria for Community Council and other elections. Karma also helps Nokia to qualify community members, to find the people who should have access the developer devices for instance. In a large community it is hard to identify the people who are just loud and the people who are doing actual valuable contributions from each other without such tools</li>
<li><a href="http://maemo.org/news/"><strong>Social News</strong></a> and <a href="http://maemo.org/news/planet-maemo/"><strong>Planet</strong></a> are a way for the community to aggregate and promote important posts around the project. We look at things like social bookmarking, blog links and votes happening on the Maemo site to <a href="http://bergie.iki.fi/blog/maemo_social_news_launched/">determine the most important stories</a> of the day, to provide an "automatic newspaper" for the project</li>
</ul><p>Providing all or some of these services as part of the MeeGo infrastructure would enable the community to feel involvement, and even ownership in the new project that is shaping up. This is critical for a project that has such a big reliance on new innovation and connectivity with the upstream, especially at the time of such big change.</p>]]></content>
        <summary type="html"><![CDATA[
<p><a href="http://maemo.org/">Nokia's Maemo</a> and <a href="http://moblin.org/">Intel's Moblin</a> are merging to form <a href="http://meego.com/">MeeGo</a>, a development environment for a new class of internet-connected devices ranging from smartphones through netbooks to TV sets. This may be finally what provides the free software world with a consistent and modern alternative to the <a href="http://bergie.iki.fi/blog/ipad_and_information_appliances-a_free_software_angle/">iPhones and iPads</a> that the proprietary world has come up with, the "magical user experiences" Linux Foundation's <a href="http://www.linux.com/news/featured-blogs/158-jim-zemlin/281338-linux-can-compete-with-the-ipad-on-price-but-wheres-the-magic">Jim Zemlin was asking for</a>.</p>
<p><img src="http://bergie.iki.fi/static/1/1df1adcc83389021adc11dfbd6acbf8ba612c7f2c7f_meego-small-png.jpg" border="0" alt="meego-small.png" title="meego-small.png" /></p>
<p><a href="http://developer.android.com/guide/basics/what-is-android.html">Unlike Android</a>, both Moblin and Maemo stacks have been very promising in the sense that <a href="http://wiki.maemo.org/Documentation/Maemo_5_Developer_Guide/Architecture/Top_Level_Architecture">they've been closely aligned with</a> existing and well-known Linux desktop technologies. All RPC communications happen through D-Bus, Qt or Clutter is used as the GUI toolkit, there is <a href="http://telepathy.freedesktop.org/wiki/">Telepathy</a> for integrated VoIP and IM communications, and Moblin even comes with the <a href="http://software.intel.com/en-us/articles/geoclue-location-information-retrieval-for-moblin-20-linux/">GeoClue location service</a>.</p>
<p>So far the discussion about this merge has very much focused on technical terms: what toolkit to use (Qt is recommended), what package manager (RPM) and so forth. However, <a href="http://talk.maemo.org/showpost.php?p=527267&amp;postcount=93">what hasn't been discussed yet</a> is what will happen to Maemo's excellent <a href="http://wiki.meego.com/Maemo_and_Moblin_community_assets">infrastructure for community involvement</a>:</p>
<ul><li><a href="http://maemo.org/community/brainstorm/"><strong>Brainstorm</strong></a> is a tool for proposing ideas and solutions to them, and then voting to qualify them. This is a very good way to gather ideas and feedback from the community, and some brainstorms have even ended up having community-led free implementations available, freeing Nokia from having to write all platform functionality</li>
<li><a href="http://talk.maemo.org/"><strong>Talk</strong></a> is the very popular forum for both Maemo end users and developers. Having an open forum to discuss it all, and having also people from Nokia and Intel there would help to communicate the aims and decisions around the platform a lot better</li>
<li><a href="http://maemo.org/packages/"><strong>Packages</strong></a> and <a href="http://maemo.org/downloads/Maemo5/"><strong>Downloads</strong></a> provide a fully open and crowdsourced "app store experience" where the community is free to develop, upload and install Maemo applications through a consistent service that <a href="http://wiki.maemo.org/Extras-testing">provides quality control</a>, <a href="http://tabletui.wordpress.com/2009/12/22/2010-ui-countdown-9-%E2%80%93-extras-assistant/">nice installers</a> and a <a href="http://blog.karlitschek.de/2009/11/open-collaboration-services.html">free API</a> for browsing the software available</li>
<li><a href="http://wiki.maemo.org/Task:Community_Council"><strong>Community Council</strong></a> and the <a href="http://wiki.maemo.org/Maemo.org_Sprints"><strong>Sprint process</strong></a> have been the way Maemo's community infrastructure has been designed and developed out in the open. The various tasks have been documented in the Wiki, and people have been able to follow the progress through <a href="http://www.qaiku.com/channels/show/maemork/">a Qaiku workstream</a></li>
<li><a href="http://wiki.maemo.org/Karma"><strong>Karma</strong></a> is a way to credit community members for their involvement. The involvement can be technical (for instance, developing a popular Maemo application) or social (publishing popular blog posts or helping people on Talk), and has been used as a criteria for Community Council and other elections. Karma also helps Nokia to qualify community members, to find the people who should have access the developer devices for instance. In a large community it is hard to identify the people who are just loud and the people who are doing actual valuable contributions from each other without such tools</li>
<li><a href="http://maemo.org/news/"><strong>Social News</strong></a> and <a href="http://maemo.org/news/planet-maemo/"><strong>Planet</strong></a> are a way for the community to aggregate and promote important posts around the project. We look at things like social bookmarking, blog links and votes happening on the Maemo site to <a href="http://bergie.iki.fi/blog/maemo_social_news_launched/">determine the most important stories</a> of the day, to provide an "automatic newspaper" for the project</li>
</ul><p>Providing all or some of these services as part of the MeeGo infrastructure would enable the community to feel involvement, and even ownership in the new project that is shaping up. This is critical for a project that has such a big reliance on new innovation and connectivity with the upstream, especially at the time of such big change.</p>]]></summary>
        <georss:point>60.176102 24.920099</georss:point>
    </entry>
    <entry>
        <title>Buzz may end segregation in microblogging</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/buzz_may_end_segregation_in_microblogging/"/>
        <published>2010-02-10T20:16:11+00:00</published>
        <updated>2010-02-10T20:16:11+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df16812193b798168111dfafdde581d4e61d0c1d0c</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="oscom" />
        <content type="html"><![CDATA[
<p>Yet another interesting launch this winter: Google<a href="http://googleblog.blogspot.com/2010/02/introducing-google-buzz.html"> finally published</a> their lifestreaming application, <a href="http://www.google.com/buzz">Buzz</a>. These are still clearly early steps for the service as it doesn't <a href="http://code.google.com/apis/buzz/documentation/#coming-soon">provide any APIs yet</a>, and the user interface feels slow in a quite un-Google-like way.</p>
<div>However, it still shows strong potential in several ways. First of all, it may <a href="http://twitter.com/lindstorm/status/8907749896">help the people raised on Twitter</a> to discover a <a href="http://bergie.iki.fi/blog/microblogging-why_qaiku_might_do_what_twitter_and_brightkite_didn-t/">more conversational culture</a>. And secondly, it connects to any website providing some necessary feeds, promising an end to segregation where you had to follow some of your friends on <a href="http://twitter.com/">Twitter</a>, some in <a href="http://www.qaiku.com/">Qaiku</a> and some in <a href="http://www.facebook.com/">Facebook</a>. If all those sites start providing proper feeds you can just follow everybody in the interface of your choosing.</div>
<div><br /></div>
<div><img src="http://bergie.iki.fi/static/1/1df167f580263c6167f11df81245d5e545e0dec0dec_buzz-in-gmail-png.jpg" border="0" alt="buzz-in-gmail.png" title="buzz-in-gmail.png" /><br /></div>
<div><br /></div>
<div>What is even more promising is that instead of being built on direct API linkage between designated partner sites, all of this is based on quite simple building blocks of the <a href="http://bergie.iki.fi/blog/google-s_rich_snippets_will_lead_us_into_semantic_web/">upcoming semantic web</a>: <a href="http://code.google.com/apis/socialgraph/">social graph discovery</a>, <a href="http://activitystrea.ms/">Atom activity feeds</a>, and possibly the <a href="http://www.salmon-protocol.org/">Salmon comments aggregation protocol</a>. Your website, marked up in a semantic way <a href="http://allinthehead.com/retro/301/can-your-website-be-your-api">is your "API"</a>. This means <a href="http://code.google.com/apis/buzz/documentation/#connect">any site can join the play</a>, not just the big players.</div>
<div><br /></div>
<div>But to be fully usable Buzz needs to provide a few things:   
<ul><li>Language filtering. I had to unfollow some Portuguese-speaking friends already</li>
<li>Discovery of interesting discussions. Now I only see things my friends post, not the things they comment</li>
<li>Groups or channels people can post to</li>
<li>and yes, Salmon so comments to my posts on Buzz will trickle down to Qaiku or my blog</li>
</ul>
As things stand for now, <a href="http://www.qaiku.com/home/bergie/">Qaiku</a> will remain the conversation platform of my choice. It provides more flexible privacy, including our company's internal conversation channels, and does better job of geolocation and multilingual microblogging. You'll also find my Qaikus <a href="http://twitter.com/bergie">syndicated to Twitter</a>.
</div>]]></content>
        <summary type="html"><![CDATA[
<p>Yet another interesting launch this winter: Google<a href="http://googleblog.blogspot.com/2010/02/introducing-google-buzz.html"> finally published</a> their lifestreaming application, <a href="http://www.google.com/buzz">Buzz</a>. These are still clearly early steps for the service as it doesn't <a href="http://code.google.com/apis/buzz/documentation/#coming-soon">provide any APIs yet</a>, and the user interface feels slow in a quite un-Google-like way.</p>
<div>However, it still shows strong potential in several ways. First of all, it may <a href="http://twitter.com/lindstorm/status/8907749896">help the people raised on Twitter</a> to discover a <a href="http://bergie.iki.fi/blog/microblogging-why_qaiku_might_do_what_twitter_and_brightkite_didn-t/">more conversational culture</a>. And secondly, it connects to any website providing some necessary feeds, promising an end to segregation where you had to follow some of your friends on <a href="http://twitter.com/">Twitter</a>, some in <a href="http://www.qaiku.com/">Qaiku</a> and some in <a href="http://www.facebook.com/">Facebook</a>. If all those sites start providing proper feeds you can just follow everybody in the interface of your choosing.</div>
<div><br /></div>
<div><img src="http://bergie.iki.fi/static/1/1df167f580263c6167f11df81245d5e545e0dec0dec_buzz-in-gmail-png.jpg" border="0" alt="buzz-in-gmail.png" title="buzz-in-gmail.png" /><br /></div>
<div><br /></div>
<div>What is even more promising is that instead of being built on direct API linkage between designated partner sites, all of this is based on quite simple building blocks of the <a href="http://bergie.iki.fi/blog/google-s_rich_snippets_will_lead_us_into_semantic_web/">upcoming semantic web</a>: <a href="http://code.google.com/apis/socialgraph/">social graph discovery</a>, <a href="http://activitystrea.ms/">Atom activity feeds</a>, and possibly the <a href="http://www.salmon-protocol.org/">Salmon comments aggregation protocol</a>. Your website, marked up in a semantic way <a href="http://allinthehead.com/retro/301/can-your-website-be-your-api">is your "API"</a>. This means <a href="http://code.google.com/apis/buzz/documentation/#connect">any site can join the play</a>, not just the big players.</div>
<div><br /></div>
<div>But to be fully usable Buzz needs to provide a few things:   
<ul><li>Language filtering. I had to unfollow some Portuguese-speaking friends already</li>
<li>Discovery of interesting discussions. Now I only see things my friends post, not the things they comment</li>
<li>Groups or channels people can post to</li>
<li>and yes, Salmon so comments to my posts on Buzz will trickle down to Qaiku or my blog</li>
</ul>
As things stand for now, <a href="http://www.qaiku.com/home/bergie/">Qaiku</a> will remain the conversation platform of my choice. It provides more flexible privacy, including our company's internal conversation channels, and does better job of geolocation and multilingual microblogging. You'll also find my Qaikus <a href="http://twitter.com/bergie">syndicated to Twitter</a>.
</div>]]></summary>
        <georss:point>60.1633 24.9279</georss:point>
    </entry>
    <entry>
        <title>Halti.com provides contextual product recommendations</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/halti-com_provides_contextual_product_recommendations/"/>
        <published>2010-02-10T15:33:05+00:00</published>
        <updated>2010-02-10T15:33:05+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df165995023e66165911dfae5e39ee72ad6ab26ab2</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="geo" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.166401 24.9175</georss:point>
    </entry>
    <entry>
        <title>iPad and information appliances, a free software angle</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/ipad_and_information_appliances-a_free_software_angle/"/>
        <published>2010-01-28T09:51:43+00:00</published>
        <updated>2010-01-28T09:51:43+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df0bf2bdda29fa0bf211dfb0f98b2aae0eed19ed19</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="business" />
        <content type="html"><![CDATA[
<p><a href="http://arstechnica.com/apple/news/2010/01/apple-announces-ipad-attempts-to-change-the-world.ars">Apple iPad</a> is certainly interesting. It seeks to <a href="http://mobileopportunity.blogspot.com/2010/01/ipad-attempted-windows-killer_27.html">challenge the concept  of PCs</a> by providing something that is at the same time more personal,  and a lot easier to use. <a href="http://www.techcrunch.com/2010/01/27/ipad/">The personal computer of the future</a>.<br /><br /> Gone is difficult file organization - instead, applications use their  <a href="http://bergie.iki.fi/blog/will_content_repositories_kill_the_file/">own purpose-build content repositories</a>. Instead of seeking software from  many places, all of it is easily available in an App Store, all  <a href="http://www.macworld.com/article/134960/2008/08/appstore.html">quality-controlled by Apple</a>. And same thing with content - <a href="http://bergie.iki.fi/blog/amazon_kindle_could_be_the_library_of_the_working_nomad/">forget about  bookshelves</a> and stacks of CDs, instead simply dowloading all you need  from iTunes.<br /><br /> This sort of user experience obviously <a href="http://www.defectivebydesign.org/ipad">comes with a cost</a>. Important  computing concepts <a href="http://www.theiphoneblog.com/2010/01/27/ipad-multitasking-notifications-tv-subscriptions-camera-tethering-textbooks/">like multitasking are not supported</a>. The  iTunes/App Store experience means that Apple <a href="http://arstechnica.com/tech-policy/news/2010/01/protestors-ipad-is-nothing-more-than-a-golden-calf-of-drm.ars">is in the position to  ensure</a> no software or content competing with its or its business  partners' business model gets on the device. And most of the content you  buy for the device is <a href="http://www.defectivebydesign.org/what_is_drm">DRM'd</a>, meaning that you're only renting it for  the time allowed by content owners, never buying.<br /><br /> Even with the limitations concerned I can see myself buying an iPad. It  would serve as a very nice device for web surfing from the couch and as  an e-reader on business trips. I can also see myself <a href="http://www.readwriteweb.com/start/2010/01/what-the-ipad-means-for-startu.php">running demos</a> and  presentations from it instead of a laptop.<br /><br /> Even with the limitations concerned, it is likely that the iPad will  happen, and will blaze the trail towards a new way of personal  computing. <a href="http://www.stephenfry.com/2010/01/28/ipad-about/">Stephen Fry says it well</a>:</p>
<blockquote>Like the first iPhone, iPad 1.0 is a John the Baptist preparing the way  of what is to come, but also like iPhone 1.0 (and Jokanaan himself too  come to that) iPad 1.0 is still fantastic enough in its own right to be  classed as a stunningly exciting object, one that you will want NOW and  one that will not be matched this year by any company. In the future,  when it has two cameras for fully featured video conferencing, GPS and  who knows what else built in (1080 HD TV reception and recording and  nano projection, for example) and when the iBook store has recorded its  100 millionth download and the thousands of accessories and peripherals  that have invented uses for iPad that we simply can’t now imagine – when  that has happened it will all have seemed so natural and inevitable  that today’s nay-sayers and sceptics will have forgotten that they ever doubted its potential.</blockquote>
<p>The success of iPad will mean more than just a completely new level of App  Store economy. Other companies will certainly seek to emulate the model,  coming up with their own <a href="http://en.wikipedia.org/wiki/Post-WIMP">post-WIMP</a> devices and their <a href="http://www.engadget.com/2009/05/26/nokia-ovi-store-now-live-everywhere/">own content and  software ecosystems</a>. This all will be a challenge for the free software  movement.<br /><br /> The world of free software is still very much stuck in what computing  was in the 90s. We think of desktop computers, we <a href="http://bergie.iki.fi/blog/free_desktop_and_the_cloud/">do not integrate with  the web</a>. And we do not get the transformation that is happening with  personal computers. Taught by smartphones and cloud applications, users  are moving from desktops through simple netbooks towards <a href="http://gizmodo.com/5452501/the-apple-tablet-interface-must-be-like-this">information  appliances</a>.<br /><br /> With information appliances you need <a href="http://bergie.iki.fi/blog/direct_manipulation_interfaces/">a seamless user interface</a>. You need  an ecosystem where content comes alongside the software to utilize it.  You need to move past the old WIMP metaphors and the idea of separation  between data stored in a a file system and the software manipulating it.<br /><br /> So far the first convincing attempt towards this direction I've seen in  the free software world is <a href="http://www.socialdesktop.org/">KDE's Social Desktop initiative</a>. It allows  users to connect with each other straight through the desktop, and it  allows discovery of new applications and content to download and use  straight in the applications. We also use it with <a href="http://danielwilms.wordpress.com/2010/01/27/download-assistant-for-extras-applications/">Maemo's new App  Downloader</a>.<br /><br /> Threatened by the cloud from one end, and closed-ecosystem appliances  from the other, it will be interesting to see how we react. Will we rise  to the challenge and start providing new user experiences? Will we  build a free cloud? Will we integrate with initiatives like <a href="http://www.gutenberg.org/wiki/Main_Page">Project  Gutenberg</a> and <a href="http://creativecommons.org/">Creative Commons</a> to provide the content integration? Will <a href="http://openwebfoundation.org/"> the open web</a> be our safe haven?<br /><br /> Definitely interesting times to be a software developer.</p>]]></content>
        <summary type="html"><![CDATA[
<p><a href="http://arstechnica.com/apple/news/2010/01/apple-announces-ipad-attempts-to-change-the-world.ars">Apple iPad</a> is certainly interesting. It seeks to <a href="http://mobileopportunity.blogspot.com/2010/01/ipad-attempted-windows-killer_27.html">challenge the concept  of PCs</a> by providing something that is at the same time more personal,  and a lot easier to use. <a href="http://www.techcrunch.com/2010/01/27/ipad/">The personal computer of the future</a>.<br /><br /> Gone is difficult file organization - instead, applications use their  <a href="http://bergie.iki.fi/blog/will_content_repositories_kill_the_file/">own purpose-build content repositories</a>. Instead of seeking software from  many places, all of it is easily available in an App Store, all  <a href="http://www.macworld.com/article/134960/2008/08/appstore.html">quality-controlled by Apple</a>. And same thing with content - <a href="http://bergie.iki.fi/blog/amazon_kindle_could_be_the_library_of_the_working_nomad/">forget about  bookshelves</a> and stacks of CDs, instead simply dowloading all you need  from iTunes.<br /><br /> This sort of user experience obviously <a href="http://www.defectivebydesign.org/ipad">comes with a cost</a>. Important  computing concepts <a href="http://www.theiphoneblog.com/2010/01/27/ipad-multitasking-notifications-tv-subscriptions-camera-tethering-textbooks/">like multitasking are not supported</a>. The  iTunes/App Store experience means that Apple <a href="http://arstechnica.com/tech-policy/news/2010/01/protestors-ipad-is-nothing-more-than-a-golden-calf-of-drm.ars">is in the position to  ensure</a> no software or content competing with its or its business  partners' business model gets on the device. And most of the content you  buy for the device is <a href="http://www.defectivebydesign.org/what_is_drm">DRM'd</a>, meaning that you're only renting it for  the time allowed by content owners, never buying.<br /><br /> Even with the limitations concerned I can see myself buying an iPad. It  would serve as a very nice device for web surfing from the couch and as  an e-reader on business trips. I can also see myself <a href="http://www.readwriteweb.com/start/2010/01/what-the-ipad-means-for-startu.php">running demos</a> and  presentations from it instead of a laptop.<br /><br /> Even with the limitations concerned, it is likely that the iPad will  happen, and will blaze the trail towards a new way of personal  computing. <a href="http://www.stephenfry.com/2010/01/28/ipad-about/">Stephen Fry says it well</a>:</p>
<blockquote>Like the first iPhone, iPad 1.0 is a John the Baptist preparing the way  of what is to come, but also like iPhone 1.0 (and Jokanaan himself too  come to that) iPad 1.0 is still fantastic enough in its own right to be  classed as a stunningly exciting object, one that you will want NOW and  one that will not be matched this year by any company. In the future,  when it has two cameras for fully featured video conferencing, GPS and  who knows what else built in (1080 HD TV reception and recording and  nano projection, for example) and when the iBook store has recorded its  100 millionth download and the thousands of accessories and peripherals  that have invented uses for iPad that we simply can’t now imagine – when  that has happened it will all have seemed so natural and inevitable  that today’s nay-sayers and sceptics will have forgotten that they ever doubted its potential.</blockquote>
<p>The success of iPad will mean more than just a completely new level of App  Store economy. Other companies will certainly seek to emulate the model,  coming up with their own <a href="http://en.wikipedia.org/wiki/Post-WIMP">post-WIMP</a> devices and their <a href="http://www.engadget.com/2009/05/26/nokia-ovi-store-now-live-everywhere/">own content and  software ecosystems</a>. This all will be a challenge for the free software  movement.<br /><br /> The world of free software is still very much stuck in what computing  was in the 90s. We think of desktop computers, we <a href="http://bergie.iki.fi/blog/free_desktop_and_the_cloud/">do not integrate with  the web</a>. And we do not get the transformation that is happening with  personal computers. Taught by smartphones and cloud applications, users  are moving from desktops through simple netbooks towards <a href="http://gizmodo.com/5452501/the-apple-tablet-interface-must-be-like-this">information  appliances</a>.<br /><br /> With information appliances you need <a href="http://bergie.iki.fi/blog/direct_manipulation_interfaces/">a seamless user interface</a>. You need  an ecosystem where content comes alongside the software to utilize it.  You need to move past the old WIMP metaphors and the idea of separation  between data stored in a a file system and the software manipulating it.<br /><br /> So far the first convincing attempt towards this direction I've seen in  the free software world is <a href="http://www.socialdesktop.org/">KDE's Social Desktop initiative</a>. It allows  users to connect with each other straight through the desktop, and it  allows discovery of new applications and content to download and use  straight in the applications. We also use it with <a href="http://danielwilms.wordpress.com/2010/01/27/download-assistant-for-extras-applications/">Maemo's new App  Downloader</a>.<br /><br /> Threatened by the cloud from one end, and closed-ecosystem appliances  from the other, it will be interesting to see how we react. Will we rise  to the challenge and start providing new user experiences? Will we  build a free cloud? Will we integrate with initiatives like <a href="http://www.gutenberg.org/wiki/Main_Page">Project  Gutenberg</a> and <a href="http://creativecommons.org/">Creative Commons</a> to provide the content integration? Will <a href="http://openwebfoundation.org/"> the open web</a> be our safe haven?<br /><br /> Definitely interesting times to be a software developer.</p>]]></summary>
        <georss:point>60.176201 24.9202</georss:point>
    </entry>
    <entry>
        <title>Direct manipulation interfaces</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/direct_manipulation_interfaces/"/>
        <published>2010-01-21T13:26:44+00:00</published>
        <updated>2010-01-21T13:26:44+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1df06909e4e04ce069011dfb6b32b7fb4e242a442a4</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.163502 24.927999</georss:point>
    </entry>
    <entry>
        <title>Google's Near Me Now: not quite there</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/google-s_near_me_now-not_quite_there/"/>
        <published>2010-01-08T11:50:11+00:00</published>
        <updated>2010-01-08T11:50:11+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1defc4bfa0720bafc4b11deb78ae5a71a858be98be9</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="geo" />
        <content type="html"><![CDATA[
<p>Google launched a <a href="http://googlemobile.blogspot.com/2010/01/finding-places-near-me-now-is-easier.html">new mobile web service called Near Me Now</a> that can recommend things like restaurants, bars and ATMs near you. This uses <a href="http://bergie.iki.fi/blog/browser_geolocation_without_gps-quite_accurate_enough/">browser geolocation</a> to provide only <a href="http://worrydream.com/MagicInk/#inferring_context_from_the_environment">results relevant</a> to where you are.</p>
<p><img src="http://bergie.iki.fi/static/1/1defc49935f6be4fc4911debde41b4695a22b2b2b2b_googlenearme.jpg" border="0" alt="googlenearme.jpg" title="googlenearme.jpg" /></p>
<p>The idea is quite good: to replace business directories like <a href="http://www.yelp.com/">Yelp</a> or <a href="http://eat.fi/">eat.fi</a> with something that is easily accessible from <a href="http://www.google.com/">Google's homepage</a> and uses Google's great relevancy algorithms.</p>
<p>However, the implementation is not quite there yet. My main gripe is that they implemented this using browser sniffing so that the feature can be accessed <em>only</em> with iPhones and Android devices. Even though I'm using <a href="http://en.wikipedia.org/wiki/Nokia_N900">N900</a>, a mobile device that has GPS and <a href="http://maemo.org/packages/view/maemo-geolocation/">provides geolocation</a> through the browser I cannot access that site. That reeks of the bad old times of <a href="http://www.theregister.co.uk/2005/05/04/letters_0405/">IE-only websites</a>.</p>
<p><strong>Lesson:</strong> if you need browser sniffing to provide some feature, implement it based on browser capabilities, not the user agent (which <a href="http://www.mydigitallife.info/2008/06/28/how-to-emulate-iphone-change-user-agent-in-safari-and-firefox-web-browser/">can anyway be spoofed easily</a>).</p>]]></content>
        <summary type="html"><![CDATA[
<p>Google launched a <a href="http://googlemobile.blogspot.com/2010/01/finding-places-near-me-now-is-easier.html">new mobile web service called Near Me Now</a> that can recommend things like restaurants, bars and ATMs near you. This uses <a href="http://bergie.iki.fi/blog/browser_geolocation_without_gps-quite_accurate_enough/">browser geolocation</a> to provide only <a href="http://worrydream.com/MagicInk/#inferring_context_from_the_environment">results relevant</a> to where you are.</p>
<p><img src="http://bergie.iki.fi/static/1/1defc49935f6be4fc4911debde41b4695a22b2b2b2b_googlenearme.jpg" border="0" alt="googlenearme.jpg" title="googlenearme.jpg" /></p>
<p>The idea is quite good: to replace business directories like <a href="http://www.yelp.com/">Yelp</a> or <a href="http://eat.fi/">eat.fi</a> with something that is easily accessible from <a href="http://www.google.com/">Google's homepage</a> and uses Google's great relevancy algorithms.</p>
<p>However, the implementation is not quite there yet. My main gripe is that they implemented this using browser sniffing so that the feature can be accessed <em>only</em> with iPhones and Android devices. Even though I'm using <a href="http://en.wikipedia.org/wiki/Nokia_N900">N900</a>, a mobile device that has GPS and <a href="http://maemo.org/packages/view/maemo-geolocation/">provides geolocation</a> through the browser I cannot access that site. That reeks of the bad old times of <a href="http://www.theregister.co.uk/2005/05/04/letters_0405/">IE-only websites</a>.</p>
<p><strong>Lesson:</strong> if you need browser sniffing to provide some feature, implement it based on browser capabilities, not the user agent (which <a href="http://www.mydigitallife.info/2008/06/28/how-to-emulate-iphone-change-user-agent-in-safari-and-firefox-web-browser/">can anyway be spoofed easily</a>).</p>]]></summary>
        <georss:point>60.171501 24.9466</georss:point>
    </entry>
    <entry>
        <title>Midgard in 2009</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/midgard_in_2009/"/>
        <published>2009-12-31T11:23:35+00:00</published>
        <updated>2009-12-31T11:23:35+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1def5feef2e0fa8f5fe11de9869ffb95a6ee8c4e8c4</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.176201 24.920099</georss:point>
    </entry>
    <entry>
        <title>Free Software Foundation Europe in Finland</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/free_software_foundation_europe_in_finland/"/>
        <published>2009-12-11T09:11:13+00:00</published>
        <updated>2009-12-11T09:11:13+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1dee635216bc37ce63511dea295539174d221be21be</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="politics" />
        <content type="html"><![CDATA[
<p><a href="http://fsfe.org/">Free Software Foundation Europe</a>, has recently expanded by the <a href="http://lwn.net/Articles/361925/">addition of a Finnish country team</a>. FSFE is a non-profit organization dedicated to ensuring <a href="http://fsfe.org/about/basics/freesoftware.en.html">software freedom</a>, which is an important building block in an open information society.</p>
<p>The current Finnish team includes <strong><a href="http://otto.kekalainen.net/">Otto Kekäläinen</a></strong> of <a href="http://www.valo-cd.fi/">VALO-CD</a>, the distribution of free software applications for Windows as the country coordinator, and <strong><a href="http://bergie.iki.fi/">Henri Bergius</a></strong> of <a href="http://www.midgard-project.org/">Midgard</a> as the deputy coordinator. <strong><a href="http://blogs.fsfe.org/fellowship-interviews/?p=58">Timo Jyrinki</a></strong> from <a href="http://www.ubuntu-fi.org/">Ubuntu Finland</a> is the translation coordinator. Here you can <a href="http://www.flickr.com/photos/bergie/4171512237/">see the team</a> in a recent info event organized together with the <a href="http://www.flug.fi/">Finnish Linux User Group</a> and <a href="http://www.cs.helsinki.fi/tko-aly/">TKO-äly</a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1dee634b5fac020e63411de9904ab110e3992649264_fsfe-finnish-team-2009-png.jpg" border="0" alt="fsfe-finnish-team-2009.png" title="fsfe-finnish-team-2009.png" /></p>
<p>While <a href="http://www.coss.fi/en">COSS</a> is already <a href="http://bergie.iki.fi/blog/in_coss_steering_group/">doing important work</a> for free software in Finland, FSFE amends that agenda by providing focus on the freedom of software and citizen-level participation.</p>
<p>If you're interested in contributing to software freedom, start by <a href="https://fellowship.fsfe.org/join">joining the Fellowship of the FSFE</a>. You can also contact us at <a href="mailto:finland@fsfeurope.org">finland@fsfeurope.org</a> and find out more about what is happening in Finland in the field of free software by following the <a href="http://www.vapaasuomi.fi/">vapaasuomi.fi website</a>.</p>]]></content>
        <summary type="html"><![CDATA[
<p><a href="http://fsfe.org/">Free Software Foundation Europe</a>, has recently expanded by the <a href="http://lwn.net/Articles/361925/">addition of a Finnish country team</a>. FSFE is a non-profit organization dedicated to ensuring <a href="http://fsfe.org/about/basics/freesoftware.en.html">software freedom</a>, which is an important building block in an open information society.</p>
<p>The current Finnish team includes <strong><a href="http://otto.kekalainen.net/">Otto Kekäläinen</a></strong> of <a href="http://www.valo-cd.fi/">VALO-CD</a>, the distribution of free software applications for Windows as the country coordinator, and <strong><a href="http://bergie.iki.fi/">Henri Bergius</a></strong> of <a href="http://www.midgard-project.org/">Midgard</a> as the deputy coordinator. <strong><a href="http://blogs.fsfe.org/fellowship-interviews/?p=58">Timo Jyrinki</a></strong> from <a href="http://www.ubuntu-fi.org/">Ubuntu Finland</a> is the translation coordinator. Here you can <a href="http://www.flickr.com/photos/bergie/4171512237/">see the team</a> in a recent info event organized together with the <a href="http://www.flug.fi/">Finnish Linux User Group</a> and <a href="http://www.cs.helsinki.fi/tko-aly/">TKO-äly</a>:</p>
<p><img src="http://bergie.iki.fi/static/1/1dee634b5fac020e63411de9904ab110e3992649264_fsfe-finnish-team-2009-png.jpg" border="0" alt="fsfe-finnish-team-2009.png" title="fsfe-finnish-team-2009.png" /></p>
<p>While <a href="http://www.coss.fi/en">COSS</a> is already <a href="http://bergie.iki.fi/blog/in_coss_steering_group/">doing important work</a> for free software in Finland, FSFE amends that agenda by providing focus on the freedom of software and citizen-level participation.</p>
<p>If you're interested in contributing to software freedom, start by <a href="https://fellowship.fsfe.org/join">joining the Fellowship of the FSFE</a>. You can also contact us at <a href="mailto:finland@fsfeurope.org">finland@fsfeurope.org</a> and find out more about what is happening in Finland in the field of free software by following the <a href="http://www.vapaasuomi.fi/">vapaasuomi.fi website</a>.</p>]]></summary>
        <georss:point>60.1633 24.9279</georss:point>
    </entry>
    <entry>
        <title>Posting to Qaiku via ping.fm</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/posting_to_qaiku_via_ping-fm/"/>
        <published>2009-12-07T10:47:02+00:00</published>
        <updated>2009-12-07T10:47:02+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1dee31dda307328e31d11de92e79578329988438843</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="mobility" />
        <content type="html"><![CDATA[
<p><a href="http://ping.fm/">Ping.fm</a> is a useful tool if you have friends on many social networks as it allows you to write updates to all of them via a single interface. In addition to the web interface there are <a href="http://ping.fm/apps/">many tools</a> that allow posting to ping.fm, including <a href="http://ping.fm/sms/intl/">SMS</a> and applications for <a href="http://www.pingdroid.com/">Android handsets</a> and the <a href="http://curioussquid.com/home/pingle/">iPhone</a>.</p>
<p>So far a problem with ping.fm has been that it doesn't support <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 tool</a> that we're using to handle <a href="http://bergie.iki.fi/blog/maemo-org_is_testing_workstreaming_with_qaiku/">workstreaming in Maemo.org Sprints</a>. But now it is possible thanks to the <a href="http://groups.google.com/group/pingfm-developers/web/working-with-a-custom-url">Custom URL functionality</a> on ping.fm.</p>
<p>If you already have a Qaiku account you can start posting to it via ping.fm in the following way:</p>
<ol><li>Enable Qaiku API <a href="http://www.qaiku.com/settings/api/">in your settings</a> and copy the API key</li>
<li><a href="https://ping.fm/signup/">Register to ping.fm</a></li>
<li>Add a Custom URL to send statuses to<br /><img src="http://bergie.iki.fi/static/1/1dee31c4ce968c2e31c11debf62f3c6055f93e593e5_pingfm-customurl1-png.jpg" border="0" alt="pingfm-customurl1.png" title="pingfm-customurl1.png" /></li>
<li>Enter the URL <em>http://www.qaiku.com/api/statuses/update.json?apikey=xx</em> where <em>xx</em> is your API key as the Custom URL<br /><img src="http://bergie.iki.fi/static/1/1dee31c7cdc66ece31c11debf62f3c6055f93e593e5_pingfm-customurl2-png.jpg" border="0" alt="pingfm-customurl2.png" title="pingfm-customurl2.png" /></li>
<li>Testing posting via the ping.fm web interface:<br /><img src="http://bergie.iki.fi/static/1/1dee31ca40741f6e31c11debee103281e6b28852885_pingfm-post-png.jpg" border="0" alt="pingfm-post.png" title="pingfm-post.png" /></li>
<li>See your new post on Qaiku:<br /><img src="http://bergie.iki.fi/static/1/1dee31d12a21be0e31d11deb6d907f046a37c467c46_pingfm-qaiku-shown-png.jpg" border="0" alt="pingfm-qaiku-shown.png" title="pingfm-qaiku-shown.png" /></li>
<li>If you want to post to <a href="http://www.qaiku.com/community/channels/">a channel</a>, just begin your message with <em>#channelname</em></li>
</ol><p>If ping.fm is not your thing, there are also <a href="http://bergie.iki.fi/blog/qaiku_api_brings_first_clients-mauku-gwibber_and_an_xmpp_bot/">other non-web ways to use Qaiku</a>. For example <a href="http://mauku.innologies.com/">Mauku</a> for N900 and <a href="http://live.gnome.org/Gwibber">Gwibber</a> for the Linux desktop work nicely with the service. Qaiku also has an XMPP bot that you can use by simply adding <a>qaiku@jabber.org</a> as your instant messaging contact.</p>]]></content>
        <summary type="html"><![CDATA[
<p><a href="http://ping.fm/">Ping.fm</a> is a useful tool if you have friends on many social networks as it allows you to write updates to all of them via a single interface. In addition to the web interface there are <a href="http://ping.fm/apps/">many tools</a> that allow posting to ping.fm, including <a href="http://ping.fm/sms/intl/">SMS</a> and applications for <a href="http://www.pingdroid.com/">Android handsets</a> and the <a href="http://curioussquid.com/home/pingle/">iPhone</a>.</p>
<p>So far a problem with ping.fm has been that it doesn't support <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 tool</a> that we're using to handle <a href="http://bergie.iki.fi/blog/maemo-org_is_testing_workstreaming_with_qaiku/">workstreaming in Maemo.org Sprints</a>. But now it is possible thanks to the <a href="http://groups.google.com/group/pingfm-developers/web/working-with-a-custom-url">Custom URL functionality</a> on ping.fm.</p>
<p>If you already have a Qaiku account you can start posting to it via ping.fm in the following way:</p>
<ol><li>Enable Qaiku API <a href="http://www.qaiku.com/settings/api/">in your settings</a> and copy the API key</li>
<li><a href="https://ping.fm/signup/">Register to ping.fm</a></li>
<li>Add a Custom URL to send statuses to<br /><img src="http://bergie.iki.fi/static/1/1dee31c4ce968c2e31c11debf62f3c6055f93e593e5_pingfm-customurl1-png.jpg" border="0" alt="pingfm-customurl1.png" title="pingfm-customurl1.png" /></li>
<li>Enter the URL <em>http://www.qaiku.com/api/statuses/update.json?apikey=xx</em> where <em>xx</em> is your API key as the Custom URL<br /><img src="http://bergie.iki.fi/static/1/1dee31c7cdc66ece31c11debf62f3c6055f93e593e5_pingfm-customurl2-png.jpg" border="0" alt="pingfm-customurl2.png" title="pingfm-customurl2.png" /></li>
<li>Testing posting via the ping.fm web interface:<br /><img src="http://bergie.iki.fi/static/1/1dee31ca40741f6e31c11debee103281e6b28852885_pingfm-post-png.jpg" border="0" alt="pingfm-post.png" title="pingfm-post.png" /></li>
<li>See your new post on Qaiku:<br /><img src="http://bergie.iki.fi/static/1/1dee31d12a21be0e31d11deb6d907f046a37c467c46_pingfm-qaiku-shown-png.jpg" border="0" alt="pingfm-qaiku-shown.png" title="pingfm-qaiku-shown.png" /></li>
<li>If you want to post to <a href="http://www.qaiku.com/community/channels/">a channel</a>, just begin your message with <em>#channelname</em></li>
</ol><p>If ping.fm is not your thing, there are also <a href="http://bergie.iki.fi/blog/qaiku_api_brings_first_clients-mauku-gwibber_and_an_xmpp_bot/">other non-web ways to use Qaiku</a>. For example <a href="http://mauku.innologies.com/">Mauku</a> for N900 and <a href="http://live.gnome.org/Gwibber">Gwibber</a> for the Linux desktop work nicely with the service. Qaiku also has an XMPP bot that you can use by simply adding <a>qaiku@jabber.org</a> as your instant messaging contact.</p>]]></summary>
        <georss:point>60.1633 24.9279</georss:point>
    </entry>
    <entry>
        <title>Easy user location with Midgard</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/easy_user_location_with_midgard/"/>
        <published>2009-12-02T14:08:41+00:00</published>
        <updated>2009-12-02T14:08:41+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1dedf4c31e52a12df4c11dea1c85599e67c404d404d</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="geo" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.1633 24.9279</georss:point>
    </entry>
    <entry>
        <title>Using MidCOM3 with FirePHP</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/using_midcom3_with_firephp/"/>
        <published>2009-11-23T16:52:54+00:00</published>
        <updated>2009-11-23T16:52:54+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1ded850a503317cd85011de8161379d629ab8b9b8b9</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="midgard" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.1712 24.9326</georss:point>
    </entry>
    <entry>
        <title>What is a content repository</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/what_is_a_content_repository/"/>
        <published>2009-11-19T10:02:03+00:00</published>
        <updated>2009-11-19T10:02:03+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1ded4f2966e0490d4f211deaeaf87e99efcee8aee8a</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.1712 24.9326</georss:point>
    </entry>
    <entry>
        <title>Raise the hammer! Midgard2 Mjolnir goes live</title>
        <link rel="alternate" type="text/html" href="http://bergie.iki.fi/blog/raise_the_hammer-midgard2_mjolnir_goes_live/"/>
        <published>2009-11-18T13:21:07+00:00</published>
        <updated>2009-11-18T13:21:07+00:00</updated>
        <id>http://bergie.iki.fi/midcom-permalink-1ded4453adae678d44511debc5fb5c90c2607a507a5</id>
        <author>
            <name>henri.bergius@iki.fi (Henri Bergius)</name>
        </author>
        <category  term="desktop" />
        <content type="html"><![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>]]></content>
        <summary type="html"><![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>]]></summary>
        <georss:point>60.1712 24.9326</georss:point>
    </entry>
</feed>
