<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Nephtali Blog</title>
	<atom:link href="http://blog.nephtaliproject.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.nephtaliproject.com</link>
	<description>Nephtali web framework updates and other techie stuff</description>
	<lastBuildDate>Fri, 20 Aug 2010 06:21:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Nephtali 3.1.2 released</title>
		<link>http://blog.nephtaliproject.com/?p=138</link>
		<comments>http://blog.nephtaliproject.com/?p=138#comments</comments>
		<pubDate>Fri, 20 Aug 2010 06:21:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=138</guid>
		<description><![CDATA[There&#8217;s a new Nephtali for your coding enjoyment.  This release focuses on optimizing Nephtali for improved performance.  While there is certainly still much ground to cover in terms of performance, this is really the first time I&#8217;ve looked at the code purely for performance analysis, and while you might not be able to see the [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a <a href="http://code.google.com/p/nephtali/downloads/detail?name=nephtali_3_1_2.zip&amp;can=2&amp;q=#makechanges" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/nephtali/downloads/detail?name=nephtali_3_1_2.zip_amp_can=2_amp_q=_makechanges&amp;referer=');">new Nephtali for your coding enjoyment</a>.  This release focuses on optimizing Nephtali for improved performance.  While there is certainly still much ground to cover in terms of performance, this is really the first time I&#8217;ve looked at the code purely for performance analysis, and while you might not be able to see the difference, your server will feel the difference if your site ever experiences the slashdot effect.</p>
<p>I&#8217;ve begun work on a side project to develop a PECL extension for Nephtali to offer significant performance enhancements.  However, I&#8217;ve got a few projects that have to be completed before I&#8217;ll be able to get back to that project.</p>
<p>In the mean time, I hope you update to the new release and please let me know if you see any issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=138</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nephtali 3.1.1 Released</title>
		<link>http://blog.nephtaliproject.com/?p=132</link>
		<comments>http://blog.nephtaliproject.com/?p=132#comments</comments>
		<pubDate>Sat, 24 Jul 2010 06:06:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[New Feature]]></category>
		<category><![CDATA[New Release]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=132</guid>
		<description><![CDATA[A new version of Nephtali (3.1.1) has been released.  Improvements in the new release include: Updated code formatting to use tabs instead of spaces (now you can set the indentation you desire in your editor), and Nedit now generates code using tabs, too. Altered coding style so most of the PECL recommendations are followed. Improved [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://code.google.com/p/nephtali/downloads/list" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/nephtali/downloads/list?referer=');">new version of Nephtali (3.1.1) has been released</a>.  Improvements in the new release include:</p>
<ul>
<li>Updated code formatting to use tabs instead of spaces (now you can set the indentation you desire in your editor), and Nedit now generates code using tabs, too.</li>
<li>Altered coding style so <a href="http://svn.php.net/viewvc/php/php-src/trunk/CODING_STANDARDS" onclick="pageTracker._trackPageview('/outgoing/svn.php.net/viewvc/php/php-src/trunk/CODING_STANDARDS?referer=');">most of the PECL recommendations</a> are followed.</li>
<li>Improved error handling within Nephtali, and fixed some related bugs.</li>
<li>Improved debug output formatting.</li>
<li>Added n\arr\dump(array $arr) function, which returns formatted (HTML) representation of the array argument.</li>
<li>Removed some unnecessary count() calls to speed execution.</li>
<li>Fixed some bugs.</li>
</ul>
<p>Update and enjoy <img src='http://blog.nephtaliproject.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=132</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are ports 21, 554, and 7070 open or closed? The answer is yes.</title>
		<link>http://blog.nephtaliproject.com/?p=129</link>
		<comments>http://blog.nephtaliproject.com/?p=129#comments</comments>
		<pubDate>Mon, 28 Jun 2010 01:42:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Server Administration]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=129</guid>
		<description><![CDATA[Perhaps you&#8217;re confused by the title, and if you are, you&#8217;re experiencing the same feeling I&#8217;ve had for the past day.  Alas, I&#8217;ve spent way too much time figuring out why my server was seemingly a bizzaro-world example of up is down, down is up reality. Well, the reality that is pales in comparison to [...]]]></description>
			<content:encoded><![CDATA[<p>Perhaps you&#8217;re confused by the title, and if you are, you&#8217;re experiencing the same feeling I&#8217;ve had for the past day.  Alas, I&#8217;ve spent way too much time figuring out why my server was seemingly a <a href="http://en.wikipedia.org/wiki/The_Bizarro_Jerry" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/The_Bizarro_Jerry?referer=');">bizzaro-world example of up is down, down is up</a> reality.</p>
<p>Well, the reality that is pales in comparison to the journey that was,  so let&#8217;s briefly review the journey.</p>
<p>I was running security tests on my Rackspace Cloud Server after configuring the firewall, and the tests revealed that ports 21, 554, and 7070 were open.  This was not the intention of my firewall, and although I had done a fair amount of reading on iptables over the past few months, I was starting to question my understanding of even basic configuration options.</p>
<p>Eventually, I chatted with tech support to make sure that I wasn&#8217;t missing a default configuration of their cloud servers, but to my surprise the tech&#8217;s tests of my server did not reveal that the ports were open.  I was tired and wondering if I was imagining things, so I decide it was time to hit the hay.</p>
<p>The next morning, I immediately went back to the computer thinking the abnormal tendencies of my network would turn out to be stupid errors on my part, easily corrected by my sharper, rested mind (OK, I know, even well rested I&#8217;m no Einstein, but&#8230;)  However, the light of a new day merely revealed the strange truth of my tests.</p>
<p>I had no services running/listening on any of the listed ports, I was using a firewall that appeared to work for many other people just the way I thought it should work for me, and I could see evidence of the firewall working on other ports.  When I tested the ports (telnet, nmap, etc.), they were open.  However, when the tech and later my friend Davin tested the ports on their computers, they were closed.</p>
<p>It appears it was only one bad Apple that was spoiling a bunch of my tests.  I&#8217;m using a Time Capsule as my router, and after growing suspicious, a search brought up <a href="http://discussions.apple.com/thread.jspa?threadID=1531675" onclick="pageTracker._trackPageview('/outgoing/discussions.apple.com/thread.jspa?threadID=1531675&amp;referer=');">a rather similar issue</a>.</p>
<p>After isolating the issue, it appears that Time Capsule was trying to &#8220;help&#8221; the situation by proxying certain protocols.  The issue is that it doesn&#8217;t even check with the server on some of the protocols to see if a connection can actually be obtained, it just makes it appear as though one has been granted and passes along follow-up requests.  Needless to say, this approach by Apple didn&#8217;t actually &#8220;help&#8221; me at all.</p>
<p>So, if you&#8217;re seeing some unexpected results of ports 21, 554, and 7070 being open on a remote server, I hope you find this blog post so you can quickly check if it&#8217;s a piece of Apple networking hardware that&#8217;s causing the issue.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=129</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nephtali 3.1.0 released</title>
		<link>http://blog.nephtaliproject.com/?p=124</link>
		<comments>http://blog.nephtaliproject.com/?p=124#comments</comments>
		<pubDate>Sat, 19 Jun 2010 05:24:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[New Release]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=124</guid>
		<description><![CDATA[Greetings! Nephtali 3.1.0 has now been officially released.  The newest release of Nephtali: Improves the regular expressions used in filtering. Adds the ability to send a single row to the n\view\render() function (before you had to wrap a single row in a parent array before supplying it as an argument.) Fixes some bugs. Allows you [...]]]></description>
			<content:encoded><![CDATA[<p>Greetings!</p>
<p><a href="http://code.google.com/p/nephtali/downloads/list" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/nephtali/downloads/list?referer=');">Nephtali 3.1.0 has now been officially released</a>.  The newest release of Nephtali:</p>
<ul>
<li>Improves the regular expressions used in filtering.</li>
<li>Adds the ability to send a single row to the n\view\render() function (before you had to wrap a single row in a parent array before supplying it as an argument.)</li>
<li>Fixes some bugs.</li>
<li>Allows you to set a default &#8216;charset&#8217; in nconfig.php (default charset is UTF-8) to be used in the PHP functions that allow you to pass in a charset argument.</li>
<li>Improves the debug screen output.</li>
</ul>
<p>Thanks for your support.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=124</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nephtali 3.0.9 available for download</title>
		<link>http://blog.nephtaliproject.com/?p=86</link>
		<comments>http://blog.nephtaliproject.com/?p=86#comments</comments>
		<pubDate>Wed, 02 Jun 2010 06:15:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[New Release]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=86</guid>
		<description><![CDATA[The newest release of Nephtali is now available for download, and most notably, it incorporates caching capabilities.  While Nephtali doesn&#8217;t transparently perform the caching for you, it does facilitate the caching of the final page, or of the markup after all of the templates have been applied.  You can read more about the new caching [...]]]></description>
			<content:encoded><![CDATA[<p>The newest release of Nephtali is now available for download, and most notably, it incorporates caching capabilities.  While Nephtali doesn&#8217;t transparently perform the caching for you, it does facilitate the caching of the final page, or of the markup after all of the templates have been applied.  You can <a href="http://docs.nephtaliproject.com/wiki/Caching:_The_Fast_Becomes_Faster" onclick="pageTracker._trackPageview('/outgoing/docs.nephtaliproject.com/wiki/Caching_The_Fast_Becomes_Faster?referer=');">read more about the new caching capabilites at the Nephtali wiki</a>.</p>
<p>The new caching capabilities are especially useful for improving the performance of pages like <a href="http://nephtaliproject.com" onclick="pageTracker._trackPageview('/outgoing/nephtaliproject.com?referer=');">the homepage for Nephtali</a>, which gets data from multiple web services.  Of note, the homepage also provides an example of how Nephtali tries to improve the experience of its developers.</p>
<p>When a pipe has an error rendering, Nepthali automatically handles the error by displaying the error view for that pipe.  That is to say, when using the Nepthali framework, an error in one dynamic region of a page does not require the visitor be redirected to an error page.  The visitor can still see the other dynamic regions that properly rendered.</p>
<p>When I integrated the first draft of the caching capabilities in the Nephtali website, I came back to the site a few times and realized that on one occasion, the cached version of the page included an error view (one of the web service requests had timed out.)  To handle this situation, I augmented the code in this release so Nepthali only calls the save function for a registered cache if all of the pipes on the page rendered without errors.</p>
<p>[Note: If you're manually handling the errors, you can still avoid having a page cached by calling n\val($name = 'nephtali_is_cacheable', $value = false) to let Nephtali know that the particular request shouldn't be saved.]</p>
<p>Let me know if you have any issues with the new download.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=86</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Basic caching now integrated in trunk</title>
		<link>http://blog.nephtaliproject.com/?p=81</link>
		<comments>http://blog.nephtaliproject.com/?p=81#comments</comments>
		<pubDate>Tue, 01 Jun 2010 06:25:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=81</guid>
		<description><![CDATA[Nephtali now facilitates basic page caching.  Nephtali doesn&#8217;t actually implement the caching, but rather, it provides some easy hooks so you can use the caching library of your choice (APC, memcache, eaccelerator, etc.) Here&#8217;s some example code from the Nephtali homepage which happens to use APC to accomplish the caching: So, pretty simple.  Caching follows [...]]]></description>
			<content:encoded><![CDATA[<p>Nephtali now facilitates basic page caching.  Nephtali doesn&#8217;t actually implement the caching, but rather, it provides some easy hooks so you can use the caching library of your choice (APC, memcache, eaccelerator, etc.)</p>
<p>Here&#8217;s some example code from the Nephtali homepage which happens to use APC to accomplish the caching:</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="php" style="font-family:monospace;"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="co1">// Rest of code for index.php code-behind comes here, then caching below.</span>
&nbsp;
n\cache\register<span class="br0">&#40;</span>
	<span class="re0">$stage</span> <span class="sy0">=</span> n\<a href="http://www.php.net/constant" onclick="pageTracker._trackPageview('/outgoing/www.php.net/constant?referer=');"><span class="kw3">constant</span></a>\CACHE_FINAL<span class="sy0">,</span>
	<span class="re0">$fetch_func</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="re0">$markup</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="re0">$homepage_markup</span> <span class="sy0">=</span> apc_fetch<span class="br0">&#40;</span><span class="st0">&quot;homepage&quot;</span><span class="sy0">,</span> <span class="re0">$success</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$homepage_markup</span> <span class="sy0">!==</span> <span class="kw4">false</span><span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
			<span class="kw1">return</span> <span class="re0">$homepage_markup</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
		<span class="kw1">else</span>
		<span class="br0">&#123;</span>
			<span class="kw1">return</span> <span class="kw4">null</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span>
	<span class="re0">$save_func</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="re0">$markup</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		apc_store<span class="br0">&#40;</span><span class="st0">&quot;homepage&quot;</span><span class="sy0">,</span> <span class="re0">$markup</span><span class="sy0">,</span> 3600<span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="sy1">?&gt;</span></pre></div></div>
<p>So, pretty simple.  Caching follows a registration paradigm just like the other features of Nephtali (ports, pipes, vals, etc.), and you merely tell Nephtali which stage of caching to intercept (for now, it&#8217;s just the final result, but more will come in the future) and which functions should handle getting and saving the cached results.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=81</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Low-memory, Human-readable, Injection-resistant, Data-interchange Format (LHIDF, pronounced &#8220;Lidif&#8221;)</title>
		<link>http://blog.nephtaliproject.com/?p=28</link>
		<comments>http://blog.nephtaliproject.com/?p=28#comments</comments>
		<pubDate>Sun, 16 May 2010 05:30:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=28</guid>
		<description><![CDATA[I&#8217;m working on some mobile phone applications that have to accept data from sources outside of my application, although I can choose the data-interchange format those developing the data sources will have to utilize.  This brings to mind 2 big concerns when choosing which data-interchange format to utilize: Resources are few, so how do I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working on some mobile phone applications that have to accept data from sources outside of my application, although I can choose the data-interchange format those developing the data sources will have to utilize.  This brings to mind 2 big concerns when choosing which data-interchange format to utilize:</p>
<ol>
<li>Resources are few, so how do I limit the cost of parsing the incoming data?</li>
<li>How do I ensure those providing the data have properly validated and escaped output coming to my application so-as to preserve the intended message structure?  Anyone familiar with SQL-injection, Email-injection, or XSS attacks will understand the general concerns described here.</li>
</ol>
<p>There are several data-interchange formats I could use, including XML and JSON.  However, XML parsers can suck up large amounts of resources (and I can&#8217;t blame them, parsing XML can get pretty tricky), as can JSON parsers.  Additionally, both JSON and XML offer little in the way of  ensuring that the intended structure of the message is preserved even if one fails to properly validate incoming data that is used to generate the message.</p>
<p>To address these concerns, I&#8217;ve developed a new data-interchange format, which I&#8217;ve called the Low-memory, Human-readable, Injection-resistant, Data-interchange Format (LHIDF, and pronounced &#8220;Lidif&#8221;.)  Is the name a ridiculously long, forgettable acronym?  You betcha!</p>
<p>Anyways, let&#8217;s first look at a sample of LHIDF:</p>
<pre>{leaders:256}
    {leader:256}
        {username:256}bill178{username:256}
        {rank:256}78{rank:256}
        {time:256}89.56{time:256}
    {leader:256}
    {leader:256}
        {username:256}thomas890{username:256}
        {rank:256}45{rank:256}
        {time:256}109.52{time:256}
    {leader:256}
{leaders:256}
</pre>
<p>Hopefully you agree that it is human readable.  I wouldn&#8217;t call it beautiful, but I can easily read the data and make edits as needed.</p>
<p>Every node follows the simple convention below:<br />
{nodeName:messageID}content{nodeName:messageID}</p>
<p>Additionally, there are no attributes like those found in XML, there must be one top-level node, and each node can contain other nodes -OR- a simple value (unlike XML, nodes can&#8217;t contain a mixture of other nodes and simple values.)</p>
<p>Of note, the message ID is the same for all of the nodes, and we&#8217;ll get to its use in a bit.  The important point is that the format is really simple, and it&#8217;s this simplicity that facilitates the &#8220;low-memory&#8221; component of its name.  Because of the simple structure, a PHP class such as the one below is all that&#8217;s needed to parse a LHIDF response:</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="php" style="font-family:monospace;"><span class="kw2">&lt;?php</span>
<span class="co4">/**
 * Simple class to parse LHIDF (pronounced &quot;Lidif&quot;) data-interchange format.
 * The Low-memory, Human-readable, Injection-resistant, Data-interchange Format.
 *
 * @author Adam Richardson of Envision Internet Consulting, LLC
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */</span>
<span class="kw2">class</span> LHIDFNode <span class="br0">&#123;</span>
    <span class="kw2">public</span> <span class="re0">$name</span><span class="sy0">;</span>
    <span class="kw2">public</span> <span class="re0">$value</span><span class="sy0">;</span>
    <span class="kw2">public</span> static <span class="re0">$messageID</span><span class="sy0">;</span>
    <span class="co4">/**
     * Create a new node object.
     * @param string $name
     * @param string $value
     */</span>
    <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">name</span> <span class="sy0">=</span> <span class="re0">$name</span><span class="sy0">;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span> <span class="sy0">=</span> <a href="http://www.php.net/trim" onclick="pageTracker._trackPageview('/outgoing/www.php.net/trim?referer=');"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
    <span class="kw2">private</span> static <span class="kw2">function</span> setMessageID<span class="br0">&#40;</span><span class="re0">$data</span><span class="sy0">,</span> <span class="re0">$rootNodeName</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$temp</span> <span class="sy0">=</span> <a href="http://www.php.net/next" onclick="pageTracker._trackPageview('/outgoing/www.php.net/next?referer=');"><span class="kw3">next</span></a><span class="br0">&#40;</span><a href="http://www.php.net/explode" onclick="pageTracker._trackPageview('/outgoing/www.php.net/explode?referer=');"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st_h">'{'</span><span class="sy0">.</span><span class="re0">$rootNodeName</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">,</span> <span class="re0">$data</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="re0">$positionClosingCurly</span> <span class="sy0">=</span> <a href="http://www.php.net/strpos" onclick="pageTracker._trackPageview('/outgoing/www.php.net/strpos?referer=');"><span class="kw3">strpos</span></a><span class="br0">&#40;</span><span class="re0">$temp</span><span class="sy0">,</span> <span class="st_h">'}'</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw2">self</span><span class="sy0">::</span><span class="re0">$messageID</span> <span class="sy0">=</span> <a href="http://www.php.net/substr" onclick="pageTracker._trackPageview('/outgoing/www.php.net/substr?referer=');"><span class="kw3">substr</span></a><span class="br0">&#40;</span><span class="re0">$temp</span><span class="sy0">,</span> 0<span class="sy0">,</span> <span class="re0">$positionClosingCurly</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
    <span class="co4">/**
     * Create the root level node and store the messageID.
     * @param string $data
     * @param string $name
     * @return Node
     */</span>
    <span class="kw2">public</span> static <span class="kw2">function</span> getRootNode<span class="br0">&#40;</span><span class="re0">$data</span><span class="sy0">,</span> <span class="re0">$name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw2">self</span><span class="sy0">::</span><span class="me2">setMessageID</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="sy0">,</span> <span class="re0">$name</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">return</span> <span class="kw2">new</span> LHIDFNode<span class="br0">&#40;</span><span class="re0">$key</span> <span class="sy0">=</span> <span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$value</span> <span class="sy0">=</span> <a href="http://www.php.net/next" onclick="pageTracker._trackPageview('/outgoing/www.php.net/next?referer=');"><span class="kw3">next</span></a><span class="br0">&#40;</span><a href="http://www.php.net/explode" onclick="pageTracker._trackPageview('/outgoing/www.php.net/explode?referer=');"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st_h">'{'</span><span class="sy0">.</span><span class="re0">$name</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="kw2">self</span><span class="sy0">::</span><span class="re0">$messageID</span><span class="sy0">.</span><span class="st_h">'}'</span><span class="sy0">,</span> <span class="re0">$data</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
    <span class="co4">/**
     * Retrieve the matching nodes found within the current LHIDFNode object.
     * @param string $name
     * @return array An array of LHIDFNode objects.
     */</span>
    <span class="kw2">public</span> <span class="kw2">function</span> getChildren<span class="br0">&#40;</span><span class="re0">$name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$tempArray</span> <span class="sy0">=</span> <a href="http://www.php.net/explode" onclick="pageTracker._trackPageview('/outgoing/www.php.net/explode?referer=');"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st_h">'{'</span><span class="sy0">.</span><span class="re0">$name</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="kw2">self</span><span class="sy0">::</span><span class="re0">$messageID</span><span class="sy0">.</span><span class="st_h">'}'</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/count" onclick="pageTracker._trackPageview('/outgoing/www.php.net/count?referer=');"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$tempArray</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> 3<span class="br0">&#41;</span> throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;The node <span class="es4">$name</span> could not be found.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="re0">$children</span> <span class="sy0">=</span> <a href="http://www.php.net/array" onclick="pageTracker._trackPageview('/outgoing/www.php.net/array?referer=');"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="re0">$i</span> <span class="sy0">&lt;</span> <span class="br0">&#40;</span><a href="http://www.php.net/count" onclick="pageTracker._trackPageview('/outgoing/www.php.net/count?referer=');"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$tempArray</span><span class="br0">&#41;</span> <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/strlen" onclick="pageTracker._trackPageview('/outgoing/www.php.net/strlen?referer=');"><span class="kw3">strlen</span></a><span class="br0">&#40;</span><a href="http://www.php.net/trim" onclick="pageTracker._trackPageview('/outgoing/www.php.net/trim?referer=');"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$tempArray</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> 1<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">continue</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
            <span class="kw1">else</span> <span class="br0">&#123;</span>
                <span class="re0">$children</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw2">new</span> LHIDFNode<span class="br0">&#40;</span><span class="re0">$key</span> <span class="sy0">=</span> <span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$value</span> <span class="sy0">=</span> <span class="re0">$tempArray</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">return</span> <span class="re0">$children</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
    <span class="co4">/**
     * Retrieve the matching child node of current node (multiple matching nodes will throw an exeption.)
     * @param string $name
     * @return Node
     */</span>
    <span class="kw2">public</span> <span class="kw2">function</span> getChild<span class="br0">&#40;</span><span class="re0">$name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$tempArray</span> <span class="sy0">=</span> <a href="http://www.php.net/explode" onclick="pageTracker._trackPageview('/outgoing/www.php.net/explode?referer=');"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st_h">'{'</span><span class="sy0">.</span><span class="re0">$name</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="kw2">self</span><span class="sy0">::</span><span class="re0">$messageID</span><span class="sy0">.</span><span class="st_h">'}'</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/count" onclick="pageTracker._trackPageview('/outgoing/www.php.net/count?referer=');"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$tempArray</span><span class="br0">&#41;</span> <span class="sy0">!=</span> 3<span class="br0">&#41;</span> throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;The node <span class="es4">$name</span> could not be found.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">return</span> <span class="kw2">new</span> LHIDFNode<span class="br0">&#40;</span><span class="re0">$key</span> <span class="sy0">=</span> <span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$value</span> <span class="sy0">=</span> <span class="re0">$tempArray</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
    <span class="co4">/**
     * Retrieve the value of the current node.
     * @return string
     */</span>
    <span class="kw2">public</span> <span class="kw2">function</span> value<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="sy1">?&gt;</span></pre></div></div>
<p>You&#8217;ll notice the class is pretty small, and this class makes it easy to parse the contents of an LHIDF message (that said, you could take a more SAXy approach, as I&#8217;m doing in  Objective-C, and do much better in terms of memory, this is just a  simple example.)  To parse the example LHIDF, the code below would work:</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://blog.nephtaliproject.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="php" style="font-family:monospace;"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="kw2">class</span> Leader <span class="br0">&#123;</span>
	<span class="kw2">public</span> <span class="re0">$username</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$rank</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$time</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$rootNode</span> <span class="sy0">=</span> LHIDFNode<span class="sy0">::</span><span class="me2">getRootNode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="sy0">,</span> <span class="re0">$name</span> <span class="sy0">=</span> <span class="st_h">'leaders'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$leaderNodes</span> <span class="sy0">=</span> <span class="re0">$rootNode</span><span class="sy0">-&gt;</span><span class="me1">getChildren</span><span class="br0">&#40;</span><span class="re0">$name</span> <span class="sy0">=</span> <span class="st_h">'leader'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$leaderObjects</span> <span class="sy0">=</span> <a href="http://www.php.net/array" onclick="pageTracker._trackPageview('/outgoing/www.php.net/array?referer=');"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$leaderNodes</span> <span class="kw1">as</span> <span class="re0">$leader</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
	<span class="re0">$newLeaderObj</span> <span class="sy0">=</span> <span class="kw2">new</span> Leader<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$newLeaderObj</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="re0">$leader</span><span class="sy0">-&gt;</span><span class="me1">getChild</span><span class="br0">&#40;</span><span class="re0">$name</span> <span class="sy0">=</span> <span class="st_h">'username'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$newLeaderObj</span><span class="sy0">-&gt;</span><span class="me1">rank</span> <span class="sy0">=</span> <span class="re0">$leader</span><span class="sy0">-&gt;</span><span class="me1">getChild</span><span class="br0">&#40;</span><span class="re0">$name</span> <span class="sy0">=</span> <span class="st_h">'rank'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$newLeaderObj</span><span class="sy0">-&gt;</span><span class="me1">time</span> <span class="sy0">=</span> <span class="re0">$leader</span><span class="sy0">-&gt;</span><span class="me1">getChild</span><span class="br0">&#40;</span><span class="re0">$name</span> <span class="sy0">=</span> <span class="st_h">'time'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$leaderObjects</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$newLeaderObj</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="sy1">?&gt;</span></pre></div></div>
<p>So, what about the funny message ID&#8217;s, what do they do?  Well, the reason injection attacks work is that the attacker knows some of the general qualities of the intended structure of the message.</p>
<p>But, what if we wrote a data-interchange format and used it only once?  Attackers wouldn&#8217;t be able purposefully craft messages that alter the intended structure of a message if they didn&#8217;t know the message structure in the first place.  That said, changing the entire format every time you need to send a new message would prove very wasteful.  But, do you really need to change the entire format to neutralize injection attacks?</p>
<p>No, as it turns out you can just append a random message ID to the nodes your expecting, and now injection attacks are thwarted whilst maintaining a simplistic parsing scheme.  For instance, let&#8217;s say an attacker wanted to try and inject another leader node through the first username field, they might try injecting the following value:</p>
<pre>                       user_name1{username:111}
        {rank:111}1{rank:111}
        {time:111}1{time:111}
    {leader:111}
    {leader:111}
        {username:111}extra_username
</pre>
<p>A new message ID is randomly generated every message, so the attacker would now have to successfully guess the message ID of a particular message to perform the attack.  Because the message ID of the injection attempt above does not match the nodes of the current message, this username would all be parsed as one long, ugly username.  No injection!</p>
<p>Now, you might be wondering why the message ID is so small.  Eventually, an attacker could guess a 3 digit number.  However, LHIDF doesn&#8217;t care how big the message ID is, it just uses the root node to determine it&#8217;s value and then parses accordingly, so if you want more security, you can have it by using a larger number.  You just have to balance the security against the bandwith requirements of your particular application.</p>
<p>Finally, just to be clear, this isn&#8217;t a form of encryption or message signing.  There are already tried-and-true options out there for those needs.  This data-interchange format merely protects the intended structure of the message in this format, so if the message was intended to encode data for 2 leaders, the person decoding the message would also receive data for 2 and only 2 leaders.  If you go on to use the data from the message in a SQL query, as output on a XHTML page, or in an email, you&#8217;ll still have to properly validate and escape the data.  That said, I believe one could extend the above technologies to be injection resistant, too, such as augmenting XHTML so all tags and attributes include a randomly generated runtime message ID, thereby rendering injection attacks futile.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=28</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some refactoring</title>
		<link>http://blog.nephtaliproject.com/?p=20</link>
		<comments>http://blog.nephtaliproject.com/?p=20#comments</comments>
		<pubDate>Thu, 04 Mar 2010 19:39:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[New Release]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=20</guid>
		<description><![CDATA[The most recent release of Nephtali includes some basic refactoring of ncore.php.  The new file is now less than 2500 lines, and unzipped, is 84KB.  That is to say, the whole API is smaller in size than this image of Rasmus: [Source image found at Sebastian Bergmann's Flickr feed.]]]></description>
			<content:encoded><![CDATA[<p>The most recent release of Nephtali includes some basic refactoring of ncore.php.  The new file is now less than 2500 lines, and unzipped, is 84KB.  That is to say, the whole API is smaller in size than this image of Rasmus:</p>
<p><a href="http://blog.nephtaliproject.com/wp-content/uploads/2010/03/rasmus2.jpg"><img class="alignnone size-full wp-image-26" title="rasmus" src="http://blog.nephtaliproject.com/wp-content/uploads/2010/03/rasmus2.jpg" alt="Rasmus Lerdorf, creator of PHP" width="412" height="500" /></a></p>
<p>[Source image found at <a href="http://www.flickr.com/photos/sebastian_bergmann/173486562/" onclick="pageTracker._trackPageview('/outgoing/www.flickr.com/photos/sebastian_bergmann/173486562/?referer=');">Sebastian Bergmann's Flickr feed</a>.]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=20</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Templates are here</title>
		<link>http://blog.nephtaliproject.com/?p=18</link>
		<comments>http://blog.nephtaliproject.com/?p=18#comments</comments>
		<pubDate>Wed, 13 Jan 2010 09:11:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[New Feature]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=18</guid>
		<description><![CDATA[As I was working on integrating the caching capabilities (coming soon), I realized I should have a firm grasp of what any templating system might be.  And, as I &#8220;mighted&#8221; through a few days, eventually the templating system simply was Check it out, it&#8217;s simple, relatively efficient, and you can even nest templates if you&#8217;d [...]]]></description>
			<content:encoded><![CDATA[<p>As I was working on integrating the caching capabilities (coming soon), I realized I should have a firm grasp of what any templating system might be.  And, as I &#8220;mighted&#8221; through a few days, eventually the templating system simply was <img src='http://blog.nephtaliproject.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://docs.nephtaliproject.com/wiki/Templates" onclick="pageTracker._trackPageview('/outgoing/docs.nephtaliproject.com/wiki/Templates?referer=');">Check it out</a>, it&#8217;s simple, relatively efficient, and you can even nest templates if you&#8217;d like.  There&#8217;s also<a href="http://nephtaliproject.com/screencasts/" onclick="pageTracker._trackPageview('/outgoing/nephtaliproject.com/screencasts/?referer=');"> a screencast that walks you through the new templating capabilities</a>.</p>
<p>Now, back to getting the caching capabilities integrated.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=18</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s coming next?</title>
		<link>http://blog.nephtaliproject.com/?p=14</link>
		<comments>http://blog.nephtaliproject.com/?p=14#comments</comments>
		<pubDate>Fri, 08 Jan 2010 07:27:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[New Feature]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.nephtaliproject.com/?p=14</guid>
		<description><![CDATA[Currently I&#8217;m working on integrating a caching mechanism that will automatically integrate your tool of choice (APC, memcache, etc.) at several possible levels of granularity within a page request (whole page, pipe region, persistence.)  I hope to have the caching integrated within the next 2 weeks. Once I have the caching in place, I would [...]]]></description>
			<content:encoded><![CDATA[<p>Currently I&#8217;m working on integrating a caching mechanism that will automatically integrate your tool of choice (APC, memcache, etc.) at several possible levels of granularity within a page request (whole page, pipe region, persistence.)  I hope to have the caching integrated within the next 2 weeks.</p>
<p>Once I have the caching in place, I would like to develop a simple application using some of the other available PHP frameworks (CakePHP, CodeIgniter, perhaps Yii) to contrast the approaches for the different frameworks.  I hate seeing the comparison of frameworks using stupid &#8220;Hello World&#8221; examples.</p>
<p>Additionally, I&#8217;ll have a new screencast that walks you through some basic DB work with Nephtali in the next few days.</p>
<p>All this to say, things are still improving, and I hope you come back to check on the progress <img src='http://blog.nephtaliproject.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nephtaliproject.com/?feed=rss2&amp;p=14</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk
Database Caching using disk

Served from: blog.nephtaliproject.com @ 2010-09-08 04:51:00 -->