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

<channel>
	<title>DiLoc-Blog &#187; dhaas</title>
	<atom:link href="http://www.diloc.de/blog/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diloc.de/blog</link>
	<description>About the construction of a sophisticated Web-Application with ExtJs</description>
	<lastBuildDate>Thu, 09 Jun 2011 14:22:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Migrating from MySQL Workbench to ORM Designer</title>
		<link>http://www.diloc.de/blog/2011/06/09/migrating-from-mysql-workbench-to-orm-designer/</link>
		<comments>http://www.diloc.de/blog/2011/06/09/migrating-from-mysql-workbench-to-orm-designer/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 13:56:29 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[MySQLWorkbench]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[ORM Designer]]></category>
		<category><![CDATA[praise]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[validation]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=51</guid>
		<description><![CDATA[As you probably know, we use(d) MySQL Workbench for all our database design needs. We used the PropelExport Plugin to export the schema to a Propel-compatible schema representation. Unfortunatly our plugin could only export the basic tables and relations, but since Workbench does not know anything about Propel behaviors etc. we had an additional php-script [...]]]></description>
			<content:encoded><![CDATA[<p>As you <a title="MySQL Workbench + propel = useful" target="_blank">probably</a> <a title="Small MySQL Workbench review" target="_blank">know</a>, we use(d) <a target="_blank">MySQL Workbench</a> for all our database design needs. We used the <a title="MySQL Workbench Propel export plugin v0.5" target="_blank">PropelExport Plugin</a> to export the schema to a <a target="_blank">Propel</a>-compatible schema representation. Unfortunatly our plugin could only export the basic tables and relations, but since Workbench does not know anything about <a target="_blank">Propel behaviors</a> etc. we had an additional php-script that would patch (merge) the schema.xml generated from our plugin with some additional tags and attributes that PropelExport-Plugin did not support.</p>
<p>Since we started development on DiLoc 2.0 we wanted to refactor some parts of our database-propel layer and ExtJS integration. For this to work we needed some additional custom fields in schema.xml (because we generate <a  href="http://www.sencha.com/blog/ext-js-4-anatomy-of-a-model/">ExtJS Frontend Models</a> automatically from schema.xml). Putting even more stuff (like <a target="_blank">validations</a> which we wanted to define only once in schema.xml in our updated framework) into into our schema_addon.xml felt more and more wrong. As I heard of <a target="_blank">ORM Designer</a> before, it was time to evaluate if ORM Designer could replace MySQL Workbench in our workflow.</p>
<p><span id="more-51"></span></p>
<p>On our first try I was quite underwhelmed because ORM Designer did not support Propel-validations, the prime feature we wanted to use it for. I asked the developers of ORM Designer if support for validations could be added, and provided some links for documentation about how validations work with Propel. &#8211; Lo and behold, on the same day a new beta version of ORM Designer was made available for us. &#8211; Even including a lengthy <a target="_blank">blog-post</a> explaining the new features. I tried it out and it worked perfectly. Since ORM Designer is very extensible, we even got a config file extending tables and columns with new attributes we needed to generate frontend-models from schema.xml. I was very happy and tried adding behaviors to our tables, only to find out that behaviors where only supported for Doctrine in ORM Designer. &#8211; But no Problem, after some emails back and forth between me and the developers, we got a shiny <a target="_blank">new version</a> supporting all Propel 1.6 behaviors, even with all available parameters and so on! &#8211; Great! During this, the developers where extremely friendly and  interested in implementing the things we needed. They also provided us extended testing-licenses so we could test ORM Designer some more.</p>
<p>So now we can design our database schema with ORM Designer and can directly add all needed fields and attributes to our tables, columns, etc. and directly export to a fully Propel 1.6 compatible schema.xml. We dumped our handwritten schema-patcher and even added an additional attribute to all columns that we needed.</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_53" class="wp-caption aligncenter" style="width: 310px"><a  href="http://www.diloc.de/blog/wp-content/uploads/2011/06/ORMDesigner.png" class="thickbox no_icon" rel="gallery-51" title="The red highlighted regions show the use of our custom attributes and the use of validators."><img class="size-medium wp-image-53 " title="The red highlighted regions show the use of our custom attributes and the use of validators." src="http://www.diloc.de/blog/wp-content/uploads/2011/06/ORMDesigner-300x186.png" alt="ORM Designer with validators and our custom fields." width="300" height="186" /></a><p class="wp-caption-text">ORM Designer with validators and our custom fields.</p></div>
<p>ORM Designer lets us even enhance schema.xml in the future should the need arise. We feel confident in having found the right tool for our needs. The only missing point when coming from MySQL Workbench, is that you cannot have multiple &#8220;diagrams&#8221; that showed your tables. This allows you to add custom diagrams for parts of your schema, where you only need some tables. This allows you to break your schema in parts and print out nice overviews on parts of the schema only. ORM Designer allows you to group tables into regions, but all relations to related tables are always shown, even if they go outside a region. In this regard Workbench is more flexible, even providing different relation-notation styles, etc. So ORM Designer is really really great on directly working with the ORM of your choice (Propel, Doctrine, Doctrine2,CakePHP, Symfony), and is really customizable for importing, exporting, and adding custom fields. This is really cool. But on the side of visualizing your schema, Workbench has still the edge over ORM Designer. Here is hope that the developers of ORM Desinger catch up in this area.</p>
<p>We urge you to try out the current <a target="_blank">Beta-Release</a> (which is extremely stable) of ORM Designer! It has really great Propel 1.6 support, including all Propel-table and column-attributes, behaviors, validations, etc. And even if some feature you need is missing, chances are high that they are able/willing to implement it for you. This is in high contrast to MySQL Workbench where custom development would be unthinkable I believe.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2011/06/09/migrating-from-mysql-workbench-to-orm-designer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtDocSuite 3.3.0 released</title>
		<link>http://www.diloc.de/blog/2010/10/15/extdocsuite-330-released/</link>
		<comments>http://www.diloc.de/blog/2010/10/15/extdocsuite-330-released/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 11:52:41 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Adobe Air]]></category>
		<category><![CDATA[ext]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=39</guid>
		<description><![CDATA[After some work of porting the current documentation to Adobe AIR (again), doing some cosmetic changes, fixing some ext-bugs we now released ExtDocSuite 3.3.0 including the latest documentation from Sencha. It even includes documentation for the new Calendar components released with Ext 3.3.0. So go ahead, read the detailed changelog, grab your copy. &#8211; Enjoy!]]></description>
			<content:encoded><![CDATA[<p>After some work of porting the current documentation to Adobe AIR (again), doing some cosmetic changes, fixing some ext-bugs we now released ExtDocSuite 3.3.0 including the latest documentation from Sencha. It even includes documentation for the new Calendar components released with Ext 3.3.0. So go ahead, <a  href="http://www.diloc.de/blog/extdocsuite/changelog/">read the detailed changelog</a>, <a  href="http://www.diloc.de/blog/extdocsuite/">grab your copy</a>. &#8211; Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2010/10/15/extdocsuite-330-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtDocSuite 3.1.1-3</title>
		<link>http://www.diloc.de/blog/2010/03/17/extdocsuite-311-3/</link>
		<comments>http://www.diloc.de/blog/2010/03/17/extdocsuite-311-3/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 11:32:39 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=38</guid>
		<description><![CDATA[We are back with a small update to ExtDocSuite. The most notable change is the workaround implemented so that the scrolling-position in every tab is kept when changing tabs. Firefox does this automatically, but WebKit has no such feature, so we implemented it manually. Believe it or not, this makes a huge difference when using [...]]]></description>
			<content:encoded><![CDATA[<p>We are back with a small update to ExtDocSuite. The most notable change is the workaround implemented so that the scrolling-position in every tab is kept when changing tabs. Firefox does this automatically, but WebKit has no such feature, so we implemented it manually. Believe it or not, this makes a huge difference when using ExtDocSuite day to day. Its much more pleasant do use, I immediatly fell in love with it after we implemented it. <img src='http://www.diloc.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
To install the update wait for the app to check for updates or manually check for updates, or klick on the <a  href="http://www.diloc.de/blog/extdocsuite/" title=" install-badge">install-badge</a> to update it from there, or simply visit the <a  href="http://www.diloc.de/blog/extdocsuite/" title="download-page">download-page</a> to manually download it. Visit the <a  href="http://www.diloc.de/blog/extdocsuite/changelog/" title="changelog">changelog</a> for more details on the update.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2010/03/17/extdocsuite-311-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing ExtDocSuite</title>
		<link>http://www.diloc.de/blog/2010/02/10/introducing-extdocsuite/</link>
		<comments>http://www.diloc.de/blog/2010/02/10/introducing-extdocsuite/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 16:37:38 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Adobe Air]]></category>
		<category><![CDATA[ext]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=36</guid>
		<description><![CDATA[ExtDocSuite is our attempt on packaging the great ExtJS Documentation in an easy to use application for offline use based on Adobe Air. Since the release of ExtJS 3.0 many developers are waiting for an Adobe Air based application that includes the excellent ExtJS API Documentation for easy offline use. Now you do not have [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.diloc.de/blog/extdocsuite/" target="_blank">ExtDocSuite</a> is our attempt on packaging the great ExtJS Documentation in an easy to use application for offline use based on Adobe Air.</p>
<p><span id="more-36"></span></p>
<p>Since the release of ExtJS 3.0 many developers are waiting for an Adobe Air based application that includes the excellent ExtJS API Documentation for easy offline use. Now you do not have to wait any longer! Just use ExtDocSuite, the all-inclusive documentation suite for ExtJS. Compared to the outdated ExtJS 2.3 Documentation for Offline use, this has some extra tricks up its sleeve:</p>
<ul>
<li>Includes the latest Documentation for ExtJS 3.1.1</li>
<li>Also includes the latest ux Documentation from the examples/ folder</li>
<li>Also includes the latest Ext.Air Documentation.</li>
<li>Search works (for me it did not work in the official App from the Ext-Team)</li>
<li>Integrated Update-System so that your documentation always stays up to date</li>
</ul>
<p>Disclaimer: This is based off the great documentation provided by Ext. This App would not be possible without it. We did not write the documentation, we merely packaged it as an Air Application and added some tweaks here and there. So all the kudos goes to the Ext Team for providing such a great documentation Tool. Thanks alot!</p>
<p>To Install ExtDocSuite, just head over to the <a  href="http://www.diloc.de/blog/extdocsuite/">download-page</a> and click on the shiny install button.</p>
<p>If you have questions or suggestions, comment below or on the download page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2010/02/10/introducing-extdocsuite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Workbench Propel export plugin v0.5</title>
		<link>http://www.diloc.de/blog/2009/10/14/mysql-workbench-propel-export-plugin-v05/</link>
		<comments>http://www.diloc.de/blog/2009/10/14/mysql-workbench-propel-export-plugin-v05/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 12:27:06 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql workbench]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=34</guid>
		<description><![CDATA[After more than a year, the propel export-plugin got updated! The changes are not massive, but nice nonetheless. Lets see what is new: Works with Workbench 5.1 (OSS and SE) Adds support for Workbenchs User Data Types Fixes BOOLEANS appearing as UNKNOWN (when using Workbench 5.1) Supports Propel 1.3 defaultExpr-Attribute Add name-attribute to unique and [...]]]></description>
			<content:encoded><![CDATA[<p>After more than a year, the propel export-plugin got updated! The changes are not massive, but nice nonetheless.</p>
<p>Lets see what is new:</p>
<ul>
<li>Works with Workbench 5.1 (OSS and SE)</li>
<li>Adds support for Workbenchs User Data Types</li>
<li>Fixes BOOLEANS appearing as UNKNOWN (when using Workbench 5.1)</li>
<li>Supports Propel 1.3 defaultExpr-Attribute</li>
<li>Add name-attribute to unique and index-tags</li>
<li>Add size-attribute to unique-indexes and normal indexes only if size is available</li>
</ul>
<p><span id="more-34"></span></p>
<p>This means that it works now with the actual Workbench-Release and fully supports Propel 1.2 and Propel 1.3. It should also work with the upcoming Propel 1.4 but 1.4-specific features such as behaviours are not yet supported.</p>
<p>Download Link:   <a  href="/blog/downloads/PropelExport.grt.lua" target="_blank">MySQL Workbench Propel-Export Plugin v0.5</a><br />
(Be sure to reload the file if it still shows the 0.4 version)</p>
<p>If you have questions regarding the new features or you find bugs / have suggestions, don’t hesitate to leave a comment!</p>
<p><strong>Edit:</strong> Fixed link. Sorry!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2009/10/14/mysql-workbench-propel-export-plugin-v05/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>MySQL Workbench Propel export plugin v0.4</title>
		<link>http://www.diloc.de/blog/2008/08/05/mysql-workbench-propel-export-plugin-v04/</link>
		<comments>http://www.diloc.de/blog/2008/08/05/mysql-workbench-propel-export-plugin-v04/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 14:53:32 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql workbench]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=33</guid>
		<description><![CDATA[I finally came around to update the Workbench propel export plugin. Sorry that it took so long. This is what is new: Added support to set database baseClass manually Added support to set phpName per table manually DATETIME type is converted to TIMESTAMP type Added support for onDelete and onUpdate foreign key constraints (based on [...]]]></description>
			<content:encoded><![CDATA[<p>I finally came around to update the <a  href="http://www.diloc.de/blog/2008/05/27/mysql-workbench-propel-export-plugin/" target="_blank">Workbench propel export plugin</a>. Sorry that it took so long.</p>
<p>This is what is new:</p>
<ul>
<li>Added support to set database baseClass manually</li>
<li>Added support to set phpName per table manually</li>
<li>DATETIME type is converted to TIMESTAMP type</li>
<li>Added support for onDelete and onUpdate foreign key constraints (based on work by Antoine Noal aka Hvannentir)</li>
<li>size and scale support for DECIMAL columns (based on work by Antoine Noal aka Hvannentir)</li>
<li>support for multiple foreign key references (thanks for pointing that out Antoine!)</li>
</ul>
<p><span id="more-33"></span>The first to features where added because I want to have other PHP-names than what propel generates automatically (Table named customer<strong>s</strong> but class name should be Customer). I also have a custom baseClass injected in the inheritance tree to be able implement generic features for all my objects, so I needed the baseClass attribute. &#8211; Not beeing able to set this from the workbench export meant that I had to patch the generated schema file on every update with a small script which corrected the issues. With the new features I can now omit that extra step.<br />
To use the baseClass-functionality, just use the new menu-entry &#8220;PropelExport: Set custom baseClass&#8221; inside Plugins -&gt; Catalog.<br />
To use the phpName-functionality, simply right-click on a table and use &#8220;PropelExport: Set custom phpName&#8221;.<br />
Important to note: If you want to remove a previously set baseClass or phpName, enter one empty space as name. (I had to do this because of a shortcoming of MySQL Workbench, which does not enable me to differentiate between an entered empty string or a press on cancel).<br />
The entered names are also saved in the Workbench file, so subsequent exports will automatically contain them. If you want to see the entered values, just run the corresponding menu-entry. The currently set text is displayed in paranthesis only in the title-bar of the dialog. (Another shortcoming in the used Workbench:input method.) Simply press cancel to keep the original text.</p>
<p>The DATETIME issue was fixed by me long ago, but I forgot to post the new version, so 0.4 also contains this fix.</p>
<p>The other features are mostly based on the work of Antoine Noal, although I did some small improvements/corrections. Thanks again for your work, Antoine!</p>
<p>Download Link:  <a  href="/blog/downloads/PropelExport.grt.lua" target="_blank">MySQL Workbench Propel-Export Plugin v0.4</a><br />
(Be sure to reload the file if it still shows the 0.3 version)</p>
<p>If you have questions regarding the new features or you find bugs / have suggestions, don&#8217;t hesitate to leave a comment!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/08/05/mysql-workbench-propel-export-plugin-v04/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Debugging PHP-AJAX Applications with FirePHP</title>
		<link>http://www.diloc.de/blog/2008/07/10/debugging-php-ajax-applications-with-firephp/</link>
		<comments>http://www.diloc.de/blog/2008/07/10/debugging-php-ajax-applications-with-firephp/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 14:08:24 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=27</guid>
		<description><![CDATA[While developing DiLoc&#124;Rail I often found it tedious to debug server-side problems in my XmlHttpRequests. When PHP spits out an error, the JSON will become invalid. Allthough I handle this globally and a nice error message is displayed, it is not that optimal. Furthermore if you want to output some debug-info from the server-side processing, [...]]]></description>
			<content:encoded><![CDATA[<p>While developing <a  href="http://www.diloc.de/blog/about/">DiLoc|Rail</a> I often found it tedious to debug server-side problems in my XmlHttpRequests. When PHP spits out an error, the JSON will become invalid. Allthough I handle this globally and a nice error message is displayed, it is not that optimal. Furthermore if you want to output some debug-info from the server-side processing, you always render your JSON output invalid, making testing even harder, because the client-side code will not be executed as expected because of the JSON errors.</p>
<p>Luckily, my mind reminded me of something I stumbled upon some months earlier. It was labeled &#8220;Try this out when you have time&#8221; in my mind. &#8211; Stupid me, only wanting to try this out if I have time! So I decided the time is right to try out <a  href="http://www.firephp.org/" target="_blank">FirePHP</a> now. &#8211; And boy is this useful and easy to use! After some weeks of using, I can not imagine working without FirePHP anymore. So let me show you what this is all about.</p>
<p><span id="more-27"></span></p>
<p>FirePHP lets you debug your server-side PHP-code right inside Firebug! This is a very smart idea, and it works great. For this to work, you need two things: First, the FirePHP Firefox extension which plugs into Firebug and extends it. Second: the small PHP library to use on the server-side to output messages right into Firebug, without interfering with your normal XML or JSON output.<br />
FirePHP does this by sending the data inside the response-headers of the response. This way, they do not modify the data that you intend to send with your request. The FirePHP Firefox extension then takes care of parsing the additional response-headers and output them inside Firebug. Neat!</p>
<p>Here are some screenshots showing you how this works:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/07/serverside-php.png" class="thickbox no_icon" rel="gallery-27" title="FirePHP - showing server-side code. The highlighted rows output debug info with FirePHP."><img class="aligncenter size-medium wp-image-31" title="FirePHP - showing server-side code. The highlighted rows output debug info with FirePHP." src="http://www.diloc.de/blog/wp-content/uploads/2008/07/serverside-php-300x140.png" alt="" width="300" height="140" /></a></p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/07/firebug-output.png" class="thickbox no_icon" rel="gallery-27" title="FirePHP - Showing the output generated from the server-side debug code."><img class="aligncenter size-medium wp-image-29" title="FirePHP - Showing the output generated from the server-side debug code." src="http://www.diloc.de/blog/wp-content/uploads/2008/07/firebug-output-300x68.png" alt="" width="300" height="68" /></a></p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/07/firebug-object.png" class="thickbox no_icon" rel="gallery-27" title="FirePHP - Showing an object outputted on the server side. This allows you to inspect server-side objects!"><img class="aligncenter size-medium wp-image-28" title="FirePHP - Showing an object outputted on the server side. This allows you to inspect server-side objects!" src="http://www.diloc.de/blog/wp-content/uploads/2008/07/firebug-object-300x68.png" alt="" width="300" height="68" /></a></p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/07/firebug-object.png"><br />
</a></p>
<p>Besides the things I showed in the screenshots you may also output arrays and messages with different styles (warning, error, info) etc.<br />
If you use the current development-version of the firefox plugin (version 0.1.0.1) and a current svn-version of the php library, you can even output stacktraces into firebug:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/07/firebug-trace.png" class="thickbox no_icon" rel="gallery-27" title="FirePHP - Example trace. This allows you to catch exceptions server-side and output a nice stacktrace for the code."><img class="aligncenter size-medium wp-image-30" title="FirePHP - Example trace. This allows you to catch exceptions server-side and output a nice stacktrace for the code." src="http://www.diloc.de/blog/wp-content/uploads/2008/07/firebug-trace-299x70.png" alt="" width="299" height="70" /></a></p>
<p>For more examples head over to the FirePHP webseite which offers a very good documentation on how to use FirePHP. The developer even provides libraries to integrate FirePHP with the  <a  href="http://framework.zend.com/" target="_blank">Zend Framwork</a>, <a  href="http://www.symfony-project.org/" target="_blank">Symfony</a>, and <a  href="http://www.aptana.com">Aptanas</a> <a  href="http://aptana.com/jaxer">Jaxe</a>r. I think it wont be long until someone writes some serverside code for Ruby or .Net which would make it possible to use FirePHP with other languages.</p>
<p>So in essence, what I wanted to say is: Try out FirePHP, its a really nice addition to Firebug, easy to use, and makes it a pleasure to debug server-side code!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/07/10/debugging-php-ajax-applications-with-firephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to clear Ext forms</title>
		<link>http://www.diloc.de/blog/2008/05/30/how-to-clear-ext-forms/</link>
		<comments>http://www.diloc.de/blog/2008/05/30/how-to-clear-ext-forms/#comments</comments>
		<pubDate>Fri, 30 May 2008 12:07:35 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ext]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=24</guid>
		<description><![CDATA[Perhaps you know the problem: You have an Ext form into which you loaded data through the load() method. Later on you want to clear the form because you want to reuse it for a new empty record. In this case the forms reset() method will not work like you want, because it will reset [...]]]></description>
			<content:encoded><![CDATA[<p>Perhaps you know the problem:</p>
<p>You have an Ext form into which you loaded data through the load() method. Later on you want to clear the form because you want to reuse it for a new empty record. In this case the forms reset() method will not work like you want, because it will reset the forms values to the last loaded values from load().</p>
<p><span id="more-24"></span></p>
<p>But if you go through all fields and use setValue() with an empty string, the isDirty() method always returns true because the fields where modified manually.</p>
<p>However, the solution is easy: Load an empty record into the form. This lets reset() work afterwarts correctly, and also lets isDirty() work like it should. The tricky part is, automatically creating an empty record which contains all fields the form expects.</p>
<p>Here is a simple plugin which you may drop into a FormPanel or BasicForm:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * This plugin can be either used on BasicForm or FormPanel.
 * In both cases it adds a method clear() to the object
 * which allows to clear (empty) all the forms values.
 * This is opposed to the reset() method which resets all values
 * to the last values loaded through a call to load().
 * But sometimes (e.g. when you want to recycle an existing form for use
 * for a new record, you have to clear the form and also corectly reset
 * the isDirty() flag.
 *
 *
 */</span>
Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">FormClear</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">init</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>_object<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> _object.<span style="color: #660066;">form</span><span style="color: #339933;">==</span><span style="color: #3366CC;">&quot;object&quot;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//we are a formpanel and have a form, be kind and also add the method to the basic form</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">//clear method for the underlying form:</span>
			_object.<span style="color: #660066;">form</span>.<span style="color: #660066;">clear</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> data<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">items</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					data<span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #003366; font-weight: bold;">var</span> emptyRecord<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">Record</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">loadRecord</span><span style="color: #009900;">&#40;</span>emptyRecord<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">//clear method for the forpanel itself</span>
			_object.<span style="color: #660066;">clear</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> data<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">items</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					data<span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #003366; font-weight: bold;">var</span> emptyRecord<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">Record</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">form</span>.<span style="color: #660066;">loadRecord</span><span style="color: #009900;">&#40;</span>emptyRecord<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">else</span>
		<span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//we are a basicform</span>
			_object.<span style="color: #660066;">clear</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> data<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">items</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					data<span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #003366; font-weight: bold;">var</span> emptyRecord<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">Record</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">loadRecord</span><span style="color: #009900;">&#40;</span>emptyRecord<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>It enhances both FormPanel or BasicForm with a clear() method which clears all form fields and resets the form to a new empty form.</p>
<p>To use it simply add the following line to a FormPanel or BasicForm config-object:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">plugins<span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span><span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">FormClear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span></pre></div></div>

<p>That will then automatically add the clear() method to the FormPanel/BasicForm.</p>
<p>I hope some of you find it useful, because I know some of you already stumbled upon this issue.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/05/30/how-to-clear-ext-forms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MySQL Workbench Propel export plugin</title>
		<link>http://www.diloc.de/blog/2008/05/27/mysql-workbench-propel-export-plugin/</link>
		<comments>http://www.diloc.de/blog/2008/05/27/mysql-workbench-propel-export-plugin/#comments</comments>
		<pubDate>Tue, 27 May 2008 09:57:32 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[mysql workbench]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/?p=23</guid>
		<description><![CDATA[So I wrote about converting MySQL Workbench files to Propel schema files. Now I have a much improved solution: A plugin for MySQL Workbench that allows you to export your current catalog as Propel schema file. Like the XSL I wrote, it supports the same features: Columns with: Default values Auto-increment attribute Size Description Required-attribute [...]]]></description>
			<content:encoded><![CDATA[<p>So I wrote about converting <a  href="http://www.diloc.de/blog/2008/02/21/how-to-not-use-xml/">MySQL Workbench files</a> <a  href="http://www.diloc.de/blog/2008/02/26/mysql-workbench-propel-useful/">to Propel schema files</a>.</p>
<p>Now I have a much improved solution: A plugin for MySQL Workbench that allows you to export your current catalog as Propel schema file.</p>
<p><span id="more-23"></span></p>
<p>Like the XSL I wrote, it supports the same features:</p>
<ul>
<li>Columns with:
<ul>
<li>Default values</li>
<li>Auto-increment attribute</li>
<li>Size</li>
<li>Description</li>
<li>Required-attribute</li>
<li>Primary-key attribute</li>
</ul>
</li>
<li>normal extra keys</li>
<li>unique keys</li>
<li>foreign keys</li>
</ul>
<p>Currently it creates propel 1.2 compatible files, but I plan to publish an update once propel 1.3 is available as rc.</p>
<p>The plugin allows you to export the propel-schema to the clipboard so that you can paste it everywhere you want, or you may export it to a file. Unfortunatly MySQL Workbench does not yet have a way for plugins to show a &#8220;file save as&#8221;-dialog, so you have to type the path in manually. I hope the MySQL guys implement a file selector in the next version, as it should be doable quite easily. If that becomes available, I will update the plugin accordingly.</p>
<p>The neat thing is, that the export path is saved inside the Workbench file, so on subsequent exports you have the possibility to overwrite the last file right away without entering a path again.</p>
<p>The plugin certainly contains bugs and shortcomings, but I think it is a good start. If you have a case where the plugin does not export your file correctly, please send me the workbench file and explain what gets exported wrong, and I will hopefully be able to provide a fix for it.</p>
<p>And if you are a lua-monkey then dont hesitate to point me to ways to improve the code of the plugin. This is was my first time experience with lua and as such it may very well be not perfect.</p>
<p>So, without further ado, here is the <a  href="http://www.diloc.de/blog/downloads/PropelExport.grt.lua" target="_blank">MySQL Workbench Propel-Export Plugin v0.3</a>.</p>
<p><strong>How to Install:</strong></p>
<p>Copy the file to your modules-folder inside the Workbench installation. This should work in all versions of Windows prior to Vista.<br />
On Vista this may not work due to the automatic directory-redirection. In that case place the file into that folder: C:\Users\&lt;username&gt;\AppData\Roaming\MySQL\Workbench\modules\ and it should work perfectly.</p>
<p>After you placed the file into the directory, simple restart MySQL Workbench and the plugin should show up in the Plugins -&gt; Catalog menu. The two entries from the plugin are prefixed with &#8220;PropelExport:&#8221; so you should be able to find them easily.</p>
<p>Thats it! Now go ahaed and test the plugin, and report how it works through the comments section! Thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/05/27/mysql-workbench-propel-export-plugin/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Small MySQL Workbench review</title>
		<link>http://www.diloc.de/blog/2008/03/27/small-mysql-workbench-review/</link>
		<comments>http://www.diloc.de/blog/2008/03/27/small-mysql-workbench-review/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 14:30:57 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql workbench]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/2008/03/27/small-mysql-workbench-review/</guid>
		<description><![CDATA[This is a small review of MySQL Workbench in the current Version 5.0.16RC. Since I use Workbench at work for some time now and am a beta tester for the standard-edition, I thought it would be useful to give an overview of the current state. This review is in no way intended to be complete, [...]]]></description>
			<content:encoded><![CDATA[<p>This is a small review of <a  href="http://dev.mysql.com/workbench/" target="_blank">MySQL Workbench</a> in the current Version 5.0.16RC. Since I use Workbench at work for some time now and am a beta tester for the standard-edition, I thought it would be useful to give an overview of the current state.</p>
<p>This review is in no way intended to be complete, and should provide just an overview or first look.</p>
<p>For the purpose of this review I created a small database schema for a project management software. The database design currently supports the following features:</p>
<ul>
<li>Multiple customers</li>
<li>Unlimited projects per customer</li>
<li>Unlimited users per customer</li>
<li>Users may take part in projects and have customer-defined roles</li>
<li>Projects consist of unlimited milestones</li>
<li>Milestones consist of unlimited tasks</li>
<li>Tasks may have dependencies on other tasks</li>
<li> Users may take part in tasks</li>
</ul>
<p>You see, its fairly basic but consists of enough tables to show off the features of MySQL Workbench.</p>
<h4>Creating the schema</h4>
<p>Adding the needed tables for the schema was easy and straight forward. MySQL Workbench allows you to add/move/edit columns at will, and you may specify format, keys and other column-related properties. A nice feature is, that it allows you to add comments on a per column-basis so you are free to document/explain difficult columns as you see fit.</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_01.png" rel="lightbox" title="MySQL Workbench - Editing a table"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_01.png" rel="lightbox" title="MySQL Workbench - Editing a table"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_01.thumbnail.png" alt="MySQL Workbench - Editing a table" /></a></div>
<p>Editing Foreign keys is very easy as you can see in the next screenshot. Selecting the referenced table and referenced column works with drop-down boxes so you automaticaly get all posibilites, and it is not possible to get typos. This is very easy and comfortable. You may also set options for the foreign key (OnUpdate/OnDelete) and comment the foreign key.</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_02.png" rel="lighbox" title="MySQL Workbench - Adding foreign key constraints"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_02.png" rel="lighbox" title="MySQL Workbench - Adding foreign key constraints"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_02.thumbnail.png" alt="MySQL Workbench - Adding foreign key constraints" /></a></div>
<p>Adding Indexes is achieved by double-clicking a column when editing columns (for easy primary keys). If you want special or additional indexes, this may be done through the indexes tab of the table:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_03.png" rel="lightbox" title="MySQL Workbench - Editing special indexes"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_03.png" rel="lightbox" title="MySQL Workbench - Editing special indexes"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_03.thumbnail.png" alt="MySQL Workbench - Editing special indexes" /></a></div>
<p>During development it is useful to insert testing data into the tables. For example a set of predifined users. This is possible through the inserts-tab. After a click on the &#8220;Open Editor&#8230;&#8221;-button you get a nice editor which allows you to fill out some rows for the table:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_04.png" rel="lightbox" title="MySQL Workbench - Adding standard inserts for a table"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_04.png" rel="lightbox" title="MySQL Workbench - Adding standard inserts for a table"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_04.thumbnail.png" alt="MySQL Workbench - Adding standard inserts for a table" /></a></div>
<p>Unfortunatly the editor has some shortcomings: It does not allow you to resize the columns, and auto-incremented columns always get 0 as  value, which might be confusing for novice users.<br />
The generated INSERT INTO clauses are then displayed and may be copied to clipboard or automatically inserted into the table when creating the database. (See below)</p>
<p>I think this covers the most needed features concerning table creation and editing. If you still want to define advanced parameters like triggers, table-partitioning, advanced options, etc, you are free to do so, all possibilities are there.</p>
<h4>Documenting the schema</h4>
<p>When you finished with your schema, you probably want to document it. The most common way to this is through an EER Diagram. MySQL Workbench allows you to add multiple EER Diagrams for one schema. You may arrange the tables on it youself, or let Workbench do the dirty job through the option &#8220;Create Diagram for Catalog Objects&#8221;. For my example database it gives the following diagram:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_05.png" rel="lightbox" title="MySQL Workbench - The automatically generated EER Diagram"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_05.png" rel="lightbox" title="MySQL Workbench - The automatically generated EER Diagram"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_05.thumbnail.png" alt="MySQL Workbench - The automatically generated EER Diagram" /></a></div>
<p>As you can see the automatically generated diagram is not quite optimal as several lines overlap tables and so on, but for a start its not bad. You are free to move the tables around and group them in logical parts.</p>
<p>Unfortunatly while editing the model and moving the tables around, MySQL Workbench crashed. I <a  href="http://bugs.mysql.com/bug.php?id=35597" target="_blank">reported the Bug on the Bugtracker</a>, lets see if they may fix it.</p>
<p>After messing around with it a little bit, I came up with this:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_06.png" rel="lightbox" title="MySQL Workbench - The improved EER Diagram"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_06.png" rel="lightbox" title="MySQL Workbench - The improved EER Diagram"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_06.thumbnail.png" alt="MySQL Workbench - The improved EER Diagram" /></a></div>
<p>If you dont like the Crows Foot notation, you are free to choose one of the available notations. (Crows Foot, Classic, Connect to Columns, UML, IDEF1X). Personally, i like &#8220;Connect to Columns&#8221; best, because it makes the foreign key relations more clear:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_07.png" rel="lightbox" title="MySQL Workbench - The EER Diagram with “Connect to Columns”-Notation"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_07.png" rel="lightbox" title="MySQL Workbench - The EER Diagram with “Connect to Columns”-Notation"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_07.thumbnail.png" alt="MySQL Workbench - The EER Diagram with “Connect to Columns”-Notation" /></a></div>
<p>Sadly, when using this notation, the lines are always a direct connection without edges. I imagine this gets really messy with big databases and many tables. This should be improved further.</p>
<p>As you may have seen on the screenshot, the diagram view also allows to create relationships directly in a graphical manner which may be easier for some. &#8211; I prefer to define foreign-key relationships in the table-editor. When you add a new foreign-key relation, it immediatly shows up in the diagram. -No need to refresh or anything. Another possibility is to add text-notes, images and layers to the diagram to break things into parts or explain it better. I find this quite handy, allthough you apparently cannot change font-sizes of text-fields. That would be useful for headings, etc.</p>
<p>When you are satisfied with your diagram you may export it into PNG,  SVG , PDF or Postscript file.<br />
Exporting to PNG worked flawlessly, exporting to SVG showed many strange lines goeing trough the tables, but that could also be firefox&#8217; fault. I did not investigate that further.<br />
Exporting to PDF also worked great, and has the advantage that it is vector-based, so is easily zoomed and printed in high resolution.</p>
<p>Another way to document your schema is to generate a HTML-Report of it. There are some templates to choose available, this is the basic-frames template:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_08.png" rel="lightbox" title="MySQL Workbench - HTML-Report of the database."></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_08.png" rel="lightbox" title="MySQL Workbench - HTML-Report of the database."><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_08.thumbnail.png" alt="MySQL Workbench - HTML-Report of the database." /></a></div>
<p>Allthough nice, this particular template is buggy. When clicking on a table on the left, it will not scroll to the table on the right. &#8211; But that should be easy fixable.</p>
<h4>Connecting to a database</h4>
<p>So what do you do when you created your schema, documented it, and gave it to your boss? &#8211; You eventually begin working on the software which uses the schema and want to have a real database based on that schema.</p>
<p>MySQL Workbench allows you to &#8220;Forward-Engineer&#8221; the schema into a database. First you should validate your schema using &#8220;Model -&gt; Validate&#8221;. You may also do this during the Forward-Engineer Wizard, if you want.<br />
This shows you common errors like missing indexes, etc. This is a really nice feature, but the output lacks in several ways. The most obvious problem is that you cannot distinguish the found problems from the normal log entries:</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_09.png" rel="lightbox" title="MySQL Workbench - Validating the schema"></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_09.png" rel="lightbox" title="MySQL Workbench - Validating the schema"><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_09.thumbnail.png" alt="MySQL Workbench - Validating the schema" /></a></div>
<p>When trying to fix the errors one error was not fixable as I was not able to set a correct default value for a boolean column, I tried 0 and false, both lead to an error. The other error just said &#8220;Referenced column name is invalid for foreign key customer&#8221;. That was not really helpful as i named all foreign key relations to the customer table &#8220;customer&#8221; so I did not know which table was meant.</p>
<p>When using the Forward-Engineer Wizard there are some options presented (Add inserts,  generate drop statements, etc), after validating the schema, the SQL to create the database is generated. You can then copy it and do with it what you like, or continue the wizard and connect to a database and execute the statements directly. However this did not work with my schema as I got the dreaded 121-error:</p>
<p>Error 1005: Can&#8217;t create table &#8216;.\myproject\projects.frm&#8217; (errno: 121)</p>
<p>This happened for all tables with foreign key constraints, and that allthough foreign key checks are disabled while creating the tables through this statement:</p>
<p>SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;</p>
<p><a  href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_10.png" rel="lightbox" title="MySQL Workbench - Not able to forward engineer simple databases."></a></p>
<div style="text-align: center"><a href="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_10.png" rel="lightbox" title="MySQL Workbench - Not able to forward engineer simple databases."><img src="http://www.diloc.de/blog/wp-content/uploads/2008/03/wb-review_10.thumbnail.png" alt="MySQL Workbench - Not able to forward engineer simple databases." /></a></div>
<p>I already reported some forward engineer wizard related bugs in the past, but apparently there are still some left. In fact I was never able to successfuly forward engineer a database with MySQL Workbench until now. &#8211; And that with fairly basic models. For me, this makes Workbench nearly pointless.  (Fortunatly I can <a  href="http://www.diloc.de/blog/2008/02/26/mysql-workbench-propel-useful/" target="_blank">convert the model to a propel schema</a> for use in PHP and let propel generate the tables. &#8211; Propel works better in that regard because it is able to actaually create the same schema flawlessly. )</p>
<p>Since I was not able to successfully create the database, I was not able to test the other features MySQL Workbench offers. These features include creating SQL-ALTER scripts to update an existing database, and directly synchronizing your changes with a database.</p>
<h4>Final thoughts</h4>
<p>In general MySQL Workbench looks really promising. The available featureset is rich and really helps when developing new databases. However the current release candidate version 5.0.16 is still quite buggy and even fails to do most important features like the forward engineer wizard. Remember: I started with a clean file, added 9 tables with some foreign key constraints, nothing fancy. During normal use I encountered various bugs, where one even leaded to a corrupted file. (Because I said &#8220;Save&#8221; when Workbench asked to save the document right after the crash. I was first surprised that I could still save the file, but in the end I should have rather said &#8220;Forget changes&#8221; because the file was busted after saving it.)<br />
So in conclusion it is really likely that you run into similar bugs when *working* with MySQL Workbench, and that is a real pity. I repeat: MySQL Workbench shows great promise, but in the current state it is simply to buggy to be really use. It is also some kind of pointless if important features like creating a database out of the schema simply dont work. But once MySQL figures out the current problems and bugs and succeedes in making this product stable and usable, it will be a great winner for all people working with MySQL.</p>
<p>Things that are possible with MySQL Workbench, but that this review did not cover:</p>
<ul>
<li>Working with Views</li>
<li>Working with Routines</li>
<li>Defininig Schema privileges for tables &amp; users</li>
<li>Scripting through the GRT-Shell</li>
<li>Reverse Engineering existing databases</li>
</ul>
<p>Features I currently miss in MySQL Workbench:</p>
<ul>
<li>Some sort of Revision management with automatic generation/maintenance of SQL ALTER scripts and database versioning</li>
<li>A Linux/Mac version</li>
<li>Proper documentation to write plugins</li>
</ul>
<p>In case you are interested, here is the list of Bugs that I encountered and reported during the creation of this review:</p>
<ul>
<li><a  href="http://bugs.mysql.com/bug.php?id=35597" target="_blank">Crash while editing EER Diagram</a></li>
<li><a  href="http://bugs.mysql.com/bug.php?id=35598" target="_blank">Unhandled Exception when expanding indexes in diagram</a></li>
<li><a  href="http://bugs.mysql.com/bug.php?id=35601" target="_blank">Unknown Exception caught when changing to &#8220;Connect to Columns&#8221;-notation</a></li>
<li><a  href="http://bugs.mysql.com/bug.php?id=35603" target="_blank">Unhandled Exception when moving mouse after deleting a layer</a></li>
<li><a  href="http://bugs.mysql.com/bug.php?id=35604" target="_blank">Forward Engineer Wizard always fails MySQL-specifc validation.</a></li>
<li><a  href="http://bugs.mysql.com/bug.php?id=35609" target="_blank">Forward Engineer Wizard fails to generate simple databases</a></li>
</ul>
<p>What are your experiences with MySQL Workbench? Did you find it similarly buggy, or did it work for you? Have you found out some tricks to work around some bugs? Comment and share your thoughts!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/03/27/small-mysql-workbench-review/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Improved code display with wp-syntax</title>
		<link>http://www.diloc.de/blog/2008/03/05/improved-code-display-with-wp-syntax/</link>
		<comments>http://www.diloc.de/blog/2008/03/05/improved-code-display-with-wp-syntax/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 13:35:44 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Offtopic]]></category>
		<category><![CDATA[blog]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/2008/03/05/improved-code-display-with-wp-syntax/</guid>
		<description><![CDATA[We just improved the blog to improve the display of sourcecode. Since the layout is very narrow, there isn&#8217;t much space for code. So now, when you hover your mouse over a code passage it enlarges to the full width available, and shrinks again when you move your mouse out of it. I hope you [...]]]></description>
			<content:encoded><![CDATA[<p>We just improved the blog to improve the display of sourcecode. Since the layout is very narrow, there isn&#8217;t much space for code. So now, when you hover your mouse over a code passage it enlarges to the full width available, and shrinks again when you move your mouse out of it. I hope you enjoy it!</p>
<p>For the intrigued of you: We just changed line 89 of wp-syntax.php to include mouseover and mouseout events on the code-div:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$output</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&amp;lt;div class=<span style="color: #000099; font-weight: bold;">\&quot;</span>wp_syntax<span style="color: #000099; font-weight: bold;">\&quot;</span> onmouseover=<span style="color: #000099; font-weight: bold;">\&quot;</span>this.className='wp_syntax mouseover'<span style="color: #000099; font-weight: bold;">\&quot;</span> onmouseout=<span style="color: #000099; font-weight: bold;">\&quot;</span>this.className='wp_syntax'<span style="color: #000099; font-weight: bold;">\&quot;</span>&amp;gt;&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>There we add and remove a class named mouseover, and styled that class so that the div is wider. Simple, yet effective.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/03/05/improved-code-display-with-wp-syntax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to submit Ext forms the right way</title>
		<link>http://www.diloc.de/blog/2008/03/05/how-to-submit-ext-forms-the-right-way/</link>
		<comments>http://www.diloc.de/blog/2008/03/05/how-to-submit-ext-forms-the-right-way/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 12:58:36 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ext]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/2008/03/05/how-to-submit-ext-forms-the-right-way/</guid>
		<description><![CDATA[Updated 2008/03/12: The code got updated, read more at the bottom. When you work with Ext, sooner or later you will stumble across a design desicion made by the ext developers: Submitting forms is done in the traditional way. This means that the values submitted come from the value field of the input-tag inside the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Updated 2008/03/12: </strong>The code got updated, read more at the bottom.</p>
<p>When you work with <a  href="http://extjs.com" target="_blank">Ext</a>, sooner or later you will stumble across a design desicion made by the ext developers: Submitting forms is done in the traditional way. This means that the values submitted come from the value field of the input-tag inside the form. This leads to several problems:</p>
<ul>
<li>Checkboxes which are not checked are not submitted at all (as normal html-forms also do)</li>
<li>Comboboxes get their displayed value submitted, and not the value behind the combobox</li>
<li>DateFields get their displayed date submitted, which may be different based on the users locale</li>
<li>All Formitems which return something different in their getValue() method from what is written inside the input tags value attribute will probably not be submitted correctly.</li>
</ul>
<p>Thankfully, after some pondering, I developed a nice solution: OOSubmit!</p>
<p>OOSubmit is a custom Ext.form.Action which submits forms in an object-oriented way. &#8211; Hence the name OOSubmit. Instead of going trough the forms input-elements and getting their value attributes, this submit action goes through the form items and calls their corresponding getValue() method. It also looks if the item has a getSubmitValue() method and used that instead of getValue() if present.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #003366; font-weight: bold;">namespace</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Ext.ux&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">/**
 * This submit action is basically the same as the normal submit action,
 * only that it uses the fields getSubmitValue() to compose the values to submit,
 * instead of looping over the input-tags in the form-tag of the form.
 *
 * To use it, just use the OOSubmit-plugin on either a FormPanel or a BasicForm,
 * or explicitly call form.doAction('oosubmit');
 *
 * @param {Object} form
 * @param {Object} options
 */</span>
Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">OOSubmitAction</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>form<span style="color: #339933;">,</span> options<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">OOSubmitAction</span>.<span style="color: #660066;">superclass</span>.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> form<span style="color: #339933;">,</span> options<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
Ext.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">OOSubmitAction</span><span style="color: #339933;">,</span> Ext.<span style="color: #660066;">form</span>.<span style="color: #660066;">Action</span>.<span style="color: #660066;">Submit</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">/**
    * @cfg {boolean} clientValidation Determines whether a Form's fields are validated
    * in a final call to {@link Ext.form.BasicForm#isValid isValid} prior to submission.
    * Pass &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; in the Form's submit options to prevent this. If not defined, pre-submission field validation
    * is performed.
    */</span>
    type <span style="color: #339933;">:</span> <span style="color: #3366CC;">'oosubmit'</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// private</span>
	<span style="color: #006600; font-style: italic;">/**
	 * This is nearly a copy of the original submit action run method
	 */</span>
    run <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> o <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">options</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> method <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> isPost <span style="color: #339933;">=</span> method <span style="color: #339933;">==</span> <span style="color: #3366CC;">'POST'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> params <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">options</span>.<span style="color: #660066;">params</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isPost<span style="color: #009900;">&#41;</span> Ext.<span style="color: #660066;">applyIf</span><span style="color: #009900;">&#40;</span>params<span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">form</span>.<span style="color: #660066;">baseParams</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">//now add the form parameters</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">form</span>.<span style="color: #660066;">items</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>field<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>field.<span style="color: #660066;">disabled</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #006600; font-style: italic;">//check if the form item provides a specialized getSubmitValue() and use that if available</span>
				<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> field.<span style="color: #660066;">getSubmitValue</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;function&quot;</span><span style="color: #009900;">&#41;</span>
					params<span style="color: #009900;">&#91;</span>field.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> field.<span style="color: #660066;">getSubmitValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">else</span>
					params<span style="color: #009900;">&#91;</span>field.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> field.<span style="color: #660066;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">//convert params to get style if we are not post</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>isPost<span style="color: #009900;">&#41;</span> params<span style="color: #339933;">=</span>Ext.<span style="color: #660066;">urlEncode</span><span style="color: #009900;">&#40;</span>params<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">clientValidation</span> <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">false</span> <span style="color: #339933;">||</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">form</span>.<span style="color: #660066;">isValid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            Ext.<span style="color: #660066;">Ajax</span>.<span style="color: #660066;">request</span><span style="color: #009900;">&#40;</span>Ext.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">createCallback</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
                url<span style="color: #339933;">:</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getUrl</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>isPost<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                method<span style="color: #339933;">:</span> method<span style="color: #339933;">,</span>
                params<span style="color: #339933;">:</span>params<span style="color: #339933;">,</span> <span style="color: #006600; font-style: italic;">//add our values</span>
                isUpload<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">form</span>.<span style="color: #660066;">fileUpload</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">clientValidation</span> <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// client validation failed</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">failureType</span> <span style="color: #339933;">=</span> Ext.<span style="color: #660066;">form</span>.<span style="color: #660066;">Action</span>.<span style="color: #660066;">CLIENT_INVALID</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">form</span>.<span style="color: #660066;">afterAction</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//add our action to the registry of known actions</span>
Ext.<span style="color: #660066;">form</span>.<span style="color: #660066;">Action</span>.<span style="color: #660066;">ACTION_TYPES</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'oosubmit'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">OOSubmitAction</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>To use this, simply include the code somewhere in your page, and when you want to submit the form dont use form.submit() but form.doAction(&#8216;oosubmit&#8217;); This way you may always submit the form in the traditional way.</p>
<p>To make it even easier, i wrote a small plugin which can be plugged into a BasicForm or FormPanel. It overrides the standard submit() action and uses the OOSubmit action by default.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * This plugin can be either used on BasicForm or FormPanel.
 * In both cases it changes the behaviour of submit() to use
 * the 'oosubmit' action instead of the 'submit' action.
 */</span>
Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">OOSubmit</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">init</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>_object<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> form<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> _object.<span style="color: #660066;">form</span><span style="color: #339933;">==</span><span style="color: #3366CC;">&quot;object&quot;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//we are a formpanel:</span>
			form<span style="color: #339933;">=</span>_object.<span style="color: #660066;">form</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">else</span> form<span style="color: #339933;">=</span>_object<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">//Save the old submit method:</span>
		form.<span style="color: #660066;">oldSubmit</span><span style="color: #339933;">=</span>form.<span style="color: #660066;">submit</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">//create a new submit method which calls the oosubmit action per default:</span>
		form.<span style="color: #660066;">submit</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>options<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
	          <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">doAction</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'oosubmit'</span><span style="color: #339933;">,</span> options<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	          <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>To use the plugin, simply constuct a BasicForm or FormPanel and add this to the config:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">plugins<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">OOSubmit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span></pre></div></div>

<p>- Done.</p>
<p>The checkbox problem and the combobox gets solved by OOSubmit automatically, because the getValue() function is used.</p>
<p>To fix the datetime problem mentioned above I spent Ext.form.DateField a getSubmitValue() function:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * Returns the submit value of the datefield, always in the same format,
 * regardless of display format.
 * The format returned is Y-m-d, because this is common format used in rdbms. (mysql for example)
 *
 */</span>
Ext.<span style="color: #660066;">form</span>.<span style="color: #660066;">DateField</span>.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">getSubmitValue</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> v <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">!==</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
       <span style="color: #003366; font-weight: bold;">var</span> date<span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>v<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #000066; font-weight: bold;">return</span> date.<span style="color: #660066;">format</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Y-m-d&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">return</span> v<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Thats it! Now everything works like it should (IMHO).</p>
<p>Questions, ideas for improvements, bugs?</p>
<p><strong>Update on 2008/03/12:</strong></p>
<p>OOSubmit now also supports baseParams of forms in POST and GET mode, also custom params passed to form.doAction() are now honored.<br />
As mentioned in the ext forums, the code will now discard disabled fields and not submit them as normal.<br />
The bugs mentioned in the comments have also been fixed. The code should now work out of the box.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/03/05/how-to-submit-ext-forms-the-right-way/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>MySQL Workbench + propel = useful</title>
		<link>http://www.diloc.de/blog/2008/02/26/mysql-workbench-propel-useful/</link>
		<comments>http://www.diloc.de/blog/2008/02/26/mysql-workbench-propel-useful/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 13:14:53 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql workbench]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.diloc.de/blog/2008/02/26/mysql-workbench-propel-useful/</guid>
		<description><![CDATA[This is the first in a series of posts describing the way DiLoc&#124;Rail is built. As already mentioned i use MySQL Workbench to develop the database schema for DiLoc&#124;Rail. Since I got to know Ruby on Rails some years ago, I was reluctant to write the whole database code for the backend of the app [...]]]></description>
			<content:encoded><![CDATA[<p>This is the first in a series of posts describing the way DiLoc|Rail is built.</p>
<p>As <a href="2008/02/21/how-to-not-use-xml/" title="already mentioned">already mentioned</a> i use <a  href="http://dev.mysql.com/workbench/" title="MySQL Workbench" target="_blank">MySQL Workbench</a> to develop the database schema for DiLoc|Rail. Since I got to know Ruby on Rails some years ago, I was reluctant to write the whole database code for the backend of the app manually, I was in search for something similar. Something which does the hard work, so that i can concentrate on the real problems. Since I did not want the whole package as Ruby on Rails is, the Ruby on Rails clones where no option. So I finally found <a  href="http://propel.phpdb.org/" title="propel" target="_blank">propel</a>. Propel concentrates on the model in MVC (<strong>M</strong>odel-<strong>V</strong>iew-<strong>C</strong>ontroller) and is an ORM (<strong>O</strong>bject <strong>R</strong>elational <strong>M</strong>apper) For propel to understand your database, you have to write a schema-file in XML. (There is also an option for reverse engineering the database, but I left that out because it has its own problems). Since I already had a model in MySQL Workbench, I needed a way to convert the workbench file to a propel readable schema.</p>
<p>Over the <a  href="http://blog.tooleshed.com/?p=6" title="DBDesigner4 to Propel XSL" target="_blank">DBDesigner4 to Propel XSL</a> I got to a version for Workbench by <a  href="http://www.joshbryan.com/blog" title="Josh Bryan" target="_blank">Josh Bryan</a> which was a great start, but it only worked with the alpha versions of workbench. I adapted it to work with the beta versions and also improved it quite a bit, to save even more information to the propel schema. Now it supports:</p>
<ul>
<li>all datatypes that MySQL Workbench and propel have in common</li>
<li>propel required attribute</li>
<li>propel default values</li>
<li>autoIncrement attribute</li>
<li>foreign key relations</li>
<li>multiple indexes, both primary and unique</li>
</ul>
<p>Since workbenchs file format is <a href="2008/02/21/how-to-not-use-xml/" title="really ugly">really ugly</a> i was not able to let it work properly if a graphical model is inside the workbench schema. This is due to the weird value/link-tag behaviour mentioned in the last article. I&#8217;m playing with the idea of writing a <a  href="http://dev.mysql.com/workbench/?p=60" title="plugin for MySQL Workbench" target="_blank">plugin for MySQL Workbench</a> to directly save as propel schema, which should be even easier, but documentation on that matter is sparse at best. &#8211; But for now, this solution works satisfyingly.</p>
<p>If anyone is interested, write a comment and ask for the XSL. If many people are interested I would also consider to build a small webservice around it so that you can upload your MySQL Workbench file and get your propel schema for download.</p>
<p>So this was the first part in the series. Next time we will look at how to improve that even more and add some glue to the mix.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/02/26/mysql-workbench-propel-useful/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>How not to use XML!</title>
		<link>http://www.diloc.de/blog/2008/02/21/how-to-not-use-xml/</link>
		<comments>http://www.diloc.de/blog/2008/02/21/how-to-not-use-xml/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 18:32:12 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql workbench]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://cms.diloc.de/blog/2008/02/21/how-to-not-use-xml/</guid>
		<description><![CDATA[This one goes out to the folks of MySQL who develop MySQL Workbench: While starting the project i decided to model the database schema in a handy software, instead of doing all manually and writing SQL from hand. I had discoverd DBDesigner4 earlier and then found out that the man behind DBDesigner got employed by [...]]]></description>
			<content:encoded><![CDATA[<p>This one goes out to the folks of MySQL who develop <a  href="http://dev.mysql.com/workbench/">MySQL Workbench</a>:</p>
<p>While starting the project i decided to model the database schema in a handy software, instead of doing all manually and writing SQL from hand. I had discoverd DBDesigner4 earlier and then found out that the man behind DBDesigner got employed by MySQL to work on a successor of MySQL workbench. That also explained why the last version of DBDesigner4 is already quite dated. Since i needed to convert the schema of Workbench into another format (more on that on a later post) i poked around the possibilities. Luckily for DBDesigner4 there was an XSL to convert into something I needed. I figured: Well if Workbench is based on DBDesigner4 the format of Workbench shouldn&#8217;t be that different. &#8211; False! It is an entire new format. Luckily I found another XSL which worked with the format of the first alpha of Workbench.</p>
<p>It wasn&#8217;t that much work to modify it to work with the first beta of Workbench. While modifing the stylesheet i noticed how broken the format is. While DBDesigner4 had a reasonable format, the whole Workbench file only consists of value- and link-tags.</p>
<p>Example of the beginning:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #ddbb00;">&amp;lt;</span>?xml version=&quot;1.0&quot;?<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>data grt_format=&quot;2.0&quot; document_type=&quot;MySQL Workbench Model&quot; version=&quot;1.1.2&quot;<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;object&quot; struct-name=&quot;workbench.Document&quot; id=&quot;{09E16181-F56F-4679-9BE3-2B3011614FC4}&quot; struct-checksum=&quot;0x168c26cf&quot;<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>value _ptr_=&quot;091538E8&quot; type=&quot;dict&quot; key=&quot;customData&quot;/<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;object&quot; struct-name=&quot;app.DocumentInfo&quot; id=&quot;{9036684B-D03A-4A4C-ADA3-06389EEAA76A}&quot; struct-checksum=&quot;0x6f9ae369&quot; key=&quot;info&quot;<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;author&quot;<span style="color: #ddbb00;">&amp;gt;</span>dhaas<span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;caption&quot;<span style="color: #ddbb00;">&amp;gt;</span>New Model<span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;dateChanged&quot;<span style="color: #ddbb00;">&amp;gt;</span>Jan 30, 2008<span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;dateCreated&quot;<span style="color: #ddbb00;">&amp;gt;</span>Jan 01, 1970<span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;description&quot;<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;name&quot;<span style="color: #ddbb00;">&amp;gt;</span>Properties<span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>link type=&quot;object&quot; struct-name=&quot;workbench.Document&quot; key=&quot;owner&quot;<span style="color: #ddbb00;">&amp;gt;</span>{09E16181-F56F-4679-9BE3-2B3011614FC4}<span style="color: #ddbb00;">&amp;lt;</span>/link<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;project&quot;<span style="color: #ddbb00;">&amp;gt;</span>Name of the project<span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;version&quot;<span style="color: #ddbb00;">&amp;gt;</span>1.0<span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;object&quot; struct-name=&quot;workbench.logical.Model&quot; id=&quot;{F1F49DC7-983C-4675-925A-8C11ECA4206C}&quot; struct-checksum=&quot;0xfe2cd94a&quot; key=&quot;logicalModel&quot;<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value _ptr_=&quot;091533A8&quot; type=&quot;dict&quot; key=&quot;customData&quot;/<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value _ptr_=&quot;09153570&quot; type=&quot;list&quot; content-type=&quot;object&quot; content-struct-name=&quot;model.Marker&quot; key=&quot;markers&quot;/<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value type=&quot;string&quot; key=&quot;name&quot;<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value _ptr_=&quot;091539D8&quot; type=&quot;dict&quot; key=&quot;options&quot;/<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>link type=&quot;object&quot; struct-name=&quot;workbench.Document&quot; key=&quot;owner&quot;<span style="color: #ddbb00;">&amp;gt;</span>{09E16181-F56F-4679-9BE3-2B3011614FC4}<span style="color: #ddbb00;">&amp;lt;</span>/link<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>value _ptr_=&quot;0B4A04C8&quot; type=&quot;list&quot; content-type=&quot;object&quot; content-struct-name=&quot;workbench.logical.View&quot; key=&quot;views&quot;/<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>/value<span style="color: #ddbb00;">&amp;gt;</span></pre></td></tr></table></div>

<p>- Okay, i lied. Actually there is even a third tag. The data-tag surrounds the whole document.<br />
As you see, the fileformat is merely a dump of the internal structures of the workbench document. Ignoring the problems that brings when writing stylesheets because you can only match value-tags and the struct-name attribute which makes the whole XSL kinda messy, this even brings some uglier problems with it: The link-tag. The link-tag represents a pointer in the struct. So in the xml it points to another value-tag somewhere above the document.<br />
But the real problem arises now: Since you cannot distinguish the original and a secondary pointer to any object in C/C++. This means that when an object (which is in fact a pointer) is encountered for the first time, it is saved as value, and on subsequent occurences, it is dumped as a link-tag to the original value.</p>
<p>The problem is now, that the occurences of objects varies, depending on the content of the workbench-model. So for example if you have a graphical representation inside your model, all tables are referenced first in the model and thus dumped as value tags. Later on, when the real table definitions are dumped, only links to the already dumped value-tags are generated.<br />
This makes it really painful to develop a working XSL, because you always have to match two cases of tags: either the information you are searching for is directly inside the value tag, or the value tag is absent. Then you have to find the link-tag, take its id and find the original value-tag by this id.</p>
<p>In line 21 of the example you see such a link which actually was a pointer to the compound document around it. In this case it does not really matter because the workbench.Document will always appear first in the file, but unfortunatly everywhere else this is not the case and causes a host of problems when trying to read the XML-format.</p>
<p>Morale of the story: If you plan to develop your own XML-format, do not just dump your internal data-structures, otherwise you could as well dump them in binary form.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/02/21/how-to-not-use-xml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blog started!</title>
		<link>http://www.diloc.de/blog/2008/02/18/hello-world/</link>
		<comments>http://www.diloc.de/blog/2008/02/18/hello-world/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 12:12:47 +0000</pubDate>
		<dc:creator>dhaas</dc:creator>
				<category><![CDATA[Offtopic]]></category>

		<guid isPermaLink="false">http://cms.diloc.de/blog/?p=1</guid>
		<description><![CDATA[Hello people! The blog is now set up, and when the main DiLoc-page goes online i&#8217;ll try to blog regularly about our endavour to build a sophisticated but still easily usable webbased application. In the meantime head over to the about page and inform yourself about DiLoc. Stay tuned!]]></description>
			<content:encoded><![CDATA[<p>Hello people!<br />
The blog is now set up, and when the main <a  href="http://www.diloc.de">DiLoc-page</a> goes online i&#8217;ll try to blog regularly about our endavour to build a sophisticated but still easily usable webbased application.</p>
<p>In the meantime <a href="about/">head over to the about page</a> and inform yourself about DiLoc.</p>
<p>Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diloc.de/blog/2008/02/18/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

