<?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; Linux</title>
	<atom:link href="http://blog.apokalyptik.com/category/linux/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>Thu, 04 Mar 2010 09:45:42 +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>php debugging the really really hard way</title>
		<link>http://blog.apokalyptik.com/2009/10/06/php-debugging-the-really-really-hard-way/</link>
		<comments>http://blog.apokalyptik.com/2009/10/06/php-debugging-the-really-really-hard-way/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 22:18:56 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Random Thoughts]]></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=469</guid>
		<description><![CDATA[If you&#8217;re ever in a situation where something is only happening intermittently, and only on a live server, and only while it&#8217;s under load&#8230; Lets say its not generating any error_log or stderr output, and you cant run it manually to reproduce&#8230; (we&#8217;ve all been in this situation) How do you get any debugging output [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re ever in a situation where something is only happening intermittently, and only on a live server, and only while it&#8217;s under load&#8230; Lets say its not generating any error_log or stderr output, and you cant run it manually to reproduce&#8230; (we&#8217;ve all been in this situation) How do you get any debugging output at all?</p>
<p>Step 1: add this to the top of your entry point php file</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'127.0.0.1'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #990000;">error_log</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">' :: '</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #990000;">sleep</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: #009900;">&#125;</span></pre></div></div>

<p>Step 2: use curl on the localhost to make the request</p>
<p>Step 3: (this assumes your error log is /tmp/php-error-output) run the following command in a second (root) terminal window</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">strace</span> <span style="color: #660033;">-p</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-n</span> <span style="color: #000000;">1000</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>php-error-output <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">' :: '</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-n</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> s<span style="color: #000000; font-weight: bold;">/</span><span style="color: #ff0000;">'^.+ :: '</span><span style="color: #000000; font-weight: bold;">//</span>g<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #660033;">-s</span> <span style="color: #000000;">10240</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span></pre></div></div>

<p>Good luck&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/10/06/php-debugging-the-really-really-hard-way/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>Debian Lenny, Avahi, AFP&#8230; Linux Fileserver for OSX Clients</title>
		<link>http://blog.apokalyptik.com/2009/02/12/debian-lenny-avahi-afp-linux-fileserver-for-osx-clients/</link>
		<comments>http://blog.apokalyptik.com/2009/02/12/debian-lenny-avahi-afp-linux-fileserver-for-osx-clients/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 01:25:51 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=391</guid>
		<description><![CDATA[If you&#8217;re like me you have an OSX computer or 3 at home, and a debian file server. If you&#8217;re like me you hate samba/nfs on principle and want your debian server to show up in finder.  If you&#8217;re like me you arent using debian 3 which is what most of the walkthroughs seem to [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re like me you have an OSX computer or 3 at home, and a debian file server. If you&#8217;re like me you hate samba/nfs on principle and want your debian server to show up in finder.  If you&#8217;re like me you arent using debian 3 which is what most of the walkthroughs seem to expect&#8230;  This is how I did it&#8230; With Debian Lenny.</p>
<p>What we&#8217;re using, and why:</p>
<ul>
<li>Avahi handles zeroconf (making it show up in finder) (most howtos involve howl which is no longer in apt)</li>
<li>netatalk has afpd</li>
<li>afpd is the fileserver</li>
</ul>
<p>From: <a href="http://blog.damontimm.com/how-to-install-netatalk-afp-on-ubuntu-with-encrypted-authentication/">http://blog.damontimm.com/how-to-install-netatalk-afp-on-ubuntu-with-encrypted-authentication/</a></p>
<ul>
<li>apt-get update</li>
<li>mkdir -p ~/src/netatalk</li>
<li>cd ~/src/netatalk</li>
<li>apt-get install cracklib2-dev libssl-dev</li>
<li>apt-get source netatalk</li>
<li>apt-get build-dep netatalk</li>
<li>cd netatalk-2.0.3</li>
</ul>
<p>From: <a href="http://www.sharedknowhow.com/2008/05/installing-netatalk-under-centos-5-with-leopard-support/">http://www.sharedknowhow.com/2008/05/installing-netatalk-under-centos-5-with-leopard-support/</a></p>
<ul>
<li>vim bin/cnid/cnid_index.c ## replace &#8220;ret = db-&gt;stat(db, &amp;sp, 0);&#8221; with &#8220;ret = db-&gt;stat(db, NULL, &amp;sp, 0);&#8221; line 277</li>
<li>vim etc/cnid_dbd/dbif.c ## replace &#8220;ret = db-&gt;stat(db, &amp;sp, 0);&#8221; with &#8220;ret = db-&gt;stat(db, NULL, &amp;sp, 0);&#8221; line 517</li>
</ul>
<p>Mine</p>
<ul>
<li>./configure &#8211;prefix=/usr/local/netatalk</li>
<li>make</li>
<li>make install</li>
<li>vim /etc/rc.local ## add &#8220;/usr/local/netatalk/sbin/afpd&#8221;</li>
<li>/usr/local/netatalk/sbin/afpd</li>
</ul>
<p>From: <a href="http://www.disgruntled-dutch.com/2007/general/how-to-get-your-linux-based-afp-server-to-show-up-correctly-in-leopards-new-finder">http://www.disgruntled-dutch.com/2007/general/how-to-get-your-linux-based-afp-server-to-show-up-correctly-in-leopards-new-finder</a></p>
<ul>
<li>apt-get install avahi-daemon</li>
<li>vim /etc/nsswitch.conf ## make the hosts line read &#8220;hosts: files dns mdns4&#8243;</li>
<li>cd /etc/avahi/services</li>
<li>wget http://www.disgruntled-dutch.com/media/afpd.service</li>
<li>/etc/init.d/avahi-daemon restart</li>
</ul>
<p>in case that file drops off the face of the net, this is its contents (except &#8220;&lt; ?&#8221; is &#8220;&lt;?&#8221; and &#8220;&lt; !&#8221; is &#8220;&lt;!&#8221;) :</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">standalone</span>=<span style="color: #ff0000;">'no'</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span><span style="color: #808080; font-style: italic;">&lt;!--*-nxml-*--&gt;</span>
<span style="color: #009900;">&lt; !DOCTYPE service-group SYSTEM <span style="color: #ff0000;">&quot;avahi-service.dtd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;service</span> -group<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name</span> <span style="color: #000066;">replace-wildcards</span>=<span style="color: #ff0000;">&quot;yes&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>%h<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/service<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;service<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;type<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>_afpovertcp._tcp<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/type<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>548<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/service<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>At this point your server should show up under the network in your finder&#8230; and you should be able to connect with any system username/pw combo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/02/12/debian-lenny-avahi-afp-linux-fileserver-for-osx-clients/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>making munin-graph take advantage of multiple cpus/cores</title>
		<link>http://blog.apokalyptik.com/2009/01/23/making-munin-graph-take-advantage-of-multiple-cpuscores/</link>
		<comments>http://blog.apokalyptik.com/2009/01/23/making-munin-graph-take-advantage-of-multiple-cpuscores/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 18:23:47 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=383</guid>
		<description><![CDATA[I do a lot of things for Automattic, and many of the things I do are quite esoteric (for a php developer anyways.)  Perl is not my language of choice, but I&#8217;ve never balked at a challenge&#8230;. just&#8230; did it have to be perl?  Anyways.  We have more than a thousand machines [...]]]></description>
			<content:encoded><![CDATA[<p>I do a lot of things for Automattic, and many of the things I do are quite esoteric (for a php developer anyways.)  Perl is not my language of choice, but I&#8217;ve never balked at a challenge&#8230;. just&#8230; did it have to be perl?  Anyways.  We have more than a thousand machines that we track with munin&#8230; which means a TON of graphs.  munin-update is efficient, taking advantage of all cpus and getting done in the fastest time possible, but munin-graph started taking so long as to be useless (and munin-cgi-graph takes almost a minute to fully render the servers day/week summary page which is completely unacceptable when we&#8217;re trying to troubleshoot a sudden, urgent, problem.)  So I got to dive in and make it faster&#8230;</p>
<p>Step 1: add in this function (<a href="http://www.perlmonks.org/?node_id=585853">which i borrowed from somewhere else</a>)</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> afork <span style="color: #009900;">&#40;</span>\<span style="color: #339933;">@</span><span style="color: #0000ff;">$&amp;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$max</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$code</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$c</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$data</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">wait</span> <span style="color: #b1b100;">unless</span> <span style="color: #339933;">++</span> <span style="color: #0000ff;">$c</span> <span style="color: #339933;">&lt;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$max</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;Fork failed: $!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">unless</span> <span style="color: #000066;">defined</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$pid</span> <span style="color: #339933;">=</span> <span style="color: #000066;">fork</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">exit</span> <span style="color: #0000ff;">$code</span> <span style="color: #339933;">-&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$pid</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #b1b100;">until</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">==</span> <span style="color: #000066;">wait</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Step 2: replace this</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$service</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@$work_array</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    process_service <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$service</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>with this</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">afork<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@$work_array</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">\&amp;process_service</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>I also have munin-html and munin-graph running side-by-side</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-x</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>munin<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>munin-graph  <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span>
    <span style="color: #c20cb9; font-weight: bold;">nice</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>munin<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>munin-graph <span style="color: #660033;">--cron</span> $<span style="color: #000000; font-weight: bold;">@</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span>
    <span style="color: #c20cb9; font-weight: bold;">fgrep</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">&quot;*** attempt to put segment in horiz list twice&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&amp;</span> <span style="color: #007800;">$waitgraph</span>=<span style="color: #007800;">$!</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-x</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>munin<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>munin-html   <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">nice</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>munin<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>munin-html $<span style="color: #000000; font-weight: bold;">@</span>; <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&amp;</span> <span style="color: #007800;">$waithtml</span>=<span style="color: #007800;">$!</span>
<span style="color: #7a0874; font-weight: bold;">wait</span> <span style="color: #007800;">$waitgraph</span>
<span style="color: #7a0874; font-weight: bold;">wait</span> <span style="color: #007800;">$waithtml</span></pre></div></div>

<p>I did several other, more complicated hacks as well. Such as not generating month and year graphs via cron, letting those render on-demand with munin-cgi-graph</p>
<p>All said we&#8217;re doing in under 2.5 minutes what was taking 7 or 8 minutes previously</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2009/01/23/making-munin-graph-take-advantage-of-multiple-cpuscores/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Using wait, $!, and () for threading in bash</title>
		<link>http://blog.apokalyptik.com/2008/12/11/using-wait-and-for-threading-in-bash/</link>
		<comments>http://blog.apokalyptik.com/2008/12/11/using-wait-and-for-threading-in-bash/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 03:24:04 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=348</guid>
		<description><![CDATA[This is a simplistic use of the pattern that I wrote about in my last post to wait on multiple commands in bash.  In essence I have a script which runs a command (like uptime or restarting a daemon) on a whole bunch of servers (think pssh).  Anyways&#8230; this is how I modified [...]]]></description>
			<content:encoded><![CDATA[<p>This is a simplistic use of the <a href="/2008/12/05/bash-collecting-the-return-value-of-backgrounded-processes/">pattern that I wrote about</a> in my last post to wait on multiple commands in bash.  In essence I have a script which runs a command (like uptime or restarting a daemon) on a whole bunch of servers (think <a href="http://www.theether.org/pssh/">pssh</a>).  Anyways&#8230; this is how I modified the script to run the command on multiple hosts in parallel.  This is a bit simplistic as it runs, say, 10 parallel ssh commands and then waits for all 10 to complete.  I&#8217;m very confident that someone could easily adapt this to run at a constant concurrency level of $threads&#8230; but I didn&#8217;t need it just then so I didn&#8217;t go that far&#8230;  As a side note, this is possibly the first time I&#8217;ve ever *needed* an array in a bash script&#8230; hah&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># $1 is the commandto run on the remote hosts</span>
<span style="color: #666666; font-style: italic;"># $2 is used for something not important for this script</span>
<span style="color: #666666; font-style: italic;"># $3 is the (optional) number of concurrent connections to use</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #ff0000;">&quot;$3&quot;</span> == <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #007800;">threads</span>=$<span style="color: #000000;">3</span>
<span style="color: #000000; font-weight: bold;">else</span>
    <span style="color: #007800;">threads</span>=<span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #007800;">cthreads</span>=<span style="color: #000000;">0</span>;
<span style="color: #007800;">stack</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">for</span> s <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$servers</span>
  <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$cthreads</span> <span style="color: #660033;">-eq</span> <span style="color: #007800;">$threads</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #000000; font-weight: bold;">for</span> job <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #800000;">${stack[@]}</span>; <span style="color: #000000; font-weight: bold;">do</span>
              <span style="color: #7a0874; font-weight: bold;">wait</span> <span style="color: #007800;">$job</span>
        <span style="color: #000000; font-weight: bold;">done</span>
        <span style="color: #007800;">stack</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #007800;">cthreads</span>=<span style="color: #000000;">0</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #7a0874; font-weight: bold;">&#40;</span>
        <span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ssh</span> root<span style="color: #000000; font-weight: bold;">@</span><span style="color: #007800;">$s</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">do</span>
                <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$s</span>:<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #007800;">$i</span>&quot;</span>
        <span style="color: #000000; font-weight: bold;">done</span>
    <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&amp;</span> stack<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #007800;">$cthreads</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #007800;">$!</span>
    <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">cthreads</span>=<span style="color: #007800;">$cthreads</span>+<span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #000000; font-weight: bold;">for</span> job <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #800000;">${stack[@]}</span>; <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">wait</span> <span style="color: #007800;">$job</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2008/12/11/using-wait-and-for-threading-in-bash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>bash &#8211; collecting the return value of backgrounded processes</title>
		<link>http://blog.apokalyptik.com/2008/12/05/bash-collecting-the-return-value-of-backgrounded-processes/</link>
		<comments>http://blog.apokalyptik.com/2008/12/05/bash-collecting-the-return-value-of-backgrounded-processes/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 22:05:30 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=311</guid>
		<description><![CDATA[You know that you can run something in the background in a bash script with ( command )&#038;, but a coworker recently wanted to run multiple commands, wait for all of them to complete, collect and decide what to do based on their return values&#8230; this proved much trickier.  Luckily there is an answer

#!/bin/bash
&#160;
&#40;sleep [...]]]></description>
			<content:encoded><![CDATA[<p>You know that you can run something in the background in a bash script with ( command )&#038;, but a coworker recently wanted to run multiple commands, wait for all of them to complete, collect and decide what to do based on their return values&#8230; this proved much trickier.  Luckily there is an answer</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">3</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&amp;</span> <span style="color: #007800;">p1</span>=<span style="color: #007800;">$!</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">2</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&amp;</span> <span style="color: #007800;">p2</span>=<span style="color: #007800;">$!</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">1</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&amp;</span> <span style="color: #007800;">p3</span>=<span style="color: #007800;">$!</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">wait</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$p1</span>&quot;</span>; <span style="color: #007800;">r1</span>=<span style="color: #007800;">$?</span>
<span style="color: #7a0874; font-weight: bold;">wait</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$p2</span>&quot;</span>; <span style="color: #007800;">r2</span>=<span style="color: #007800;">$?</span>
<span style="color: #7a0874; font-weight: bold;">wait</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$p3</span>&quot;</span>; <span style="color: #007800;">r3</span>=<span style="color: #007800;">$?</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$p1</span>:<span style="color: #007800;">$r1</span> <span style="color: #007800;">$p2</span>:<span style="color: #007800;">$r2</span> <span style="color: #007800;">$p3</span>:<span style="color: #007800;">$r3</span>&quot;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2008/12/05/bash-collecting-the-return-value-of-backgrounded-processes/feed/</wfw:commentRss>
		<slash:comments>2</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>Postfix, DKIMproxy, Spamc</title>
		<link>http://blog.apokalyptik.com/2008/11/14/postfix-dkimproxy-spamc/</link>
		<comments>http://blog.apokalyptik.com/2008/11/14/postfix-dkimproxy-spamc/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 22:08:39 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Funny Stuff]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=304</guid>
		<description><![CDATA[If you&#8217;re running any moderately busy mail server you&#8217;re probably using spamassassins spamc/spamd to check for spam because its tons more efficient than piping the mail through the spamassassin cli. Assuming that you do, and that you plan on adding DKIM proxy to the mix to verify  and sign emails you need to put things [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re running any moderately busy mail server you&#8217;re probably using spamassassins spamc/spamd to check for spam because its tons more efficient than piping the mail through the spamassassin cli. Assuming that you do, and that you plan on adding DKIM proxy to the mix to verify  and sign emails you need to put things in the right order, to save you some headache here&#8217;s what I did:</p>
<ol>
<li>smtp|smtps =&gt; -o smtpd_proxy_filter=127.0.0.1:10035 # outgoing dkim verify port</li>
<li>127.0.0.1:10036 =&gt; -o content_filter=spamassassin</li>
<li>spamassassin =&gt;  pipe user=nobody argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} # this delivers to the &#8220;pickup&#8221; service</li>
<li>pickup =&gt; -o content_filter=dksign:127.0.0.1:10037 # outgoing dkim signing port</li>
<li>127.0.0.1:10038 =&gt; -o content_filter= # the buck stops here</li>
</ol>
<p>If you arent careful with these (which I wasnt) you&#8217;ll end up causing an infinite loop between your filters (which I did).  Thus concludes our public service announcement.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2008/11/14/postfix-dkimproxy-spamc/feed/</wfw:commentRss>
		<slash:comments>0</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>Internally Caching Longer Than Externally Caching</title>
		<link>http://blog.apokalyptik.com/2008/07/16/internally-caching-longer-than-externally-caching/</link>
		<comments>http://blog.apokalyptik.com/2008/07/16/internally-caching-longer-than-externally-caching/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 00:24:15 +0000</pubDate>
		<dc:creator>apokalyptik</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Web Stuff]]></category>

		<guid isPermaLink="false">http://blog.apokalyptik.com/?p=293</guid>
		<description><![CDATA[We use varnish for a lot of our file caching needs, and recently we figured out how to do something rather important through a combination of technologies.  Imagine you have backend servers generating dynamic content based on user input.   So your users do something that fits the following categories:

is expensive to generate [...]]]></description>
			<content:encoded><![CDATA[<p>We use varnish for a lot of our file caching needs, and recently we figured out how to do something rather important through a combination of technologies.  Imagine you have backend servers generating dynamic content based on user input.   So your users do something that fits the following categories:</p>
<ul>
<li>is expensive to generate dynamically, and should be served from cache</li>
<li>many requests come in for the same objects, bandwidth should be conserved</li>
<li>doesnt change very often</li>
<li>once changed needs to take effect quickly</li>
</ul>
<p>Now wish varnish we&#8217;ve been using the Expires header for a long time with great success, but for this we were having no luck.  If we set the expires header to 3 weeks, then clients also cache the content for 3 weeks (violating requirement #3.)  We can kill the Expires header in varnish at vcl_deliver, but then clients don&#8217;t cache at all (#2.)  We can add Content-Control, overwrite the Age (otherwise reported Age: will be greater than max-age), and kill the Expires headers in the same place, but this isn&#8217;t pretty, and seems like a cheap hack.  Ideally we could rewrite the Expires header in varnish, but that doesn&#8217;t seem doable.</p>
<p>So what we ended up doing, was header rewriting at the load balancer (nginx.)  inside our location tag we added the following: </p>
<pre>
proxy_hide_header Age;
proxy_hide_header Expires;
proxy_hide_header Cache-Control;
add_header Source-Age $upstream_http_Age;
expires  300s;
</pre>
<p>Now nginx setsa proper Cache-Control: and Expires: headers for us, disregarding what varnish serves out.  Web clients dont check back for 5 minutes (reusing the old object) and varnish can cache until judgment dat because we get wild card invalidation</p>
<p>Isn&#8217;t technology fun?!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apokalyptik.com/2008/07/16/internally-caching-longer-than-externally-caching/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
