<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-998418780028044861</atom:id><lastBuildDate>Sat, 19 May 2012 06:06:20 +0000</lastBuildDate><category>control</category><category>gpg</category><category>package</category><category>sysadmin</category><category>news</category><category>gentoo</category><category>latex</category><category>development</category><category>hash</category><category>updates</category><category>api</category><category>patch management</category><category>pmd</category><category>qc</category><category>configuration</category><category>git</category><category>rss</category><category>smartmontools</category><category>video</category><category>email</category><category>mdadm</category><category>polymeraze</category><category>kolab gentoo openpkg gentoo-prefix</category><category>patch</category><category>packages</category><category>openrc</category><category>system</category><category>blogroll</category><category>talk</category><category>example</category><category>diff</category><category>Kolab_Storage</category><category>ebs ec2 howto resize</category><category>apache zeta</category><category>puppet</category><category>rest</category><category>interview</category><category>unit testing</category><category>design</category><category>pear</category><category>framework</category><category>ubuntu</category><category>project</category><category>kolab2gentoonews</category><category>subversion</category><category>svn</category><category>ruby</category><category>horde 5</category><category>feeds</category><category>gummy bears</category><category>mail</category><category>yahoo pipes</category><category>packaging</category><category>support</category><category>autoloading</category><category>ec2</category><category>layman</category><category>entry</category><category>perl</category><category>github</category><category>baselayout</category><category>linux magazin</category><category>demo</category><category>deployments</category><category>flow</category><category>gentoo layman linuxmag article writing book</category><category>jonah</category><category>image</category><category>booth</category><category>horde 4</category><category>repository</category><category>owncloud</category><category>hack</category><category>recovery</category><category>screen</category><category>init</category><category>radio</category><category>backdoor</category><category>english</category><category>wvdial</category><category>howto</category><category>note</category><category>adhearsion</category><category>codesniffer</category><category>masking</category><category>modules</category><category>hudson</category><category>post</category><category>docblox</category><category>kde</category><category>libraries</category><category>horde_feed</category><category>queue</category><category>jquery</category><category>wikipedia</category><category>unstable</category><category>server</category><category>horde</category><category>writing</category><category>opml</category><category>package management</category><category>dar</category><category>alltests</category><category>mobile</category><category>continuous integration</category><category>installation</category><category>documentation</category><category>kolabkonsortium</category><category>phpunit</category><category>kolab</category><category>horde4</category><category>storage</category><category>kolab2gentoo</category><category>chemnitz</category><category>llc</category><category>fair</category><category>presentation</category><category>cebit</category><category>groupware</category><category>horde_pear</category><category>iphone</category><category>stable</category><category>buch</category><category>pardalys</category><category>opensourcepress</category><category>handy</category><category>performance</category><category>zeta mail</category><category>aws</category><category>cron</category><category>raid</category><category>backup</category><category>ansel</category><category>rfcomm</category><category>setuptools</category><category>sourceforge</category><category>pardus</category><category>imap_client</category><category>cloud</category><category>bash</category><category>vserver</category><category>libpardus</category><category>android</category><category>syncml</category><category>newsletter</category><category>coding</category><category>atom</category><category>components</category><category>screenshot</category><category>version control</category><category>release</category><category>testing</category><category>restructuredtext</category><category>jquery-mobile</category><category>gallery</category><category>yahoo</category><category>wiki</category><category>quilt</category><category>jenkins</category><category>mirror</category><category>ipad</category><category>gpl</category><category>blog roll</category><category>ldap</category><category>analysis</category><category>python</category><category>internet</category><category>ci</category><category>debian</category><category>script</category><category>opensourcescool</category><category>distutils</category><category>quality control</category><category>pipes</category><category>linux</category><category>harddisk</category><category>crash</category><category>cvs</category><category>portage</category><category>emacs</category><category>feed</category><category>zeta</category><category>translation</category><category>php</category><category>programming</category><category>use flags</category><category>tutorial</category><category>openpkg</category><category>voip</category><category>website</category><category>book</category><category>blog</category><category>virtual server</category><category>bluetooth</category><category>free software</category><category>imap</category><category>hrode</category><category>article</category><category>smartctl</category><category>mercurial</category><category>system administration</category><category>keywords</category><title>p@rdus</title><description>p@rdus blog.</description><link>http://log.pardus.de/</link><managingEditor>noreply@blogger.com (Gunnar Wrobel)</managingEditor><generator>Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-6337962673108466436</guid><pubDate>Fri, 11 May 2012 12:38:00 +0000</pubDate><atom:updated>2012-05-11T15:03:53.105+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>release</category><category domain='http://www.blogger.com/atom/ns#'>design</category><category domain='http://www.blogger.com/atom/ns#'>llc</category><category domain='http://www.blogger.com/atom/ns#'>horde 5</category><category domain='http://www.blogger.com/atom/ns#'>screenshot</category><title>A sneak peek of the new Horde 5 user interface</title><description>&lt;a href="http://www.horde.org/images/screenshots/webmail/horde5_webmail_draft.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://www.horde.org/images/screenshots/webmail/horde5_webmail_draft-thumb.jpg" style="float: right; margin: 0pt 0pt 10px 10px;" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;To get an idea on how Horde 5 will look like: click &lt;a href="http://www.horde.org/images/screenshots/webmail/horde5_webmail_draft.png"&gt;the link&lt;/a&gt; or the image of this post.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Why does Horde 5 get a face lift? Simply because the current UI was mentioned often enough as an issue by many Horde users. And since the Horde 4 release had a very technical focus the switch from Horde 3 to Horde 4 last year did not help - it even degraded consistency between the applications. At the same time the competition does not sleep and there are more and more large installations that offer their user base two different webmails - one of them being Horde for the power users that feel they need a lot of features but that care less about the UI. Time to get our act together.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So what is the primary target of the redesign? First and foremost we want to unify the main user interfaces. At the moment we have the static application views, the dynamic webmailer, and the dynamic calender as the core parts. All looked somewhat different. These are the elements that we wish to give a consistent look. The special views such as the minimal webmailer or the smartphone UI will remain untouched.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;We also hope the new design looks somewhat fresher than what we had before but please keep in mind that we are oriented towards people that use the interface for their daily work. We do not aim for a UI that looks like the last hype. It should be functional instead.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The Horde LLC has been the driving factor behind the redesign. At least financially. A subset of the Horde core developers started the LLC a while back as a contact point for people that want to pay for Horde support or feature development. A part of the money that such contracts pay goes to the developers dealing with the particular customer request. But another part of the money remains within the LLC. The idea is to use the latter to drive features that we consider to be important for Horde and its community. The redesign is the first project that has been financed this way. The Horde team tried finding designers interested in contributing to an Open Source project several times before. This was unsuccessful however and paying a designer for the work remained the only reasonable alternative.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;We contracted &lt;a href="http://www.no-agency.de"&gt;No agency&lt;/a&gt; for the design. After several rounds of communication between them and all Horde developers we managed to end up with the draft displayed above. This has been converted to HTML and CSS this week and will be hammered into code during the next week by &lt;a href="http://www.janschneider.de"&gt;Jan Schneider&lt;/a&gt;. We do hope to present you with an alpha of Horde 5 - including the draft of the new design - on the 22nd May of 2012.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Feedback and comments - as usual - are welcome!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-6337962673108466436?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2012/05/sneak-peek-of-new-horde-5-user.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>6</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-4002825160926439820</guid><pubDate>Thu, 08 Mar 2012 07:45:00 +0000</pubDate><atom:updated>2012-03-08T08:45:42.514+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>cebit</category><category domain='http://www.blogger.com/atom/ns#'>gpl</category><category domain='http://www.blogger.com/atom/ns#'>gummy bears</category><category domain='http://www.blogger.com/atom/ns#'>kde</category><category domain='http://www.blogger.com/atom/ns#'>free software</category><title>Horde becomes biggest KDE sponsor!</title><description>&lt;a href="http://www.flickr.com/photos/wrobel/6963667739" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" height="240" src="http://farm8.staticflickr.com/7056/6963667739_7fea9e08ba_m.jpg" style="float: right; margin: 0pt 0pt 10px 10px;" width="135" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Here at &lt;a href="http://www.cebit.de"&gt;CeBIT&lt;/a&gt; we support our friendly neighbor project with a constant and vital support of gummy bears. As anyone knows these sweet animals can make the difference between one line of brilliant code and a dreadful spaghetti mess. Thus it is probably hard to deny that this fruitful collaboration turned Horde into one of the biggest KDE sponsors.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;That being said: KDE, I'm already here, breakfast is ready ;)&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Beside having fun in the open source area the second day was already packed with people here at CeBIT. We had plenty of Horde users which provided kind feedback. Some of them we could surprise with features they didn't know about. Others were happy to hear that "GPL" really means that they can use the software and modify it without being harassed with a lawsuit afterwards.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;We had Horde newbies as well as free software newbies. Explaining how free software can result in a revenue was the easy part. Explaining why we have no strong interest in a product for obfuscating our code so that there is a decent protection against people trying to find security holes was ... sigh ... harder.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The most fascinating thing was a company that installed Horde and wants to run it from -25°C to 65°C - like putting Horde to the extreme. There were other extremes involved and I omit the details but it is always fascinating what people do with free software.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-4002825160926439820?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2012/03/horde-becomes-biggest-kde-sponsor.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-5292572199624815796</guid><pubDate>Wed, 07 Mar 2012 08:06:00 +0000</pubDate><atom:updated>2012-03-07T09:06:47.312+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>cebit</category><category domain='http://www.blogger.com/atom/ns#'>horde 5</category><category domain='http://www.blogger.com/atom/ns#'>owncloud</category><title>First day on CeBIT</title><description>&lt;a href="http://www.flickr.com/photos/wrobel/6815009056" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" height="75" src="http://farm8.staticflickr.com/7186/6815009056_250ccaa6a6_m.jpg" style="float: right; margin: 0pt 0pt 10px 10px;" width="100" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Wonderful start at CeBIT yesterday. Meeting people with an interest in Horde face-to-face is a refreshing alternative to the work behind the screen at home or at work. The positive feedback helps tremendously in building up energy.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The most important part yesterday was talking to well known contacts, chatting about the progress of some projects which will hopefully result in a few interesting feature additions to Horde during this year.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I also visited &lt;a href="http://www.owncloud.com"&gt;ownCloud&lt;/a&gt; at their Univention booth to chat a bit about integrating the tool with a webmailer.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;And last but not least it is always fun seeing Jan in person. Nothing against having a "distributed" type of project with people scattered in Germany and US. But it would be so much fun having all of you guys here. Can't really wait for the next hackathon ;)&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-5292572199624815796?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2012/03/first-day-on-cebit.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-8677508958348296102</guid><pubDate>Wed, 22 Feb 2012 22:21:00 +0000</pubDate><atom:updated>2012-02-22T23:43:29.635+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>gpg</category><category domain='http://www.blogger.com/atom/ns#'>analysis</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>bash</category><category domain='http://www.blogger.com/atom/ns#'>backdoor</category><category domain='http://www.blogger.com/atom/ns#'>git</category><category domain='http://www.blogger.com/atom/ns#'>hash</category><category domain='http://www.blogger.com/atom/ns#'>diff</category><category domain='http://www.blogger.com/atom/ns#'>script</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>hack</category><title>Recap of the verification that there was no backdoor in the Horde 4 packages</title><description>&lt;a href="http://www.facebook.com/photo.php?pid=31648348&amp;amp;l=6d4e4091e8&amp;amp;id=1434467167" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" height="75" src="http://farm5.static.flickr.com/4125/5178360024_ac2cd0201c_m.jpg" style="float: right; margin: 0pt 0pt 10px 10px;" width="100" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;When we discovered the successful attack on ftp.horde.org two weeks ago we were of course frantic to determine which packages had been affected in addition to the one Horde 3 archive Jan identified as modified initially.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;For the Horde 4 packages we had no hashes to verify the file integrity though. While PEAR supports signing of packages via GPG that seems to be a feature which is virtually unused. For one thing not that many PHP based projects use PEAR packaging and in addition there is no way to automatically verify package integrity on the user side when installing via PEAR. So we also didn't consider signing our packages when switching to installing Horde via PEAR.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Obviously you gain a different perspective on that issue once a hacker implanted a backdoor in some of your packages. Of course we invested a lot of time into securing our infrastructure now to ensure that such an event never happens again. On our side the file integrity is constantly monitored now. But we will also have to investigate how we can improve the PEAR based installation procedure so that it also allows for the required amount of security on the user side.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;But if we had no hashes how did we ensure the Horde 4 packages were indeed unmodified? Git to the rescue! As we tag all our releases it was a matter of creating a short script to automatically compare the current state of the packages on our PEAR server against the state we had within git.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Without further ado - here is the &lt;a href="http://files.pardus.de/horde4-pear-forensic/pear-recovery.sh"&gt;script&lt;/a&gt; I used:&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;pre&gt;#!/bin/bash

