<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Allan Saddi's projects blog - General</title>
    <link>http://www.saddi.com/software/news/</link>
    <description>Announcements and ramblings about projects new and old.</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.5.5 - http://www.s9y.org/</generator>
    <pubDate>Wed, 06 Jul 2011 15:28:43 GMT</pubDate>

    <image>
        <url>http://www.saddi.com/software/news/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Allan Saddi's projects blog - General - Announcements and ramblings about projects new and old.</title>
        <link>http://www.saddi.com/software/news/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Latest Projects</title>
    <link>http://www.saddi.com/software/news/archives/86-Latest-Projects.html</link>
            <category>General</category>
            <category>Python</category>
    
    <comments>http://www.saddi.com/software/news/archives/86-Latest-Projects.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=86</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=86</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    It seems like I&#039;ve been working on so many random things the past few weeks. And all on different platforms: C (UNIX/POSIX), Python, Cocoa, iOS.&lt;br /&gt;
&lt;br /&gt;
Anyhow, the only things that are almost ready for public consumption are the security-related libraries/modules. (Each succeeding project builds on the previous.) All are BSD licensed.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://hg.saddi.com/sha-asaddi&quot;&gt;sha-asaddi&lt;/a&gt;&lt;br /&gt;
Everything SHA, from SHA-1 to SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) to the newest truncated editions (SHA-512/224, SHA-512/256). Also includes HMAC wrappers for each. This is a cleaned up and refactored version of my previous command-line sha project. Still WIP though.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://hg.saddi.com/pbkdf2&quot;&gt;pbkdf2&lt;/a&gt;&lt;br /&gt;
Implementations of &lt;a href=&quot;http://en.wikipedia.org/wiki/PBKDF2&quot;&gt;PBKDF2&lt;/a&gt; in C and Python. The C version depends on sha-asaddi, though I suppose it can easily be swapped to use any other SHA/HMAC implementations with similar signatures. The Python version has no dependencies outside of the standard library.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://hg.saddi.com/scrypt&quot;&gt;scrypt&lt;/a&gt;&lt;br /&gt;
Implementations of Colin Percival&#039;s &lt;a href=&quot;http://www.tarsnap.com/scrypt.html&quot;&gt;scrypt&lt;/a&gt; in C and pure Python. This was more of an academic exercise since Mr. Percival&#039;s version is far more optimized and is already available under a BSD license. (At least, I&#039;m assuming it&#039;s more optimized &amp;mdash; I haven&#039;t actually looked at his code yet. But he did seem to have assembly/SSE optimized versions.) The Python version is probably too slow to be practical. (A &lt;a href=&quot;http://pypi.python.org/pypi/scrypt/&quot;&gt;Python wrapper&lt;/a&gt; for the original scrypt implementation is already available.) Will gladly take optimization suggestions for the Python version! &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Oh, and these three projects represent a general shift in my packaging/building ideals. For now, I&#039;ve decided to ditch GNU&#039;s autotools in favor of &lt;a href=&quot;http://www.cmake.org/&quot;&gt;CMake&lt;/a&gt; for my projects. CMake just seems like a more coherent tool for configuring/building in a platform-independent manner. But, that just, like, my opinion, man... &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Wed, 29 Jun 2011 18:10:00 -0700</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/86-guid.html</guid>
    
</item>
<item>
    <title>sha updated</title>
    <link>http://www.saddi.com/software/news/archives/85-sha-updated.html</link>
            <category>General</category>
    
    <comments>http://www.saddi.com/software/news/archives/85-sha-updated.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=85</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=85</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    It&#039;s strange, but my most ubiquitous work is probably &lt;a href=&quot;http://www.saddi.com/software/sha/&quot;&gt;sha&lt;/a&gt; (or rather, its individual hash implementations). I lost track of the number of random products I&#039;ve run across that have a copyright/license attribution to me. SHA implementations are a dime a dozen though, and I&#039;m sure the versions in OpenSSL (libcrypto) draw the most users.&lt;br /&gt;
