<?xml version="1.0" encoding="ISO-8859-15"?>
<feed xmlns="http://purl.org/atom/ns#"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
      version="0.3">
  <title mode="escaped" type="text/html">Philipp von Weitershausen</title>
  <tagline>ATOM Feed - Philipp von Weitershausen</tagline>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen"/>
  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen</id>
  <generator url="http://cps-project.org" version="3">CPS</generator>
  <modified>2005-12-07 12:02:42</modified>

  <link rel="service.feed"
        href=" http://www.z3lab.org/sections/blogs/philipp-weitershausen/atomFeed"
        title="Philipp von Weitershausen"
        type="application/atom+xml"/>
  <link rel="service.post"
        href=" http://www.z3lab.org/sections/blogs/philipp-weitershausen/postAtom"
        title="Philipp von Weitershausen"
        type="application/atom+xml"/>
  <link rel="service.categories"
        href=" http://www.z3lab.org/sections/blogs/philipp-weitershausen/atomCategories"
        title="Philipp von Weitershausen"
        type="application/atom+xml"/>

  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Professional Plone Development -- a review</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2008_01_25_professional-plone" />
  <issued>2008-01-25T09:28:06Z</issued>
  <modified>2008-01-25T09:28:06Z</modified>
  <created>2008-01-25T09:28:05Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Plone</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Recently I volunteered to set up a website for a small student
association at my university.  Nothing fancy: corporate design,
community-managed content, private member area for managing the
association's internal affairs, etc.  &amp;quot;Sure thing,&amp;quot; I thought, &amp;quot;I'll
just use Plone.  It's something I know.&amp;quot;  But it turned out I didn't
really.  Anymore.
You see, I rarely do ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;Recently I volunteered to set up a website for a small &lt;a class="reference" href="http://vwi-dresden.de"&gt;student
association&lt;/a&gt; at my university.  Nothing fancy: corporate design,
community-managed content, private member area for managing the
association's internal affairs, etc.  &amp;quot;Sure thing,&amp;quot; I thought, &amp;quot;I'll
just use Plone.  It's something I know.&amp;quot;  But it turned out I didn't
really.  Anymore.&lt;/p&gt;
&lt;p&gt;You see, I rarely do content-management projects, and the last time I
customized and deployed Plone was when Archetypes was considered &lt;em&gt;the&lt;/em&gt;
cutting edge.  Luckily, I had been given &lt;a class="reference" href="http://optilude.net"&gt;Martin Aspeli&lt;/a&gt;'s book
&lt;a class="reference" href="http://www.packtpub.com/Professional-Plone-web-applications-CMS/book"&gt;Professional Plone Development&lt;/a&gt; for review, so to kill two birds
with one stone, I did what any Plone noob is supposed to: RTFB.&lt;/p&gt;
&lt;p&gt;Professional Plone Development starts out with a gentle introduction
to the Plone community and software.  It goes on explaining how to set
up a development environment.  This chapter is very well sorted out,
especially insofar as it's currently the only printed material that
explains the techniques revolving around &lt;a class="reference" href="http://peak.telecommunity.com/DevCenter/PythonEggs"&gt;eggs&lt;/a&gt; and &lt;a class="reference" href="http://pypi.python.org/pypi/zc.buildout"&gt;zc.buildout&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Over the next couple of chapters, the book then takes you on a typical
walk through the Plone customization jungle: though-the-web
customization, policy products and GenericSetup profiles, security and
workflow, custom themes.  These things changed drastically in the last
Plone releases, and even though they're now often based on Zope 3
techniques, I had no idea about the specifics of the system.  With the
help of just this part of the book, I had my 90% of my website up and
running.  But then again, it's a small and simple site.&lt;/p&gt;
&lt;p&gt;The rest of the book dives into the core of Plone and Zope
programming.  Here's where I have my only few negative points of
criticism.  Chapter 9 in which Martin explains a couple of core Zope
concepts (Object Publishing, Acquisition, Persistence, Component
Architecture, etc.)  feels a bit disconnected from the rest and
frankly overwhelming (not to me, mind you, but I'm imagining for
others it might be).  Some of these concepts could have easily
explained earlier on and some of them only start to make sense when
you're actually using them.&lt;/p&gt;
&lt;p&gt;Admittedly, it &lt;em&gt;is&lt;/em&gt; hard to talk about browser views or automated
forms without &lt;em&gt;some&lt;/em&gt; Component Architecture theory. Also, the slightly
dry Chapter 9 does make a good reference for later.  Lastly, the
criticism is completely outweighed by another highlight that awaits
the reader at the end of the book: a couple of very thorough chapters
on deployment.&lt;/p&gt;
&lt;p&gt;Looking at this book, I can't help but wonder: how can he cover it all
in just onder 400 pages?  This is not only a very good book, it's also
good value for money.&lt;/p&gt;
&lt;p&gt;P.S.: I wrote up this review a while ago already but forgot to post
it, so apologies if it comes a bit late now...&lt;/p&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2008_01_25_professional-plone</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2008_01_25_professional-plone/atom?2008_01_25_professional-plone"
        title="Edit Here - Professional Plone Development -- a review" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">From the PEP8 department...</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_11_09_from-pep8-department" />
  <issued>2007-11-09T14:29:33Z</issued>
  <modified>2007-11-09T14:29:33Z</modified>
  <created>2007-11-09T14:26:42Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Python</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Since a lot of people trip over this, let me repeat an important and useful
  passage from PEP8,
  the Python styleguide:
  


- Comparisons to singletons like None should always be done with
  'is' or 'is not', never the equality operators.

  Also, beware of writing "if x" when you really mean "if x is not None"
  -- e.g. when testing whether a variable or argument that defaults to
  ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;Since a lot of people trip over this, let me repeat an important and useful
  passage from &lt;a href="http://www.python.org/dev/peps/pep-0008/"&gt;PEP8&lt;/a&gt;,
  the Python styleguide:
  &lt;/p&gt;

&lt;pre&gt;
- Comparisons to singletons like None should always be done with
  'is' or 'is not', never the equality operators.

  Also, beware of writing "if x" when you really mean "if x is not None"
  -- e.g. when testing whether a variable or argument that defaults to
  None was set to some other value.  The other value might have a type
  (such as a container) that could be false in a boolean context!
&lt;/pre&gt;

&lt;p&gt;In particular, you should avoid code like&lt;/p&gt;

&lt;pre&gt;
  ob = retrieveObjectSomehow(..., default=None)
  if ob:
      # you'll never get here if ob is an IContainer and empty
&lt;/pre&gt;

&lt;p&gt;  If you &lt;b&gt;know&lt;/b&gt; that None is the fallback, then check for it
  explicitly:&lt;/p&gt;

&lt;pre&gt;
  ob = retrieveObjectSomehow(..., default=None)
  if ob is not None:
&lt;/pre&gt;

&lt;p&gt;  I don't know why people frequently trip over this, I blame tutorials that
  draw a misleading picture of Python's polymorphism.&lt;/p&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_11_09_from-pep8-department</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_11_09_from-pep8-department/atom?2007_11_09_from-pep8-department"
        title="Edit Here - From the PEP8 department..." />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">It's not a bug...</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_11_07_it-s-not-bug" />
  <issued>2007-11-07T23:00:22Z</issued>
  <modified>2007-11-07T23:00:22Z</modified>
  <created>2007-11-07T22:59:31Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Personal</dc:subject>
  
  
  <summary type="text/html" mode="escaped">... but at least the engine is where God intended it to be: aft.
  
  
  
  Yup, that's her, a 1991 VW Transporter double-cab pickup. Not a beauty and
  not really fast (the 1.7L diesel develops a staggering 57 bhp), but she's in
  good shape and has loads of space as you can imagine. I'm already
  looking forward to some skiing trips.
  
  She's also quite economical since she's taxed ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">... but at least the engine is where God intended it to be: aft.&lt;br /&gt;
  &lt;br /&gt;
  &lt;img src="http://worldcookery.com/Private/doka.jpg" /&gt;&lt;br /&gt;
  &lt;br /&gt;
  Yup, that's her, a 1991 VW Transporter double-cab pickup. Not a beauty and
  not really fast (the 1.7L diesel develops a staggering 57 bhp), but she's in
  good shape and has &lt;i&gt;loads&lt;/i&gt; of space as you can imagine. I'm already
  looking forward to some skiing trips.&lt;br /&gt;
  &lt;br /&gt;
  She's also quite economical since she's taxed like a truck &lt;a
  href="http://www.amazon.com/Fryer-Fuel-Tank-Vegetable-Alternative/dp/0970722702"&gt;
  and will happily eat vegetable oil&lt;/a&gt;. Saw her for sale online when I was
  visiting the folks at &lt;a href="http://jarn.com"&gt;Jarn in Norway&lt;/a&gt; and
  bought her the day I got back home. I mounted the Mexican number plate in
  reminiscence of my wonderful time in Mexico where I drove a &lt;a
  href="http://en.wikipedia.org/wiki/Image:1992_Toyota_V6.JPG"&gt;Toyoto
  Hilux&lt;/a&gt;, a vehicle not unlike this one that changed my views on pickup
  trucks in general and Toyota in particular.&lt;br /&gt;
  &lt;br /&gt;
  Meanwhile, I'm moving &lt;a
  href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_04_23_bug-ll-gladly-fix"&gt;
  the bug&lt;/a&gt; to the workshop soon where it'll receive a complete make-over of
  the chassis and body.&lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_11_07_it-s-not-bug</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_11_07_it-s-not-bug/atom?2007_11_07_it-s-not-bug"
        title="Edit Here - It's not a bug..." />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Can't hardly wait: PloneConf 2007</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_10_08_can-t-hardly-wait" />
  <issued>2007-10-08T20:40:59Z</issued>
  <modified>2007-10-08T20:40:59Z</modified>
  <created>2007-10-08T20:40:18Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Plone</dc:subject>
  
  
  <summary type="text/html" mode="escaped">With all the Zope 3 work I'm getting these days, I can't really contribute
  much to Plone or do customer work with it
  anymore. But I still love attending their get-togethers. Doesn't matter
  whether it's the Snow Sprint high up in the Alps or a conference in Vienna,
  Seattle or Naples - you always know you're in for endless loads of
  fun.
   
   This year's conference starts this ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">With all the Zope 3 work I'm getting these days, I can't really contribute
  much to &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; or do customer work with it
  anymore. But I still love attending their get-togethers. Doesn't matter
  whether it's the Snow Sprint high up in the Alps or a conference in Vienna,
  Seattle or Naples - you always know you're in for endless loads of
  fun.&lt;br /&gt;
   &lt;br /&gt;
   This year's conference starts this coming Wednesday. Looking at the agenda,
  I find an interesting recurring theme (among many others) that we haven't
  had at a Plone conference before: Looking over the fence and learning from
  others.&lt;br /&gt;
   &lt;br /&gt;
   For instance, there's Andy McKay's talk &lt;a
  href="http://plone.org/events/conferences/2007-naples/speakers-1/sessions/what-plone-can-learn-from-rails"&gt;
  &lt;i&gt;What Plone can learn from Rails&lt;/i&gt;&lt;/a&gt; on Friday. On Wednesday, we have
  Lennart Regebro's talk about &lt;a
  href="http://plone.org/events/conferences/2007-naples/speakers-1/sessions/what-zope-did-wrong-and-what-to-do-instead"&gt;
  &lt;i&gt;What Zope did wrong (and what to do instead)&lt;/i&gt;&lt;/a&gt;. And then there's my
  talk on Thursday called &lt;i&gt;&lt;a
  href="http://plone.org/events/conferences/2007-naples/speakers-1/sessions/plone-age-mammoths-sabers-and-cavemen-cant-they-just-get-along"&gt;
  Plone Age&lt;/a&gt;&lt;/i&gt;, in which I will look at lessons learned from other
  (Python) web frameworks, as well as recent developments in the Zope 3
  scene.&lt;br /&gt;
   &lt;br /&gt;
   With these and all the other fantastically sounding talks in the agenda, I
  can't hardly wait to get to Naples!&lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_10_08_can-t-hardly-wait</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_10_08_can-t-hardly-wait/atom?2007_10_08_can-t-hardly-wait"
        title="Edit Here - Can't hardly wait: PloneConf 2007" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Little bit of history repeating...</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_09_25_little-bit-history" />
  <issued>2007-09-25T07:53:29Z</issued>
  <modified>2007-09-25T07:53:29Z</modified>
  <created>2007-09-25T07:53:26Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Plone</dc:subject>
  
  
  <summary type="text/html" mode="escaped">The talk
  schedule for this year's Plone Conference is out. The amount and variety
  of talks are stunning. Sadly and funnily at the same time, I'm up against
  the exact same as last year: Introduction to KSS.</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">The &lt;a href="http://plone.org/events/conferences/2007-naples/agenda"&gt;talk
  schedule&lt;/a&gt; for this year's Plone Conference is out. The amount and variety
  of talks are stunning. Sadly and funnily at the same time, I'm up against
  the exact same as last year: Introduction to KSS.&lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_09_25_little-bit-history</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_09_25_little-bit-history/atom?2007_09_25_little-bit-history"
        title="Edit Here - Little bit of history repeating..." />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Announcing zopeproject 0.4</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_09_16_announcing-zopeproject-0" />
  <issued>2007-09-16T15:14:57Z</issued>
  <modified>2007-09-16T15:14:57Z</modified>
  <created>2007-09-16T15:12:03Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">zopeproject makes it easy to get started with a web application based