git reset --hard HEAD
git clean -f -d

STAMP=`date +%y%m%d-%H%M`
mkdir ../diffs-$STAMP
mkdir -p ../validate-$STAMP/pear.horde.org
mkdir -p ../validate-$STAMP/rebuild

for package in `cat ../pear-recovery-packages.txt | grep -v ".tar$"`
do
  TAG=${package/.tgz/}
  TAG=${TAG,,}
  PPATH=${package/-*/}
  if [ "x${PPATH/Horde_*/}" == "x" ]; then
      PPATH=framework/${PPATH/Horde_};
  fi
  if [ "x${PPATH/groupware*/}" == "x" ]; then
      PPATH=bundles/$PPATH;
  fi
  if [ "x${PPATH/webmail*/}" == "x" ]; then
      PPATH=bundles/$PPATH;
  fi
  PRESENT=`git tag -l $TAG`
  if [ "x$PRESENT" == "x" ]; then
      echo
      echo "======================================================================"
      echo "Tag $TAG for package $package is missing!"
      echo "======================================================================"
      echo
      echo "$package: TAG MISSING" &gt;&gt; ../status-$STAMP
  else
      rm *.tgz                                                                                                               
      rm -rf ../validate-$STAMP/pear.horde.org/*
      rm -rf ../validate-$STAMP/rebuild/*
      GIT=`git checkout $TAG`
      horde-components -z $PPATH --keep-version
      if [ -e $package ]; then
          cp *.tgz ../validate-$STAMP/pear.horde.org/
          cp ../pear.horde.org/get/$package ../validate-$STAMP/rebuild/
          tar -C ../validate-$STAMP/pear.horde.org/ -x -z -f ../validate-$STAMP/pear.horde.org/*.tgz
          tar -C ../validate-$STAMP/rebuild/ -x -z -f ../validate-$STAMP/rebuild/*.tgz
          DIFF=`diff -Naur ../validate-$STAMP/pear.horde.org/${package/.tgz/} ../validate-$STAMP/rebuild/${package/.tgz/}`
          if [ "x$DIFF" != "x" ]; then
              echo
              echo "======================================================================"
              echo "Diff for package $package detected!"
              diff -Naur ../validate-$STAMP/pear.horde.org/${package/.tgz/} ../validate-$STAMP/rebuild/${package/.tgz/} &gt; ..$
              echo "======================================================================"
              echo
              echo "$package: DIFF" &gt;&gt; ../status-$STAMP
          else
              echo
              echo "======================================================================"
              echo "$package CLEAN!!!"
              echo "======================================================================"
              echo
              echo "$package: CLEAN" &gt;&gt; ../status-$STAMP
          fi
      else
          echo
          echo "======================================================================"
          echo "Failed rebuilding package $package!"
          echo "======================================================================"
          echo
          echo "$package: FAILED REBUILDING" &gt;&gt; ../status-$STAMP
      fi
  fi
done
&lt;/pre&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The script walks through the list of packages we had on the PEAR&lt;br /&gt;
server, moves back in time within our git repository to the&lt;br /&gt;
appropriate tag, rebundles the package, extracts both the old and the&lt;br /&gt;
new package and compares them using diff.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The &lt;a href="http://files.pardus.de/horde4-pear-forensic/status-120208-1514"&gt;resulting status list&lt;/a&gt; looked quite okay. There were a few release glitches where the tag was not on the exact commit that was used for building the package. In that case usually &lt;a href="http://files.pardus.de/horde4-pear-forensic/diffs-120208-1514/"&gt;a small diff&lt;/a&gt; resulted. The list was rechecked manually for any malicious traces - Horde_Imap_Client-1.4.3 was the only one were the diff was large but that turned out to be a result from a mishap while releasing that package version. A few times the diff led to a problem with rebuilding the package (indicated by "FAILED REBUILDING"). The package.xml was broken in those cases and needed a fix that was only committed after the tagging. Here I compared the git state directly against the extracted package. There was only a single case ("Horde_ActiveSync-1.1.11") where the tag was missing which required manually identifying the corresponding commit to verify that state against the old package contents.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Once the script was established the analysis ran for about two hours after which we were at least somewhat relieved. Having a backdoor in some Horde 3 packages was already bad enough - having that in Horde 4 would have been even more disastrous.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-8677508958348296102?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2012/02/recap-of-verfication-that-there-was-no.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4125/5178360024_ac2cd0201c_t.jpg' height='72' width='72'/><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-3503478083386252052</guid><pubDate>Thu, 02 Feb 2012 22:31:00 +0000</pubDate><atom:updated>2012-02-02T23:35:56.501+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>cebit</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>booth</category><category domain='http://www.blogger.com/atom/ns#'>linux magazin</category><category domain='http://www.blogger.com/atom/ns#'>fair</category><title>Horde on CeBIT 2012</title><description>&lt;a href="http://www.facebook.com/photo.php?pid=31648348&amp;amp;l=6d4e4091e8&amp;amp;id=1434467167" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" height="75" src="http://farm5.static.flickr.com/4125/5178360024_ac2cd0201c_m.jpg" style="float: right; margin: 0pt 0pt 10px 10px;" width="100" /&gt;&lt;/a&gt; &lt;p&gt;It is &lt;a href="http://www.linux-magazin.de/Themengebiete/Special/Cebit-2012/Projekte/Cebit-Open-Source-2012-Projektpraesentation-Horde?special=Cebit%202012&amp;category=66122"&gt;official&lt;/a&gt; now: Horde gets a booth on &lt;a href="http://www.cebit.de"&gt;CeBIT 2012&lt;/a&gt;! Sponsored by &lt;a href="http://www.linuxnewmedia.de/"&gt;Linux New Media&lt;/a&gt; the company behind the &lt;a href="http://www.linux-magazin.de/"&gt;Linux Magazine&lt;/a&gt;. Thanks! Simply awesome!&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Hope to see you there!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-3503478083386252052?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2012/02/horde-on-cebit-2012.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4125/5178360024_ac2cd0201c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-2966854307875771226</guid><pubDate>Wed, 01 Feb 2012 00:11:00 +0000</pubDate><atom:updated>2012-02-01T01:11:33.292+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>wikipedia</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>deployments</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>wiki</category><category domain='http://www.blogger.com/atom/ns#'>installation</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><title>Wiki time</title><description>&lt;p&gt;Tonight it has been wiki time. The &lt;a href="http://en.wikipedia.org/wiki/Internet_Messaging_Program"&gt;article on IMP&lt;/a&gt; from the English wikipedia was a mere stub and I expanded it with a little bit of history. I will hopefully find the time to continue this later. I recently did the same for the &lt;a href="http://en.wikipedia.org/wiki/Horde_(software)"&gt;Horde article&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;In addition I updated the &lt;a href="http://http://wiki.horde.org/Deployments"&gt;list of Horde deployments&lt;/a&gt; in our &lt;a href="http://wiki.horde.org"&gt;Horde wiki&lt;/a&gt;. I also added a &lt;a href="http://wiki.horde.org/Providers"&gt;list of Horde hosting providers&lt;/a&gt; and a &lt;a href="http://wiki.horde.org/Distributions"&gt;list of alternate installation methods for Horde&lt;/a&gt;. I couldn't refrain from adding a short abstract on why we only offer PEAR with Horde 4 to the latter article. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Of course corrections and additions are very welcome!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-2966854307875771226?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2012/02/wiki-time.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-5076736472077051581</guid><pubDate>Mon, 30 Jan 2012 22:59:00 +0000</pubDate><atom:updated>2012-01-31T00:07:48.872+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>support</category><category domain='http://www.blogger.com/atom/ns#'>adhearsion</category><category domain='http://www.blogger.com/atom/ns#'>voip</category><category domain='http://www.blogger.com/atom/ns#'>llc</category><category domain='http://www.blogger.com/atom/ns#'>android</category><title>Horde is calling you</title><description>&lt;p&gt;Yes, it's late... and I should either sleep or try to work for a final hour before collapsing onto a pillow. But instead I feel like writing a few lines. And calling strangers in the US...&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I don't know the people I call there. But it is fun, I train my english, and on top they are usually happy about my call. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;What we talk about? I explain them what a provider is. And why I'm actually unable to help them. Which maybe helpful information in its own right.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Of course these people called the &lt;a href="http://www.horde.org"&gt;Horde LLC&lt;/a&gt; before. The Horde webmail is running on so many servers around the world that we get a constant stream of requests for help from users that mistake Horde for their service provider. Usually we get a handful of e-mails every day asking whether we could reset the password, restart the server, or in general just "HELP!!!". Once in a week the line &lt;blockquote&gt;I can't log in. My username is ABC, my password is XYZ.&lt;/blockquote&gt;reminds us how easy phishing is.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;E-Mails are simple: sending out a friendly response with a link to &lt;a href="http://wiki.horde.org/ICantGetMyMail"&gt;one of our most successful wiki pages&lt;/a&gt; is an easy thing to do.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Phone calls are a different matter though. The phone number for calling us in the US has been set up by &lt;a href="http://mojolingo.com/"&gt;MojoLingo&lt;/a&gt; based on &lt;a href="http://adhearsion.com/"&gt;Adhearsion&lt;/a&gt; a while back. And of course we get a certain number of "I can't get my mail!" calls as well. We usually didn't answer these until &lt;a href="http://mojolingo.com/"&gt;MojoLingo&lt;/a&gt; helped us with setting up Voip access so that calls into the US generate negligible costs.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So I can sit here, run SipDroid on my little droid and call into US when I need a break or have a minute to spare. A few more pleas for help that do not get lost unanswered.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;In case you ever get called by a stranger with a weird German accent after your Horde webmail broke you probably didn't read this blog post. &lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-5076736472077051581?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2012/01/horde-is-calling-you.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-4623549974586049147</guid><pubDate>Tue, 13 Dec 2011 22:19:00 +0000</pubDate><atom:updated>2012-01-24T10:14:01.529+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>packages</category><category domain='http://www.blogger.com/atom/ns#'>system administration</category><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>package management</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>updates</category><title>The Horde release train</title><description>&lt;p&gt;&lt;a href="http://www.horde.org"&gt;The Horde project&lt;/a&gt; did push out 906 &lt;a href="http://pear.horde.org"&gt;releases&lt;/a&gt; in the last 8 months since the initial Horde 4 release. &lt;a href="http://pear.php.net"&gt;PEAR&lt;/a&gt; packages, better release management tools and &lt;a href="http://ci.horde.org"&gt;continuous integration&lt;/a&gt; seem to pay off. The stream of bug fixes and improvements available to the users has switched to high speed.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;At the same the time the use of PEAR packages and automatic DB migrations has lowered the effort of updates on the administrator side to an absolute minimum.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;pre&gt;pear upgrade -c horde&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;And few clicks later you are up-to-date.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The code quality of the basic PEAR tools is an entirely different matter... BUT it is just soo damn cool anyway ;)&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-4623549974586049147?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/12/horde-project-did-push-out-over-906.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-551706841039652592</guid><pubDate>Sun, 13 Nov 2011 21:21:00 +0000</pubDate><atom:updated>2011-11-13T22:26:15.184+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>packages</category><category domain='http://www.blogger.com/atom/ns#'>rest</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>api</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>horde_pear</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>components</category><title>Accessing PEAR server information with PHP</title><description>&lt;p&gt;The number of PEAR servers has increased dramatically in recent times. Maybe due to the availability of &lt;a href="http://pirum.sensiolabs.org/"&gt;Pirum&lt;/a&gt; - a simple PEAR server. Whatever the cause: there are plenty of package lists and package datasets available on the net these days. Accessing this data is not always easy though. &lt;/p&gt;&lt;p&gt;PEAR servers provide a well defined REST API that is usually queried using the PEAR toolset available via the basic &lt;a href="http://pear.php.net/package/PEAR"&gt;PEAR&lt;/a&gt; package. That package however does not provide anything that I would consider to be a decent developers API. &lt;/p&gt;&lt;p&gt;So let me provide you with an alternative that is available via the &lt;a href="http://www.horde.org/libraries"&gt;Horde framework libraries&lt;/a&gt;: The &lt;a href="http://www.horde.org/libraries/Horde_Pear"&gt;Horde_Pear&lt;/a&gt; library. &lt;/p&gt;&lt;p&gt;The package comes with the &lt;tt&gt;Horde_Pear_Remote&lt;/tt&gt; class wich provides you with high-level access to the REST interface of a PEAR server. &lt;/p&gt;&lt;p&gt;Creating an instance of this class without providing any arguments to the constructor will allow you to access the PEAR server at &lt;a href="http://pear.horde.org"&gt;pear.horde.org&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;&lt;pre&gt;$pear = new Horde_Pear_Remote();
print(join("\n", $pear-&gt;listPackages()));

Horde_ActiveSync
Horde_Alarm
Horde_Argv
Horde_Auth
Horde_Autoloader
...&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Alternative servers can be specified in the first argument to the constructor:&lt;/p&gt;&lt;p&gt;&lt;pre class="brush: php; toolbar: false;"&gt;$pear = new Horde_Pear_Remote('pear.phpunit.de');
print(join("\n", $pear-&gt;listPackages()));

DbUnit
File_Iterator
Object_Freezer
PHPUnit
...&lt;/pre&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;The full set of the functionality provided by &lt;tt&gt;Horde_Pear_Remote&lt;/tt&gt; is detailed on &lt;a href="http://www.horde.org//libraries/Horde_Pear/docs/REMOTE_PEAR_SERVER"&gt;our website&lt;/a&gt;. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-551706841039652592?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/11/accessing-pear-server-information-with_13.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-2922488149839473558</guid><pubDate>Fri, 04 Nov 2011 11:56:00 +0000</pubDate><atom:updated>2011-11-04T12:58:26.070+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>restructuredtext</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>wiki</category><category domain='http://www.blogger.com/atom/ns#'>documentation</category><category domain='http://www.blogger.com/atom/ns#'>website</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>libraries</category><category domain='http://www.blogger.com/atom/ns#'>components</category><title>The library section of the Horde website supports component documentation now.</title><description>&lt;p&gt;Our new &lt;a href="http://www.horde.org/libraries"&gt;libraries&lt;/a&gt; section has been started a while ago to further push the PHP components we offer. Now this section supports publishing the component documentation as well. You can take a look at the &lt;a href="http://www.horde.org/libraries/Horde_Cli_Modular/docs"&gt;documentation of the Cli_Modular&lt;/a&gt; package for example. In fact: it is pretty much the only package that fully uses the new system already. So there is still work ahead. &lt;/p&gt;&lt;p&gt;&lt;b&gt; If you use any of the components: We are grateful if you start writing a bit of documenation or describe some examples on how to successfully use the package. It will help us and others tremendously. Thanks! &lt;/b&gt; &lt;/p&gt;&lt;p&gt;Let me try to explain how the system is currently intended to work - feedback and critical comments of course welcome: &lt;/p&gt;&lt;p&gt;&lt;ol&gt;&lt;li&gt; When creating new documentation for one of the Horde components you start a new section on &lt;a href="http://wiki.horde.org/Doc/Dev"&gt;the developer documentation of our wiki&lt;/a&gt;. See the &lt;a href="http://wiki.horde.org/Doc/Dev/HordeCliModular"&gt;Horde_Cli_Modular&lt;/a&gt; link below &lt;b&gt;Library components&lt;/b&gt; for example. Please note: It is not mandatory to write the documentation in the wiki. You can have static documentation files within a component as well. This is just meant as an option for those situations where it makes sense to work on documentation files together with people that do not have direct git commit access. Hopefully there will be many component consumers interested in updating and fixing the documentation. &lt;/li&gt;
&lt;li&gt; How you structure that new section is up to you. For a simple package you might wish to keep all documentation in a single file but for the more complex one it might make sense to have several files. In that case the new section page should probably just be a link list to the various wiki pages that document the component. In case of &lt;a href="http://wiki.horde.org/Doc/Dev/HordeCliModular"&gt;Horde_Cli_Modular&lt;/a&gt; I used a single page. &lt;/li&gt;
&lt;li&gt; Once the documentation has been written in the wiki format it is time to download it into the &lt;tt&gt;doc&lt;/tt&gt; directory of the component. The &lt;a href="http://wiki.horde.org/Doc/Dev/Component/Components"&gt;horde-components&lt;/a&gt; helper is what you should use for that operation. The tool expects to find a &lt;a href="https://github.com/horde/horde/blob/master/framework/Cli_Modular/doc/Horde/Cli/Modular/DOCS_ORIGIN"&gt;DOCS_ORIGIN&lt;/a&gt; file within the &lt;tt&gt;doc&lt;/tt&gt; or &lt;tt&gt;docs&lt;/tt&gt; (for the applications) directory of the component. This file must conform to the &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; format and map remote URLs to local file paths relative to the component root. The &lt;a href="https://github.com/horde/horde/blob/master/framework/Cli_Modular/doc/Horde/Cli/Modular/DOCS_ORIGIN"&gt;DOCS_ORIGIN from Cli_Modular&lt;/a&gt; links &lt;a href="http://wiki.horde.org/Doc/Dev/HordeCliModular"&gt;the wiki page&lt;/a&gt; exported as &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; to the path &lt;a href="https://github.com/horde/horde/blob/master/framework/Cli_Modular/doc/Horde/Cli/Modular/README"&gt;doc/Horde/Cli/Modular/README&lt;/a&gt;. The links can of course point anywhere so you are in principle free to use any remote source. But you should ensure the page provides readable &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt; Now you can run &lt;tt&gt;horde-components fetchdocs&lt;/tt&gt; and it should fetch the URLs into the respective local files. You can then run &lt;tt&gt;horde-components update&lt;/tt&gt; to refresh the file list in the &lt;tt&gt;package.xml&lt;/tt&gt; file if the documentation files were not included before. &lt;/li&gt;
&lt;li&gt; Once a component was released we can now run something like this: &lt;tt&gt;horde-components Horde_Cli_Modular webdocs -D ~/git/horde-web/ --html-generator=git/horde-support/maintainer-tools/docutils/html.py --allow-remote&lt;/tt&gt; in order to update &lt;a href="http://www.horde.org/libraries/Horde_Cli_Modular/docs"&gt;the documentation on the website&lt;/a&gt;. Right now this does not happen automatically during a release but I plan to add this soon. &lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;There are of course still a few problems with this approach: &lt;/p&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt; The &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; exporter of our &lt;a href="http://www.horde.org/apps/wicked"&gt;wiki engine "Wicked"&lt;/a&gt; is not yet complete. You may experience problems with the export if you use constructs it does not know yet. Please ping me if you experience problems with the export. &lt;/li&gt;
&lt;li&gt; The wiki syntax and the syntax required by &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; is not 100% aligned. You can write a wiki page that looks just fine but leads to errors or formatting problems in the &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; export. After creating / updating a new wiki documentation page it make sense to run the &lt;tt&gt;horde-components fetchdocs&lt;/tt&gt;/&lt;tt&gt;horde-components webdocs&lt;/tt&gt; sequence to check for problems. &lt;/li&gt;
&lt;li&gt; We still have some components with documentation files not in &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; format. These will result in non-existing links on our website for now but I plan to fix the few faulty packages soon. &lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-2922488149839473558?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/11/library-section-of-horde-website.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-2452408712233633896</guid><pubDate>Fri, 04 Nov 2011 09:17:00 +0000</pubDate><atom:updated>2011-11-04T10:20:07.579+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>pmd</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>docblox</category><category domain='http://www.blogger.com/atom/ns#'>codesniffer</category><category domain='http://www.blogger.com/atom/ns#'>jenkins</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>continuous integration</category><category domain='http://www.blogger.com/atom/ns#'>components</category><title>Jenkins on ci.horde.org got a major update</title><description>&lt;p&gt;&lt;a href="http://ci.horde.org"&gt;The Horde continuous integration setup&lt;/a&gt; saw a major upgrade and a number of fixes during the last week. &lt;/p&gt;&lt;p&gt;The take home message for everyone that does not wish to read the full log: &lt;a href="ci.horde.org"&gt;ci.horde.org&lt;/a&gt; will now run &lt;a href="https://github.com/horde/horde/blob/master/framework/bin/test_framework"&gt;horde/framework/bin/test_framework&lt;/a&gt; after a new commit has been pushed. This reduces the load on the system significantly and you will get results faster. If you develop Horde code you should run &lt;a href="https://github.com/horde/horde/blob/master/framework/bin/test_framework"&gt;horde/framework/bin/test_framework&lt;/a&gt; as well in order to check if your recent commits could cause failures on our continuous integration server. &lt;/p&gt;&lt;p&gt;The full recap of the recent changes: &lt;/p&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt; Update to the newest version of the Horde components tool. This allows to use the improved templating system. &lt;/li&gt;
&lt;li&gt; New configuration and build templates that allow to reduce the job build time by avoiding to rebuild the set of package dependencies if this is not necessary. This has an important implication: A code change in one package (e.g. Horde_Imap_Client) will be tested against unchanged dependencies (e.g. Horde_Mime). &lt;b&gt;Even&lt;/b&gt; if the commit also touched one or several of the dependencies (e.g. Horde_Mime). The packages should be backward compatible - so this should result in no error. The dependencies of one package will only get updated in case the dependency list in the package.xml of that package changes. &lt;/li&gt;
&lt;li&gt; Running &lt;a href="https://github.com/horde/horde/blob/master/framework/bin/test_framework"&gt;horde/framework/bin/test_framework&lt;/a&gt; has been integrated into the &lt;a href="http://ci.horde.org/job/horde-git/"&gt;horde-git&lt;/a&gt; job. With the new "rebuild dependencies only when necessary" policy (see above) the component jobs do not fully test the integrity of the latest commit anymore. When the dependencies do not get updated the focus of shifts a bit more towards checking for backward compatibility. In order to not loose the integrity check for the "bleeding edge" our &lt;tt&gt;test_framework&lt;/tt&gt; script is now executed right after updating the code from git. &lt;/li&gt;
&lt;li&gt; Running &lt;tt&gt;test_framework&lt;/tt&gt; also allows to run component jobs only if the code of the component has actually been touched. This significantly reduces the load on ci.horde.org as it removes the need for rebuilding all components for each and every commit. &lt;/li&gt;
&lt;li&gt; An update to the newer &lt;a href="http://pear.php.net/package/PHP_CodeSniffer"&gt;CodeSniffer&lt;/a&gt; which included an update to the checklist for the Horde style. The &lt;a href="https://github.com/horde/horde-support/blob/master/ci/templates/pre-build/phpcs.xml"&gt;new ruleset&lt;/a&gt; is available from our &lt;a href="https://github.com/horde/horde-support"&gt;horde-support&lt;/a&gt; repository. &lt;/li&gt;
&lt;li&gt; A customizable &lt;a href="https://github.com/horde/horde-support/blob/master/ci/templates/pre-build/phpmd.xml"&gt;ruleset&lt;/a&gt; for the &lt;a href="http://phpmd.org"&gt;PHP mess detector&lt;/a&gt; has been added as well. We still need to tweak the exact configuration of PMD to match it with what we consider reasonable defaults for Horde code. &lt;/li&gt;
&lt;li&gt; &lt;a href="http://www.docblox-project.org/"&gt;DocBlox&lt;/a&gt; has been added to allow generating experimental API documentation. DocBlox is significantly faster and less memory hungry than PHPDocumentor. It has already been adopted by large frameworks such as Zend. So I figured it is worth taking a look at it. Feedback welcome! &lt;/li&gt;
&lt;li&gt; The Jenkins configuration has been updated with the latest fixes and improvements from &lt;a href="http://jenkins-php.org/"&gt;the Jenkins-PHP project&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;The setup procedure has been fixed so that it should be possible to generate a local setup - comparable to &lt;a href="http://ci.horde.org/"&gt;ci.horde.org&lt;/a&gt; - again. &lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-2452408712233633896?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/11/jenkins-on-cihordeorg-got-major-update.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-6212949710082817811</guid><pubDate>Tue, 18 Oct 2011 06:33:00 +0000</pubDate><atom:updated>2011-10-18T08:36:32.781+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>demo</category><category domain='http://www.blogger.com/atom/ns#'>ec2</category><category domain='http://www.blogger.com/atom/ns#'>virtual server</category><category domain='http://www.blogger.com/atom/ns#'>ansel</category><title>demo.horde.org got updated</title><description>&lt;p&gt;You might have noticed that &lt;a href="http://www.horde.org"&gt;the Horde homepage&lt;/a&gt; received a new &lt;b&gt;Demo&lt;/b&gt; button within the main navigation recently. We did indeed manage to get a demo machine up and running at &lt;a href="http://demo.horde.org"&gt;demo.horde.org&lt;/a&gt;. The installation got updated to the latest releases just yesterday and &lt;a href="http://www.horde.org/apps/ansel"&gt;Ansel&lt;/a&gt; - the Horde photo management application - got added into the mix. Feel free to test drive this new application as well as the other components on &lt;a href="http://demo.horde.org"&gt;demo.horde.org&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;If you experience any problems please let us know. &lt;/p&gt;&lt;p&gt;In principle you shouldn't be able to break anything on the installation. It is a &lt;a href="aws.amazon.com"&gt;virtual EC2 machine&lt;/a&gt; and we will update the image every once in a while when there are new releases available. Any data you store on the machine will be resetted at that point. &lt;/p&gt;&lt;p&gt;You should also be able to mail to the two demo users &lt;a href="mailto:demo@demo.horde.org"&gt;demo@demo.horde.org&lt;/a&gt; and &lt;a href="mailto:guest@demo.horde.org"&gt;guest@demo.horde.org&lt;/a&gt;. Mailing to the outside is not possible - for obvious reasons. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-6212949710082817811?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/10/demohordeorg-got-updated.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-7192395246758989506</guid><pubDate>Fri, 14 Oct 2011 07:42:00 +0000</pubDate><atom:updated>2011-10-14T09:44:31.873+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>feed</category><title>Horde_Push now supports sending to Blogger.com</title><description>&lt;p&gt;Horde_Push supports sending to blogger.com now.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The Horde_Push library is a tool to send content elements to various external services. Such as Twitter, Facebook, Blogger and others. Right now it only all&lt;br /&gt;
ows sending Tweets, publishing entries on blogger.com and sending e-mails.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The idea is to allow publishing content you curate on a Horde installation to the social networks out there. At the moment the code is not yet there as the &lt;br /&gt;
integration into the base &lt;b&gt;horde&lt;/b&gt; package is still lacking. Right now there is only a small command line helper that I use for testing.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-7192395246758989506?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/10/hordepush-now-supports-sending-to.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-3902620207492150480</guid><pubDate>Mon, 20 Jun 2011 22:35:00 +0000</pubDate><atom:updated>2011-06-21T00:35:24.559+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>unit testing</category><category domain='http://www.blogger.com/atom/ns#'>autoloading</category><category domain='http://www.blogger.com/atom/ns#'>horde4</category><category domain='http://www.blogger.com/atom/ns#'>quality control</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>phpunit</category><category domain='http://www.blogger.com/atom/ns#'>alltests</category><title>Anatomy of a Horde test suite - III</title><description>&lt;p&gt;
Ready for the next item on the test suite agenda? This time the topic is &lt;b&gt;Autoloading&lt;/b&gt;. We use a rather simple autoloading setup for most component test suites. It requires no additional setup and works out of the box if you run &lt;tt&gt;php AllTests.php&lt;/tt&gt;.
&lt;/p&gt;
&lt;p&gt;
That is already nice and allows running the complete test suite without further ado. But I must admit that I want more. My default work mode looks like this:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;open test case (and modify it)&lt;/li&gt;
&lt;li&gt;hit &lt;tt&gt;&amp;lt;f3&amp;gt; &amp;lt;f8&amp;gt;&lt;/tt&gt; to run &lt;tt&gt;phpunit&lt;/tt&gt; on this single test case&lt;/li&gt;
&lt;li&gt;hit &lt;tt&gt;&amp;lt;f4&amp;gt; &amp;lt;f4&amp;gt;&lt;/tt&gt; to to jump to the code line that produced the first error&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This allows me to add a new test definition and immediately run it so that I can check for problems. And I don't need to execute the full &lt;tt&gt;AllTests.php&lt;/tt&gt; to get feedback on the new test. So I'm annoyed every time I hit a test case that does not allow me to do that. A working autoloading setup is the key for that.
&lt;/p&gt;
&lt;p&gt;
Luckily not only my own preferences make using an &lt;tt&gt;Autoload.php&lt;/tt&gt; file in a test suite attractive. There are a number of reasons why such a file can be useful. The &lt;a href="http://wiki.horde.org/Doc/Dev/Component/Horde_Test"&gt;Wiki page for the Horde_Test component&lt;/a&gt; details them and this is a copy of the relevant section:
&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;
The &lt;tt&gt;Autoload.php&lt;/tt&gt; file is not required in a test suite but it is strongly recommended that you use it. It's purpose is to setup PHP autoloading so that all tests in the test suite automatically have access to all the classes required for executing the tests. The reason why it is not mandatory is that &lt;tt&gt;Horde_Test_AllTests&lt;/tt&gt; already loads a basic autoloading definition that works for most framework components.
&lt;/p&gt;
&lt;p&gt;
This means that running &lt;tt&gt;php AllTests.php&lt;/tt&gt; usually does not hit any autoloading problems. Running a single test case (e.g. &lt;tt&gt;phpunit Horde/Xyz/Unit/UnitTest.php&lt;/tt&gt;) is a different matter though.
&lt;/p&gt;
&lt;p&gt;
The &lt;tt&gt;*Test.php&lt;/tt&gt; files do not extend &lt;tt&gt;Horde_Test_AllTests&lt;/tt&gt; and thus there is nothing that would magically setup autoloading if you try to run such a test suite in isolation. And running single test cases can be quite convenient if the whole test suite would take a long time to execute. Using an &lt;tt&gt;Autoload.php&lt;/tt&gt; file alongside the &lt;tt&gt;AllTests.php&lt;/tt&gt; file is the recommended way to provide a single test case with autoloading and thus enable commands such as &lt;tt&gt;phpunit Horde/Xyz/Unit/UnitTest.php&lt;/tt&gt;. In addition the file is helpful for any case where you need slightly more complex loading patterns or want to pull in special files manually.
&lt;/p&gt;
&lt;p&gt;
Once you created an &lt;tt&gt;Autoload.php&lt;/tt&gt; file for your test suite it will also be heeded by &lt;tt&gt;Horde/Test/AllTests.php&lt;/tt&gt;. The latter will  avoid the basic autoloading setup if it detects the presence of an &lt;tt&gt;Autoload.php&lt;/tt&gt; file for the current test suite. That one will be loaded and is assumed to contain the required autoloading setup.
&lt;/p&gt;

&lt;h4&gt;The content of &lt;tt&gt;Autoload.php&lt;/tt&gt;&lt;/h4&gt;

&lt;p&gt;
You should at least require the &lt;tt&gt;Autoload.php&lt;/tt&gt; from &lt;tt&gt;Horde_Test&lt;/tt&gt; in this file. This is also what &lt;tt&gt;Horde_Test_AllTests&lt;/tt&gt; would do when choosing the simple autoloading setup.
&lt;/p&gt;
&lt;pre&gt;
require_once 'Horde/Test/Autoload.php';
&lt;/pre&gt;
&lt;p&gt;
It also makes sense to adapt the error reporting level to the same standards as required in the &lt;tt&gt;AllTests.php&lt;/tt&gt; wrapper:
&lt;/p&gt;
&lt;pre&gt;
error_reporting(E_ALL | E_STRICT);
&lt;/pre&gt;
&lt;p&gt;
If you derive your test cases from a central test case definition you should load this one in &lt;tt&gt;Autoload.php&lt;/tt&gt; as well:
&lt;/p&gt;
&lt;pre&gt;
/** Load the basic test definition */
require_once dirname(__FILE__) . '/TestCase.php';
&lt;/pre&gt;
&lt;p&gt;
Sometimes it makes sense to pull in the definition of test helpers that may be used throughout the test suite. They are usually not available via autoloading and need to be pulled in explicitely:
&lt;/p&gt;
&lt;pre&gt;
/** Load stub definitions */
require_once dirname(__FILE__) . '/Stub/ListQuery.php';
require_once dirname(__FILE__) . '/Stub/DataQuery.php';
&lt;/pre&gt;
&lt;p&gt;
Real world examples for &lt;tt&gt;Autoload.php&lt;/tt&gt; helpers can be found in the &lt;a href="http://git.horde.org/co.php/framework/Date/test/Horde/Date/Autoload.php?rt=horde-git&amp;ws=1"&gt;Horde_Date&lt;/a&gt; and the &lt;a href="http://git.horde.org/co.php/framework/Kolab_Storage/test/Horde/Kolab/Storage/Autoload.php?rt=horde-git&amp;ws=1"&gt;Kolab_Storage&lt;/a&gt; components.
&lt;/p&gt;
&lt;p&gt;
Within the test cases you only need to load the &lt;tt&gt;Autoload.php&lt;/tt&gt; file which usually looks like this (and obviously depends on the position of the test case in the directory hierarchy of the test suite):
&lt;/p&gt;
&lt;pre&gt;
require_once dirname(__FILE__) . '/../Autoload.php';
&lt;/pre&gt;
&lt;hr/&gt;
&lt;p&gt;
You'll find additional background information on autoloading within test suite runs on the &lt;a href="http://wiki.horde.org/Doc/Dev/Component/Horde_Test"&gt;Wiki page for the Horde_Test component&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-3902620207492150480?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/06/anatomy-of-horde-test-suite-iii.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-5229202158099441372</guid><pubDate>Mon, 20 Jun 2011 21:54:00 +0000</pubDate><atom:updated>2011-06-20T23:54:06.530+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>packages</category><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>package management</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>packaging</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>debian</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><title>Horde4 debian packages - Second round</title><description>&lt;p&gt;
Nearly half a year passed since I started my first attempt at Debian packages for Horde4. Back &lt;a href="http://log.pardus.de/2011/01/horde4-package-mill-for-debian.html"&gt;then&lt;/a&gt; it was just about snapshots which I generated via a continuous integration setup. But Horde4 has been released now, there are packages and it is time for the real thing.
&lt;/p&gt;
&lt;p&gt;
I did get &lt;a href="http://files.pardus.de/horde4-debian-20110617/"&gt;a first set of packages&lt;/a&gt; installable today but this is just the initial draft. The main point about it is that the majority of it is automated.
&lt;/p&gt;
&lt;p&gt;
If you want more details and the installation steps then I would suggest to follow my discussion with Mathieu Parent on &lt;a href="http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-php-pear"&gt;pkg-php-pear@lists.alioth.debian.org&lt;/a&gt;. These were the mails exchanged so far (with the last two detailing my current status):
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://lists.alioth.debian.org/pipermail/pkg-php-pear/2011-May/000106.html"&gt;On PEAR packaging (25.5., Mathieu)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lists.alioth.debian.org/pipermail/pkg-php-pear/2011-June/000115.html"&gt;On PEAR packaging (7.6., Gunnar)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lists.alioth.debian.org/pipermail/pkg-php-pear/2011-June/000117.html"&gt;On PEAR packaging (7.7., Mathieu)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lists.alioth.debian.org/pipermail/pkg-php-pear/2011-June/000122.html"&gt;On PEAR packaging (17.7., Gunnar)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lists.alioth.debian.org/pipermail/pkg-php-pear/2011-June/000125.html"&gt;On PEAR packaging (20.7., Gunnar)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
There is not much more to say right now. Any testing and feedback is welcome and there is obviously still a lot of work ahead until this pops up in your default package channels. But it is at least on the horizon and the variant that I ship on files.pardus.de should become useable very soon.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-5229202158099441372?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/06/horde4-debian-packages-second-round.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>4</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-3355480365311416873</guid><pubDate>Tue, 14 Jun 2011 07:29:00 +0000</pubDate><atom:updated>2011-06-14T09:29:11.338+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>unit testing</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>jenkins</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><category domain='http://www.blogger.com/atom/ns#'>quality control</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>qc</category><category domain='http://www.blogger.com/atom/ns#'>phpunit</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>continuous integration</category><title>Anatomy of a Horde test suite - II</title><description>&lt;p&gt;
This morning I completed the next step on the journey through Horde's test suites and added the description of the &lt;tt&gt;AllTests.php&lt;/tt&gt; file to the &lt;a href="http://wiki.horde.org/Doc/Dev/Component/Horde_Test"&gt;wiki page&lt;/a&gt;. I am not going to copy the complete text here but instead focus on the use cases for this file as I still have a few question to the audience below.
&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;&lt;tt&gt;AllTests.php&lt;/tt&gt; is the only mandatory requirement for a Horde test suite. Everything else is optional but there has to be an &lt;tt&gt;AllTests.php&lt;/tt&gt; file which serves as an entry point into the test suite.&lt;/p&gt;

