<?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>CodeWord: Apokalyptik &#187; API</title>
	<atom:link href="http://blog.apokalyptik.com/category/api/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.apokalyptik.com</link>
	<description>The random things that spew forth from my brain...</description>
	<lastBuildDate>Mon, 15 Mar 2010 17:42:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=3.0-alpha</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Howto: Enable regular expression highlighting in LimeChat</title>
		<link>http://blog.apokalyptik.com/2009/10/06/howto-enable-regular-expression-highlighting-in-limechat/</link>
		<comments>http://blog.apokalyptik.com/2009/10/06/howto-enable-regular-expression-highlighting-in-limechat/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 18:25:03 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Ruby (on or off) Rails]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=464</guid>
		<description><![CDATA[in LimeChat.app/Contents/Resources/logrenderer.rb around line 419&#8230; WFM. IANAL. YMMV. RTFM. OMGWTF. WTL. GTFO. ETC.

    words.each do &#124;w&#124;
      next if w.empty?
      s = body
      offset = 0
# &#60;edit was=&#34;rex = Regexp.new(Regexp.escape(w), true)&#34;&#62;
      rex = [...]]]></description>
			<content:encoded><![CDATA[<p>in LimeChat.app/Contents/Resources/logrenderer.rb around line 419&#8230; WFM. IANAL. YMMV. RTFM. OMGWTF. WTL. GTFO. ETC.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">    words.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>w<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#9966CC; font-weight:bold;">next</span> <span style="color:#9966CC; font-weight:bold;">if</span> w.<span style="color:#9900CC;">empty</span>?
      s = body
      offset = <span style="color:#006666;">0</span>
<span style="color:#008000; font-style:italic;"># &lt;edit was=&quot;rex = Regexp.new(Regexp.escape(w), true)&quot;&gt;</span>
      rex = <span style="color:#CC00FF; font-weight:bold;">Regexp</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>w, <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># &lt;/edit&gt;</span>
      <span style="color:#9966CC; font-weight:bold;">while</span> rex =~ s
<span style="color:#008000; font-style:italic;"># &lt;edit&gt;</span>
        <span style="color:#9966CC; font-weight:bold;">begin</span>
<span style="color:#008000; font-style:italic;"># &lt;/edit&gt;</span>
          left = $~.<span style="color:#9966CC; font-weight:bold;">begin</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
          right = $~.<span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
          pre = $~.<span style="color:#9900CC;">pre_match</span>
          post = $~.<span style="color:#9900CC;">post_match</span>
          ok = <span style="color:#0000FF; font-weight:bold;">true</span>
&nbsp;
          <span style="color:#9966CC; font-weight:bold;">if</span> exact_word_match
            <span style="color:#9966CC; font-weight:bold;">if</span> !pre.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> alphabetic?<span style="color:#006600; font-weight:bold;">&#40;</span>w.<span style="color:#9900CC;">first_char</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> alphabetic?<span style="color:#006600; font-weight:bold;">&#40;</span>pre.<span style="color:#9900CC;">last_char</span><span style="color:#006600; font-weight:bold;">&#41;</span>
              ok = <span style="color:#0000FF; font-weight:bold;">false</span>
            <span style="color:#9966CC; font-weight:bold;">elsif</span> !post.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> alphabetic?<span style="color:#006600; font-weight:bold;">&#40;</span>w.<span style="color:#9900CC;">last_char</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> alphabetic?<span style="color:#006600; font-weight:bold;">&#40;</span>post.<span style="color:#9900CC;">first_char</span><span style="color:#006600; font-weight:bold;">&#41;</span>
              ok = <span style="color:#0000FF; font-weight:bold;">false</span>
            <span style="color:#9966CC; font-weight:bold;">end</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
          <span style="color:#9966CC; font-weight:bold;">if</span> ok
            keywords <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:pos</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> offset<span style="color:#006600; font-weight:bold;">+</span>left, <span style="color:#ff3333; font-weight:bold;">:len</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> right<span style="color:#006600; font-weight:bold;">-</span>left <span style="color:#006600; font-weight:bold;">&#125;</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
          s = post
          offset <span style="color:#006600; font-weight:bold;">+</span>= right
<span style="color:#008000; font-style:italic;"># &lt;edit&gt;</span>
        <span style="color:#9966CC; font-weight:bold;">rescue</span>
          <span style="color:#9966CC; font-weight:bold;">next</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#008000; font-style:italic;"># &lt;/edit&gt;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/10/06/howto-enable-regular-expression-highlighting-in-limechat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quality Time With Your JPEGs</title>
		<link>http://blog.apokalyptik.com/2009/09/16/quality-time-with-your-jpegs/</link>
		<comments>http://blog.apokalyptik.com/2009/09/16/quality-time-with-your-jpegs/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 07:02:19 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SRSLY]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[WTF]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=456</guid>
		<description><![CDATA[When working with user provided images in PHP you run into a problem.  Lets say that you want to generate thumbnails of uploaded JPEGs for users.  This  is a fairly common use case where you would employ PHP and GD (the most prevalent php image extension.)  But when you generate the [...]]]></description>
			<content:encoded><![CDATA[<p>When working with user provided images in PHP you run into a problem.  Lets say that you want to generate thumbnails of uploaded JPEGs for users.  This  is a fairly common use case where you would employ PHP and GD (the most prevalent php image extension.)  But when you generate the new, smaller, image what quality setting do you use?  If your quality setting is too low then the image is distorted unacceptably.  Likewise if your quality setting is too high then you produce a dimensionally smaller image with a larger size in bytes than the original.  So what do you do when you want to satisfy all cases?  Well the obvious answer is that you should use the same JPEG quality setting that the image had when it was uploading.  Now&#8230; Using PHP and GD tell me how you accomplish this.</p>
<p>Go ahead</p>
<p>I&#8217;ll wait</p>
<p>You can&#8217;t, can you? If you&#8217;re really sneaky you might be thinking about just pulling the data out of the binary stream, and if you&#8217;re a linux nut you&#8217;re probably sitting there muttering &#8220;just use identify (a la imagemagick)&#8221;.  Of course if you try that under heavy traffic you&#8217;ll soon discover that it kills your servers.  Just for reference I&#8217;ll share that code with you (not everyone is serving 2g/sec in dynamic image traffic after all). We already have the binary data in ram in the $rval variable, in case you were curious.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// define how we will deal with stdin, stdout, and stderr </span>
<span style="color: #000088;">$descriptorspec</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;r&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;a&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// run identify, -verbose required, - means read file from stdin</span>
<span style="color: #000088;">$process</span> <span style="color: #339933;">=</span> <span style="color: #990000;">proc_open</span><span style="color: #009900;">&#40;</span> IDENTIFY <span style="color: #339933;">.</span> <span style="color: #0000ff;">' -verbose -'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$descriptorspec</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pipes</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #339933;">!==</span> <span style="color: #000088;">$process</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// pipe the image data through it to its stdin</span>
	<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rval</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// close stdin to allow identify to process</span>
	<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// read the results of the program execution</span>
	<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stream_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// clean up open file handles</span>
	<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Unix return value of 0 means success</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">==</span> <span style="color: #990000;">proc_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$process</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// pull out the image quality from identify output</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'#Quality: ([0-9]+)[^0-9]#'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$results</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$origin_quality</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$m</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// detect when something goes wrong above</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$origin_quality</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$origin_quality</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>So, since this consumes too much of our available resources (especially ram and cpu usage since identify fully decompresses and reads the image into a raw state for processing&#8230; hundreds of MB of ram, which you can limit but then it becomes unbearably slow&#8230;) that&#8217;s out. What now? If you&#8217;re really extra sneaky you&#8217;re thinking that you should be able to read the setting out of the binary data&#8230; there should be a header after all, right? Well&#8230; Yes there is a header but &#8220;quality&#8221; is not a &#8220;setting&#8221; its more a measure of how compressed the image is&#8230; which isn&#8217;t exactly recorded either&#8230; at least&#8230; not as an integer value.  The compression matrix used to preform JPEGs lossy compression *IS* stored in a header.. and it turns out this is what the ImageMagick code uses to give us that quality setting. So I set out to reproduce this in PHP.</p>
<p>I know&#8230; I&#8217;m a masochist.</p>
<p>Thanks to some serious google-fu (and possibly a note in a php online doc manual relating to IPC, I don&#8217;t remember which of the two led me to the package first) I found that there&#8217;s already some code out there which deals with the nasty bits of reading raw JPEG headers (though not doing what I want with the header that I want) in the <a href="http://www.ozhiker.com/electronics/pjmt/">PHP JPEG Metadata Toolkit</a> And the instructions for evaluating the header we can then pull is in the <a href="http://www.imagemagick.org/script/index.php">ImageMagick</a> source code (coders/jpeg.c)</p>
<p>When we put the two together and modify it a bit to suite our needs (i.e. reading from the in-memory buffer, pulling just the right header from the jpeg file, etc) we get this code&#8230; and finally the ability to call $quality = get_jpeg_quality( $rval );  In my test (yea just one or two&#8230; very scientific like), this over 100 times faster than using the proc_open and executable method, uses less ram (a lot lot lot lot lot less ram) and generally just doesn&#8217;t suck as much.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> get_jpeg_header_data<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #000088;">$want</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
	<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> buffer_read<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Read the first two characters</span>
	<span style="color: #666666; font-style: italic;">// Check that the first two characters are 0xFF 0xDA  (SOI - Start of image)</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\xFF</span><span style="color: #660099; font-weight: bold;">\xD8</span>&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// No SOI (FF D8) at start of file - This probably isn't a JPEG file - close file and return;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> buffer_read<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Read the third character</span>
	<span style="color: #666666; font-style: italic;">// Check that the third character is 0xFF (Start of first segment header)</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\xFF</span>&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// NO FF found - close file and return - JPEG is probably corrupted</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// Cycle through the file until, one of: </span>
	<span style="color: #666666; font-style: italic;">//   1) an EOI (End of image) marker is hit,</span>
	<span style="color: #666666; font-style: italic;">//   2) we have hit the compressed image data (no more headers are allowed after data)</span>
	<span style="color: #666666; font-style: italic;">//   3) or end of file is hit</span>
	<span style="color: #000088;">$hit_compressed_image_data</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\xD9</span>&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$hit_compressed_image_data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
		<span style="color: #666666; font-style: italic;">// Found a segment to look at.</span>
		<span style="color: #666666; font-style: italic;">// Check that the segment marker is not a Restart marker - restart markers don't have size or data after them</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>  <span style="color: #009900;">&#40;</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #208080;">0xD0</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #208080;">0xD7</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Segment isn't a Restart marker</span>
			<span style="color: #000088;">$sizestr</span> <span style="color: #339933;">=</span> buffer_read<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Read the next two bytes (size)</span>
			<span style="color: #000088;">$decodedsize</span> <span style="color: #339933;">=</span> <span style="color: #990000;">unpack</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nsize&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sizestr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// convert the size bytes to an integer</span>
			<span style="color: #666666; font-style: italic;">// Read the segment data with length indicated by the previously read size</span>
			<span style="color: #000088;">$segdata</span> <span style="color: #339933;">=</span> buffer_read<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #000088;">$decodedsize</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'size'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Store the segment information in the output array</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$want</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$want</span> <span style="color: #339933;">==</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$headerdata</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>object<span style="color: #009900;">&#41;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>  
					<span style="color: #0000ff;">&quot;SegType&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
					<span style="color: #0000ff;">&quot;SegName&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">&quot;JPEG_Segment_Names&quot;</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
					<span style="color: #0000ff;">&quot;SegDesc&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">&quot;JPEG_Segment_Descriptions&quot;</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
					<span style="color: #0000ff;">&quot;SegData&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$segdata</span> 
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #666666; font-style: italic;">// If this is a SOS (Start Of Scan) segment, then there is no more header data - the compressed image data follows</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\xDA</span>&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$hit_compressed_image_data</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Not an SOS - Read the next two bytes - should be the segment marker for the next segment</span>
			<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> buffer_read<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Check that the first byte of the two is 0xFF as it should be for a marker</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\xFF</span>&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// NO FF found - close file and return - JPEG is probably corrupted</span>
				<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$headerdata</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> buffer_read<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #000088;">$len</span><span style="color: #339933;">,</span> <span style="color: #000088;">$new</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$pointer</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$new</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #000088;">$pointer</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pointer</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$len</span> <span style="color: #339933;">&gt;</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$pointer</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$len</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pointer</span><span style="color: #339933;">,</span> <span style="color: #000088;">$len</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pointer</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// The names of the JPEG segment markers, indexed by their marker number</span>
<span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">&quot;JPEG_Segment_Names&quot;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #208080;">0xC0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF0&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xC1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF1&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xC2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF2&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xC3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF4&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF5&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xC6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF6&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xC7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF7&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xC8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF9&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xCA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF10&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xCB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF11&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xCD</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF13&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xCE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF14&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xCF</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOF15&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;DHT&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0xCC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;DAC&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST0&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xD1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST1&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xD2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST2&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xD3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST3&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST4&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xD5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST5&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xD6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST6&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xD7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RST7&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOI&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0xD9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;EOI&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0xDA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;SOS&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0xDB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;DQT&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xDC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;DNL&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0xDD</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;DRI&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0xDE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;DHP&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0xDF</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;EXP&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP0&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xE1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP1&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xE2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP2&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xE3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP3&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP4&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xE5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP5&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xE6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP6&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xE7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP7&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP8&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xE9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP9&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xEA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP10&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xEB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP11&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xEC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP12&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xED</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP13&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xEE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP14&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xEF</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;APP15&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG0&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xF1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG1&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xF2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG2&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xF3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG3&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG4&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xF5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG5&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xF6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG6&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xF7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG7&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG8&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xF9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG9&quot;</span><span style="color: #339933;">,</span>  <span style="color: #208080;">0xFA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG10&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xFB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG11&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xFC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG12&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xFD</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;JPG13&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xFE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;COM&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0x01</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;TEM&quot;</span><span style="color: #339933;">,</span>   <span style="color: #208080;">0x02</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;RES&quot;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">// The descriptions of the JPEG segment markers, indexed by their marker number</span>
<span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">&quot;JPEG_Segment_Descriptions&quot;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #666666; font-style: italic;">/* JIF Marker byte pairs in JPEG Interchange Format sequence */</span>
	<span style="color: #208080;">0xC0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;Start Of Frame (SOF) Huffman  - Baseline DCT&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame (SOF) Huffman  - Extended sequential DCT&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Huffman  - Progressive DCT (SOF2)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Huffman  - Spatial (sequential) lossless (SOF3)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Huffman  - Differential sequential DCT (SOF5)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Huffman  - Differential progressive DCT (SOF6)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Huffman  - Differential spatial (SOF7)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Arithmetic - Reserved for JPEG extensions (JPG)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Arithmetic - Extended sequential DCT (SOF9)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xCA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Arithmetic - Progressive DCT (SOF10)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xCB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Arithmetic - Spatial (sequential) lossless (SOF11)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xCD</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Arithmetic - Differential sequential DCT (SOF13)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xCE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Arithmetic - Differential progressive DCT (SOF14)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xCF</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start Of Frame Arithmetic - Differential spatial (SOF15)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xC4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Define Huffman Table(s) (DHT)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xCC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Define Arithmetic coding conditioning(s) (DAC)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 0 (RST0)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 1 (RST1)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 2 (RST2)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 3 (RST3)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 4 (RST4)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 5 (RST5)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 6 (RST6)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Restart with modulo 8 count 7 (RST7)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start of Image (SOI)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xD9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;End of Image (EOI)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xDA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Start of Scan (SOS)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xDB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Define quantization Table(s) (DQT)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xDC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Define Number of Lines (DNL)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xDD</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Define Restart Interval (DRI)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xDE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Define Hierarchical progression (DHP)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xDF</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Expand Reference Component(s) (EXP)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 0 (APP0) - usually JFIF or JFXX&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 1 (APP1) - usually EXIF or XMP/RDF&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 2 (APP2) - usually Flashpix&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 3 (APP3)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 4 (APP4)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 5 (APP5)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 6 (APP6)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 7 (APP7)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 8 (APP8)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xE9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 9 (APP9)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xEA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 10 (APP10)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xEB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 11 (APP11)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xEC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 12 (APP12) - usually [picture info]&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xED</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 13 (APP13) - usually photoshop IRB / IPTC&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xEE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 14 (APP14)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xEF</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Application Field 15 (APP15)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG0)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF1</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG1)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF2</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG2)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF3</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG3)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF4</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG4)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF5</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG5)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF6</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG6)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF7</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG7)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF8</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG8)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xF9</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG9)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xFA</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG10)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xFB</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG11)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xFC</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG12)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xFD</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved for JPEG extensions (JPG13)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0xFE</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Comment (COM)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0x01</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;For temp private use arith code (TEM)&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #208080;">0x02</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">&quot;Reserved (RES)&quot;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Most of this function is taken directly from the source code for imagemagick
 * and how it handles identify -verbose $filename to present you with a Quality
 * number.  This number should be considered approximate.  It's essentially
 * based upon the numbers used to perform compression on the original image
 * data... 
 *
 * See: http://www.obrador.com/essentialjpeg/headerinfo.htm
 * See: http://www.impulseadventure.com/photo/jpeg-quantization.html
 * See: http://www.impulseadventure.com/photo/jpeg-huffman-coding.html
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> get_jpeg_quality<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$buff</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$tables</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'multi'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'hash'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				 <span style="color: #cc66cc;">1020</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1015</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">932</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">848</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">780</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">735</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">702</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">679</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">660</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">645</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">632</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">623</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">613</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">607</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">600</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">594</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">589</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">585</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">581</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">571</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">555</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">542</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">529</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">514</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">494</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">474</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">457</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">439</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">424</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">410</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">397</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">386</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">373</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">364</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">351</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">341</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">334</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">324</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">317</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">309</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">299</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">294</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">287</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">279</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">274</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">267</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">262</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">257</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">251</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">247</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">243</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">237</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">232</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">227</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">222</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">217</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">213</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">207</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">202</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">198</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">192</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">188</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">183</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">177</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">173</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">168</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">163</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">157</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">153</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">148</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">143</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">139</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">132</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">128</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">125</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">119</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">115</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">108</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">104</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">99</span><span style="color: #339933;">,</span>
				   <span style="color: #cc66cc;">94</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">90</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">84</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">79</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">74</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">70</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">64</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">59</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">55</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">49</span><span style="color: #339933;">,</span>
				   <span style="color: #cc66cc;">45</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">40</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">34</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">30</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">25</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">20</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">15</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">11</span><span style="color: #339933;">,</span>    <span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span>    <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span>
					<span style="color: #cc66cc;">0</span>	
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// hash</span>
			<span style="color: #0000ff;">'sums'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
				 <span style="color: #cc66cc;">32640</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">32635</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">32266</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">31495</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">30665</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">29804</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">29146</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">28599</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">28104</span><span style="color: #339933;">,</span>
				 <span style="color: #cc66cc;">27670</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">27225</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">26725</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">26210</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">25716</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">25240</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">24789</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">24373</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">23946</span><span style="color: #339933;">,</span>
				 <span style="color: #cc66cc;">23572</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">22846</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">21801</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20842</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">19949</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">19121</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">18386</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">17651</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">16998</span><span style="color: #339933;">,</span>
				 <span style="color: #cc66cc;">16349</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">15800</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">15247</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">14783</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">14321</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">13859</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">13535</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">13081</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">12702</span><span style="color: #339933;">,</span>
				 <span style="color: #cc66cc;">12423</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">12056</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11779</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11513</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11135</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10955</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10676</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10392</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10208</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">9928</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">9747</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">9564</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">9369</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">9193</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">9017</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">8822</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">8639</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">8458</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">8270</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">8084</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7896</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7710</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7527</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7347</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7156</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6977</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6788</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">6607</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6422</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6236</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6054</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5867</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5684</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5495</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5305</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5128</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">4945</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4751</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4638</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4442</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4248</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4065</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3888</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3698</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3509</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">3326</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3139</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2957</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2775</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2586</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2405</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2216</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2037</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1846</span><span style="color: #339933;">,</span>
				  <span style="color: #cc66cc;">1666</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1483</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1297</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1109</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">927</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">735</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">554</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">375</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">201</span><span style="color: #339933;">,</span>
				   <span style="color: #cc66cc;">128</span><span style="color: #339933;">,</span>     <span style="color: #cc66cc;">0</span>
			 <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// sums</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// multi</span>
		<span style="color: #0000ff;">'single'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'hash'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
               <span style="color: #cc66cc;">510</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">505</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">422</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">380</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">355</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">338</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">326</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">318</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">311</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">305</span><span style="color: #339933;">,</span>
               <span style="color: #cc66cc;">300</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">297</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">293</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">291</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">288</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">286</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">284</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">283</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">281</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">280</span><span style="color: #339933;">,</span>
               <span style="color: #cc66cc;">279</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">278</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">277</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">273</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">262</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">251</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">243</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">233</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">225</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">218</span><span style="color: #339933;">,</span>
               <span style="color: #cc66cc;">211</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">205</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">198</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">193</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">186</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">181</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">177</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">172</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">168</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">164</span><span style="color: #339933;">,</span>
               <span style="color: #cc66cc;">158</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">156</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">152</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">148</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">145</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">142</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">139</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">136</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">133</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">131</span><span style="color: #339933;">,</span>
               <span style="color: #cc66cc;">129</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">126</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">123</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">120</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">118</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">115</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">113</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">110</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">107</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">105</span><span style="color: #339933;">,</span>
               <span style="color: #cc66cc;">102</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">97</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">94</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">92</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">89</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">87</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">83</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">81</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">79</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">76</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">74</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">70</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">68</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">66</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">63</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">61</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">57</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">55</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">52</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">50</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">48</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">44</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">42</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">39</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">37</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">34</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">31</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">29</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">26</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">24</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">21</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">18</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">16</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">13</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">11</span><span style="color: #339933;">,</span>    <span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span>    <span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span>    <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>    <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
                 <span style="color: #cc66cc;">0</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// hash</span>
			<span style="color: #0000ff;">'sums'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
               <span style="color: #cc66cc;">16320</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">16315</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">15946</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">15277</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">14655</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">14073</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">13623</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">13230</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">12859</span><span style="color: #339933;">,</span>
               <span style="color: #cc66cc;">12560</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">12240</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11861</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11456</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11081</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10714</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10360</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10027</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">9679</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">9368</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">9056</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">8680</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">8331</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7995</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7668</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7376</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">7084</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6823</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">6562</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6345</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">6125</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5939</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5756</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5571</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5421</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5240</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">5086</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">4976</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4829</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4719</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4616</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4463</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4393</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4280</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4166</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">4092</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">3980</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3909</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3835</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3755</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3688</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3621</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3541</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3467</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3396</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">3323</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3247</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3170</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3096</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">3021</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2952</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2874</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2804</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2727</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">2657</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2583</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2509</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2437</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2362</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2290</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2211</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2136</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">2068</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">1996</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1915</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1858</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1773</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1692</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1620</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1552</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1477</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1398</span><span style="color: #339933;">,</span>
                <span style="color: #cc66cc;">1326</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1251</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1179</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1109</span><span style="color: #339933;">,</span>  <span style="color: #cc66cc;">1031</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">961</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">884</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">814</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">736</span><span style="color: #339933;">,</span>
                 <span style="color: #cc66cc;">667</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">592</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">518</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">441</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">369</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">292</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">221</span><span style="color: #339933;">,</span>   <span style="color: #cc66cc;">151</span><span style="color: #339933;">,</span>    <span style="color: #cc66cc;">86</span><span style="color: #339933;">,</span>
                  <span style="color: #cc66cc;">64</span><span style="color: #339933;">,</span>     <span style="color: #cc66cc;">0</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// sums</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// single</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// tables</span>