&lt;br /&gt;
But I have to wonder, what draws developers to mine? The random portability/optimization knobs? The BSD license?&lt;br /&gt;
&lt;br /&gt;
Anyway, I reworked my SHA implementations today. Brought the API to my naming/style standards for this decade. Added SHA-512/224 and SHA-512/256. And, from the work on &lt;a href=&quot;http://www.saddi.com/software/news/archives/73-pam_oath,-where-art-thou.html&quot;&gt;pam_totp&lt;/a&gt;, added HMAC wrappers.&lt;br /&gt;
&lt;br /&gt;
Of course, with the addition of HMAC, I had to work it into sha (the utility) as well, which I did.&lt;br /&gt;
&lt;br /&gt;
So after a little over 7 years, here&#039;s a new sha release...&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.saddi.com/software/sha/dist/sha-1.1.tar.gz&quot;&gt;sha 1.1 tarball&lt;/a&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Sun, 10 Apr 2011 21:19:58 -0700</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/85-guid.html</guid>
    
</item>
<item>
    <title>pam_oath, where art thou?</title>
    <link>http://www.saddi.com/software/news/archives/73-pam_oath,-where-art-thou.html</link>
            <category>General</category>
    
    <comments>http://www.saddi.com/software/news/archives/73-pam_oath,-where-art-thou.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=73</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=73</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    I&#039;ve been wanting to install some sort of two-factor authentication scheme on my server for a while now. There&#039;s &lt;a href=&quot;http://code.google.com/p/google-authenticator/&quot;&gt;Google Authenticator&lt;/a&gt;, but unfortunately, it appears to be written for Linux-PAM and is rife with Linuxisms. But all was not lost, however, as it lead me to &lt;a href=&quot;http://www.openauthentication.org/&quot;&gt;OATH&lt;/a&gt; and its related specs, HOTP and TOTP authentication.&lt;br /&gt;
&lt;br /&gt;
It turns out that HOTP/TOTP is relatively simple &amp;mdash; solely based on HMAC-SHA1. Great, I thought. I just needed an HMAC implementation... and I also needed to learn how to write a PAM module (specifically, an OpenPAM module, which is what FreeBSD uses). And yes, I know that &quot;PAM module&quot; is technically redundant, no one needs to point that out. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/tongue.png&quot; alt=&quot;:-P&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
So I studied RFC 4226, RFC 2104 and &lt;a href=&quot;http://www.freebsd.org/doc/en/articles/pam/&quot;&gt;this useful article&lt;/a&gt; about OpenPAM. I&#039;ve been doing that in my spare time for a few weeks now. It wasn&#039;t until this morning that I decided to start writing some code.&lt;br /&gt;
&lt;br /&gt;
And in a few hours, I had HMAC-SHA1 (built on top of my SHA1 implementation... I wanted to avoid libcrypto to keep things lightweight), HOTP, and finally a working pam_totp. I went with TOTP-only for now as that&#039;s what I wanted and I didn&#039;t really fancy keeping state for each user (aside from their keys). (But as an aside, it looks like I&#039;ll need to keep state anyway if I want to avoid replay attacks and have some clock drift tracking.)&lt;br /&gt;
&lt;br /&gt;
Anyway, what I have is in an extreme alpha state, but needless to say, I&#039;ve already installed it into my sshd PAM auth chain. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/tongue.png&quot; alt=&quot;:-P&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; As for a token generator, I use a nice, free iOS app called &lt;a href=&quot;http://itunes.apple.com/us/app/oath-token/id364017137?mt=8&quot;&gt;OATH Token&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I won&#039;t bother releasing anything, as the intended audience is rather small (FreeBSD admins who want TOTP auth). Maybe I&#039;ll work on it more someday, add event-based HOTP support, develop it into a true pam_oath (which I couldn&#039;t find anywhere, strangely). But at least &lt;em&gt;that&lt;/em&gt; itch has been scratched... 
    </content:encoded>

    <pubDate>Sat, 11 Dec 2010 23:15:28 -0800</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/73-guid.html</guid>
    