&lt;p&gt;This is the functionality expected from the file:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;It must collect all tests of the test suite.&lt;/li&gt;
    &lt;li&gt;It must allow to retrieve all tests of the suite via &lt;tt&gt;Horde_Xyz_AllTests::suite()&lt;/tt&gt;.&lt;/li&gt;
    &lt;li&gt;It must allow running the test suite via &lt;tt&gt;phpunit AllTests.php&lt;/tt&gt;.&lt;/li&gt;
    &lt;li&gt;It must allow running the test suite via &lt;tt&gt;php AllTests.php&lt;/tt&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;tt&gt;Horde_Test&lt;/tt&gt; package already delivers a boilerplate &lt;tt&gt;AllTests.php&lt;/tt&gt; class in &lt;tt&gt;framework/Test/lib/Horde/Test/AllTests.php&lt;/tt&gt; and deriving an &lt;tt&gt;AllTests.php&lt;/tt&gt; for a standard test suite becomes rather simple. The full code for this is presented &lt;a href="http://wiki.horde.org/Doc/Dev/Component/Horde_Test"&gt;on the wiki page&lt;/a&gt; and you can also look &lt;a href="http://git.horde.org/co.php/framework/Date/test/Horde/Date/AllTests.php?rt=horde-git&amp;amp;ws=1""&gt;at an example from our repository&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
