<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
    <title>Forum One Tech Blog</title>
    <link>http://tech.forumone.com/</link>
    <description>Insight on Technology Trends from Forum One</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.0.3 - http://www.s9y.org/</generator>
    <pubDate>Tue, 18 Nov 2008 12:15:28 GMT</pubDate>

    <image>
        <url>http://tech.forumone.com/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Forum One Tech Blog - Insight on Technology Trends from Forum One</title>
        <link>http://tech.forumone.com/</link>
        <width>100</width>
        <height>21</height>
    </image>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ForumOneTechBlog" type="application/rss+xml" /><item>
    <title>Where is my server?</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/457206611/146-Where-is-my-server.html</link>
            <category>Hosting</category>
    
    <comments>http://tech.forumone.com/archives/146-Where-is-my-server.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=146</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=146</wfw:commentRss>
    

    <author>nospam@example.com (Jo Ryden)</author>
    <content:encoded><![CDATA[
    Data centers and the physical location of web sites tend to be a black hole for a lot of people. Have you ever wondered where the server your web site runs off is actually hosted and what it might look like? Forum One partners with <a href="http://www.rackspace.com/" >Rackspace</a> for our clients' hosting needs, which lets us leverage <a href="http://www.rackspace.com/whyrackspace/network/datacenters.php" >a world class hosting infrastructure</a>. Rackspace has data centers in VA, TX, The UK and Hong Kong, all of which feature impressive physical security, highly sophisticated power and network configurations, and skilled teams of network technicians.<br />
<br />
The other day I came across an <a href="http://royal.pingdom.com/2008/11/14/the-worlds-most-super-designed-data-center-fit-for-a-james-bond-villain/" >article</a> about a new data center, built and operated by one of Sweden's largest internet providers in an old bomb shelter 100 ft below the surface of Stockholm city. As impressive as the Rackspace data centers may be, I'm guessing they might turn a slight shade of green with envy when they see these luxury server (and network technician) accommodations.<br />
<br />
<img src="http://farm4.static.flickr.com/3214/3028705951_b330207194_o.jpg" width="450" height="300" alt="" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<blockquote>This underground data center has greenhouses, waterfalls, German submarine engines, simulated daylight and can withstand a hit from a hydrogen bomb. It looks like the secret HQ of a James Bond villain.</blockquote> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/457206611" height="1" width="1"/>]]></content:encoded>

    <pubDate>Tue, 18 Nov 2008 09:06:00 -0500</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/146-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/146-Where-is-my-server.html</feedburner:origLink></item>
<item>
    <title>Did you know Internet Explorer 6 limits how many stylesheets are loaded?</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/442496136/144-Did-you-know-Internet-Explorer-6-limits-how-many-stylesheets-are-loaded.html</link>
            <category>Drupal</category>
    
    <comments>http://tech.forumone.com/archives/144-Did-you-know-Internet-Explorer-6-limits-how-many-stylesheets-are-loaded.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=144</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=144</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>I ran into this particularly pesky limitation on a recent project and, as in all IE6 related matters, became intensely irritated and angry.  It turns out, that for both IE6 and IE7, only the first 30 &lt;style&gt;&lt/style&gt; and &lt; link type=&quot;text/css&quot; ... /&gt; are parsed.  On Drupal, you can easily reach this limit between the core style sheets, module contributed style sheets, and your own theme's stylesheet.  There are proposed patches, and a lively debate about supporting IE6 at all in the drupal issues tracker <a href="http://drupal.org/node/228818">IE: Stylesheets ignored after 30 link/style tags</a>.  Mind you, this is simply a limit on the number of tags - you can load many files within each tag.</p>
<blockquote>You'll forgive me for not being in favor of making our code lower quality to cater to a dying browser that has already resulted in the waste of hundreds of thousands of hours. If you use @import, you cannot effectively Save-As a page because the imported stylesheets don't come with it. Frankly I've yet to hit the 30 stylesheet mark myself so I've not encountered this problem.</blockquote>
<p>If, like me, you are forced to work in the real world and not some idyllic fantasy land where you get a completely standards compliant browser AND a pony, you can adapt my solution below.  This solution is ideal if you do not want to, or cannot, patch or hack away at Drupal's core.</p>
<p>In your theme, instead of using drupal_get_styles(), we'll use our own function.  Find where the styles markup is defined or echo'd to the browser and replace it with a call to a new function:</p>
<style type="text/css"><!--
.syntax0 {
color: #000000;
}
.syntax1 {
color: #009966;
font-style: italic;
}
.syntax2 {
color: #999999;
font-style: italic;
}
.syntax3 {
color: #6600cc;
}
.syntax4 {
color: #cc6600;
}
.syntax5 {
color: #ff0000;
}
.syntax6 {
color: #9966ff;
}
.syntax7 {
background: #ffffcc;
color: #ff0066;
}
.syntax8 {
color: #006699;
font-weight: bold;
}
.syntax9 {
color: #cc0033;
}
.syntax10 {
color: #0099ff;
font-weight: bold;
}
.syntax11 {
color: #0099ff;
}
.syntax12 {
color: #02b902;
}
.syntax13 {
color: #ff00cc;
}
.syntax14 {
color: #cc00cc;
}
.syntax15 {
color: #9900cc;
}
.syntax16 {
color: #6600cc;
}
.syntax17 {
color: #0000ff;
}
.syntax18 {
color: #000000;
}
.gutter {
background: #dbdbdb;
color: #000000;
}
.gutterH {
background: #dbdbdb;
color: #3399ff;
}
--></style>
<pre>
<span class="gutter">   1:</span><span class="syntax10">$styles</span> <span class="syntax18">=</span> <span class="syntax6">my_group_css</span><span class="syntax18">(</span><span class="syntax18">)</span><span class="syntax18">;</span>
</span></pre>
<p>Before that function is called, you'll need to define it with the following php code:</p>
<pre><span class="syntax0"><span class="gutter">   1:</span><span class="syntax17">&lt;?php</span>
<span class="gutter">   2:</span><span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">Max</span><span class="syntax2"> </span><span class="syntax2">limit</span><span class="syntax2"> </span><span class="syntax2">of</span><span class="syntax2"> </span><span class="syntax2">stylesheets</span><span class="syntax2"> </span><span class="syntax2">in</span><span class="syntax2"> </span><span class="syntax2">IE</span><span class="syntax2"> </span><span class="syntax2">bug:</span><span class="syntax2"> </span><span class="syntax2">see</span><span class="syntax2"> </span><span class="syntax2">http://drupal.org/node/228818</span>
<span class="gutter">   3:</span><span class="syntax8">function</span><span class="syntax8"> </span><span class="syntax6">my_group_css</span><span class="syntax18">(</span><span class="syntax18">)</span>
<span class="gutter">   4:</span><span class="syntax18">{</span>
<span class="gutterH">   5:</span>    <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">despite</span><span class="syntax2"> </span><span class="syntax2">the</span><span class="syntax2"> </span><span class="syntax2">name,</span><span class="syntax2"> </span><span class="syntax2">this</span><span class="syntax2"> </span><span class="syntax2">returns</span><span class="syntax2"> </span><span class="syntax2">an</span><span class="syntax2"> </span><span class="syntax2">array</span><span class="syntax2"> </span><span class="syntax2">of</span><span class="syntax2"> </span><span class="syntax2">all</span><span class="syntax2"> </span><span class="syntax2">stylesheets</span>
<span class="gutter">   6:</span>    <span class="syntax10">$styles</span> <span class="syntax18">=</span> <span class="syntax6">drupal_add_css</span><span class="syntax18">(</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">   7:</span>    <span class="syntax10">$output</span> <span class="syntax18">=</span> <span class="syntax13">'</span><span class="syntax13">'</span><span class="syntax18">;</span>
<span class="gutter">   8:</span>    <span class="syntax8">foreach</span><span class="syntax18"> (</span><span class="syntax10">$styles</span> <span class="syntax8">as</span> <span class="syntax10">$media</span> <span class="syntax18">=</span><span class="syntax18">&gt;</span> <span class="syntax10">$css</span><span class="syntax18">)</span>
<span class="gutter">   9:</span>    <span class="syntax18">{</span>
<span class="gutterH">  10:</span>        <span class="syntax10">$css</span> <span class="syntax18">=</span> <span class="syntax9">array_merge</span><span class="syntax18">(</span><span class="syntax10">$css</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">module</span><span class="syntax13">'</span><span class="syntax18">]</span><span class="syntax18">,</span> <span class="syntax10">$css</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">theme</span><span class="syntax13">'</span><span class="syntax18">]</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  11:</span>        <span class="syntax10">$groups</span> <span class="syntax18">=</span> <span class="syntax9">array_chunk</span><span class="syntax18">(</span><span class="syntax9">array_keys</span><span class="syntax18">(</span><span class="syntax10">$css</span><span class="syntax18">)</span><span class="syntax18">,</span> <span class="syntax5">30</span><span class="syntax18">,</span> <span class="syntax8">true</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  12:</span>
<span class="gutter">  13:</span>        <span class="syntax8">foreach</span><span class="syntax18"> (</span><span class="syntax10">$groups</span> <span class="syntax8">as</span> <span class="syntax10">$grp</span><span class="syntax18">)</span>
<span class="gutter">  14:</span>        <span class="syntax18">{</span>
<span class="gutterH">  15:</span>            <span class="syntax10">$output</span> <span class="syntax18">.</span><span class="syntax18">=</span> <span class="syntax13">'</span><span class="syntax13">&lt;style</span><span class="syntax13"> </span><span class="syntax13">type=&quot;text/css&quot;</span><span class="syntax13"> </span><span class="syntax13">media=&quot;</span><span class="syntax13">'</span> <span class="syntax18">.</span> <span class="syntax10">$media</span> <span class="syntax18">.</span> <span class="syntax13">'</span><span class="syntax13">&quot;&gt;</span><span class="syntax13">'</span><span class="syntax18">;</span>
<span class="gutter">  16:</span>            <span class="syntax8">foreach</span><span class="syntax18"> (</span><span class="syntax10">$grp</span> <span class="syntax8">as</span> <span class="syntax10">$url</span><span class="syntax18">)</span>
<span class="gutter">  17:</span>            <span class="syntax18">{</span>
<span class="gutter">  18:</span>                <span class="syntax10">$output</span> <span class="syntax18">.</span><span class="syntax18">=</span> <span class="syntax13">'</span><span class="syntax13">@import</span><span class="syntax13"> </span><span class="syntax13">&quot;</span><span class="syntax13">'</span> <span class="syntax18">.</span> <span class="syntax6">base_path</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">.</span> <span class="syntax10">$url</span> <span class="syntax18">.</span> <span class="syntax13">'</span><span class="syntax13">&quot;;</span><span class="syntax13">'</span> <span class="syntax18">.</span> <span class="syntax14">&quot;</span><span class="syntax14">\n</span><span class="syntax14">&quot;</span><span class="syntax18">;</span>
<span class="gutter">  19:</span>            <span class="syntax18">}</span>
<span class="gutterH">  20:</span>            <span class="syntax10">$output</span> <span class="syntax18">.</span><span class="syntax18">=</span> <span class="syntax13">'</span><span class="syntax13">&lt;/style&gt;</span><span class="syntax13">'</span><span class="syntax18">;</span>
<span class="gutter">  21:</span>        <span class="syntax18">}</span>
<span class="gutter">  22:</span>    <span class="syntax18">}</span>
<span class="gutter">  23:</span>
<span class="gutter">  24:</span>    <span class="syntax8">return</span> <span class="syntax10">$output</span><span class="syntax18">;</span>
<span class="gutterH">  25:</span><span class="syntax18">}</span>
<span class="gutter">  26:</span>
<span class="gutter">  27:</span>
</span></pre> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/442496136" height="1" width="1"/>]]></content:encoded>

    <pubDate>Tue, 04 Nov 2008 14:57:54 -0500</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/144-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/144-Did-you-know-Internet-Explorer-6-limits-how-many-stylesheets-are-loaded.html</feedburner:origLink></item>
<item>
    <title>Recovering deleted data from ReiserFS 3</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/441220635/143-Recovering-deleted-data-from-ReiserFS-3.html</link>
    
    <comments>http://tech.forumone.com/archives/143-Recovering-deleted-data-from-ReiserFS-3.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=143</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=143</wfw:commentRss>
    

    <author>nospam@example.com (Mike Shade)</author>
    <content:encoded><![CDATA[
    Everyone suffers from clouded judgement from time to time; thankfully, there are tools that exist that may help correct your fat-fingered mistakes.  Suffice to say, I had to delve into this subject recently and I thought I would share my method of recovering some important files from a ReiserFS partition.<br />
<br />
If you or a user have mistakenly deleted or moved files from a filesystem, all is not lost.  Most distributions of Linux that support ReiserFS ship with a couple of tools that can be used to recreate the filesystem if the data is still intact on the device.  I will be discussing <strong>reiserfsck</strong> and a couple of more generic disk tools in this post.<br />
<br />
First and foremost, it is important to <strong>unmount the partition as soon as you have discovered the mistaken deletion</strong>!  Stop using it.  While data is not wiped from the drive in a deletion, unlink, or move operation, the area of the disk which the deleted file occupied is marked as available.  <strong>If you continue working with the filesystem after having deleted the file, chances are very good that the freed space will be used, destroying the file you want to recover</strong>!<br />
<br />
The second rule of data recovery is to <strong>always make a backup of the affected partition</strong>.  If for some reason the filesystem check makes matters worse, you can revert to the previous state.  This is important, but sometimes difficult if working with large disks or partitions.  Trust me, you will want to make sure you have that backup.  If <strong>reiserfsck</strong> is unable to correct the problem, you may want to try another approach later.  Having a backup of the partition is paramount in this situation.<br />
<br />
Let's begin with that disk image.  The <strong>dd</strong> utility can be used to make a backup of a partition or a whole disk.  Remember to specify block size when you make your copy, or you will be waiting a long time for it to complete.  This example assumes your affected partition is <em>/dev/sde1</em> and you have enough space in <em>/data</em> to hold the image.  You must unmount the partition if you have not already before continuing.<br />
<br />
<code><br />
# dd if=/dev/sde1 of=/data/sde1-backup.img bs=16M<br />
</code><br />
<br />
Now that we have a bit-for-bit backup available of the damaged ReiserFS partition, we can begin working.<br />
<br />
This method employs the <strong>reiserfsck</strong> utility to scan the entire partition and rebuild the filesystem tree from data that is encountered.  This is a big, sweeping rewrite of the partition which will recover as many whole files as possible.  In my particular case, this is what I wanted -- I was after a few complete directories that had been wrongfully deleted.  Depending on how quickly you caught the deletion and began this process, you may or may not recover everything in its normal location.  Files that are recovered but were unable to be renamed correctly will be placed in <strong>lost+found</strong>.  They will be given numeric names which loosely correspond to their locations in the filesystem.  Files that have the same first few numbers were likely in the same directory together.<br />
<br />
This invocation of <strong>reiserfsck</strong> will perform the operation described above:<br />
<br />
<code><br />
# reiserfsck --rebuild-tree -S /dev/sde1<br />
</code><br />
<br />
You will be required to enter 'Yes' at this point to continue.  Since we have made a backup of the partition using <strong>dd</strong> previously, there is no need to worry about what will happen here.  Should something go wrong, we still have the original image of the filesystem to revert to if needed.<br />
<br />
Depending on the size of your partition, this operation may take a long time.  When it returns, <strong>reiserfsck</strong> will output a summary of what was done -- how many files, directories, links, etc were recovered will be listed.<br />
<br />
Now, hold your breath, mount the partition, and take a look around.  If you are lucky, your files will be accessible in their original locations.  If not, you will need to dig through <strong>lost+found</strong> and try to identify the numerically named files that were recovered.  The <strong>file</strong> utility can make this a bit simpler to quickly identify files without having to open them individually.<br />
<br />
Be careful, and good luck!   
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/441220635" height="1" width="1"/>]]></content:encoded>

    <pubDate>Mon, 03 Nov 2008 12:34:50 -0500</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/143-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/143-Recovering-deleted-data-from-ReiserFS-3.html</feedburner:origLink></item>
<item>
    <title>Rackspace acquires VPS provider</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/432028374/142-Rackspace-acquires-VPS-provider.html</link>
            <category>Hosting</category>
    
    <comments>http://tech.forumone.com/archives/142-Rackspace-acquires-VPS-provider.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=142</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=142</wfw:commentRss>
    

    <author>nospam@example.com (Jo Ryden)</author>
    <content:encoded><![CDATA[
    <a href="http://www.rackspace.com/information/mediacenter/release.php?id=8385" >Rackspace announced</a> just this week that they have acquired VPS (Virtual Private Server) provider <a href="http://www.slicehost.com/" >Slicehost</a>.<br />
<br />
<blockquote>Our new offerings are part of a strategy to bring cloud benefits to all businesses with simple, cost-effective products that everyone can use, backed by the best customer support that only Rackspace can deliver</blockquote><br />
<br />
The news follows the success of <a href="http://aws.amazon.com/" >Amazon Web Services</a>, also just announcing its service has left the beta phase and entered General Availability. While Amazon Web Services has been loosely targeting the developer market and has been considered a "geek(y)" service, the Rackspace offering has its aim set more clearly at a production level service for the business market, the offering being backed by the characteristic promise of fanatical support and more tailor-made packaging, encompassing backup solutions and other relevant services.<br />
<br />
The nitty-gritty details of the Rackspace offering are yet to be unveiled, and while it looks to be exciting, the Rackspace equivalent of Amazon's S3 storage service will be relying on Mosso, the Rackspace "computing and storage cloud" division, which has had its fair share of <a href="http://www.hostingcoupons.org/web-hosting-mosso-analysis-not-ready-for-prime-time/" >start-up and growing pains</a>. That might give some room for pause initially but I think in the long run this is a way for non-profits and other organizations, struggling with the financial challenges of building and maintaining a complex and solid tech infrastructure, to get in on some of the fun. Virtual Private Servers and cloud computing bring to the table significantly lower investment requirements and the flexibility to create and maintain infrastructure solutions which would normally incur a significant dent in any non-fortune 500 company's tech budget. 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/432028374" height="1" width="1"/>]]></content:encoded>

    <pubDate>Sat, 25 Oct 2008 15:38:26 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/142-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/142-Rackspace-acquires-VPS-provider.html</feedburner:origLink></item>
<item>
    <title>Controlling pane visibility in Drupal Panels2</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/427704543/140-Controlling-pane-visibility-in-Drupal-Panels2.html</link>
    
    <comments>http://tech.forumone.com/archives/140-Controlling-pane-visibility-in-Drupal-Panels2.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=140</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=140</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>We're working on a social networking site, and one requirement is that only a user's buddies can see certain profile information by default.  The site uses <a href="http://drupal.org/project/buddylist">buddylist</a> and I'd installed <a href="http://drupal.org/project/private_nodes">Private nodes</a> to allow users to designate who can see nodes they contribute.  But for their profile, limiting visibility to a user's buddies was a final requirement.  We spent a good bit of time this morning reading the <a href="http://groups.drupal.org/node/7678">Panels2 API</a> to figure out if we could programatically control the visibility of panes within a mini-panel or panel page.  By using Panels' hook_panels_pane_content_alter() hook, we were able to implement this easily.</p>
<p>We already had a module to customize the site, and we added the hook and a helper function to it.  First we needed a way to test if the logged in user was the buddy of the profile being viewed.</p>
<style type="text/css"><!--
.syntax0 {
color: #000000;
}
.syntax1 {
color: #009966;
font-style: italic;
}
.syntax2 {
color: #999999;
font-style: italic;
}
.syntax3 {
color: #6600cc;
}
.syntax4 {
color: #cc6600;
}
.syntax5 {
color: #ff0000;
}
.syntax6 {
color: #9966ff;
}
.syntax7 {
background: #ffffcc;
color: #ff0066;
}
.syntax8 {
color: #006699;
font-weight: bold;
}
.syntax9 {
color: #cc0033;
}
.syntax10 {
color: #0099ff;
font-weight: bold;
}
.syntax11 {
color: #0099ff;
}
.syntax12 {
color: #02b902;
}
.syntax13 {
color: #ff00cc;
}
.syntax14 {
color: #cc00cc;
}
.syntax15 {
color: #9900cc;
}
.syntax16 {
color: #6600cc;
}
.syntax17 {
color: #0000ff;
}
.syntax18 {
color: #000000;
}
.gutter {
background: #dbdbdb;
color: #000000;
}
.gutterH {
background: #dbdbdb;
color: #3399ff;
}
--></style>
<pre><span class="syntax0"><span class="gutter">   1:</span><span class="syntax17">&lt;?php</span>
<span class="gutter">   2:</span><span class="syntax3">/**</span>
<span class="gutter">   3:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax3">Tests</span><span class="syntax3"> </span><span class="syntax3">is</span><span class="syntax3"> </span><span class="syntax3">the</span><span class="syntax3"> </span><span class="syntax3">logged</span><span class="syntax3"> </span><span class="syntax3">in</span><span class="syntax3"> </span><span class="syntax3">user</span><span class="syntax3"> </span><span class="syntax3">is</span><span class="syntax3"> </span><span class="syntax3">a</span><span class="syntax3"> </span><span class="syntax3">buddy</span><span class="syntax3"> </span><span class="syntax3">of</span><span class="syntax3"> </span><span class="syntax3">the</span><span class="syntax3"> </span><span class="syntax3">specified</span><span class="syntax3"> </span><span class="syntax3">uid</span>
<span class="gutter">   4:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax12">@param</span><span class="syntax3"> </span><span class="syntax18">integer</span><span class="syntax3"> </span><span class="syntax3">user</span><span class="syntax3"> </span><span class="syntax3">id</span>
<span class="gutterH">   5:</span><span class="syntax3"> </span><span class="syntax3">*/</span>
<span class="gutter">   6:</span><span class="syntax8">function</span><span class="syntax8"> </span><span class="syntax6">user_is_buddy</span><span class="syntax18">(</span><span class="syntax10">$uid</span><span class="syntax18">)</span>
<span class="gutter">   7:</span><span class="syntax18">{</span>
<span class="gutter">   8:</span>    <span class="syntax8">static</span> <span class="syntax10">$is_buddy</span><span class="syntax18">;</span>
<span class="gutter">   9:</span>    <span class="syntax8">static</span> <span class="syntax10">$user_buddies</span><span class="syntax18">;</span>
<span class="gutterH">  10:</span>    <span class="syntax8">global</span> <span class="syntax10">$user</span><span class="syntax18">;</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">logged</span><span class="syntax2"> </span><span class="syntax2">in</span><span class="syntax2"> </span><span class="syntax2">user</span>
<span class="gutter">  11:</span>
<span class="gutter">  12:</span>
<span class="gutter">  13:</span>    <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax18">!</span><span class="syntax8">isset</span><span class="syntax18">(</span><span class="syntax10">$is_buddy</span><span class="syntax18">[</span><span class="syntax10">$uid</span><span class="syntax18">]</span><span class="syntax18">)</span><span class="syntax18">)</span>
<span class="gutter">  14:</span>    <span class="syntax18">{</span>
<span class="gutterH">  15:</span>        <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax18">!</span><span class="syntax8">isset</span><span class="syntax18">(</span><span class="syntax10">$user_buddies</span><span class="syntax18">)</span><span class="syntax18">)</span>
<span class="gutter">  16:</span>        <span class="syntax18">{</span>
<span class="gutter">  17:</span>            <span class="syntax10">$user_buddies</span> <span class="syntax18">=</span> <span class="syntax9">array_keys</span><span class="syntax18">(</span><span class="syntax6">buddylist_get_buddies</span><span class="syntax18">(</span><span class="syntax11">$user</span><span class="syntax11">-&gt;uid</span><span class="syntax18">,</span> <span class="syntax13">'</span><span class="syntax13">uid</span><span class="syntax13">'</span><span class="syntax18">)</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  18:</span>        <span class="syntax18">}</span>
<span class="gutter">  19:</span>
<span class="gutterH">  20:</span>        <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">users</span><span class="syntax2"> </span><span class="syntax2">are</span><span class="syntax2"> </span><span class="syntax2">their</span><span class="syntax2"> </span><span class="syntax2">own</span><span class="syntax2"> </span><span class="syntax2">buddies</span>
<span class="gutter">  21:</span>        <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax10">$uid</span> <span class="syntax18">=</span><span class="syntax18">=</span> <span class="syntax11">$user</span><span class="syntax11">-&gt;uid</span><span class="syntax18">)</span>
<span class="gutter">  22:</span>        <span class="syntax18">{</span>
<span class="gutter">  23:</span>            <span class="syntax10">$is_buddy</span><span class="syntax18">[</span><span class="syntax10">$uid</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax8">true</span><span class="syntax18">;</span>
<span class="gutter">  24:</span>        <span class="syntax18">}</span>
<span class="gutterH">  25:</span>        <span class="syntax8">else</span> <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax18">!</span><span class="syntax8">empty</span><span class="syntax18">(</span><span class="syntax10">$uid</span><span class="syntax18">)</span><span class="syntax18">)</span>
<span class="gutter">  26:</span>        <span class="syntax18">{</span>
<span class="gutter">  27:</span>            <span class="syntax10">$is_buddy</span><span class="syntax18">[</span><span class="syntax10">$uid</span><span class="syntax18">]</span><span class="syntax18">=</span> <span class="syntax9">in_array</span><span class="syntax18">(</span><span class="syntax10">$uid</span><span class="syntax18">,</span> <span class="syntax10">$user_buddies</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  28:</span>        <span class="syntax18">}</span>
<span class="gutter">  29:</span>        <span class="syntax8">else</span>
<span class="gutterH">  30:</span>        <span class="syntax18">{</span>
<span class="gutter">  31:</span>            <span class="syntax10">$is_buddy</span><span class="syntax18">[</span><span class="syntax10">$uid</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax8">false</span><span class="syntax18">;</span>
<span class="gutter">  32:</span>        <span class="syntax18">}</span>
<span class="gutter">  33:</span>    <span class="syntax18">}</span>
<span class="gutter">  34:</span>
<span class="gutterH">  35:</span>    <span class="syntax8">return</span> <span class="syntax10">$is_buddy</span><span class="syntax18">[</span><span class="syntax10">$uid</span><span class="syntax18">]</span><span class="syntax18">;</span>
<span class="gutter">  36:</span><span class="syntax18">}</span>
<span class="gutter">  37:</span>
<span class="gutter">  38:</span>
</span></pre>
<p>In our implementation of the alter content hook, we simply remove the content we do not want to display if our is_buddy test fails by setting it to null.  If content is empty, then the pane does not display at all.  For most panes, the delta attribute should be sufficient to identify it, but some panes, like node fields and node field groups, have different deltas per user, so we had to rely on the subject property instead.</p>
<pre><span class="syntax0"><span class="gutter">   1:</span><span class="syntax17">&lt;?php</span>
<span class="gutter">   2:</span><span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">implementation</span><span class="syntax2"> </span><span class="syntax2">of</span><span class="syntax2"> </span><span class="syntax2">hook_panels_pane_content_alter</span>
<span class="gutter">   3:</span><span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">http://groups.drupal.org/node/7678</span>
<span class="gutter">   4:</span><span class="syntax8">function</span><span class="syntax8"> </span><span class="syntax6">my_module_panels_pane_content_alter</span><span class="syntax18">(</span><span class="syntax10">$content</span><span class="syntax18">,</span><span class="syntax11"> </span><span class="syntax10">$pane</span><span class="syntax18">,</span><span class="syntax11"> </span><span class="syntax10">$args</span><span class="syntax18">,</span><span class="syntax11"> </span><span class="syntax10">$context</span><span class="syntax18">)</span>
<span class="gutterH">   5:</span><span class="syntax18">{</span>
<span class="gutter">   6:</span>    <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">user</span><span class="syntax2"> </span><span class="syntax2">profile</span><span class="syntax2"> </span><span class="syntax2">customizations</span>
<span class="gutter">   7:</span>    <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax13">'</span><span class="syntax13">user</span><span class="syntax13">'</span> <span class="syntax18">=</span><span class="syntax18">=</span> <span class="syntax6">arg</span><span class="syntax18">(</span><span class="syntax5">0</span><span class="syntax18">)</span> <span class="syntax18">&amp;</span><span class="syntax18">&amp;</span> <span class="syntax10">$profile_uid</span> <span class="syntax18">=</span><span class="syntax18"> (</span>int<span class="syntax18">)</span> <span class="syntax6">arg</span><span class="syntax18">(</span><span class="syntax5">1</span><span class="syntax18">)</span><span class="syntax18">)</span>
<span class="gutter">   8:</span>    <span class="syntax18">{</span>
<span class="gutter">   9:</span>        <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">don't</span><span class="syntax2"> </span><span class="syntax2">display</span><span class="syntax2"> </span><span class="syntax2">profile</span><span class="syntax2"> </span><span class="syntax2">about</span><span class="syntax2"> </span><span class="syntax2">stuff</span><span class="syntax2"> </span><span class="syntax2">to</span><span class="syntax2"> </span><span class="syntax2">non</span><span class="syntax2"> </span><span class="syntax2">buddies,</span><span class="syntax2"> </span><span class="syntax2">EVER</span>
<span class="gutterH">  10:</span>        <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">delta</span><span class="syntax2"> </span><span class="syntax2">is</span><span class="syntax2"> </span><span class="syntax2">diff</span><span class="syntax2"> </span><span class="syntax2">for</span><span class="syntax2"> </span><span class="syntax2">every</span><span class="syntax2"> </span><span class="syntax2">user</span>
<span class="gutter">  11:</span>        <span class="syntax10">$is_buddy</span> <span class="syntax18">=</span> <span class="syntax6">user_is_buddy</span><span class="syntax18">(</span><span class="syntax10">$profile_uid</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  12:</span>        <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax13">'</span><span class="syntax13">About</span><span class="syntax13"> </span><span class="syntax13">You</span><span class="syntax13">'</span> <span class="syntax18">=</span><span class="syntax18">=</span> <span class="syntax11">$content</span><span class="syntax11">-&gt;subject</span> <span class="syntax18">&amp;</span><span class="syntax18">&amp;</span> <span class="syntax8">false</span> <span class="syntax18">=</span><span class="syntax18">=</span> <span class="syntax10">$is_buddy</span><span class="syntax18">)</span>
<span class="gutter">  13:</span>        <span class="syntax18">{</span>
<span class="gutter">  14:</span>            <span class="syntax11">$content</span><span class="syntax11">-&gt;content</span> <span class="syntax18">=</span> <span class="syntax8">null</span><span class="syntax18">;</span>
<span class="gutterH">  15:</span>        <span class="syntax18">}</span>
<span class="gutter">  16:</span>
<span class="gutter">  17:</span>        <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">don't</span><span class="syntax2"> </span><span class="syntax2">display</span><span class="syntax2"> </span><span class="syntax2">blog</span><span class="syntax2"> </span><span class="syntax2">posts</span><span class="syntax2"> </span><span class="syntax2">to</span><span class="syntax2"> </span><span class="syntax2">non-buddies</span>
<span class="gutter">  18:</span>        <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax13">'</span><span class="syntax13">blogs_user_id</span><span class="syntax13">'</span><span class="syntax18">=</span><span class="syntax18">=</span> <span class="syntax11">$content</span><span class="syntax11">-&gt;delta</span> <span class="syntax18">&amp;</span><span class="syntax18">&amp;</span> <span class="syntax8">false</span> <span class="syntax18">=</span><span class="syntax18">=</span> <span class="syntax10">$is_buddy</span><span class="syntax18">)</span>
<span class="gutter">  19:</span>        <span class="syntax18">{</span>
<span class="gutterH">  20:</span>            <span class="syntax11">$content</span><span class="syntax11">-&gt;content</span> <span class="syntax18">=</span> <span class="syntax13">'</span><span class="syntax13">'</span><span class="syntax18">;</span>
<span class="gutter">  21:</span>        <span class="syntax18">}</span>
<span class="gutter">  22:</span>    <span class="syntax18">}</span>
<span class="gutter">  23:</span>
<span class="gutter">  24:</span>    <span class="syntax8">return</span> <span class="syntax10">$content</span><span class="syntax18">;</span>
<span class="gutterH">  25:</span><span class="syntax18">}</span>
</span></pre>
 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/427704543" height="1" width="1"/>]]></content:encoded>

    <pubDate>Tue, 21 Oct 2008 13:30:45 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/140-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/140-Controlling-pane-visibility-in-Drupal-Panels2.html</feedburner:origLink></item>
<item>
    <title>Using Javascript to Fix What CSS Can't</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/419617533/139-Using-Javascript-to-Fix-What-CSS-Cant.html</link>
    
    <comments>http://tech.forumone.com/archives/139-Using-Javascript-to-Fix-What-CSS-Cant.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=139</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=139</wfw:commentRss>
    

    <author>nospam@example.com (Matt Gibbs)</author>
    <content:encoded><![CDATA[
    As I hinted to in a <a href="http://tech.forumone.com/archives/56-Web-Developer-Design-Considerations.html"  title="Web Developer Design Considerations">previous post</a>, the roles of developers and designers are becoming more and more indistinguishable. Modern layouts can involve more time spent on scripting (PHP, Javascript) than on actual design (HTML, CSS, Photoshop). Take <a href="http://www.newsvine.com/"  title="Newsvine">Newsvine</a> for example. It's filled with drag-n-drop panels, auto-refreshing of content, and persistent panel states (minimize/maximize/remove). Evidently, scripting can also cover some gray areas that CSS can't yet solve on its own.<br />
<br />
Some of the more interesting uses of Javascript from the following blog post include:<br />
<br />
1. <strong>enabling PNG transparency in IE6</strong><br />
2. <strong>loading images only when their position is visible to the browser</strong> (Lazy Loading)<br />
3. <strong>aligning elements consistently throughout browsers</strong><br />
4. <strong>increasing the size of click targets</strong><br />
5. <strong>setting equal column heights for div elements</strong> (thus imitating a table-based layout)<br />
<br />
<a href="http://www.noupe.com/css/using-javascript-to-fix-12-common-browser-headaches.html"  title="Noupe.com">Using Javascript to Fix 12 Common Browser Headaches</a> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/419617533" height="1" width="1"/>]]></content:encoded>

    <pubDate>Mon, 13 Oct 2008 11:24:00 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/139-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/139-Using-Javascript-to-Fix-What-CSS-Cant.html</feedburner:origLink></item>
<item>
    <title>Yahoo provides an alternative to Google Analytics</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/416911293/138-Yahoo-provides-an-alternative-to-Google-Analytics.html</link>
            <category>Tools</category>
    
    <comments>http://tech.forumone.com/archives/138-Yahoo-provides-an-alternative-to-Google-Analytics.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=138</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=138</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>Although it is still in beta and not available to the general public, Yahoo! will be rolling out its own web analytics service in the near future.  The service addresses some perceived shortcomings of Google's Analytics package.  First, Yahoo! will provide data in near-real time, which can be a boon for stats junkies and, more practically, for monitoring campaign, outreach traffic closely.  For developers, they promise to offer an API for retrieving data.  The latter will be very useful, particularly for creating custom dashboards and reports that compare traffic across multiple web properties.</p>
<p><a href="http://arstechnica.com/news.ars/post/20081009-yahoo-web-analytics-to-finally-give-google-some-competition.html">Yahoo Web Analytics to finally give Google some competition</a></p>
<blockquote>In addition to faster data, Yahoo will also provide all analytics data in raw form, instead of a periodic aggregation of things like total visitors to a page. This access to data becomes quite significant with Yahoo's promise of a forthcoming API, another feature that Google Analytics doesn't match—at least not yet.</blockquote>
<p>I'd written earlier about other <a href="http://tech.forumone.com/archives/130-4-Tools-for-measuring-your-website.html">tools for measuring your website</a>.</p> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/416911293" height="1" width="1"/>]]></content:encoded>

    <pubDate>Fri, 10 Oct 2008 11:55:32 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/138-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/138-Yahoo-provides-an-alternative-to-Google-Analytics.html</feedburner:origLink></item>
<item>
    <title>A thorough look at defining 'CMS'</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/395533657/136-A-thorough-look-at-defining-CMS.html</link>
            <category>Content Management</category>
    
    <comments>http://tech.forumone.com/archives/136-A-thorough-look-at-defining-CMS.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=136</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=136</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>I really have little to add except to highly, strongly, urgently recommend that you read Deane at Gadgetopia's in-depth look at what makes a Content Management System.  From versioning, to workflow, to creating pages, its all in there.  Its a great resource for coming to a common understanding on a project about what everyone is thinking when they hear "CMS".  Hopefully to avoid conversations that end in, "Oh, you wanted <em>Versioning</em>, well its too late now..."</p>
<p><a href="http://gadgetopia.com/post/5940">What Makes a Content Management System?</a></p><br /><blockquote>If we look at content management functionality as a continuum, there’s a graduated scale between the two. On the one side, you have something simple — an “articles” table with a couple of password-protected pages to update it. On the other side, you have a commercial CMS that you paid $50K for with all the bells and whistles. Specifically, how are the two different?</blockquote> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/395533657" height="1" width="1"/>]]></content:encoded>

    <pubDate>Wed, 17 Sep 2008 16:20:00 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/136-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/136-A-thorough-look-at-defining-CMS.html</feedburner:origLink></item>
<item>
    <title>JQuery: Multi-select Box Alternative</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/390691714/135-JQuery-Multi-select-Box-Alternative.html</link>
            <category>PHP</category>
    
    <comments>http://tech.forumone.com/archives/135-JQuery-Multi-select-Box-Alternative.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=135</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=135</wfw:commentRss>
    

    <author>nospam@example.com (Matt Gibbs)</author>
    <content:encoded><![CDATA[
    All of us have seen HTML multi-select lists. Clicking on an item without holding down the CTRL key will unselect all other elements in the list. That can get pretty annoying, especially with long lists. Thanks to jQuery and a clever use of DIV elements, we can work around this problem. The <strong>first example</strong> shows a standard multi-select list, and the <strong>second example</strong> uses the DIV method (<a href="http://tech.forumone.com/code_examples/multi_picker/index.php"  title="View the source">view the source</a>). Some jQuery key events can also be added to imitate SHIFT+click.<br />
<br />
<iframe src="http://tech.forumone.com/code_examples/multi_picker/index.php" style="width:100%; height: 300px; border:0"></iframe><br />
<br />
<strong>HTML code:</strong><br />
<pre style="line-height:1.0; padding:10px; background:#F1F6FB; border:1px dashed #CCC;">&lt;div class="select v2"><br />
  &lt;div class="option" value="bird">Bird&lt;/div><br />
  &lt;div class="option" value="plane">Plane&lt;/div><br />
  &lt;div class="option" value="superman">Superman&lt;/div><br />
  &lt;div class="option" value="long">Some really really long title that far exceeds the box width&lt;/div><br />
&lt;/div></pre><br />
<strong>Javascript code:</strong><br />
<pre style="line-height:1.0; padding:10px; background:#F1F6FB; border:1px dashed #CCC;">$(function() {<br />
    $(".v2 .option").click(function() {<br />
        $(this).toggleClass("active");<br />
        $(".v2 .active").each(function() {<br />
            // Show the value of each selected element<br />
            var pickval = $(this).attr("value");<br />
            alert(pickval);<br />
        });<br />
    });<br />
});</pre><br />
<br />
Add some CSS, like <strong>.active { background: blue; }</strong>, and you're ready to roll! 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/390691714" height="1" width="1"/>]]></content:encoded>

    <pubDate>Fri, 12 Sep 2008 09:25:22 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/135-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/135-JQuery-Multi-select-Box-Alternative.html</feedburner:origLink></item>
<item>
    <title>CAPTCHA breaking is a profitable enterprise</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/382399505/133-CAPTCHA-breaking-is-a-profitable-enterprise.html</link>
            <category>Tools</category>
    
    <comments>http://tech.forumone.com/archives/133-CAPTCHA-breaking-is-a-profitable-enterprise.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=133</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=133</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>CAPTCHA breaking, or "solving", has been turned into a lucrative industry in Inida, as Ars Technica reports. <a href="http://arstechnica.com/news.ars/post/20080901-captchas-flummox-bots-but-may-be-doomed-by-captcha-farmers.html">CAPTCHAs flummox bots, but may be doomed by CAPTCHA farmers</a>.  CAPTCHA's for some time have been fairly ineffective, and this adds another tool into spammers arsenal for getting past really good ones that are impossible or too time-consuming to break using automated programs.</p>
<blockquote>Dancho Danchev, writing for ZDNet, reports on the emergence of CAPTCHA-breaking as an economic model in India. He reports that it's impossible to untangle the corporate web that's unfurled, given that large CAPTCHA-breaking companies often farm work out to multiple smaller businesses, but all available information suggests that CAPTCHA-cracking (referred to as "solving" in marketing parlance) is a booming sector of the Indian tech economy. Danchev reports that CAPTCHA-crackers can earn more per day than they can as legitimate data processing centers.
</blockquote>
<p>Earlier this year I asked <a href="http://tech.forumone.com/archives/92-Should-you-rely-on-CAPTCHAs-to-stop-malicious-behavior.html">Should you rely on CAPTCHAs to stop malicious behavior?</a></p> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/382399505" height="1" width="1"/>]]></content:encoded>

    <pubDate>Wed, 03 Sep 2008 10:35:00 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/133-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/133-CAPTCHA-breaking-is-a-profitable-enterprise.html</feedburner:origLink></item>
<item>
    <title>How to think seriously about your next content migration</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/376256769/132-How-to-think-seriously-about-your-next-content-migration.html</link>
            <category>Content Management</category>
    
    <comments>http://tech.forumone.com/archives/132-How-to-think-seriously-about-your-next-content-migration.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=132</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=132</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>Migrating content to a new site can be a tedious, thankless task, and oftentimes it does not lend itself easily to automation.  There are tools to parse content and move it from one CMS to another, but this is also an opportunity to look closely at the pages on your website, update, and improve them.  This phase of a project is easy to ignore, or worse, tackle haphazardly.  In the worst case, content migration or content loading can take longer than anyone anticipated, causing you to miss or postpone your launch deadline.  If you're facing a content migration in the near future, Maish Nichani offers a very complete method for <a href="http://www.pebbleroad.com/article/planning_coordinating_content_migrations/">Planning &amp; coordinating content migrations</a></p> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/376256769" height="1" width="1"/>]]></content:encoded>

    <pubDate>Wed, 27 Aug 2008 11:06:00 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/132-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/132-How-to-think-seriously-about-your-next-content-migration.html</feedburner:origLink></item>
<item>
    <title>4 Tools for measuring your website</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/370250342/130-4-Tools-for-measuring-your-website.html</link>
            <category>Tools</category>
    
    <comments>http://tech.forumone.com/archives/130-4-Tools-for-measuring-your-website.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=130</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=130</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>Beth Kanter recently blogged about<a href="http://beth.typepad.com/beths_blog/2008/08/measuring-the-v.html"> measuring the value of your blog</a>. She notes that a single metric doesn't exist that will tell you if your blog is a success or not, and lists six metrics for benchmarking performance.  She also lamented that, depending on your blogging tool of choice, calculating some or all of these metrics maybe difficult or time-consuming.  I'd like to suggest four tools that help you assess website effectiveness quickly.  <br /><br />At a basic level, I think overall site traffic, such as visitors or page views, can be a good metric to keep an eye on to evaluate your site's effectiveness.  As long as traffic is growing, you know you must be doing something right.  You have to be careful with the metrics, as they can be very easy to game and manipulate.  The tools I look at below will help you see if you are writing content that is valuable to your audience and aligned to your site's purpose, and to make sure potential readers can find your site.</p>
<h3>AideRSS</h3>
<p>I discovered AideRSS through Beth's blog as well, and its very handy for identifying valuable content.  If you have a syndication feed available on your site, it can analyze the entries and <a href="http://www.aiderss.com/hits/tech.forumone.com">produce ranked listings</a> that detail, per entry, how many people saved it to delicious, suggested it on digg, or left a comment.  At the top o fthe report, it breaks down posts between good/great/best, and also the top 20.  Ideally, you'd like to have more posts in the great and best categories, these are pieces of content that your audience wants to read.  You can also get some insight into what kind of articles and posts your audience finds valuable, since you can see which posts are being saved, recommended, and discussed.  AideRSS can help you write good content that people want to read.  Although it seems to accept any site that provides a syndication feed, it seems to be geared towards analyzing blog feeds.  Finally, its limited to items that appear in your syndication feed, so you'll want to check your feed in AideRSS regularly.</p>
<h3>SEOmoz Trifecta</h3>
<p>SEOmoz's <a href="http://www.seomoz.org/trifecta">trifecta tool</a>, analyses a site with data from various web services and rolls them up into a score from 0 to 100.  While it claims to measure your blog's "importance and popularity", its really usefuly for seeing how well your site will rank in search pages.  Better search engine rankings move you to the top of search page results, and that it turn leads to more traffic from search engines.  The final score is useful for checking trends over time, but the real value of this tool is in the variety of services it polls for data, including Yahoo Site Explorer Links, Alexa Rank, Technorati Rank, Google Blogsearch Links, among others. It also allows you to compare your score to general website categories, and also provides generic tips for improving your score.  Its not a prescriptive tool, but it can be used to measure the effects of site tweaks, link exchanges, and other marketing efforts.  While its free, users must register and are limited to one report per day.</p>
<h3>Website Grader</h3>
<p><a href="http://www.websitegrader.com/">Website Grader</a> by HubSpot is very similar to SEOMoz trifecta.  Both are good tools, but Website Grader gives more prescriptive advice on improving your site.   For example, if you are missing a Description meta tag, it will notice and recommend that you have one.  It also reports on search engine optimization metrics including Google PageRank, number of pages in Google's index, number of inbound links.  Like Trifecta, this tool is more useful fo rmeasuring the effects of improvement efforts.</p>
<h3>Google Webmaster Tools</h3>
<p>If your site is like most others, the majority of traffic comes from Google.  It's important to keep tabs on how well and how frequently your site is crawled by Google.  Luckily, they provide a tool for <a href="http://www.google.com/webmasters/">webmasters</a>.  Once you've verified ownership of a site, you'll have access to a ton of data about how google sees it.  The first page tells you when Googlebot last crawled your home page, you'll want this to be realtively recently, and verifies that your site is included in Google's index.  From there, you can see if their are any technical problems preventing google from accessing content.  Such problems may include HTTP errors, broken links on your site, and unreachable URLs.  If any number is very large, relative to the number of pages on your blog, you should investigate and try to correct it.  The Content Analysis reports can tell you if you need to pay attention to meta descriptions, missing/duplicate title tags, and other elements which can negatively affect search engine positioning.  I've found the webmaster tools most useful for discovering what external sites link to a site, particularly for interior pages.</p> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/370250342" height="1" width="1"/>]]></content:encoded>

    <pubDate>Wed, 20 Aug 2008 15:41:00 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/130-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/130-4-Tools-for-measuring-your-website.html</feedburner:origLink></item>
<item>
    <title>Mint: The Price of Convenience</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/365877141/128-Mint-The-Price-of-Convenience.html</link>
            <category>Tools</category>
    
    <comments>http://tech.forumone.com/archives/128-Mint-The-Price-of-Convenience.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=128</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=128</wfw:commentRss>
    

    <author>nospam@example.com (Matt Gibbs)</author>
    <content:encoded><![CDATA[
    <strong>Like most people, I'm always looking out for ways to make my life easier.</strong><br />
<br />
<a href="http://mechcad.net/products/acemoney/" title="AceMoney">AceMoney</a> has been a great finance manager over the years, but its usefulness has waned over time. It suffers from one fatal flaw: all transactions must be added manually. It does allow for raw import files (QIF, QFX, etc), but they are manually downloaded after logging into each bank's website. I wanted something to download my balance for me, and after browsing for new personal finance software, I came across <a href="http://www.mint.com/" title="Mint">Mint</a>. It's a "top rated online finance service" that claims to seamlessly aggregate all your bank accounts into a fresh, intuitive interface.<br />
<br />
<strong>Are you freaking kidding me? What jackass would enter his bank information to some free service claiming to be legit?</strong><br />
<br />
After reading the endless security jargon and watching the CEO (Aaron Patzer) give a re-assurance speech, I became that jackass. Giving out any account information online makes me nervous, but the promise of utmost convenience and financial transparency pushed me towards my decision.<br />
<br />
<img src="http://tech.forumone.com/uploads/mint.gif" alt="" /><div style="clear:both"><!--clear--></div><br />
<br />
Since I gave it a try a couple days ago, I admit that I've been pretty impressed. Ajax is being used extensively on the site, but at the same time it's not obnoxious. Like gmail, the search box is smarter than it looks, allowing for criteria filtering (e.g. merchant:XYZ or category:Groceries). Information is editable via a floating DIV element, which is a great alternative to the traditional edit page. The most impressive piece of the site is the Flash/Flex "Trends" area, which dynamically builds a clickable pie chart that filters based on which slice (category) you click. Mint works so well that it includes pending transactions that aren't even on the bank's downloaded QFX file.<br />
<br />
<strong>Wait a second. How are they getting information that only I can see when logged onto the bank's website?</strong><br />
<br />
According to Wikipedia, <a href="http://en.wikipedia.org/wiki/Web_scraping" title="web scraping">web scraping</a> is defined as, "any of various means to extract content from a website over HTTP for the purpose of transforming that content into another format suitable for use in another context". Mint uses a company called <a href="http://corporate.yodlee.com/solutions_pfm_ypf.shtml" title="Yodlee">Yodlee</a> to essentially log into your bank accounts and scrape the HTML contents. It then uses some patented algorithms to separate the useful data from the junk. That data is then passed into Mint's database to be stored and aggregated.<br />
<br />
<strong>The good</strong><br />
Proponents of Yodlee claim that since it's your data anyways, you should be able to do whatever you want with it. For the <a href="http://en.wikipedia.org/wiki/Feist_Publications_v._Rural_Telephone_Service" title="Feist vs. Rural">Feist vs. Rural</a> case in 1991, the Supreme Court ruled that copying non-copyrightable data (in this case, phone records) is not considered copyright infringement.<br />
<br />
<strong>The bad and the ugly</strong><br />
Web scraping is traditionally thought of as VERY BAD practice, and is against the terms of use of some websites. Mint supposedly reads all banking balances nightly, which means it could hammer bank servers if not coordinated carefully. The fact that Mint is forced to scrape banking data (instead of harnessing any potential APIs) is evidence that this kind of bank partnership doesn't yet exist.<br />
<br />
<strong>I'm personally not a fan of how Mint gets my information</strong>, but I'm willing to look beyond that for now. From the first moment, my impression of Mint was positive. The interface is clean and intuitive, and the level of attention they put into site security from the ground up is comforting. Most importantly, giving people the opportunity the see their financial "big picture" (and actually SET BUDGETS) could prevent a lot of hardships. What do you think? 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/365877141" height="1" width="1"/>]]></content:encoded>

    <pubDate>Fri, 15 Aug 2008 11:13:19 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/128-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/128-Mint-The-Price-of-Convenience.html</feedburner:origLink></item>
<item>
    <title>Themeing Drupal Teaser Views</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/358542641/126-Themeing-Drupal-Teaser-Views.html</link>
            <category>Drupal</category>
    
    <comments>http://tech.forumone.com/archives/126-Themeing-Drupal-Teaser-Views.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=126</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=126</wfw:commentRss>
    

    <author>nospam@example.com (Oscar Merida)</author>
    <content:encoded><![CDATA[
    <p>Using Drupal's Views module, You have created a View that aggregates the Teasers for some collection of nodes, that is the type of view is set to Teasers.  You want to them the teasers, but there are two stumbling blocks.  Currently (8/7/08), the theme wizard for views only generates the code to theme views of type List.  Also, in Drupal 5, Teaser and Full Node views do not pass on to your theming function the values of the fields that you have defined in your view.  The latter, I would consider a bug.  You can still theme your view using the Themes API, but it requires the following setup.</p><p>First, define your theme override function according to the following convention (See also <a href="http://drupal.org/node/42597" class="external text" title="http://drupal.org/node/42597" rel="nofollow">Theming your Views</a>):
</p>
<blockquote>
<pre>function theme_views_view_TYPE_VIEWNAME($view, $nodes, $type);</pre>
This is called after all of the header and before any footer information are displayed. This is likely to be the most commonly used theme function simply due to its relative simplicity. All this function has to do is loop over the $nodes array and display the data based upon the type of the view. By default, the TYPE may be one of:
<br />
<ul><li> list
</li><li> table
</li><li> teasers
</li><li> nodes
</li></ul>
but plugins could offer other types that may also be themed.
</blockquote>
<p>If you have a teasers view named 'latest_success_stories', your theme function would have the following signature:
</p>
<pre><span class="syntax0"><span class="gutter">   1:</span><span class="syntax17">&lt;?php</span>
<span class="gutter">   2:</span><span class="syntax8">function</span> <span class="syntax6">theme_views_view_teasers_latest_success_stories</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">nodes</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">)</span></pre>
<p>Second, in your theming function, you'll have to iterate and load each node to get the fields you want to display and return the html to display.
</p>
<pre><span class="syntax0"><span class="gutter">   1:</span><span class="syntax17">&lt;?php</span>
<span class="gutter">   2:</span><span class="syntax8">function</span> <span class="syntax6">theme_views_view_teasers_latest_success_stories</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">nodes</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">)</span>
<span class="gutter">   3:</span><span class="syntax18">{</span>
<span class="gutter">   4:</span>  <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">Set</span><span class="syntax2"> </span><span class="syntax2">up</span><span class="syntax2"> </span><span class="syntax2">some</span><span class="syntax2"> </span><span class="syntax2">variables</span><span class="syntax2"> </span><span class="syntax2">that</span><span class="syntax2"> </span><span class="syntax2">won't</span><span class="syntax2"> </span><span class="syntax2">change.</span>
<span class="gutterH">   5:</span>  <span class="syntax10">$</span><span class="syntax10">base_vars</span> <span class="syntax18">=</span> <span class="syntax8">array</span><span class="syntax18">(</span>
<span class="gutter">   6:</span>    <span class="syntax13">'</span><span class="syntax13">view</span><span class="syntax13">'</span> <span class="syntax18">=</span><span class="syntax18">&gt;</span> <span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span>
<span class="gutter">   7:</span>    <span class="syntax13">'</span><span class="syntax13">view_type</span><span class="syntax13">'</span> <span class="syntax18">=</span><span class="syntax18">&gt;</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">,</span>
<span class="gutter">   8:</span>  <span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">   9:</span>
<span class="gutterH">  10:</span>  <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">OAM</span><span class="syntax2"> </span><span class="syntax2">-</span><span class="syntax2"> </span><span class="syntax2">GRRR,</span><span class="syntax2"> </span><span class="syntax2">have</span><span class="syntax2"> </span><span class="syntax2">to</span><span class="syntax2"> </span><span class="syntax2">load</span><span class="syntax2"> </span><span class="syntax2">the</span><span class="syntax2"> </span><span class="syntax2">whole</span><span class="syntax2"> </span><span class="syntax2">node</span><span class="syntax2"> </span><span class="syntax2">here?</span><span class="syntax2"> </span><span class="syntax2">http://drupalworx.com/node/14</span>
<span class="gutter">  11:</span>  <span class="syntax8">foreach</span><span class="syntax18"> (</span><span class="syntax10">$</span><span class="syntax10">nodes</span> <span class="syntax8">as</span> <span class="syntax10">$</span><span class="syntax10">i</span> <span class="syntax18">=</span><span class="syntax18">&gt;</span> <span class="syntax10">$</span><span class="syntax10">node_info</span><span class="syntax18">)</span> <span class="syntax18">{</span>
<span class="gutter">  12:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">base_vars</span><span class="syntax18">;</span>
<span class="gutter">  13:</span>    <span class="syntax10">$</span><span class="syntax10">node</span> <span class="syntax18">=</span> <span class="syntax6">node_load</span><span class="syntax18">(</span><span class="syntax11">$node_info</span><span class="syntax11">-&gt;nid</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  14:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">node</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">node</span><span class="syntax18">;</span>
<span class="gutterH">  15:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">count</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">i</span><span class="syntax18">;</span>
<span class="gutter">  16:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">stripe</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">i</span> <span class="syntax18">%</span> <span class="syntax5">2</span> <span class="syntax18">?</span> <span class="syntax13">'</span><span class="syntax13">even</span><span class="syntax13">'</span> <span class="syntax18">:</span> <span class="syntax13">'</span><span class="syntax13">odd</span><span class="syntax13">'</span><span class="syntax18">;</span>
<span class="gutter">  17:</span>
<span class="gutter">  18:</span>    <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">make</span><span class="syntax2"> </span><span class="syntax2">the</span><span class="syntax2"> </span><span class="syntax2">fields</span><span class="syntax2"> </span><span class="syntax2">we</span><span class="syntax2"> </span><span class="syntax2">want</span><span class="syntax2"> </span><span class="syntax2">available</span><span class="syntax2"> </span><span class="syntax2">as</span><span class="syntax2"> </span><span class="syntax2">variables</span><span class="syntax2"> </span><span class="syntax2">in</span><span class="syntax2"> </span><span class="syntax2">our</span><span class="syntax2"> </span><span class="syntax2">template</span><span class="syntax2"> </span><span class="syntax2">file</span>
<span class="gutter">  19:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">title</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;title</span><span class="syntax18">;</span>
<span class="gutterH">  20:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">link</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax6">l</span><span class="syntax18">(</span><span class="syntax11">$node</span><span class="syntax11">-&gt;title</span><span class="syntax18">,</span> <span class="syntax13">'</span><span class="syntax13">node/</span><span class="syntax13">'</span> <span class="syntax18">.</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;nid</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  21:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">learn_more</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax6">l</span><span class="syntax18">(</span><span class="syntax6">t</span><span class="syntax18">(</span><span class="syntax13">'</span><span class="syntax13">Learn</span><span class="syntax13"> </span><span class="syntax13">more</span><span class="syntax13">'</span><span class="syntax18">)</span><span class="syntax18">,</span> <span class="syntax13">'</span><span class="syntax13">node/</span><span class="syntax13">'</span> <span class="syntax18">.</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;nid</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  22:</span>    <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax11">$node</span><span class="syntax11">-&gt;field_thumbnail</span><span class="syntax18">)</span>
<span class="gutter">  23:</span>    <span class="syntax18">{</span>
<span class="gutter">  24:</span>        <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">we</span><span class="syntax2"> </span><span class="syntax2">only</span><span class="syntax2"> </span><span class="syntax2">want</span><span class="syntax2"> </span><span class="syntax2">the</span><span class="syntax2"> </span><span class="syntax2">first</span><span class="syntax2"> </span><span class="syntax2">field</span>
<span class="gutterH">  25:</span>        <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">thumbnail</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax9">array_pop</span><span class="syntax18">(</span><span class="syntax11">$node</span><span class="syntax11">-&gt;field_thumbnail</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  26:</span>    <span class="syntax18">}</span>
<span class="gutter">  27:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">teaser</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;teaser</span><span class="syntax18">;</span>
<span class="gutter">  28:</span>    <span class="syntax10">$</span><span class="syntax10">items</span><span class="syntax18">[</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax6">_phptemplate_callback</span><span class="syntax18">(</span><span class="syntax13">'</span><span class="syntax13">latest_success_stories_teasers_item</span><span class="syntax13">'</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  29:</span>  <span class="syntax18">}</span>
<span class="gutterH">  30:</span>
<span class="gutter">  31:</span>  <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax10">$</span><span class="syntax10">items</span><span class="syntax18">)</span> <span class="syntax18">{</span>
<span class="gutter">  32:</span>    <span class="syntax8">return</span> <span class="syntax9">join</span><span class="syntax18">(</span><span class="syntax13">'</span><span class="syntax13">'</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">items</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  33:</span>  <span class="syntax18">}</span>
<span class="gutter">  34:</span><span class="syntax18">}</span>
</span></pre>
<h2>Additional Notes</h2>
<p>If you are working via a sub-theme of another theme, the paths to your template files have to include the directory of your subtheme.  For example, if you're using the zen theme as your base theme and have subtheme named 'spiffy', the phptemplate callback would look like
</p>
<pre><span class="syntax0"><span class="gutter">   1:</span><span class="syntax17">&lt;?php</span>
<span class="gutter">   2:</span><span class="syntax10">$</span><span class="syntax10">items</span><span class="syntax18">[</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax6">_phptemplate_callback</span><span class="syntax18">(</span><span class="syntax13">'</span><span class="syntax13">spiffy/latest_success_stories_teasers_item</span><span class="syntax13">'</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">)</span><span class="syntax18">;</span>
</span></pre>

<p>If you are theming multiple teaser views where nodes have some set of fields in common that you want to use in your theme, you can create a generic function to do the real heavy lifting and call it from your theme override functions.
</p>
<pre><span class="syntax0"><span class="gutter">   1:</span><span class="syntax17">&lt;?php</span>
<span class="gutter">   2:</span><span class="syntax3">/**</span>
<span class="gutter">   3:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax3">Themes</span><span class="syntax3"> </span><span class="syntax3">a</span><span class="syntax3"> </span><span class="syntax3">set</span><span class="syntax3"> </span><span class="syntax3">of</span><span class="syntax3"> </span><span class="syntax3">node</span><span class="syntax3"> </span><span class="syntax3">teasers</span><span class="syntax3"> </span><span class="syntax3">using</span><span class="syntax3"> </span><span class="syntax3">the</span><span class="syntax3"> </span><span class="syntax3">given</span><span class="syntax3"> </span><span class="syntax3">template</span>
<span class="gutter">   4:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax12">@param</span><span class="syntax3"> </span><span class="syntax18">string</span>
<span class="gutterH">   5:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax12">@param</span><span class="syntax3"> </span><span class="syntax18">array</span>
<span class="gutter">   6:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax12">@param</span><span class="syntax3"> </span><span class="syntax18">string</span>
<span class="gutter">   7:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax12">@param</span><span class="syntax3"> </span><span class="syntax18">string</span>
<span class="gutter">   8:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax12">@return</span><span class="syntax3"> </span><span class="syntax18">string</span><span class="syntax3"> </span><span class="syntax3">HTML</span><span class="syntax3"> </span><span class="syntax3">output</span>
<span class="gutter">   9:</span><span class="syntax3"> </span><span class="syntax3">*/</span>
<span class="gutterH">  10:</span><span class="syntax8">function</span> <span class="syntax6">generic_views_teasers_theme</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">nodes</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">template</span><span class="syntax18">)</span>
<span class="gutter">  11:</span><span class="syntax18">{</span>
<span class="gutter">  12:</span>  <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">Set</span><span class="syntax2"> </span><span class="syntax2">up</span><span class="syntax2"> </span><span class="syntax2">some</span><span class="syntax2"> </span><span class="syntax2">variables</span><span class="syntax2"> </span><span class="syntax2">that</span><span class="syntax2"> </span><span class="syntax2">won't</span><span class="syntax2"> </span><span class="syntax2">change.</span>
<span class="gutter">  13:</span>  <span class="syntax10">$</span><span class="syntax10">base_vars</span> <span class="syntax18">=</span> <span class="syntax8">array</span><span class="syntax18">(</span>
<span class="gutter">  14:</span>    <span class="syntax13">'</span><span class="syntax13">view</span><span class="syntax13">'</span> <span class="syntax18">=</span><span class="syntax18">&gt;</span> <span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span>
<span class="gutterH">  15:</span>    <span class="syntax13">'</span><span class="syntax13">view_type</span><span class="syntax13">'</span> <span class="syntax18">=</span><span class="syntax18">&gt;</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">,</span>
<span class="gutter">  16:</span>  <span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  17:</span>
<span class="gutter">  18:</span>  <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">OAM</span><span class="syntax2"> </span><span class="syntax2">-</span><span class="syntax2"> </span><span class="syntax2">GRRR,</span><span class="syntax2"> </span><span class="syntax2">have</span><span class="syntax2"> </span><span class="syntax2">to</span><span class="syntax2"> </span><span class="syntax2">load</span><span class="syntax2"> </span><span class="syntax2">the</span><span class="syntax2"> </span><span class="syntax2">whole</span><span class="syntax2"> </span><span class="syntax2">node</span><span class="syntax2"> </span><span class="syntax2">here?</span><span class="syntax2"> </span><span class="syntax2">http://drupalworx.com/node/14</span>
<span class="gutter">  19:</span>  <span class="syntax8">foreach</span><span class="syntax18"> (</span><span class="syntax10">$</span><span class="syntax10">nodes</span> <span class="syntax8">as</span> <span class="syntax10">$</span><span class="syntax10">i</span> <span class="syntax18">=</span><span class="syntax18">&gt;</span> <span class="syntax10">$</span><span class="syntax10">node_info</span><span class="syntax18">)</span> <span class="syntax18">{</span>
<span class="gutterH">  20:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">base_vars</span><span class="syntax18">;</span>
<span class="gutter">  21:</span>    <span class="syntax10">$</span><span class="syntax10">node</span> <span class="syntax18">=</span> <span class="syntax6">node_load</span><span class="syntax18">(</span><span class="syntax11">$node_info</span><span class="syntax11">-&gt;nid</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  22:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">node</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">node</span><span class="syntax18">;</span>
<span class="gutter">  23:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">count</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">i</span><span class="syntax18">;</span>
<span class="gutter">  24:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">stripe</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax10">$</span><span class="syntax10">i</span> <span class="syntax18">%</span> <span class="syntax5">2</span> <span class="syntax18">?</span> <span class="syntax13">'</span><span class="syntax13">even</span><span class="syntax13">'</span> <span class="syntax18">:</span> <span class="syntax13">'</span><span class="syntax13">odd</span><span class="syntax13">'</span><span class="syntax18">;</span>
<span class="gutterH">  25:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">title</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;title</span><span class="syntax18">;</span>
<span class="gutter">  26:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">link</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax6">l</span><span class="syntax18">(</span><span class="syntax11">$node</span><span class="syntax11">-&gt;title</span><span class="syntax18">,</span> <span class="syntax13">'</span><span class="syntax13">node/</span><span class="syntax13">'</span> <span class="syntax18">.</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;nid</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  27:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">learn_more</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax6">l</span><span class="syntax18">(</span><span class="syntax6">t</span><span class="syntax18">(</span><span class="syntax13">'</span><span class="syntax13">Learn</span><span class="syntax13"> </span><span class="syntax13">more</span><span class="syntax13">'</span><span class="syntax18">)</span><span class="syntax18">,</span> <span class="syntax13">'</span><span class="syntax13">node/</span><span class="syntax13">'</span> <span class="syntax18">.</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;nid</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  28:</span>    <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax11">$node</span><span class="syntax11">-&gt;field_thumbnail</span><span class="syntax18">)</span>
<span class="gutter">  29:</span>    <span class="syntax18">{</span>
<span class="gutterH">  30:</span>        <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">thumbnail</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax9">array_pop</span><span class="syntax18">(</span><span class="syntax11">$node</span><span class="syntax11">-&gt;field_thumbnail</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  31:</span>    <span class="syntax18">}</span>
<span class="gutter">  32:</span>    <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">[</span><span class="syntax13">'</span><span class="syntax13">teaser</span><span class="syntax13">'</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax11">$node</span><span class="syntax11">-&gt;teaser</span><span class="syntax18">;</span>
<span class="gutter">  33:</span>    <span class="syntax10">$</span><span class="syntax10">items</span><span class="syntax18">[</span><span class="syntax18">]</span> <span class="syntax18">=</span> <span class="syntax6">_phptemplate_callback</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">template</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">vars</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  34:</span>  <span class="syntax18">}</span>
<span class="gutterH">  35:</span>
<span class="gutter">  36:</span>  <span class="syntax8">if</span><span class="syntax18"> (</span><span class="syntax10">$</span><span class="syntax10">items</span><span class="syntax18">)</span> <span class="syntax18">{</span>
<span class="gutter">  37:</span>    <span class="syntax8">return</span> <span class="syntax9">join</span><span class="syntax18">(</span><span class="syntax13">'</span><span class="syntax13">'</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">items</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  38:</span>  <span class="syntax18">}</span>
<span class="gutter">  39:</span><span class="syntax18">}</span>
<span class="gutterH">  40:</span>
<span class="gutter">  41:</span><span class="syntax3">/**</span>
<span class="gutter">  42:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax3">Themes</span><span class="syntax3"> </span><span class="syntax3">the</span><span class="syntax3"> </span><span class="syntax3">teasers</span><span class="syntax3"> </span><span class="syntax3">view</span><span class="syntax3"> </span><span class="syntax3">In</span><span class="syntax3"> </span><span class="syntax3">the</span><span class="syntax3"> </span><span class="syntax3">News</span><span class="syntax3">.</span>
<span class="gutter">  43:</span><span class="syntax3"> </span><span class="syntax3">*/</span>
<span class="gutter">  44:</span><span class="syntax8">function</span> <span class="syntax6">theme_views_view_teasers_in_the_news_latest</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">nodes</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">)</span> <span class="syntax18">{</span>
<span class="gutterH">  45:</span>    <span class="syntax8">return</span> <span class="syntax6">generic_views_teasers_theme</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">nodes</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">,</span> <span class="syntax13">'</span><span class="syntax13">spiffy/views-teasers-thumbnail-right</span><span class="syntax13">'</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  46:</span><span class="syntax18">}</span>
<span class="gutter">  47:</span>
<span class="gutter">  48:</span><span class="syntax3">/**</span>
<span class="gutter">  49:</span><span class="syntax3"> </span><span class="syntax3">*</span><span class="syntax3"> </span><span class="syntax3">Themes</span><span class="syntax3"> </span><span class="syntax3">the</span><span class="syntax3"> </span><span class="syntax3">teasers</span><span class="syntax3"> </span><span class="syntax3">view</span><span class="syntax3"> </span><span class="syntax3">for</span><span class="syntax3"> </span><span class="syntax3">the</span><span class="syntax3"> </span><span class="syntax3">Success</span><span class="syntax3"> </span><span class="syntax3">Story</span><span class="syntax3"> </span><span class="syntax3">homepage</span><span class="syntax3"> </span><span class="syntax3">block</span><span class="syntax3">.</span>
<span class="gutterH">  50:</span><span class="syntax3"> </span><span class="syntax3">*/</span>
<span class="gutter">  51:</span><span class="syntax8">function</span> <span class="syntax6">theme_views_view_teasers_success_story_homepage_block</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">nodes</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">)</span> <span class="syntax18">{</span>
<span class="gutter">  52:</span>    <span class="syntax8">return</span> <span class="syntax6">generic_views_teasers_theme</span><span class="syntax18">(</span><span class="syntax10">$</span><span class="syntax10">view</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">nodes</span><span class="syntax18">,</span> <span class="syntax10">$</span><span class="syntax10">type</span><span class="syntax18">,</span> <span class="syntax13">'</span><span class="syntax13">spiffy/views-teasers-thumbnail-left</span><span class="syntax13">'</span><span class="syntax18">)</span><span class="syntax18">;</span>
<span class="gutter">  53:</span><span class="syntax18">}</span>
</span></pre>
<style type="text/css"><!--
.syntax0 {
color: #000000;
}
.syntax1 {
color: #009966;
font-style: italic;
}
.syntax2 {
color: #999999;
font-style: italic;
}
.syntax3 {
color: #6600cc;
}
.syntax4 {
color: #cc6600;
}
.syntax5 {
color: #ff0000;
}
.syntax6 {
color: #9966ff;
}
.syntax7 {
background: #ffffcc;
color: #ff0066;
}
.syntax8 {
color: #006699;
font-weight: bold;
}
.syntax9 {
color: #cc0033;
}
.syntax10 {
color: #0099ff;
font-weight: bold;
}
.syntax11 {
color: #0099ff;
}
.syntax12 {
color: #02b902;
}
.syntax13 {
color: #ff00cc;
}
.syntax14 {
color: #cc00cc;
}
.syntax15 {
color: #9900cc;
}
.syntax16 {
color: #6600cc;
}
.syntax17 {
color: #0000ff;
}
.syntax18 {
color: #000000;
}
.gutter {
background: #dbdbdb;
color: #000000;
}
.gutterH {
background: #dbdbdb;
color: #3399ff;
}
--></style> 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/358542641" height="1" width="1"/>]]></content:encoded>

    <pubDate>Thu, 07 Aug 2008 12:00:55 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/126-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/126-Themeing-Drupal-Teaser-Views.html</feedburner:origLink></item>
<item>
    <title>Kata for Code Monkeys</title>
    <link>http://feeds.feedburner.com/~r/ForumOneTechBlog/~3/336411872/124-Kata-for-Code-Monkeys.html</link>
            <category>Programming</category>
    
    <comments>http://tech.forumone.com/archives/124-Kata-for-Code-Monkeys.html#comments</comments>
    <wfw:comment>http://tech.forumone.com/wfwcomment.php?cid=124</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://tech.forumone.com/rss.php?version=2.0&amp;type=comments&amp;cid=124</wfw:commentRss>
    

    <author>nospam@example.com (Nyk Cowham)</author>
    <content:encoded><![CDATA[
    <img width='159' height='200' style="float: right; border: 0px; padding-left: 5px; padding-right: 5px;" src="http://tech.forumone.com/uploads/karate-chimp.serendipityThumb.jpg" alt="" /><br />
I have been a martial artists for over 20 years: Karate, Kung-Fu, Jiu-Jutsu and currently Filipino &amp; Indonesian martial arts. Most traditional martial arts employ a series of movement forms or patterns that in the Japanese martial arts are called Kata. The purpose of a Kata is to build spontaneous instinctive reaction and motion. It is a method of refining movements to an efficient perfectly ergonomic motion. <br />
<br />
Such repetitive focused study is not too dissimilar to the practice methods in other arts. A musician will spend years practicing scales and études (studies), and a fine artist will spend significant amounts of time practicing technique and form in sketchbooks. Such focused study is how an artist trains to master the techniques of their art to the point where they become spontaneous and apparently effortless. <br />
<br />
Software development is based on principles of computer science. However, designing a solution to a problem and coding that solution into well formed computer code is a craft: as much art as science. Sara Chipps provides a good description of the qualities of developers  who embody the art of programming in her article <a href="http://itmanagement.earthweb.com/features/article.php/3749841/Natural+Programmers+(Code+Monkeys)+vs.+Career+Programmers+(Geeks+in+Suits).htm" >Natural Programmers (Code Monkeys) vs. Career Programmers (Geeks in Suits)</a>. What stands out in her description of "Code Monkeys" is a total absorption and immersion in the joy and adventure of computer code. Code Monkeys live and breath code in the same way any other serious artist is thoroughly committed to their art.<br />
<br />
<a href="http://pragdave.pragprog.com/" >Dave Thomas</a> from <a href="http://www.pragprog.com/" >Pragmatic Programmers</a> has started to develop an concept of <a href="http://codekata.pragprog.com/" >Code Kata</a> borrowing the concept from Japanese martial arts. His argument is that most programmers learn their craft in the heat of battle while engaged in project work. The problem with this is that programmers tend to optimize on the solutions with which they have already researched and implemented and continue to follow those same solutions over and over again even though there may be much more efficient or elegant solutions.<br />
<br />
A code kata is a focused study on a discrete problem with the emphasis on exploring different ways of solving the same problem. One of my favorite code exercises that could qualify as a code kata is the <a href="http://mathworld.wolfram.com/196-Algorithm.html" >196-algorithm</a>. This has no earthly use whatsoever, but it is a good way to practice list handling, sort, recursion and many other different software algorithms. It has become my "Hello World" app when exploring new computer languages.<br />
<br />
Of Dave Thomas' Kata I really like "<a href="http://codekata.pragprog.com/2007/01/kata_five_bloom.html" >Kata Five: Bloom Filters</a>" particularly since it is working with bit sets, hashes and I have come across a sufficient number "item is member of set" problems for this to yield some interesting results.<br />
<br />
Other than the CodeKata blog I would recommend Steve Yegge's article <a href="http://steve.yegge.googlepages.com/practicing-programming" >Practicing Programming</a> as a source for Code Kata, or practice drills as Stevey calls them. Perhaps you can come up with a few of your own? 
    <img src="http://feeds.feedburner.com/~r/ForumOneTechBlog/~4/336411872" height="1" width="1"/>]]></content:encoded>

    <pubDate>Tue, 15 Jul 2008 14:21:25 -0400</pubDate>
    <guid isPermaLink="false">http://tech.forumone.com/archives/124-guid.html</guid>
    
<feedburner:origLink>http://tech.forumone.com/archives/124-Kata-for-Code-Monkeys.html</feedburner:origLink></item>

</channel>
</rss>