</item>
<item>
    <title>SHA stuff moved to Hg</title>
    <link>http://www.saddi.com/software/news/archives/68-SHA-stuff-moved-to-Hg.html</link>
            <category>General</category>
            <category>py-lib</category>
    
    <comments>http://www.saddi.com/software/news/archives/68-SHA-stuff-moved-to-Hg.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=68</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=68</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    I didn&#039;t realize this, but all my SHA implementations were still living in my Subversion repository. Well, after some meticulous converting from both my archived CVS &lt;em&gt;and&lt;/em&gt; SVN repositories, I&#039;ve managed to finally move them over to Mercurial.&lt;br /&gt;
&lt;br /&gt;
Anyway, I&#039;m not sure what else in Subversion I&#039;d like to move over. Certainly, there&#039;s nothing left in there that&#039;s all that interesting to the public. So I will take down the public-facing SVN repo... someday.&lt;br /&gt;
&lt;br /&gt;
Searching Google, I see nothing links directly svn.saddi.com. However, there&#039;s quite &lt;em&gt;a lot&lt;/em&gt; of documentation that references flup and fcgi.py within it. Well, if anyone&#039;s been checking out &lt;em&gt;that&lt;/em&gt; flup, it&#039;s 2 years out of date. And the standalone fcgi.py module... I&#039;d rather just forget about that since it&#039;s hopelessly out of sync from the flup version. (It&#039;s basically the flup threaded fcgi server without thread pools.) 
    </content:encoded>

    <pubDate>Mon, 03 Aug 2009 21:21:29 -0700</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/68-guid.html</guid>
    
</item>
<item>
    <title>Random changes</title>
    <link>http://www.saddi.com/software/news/archives/62-Random-changes.html</link>
            <category>General</category>
    
    <comments>http://www.saddi.com/software/news/archives/62-Random-changes.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=62</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=62</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    Just a few updates on some non-happenings. I recently discovered &lt;a href=&quot;http://www.selenic.com/mercurial/wiki/index.cgi/ConvertExtension&quot;&gt;hg convert&lt;/a&gt; and &lt;a href=&quot;http://www.selenic.com/mercurial/wiki/index.cgi/TransplantExtension&quot;&gt;hg transplant&lt;/a&gt;. I decided to re-do my Mercurial repositories (most originated in Subversion, while others came from CVS). I was entirely &lt;em&gt;obsessed&lt;/em&gt; with converting the &lt;em&gt;entire&lt;/em&gt; history to HG. (Projects like yafic and newsfish had the most history, being converted from CVS to SVN, then SVN to HG. Unfortunately, I didn&#039;t preserve history when going to SVN.) Anyhow, I&#039;m pretty happy with the results.&lt;br /&gt;
&lt;br /&gt;
On another note, I went ahead and upgraded Trac to 10.4. I also installed the Mercurial plugin and switched to that. Unfortunately, Trac doesn&#039;t currently support multiple repositories (see &lt;a href=&quot;http://trac.edgewall.org/ticket/2086&quot;&gt;#2086&lt;/a&gt;), so my catch-all Trac page, &lt;a href=&quot;http://trac.saddi.com/projects&quot;&gt;http://trac.saddi.com/projects&lt;/a&gt;, only tracks a single project. (And that happens to be yafic since it&#039;s had recent activity...) I don&#039;t really feel like switching to one Trac environment per project, so I guess I&#039;ll wait out that feature request. 
    </content:encoded>

    <pubDate>Wed, 17 Oct 2007 11:09:28 -0700</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/62-guid.html</guid>
    