&nbsp;
	<span style="color: #000088;">$headers</span> <span style="color: #339933;">=</span> get_jpeg_header_data<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$buff</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xDB</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$headers</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$headers</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$header</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$headers</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>	
	<span style="color: #000088;">$quality</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SegData</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">128</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$entry</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">str_split</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$header</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SegData</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$chr</span> <span style="color: #009900;">&#41;</span> 
			<span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">str_split</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$header</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SegData</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$chr</span> <span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_sum</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #990000;">array_sum</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$qvalue</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">53</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">63</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$table</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;multi&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SegData</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">64</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$entry</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">str_split</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$header</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SegData</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$chr</span> <span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_sum</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$qvalue</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">53</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$table</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;single&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// go with a safe value</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$qvalue</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$tables</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'hash'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sum</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$tables</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sums'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
			<span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// error_log( &quot;$table &gt;&gt; $qvalue &amp;&amp; $sum &gt;&gt; &quot; . ( $i + 1 ) );</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// go with a safe value</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Right&#8230; serious suckage. Which is why I&#8217;m sharing it here so that you don&#8217;t have to go through all that trouble. You can just steal my stolen code. Aren&#8217;t GPL compatible licenses fun?</p>
<p>Ok, finally, you&#8230; in the back&#8230; stop jumping up and down screaming about the Imagick PECL extension&#8230; In my testing getCompressionQuality() didnt work and getImageCompression() was unavailable (though I hear there is a newer version of the extension now&#8230; YMMV)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/09/16/quality-time-with-your-jpegs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>php open locking daemon</title>
		<link>http://blog.apokalyptik.com/2009/09/14/php-open-locking-daemon/</link>
		<comments>http://blog.apokalyptik.com/2009/09/14/php-open-locking-daemon/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 09:19:49 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Excuses]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=447</guid>
		<description><![CDATA[Don&#8217;t you hate that&#8230; When it&#8217;s 2:00am&#8230; and you really should be in bed&#8230; But your mind has hold of a problem, and wont let it go.  I have a project where it would be really handy for a process to be able to lock (arbitrary string identifier) and for another process to be [...]]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t you hate that&#8230; When it&#8217;s 2:00am&#8230; and you really should be in bed&#8230; But your mind has hold of a problem, and wont let it go.  I have <a href="http://code.svn.wordpress.org/jobs/">a project</a> where it would be really handy for a process to be able to lock (arbitrary string identifier) and for another process to be able to check whether (arbitrary string identifier) is still locked.  And the processes that do the locking can die&#8230; so the lock really needs to expire when they do.  I could use <a href="http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html">MySQLs get_lock</a> but I&#8217;m already abusing the hell out of that for more distributed things (and since you cannot have more than one mysql named lock at a time per connection, i don&#8217;t think it would work here&#8230;) in the originating processes, and these locks are machine wide, not network wide&#8230;</p>
<p>I don&#8217;t like flock because you have to actually create a file to try and lock it leaving race conditions and the possibility of orphaned files on the file system which just sucks&#8230;  I thought about Memcached but I really need something that can be held open for long periods of inactivity and released if the client dies which precludes the infinite and the timed method of memcached value storage&#8230;</p>
<p>After some searching I found <a href="http://blitiri.com.ar/p/old/">old &#8212; Open Lock Daemon</a> which looked like a super good fit&#8230; Until I dug into the communication protocol&#8230; What a nightmare for wanting to lock a string&#8230; srsly.  So not being able to find anything (and apparently not being able to sleep until I had a satisfactory answer) I decided to write one. In PHP, naturally.  Weighing in at 180 lines I think it&#8217;s a pretty acceptable/workable first pass.  </p>
<p>[ edit: <a href="http://code.svn.wordpress.org/lockd/">code available here</a> ]</p>
<p><span id="more-447"></span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> lockd <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$sock</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$lockd_port</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2626</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$lockd_addr</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'127.0.0.1'</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$processing</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$stat_connects</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$stat_orphans</span>  <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$stat_commands</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$gs</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$is</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$qs</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$answering</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$connections</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$locks</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> lockd<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$args</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$args</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$v</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;lockd_<span style="color: #006699; font-weight: bold;">$i</span>&quot;</span><span style="color: #339933;">;</span>
                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$v</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #990000;">set_time_limit</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                pcntl_signal<span style="color: #009900;">&#40;</span> SIGTERM<span style="color: #339933;">,</span>  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'sig_handler'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                pcntl_signal<span style="color: #009900;">&#40;</span> SIGHUP<span style="color: #339933;">,</span>   <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'sig_handler'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                pcntl_signal<span style="color: #009900;">&#40;</span> SIGUSR1<span style="color: #339933;">,</span>  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'sig_handler'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>sock <span style="color: #339933;">=</span> <span style="color: #990000;">socket_create</span><span style="color: #009900;">&#40;</span>AF_INET<span style="color: #339933;">,</span> SOCK_STREAM<span style="color: #339933;">,</span> SOL_TCP<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #339933;">@</span><span style="color: #990000;">socket_set_option</span><span style="color: #009900;">&#40;</span> SOL_SOCKET<span style="color: #339933;">,</span> SO_REUSEADDR<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #339933;">@</span><span style="color: #990000;">socket_set_option</span><span style="color: #009900;">&#40;</span> SOL_SOCKET<span style="color: #339933;">,</span> SO_LINGER<span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'l_onoff'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'l_linger'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #990000;">socket_set_nonblock</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>sock <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">socket_bind</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>sock<span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>lockd_addr<span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>lockd_port <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Could not bind socket...<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">socket_listen</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>sock<span style="color: #339933;">,</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Could not listen on socket...<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000088;">$pid</span> <span style="color: #339933;">=</span> pcntl_fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pid</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Error Forking...<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pid</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Detaching...<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">echo</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #990000;">getmypid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #990000;">register_tick_function</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'process'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000000; font-weight: bold;">declare</span><span style="color: #009900;">&#40;</span>ticks <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>accept_loop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> accept_loop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>answering <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">socket_accept</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>sock<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                <span style="color: #666666; font-style: italic;">// echo &quot;Accepting connection #&quot;.count( $this-&amp;gt;connections ).&quot; $c &quot;.chr(10);</span>
                                <span style="color: #990000;">socket_set_block</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #990000;">socket_set_option</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> SOL_SOCKET<span style="color: #339933;">,</span> SO_KEEPALIVE<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #990000;">socket_set_option</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> SOL_SOCKET<span style="color: #339933;">,</span> SO_RCVLOWAT<span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #000088;">$c</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                                <span style="color: #990000;">usleep</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">50000</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>accept_loop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> sig_handler<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sig</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>answering <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #666666; font-style: italic;">//echo &quot;Got signal: $sig\r\n&quot;;</span>
                <span style="color: #666666; font-style: italic;">//echo &quot;\tKilling the listening socket\r\n&quot;;</span>
                <span style="color: #990000;">socket_close</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>sock <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$c</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #666666; font-style: italic;">//echo &quot;\tKilling connection $i\r\n&quot;;</span>
                        <span style="color: #990000;">socket_close</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections<span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #666666; font-style: italic;">//echo &quot;Sockets closed. Shutting down...&quot;;</span>
                <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> process<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #666666; font-style: italic;">// begin function locking</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>processing <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>processing<span style="color: #339933;">++;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>processing <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>processing<span style="color: #339933;">--;</span>
                        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #666666; font-style: italic;">// end function locking</span>
&nbsp;
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>processing<span style="color: #339933;">--;</span>
                        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #666666; font-style: italic;">// process reads</span>
                <span style="color: #000088;">$r</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections<span style="color: #339933;">;</span>
                <span style="color: #000088;">$w</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$e</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//$this-&amp;gt;connections;</span>
&nbsp;
                <span style="color: #000088;">$num_changed_sockets</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">socket_select</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span><span style="color: #339933;">,</span> <span style="color: #000088;">$w</span><span style="color: #339933;">,</span> <span style="color: #000088;">$e</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$num_changed_sockets</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>processing<span style="color: #339933;">--;</span>
                        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$num_changed_sockets</span> <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>                         <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>processing<span style="color: #339933;">--;</span>
                        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$r</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$c</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">socket_get_option</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> SOL_SOCKET<span style="color: #339933;">,</span> SO_RCVBUF <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                                <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
                        <span style="color: #000088;">$n</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_search</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000088;">$d</span> <span style="color: #339933;">=</span> <span style="color: #990000;">socket_read</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4096</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$d</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                <span style="color: #666666; font-style: italic;">// echo &quot;&amp;lt; &amp;lt; #$c EOF\r\n&quot;;                                 socket_close( $this-&amp;gt;connections[$n] );</span>
                                <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections<span style="color: #009900;">&#91;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #339933;">,</span> <span style="color: #000088;">$c</span> <span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$lock</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>stat_orphans<span style="color: #339933;">++;</span>
                                        <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #009900;">&#91;</span><span style="color: #000088;">$lock</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #009900;">&#125;</span>
                                <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
&nbsp;
                        <span style="color: #009900;">&#125;</span>
&nbsp;
                        <span style="color: #000088;">$cmd</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$d</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
                        <span style="color: #000088;">$hash</span> <span style="color: #339933;">=</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$cmd</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'g'</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// get a lock</span>
                                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>gs<span style="color: #339933;">++;</span>
                                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #009900;">&#91;</span><span style="color: #000088;">$hash</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                                <span style="color: #990000;">socket_write</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;0 Cannot Get Lock<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                                        <span style="color: #009900;">&#125;</span>
                                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #009900;">&#91;</span><span style="color: #000088;">$hash</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$c</span><span style="color: #339933;">;</span>
                                        <span style="color: #990000;">socket_write</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;1 Got Lock<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'r'</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// release lock</span>
                                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>rs<span style="color: #339933;">++;</span>
                                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #009900;">&#91;</span><span style="color: #000088;">$hash</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #009900;">&#91;</span><span style="color: #000088;">$hash</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$c</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                                <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #009900;">&#91;</span><span style="color: #000088;">$hash</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                                <span style="color: #990000;">socket_write</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;1 Released Lock<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                                        <span style="color: #009900;">&#125;</span>
                                        <span style="color: #990000;">socket_write</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;0 Cannot Release Lock<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'i'</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// inspect lock</span>
                                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>is<span style="color: #339933;">++;</span>
                                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks<span style="color: #009900;">&#91;</span><span style="color: #000088;">$hash</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                                                <span style="color: #990000;">socket_write</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;1 Locked<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                        <span style="color: #b1b100;">else</span>
                                                <span style="color: #990000;">socket_write</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;0 Not Locked<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'q'</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// get system stats</span>
                                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>qs<span style="color: #339933;">++;</span>
                                        <span style="color: #990000;">socket_write</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                                                <span style="color: #0000ff;">'conns'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>connections <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                                <span style="color: #0000ff;">'locks'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>locks <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                                <span style="color: #0000ff;">'orphans'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>stat_orphans<span style="color: #339933;">,</span>
                                                <span style="color: #0000ff;">'commands'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>stat_commands<span style="color: #339933;">,</span>
                                                <span style="color: #0000ff;">'command_g'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>gs<span style="color: #339933;">,</span>
                                                <span style="color: #0000ff;">'command_r'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>rs<span style="color: #339933;">,</span>
                                                <span style="color: #0000ff;">'command_i'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>is<span style="color: #339933;">,</span>
                                                <span style="color: #0000ff;">'command_q'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>qs<span style="color: #339933;">,</span>
                                        <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
&nbsp;
                        <span style="color: #666666; font-style: italic;">// echo &quot;$c &amp;lt; &amp;lt; $d&quot;;                  }                 $this-&amp;gt;processing--;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/09/14/php-open-locking-daemon/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Just because you build it, doesnt mean they will come</title>
		<link>http://blog.apokalyptik.com/2009/03/19/just-because-you-build-it-doesnt-mean-they-will-come/</link>
		<comments>http://blog.apokalyptik.com/2009/03/19/just-because-you-build-it-doesnt-mean-they-will-come/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 16:39:14 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=424</guid>
		<description><![CDATA[Here&#8217;s a small bit of advice for all you would-be &#8220;cloud storage providers.&#8221;  Just because you have a buttload of disks doesn&#8217;t mean people will be falling over themselves to use your software.  If I have to spend *any* of my time worrying about your load, storage, or other internal algorithms (or unnecessary [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a small bit of advice for all you would-be &#8220;cloud storage providers.&#8221;  Just because you have a buttload of disks doesn&#8217;t mean people will be falling over themselves to use your software.  If I have to spend *any* of my time worrying about your load, storage, or other internal algorithms (or unnecessary limitations for that matter) then YOU . HAVE . FAILED.  </p>
<p>If I have to take the time to shard my data into 4096 different containers because you couldn&#8217;t be bothered to think &#8220;hey what if a service with a lot of users that create a lot of stuff decides to use us as a store?&#8221;  Then you&#8217;re obviously not in it to win it (so to speak.)  </p>
<p>Give us ABSTRACTED storage.  Non abstracted storage we can do on our own thank you.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/03/19/just-because-you-build-it-doesnt-mean-they-will-come/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Just what you need to know to write a CouchDB reduce function</title>
		<link>http://blog.apokalyptik.com/2009/02/18/just-what-you-need-to-know-to-write-a-couchdb-view/</link>
		<comments>http://blog.apokalyptik.com/2009/02/18/just-what-you-need-to-know-to-write-a-couchdb-view/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 22:47:45 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=408</guid>
		<description><![CDATA[Lets say you have the CouchDB classes (located here) all compiled together and included into your test.php script.  Lets also say that you have created a database with the built-in web ui called &#8220;testing&#8221;.  Finally let us say that your test.php has the following code in it, which would add a record to [...]]]></description>
			<content:encoded><![CDATA[<p>Lets say you have <a href="http://wiki.apache.org/couchdb/Getting_started_with_PHP">the CouchDB classes (located here)</a> all compiled together and included into your test.php script.  Lets also say that you have created a database with the built-in web ui called &#8220;testing&#8221;.  Finally let us say that your test.php has the following code in it, which would add a record to the db every time it is run. (i know that the data in the document serves no useful purpose&#8230; but really I just want to figure out this map/reduce thing so that I can make awesome views&#8230; so this suffices sufficiently.)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">__FILE__</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/includes/couchdb.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$couchdb</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CouchDB<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testing'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5984</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$couchdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">send</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'put'</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span>
        <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">&quot;_id&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">&quot;time&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'md5'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'sha1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'crc'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">crc32</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBody</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>After running the code a bunch of times you would end up with a bunch of documents which look more or less like this:</p>
<p><a href="http://blog.apokalyptik.com/wp-content/uploads/2009/02/picture-1.png"><img width="600" src="http://blog.apokalyptik.com/wp-content/uploads/2009/02/picture-1.png" alt="picture-1" title="picture-1" class="alignnone size-medium wp-image-412" />(click for full size)</a></p>
<p>Now lets say you want to write a view that told you what the first characters of the _id were and how many documents share that first letter.  This is analogous to the following in MySQL</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #000099;">LEFT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">md5</span><span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">AS</span> <span style="color: #008000;">`lchar`</span><span style="color: #000033;">,</span> <span style="color: #000099;">count</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">md5</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">FROM</span> <span style="color: #008000;">`md5table`</span> <span style="color: #990099; font-weight: bold;">GROUP BY</span> <span style="color: #008000;">`lchar`</span></pre></div></div>

<p>Your map function is easy, because you dont have any selection criteria, so we process all rows</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>doc<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> emit<span style="color: #009900;">&#40;</span>doc._id<span style="color: #339933;">,</span>doc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></pre></div></div>

<p>The reduce function is where the actual programming comes in&#8230;  And it seems there aren&#8217;t many well explained examples of exactly how to do this (I just brute forced it by trial and error)</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span> values<span style="color: #339933;">,</span> rereduce<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #003366; font-weight: bold;">var</span> output <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> rereduce <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        <span style="color: #006600; font-style: italic;">// key is null, and values are values returned by previous calls</span>
	<span style="color: #006600; font-style: italic;">//</span>
	<span style="color: #006600; font-style: italic;">// see http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views</span>
	<span style="color: #006600; font-style: italic;">//</span>
	<span style="color: #006600; font-style: italic;">// essentially we are taking the previously reduced view, and the </span>
	<span style="color: #006600; font-style: italic;">// reduced view for new records, and we are reducing those two things</span>
	<span style="color: #006600; font-style: italic;">// together.  Summarizing two summaries, essentially</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> values <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #006600; font-style: italic;">// here we have multiple prebuilt output objects and we're simply combining them</span>
  	    <span style="color: #006600; font-style: italic;">// just like below we have an array with a numeric id and an output object</span>
	    <span style="color: #006600; font-style: italic;">// </span>
	    <span style="color: #006600; font-style: italic;">// retrieve a summary</span>
            <span style="color: #003366; font-weight: bold;">var</span> vals <span style="color: #339933;">=</span> values<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">var</span> key <span style="color: #000066; font-weight: bold;">in</span> vals <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">// debugging</span>
                <span style="color: #006600; font-style: italic;">// log(key);</span>
		<span style="color: #006600; font-style: italic;">// </span>
		<span style="color: #006600; font-style: italic;">// store in or increment our new output object </span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> undefined <span style="color: #009900;">&#41;</span>
                    output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> vals<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">else</span>
                    output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> vals<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// key is an array, which we dont care about, and values are the </span>
	<span style="color: #006600; font-style: italic;">// values returned by the map</span>
	<span style="color: #006600; font-style: italic;">//</span>
	<span style="color: #006600; font-style: italic;">// see http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views</span>
	<span style="color: #006600; font-style: italic;">//</span>
	<span style="color: #006600; font-style: italic;">// we are taking each document and processing that, reducing it down</span>
	<span style="color: #006600; font-style: italic;">// to a summary object (output) for each of the rows passed</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> values <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #006600; font-style: italic;">// we have an array, values, with numeric ids and a document objects</span>
	    <span style="color: #006600; font-style: italic;">//</span>
	    <span style="color: #006600; font-style: italic;">// retrieve a document</span>
            <span style="color: #003366; font-weight: bold;">var</span> doc <span style="color: #339933;">=</span> values<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	    <span style="color: #006600; font-style: italic;">// get what we want from it, the first char of the md5</span>
            <span style="color: #003366; font-weight: bold;">var</span> key <span style="color: #339933;">=</span> doc._id.<span style="color: #660066;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #006600; font-style: italic;">// debugging</span>
            <span style="color: #006600; font-style: italic;">// log( key + &quot; :: &quot; + doc._id );</span>
	    <span style="color: #006600; font-style: italic;">//</span>
	    <span style="color: #006600; font-style: italic;">// store or increment the output object</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!==</span> undefined <span style="color: #009900;">&#41;</span>
                output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">else</span>
                output<span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #006600; font-style: italic;">// done</span>
    <span style="color: #000066; font-weight: bold;">return</span> output<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>and in code, using a temporary view, ( if you used this view all the time you would want to make it permanent&#8230; but this is about how to lay out a reduce function, nothing more ) so request code that looks like this</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$view</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'map'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'function(doc){ emit(doc._id,doc); }'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'reduce'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'
        function(key, values, rereduce) { 
            var output = {};
            if ( rereduce ) { 
                // key is null, and values are values returned by previous calls
                for ( var i in values ) {
                    var vals = values[i];
                    for ( var key in vals ) {
                        // log(key);
                        if ( output[key] == undefined )
                            output[key] = vals[key];
                        else
                            output[key] = output[key] + vals[key];
                    }
                }
            } else {
                // key is an array, which we dont care about, and values are the values returneb by the map
                for ( var i in values ) {
                    var doc = values[i];
                    var key = doc._id.substr(0, 1);
                    // log( key + &quot; :: &quot; + doc._id );
                    if ( output[key] !== undefined )
                        output[key] = output[key] + 1;
                    else
                        output[key] = 1;
                }
            }
            return output;
        }
    '</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$couchdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/_temp_view'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'POST'</span><span style="color: #339933;">,</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$view</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBody</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>would give you output that looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">stdClass Object
<span style="color: #009900;">&#40;</span>
    <span style="color: #009900;">&#91;</span>rows<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
        <span style="color: #009900;">&#40;</span>
            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> stdClass Object
                <span style="color: #009900;">&#40;</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #990000;">key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
                    <span style="color: #009900;">&#91;</span>value<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> stdClass Object
                        <span style="color: #009900;">&#40;</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">15</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">17</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">16</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">13</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">27</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">18</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">26</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">15</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">18</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">21</span>
                            <span style="color: #009900;">&#91;</span>a<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">12</span>
                            <span style="color: #009900;">&#91;</span>b<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">23</span>
                            <span style="color: #009900;">&#91;</span>c<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">20</span>
                            <span style="color: #009900;">&#91;</span>d<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">27</span>
                            <span style="color: #009900;">&#91;</span>e<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">28</span>
                            <span style="color: #009900;">&#91;</span>f<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">26</span>
                        <span style="color: #009900;">&#41;</span>
&nbsp;
                <span style="color: #009900;">&#41;</span>
&nbsp;
        <span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#41;</span></pre></div></div>

<p>I hope this helps somebody out.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/02/18/just-what-you-need-to-know-to-write-a-couchdb-view/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>a dumbed down version of wpdb for sqlite</title>
		<link>http://blog.apokalyptik.com/2008/11/18/a-dumbed-down-version-of-wpdb-for-sqlite/</link>
		<comments>http://blog.apokalyptik.com/2008/11/18/a-dumbed-down-version-of-wpdb-for-sqlite/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 20:08:47 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=307</guid>
		<description><![CDATA[I&#8217;ve been working, gradually, on a project using an sqlite3 database (for its convenience) and found myself missing the clean elegance of wpdb&#8230; so I implemented it.  It was actually really easy to do, and I figured I would throw it up here for anyone else wishing to use it.    The [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working, gradually, on a project using an sqlite3 database (for its convenience) and found myself missing the clean elegance of wpdb&#8230; so I implemented it.  It was actually really easy to do, and I figured I would throw it up here for anyone else wishing to use it.    The functionality that I build this around is obtainable here: http://php-sqlite3.sourceforge.net/pmwiki/pmwiki.php (don&#8217;t freak&#8230; its in apt&#8230;)  </p>
<p>With this I can focus on the sql, which is different enough, and not fumble over function names and such&#8230;  $db = new sqlite_wpdb($dbfile, 3); var_dump($db->get_results(&#8220;SELECT * FROM `mytable` LIMIT 5&#8243;));</p>
<p>the code is below&#8230; and hopefully not too mangled&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> sqlite_wpdb <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$version</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> sqwpdb<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$version</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$version</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$version</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$function</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;sqlite<span style="color: #006699; font-weight: bold;">{$version}</span>_open&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$function</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #000088;">$function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">version</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$version</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fquery</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;sqlite<span style="color: #006699; font-weight: bold;">{$this-&gt;version}</span>_query&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ferror</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;sqlite<span style="color: #006699; font-weight: bold;">{$this-&gt;version}</span>_error&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">farray</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;sqlite<span style="color: #006699; font-weight: bold;">{$this-&gt;version}</span>_fetch_array&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> escape<span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;''&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> query<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fquery</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">result</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span> <span style="color: #339933;">=</span> <span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ferror</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> array_to_object<span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$array</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000088;">$object</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> stdClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$idx</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$val</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$idx</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$val</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #000088;">$object</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> get_results<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$rval</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">array_to_object</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">farray</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">result</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$rval</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #000088;">$rval</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> get_row<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_results</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #990000;">array_shift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> get_var<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_val</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> get_val<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_row</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">get_object_vars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #990000;">array_shift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">function</span> get_col<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_results</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$column</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$results</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">get_object_vars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                                <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
                        <span style="color: #000088;">$column</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_shift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #000088;">$column</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2008/11/18/a-dumbed-down-version-of-wpdb-for-sqlite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Writing your own shell in php</title>
		<link>http://blog.apokalyptik.com/2008/08/03/writing-your-own-shell-in-php/</link>
		<comments>http://blog.apokalyptik.com/2008/08/03/writing-your-own-shell-in-php/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 20:47:48 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=295</guid>
		<description><![CDATA[I&#8217;ve always wanted to write my own simple shell in php.  Call me a glutin for punishment, but it seems like something that a lot of people could use to be able to do&#8230; If your web app had a command line interface for various things&#8230; like looking up stats, or users, or suspending naughty [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always wanted to write my own simple shell in php.  Call me a glutin for punishment, but it seems like something that a lot of people could use to be able to do&#8230; If your web app had a command line interface for various things&#8230; like looking up stats, or users, or suspending naughty accounts, or whatever&#8230;. wouldnt that be cool and useful?  Talk about geek porn.  Anyways this this morning I got around to tinkering with the idea, and here is what i came up with&#8230; It&#8217;s rough, and empty, but its REALLY easy to extend and plug into any php application.</p>
<pre>apokalyptik:~/phpshell$ ./shell.php

/home/apokalyptik/phpshell &gt; hello

hi there

/home/apokalyptik/phpshell &gt; hello world

hi there world

/home/apokalyptik/phpshell &gt; cd ..

/home/apokalyptik/ &gt; cd phpshell

/home/apokalyptik/phpshell &gt; ls

shell.php

/home/apokalyptik//phpshell &gt; exit

apokalyptik:~/phpshell$ ./shell.php</pre>
<p>See the source here: <a href="http://blog.apokalyptik.com/files/phpshell/shell.phps">shell.phps</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2008/08/03/writing-your-own-shell-in-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>I keep marking this as unread in google reader&#8230;</title>
		<link>http://blog.apokalyptik.com/2008/04/22/i-keep-marking-this-as-unread-in-google-reader/</link>
		<comments>http://blog.apokalyptik.com/2008/04/22/i-keep-marking-this-as-unread-in-google-reader/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 16:25:15 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=281</guid>
		<description><![CDATA[I keep marking this as unread in google reader so that Its there when I need it&#8230; which probably means I should just blog it&#8230; automating firefox via telnet
]]></description>
			<content:encoded><![CDATA[<p>I keep marking this as unread in google reader so that Its there when I need it&#8230; which probably means I should just blog it&#8230; <a href="http://www.urbanhonking.com/ideasfordozens/archives/2008/03/automating_fire.html">automating firefox via telnet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2008/04/22/i-keep-marking-this-as-unread-in-google-reader/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ruby-Mapquest Release v0.003</title>
		<link>http://blog.apokalyptik.com/2007/02/17/ruby-mapquest-release-v0003/</link>
		<comments>http://blog.apokalyptik.com/2007/02/17/ruby-mapquest-release-v0003/#comments</comments>
		<pubDate>Sat, 17 Feb 2007 22:59:50 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Geospacial]]></category>
		<category><![CDATA[Ruby (on or off) Rails]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/2007/02/17/ruby-mapquest-release-v0003/</guid>
		<description><![CDATA[Primarily a bugfix release.  Catch it here:
]]></description>
			<content:encoded><![CDATA[<p>Primarily a bugfix release.  Catch it <a href="http://blog.apokalyptik.com/ruby-mapquest/">here</a>:</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2007/02/17/ruby-mapquest-release-v0003/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ruby-Mapquest Release v0.002</title>
		<link>http://blog.apokalyptik.com/2007/02/13/ruby-mapquest-release-v0002/</link>
		<comments>http://blog.apokalyptik.com/2007/02/13/ruby-mapquest-release-v0002/#comments</comments>
		<pubDate>Wed, 14 Feb 2007 04:57:33 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Geospacial]]></category>
		<category><![CDATA[Ruby (on or off) Rails]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/2007/02/13/ruby-mapquest-release-v0002/</guid>
		<description><![CDATA[Welcome: ruby-Mapquest v0.002.  Wherein I&#8217;ve added support for routing (directions.)  Let me tell you that getting the info together for this was *NOT* a pretty picture&#8230;
]]></description>
			<content:encoded><![CDATA[<p>Welcome: <a href="http://blog.apokalyptik.com/ruby-mapquest/">ruby-Mapquest</a> v0.002.  Wherein I&#8217;ve added support for routing (directions.)  Let me tell you that getting the info together for this was *NOT* a pretty picture&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2007/02/13/ruby-mapquest-release-v0002/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
