<?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>project-2501.net &#187; programming</title>
	<atom:link href="http://project-2501.net/index.php/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://project-2501.net</link>
	<description>The net is vast and infinite.</description>
	<lastBuildDate>Wed, 03 Feb 2010 08:51:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Intial Divine Guardian Tests</title>
		<link>http://project-2501.net/index.php/2010/02/intial-divine-guardian-tests/</link>
		<comments>http://project-2501.net/index.php/2010/02/intial-divine-guardian-tests/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 08:51:50 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[games]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=233</guid>
		<description><![CDATA[I been wanting to look in the effectiveness of the 20% raid wall granted by Divine Guardian (4th tier talent in a Paladin&#8217;s protection tree).  To do this I wrote a very simple Python program to read the combat log, detect with DG goes up and then record all the damage that was taken [...]]]></description>
			<content:encoded><![CDATA[<p>I been wanting to look in the effectiveness of the 20% raid wall granted by Divine Guardian (4th tier talent in a Paladin&#8217;s protection tree).  To do this I wrote a very simple Python program to read the combat log, detect with DG goes up and then record all the damage that was taken while it was present on a unit, and work out how much was mitigated.  Of course, as the script was hacked up, it has all sorts of limitations:</p>
<ul>
<li>Ignores Divine Sacrifice</li>
<li>Ignores any other mitigation effects (Talents / Sanc / Inspiration / etc)</li>
<li>Ignores overkills</li>
<li>Undefined behavior when used by two Paladins</li>
</ul>
<p>Below is the results for a two nights in ICC 25, while I&#8217;m sure it&#8217;s not 100% it should be a reasonable ballpark figure.</p>
<p><!-- Horrible CCS hacks to add padding back to my poor tables --></p>
<style>
.mytable_233 td, .mytable_233 th
{
padding: 0.3em;
}
</style>
<table class='mytable_233' cellspacing="0" cellpadding="2" cols="1" border="1" style="border: 1px solid #ccc; border-collapse: collapse;">
<tr>
<th>Fight</th>
<th>Damage Mitigated via DG</th>
</tr>
<tr>
<td>Gaseous Blight</td>
<td>37057</td>
</tr>
<tr>
<td>Gaseous Blight</td>
<td>32664</td>
</tr>
<tr>
<td>Ooze Explosion/Melee</td>
<td>39923</td>
</tr>
<tr>
<td>Trash before Blood Queen</td>
<td>21145</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>42212</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>54410</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>17679</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>29315</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>32029</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>51281</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>34494</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>14201</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>41417</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>18817</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>35641</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>49571</td>
</tr>
<tr>
<td>Blood Queen (Fear/Bloodbolt)</td>
<td>26427</td>
</tr>
<tr>
<td>Average</td>
<td>34017</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2010/02/intial-divine-guardian-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript; sending me insane</title>
		<link>http://project-2501.net/index.php/2010/01/javascript-sending-me-insane/</link>
		<comments>http://project-2501.net/index.php/2010/01/javascript-sending-me-insane/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 03:55:38 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=228</guid>
		<description><![CDATA[&#62;&#62;&#62; &#91;&#93;
&#91;&#93;
&#62;&#62;&#62; &#91;&#93; == true
false
&#62;&#62;&#62; &#91;&#93; == false
true
&#62;&#62;&#62; &#91;&#93; == &#91;&#93;
false
&#62;&#62;&#62; false == false
true
]]></description>
			<content:encoded><![CDATA[<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:540px"><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sy0">&gt;&gt;&gt;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
<span class="br0">&#91;</span><span class="br0">&#93;</span><br />
<span class="sy0">&gt;&gt;&gt;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="kw2">true</span><br />
<span class="kw2">false</span><br />
<span class="sy0">&gt;&gt;&gt;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="kw2">false</span><br />
<span class="kw2">true</span><br />
<span class="sy0">&gt;&gt;&gt;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
<span class="kw2">false</span><br />
<span class="sy0">&gt;&gt;&gt;</span> <span class="kw2">false</span> <span class="sy0">==</span> <span class="kw2">false</span><br />
<span class="kw2">true</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2010/01/javascript-sending-me-insane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>total mysql rows</title>
		<link>http://project-2501.net/index.php/2009/09/total-mysql-rows/</link>
		<comments>http://project-2501.net/index.php/2009/09/total-mysql-rows/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 01:50:04 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=213</guid>
		<description><![CDATA[Turns out our Mysql server at work is a little bigger than I thought:
Databases 75
Tables &#160; &#160;1,549
Rows &#160; &#160; &#160;1,018,085,348
However over the last couple of months, we&#8217;ve only averaged 130 queries/second
Hacked up PHP to gather stats:
class MysqlCounter
&#123;
&#160; &#160; public function __construct&#40;$host, $username, $password&#41;
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; $this-&#62;conn = mysql_connect&#40;$host, $username, $password, true&#41;;
&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Turns out our Mysql server at work is a little bigger than I thought:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:540px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">Databases 75<br />
Tables &nbsp; &nbsp;1,549<br />
Rows &nbsp; &nbsp; &nbsp;1,018,085,348</div></div>
<p>However over the last couple of months, we&#8217;ve only averaged 130 queries/second</p>
<p><strong>Hacked up PHP to gather stats:</strong></p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">class</span> MysqlCounter<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$host</span><span class="sy0">,</span> <span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span> <span class="sy0">=</span> <span class="kw3">mysql_connect</span><span class="br0">&#40;</span><span class="re0">$host</span><span class="sy0">,</span> <span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span> <span class="sy0">===</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Unable to connect to Mysql server: &quot;</span> <span class="sy0">.</span> <span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_databases</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_tables</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_rows</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> query<span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> <span class="sy0">=</span> <span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="re0">$sql</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$query</span> <span class="sy0">===</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Unable to run query: <span class="es4">$sql</span><span class="es1">\n</span>&quot;</span> <span class="sy0">.</span> <span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$query</span> <span class="sy0">===</span> <span class="kw2">true</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$rows</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="re0">$row</span> <span class="sy0">=</span> <span class="kw3">mysql_fetch_array</span><span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$rows</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$row</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$rows</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> gather_stats<span class="br0">&#40;</span><span class="re0">$callback</span> <span class="sy0">=</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SHOW DATABASES&quot;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$row_database</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_databases</span><span class="sy0">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;USE `<span class="es4">{$row_database['Database']}</span>`&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SHOW TABLE STATUS&quot;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$row_table</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_tables</span><span class="sy0">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_rows</span> <span class="sy0">+=</span> <span class="re0">$row_table</span><span class="br0">&#91;</span><span class="st_h">'Rows'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$callback</span> <span class="sy0">!==</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$args</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$row_database</span><span class="br0">&#91;</span><span class="st_h">'Database'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$row_table</span><span class="br0">&#91;</span><span class="st_h">'Name'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$row_table</span><span class="br0">&#91;</span><span class="st_h">'Rows'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">call_user_func_array</span><span class="br0">&#40;</span><span class="re0">$callback</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw3">static</span> <span class="kw2">function</span> default_callback<span class="br0">&#40;</span><span class="re0">$database</span><span class="sy0">,</span> <span class="re0">$table</span><span class="sy0">,</span> <span class="re0">$rows</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es6">%s</span> <span class="es6">%s</span> <span class="es6">%d</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$database</span><span class="sy0">,</span> <span class="re0">$table</span><span class="sy0">,</span> <span class="re0">$rows</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">$counter</span> <span class="sy0">=</span> <span class="kw2">new</span> MysqlCounter<span class="br0">&#40;</span><span class="st_h">'hostname'</span><span class="sy0">,</span> <span class="st_h">'username'</span><span class="sy0">,</span> <span class="st_h">'password'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$counter</span><span class="sy0">-&gt;</span><span class="me1">gather_stats</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'MysqlCounter'</span><span class="sy0">,</span> <span class="st_h">'default_callback'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
<span class="kw3">echo</span> <span class="st0">&quot;Databases <span class="es4">{$counter-&gt;num_databases}</span><span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;Tables &nbsp; &nbsp;<span class="es4">{$counter-&gt;num_tables}</span><span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;Rows &nbsp; &nbsp; &nbsp;<span class="es4">{$counter-&gt;num_rows}</span><span class="es1">\n</span>&quot;</span><span class="sy0">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2009/09/total-mysql-rows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WoW Combat Log Splitter</title>
		<link>http://project-2501.net/index.php/2009/09/wow-combat-log-splitter/</link>
		<comments>http://project-2501.net/index.php/2009/09/wow-combat-log-splitter/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 07:55:11 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[games]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=199</guid>
		<description><![CDATA[Something quick I whipped up last night, after noticing that after my log file was > 4GB the WorldOfLogs parser will no longer do real time logging.
Edit: Turns out that the WoW client itself stopped logging, even though the log file was a little over expected limit (4,334,806,196 bytes)
Note: The code is just a one [...]]]></description>
			<content:encoded><![CDATA[<p>Something quick I whipped up last night, after noticing that after my log file was > 4GB the <a href="http://www.worldoflogs.com/">WorldOfLogs</a> parser will no longer do real time logging.</p>
<p><strong>Edit:</strong> Turns out that the WoW client itself stopped logging, even though the log file was a little over expected limit (4,334,806,196 bytes)</p>
<p><em>Note: The code is just a one off script; things are hard coded, and it&#8217;s pretty slow (100MB a minute)</em></p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1">#!/usr/bin/env python</span><br />
<br />
<span class="kw1">import</span> <span class="kw3">re</span><br />
<span class="kw1">import</span> <span class="kw3">datetime</span><br />
<br />
GAP_SIZE_IN_SECONDS = <span class="nu0">60</span> <span class="sy0">*</span> <span class="nu0">60</span><br />
<br />
<span class="kw1">class</span> CombatLog:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, filename<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">filename</span> = filename<br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> process<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; last_timestamp = <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; line_count = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; split_log = <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> line <span class="kw1">in</span> <span class="kw2">open</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">filename</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line_count += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timestamp = <span class="kw2">self</span>.<span class="me1">parse_timestamp</span><span class="br0">&#40;</span>line<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> timestamp == <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Unparsable data on line %d&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>line_count,<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="kw3">repr</span><span class="br0">&#40;</span>line<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># To handle the first line</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> last_timestamp == <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; last_timestamp = timestamp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; split_log = Appender<span class="br0">&#40;</span>timestamp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Starting new file&quot;</span>, split_log.<span class="me1">filename</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; difference = timestamp - last_timestamp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> difference.<span class="me1">seconds</span> <span class="sy0">&gt;</span> GAP_SIZE_IN_SECONDS:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Close the old log file, and start a new one</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; split_log.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; split_log = Appender<span class="br0">&#40;</span>timestamp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Starting new file&quot;</span>, split_log.<span class="me1">filename</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; split_log.<span class="me1">append</span><span class="br0">&#40;</span>line<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; last_timestamp = timestamp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> line_count <span class="sy0">%</span> <span class="nu0">100000</span> == <span class="nu0">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Processed %d lines&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>line_count,<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> parse_timestamp<span class="br0">&#40;</span><span class="kw2">self</span>, line<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># m/d hh:mm:ss.msec</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># 6/6 21:04:29.435</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; regex = r<span class="st0">&quot;^(<span class="es0">\d</span>+)/(<span class="es0">\d</span>+) (<span class="es0">\d</span>+):(<span class="es0">\d</span>+):(<span class="es0">\d</span>+).(<span class="es0">\d</span>+) &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; matches = <span class="kw3">re</span>.<span class="me1">search</span><span class="br0">&#40;</span>regex, line<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> matches == <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; timestamp = <span class="kw3">datetime</span>.<span class="kw3">datetime</span><span class="br0">&#40;</span><span class="nu0">2009</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">int</span><span class="br0">&#40;</span>matches.<span class="me1">group</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">int</span><span class="br0">&#40;</span>matches.<span class="me1">group</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">int</span><span class="br0">&#40;</span>matches.<span class="me1">group</span><span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">int</span><span class="br0">&#40;</span>matches.<span class="me1">group</span><span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">int</span><span class="br0">&#40;</span>matches.<span class="me1">group</span><span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">int</span><span class="br0">&#40;</span>matches.<span class="me1">group</span><span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">*</span><span class="nu0">1000</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> timestamp<br />
<br />
<br />
<span class="kw1">class</span> Appender:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, timestamp<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">filename</span> = <span class="st0">&quot;WoWCombatLog_&quot;</span> + timestamp.<span class="me1">strftime</span><span class="br0">&#40;</span><span class="st0">&quot;%Y%m%d_%H%M%S&quot;</span><span class="br0">&#41;</span> + <span class="st0">&quot;.txt&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">handle</span> = <span class="kw2">open</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">filename</span>, <span class="st0">'a'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> append<span class="br0">&#40;</span><span class="kw2">self</span>, line<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">handle</span>.<span class="me1">write</span><span class="br0">&#40;</span>line<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> close<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">handle</span>.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
<br />
splitter = CombatLog<span class="br0">&#40;</span><span class="st0">&quot;../WoWCombatLog.20090904.txt&quot;</span><span class="br0">&#41;</span><br />
splitter.<span class="me1">process</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
<span class="kw1">print</span> <span class="st0">&quot;Done&quot;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2009/09/wow-combat-log-splitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>array_unique javascript snippet</title>
		<link>http://project-2501.net/index.php/2009/02/array_unique-javascript-snippet/</link>
		<comments>http://project-2501.net/index.php/2009/02/array_unique-javascript-snippet/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 06:07:34 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=139</guid>
		<description><![CDATA[function array_unique&#40;a&#41;
&#123;
&#160; &#160; return a.reduce&#40;function&#40;u, e&#41;
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; if&#40;!&#40;e in u&#41;&#41;
&#160; &#160; &#160; &#160; &#160; &#160; u.push&#40;e&#41;;

&#160; &#160; &#160; &#160; return u;
&#160; &#160; &#125;, &#91;&#93;&#41;;
&#125;
]]></description>
			<content:encoded><![CDATA[<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:540px"><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">function</span> array_unique<span class="br0">&#40;</span>a<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> a.<span class="me1">reduce</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>u<span class="sy0">,</span> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span>e <span class="kw1">in</span> u<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; u.<span class="me1">push</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> u<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2009/02/array_unique-javascript-snippet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript map-sort</title>
		<link>http://project-2501.net/index.php/2009/01/javascript-map-sort/</link>
		<comments>http://project-2501.net/index.php/2009/01/javascript-map-sort/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 08:30:05 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=92</guid>
		<description><![CDATA[I&#8217;m sure sorting method has a real name, but I&#8217;ve had no luck searching for it.
function mapSort&#40;array, mapFunction, sortFunction&#41;
&#123;
&#160; &#160; // Store both original value, and transformed value
&#160; &#160; var mapData = array.map&#40;function&#40;e&#41;
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; return &#91;e, mapFunction&#40;e&#41;&#93;;
&#160; &#160; &#125;&#41;;
&#160; &#160; 
&#160; &#160; // Sort the data using the second element of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sure sorting method has a real name, but I&#8217;ve had no luck searching for it.</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">function</span> mapSort<span class="br0">&#40;</span>array<span class="sy0">,</span> mapFunction<span class="sy0">,</span> sortFunction<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">// Store both original value, and transformed value</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> mapData <span class="sy0">=</span> array.<span class="me1">map</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#91;</span>e<span class="sy0">,</span> mapFunction<span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// Sort the data using the second element of each array item (the mapped one)</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> sortedData <span class="sy0">=</span> mapData.<span class="me1">sort</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>a<span class="sy0">,</span> b<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sortFunction<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span> b<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// Remove the extra transformed value from the sorted array</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> sortedData.<span class="me1">map</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> e<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="co1">// Example</span><br />
<br />
<span class="kw2">var</span> data <span class="sy0">=</span> <span class="br0">&#91;</span><span class="st0">&quot;a&quot;</span><span class="sy0">,</span> <span class="st0">&quot;b&quot;</span><span class="sy0">,</span> <span class="st0">&quot;A&quot;</span><span class="sy0">,</span> <span class="st0">&quot;B&quot;</span><span class="sy0">,</span> <span class="st0">&quot;C&quot;</span><span class="sy0">,</span> <span class="st0">&quot;c&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<span class="kw2">var</span> cmp &nbsp;<span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>a<span class="sy0">,</span> b<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> a <span class="sy0">&gt;</span> b<span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="kw2">var</span> map &nbsp;<span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>ch<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> ch.<span class="me1">toLowerCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp;<br />
<span class="kw3">print</span><span class="br0">&#40;</span><span class="st0">&quot;Normal: &nbsp; &quot;</span> <span class="sy0">+</span> data.<span class="me1">sort</span><span class="br0">&#40;</span>cmp<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">print</span><span class="br0">&#40;</span><span class="st0">&quot;Map Sort: &quot;</span> <span class="sy0">+</span> mapSort<span class="br0">&#40;</span>data<span class="sy0">,</span> map<span class="sy0">,</span> cmp<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Normal: &nbsp; A,B,C,a,b,c</span><br />
<span class="co1">// Map Sort: a,A,B,b,c,C</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2009/01/javascript-map-sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>i hate working with dates</title>
		<link>http://project-2501.net/index.php/2008/08/i-hate-working-with-dates/</link>
		<comments>http://project-2501.net/index.php/2008/08/i-hate-working-with-dates/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 01:45:10 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=85</guid>
		<description><![CDATA[This little snippet gets all the days in a month, and groups them by week.
&#60;?php

&#160; &#160; error_reporting&#40;E_ALL&#41;;

&#160; &#160; // Return an array of all the days in a month grouped by week number
&#160; &#160; // (Sunday is considered to be the first day of the week)
&#160; &#160; function weeksInMonth&#40;$month, $year&#41;
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>This little snippet gets all the days in a month, and groups them by week.</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">error_reporting</span><span class="br0">&#40;</span><span class="kw2">E_ALL</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Return an array of all the days in a month grouped by week number</span><br />
&nbsp; &nbsp; <span class="co1">// (Sunday is considered to be the first day of the week)</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> weeksInMonth<span class="br0">&#40;</span><span class="re0">$month</span><span class="sy0">,</span> <span class="re0">$year</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$firstDay</span> &nbsp; &nbsp;<span class="sy0">=</span> <span class="kw3">mktime</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="re0">$month</span><span class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> <span class="re0">$year</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$daysInMonth</span> <span class="sy0">=</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'t'</span><span class="sy0">,</span> <span class="re0">$firstDay</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$week</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$breakdown</span> &nbsp; <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &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="re0">$daysInMonth</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$date</span> <span class="sy0">=</span> <span class="kw3">mktime</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="re0">$month</span><span class="sy0">,</span> <span class="re0">$i</span><span class="sy0">,</span> <span class="re0">$year</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$day</span> &nbsp;<span class="sy0">=</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'l'</span><span class="sy0">,</span> <span class="re0">$date</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Sunday triggers the start of a new week, except if it's </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// also the first day of the month.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$day</span> <span class="sy0">==</span> <span class="st_h">'Sunday'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">!=</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$week</span><span class="sy0">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$breakdown</span><span class="br0">&#91;</span><span class="re0">$week</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$date</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$breakdown</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="re0">$results</span> <span class="sy0">=</span> monthToWeek<span class="br0">&#40;</span><span class="nu0">6</span><span class="sy0">,</span> <span class="nu0">2008</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;There are <span class="es6">%d</span> weeks in June 2008<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$results</span> <span class="kw1">as</span> <span class="re0">$weekNumber</span> <span class="sy0">=&gt;</span> <span class="re0">$days</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Week <span class="es6">%d</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$weekNumber</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$days</span> <span class="kw1">as</span> <span class="re0">$day</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es6">%10s</span> &nbsp;<span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st0">&quot;l&quot;</span><span class="sy0">,</span> <span class="re0">$day</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st0">&quot;Y-m-d&quot;</span><span class="sy0">,</span> <span class="re0">$day</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/*<br />
There are 5 weeks in June 2008<br />
<br />
Week 1<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-01<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-02<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-03<br />
&nbsp;Wednesday &nbsp;2008-06-04<br />
&nbsp; Thursday &nbsp;2008-06-05<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-06<br />
&nbsp; Saturday &nbsp;2008-06-07<br />
<br />
Week 2<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-08<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-09<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-10<br />
&nbsp;Wednesday &nbsp;2008-06-11<br />
&nbsp; Thursday &nbsp;2008-06-12<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-13<br />
&nbsp; Saturday &nbsp;2008-06-14<br />
<br />
Week 3<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-15<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-16<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-17<br />
&nbsp;Wednesday &nbsp;2008-06-18<br />
&nbsp; Thursday &nbsp;2008-06-19<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-20<br />
&nbsp; Saturday &nbsp;2008-06-21<br />
<br />
Week 4<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-22<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-23<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-24<br />
&nbsp;Wednesday &nbsp;2008-06-25<br />
&nbsp; Thursday &nbsp;2008-06-26<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-27<br />
&nbsp; Saturday &nbsp;2008-06-28<br />
<br />
Week 5<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-29<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-30<br />
*/</span><br />
<span class="sy1">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/08/i-hate-working-with-dates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extracing links from HTML using PHP</title>
		<link>http://project-2501.net/index.php/2008/05/extracing-links-from-html-using-php/</link>
		<comments>http://project-2501.net/index.php/2008/05/extracing-links-from-html-using-php/#comments</comments>
		<pubDate>Thu, 01 May 2008 07:30:31 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=79</guid>
		<description><![CDATA[Many months ago there was a PHP competition to make the smallest script to extract all the links from a document.  I&#8217;ve lost a link to the actual site, but the rules and conditions were set up expecting everyone to solve the problem with regular expressions.  In my opinion relying on regular expressions [...]]]></description>
			<content:encoded><![CDATA[<p>Many months ago there was a PHP competition to make the smallest script to extract all the links from a document.  I&#8217;ve lost a link to the actual site, but the rules and conditions were set up expecting everyone to solve the problem with regular expressions.  In my opinion relying on regular expressions to parse HTML would be a terrible idea (and may actually be impossible to do with a normal engine), so I tried a slightly different approach:</p>
<h3>Program listing.  162 Bytes.</h3>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span> <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="sy0">@</span>DOMDocument<span class="sy0">::</span><span class="me2">loadHTMLFile</span><span class="br0">&#40;</span><span class="re0">$argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$t</span><span class="br0">&#41;</span><span class="sy0">@</span><span class="re0">$u</span><span class="br0">&#91;</span><span class="re0">$t</span><span class="sy0">-&gt;</span><span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st_h">'href'</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>foreach<span class="br0">&#40;</span><span class="re0">$u</span> <span class="kw1">as</span> <span class="re0">$k</span><span class="sy0">=&gt;</span><span class="re0">$v</span><span class="br0">&#41;</span><span class="kw3">echo</span> <span class="re0">$k</span><span class="sy0">!=</span><span class="st_h">''</span>?<span class="st0">&quot;<span class="es4">$k</span><span class="es1">\n</span>&quot;</span><span class="sy0">:</span><span class="st_h">''</span><span class="sy0">;</span><span class="sy1">?&gt;</span></div></div>
<h3>Expanded program listing with comments</h3>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Using PHP DOMDocument class, we load in a HTML file from the </span><br />
&nbsp; &nbsp; <span class="co1">// command line and extract all the 'a' tags. &nbsp;The '@' is used to </span><br />
&nbsp; &nbsp; <span class="co1">// suppress any parse errors</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="sy0">@</span>DOMDocument<span class="sy0">::</span><span class="me2">loadHTMLFile</span><span class="br0">&#40;</span><span class="re0">$argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$t</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// We get the value of the href attribute and store is as a </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// key in $u. &nbsp;This is so each URL only appears once without </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// having to call array_unique(). &nbsp;'@' is used to suppress the </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// error when we add the first element to a non-existent array </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// $u (which PHP then kindly creates for us)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">@</span><span class="re0">$u</span><span class="br0">&#91;</span><span class="re0">$t</span><span class="sy0">-&gt;</span><span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st_h">'href'</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// Finally we iterate over the array of URLS ($u) and if the key </span><br />
&nbsp; &nbsp; <span class="co1">// (which is the actual URL) is empty don't do anything, else print</span><br />
&nbsp; &nbsp; <span class="co1">// the url followed by a new line.</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$u</span> <span class="kw1">as</span> <span class="re0">$k</span><span class="sy0">=&gt;</span><span class="re0">$v</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$k</span> <span class="sy0">!=</span> <span class="st_h">''</span> ? <span class="st0">&quot;<span class="es4">$k</span><span class="es1">\n</span>&quot;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="sy1">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/05/extracing-links-from-html-using-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple type checking in PHP</title>
		<link>http://project-2501.net/index.php/2008/04/simple-type-checking-in-php/</link>
		<comments>http://project-2501.net/index.php/2008/04/simple-type-checking-in-php/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 12:59:41 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=78</guid>
		<description><![CDATA[&#60;?php

&#160; &#160; error_reporting&#40;E_ALL &#124; E_STRICT&#41;;

/*

Manual optional type checking for PHP functions
&#160; &#160; 
Basic example:
&#160; &#160; 
&#160; &#160; function log_error($line_number, $filename, $desc)
&#160; &#160; {
&#160; &#160; &#160; &#160; CheckFunctionArgs('integer', 'string', 'string');
&#160; &#160; &#160; &#160; [snip]
&#160; &#160; }
&#160; &#160; 
Object example:
&#160; &#160; 
&#160; &#160; class LogObject {}
&#160; &#160; function register_object($obj)
&#160; &#160; {
&#160; &#160; &#160; &#160; //&#160; Check for [...]]]></description>
			<content:encoded><![CDATA[<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">error_reporting</span><span class="br0">&#40;</span><span class="kw2">E_ALL</span> <span class="sy0">|</span> <span class="kw2">E_STRICT</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="coMULTI">/*<br />
<br />
Manual optional type checking for PHP functions<br />
&nbsp; &nbsp; <br />
Basic example:<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; function log_error($line_number, $filename, $desc)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('integer', 'string', 'string');<br />
&nbsp; &nbsp; &nbsp; &nbsp; [snip]<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; <br />
Object example:<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; class LogObject {}<br />
&nbsp; &nbsp; function register_object($obj)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; Check for an object<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('object');&nbsp; &nbsp; <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; When an object is passed, you can optionally check for the class name<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('LogObject');<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; [snip]<br />
&nbsp; &nbsp; }<br />
<br />
Wildcard example:<br />
<br />
&nbsp; &nbsp; function log_anything($line, $thing)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; '*' really means anything, included true/false/null or an empty string<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; however it doesn't mean the argument in optional<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('integer', '*');<br />
&nbsp; &nbsp; }<br />
<br />
Notes:<br />
<br />
&nbsp; &nbsp; Throws an exception on error<br />
&nbsp; &nbsp; No support for functions that take a variable number of arguments<br />
&nbsp; &nbsp; Must define the types of all arguments<br />
&nbsp; &nbsp; The type '*' acts as a wild card, matching anything (including null)<br />
&nbsp; &nbsp; Works with public and private methods in classes<br />
&nbsp; &nbsp; <br />
*/</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> CheckFunctionArgs<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$types</span> <span class="sy0">=</span> <span class="kw3">func_get_args</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$stack</span> <span class="sy0">=</span> <span class="kw3">debug_backtrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Make sure there is some stack information</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Stack[1] contains the details about the function that called this function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;No function stack present. &nbsp;Make sure CheckFunctionArgs() isn't called from the global scope&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; The arguments that were passed to the function we are checking</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$arguments</span> <span class="sy0">=</span> <span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'args'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Get the name of the class/function/file</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$functionClass</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'class'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'class'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="st0">&quot;::&quot;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$functionFile</span> &nbsp;<span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'file'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'file'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">':'</span> <span class="sy0">.</span> <span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'line'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">'[No file information]'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$functionName</span> &nbsp;<span class="sy0">=</span> <span class="st0">&quot;<span class="es4">{$functionClass}</span><span class="es4">{$stack[1]['function']}</span>()&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Basic check, make sure the correct numbers of arguments were passed</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$types</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$passed</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$expected</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$types</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Incorrect number of argumemts passed to <span class="es4">{$functionName}</span> in <span class="es4">{$functionFile}</span>. &nbsp;Expected <span class="es4">{$expected}</span> got <span class="es4">{$passed}</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Now try and check each argument</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="re0">$i</span> <span class="sy0">&lt;</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Allow a check to be skiped, if the type equals '*'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$types</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="st_h">'*'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$argumentType</span> <span class="sy0">=</span> <span class="kw3">gettype</span><span class="br0">&#40;</span><span class="re0">$arguments</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><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Check basic types like integer/object ect</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$argumentType</span> <span class="sy0">==</span> <span class="re0">$types</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Check to see if the type matches the classname of an object</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$argumentType</span> <span class="sy0">==</span> <span class="st_h">'object'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="kw3">get_class</span><span class="br0">&#40;</span><span class="re0">$arguments</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="re0">$types</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><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Incorrect argument passed to <span class="es4">{$functionName}</span> in <span class="es4">{$functionFile}</span>. &nbsp;Argument <span class="es4">{$i}</span> was type <span class="es4">{$argumentType}</span> expected {<span class="es4">$types</span>[<span class="es4">$i</span>]}&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Some really basic tests</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> assertException<span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">call_user_func_array</span><span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st0">&quot;Error: No exception thrown in function <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$fun</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; catch<span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> assertNoException<span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">call_user_func_array</span><span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; catch<span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st0">&quot;Error: Exception thrown in function <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$fun</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> test_string<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'string'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'abc'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'123'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="sy0">@</span>assertException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">123</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> test_integer<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'integer'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">123</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="sy0">@</span>assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu19">1.0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu19">1.2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> test_wildcard<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'*'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">1233</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="sy0">@</span>assertException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">class</span> Foobar <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="re0">$foobar</span> <span class="sy0">=</span> <span class="kw2">new</span> Foobar<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> test_classname<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'Foobar'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'object'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_classname'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$foobar</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_classname'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'Foobar'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="sy1">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/04/simple-type-checking-in-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>sizeof(int) = 68</title>
		<link>http://project-2501.net/index.php/2008/04/sizeofint-68/</link>
		<comments>http://project-2501.net/index.php/2008/04/sizeofint-68/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 00:03:02 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=77</guid>
		<description><![CDATA[Pankaj Kumar has a slightly disturbing look at memory usage in PHP.
Each element requires a value structure (zval) which takes 16 bytes.
Also requires a hash bucket &#8211; which takes 36 bytes. That gives 52 bytes
per value. Memory allocation headers take another 8 bytes*2 &#8211; which
gives 68 bytes. Pretty close to what you have.
]]></description>
			<content:encoded><![CDATA[<p>Pankaj Kumar has a slightly disturbing look at <a href="http://pankaj-k.net/weblog/2008/03/did_you_know_that_each_integer.html">memory usage in PHP</a>.</p>
<blockquote><p>Each element requires a value structure (zval) which takes 16 bytes.<br />
Also requires a hash bucket &#8211; which takes 36 bytes. That gives 52 bytes<br />
per value. Memory allocation headers take another 8 bytes*2 &#8211; which<br />
gives 68 bytes. Pretty close to what you have.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/04/sizeofint-68/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