Now I wonder if the items listed above are in fact all the requirements we have for this file.
&lt;/p&gt;
&lt;p&gt;
Requirements (1) and (2) are obvious as this is functionality needed for our &lt;tt&gt;horde/framework/bin/test_framework&lt;/tt&gt; helper that runs &lt;b&gt;all&lt;/b&gt; framework tests. Though I assume nobody uses this one on a regular basis at the moment.
&lt;/p&gt;
&lt;p&gt;
But I noticed that (3) does not work out of the box with the current PHPUnit. This led to a &lt;a href="https://github.com/sebastianbergmann/phpunit/pull/271"&gt;pull request&lt;/a&gt; as it definitely &lt;b&gt;should&lt;/b&gt; (and can) work.
&lt;/p&gt;
&lt;p&gt;
I usually run the tests with a rather long command line that ultimately boils down to &lt;tt&gt;phpunit Horde_Xyz_AllTests AllTests.php&lt;/tt&gt; which is tied to a shortcut in Emacs. As the Lisp code I use for that extracts the class name automatically I never noticed that a plain &lt;tt&gt;phpunit AllTests.php&lt;/tt&gt; does not work.
&lt;/p&gt;
&lt;p&gt;
So are most people using &lt;tt&gt;php AllTests.php&lt;/tt&gt;? How do &lt;b&gt;you&lt;/b&gt; run the test suites or would like to run them? Can I get some feedback on this (either here, on IRC or via tweet)?
&lt;/p&gt;
&lt;p&gt;
Anything additional I missed about the requirements for the &lt;tt&gt;AllTests.php&lt;/tt&gt; file?
&lt;/p&gt;
&lt;p&gt;
Next in the series will be on autoloading which should allow me to also look at the problems we still have with that in the application components.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-3355480365311416873?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/06/anatomy-of-horde-test-suite-ii.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-8181166953631292492</guid><pubDate>Thu, 09 Jun 2011 16:25:00 +0000</pubDate><atom:updated>2011-06-09T18:25:43.269+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>radio</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>hrode</category><category domain='http://www.blogger.com/atom/ns#'>newsletter</category><category domain='http://www.blogger.com/atom/ns#'>interview</category><category domain='http://www.blogger.com/atom/ns#'>english</category><category domain='http://www.blogger.com/atom/ns#'>translation</category><title>The Horde newsletter again</title><description>&lt;p&gt;
Time flies and it is soon time for the next issue of the Horde newsletter. Which reminds me to post the &lt;a href="http://eepurl.com/d0AoX"&gt;link to the last one&lt;/a&gt; in case you missed it. You can subscribe to the monthly newsletter &lt;a href="http://bit.ly/hdHJ08"&gt;here&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
As &lt;a href="http://www.janschneider.de/"&gt;Jan&lt;/a&gt; already &lt;a href="http://www.janschneider.de/horde/jonah/stories/view.php?channel_id=5&amp;story_id=336"&gt;mentioned in his blog&lt;/a&gt; he gave &lt;a href="http://www.radiotux.de"&gt;Radio Tux&lt;/a&gt; an interview on Horde 4. I just checked by roughly translating half of it to English that I should be able to include a transcript of it in the next newsletter. It delivers a very good overview on all things Horde 4.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-8181166953631292492?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/06/horde-newsletter-again.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-1680951670335104026</guid><pubDate>Thu, 09 Jun 2011 13:24:00 +0000</pubDate><atom:updated>2011-06-09T15:24:30.114+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>unit testing</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>jenkins</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><category domain='http://www.blogger.com/atom/ns#'>quality control</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>qc</category><category domain='http://www.blogger.com/atom/ns#'>phpunit</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>continuous integration</category><title>Anatomy of a Horde test suite - I</title><description>&lt;p&gt;
Just got issue &lt;b&gt;07/2011&lt;/b&gt; of the &lt;a href="http://www.linux-magazin.de/"&gt;the German Linux Magazine&lt;/a&gt; in the mailbox and on the final page there is this little abstract about &lt;b&gt;08/2011&lt;/b&gt; saying...
&lt;/p&gt;