</item>
<item>
    <title>Mercurial repository</title>
    <link>http://www.saddi.com/software/news/archives/57-Mercurial-repository.html</link>
            <category>General</category>
    
    <comments>http://www.saddi.com/software/news/archives/57-Mercurial-repository.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=57</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=57</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    I&#039;m currently trying out &lt;a href=&quot;http://www.selenic.com/mercurial/wiki/&quot;&gt;Mercurial&lt;/a&gt;, a distributed SCM that&#039;s 99% pure Python. I was able to migrate some of my recent projects (including full history) over to it. My repository is &lt;a href=&quot;http://hg.saddi.com/&quot;&gt;http://hg.saddi.com/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I haven&#039;t fully committed yet, but it&#039;s very tempting since it&#039;s far easier to install (it&#039;s literally a &quot;python setup.py install&quot;). Setting up the web interface was a breeze too (it&#039;s built on top of WSGI!)&lt;br /&gt;
&lt;br /&gt;
Oh well, I mention this now because I&#039;ve finally committed something to my Hg repository. In other words, my SVN and Hg repositories are now out of sync...&lt;br /&gt;
&lt;br /&gt;
Anyway, I know there&#039;s a Trac plugin for Hg which I will have to try out as well. Not sure if and when I&#039;ll fully commit. Only time will tell and I really haven&#039;t been working on any personal projects lately... 
    </content:encoded>

    <pubDate>Thu, 12 Jul 2007 22:13:01 -0700</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/57-guid.html</guid>
    
</item>
<item>
    <title>Another AJP implementation</title>
    <link>http://www.saddi.com/software/news/archives/47-Another-AJP-implementation.html</link>
            <category>General</category>
            <category>Python</category>
    
    <comments>http://www.saddi.com/software/news/archives/47-Another-AJP-implementation.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=47</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=47</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    There don&#039;t seem to be many AJP C libraries. In fact, there don&#039;t seem to be any (according to Google, at least). There&#039;s at least one FastCGI C library, which is unsurprising given the ubiquity of FastCGI. So yesterday afternoon, I decided to &quot;read spec, write code&quot; yet again and began a C implementation of the &quot;container&quot; (app server) side of AJP. After not having touched C for over 2-3 years, it was a good feeling to muck around with C and BSD sockets again. (Procedural programming, how I missed you!)&lt;br /&gt;
