<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mFabrik - mobile sites, apps, HTML5 and CMS software development &#187; plone</title>
	<atom:link href="http://blog.mfabrik.com/category/plone/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mfabrik.com</link>
	<description>Freedom delivered.</description>
	<lastBuildDate>Wed, 03 Aug 2011 09:47:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Python based HTTP redirect rules with Plone</title>
		<link>http://blog.mfabrik.com/2011/08/03/python-based-http-redirect-rules-with-plone/</link>
		<comments>http://blog.mfabrik.com/2011/08/03/python-based-http-redirect-rules-with-plone/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 09:47:41 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[five]]></category>
		<category><![CDATA[grok]]></category>
		<category><![CDATA[http redirect]]></category>
		<category><![CDATA[zope]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1372</guid>
		<description><![CDATA[Below is an example how you use five.grok to install an event handler which checks in the site root for a through-the-web editable Python script. If such script exist it asks it to check for a HTTP redirect. This behavior allows you to write site-wide redirects easily In Python (thank god no Apache regular expressions) [...]]]></description>
			<content:encoded><![CDATA[<div class="body">
<p>Below is an example how you use <tt class="docutils literal">five.grok</tt><tt> </tt>to install an event handler which checks in the site root for a through-the-web editable Python script. If such script exist it asks it to check for a HTTP redirect.</p>
<p>This behavior allows you to write site-wide redirects easily</p>
<ul class="simple">
<li>In Python (thank god no Apache regular expressions)</li>
<li>Redirects can access Plone content items</li>
<li>You can easily have some redirects migrated from the old (non-Plone) sites</li>
</ul>
<p><tt class="docutils literal">redirect.py</tt>:</p>
<pre class="literal-block">"""

    Call a custom TTW script and allow it to handle redirects.

    Use Zope Management Interface to add a ``Script (Python)`` item named ``redirect_handler``
    to your site root - you can edit this script in fly to change the redirects.

    * Redirect script must contain ``url`` in its parameter list

"""

import logging

# Now we import things through the last decade...

# Really old old stuff
from zExceptions import Redirect

# Really old stuff
from Products.CMFCore.interfaces import ISiteRoot

# Old stuff
from zope.traversing.interfaces import IBeforeTraverseEvent

# Modern stuff
from five import grok

logger = logging.getLogger("redirect")

@grok.subscribe(ISiteRoot, IBeforeTraverseEvent)
def check_redirect(site, event):
    """
    Check if we have a custom redirect script in Zope application server root.

    If we do then call it and see if we get a redirect.

    The script itself is TTW Python script which may return
    string in the case of redirect or None if no redirect is needed.

    For more examples, check

http://svn.zope.org/Zope/trunk/src/Zope2/App/tests/testExceptionHook.py?rev=115555&#038;view=markup

    """
    request = event.request

    url = request["ACTUAL_URL"]

    if "no_redirect" in request.form:
        # Use no_redirect query parameter to disable this behavior in the case
        # you mess up with the redirect script
        return

    # Check if we have a redirect handler script in the site root
    if "redirect_handler" in site:

        try:
            # Call the script and get its output
            value = site.redirect_handler(url)
        except Exception, e:
            # No silent exceptions plz
            logger.error("Redirect exception for URL:" + url)
            logger.exception(e)
            return

        if value is not None and value.startswith("http"):
            # Trigger redirect, but only if the output value looks sane
            raise Redirect, value</pre>
<p>Then an example <tt class="docutils literal">redirect_handler</tt> script added through ZMI. Remember to add <tt class="docutils literal">url</tt> to the <em>Parameter List</em> field of TTW interface. If the script returns a string starting http it is considered as the need for a redirect and normal Plone traversing is interrupted.</p>
<pre class="literal-block">if "blaablaa" in url:
    return "http://webandmobile.mfabrik.com"</pre>
</div>
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/08/03/python-based-http-redirect-rules-with-plone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX proxy view with Python, urllib and Plone</title>
		<link>http://blog.mfabrik.com/2011/08/02/ajax-proxy-view-with-python-urllib-and-plone/</link>
		<comments>http://blog.mfabrik.com/2011/08/02/ajax-proxy-view-with-python-urllib-and-plone/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 08:26:42 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[plone]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[access control]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[allow-access-origin]]></category>
		<category><![CDATA[cors]]></category>
		<category><![CDATA[cross domain]]></category>
		<category><![CDATA[getjson]]></category>
		<category><![CDATA[grok]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1365</guid>
		<description><![CDATA[Old web browsers do not support Allow-acces-origin HTTP header needed to do cross-domain AJAX requests (IE6, IE7). Below is an example how to work around this for jQuery getJSON() calls by Detecting browsers which do not support this using jQuery.support API Doing an alternative code path through a local website proxy view which uses Python [...]]]></description>
			<content:encoded><![CDATA[<div class="body">
<p>Old web browsers do not support <a class="reference external" href="https://developer.mozilla.org/en/HTTP_access_control">Allow-acces-origin HTTP header</a> needed to do cross-domain AJAX requests (IE6, IE7).</p>
<p>Below is an example how to work around this for jQuery getJSON() calls by</p>
<ul class="simple">
<li>Detecting browsers which do not support this using jQuery.support API</li>
<li>Doing an alternative code path through a local website proxy view which uses Python <tt class="docutils literal">urllib</tt> to make server-to-server call and return it as it would be a local call, thus working around cross-domain restriction</li>
</ul>
<p>This example is for Plone/Grok, but the code is easily port to other Python web frameworks.</p>
<div class="note">
<p class="last"><em>Note: This is not a full example code. Basic Python and Javascript skills are needed to interpret and adapt the code for your use case.</em></p>
</div>
<p>Javascript example</p>
<pre class="literal-block">/**
 * Call a RESTful service vie AJAX
 *
 * The final URL is constructed by REST function name, based
 * on a base URL from the global settings.
 *
 * If the browser does not support cross domain AJAX calls
 * we'll use a proxy function on the local server. For
 * performance reasons we do this only when absolutely needed.
 *
 * @param {String} functionName REST function name to a call
 *
 * @param {Object} Arguments as a dictionary like object, passed to remote call
 */
function callRESTful(functionName, args, callback) {

    var src = myoptions.restService + "/" +functionName;

    // set to true to do proxied request on every browser
    // useful if you want to use Firebug to debug your server-side proxy view
    var debug = false;

        console.log("Doing remote call to:" + src)

        // We use jQuery API to detect whether a browser supports cross domain AJAX calls
        // http://api.jquery.com/jQuery.support/
        if(!jQuery.support.cors || debug) {
                // http://alexn.org/blog/2011/03/24/cross-domain-requests.html
                // Opera 10 doesn't have this feature, neither do IExplorer &lt; 8, Firefox &lt; 3.5

                console.log("Mangling getJSON to go through a local proxy")

                // Change getJSON to go to our proxy view on a local server
                // and pass the orignal URL as a parameter
                // The proxy view location is given as a global JS variable
                args.url = src;
                src = myoptions.portalUrl + "/@@proxy";
        }

        // Load data from the server
        $.getJSON(src, args, function(data) {
                // Parse incoming data and construct Table rows according to it
                console.log("Data succesfully loaded");
                callback(data, args);

     });

}</pre>
<p>The server-side view:</p>
<pre class="literal-block">import socket
import urllib
import urllib2
from urllib2 import HTTPError

from five import grok
from Products.CMFCore.interfaces import ISiteRoot
from mysite.app import options

class Proxy(grok.CodeView):
    """
    Pass a AJAX call to a remote server. This view is mainly indended to be used
    with jQuery.getJSON() requests.

    This will work around problems when a browser does not support Allow-Access-Origin HTTP header (IE).

    Asssuming only HTTP GET requests are made.s
    """

    # This view is available only at the root of Plone site
    grok.context(ISiteRoot)

    def isAllowed(self, url):
        """
        Check whether we are allowed to call the target URL.

        This prevents using your service as an malicious proxy
        (to call any internet service).
        """

        allowed_prefix = options.REST_SERVICE_URL

        if url.startswith(allowed_prefix):
            return True

        return False

    def render(self):
        """
        Use HTTP GET ``url`` query parameter for the target of the real request.
        """

        # Make sure any theming layer won't think this is HTML
        # http://stackoverflow.com/questions/477816/the-right-json-content-type
        self.request.response.setHeader("Content-type", "application/json")

        url = self.request.get("url", None)
        if not url:
            self.request.response.setStatus(500, "url parameter missing")

        if not self.isAllowed(url):
            # The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeate
            self.request.response.setStatus(403, "proxying to the target URL not allowed")
            return

        # Pass other HTTP GET query parameters direclty to the target server
        params = {}
        for key, value in self.request.form.items():
            if key != "url":
                params[key] = value

        # http://www.voidspace.org.uk/python/articles/urllib2.shtml
        data = urllib.urlencode(params)

        full_url = url + "?" + data
        req = urllib2.Request(full_url)

        try:

            # Important or if the remote server is slow
            # all our web server threads get stuck here
            # But this is UGLY as Python does not provide per-thread
            # or per-socket timeouts thru urllib
            orignal_timeout = socket.getdefaulttimeout()
            try:
                socket.setdefaulttimeout(10)

                response = urllib2.urlopen(req)
            finally:
                # restore orignal timeoout
                socket.setdefaulttimeout(orignal_timeout)

            # XXX: How to stream respone through Zope
            # AFAIK - we cannot do it currently

            return response.read()

        except HTTPError, e:
            # Have something more useful to log output as plain urllib exception
            # using Python logging interface
            # http://docs.python.org/library/logging.html
            logger.error("Server did not return HTTP 200 when calling remote proxy URL:" + url)
            for key, value in params.items():
                logger.error(key + ": "  + value)

            # Print the server-side stack trace / error page
            logger.error(e.read())

            raise e</pre>
</div>
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/08/02/ajax-proxy-view-with-python-urllib-and-plone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sauna Sprint daily digest #2: Tuesday</title>
		<link>http://blog.mfabrik.com/2011/07/27/sauna-sprint-daily-digest-2-tuesday/</link>
		<comments>http://blog.mfabrik.com/2011/07/27/sauna-sprint-daily-digest-2-tuesday/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 10:34:53 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[sauna sprint]]></category>
		<category><![CDATA[youtube]]></category>
		<category><![CDATA[zope]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1348</guid>
		<description><![CDATA[These are notes from the Sauna Sprint daily debriefing #2. It was intention we’d done this already yesterday, but unfortunately we had problems with boat and swamp. The current head count is around 27 living souls, plus or minus few depending on how you define living. We split to different teams, each working on its [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1350" class="wp-caption aligncenter" style="width: 810px"><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0111.jpg"><img class="size-full wp-image-1350" title="DSC_0111" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0111.jpg" alt="" width="800" height="532" /></a><p class="wp-caption-text">Plone is a byproduct of community members&#39; co-operation</p></div></p>
<p>These are notes from the Sauna Sprint daily debriefing #2. It was intention we’d done this already yesterday, but unfortunately we had problems with boat and swamp.</p>
<p>The current head count is around 27 living souls, plus or minus few depending on how you define living.  We split to different teams, each working on its own topic.</p>
<p><strong>Team tutorial video</strong></p>
<p>This team works to create new Plone video installation and usage tutorials. It will be in the form of screencast with voice over narration.</p>
<p>The team has created the first voice over, screencast and now editing it together.</p>
<p><strong>Team add-ons fail</strong></p>
<p>Plone add-ons come with various quality of instructions. This team is working to make Plone add-on experience more user-friendly: installing, uninstalling, plone.org add-on area, individual add-on instructions.</p>
<p>Around 200 lines of issues collected.</p>
<p><strong>Team blogging</strong></p>
<p>This team collects and publishes a blog posts, participant information, etc. motivational information about the sprint and the sprinters.</p>
<p>Both EESTECers and Plonistans are being covered.</p>
<p>Currently the team has collected the bio of everyone and prepares to put the information out to a wiki page.</p>
<p><strong>Team auto restart</strong></p>
<p>This team is working to make Plone auto-restart perform correctly and timely manner. You just edit .py file and hit the browser refresh button and the changed code is loaded correctly. The team is utilizing the fork trick introduced in this blog post. The resulting work goes under a project name sauna.relaod.</p>
<p>Currently the team has managed to make the file-system monitor using Python WatchDog backend. Already 13 seconds have been shoveled off from Zope restart time of 30 seconds.</p>
<p><strong>Team Logistics</strong></p>
<p>This team feeds the coders with firewood, food and beer.</p>
<p>Yesterday the team prepared went to a shop, prepared a lunch and brought a guitar (for live music).</p>
<p>The day plan for Wednesday is to collect blueberries for pies and mushrooms and later cook them in the big oven of the cabin.</p>
<p>The new beer is on its way, though has temporary taken some steps backwards.</p>
<p><strong>Team Greek</strong></p>
<p>This ad-hoc team prepared the dinner.</p>
<p>It takes four Greeks to create one omelette.</p>
<p><strong>Team collective.table</strong></p>
<p>This is Google Summer of Code team is working on new collective.table add-on for Plone. Yesterday was API talk, but the progress was slow due to lack of caffeine.</p>
<p><strong>Team TinyMCE </strong></p>
<p>This is a Google Summer of Code team and is working on making Plone’s TinyMCE experience better.</p>
<p>Yesterday was spent testing on a JS/CSS compressor to make TinyMCE load faster.</p>
<p>Uncompressed: 19 request / 900 kb. Compressed 50% less requests, 700 kb.</p>
<p><strong>Team hardcore</strong></p>
<p>This team of EESTEC member was formed to introduce hardcode Plone development for newbies.</p>
<p>The team members actually wanted it themselves. They will regret this decision later.</p>
<p><div id="attachment_1352" class="wp-caption aligncenter" style="width: 810px"><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0120.jpg"><img class="size-full wp-image-1352" title="DSC_0120" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0120.jpg" alt="" width="800" height="532" /></a><p class="wp-caption-text">Sometimes you need solo heroes</p></div></p>
<p style="text-align: center;">&nbsp;</p>
<p><div id="attachment_1353" class="wp-caption aligncenter" style="width: 810px"><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0125.jpg"><img class="size-full wp-image-1353" title="DSC_0125" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0125.jpg" alt="" width="800" height="532" /></a><p class="wp-caption-text">Plone butterfly preparing to hatch </p></div></p>
<p><div id="attachment_1354" class="wp-caption aligncenter" style="width: 810px"><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0184.jpg"><img class="size-full wp-image-1354" title="DSC_0184" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0184.jpg" alt="" width="800" height="532" /></a><p class="wp-caption-text">A lonely coder in the forest</p></div></p>
<p><div id="attachment_1356" class="wp-caption aligncenter" style="width: 544px"><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/IMG_1630.jpg"><img class="size-full wp-image-1356" title="IMG_1630" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/IMG_1630.jpg" alt="" width="534" height="800" /></a><p class="wp-caption-text">Fueling the hungty developers with potatoes</p></div></p>
<p><div id="attachment_1357" class="wp-caption aligncenter" style="width: 542px"><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0023.jpg"><img class="size-full wp-image-1357" title="DSC_0023" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/DSC_0023.jpg" alt="" width="532" height="800" /></a><p class="wp-caption-text">A statue honoring Plone developers</p></div>
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/07/27/sauna-sprint-daily-digest-2-tuesday/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sauna Sprint day #2 Monday: The recon team arrives the destination (photos)</title>
		<link>http://blog.mfabrik.com/2011/07/25/sauna-sprint-day-2-monday-the-recon-team-arrives-the-destination-photos/</link>
		<comments>http://blog.mfabrik.com/2011/07/25/sauna-sprint-day-2-monday-the-recon-team-arrives-the-destination-photos/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 14:14:34 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[sauna sprint]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1342</guid>
		<description><![CDATA[Go to Picasa album! Get developers  Subscribe mFabrik blog in a reader Follow me on Twitter]]></description>
			<content:encoded><![CDATA[<p><a href="https://picasaweb.google.com/103323677227728078543/SaunaSprintDay2MondayArriving?authuser=0&amp;feat=directlink">Go to Picasa album!</a>
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/07/25/sauna-sprint-day-2-monday-the-recon-team-arrives-the-destination-photos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sauna Sprint day 1: Sunday (technical &amp; motivational)</title>
		<link>http://blog.mfabrik.com/2011/07/25/sauna-sprint-day-1-sunday-technical-motivational/</link>
		<comments>http://blog.mfabrik.com/2011/07/25/sauna-sprint-day-1-sunday-technical-motivational/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 13:31:37 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[buildout]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[eestec]]></category>
		<category><![CDATA[sauna sprint]]></category>
		<category><![CDATA[themes]]></category>
		<category><![CDATA[unified installer]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1331</guid>
		<description><![CDATA[Now it has begun: Sauna Sprint 2011 &#8211; an open source event in Finland for Plone &#38; Python hackers and EESTEC students. The first day of Sauna Sprint was spent introducing new EESTEC people to Plone. Almost everyone got Ubuntu installed, there was a short crash course for IRC and then we started installing Plone. [...]]]></description>
			<content:encoded><![CDATA[<p>Now it has begun: Sauna Sprint 2011 &#8211; an open source event in Finland for Plone &amp; Python hackers and EESTEC students.</p>
<p>The first day of Sauna Sprint was spent introducing new EESTEC people to Plone. Almost everyone got Ubuntu installed, there was a short crash course for IRC and then we started installing Plone.</p>
<p>We had a bunch of EESTEC students as a test subject and our goal was to map obstacles in the process of installing Plone for local computer for development. We got some interesting results.</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-25.jpg"><img class="alignnone size-full wp-image-1335" title="SAMSUNG" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-25.jpg" alt="" width="800" height="480" /></a></p>
<p>The data was collected on whiteboard where everyone was free to express any problem he or she had during the installation. The advisors also monitored the user group for possible problems and made notes.</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-14.29.28.jpg"><img class="alignnone size-full wp-image-1332" title="SAMSUNG" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-14.29.28.jpg" alt="" width="800" height="480" /></a></p>
<p style="text-align: center;"><em>Aperture Science test subjects installing Plone in hope they’ll get a cake if they success </em></p>
<p style="text-align: center;"><em><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-14.12.49.jpg"><img class="alignnone size-full wp-image-1333" title="SAMSUNG" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-14.12.49.jpg" alt="" width="800" height="480" /></a><br />
</em></p>
<p style="text-align: center;"><em>Good job, but the cake was a lie.</em></p>
<h2>Plone is #%!!”€&amp;! difficult, but we can fix it</h2>
<p>The comments below are collected from the whiteboard.</p>
<p>Don’t make assumptions in the documentation &#8211; people are tabula rasa (i.e. how to use cd command and so on)</p>
<p>Documentation needed to install gcc, PIL dependencies etc. on OS level</p>
<p>No good instructions how to set-up Python with virtualenv (was being fixed in the sprint). Buildout actually does not work with the system Python out of the box: you need to break your OS http://stackoverflow.com/questions/5818100/buildout-tries-to-update-system-wide-distribute-installation-and-refuses-to-run</p>
<p>People try to run buildout by “cd bin ; ./buildout” &#8211; it does not work and the error message is confusing</p>
<p>Unified Installer &#8211; ZEO installation is broken (need clarification what was broken)</p>
<p>Detect Python version in buildout and don&#8217;t try to run on incompatible version</p>
<p>When creating first Plone site input field has label “Path identifier” &#8211; people try to enter Plone FS path there</p>
<p>README.txt in Unified Installer needs updates</p>
<p>ZopeSkel template plone4_buildout should autodetect the latest Plone version (now was 4.0.1)</p>
<p>Update the out of the box Plone installation front page to contain more developer friendly instructions too</p>
<p>plone.org/downloads: Show add-on version compatibility as the first item on the page &#8211; if now compatibility set warn that the compatibility is unknown (same kind of warning if no updates for one year)</p>
<p>Have an easy way to report broken packages</p>
<p>Force a process to improve add-on documentation in p.org, especially regarding installation. Only 1/5 themes was successfully installed by the test personel without guidance, mostly due to lack of instructions and version incompatibilities.</p>
<p>Some <a href="http://piratepad.net/JgN6WR47eJ">work in progress on PiratePad</a> regarding the installation of Plone.</p>
<h2>Evening program</h2>
<p style="text-align: left;">We had Sauna time in Hervanta, student style. EESTEC lived up to their reputation as party animals.</p>
<p style="text-align: left;"><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-22.02.11.jpg"><img class="alignnone size-full wp-image-1334" title="SAMSUNG" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-22.02.11.jpg" alt="" width="800" height="480" /></a></p>
<p style="text-align: center;"><em>Delicious pizza was baked, though the audience loudly disagree when the pizza was burnt enough to be eaten<br />
</em></p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-22.15.39.jpg"><img class="size-full wp-image-1337 aligncenter" title="SAMSUNG" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/2011-07-24-22.15.39.jpg" alt="" width="480" height="800" /></a></p>
<p style="text-align: center;"><em>Magic Toni Sause</em></p>
<p>&nbsp;</p>
<p>&nbsp;
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/07/25/sauna-sprint-day-1-sunday-technical-motivational/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using GitHub with Eclipse (to update collective.developermanual)</title>
		<link>http://blog.mfabrik.com/2011/07/12/using-github-with-eclipse-to-update-collective-developermanual/</link>
		<comments>http://blog.mfabrik.com/2011/07/12/using-github-with-eclipse-to-update-collective-developermanual/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 10:31:21 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[egit]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[keygen]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1321</guid>
		<description><![CDATA[Notes to self how to checkout and update Github projects with Eclipse EGit plug-in. Delete the project if you have already the same project (collective.developermanual) imported Eclipse some other way. Create a Github account (if you don&#8217;t have one) and put your SSH public key in the account settings. Configure Eclipse to use your private [...]]]></description>
			<content:encoded><![CDATA[<p>Notes to self how to checkout and update Github projects with Eclipse EGit plug-in.</p>
<p>Delete the project if you have already the same project (collective.developermanual) imported Eclipse some other way.</p>
<p>Create a Github account (if you don&#8217;t have one) and put your SSH public key in the account settings.</p>
<p>Configure Eclipse to use your <a href="http://wiki.eclipse.org/EGit/User_Guide/Remote#Eclipse_SSH_Configuration">private Github SSH key in Settings -&gt; General -&gt; Network connections -&gt; SSH2</a>. Eclipse also offers a SSH key generation wizard.</p>
<p>Import <em>collective.developermanual</em> from GitHub using <em>File -&gt; Import -&gt; Git</em> and then use <em>Clone</em> button (not Add). collective.developermanual URL is <em>git@github.com:collective/collective.developermanual.git</em> Change protocol to SSH.</p>
<p>Click next next next until you see the project in your Eclipse workspace. <strong>Note that EGit puts projects to your home folder, not workspace (slight argh in this point).</strong></p>
<p>Edit some files.</p>
<p>Right click the project to <em>commit</em>.</p>
<p>Then you can right-click to <em>push</em>. This is the tricky part. The dialogue looks like a USS Aircraft Carrier deck control panel. What you need to do is to</p>
<ul>
<li>In Source ref drop down choose master [branch]</li>
<li>In Destination ref drop down choose master [branch]</li>
<li>Press Add spec button</li>
<li>Press Next</li>
<li>Press Finish</li>
</ul>
<p>Then it pops up some dialogs which mean that the push was succesful.  Just keep clicking Ok to every window as you won&#8217;t understand them in any case.</p>
<p>&nbsp;</p>
<p>&nbsp;
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/07/12/using-github-with-eclipse-to-update-collective-developermanual/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Testing mobile websites with Firefox Mobile for PC (Fennec desktop)</title>
		<link>http://blog.mfabrik.com/2011/07/08/testing-mobile-websites-with-firefox-mobile-for-pc-fennec-desktop/</link>
		<comments>http://blog.mfabrik.com/2011/07/08/testing-mobile-websites-with-firefox-mobile-for-pc-fennec-desktop/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 19:42:01 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[emulator]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[simulator]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1317</guid>
		<description><![CDATA[Firefox Mobile (Fennec) has also desktop builds. They are very useful for mobile web site testing as the browser is fast, has real keyboard and is only one mouse click away. Here are instructions how to run Firefox Mobile on Ubuntu Linux (tested on 32-bit Ubuntu 10.10) wget http://releases.mozilla.org/pub/mozilla.org/mobile/releases/latest/linux-i686/fennec-5.0.en-US.linux-i686.tar.bz2 tar -xjf fennec-5.0.en-US.linux-i686.tar.bz2 cd fennec ./fennec [...]]]></description>
			<content:encoded><![CDATA[<p>Firefox Mobile (Fennec) has also desktop builds. They are very useful for mobile web site testing as the browser is fast, has real keyboard and is only one mouse click away.</p>
<p>Here are instructions how to run Firefox Mobile on Ubuntu Linux (tested on 32-bit Ubuntu 10.10)</p>
<pre>wget http://releases.mozilla.org/pub/mozilla.org/mobile/releases/latest/linux-i686/fennec-5.0.en-US.linux-i686.tar.bz2
tar -xjf fennec-5.0.en-US.linux-i686.tar.bz2
cd fennec
./fennec</pre>
<p>.. and thats all you need. It works out of the box! 400x times faster than using Android emulator browser.</p>
<p>There are also <a href=" http://releases.mozilla.org/pub/mozilla.org/mobile/releases/latest/">OSX and Windows builds available</a>.</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/07/fennec.png"><img class="alignnone size-full wp-image-1318" title="fennec" src="http://blog.mfabrik.com/wp-content/uploads/2011/07/fennec.png" alt="" width="482" height="830" /></a>
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/07/08/testing-mobile-websites-with-firefox-mobile-for-pc-fennec-desktop/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Generic Python validation frameworks?</title>
		<link>http://blog.mfabrik.com/2011/07/07/generic-python-validation-frameworks/</link>
		<comments>http://blog.mfabrik.com/2011/07/07/generic-python-validation-frameworks/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 14:48:15 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1308</guid>
		<description><![CDATA[All Python ORM and form frameworks love to define own field/schema model. This seems to lead to a situation where they define their own validation functions too. Some examples: Django local flavour defines phone number validations for different countries Misc. regular expression validators in Plone&#8217;s Archetypes content type subsystem Every framework define their own email [...]]]></description>
			<content:encoded><![CDATA[<p>All Python ORM and form frameworks love to define own field/schema model. This seems to lead to a situation where they define their own validation functions too.</p>
<p>Some examples:</p>
<ul>
<li><a href="https://docs.djangoproject.com/en/dev/ref/contrib/localflavor/">Django local flavour defines phone number validations for different countries</a></li>
<li><a href="http://svn.plone.org/svn/archetypes/Products.validation/trunk/Products/validation/validators/BaseValidators.py">Misc. regular expression validators in Plone&#8217;s Archetypes content type subsystem</a></li>
<li>Every framework define their own email validator, with various regular expressions</li>
</ul>
<p>Isn&#8217;t writing one&#8217;s own validation code a bit redundant and exactly &#8220;reinventing the wheel&#8221; what open source principles so hard try to avoid? Could validation be a low hanging fruit to share among fellow Python projects? As I see it, for the simple data validation, like email and URL, the core code could be easily shared and different Python projects. You basically want just method is_valid_phonenumber(str) and then framework specific way to raise the error to the user.</p>
<p>Do such frameworks already exist? At least I haven&#8217;t seen one being used in any big Python project yet <img src='http://blog.mfabrik.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>&#8230; or is validation so complex thing, so that validation functions must be tightly integrated with the parent framework and I am missing some big things (like locales, etc.) here?</p>
<p>&nbsp;
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/07/07/generic-python-validation-frameworks/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Making Plone easy again (and Sauna Sprint topics)</title>
		<link>http://blog.mfabrik.com/2011/06/08/making-plone-easy-again-and-sauna-sprint-topics/</link>
		<comments>http://blog.mfabrik.com/2011/06/08/making-plone-easy-again-and-sauna-sprint-topics/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 08:14:28 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sauna sprint]]></category>
		<category><![CDATA[sphinx]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1274</guid>
		<description><![CDATA[This blog post is about making Plone CMS to accessible for more developers. This is a major topic on which we are working on in Sauna Sprint 2011 (see the previous blog post about Sauna Sprint and motivation to come to Finland). Preface Please do not take this post too seriously if I am ranting [...]]]></description>
			<content:encoded><![CDATA[<p>This blog post is about making <a href="http://plone.org">Plone CMS</a> to accessible for more developers. This is a major topic on which we are working on in Sauna Sprint 2011 (<a href="http://blog.mfabrik.com/2011/06/08/sauna-sprint-2011-motivational-blog-post-%E8%9A%8A%E3%81%8C%E6%A5%BD%E3%81%97%E3%81%84%E3%81%A7%E3%81%99/">see the previous blog post about Sauna Sprint and motivation to come to Finland</a>).</p>
<h2>Preface</h2>
<p>Please do not take this post too seriously if I am ranting tongue-in-cheek. This thinking does not reflect the official opinion of Sauna Sprint team any way, it is just my personal rambling.</p>
<h2>Background</h2>
<p>Plone is having popularity issues. This can be deducted by:</p>
<ul>
<li>PHP CMS are more popular (Google trends and so on)</li>
<li><a href="http://amplicate.com/love/plone">Plone lacks love</a></li>
<li>By discussing with Python programmers outside Plone community: they see Plone as monster</li>
</ul>
<p>Plone is a superior CMS product (feature wise, polish wise, tech wise, and so on). So how did this happen?</p>
<p>My theory, you are free to disagree, is that the community has been driving &#8220;wrong&#8221; ideologies</p>
<ul>
<li>Plone&#8217;s &#8220;buyers&#8221; are not users, but developers</li>
<li>There has been no driving community factor to make Plone accessible for more developers. Plone community has been working to make Plone work for the existing community members, not new members. The consulting companies have been too busy to extract money from their existing big clients. It might even be that it&#8217;s the best interest of these companies to keep the barrier of entry high, as this way they protect the Plone business for themselves. Note that this strategy will fail in the point there is no longer Plone business.</li>
</ul>
<p>The big boys are telling that customers are abandoning Plone, because there are no developers. I know a lot of Plone developers, looking for more Plone work.  I&#8217;ll translate this that there are not enough affordable Plone developers entering the market.</p>
<p>I am also not buying arguments like</p>
<ul>
<li>&#8220;don&#8217;t compare apples to oranges (Django vs. Plone)&#8221;</li>
<li>&#8220;its history and evolved that way&#8221;</li>
<li>&#8220;big tool must be complex&#8221;</li>
</ul>
<h2>The result</h2>
<p>Plone is easy to use, but hard to develop. <strong>If you need to use code generators and boiler-plate in Python code, you are doing it wrong.</strong></p>
<p>Plone is a soup of different, non-mainstream, technologies. To be a Plonista you need master: Python (ok docs), Plone user mode (good docs),  Zope component architecture (some docs), ZCML (no useful docs), GenericSetup  (no docs), TAL (some docs), Archetypes (basically no docs), buildout  (aaaaaarghs) &#8230; You have too much to learn from material which does not exist. Today the material effectively does not exist if it&#8217;s not your first Google hit &#8211; I am against book.</p>
<p>New developers are not getting in. It is easier to duplicate basic Plone functionality in a hacky in-house Django CMS than customize Plone for your use case. Plone does not give any more added value to the new developers. There is no business motivation to adapt Plone as a technology platform in new ventures.</p>
<h2>The quest</h2>
<p>Let&#8217;s fix it, as I see the developer acceptance the most crucial challenge Plone community is facing if the community wants to survive.</p>
<p>What we can do here is</p>
<ul>
<li>Make Plone easier for developers</li>
<li>Make more, better, learning material available</li>
<li>Eliminate and protect against factors in Plone which hinder the goals of two above bullets (do not include new technologies or modules to core if they make developers sad)</li>
</ul>
<p>To accomplish this we can</p>
<ol>
<li>Promote &#8220;easy&#8221; technologies inside and outside Plone community (Dexterity over Archetypes, Grok over ZCML)</li>
<li>Making a standard workflow available for them (Django style tutorial that do 1, 2, 3 and you are a certified Plone developer)</li>
<li>Kill technologies which make the stack unnecessary complex and are not necessarily needed in newbie use cases (buildout, I am looking at you)</li>
<li>Replace old, badly documented and difficult solutions with easier ones  (could we actually replace TAL with something more popular?)</li>
</ol>
<h2>Operational plan</h2>
<p>Here are some concrete tasks what we could tackle in Sauna Sprint.</p>
<p>Make it easy department</p>
<ul>
<li>Plone auto-restart team: provide working and fast auto-restart á la Django or Tornado (hint: plone.reload doesn&#8217;t cut it &#8211; you need real restarts process-wise)</li>
<li>Default custom product team: ship Plone with a file-system based custom product skeleton, so that when you need to include your first custom Python module you don&#8217;t need to learn about buildout and paster first . You actually can copy-paste in Python code and it just works.</li>
<li>Through-the-web is happy again team: Make it possible to code and execute Python through-the-web so that it actually works.: a working replacement for RestrictedPython</li>
</ul>
<p>Fix user-wise broken things department</p>
<ul>
<li>Buildout team: make buildout more user friendly: spit out error messages which are actually useful, have newbie buildout tutorial from the developer perspective. Nothing bad should happen when buildout is run. Make buildout to confirm version updates, etc.</li>
<li>Anti-buildout team: how to install eggs without buildout. Why did we need the buildout in the first place?</li>
</ul>
<p>This is how you do it department</p>
<ul>
<li>Tutorial team: Make &#8220;gapless&#8221; hand-holding tutorial for creating your first view, form and content-type. Make it so that you do not need to look outside the tutorial or learn anything unnecessary (don&#8217;t make me think)</li>
<li>Picture team: draw big pictures of Plone architecture, how different parts are connected, so that new developers get hang on things easily</li>
<li>Document generator team: Integrate collective.developermanual with Sphinx tool that generate the reference  documentation from the source code: views, viewlets, templates, CSS classes, portlets, etc.</li>
</ul>
<p>Hasta la vista babe department</p>
<ul>
<li>Kill it with fire team: Hunt down all bad learning material and make it redirect to new learning material (no ExternalMethods, no Install.py, no plone_skins, etc.)</li>
<li>Nuke it from orbit team: I am not sure what this team could do, but I like the feeling of the name</li>
</ul>
<p>We hope that novice  developers attend the sprint. This way we can use you as guinea pigs and document the pain points on a road to become Plone developer. Don&#8217;t worry &#8211; we&#8217;ll inject you with proper medicine to numb the pain and forget bad memories.
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/06/08/making-plone-easy-again-and-sauna-sprint-topics/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Sauna Sprint 2011: motivational blog post (蚊が楽しいです)</title>
		<link>http://blog.mfabrik.com/2011/06/08/sauna-sprint-2011-motivational-blog-post-%e8%9a%8a%e3%81%8c%e6%a5%bd%e3%81%97%e3%81%84%e3%81%a7%e3%81%99/</link>
		<comments>http://blog.mfabrik.com/2011/06/08/sauna-sprint-2011-motivational-blog-post-%e8%9a%8a%e3%81%8c%e6%a5%bd%e3%81%97%e3%81%84%e3%81%a7%e3%81%99/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 06:59:07 +0000</pubDate>
		<dc:creator>Mikko Ohtamaa</dc:creator>
				<category><![CDATA[plone]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[finland]]></category>
		<category><![CDATA[santa]]></category>
		<category><![CDATA[sauna sprint]]></category>
		<category><![CDATA[tampere]]></category>

		<guid isPermaLink="false">http://blog.mfabrik.com/?p=1272</guid>
		<description><![CDATA[Sauna Sprint 2011 is coming! Sauna Sprint is an international Plone, Python and open source event arranged in Finland (2011 for the second time). People all around the world to gather to work on Plone content management system, code Python and have some fun for one week. The event is July 23 &#8211; July 30, [...]]]></description>
			<content:encoded><![CDATA[<p>Sauna Sprint 2011 is coming! Sauna Sprint is an international Plone, Python and open source event arranged in Finland (2011 for the second time). People all around the world to gather to work on <a href="http://plone.org">Plone content management system</a>, code Python and have some fun for one week.</p>
<p>The event is July 23 &#8211; July 30, 2011. Come to #saunasprint IRC channel on Freenode and <a href="http://www.coactivate.org/projects/sauna-sprint-2011/project-home">enlist yourself now</a> by the joining CoActive project and adding your name to the guest list on the wiki style project page!</p>
<p>In the social program we have beer tasting, sauna, wood chopping, installing internet connection and who kills most mosquitos competition.</p>
<p>This year we have secured a sprint location near Tampere city (editorial note: is near a correct adjective here?). The image is not corrupted &#8211; the green color is forest.</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/Screen-shot-2011-06-08-at-9.23.06-AM.png"><img class="alignnone size-full wp-image-1292" title="Screen shot 2011-06-08 at 9.23.06 AM" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/Screen-shot-2011-06-08-at-9.23.06-AM.png" alt="" width="471" height="386" /></a></p>
<p>Here is our mansion:</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/DSC_0029.jpg"><img class="alignnone size-full wp-image-1294" title="DSC_0029" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/DSC_0029.jpg" alt="" width="600" height="399" /></a></p>
<p>We have reserved meeting rooms for the sprinters to work:</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/DSC_0050.jpg"><img class="alignnone size-full wp-image-1295" title="DSC_0050" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/DSC_0050.jpg" alt="" width="600" height="399" /></a></p>
<p>As Finland is the land of thousand lake and wilderness on all sort you may have a chance to see some majestic wild life.</p>
<p>Reindeers:</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/MAbk.jpg"><img class="alignnone size-full wp-image-1296" title="MAbk" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/MAbk.jpg" alt="" width="410" height="351" /></a></p>
<p>Mooses:</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/4058359666_ae0a687041_b.jpg"><img class="alignnone size-full wp-image-1297" title="Moose crossing" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/4058359666_ae0a687041_b.jpg" alt="" width="705" height="490" /></a></p>
<p>Bears:</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/415505603_2b93aadf93.jpg"><img class="alignnone size-full wp-image-1298" title="415505603_2b93aadf93" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/415505603_2b93aadf93.jpg" alt="" width="500" height="375" /></a></p>
<p>Mosquitos:</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/2930291021_bfe846108a.jpg"><img class="alignnone size-full wp-image-1299" title="2930291021_bfe846108a" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/2930291021_bfe846108a.jpg" alt="" width="500" height="375" /></a></p>
<p>A Plone sprinter:</p>
<p><a href="http://blog.mfabrik.com/wp-content/uploads/2011/06/5347678125_c362d46df4_o.jpg"><img class="alignnone size-full wp-image-1300" title="5347678125_c362d46df4_o" src="http://blog.mfabrik.com/wp-content/uploads/2011/06/5347678125_c362d46df4_o.jpg" alt="" width="240" height="180" /></a></p>
<p>See you in Sauna Sprint 2011!
<p class="signature">
<a href="http://mfabrik.com/@@zoho-contact-form"><img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/mfabrik-24.png"></a> <a href="http://mfabrik.com/@@zoho-contact-form">Get developers</a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a> <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml">Subscribe mFabrik blog in a reader</a> <a href="http://twitter.com/mfabrik"> <img valign="middle"  src="http://blog.mfabrik.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mfabrik.com/2011/06/08/sauna-sprint-2011-motivational-blog-post-%e8%9a%8a%e3%81%8c%e6%a5%bd%e3%81%97%e3%81%84%e3%81%a7%e3%81%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

