<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
         xmlns="http://purl.org/rss/1.0/">




    



<channel rdf:about="http://blog.fourdigits.nl/martijnjacobs/RSS">
  <title>martijnjacobs</title>
  <link>http://blog.fourdigits.nl</link>

  <description>
    
       
       
  </description>

  
  
            <syn:updatePeriod>daily</syn:updatePeriod>
            <syn:updateFrequency>1</syn:updateFrequency>
            <syn:updateBase>2009-07-01T09:57:41Z</syn:updateBase>
        

  <image rdf:resource="http://blog.fourdigits.nl/logo.gif"/>

  <items>
    <rdf:Seq>
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/plone-conference-2010-day-1-a-summary"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/removing-a-persistent-local-utility-part-ii"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/how-to-break-your-plone-site-with-implementedby"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/tinymce-and-deco-at-the-plone-conference-2009"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/computers-on-red-soil"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/a-europython-impression-part-iii"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/a-europython-impression-part-ii"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/a-europython-impression-part-i"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/a-ha-cluster-setup-for-plone-and-zope-part-i"/>
        
    </rdf:Seq>
  </items>

</channel>

    <item rdf:about="http://blog.fourdigits.nl/plone-conference-2010-day-1-a-summary">        <title>Plone Conference 2010 Day 1 : A summary</title>        <link>http://blog.fourdigits.nl/plone-conference-2010-day-1-a-summary</link>        <description>The Plone Conference this year is being held in Bristol, UK. A short summary of the talks of the first day I've went to.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>The Plone Conference this year is being held in Bristol, UK. A short summary of the talks of the first day I've went to.</p><p>We arrived on Tuesday evening at hotel "The Grand", which is also the location where the 2010 Plone Conference is held. A really nice location, located in the city centre of Bristol.</p>