on Zope eggs, zc.buildout and WSGI/Paste. If you're not familiar
with this world yet, zopeproject is your easy entry to it. If you are,
zopeproject will save you lots of typing up the boilerplate.

Why eggs?
Because they are a great way to distribute Python software and declare
its dependencies. Zope 3.4 is completely ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;&lt;a class="reference" href="http://pypi.python.org/pypi/zopeproject"&gt;zopeproject&lt;/a&gt; makes it easy to get started with a web application based
on Zope eggs, &lt;a class="reference" href="http://pypi.python.org/pypi/zc.buildout"&gt;zc.buildout&lt;/a&gt; and &lt;a class="reference" href="http://python.org/dev/peps/pep-0333/"&gt;WSGI&lt;/a&gt;/&lt;a class="reference" href="http://pythonpaste.org/"&gt;Paste&lt;/a&gt;. If you're not familiar
with this world yet, zopeproject is your easy entry to it. If you are,
zopeproject will save you lots of typing up the boilerplate.&lt;/p&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="why-eggs" name="why-eggs"&gt;Why eggs?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Because they are a great way to distribute Python software and declare
its dependencies. Zope 3.4 is completely distributed as individual eggs
and will from now on be developed as such.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="what-s-zc-buildout" name="what-s-zc-buildout"&gt;What's zc.buildout?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;It's a tool for repeatable deployments that's configuration-file driven.
You tell it &amp;quot;install these eggs for me, create this script and let me
develop packages in this directory&amp;quot; and it will go ahead and do all
that. Over and over again, if necessary, and for everybody who wants the
same setup as you (which is great for teams).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="what-are-wsgi-and-paste" name="what-are-wsgi-and-paste"&gt;What are WSGI and Paste?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;WSGI is a Python standard for web applications and web servers. It
defines how they communicate so that potentially any WSGI application
can run on any WSGI gateway (server). Zope has had support for WSGI for
a while now, but it has never really been exposed, even though it offers
great possibilities such as middlewares.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference" href="http://pythonpaste.org/"&gt;Paste&lt;/a&gt; is a collection of related to WSGI. One of its tools, &lt;a class="reference" href="http://pythonpaste.org/deploy/"&gt;PasteDeploy&lt;/a&gt;,
is of particular interest. It allows you to plug WSGI applications,
middlwares and gateways together using a simple configuration file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="zopeproject-vs-instances" name="zopeproject-vs-instances"&gt;zopeproject vs. instances&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Apart from all the flashy technology that zopeproject brings us, it also
implies a big conceptual change in the way we develop web applications
with Zope.&lt;/p&gt;
&lt;p&gt;In the world of regular instances, Zope is the server and the
application. Your code is just like a plug-in:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
+------------+         +---------+
|    Zope    |  runs   |your code|
|server &amp;amp; app|  ----&amp;gt;  | (plugin)|
+------------+         +---------+
&lt;/pre&gt;
&lt;p&gt;Even though we've been doing it for years (&amp;quot;Products&amp;quot; ring any bells?),
I think this is backwards and accounts for much of the irritation people
coming to Zope have.&lt;/p&gt;
&lt;p&gt;With zopeproject's approach, &lt;em&gt;your code&lt;/em&gt; is the application. The web
application, to be precise. And it &lt;em&gt;happens&lt;/em&gt; to use Zope. As a library:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
+------------+           +-------------+          +---------+
|WSGI gateway|  serves   |  your code  |   uses   |  Zope   |
|  (server)  |  ------&amp;gt;  |(application)|   ----&amp;gt;  |libraries|
+------------+           +-------------+          +---------+
&lt;/pre&gt;
&lt;p&gt;Zope isn't the center of attention anymore, your application is. Even
better, you can choose how much of Zope you'd really like to use. You
may compare this approach to a GUI application that happens to use some
sort of GUI framework to get some widgets on the screen, but otherwise
it's just like any other, real application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="so-how-does-it-work" name="so-how-does-it-work"&gt;So how does it work?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;It's pretty easy. All you need to do is install zopeproject first. You
don't need to install Zope for this, zopeproject will do that for you
later. Note that you will have to have &lt;a class="reference" href="http://peak.telecommunity.com/DevCenter/setuptools"&gt;setuptools&lt;/a&gt; installed for this
to work (it provides the easy_install script):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ easy_install zopeproject
&lt;/pre&gt;
&lt;p&gt;Depending on where and how you installed Python, you may have to prefix
this command with &amp;quot;sudo&amp;quot; to gain privileges for installing packages
globally.&lt;/p&gt;
&lt;p&gt;Now you can create a new web application:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ zopeproject WebApp
&lt;/pre&gt;
&lt;p&gt;Much like with mkzopeinstance, you'll be asked a couple of questions.
The last question concerns the central download location for eggs (which
will include the Zope eggs). After the questions, zopeproject will
create a 'WebApp' directory with some initial directory structure, as
well as download and install the Zope eggs.&lt;/p&gt;
&lt;p&gt;To start the application, go to the newly created directory and invoke
the server:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd WebApp
$ bin/paster serve deploy.ini
&lt;/pre&gt;
&lt;p&gt;You may also use the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;webapp-ctl&lt;/span&gt;&lt;/tt&gt; script which works much like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zopectl&lt;/span&gt;&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ bin/webapp-ctl fg
&lt;/pre&gt;
&lt;p&gt;You will then be able to go to &lt;a class="reference" href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt; and see the default
Zope screen. (The standard boilerplate simply uses the Zope 3 default,
after all. It is now up to you to change that.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="more-information-and-feedback" name="more-information-and-feedback"&gt;More information and feedback&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For more information, please refer to zopeproject's homepage on PyPI:
&lt;a class="reference" href="http://pypi.python.org/pypi/zopeproject"&gt;http://pypi.python.org/pypi/zopeproject&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm very much interested in getting your feedback. Please direct
questions that are of public interest to the &lt;a class="reference" href="mailto:zope3-users&amp;#64;zope.org"&gt;zope3-users&amp;#64;zope.org&lt;/a&gt; list.
Bugs may be reported in Launchpad: &lt;a class="reference" href="https://launchpad.net/zopeproject"&gt;https://launchpad.net/zopeproject&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_09_16_announcing-zopeproject-0</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_09_16_announcing-zopeproject-0/atom?2007_09_16_announcing-zopeproject-0"
        title="Edit Here - Announcing zopeproject 0.4" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">The Online Search Warrant</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_08_30_online-search-warrant" />
  <issued>2007-08-29T23:17:05Z</issued>
  <modified>2007-08-29T23:17:05Z</modified>
  <created>2007-08-29T23:17:03Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Miscellania</dc:subject>
  
  
  <summary type="text/html" mode="escaped">And now for something completely different... (in other words,
unreleated to Python or Zope)
When it comes to national security in Germany, there's currently one
topic dominating the press: online search warrants. Or rather the lack
thereof.  You see, German politicians and authorities involved in
national security have demanded for many months now that online
searches of computers on ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;And now for something completely different... (in other words,
unreleated to Python or Zope)&lt;/p&gt;
&lt;p&gt;When it comes to national security in Germany, there's currently one
topic dominating the press: online search warrants. Or rather the lack
thereof.  You see, German politicians and authorities involved in
national security have demanded for many months now that online
searches of computers on behalf of the police should be allowed
without a search warrant issued by a court.&lt;/p&gt;
&lt;p&gt;At first sight, it seems to make total sense.  Surely there are
terrorist who want to erect theocracies all over the world and bomb
the rest of us heathens back to the middle ages.  To reach that goal
they don't seem to shy away from using modern means of communication,
combat and sabotage, though.  So this is a war of technology and we
need to fight back with everything we got now, right?  Considering the
success the police had investigating the bombing of the London
Underground in 2005 and the attempted bombing of trains in Dortmund
and Kassel in 2006 was thanks to video surveillance, it seems that
betting on technology pays off.&lt;/p&gt;
&lt;p&gt;So why not go a step further and put the bad guys under surveilance
&lt;em&gt;before&lt;/em&gt; they bomb us to pieces? Let's catch them making plans, not
executing them.  What better tool could online searches be for this?
Well, to be honest, I see a whole range of problems with them.&lt;/p&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="it-s-unconstitutional" name="it-s-unconstitutional"&gt;It's unconstitutional&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;From my point of view, this is by far the strongest argument.
&amp;quot;Naturally we have to change the constitution to allow them,&amp;quot; the
supporters of online searches say.  The problem with this is that this
touches essential civil rights (Americans will know this as the Bill
of Rights) that every Western democracy holds up so high.  Once we
start giving these up, we might just as well get out of the U.N. and
stop telling the world that we're so better at treating people.  I can
already hear China saying &amp;quot;Told you so, Germany&amp;quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="lack-of-proportionality" name="lack-of-proportionality"&gt;Lack of proportionality&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Authorities claim that they can only conduct (and afford) 5 to 10
online searches a year.  Is it really too much trouble getting a judge
to sign a search warrant for such few incidents? Is it worth changing
our constitution for this? It's not like the police isn't going to
collect some evidence on the guy they're going to put under
surveillance in the first place.  After all, hacking into another
guy's computer takes time and money, you better make sure it's worth
it.  So you might just as well get a judge involved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="have-they-actually-thought-this-through" name="have-they-actually-thought-this-through"&gt;Have they actually thought this through?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The means by which the authorities want to conduct these online
searches aren't well known.  The press obviously likes to speculate
wildly (and usually gets it all wrong due to their lack of
understanding the details).&lt;/p&gt;
&lt;p&gt;The most obvious choice seems to be to buy a zero-day exploit for
whichever operating system the person in question is using.  I've
heard these sell for a couple hundred thousand dollars.  So the whole
thing sure is pricey.  Then you install a trojan (dubbed &amp;quot;Federal
Trojan&amp;quot;).  According to the press, this has been done already in an
investigation (unconstitutionally, I might add).&lt;/p&gt;
&lt;p&gt;The problem with the trojan is that if the police can get in that way,
so can anybody else, especially if the system isn't well maintained
(security updates, virus scanner, etc.).  So in the end, an online
search is like catching two cars on a speed camera.  You know at least
one of them has been speeding but you can't tell which one.  That's
why I doubt they'll hold up in court.&lt;/p&gt;
&lt;p&gt;Politicians realized that too, of course, and backpedaled.  Now they
wouldn't use a trojan but rather fall back to more conventional
methods of gaining access to the computer: breaking into the suspect's
house and install the software or hardware (e.g. a keylogger) locally.
Well, I sure hope that those terrorist have no laptops, otherwise them
cops are goin' be real mad when they find out the terrorists always
take that computer with them when they leave the house...&lt;/p&gt;
&lt;p&gt;To me, all of this doesn't look like this has been thought through
properly.  Those who want it seem to think it's a silver bullit.
Those who actually know a little bit about this stuff can't seem to
see that it would be.  I sure hope that parliament will be wise enough
not to let this one slide by.&lt;/p&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_08_30_online-search-warrant</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_08_30_online-search-warrant/atom?2007_08_30_online-search-warrant"
        title="Edit Here - The Online Search Warrant" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">zc.buildout: new feature and speed up</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_08_21_zc-buildout-new-feature" />
  <issued>2007-08-21T08:50:38Z</issued>
  <modified>2007-08-21T08:50:38Z</modified>
  <created>2007-08-21T08:48:47Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Python</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Jim Fulton released zc.buildout
  1.0.0b30 last night. This release is worth mentioning for two
  reasons:
  

  
   
    buildout can now be told to prefer final versions over alpha/beta/dev
    releases. In normal mode, buildout will simply try to get the newest
    version of a package that matches the package requirements (just like
    easy_install). This means, however, that ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">Jim Fulton released &lt;a
  href="http://cheeseshop.python.org/pypi/zc.buildout/1.0.0b30"&gt;zc.buildout
  1.0.0b30&lt;/a&gt; last night. This release is worth mentioning for two
  reasons:&lt;br /&gt;
  &lt;br /&gt;

  &lt;ul&gt;
   &lt;li&gt;
    buildout can now be told to prefer final versions over alpha/beta/dev
    releases. In normal mode, buildout will simply try to get the newest
    version of a package that matches the package requirements (just like
    easy_install). This means, however, that development releases may be
    installed instead of stable final releases, which usually is undesired in
    production environments. To get buidout to prefer final releases, put the following
    statement in your buildout.cfg:
&lt;pre class="literal-block"&gt;
[buildout]
prefer-final = true
&lt;/pre&gt;
   &lt;/li&gt;

   &lt;li&gt;buildout now uses PyPI's &lt;a href="http://pypi.python.org/simple"&gt;simple
   package index&lt;/a&gt; by default. To setuptools (and zc.buildout), this index
   looks like the regular PyPI, except that it's much speedier (because it
   doesn't have to render fancy HTML) and it lists &lt;b&gt;all&lt;/b&gt; releases of a
   certain package, even the hidden ones. A while back, Jim had already played
   with a simple index like that, dubbed &lt;a
   href="http://download.zope.org/ppix"&gt;ppix&lt;/a&gt;, which uses PyPI's XML-RPC
   API to mirror the information.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;br /&gt;
  I've done a little test and timed updating the &lt;a
  href="http://grok.zope.org"&gt;grok&lt;/a&gt; buildout with &lt;code&gt;buildout -n&lt;/code&gt; using the
  various indexes (standard PyPI, simple PyPI, ppix). Buildout had to go to
  whichever index I configured and check for newer versions of roughly 100
  eggs (times are in minutes and seconds):&lt;br /&gt;
  &lt;br /&gt;
   

  &lt;table border="1"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td&gt;&lt;a href="http://pypi.python.org/pypi"&gt;standard PyPI&lt;/a&gt;&lt;br /&gt;
     &lt;/td&gt;

     &lt;td&gt;3:09&lt;br /&gt;
     &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
     &lt;td&gt;&lt;a href="http://pypi.python.org/simple"&gt;simple PyPI&lt;/a&gt;&lt;br /&gt;
     &lt;/td&gt;

     &lt;td&gt;2:05&lt;br /&gt;
     &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
     &lt;td&gt;&lt;a href="http://download.zope.org/ppix"&gt;ppix&lt;/a&gt;&lt;br /&gt;
     &lt;/td&gt;

     &lt;td&gt;1:54&lt;br /&gt;
     &lt;/td&gt;
    &lt;/tr&gt;
   &lt;/tbody&gt;
  &lt;/table&gt;
  &lt;br /&gt;
  So, ppix is only marginally faster than simple PyPI (depending on how
  "close" you are to either one), but they're both quite a lot faster than the
  standard PyPI.&lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_08_21_zc-buildout-new-feature</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_08_21_zc-buildout-new-feature/atom?2007_08_21_zc-buildout-new-feature"
        title="Edit Here - zc.buildout: new feature and speed up" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">pdb'ing to eggs installed with zc.buildout</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_30_pdb-ing-to-eggs" />
  <issued>2007-07-30T16:40:21Z</issued>
  <modified>2007-07-30T16:40:21Z</modified>
  <created>2007-07-30T16:40:20Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Python</dc:subject>
  
  
  <summary type="text/html" mode="escaped">If you use zc.buildout to
  install eggs, it sometimes happens that you can't pdb into their code.
  
  The reason for this is that the egg is built in a temporary directory and
  then moved to its destination. During the build, setuptools creates .pyc
  files which contain an absolute path reference to the original .py file.
  Since it's done a temp directory, this reference will be ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">If you use &lt;a
  href="http://cheeseshop.python.org/pypi/zc.buildout"&gt;zc.buildout&lt;/a&gt; to
  install eggs, it sometimes happens that you can't pdb into their code.&lt;br /&gt;
  &lt;br /&gt;
  The reason for this is that the egg is built in a temporary directory and
  then moved to its destination. During the build, setuptools creates .pyc
  files which contain an absolute path reference to the original .py file.
  Since it's done a temp directory, this reference will be outdated.&lt;br /&gt;
  &lt;br /&gt;
  A quick fix is to simply remove all the .pyc files from the egg and have
  them rebuilt automatically next time you use the package.&lt;br /&gt;
  &lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_07_30_pdb-ing-to-eggs</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_30_pdb-ing-to-eggs/atom?2007_07_30_pdb-ing-to-eggs"
        title="Edit Here - pdb'ing to eggs installed with zc.buildout" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Cheap binary Windows eggs</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_26_cheap-binary-windows" />
  <issued>2007-07-26T21:34:26Z</issued>
  <modified>2007-07-26T21:34:26Z</modified>
  <created>2007-07-26T20:47:23Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Python</dc:subject>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Thanks to Hanno Schlichting's howto, I've figured out how to create
Windows eggs of those packages that have C extensions. This approach
doesn't need Microsoft Visual Studio, nor does it require you to wade
through a bunch of free Microsoft downloads that don't really work
in the end anyway.
Here's what I did:

Installed the standard Python 2.4 distribution from the ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;Thanks to &lt;a class="reference" href="http://svn.plone.org/svn/plone/ploneout/trunk/WINDOWS.txt"&gt;Hanno Schlichting's howto&lt;/a&gt;, I've figured out how to create
Windows eggs of those packages that have C extensions. This approach
doesn't need Microsoft Visual Studio, nor does it require you to wade
through &lt;a class="reference" href="http://www.vrplumber.com/programming/mstoolkit"&gt;a bunch of free Microsoft downloads&lt;/a&gt; that don't really work
in the end anyway.&lt;/p&gt;
&lt;p&gt;Here's what I did:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Installed the &lt;a class="reference" href="http://python.org/ftp/python/2.4.4/python-2.4.4.msi"&gt;standard Python 2.4 distribution&lt;/a&gt; from the MSI
package.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Installed the &lt;a class="reference" href="http://downloads.sourceforge.net/mingw/MinGW-5.1.3.exe"&gt;MingW compiler&lt;/a&gt; (into the standard location &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;C:\MingW&lt;/span&gt;&lt;/tt&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Created &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;C:\Documents&lt;/span&gt; &lt;span class="pre"&gt;and&lt;/span&gt; &lt;span class="pre"&gt;Settings\Philipp\pydistutils.cfg&lt;/span&gt;&lt;/tt&gt; and
put the following text in it:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[build]
compiler=mingw32
&lt;/pre&gt;
&lt;p&gt;This tells distutils to always use the MingW compiler whenever it
has to compile something from C.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Went to the &lt;strong&gt;Control Panel&lt;/strong&gt; -&amp;gt; &lt;strong&gt;System&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Advanced&lt;/strong&gt; tab and
clicked on the &lt;strong&gt;Environment Variables&lt;/strong&gt; button. There I appended
the following text to the the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Path&lt;/span&gt;&lt;/tt&gt; environment variable, adding
the Python interpreter as well as MingW's programs to the search
path:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
;C:\Python24;C:\MingW\bin
&lt;/pre&gt;
&lt;p&gt;Then I added another environment variabled called &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;HOME&lt;/span&gt;&lt;/tt&gt; with the
following value:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
C:\Documents and Settings\Philipp
&lt;/pre&gt;
&lt;p&gt;This points distutils at the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pydistutils.cfg&lt;/span&gt;&lt;/tt&gt; file that I
created earlier (you can put the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pydistutils.cfg&lt;/span&gt;&lt;/tt&gt; file anywhere
you want, you just need to make sure that the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;HOME&lt;/span&gt;&lt;/tt&gt; environment
variable points to the directory).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;With that in place, I am able to take any tarball (e.g.
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zope.interface-3.4.0.tgz&lt;/span&gt;&lt;/tt&gt;), unzip it and create a Windows egg
from it like so:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
python setup.py bdist_egg
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What's more, with a setup like this, it is easily possible to install
Zope 3 completely from eggs (e.g. using &lt;a class="reference" href="http://cheeseshop.python.org/pypi/zc.buildout"&gt;zc.buildout&lt;/a&gt;) even if there
are no pre-built Windows eggs on the Cheeseshop.  More specifically,
with this setup, &lt;a class="reference" href="http://cheeseshop.python.org/pypi/zopeproject"&gt;zopeproject&lt;/a&gt; (which is really just a convenience tool
over &lt;a class="reference" href="http://cheeseshop.python.org/pypi/zc.buildout"&gt;zc.buildout&lt;/a&gt;) works like a charm on Windows now.&lt;/p&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_07_26_cheap-binary-windows</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_26_cheap-binary-windows/atom?2007_07_26_cheap-binary-windows"
        title="Edit Here - Cheap binary Windows eggs" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Please stop using request.RESPONSE</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_25_please-stop-using" />
  <issued>2007-07-25T19:07:15Z</issued>
  <modified>2007-07-25T19:07:15Z</modified>
  <created>2007-07-25T19:07:14Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Zope 2</dc:subject>
  
  
  <summary type="text/html" mode="escaped">The uppercasing of the REQUEST and RESPONSE variables is a Zope2ism that
  should die.
  
  Sometimes it may still be necessary to write REQUEST (e.g. when acquiring it
  from somewhere or taking it as a parameter, but even then you should really
  ask yourself whether you shouldn't rather write a view component).
  
  Either way, writing request.RESPONSE is completely unnecessary because ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">The uppercasing of the REQUEST and RESPONSE variables is a Zope2ism that
  should die.&lt;br /&gt;
  &lt;br /&gt;
  Sometimes it may still be necessary to write REQUEST (e.g. when acquiring it
  from somewhere or taking it as a parameter, but even then you should really
  ask yourself whether you shouldn't rather write a view component).&lt;br /&gt;
  &lt;br /&gt;
  Either way, writing request.RESPONSE is completely unnecessary because the
  Zope 2 request also allows you to write request.response which will
  instantly work on Zope 3 as well, therefore increase the portability of your
  code.&lt;br /&gt;
  &lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_07_25_please-stop-using</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_25_please-stop-using/atom?2007_07_25_please-stop-using"
        title="Edit Here - Please stop using request.RESPONSE" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Grok movie trailer</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_17_grok-movie-trailer" />
  <issued>2007-07-17T15:27:03Z</issued>
  <modified>2007-07-17T15:27:03Z</modified>
  <created>2007-07-17T09:58:23Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Grok</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Zope is back (by Martijn Faassen).</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;a href="http://youtube.com/watch?v=LAZZC7nvD2E"&gt;Zope is back&lt;/a&gt; (by Martijn Faassen).&lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_07_17_grok-movie-trailer</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_17_grok-movie-trailer/atom?2007_07_17_grok-movie-trailer"
        title="Edit Here - Grok movie trailer" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">mkzopeapp now called zopeproject</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_15_mkzopeapp-now-called" />
  <issued>2007-07-15T21:40:06Z</issued>
  <modified>2007-07-15T21:40:06Z</modified>
  <created>2007-07-15T21:40:04Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
  <summary type="text/html" mode="escaped">After expressing my wish to kill Zope instances in a recent blog
post, I had been discussing these ideas with Jim Fulton and Martijn
Faassen.  Their valuable feedback had led to some refactorings of
mkzopeapp, the tool that would set you up with a Zope development
sandbox (which would basically replace instances as a concept).
Last week at EuroPython, I presented my ideas in a lightning talk ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;After expressing my wish to &lt;a class="reference" href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_07_death-to-instances"&gt;kill Zope instances&lt;/a&gt; in a recent blog
post, I had been discussing these ideas with Jim Fulton and Martijn
Faassen.  Their valuable feedback had led to some refactorings of
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeapp&lt;/span&gt;&lt;/tt&gt;, the tool that would set you up with a Zope development
sandbox (which would basically replace instances as a concept).&lt;/p&gt;
&lt;p&gt;Last week at &lt;a class="reference" href="http://www.europython.org"&gt;EuroPython&lt;/a&gt;, I presented my ideas in a lightning talk and
a 45-min brainstorming session with quite a few Zope and non-Zope
folks.  Especially the input from people like &lt;a class="reference" href="http://www.jimmyg.org"&gt;James Gardner&lt;/a&gt; of
Pylons fame and Ignas Mikalajunas from the SchoolTool project was
quite useful.  This feedback led to even further refactorings of
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeapp&lt;/span&gt;&lt;/tt&gt;.  In particular, I dumped &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zope.paste&lt;/span&gt;&lt;/tt&gt; for defining
the application factory.  Instead, each newly created application now
contains its own application factory.  It is only a few lines long: it
processes &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zope.conf&lt;/span&gt;&lt;/tt&gt;, loads &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;site.zcml&lt;/span&gt;&lt;/tt&gt; and opens the ZODB
databases.  The great thing is that developers now have much more
control over what happens at startup and how they can configure their
application from the PasteDeploy INI file.  In particular, it will be
much easier to write ZODB-less applications this way.&lt;/p&gt;
&lt;p&gt;At the sprint after the conference, my main task was to bring Grok
over to Zope 3.4 eggs.  I subsequently improved &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;grokproject&lt;/span&gt;&lt;/tt&gt;, the
sandbox creation tool we had for Grok, and I realized that it shared a
lot of infrastructure with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeapp&lt;/span&gt;&lt;/tt&gt;.  I therefore factored this
common infrastructure out into &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeapp&lt;/span&gt;&lt;/tt&gt;, now called &lt;a class="reference" href="http://cheeseshop.python.org/pypi/zopeproject"&gt;zopeproject&lt;/a&gt;.
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;grokproject&lt;/span&gt;&lt;/tt&gt; (or at least a branch of it, for now) now merely uses
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zopeproject&lt;/span&gt;&lt;/tt&gt; for the heavy lifting.&lt;/p&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="from-the-zopeproject-readme" name="from-the-zopeproject-readme"&gt;From the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zopeproject&lt;/span&gt;&lt;/tt&gt; README:&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;With &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zopeproject&lt;/span&gt;&lt;/tt&gt; you can start a new Zope-based web application from
scratch with just a two commands:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ easy_install zopeproject
$ zopeproject MyZopeProj
&lt;/pre&gt;
&lt;p&gt;This will ask you the name and password for an initial administrator
user.  It will also ask you where to put the Python packages (&amp;quot;eggs&amp;quot;)
that it downloads.  This way multiple projects created with
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zopeproject&lt;/span&gt;&lt;/tt&gt; can share the same packages and won't have to download
them each time.&lt;/p&gt;
&lt;p&gt;After asking the questions, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zopeproject&lt;/span&gt;&lt;/tt&gt; will download the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zc.buildout&lt;/span&gt;&lt;/tt&gt; package that will be used to build the sandbox, unless
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zc.buildout&lt;/span&gt;&lt;/tt&gt; is already installed locally.  Then it will invoke
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zc.buildout&lt;/span&gt;&lt;/tt&gt; to download Zope and its dependecies.  If you're doing
this for the first time or not sharing packages between different
projects, this may take a while.&lt;/p&gt;
&lt;p&gt;When &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zopeproject&lt;/span&gt;&lt;/tt&gt; is done, you will find a typical Python package
development environment in the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;MyZopeProj&lt;/span&gt;&lt;/tt&gt; directory: the package
itself (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;myzopeproj&lt;/span&gt;&lt;/tt&gt;) and a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/tt&gt; script.  There's also a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;bin&lt;/span&gt;&lt;/tt&gt; directory that contains scripts, such as &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;paster&lt;/span&gt;&lt;/tt&gt; which can
be used to start the application:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd MyZopeProj
$ bin/paster serve deploy.ini
&lt;/pre&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_07_15_mkzopeapp-now-called</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_15_mkzopeapp-now-called/atom?2007_07_15_mkzopeapp-now-called"
        title="Edit Here - mkzopeapp now called zopeproject" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Death to instances!</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_07_death-to-instances" />
  <issued>2007-07-06T23:09:46Z</issued>
  <modified>2007-07-06T23:09:46Z</modified>
  <created>2007-07-06T23:09:45Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Python</dc:subject>
  
  
      <dc:subject>Zope 2</dc:subject>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">There.  I've said it.  You can beat me up now.
Finished?  Ok, then I can get to my point: I think Zope instances are
an overcome concept, now that we've finally sorted out that Zope isn't
an application anymore.
Confused? Fair enough, I'll explain.

Overcoming an identity crisis
Zope is in an identity crisis.  Both Zope 2 and 3 don't really know
what they want to be.  A content management ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;There.  I've said it.  You can beat me up now.&lt;/p&gt;
&lt;p&gt;Finished?  Ok, then I can get to my point: I think Zope instances are
an overcome concept, now that we've finally sorted out that Zope isn't
an application anymore.&lt;/p&gt;
&lt;p&gt;Confused? Fair enough, I'll explain.&lt;/p&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="overcoming-an-identity-crisis" name="overcoming-an-identity-crisis"&gt;Overcoming an identity crisis&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Zope is in an identity crisis.  Both Zope 2 and 3 don't really know
what they want to be.  A content management application? An
application server? A platform? A set of libraries? They're sort of
everything and nothing.  In its long life time of almost a decade,
Zope has therefore attracted &lt;em&gt;and&lt;/em&gt; disappointed different kinds of
people:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;People who really weren't developers were attracted by the ZMI and
all the through-the-web stuff, but sooner or later they had to
discover the &amp;quot;Z-shaped&amp;quot; learning curve: in the beginning Zope is
really easy, but when you get past a certain point it becomes very
hard, until you've mastered it.  Usually that involved learning a
substantial amount of Python (remember, we're talking about
non-developers here).&lt;/li&gt;
&lt;li&gt;For a long time, Zope was pretty much the only thing out there that
did cool web stuff with Python.  But by trying to appeal to
non-developers in a way that's so un-intuitive to developers
(through-the-web development, anyone?), it has scared off so many
Pythonistas that Zope, even after trying very very hard with Zope 3,
is forever branded as the most un-Pythonic piece of code out there
(even if that wasn't even true at the time this prejudicial
judgement was conceived...).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference" href="http://www.palladion.com/home/tseaver/obzervationz/2007/behind_door_number_3_20070606"&gt;Tres Seaver's keynote&lt;/a&gt; at this year's &lt;a class="reference" href="http://www.zope.de/8-dzug-tagung"&gt;DZUG Tagung&lt;/a&gt; in Potsdam revolved
around this very problem.  At the end, he suggested that Zope should
make up its mind as to what it wants to be. His suggestion was that
Zope should be a &lt;em&gt;platform&lt;/em&gt;.  Not an application.  Not a server.  Just
a platform&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;with lots of libraries that help you create a web application (this is
what's currently known as Zope 3),&lt;/li&gt;
&lt;li&gt;with a particular set of those libraries (and a few legacy ones)
that make up a &amp;quot;known good&amp;quot; assembly for a web application platform
(this is what's currently known as Zope 2),&lt;/li&gt;
&lt;li&gt;but &lt;em&gt;without&lt;/em&gt; necessarily providing its own HTTP server
implementation, its own process management tools, its own ways of
installing software.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What's important to note here is that Zope would not be an application
that &amp;quot;eats&amp;quot; your 3rd party code to be pluggable.  Instead, it'd be
&lt;em&gt;you&lt;/em&gt; who would write the web application and this application
&lt;em&gt;happens&lt;/em&gt; to use the Zope platform (the Zope libraries), just like
other applications happen to use TurboGears or Pylons.  Think of
writing a GUI application that happens to use wxPython.  Would you
expect that you would have to launch the &amp;quot;wxPython-the-application&amp;quot; in
order to launch your GUI app? I think not.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="so-what-s-the-problem-with-instances" name="so-what-s-the-problem-with-instances"&gt;So what's the problem with instances?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Primarily an instance is a place that contains your code which is
plugged into Zope-the-application.  So strictly speaking your code
isn't really the application, it's just stuff that plugs into
Zope-the-application.  And the configuration that's in the instance,
too, doesn't configure your application.  It configures
Zope-the-application.  And the scripts that are also in the instance
are aptly named &amp;quot;runzope&amp;quot; and &amp;quot;zopectl&amp;quot;.&lt;/p&gt;
&lt;p&gt;Instances therefore embody the concept of Zope-the-application.
They're not very helpful in bringing forward the platform idea of
Zope.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="so-how-would-i-write-an-app-with-using-zope-instead-of-a-plug-in-for-zope" name="so-how-would-i-write-an-app-with-using-zope-instead-of-a-plug-in-for-zope"&gt;So how would I write an app with &lt;em&gt;using&lt;/em&gt; Zope instead of a plug-in &lt;em&gt;for&lt;/em&gt; Zope?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Simple.  You start by writing Python code.  And where does Python code
go?  Right, into a package.  So you start by creating a package.&lt;/p&gt;
&lt;p&gt;That's right, you don't start by making an instance.  You simply start
by doing something you'd do with any other piece of Python software
you'd write: create a package with code.  Naturally you're using Zope,
so you'd put all the kinds of Zope-based components in that package
that you know: ZODB-persistent classes, views, Page Templates, etc.
The more of Zope's components you use, the more dependencies your
application will grow, which can all be tracked using the a standard
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/tt&gt; script that we know from other setuptools-based
distributions.&lt;/p&gt;
&lt;p&gt;What's the next step? Configuring your application's components.
Surely you want to use the Zope publisher so that your views will be
found.  And you probably want Zope's security machinery as well.  So
before configuring all the components that you yourself have written,
you want to load those components from Zope that you're reusing.  So
your package's &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;configure.zcml&lt;/span&gt;&lt;/tt&gt; file will start off by including
lots of Zope bits and pieces, perhaps like so:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
...
&amp;lt;include package=&amp;quot;zope.publisher&amp;quot; /&amp;gt;
&amp;lt;include package=&amp;quot;zope.traversing&amp;quot; /&amp;gt;
&amp;lt;include package=&amp;quot;zope.app.securitypolicy&amp;quot; /&amp;gt;
&amp;lt;include package=&amp;quot;zope.app.authentication&amp;quot; /&amp;gt;
&amp;lt;include package=&amp;quot;zope.app.session&amp;quot; /&amp;gt;
...
&lt;/pre&gt;
&lt;p&gt;Great.  Now how do you start your application?  Essentially what you'd
want during developing time is a web server that processes all
requests by sending them to Zope publisher (which will then invoke
your application's components).  &lt;a class="reference" href="http://pythonpaste.org/deploy"&gt;PasteDeploy&lt;/a&gt; is a small library that
helps connecting applications to web servers.  It is configured using
a simple INI-style configuration file, such as this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[app:main]
use = egg:zope.paste
site_definition = configure.zcml
file_storage = /path/to/datadir/Data.fs

[server:main]
use = egg:PasteScript#wsgiutils
host = 127.0.0.1
port = 8080
&lt;/pre&gt;
&lt;p&gt;Here we configure the two bits we want to connect:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;the application, represented by &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zope.paste&lt;/span&gt;&lt;/tt&gt;, a
PasteDeploy-friendly frontend for any Zope publisher-based web
application, and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;configure.zcml&lt;/span&gt;&lt;/tt&gt; of which we've seen an excerpt
above.&lt;/li&gt;
&lt;li&gt;and the web server, which happens to be a simple one from a package
called &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;WSGIUtils&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After that little bit of configuration (which might remind you a bit
of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zope.conf&lt;/span&gt;&lt;/tt&gt;) you can start your application by invoking Paste:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ paster serve your-app.ini
&lt;/pre&gt;
&lt;p&gt;Now the good news: this already works. Today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="automating-the-common-case" name="automating-the-common-case"&gt;Automating the common case&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;So all in all, writing an application with Zope-the-platform (instead
of writing a plug-in for Zope-the-application) is pretty simple:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Start with a package and put your application's code in it.  Add
to its dependencies as you're using more of Zope's own components.&lt;/li&gt;
&lt;li&gt;Configure your application's components, not forgetting to
configure those components of Zope that you're reusing (the
publisher, the security machinery, etc.).  This configuration can
go right into the application's package as well.&lt;/li&gt;
&lt;li&gt;Hook the application up to an HTTP server. Done.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Admittedly, that's a bit more work than with instances.  With
instances, you simply invoke &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeinstance&lt;/span&gt;&lt;/tt&gt; and you ended up with
a pre-configured runnable Zope-the-application.  To get the same kind
of convenience for beginners, we'd simply need a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeapp&lt;/span&gt;&lt;/tt&gt; script
that creates a Python package with some pre-made component and server
configuration.&lt;/p&gt;
&lt;p&gt;Good news, everybody! It exists!  Here's how you'd get Zope up and
running with it.  First of all, you'd need to install &lt;a class="reference" href="http://cheeseshop.python.org/pypi/mkzopeapp"&gt;mkzopeapp&lt;/a&gt; (it
is suggested to perform all of this in a &lt;a class="reference" href="http://cheeseshop.python.org/pypi/workingenv.py"&gt;workingenv&lt;/a&gt; to avoid
pollution of your global Python installation):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ easy_install mkzopeapp
&lt;/pre&gt;
&lt;p&gt;Note that this doesn't mean you need to install Zope first or that
Zope will be installed in the process.  For now, that just installs
the script that sets you up with an empty package layout.&lt;/p&gt;
&lt;p&gt;Now that the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeapp&lt;/span&gt;&lt;/tt&gt; script is available, we can simply invoke
it, just like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mkzopeinstance&lt;/span&gt;&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ mkzopeapp MyZopeProj
&lt;/pre&gt;
&lt;p&gt;Inside the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;MyZopeProj&lt;/span&gt;&lt;/tt&gt; directory, however, it looks nothing like an
instance.  It's simply a standard Python package layout with a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/tt&gt;. The Python package, though, contains a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;configure.zcml&lt;/span&gt;&lt;/tt&gt; file that loads the most common Zope components.
It also contains a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;develop.ini&lt;/span&gt;&lt;/tt&gt; file that contains a simple HTTP
server configuration not unlike the one we've seen above.&lt;/p&gt;
&lt;p&gt;To get the application up and running, we need to install its
dependencies (which happens to be a lot of Zope libraries).  We do
that by activating the package as a development egg:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd MyZopeProj
$ python setup.py develop -f http://download.zope.org/distribution
&lt;/pre&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-f&lt;/span&gt;&lt;/tt&gt; switch tells setuptools where to find the Zope packages.
Note that this may take a few minutes until all the packages have been
downloaded.  When that is done and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;MyZopeProj&lt;/span&gt;&lt;/tt&gt; has been activated
as an egg, you will also get a new script that you can use to directly
start the application:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ startMyZopeProj
Starting server in PID 1217.
Starting HTTP server on http://127.0.0.1:8080
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="conclusion" name="conclusion"&gt;Conclusion&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As we've seen, writing applications &lt;em&gt;using&lt;/em&gt; Zope isn't any more
difficult than plugging into Zope-the-application, thanks to
&lt;a class="reference" href="http://cheeseshop.python.org/pypi/mkzopeapp"&gt;mkzopeapp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You might also have realized that this way of arranging a web
application makes it much easier to install and distribute: you simply
install that one package and it contains a runnable, configured
application.  And because it lists Zope's libraries as dependencies,
they will be installed automatically as well. So you no longer install
Zope and &lt;em&gt;then&lt;/em&gt; add the application code.  You install the
application, and Zope happens to be pulled in as a consequence.  And
if your application package specifies a specific version of Zope,
people won't have problems by accidentally having installed the wrong
version of Zope.&lt;/p&gt;
&lt;p&gt;I could go on and come up with lots more advantages of the
platform-centric view.  And certainly there are a few things where
instances still deliver more features (debugging comes to mind).
Certainly those can be sorted out in the near future, hopefully with
your help!&lt;/p&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_07_07_death-to-instances</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_07_07_death-to-instances/atom?2007_07_07_death-to-instances"
        title="Edit Here - Death to instances!" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Custom traversal with Grok</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_06_08_custom-traversal-with" />
  <issued>2007-06-09T10:30:51Z</issued>
  <modified>2007-06-09T10:30:51Z</modified>
  <created>2007-06-08T15:09:35Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Marius Gedminas has written
down how
to implement custom traversal for a content object in Zope 3
(which also applies to Zope 2.10+ now, btw). As he admits, it's a bit
complicated. In an email conversation, I showed him how easy it is in
Grok:

  
   When we created Grok, we realized this obvious complication in Zope 3 and
   made custom traversal very easy in Grok. You can either ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;Marius Gedminas has written
down &lt;a href="http://mg.pov.lt/blog/zope3-custom-traversal.html"&gt;how
to implement custom traversal&lt;/a&gt; for a content object in Zope 3
(which also applies to Zope 2.10+ now, btw). As he admits, it's a bit
complicated. In an email conversation, I showed him how easy it is in
Grok:&lt;/p&gt;

  &lt;blockquote&gt;
   When we created Grok, we realized this obvious complication in Zope 3 and
   made custom traversal very easy in Grok. You can either implement a
   traverse() method directly on a model:
&lt;pre&gt;
class Appointment(grok.Model):
    pass

class Day(grok.Model):
    def traverse(self, number):
        appointment = self.getAppointment(int(number))
        if appointment.published():
            return appointment
        # if traverse() returns None, the default fallback
        # behaviour is assumed (looking up views usually).
&lt;/pre&gt;

    Or you can implement an (exchangeable!) separate traverser
    component:

&lt;pre&gt;
class Day(grok.Model):
    pass

class DayTraverser(grok.Traverser):
    grok.context(Day)

    def traverse(self, number):
        appointment = self.context.getAppointment(int(number))
        if appointment.published():
            return appointment

&lt;/pre&gt;
  &lt;/blockquote&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; Regarding that last example, Marius asked:
&amp;quot;How's the binding done?  Does grok look at the class name?&amp;quot;
I answered:
&lt;/p&gt;

  &lt;blockquote&gt;grok.Traverser is actually a fully qualified
  IBrowserPublisher multi-adapter, like the one you have written in
  your blog. So it's registered as a multi-adapter (no class name
  magic going on!). The grok.Traverser base class simply lets you
  implement a hook -- the traverse() method -- and does all the
  boilerplate stuff for you, that way you don't have to know about
  IBrowserPublisher and all those fallbacks...
&lt;/blockquote&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_06_08_custom-traversal-with</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_06_08_custom-traversal-with/atom?2007_06_08_custom-traversal-with"
        title="Edit Here - Custom traversal with Grok" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">A bug I'll gladly fix</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_04_23_bug-ll-gladly-fix" />
  <issued>2007-04-23T13:57:52Z</issued>
  <modified>2007-04-23T13:57:52Z</modified>
  <created>2007-04-23T13:54:16Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Miscellania</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Here's for once a bug that I'll gladly spend my free time fixing: A 1971
  Volkswagen 1302 S convertible I bought this past weekend.
  
  
  
  Given the sunny days with temperatures well over 25C (77F), I'm already
  looking forward to taking it out to nearby Saxon
  Switzerland.</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">Here's for once a bug that I'll gladly spend my free time fixing: A 1971
  Volkswagen 1302 S convertible I bought this past weekend.&lt;br /&gt;
  &lt;br /&gt;
  &lt;img src="http://worldcookery.com/Private/bug.jpg" /&gt;&lt;br /&gt;
  &lt;br /&gt;
  Given the sunny days with temperatures well over 25C (77F), I'm already
  looking forward to taking it out to nearby &lt;a
  href="http://en.wikipedia.org/wiki/Saxon_Switzerland"&gt;Saxon
  Switzerland&lt;/a&gt;.&lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_04_23_bug-ll-gladly-fix</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_04_23_bug-ll-gladly-fix/atom?2007_04_23_bug-ll-gladly-fix"
        title="Edit Here - A bug I'll gladly fix" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Why ZClasses are dead and why Grok lives</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_04_19_why-zclasses-dead-why" />
  <issued>2007-04-19T21:44:40Z</issued>
  <modified>2007-04-19T21:44:40Z</modified>
  <created>2007-04-19T21:44:05Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Zope 2</dc:subject>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Recently there has been a bit of discussion on the zope-dev
mailinglist about ZClasses.  To those unfamiliar with this
particular Zope 2 institution, ZClasses are a way to compose content
types (&amp;quot;classes&amp;quot;) using through-the-web (TTW) development techniques.
You would define one or more base classes, give it a name and then add
methods (= views implemented as DTML, ZPT or ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;Recently there has been a bit of &lt;a class="reference" href="http://mail.zope.org/pipermail/zope-dev/2007-April/029278.html"&gt;discussion on the zope-dev
mailinglist&lt;/a&gt; about ZClasses.  To those unfamiliar with this
particular Zope 2 institution, ZClasses are a way to compose content
types (&amp;quot;classes&amp;quot;) using through-the-web (TTW) development techniques.
You would define one or more base classes, give it a name and then add
methods (= views implemented as DTML, ZPT or PythonScripts).&lt;/p&gt;
&lt;p&gt;Among Zope developers, ZClasses have been discouraged for a while.  As
of Zope 2.9, ZClasses don't work anymore. Something broke their
fragile code.  They're officially dead.  How has it come to that?&lt;/p&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="zclasses-1000-years-of-cruft" name="zclasses-1000-years-of-cruft"&gt;ZClasses: 1000 years of cruft&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Why has nobody cared to fix ZClasses if they're so great?  Well,
because most developers first of all don't care about ZClasses (more
below), and second of all they don't understand their magical code.
In fact, one of my favourite quotes from Zope source code ever is from
ZClasses:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
def _setBasesHoldOnToYourButts(self, bases):
    # Eeeek
    copy=self.__class__(self.id, self.title, bases,
                        hasattr(self._zclass_, '_p_deactivate')
                        )
&lt;/pre&gt;
&lt;p&gt;I'll let this code speak for itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="sure-they-re-agile-but" name="sure-they-re-agile-but"&gt;Sure, they're agile, but...&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Back in 2000, ZClasses were cool because they allowed for rapid
prototyping and agile development like no other tool.  It's 7 years
later and the world has changed.  Ruby on Rails, for example, has
taught us that actual code, written in a dynamic language can also be
agile, if you enforce or at least encourage certain defaults.  Django
and TurboGears have done the same in the Python world.&lt;/p&gt;
&lt;p&gt;File system code has lots of advantages over TTW code, as I've pointed
out in an &lt;a class="reference" href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_03_27_meet-grok-successor"&gt;earlier post&lt;/a&gt;.  It is because of reasons presented in that
article that people just don't care about ZClasses anymore.  It is
also why many people in the Plone community, for instance, care less
and less about the TTW development model.  I can understand them.
Standard file-system based Python development, especially with Zope 3
components, is much more appealing to experienced developers, who
after all make up the Plone and Zope core developer teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="zope-3-the-answer-to-life-the-universe-and-everything" name="zope-3-the-answer-to-life-the-universe-and-everything"&gt;Zope 3 - the answer to life, the universe and everything?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Now Zope 3 is an incredibly powerful framework.  Jeff Shell, who
didn't always have nice things to say about it (apparently it drove
him back to smoking), &lt;a class="reference" href="http://griddlenoise.blogspot.com/2007/04/reuse-and-non-use.html"&gt;just now wrote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
We've been using Zope 3 in earnest for just over a year and a half
now. I would like to report that in that year and a half &lt;strong&gt;our
little company has achieved more re-use than at any time in our
history.&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;But Zope 3 isn't exactly known for its agility.  Those who've been
defending the TTW use case, be it some of the Plone folks or
Christopher Lozinski make a good point: how on earth is somebody going
to learn interfaces, ZCML, security declarations, etc. just to
customize a teeny bit in Plone?  Or just to write a simple application
for his boss?&lt;/p&gt;
&lt;p&gt;&amp;quot;They don't have to&amp;quot; is &lt;a class="reference" href="http://grok.zope.org"&gt;Grok&lt;/a&gt;'s answer, and the friendly caveman goes
on to say: &amp;quot;But they also don't have to give up that flexiblity given
to us by Zope 3.&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="low-bar-for-contributions" name="low-bar-for-contributions"&gt;Low bar for contributions&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This ZClasses discussion has also made me aware of another good point.
Christopher Lozinski, who's repeatedly come to the zope-dev
mailinglist, willing to contribute to ZClasses to keep them alive,
hasn't been able to write a single of code yet to so.  Why? As a
&lt;em&gt;user&lt;/em&gt; of ZClasses, it's almost impossible for him to tackle the magic
that lies in the code of ZClasses. Heck, if some core contributors
can't do it without a considerable amount of time (hence money), how
should he?&lt;/p&gt;
&lt;p&gt;With Grok, on the other hands, we now have newbies contributing to the
Grok source code itself only after a few months.  Tim Terlegard, whom
I trained in Zope 3 only a few months back at the &lt;a class="reference" href="http://worldcookery.com/Training"&gt;Lovely Training in
Copenhagen&lt;/a&gt;, has implemented JSON functionality for Grok.  Darryl
Cousins has been enhancing Grok's admin UI as well as fixing bugs and
writing tests. Kevin Smith has been looking into implementing layers
and skins. They've all been with Grok for only a few weeks or months.&lt;/p&gt;
&lt;p&gt;This is what makes me confident enough to think that we're on the
right track with Grok.&lt;/p&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_04_19_why-zclasses-dead-why</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_04_19_why-zclasses-dead-why/atom?2007_04_19_why-zclasses-dead-why"
        title="Edit Here - Why ZClasses are dead and why Grok lives" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Meet Grok, the successor of through-the-web development</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_03_27_meet-grok-successor" />
  <issued>2007-03-27T03:40:45Z</issued>
  <modified>2007-03-27T03:40:45Z</modified>
  <created>2007-03-27T03:40:43Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Zope 2</dc:subject>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">For the most part I think that through-the-web (TTW) development as we
know it from Zope 2 is a failed approach.  I understand that some
people see a lot of advantages in it, such as

non-developers apparently being very productive without having to
learn how to &amp;quot;program,&amp;quot;
the ability to develop collaboratively on one Zope instance,
restarts not being necessary,
the ability to ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;For the most part I think that through-the-web (TTW) development as we
know it from Zope 2 is a failed approach.  I understand that some
people see a lot of advantages in it, such as&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;non-developers apparently being very productive without having to
learn how to &amp;quot;program,&amp;quot;&lt;/li&gt;
&lt;li&gt;the ability to develop collaboratively on one Zope instance,&lt;/li&gt;
&lt;li&gt;restarts not being necessary,&lt;/li&gt;
&lt;li&gt;the ability to fix bugs easily in the production system without
needing shell access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I see most of those points as &lt;em&gt;dis&lt;/em&gt;advantages (except for the reload
thing, as that clearly helps with agility).  TTW development misleads
Zope beginners and tricks them into going down a very steep path
that's hard to go back.&lt;/p&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="ttw-development-vs-standard-python-development" name="ttw-development-vs-standard-python-development"&gt;TTW development vs. standard Python development&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In order to write a TTW application, you'll end up having to learn
Python, even if you're not a developer per se.  The problem is that
you don't actually use Python like it's taught in the books.  Instead
of writing functions, classes or methods in modules, you write &lt;em&gt;Python
Scripts&lt;/em&gt;, which looks like a function/method without a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;def&lt;/span&gt;&lt;/tt&gt;
statement, are compiled using a special compiler that adds lots of
security checks, and have some pre-defined top-level variables.&lt;/p&gt;
&lt;p&gt;To add obstacles to the weirdness, it's not possible to access
standard Python functionality like opening files on the filesystem or
importing a module from the standard library in TTW code, due to
security concerns.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="the-z-shaped-learning-curve" name="the-z-shaped-learning-curve"&gt;The Z-shaped learning curve&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;What happens if you hit said limitations of TTW development? You need
to convert all that code in Python Scripts to actual functions,
classes and methods on the filesystem.  This is not a trivial task,
filesystem-based code typically looks a lot different than TTW code.
People have to basically &lt;em&gt;unlearn&lt;/em&gt; what they've learned about Zope
development so far and learn this whole other way of writing so-called
&amp;quot;Products&amp;quot;.  This is why people jokingly referred to the &amp;quot;Z-shaped
learning curve&amp;quot; when it comes to learning Zope: it's not a gradual
process.&lt;/p&gt;
&lt;p&gt;Lastly, there's no automation for such a conversion, at least not for
the whole process.  There is &lt;a class="reference" href="http://plone.org/products/fsdump"&gt;FSDump&lt;/a&gt; which gets you half way, and
there's &lt;a class="reference" href="http://palladion.com/home/tseaver/software/Frostbite"&gt;Frostbite&lt;/a&gt; which gets you there but produces incomprehensible
code that's not really meant to be edited further.  Also both only
work with the CMF.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="ttw-development-vs-established-tools" name="ttw-development-vs-established-tools"&gt;TTW development vs. established tools&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;TTW development encourages working on &lt;em&gt;one&lt;/em&gt; development system, even
if you're multiple developers.  One developer can easily break the
whole application for the others and make a whole team unproductive
until the problem is fixed.  I've been there, it sucks.&lt;/p&gt;
&lt;p&gt;TTW development also makes it hard to impossible to use standard
development tools such as an IDE, source control system and even a
dead-simple thing like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;grep&lt;/span&gt;&lt;/tt&gt;.  Non-developers don't care about
this, you might say.  That makes it even worse.  TTW development
discourages using standard practices and tools such as version
control.  I've consulted on Zope projects that where 100% TTW and had
no source control.  It made me uneasy.  I wouldn't accept client
projects like that anymore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="grok-to-the-rescue" name="grok-to-the-rescue"&gt;Grok to the rescue!&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Zope 3 gets many things right in this respect.  It has pretty much
done away with TTW development which means we don't have a Z-shaped
learning curve anymore.  That's good.&lt;/p&gt;
&lt;p&gt;The problem is that Zope 3 is lacking the equivalent of TTW
development as a way to ease people into the platform.  Right now you
have to drink the kool-aid in one big gulp: Component Architecture,
interfaces, security, ZCML and much more.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference" href="http://grok.zope.org"&gt;Grok project&lt;/a&gt; addresses that problem: it lets you get started
with a Zope 3-style web application without having to learn about
interfaces, components, or any of that stuff first.  Its goal is to
bring agility back into Zope and to flatten the learning curve for
newbies.  The good thing about Grok is that it doesn't make you
unlearn things (unlike TTW development).  You can gradually improve
your Grok application and make use of interfaces, security, etc. once
you learn about them.  You don't have to throw away your old code.&lt;/p&gt;
&lt;p&gt;Furthermore, Grok code is regular filesystem-based Python code.
There's nothing funny about it.  You write functions, classes and
methods, just like that Python book taught you.  You can use your
favourite text editor.  You can check your stuff into a source control
system.&lt;/p&gt;
&lt;p&gt;Is Grok really as easy as TTW development? I believe so.  &lt;a class="reference" href="http://bud.ca"&gt;Kevin
Teague&lt;/a&gt; recently &lt;a class="reference" href="http://mail.zope.org/pipermail/grok-dev/2007-March/000514.html"&gt;shared his experience with Grok&lt;/a&gt; on the
mailinglist after writing a pastebin-like application:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Consider the plain-text Paste view:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class PastePlainView(grok.View):
    &amp;quot;Plain-text view of a single Paste&amp;quot;
    grok.context(Paste)
    grok.name('plain')

    def render(self):
        return self.context.body
&lt;/pre&gt;
&lt;p&gt;Where in Zope 2 I might write:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
## Script (Python) &amp;quot;pastePlainText&amp;quot;
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=Plain-text view of a single Paste

return context.body
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Grok version doesn't seem to be harder to write as the TTW version
from Zope 2.  Au contraire, the Grok version is something that
somebody familiar with Python will immediately understand.  &lt;strong&gt;Meet
Grok, the successor of TTW development.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_03_27_meet-grok-successor</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_03_27_meet-grok-successor/atom?2007_03_27_meet-grok-successor"
        title="Edit Here - Meet Grok, the successor of through-the-web development" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Gone to USA, Mexico for 1 month</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_02_24_gone-to-usa-mexico-for-1" />
  <issued>2007-02-24T22:33:17Z</issued>
  <modified>2007-02-24T22:33:17Z</modified>
  <created>2007-02-24T22:29:52Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Personal</dc:subject>
  
  
      <dc:subject>Zope Community</dc:subject>
  
  
  <summary type="text/html" mode="escaped">I'm leaving for a 1 month trip thru Eastern USA and Mexico next week. Some
  cities I'll be stopping by:
   
   

  
   Boston, MA

   Zope Town a.k.a. F12g a.k.a. F'burg a.k.a. Fredericksburg, VA

   Washington D.C. (to speak about 
   grok at the March meeting of
   the Zope/Python Users Group of D.C.)
   

   Chapel Hill, NC (to give the Camp5 Zope 3 training and
   attend the ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">I'm leaving for a 1 month trip thru Eastern USA and Mexico next week. Some
  cities I'll be stopping by:&lt;br /&gt;
   &lt;br /&gt;
   

  &lt;ul&gt;
   &lt;li&gt;Boston, MA&lt;/li&gt;

   &lt;li&gt;Zope Town a.k.a. F12g a.k.a. F'burg a.k.a. Fredericksburg, VA&lt;/li&gt;

   &lt;li&gt;Washington D.C. (to speak about &lt;a
   href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_01_09_you-thought-zope-3-wasn"&gt;
   grok&lt;/a&gt; at the &lt;a href="http://zpugdc.org/meetings/mtg49"&gt;March meeting of
   the Zope/Python Users Group of D.C.&lt;/a&gt;)&lt;br /&gt;
   &lt;/li&gt;

   &lt;li&gt;Chapel Hill, NC (to give the &lt;a
   href="http://trizpug.org/boot-camp/camp5"&gt;Camp5 Zope 3 training&lt;/a&gt; and
   attend the &lt;a href="http://www.openplans.org/projects/bbq-sprint"&gt;BBQ
   sprint&lt;/a&gt;)&lt;br /&gt;
   &lt;/li&gt;

   &lt;li&gt;Guadalajara, Jalisco, Mexico&lt;/li&gt;

   &lt;li&gt;Mexico D.F.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;br /&gt;
   If you happen to live or be in any of these places and wanna meet up for a
  beer, &lt;a href="mailto:philikon@philikon.de"&gt;drop me a line&lt;/a&gt; :)&lt;br /&gt;
   &lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_02_24_gone-to-usa-mexico-for-1</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_02_24_gone-to-usa-mexico-for-1/atom?2007_02_24_gone-to-usa-mexico-for-1"
        title="Edit Here - Gone to USA, Mexico for 1 month" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Good time to get into Zope</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_02_20_it-s-good-time-to-be" />
  <issued>2007-02-20T16:16:24Z</issued>
  <modified>2007-02-20T16:16:24Z</modified>
  <created>2007-02-20T15:53:12Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
      <dc:subject>Zope Community</dc:subject>
  
  
  <summary type="text/html" mode="escaped">The Zope and Plone community is looking for more talented developers. 
  It's not a secret that virtually every Plone consultant is booked out in
  advance for several months. But it's not only a good time to get into Plone,
  it's also a good time to get into Zope 3. That's not just because Plone is
  adopting Zope 3 technology on a large basis (I'm really excited about
  Plone 3.0 in that ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">The Zope and Plone community is looking for more talented developers. &lt;a
  href="http://theploneblog.org/blog/archive/2006/09/29/right-time-to-be-a-plone-developer"&gt;
  It's not a secret&lt;/a&gt; that virtually every Plone consultant is booked out in
  advance for several months. But it's not only a good time to get into Plone,
  it's also a good time to get into Zope 3. That's not just because Plone is
  adopting Zope 3 technology on a large basis (I'm &lt;i&gt;really&lt;/i&gt; excited about
  Plone 3.0 in that respect, by the way). It's also because Zope companies
  like &lt;a href="http://www.zope.com/about_us/careers.html"&gt;Zope
  Corporation&lt;/a&gt;, &lt;a
  href="https://members.zope.de/Members/ctheune/softwareentwickler-m-w/"&gt;gocept&lt;/a&gt;,
  &lt;a
  href="http://plone.org/events/conferences/seattle-2006/presentations/rest-in-peace.pdf"&gt;
  Lovely Systems&lt;/a&gt;, and &lt;a
  href="http://mail.zope.org/pipermail/zope3-users/2007-February/005514.html"&gt;others&lt;/a&gt;
  are looking for dedicated Zope 3 experts to hire.&lt;br /&gt;
   &lt;br /&gt;
   To make sure that there are enough experts in the Plone community, people
  like &lt;a href="http://plonebootcamps.com/"&gt;Joel Burton&lt;/a&gt; are giving
  trainings on Plone. This is good, but apparently not enough. We need more of
  such trainings, especially dedicated to Zope 3 technologies, to ensure we
  can actually deliver Zope and Plone solutions to our customers. Because if
  we don't have enough manpower to do so, they're going some place else. This
  is why I'm very excited that people like Sasha Vincic of Lovely Systems and
  Chris Calloway of the Triangle Zope User Group are organizing &lt;a
  href="http://worldcookery.com/Training"&gt;Zope 3 trainings&lt;/a&gt; (in which I
  have the honour of playing the trainer role). &lt;a
  href="http://trizpug.org/boot-camp/camp5"&gt;The next training in America&lt;/a&gt;
  is coming up soon in March, one in Europe is planned for May.&lt;br /&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_02_20_it-s-good-time-to-be</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_02_20_it-s-good-time-to-be/atom?2007_02_20_it-s-good-time-to-be"
        title="Edit Here - Good time to get into Zope" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">And you thought Zope 3 wasn't fun</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_01_09_you-thought-zope-3-wasn" />
  <issued>2007-03-23T20:59:17Z</issued>
  <modified>2007-03-23T20:59:17Z</modified>
  <created>2007-01-09T20:08:10Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Python</dc:subject>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">If you think that Zope 3, or even Zope in general, isn't fun, agile,
developer-friendly, easily understandable or &amp;quot;Pythonic&amp;quot;, enter Grok.
Here's an excerpt from Grok's README file:

Grok uses the Component Architecture and builds on Zope 3 concepts
like content objects (models), views, and adapters.  Its simplicity
lies in using convention over configuration and sensible
defaults ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;If you think that Zope 3, or even Zope in general, isn't fun, agile,
developer-friendly, easily understandable or &amp;quot;Pythonic&amp;quot;, enter &lt;a class="reference" href="http://grok.zope.org"&gt;Grok&lt;/a&gt;.
Here's an excerpt from Grok's README file:&lt;/p&gt;
&lt;blockquote&gt;
Grok uses the Component Architecture and builds on Zope 3 concepts
like content objects (models), views, and adapters.  Its simplicity
lies in using &lt;strong&gt;convention over configuration&lt;/strong&gt; and &lt;strong&gt;sensible
defaults&lt;/strong&gt; when wiring components together.  That means neither a
configuration language like ZCML nor a lot of repitition are needed
to create a web application with grok.&lt;/blockquote&gt;
&lt;p&gt;For the last couple of months, Grok has been developed by a handful of
Zope 3 core developers.  Like &lt;a class="reference" href="http://codespeak.net/z3/five"&gt;Five&lt;/a&gt; and &lt;a class="reference" href="http://codespeak.net/lxml"&gt;lxml&lt;/a&gt;, Grok was originally
thought up by Martijn Faassen at the EuroPython 2006 sprint.  After we
gave some input to Martijn's early design notes, five of us met for a
&lt;a class="reference" href="http://www.gocept.com/gocept-de/aktivitaeten/community/grok-sprint"&gt;first Grok sprint&lt;/a&gt; in October.  This past weekend I had the pleasure
of hosting the &lt;a class="reference" href="http://faassen.n--tree.net/blog/view/weblog/2007/01/09/0"&gt;second Grok sprint&lt;/a&gt;.  A first release is only a few
weeks away, with a 1.0 scheduled some time in the second quarter this
year (after a third sprint).&lt;/p&gt;
&lt;p&gt;Since there have been several blog articles mentioning Grok and its
philosophy already, I'd like to answer a FAQ that I get from
developers:&lt;/p&gt;
&lt;blockquote&gt;
So what does Grok code look like?&lt;/blockquote&gt;
&lt;p&gt;Imagine a simple web application for managing a herd of mammoths. For
the sake of simplicity, we only support adding a mammoth to the herd
and searching for it afterwards (more functionality like listing all
mammoths in the database or deleting mammoths can be added with few
lines of code).  Data persistence will be provided automatically and
transparently by the ZODB.  The searching will facilitate the Zope
Catalog utility.  All of this fits into one Python module:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;quot;&amp;quot;&amp;quot;
herd.py -- grok-based web application for managing mammoths
&amp;quot;&amp;quot;&amp;quot;
import grok
from zope import schema, interface, component
from zope.app.intid import IntIds
from zope.app.intid.interfaces import IIntIds
from zope.app.catalog.catalog import Catalog
from zope.app.catalog.interfaces import ICatalog
from zope.app.catalog.field import FieldIndex

def setup_catalog(catalog):
    catalog['name'] = FieldIndex('name', IMammoth) # only index mammoths

class Herd(grok.Application, grok.Container):
    &amp;quot;&amp;quot;&amp;quot;Root application object and container for Mammoth objects.
    Also sets up a catalog with a field index for indexing mammoths.&amp;quot;&amp;quot;&amp;quot;

    grok.local_utility(IntIds, provides=IIntIds) # necessary for catalog
    grok.local_utility(Catalog, provides=ICatalog, setup=setup_catalog)


class HerdIndex(grok.View):
    &amp;quot;&amp;quot;&amp;quot;Default view for herd objects.  It lets you search for mammoths
    inside the herd and add new mammoths.

    Actual HTML rendering by herd_templates/herdindex.pt (which is
    automatically found according to the name of this Python module
    and the name of this view class)&amp;quot;&amp;quot;&amp;quot;

    grok.context(Herd) # indicates which model the view is for
    grok.name('index') # URL name of the view

    def update(self):
        &amp;quot;&amp;quot;&amp;quot;This method is executed before the template is rendered.
        It allows us to perform operations such as processing request
        parameters or precomputing stuff that the template may need.&amp;quot;&amp;quot;&amp;quot;
        query = self.request.form.get('query')
        if not query:
            return
        catalog = component.getUtility(ICatalog)
        self.search_results = catalog.searchResults(name=(query, query))


class IMammoth(interface.Interface):
    &amp;quot;&amp;quot;&amp;quot;Data schema for mammoths&amp;quot;&amp;quot;&amp;quot;

    name = schema.TextLine(
        title=u'Name',
        description=u'Name of the Mammoth',
        )

class Mammoth(grok.Model):
    grok.implements(IMammoth)

    def __init__(self, name):
        self.name = name # this attribute will be indexed by the FieldIndex


class AddMammoth(grok.AddForm):
    &amp;quot;&amp;quot;&amp;quot;Form that creates a new mammoth.&amp;quot;&amp;quot;&amp;quot;
    grok.context(Herd)

    form_fields = grok.Fields(id=schema.TextLine(title=u&amp;quot;URL name&amp;quot;))
    form_fields += grok.AutoFields(IMammoth) # deduce form fields from schema

    &amp;#64;grok.action('Add mammoth')
    def add(self, id, name):
        self.context[id] = Mammoth(name)
        self.redirect(self.url(self.context))

&lt;/pre&gt;
&lt;p&gt;The HTML of the default view for herds is rendered by the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;herdindex.pt&lt;/span&gt;&lt;/tt&gt; template.  By putting it in the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;herd_templates&lt;/span&gt;&lt;/tt&gt;
directory, it will be picked up automatically and associated with the
view class in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;herd.py&lt;/span&gt;&lt;/tt&gt; according to the name of the template file
and the name of the view class:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;html&amp;gt; &amp;lt;!-- herd_templates/herdindex.pt --&amp;gt;
&amp;lt;body tal:define=&amp;quot;results view/search_results|nothing&amp;quot;&amp;gt;

&amp;lt;div&amp;gt;
  &amp;lt;h3&amp;gt;Search for a mammoth:&amp;lt;/h3&amp;gt;
  &amp;lt;form tal:attributes=&amp;quot;action view/url&amp;quot;&amp;gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;query&amp;quot; /&amp;gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search for mammoth&amp;quot; /&amp;gt;
  &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div tal:condition=&amp;quot;results&amp;quot;&amp;gt;
  &amp;lt;h3&amp;gt;Search results:&amp;lt;/h3&amp;gt;
  &amp;lt;ul&amp;gt;
    &amp;lt;li tal:repeat=&amp;quot;mammoth results&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;&amp;quot;
         tal:attributes=&amp;quot;href python:view.url(mammoth)&amp;quot;
         tal:content=&amp;quot;mammoth/name&amp;quot;&amp;gt;
        mammoth name goes here
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;a href=&amp;quot;&amp;quot; tal:attributes=&amp;quot;href python:view.url('addmammoth')&amp;quot;&amp;gt;
    Add a mammoth
  &amp;lt;/a&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/pre&gt;
&lt;p&gt;That's it! That's the whole application! The only teeny bit of ZCML
that we need is for registering the application with Zope 3:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;grok:grok package=&amp;quot;herd&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This will tell Grok to &amp;quot;grok&amp;quot; the components we defined and register
them accordingly.  No ZCML or any other configuration needed.  Just
take it out of the box and have fun.  (I should note though that
currently, this example will require some ZCML so that the initial
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Herd&lt;/span&gt;&lt;/tt&gt; container can be created.  We hope to solve that problem by
the first release or the 1.0)&lt;/p&gt;
&lt;p&gt;And you thought Zope 3 wasn't fun? We're just warming up!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; After receiving lots of feedback, particularly about the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;before()&lt;/span&gt;&lt;/tt&gt; method on grok views, we decided to rename &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;before()&lt;/span&gt;&lt;/tt&gt;
to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;update()&lt;/span&gt;&lt;/tt&gt; in an attempt to make the name less confusing and more
similar to existing Zope 3 idioms.  &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;update()&lt;/span&gt;&lt;/tt&gt; can now also issue a
redirect which will cause the template not to be rendered
subsequently.  Thanks to &lt;a class="reference" href="http://optilude.wordpress.com/"&gt;Martin Aspeli&lt;/a&gt; for suggesting that.  The
code snippet above has been changed accordingly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Grok now has an &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Application&lt;/span&gt;&lt;/tt&gt; base class for an
application's root object, so I updated the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Herd&lt;/span&gt;&lt;/tt&gt; class to use
that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 3:&lt;/strong&gt; Grok now has a web site at &lt;a class="reference" href="http://grok.zope.org"&gt;http://grok.zope.org&lt;/a&gt;!&lt;/p&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2007_01_09_you-thought-zope-3-wasn</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2007_01_09_you-thought-zope-3-wasn/atom?2007_01_09_you-thought-zope-3-wasn"
        title="Edit Here - And you thought Zope 3 wasn't fun" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Zope 3 benchmark revisited: PowerBook vs. MacBook Pro</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2006_11_30_zope-3-benchmark" />
  <issued>2007-01-08T23:22:49Z</issued>
  <modified>2007-01-08T23:22:49Z</modified>
  <created>2006-11-30T03:38:45Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Miscellania</dc:subject>
  
  
      <dc:subject>Zope 3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">After a little more than two and a half years, I retired my PowerBook
G4 and got myself a brandnew MacBook Pro.  While I was at the Plone
Conference in Seattle, Apple had finally upgraded the MacBook Pro to
the Core 2 Duo.  I had been waiting for that upgrade to happen, not
only for performance reasons, but also because I was betting that they
would upgrade other things along with it -- and ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;After a little more than two and a half years, I retired my PowerBook
G4 and got myself a brandnew MacBook Pro.  While I was at the Plone
Conference in Seattle, Apple had finally upgraded the MacBook Pro to
the Core 2 Duo.  I had been waiting for that upgrade to happen, not
only for performance reasons, but also because I was betting that they
would upgrade other things along with it -- and they did (FireWire
800, better DVD burner).  With the MacBook Pro line being over half a
year old, I was now also confident enough to buy it after the hardware
trouble they had with those machines initially.&lt;/p&gt;
&lt;p&gt;Back in April when I bought my folks a Mac mini, I compared my
PowerBook G4 to the slowest Intel Mac avaiable and found that the Mac
mini was basically twice as fast in processor speed.  Now I tried to
reproduce the same &amp;quot;benchmark&amp;quot; that I did back then with the MBP:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
==============  ===================  =======================  =========================
                     PowerBook              Mac mini                 MacBook Pro
==============  ===================  =======================  =========================
processor       PowerPC G4 1.33 GHz  Intel Core Solo 1.5 GHz  Intel Core 2 Duo 2.33 GHz
RAM             1 GiB                512 MiB                  2 GiB
harddisk        80 GB ATA 5400 rpm   60 GB SATA 5400 rpm      80 GB SATA 5400 rpm
--------------  --------------------------------------------  -------------------------
OS              Mac OS X 10.4.5 with latest security patches  Mac OS X 10.4.8
python                    2.4.2 from darwinports              2.4.3 from darwinports
zope 3                         trunk, r66263                  (same)
--------------  --------------------------------------------  -------------------------
pystone 1.1              19800 py/s               34700 py/s                 58800 py/s
--------------  -------------------  -----------------------  -------------------------
compile[1]                     77 s                     52 s                       27 s
1st startup[2]                 63 s                     25 s                       22 s
2nd startup[3]                 21 s                      8 s                        5 s
--------------  -------------------  -----------------------  -------------------------
unit tests[4]                 344 s                    173 s                      105 s
ftests setup                   25 s                     11 s                        5 s
       run                    610 s                    245 s                      160 s
==============  ===================  =======================  =========================
&lt;/pre&gt;
&lt;table class="docutils footnote" frame="void" id="id1" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a name="id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;make&lt;/span&gt;&lt;/tt&gt; command, measured via Unix &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;time&lt;/span&gt;&lt;/tt&gt;, real time shown.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a name="id2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;z3.py&lt;/span&gt;&lt;/tt&gt; command after having done &amp;quot;something else&amp;quot; (Zope 3
files not in disk cache); time measurement by Zope 3 startup
machinery, real time shown.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id3" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a name="id3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;z3.py&lt;/span&gt;&lt;/tt&gt; command right after having terminated the first one;
time measurements as above.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id4" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a name="id4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;test.py&lt;/span&gt; &lt;span class="pre"&gt;-p&lt;/span&gt; &lt;span class="pre"&gt;--all&lt;/span&gt;&lt;/tt&gt; command, time measurement by the test
runner.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ignoring tasks that obviously max out due to the harddrive (1st
startup), it seems that the MacBook Pro is somewhere between 1.5 to 2
times faster than the Mac mini, making it 3 to 4 times faster than the
PowerBook.&lt;/p&gt;
&lt;p&gt;Of course, the MacBook has other advantages just besides the amazing
speed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;2 GiB of RAM speed up the system considerably when many applications
are running in parallel.  Considering that I almost never quit apps,
this improves overall productivity a lot.&lt;/li&gt;
&lt;li&gt;It's an Intel machine, which means I can use Parallels to boot
Windows XP (e.g. to test Python software on this platform, check
websites in IE, make screenshots for documentation) and Linux (use
valgrind to debug nasty C code).  &lt;a class="reference" href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2006_11_30_how-to-install-ie6-on"&gt;I can also use WINE to run IE6 on
OS X directly&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It's noticeably lighter than the PowerBook.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall I'm impressed by how smooth Apple made the transition to the
Intel platform.  A year and a half after they announced the switch to
Intel, and half as much time after the first Intel-based product came
out, all applications that I need are available as native binaries.
There were no problems migrating the system whatsoever, even though I
resisted the temptation of having all my files copied over, I didn't
need more than an afternoon of setting up the new machine and copying
over my home directory via FireWire.&lt;/p&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2006_11_30_zope-3-benchmark</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2006_11_30_zope-3-benchmark/atom?2006_11_30_zope-3-benchmark"
        title="Edit Here - Zope 3 benchmark revisited: PowerBook vs. MacBook Pro" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">How to install IE6 on Mac OS X (Intel)</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2006_11_30_how-to-install-ie6-on" />
  <issued>2007-01-08T23:23:13Z</issued>
  <modified>2007-01-08T23:23:13Z</modified>
  <created>2006-11-30T01:51:20Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Miscellania</dc:subject>
  
  
  <summary type="text/html" mode="escaped">With the advent of my gorgeous new MacBook Pro, I obviously want to
take advantage of having an Intel-based machine.  One of those
advantages is executing Windows binaries using Wine.
Now, I've got Parallels set up with Windows XP and Ubuntu Linux,
allowing me to test things in foreign browsrs like IE and Konqueror
quite easily.  However, those VMs are on an external hard drive (due
to ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;With the advent of my gorgeous new MacBook Pro, I obviously want to
take advantage of having an Intel-based machine.  One of those
advantages is executing Windows binaries using Wine.&lt;/p&gt;
&lt;p&gt;Now, I've got Parallels set up with Windows XP and Ubuntu Linux,
allowing me to test things in foreign browsrs like IE and Konqueror
quite easily.  However, those VMs are on an external hard drive (due
to their size) and may not always be required if you're just checking
whether something renders correctly in IE or not.  The approach
discussed here only needs approximatly 150 MiB and integrates IE6 as
an X11 window.&lt;/p&gt;
&lt;p&gt;Here's how I got IE6 running &amp;quot;natively&amp;quot; on OS X:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Install prerequisites:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;XCode &lt;strong&gt;including&lt;/strong&gt; the X11 SDK (which didn't seem to be
installed with a default XCode installation).  Both are on the
DVD that came with the machine.  Oh, and you need X11 itself as
well, of course.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference" href="http://macports.org"&gt;MacPorts&lt;/a&gt; (formerly known as &lt;a class="reference" href="http://darwinports.opendarwin.org/"&gt;DarwinPorts&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Install necessary ports (using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;port&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;/tt&gt;):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;freetype&lt;/span&gt;&lt;/tt&gt; (needed by WINE)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fontforge&lt;/span&gt;&lt;/tt&gt; (needed by WINE)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;wget&lt;/span&gt;&lt;/tt&gt; (needed by ies4linux)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cabextract&lt;/span&gt;&lt;/tt&gt; (needed by ies4linux)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Get &lt;a class="reference" href="http://winehq.com"&gt;WINE&lt;/a&gt; sources and compiled them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;I know there's &lt;a class="reference" href="http://darwine.opendarwin.org"&gt;Darwine&lt;/a&gt; which aims at integrating WINE nicely
into OSX (you can double click on an .exe), but it's not
sufficient for &lt;a class="reference" href="http://www.tatanka.com.br/ies4linux/page/Main_Page"&gt;ies4linux&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Add &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/usr/X11R6/bin&lt;/span&gt;&lt;/tt&gt; to your &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;PATH&lt;/span&gt;&lt;/tt&gt;, without it the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/tt&gt; script doesn't seem to find the OpenGL headers
(yeah, it sounds weird, but trust me):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
export PATH=$PATH:/usr/X11R6/bin
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Execute the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/tt&gt; script.  If it complains about any
libraries missing even though you installed the corresponding
ports, try pointing it to the right library and include paths
manually:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
export CPPFLAGS=-I/opt/local/include
export LDFLAGS=-L/opt/local/lib
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;When there are no complaints about missing stuff from
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/tt&gt;, execute &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;make&lt;/span&gt; &lt;span class="pre"&gt;depend&lt;/span&gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;make&lt;/span&gt;&lt;/tt&gt; and finally
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;make&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Try out WINE by executing one of the simple Windows programs like
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;NOTEPAD.EXE&lt;/span&gt;&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
wine NOTEPAD.EXE
&lt;/pre&gt;
&lt;p&gt;If it complaints about freetype not being available, try
symlinking the libraries to a place where WINE can find them,
e.g.:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo ln -s /opt/local/lib/libfreetype.* /usr/local/lib
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Get &lt;a class="reference" href="http://www.tatanka.com.br/ies4linux/page/Main_Page"&gt;ies4linux&lt;/a&gt; and install it by simply executing the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ies4linux&lt;/span&gt;&lt;/tt&gt;
script.  It will guide you through the setup and automatically
download IE6 and set it up.  Note that I did not try installing IE7
yet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Update: Screenshot&lt;/strong&gt;&lt;/p&gt;
&lt;a href="http://worldcookery.com/Private/ie6osx.png"&gt;&lt;img alt="http://worldcookery.com/Private/ie6osx.png" src="http://worldcookery.com/Private/ie6osx.png" style="width: 274px; height: 236px;" /&gt;&lt;/a&gt;</content>

  <id>tag:www.z3lab.org:sections:blogs:philipp-weitershausen:2006_11_30_how-to-install-ie6-on</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2006_11_30_how-to-install-ie6-on/atom?2006_11_30_how-to-install-ie6-on"
        title="Edit Here - How to install IE6 on Mac OS X (Intel)" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Encrypting part of your $HOME on Mac OS X</title>
  <link rel="alternate" type="text/html"
        href="http://www.z3lab.org/sections/blogs/philipp-weitershausen/2006_11_22_encrypting-part-your" />
  <issued>2007-01-08T23:20:07Z</issued>
  <modified>2007-01-08T23:20:07Z</modified>
  <created>2006-11-22T14:27:19Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>philikon</name>
  </author>
  
  
      <dc:subject>Miscellania</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Let's face it, you always end up having sensitive data on your laptop.
If you ever have your laptop stolen (and I have!), this sensitive data
may fall into the wrong hands.  It's not that I carry nuclear missile
launch codes around with me, but thinking that a simple laptop thief
may easily access

VPN keys that for accessing customer networks,
customer code that I have signed NDAs ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">&lt;p&gt;Let's face it, you always end up having sensitive data on your laptop.
If you ever have your laptop stolen (and I have!), this sensitive data
may fall into the wrong hands.  It's not that I carry nuclear missile
launch codes around with me, but thinking that a simple laptop thief
may easily access&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;VPN keys that for accessing customer networks,&lt;/li&gt;
&lt;li&gt;customer code that I have signed NDAs for,&lt;/li&gt;
&lt;li&gt;print-ready PDFs of my book that might eventually circulate eMule,&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;does scare me a bit.  If you're thinking that laptop thieves perhaps
don't have enough technical expertise to take advantage of this data,
how about the fact that my home address is printed on all invoices I
send out, and that I keep on my harddrive electronic invoices of my
new MacBook Pro, a 24&amp;quot; widescreen and various other gadgets as well? I
get my laptop stolen and the thief might decide to come back for
another &amp;quot;shopping tour.&amp;quot;  Perhaps he can even deduce from the
electronic plane tickets when I'm on a business trip and take all the
time he needs to break into my appartment.&lt;/p&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="filevault" name="filevault"&gt;FileVault&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Mac OS X comes with a built-in system to encrypt your whole home
directory with a pass-phrase.  It's called &lt;em&gt;FileVault&lt;/em&gt;.  The
integration is seamless and you won't notice that your files actually
live inside an encrypted disk image.  That's very nice.  The problems
with this approach are the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I have shitloads of other data in my home directory that doesn't
need to be encrypted at all: mp3s, movies, tons of checkouts of open
source software, etc.  Encrypting those would be a waste of CPU
cycles.&lt;/li&gt;
&lt;li&gt;When I make a backup, I want to back up the encrypted form, not the
raw form.  Otherwise somebody would just have to get a hold of my
backup (e.g. the backup disk I carry around in the same bag as the
laptop...).&lt;/li&gt;
&lt;li&gt;Being logged in automatically means having access to the encrypted
data.  Sometimes I would like to be logged in to let others have
access to the machine (e.g. during repairs, parties, sprints, etc.)
and NOT risk sensitive data to be accessible.  Sure, in most of
those cases it'd be possible to create a new user account and be
logged in there, but that's typically a major hassle.  Wouldn't it
be easier if I could simply lock down parts of my home dir for a
while?&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="encrypted-disk-image" name="encrypted-disk-image"&gt;Encrypted disk image&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Mac OS X supports a particular form of &amp;quot;loop devices&amp;quot; called disk
images.  These are files that look like a regular disk device: They
contain an (Apple) partition map and an HFS or UDF partition.  There
are several neat things about these disk images:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;they're resizable&lt;/li&gt;
&lt;li&gt;they support a SPARSE mode in which the image grows as it needs and
doesn't occupy its defined size&lt;/li&gt;
&lt;li&gt;there's an on-the-fly compression available&lt;/li&gt;
&lt;li&gt;they support on-the-fly AES encryption&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So much for the well-known features of DMGs.  One of the lesser known
features is that when Mac OS X &amp;quot;attaches&amp;quot; an image, it represents it
as an actual disk block device unter /dev/, so you can mount it
practically anywhere you like -- not necessarily under /Volumes/ where
double-clicking on an image would normally mount it.&lt;/p&gt;
&lt;p&gt;My idea was to designate a certain directory within my home directory
as a &amp;quot;secure&amp;quot; area.  This directory would in fact be a mount point for
an encrypted DMG.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="creating-an-encrypted-sparse-image" name="creating-an-encrypted-sparse-image"&gt;Creating an encrypted sparse image&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The image can be created using Mac OS X's excellent command line
toolbox:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
hdiutil create \
    -encryption -stdinpass \
    -type SPARSE -fs HFS+J \
    -volname Secure \
    -size 100g \
    Secure.sparseimage
&lt;/pre&gt;
&lt;p&gt;Note that the 100 GiB size limit here is purely theoretical as the
image is of type SPARSE, which means it starts with practically 0
Bytes of size and grows as it needs.  And even if it had to grow
larger than 100 GiB, you could always resize it quite easily.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;h1&gt;&lt;a id="mounting-the-image-inside-the-home-directory" name="mounting-the-image-inside-the-home-directory"&gt;Mounting the image inside the home directory&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Instead of double-clicking on the image, use the following command to
attach the DMG to a disk d