<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="/h4/jonah/themes/feed-rss.xsl" type="text/xsl"?> 
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> 
 <channel> 
  <title>Stories tagged with horde in Chuck Hagenbuch</title> 
  <link>http://hagenbu.ch/</link> 
  <atom:link rel="self" type="application/rss+xml" title="Stories tagged with horde in Chuck Hagenbuch" href="http://technest.org/h4/jonah/delivery/rss.php?type=rss2&amp;channel_id=133" xmlns:atom="http://www.w3.org/2005/Atom">http://technest.org/h4/jonah/delivery/rss.php?type=rss&amp;channel_id=133</atom:link> 
  <description>Chuck's blog, links, news, ramblings</description> 
  <pubDate>Fri, 16 Oct 2009 00:09:48 -0400</pubDate> 
  <generator>Jonah H4 (1.0-git) (http://www.horde.org/jonah/)</generator> 
   
  <item> 
     <title>Quick Tasks in Nag, Horde's task manager</title> 
     <link>http://hagenbu.ch/blog/520</link> 
     <description>Introducing Horde_Date_Parser and quick tasks in Nag</description> 
     <content:encoded><![CDATA[<p>Horde recently added a new library: Horde_Date_Parser. It started off as a port of the ruby library <a href="http://chronic.rubyforge.org">Chronic</a>, but was completely revamped to support multiple locales. I also added even more tests and several that don't pass in Chronic pass in Horde_Date_Parser. </p> 
  <p>To show off the new library, I've added a &quot;quick add&quot; feature to Nag, the Horde task manager. This adds a tasks/quickAdd registry method, that takes a single string. Dates in
the string are parsed out as due dates, and multiple tasks can be added by
separating them with newlines. Child tasks can also be created with
indentation (including * or - lists).</p> 
  <p>For example:</p> 
  <pre>laundry tomorrow
* buy detergent tonight 
</pre> 
  <p>Will create two tasks: a parent task named &quot;laundry&quot; with a due date of
tomorrow, and a child task named &quot;buy detergent&quot; with a due date of tonight.</p> 
  <p>In addition to the API call there's a pretty UI for this:</p> 
  <p><img vspace="0" hspace="0" border="0" align="baseline" src="/ansel-vfs/05/screen/10405.jpg" /></p> 
  <p>Gives:</p> 
  <p><img vspace="0" hspace="0" border="0" align="baseline" src="/ansel-vfs/06/screen/10406.jpg" /></p> 
  <p>Others have these features of course. However our version handles <a href="http://webworkerdaily.com/2009/07/06/task-fm-updates-adds-twitter-and-email-support/">some cases that some of them don't</a>:</p> 
  <p><img vspace="0" hspace="0" border="0" align="baseline" src="/ansel-vfs/07/screen/10407.jpg" /></p> 
  <p><img vspace="0" hspace="0" border="0" align="baseline" src="/ansel-vfs/08/screen/10408.jpg" /></p> 
]]></content:encoded> 
     <pubDate>Mon, 17 Aug 2009 22:27:41 -0400</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/520</guid> 
  </item> 
   
  <item> 
     <title>Speaking at the MySQL Conference</title> 
     <link>http://hagenbu.ch/blog/518</link> 
     <description>I'm really excited to be participating in the closing keynote of this year's MySQL conference: http://en.oreilly.com/mysql2009/public/schedule/detail/8991. We'll be talking about our experiences behind the scenes of the Obama compaign. For me and my cowor</description> 
     <content:encoded><![CDATA[I'm really excited to be participating in the <a href="http://en.oreilly.com/mysql2009/public/schedule/detail/8991">closing keynote of this year's MySQL conference</a>. We'll be talking about our experiences behind the scenes of the Obama compaign. For me and my coworker Leigh Heyman, that means the software and hardware systems behind <a href="http://my.barackobama.com/">my.barackobama.com</a>, which took in over $500 million in contributions and sent over 1.3 billion emails.<br /><br />I also recently spoke with another coworker, Josh King, at the BostonPHP user's group about the various communications systems we ran - Josh about the Neighbor-to-Neighbor tool for canvassing, and myself about email. There are some comments and photos on <a href="http://php.meetup.com/29/calendar/9729300/">the meetup page</a>, and a <a href="http://www.bostonphp.org/content/view/130/1/">podcast recording on the BostonPHP website</a>. 
]]></content:encoded> 
     <pubDate>Sat, 04 Apr 2009 17:45:06 -0400</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/518</guid> 
  </item> 
   
  <item> 
     <title>Using Horde/Controller from the command line</title> 
     <link>http://hagenbu.ch/blog/516</link> 
     <description>Horde_Controller has command line request and response classes, letting you easily create controllers that are routable from a script.</description> 
     <content:encoded><![CDATA[<p>Horde/Controller is a new Horde 4/PHP 5 component that builds on Horde/Routes to provide the &quot;C&quot; in an MVC architecture. It's heavily based on the <a href="http://framework.maintainable.com/">Maintainable</a> framework, which is in turn heavily based on Rails, so it will look similar if you're familiar with either of those. Both Mad and Rails have the concept of tasks that can be run from the command line; I thought it would be nice to use the same routing and controller architecture to allow command line scripts.</p> 
  <p>After a little hacking, the Horde_Controller package in <a href="http://horde.org/source/git.php">git</a> now has Cli request and response objects and this script is all you need to give command-line access to a set of controllers:</p> 
  <pre>#!/usr/bin/env php
&lt;?php

require 'Horde/Autoloader.php';

// Set up our request and routing objects
$request = new Horde_Controller_Request_Cli();
$response = new Horde_Controller_Response_Cli();
$mapper = new Horde_Routes_Mapper();
$mapper-&gt;connect(':controller/:action');

// Create our controller context.
$context = array(
    'mapper' =&gt; $mapper,
    'controllerDir' =&gt; dirname(__FILE__) . '/../lib/controllers',
);

// Dispatch.
try {
    $dispatcher = Horde_Controller_Dispatcher::singleton($context);
    $dispatcher-&gt;dispatch($request, $response);
} catch (Exception $e) {
    var_dump($e-&gt;getMessage());
}
</pre> 
  <p>Error handling can obviously be improved, and your controllers need to produce plaintext output for this to be friendly, but it gives you the flexibility to add new commands to your script just by dropping in new controller classes to the controllerDir.</p> 
  <p>Arguments are parsed with the Horde/Argv package, using a new allowUnknownArgs parameter that auto-creates simple text values for options unknown to the parser. This lets you take arbitrary command line arguments in your controller without having to tell the dispatcher script what arguments you expect ahead of time (of course the trade off is that the dispatcher can't validate the arguments, so the controllers are responsible for that, just like they are with web requests).</p> 
  <p>Here's an example of invoking the index() method of a MigrateController class:</p> 
  <blockquote> 
    <pre>$ ./dispatch.php migrate</pre> 
  </blockquote> 
  <p>To invoke the currentVersion() method of the same controller:</p> 
  <blockquote> 
    <pre>$ ./dispatch.php migrate/current_version</pre> 
  </blockquote> 
  <p>To pass an argument named target_version with the value &quot;11&quot; to the controller's index() method:</p> 
  <blockquote> 
    <pre>$ ./dispatch.php migrate --target-version=11</pre> 
  </blockquote> 
  <p>It's still a work in progress, but I'm happy with the possibilities.</p> 
]]></content:encoded> 
     <pubDate>Sat, 21 Feb 2009 16:38:00 -0500</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/516</guid> 
  </item> 
   
  <item> 
     <title>Reasons to host your own groupware</title> 
     <link>http://hagenbu.ch/blog/508</link> 
     <description>Sometimes services die.</description> 
     <content:encoded><![CDATA[With the proliferation of hosted services and the cloud (5 yard penalty, unlicensed buzzword use, try again next post), a case has been made that people, and companies, shouldn't host things like their own email anymore. I've always been a proponent of keeping your own data, and privacy and data portability issues aside - sometimes services disappear. I don't mean GMail dropping off the face of the net for an hour here or there, but a service like I Want Sandy simply shutting down. This is of course an argument both for controlling your own data and for open source software. It's articulated well here:<br />
<br />
<a href="http://itdied.com/2008/12/in-defense-of-shutdowns.html" target="_blank">http://itdied.com/2008/12/in-defense-of-shutdowns.html</a><br />
<br />
The calculations change if you're paying for the service; at that point you have some level of commitment. But for free services? Keep backups. 
]]></content:encoded> 
     <pubDate>Wed, 17 Dec 2008 01:02:50 -0500</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/508</guid> 
  </item> 
   
  <item> 
     <title>Git support in Horde Chora</title> 
     <link>http://hagenbu.ch/blog/510</link> 
     <description>You can now browse git repositories via Chora, the Horde version control browser.</description> 
     <content:encoded><![CDATA[<p>Horde's version control browser, <a href="http://horde.org/chora/">Chora</a> now has initial <a href="http://git.or.cz">git</a> support. All three Horde git repositories (some more info available at <a href="http://horde.org/source/git.php">http://horde.org/source/git.php</a>) are browseable through the repository menu in the upper right at <a href="http://dev.horde.org/h/chora/">http://dev.horde.org/h/chora/</a>.</p>
<p>Chora provides a traditional tree-based view of the repository, with histories available in each individual file. We'll definitely have commit-based information (as we already support changesets in CVS and patchsets via <a href="http://www.cobite.com/cvsps/">cvsps</a>), and we're looking at having more of a git-centric history view as well. But if you need to interface with your repository through PHP code, or if you're used to a primarily tree-based version control browser, or if you already use Chora or Horde, you might find this useful.</p> 
]]></content:encoded> 
     <pubDate>Tue, 16 Dec 2008 21:32:04 -0500</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/510</guid> 
  </item> 
   
  <item> 
     <title>November Horde Board Meeting Summary</title> 
     <link>http://hagenbu.ch/blog/506</link> 
     <description>The focus of this month's board meeting was Horde 4 and the move to git. We made good progress and decisions on both counts.</description> 
     <content:encoded><![CDATA[<p>The November board meeting, already over a week ago (there was also this little election here in the U.S. that occupied a wee bit of my time), was quite productive. I'll give the <a href="http://lists.horde.org/archives/board/2008-November/000089.html">link to the full log</a> up front; I'm just going to talk about the process of moving libraries over to both Horde 4 code and to the <a href="http://horde.org/source/git.php">new git repositories</a>. Porting framework packages over is our current Horde 4 priority (over new applications, but not over Horde 3.3 application releases), and the process will be:</p>
<ol>
    <li>Write down the new coding standards for Horde 4 libraries. These have been developing somewhat organically, but they need to be codified - what is the package layout, what capitalization, what PHP 5 features to emphasize, what not to use, etc.</li>
    <li>Focus on converting our existing libraries. Libraries will be moved to the main git repository when:
    <ol>
        <li>The code has been reviewed, updated for the new coding standards, potentially refactored</li>
        <li>Unnecessary dependencies have been eliminated</li>
        <li>Wherever possible they should work without assuming a Horde configuration, <code>$registry</code> instance, etc.</li>
        <li>There should be at least basic unit tests</li>
    </ol>
    </li>
    <li>When a library is moved to git, it will be deleted from CVS HEAD</li>
    <li>Applications will be tweaked (in CVS) to work with the newly refactored Horde 4 packages</li>
</ol>
<p>Some libraries (Autoloader, Log, Support, ...) are already in git as they are already Horde 4 code; several others such as Db, Feed, Argv, ... will join them soon in the move from CVS. The rest - all 80-some other libraries in the current Horde Framework - will be converted over next.</p> 
]]></content:encoded> 
     <pubDate>Sat, 15 Nov 2008 00:17:01 -0500</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/506</guid> 
  </item> 
   
  <item> 
     <title>Jan Schneider interviewed by TechWorld</title> 
     <link>http://hagenbu.ch/blog/503</link> 
     <description>Techworld Australia just ran a great interview with Jan Schneider on Horde's history, present, future, and Jan's involvement.</description> 
     <content:encoded><![CDATA[<p>I can't say enough about how much several other developers have done for Horde in the last year - polishing <a href="http://horde.org/dimp/">DIMP</a> into the only client that has replaced <a href="http://horde.org/imp/">IMP</a> as my daily mail client, adding great photo gallery features to <a href="http://horde.org/ansel/">Ansel</a>, and more - but <a href="http://janschneider.de/">Jan Schneider</a> has been even more important, not only working on great new features (WebDAV), but lining up sponsorship for projects like the <a href="http://wiki.horde.org/Project/KronolithAjax">ajax calendar client</a>, and serving as release master and keeping things going in so many ways.</p> 
  <p>So it was great to see not only Horde, but Jan, get a <a href="http://www.techworld.com.au/article/263744">really nice interview</a> in Techworld Australia. Thanks Jan, and everyone working on Horde. The future looks great.<br /></p> 
]]></content:encoded> 
     <pubDate>Mon, 20 Oct 2008 16:27:04 -0400</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/503</guid> 
  </item> 
   
  <item> 
     <title>October Horde Board Meeting Summary</title> 
     <link>http://hagenbu.ch/blog/502</link> 
     <description>Summary: moving forward with Horde 3.3 and 4.0 cycles, moving to Git for future source control, moving to more frequent BC-breaking releases.</description> 
     <content:encoded><![CDATA[<p>The October Horde Board meeting was this past Tuesday, the 7th. It was one of our more decisive meetings, with decisions to: </p> 
  <ul> 
    <li>Move to <a href="http://git.or.cz/">git</a> for future (Horde 4+) version control. Code will be pushed to a clean git repository as it is modified for Horde 4 and PHP 5. Git pushes will generate email to a new list, <a href="http://lists.horde.org/mailman/listinfo/commits">commits@lists.horde.org</a>. Everything currently in CVS will remain available, and Horde 3.x will continue to be developed in and released from the existing CVS structure.</li> 
    <li>Aim for shorter release cycles of major versions. When backwards compatibility is broken we will increment the major version number (Horde 3 to Horde 4) as we do now; we'll just do that more often. Feedback indicates that being able to do feature upgrades of an application but not Horde, or vice versa, is not a big advantage for most people.</li> 
    <li>Use individual package versions much more extensively with Horde 4. We want it to be possible to release an application upgrade that relies on new framework functionality without requiring a new major version; instead, many changes will be possible by just requiring a specific package version.</li> 
    <li>Finally, and most importantly, we will be focusing on getting the last Horde 3.3 releases out (see <a href="http://wiki.horde.org/ReleaseManagement">http://wiki.horde.org/ReleaseManagement</a>), and then shifting our major focus to Horde 4. Our goal is to have an initial release of Horde 4.0 within 6 months of starting serious development on it; and to aim for major version releases approximately every year thereafter.<br /></li> 
  </ul> 
  <p>The <a href="http://lists.horde.org/archives/board/2008-October/000085.html">full minutes</a> are available in the board list archives; thanks to Ben Klang for running the meeting, posting the minutes, and doing the initial summarization. </p> 
]]></content:encoded> 
     <pubDate>Thu, 09 Oct 2008 17:22:45 -0400</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/502</guid> 
  </item> 
   
  <item> 
     <title>Day job</title> 
     <link>http://hagenbu.ch/blog/498</link> 
     <description>I was surprised and flattered to see Horde get a little mention in this Linux Journal article about Barack Obama and my day job: http://www.linuxjournal.com/content/obamas-secret-weapon-geeks-lots-them</description> 
     <content:encoded><![CDATA[I was surprised and flattered to see Horde get a little mention in this Linux Journal article about Barack Obama and my day job: <a href="http://www.linuxjournal.com/content/obamas-secret-weapon-geeks-lots-them" target="_blank">http://www.linuxjournal.com/content/obamas-secret-weapon-geeks-lots-them</a> 
]]></content:encoded> 
     <pubDate>Mon, 25 Aug 2008 16:41:22 -0400</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/498</guid> 
  </item> 
   
  <item> 
     <title>Distributing resources with Horde_Support_ConsistentHash</title> 
     <link>http://hagenbu.ch/blog/495</link> 
     <description>If you need to distribute resources across multiple servers, consistent hashing is an essential technique. Horde now provides an implementation that allows for different node weights, hashing of any kind of object as a node, and tuning the number of point</description> 
     <content:encoded><![CDATA[<p>Let's say you've just read Yahoo!'s <a href="http://developer.yahoo.com/performance/rules.html">Best Practices for Speeding Up Your Web Site</a> for the first time, and you want to tackle some easy ones first: serve your static assets (javascripts, css stylesheets, and images) from multiple servers. Alternately, if you've read the Yahoo! rules a bit more closely, you might not be worrying too much about assets due to the empty browser caches most of your users have, so what you really want to do is distribute cached user data across a set of cache servers.<br /></p> 
  <p>We're going to skip the details of why the simplistic ways to do this are a bad idea, and go right to <a href="http://en.wikipedia.org/wiki/Consistent_hashing">consistent hashing</a>.</p> 
  <p>If you're not familiar with it already, you should read up to understand <a href="http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing">what it solves and how it works</a>. Once you have that covered, here's how you can do it using Horde_Support_ConsistentHash, part of the recently released <a href="http://pear.horde.org/index.php?package=Support">horde/support</a> package.</p> 
  <p>For our example, you have three cache servers; the third one is much more powerful so you'd like it to handle the bulk of users. You're going to distribute cached user data across them based on username. Easy does it:<br /></p> 
  <blockquote> 
    <pre>$h = new Horde_Support_ConsistentHash;
$h-&gt;add('cache1.example.com', 1);
$h-&gt;add('cache2.example.com', 1);
$h-&gt;add('cache3.example.com', 4);
$cacheServer = $h-&gt;get($username);</pre> 
  </blockquote> 
  <p>This has all kinds of nice properties: you can bring up new servers gradually by increasing their weight (just read the list of nodes from a database or configuration file), and doing so - or taking a bad server out of the pool - won't cause most users on an unaffected server to be switched, reducing cache thrashing and probably saving your butt if you really have as much traffic as you think you do.</p> 
  <p>Horde_Support_ConsistentHash has no external dependencies (even on other Horde_Support files) and can be installed with an easy:</p> 
  <blockquote> 
    <pre>pear channel-discover pear.horde.org
pear install horde/support-beta</pre> 
  </blockquote> 
  <p>Finally, if your cache backend is memcache, the <a href="http://pecl.php.net/">PECL</a> memcache extension can take care of this for you by setting <a href="http://php.net/memcache.ini"><tt>memcache.cache_strategy = &quot;consistent&quot;</tt></a>. Obviously the Horde implementation can help you out in far more situations than just memcache, or if you're stuck with an older memcache package.<br /></p> 
]]></content:encoded> 
     <pubDate>Sat, 02 Aug 2008 13:29:20 -0400</pubDate> 
     <guid isPermaLink="true">http://hagenbu.ch/blog/495</guid> 
  </item> 
   
 </channel> 
</rss> 