&lt;p&gt;
"&lt;b&gt;PHP Unit and Jenkins&lt;/b&gt; - There are two things guarding against programming errors: unit tests covering your code and continuous integration systems that automate the testing. The next issue will demonstrate this based on a real example from a PHP web project." [translated from German].
&lt;/p&gt;

&lt;p&gt;
The "PHP web project" is actually named "Horde" and hm... I guess this means &lt;a href="http://log.pardus.de/2011/05/is-horde-php.html"&gt;I have to write this thing - ;)&lt;/a&gt; . When agreeing to the article I immediately knew I wanted to combine it with &lt;a href="http://wiki.horde.org/Doc/Dev/Component/Horde_Test"&gt;an overview on how the Horde test suites are arranged&lt;/a&gt;. So far we have been lacking a summary in that area and it should help newcomers to the Horde project to get into testing mode as well.
&lt;/p&gt;

&lt;p&gt;
My mind is currently fully tuned to unit testing and code quality and it is amazing how easy it is to write about this. The initial draft for the article already exceeded all limits when it comes to size. Though I got pretty positive feedback on it I will have to leave some stuff out. Those sections should make it to this blog instead so that I can link to it in the article.
&lt;/p&gt;

&lt;p&gt;
Basically I will make this into a short series of blog entries on unit testing in Horde. I will include parts of the &lt;tt&gt;Horde_Test&lt;/tt&gt; overview, personal musings, and stuff related to the article. Let's hope it is useful to some people out there.
&lt;/p&gt;