<p><img alt="The Grand" class="image-inline" src="TheGrand.JPG/image_preview" /></p>
<p>After checking in we visited the Watershed, located near the harbour area of Bristol. Most of the conference visitors were also there so we enjoyed a cold beer together. Rob was having a meeting with who we call the "Plone rockstars", and lateron they joined us at the Watershed as well.</p>
<p><img alt="Keynote of Limi @ Plone Conference 2010" class="image-inline" src="Limi.JPG/image_preview" /><br /> The next day the conference itself started with the keynote of Alexander Limi. The usual game "where is everybody coming from" was played, but somehow this always works to create a real international atmosphere, which the conference is famous for of course.</p>
<p><img alt="Rob Gietema @ Plone Conference 2010" class="image-inline" src="Rob.jpg/image_preview" /></p>
<p>Right after the keynote Rob informed the community of the current status of Deco, which have been worked on during the Living Statues sprint. Mikko enlighted us about the current status of <a class="external-link" href="http://pypi.python.org/pypi/mfabrik.webandmobile/0.9">Web &amp; mobile</a> which has an official release right now. Really interesting if you want to have your Plone (or other python based) website to go mobile.</p>
<p><img alt="Matthew Wilkes @ Plone Conference 2010" class="image-inline" src="Matthew.JPG/image_preview" /></p>
<p>Matthew Wilkes gave a presentation about making high performance websites easy. Sane thinking and good caching including ESI can make a Plone site sreally fast, so you should check out his presentation.</p>
<p><img alt="Eric Steele @ Plone Conference 2010" class="image-inline" src="Eric.JPG/image_preview" /></p>
<p>Eric Steele talked about how we can improve Plone in the future, focussed on strategy, vision, responsibilities and ways to communicate in and outside the Plone community.</p>
<p><img alt="Martin Aspelli @ Plone Conference 2010" class="image-inline" src="Aspelli.JPG/image_preview" /></p>
<p>After that Martin Aspelli talked about how you should implement a Plone project the correct way by using a recent project he's been working at. Conventions and design choices were explained by good examples and arguments, and it was really good to see him back on the stage of a conference again.</p>
<p><img alt="Reduce Reuse Recycle" class="image-inline" src="Sheet.JPG/image_preview" /></p>
<p>After his first talk he had another presentation about project management, tools to use and how to make a success out of your project. Information everyone should know, explained in a easy and understandable way.</p>
<p>To finish of the day <a class="external-link" href="http://en.wikipedia.org/wiki/ThrustSSC">Richard Noble</a> gave an excellent talk about the current attempt at the world landspeedrecord. Although it is a completely different project there are quite a lot of similarities. Especially the "no patent"-policy is really as open as you can get. Really nice to see somebody who is this enthousiastic about a project and motivating others to realize his dream.</p>
<p>In short : a very interesting first day at the conference with some really quality talks, so if you're not at the conference you should watch the video's!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-10-28T16:00:52Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/removing-a-persistent-local-utility-part-ii">        <title> Removing a persistent local utility part II</title>        <link>http://blog.fourdigits.nl/removing-a-persistent-local-utility-part-ii</link>        <description>Installing products, testing them and uninstalling them afterwards is a common thing to do in Plone. However, removing the product (egg) from your buildout could lead in having some persistent objects in your ZODB which are broken. But how to remove them?</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Installing products, testing them and uninstalling them afterwards is a common thing to do in Plone. However, removing the product (egg) from your buildout could lead in having some persistent objects in your ZODB which are broken. But how to remove them?</p><h2>The problem</h2>
<p>When you remove a product, Zope does not know any more what the pickled objects in the ZODB are. Sometimes you do not notice any problems until you want to install a new product or want to change some setting in the plone control panel. Strange error appear like :</p>
<pre>Module Products.GenericSetup.tool, line 1181, in _runImportStepsFromContext<br /> Module Products.GenericSetup.tool, line 1092, in _doRunImportStep<br /> - __traceback_info__: toolset<br /> Module Products.GenericSetup.tool, line 130, in importToolset<br />TypeError: 'NoneType' object is not callable</pre>
<p>or you see messages in your Zope log like :</p>
<pre>WARNING OFS.Uninstalled Could not import class &lt;myclass&gt; from module &lt;mymodule&gt;</pre>
<p>Sometimes you get a <i>ComponentLookupError</i> by visiting the Plone site, even when you use the ZMI. Or some other strange error occurs (I've seen many different errors unfortunately).</p>
<p>Normally you can<a class="internal-link" href="removing-a-persistent-local-utility"> remove a local utility by using the unregisterUtility method</a>, but at this moment you don't have the product installed, so importing interfaces etc is not an option. Reinstalling is not what you want, so what to do now?</p>
<h2>What to do</h2>
<p>The first thing to do is to find out which product was responsible for the broken persistent components so know where and what to look for. You probably remember which product you uninstalled, otherwise you can find some hints in the zope access log file. Look in the profile and zcml of the product what is registered using a generic setup profile. We use <i>collective.myproduct</i> for the rest of this blogpost.</p>
<p>Create a new zope instance with your broken Data.fs and start a debugging prompt with b<i>in/instance debug</i> so you can start investigating the ZODB.</p>
<p class="discreet">Tip :You can use the .__dict__ property or the dir() method to inspect objects in the ZODB.</p>
<p><b>Disclaimer : Do not ever, ever do this in production environments unless you know what you are doing. One mistake can break your Plone website totally.</b></p>
<h2>Sitemanager</h2>
<p>In the zope component architecture, local utilities are stored in a local site manager. With Plone 3 and 4, you have a Sitemanager on your portal object. First thing to do is to get this Sitemanager.</p>
<pre>sm = app.myportal.getSiteManager()</pre>
<p>The sitemanager holds three types of local components : adapters, subscribers and providers.  (At least, that is what I found out). We should get them so we can see if our broken component is there somehow :</p>
<pre>adapters = sm.utilities._adapters<br />subscribers = sm.utilities._subscribers<br />provided = sm.utilities._provided</pre>
<p>Let's list (a part) of the current registered adapters :</p>
<pre>&gt;&gt;&gt; for x in adapters[0].keys():<br />...     print x<br />... <br />&lt;InterfaceClass plone.browserlayer.interfaces.ILocalBrowserLayerType&gt;<br />&lt;InterfaceClass zope.app.cache.interfaces.ram.IRAMCache&gt;<br />&lt;class 'collective.myproduct.interfaces.IMyProductConfig'&gt;<br />&lt;InterfaceClass Products.PortalTransforms.interfaces.IPortalTransformsTool&gt;<br />&lt;InterfaceClass plone.app.i18n.locales.interfaces.IContentLanguages&gt;<br />...</pre>
<p>In the list we can see that there is an adapter registered, and you can also see that the class differs from the others, because it's a broken object. You can verify that it's broken by printing the title of this object.</p>
<pre>for x in adapters[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />        print "%s" % x.title<br />This object from the unknown product is broken!</pre>
<p>So we found our broken object so we should delete it :</p>
<pre>for x in adapters[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />        print "deleting %s" % x<br />        del adapters[0][x]<br />sm.utilities._adapters = adapters</pre>
<p>After the reassignment the <a class="external-link" href="http://www.zope.org/Documentation/Articles/ZODB1">ZODB machinery does not detect that there is a change</a>, so we should commit this change :</p>
<pre>from transaction import commit<br />commit()<br />app._p_jar.sync()</pre>
<p>The same story goes for the subscribers and providers, so here is all the code together :</p>
<pre>sm = app.myportal.getSiteManager()<br />adapters = sm.utilities._adapters<br />for x in adapters[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />    print "deleting %s" % x<br />    del adapters[0][x]<br />sm.utilities._adapters = adapters<br /><br />subscribers = sm.utilities._subscribers<br />for x in subscribers[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />    print "deleting %s" % x<br />    del subscribers[0][x]<br />sm.utilities._subscribers = subscribers<br /><br />provided = sm.utilities._provided<br />for x in provided.keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />    print "deleting %s" % x<br />    del provided[x]<br />sm.utilities._provided = provided<br /><br />from transaction import commit<br />commit()<br />app._p_jar.sync()</pre>
<p>Now we got rid of our persistent components we don't want anymore, but some problems can still occur when (re)installing products using the Portal Quickinstaller or the Portal Setup tool.</p>
<h2>Portal Setup</h2>
<p>If you still have problems (re)installing products after you removed the broken local persistent components, you probably have to clean the Portal setup tool.You probably see something like this in the error log :</p>
<pre>TypeError: 'NoneType' object is not callable</pre>
<p>Check your product if it registers a tool using a <i>toolset.xml</i> file, like this :</p>
<pre>&lt;?xml version="1.0"?&gt;<br />&lt;tool-setup&gt;<br /> &lt;required tool_id="portal_myproduct" /&gt;<br />&lt;/tool-setup&gt;</pre>
<p>Fire up your debugger and get the portal_setup tool. It keeps its own registry for all registered tools which you can get using the <i>getToolsetRegistry</i> method :</p>
<pre>setup_tool = app.myportal.portal_setup<br />toolset = setup_tool.getToolsetRegistry()</pre>
<p style="text-align: left;">Check if a tool exists with the tool_id, which has been registered using  <i><br />&lt;required tool_id="portal_myproduct" /&gt;</i> and remove it :</p>
<pre>if 'portal_myproduct' in toolset._required.keys():<br />    del toolset._required['portal_myproduct']<br />    setup_tool._toolset_registry = toolset<br /><br />from transaction import commit<br />commit()<br />app._p_jar.sync()</pre>
<p style="text-align: left;">I'm pretty sure this is not the way to go, as I occasionally still see the OFS.Uninstalled warning, so I hope someone who reads this says <i>"This is not the way to go, you should do this".</i></p>
<p style="text-align: left;">Quit your debugging session and start your instance with <i>bin/instance fg. </i>Browse to the portal_setup tool using the ZMI and go to the "manage" tab. (<i>http://localhost/myportal/portal_setup/manage_stepRegistry</i>). There you can delete any invalid import steps if they are still there.</p>
<p>Now you should be able to install products again, and have your Plone site up and running without problems.</p>
<h2>Nice post, but this kind of ugly hacking shouldn't be necessary!</h2>
<p>And I agree totally on this. So a note to all product developers is : <a class="external-link" href="http://plone.org/documentation/kb/genericsetup/creating-an-uninstall-profile">Please write uninstall profiles!</a> You can also remove persistent utilities in your uninstall profile like <a class="internal-link" href="removing-a-persistent-local-utility">Roel described in a previous blogpost</a>. And I' sure there is some development on this part with Generic Setup.</p>
<h2>Feedback</h2>
<p>Everything I described in this post I found out by trial and error, as there is little documentation on these issues. And if it's there: I would like to know! And if you have better, nicer or other ways of doing all these things : Also let me know! Thank you in advance.</p>
<h2></h2>
<h2></h2>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-04-23T15:55:05Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/how-to-break-your-plone-site-with-implementedby">        <title>How to break your Plone site with implementedBy</title>        <link>http://blog.fourdigits.nl/how-to-break-your-plone-site-with-implementedby</link>        <description>Sometimes, when you start your plone instance, just like any other day, you get an error message which make you think : hmmmm... what on earth is going on here?</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Sometimes, when you start your plone instance, just like any other day, you get an error message which make you think : hmmmm... what on earth is going on here?</p><p>When you are developing, you know that error messages will be there sooner or later. Most of the time when you don't know the answer immediately you copy and paste the message in your google searchbar and you will find the answer within a few minutes. If you first had your coffee you would have known immediatly what was going on, but hey, don't blame yourself, today it is a typical monday morning.</p>
<p>But on some very rare occasions you don't find an answer in a few minutes. You even won't find an answer after a few hours, and after spending some time with your very intelligent and smart colleagues you don't find anything which could point you in the right direction. And this always happens when you don't want it to happen offcourse.</p>
<p>An example error message of this is the following, on a Plone 3.3.2 website you are developing on for some weeks :</p>
<pre>...<br />raise TypeError("ImplementedBy called for non-factory", cls)<br />File "../parts/zope2/lib/python/zope/interface/declarations.py", <br />line 353, in implementedByFallback<br />TypeError: (&lt;exceptions.TypeError instance at 0x936cb20&gt;, <br />&lt;built-in function implementedBy&gt;, <br />(&lt;RegistrationTool at portal_registration&gt;,))</pre>
<p>This happened by just visiting the Plone site, it even happened when visiting the ZMI.</p>
<h3>Get back</h3>
<p>We had to edit the code of <i>zope/interfaces/declarations.py </i>to something like this to get back in our Plone site  :</p>
<pre>...<br /> else:<br />     try:<br />         bases = cls.__bases__<br />     except AttributeError:<br />         if not callable(cls):<br />             pass<br /># raise TypeError("ImplementedBy called for non-factory", cls)<br />         bases = ()<br /> bases = ()</pre>
<p>Ok, after this very unwanted change it as time to find out what was going on. What we know now is  that is has something to do with <i>implementedBy</i> and that we used in in some code to check if an objects implements an interface.</p>
<h3>Check the documentation</h3>
<p>What does the <a class="external-link" href="http://docs.zope.org/zope2/zdgbook/ComponentsAndInterfaces.html">documentation</a> say about <i>implementedBy</i> ?</p>
<pre>3.7. Checking Implementation<br /><br />You can ask an interface if a certain class or instance that you hand <br />it implements that interface. For example, say you want to know if <br />instances of the HelloComponent class implement ‘Hello’:<br /><br />&gt;&gt;&gt; IHello.implementedBy(HelloComponent)<br /><br />This is a true expression. If you had an instance of HelloComponent, <br />you can also ask the interface if that instance implements the <br />interface:<br /><br />&gt;&gt;&gt; IHello.implementedBy(my_hello_instance)</pre>
<p>Ok, so it's only querying a class or an instance if it's implementing an interface. Nothing evil on that, right?</p>
<p>No clue where to look now so let's try to export some valuable content from the website by making an <i>.zexp </i>file. But while importing the <i>zexp</i> you get another error message :</p>
<pre>Module ZODB.ExportImport, line 92, in importFile<br /> Module transaction._transaction, line 256, in savepoint<br /> Module transaction._transaction, line 253, in savepoint<br /> Module transaction._transaction, line 642, in __init__<br /> Module ZODB.Connection, line 1091, in savepoint<br /> Module ZODB.Connection, line 550, in _commit<br /> Module ZODB.ExportImport, line 178, in _importDuringCommit<br /> Module copy_reg, line 70, in _reduce_ex<br />TypeError: default __new__ takes no parameters</pre>
<p>Right. The plone site is broken, we cannot export the content and even when you copy and paste content in the same website you get this error. And nobody on the world seems to have a similar problem.</p>
<h3>IRC log FTW</h3>
<p>Google is giving us a lot of hits on <i>ZClasses</i> for Zope versions of 2.9 and below. But we use Zope 2.10.9 and offcourse no <i>ZClasses</i>. Fortunately, there is one useful hint from an <a class="external-link" href="http://weblion.psu.edu/chatlogs/%23plone/2009/09/24.txt">irc log</a> by dixond :</p>
<pre>&lt;dixond&gt; I had some code, which made the mistake of calling<br />ISiteRoot.implementedBy(context) ,which is (apparently) supposed to <br />exception if context is not callable. I guess Archetypes objects are <br />actually callable. Anyhow, it didn't Exception. Instead, it hosed the <br />object such that import/export of that object no longer worked.<br /><br />&lt;dixond&gt; thing is that it was a post-hoc thing. IE, once <br />ISiteRoot.implementedBy(context) had been called once, it was stuffed <br />from then on in. The object was just bung.</pre>
<p>That's nice. When using <i>implementedBy</i> on an Archetypes object it permanently breaks it, according to dixond. Let's investigate the objects using a debug session to find out what is going on. It probably has something to do with <i>__implements__ </i>or <i>__implemented__</i>, as that is queried a lot in the <i>implementedBy</i> method.</p>
<p>On the broken plone installation (which could be run by patching the <i>interfaces/declarations.py</i> file) :</p>
<pre>object = app.myportal.myfolder.myobject<br />object.__implemented__<br />&lt;implementedBy mypackage.content.content.project.?&gt;<br /></pre>
<p>That looks odd. A question mark. Let's see if we can find something on that. In the docstring of <i>implementedBy</i> :</p>
<pre>Note that the name of the spec ends with a '?', because the `Callable` <br />instance does not have a `__name__` attribute.</pre>
<p>Hmm, Ok. we should invest some time by starting a pdb session to see what happens there in implementedBy, but we are running out of time as we want a working website now. Let's try, a wild guess, to remove the <i>__implemented__</i> attribute :</p>
<pre>del object.__implemented__<br />object.__implemented__<br />&lt;implementedBy mypackage.content.content.project.Project&gt;</pre>
<p>That is looking different. By adding a fresh plone site and some new content we figured out that those new objects do not have question marks in their <i>__interfaces__</i> either.</p>
<h3>Fixing the Plone site</h3>
<p>Ok, back to the start. We have a broken Plone site and some weird stuff in our <i>__implemented__ </i>attributes. We want a full working Plone site again, so we tried to remove all the <i>__implemented__ </i>attributes of the objects and committed it to the ZODB. Hopefully we could export our content again, and fortunately we could!</p>
<p>After replacing the <i>implementedBy</i> calls in our code with <i>providedBy</i> (we were testing if instances provide the interface anyway) the problems are now gone.</p>
<p>And yes, zope.interface is probably giving the right answer when to use which method :</p>
<pre>def providedBy(object):<br />"""Test whether the interface is implemented by the object"""<br /><br />def implementedBy(class_):<br />"""Test whether the interface is implemented by instances of the class"""<br /></pre>
<p>However, a query method should not alter your objects in my opinion. So my conclusion for now, until I fully understand what is going on is :</p>
<p><b><i>Think twice before using implementedBy in your Plone project and do not call it on Archetypes objects.<br /></i></b></p>
<p>I hope some people with knowledge of this kind of issues have some useful comments on this. Until then you will probably find two useful hits when you search for it on google :)</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-11-24T08:34:12Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/tinymce-and-deco-at-the-plone-conference-2009">        <title>TinyMCE and Deco at the Plone Conference 2009 </title>        <link>http://blog.fourdigits.nl/tinymce-and-deco-at-the-plone-conference-2009</link>        <description>This year the Plone Conference 2009 is in Budapest. Rob Gietema hosted two talks : TinyMCE, the new editor for Plone 4 and Deco, the new layout system for Plone 5.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>This year the Plone Conference 2009 is in Budapest. Rob Gietema hosted two talks : TinyMCE, the new editor for Plone 4 and Deco, the new layout system for Plone 5.</p><p>We arrived on tuesday afternoon, together with our friends of <a class="external-link" href="http://www.gw20e.com">Goldmund, Wyldebeast &amp; Wunderliebe</a>. Budapest is a great city to go out, so we had some drinks and food in the city centre.</p>
<p><img alt="4D en GWW in Budapest" class="image-inline" src="4DenGWWinBudapest.jpg/image_preview" /></p>
<p>On wednesday, the Plone Conference officially started with an <a class="external-link" href="http://www.ustream.tv/recorded/2439526">excellent keynote</a> of <a class="external-link" href="http://limi.net/">Alexander Limi</a> about the current status and the future of Plone. Rob talked about the <a class="external-link" href="http://plone.org/products/tinymce/">TinyMCE Editor integration</a> in Plone. <a class="external-link" href="http://tinymce.moxiecode.com/">TinyMCE</a> is one of the best WYSIWYG editors around and nowadays an excellent alternative for the default Kupu editor and it's compatible with all the 3.x versions of Plone. It will be the new default editor in Plone 4.</p>
<h3>The video of the TinyMCE presentation</h3>
<p>
<object data="http://www.ustream.tv/flash/video/2439640" height="386" id="utv116883" type="application/x-shockwave-flash" width="480">
<param name="name" value="utv_n_123484">
<param name="flashvars" value="loc=%2F&amp;autoplay=false&amp;vid=2439640">
<param name="allowfullscreen" value="true">
<param name="allowscriptaccess" value="always">
<param name="src" value="http://www.ustream.tv/flash/video/2439640">
</object>
</p>
<p> </p>
<p>After the lunch and the talk of Alexander Limi about the <a class="external-link" href="http://www.ustream.tv/recorded/2440178">Deco CSS grid system</a>, Rob's talk started to demo the current version of <a class="external-link" href="http://code.google.com/p/plone-deco/">Deco</a>. Deco will be the next best thing in Plone : Instead of just editing content you defined in your content types you can edit the layout of your website as well. With Deco, you build up your page using tiles which you can drag &amp; drop according to the grid which is defined. Tiles can be anything you want : a piece of text, an image or even an application.</p>
<h3>The video of the Deco presentation</h3>
<p>
<object data="http://www.ustream.tv/flash/video/2440442" height="386" id="utv971022" type="application/x-shockwave-flash" width="480">
<param name="name" value="utv_n_279014">
<param name="flashvars" value="loc=%2F&amp;autoplay=false&amp;vid=2440442">
<param name="allowfullscreen" value="true">
<param name="allowscriptaccess" value="always">
<param name="src" value="http://www.ustream.tv/flash/video/2440442">
</object>
</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-10-28T15:55:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/computers-on-red-soil">        <title>Computers on Red Soil</title>        <link>http://blog.fourdigits.nl/computers-on-red-soil</link>        <description>A friend of mine, Daan Veldhuizen, is a volunteer at the Joint Operation Youth project in Sierra Leone. This project is aimed to to improve education in the villages on the countryside. Computers and internet are still a rare phenomenon in this region, so Daan went to Sierra Leone to teach the staff what you can do with a computer and how to use it. Improving UI is a 'hot topic' nowadays in the Plone world, so if you're interested how real novice users expierence the most simple tasks, read on :)</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>A friend of mine, Daan Veldhuizen, is a volunteer at the Joint Operation Youth project in Sierra Leone. This project is aimed to to improve education in the villages on the countryside. Computers and internet are still a rare phenomenon in this region, so Daan went to Sierra Leone to teach the staff what you can do with a computer and how to use it. Improving UI is a 'hot topic' nowadays in the Plone world, so if you're interested how real novice users expierence the most simple tasks, read on :)</p><p>Last Christmas I left freezing Holland to spend the holidays in tropical Sierra Leone. Not many people will think of this country in West-Africa when you're talking about sunbathing on beautiful tropical beaches and hiking through lush forests. Instead, images of war and horrific bloodshed will flash through their heads. These images are indeed part of the country's recent past, but fortunately not anymore of its present. What we can find nowadays in Sierra Leone is a vital but poor and disrupted society, set in a country that beholds many opportunities and is blessed with abundance in natural beauty.</p>
<p>Since three years I'm working side by side with a group of volunteers in the Netherlands and Sierra Leoneans to improve education in rural villages. The group in Sierra Leone consists of three friends in their early thirties who have setup a community based organization called <a href="http://www.joyforsierraleone.org/" target="_blank">Joint Operation Youth (JOY)</a> in the township of Lakka. When they were working as security guards for a big environmental NGO, they got inspired to do something to rebuild their country. Samuel, Abdul and Ibrahim aim to support and improve the existing educational institutions and where needed initiated new ones themselves. In doing this, JOY operates as an independent organization and respects and understands all written and the many unwritten laws of Sierra Leones society. From the Netherlands, we have the same goals, but instead of doing projects directly from a Western point of view, we support the initiative by letting JOY take the lead and help them in becoming more professional and structural as an organization. One of the things that we are working on is teaching the staff in using computers to write their proposals, estimates and to communicate with us through the internet.</p>
<p><img alt="Joint Operation Youths" class="image-inline" src="SierraLeoneJOY.jpg/image_preview" /></p>
<p>In our search for sponsors, we found the Dutch based IT company Four Digits willing to help the Sierra Leonean team by donating them a portable laptop. During our recent visit we brought the laptop along and organized several computer courses to train the JOY members in using this modern machinery. In this article I will share with you my findings in using computers in Sierra Leone.</p>
<h2>Choosing the right tools</h2>
<p><img alt="One of the villages in sierra leone" class="image-right" src="SierraLeoneOneofthevillages.jpg/image_mini" />Our Sierra Leonean team members are located in the town of Lakka, which is about 25 kilometers away from the edge of the capital city Freetown. The road between the village and the city is literally a pain in the ass and will take you about an hour to reach. Lakka has no electricity and obviously no internet. We figured that the best way to work would be to have a laptop that has a really long battery life so that documents and photos can be stored and prepared from their office in Lakka. Next we will supply the team with a USB stick, so that they can transfer the files to an internet cafe in town with or without carrying around the laptop whenever necessary.</p>
<p>Together with Four Digits we eventually picked a 10" Asus EEE PC with a 180GB hard drive to do the job. Ideally we would have chosen a solid state hard drive which would have been even more resistant against the bumpy Sierra Leonean roads, but by the time this hard drive would only come in 20GB, which would not be enough to store pictures on the long run. We also chose to supply an additional DVD player, since the input of the EEE PC is mainly focused around wireless communication and this is hardly found in Sierra Leone.</p>
<p>Other equipment that we've learned to be useful in a rough environment is a good waterproof cover for the equipment to fight the rain during the monsoon season, a voltage stabilizer for the power coming from generators or solar and spare USB cables because you never know.</p>
<h2>Starting from scratch</h2>
<p>After introducing the little machine to the JOY members, we started to give training in how to use the laptop. Knowledge about computers within the group was diverse. Ibrahim knew how to use email and how to create simple Excel and Word documents. Samuel and Abdul were pretty much newbie’s. Although Ibrahim knew how to use some software, he still didn’t understand the basic principle that lies underneath it all, which classically brought him in trouble every time he accidently pressed the “wrong” button.</p>
<p><img alt="Teaching the basics of a computer" class="image-left" src="SierraLeoneTeaching.jpg/image_mini" />Although I was pretty familiar with “African Logic”, I found it staggering to identify the difference in structural thinking between the African and Western world. Here in the West, we grew up with computers and computers grew up with us. I played simple games and wrote texts on my grandpa’s 8086 system when I was eight years old. As a teenager I settled myself for many hours behind the television screen at my friend’s place, playing Zelda. Later I got my own 486 pc on which I eventually figured out how to draw and create music. In short: my ability to use a computer increased almost simultaneously with the abilities acomputer could offer its audience. Even people from the older generation in the West, who often claim not to know how to use computers, are more or less familiar with programming orders into a machine, like a regular microwave or an alarm clock.</p>
<p>The personal computers that we know today, either Mac or PC, are advertized as being <i>plug and play</i> and <i>easy to use for everybody</i> and so on. In reality I came to realize that throughout the years they have actually become really complex magic boxes.</p>
<p>For example, take the Windows “Start”-button. If you actually lived through the years that Windows progressed from 3.11 to Vista, you could say: “Yeah makes perfect sense to start a new task with the "Start"-button in the down left corner of the screen”. But if you’re totally new to it all, this is not as logical as Microsoft might have thought it would be. My point is that in the beginning these machines look chaotic and confusing and after my first computer course I saw the pure horror on Samuel’s face. “You try it now”, I would invitingly suggest Samuel, on which he responded; “No no, let Ibrahim do it!”</p>
<p>Later that evening it stroke me: the stuff that I was teaching these guys was not fun or entertaining! Hell, the reason that I started to use a computer when I was young, was because it was fun and enhanced the things I was already interested in. Not because it allowed me to make practical to-do-lists or execute a variety of other dull-organizing-things-that-are-handy-but-also-boring. No way, it allowed me to compose electronic music without needing an expensive studio, it allowed me to create digital art and it entertained me with games. Next day I would try a new strategy...</p>
<p>Samuel is a DJ. With his towering speakers, two CD players and an old mixer he sets the groove for a party Sierra Leonean style! Could I describe this? Well, in short it adds up to loud and distorted reggae-ton beats, shaking booties and plenty of palm wine at room temperature in a seriously too small and steamy hot room. Trust me, it is good fun! Anyway, in my second attempt to teach him to use a computer, I asked him if it would be useful for him as a DJ, to make compilation CD’s that contain tracks that he often plays. “Yes, yes!” his reply was, “But how?” It was silent for a while and from Samuel I rolled my eyes to the computer. “Really, can you please teach me!?” he asked. “Yes, I can… yes, I can indeed.” I answered with a grin on my face. The bait had worked.</p>
<p>Later that day, long after the class had finished, I found Samuel and Abdul both sitting behind the computer, moving files, copying, pasting, renaming. In the evening they were still there and it reminded me of my own good old days of figuring out the magic box… The point that I would like to make, is that in teaching people from scratch how to use a computer, it is of uttermost importance to find out what it is that can link the personal interest of the person to the machine. If the goal is to teach somebody how to make estimates in Excel, start out with minesweeper... :-)</p>
<h2>Maintenance</h2>
<p>Our aim during the Christmas visit was to teach the members of JOY enough skills so that they could maintain the computer by themselves as soon as we would be back in Holland. Although we tried to focus on the controlling fundamentals of a computer, like the operating system, this aim still turned out to be too far out of reach. Alternatively for maintenance there are several computer stores in the capital city, but these would cost way too much money for what they would actually do. Therefore we contacted a friend from another NGO who I had been training in video production a couple of years ago. We found him willing to help out the guys from JOY whenever they get stuck or get returning error messages. We suggested the members to pay close attention when he is fixing the machine, so that they will be able to do these tasks themselves in the future.</p>
<h2>Results</h2>
<p>The project proposals and estimates that are communicated between Holland and Sierra Leone are nowadays well made in Excel or Word. This is a huge advantage and saves us a lot of time by for example not having to figure out if a character is indeed an '8' or perhaps a '0'. The only thing is that the internet is still very inaccessible. Since some time telecom providers in Sierra Leone also offer satellite internet, but with a monthly price tag that equals a local monthly salary, this is not a real option. All we can hope for is that the road from Lakka to Freetown will be finished any time soon and the internet in town becomes more accessible.</p>
<p>Thanks to <a href="http://www.daanveldhuizen.com" target="_blank">Daan Velduizen</a> for writing this excellent article.</p>
<p> </p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-07-27T12:27:23Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/a-europython-impression-part-iii">        <title>A EuroPython impression, part III</title>        <link>http://blog.fourdigits.nl/a-europython-impression-part-iii</link>        <description>A EuroPython impression, taking place at the Birmingham conservatory, part III</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>A EuroPython impression, taking place at the Birmingham conservatory, part III</p><p>On Tuesday, after the Zope Page Templates talk (18:30) we went to the Wellington pub having a beer with the guys from <a href="http://www.netsight.co.uk/" target="_blank">Netsight</a> and <a href="http://objectvibe.net/" target="_blank">Laurence Rowe</a>. Birmingham is actually pretty nice in the evening as there are a lot of nice pubs and restaurants in the city centre.</p>
<p><img class="image-inline" src="Birminghamimpression/image_preview" /></p>
<p>Wednesday morning started with a talk from <a href="http://www.mindviewinc.com/" target="_blank">Bruce Eckel</a> about programming language development and how Python was evolved compared to the other languages. Once again, check <a href="http://reinout.vanrees.org/weblog/2009/07/01/ep-bruce-eckel.html" target="_blank">Reinout's weblog</a> for details of this talk.</p>
<p><img class="image-inline" src="Reinout.jpg/image_preview" /></p>
<p class="discreet">Reinout is writing everything down what is happening at the talks.</p>
<p><i>"We need to fail and we need to fail quickly".</i> This was a talk about agile development. Bea Düring started talking about the two most widely used agile development methods : Scrum and Extreme programming. At their company, Open End, they developed a hybrid agile development method themselves. Important things like feature driven development and short iterations are featured in this hybrid method, including automatic testsuites. Interesting was the javascript testsuite they developed, you can find that one on <a href="http://pypi.python.org/pypi/oejskit/0.8.5" target="_blank">PyPI</a>.</p>
<p><img class="image-inline" src="Agiledevelopment.jpg/image_preview" /></p>
<p><i>"Tapping into the web of data" </i>was a talk about semantic web data and RDF and what you can do with SuRF, a python library for RDF. Reinout, our hard working blogger, has posted <a href="http://reinout.vanrees.org/weblog/2009/07/01/ep-web-of-data.html" target="_blank">a report</a> about this.</p>
<p>Dr Sue Black of the University of Westminster was talking about the impact of <a href="http://en.wikipedia.org/wiki/Bletchley_Park" target="_blank">Bletchley Park</a> (Station X) on the world. On Bletchley Park the famous Enigma was cracked, the <a href="http://en.wikipedia.org/wiki/Colossus_computer" target="_blank">Colossus</a> computer was invented, and a lot of other important code breaks as well. It is now a museum about code breaking, being an important museum in the UK.</p>
<p><img class="image-inline" src="Theenigmamachine.jpg/image_preview" /></p>
<p class="discreet">People got really enthusiastic when showing a real Enigma.</p>
<p>We tried to have another conference call with Guido van Rossum again, but just like the day before it failed, so no Q&amp;A with Guido this time. After the lightning talks, where Roel unfortunately couldn't talk about Plone as there were too many lightning talks, there was the excellent conference dinner.</p>
<p><img class="image-inline" src="Conferencedinner.jpg/image_preview" /></p>
<p class="discreet">More than 400 people at the conference dinner.</p>
<p>Right now Martijn Faassen is having a nice talk which probably will be reported on Reinout's blog. For so far the report from EuroPython 2009!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-07-02T10:30:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/a-europython-impression-part-ii">        <title>A EuroPython impression, part II</title>        <link>http://blog.fourdigits.nl/a-europython-impression-part-ii</link>        <description>A EuroPython impression, taking place at the Birmingham conservatory, part II</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>A EuroPython impression, taking place at the Birmingham conservatory, part II</p><p>After the lunch, on the first day of the conference itself,  there was an excellent talk about copyrights and the impact of that for us as Python developers by <a href="http://craphound.com/" target="_blank">Cory Doctorow</a>. Reinout van Rees wrote an excellent report of this on <a href="http://reinout.vanrees.org/weblog/2009/06/30/europython-cory-doctorow.html" target="_blank">his weblog</a>.</p>
<p><img class="image-inline" src="guidoII.jpg/image_preview" /></p>
<p>Some effort was made to have a live video feed with Guido van Rossum. The facial expression of Guido on the stream was at least very funny, the conversation itself failed as we didn't had any audio. Next try is probably tomorrow.<br /><br />Another interesting talk was about the FilterPype framework by Rob Collins, which is all about pipeline design patterns. Motivation of creating the framework was to simplify complicated processes into filters, like how the Unix piping system works. Implementation has been done using generators and coroutines, but it hides this implementation details for the users of the framework.<br /><br />Pipelines have their own configuration language so that experts who need to create the pipelines do not have to program in Python. Check out the <a href="http://www.filterpype.org" target="_blank">FilterPype website</a>, as it is can be a nice framework for manipulating complicated data streams for example.<br /><br />The <a href="http://www.guardian.co.uk/" target="_blank">Guardian</a> has a interesting new approach for publishing their content so it's reusable by everyone who wants to use this content. One of the things they do now is that they publish data they collect (for example, all the bands and acts on Glastonburry) on a blog, so everybody can reuse that data as well. They also introduced a content API (for Python, but also for PHP and Ruby) so you can collect content in code pretty easily. There are some limits though, like you can query 5000 articles per day and you are not allowed to cache it longer for 24 hours. Anywho, other newspapers can take an example of at least trying to be innovative on the internet.</p>
<p><img class="image-inline" src="guardianII.jpg/image_preview" /></p>
<p>Last for today was the talk about <a href="http://zpt.sourceforge.net/" target="_blank">Zope Page Templates </a>by Matt Hamilton. There was some real interest in using the product, especially when people understood is could be used as a stand alone templating library without having the "Zope beast".</p>
<p><img class="image-inline" src="pagetemplates.jpg/image_preview" /></p>
<p>More coverage will follow tomorrow.</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-07-01T01:05:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/a-europython-impression-part-i">        <title>A EuroPython impression, part I</title>        <link>http://blog.fourdigits.nl/a-europython-impression-part-i</link>        <description>Four Digits is getting more and more involved into the Plone community, but what about the Python community? To find out, we decided to go to the EuroPython conference this year at the Birmingham conservatory.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Four Digits is getting more and more involved into the Plone community, but what about the Python community? To find out, we decided to go to the EuroPython conference this year at the Birmingham conservatory.</p><p>We arrived on monday evening and we met some Dutch <a href="http://en.wikipedia.org/wiki/Demoscene" target="_blank">Demoscene</a> friends at the airport. After traveling to New street station, which is only 15 minutes by train from the airport, we checked in at our hotel and went for a walk to the city centre. We decided to meet in a pub called The Australian Bar and have a chat with the other EuroPython visitors. Discussions started immediately about Plone and it is clear that the Plone community is still seen as a separate group of people. Some work for Ploners to be done here!</p>
<p><img alt="Pareto op EuroPython 2009" class="image-inline" src="pareto.jpg/image_preview" /></p>
<p class="discreet">It's good to see that our colleagues from <a href="http://www.pareto.nl/" target="_blank">Pareto</a> are there too.</p>
<p>On tuesday, the first day of the conference itself, we were happily surprised by seeing a Plone logo over there.</p>
<p class="discreet"><img alt="Matt Hamilton on EuroPython 2009" class="image-inline" src="hamilton.jpg/image_preview" /></p>
<p class="discreet">Matt Hamilton from <a href="http://www.netsight.co.uk/" target="_blank">Netsight</a> is running a Plone stand to promote it.</p>
<p>One of the nicest talks in the morning was from Simon Willison about the recent issues about the MP's expenses in the UK. He developed a django application so users can dig into the expenses and identify them, for example if they need further investigation.</p>
<p>See the website at <a href="http://mps-expenses.guardian.co.uk/" target="_blank">http://mps-expenses.guardian.co.uk/</a></p>
<p><img alt="Simon Willison on EuroPython 2009" class="image-inline" src="simon.jpg/image_preview" /></p>
<p>Interesting fact was that the application was developed in 4.5 days (!) and how he managed to make the website actual perform pretty good, and what lessons were learned from this project.</p>
<p>More coverage (hopefully) to follow soon!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-06-30T12:15:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/a-ha-cluster-setup-for-plone-and-zope-part-i">        <title>A HA cluster setup for Plone and Zope (Part I)</title>        <link>http://blog.fourdigits.nl/a-ha-cluster-setup-for-plone-and-zope-part-i</link>        <description>Nowadays there are a lot of options how to setup your server configuration and a lot of choices which software to use. Virtual machines, data duplication, HA clusters, OS choice, what kind of servers : what is the best choice for a Plone and Zope hosting provider like us? After a week of investigation and testing we have found a setup which satisfies our needs.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Nowadays there are a lot of options how to setup your server configuration and a lot of choices which software to use. Virtual machines, data duplication, HA clusters, OS choice, what kind of servers : what is the best choice for a Plone and Zope hosting provider like us? After a week of investigation and testing we have found a setup which satisfies our needs.</p><h2>Our requirements</h2>
<p>Our goal was to build a HA (High Availability) server setup. In our case : If one physical machine fails, another should take over its tasks automatically. However, it's a waste if you have one machine doing nothing but waiting to take over, so it would be nice to have a combination of HA and load balancing, and a way to extend this setup with extra capacity if necessary.</p>
<h2>Ganeti</h2>
<p>Our first thought went to <a class="external-link" href="http://code.google.com/p/ganeti/">Ganeti</a>, a tool developed by Google to manage virtual machines in a cluster with one or more physical machines. It doesn't support automatic failover yet, and the technology is very new so it would be risky to use this software for our setup. It's pretty neat software though,check out this <a class="external-link" href="http://ganeti.googlecode.com/files/Ganeti-FISL-2008.pdf">PDF file</a> for more information about Ganeti.</p>
<h2>Traditional HA</h2>
<p>A traditional setup is perfectly described <a class="external-link" href="http://plone.org/documentation/how-to/ha-load-balanced-cluster-for-zope-and-plone">here</a> by the guys of <a class="external-link" href="http://www.goldmund-wyldebeast-wunderliebe.com/">Goldmund, Wyldebeast &amp; Wunderliebe</a> which is a HA setup which has proven to work. However, we wanted to extend this setup a little more, as we really liked the idea and flexibility using virtual machines as Ganeti does. It's easier to migrate this setup to a new machine, and you can move or copy virtual machines to another physical machine if necessary. You can also manage and configure the resources more easily, having the ZEO client VM having more memory and CPU power then the other VM's.</p>
<h2>Our setup</h2>
<p>The basis of our setup is almost the same as the <a class="external-link" href="http://plone.org/documentation/how-to/ha-load-balanced-cluster-for-zope-and-plone">HA cluster howto</a> on plone.org : A master and a slave node. We added <a class="external-link" href="http://www.drbd.org/">DRBD</a> for data synchronization and <a class="external-link" href="http://www.xen.org/">Xen</a> to have a virtual system for each layer in the setup. On each server  we have three (Debian) virtual machines : One for the Apache frontend (and caching if you want to), one for running the ZEO clients and one for the ZEO backend (and MySQL in our case). We mount a NFS disk for the actual data storage, but to keep it simple for now we assume the ZEO backend virtual machine stores the data. See the following image :</p>
<p align="center"><img alt="Our server setup" class="image-inline image-inline" src="serversetup.png/image_preview" /></p>
<h2>How it works</h2>
<p>In a normal condition (when both nodes are active) the Apache VM and ZEO backend VM are running on the master node. The Apache VM has the public IP address (or floating address as mentioned in the <a class="external-link" href="http://plone.org/documentation/how-to/ha-load-balanced-cluster-for-zope-and-plone">HA cluster howto</a>) to access the plone websites. The ZEO backend VM and the Apache VM are installed on a DRBD partition. This means these VM's are always being synchronized with the slave node. On both nodes there is a ZEO client VM which runs the ZEO clients. These are not installed on a DRBD partition (and not automatically synced) as they both need a different IP address (for the load balancer), and you may want to start a ZEO client in debug mode (for testing purposes for example). You can add new physical machines which run a ZEO client VM as well so you can extend capacity easily this way.</p>
<p>The main idea is actually the same : <a class="external-link" href="http://www.linux-ha.org/">Heartbeat</a> is configured on the slave node to monitor the master node. If the master server goes down it will start the Apache VM and the ZEO server VM on the second node. As these VM's are installed on DRBD partitions they are identical to the VM's of the first node. The Apache VM on the second node has the same IP address so it will take over all requests and the ZEO clients will reconnect to the 'same' ZEOserver, which is now active on the second node.</p>
<p>In Part II we will describe in more detail how we configured this setup, including our used configuration.</p>
<h2>References</h2>
<ul>
<li><a class="external-link" href="http://plone.org/documentation/how-to/ha-load-balanced-cluster-for-zope-and-plone">HA loadbalanced cluster for Zope and Plone</a></li>
<li><a class="external-link" href="http://code.google.com/p/ganeti/">Google Ganeti</a></li>
<li><a class="external-link" href="http://www.drbd.org/">DRBD </a></li>
<li><a class="external-link" href="http://www.xen.org/">XEN</a></li>
<li><a class="external-link" href="http://www.linux-ha.org/">Heartbeat</a></li>
<li><a class="external-link" href="http://www.debian-administration.org/articles/410">A simple introduction to work with LVM</a></li>
<li><a class="external-link" href="http://www.johnandcailin.com/blog/john/setting-xen-your-debian-etch-box">Setting up Xen on your Debian Etch box</a></li>
<li><a class="external-link" href="http://www.nabble.com/DRBD-Xen-LVM2-Heartbeat-Ubuntu-Gutsy-HowTo-td17245190.html">Xen and Heartbut Ubuntu Howto</a></li>
</ul>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2008-07-11T11:10:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>




</rdf:RDF>

