<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Mellow Morning</title>
	
	<link>http://www.mellowmorning.com</link>
	<description>Blogging the world of IT and Business</description>
	<lastBuildDate>Mon, 08 Jun 2009 12:30:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/MellowMorning" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">MellowMorning</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>New YouTellMe release</title>
		<link>http://www.mellowmorning.com/2009/06/08/new-youtellme-release/</link>
		<comments>http://www.mellowmorning.com/2009/06/08/new-youtellme-release/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 12:29:36 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[YouTellMe]]></category>
		<category><![CDATA[product comparison]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=98</guid>
		<description><![CDATA[We have been rolling out some awesome new features at YouTellMe.nl. The new version of the comparison system allows for the most flexible product comparison queries. Furthermore we now fully support product variations with easy selectors during price comparison.
Read the full story (in Dutch)
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.mellowmorning.com/wp-content/themes/integral-11/images/ytm_logo.png" style="float: left; padding:5px;" />We have been rolling out some awesome new features at YouTellMe.nl. The <a href="http://www.youtellme.nl/vergelijk/flatscreen_televisies/">new version of the comparison system</a> allows for the most flexible product comparison queries. Furthermore we now fully support product variations with <a href="http://www.youtellme.nl/digitale_cameras/562165_canon-digital-ixus-95-is/prices">easy selectors during price comparison</a>.</p>
<p><a href="http://www.youtellme.nl/content/youtellme-product-varianten-en-dynamischer-vergelijken/">Read the full story (in Dutch)</a></p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/xFdYURgGw7c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2009/06/08/new-youtellme-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YouTellMe @ Marketing Facts</title>
		<link>http://www.mellowmorning.com/2009/02/03/youtellme-marketing-facts/</link>
		<comments>http://www.mellowmorning.com/2009/02/03/youtellme-marketing-facts/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 13:09:04 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Dutch]]></category>
		<category><![CDATA[YouTellMe]]></category>
		<category><![CDATA[marketing facts]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=91</guid>
		<description><![CDATA[Marketing Facts just published their video interview with our co-founder Joost Nauta. If your Dutch is fluent go ahead and take a look:

Interview John Nauta (YouTellMe) from mfredactie on Vimeo.
Thanks to all the FrankWatching readers for the positive feedback on the previous article.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.marketingfacts.nl/berichten/20090203_productvergelijker_youtellme_wij_gaan_kieskeurig_verslaan/">Marketing Facts</a> just published their video interview with our co-founder Joost Nauta. If your Dutch is fluent go ahead and take a look:</p>
<p><object width="550" height="415" data="http://vimeo.com/moogaloop.swf?clip_id=3059502&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=3059502&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /></object><br />
<a href="http://vimeo.com/3059502">Interview John Nauta (YouTellMe)</a> from <a href="http://vimeo.com/user653314">mfredactie</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Thanks to all the <a href="http://www.frankwatching.com/archive/2009/01/05/site-gespot-youtellmenl/?st=1">FrankWatching</a> readers for the positive feedback on the previous article.</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/bGuWL1WOkIo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2009/02/03/youtellme-marketing-facts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Congrats to Ebuddy for winning the Crunchies!</title>
		<link>http://www.mellowmorning.com/2009/01/10/congrats-to-ebuddy-for-winning-the-crunchies/</link>
		<comments>http://www.mellowmorning.com/2009/01/10/congrats-to-ebuddy-for-winning-the-crunchies/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 16:49:06 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=87</guid>
		<description><![CDATA[I just noticed that Ebuddy has won the best international award at the Crunchies. Awesome to see a Dutch startup win it :) Go over to Ebuddy and congratulate them! (Found through NextWeb)
]]></description>
			<content:encoded><![CDATA[<p>I just noticed that Ebuddy has won the best international award at the <a href="http://www.techcrunch.com/2009/01/10/congratulations-to-the-crunchies-winners-facebook-takes-top-prize-for-second-year/" target="_blank">Crunchies</a>. Awesome to see a Dutch startup win it :) Go over to <a href="http://blog.ebuddy.com/index.php/blogroll/rock-the-vote-ebuddy-for-best-international-company/" target="_self">Ebuddy</a> and congratulate them! (Found through <a href="http://thenextweb.com/2009/01/10/ebuddy-wins-crunchie-for-best-international-startup/#comments" target="_blank">NextWeb</a>)</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/KiSu2STHB4I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2009/01/10/congrats-to-ebuddy-for-winning-the-crunchies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YouTellMe in Frankwatching</title>
		<link>http://www.mellowmorning.com/2009/01/05/youtellme-in-frankwatching/</link>
		<comments>http://www.mellowmorning.com/2009/01/05/youtellme-in-frankwatching/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 12:10:33 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[YouTellMe]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=83</guid>
		<description><![CDATA[YouTellMe has been progressing at insane development speeds. We&#8217;re slowly starting to search for some initial PR. Feedback has been great so far. Frankwatching just posted about us in their &#8220;Site Gespot&#8221; section. Im looking forward to the feedback from the Frankwatching audience. If you&#8217;re Dutch is fluent have a look at: frankwatching.
]]></description>
			<content:encoded><![CDATA[<p>YouTellMe has been progressing at insane development speeds. We&#8217;re slowly starting to search for some initial PR. Feedback has been great so far. Frankwatching just posted about us in their &#8220;Site Gespot&#8221; section. Im looking forward to the feedback from the Frankwatching audience. If you&#8217;re Dutch is fluent have a look at: <a title="frankwatching" href="http://www.frankwatching.com/archive/2009/01/05/site-gespot-youtellmenl/?st=1#poll" target="_blank">frankwatching</a>.</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/BpsgigIHBts" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2009/01/05/youtellme-in-frankwatching/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django template tags – Google chart – python 2.4 port</title>
		<link>http://www.mellowmorning.com/2009/01/02/django-template-tags-google-chart-python-24-port/</link>
		<comments>http://www.mellowmorning.com/2009/01/02/django-template-tags-google-chart-python-24-port/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 22:53:28 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=75</guid>
		<description><![CDATA[I just tried the django template tags for the google charting api by Jacob. Unfortunately they were python 2.5 only and I happen to still be stuck to 2.4. The changes to move it to 2.4 were minimal though. Still to save some of you googlers out there the hassle:
charts
I was just browsing the code [...]]]></description>
			<content:encoded><![CDATA[<p>I just tried the django template tags for the <a href="http://jeffcroft.com/links/2008/feb/19/google-charts-template-tags-for-django/" target="_blank">google charting api by Jacob</a>. Unfortunately they were python 2.5 only and I happen to still be stuck to 2.4. The changes to move it to 2.4 were minimal though. Still to save some of you googlers out there the hassle:</p>
<p><a href="http://www.mellowmorning.com/wp-content/uploads/2009/01/charts.py">charts</a></p>
<p>I was just browsing the code a bit. There is something peculiar there:</p>
<p>args, varargs, varkw, defaults = inspect.getargspec(func)</p>
<p>I don&#8217;t get the point of using the inspect functionality. Anyone care to explain?</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/IVwuc8z_iBU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2009/01/02/django-template-tags-google-chart-python-24-port/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Open Coffee Amsterdam</title>
		<link>http://www.mellowmorning.com/2009/01/02/open-coffee-amsterdam/</link>
		<comments>http://www.mellowmorning.com/2009/01/02/open-coffee-amsterdam/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 22:42:02 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[YouTellMe]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=73</guid>
		<description><![CDATA[Two months ago YouTellMe moved to the beautifull Keizersgracht in Amsterdam. With the crazy work schedules any entrepreneurs lives by, we didn&#8217;t really get to enjoy the city yet. In fact, I went to more Amsterdam based events when the company was still in Rotterdam.
This Thursday my fellow YTM entrepreneurs and me will be visiting [...]]]></description>
			<content:encoded><![CDATA[<p>Two months ago <a href="http://www.youtellme.nl" target="_blank">YouTellMe</a> moved to the beautifull Keizersgracht in Amsterdam. With the crazy work schedules any entrepreneurs lives by, we didn&#8217;t really get to enjoy the city yet. In fact, I went to more Amsterdam based events when the company was still in Rotterdam.</p>
<p>This Thursday my fellow YTM entrepreneurs and me will be visiting the <a href="http://www.meetup.com/ocamsterdam/" target="_blank">Open Coffee Amsterdam meetup</a>. For me its a first timer on the long  standing Open Coffee tradition. Hope it will be fun :)</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/_2avJ5S8Fk0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2009/01/02/open-coffee-amsterdam/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Django vs Symfony</title>
		<link>http://www.mellowmorning.com/2008/08/27/django-vs-symfony/</link>
		<comments>http://www.mellowmorning.com/2008/08/27/django-vs-symfony/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 19:52:00 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=68</guid>
		<description><![CDATA[As you can see from the posts (one, two) I&#8217;ve always been a big Symfony fan. Symfony is really great, but my current favourite is clearly Django. I had to dive deep into python to use it, but it was well worth the effort.
Choosing Django:
Django has a few killer features which make it a better [...]]]></description>
			<content:encoded><![CDATA[<p>As you can see from the posts (<a href="http://www.mellowmorning.com/2007/08/18/ten-reasons-why-symfony-rocks-part-1/" target="_blank">one</a>, <a href="http://www.mellowmorning.com/2007/09/08/ten-reasons-why-symfony-rocks-part-2/" target="_blank">two</a>) I&#8217;ve always been a big <a href="http://www.symfony-project.org/" target="_blank">Symfony</a> fan. Symfony is really great, but my current favourite is clearly <a href="http://www.djangoproject.com/" target="_blank">Django</a>. I had to dive deep into python to use it, but it was well worth the effort.</p>
<h3>Choosing Django:</h3>
<p>Django has a few killer features which make it a better choice for many projects.</p>
<h4>High Level Fields</h4>
<p>As a starter there&#8217;s the usage of high level fields when describing your data model. This is best clarified by an example of a model definition in django:</p>
<pre class="python" name="code">class Author(models.Model):
   ip = models.IPAddressField()
   email = models.EmailField()
   company = models.ForeignKey(Company)
   picture = models.ImageField(upload_to='images/profile_pics', blank=True)
   homepage = models.URLField(verify_exists=True, blank=True)</pre>
<p>Fields are specified by their purpose, such as Email, Url and Image. From this definition all subsequent logic such as form validation and file uploads are handled. The homepage field&#8217;s validation will even ping the url to see if it exists.</p>
<p>Read more: <a href="http://www.djangoproject.com/documentation/model-api/" target="_blank">Creating Models</a> (django project)</p>
<h4>Form Handling</h4>
<p>Starting with the knowledge that you have an email field you will often want a nice text input in your form with a regex to check if the email is valid. Django has all these standard use cases worked out for you. The following example clarifies this by using Django&#8217;s ModelForm. A model form is basically a normal Form class, with the fields pre-populated as one would expect it based on the given model.</p>
<pre class="python" name="code">#Form specification
class AuthorForm(ModelForm):
   class Meta:
      model = models.User
      fields = ('ip','email','picture','homepage', 'company')

#Using the form in the view (controller in Symfony terminology)
form = AuthorForm(request.POST, instance=author_instance)
if request.method == 'POST':
  if form.is_valid():
     form.save()
     return HttpResponseRedirect(request.path) 

#In the template (view in Symfony terminology)
<div class="entry">
	{{ uform.first_name.label_tag }}
<div class="value">: {{ uform.first_name }} {{ uform.first_name.errors }}</div>
</div>
</pre>
<p>Django will display a file field for the image field, a text field for the url (with validation), a text input for the email field and a select box for the foreign key relation. Saving the result of the form to the database is as simple as calling save on the instance of the form. Writing custom widgets and field types is straightforward. Currently many localized fields such as a Dutch postal code Field and widgets are available. Symfony has been trying to emulate the Django newforms library. Unfortunately <a href="http://www.symfony-project.org/book/forms/1_1/en/01-Form-Creation" target="_blank">the syntax</a> doesn&#8217;t seem very friendly. (Pity php doesn&#8217;t have <a href="http://www.ibm.com/developerworks/linux/library/l-pymeta.html" target="_blank">metaclasses</a>)</p>
<p>Read more: <a href="http://www.djangobook.com/en/1.0/chapter07/" target="_blank">Forms</a> (Django book)</p>
<h4>Superb ORM</h4>
<p>Probably the largest difference is caused by the ORM. In PHP both Propel and Doctrine are nice projects, but simply quite inadequate. The Django ORM is syntax heaven if you are coming from php. A small example:</p>
<pre class="python" name="code">#Find the first 5 authors which have a relation to a company
#with the name YouTellMe (exact match) and site url that contains youtellme.nl
Author.objects.filter(company__name = 'YouTellMe', company__site__icontains = 'youtellme.nl')[:5]</pre>
<p>The possibilities of the standard Django ORM system are quite good. Your queries will be optimized into joins if you call select_related, many to many relations are supported and polymorphic keys are as well. The only part it fails at is query optimization in terms of column based lazy loading and support for complex relations. Fortunately you can fall back to using <a href="http://www.sqlalchemy.org/" target="_blank">SQL alchemy</a>, which is Python&#8217;s most prestigious ORM layer. SQL alchemy allows you exact query control for performance tuning and many more options you did not know you needed.<br />
However it isn&#8217;t (yet, i hope) fully integrated into Django. It would really be great to see a tighter integration with SQL alchemy, but even the Django ORM strongly outperforms Doctrine and Propel.</p>
<p>Read more: <a href="http://www.djangoproject.com/documentation/db-api/" target="_blank">DB api</a>.</p>
<h4>Python</h4>
<p>You could see this both as an advantage or disadvantage. Discussing the differences between Python and PHP is probably best left for a later post. Suffice to say that I found my programming productivity to be substantially higher with Python compared to PHP. The disadvantage is a smaller number of available scripts, developers and hosts. If you are in a position in which you can choose, you really should give python a go. There must be a reason why YouTube and Google do ;)</p>
<p>Read more: <a href="http://www.poromenos.org/tutorials/python" target="_blank">Python in 10 Minutes</a></p>
<h4>Speed</h4>
<p>When arguing with my colleague about the choice of framework we conducted a speed test between Django and Symfony using Apache bench. At the time I was arguing in favor of Symfony. We compared a lightweight PHP framework, with Symfony and Django. Symfony was stripped down for performance and was only about 30% heavier compared to the lightweight framework. When comparing it to Django however, the results showed that Symfony was only able to handle half the load Django could. Using Python and Django <em>seems</em> to have a substantial effect on your server hardware requirements. (Note that these tests were only intended as an indication for internal usage. We didn&#8217;t test enough scenarios to be certain how the outcome would hold up on a live site. )</p>
<h3>Symfony Still Rocks</h3>
<p>When working with PHP Symfony is still an awesome framework. In many aspects it is even superior to Django. There are quite a few things Django could learn from Symfony:</p>
<h4>Generic validation Classes and support for automatic js form validation</h4>
<p>When using Symfony your javascript form validation is automatically generated. This is possible because of the usage of generic validation classes. In Django this would be hard to achieve since the validation system is not based on reusable classes.</p>
<h4>A debug toolbar</h4>
<p><img src="http://mellowmorning.com/wp-content/uploads/2007/08/toolbar1.png" alt="" width="498" height="41" /><br />
One Symfony feature which I really miss in Django is the debug toolbar. Having an overview of your DB Queries, config settings, logging messages and caching information is very convenient. Especially for debugging a site with caching the caching indicators in Symfony are awesome. These caching indicators simply show which part of the page are taken from cache and which are freshly generated.</p>
<h4>DRY templates</h4>
<p>Symfony has a simple but very pleasant template tag called a <a href="http://www.symfony-project.org/book/1_1/07-Inside-the-View-Layer" target="_blank">component</a>. A component tag calls a specified view and renders the corresponding template. The typical use case for this tag is sidebar with news items. You will want to show this sidebar on many pages, but you wouldn&#8217;t want to have to call that code inside each and every view which needs the sidebar. Doing so would clutter your view and hinder template caching. A nicer approach is to use a component template tag which calls the view responsible for retrieving the news from the database and rendering the sidebar template. This way of allowing the template to invoke code allows for DRY views and templates.</p>
<h4>Clear Javascript and CSS management</h4>
<p>In Django including a javascript or css file comes down to writing the respective tags in the template. In Symfony these things aren&#8217;t left to the template, but are set by the code. This allows for a few neat features. For instance the usage of an ajax utilizing template tag (helper in Symfony) will automatically ensure that prototype.js is loaded on that page. If you would set a textarea to rich, Symfony will automatically figure out you need TinyMCE to achieve the desired effect. Furthermore it allows for a general config file where you specify which assets should be loaded for a certain combination of application and view (in Django terminology). The main benefit of such an approach comes when you combine your css and javascript files and want to optimize the groupings. Here an example of the Symfony config:</p>
<pre class="php" name="code">// In the view.yml - comparable to settings.py
indexSuccess:
  stylesheets: [mystyle1, mystyle2]
  javascripts: [myscript]

[php]
// In the Action - Controller in Django terminology
$this-&gt;getResponse()-&gt;addStylesheet('mystyle1');
$this-&gt;getResponse()-&gt;addStylesheet('mystyle2');
$this-&gt;getResponse()-&gt;addJavascript('myscript');

// In the Template - The view in Django
</pre>
<h3>Both are great, but Django more so</h3>
<p>Having used both Django and Symfony I believe the two frameworks can learn a great deal from each other. Fortunately <a href="http://groups.google.com/group/symfony-users/browse_thread/thread/9960fbda1942dc62/455ad999828b74f0?lnk=gst" target="_blank">many people</a> seem to experiment with a wide variety of frameworks (Including at least <a href="http://spindrop.us/2008/08/13/why-code-rewrites-are-often-coupled-with-redesigns/" target="_blank">one delicious developer</a>, version 3 of delicious maybe? ;)). Django in general has some excellent features, which make it a better choice for web development. If you are somehow bound to PHP, Symfony is still a good choice. The Django community is buzzing and active like no other and I look forward to posting on the various features.</p>
<p>If you didn&#8217;t try it yet:<br />
<a href="http://www.djangoproject.com/" target="_blank">django-project.com</a><br />
<a href="http://www.djangobook.com/" target="_blank">djangobook.com</a></p>
<h4>Note: Looking to hire Python and Javascript Coders</h4>
<p><a href="http://www.youtellme.nl" target="_blank">YouTellMe.nl</a> is currently looking to hire Python and Javascript programmers in The Netherlands. Drop me an email at thierry [at] youtellme.com if you would like to know more or want to suggest someone for the <a href="http://www.youtellme.com/blog/jobs/software-engineer-pythonjavascript/" target="_blank">job openings</a>.</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/7bKJekEjt14" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2008/08/27/django-vs-symfony/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>TechCrunch Amsterdam 2008</title>
		<link>http://www.mellowmorning.com/2008/07/26/techcrunch-amsterdam-2008/</link>
		<comments>http://www.mellowmorning.com/2008/07/26/techcrunch-amsterdam-2008/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 11:02:14 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[techrunch amsterdam 2008]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=70</guid>
		<description><![CDATA[Thanks to ebuddy and techcrunch for organizing the event.

]]></description>
			<content:encoded><![CDATA[<p>Thanks to <a href="http://blog.ebuddy.com/" target="_blank">ebuddy</a> and <a href="http://www.techcrunch.com/2008/07/24/techcrunch-euro-tour-amsterdam-meetup-wrap-and-more-to-come/" target="_blank">techcrunch</a> for organizing the event.<a href="http://www.mellowmorning.com/wp-content/uploads/2008/07/2694568379_f28a5412ac.jpg"><br />
<img class="alignnone size-medium wp-image-71" title="Rick, me and Thijs with Ebuddy" src="http://www.mellowmorning.com/wp-content/uploads/2008/07/2694568379_f28a5412ac-300x199.jpg" alt="Rick, me and Thijs with Ebuddy" width="300" height="199" /></a></p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/hFCzRmmQzz8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2008/07/26/techcrunch-amsterdam-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YouTellMe in Twinkle</title>
		<link>http://www.mellowmorning.com/2008/06/26/youtellme-in-twinkle/</link>
		<comments>http://www.mellowmorning.com/2008/06/26/youtellme-in-twinkle/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 13:52:54 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[YouTellMe]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=67</guid>
		<description><![CDATA[Twinkle, the online and offline magazine for ecommerce has just written a blog post about YouTellMe. A full article on YouTellMe may be found in the offline version of the magazine.
Besides our constantly growing group of beta testers these are the first screenies to go out in the open. The feedback of our testers has [...]]]></description>
			<content:encoded><![CDATA[<p>Twinkle, the online and offline magazine for ecommerce has just written <a href="http://twinklemagazine.nl/nieuws.aspx?id=17666" target="_blank">a blog post about YouTellMe</a>. A full article on YouTellMe may be found in the offline version of the magazine.</p>
<p>Besides our constantly growing group of beta testers these are the first screenies to go out in the open. The feedback of our testers has been very enthousiastic and I look forward to a full launch!</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/fILpx_8cFQI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2008/06/26/youtellme-in-twinkle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript optimization – high performance JS apps</title>
		<link>http://www.mellowmorning.com/2008/05/18/javascript-optimization-high-performance-js-apps/</link>
		<comments>http://www.mellowmorning.com/2008/05/18/javascript-optimization-high-performance-js-apps/#comments</comments>
		<pubDate>Sun, 18 May 2008 19:49:45 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Web2.0]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/?p=65</guid>
		<description><![CDATA[The most common use cases of Javascript require no optimization at all. However when you go about building substantial applications in javascript you will hit some walls rather rapidly. Fortunately the code you are currently writing can probably be accelerated substantially.
Step 0: Analyzing performance
Prior to attempting any tweaks, be sure to get firebug and use [...]]]></description>
			<content:encoded><![CDATA[<p>The most common use cases of Javascript require no optimization at all. However when you go about building substantial applications in javascript you will hit some walls rather rapidly. Fortunately the code you are currently writing can probably be accelerated substantially.</p>
<h3>Step 0: Analyzing performance</h3>
<p>Prior to attempting any tweaks, be sure to <a href="http://www.getfirebug.com/" target="_blank">get firebug</a> and use their console.profile() and console.profileEnd(). Test results will vary substantially during subsequent tests, but they serve their purpose for finding the bottlenecks.</p>
<h3>Step 1: Remove Double Dollar $$ and event binding</h3>
<p>There are <a href="http://www.sitepen.com/blog/2008/05/09/string-performance-an-analysis/" target="_blank">many small performance</a> differences, but several things are likely to really kill performance. One of the most nasty ones is using prototype&#8217;s <a href="http://www.prototypejs.org/api/utility/dollar-dollar" target="_blank">double dollar $$</a> function (or the similar Element.select). You can often avoid using the double dollar function. For example the use case of attaching events to all &#8216;report this&#8217; buttons on your site. The simple (and often good enough) approach would be to use the following code:</p>
<pre name="code" class="js">$$('.report_this').each(function(report_button) {
   var id = report_button.id.split('_')[1];
   report_button.observe('click', this.respondToReportButton.bind(this, id);
});</pre>
<p>Four things are slowing this code down: 1. the usage of the $$ function, 2. the usage of each instead of a native looping construct, 3. the retrieving of the id from the id string, 4. the repeated binding of functions.</p>
<p>There are several possible remedies against the above code:</p>
<ol>
<li>Give all report_this buttons a unique id (say for instance that you have 15 or less in a list)</li>
<li>Pre generate a list of ids using your server side language of choice and pass it to javascript</li>
<li>Manually traverse the DOM; $(&#8217;container&#8217;).childNodes can do wonders</li>
<li>Bind once to a common parent element</li>
<li>Find items by name instead of class</li>
<li>Forget about all the initializing and fall back to old school onclick=&#8221;classinstance.respondToReportButton()&#8221;</li>
</ol>
<p>This last option sort of goes against many webdevelopment principles, but is often a very pragmatic choice. <a href="http://www.vcasmo.com/video/osnow/391" target="_blank">Joseph Smarr from Plaxo</a> holds a similar opinion on the topic.</p>
<p>A better implementation using technique 1 would be:</p>
<pre name="code" class="js">this.respondToReportButtonBound = this.respondToReportButton.bind(this);
for(x=1;x&lt;16;x++) {
   button = $('report_button'+x);
   if(!button) break;
   button.observe('click', this.respondToReportButtonBound);
}</pre>
<p>In practice I&#8217;ve experienced speed improvements of over 40 times using this technique. Firstly the repondTo function is bound only once. Secondly the $$ function is no longer needed. Thirdly the each implementation has been replaced by a blazingly fast for loop. Fourthly the id is no longer extracted. A better practice is to extract it when respondToReportButton is actually executed. This last point actually brings us to the next main item.</p>
<h3>Step 2: Be Lazy!</h3>
<p>The trick here is to actually put in a bit of effort to make your code lazy. Don&#8217;t do anything until it is needed. (With the one, but large exception if doing so would hurt the user experience.) If some items are currently not visible to the user simply don&#8217;t bind events to them. If you need to extract id&#8217;s don&#8217;t do so until someone actually clicks on the item in question. Furthermore also make it lazy in the regular sense of the word. If your code only need to change one item, figure out which one it is and don&#8217;t loop about changing all just in case. This point is different for every application, but it can achieve great speed gains for a creative programmer!</p>
<h3>Step 3: Stop using prototype functions if you don&#8217;t need them</h3>
<p>Often you do not really need (as in that it barely saves you development time) some of the functionality of prototype. When comparing the speed of element.innerHTML = &#8216;hello world&#8217; versus element.update(&#8217;hello world&#8217;) the differences are substantial (60 times with large chunks of html). Also the each iterator is often not needed and can be replace by a simple for loop with checks on nodeType and tagName. The same goes for the templating system. These tools barely save you time, but really hurt performance. I am a big fan of the prototype library and for most use cases these nice helpers are great. When you really need speed, be sure to refrain from using them though.</p>
<h3>Step 4: Lower level optimizations</h3>
<p>When you are done implementing the really important optimizations there are quite some lower level optimizations which will speed up your code.</p>
<ul>
<li> Write to innerHTML instead of using document.createElement</li>
<li> Use for loops instead of for in loops</li>
<li><a href="http://blogs.msdn.com/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx" target="_blank"><del datetime="2008-05-19T14:52:29+00:00"> Use Array.join instead of += on a string</del></a>, see <a href="http://www.sitepen.com/blog/2008/05/09/string-performance-an-analysis/" target="_blank">SitePen</a></li>
<li><a href="http://blogs.msdn.com/ie/archive/2006/08/28/728654.aspx" target="_blank">Cache variables and functions</a></li>
<li> Limit the usage of Eval</li>
<li> Limit the usage of Try Catch statements</li>
<li><a href="http://dev.opera.com/articles/view/efficient-javascript/?page=3#modifyingtree" target="_blank"> When manipulating the DOM copy the element out of DOM change it and stick it back in</a></li>
</ul>
<p>Two generally great resources on the topic are:</p>
<ol>
<li><a href="http://www.vcasmo.com/video/osnow/391" target="_blank">Joseph Smarr (Plaxo)</a></li>
<li><a href="http://dev.opera.com/articles/view/efficient-javascript/" target="_blank">Opera Dev</a></li>
</ol>
<h3>The missing performance data</h3>
<p>One item affecting the performance of javascript interface elements is the speed by which the browsers redraws the page. Unfortunately I have barely found any documentation on how browsers determine what to redraw and what affects redraw speed. One certainty is the negative influence of transparent images on redraw speed, but other than that little seems to be known. Furthermore most browsers won&#8217;t redraw the page until your javascript function returns. This can make your interface elements feel very unresponsive. A solution to this problem is to use the setTimeout functionality.</p>
<h3 style="margin-top:50px">Message for Dutch Programmers</h3>
<p>YouTellMe is an innovative startup located in the center of Rotterdam. Talented programmers are always welcome. Have a look at the <a href="http://www.youtellme.com/blog/jobs/" target="_blank">job page</a> to get an impression of the job openings (We develop using Python/Django).</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/8SRwiVVtAl8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2008/05/18/javascript-optimization-high-performance-js-apps/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Have a Cookie</title>
		<link>http://www.mellowmorning.com/2008/02/07/have-a-cookie/</link>
		<comments>http://www.mellowmorning.com/2008/02/07/have-a-cookie/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 14:27:22 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/2008/02/07/have-a-cookie/</guid>
		<description><![CDATA[Here a nice little cookie wrapper. It&#8217;s mainly based on the Quirksmode code with some nice Prototype style.
Have a look:
var cookieJar = Class.create();
cookieJar.prototype = {
initialize: function() {},
write: function(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = '';
document.cookie = name + '=' + value + expires + '; path=/';
},
writeJSON: function(name,value,days) [...]]]></description>
			<content:encoded><![CDATA[<p>Here a nice little cookie wrapper. It&#8217;s mainly based on the <a href="http://www.quirksmode.org/js/cookies.html" target="_blank">Quirksmode</a> code with some nice Prototype style.</p>
<p>Have a look:</p>
<p><code>var cookieJar = Class.create();<br />
cookieJar.prototype = {<br />
initialize: function() {},<br />
write: function(name,value,days) {<br />
if (days) {<br />
var date = new Date();<br />
date.setTime(date.getTime()+(days*24*60*60*1000));<br />
var expires = "; expires="+date.toGMTString();<br />
}<br />
else var expires = '';<br />
document.cookie = name + '=' + value + expires + '; path=/';<br />
},<br />
writeJSON: function(name,value,days) {<br />
var JSONvalue = $H(value).toJSON();<br />
this.write(name,JSONvalue,days);<br />
},<br />
read: function(name) {<br />
var nameEQ = name + '=';<br />
var ca = document.cookie.split(';');<br />
for(var i=0;i &lt; ca.length;i++) {<br />
var c = ca[i];<br />
while (c.charAt(0)==' ') c = c.substring(1,c.length);<br />
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);<br />
}<br />
return false;<br />
},<br />
readJSON: function(name) {<br />
var value = this.read(name) || '{}';<br />
value = value.evalJSON();<br />
return value;<br />
},<br />
erase: function (name) {<br />
this.create(name,"",-1);<br />
}<br />
};<br />
cJar = new cookieJar();</code></p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/shDETIGSDhM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2008/02/07/have-a-cookie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Patterns</title>
		<link>http://www.mellowmorning.com/2008/01/30/design-patterns/</link>
		<comments>http://www.mellowmorning.com/2008/01/30/design-patterns/#comments</comments>
		<pubDate>Wed, 30 Jan 2008 18:29:27 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/2008/01/30/design-patterns/</guid>
		<description><![CDATA[Just a link this time, great reference on design patterns:
http://www.mcdonaldland.info/2007/11/28/40/
]]></description>
			<content:encoded><![CDATA[<p>Just a link this time, great reference on design patterns:<br />
<a href="http://www.mcdonaldland.info/2007/11/28/40/">http://www.mcdonaldland.info/2007/11/28/40/</a></p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/p2IH63ibAvg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2008/01/30/design-patterns/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A new job! – but no Symfony</title>
		<link>http://www.mellowmorning.com/2008/01/20/a-new-job-but-no-symfony/</link>
		<comments>http://www.mellowmorning.com/2008/01/20/a-new-job-but-no-symfony/#comments</comments>
		<pubDate>Sun, 20 Jan 2008 22:43:04 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/2008/01/20/a-new-job-but-no-symfony/</guid>
		<description><![CDATA[Note: We are actively seeking to hire exceptional PHP programmers. More on the job offering at the bottom of this posts.
After one of my posts got featured on Ajaxian many interesting offers hit my mailbox.  One of them was actually from a startup right here in Rotterdam called ZeroBubble. I was happily surprised to [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note</strong>: We are actively seeking to hire exceptional PHP programmers. More on the job offering at the bottom of this posts.</p>
<p><a href="http://www.zerobubble.nl" target="_blank" title="Zero Bubble"><img src="http://www.mellowmorning.com/wp-content/uploads/2008/01/logo-zerobubble.gif" alt="Zero Bubble" style="padding: 5px; float: right" /></a>After one of my posts got featured on <a href="http://www.ajaxian.com/">Ajaxian</a> many interesting offers hit my mailbox.  One of them was actually from a startup right here in Rotterdam called ZeroBubble. I was happily surprised to find an IT startup in Rotterdam. Especially since after talking to them it became clear that they operate at the highest level of technical possibilities and have an absolutely amazing team. Two months ago I happily joined their ranks.</p>
<p><a href="http://www.youtellme.com" title="YouTellMe"><img src="http://www.mellowmorning.com/wp-content/uploads/2008/01/logo-youtellme.gif" alt="YouTellMe" style="padding: 5px; float: right; margin-right: -20px" /></a></p>
<p>The project we are working on is called YouTellMe. I don&#8217;t want to share too much about it right now, but surely I will have plenty of exciting blog posts coming up in the next months.<br />
Currently we are working with some of the nicest tech on the net. To give some examples: our admin interface is written entirely in ExtJs, the site&#8217;s search is powered by Lucene, we use prototype 1.6 for great object extending, for ajax functionality we use yahoo history manager to keep it bookmarkable, the entire site has been optimized according to the Yslow principles and we are doing some interesting things with openSocial. Given all these you can&#8217;t help but wonder why we aren&#8217;t using Symfony.</p>
<h3>Why no Symfony?</h3>
<p>Personally I am a huge fan of the Symfony framework. The team at Sensio has done an absolutely amazing job. My opinion on the framework is best described by these blog posts <a href="http://www.mellowmorning.com/2007/08/18/ten-reasons-why-symfony-rocks-part-1/" target="_blank">Part1</a>, <a href="http://www.mellowmorning.com/2007/09/08/ten-reasons-why-symfony-rocks-part-2/" target="_blank">Part2</a>. However the current project we are working on has some special requirements. First of all the application&#8217;s calculations are very harsh on the servers. Combine this with a large amount of AJAX and you have some serious performance issues. The calculation speed has been pretty optimized by a colleague of mine, who wrote a python daemon for the task. Still it is essential to keep the PHP framework&#8217;s overhead to a minimum. Prior to my employment at this company it was decided that Symfony would be too slow to handle the task. This is a topic which often nags Symfony.</p>
<p>I am curious how fast Symfony can be. For the YouTellMe site I need a bootstrapped and blazingly fast framework. In the coming weeks I&#8217;ll be setting up some tests too see how Symfony compares to our home build framework. As a starters I&#8217;ll definitely relieve Symfony from the ORM and fancy routing. From there on I will need to test to see which components are slow and can be removed. The clean and flexible programming in Symfony should make this easy to do.</p>
<p>Our current framework is very lightweight. It even does not do auto loading. I for one have no clue what the speed gain is from not using auto loading and it would also be interesting to test it. The MVC structure is entirely home build, but the rest of the features use Zend.</p>
<p>If there are readers of this blog, which have gone through the process of stripping Symfony, be sure to leave some tips in the comments!</p>
<h4 id="jobs">Jobs at ZeroBubble</h4>
<p>ZeroBubble is currently recruiting talented PHP programmers in the Rotterdam area. We are located in the Beurs World Trade center. If you are into the latest technology and like to work with great people, software and hardware be sure to email me at thierry [at] zerobubble [dot] nl or my boss at joost [at] zerobubble [dot] nl. As mentioned we work with fun software such as Ext Js, Lucene, Zend, object oriented js with Prototype 1.6, yahoo history, Yslow principles and openSocial.<br />
We are looking for both full and partime PHP programmers. Python, ExtJs, prototype, server admin, subversion and memcached knowledge are all nice extras. As a main quality though, you have to be excited about building a unique and amazing web application.</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/kK4KXcDP3PQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2008/01/20/a-new-job-but-no-symfony/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Is the php native json_encode really broken?</title>
		<link>http://www.mellowmorning.com/2007/12/20/is-the-php-native-json_encode-really-broken/</link>
		<comments>http://www.mellowmorning.com/2007/12/20/is-the-php-native-json_encode-really-broken/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 23:48:32 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/2007/12/20/is-the-php-native-json_encode-really-broken/</guid>
		<description><![CDATA[It sure seems so:
The php:
var_dump(array('mynumber'=&#62;42.2));
var_dump(json_encode(array('mynumber'=&#62;42.2)));
The result:
array(1) {
["mynumber"]=&#62;
float(42,2)
}
string(17) "{"mynumber":42,2}"
Notice the 42,2.
&#8216;42,2&#8242; or &#8220;42.2&#8243; or 42.2 would have all been fine, but 42,2 obviously invalidates your json object.
The problem seems to arise from my &#8216;nl&#8217; internationalization setting in php. I&#8217;m guessing the same problem will occur with any language which uses the comma for decimal separations.
Currently I [...]]]></description>
			<content:encoded><![CDATA[<p>It sure seems so:</p>
<p>The php:<br />
<code>var_dump(array('mynumber'=&gt;42.2));<br />
var_dump(json_encode(array('mynumber'=&gt;42.2)));</code></p>
<p>The result:<br />
<code>array(1) {<br />
["mynumber"]=&gt;<br />
float(42,2)<br />
}<br />
string(17) "{"mynumber":42,2}"</code></p>
<p>Notice the 42,2.<br />
&#8216;42,2&#8242; or &#8220;42.2&#8243; or 42.2 would have all been fine, but 42,2 obviously invalidates your json object.</p>
<p>The problem seems to arise from my &#8216;nl&#8217; internationalization setting in php. I&#8217;m guessing the same problem will occur with any language which uses the comma for decimal separations.</p>
<p>Currently I am solving this problem by typecasting my number to a string, but there has to be a better approach.</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/Itby2eub-k0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2007/12/20/is-the-php-native-json_encode-really-broken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pake: propel-build-all-save-mysql</title>
		<link>http://www.mellowmorning.com/2007/11/11/pake-propel-build-all-save-mysql/</link>
		<comments>http://www.mellowmorning.com/2007/11/11/pake-propel-build-all-save-mysql/#comments</comments>
		<pubDate>Sun, 11 Nov 2007 23:54:48 +0000</pubDate>
		<dc:creator>tschellenbach</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.mellowmorning.com/2007/11/11/pake-propel-build-all-save-mysql/</guid>
		<description><![CDATA[I tended to use fixtures in order to save my data before propel-build-all commands. In a discussion on syncing development database structure with production, Mike mentioned he uses mysqldumps. This is actually not a bad idea, given that it is faster and less error prone (propel will never bug you). The downside is off course [...]]]></description>
			<content:encoded><![CDATA[<p>I tended to use fixtures in order to save my data before <a href="http://www.symfony-project.com/cookbook/1_0/cli">propel-build-all</a> commands. In a discussion on <a href="http://groups.google.com/group/symfony-users/browse_thread/thread/21456f8db6c99d9">syncing development database structure with production</a>, Mike mentioned he uses mysqldumps. This is actually not a bad idea, given that it is faster and less error prone (propel will never bug you). The downside is off course that it only works for mysql.</p>
<p>Here 3 Pake tasks to automate your mysql dumping:</p>
<ol>
<li>mysql-dump-data</li>
<li>mysql-load-data</li>
<li>propel-build-all-save-mysql</li>
</ol>
<p><a href="http://www.mellowmorning.com/wp-content/uploads/2007/11/sfdumpmysqldata.zip" title="sfDumpMysqlData">Download all three pake tasks</a>. To install them simply copy the file to myproject/data/tasks/</p>
<p>You will have to edit the file to configure your database settings.</p>
<p>Note that this is only a temporary solution. I personally would be very happy to see Propel making database structure changes.</p>
<p>I didn&#8217;t see any manual on creating Pake tasks. Improvements and suggestions are more than welcome.</p>
<img src="http://feeds.feedburner.com/~r/MellowMorning/~4/IztXOl_dEn4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.mellowmorning.com/2007/11/11/pake-propel-build-all-save-mysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.675 seconds --><!-- Cached page served by WP-Cache -->