&lt;p&gt;
Here we go with the introduction to the &lt;tt&gt;Horde_Test&lt;/tt&gt; overview...
&lt;/p&gt;

&lt;hr/&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;
The Horde Project has always had high standards when it comes to code quality. Of course these standards evolved with time and also with the progress the PHP community made. The code from &lt;a href="ftp://ftp.horde.org/pub/imp/imp-1.0.0.tar.gz"&gt;IMP-1.0.0 (1998)&lt;/a&gt; didn't come with unit tests. And somehow it lacked classes. And there is an awful lot of code mixed with HTML. Somehow this looks horribly like PHP3.
&lt;/p&gt;

&lt;p&gt;
Oh, it &lt;b&gt;was&lt;/b&gt; PHP3.
&lt;/p&gt;

&lt;p&gt;
Of course PHP development changed over time and so did the Horde project. Nowadays each and every commit into &lt;a href="http://git.horde.org"&gt;our repository&lt;/a&gt; leads to the automatic execution of thousands of unit tests written by the Horde developers and they check our code for failures. Night and day &lt;a href="http://ci.horde.org"&gt;our continuous integration server&lt;/a&gt; broadcasts the current test status to us in particular but also to anyone else interested.
&lt;/p&gt;

&lt;p&gt;
With the release of Horde 4 the test suites of the Horde components available via &lt;a href="http://pear.horde.org"&gt;our PEAR server&lt;/a&gt; all show some common patterns. There are certain Do's and Don'ts and a lot of playground in between. Often the &lt;tt&gt;Horde_Test&lt;/tt&gt; component is involved. So it makes sense to associate the overview on the anatomy of Horde test suites with this particular module.

