<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.7.6(BH)" -->
<rss version="2.0"    xmlns:georss="http://www.georss.org/georss/"
>
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Henri Bergius: category &quot;oscom&quot;</title>
        <description>Motorcycle Adventures and Free Software from Henri Bergius</description>
        <link>http://bergie.iki.fi/blog/</link>
        <lastBuildDate>Sun, 12 Feb 2012 02:01:08 +0000</lastBuildDate>
        <generator>FeedCreator 1.7.6(BH)</generator>
        <language>en</language>
        <managingEditor>henri.bergius@iki.fi</managingEditor>
        <item>
            <title>Business analytics with CouchDB and NoFlo</title>
            <link>http://bergie.iki.fi/blog/business_analytics_with_couchdb_and_noflo/</link>
            <description><![CDATA[
<p>The purpose of <a href="http://37signals.com/svn/posts/3002-the-three-secrets-of-business-analytics-no-rocket-science-here">business analytics</a> is to find data from the company's information systems that can be used to support decision making. What customers buy most? What do they do before a buying decision? What are the signs that a customer may be leaving?</p>

<p>For the last month we've been working in Salzburg to build such a system, the <a href="http://www.iks-project.eu/resources/intelligent-project-controlling-tool">Intelligent Project Controlling Tool</a> needed for running large collaborative research projects like <a href="http://www.iks-project.eu/">IKS</a>. Since the design we went with can be reused for other business analytics needs, I wanted to write a bit about it.</p>

<p>But first, here is how our system looks like:</p>

<p><img src="http://bergie.iki.fi/midcom-serveattachmentguid-1e0e47ad96fbfcee47a11e08d46e7126c9836c236c2/proggis-iks-projectplan-500.png" alt="Proggis displaying IKS project plan" title="" /></p>

<h2>Where does the data come from?</h2>

<p>There are many ways to gather business data. Often the information systems already contain the data needed. But it may also be hidden in a jungle of spreadsheets. Or maybe some data is simply not available, and has to be filled in manually.</p>

<p>Handling all these cases in one system is a tricky question. To solve it, we went with a two-layered strategy:</p>

<ul><li>All data used for analytics is stored as <a href="http://en.wikipedia.org/wiki/Linked_Data">Linked Data</a> in a CouchDB system</li>
<li>NoFlo workflows are used for gathering data from the diverse sources and convert it to the format needed</li>
</ul><p>In IKS's case, much of the data was available in a series of spreadsheets. With these, we built the necessary workflows for first converting the spreadsheets into XML with <a href="http://tika.apache.org/">Apache Tika</a>, and then extracting the information from them in a sensible subset of JSON-LD.</p>

<p>Because IKS is a collaborative project, information needs to be gathered from a diverse group of partner organizations. Some of them have systems that provide the needed APIs (like <a href="http://basecamphq.com/">Basecamp</a>, which <a href="http://nemein.com/en/">we</a> use), and we can just periodically import the data. But with many we decided on a simple data interchange approach: spreadsheets handled over email.</p>

<p>In this approach, user files a data request into the system. This gets picked up by NoFlo, which sends an email with the appropriate spreadsheet template to the partner. Then it starts waiting for a reply. When a reply arrives, it extracts the data from the attached spreadsheet and imports it to the system.</p>

<p>Our NoFlo processes are mostly initiated by the <a href="http://guide.couchdb.org/draft/notifications.html">CouchDB change notification API</a>. We keep them running persistently using <a href="http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever">forever Node</a>, so whenever some operation needs to be run it happens nearly immediately.</p>

<h2>Ensuring data consistency</h2>

<p>With any automation, and especially with the email-based data interchange, things can go wrong. Because of this we tag all data that we receive with its origin, whether it was some automated operation or an imported spreadsheet. These origins are called <em>execution documents</em>. Users can browse all completed workflow executions and see what data came in from them. These can then be either accepted or rejected.</p>

<p>This way if some partner accidentally sends faulty data, or something else breaks, the incorrect information received can be easily removed. CouchDB's versioning capabilities help here.</p>

<h2>Analyzing the data</h2>

<p>CouchDB is built on top of the concept of map/reduce. Here you can modify and combine the data in lots of different ways using <a href="http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views">simple JavaScript functions</a>. In our case we elected to write all our CouchDB code in CoffeeScript for simplicity. For example, here is the reduce function in CoffeeScript that counts totals of time planned, time used, and time left per task or partner in a project:</p>

<pre><code>(keys, values, rereduce) -&gt;
    roundNumber = (rnum, rlength) -&gt;
        Math.round(parseFloat(rnum) * Math.pow(10, rlength)) / Math.pow(10, rlength)
    data =
        planned: 0.0
        spent: 0.0
        left: 0.0

    if rereduce
        for reducedData in values
            data.planned += reducedData.planned
            data.spent += reducedData.spent
        data.left = data.planned - data.spent
        return data

    for doc in values
        if doc['@type'] is 'effortallocation'
            data.planned += roundNumber doc.value, 1
        if doc['@type'] is 'effort'
            data.spent += roundNumber doc.value, 1
    data.left = roundNumber data.planned - data.spent, 1
    return data
</code></pre>

<p>If you figure out a new way to look at the data you have, simply write the needed map and reduce functions and save them into the database. CouchDB will then run them against existing data and produce numbers.</p>

<h2>Data visualizations</h2>

<p>Numbers are good, but to really see the information buried in them you need some visualizations. For this we decided to follow the <a href="http://couchapp.org/page/what-is-couchapp">CouchApp</a> idea where the user interface code is stored in the database together with the data itself. This way no application servers are needed, and you can take the whole system with you just by <a href="http://guide.couchdb.org/draft/replication.html">replicating the database</a>. Think of the possibility of doing some analysis on your company while flying to a meeting!</p>

<p>The visuals are in our case provided by <a href="http://thejit.org/">JavaScript InfoVis Toolkit</a>, a nice, MIT-licensed interactive graph library.</p>

<p>CouchDB views handle the number crunching, then CouchDB <a href="http://guide.couchdb.org/draft/transforming.html">list functions</a> process the numbers into the format needed for visualization. This leaves only a minimal amount of work for the client side.</p>

<p>For consistency <a href="https://github.com/IKS/Proggis">our application</a> has been built with <a href="https://github.com/andrzejsliwa/coffeeapp">CoffeeApp</a>, so all the database and user interface code is in <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>.</p>

<h2>In a nutshell</h2>

<p>Any business analytics system dealing with moderate amounts of data can be built following this approach.</p>

<ul><li><a href="http://couchdb.apache.org/">Apache CouchDB</a> is the central data store</li>
<li>All data is stored as <a href="http://json-ld.org/">JSON-LD</a> entities</li>
<li><a href="https://github.com/bergie/noflo#readme">NoFlo</a> handles all data imports</li>
<li>Analytics based on the data are done with CouchDB map/reduce</li>
<li>Visualization happens with a CouchApp using <a href="http://thejit.org/">JavaScript InfoVis Toolkit</a></li>
</ul><p><img src="http://bergie.iki.fi/midcom-serveattachmentguid-1e0e47b247c04d2e47b11e08d46e7126c9836c236c2/proggis-architecture.png" alt="Simple architecture for a business analytics system" title="" /></p>

<p>This way you have a business analytics environment that is easy to extend with more data when it becomes available. New analysis can be done by writing reasonably simple map/reduce functions, and CouchDB's replication capabilities allow you to take the system and data with you.</p>

<p>Using JSON-LD for the data storage makes a lot of sense, as this way the relations between different pieces of information are easy to handle. And using URIs for data identifiers means you can easily mash up information coming from different sources together.</p>

<p>The two-layered approach of using NoFlo for data imports, and CouchDB for analysis also allows for clean separation of concerns. In our case, I did the workflow part of things, and <a href="https://github.com/szabyg">Szaby</a> built the visualizations.</p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>47 13</georss:point>
            <category>business</category>
            <pubDate>Wed, 21 Sep 2011 17:52:53 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e0e47a87c9e4f6e47a11e099aa3595f995ab22ab22</guid>
        </item>
        <item>
            <title>VIE 2.0 is starting to emerge</title>
            <link>http://bergie.iki.fi/blog/vie_2-0_is_starting_to_emerge/</link>
            <description><![CDATA[
<p><a href="https://github.com/bergie/VIE#readme">VIE</a> is a JavaScript library that makes RDFa-annotated entities on web pages editable. We started the work towards the next major version of it, codenamed <a href="https://github.com/IKS/zart.js">Zart</a> (for Mozart) in a Salzburg IKS hackathon couple of weeks ago.</p>

<p><img src="https://github.com/bergie/VIE/raw/master/vie_logo_100.png" alt="VIE" title="" /></p>

<p>Yesterday I merged the Zart codebase into the <a href="https://github.com/bergie/VIE">VIE repository</a>. This blog post describes some of the improvements it brings.</p>

<h2>VIE now has an instance</h2>

<p>For VIE 1.x users the first visible change (and probably the only necessary API change) is that now VIE needs to be instantiated before being used. <a href="http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx">Singletons are evil</a>, and so we are not a singleton any longer.</p>

<p>So, for existing VIE code, you need to:</p>

<pre><code>var vie = new VIE();
// and then any traditional VIE calls, like:
var entities = vie.RDFaEntities.getInstances('div.article');
console.log("There are " + entities.length + " RDFa entities in your articles");
</code></pre>

<p>The VIE 1.0 API can be disabled by passing a setting when instantiating VIE:</p>

<pre><code>var vie = new VIE({classic: false});
</code></pre>

<h2>Services and VIE</h2>

<p>The other big change in VIE is that now the API has been built in a service-oriented manner. This means that for example reading and writing RDFa is just a service you can enable and disable at will.</p>

<p>The benefit here is that we can easily add support for other formats and capabilities without having to touch VIE internals. Thanks to the <a href="http://manu.sporny.org/2011/false-choice/">schema.org situation</a>, <a href="http://www.w3.org/TR/microdata/">Microdata</a> is getting more use, and so at some point we'll probably add a service for it.</p>

<p>Registering and accessing services is easy:</p>

<pre><code>// Instantiate VIE
var vie = new VIE();

// Pass the service instance and a name you want to use for it
vie.use(new vie.RdfaService, 'rdfa');

// Call a method from the service using the name
// this one would give us the RDF subject of the
// element matched by the jQuery selector
vie.service('rdfa').getElementSubject('div.article');
</code></pre>

<p>An immediate benefit here is that we can have two RDFa parsing implementations. If you have problems with our own custom jQuery-based RDFa parser, then you can use the more strict <a href="http://code.google.com/p/rdfquery/">rdfQuery</a> powered implementation instead:</p>

<pre><code>vie.use(new RdfaRdfQueryService, 'rdfa');
</code></pre>

<h2>Using deferreds</h2>

<p>For the new main VIE API we created a sort of a <a href="http://en.wikipedia.org/wiki/Domain-specific_language">Domain-Specific Language</a> for handling semantic entities. A core part of it is that now all operations utilize <a href="http://www.erichynds.com/jquery/using-deferreds-in-jquery/">jQuery's Deferred</a> objects. With them you can attach different callbacks to the results of your operation, and they will fire either when the operation completes, or immediately if the operation has already been run.</p>

<p>This gives a lot of flexibility in using the API, and allows us to provide same API for services that deal with the DOM, and services that talk to external APIs like <a href="http://incubator.apache.org/stanbol/">Stanbol</a>.</p>

<p>For example, parsing RDFa from a given DOM element (provided with a jQuery selector) happens like this:</p>

<pre><code>vie.load({
        element: 'div.article'
    }).
    from('rdfa').
    execute().
    done(function(entities) {
        console.log(entities);
    });
</code></pre>

<p>The chain here is: <em>operation</em> (in this case, load), <em>from service</em> (rdfa), <em>execute</em> operation, then when <em>done</em>, do <em>callback</em>.</p>

<p>With the RDFa service we register Backbone Views for the elements our entities came from, so just like with VIE 1.x, they will update automatically when you change the contents of your entities. But manual writing is also available in case you need it. Here is how it works:</p>

<pre><code>vie.save({
        element: 'div.article',
        entity: someBackboneModel
    }).
    to('rdfa').
    execute().
    done(function() {
        console.log("Saved!");
    });
</code></pre>

<p>In addition to <em>done</em>, which fires if the operation succeeds, you have <em>fail</em> for failed operations, and <em>then</em> which fires regardless of success or failure.</p>

<h2>Accessing external services</h2>

<p>The new VIE is not just about RDFa. In addition to working with the entities you have on a page, you can also access external repositories of semantic information, like <a href="http://dbpedia.org/About">DBpedia</a>.</p>

<p>For example, to find out everything that Wikipedia knows about Salzburg, you could run:</p>

<pre><code>vie.use(new vie.DBPediaService, 'dbpedia');
vie.load({
        entity: '&lt;http://dbpedia.org/resource/Salzburg&gt;'
    }).
    using('dbpedia').
    execute().
    done(function(entity) {
        console.log("This is what we know of Salzburg");
        console.log(entity);
    });
</code></pre>

<p>In browser usage these calls to external services are subject to cross-domain AJAX limitations. A way to work around those is to set up a proxy, and tell the DBpedia service to use that. To do this, pass the proxy URL to the service when instantiating:</p>

<pre><code>vie.use(new vie.DBPediaService({proxyUrl: 'http://localhost:8080'});
</code></pre>

<p>With this, all the factual information from Wikipedia will be at your disposal. The size of every city, the height of every mountain. Birthdates and places of birth for famous people. Your web app can do quite a bit with this information.</p>

<h3>Finding entities from text</h3>

<p><a href="http://incubator.apache.org/stanbol/">Apache Stanbol</a> is a semantic engine that can extract all kinds of entities from text documents. It can be used for auto-tagging and other things.</p>

<p>Here is how you can use it with VIE:</p>

<pre><code>vie.use(new vie.StanbolService, 'stanbol');
vie.analyze({
        element: 'div.article'
    }).
    using('stanbol').
    execute().
    done(function(entities) {
        console.log("We got the following enhancements for article content");
        console.log(entities);
    });
</code></pre>

<p>Stanbol can tell you what a piece of content talks about. People mentioned, places, concepts. It will also give you the language of the text.</p>

<h2>Moving forward</h2>

<p>The new version of VIE is still under heavy development. Most of the thngs work, but some details may still change. It is a good idea to start taking a look at it now, but before a beta release at least, <a href="https://github.com/bergie/VIE/tree/1.0.0">VIE 1.0</a> is the recommended tool to use.</p>

<p>If you already use VIE 1.0 for making your content editable, VIE 2.x will give you a lot of additional power. Enhancements, data queries, namespace handling, and much more.</p>

<p>Thanks to <a href="https://github.com/szabyg">Szaby</a> and <a href="https://github.com/neogermi">Sebastian</a> for helping to make this happen!</p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>47 13</georss:point>
            <category>midgard</category>
            <pubDate>Wed, 21 Sep 2011 15:01:28 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e0e462954fa70ee46211e091068b54f0dad597d597</guid>
        </item>
        <item>
            <title>Embrace and extend</title>
            <link>http://bergie.iki.fi/blog/embrace_and_extend/</link>
            <description><![CDATA[
<p>I'm getting worried about Google. Long one of the champions of <a href="http://www.mozilla.org/about/manifesto.en.html">the open web</a> alongside Mozilla, the rise of <a href="http://www.facebook.com/">social networking silos</a> and the <a href="http://www.apple.com/iphone/apps-for-iphone/">app economy</a> seem to have scared them. And like any scared organism, they lash out.</p>

<p>Many of their plans to make web competitive against native development environments are good, there is indeed much to improve in the stack. But what I'm uneasy with is the unilateral way they go about it, preferring "big reveals" and post-facto standardization instead of <a href="http://www.wired.com/wired/archive/3.10/ietf.html">the open conversation</a> that built most of the Internet we have today. This is not the way <a href="http://bergie.iki.fi/blog/on_cross-project_collaboration/">to collaborate</a>.</p>

<p>Consider some of their recent efforts:</p>

<ul><li><a href="http://www.chromium.org/spdy/spdy-whitepaper">SPDY</a>, a protocol to replace HTTP which Web is built on. Currently only supported by Chrome, which uses it to talk to several Google services</li>
<li><a href="http://www.2ality.com/2011/09/google-dart.html">Dart</a>, their JavaScript-killer which recently surfaced through a <a href="http://news.ycombinator.com/item?id=2980267">leaked email</a></li>
<li><a href="http://manu.sporny.org/2011/false-choice/">Microdata and Schema.org</a> that seek to replace last ten years of semantic web development with a spec cooked up by couple of big vendors in secret</li>
</ul><p>These - together with <a href="http://en.wikipedia.org/wiki/Web_SQL_Database">WebSQL</a>, <a href="http://code.google.com/p/nativeclient/wiki/NativeClientInGoogleChrome">NaCl</a>, <a href="http://www.webmproject.org/">WebM</a> and <a href="http://code.google.com/speed/webp/">WebP</a> - mean that Google has active efforts to replace practically every layer of the web (except HTML itself) with something of their own design.</p>

<p>The way all of these were introduced bears strong reminders of how Microsoft tried to <a href="http://en.wikipedia.org/wiki/Embrace,_extend_and_extinguish">embrace, extend, and extinguish</a> the web in late 90s. That period brought horrors like ActiveX and the awful, unkillable IE6. Though, for the sake of fairness, it also brought us XmlHttpRequest which was the enabler of the AJAX revolution.</p>

<p>Google's new technologies may end up being beneficial for web developers, but they also threaten to fragment the platform. After all, as the competition in the <a href="http://bergie.iki.fi/blog/why_the_tablet_form_factor_is_winning/">"post-PC"</a> space heats up, the competitors are unlikely to embrace Google's extensions of the web stack. That would be a loss to all.</p>

<p><a href="http://brendaneich.com/">Brendan Eich</a>, the original author of JavaScript <a href="http://news.ycombinator.com/item?id=2982949">comments on Hacker News</a>:</p>

<blockquote>
  <p>So "Works best in Chrome" and even "Works only in Chrome" are new norms promulgated intentionally by Google. We see more of this fragmentation every day. As a user of Chrome and Firefox (and Safari), I find it painful to experience, never mind the political bad taste.</p>
  
  <p>Ok, counter-arguments. What's wrong with playing hardball to advance the web, you say? As my blog tries to explain, the standards process requires good social relations and philosophical balance among the participating competitors.</p>
  
  <p>Google's approach with Dart is thus pretty much all wrong and doomed to leave Dart in excellent yet non-standardized and non-interoperable implementation status. Dart is GBScript to NaCl/Pepper's ActiveG.</p>
</blockquote>

<p><em>Disclaimer: I've been a long-time fan of many of Google's services, and have visited some of their offices a few times. I like the company. Which is exactly why I'm so concerned about this unilateral approach at standards. I am also involved in some standards processes through the IKS Project.</em></p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.163898 24.9289</georss:point>
            <category>desktop</category>
            <pubDate>Sun, 11 Sep 2011 23:14:02 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e0dccbbd08e7aedccb11e0a500e7540c8d14af14af</guid>
        </item>
        <item>
            <title>My secret agenda for PHP Content Management Systems</title>
            <link>http://bergie.iki.fi/blog/my_secret_agenda_for_php_content_management_systems/</link>
            <description><![CDATA[
<p>As I've written before, I'm concerned about the state of the PHP ecosystem. There are lots of good applications written in the language, but there is very little code sharing between different projects, mainly because of framework incompatibilities, but also because of quite a strong <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">NIH</a> culture.</p>

<p>But there are also bright points. I've recently seen lots of exchange of ideas, and even potential code sharing between some communities including Symfony2, Midgard, TYPO3 and eZ Publish. Much of the vision in these systems is similar, as are many of the engineering principles. When everybody uses reasonable object-oriented design, namespaces, and test-driven development, it is much easier to share.</p>

<p>If I had to list three areas where there is most potential for collaboration, these would be:</p>

<h2>Content model on the browser: VIE and RDFa</h2>

<p>The age of communicating with your web audience via <em>forms</em> is almost over, and it is time to evolve. HTML5 includes support for the <a href="http://blog.whatwg.org/the-road-to-html-5-contenteditable">contentEditable</a> attribute which allows rich editing interaction straight on the pages, and there are cool editors supporting that, including <a href="http://aloha-editor.org/">Aloha Editor</a> and <a href="https://github.com/jejacks0n/mercury#readme">Mercury</a>.</p>

<p>To do proper front-end editing, your CMS and the JavaScript environment have to agree on the content model. Fortunately there is a great solution for this: just annotate your content with some RDFa.</p>

<p>Having RDFa on a page allows the browser to understand the content. What is a collection of blog posts for instance, and what is the title of a blog post. With this, my VIE library will provide you with a nice in-browser content management API based on <a href="http://documentcloud.github.com/backbone/">Backbone.js</a>. Getting there is easy:</p>

<ol><li>Annotate your pages with RDFa</li>
<li>Include <a href="https://github.com/bergie/VIE">vie.js</a> to the pages</li>
<li>Implement <a href="http://documentcloud.github.com/backbone/#Sync">Backbone.sync</a></li>
</ol><p>This allows a great deal of <a href="http://bergie.iki.fi/blog/decoupling_content_management/">decoupling in the CMS stack</a>. Suddenly the server side just has to worry about content management and page generation, and newer in-browser technologies can be used for actual content authoring.</p>

<p>Using RDFa annotations in your content comes also with another benefit: suddenly your pages themselves are an API into your content model. And search engines can understand and present your content better.</p>

<p>If you want to learn more about this, <a href="http://bergie.iki.fi/blog/midgard_create_and_vie_in_the_aloha_editor_conference/">watch my talk</a> from the Aloha Editor Dev Con.</p>

<h2>Content persistence and retrieval: PHPCR</h2>

<p>Historically, all CMSs have implemented persistence in their own way. There have been systems using relational databases like MySQL, systems providing their own content repository APIs like Midgard, and also some systems just using XML and the file system. This has reduced integration and code re-use possibilities between systems. In the Java world, a solution exists for this: the <a href="http://en.wikipedia.org/wiki/Content_repository_API_for_Java">Java Content Repository</a> standard (JCR).</p>

<p>Now JCR has been ported to PHP. <a href="http://phpcr.github.com/">PHPCR</a> provides a standard interface for all content management needs, and has multiple back-ends available. Depending on your deployment needs, you could store your content into a relational database, into Apache Jackrabbit, or into for example MongoDB.</p>

<p>PHPCR is great in that you can start small: just model your content with a simple, filesystem-like tree of nodes and properties. Then when you need it, a wealth of functionality is available. Versioning? Query builders? Access control? It is all there for you to use. And, depending on the PHPCR back-end, you'll have the ability to scale up to insane amounts of content.</p>

<p>While I've advocated <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">using content repositories</a> for years now, this is the first time PHP has a true standardized, vendor-neutral API for it. And PHPCR is even being integrated <a href="http://java.net/jira/browse/JSR_333-28">into the JCR specification</a>, eventually making it an official standard.</p>

<p><img src="http://farm7.static.flickr.com/6053/5915517564_ba20056559.jpg" alt="PHPCR discussion in Sursee, Switzerland" title="" /></p>

<p>Adoption is also picking up. Yesterday I was in a meeting where we had developers from TYPO3, Symfony2, Doctrine and Midgard discussing issues and solutions in the content repository space. I just hope the other projects also pick this specification up.</p>

<h2>Improving performance: AppServer-in-PHP</h2>

<p>Of the three, this is probably the most controversial idea. Traditionally PHP is run as a scripting environment on a regular web server, like Apache or Nginx. In such setup, when the server receives a request, it passes it on to the PHP environment. The PHP environment loads all the code needed to fulfill the request, runs it, sends the response back, and unloads everything loaded.</p>

<p>This is fine when PHP is being used in the way Rasmus originally intended, as a simple display layer. But nowadays most of <a href="http://www.sitepoint.com/rasmus-lerdorf-php-frameworks-think-again/">PHP runs on a big framework</a>, whether it is MVC or something custom like Drupal. And loading and then discarding a whole framework for each request is simply insane.</p>

<p>With <a href="http://github.com/indeyets/appserver-in-php">AppServer-in-PHP</a> (AiP), you have an environment where even a big framework can perform. AiP provides you with a full server environment for PHP, <em>written in PHP</em>. In this setup, your framework is loaded when the server boots up, and then each request just runs the request processing part of it.</p>

<p>During the <a href="http://www.aloha-editor.org/wiki/Aloha_Editor_Dev_Con_SanFrancisco_11">San Francisco Aloha Dev Con</a> we ported TYPO3 to run on AiP, and the performance results where staggering. A simpler request with not much I/O would run 3-4 times faster than the same code on regular PHP setup, and an I/O -intensive request would still be <em>twice as fast</em>. AiP can't do much about I/O performance, but at least the cost of having a framework is greatly reduced.</p>

<p>In short, AppServer-in-PHP is something any developer running web services with a PHP framework should consider. It is also a great way for framework developers to see if they have request isolation problems in their design.</p>

<p><em>This post has been written in the <a href="http://t3dd11.typo3.org/">TYPO3 Developer Days 2011</a> event where I was invited to discuss these ideas, and also help run the RDFa part of the <a href="http://www.slideshare.net/jocrau/semantic-typo3">TYPO3 Goes Semantic</a> workshop.</em></p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>48 2</georss:point>
            <category>midgard</category>
            <pubDate>Fri, 08 Jul 2011 16:25:27 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e0a97ee3d56784a97e11e0bc94c70d6d8c7cd27cd2</guid>
        </item>
        <item>
            <title>Want to do something similar to PostRank?</title>
            <link>http://bergie.iki.fi/blog/want_to_do_something_similar_to_postrank/</link>
            <description><![CDATA[
<p>So, <a href="http://blog.postrank.com/2011/06/postrank-has-been-acquired-by-google/">Google acquired PostRank</a>, the service calculating impact of blog posts and other items in social media.</p>
<p>If you want something similar but without the Google tie-in, then a good option is my <a href="https://github.com/nemein/com_meego_planet">social impact calculator</a> which is fully free software written in PHP. It was originally <a href="http://bergie.iki.fi/blog/calculating_news_item_relevance/">written in 2007</a>, but the newer version has been cleaned of Midgard dependencies and updated to reflect the current popular social networking services. Usage example from <a href="http://bergie.iki.fi/blog/calculate_the_impact_of_your_posts/">my earlier post</a>:</p>
<p><span style="color:#333333;font-family:'Lucida Grande', Verdana, Arial, sans-serif;font-size:13px;">
</span></p><pre>require('calculate.php');

$url = 'http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/';

// Get the raw count for only one source
echo com_meego_planet_calculate::hackernews($url); // 145
echo com_meego_planet_calculate::facebook($url); // 1

// Get weighted total score for all sources
echo com_meego_planet_calculate::all($url); // 130.8</pre>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>45 -122</georss:point>
            <category>midgard</category>
            <pubDate>Sat, 04 Jun 2011 08:29:33 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e08e84c647a5de8e8411e0812773cd9486f39af39a</guid>
        </item>
        <item>
            <title>Openwashing</title>
            <link>http://bergie.iki.fi/blog/openwashing/</link>
            <description><![CDATA[
<p>Somehow I had missed <a href="http://www.readwriteweb.com/archives/how_to_spot_openwashing.php">this term being coined</a>:</p>
<blockquote>The old "open vs. proprietary" debate is over and open won. As IT infrastructure moves to the cloud, openness is not just a priority for source code but for standards and APIs as well. Almost every vendor in the IT market now wants to position its products as "open." Vendors that don't have an open source product instead emphasize having a product that uses "open standards" or has an "open API."<br /><br />"Openwashing" is a term derived from "<a href="http://en.wikipedia.org/wiki/Greenwashing">greenwashing</a>" to refer to dubious vendor claims about openness. Openwashing brings the old "open vs. proprietary" debate back into play - not as "which one is better" but as "which one is which?"</blockquote>
<p>Especially Google seems to be <a href="http://www.meegoexperts.com/2011/03/honeycomb-open-source-move/">doing this</a> quite a bit. If you want to be open, <a href="http://bergie.iki.fi/blog/open_source-free_software-what_we_need_is_open_projects/">work in the open</a>. This is the only way to ensure <a href="http://bergie.iki.fi/blog/on_cross-project_collaboration/">acceptance</a> and <a href="http://bergie.iki.fi/blog/why_make_your_projects_properly_open-sustainability/">sustainability</a> for your code.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>47 13</georss:point>
            <category>business</category>
            <pubDate>Thu, 05 May 2011 16:31:33 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e07735237b915a773511e0b42df1943179916d916d</guid>
        </item>
        <item>
            <title>The beginning of a JavaScript journey</title>
            <link>http://bergie.iki.fi/blog/the_beginning_of_a_javascript_journey/</link>
            <description><![CDATA[
<p>While PHP remains my primary programming language for <a href="http://blog.liip.ch/archive/2011/02/24/why-we-stick-to-php.html">various reasons</a>, my recent projects have involved quite a bit <a href="http://bergie.iki.fi/blog/vie_decoupled_content_management_moves_forward/">of JavaScript development</a>. And I have to say I like it: the event-driven paradigm is quite elegant, closures are a joy to work with, and tools like <a href="http://nodejs.org/">Node.js</a> and <a href="http://jquery.com/">jQuery</a> really open up the possibilities of the language.</p>
<p>But there is one weakness in the JS ecosystem: as things are just now picking up, the amount of information on especially making larger applications is quite sparse. To help solving this issue, I decided to start a new blog dedicated to what I learn in that space.</p>
<p>Like my <a href="http://universalruntime.tumblr.com/post/4340045330/universalruntime">earlier piece</a> on the importance of the language, the blog is called <a href="http://universalruntime.tumblr.com/"><strong>The Universal Runtime</strong></a>.</p>
<p>If you run into interesting tutorials on JavaScript, or are doing something cool in the space, let me know!</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60 24</georss:point>
            <category>desktop</category>
            <pubDate>Sun, 10 Apr 2011 19:51:27 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e063abec0349a863ab11e08273f919d316b1d9b1d9</guid>
        </item>
        <item>
            <title>VIE - Decoupled content management moves forward</title>
            <link>http://bergie.iki.fi/blog/vie_decoupled_content_management_moves_forward/</link>
            <description><![CDATA[
<p>My posts on <a href="http://bergie.iki.fi/blog/decoupling_content_management/">Decoupling Content Management</a>, and especially the introduction to the <a href="http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/">"build a CMS, no forms allowed"</a> approach we took with <em>Midgard Create</em> have generated a lot of interest.</p>
<p>When I first <a href="http://www.slideshare.net/bergie/midgard-create-and-editing-content-via-rdfa">presented</a> the approach in the recent <a href="http://aloha-editor.org/wiki/Aloha_Editor_Dev_Con_Vienna_11">Aloha Editor Developer Conference</a>, many CMSs wanted to do something similar. And so we decided to strip the Midgard-specific parts out and make the tool a generic JavaScript library. As part of this work, the library was adopted by the <a href="http://www.iks-project.eu/">IKS project</a> and named <a href="http://wiki.iks-project.eu/index.php/VIE">VIE</a>, or <em>"Vienna IKS Editables"</em>. There first CMS implementations of VIE included <a href="https://github.com/Jotschi/Aloha-Editor-Wordpress-Plugin">WordPress</a>, <a href="http://git.typo3.org/TYPO3v5/Distributions/Base.git">TYPO3</a> and <a href="http://gitorious.org/karacos2-wsgi-web-applications-engine/karacos2-wsgi-web-applications-engine">KaraCos</a>, with <a href="http://wiki.iks-project.eu/index.php/VIE#CMS_implementations">more</a> on their way.</p>
<p>To get started with VIE, check these pages out:</p>
<ul><li><a href="http://wiki.iks-project.eu/index.php/VIE">VIE project page</a> on IKS wiki</li>
<li><a href="https://github.com/IKS/VIE">VIE repository</a> on GitHub</li>
<li><a href="http://bergie.github.com/VIE/">VIE API documentation</a></li>
</ul><p>In addition to <a href="http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/">Midgard Create</a>, one of the first projects I'm implementing with VIE is <a href="http://wiki.iks-project.eu/index.php/VIE/Palsu">Palsu</a>, an interactive meeting tool powered by <a href="http://nodejs.org/">Node.js</a> and <a href="http://socket.io/">Socket.io</a>. It should explain the power of VIE outside of the traditional CMS space.</p>
<p><strong>Update:</strong> VIE is now also available on <a href="http://npmjs.org/">npm</a>:</p>
<pre>npm install vie
</pre>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60 24</georss:point>
            <category>midgard</category>
            <pubDate>Wed, 09 Mar 2011 17:54:15 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e04a763faffadc4a7611e088c5570e2666d467d467</guid>
        </item>
        <item>
            <title>Trying out Cloud9IDE: Developing software in your browser</title>
            <link>http://bergie.iki.fi/blog/trying_out_cloud9ide-developing_software_in_your_browser/</link>
            <description><![CDATA[
<p>As I wrote in <a href="http://bergie.iki.fi/blog/better_one_file_in_the_cloud_than_ten_on_the_hard_drive/">Better one file in the cloud than ten on the hard drive</a>, when you mostly work on free software projects, then main frustration with a change of computer or a crashed harddrive is not lost files, but having to rebuild your development environment. The browser-based software development tool <a href="http://cloud9ide.com/">Cloud9IDE</a> aims to solve that by moving the whole development environment to the "cloud".</p>
<p><img src="http://bergie.iki.fi/static/1/1e044d89d39d3ce44d811e09c1df9ff48231c331c33_cloud9ide-small.png" border="0" alt="cloud9ide-small.png" title="cloud9ide-small.png" style="border:0px;" /></p>
<p>With Cloud9IDE you get an excellent code editor thanks to the <a href="http://ace.ajax.org/">ACE</a> project (formerly known as <a href="http://mozillalabs.com/skywriter/2011/01/18/mozilla-skywriter-has-been-merged-into-ace/">Mozilla Bespin</a>), git integration and possibility to run your <a href="http://www.theregister.co.uk/2011/03/01/the_rise_and_rise_of_node_dot_js/">Node.js</a> code right on the server. The editor supports multiple programming languages including PHP, Python and Ruby, but obviously JavaScript is the main target with very nice debugging tools. Cloud9IDE can either be used on the cloud, or you can <a href="https://github.com/ajaxorg/cloud9">run your own installation</a> of the GPLd system.</p>
<p>What is good:</p>
<p>
</p><ul><li>Tight <a href="https://github.com/">GitHub</a> integration. All your GitHub projects are there, and you can register and log in using your GitHub credentials</li>
<li>Fast and nice UI, at least on modern browsers like Chromium. It is probably also <a href="http://arewefastyet.com/">very fast on Firefox 4</a></li>
<li>Integrated console and debugging tools</li>
<li>No need to install anything, but still the possibility to run your own instance if you want</li>
<li>Cloud9IDE <a href="https://github.com/ajaxorg/cloud9/blob/master/LICENSE">is free software</a></li>
</ul><p>What still needs love:</p>
<p>
</p><ul><li>In the current hosted version there is no way to commit stuff back to Git, or to work with branches</li>
<li>No way to work with other Git repositories than GitHub</li>
<li>Running code in Node.js doesn't seem to support any <a href="https://github.com/isaacs/npm/blob/master/doc/developers.md#readme">installable modules</a></li>
<li>Some parts of the UI had glitches, like menus becoming transparent on hover</li>
</ul>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>69 20</georss:point>
            <category>desktop</category>
            <pubDate>Wed, 02 Mar 2011 14:29:23 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e044d977f9928844d911e09f7fcd32889f7ee37ee3</guid>
        </item>
        <item>
            <title>Decoupling Content Management</title>
            <link>http://bergie.iki.fi/blog/decoupling_content_management/</link>
            <description><![CDATA[
<p>Traditional content management systems are monolithic beasts. Just to make your website editable you need to accept the web framework imposed by the system, the templating engine used by the system, and the editing tools used by the system. Want to have a better user interface? Be prepared to rewrite your whole website, and to the pain of having to migrate content between different storage systems.</p>
<p>But none of this should be necessary. When web editing tools were more immature, it made sense for the same people to build the whole stack from database content models to web page generation and editing tools. But that was ten years ago, now we could do better.</p>
<p>Here is how a traditional CMS looks like:</p>
<p><img src="http://bergie.iki.fi/static/1/1e03f6a5bcbe4223f6a11e0a60db5207a8570387038_cms-monolithic-approach.png" border="0" alt="cms-monolithic-approach.png" title="cms-monolithic-approach.png" /></p>
<p>As you can see, the whole system is a monolithic block. The CMS provides content storage, routing, templating, editing tools, the kitchen sink. Probably you're even tied to a particular relational database for content storage. Want to use a cool new editor like <a href="http://aloha-editor.org/">Aloha</a>, or a different templating engine, or maybe a trendy NoSQL storage back-end? You'll have to convince the whole CMS project or vendor to switch over.</p>
<p>A much better picture would be something like the following:</p>
<p><img src="http://bergie.iki.fi/static/1/1e03f6a6cfe27003f6a11e0a60db5207a8570387038_cms-decoupled-approach.png" border="0" alt="cms-decoupled-approach.png" title="cms-decoupled-approach.png" /></p>
<p>In this scenario, the concept of Content Management is decoupled. There is a <a href="http://bergie.iki.fi/blog/why_you_should_use_a_content_repository_for_your_application/">content repository</a> that manages content models and how to store them. This could be something like <a href="http://jackrabbit.apache.org/">JCR</a>, <a href="https://fosswiki.liip.ch/display/jackalope/Home">PHPCR</a>, <a href="http://couchdb.apache.org/">CouchDB</a> or <a href="http://www.midgard-project.org/midgard2/">Midgard2</a>. Then there is a web framework, responsible of matching URL requests to particular content and generating corresponding web pages. This could be <a href="http://drupal.org/">Drupal</a>, <a href="http://flow3.typo3.org/">Flow3</a>, <a href="http://www.djangoproject.com/">Django</a>, <a href="http://codeigniter.com/">CodeIgniter</a>, <a href="https://github.com/bergie/midgardmvc_core/blob/master/documentation/index.markdown">Midgard MVC</a>, or something similar. And finally there is the web editing tool. The web editing tool provides an interface for managing contents of the web pages. This includes functionalities like rich text editing, workflows and image handling.</p>
<p>The web editing tools have traditionally been part of the web framework, the framework serving forms and toolbars to the user as part of the generated web pages. But with modern browsers you could throw forms out of the window and just <a href="http://aloha-editor.org/">make pages editable</a> as they are.</p>
<h2>Common representation of content on HTML level</h2>
<p>How would the communication between the web editing tool and the backend work, then?</p>
<p><img src="http://bergie.iki.fi/static/1/1e03f6a7c83d8dc3f6a11e0a60db5207a8570387038_cms-decoupled-communications.png" border="0" alt="cms-decoupled-communications.png" title="cms-decoupled-communications.png" /></p>
<p>First of all, the web editing tool has to understand the contents of the page. It has to understand what parts of the page should be editable, and how they connect together. If there is a list of news for instance, the tool needs to understand it enough to enable users to add new news items. The easy way of accomplishing this is to add some semantic annotations to the HTML pages. These annotations could be handled via <a href="http://microformats.org/">Microformats</a>, <a href="http://dev.w3.org/html5/md/">HTML5 microdata</a>, but the most power lies with <a href="http://en.wikipedia.org/wiki/RDFa">RDFa</a>.</p>
<p>RDFa is a way to describe the meaning of particular HTML elements using simple attributes. For example:</p>
<pre>&lt;div <strong>typeof="http://rdfs.org/sioc/ns#Post"</strong> <strong>about="http://example.net/blog/news_item"</strong>&gt;<br />    &lt;h1 <strong>property="dcterms:title"</strong>&gt;News item title&lt;/h1&gt;<br />    &lt;div <strong>property="sioc:content"</strong>&gt;News item contents&lt;/div&gt;<br />&lt;/div&gt;</pre>
<p>Here we get all the necessary information for <a href="http://bergie.iki.fi/blog/using_rdfa_to_make_a_web_page_editable/">making a blog entry editable</a>:</p>
<ul><li><strong>typeof</strong> tells us the type of the editable object. On typical CMSs this would map to a content model or a database table</li>
<li><strong>about</strong> gives us the identifier of a particular object. On typical CMSs this would be the object identifier or database row primary key</li>
<li><strong>property</strong> ties a particular HTML element to a property of the content object. On a CMS this could be a database column</li>
</ul><p>As a side effect, we also manage to make our page more <a href="http://bergie.iki.fi/blog/google-s_rich_snippets_will_lead_us_into_semantic_web/">understandable to search engines</a> and other semantic tools. So the annotations are not just needed for UI, but also for SEO.</p>
<h2>Common representation of content on JavaScript level</h2>
<p>Having contents of a page described via RDFa makes it very easy to extract the content model into JavaScript. We can have a common utility library for doing this, but we also should have a common way of keeping track of these content objects. Enter <a href="http://documentcloud.github.com/backbone/">Backbone.js</a>:</p>
<blockquote>Backbone supplies structure to JavaScript-heavy applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.</blockquote>
<p>With Backbone, the content extracted from the RDFa-annotated HTML page is easily manageable via JavaScript. Consider for example:</p>
<pre>objectInstance.set({title: 'Hello, world'});<br />objectInstance.save(null, {<br />  success: function(savedModel, response) {<br />    alert("Your article '" + savedModel.get('title') + "' was saved to server");<br />  }<br />});</pre>
<p>This JS would work across all the different CMS implementations. Backbone.js provides a<a href="http://documentcloud.github.com/backbone/#Sync"> quite nice RESTful implementation</a> of communicating with the server with JSON, but it can be easily overridden with CMS-specific implementation by just implementing a new Backbone.Sync method. Look for example at the <a href="https://github.com/jasondavies/Backbone.localStorage/blob/master/backbone.localStorage.js">localStorage Backbone.js Sync implementation</a>.</p>
<h2>New possibilities for collaboration</h2>
<p>Once the different Content Management Systems describe their content with RDFa, and provide an unified JavaScript API to it, lots of things become possible. While most systems probably want to have their own look-and-feel, still many functionalities can be shared. Consider for example:</p>
<ul><li>Using browser's localStorage for storing drafts of content edited by user. Never lose content!</li>
<li>Collaborative editing via <a href="http://wave-protocol.googlecode.com/hg/whitepapers/operational-transform/operational-transform.html">XMPP</a> or WebSockets</li>
<li>Versioning and undo</li>
<li>Semantic enrichment of content using tools like <a href="http://incubator.apache.org/stanbol/">Apache Stanbol</a></li>
</ul><p>All of these would be quite hard to implement by an individual CMS project. But if we have a common JS layer available, the effort can be shared by all CMS projects implementing these ideas.</p>
<p>There have been prior efforts at doing something similar. In the early 2000s, <a href="http://bergie.iki.fi/blog/the-doubtful-future-of-oscom/">OSCOM</a> made the <a href="http://www.zope-europe.org/events/0303/oscomsprintzurich">Twingle tool</a> that was able to edit and save content with multiple CMSs. Then there was the <a href="http://www.atomenabled.org/developers/protocol/">Atom Publishing Protocol</a> and the <a href="http://bergie.iki.fi/blog/neutron_protocol-separating_ui_from_the_cms/">Neutrol Protocol</a> efforts, and also <a href="http://en.wikipedia.org/wiki/Content_Management_Interoperability_Services">CMIS</a>. But all of these mandated that the systems would have to implement some particular server-side protocol. The advantage of the approach promoted here is that the only server-side change needed is adding RDFa annotations to HTML templates, and then the rest happens on JavaScript level.</p>
<p>The new CMS interface we've built for Midgard2 already uses these concepts. Now here in the <a href="http://aloha-editor.org/wiki/Aloha_Editor_Dev_Con_11">Aloha Editor Developer conference</a> we're <a href="http://twitter.com/berit_jensen/status/40381611824381952">talking with</a> Drupal and TYPO3 developers about rolling out the same ideas in their systems. Other systems and projects are also more than welcome to participate.</p>
<p><strong>Update:</strong> The work is underway to generalize the RDFa-Backbone.js bridge I originally wrote for Midgard Create. You can <a href="https://github.com/bergie/VIE">find it on GitHub</a>. We're currently experimenting with it on both Midgard2 and TYPO3.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60 24</georss:point>
            <category>midgard</category>
            <pubDate>Wed, 23 Feb 2011 16:32:47 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e03f6a8c4ada2c3f6a11e0b52c758b52c6d880d880</guid>
        </item>
        <item>
            <title>Why make your projects properly open? Sustainability</title>
            <link>http://bergie.iki.fi/blog/why_make_your_projects_properly_open-sustainability/</link>
            <description><![CDATA[
<p>Snapshot from <a href="http://grep.codeconsult.ch/">Bertrand's</a> presentation in <a href="http://wiki.iks-project.eu/index.php/Workshops/EAworkshopAmsterdam">the Amsterdam IKS workshop</a>: what does <a href="http://incubator.apache.org/stanbol/">being an Apache project</a> bring to the table?</p>
<p><img src="http://bergie.iki.fi/static/1/1e003c0d75f321403c011e0bb5b1b0c333ac0b3c0b3_asf_stanbol_sustainability.jpg" border="0" alt="asf_stanbol_sustainability.jpg" title="asf_stanbol_sustainability.jpg" /></p>
<p>The answer is sustainability. <a href="http://bergie.iki.fi/blog/starting_the_interactive_knowledge_project/">IKS is an EU-funded project</a> which will eventually end. <a href="http://www.apache.org/foundation/how-it-works.html#management">Proper project governance</a> handled together with the Apache Software Foundation can help the software to survive and thrive for long after that.</p>
<p>Sustainability is something that is critical for all libraries and infrastructure software. If you want adoption, you need to ensure potential users and developers that the software will continue to be around. The way to accomplish that is to have <a href="http://bergie.iki.fi/blog/open_source-free_software-what_we_need_is_open_projects/">a clear, open governance model</a>. It is time to stop <a href="http://bergie.iki.fi/blog/open_source_is_more_than_just_code_dumps/">throwing code over the wall</a>.</p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>52 4</georss:point>
            <category>business</category>
            <pubDate>Thu, 09 Dec 2010 18:29:37 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1e003c246f5fdd203c211e0bf4c65b72bbcac83ac83</guid>
        </item>
        <item>
            <title>Buzz may end segregation in microblogging</title>
            <link>http://bergie.iki.fi/blog/buzz_may_end_segregation_in_microblogging/</link>
            <description><![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>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1633 24.9279</georss:point>
            <category>oscom</category>
            <pubDate>Wed, 10 Feb 2010 20:16:11 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1df16812193b798168111dfafdde581d4e61d0c1d0c</guid>
        </item>
        <item>
            <title>In defence of URLs and the Open Web</title>
            <link>http://bergie.iki.fi/blog/in_defence_of_urls_and_the_open_web/</link>
            <description><![CDATA[
<p>An increasing number of web services and applications are emphasising search terms or pre-selected websites instead of allowing users to enter any address they choose. This is worrying, as while <a href="http://www.cabel.name/2008/03/japan-urls-are-totally-out.html">searches are more user-friendly</a>, <a href="http://www.w3.org/Provider/Style/URI">URLs</a> are the heart of <a href="http://www.mozilla.org/about/manifesto.en.html">an open web where</a> anybody can publish without <a href="http://dvice.com/archives/2009/10/net-neutrality.php">obscure business dealings</a> or oppressive app store policies.</p>
<p>There are many examples of this happening, from <a href="http://my.opera.com/coxy/blog/2008/12/17/facebook">Facebook's framing of web</a> to netbooks systems like the <a href="http://www.jolicloud.com/">JoliCloud</a> not having an address bar. Certainly many companies are looking at <a href="http://www.pcworld.com/businesscenter/article/154198/google_deal_produces_91_of_mozillas_revenue.html">Mozilla's search engine revenue</a> and <a href="http://gigaom.com/2009/07/14/the-meteoric-rise-of-the-app-store/">Apple's app store model</a> and want to emulate that, moving the web into silos of their own control. But at the same time, we're thinking of <a href="http://linkeddata.org/">Linked Data</a> and open, interoperable web standards.</p>
<p>Web indeed is <a href="http://www.arcticstartup.com/2009/09/11/the-web-at-a-new-crossroads/">at new crossroads</a>.</p>
<p>Chris Messina predicts <a href="http://factoryjoe.com/blog/2009/11/16/the-death-of-the-url/">the death of URLs</a>:</p>
<blockquote>a future without URLs and without the infinite organicity of the web frightens me. It’s not that I know what we’ll lose by removing this artifact of one of the most generative periods in history — and that’s exactly the point! The URL and the ability for anyone to mint a new one and then propagate it is what makes the web so resilient, so empowering, and so interesting! That I don’t need to ask anyone permission to create a new website or webpage is a kind of ideological freedom that few generations in history have known!</blockquote>
<p>Tim O'Reilly presents <a href="http://radar.oreilly.com/2009/11/the-war-for-the-web.html">a call to arms</a>:</p>
<blockquote>It could be that everyone will figure out how to play nicely with each other, and we'll see a continuation of the interoperable web model we've enjoyed for the past two decades. But I'm betting that things are going to get ugly. We're heading into a war for control of the web. And in the end, it's more than that, it's a war <em>against</em> the web as an interoperable platform. Instead, we're facing the prospect of Facebook as the platform, Apple as the platform, Google as the platform, Amazon as the platform, where big companies slug it out until one is king of the hill.<br /><br />And it's time for developers to take a stand. If you don't want a repeat of the PC era, place your bets now on open systems. Don't wait till it's too late.</blockquote>
<p> </p>]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1712 24.9326</georss:point>
            <category>business</category>
            <pubDate>Tue, 17 Nov 2009 19:19:36 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1ded3ae250ed850d3ae11deb351377d4b1cd9aad9aa</guid>
        </item>
        <item>
            <title>Open Collaboration Services: when desktop approaches the web</title>
            <link>http://bergie.iki.fi/blog/open_collaboration_services-when_desktop_approaches_the_web/</link>
            <description><![CDATA[
<p>
<img src="http://bergie.iki.fi/midcom-serveattachmentguid-e64e68ae5abf11de905e999fcfda45e845e8/socialdesktop.jpg" height="50" width="220" border="0" align="right" hspace="8" vspace="4" alt="Social Desktop" title="Social Desktop" /><br />Today I ran into the <a href="http://www.freedesktop.org/wiki/Specifications/open-collaboration-services">Open Collaboration Services API</a>, planned as the vendor-neutral specification for <a href="http://www.open-collaboration-services.org/">Social Desktop</a> services:
</p>

<blockquote>
Core idea of the Social Desktop is to connect to your peers in the community, making sharing and exchanging knowledge easier to integrate into applications and the desktop itself. The concept behind the Social Desktop is to bring the power of online communities and group collaboration to desktop applications and the desktop shell itself.
</blockquote>

<p>
This sounds exactly like the stuff I was talking about back in <a href="http://2003.guadec.org/">GUADEC 2003</a>. I <a href="http://bergie.iki.fi/blog/free_desktop_and_the_cloud/">was there</a> on behalf of <a href="http://bergie.iki.fi/blog/the-doubtful-future-of-oscom/">OSCOM</a> to see how the <a href="http://www.gnome.org/about/">free desktop</a> could be integrated with the various <a href="http://www.oscom.org/matrix/index.html">open source content management and collaboration systems</a> developed by OSCOM members. It is great to see these ideas finally gain some traction.
</p>

<p>
There are many specifications to help us get there:
</p>

<ul><li><a href="http://www.freedesktop.org/wiki/Specifications/open-collaboration-services">OCS API</a> caters for sharing things like activities, messages, and even file contents</li>
<li><a href="http://live.gnome.org/Tomboy/Synchronization/REST">Tomboy API</a> provides synchronization and sharing of notes, with some existing implementations like <a href="http://automorphic.blogspot.com/2009/05/tomboy-0151-release-brings-new-online.html">Snowy</a> and its <a href="http://bergie.iki.fi/blog/tomboy_web_synchronization-conboy_and_midgard/">Midgard equivalent</a></li>
<li><a href="http://bitworking.org/projects/atom/rfc5023.html">Atom Publishing Protocol</a> was <a href="http://209.85.229.132/search?q=cache:xLQP_OdxLL0J:cognections.typepad.com/lifeblog/files/lifeblog_posting_protocol_specification_1.0.pdf+atompub+lifeblog&amp;cd=7&amp;hl=en&amp;ct=clnk&amp;gl=fi&amp;client=firefox-a">used</a> by Nokia's <a href="http://en.wikipedia.org/wiki/Nokia_Lifeblog">Lifeblog</a> tools</li>
<li><a href="http://www.grancanariadesktopsummit.org/node/201">Telepathy's peer-to-peer collaborative model</a> is used in <a href="http://www.sugarlabs.org/">OLPC Sugar</a></li>
<li>...and of course <a href="http://www.webdav.org/">WebDAV</a> handles managing web content, potentially more usefully through <a href="http://bergie.iki.fi/blog/neutron_protocol-separating_ui_from_the_cms/">Neutron introspection</a></li>
</ul><p>
With these the free desktop might become more than <a href="http://blogs.gnome.org/otte/2009/02/20/gnome-and-the-cloud/">just an isolated island</a>.
</p>

<p>
Such collaborative features will make the free applications much more compelling to users, especially if coupled with web interfaces that can be used when away from your own computer. Being built on open source server software and open standards they can be hosted by companies, schools, or <a href="http://arstechnica.com/open-source/news/2009/05/hands-on-canonical-aims-for-the-cloud-with-new-ubuntu-one.ars">even Linux distributions</a>, instead of tying users to <a href="http://bergie.iki.fi/blog/bruce_schneier_on_cloud_computing/">the big cloud vendors</a>.
</p>

<p>
I'll be talking more about the relation between the desktop and the web and <a href="http://bergie.iki.fi/blog/midgard2_at_fscons-your_data-everywhere/">our approach</a> to it in <a href="http://www.grancanariadesktopsummit.org/node/210">my Gran Canaria Desktop Summit talk</a> on <a href="http://www.grancanariadesktopsummit.org/node/165">Tuesday Jul 7th</a>.
</p>



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


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1754 24.9191</georss:point>
            <category>oscom</category>
            <pubDate>Tue, 16 Jun 2009 21:51:56 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-e93de0585abf11de8afe770184cd82148214</guid>
        </item>
        <item>
            <title>IKS assembly and requirements workshop</title>
            <link>http://bergie.iki.fi/blog/iks_assembly_and_requirements_workshop/</link>
            <description><![CDATA[
<p>
This week is the <a href="http://bergie.iki.fi/blog/starting_the_interactive_knowledge_project/">Interactive Knowledge project</a> general assembly and <a href="http://www.iks-project.eu/requirements-workshop">requirements gathering workshop</a> in Salzburg, Austria.
</p>

<p>
My notes from the meeting days can be found <a href="http://www.qaiku.com/home/bergie/">on Qaiku</a>:
</p>

<ul><li><a href="http://www.qaiku.com/channels/show/iks-project/view/1de4abe461950f84abe11de86b8817366e5c66ec66e/">Day 1: general situation, tasks and requirements</a></li>
<li><a href="http://www.qaiku.com/channels/show/iks-project/view/1de4b572a1c853e4b5711de8ca1abf40611b0fab0fa/">Day 2: tools, persistent storage, meeting the community</a></li>
</ul><p>
As things are happening, it is also possible to follow progress on the <a href="http://www.qaiku.com/channels/show/iks-project/">#iks-project Qaiku channel</a> or the <a href="http://twitter.com/#search?q=%23iks-project">#iks-project Twitter hashtag</a>.
</p>



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


]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>47.806801 13.0473</georss:point>
            <category>oscom</category>
            <pubDate>Thu, 28 May 2009 15:48:00 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-ec4ac98a4b9e11de923db50650db01d701d7</guid>
        </item>
        <item>
            <title>Give the correct status code when you're down</title>
            <link>http://bergie.iki.fi/blog/give_the_correct_status_code_when_you-re_down/</link>
            <description><![CDATA[
<p>
<a href="http://jaiku.com/">Jaiku</a>, the <a href="http://bergie.iki.fi/blog/jaiku-personal_presence_aggregator/">microblogging service I use</a>, has been frustratingly often down in the last couple of days, apparently kicking off another <a href="http://www.arcticstartup.com/2008/12/15/finland-finally-moving-to-twitter/">mass migration</a> towards <a href="http://twitter.com/">Twitter</a> and <a href="http://brightkite.com/">Brightkite</a>.
</p>

<p>
And they report it only in human-readable way, not in fashion a browser, a proxy or a search engine would understand it. While being down, Jaiku still responds with <a href="http://en.wikipedia.org/wiki/HTTP_200">HTTP 200 OK</a>:
</p>

<p>
<a href="http://bergie.iki.fi/midcom-serveattachmentguid-1aa85df0fdc611dd84724dd9d30d87c187c1/jaiku-down-error-200.png"><img src="http://bergie.iki.fi/midcom-serveattachmentguid-1c04ad52fdc611dd944df373056b0d3e0d3e/jaiku-down-error-200-tm.jpg" height="210" width="398" border="1" hspace="4" vspace="4" alt="Jaiku down: Error 200 OK" title="Jaiku down: Error 200 OK" /></a>
</p>

<p>
<a href="http://www.checkupdown.com/status/E503.html">HTTP 503 Service unavailable</a> would be much nicer. For instance, that is what <a href="http://www.midgard-project.org/">Midgard</a> produces if the database goes down.
</p>

<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/brightkite" rel="tag">brightkite</a>, <a href="http://www.technorati.com/tag/jaiku" rel="tag">jaiku</a>, <a href="http://www.technorati.com/tag/http" rel="tag">http</a>, <a href="http://www.technorati.com/tag/twitter" rel="tag">twitter</a></p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.1875 24.969801</georss:point>
            <category>oscom</category>
            <pubDate>Wed, 18 Feb 2009 14:12:01 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-1c7b9d0efdc611dd98c8c520817766ab66ab</guid>
        </item>
        <item>
            <title>Search engines have an important role in Semantic Web</title>
            <link>http://bergie.iki.fi/blog/search_engines_have_an_important_role_in_semantic_web/</link>
            <description><![CDATA[
<p>
Thanks to the <a href="http://bergie.iki.fi/blog/starting_the_interactive_knowledge_project/">IKS project</a>, I've spent some thought lately in how to make something practical from the concept of <a href="http://www.w3.org/DesignIssues/Semantic.html">Semantic Web</a>.
</p>

<p>
As always, the big issue is getting the semantic information out there. In a strongly <a href="http://www.midgard-project.org/documentation/mgdschema/">typed</a> CMS like <a href="http://www.midgard-project.org/">Midgard</a>, many semantics can be gathered <a href="http://www.midgard-project.org/documentation/microformat-usage-in-midcom/">from content structure</a> directly, but to really get there we need users to add metadata. And as <a href="http://www.well.com/~doctorow/metacrap.htm#2.2">users are lazy</a>, this will happen only if it provides some direct benefit: just look at how frequently people <a href="http://www.ehow.com/how_2031208_tag-friends-facebook.html">tag their photos</a> on Facebook. Irritating or not, this happens because the tags are actually used to promote the pictures in <a href="http://www.techcrunch.com/2006/09/05/new-facebook-redesign-more-than-just-aesthetics/">the news feeds</a> of tagged people.
</p>

<p>
For this to happen in the web in general, we need to start having the search engines leverage the <a href="http://en.wikipedia.org/wiki/RDFa">semantic information</a>. <a href="http://bergie.iki.fi/blog/semantic_web_is_here-yahoo-and_microformats/">Yahoo! already does this</a> to some extent, making use of <a href="http://microformats.org/">microformats</a> and <a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a> in <a href="http://developer.yahoo.net/blog/archives/2009/01/yql_with_microformats.html">Yahoo! Query Language</a> and in the <a href="http://developer.yahoo.net/blog/archives/2008/12/monkey_finds_microformats_and_rdf.html">Search Monkey engine</a>. This means we can already do simple semantic queries like "<a href="http://search.yahoo.com/search;_ylt=A0geu5FiYppJyx0AXotXNyoA?p=bergius+searchmonkeyid%3Acom.yahoo.page.uf.geo+helsinki&amp;y=Search&amp;fr=">pages mentioning Bergius in the Helsinki area</a>":
</p>

<p>
<a href="http://bergie.iki.fi/midcom-serveattachmentguid-2242647afcc711ddaaf0553a9056a9e2a9e2/yahoo-semantic-geo-query.png"><img src="http://bergie.iki.fi/midcom-serveattachmentguid-23e97e12fcc711dda31497b2eec4cd17cd17/yahoo-semantic-geo-query-tm.jpg" height="295" width="400" border="1" hspace="4" vspace="4" alt="Yahoo! semantic geo query" title="Yahoo! semantic geo query" /></a>
</p>

<p>
Actually, the Yahoo! results are quite interesting:
</p>

<ul><li><a href="http://bergie.iki.fi/">My web page</a> (which shows my current location, so it may depend on time indexed)</li>
<li>Some Chinese(?) spam site that syndicates my content, proving that also <a href="http://www.well.com/~doctorow/metacrap.htm#2.1">in the Semantic Web people lie</a></li>
<li>Some <a href="http://plazes.com/users/7006">Plazes entries</a> about me located in Helsinki</li>
<li>Midgard events held <a href="http://www.midgard-project.org/community/events/midgard_gathering_2008/">near Helsinki</a></li>
</ul><p>
Since search engines (well, <a href="http://www.google.com/">Google</a> really) are <a href="http://www.cabel.name/2008/03/japan-urls-are-totally-out.html">the way people access the web</a>, search engines are the key for making semantic information more widely available. Just look at <a href="http://blog.unto.net/web/a-survey-of-rel-values-on-the-web/">DeWitt Clinton's survey of rel values</a> from yesterday: <a href="http://googleblog.blogspot.com/2005/01/preventing-comment-spam.html">Google-defined</a> <code>rel="nofollow"</code> is the most popular <a href="http://www.whatwg.org/specs/web-apps/current-work/#linkTypes">rel value</a> out there, even surpassing <a href="http://www.w3.org/TR/REC-html40/present/styles.html#h-14.3">style sheet declarations</a>. This if nothing else shows the power of search engines in promoting new standards.
</p>

<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/google" rel="tag">google</a>, <a href="http://www.technorati.com/tag/iks" rel="tag">iks</a>, <a href="http://www.technorati.com/tag/microformats" rel="tag">microformats</a>, <a href="http://www.technorati.com/tag/yahoo" rel="tag">yahoo</a>, <a href="http://www.technorati.com/tag/rdfa" rel="tag">rdfa</a>, <a href="http://www.technorati.com/tag/search" rel="tag">search</a>, <a href="http://www.technorati.com/tag/semanticweb" rel="tag">semanticweb</a></p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.175201 24.919201</georss:point>
            <category>midgard</category>
            <pubDate>Tue, 17 Feb 2009 07:46:52 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-245a38fafcc711dd93462b49fd8f1c9a1c9a</guid>
        </item>
        <item>
            <title>Starting the Interactive Knowledge project</title>
            <link>http://bergie.iki.fi/blog/starting_the_interactive_knowledge_project/</link>
            <description><![CDATA[
<p>
I spent this week at <a href="http://www.salzburgresearch.at/company/index_e.php">Salzburg Research</a> in Austria attending the kick-off meeting of the <a href="http://www.iks-project.eu/">Interactive Knowledge Consortium</a>, a €6,5m <a href="http://cordis.europa.eu/fp7/">EU-funded</a> project to introduce <a href="http://www.w3.org/DesignIssues/Semantic.html">semantic</a> capabilities into <a href="http://en.wikipedia.org/wiki/Category:Open_source_content_management_systems">open source content management systems</a>.
</p>

<p>
<a href="http://bergie.iki.fi/midcom-serveattachmentguid-3a10e10cef3011dd815329d5c807b3feb3fe/iks-salzburg-20090128.png"><img src="http://bergie.iki.fi/midcom-serveattachmentguid-3d075d8cef3011dd93eab169a99922692269/iks-salzburg-20090128-tm.jpg" height="191" width="398" border="1" hspace="4" vspace="4" alt="IKS project team in Salzburg" title="IKS project team in Salzburg" /></a>
</p>

<p>
<a href="http://nemein.com/en/">Nemein</a> is participating in the project as one of the six industrial partners. For the next four years we will be working together with cool CMS companies like <a href="http://www.day.com/content/day/en.html">Day</a> and <a href="http://www.nuxeo.com/en/">Nuxeo</a>, as well as with some of the leading European researchers in the field of <a href="http://en.wikipedia.org/wiki/Semantic_Web">Semantic Web</a>.
</p>

<p>
The plan is reasonably simple: we will try to figure out what kind of semantic features would make sense to CMS end-users, and then based on that develop the user interface conventions and tools that various participating CMSs can apply. Once the case has been proven with the initial participating systems, we will then help other CMS projects to implement the same stack in order to set off a wave of semantically-enhanced websites across the Europe.
</p>

<p>
For us in the <a href="http://www.midgard-project.org/">Midgard</a> community this is well-timed, as we're anyway concentrating much effort on the <a href="http://bergie.iki.fi/blog/midgard_2-more_than_just_php-more_than_just_cms/">new "Vinland" series</a> in order to build a set of content management tools that can carry us through the next ten years of web evolution, as the old Midgard series did <a href="http://www.linuxtoday.com/developer/1999050701705NWSW">since 1999</a>.
</p>

<p>
The project will be a good chance to leverage our experiences with <a href="http://bergie.iki.fi/blog/getting-started-with-microformats/">Microformats</a> and apply them to the "uppercase semantic web". Use cases range from <a href="http://en.wikipedia.org/wiki/SPARQL">smarter queries</a> into content inside a Midgard repository to <a href="http://bergie.iki.fi/blog/contact_management_and_microformats/">automatic maintenance tools</a> utilizing <a href="http://www.w3.org/TR/xhtml-rdfa-primer/">semantic content</a> in external resources.
</p>

<p>
In addition to taking Midgard to a new level as a CMS, it will be great to collaborate again with several familiar faces from the old days <a href="http://bergie.iki.fi/blog/the-doubtful-future-of-oscom/">of OSCOM</a> - people like <a href="http://grep.codeconsult.ch/">Bertrand</a> from Day, <a href="http://sandro.groganz.com/weblog/">Sandro</a> from InitMarketing and <a href="http://www.ohloh.net/accounts/OpenAlex">Alexander</a> from Alkacon.
</p>

<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/iks-project" rel="tag">iks-project</a>, <a href="http://www.technorati.com/tag/semanticweb" rel="tag">semanticweb</a></p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>60.175201 24.919201</georss:point>
            <category>midgard</category>
            <pubDate>Sat, 31 Jan 2009 00:43:55 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-3d6f85c4ef3011dda285bf8ba6c46cb76cb7</guid>
        </item>
        <item>
            <title>Flash is not the web</title>
            <link>http://bergie.iki.fi/blog/flash_is_not_the_web/</link>
            <description><![CDATA[
<p>
Let me share a little piece of Internet happiness: When I got my iPhone, I wondered how could its web browser be so dramatically faster than the <a href="http://www.vasanth.in/2008/01/30/N810MicroBBrowser.aspx">one on my N810</a>. Could it be just that iPhone has faster processor, and uses <a href="http://webkit.org/">WebKit</a> instead of Mozilla? But at the same time, the state-of-the-art <a href="http://www.mozilla.com/en-US/firefox/">Firefox 3</a> on <a href="http://flickr.com/photos/bergie/tags/macbookair/">my MacBook Air</a> was also feeling sluggish.
</p>

<p>
After giving this a little bit of thought, I decided, Flash must be the guilty party. <a href="http://en.wikipedia.org/wiki/Adobe_Flash">Flash</a>, as we know, is Adobe's proprietary framework for building multimedia-rich applications, and iPhone simply <a href="http://www.tuaw.com/2007/06/12/its-official-no-flash-support-on-the-iphone-yet/">doesn't support it</a>. Sometimes Flash is actually used for building interesting applications, but most usage online seems to be just fancy animated banners. So, I thought, there must be a smart way to get rid of Flash. And there is: With Firefox you can use the <a href="http://flashblock.mozdev.org/">FlashBlock extension</a> to excise all Flash content off the pages:
</p>

<p>
<a href="http://bergie.iki.fi/midcom-serveattachmentguid-fb7c0a989dfe11ddbd57458be9cc09f609f6/arstechnica-with-flashblock.png"><img src="http://bergie.iki.fi/midcom-serveattachmentguid-ff88725c9dfe11dd83b943f4337535593559/arstechnica-with-flashblock-tm.jpg" height="224" width="398" border="1" hspace="4" vspace="4" alt="Arstechnica with Flashblock" title="Arstechnica with Flashblock" /></a>
</p>

<p>
With other browsers you could off course uninstall the Flash plug-in, but the problem is that sometimes there is Flash content you actually want to see. And in these cases FlashBlock works perfectly: each Flash area on a site is replaced with a box that you can activate at will. So before <a href="http://ostatic.com/172399-blog/chrome-javascript-and-flash-two-mostly-opposing-views">Flash is made obsolete</a> by the recent <a href="http://webkit.org/blog/140/html5-media-support/">advancements in HTML</a> and <a href="http://www.pathf.com/blogs/2008/08/faster-javascript-for-firefox-31-thru-jit/">Javascript</a>, this option is the best of both worlds.
</p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>41.0378 28.927</georss:point>
            <category>oscom</category>
            <pubDate>Sun, 19 Oct 2008 16:57:25 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-016bf4a49dff11dd975c83eeb3623e243e24</guid>
        </item>
        <item>
            <title>Neutron Protocol: Separating UI from the CMS</title>
            <link>http://bergie.iki.fi/blog/neutron_protocol-separating_ui_from_the_cms/</link>
            <description><![CDATA[
<p>
At the moment the prevailing wisdom is that each CMS should have its own user interface, and that user interface should be web-based. But there is also another way: separating the user interface from the CMS using a CMS-neutral protocol called Neutron.
</p>

<p>
According to <a href="http://www.w3.org/People/Berners-Lee/">Sir Tim Berners-Lee</a>, the earliest web browser was <a href="http://en.wikipedia.org/wiki/WorldWideWeb#Features">also an editor</a>. And the late 90s <a href="http://en.wikipedia.org/wiki/Netscape_Composer">Netscape Communicator</a> followed this ideal by including a HTML editor that could publish changes to pages using the <a href="http://www.apacheweek.com/features/put">HTTP PUT</a> method. But then the idea of editing via the web browser transformed to clunky forms and Java applet -based WYSIWYG editors, brought about by the rise of content management systems.
</p>

<p>
The problems of the user interface being part of the web page were multiple: it cluttered the produced HTML, it was possible to break by layout changes, sometimes the login and editing options were hard to find. It also meant that each and every CMS would have a completely different user interface. A problem made especially difficult if you had to use multiple systems. For example:
</p>

<p>
If you are <a href="http://maemo.org/profile/view/qgil/">Quim Gil</a>, working for Nokia's <a href="http://maemo.org/">maemo.org</a>, you're living in a world of many, many CMSs. The <a href="http://maemo.org/">marketing and community parts</a> of the website are run by <a href="http://www.midgard-project.org/">Midgard</a>, the <a href="http://wiki.maemo.org/">documentation wiki</a> by <a href="http://www.mediawiki.org/">MediaWiki</a>, your <a href="http://flors.wordpress.com/">own blog</a> by <a href="http://wordpress.org/">WordPress</a>, and the list goes on. While in this kind of corporate setup it has been possible to mostly unify usernames and passwords, it still means each part of your work runs with different UIs, and different usage logic. Back in 2003, I named this syndrome <a href="http://oscom.org/projects/documentation/midgard/case-oscom.html">Frankenstein CMS</a>.
</p>

<p>
In addition to consistency and usability, offline editing has been a big issue with most CMSs. In typical situation, it simply doesn't exist, making copy-and-paste way of taking documents with you to edit on a laptop while traveling.
</p>

<p>
There have been several initiatives in solving these problems. A quite limited, but so far successful example is the <a href="http://universaleditbutton.org/Universal_Edit_Button">Universal Edit Button</a> specification, making rounds earlier this summer. The idea is that CMSs would include metadata on where the editing view of a particular page was in the page itself, and then browsers would display a button leading to it. The approach has been adopted by several big players, including Wikipedia, and we also made it a part of the new CMS that will be built on <a href="http://bergie.iki.fi/blog/midgard_2-more_than_just_php-more_than_just_cms.html">Midgard 2</a>:
</p>

<p>
<img src="http://bergie.iki.fi/midcom-serveattachmentguid-2accbcb265f511ddae75cb6d513f60396039/midcom3-ueb.jpg" height="186" width="260" border="1" hspace="4" vspace="4" alt="Universal Edit Button in MidCOM 3" title="Universal Edit Button in MidCOM 3" /></p>

<p>
Another, also somewhat limited example is the <a href="http://www.xmlrpc.com/metaWeblogApi">MetaWeblog API</a> provided by most blogging platforms. It has enabled vendors to produce great offline blogging software like <a href="http://infinite-sushi.com/software/ecto/">Ecto</a> and <a href="http://www.red-sweater.com/marsedit/">MarsEdit</a> that provide offline editing and work with almost any blogging system out there. As I write this, I'm using Ecto on my MacBook Air, and will later use it to publish this entry to my Midgard server. The <a href="http://www.rfc-editor.org/rfc/rfc5023.txt">Atom Publishing Protocol</a> will likely be the successor of MetaWeblog, but appears to still keep the blog-only focus.
</p>

<p>
Back in the earlier days of <a href="http://oscom.org/">OSCOM</a> we had another initiative called <a href="http://www.oscom.org/projects/twingle/">Twingle</a>. It was a XUL-based desktop CMS client that utilized WebDAV and some XML introspection files to edit and publish data on different CMSs. After a <a href="http://www.oscom.org/events/sprints/1--zurich-march-2003/">March 2003 OSCOM Sprint </a>in Zurich we were able to demo the same client browsing and editing resources on three CMSs, including Zope and Midgard. Unfortunately, then CMS market became so hot that vendors were simply too busy to pick this up and the project died.
</p>

<p>
Luckily <a href="http://www.wyona.com/people/michael-wechner/index.html">Michael Wechner</a>, of OSCOM and <a href="http://lenya.apache.org/">Apache Lenya</a> fame didn't let the idea die. He worked it onwards, naming the protocol used for conversation between the client and the server <a href="http://neutron.wyona.org/">Neutron Publishing Protocol</a>, a play on Atom. He also built a new client, <a href="http://www.yulup.org/index.html">Yulup</a>, as a Firefox extension that could manage content on compatible servers.
</p>

<p>
<a href="http://bergie.iki.fi/midcom-serveattachmentguid-46c28e0665f511ddb69183ca183432173217/michael_wechner_in_horgenberg.jpg"><img src="http://bergie.iki.fi/midcom-serveattachmentguid-4ce43d7a65f511dd9a98255b6b8079727972/michael_wechner_in_horgenberg-tm.jpg" height="249" width="400" border="1" hspace="4" vspace="4" alt="Michael Wechner in Horgenberg" title="Michael Wechner in Horgenberg" /></a>
</p>

<p>
In summer 2007 I saw a demo of Yulup and discussed Neutron with Michi and was impressed. But was back then too depressed by <a href="http://bergie.iki.fi/blog/when_a_holiday_gets-interesting.html">the Czech episode</a> and other personal issues to press on with the idea. Having watched another year of the directions the community is taking Midgard CMS to, and how clients view CMS deployments, I'm starting to think the time would be ripe for going full forward with Neutron.
</p>

<p>
In nutshell Neutron is a metadata layer that allows a CMS to specify the actions user can take, and the methods provided for those actions. The methods can either be full-blown WebDAV, or simpler GET-and-POST that more limited CMSs can support. Neutron also provides its own authentication mechanism, though I would gladly see that overtaken by  a more secure and widely supported standard like <a href="http://oauth.net/">OAuth</a>.
</p>

<p>
Widely-supported Neutron would provide huge advantages: letting the developers of a CMS to focus on the actual management and presentation layers of the system, and allowing more innovation to happen in the client end due to combined efforts from multiple CMS projects. It would allow building of different content management interfaces for different audiences or usage scenarios. Simple editing and publishing clients that could run fully in browser's AJAX space for casual bloggers or wiki editors, workflow tools for gatekeepers of corporate publishing processes, and full-blown desktop content management tools for site editors. Other special cases like mobile content management could also be provided for.
</p>

<p>
So what is needed for this future to become reality? First of all, we need to make CMS developers aware of the possibility. Then we need a killer client that every CMS provider would want to support. And then we can expand the protocol, and build additional clients to cater for special needs.
</p>

<p>
The big question is how this will happen. Industry groups in CMS space are loose or non-existing, and so they lack the muscle to push any standards. Effort by single CMS vendor would probably stay partisan, as developers of different systems are quite suspicious or ignorant of each other. But maybe a combination of the two would work: industry group, such as OSCOM organizing some compatibility hacking events for the developer community, and a company dedicated at building a killer client application. It warrants serious consideration if <a href="http://nemein.com/">Nemein</a> should be that company.
</p>

<p>
<em>This manifesto on transforming how CMSs are used was written in an Eurostar London-Brussels train, sipping Dourthe's Bordeaux white and listening to the Karelia cycle by Sibelius.</em>
</p>
]]></description>
            <author>henri.bergius@iki.fi (Henri Bergius)</author>
            <georss:point>51.070099 4.50136</georss:point>
            <category>desktop</category>
            <pubDate>Sat, 09 Aug 2008 09:26:58 +0000</pubDate>
            <guid>http://bergie.iki.fi/midcom-permalink-50c4ea0c65f511ddb86ff73c64b58bf38bf3</guid>
        </item>
    </channel>
</rss>