&lt;br /&gt;
I finished it up in a few hours and it is now fairly complete. It&#039;s actually a pretty simple protocol, I&#039;ve realized. All the complexity comes from the way requests/responses are encoded and decoded. (Otherwise, it&#039;s a fairly straightforward 1:1 mapping.)&lt;br /&gt;
&lt;br /&gt;
Of course there were the 3 undocumented spec additions, the first two I had to figure out through experimentation so long ago and the last was conveyed to me by someone who actually looked at the source mod_jk/mod_proxy_ajp source. (As much as I believe in the whole &quot;the best documentation is the source&quot; thing, I don&#039;t really like looking at similar/related source code when implementing something.)&lt;br /&gt;
&lt;br /&gt;
Anyhow, I don&#039;t think those 3 undocumented additions are documented anywhere (hah!) besides my source (ajp_base.py and ajp.c). So:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;When decoding strings, a string with the length of 0xffff is the same as the empty string. However, its trailing NUL is not in the stream.&lt;/li&gt;&lt;li&gt;When sending SEND_BODY_CHUNK packets, the packets must be NUL terminated. However, this NUL must not be included in the SEND_BODY_CHUNK&#039;s length (but must be included in the packet&#039;s length).&lt;/li&gt;&lt;li&gt;The value following an SSL_KEY_SIZE attribute is not an encoded string, but rather an AJP integer.&lt;/li&gt;&lt;/ul&gt;Anyway, the ultimate goal of this project is to create a Python WSGI AJP server that is implemented in C as much as possible. At this point, I have a simple proof-of-concept working that makes calls into an embedded Python interpreter. It doesn&#039;t implement WSGI at all though.&lt;br /&gt;
&lt;br /&gt;
As far as request/response throughput is concerned, it looks promising. While the threaded pure-Python AJP server could only handle ~86 requests per second (with 100 parallel clients), the threaded C/Python hybrid version was nearly pushing 1000 requests per second. Of course it doesn&#039;t include WSGI overhead yet. But we shall see.&lt;br /&gt;
&lt;br /&gt;
All this effort is, of course, inspired by the WSGI servers built upon the FastCGI C library: &lt;a href=&quot;http://cheeseshop.python.org/pypi/fcgiapp/1.4&quot;&gt;fcgiapp&lt;/a&gt; and &lt;a href=&quot;http://cheeseshop.python.org/pypi/python-fastcgi/1.1&quot;&gt;python-fastcgi&lt;/a&gt;. If I actually &lt;em&gt;used&lt;/em&gt; FastCGI, I&#039;d probably be using one of those servers rather than flup&#039;s. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; 
    </content:encoded>

    <pubDate>Sun, 10 Dec 2006 15:20:28 -0800</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/47-guid.html</guid>
    
</item>
<item>
    <title>All I've ever wanted was a CMS...</title>
    <link>http://www.saddi.com/software/news/archives/39-All-Ive-ever-wanted-was-a-CMS....html</link>
            <category>General</category>
    
    <comments>http://www.saddi.com/software/news/archives/39-All-Ive-ever-wanted-was-a-CMS....html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=39</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=39</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    I guess.&lt;br /&gt;
&lt;br /&gt;
I&#039;ve worked on my Python &quot;blog&quot; project for a number of years now. If I remember correctly, under the hood, it started out using flat files for storage and CGI. Eventually I moved it to mod_python+Publisher, then to FastCGI+my own version of Publisher. Sometime before that, I switched to using PostGreSQL... eventually transitioning the site content and then the session data to the database. (The templating engine changed at least once. And of course eventually, came the switch of the whole webserver interface to WSGI.)&lt;br /&gt;
&lt;br /&gt;
Anyhow, what I was aiming for was a user-customizable blog/forum site. Multi-column, a selection of premade components (such as polls and HTML boxes), user profiles, personal bookmarks, etc. It was pretty ambitious and it met most of those goals. Though little did I realize that if I just generalized my goals a bit, I would actually be creating a Content Management System.&lt;br /&gt;
&lt;br /&gt;
I didn&#039;t come to that realization until I started playing around with CMS&#039;s recently. At first, being in my Java mood, I sought open source Java CMS&#039;s. I only stumbled across &lt;a href=&quot;http://lenya.apache.org/&quot;&gt;Lenya&lt;/a&gt;. I ran into some difficulty, and promptly tabled it. I figured there would be more Java CMS&#039;s out there. But I really didn&#039;t have much luck finding anymore... (ok, so I didn&#039;t try that hard, either)&lt;br /&gt;
&lt;br /&gt;
I briefly looked at &lt;a href=&quot;http://plone.org&quot;&gt;Plone&lt;/a&gt; (based on Zope). It seemed a bit overkill for what I wanted... and overtly complex. So I moved on the PHP-based projects. (Note that I eventually did try Plone. But my gut feeling was correct, especially compared to the PHP CMS&#039;s.)&lt;br /&gt;
&lt;br /&gt;
So I decided to look at &lt;a href=&quot;http://joomla.org&quot;&gt;Joomla!&lt;/a&gt; and &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt;, based on all the hype around those projects. (Some of it good, some of it bad... i.e. security vulnerabilities that made the front page of Slashdot. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;)&lt;br /&gt;
&lt;br /&gt;
I tried Drupal first and immediately fell in love. It was utterly simple to use and maintain. It was a breeze to set up multiple instances using the same installation. It had a whole array of 3rd party modules that did what I wanted. (And I found, it could do most of what I wanted out of the box already - I just had to enable the module.) Anyhow, I switched 3 of my (static) sites to Drupal to try it out.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, at this point, I never gave Joomla! a chance. I hear many good things about Joomla! pertaining to the ease of use (and the eye candy). But it had one fatal flaw in my eyes: it only supported MySQL. Hence the reason that I tried Drupal first...&lt;br /&gt;
&lt;br /&gt;
As an aside, it&#039;s probably obvious, but I&#039;m not a big fan of the L-M-P in LAMP. 1) I am and have been an avid FreeBSD user for the past decade. 2) I prefer PostGreSQL over MySQL, speed be damned. I like my transactions, thank you. 3) Whether the P stands for Perl or PHP, I&#039;d rather have my apps written in Python and to some extent, Java.&lt;br /&gt;
&lt;br /&gt;
Anyway, the only thing really missing (so far) from Drupal is a &lt;i&gt;good&lt;/i&gt; CAPTCHA module. Solving a simple addition problem seems a bit simplistic. I&#039;d be surprised if there weren&#039;t bots that could answer those CAPTCHAs already. And the image CAPTCHA support seems a bit lame, especially compared to the last CAPTCHA library I worked with, &lt;a href=&quot;http://jcaptcha.sourceforge.net/&quot;&gt;JCaptcha&lt;/a&gt;. Anyhow, I bring this up because even though I normally turn off user registration, I did forget to turn it off for one of my sites. Overnight, some 3-4 &quot;people&quot; (all using rather fake looking yahoo addresses) registered for my site. I&#039;m sure if I had some actual content that you could post comments to, I&#039;d also have a bunch of spam to take care of.&lt;br /&gt;
&lt;br /&gt;
Anyway, one of the sites that was converted happens to be saddi.com. If I get more familiar/comfortable with Drupal, I&#039;ll probably be subsuming this blog into its Drupal instance. 
    </content:encoded>

    <pubDate>Tue, 14 Nov 2006 15:40:00 -0800</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/39-guid.html</guid>
    
</item>
<item>
    <title>Sweet, sweet WSGI</title>
    <link>http://www.saddi.com/software/news/archives/29-Sweet,-sweet-WSGI.html</link>
            <category>General</category>
    
    <comments>http://www.saddi.com/software/news/archives/29-Sweet,-sweet-WSGI.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=29</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=29</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    I decided to put on my sysadmin hat and do a little work on kalahari (my co-located server). I didn&#039;t really have a plan. And I&#039;d been upgrading things here and there over the past few weeks. (Like bringing Subversion up to 1.3.1 from 1.1.x. Thankfully that went painlessly.)&lt;br /&gt;
&lt;br /&gt;
I decided to set up Trac, just to give it a try. Rather than install it through the FreeBSD ports system, I installed most of the dependencies and did a manual install. It was surprisingly painless. The Trac files and environment live in the trac user&#039;s home directory... and I run Trac using the WSGI patch + flup&#039;s AJP server. Quite simple.&lt;br /&gt;
&lt;br /&gt;
As a digression, sometimes I wonder if people wonder about my affinity for AJP. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; My webserver has both mod_fastcgi and mod_jk. (Alas, I&#039;m not brave enough to upgrade to httpd 2.2.x yet, for the built-in mod_proxy_xxx modules.) But I prefer to run web applications/services as a different user. CGI/FastCGI would require me to set up the application to run as www:www... and just setting up the permissions alone would be a nightmare. (Not to mention the insecurity of running as the generic www user... not that I don&#039;t trust the other users of my server. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;) I can&#039;t use SCGI because mod_scgi doesn&#039;t coexist peacefully with mod_fastcgi under httpd 2.x. And I realize FastCGI apps can be run in an &quot;app-server&quot; mode for lack of a better term (as a manually spawned process), but configuration of AJP seems so much simpler.&lt;br /&gt;
&lt;br /&gt;
Well, that and I run Tomcat as well. I would say the web applications/services on kalahari are now evenly split between Python-based and J2EE-based platforms. (Although one internal app still runs on WebObjects...)&lt;br /&gt;
&lt;br /&gt;
Anyhow, I also decided to revive the old wiki, the main use of which was to serve the help pages for blog.flup.org. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; I did the same as I did with Trac. Manual installation, WSGI backend + AJP server from flup.&lt;br /&gt;
&lt;br /&gt;
Lastly, I revived flup.org/u (my simple URL shortener). I took it down some time ago because of abuse, but it was always my intent to restore it once I had some basic authentication/authorization built in. Well, with the CAS server now long in place, it was pretty easy. As an aside, I&#039;ve been itching to write some sort of CAS WSGI middleware, but I see Paste already has something. Still, it would be nice to have some sort of generic filter/interceptor framework. If not for WSGI, then for flup&#039;s Publisher. 
    </content:encoded>

    <pubDate>Sun, 07 May 2006 14:35:36 -0700</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/29-guid.html</guid>
    
</item>
<item>
    <title>The Joys of Spring</title>
    <link>http://www.saddi.com/software/news/archives/22-The-Joys-of-Spring.html</link>
            <category>General</category>
    
    <comments>http://www.saddi.com/software/news/archives/22-The-Joys-of-Spring.html#comments</comments>
    <wfw:comment>http://www.saddi.com/software/news/wfwcomment.php?cid=22</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.saddi.com/software/news/rss.php?version=2.0&amp;type=comments&amp;cid=22</wfw:commentRss>
    

    <author>nospam@example.com (Allan Saddi)</author>
    <content:encoded>
    I have to admit, I&#039;ve barely done any Python programming since I started my new job. Though, oddly enough, my Java skills and J2EE knowledge have been steadily growing. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; In fact, lately, I can honestly say I&#039;ve been &lt;em&gt;enjoying&lt;/em&gt; doing Java/J2EE stuff. I can probably thank &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt; and &lt;a href=&quot;http://www.springframework.org/&quot;&gt;Spring&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I&#039;ve had a few personal forays into Java web programming-land in the past (namely Velocity-Struts-Hibernate, and WebObjects). WebObjects I gave up because of the uncertain future and the lagging standards compliance. (I haven&#039;t tried WO 5.3 yet though.) Velocity-Struts-Hibernate was just a pain to set up. Plus I didn&#039;t like the fact that I had to edit a number of XML files just to add a new action/form...&lt;br /&gt;
&lt;br /&gt;
But apparently, I&#039;m a glutton for punishment because I just recently assembled a skeleton web application consisting of Hibernate (for the persistence layer), Spring (for management of the business layer), Struts (form validator and controller), and Velocity (template engine). Now, either I&#039;ve become tolerant of editing lots of silly XML files (Spring adds at least one more file to edit), or Spring actually makes it easier to integrate everything.&lt;br /&gt;
&lt;br /&gt;
I&#039;m thinking it&#039;s a combination of both... and the fact that I just &lt;em&gt;love&lt;/em&gt; Eclipse (which I was introduced to at work). It just makes editing Java so easy. After trying out the refactor feature, I don&#039;t think I can go back to using &quot;just&quot; emacs.&lt;br /&gt;
&lt;br /&gt;
Anyhow, I recently deployed &lt;a href=&quot;http://tp.its.yale.edu/tiki/tiki-index.php?page=CentralAuthenticationService&quot;&gt;CAS&lt;/a&gt; as my single sign-on service on kalahari. It currently uses the blog.flup.org user database to authenticate against. (And the development version of blog.flup.org has already been modified to use CAS.) But, as long as I keep the momentum, the first Velocity-Struts-Spring-Hibernate application I deploy will be an account manager. (Providing registration, password changing, &amp;amp; password reset services.)&lt;br /&gt;
&lt;br /&gt;
Hopefully with an SSO service in place, I can deploy more services that I developed but never finished a long time ago. &lt;img src=&quot;http://www.saddi.com/software/news/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; Poor kalahari. It&#039;s running 3 different &lt;em&gt;types&lt;/em&gt; of application servers, sometimes multiple instances of a particular type... 
    </content:encoded>

    <pubDate>Sun, 28 Aug 2005 19:48:30 -0700</pubDate>
    <guid isPermaLink="false">http://www.saddi.com/software/news/archives/22-guid.html</guid>
    
</item>

</channel>
</rss>