&lt;hr/&gt;

&lt;p&gt;
I must admit that I really like the way the Horde project approaches unit testing. There is no way we could be unit test purists which would be too extreme given the fact that the project already exists for more than a decade. But at the same time there was also no one complaining when testing entered the equation. It just felt like continuing to adhere to the quality standards that seem so familiar when it comes to Horde code.
&lt;/p&gt;

&lt;p&gt;
So much for now. More technical stuff to follow soon...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-1680951670335104026?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/06/anatomy-of-horde-test-suite-i.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-9140259642362049144</guid><pubDate>Wed, 01 Jun 2011 13:14:00 +0000</pubDate><atom:updated>2011-06-01T15:18:00.640+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>packages</category><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>package management</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>unstable</category><category domain='http://www.blogger.com/atom/ns#'>stable</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>framework</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>components</category><title>Mixing stable Horde components with snapshots</title><description>&lt;p&gt;
One thing I completely love about Horde 4 being a component framework is the ability to have stable installations into which I can inject experimental snapshots of packages further developed, patched or hacked in some other way. Just an overview of one such installation:
&lt;/p&gt;
&lt;pre&gt;
INSTALLED PACKAGES, CHANNEL PEAR.HORDE.ORG:
===========================================
PACKAGE                   VERSION              STATE
Horde_ActiveSync          1.0.0                stable
Horde_Alarm               1.0.1                stable
Horde_Argv                1.0.1                stable
Horde_Auth                1.0.3                stable
Horde_Autoloader          1.0.0                stable
Horde_Browser             1.0.0                stable
Horde_Cache               1.0.3                stable
Horde_Cli                 1.0.0                stable
Horde_Compress            1.0.1                stable
Horde_Constraint          1.0.0                stable
Horde_Controller          1.0.0                stable
Horde_Core                1.1.2dev201105300702 stable
Horde_Crypt               1.0.2                stable
Horde_Data                1.0.0                stable
Horde_DataTree            1.0.0                stable
Horde_Date                1.0.1                stable
Horde_Date_Parser         1.0.0                stable
Horde_Db                  1.0.1                stable
Horde_Editor              1.0.1                stable
Horde_Exception           1.0.1                stable
Horde_Feed                1.0.1dev201106011224 stable
Horde_Form                1.0.1                stable
Horde_Group               1.0.0                stable
...
&lt;/pre&gt;
&lt;p&gt;
How do you get these snapshots? Ensure you have the &lt;a href="http://wiki.horde.org/Doc/Dev/Component/Components"&gt;horde-component&lt;/a&gt; helper set up. Then enter the package you wish to snapshot (e.g. &lt;tt&gt;Horde_Core&lt;/tt&gt;) and run:
&lt;/p&gt;
&lt;pre&gt;
horde-components snapshot
&lt;/pre&gt;
&lt;p&gt;
The snapshot package will be assembled in this directory, can be uploaded to your webserver and installed using:
&lt;/p&gt;
&lt;pre&gt;
pear upgrade --offline --force Horde_Core-1.1.2dev201105300702.tgz
&lt;/pre&gt;
&lt;p&gt;
What happens if you patched and deployed your package, sent the patch upstream, it gets accepted and a new package released?
&lt;/p&gt;
&lt;pre&gt;
pear upgrade horde/Horde_Core
&lt;/pre&gt;
&lt;p&gt;
Magic!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-9140259642362049144?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/06/mixing-stable-horde-components-with.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-5512976897831684379</guid><pubDate>Wed, 01 Jun 2011 10:55:00 +0000</pubDate><atom:updated>2011-06-01T15:17:41.770+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>post</category><category domain='http://www.blogger.com/atom/ns#'>howto</category><category domain='http://www.blogger.com/atom/ns#'>feeds</category><category domain='http://www.blogger.com/atom/ns#'>entry</category><category domain='http://www.blogger.com/atom/ns#'>atom</category><category domain='http://www.blogger.com/atom/ns#'>example</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>tutorial</category><category domain='http://www.blogger.com/atom/ns#'>horde_feed</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>coding</category><title>Blogging to blogger.com via Horde_Feed</title><description>&lt;p&gt;
With Horde 4 being available as PEAR based components a lot of functionality that was hidden behind the Horde groupware applications have suddenly become available as building blocks for your own PHP based software. There is still a lot documentation that should get written. As one piece of the puzzle I will use my blog to post short tutorials on interesting things you might wish to do with the Horde PEAR packages.
&lt;/p&gt;
&lt;p&gt;
Let's start with blog posts today...
&lt;/p&gt;
&lt;p&gt;
Creating Atom blog posts becomes a rather simple task with the help of the &lt;b&gt;Horde_Feed&lt;/b&gt; package. Install it via PEAR first:
&lt;/p&gt;
&lt;pre&gt;
pear channel-discover pear.horde.org
pear install horde/Horde_Feed
&lt;/pre&gt;
&lt;p&gt;
Start with creating an instance of &lt;tt&gt;Horde_Feed_Entry_Atom&lt;/tt&gt; and populate it with content similar to the example below:
&lt;pre&gt;
$entry = new Horde_Feed_Entry_Atom();
$entry-&gt;{'atom:title'} = 'Entry 1';
$entry-&gt;{'atom:title'}['type'] = 'text';
$entry-&gt;{'atom:content'} = '1.1';
$entry-&gt;{'atom:content'}['type'] = 'text';
&lt;/pre&gt;
&lt;p&gt;
The &lt;tt&gt;type&lt;/tt&gt; could also be &lt;tt&gt;html&lt;/tt&gt; or &lt;tt&gt;xhtml&lt;/tt&gt; if the text in the corresponding field is not plain text. See the &lt;a href="http://en.wikipedia.org/wiki/Atom_%28standard%29"&gt;overview on the Atom format&lt;/a&gt; for that.
&lt;/p&gt;
&lt;p&gt;
Now it is sufficient to post the entry with:
&lt;/p&gt;
&lt;pre&gt;
try {
    $entry-&gt;save($blogUri);
} catch (Horde_Feed_Exception $e) {
    die('An error occurred posting: ' . $e-&gt;getMessage() . "\n");
}
&lt;/pre&gt;
&lt;p&gt;
In most situations this example will be somewhat too simplistic. Most sites will require you to authenticate before being able to add Atom entries. How such authentication information can be transmitted when posting the entry is detailed in the &lt;a href="https://github.com/horde/horde/blob/HEAD/framework/Feed/examples/Horde/Feed/blogger.php"&gt;blogger.com example&lt;/a&gt; that comes with the &lt;tt&gt;Horde_Feed&lt;/tt&gt; package. At the time I'm writing this the authentication is not yet available in the released package though - you will have to wait for the next release to hit &lt;a href="http://pear.horde.org"&gt;pear.horde.org&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-5512976897831684379?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/06/blogging-to-bloggercom-via-hordefeed.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-5023777459146759407</guid><pubDate>Tue, 31 May 2011 13:51:00 +0000</pubDate><atom:updated>2011-05-31T15:51:30.875+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>imap_client</category><category domain='http://www.blogger.com/atom/ns#'>Kolab_Storage</category><category domain='http://www.blogger.com/atom/ns#'>quality control</category><category domain='http://www.blogger.com/atom/ns#'>qc</category><category domain='http://www.blogger.com/atom/ns#'>continuous integration</category><title>Horde continuous integration got updated</title><description>&lt;a href="http://jenkins-ci.org/"&gt;&lt;img alt="" border="0" height="150" src="https://wiki.jenkins-ci.org/download/attachments/2916393/logo.png?version=1&amp;modificationDate=1302753947000" style="float: right; margin: 0pt 0pt 10px 10px;" /&gt;&lt;/a&gt;
&lt;p&gt;
&lt;a href="http://ci.horde.org"&gt;The Horde continuous integration server&lt;/a&gt; received an update to the most recent version of &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;. In addition two new jobs were added to the system: &lt;a href="http://ci.horde.org/job/Kolab_Storage/"&gt;Kolab_Storage&lt;/a&gt; and &lt;a href="http://ci.horde.org/job/Imap_Client/"&gt;Imap_Client&lt;/a&gt;. May they stay forever green! The total number of packages under CI surveillance is 48 by now.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-5023777459146759407?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/05/horde-continuous-integration-got.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-2716949550620358462</guid><pubDate>Tue, 31 May 2011 07:02:00 +0000</pubDate><atom:updated>2011-05-31T09:02:40.503+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>cloud</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>storage</category><category domain='http://www.blogger.com/atom/ns#'>owncloud</category><title>Will have to think about ownCloud</title><description>&lt;p&gt;
While I'm still waiting for the Horde 4 interview with &lt;a href="http://www.janschneider.de"&gt;Jan Schneider&lt;/a&gt; to appear on &lt;a href="http://www.radiotux.de/"&gt;Radio Tux&lt;/a&gt; I got a reminder to think about &lt;a href="http://owncloud.org"&gt;ownCloud&lt;/a&gt;. While writing this I am listening to &lt;a href="http://blog.radiotux.de/2011/05/30/linuxtag-interview-mit-frank-karlitschek-uber-owncloud/"&gt;the interview about ownCloud&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I'm not yet certain it is actually different to Horde. Of course the way both projects started and the ideas behind them differ. But a lot of the targets seem to be very similar. In any case I need to identify if there are any bridges that could be easily built.
&lt;/p&gt;
&lt;p&gt;
I'm mainly interested in seeing what kind of APIs they provide to the outside and whether this could be offered by Horde as well to support connecting desktop clients. Or maybe Horde could be integrated as a data serving backend. Of course ownCloud still lacks one thing: a decent storage backend. No Kolab support so far ;) ...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-2716949550620358462?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/05/will-have-to-think-about-owncloud.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-9131453701156903130</guid><pubDate>Tue, 31 May 2011 05:48:00 +0000</pubDate><atom:updated>2011-05-31T07:48:25.377+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>release</category><category domain='http://www.blogger.com/atom/ns#'>pear</category><category domain='http://www.blogger.com/atom/ns#'>kolab</category><title>A number of Kolab_* releases on files.kolab.org</title><description>&lt;p&gt;
Yesterday and this morning I released &lt;a href="http://files.kolab.org/incoming/wrobel/Kolab_FreeBusy-0.5.2.tgz"&gt;Kolab_FreeBusy-0.5.2&lt;/a&gt;, &lt;a href="http://files.kolab.org/incoming/wrobel/Kolab_Server-0.5.1.tgz"&gt;Kolab_Server-0.5.1&lt;/a&gt;, and &lt;a href="http://files.kolab.org/incoming/wrobel/Kolab_Storage-0.5.1.tgz"&gt;Kolab_Storage-0.5.1&lt;/a&gt;. All of these are bug fix releases for the Kolab server.
&lt;/p&gt;
&lt;p&gt;
With Horde 4 being deployed via &lt;a href="http://pear.horde.org"&gt;pear.horde.org&lt;/a&gt; I cannot release the Kolab_* packages from the Horde 3 branch via that channel anymore. So you can expect updates to hit &lt;a href="http://files.kolab.org"&gt;files.kolab.org&lt;/a&gt; exclusively. I don't like that too much but as Horde 3 was not yet released via PEAR and the Kolab_* releases are only targeted at the Kolab server this compromise makes sense.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-9131453701156903130?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/05/number-of-kolab-releases-on.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-2497970992265081160</guid><pubDate>Tue, 17 May 2011 12:34:00 +0000</pubDate><atom:updated>2011-05-17T14:36:43.301+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>unit testing</category><category domain='http://www.blogger.com/atom/ns#'>horde 4</category><category domain='http://www.blogger.com/atom/ns#'>linux magazin</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>article</category><title>Is Horde PHP?</title><description>&lt;p&gt;
&lt;a href="http://www.linuxtag.org/2011/"&gt;LinuxTag&lt;/a&gt; was really nice for the Horde project because of all that positive feedback to our recent release and the valuable suggestions for stuff that would be nice to have in Horde. Might be worth another blog post. Here I just wanted to log one of the funnier conversations I had ...
&lt;/p&gt;
&lt;p&gt;
"Is Horde PHP?"
&lt;/p&gt;
&lt;p&gt;
"Yes."
&lt;/p&gt;
&lt;p&gt;
"Do you use unit tests?"
&lt;/p&gt;
&lt;p&gt;
"Absolutely. We got about 3000 of those."
&lt;/p&gt;
&lt;p&gt;
"Oh, great. Mind writing an article about PHP Unit testing in Linux Magazine?"
&lt;/p&gt;
&lt;p&gt;
"Deal!"
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-2497970992265081160?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/05/is-horde-php.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-998418780028044861.post-893569952298913671</guid><pubDate>Mon, 16 May 2011 08:26:00 +0000</pubDate><atom:updated>2011-05-16T10:27:47.196+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>video</category><category domain='http://www.blogger.com/atom/ns#'>pardus</category><category domain='http://www.blogger.com/atom/ns#'>horde</category><category domain='http://www.blogger.com/atom/ns#'>cebit</category><category domain='http://www.blogger.com/atom/ns#'>horde4</category><category domain='http://www.blogger.com/atom/ns#'>presentation</category><title>Video of the Horde 4 talk on CeBIT</title><description>&lt;a href="http://www.flickr.com/photos/wrobel/221428845/" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" height="150" src="http://farm1.static.flickr.com/77/221428845_3bca2a9eaa_m.jpg" style="float: right; margin: 0pt 0pt 10px 10px;" width="200" /&gt;&lt;/a&gt;
&lt;p&gt;
A while ago I presented a talk for &lt;a href="http://www.horde.org"&gt;the Horde Project&lt;/a&gt; on &lt;a href="http://www.cebit.org"&gt;CeBIT 2011&lt;/a&gt;. The link to the corresponding video comes somewhat late but here it is: &lt;a href="http://www.techcast.com/events/cebit11/mi11"&gt;Horde 4&lt;/a&gt; (the talk is in German).
&lt;/p&gt;&lt;p&gt;
I could have used better slides, I could have stopped saying "eh", and so on and so on - always nice to see yourself talking in order to improve. But I felt the content is okay and still relevant. Feedback welcome!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/998418780028044861-893569952298913671?l=log.pardus.de' alt='' /&gt;&lt;/div&gt;</description><link>http://log.pardus.de/2011/05/video-of-horde-4-talk-on-cebit.html</link><author>noreply@blogger.com (Gunnar Wrobel)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/77/221428845_3bca2a9eaa_t.jpg' height='72' width='72'/><thr:total>2</thr:total></item></channel></rss>
