<?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>David&#039;s virtual world &#187; Software</title>
	<atom:link href="http://blog.vworld.at/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.vworld.at</link>
	<description>Software development and software quality</description>
	<lastBuildDate>Fri, 02 Sep 2011 13:39:28 +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>Releasing cool symfony plugins on github</title>
		<link>http://blog.vworld.at/2011/09/02/releasing-cool-symfony-plugins-on-github/</link>
		<comments>http://blog.vworld.at/2011/09/02/releasing-cool-symfony-plugins-on-github/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 13:36:03 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/?p=252</guid>
		<description><![CDATA[It&#8217;s been a long time since my last post and probably an even longer felt waiting time for those of you dear readers waiting for code. But wait no more, and check out 3 fresh plugins on my github: weUniversalClassLoaderPlugin Want to use an Sf2 component or any other namespaced PHP code in your sf1 [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a long time since my last post and probably an even longer felt waiting time for those of you dear readers waiting for code. But wait no more, and check out 3 fresh plugins on <a href="https://github.com/vworldat/" title="my github">my github</a>:</p>
<h3>weUniversalClassLoaderPlugin</h3>
<p>Want to use an Sf2 component or any other namespaced PHP code in your sf1 project? Use this plugin to make it work automatically.<br />
<a href="https://github.com/vworldat/weUniversalClassLoaderPlugin" title="weUniversalClassLoaderPlugin">weUniversalClassLoaderPlugin</a></p>
<h3>weGlobalConfigPlugin</h3>
<p>A custom config handler to bypass the crowded app.yml with some nice bonus. Not mandatory but useful!<br />
<a href="https://github.com/vworldat/weGlobalConfigPlugin" title="weGlobalConfigPlugin">weGlobalConfigPlugin</a></p>
<h3>weErrorHandlerPlugin</h3>
<p>Tired of finding out where that damn &#8220;Notice in file xy.php on line 1234&#8243; comes from? Make it an exception and view the stack trace!<br />
Sick of crappy php libraries (oh yes, php_ldap, this one goes to you) that use warnings and notices instead of exceptions? This is the past, baby, welcome to the 21st century!<br />
<a href="https://github.com/vworldat/weErrorHandlerPlugin" title="weErrorHandlerPlugin">weErrorHandlerPlugin</a></p>
<h3>What&#8217;s the status, actually?</h3>
<p>All the code comes as-it-is, this means:</p>
<ul>
<li>No (unit) tests</li>
<li>Not all the functions are documented well</li>
</ul>
<p>This shouldn&#8217;t keep you from trying it, since the usage READMEs are helpful and the code is mostly self-explaining. If you have any questions, don&#8217;t bother to ask them (probably by opening github tickets). </p>
<p>If you want to help (e.g. by writing tests, documentation, better code), feel free to fork and pull-request. It&#8217;s all about the code nowadays!</p>
<p>Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2011/09/02/releasing-cool-symfony-plugins-on-github/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Support symfony at the SourceForge.net Community Choice Awards 2009</title>
		<link>http://blog.vworld.at/2009/05/14/support-symfony-at-the-sourceforgenet-community-choice-awards-2009/</link>
		<comments>http://blog.vworld.at/2009/05/14/support-symfony-at-the-sourceforgenet-community-choice-awards-2009/#comments</comments>
		<pubDate>Thu, 14 May 2009 10:47:46 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/?p=179</guid>
		<description><![CDATA[The SourceForge.net Community Choice Awards are on again and it&#8217;s time to nominate the greatest rapid application development PHP framework: symfony! I&#8217;ve nominated symfony in 3 categories: Best Tool or Utility for Developers Best Project Best Commercial Open Source Project Click the picture to nominate symfony too! Of course don&#8217;t forget to read and follow [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://sourceforge.net/community/cca09/">SourceForge.net Community Choice Awards</a> are on again and it&#8217;s time to nominate the greatest rapid application development PHP framework: symfony!</p>
<p>I&#8217;ve nominated symfony in 3 categories:</p>
<ul>
<li>Best Tool or Utility for Developers</li>
<li>Best Project</li>
<li>Best Commercial Open Source Project</li>
</ul>
<p>Click the picture to nominate symfony too! Of course don&#8217;t forget to <strong>read and follow the nomination rules to allow for a fair voting process</strong>!<br />
<a href="http://sourceforge.net/community/cca09/nominate/?project_name=symfony PHP framework&#038;project_url=http://www.symfony-project.org/"><img src="http://sourceforge.net/images/cca/cca_nominate.png" border="0"/></a></p>
<p>Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2009/05/14/support-symfony-at-the-sourceforgenet-community-choice-awards-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TiddlyWiki &#8211; a JavaScript only Wiki engine</title>
		<link>http://blog.vworld.at/2009/04/20/tiddlywiki-a-javascript-only-wiki-engine/</link>
		<comments>http://blog.vworld.at/2009/04/20/tiddlywiki-a-javascript-only-wiki-engine/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 09:35:49 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[Wiki]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/?p=175</guid>
		<description><![CDATA[Today I stumbled upon a JavaScript Wiki engine called TiddlyWiki. It consists of a single HTML file using JQuery to modify itself. There&#8217;s also a good documentation MediaWiki on tiddlywiki.org. TiddlyWiki has a plugin system where you can attach customization JavaScript allowing for various new features. It even provides an auto update mechanism allowing to [...]]]></description>
			<content:encoded><![CDATA[<p>Today I stumbled upon a JavaScript Wiki engine called <a href="http://tiddlywiki.com/">TiddlyWiki</a>. It consists of a single HTML file using JQuery to modify itself. There&#8217;s also a good documentation MediaWiki on <a href="http://tiddlywiki.org/wiki/Main_Page">tiddlywiki.org</a>. TiddlyWiki has a plugin system where you can attach customization JavaScript allowing for various new features. It even provides an auto update mechanism allowing to replace the core JavaScript with a newer version.</p>
<p>If you want to save your Wiki content and settings you just have to allow the browser to re-save the local HTML file &#8211; using that it will just overwrite itself and remember its changes when you re-open the file in the future.</p>
<p>TiddlyWiki is intended to be used as a single user Wiki mostly, ranging from a powerful notebook or journal to a tool to document all your work. Since it creates backup copies of its previous state upon saving, you don&#8217;t have to fear losing all your work at once in the future.</p>
<p>I think it is really great fun to use and marks a new step in browser based software. After playing around for a while I quickly understood how to use it and what benefits one might gain from such a tool.</p>
<p>Try it out for yourself and have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2009/04/20/tiddlywiki-a-javascript-only-wiki-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stackoverflow.com &#8211; a great database for developers</title>
		<link>http://blog.vworld.at/2008/09/26/stackoverflowcom-a-great-database-for-developers/</link>
		<comments>http://blog.vworld.at/2008/09/26/stackoverflowcom-a-great-database-for-developers/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 08:00:12 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/?p=38</guid>
		<description><![CDATA[Joel Spolsky, a co-founder of http://stackoverflow.com recently announced the launch of this great Q&#038;A tool from programmers for programmers. I&#8217;ve taken a look at it yesterday and liked it immediately. Even if you don&#8217;t have any particular question, just browsing it for fun or broadening your mind is great and leads to some nice insights.]]></description>
			<content:encoded><![CDATA[<p>Joel Spolsky, a co-founder of <a href="http://stackoverflow.com/">http://stackoverflow.com</a> recently <a href="http://www.joelonsoftware.com/items/2008/09/15.html">announced the launch</a> of this great Q&#038;A tool from programmers for programmers. I&#8217;ve taken a look at it yesterday and liked it immediately.</p>
<p>Even if you don&#8217;t have any particular question, just browsing it for fun or broadening your mind is great and leads to some nice insights.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2008/09/26/stackoverflowcom-a-great-database-for-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fighting spam</title>
		<link>http://blog.vworld.at/2008/07/18/fighting-spam/</link>
		<comments>http://blog.vworld.at/2008/07/18/fighting-spam/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 15:11:36 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/?p=14</guid>
		<description><![CDATA[OMG, those registration spam bots are such an annoyance! For this reason I combined my upgrade to wordpress 2.6 with the installation of the Register-Plus plugin to add a captcha to the registration. Unfortunately the simple captcha does not seem to work, it always tells me that my captcha code is wrong (I also tried [...]]]></description>
			<content:encoded><![CDATA[<p>OMG, those registration spam bots are such an annoyance!</p>
<p>For this reason I combined my upgrade to <a href="http://wordpress.org/development/2008/07/wordpress-26-tyner/">wordpress 2.6</a> with the installation of the <a href="http://wordpress.org/extend/plugins/register-plus/">Register-Plus plugin</a> to add a captcha to the registration. Unfortunately the simple captcha does not seem to work, it always tells me that my captcha code is wrong (I also tried adding session_start() to wp_login.php as suggested by the plugin, but it didn&#8217;t help), so I switched to the <a href="http://recaptcha.net/">reCAPTCHA service</a>. reCAPTCHA works and should be good against bots, so let&#8217;s hope for the best!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2008/07/18/fighting-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to backup web hosts</title>
		<link>http://blog.vworld.at/2008/04/07/how-to-backup-web-hosts/</link>
		<comments>http://blog.vworld.at/2008/04/07/how-to-backup-web-hosts/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 13:20:48 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[7-zip]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[VBScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/?p=10</guid>
		<description><![CDATA[Do you backup your personal data regularly? I hope so. If you don&#8217;t, stop reading here and go backup your data. If you are still reading this, you are really doing backups of your personal data. But do you have regular backups of your web host data (e.g. blog, forum, online shop) including files AND [...]]]></description>
			<content:encoded><![CDATA[<p>Do you backup your personal data regularly? I hope so. If you don&#8217;t, stop reading here and go backup your data.</p>
<p>If you are still reading this, you are really doing backups of your personal data. But do you have regular backups of your web host data (e.g. blog, forum, online shop) including <em>files AND databases</em>? Perhaps you are using stuff like <a title="phpMyAdmin" href="http://www.phpmyadmin.net/">phpMyAdmin</a> to backup your databases from time to time.<br />
And if you DO have backups of your web host (and I&#8217;m sure that there are not many people out there doing this, especially for their private hosts), do you have an archive of previous versions? Yes? You&#8217;re great, welcome on board, skip this blog posting (or don&#8217;t if you want to learn how I do it).</p>
<p>Everyone else who wants to know how to perform <strong>fully automated incremental backups</strong> of your web host <strong>including files and mysql databases and an archive of previous backups</strong> and do all this on Windows (of course I know that the Linux guys have advantages in that area) go and read on&#8230;</p>
<p><span id="more-10"></span></p>
<h3>What you need for backing up your web host</h3>
<p>To perform the automated backup described here you need the following things:</p>
<ul>
<li>A web host that is reachable over FTP</li>
<li><a title="phpMyBackupPro" href="http://www.phpmybackuppro.net/">phpMyBackupPro</a></li>
<li><a title="Wget for Windows" href="http://www.christopherlewis.com/WGet/WGetFiles.htm">GNU Wget for Windows</a> (included in my package)</li>
<li><a title="7-zip" href="http://www.7-zip.org/">7-zip</a></li>
<li><a title="David's web host backup" href="http://blog.vworld.at/download/Davids+web+host+backup+script">David&#8217;s Web Host Backup Script v1.0</a></li>
</ul>
<h3>Setup phpMyBackupPro</h3>
<p><a title="phpMyBackupPro download" href="http://www.phpmybackuppro.net/download.php">Download the latest version</a> (currently 2.1) and any language file if you prefer non-English interfaces. The installation is quite easy: just follow the instructions in the INSTALL.txt file. The moving/renaming of the configuration file is security through obscurity: it should be fine without this, but making assurance double sure is no bad way of thinking in terms of security. I have secured my export directory through a .htaccess file, so no one can access anything in there from the web. The .htaccess file is included in my backup package.</p>
<p>After successfully entering your configuration data in phpMyBackupPro you are ready to proceed. Go to the &#8220;configuration&#8221; and choose &#8220;Extended configuration&#8221; and set up the values for automatic deletion of files (I have marked the fields with big red dots):</p>
<p><a href='http://blog.vworld.at/wp-content/uploads/pmbp_config.png'><img src="http://blog.vworld.at/wp-content/uploads/pmbp_config-300x158.png" alt="phpMyBackupPro Extended configuration" title="pmbp_config" width="300" height="158" class="alignnone size-medium wp-image-11" /></a></p>
<p>These values depend basically on your personal preferences and on the size of your databases and available web host space. I&#8217;m using 14 days, so there are always 14 days of previous database backups directly on the web server. I think 5 or 7 would be enough, but as long as there is enough space&#8230; however. Let&#8217;s go on!</p>
<h3>Create a schedule job file</h3>
<p>phpMyBackupPro has a nifty little feature to create semi-automated backups. Go to &#8220;schedule backup&#8221; and set the following options:</p>
<ul>
<li><strong>Backup period:</strong> 1 day</li>
<li><strong>Directory:</strong> choose any directory on your server where you might want to put the caller script, I usually just put it into the phpMyBackupPro directory</li>
<li><strong>Databases:</strong> Select all databases you want to include in the backup</li>
<li><strong>Comments:</strong> I always enter &#8220;daily backup&#8221; here</li>
<li>Make sure all the checkboxes below the comments area are checked. For the compression i prefer <em>gzip</em> since <em>zip</em> does not always work. If your web server does not support compression select <em>none</em>.</li>
</ul>
<p>After clicking &#8220;Show script&#8221; you should get something like this:</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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// This code was created by phpMyBackupPro v.2.1 </span>
<span style="color: #666666; font-style: italic;">// http://www.phpMyBackupPro.net</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'db'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;database_1&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'comments'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;daily backup&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tables'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;on&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'data'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;on&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'drop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;on&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'zip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;gzip&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$period</span><span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3600</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">24</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$security_key</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;eae9fe894401239614a469f87e7ec638&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// This is the relative path to the phpMyBackupPro v.2.1 directory</span>
<span style="color: #339933;">@</span><span style="color: #990000;">chdir</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;../phpMybackupPro/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">@</span><span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;backup.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Because the backup always takes a few seconds the full 24 hours setting for the period would work only every 2nd day in average. Therefore I change it to 22 hours (this also makes sure no DST change overrules a backup):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$period</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">3600</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">22</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Now take the content and put it into a file called something like &#8220;auto_backup.php&#8221; and upload it onto your server &#8211; to the directory you specified before. Now it&#8217;s time for the first test: type the address to the auto_backup.php into your browser and hit enter: </p>
<p>http://www.yourhost.com/your-path/auto_backup.php</p>
<p>You will see nothing but a blank page in the browser. To check if the backup worked, go back to your phpMyBackupPro installation and select &#8220;import&#8221;. There you should see something like <em>database_1.1206988550.sql.gz</em>. If the list is empty, check your script for an invalid relative path in the @chdir or try to perform a manual backup in phpMyBackupPro. To perform several test backups in a row you must change the period value in the auto_backup.php to something much smaller like 30 seconds or so. Don&#8217;t forget to set it back to 22 hours afterwards!</p>
<h3>How to get the files from your web host to your PC</h3>
<p>This is where I had so search quite a long time myself (there are lots of automated FTP mirror tools, most of them costing too much money and not providing what I need here) until I found a solution that is so unbelievably easy that I don&#8217;t know why I didn&#8217;t get it earlier. The point is not only in loading everything from your server but also 2 other things:</p>
<ul>
<li>Getting only those files that are new or have changed</li>
<li>Getting rid of stuff that also does not exist on the server anymore (full one-way synchronization)</li>
</ul>
<p>There are tools like rsync out there, but they are too Unix-oriented for my taste and often require shell access that can&#8217;t be provided. What I needed had to work with any regular FTP server.</p>
<p>I found out that Wget, the command-line HTTP download tool from the Unix world, is also available for Windows and can download complete FTP structures too. There are of course thousands of people that have known this for years, but I did not since I&#8217;m using mostly Windows. Knowledge still equals power.</p>
<p>So what I do is mirroring the FTP server locally using Wget. Of course those readers who know that Wget only does mirroring, not synchronizing, will ask <em>what the hell is he braying about, that&#8217;s not what we need!</em>. Well, it was not what I needed either. But it was the main part to be followed by some work of myself.</p>
<h3>How to get rid of files that don&#8217;t exist anymore</h3>
<p><img src="http://blog.vworld.at/wp-content/uploads/fairytale_trash_full1.png" alt="Trash me, baby!" title="trash_full" width="48" height="48" class="alignright size-full wp-image-12" style="margin: 5px 0 5px 5px" /><br />
The whole topic of synchronization is about getting the things that have changed (this we have already achieved) and then getting rid of the stuff that&#8217;s not on the other side anymore (e.g. old database backups that have been removed or folders that have been renamed). Wget comes in handy in this situation: when downloading from a server, it can provide a file called <em>.listing</em> that names all files that have been downloaded. So the conclusion is: everything that is NOT in this .listing file is outdated and ready to be trashed.</p>
<p>To parse these .listing files and remove outdated files and folders I&#8217;m using an <a title="Eclipse" href="http://www.eclipse.org/">Eclipse</a>-based file organization workspace that is strictly object oriented and needs 450 Megabytes of space on your hard drive. Ha, got you there, just joking! It&#8217;s a dirty little VBScript, and I&#8217;m sure there are lots of ways to improve it, but it works fine for me and that&#8217;s basically why I want to share it with people out there who need something that might be working fine for them.</p>
<h3>How to get an archive of previous versions</h3>
<p>After moving the old files away my script calls 7-zip to create a compressed self-extracting archive. By using the self-extractor feature you don&#8217;t have to worry if you don&#8217;t have 7-zip any more one day &#8211; the files will be available as long as something can execute win32 binaries. There is a new archive created for every day (using the current date when you are executing the script), so you can spot your old data easily.</p>
<h3>Summary</h3>
<p>So this is what my backup does in the same order:</p>
<ul>
<li>Start the database backup online using Wget</li>
<li>Grab everything that has changed (including the latest database image) using Wget</li>
<li>Move everything away that is not on the web server anymore using my VBScript</li>
<li>Create a compressed archive bearing the current date in its name using my VBScript and 7-zip</li>
</ul>
<p>Use the Windows Task Manager to kick this off every day at the same time and that&#8217;s it!</p>
<h3>Yeah, alright, I just want to download this thing and go on!</h3>
<p>In the end this is all you need besides 7-zip and phpMyBackupPro (which you don&#8217;t need in case you don&#8217;t have a database to backup):</p>
<p><a title="David's web host backup" href="http://blog.vworld.at/download/Davids+web+host+backup+script">David&#8217;s Web Host Backup Script v1.0</a></p>
<p>Please read the included README.txt file carefully. It is quite long, but you will save the time for reading hundredfold as soon as the backup works and you don&#8217;t have to do anything any more.<br />
Unpack everything to some folder. The folder where <em>wget.exe</em> and <em>clean.vbs</em> reside is also the root folder of all backup stuff. Read the README.txt again, edit <em>example_backup.cmd</em> according to your needs and configuration and lean back!</p>
<h3>License</h3>
<p>I have released my part of this package under the <a title="GNU GPLv3" href="http://www.gnu.org/copyleft/gpl.html">GNU GPLv3</a>. Wget uses the same license, and I&#8217;ve included everything that was inside the original wget package. Feel free to use, modify or spread my work as long as you include the original copyright notice and license.</p>
<p>Please be careful when editing the batch file or modifying the script. I cannot take any responsiblity for your lost data if you do something wrong. If you are unsure please ask me.<br />
This little script has been working fine for me for over 18 months and I&#8217;m currently backing up 5 different web hosts every day without any problems, and of course without having to do anything manually. Every few weeks I check if everything is fine and delete some old archives, but that&#8217;s it!</p>
<p>If you have any questions, comments or improvements you want to share with others, feel free to comment here or send me an email using david (at) vworld.at.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2008/04/07/how-to-backup-web-hosts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why some web applications are more usable than others (part 3)</title>
		<link>http://blog.vworld.at/2008/04/04/why-some-web-applications-are-more-usable-than-others-part-3/</link>
		<comments>http://blog.vworld.at/2008/04/04/why-some-web-applications-are-more-usable-than-others-part-3/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 09:14:52 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/?p=7</guid>
		<description><![CDATA[So I had my local Joomla! test installation and it was working fine so far. The next step was to transfer the installation to my public web host. It&#8217;s a classic LAMP multi-user host with PHP4 and MySQL. Nothing to expect any problems from&#8230; Copying the files and database worked just as well as expected. [...]]]></description>
			<content:encoded><![CDATA[<p>So I had my local <a title="Joomla!" href="http://www.joomla.org/" target="_blank">Joomla!</a> test installation <a title="Why some web applications are more usable than others (part 2)" href="http://blog.vworld.at/2008/03/14/why-some-web-applications-are-more-usable-than-others-part-2/" target="_self">and it was working fine so far</a>. The next step was to transfer the installation to my public web host. It&#8217;s a classic LAMP multi-user host with PHP4 and MySQL. Nothing to expect any problems from&#8230;</p>
<p><span id="more-7"></span></p>
<p>Copying the files and database worked just as well as expected. I had the CMS up and running on the external host after 10 or 15 minutes of uploading, checking and adapting the configuration. The performance was ok, too. I added some further content and was satisfied with the results so far.</p>
<h3>Extending Joomla!</h3>
<p>The frustration followed when I tried to install additional plugins. My web host uses the inglorious <a title="PHP Safe Mode" href="http://uk.php.net/features.safe-mode">Safe Mode</a> and it cannot be deactivated (and I cannot switch the web host so easily either, so I&#8217;m kind of stuck with it), so there is no way around it. I would also accept the fact that Joomla! just does not work with the Safe Mode &#8211; but the documentation does not say so! In fact there are some hacks and plugins that allow installing Joomla! in Safe Mode, but they do not seem to work for everyone, and they are apt to be pure pain.</p>
<p>What bugs me even more than the fact this is not working is that it handles the failures extremly badly in my opinion. Let me give you an example of a simple plugin installation that goes wrong:</p>
<ul>
<li>I started by uploading a package file through the weg interface &#8211; this just didn&#8217;t work at all, probably because it could not be decompressed or whatever. Ok.</li>
<li>I tried to manually upload a package to the web host and install it from there. This resultet in some error messages telling me that this or that folder had no write permissions.</li>
<li>Creating the folder and providing write permissions would not work either &#8211; then the installer complained that the folder already existed</li>
<li><strong>You truly have to give write access to nearly all folders of your Joomla! installation to allow the installation of extensions!</strong> Now it could create the folder and copy the files, but failed to copy another plugin package because <strong>it was already there</strong>!</li>
<li>Deleting this other package became very interesting too, since deleting files created by the web server does not work through FTP in safe mode. The solution was a quick deltree-like PHP script.</li>
<li>After some further failed tries I decided to give up the automatic installer take a look at the installation script.</li>
</ul>
<p>The installation script is quite simple: some uncompressing and copying of archives with folders inside and a few lines to be added to the database.</p>
<h3>Doing it manually</h3>
<p>As someone who has been used to installing <a title="phpBB" href="http://www.phpbb.com/">phpBB</a> MODs just the manual way for years I have absolutely no aversion to copy a few files and add a few lines to the database (this could even be done easily through a provided little script). But Joomla! just does not allow to do this &#8211; at least not officially. They seem to be so proud of their error prone Extension Installer, that it does not come to their mind to allow anything else.</p>
<p><strong>An extension installer that is not failsafe (e.g. providing fallback mechanisms if something goes wrong) is bad. Some unexperienced user could ruin their whole installation just by trying to install an extension the way it is suggested!</strong></p>
<p>This makes Joomla! maintenance just a little better than <a title="Why some web applications are more usable than others (part 1)" href="http://blog.vworld.at/2008/03/10/why-some-web-applications-are-more-usable-than-others-part-1/">DotNetNuke maintenance</a>, but they are close. I don&#8217;t know what I had done if my Joomla! installation had gone down the drain too. Perhaps I would have tried typo3.</p>
<p>After this experience the way to upgrade or extend your Joomla! installation on a Safe Mode web host is clear:</p>
<ul>
<li>Copy your Joomla! installation to a local XAMPP or whatever environment with less restrictions</li>
<li>Install everything you need</li>
<li>Move it back to the other server</li>
<li>Don&#8217;t forget to do backups!</li>
</ul>
<p>Fortunately (at least they got this right at Joomla!) the database and path configuration is stored in a single text file, so you can move everything else and it will keep working.</p>
<h3>Software that does this better</h3>
<p>By the way this was my first bad experience with Safe Mode during the last 4 or 5 years. Just recently I installed phpBB 3.0 on another web host like this (it was even an upgrade from 2.x) and it just worked. <strong>IT JUST WORKED</strong>. The phpBB guys make sure that their software <strong>works on nearly any web server configuration</strong> and this is what makes their product so successful. Joomla! looks great and has lots of useful features, but in that respect the maintainers still have a lot to learn. Learn about why some web applications are more usable than others.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2008/04/04/why-some-web-applications-are-more-usable-than-others-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why some web applications are more usable than others (part 2)</title>
		<link>http://blog.vworld.at/2008/03/14/why-some-web-applications-are-more-usable-than-others-part-2/</link>
		<comments>http://blog.vworld.at/2008/03/14/why-some-web-applications-are-more-usable-than-others-part-2/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 13:14:21 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/2008/03/14/why-some-web-applications-are-more-usable-than-others-part-2/</guid>
		<description><![CDATA[After the DotNetNuke desaster I settled down to the more classic way &#8211; nice and understandable PHP CMS software. After some consultation I had to decide between using typo3 and Joomla!. Joomla! made the win (I just thought typo3 was a little too complex for the given situation), but it was no easy task&#8230; For [...]]]></description>
			<content:encoded><![CDATA[<p>After the <a href="http://www.dotnetnuke.com/" target="_blank">DotNetNuke</a> desaster I settled down to the more classic way &#8211; nice and understandable PHP CMS software. After some consultation I had to decide between using <a href="http://typo3.org/" target="_blank">typo3</a> and <a href="http://www.joomla.org/" target="_blank">Joomla!</a>. Joomla! made the win (I just thought typo3 was a little too complex for the given situation), but it was no easy task&#8230;</p>
<p><span id="more-6"></span></p>
<p>For PHP stuff testing purposes I usually consult my local <a href="http://www.apachefriends.org/" target="_blank">XAMPP</a> installation. This is an easy to use Apache/PHP/MySQL package that is preconfigured and runs out-of-the-box &#8211; at least as long as you don&#8217;t need full <a href="http://pear.php.net/" target="_blank">pear</a> support with commandline installer and everything, but that is another story to be written.</p>
<p>Joomla! is based on the <a href="http://www.mamboserver.com/" target="_blank">Mambo</a> CMS and was forked during some quarrel over the development roadmap and commercialization issues a few years ago. There are 2 versions available: 1.0.x and 1.5.x. While the 1.0.x path bears more resemblance to the original Mambo code, the 1.5.x series was designed with modularity in mind and is easier to extend and maintain. I decided to take the latest version, even though the first release of 1.5.0 is only several weeks past.</p>
<p>The installation completed without any troubles and after 3 hours of studying the backend I had a fairly good knowledge of how Joomla! works. Of course there is much to learn yet, but so far this was fine. The next step was to continue where <a href="http://blog.vworld.at/2008/03/10/why-some-web-applications-are-more-usable-than-others-part-1/">DotNetNuke had failed</a>: change the template of my page. My template of choice was Siteground J15-22 (<a href="http://www.joomlademos.de/home?template=siteground-j15-22" target="_blank">Demo</a>). It has a variable (adjustable) width, is fully XHTML compliant and looks quite nice. The template installation was as easy as it could be: save to template folder, activate in admin panel, done.</p>
<p>There was one thing though that annoyed me: when using sub items inside the sidebar menu, they appeared only if the parent item was selected &#8211; this is the default behaviour and ok for me. But when I activated the option to always show sub menu items, they were visible but no longer recognizable as sub menu items because they look the same as the parent items. WTF?</p>
<p>After seeing through the code I found out that both Joomla! and the template share their parts in this issue. The menu is made of an unordered list, and all the items bear a different CSS class parameter like this: &lt;li class=&#8221;item53&#8243;&gt; or &lt;li class=&#8221;item54 parent&#8221;&gt;. The currently selected item looks like this: &lt;li class=&#8221;item24&#8243; id=&#8221;current&#8221;&gt;. Come on, this is bad! There are even space characters in the class names!</p>
<p>Shouldn&#8217;t the class and id tags be the other way round? What is the use of having lots of menu items with completely different css classes? Was the developer who did this on some psycho-pushing substance &#8211; like, erm, caffeine &#8211; or just thinking &#8220;nobody will ever have to define CSS classes for their menu items, so this is fine&#8221; or just simply ignorant? My point in this is the following: you can&#8217;t have grouped menu items with this design. You can&#8217;t assign 1 or 2 menu items a specific style (oh, you can&#8230; but if the item ids ever change, the style will be gone or even be assigned to the wrong item!). It just feels bad, and this is why I had to undo this in the mod_mainmenu PHP code.</p>
<p>I also fixed the style sheet so that sub menu items are always indented. Personally I would have preferred to use something like a .subitem{} CSS class &#8211; at least this would have saved a lot of CSS code. But defining the style through the structure alone is perhaps the even better model, so I kept with that.</p>
<p>OK. So far the style was ok, the menu was working as I would expect it, and I filled in some of the content from the DotNetNuke installation that had been fixed by my colleague in the meantime &#8211; he had a full backup from before <a href="http://blog.vworld.at/2008/03/10/why-some-web-applications-are-more-usable-than-others-part-1/">me meddling around with it</a>.</p>
<p>The next chapter in this small series will be about the transfer to a LAMP web host and how the real trouble with Joomla! began.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2008/03/14/why-some-web-applications-are-more-usable-than-others-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why some web applications are more usable than others (part 1)</title>
		<link>http://blog.vworld.at/2008/03/10/why-some-web-applications-are-more-usable-than-others-part-1/</link>
		<comments>http://blog.vworld.at/2008/03/10/why-some-web-applications-are-more-usable-than-others-part-1/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 12:17:12 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.vworld.at/2008/03/10/why-some-web-applications-are-more-usable-than-others-part-1/</guid>
		<description><![CDATA[Just recently a colleague and I had to design a little web site and fill it with some content. We decided to use an open source CMS and since the existing infrastructure contains a Windows 2003 Server with IIS and MS SQL as a database backend, he convinced me to give DotNetNuke (DNN) a try. [...]]]></description>
			<content:encoded><![CDATA[<p>Just recently a colleague and I had to design a little web site and fill it with some content. We decided to use an open source CMS and since the existing infrastructure contains a Windows 2003 Server with IIS and MS SQL as a database backend, he convinced me to give <a href="http://www.dotnetnuke.com/" target="_blank">DotNetNuke</a> (DNN) a try. This was when the fun began&#8230;</p>
<p><span id="more-5"></span></p>
<p>The installation seemed fairly easy, and he had a web site including some test content set up in a short time. Personally I think of the basic design as &#8220;quite ugly&#8221;, but this shouldn&#8217;t be a problem for an experienced web developer, should it? Besides the optical ugliness there was a second reason for me to decline the existing layout: its lack of working without javascript turned on (oh how I hate those javascript-only menus!). Besides being a usability failure we should have overcome 5 years ago, this also makes a web site less indexable by any search engine, so this is a knock-yourself-out-kit for any serious business web site.</p>
<p>I took a look at the default templates and was somewhat lost. OK. Lots of HTML and other (unrecognizable) files. Then I took a look at the documentation (pdf only?) and was a little less lost, but this was plainly a pain. Fortunately I found a nice and slick and clean replacement template at <a href="http://www.xhtmlskins.com/" target="_blank">xhtmlskins.com</a>, which I downloaded after registering on their web site (guys, this was the last time I did this, I was just too desperate to search any further).  This template (or skin as it is called throughout DNN) is a zip package with some files inside (this one much easier to understand than the template on the web server). I uploaded the skin package using the skin upload mechanism built into DNN, and this is problably where I should have RTFM first. There are 2 options when uploading a skin, and it looks like I chose the wrong one. The upload worked and the DNN engine obviously unpacked the zip file, parsed the HTML data and created lots of new files, so everything looked fine.</p>
<p>Everything fine? Wrong, pal! After the (seemingly) successful upload of the skin I activated it as my default skin. You never guess what happened: the page broke completely. At first, some content panes switched their layout to something totally different, including lots of partly unrecognizable error messages. When I navigated the page, i got very long waiting times, followed by an IIS error. Going back there was no chance to undo what I just had done. I messed up and killed the complete DotNetNuke installation by <em>activating the wrong skin</em>. Since there is no separate admin front end there is no chance to remove this any other way than by accessing the server directly (which wasn&#8217;t possible at that moment). Knock-yourself-out at its best.</p>
<p>I don&#8217;t know if I will ever install DNN again in my life. This happening even convinced  my otherwise Microsoft-friendly colleague to go for something different &#8211; which will be the next part of this story.</p>
<p>One more thing before any fanboy fraction starts to complain: I know that I possibly made a mistake. But any software that is THAT mature (version 4.8) and THAT widespread should do better than screw up by installing a skin. This is what software quality is about, and DNN did this incredibly wrong. Period.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vworld.at/2008/03/10/why-some-web-applications-are-more-usable-than-others-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

